|
|
|
@ -33,6 +33,9 @@ package com.jme3.terrain.heightmap; |
|
|
|
|
|
|
|
|
|
import com.jme3.math.ColorRGBA; |
|
|
|
|
import com.jme3.texture.Image; |
|
|
|
|
import com.jme3.texture.image.DefaultImageRaster; |
|
|
|
|
import com.jme3.texture.image.ImageRaster; |
|
|
|
|
import com.jme3.util.NativeObject; |
|
|
|
|
import java.nio.ByteBuffer; |
|
|
|
|
import java.nio.ShortBuffer; |
|
|
|
|
|
|
|
|
@ -89,6 +92,14 @@ public class ImageBasedHeightMap extends AbstractHeightMap implements ImageHeigh |
|
|
|
|
return (float) (0.299 * red + 0.587 * green + 0.114 * blue); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
protected float calculateHeight(ColorRGBA color) { |
|
|
|
|
return (float) (0.299 * color.r + 0.587 * color.g + 0.114 * color.b); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
protected ImageRaster getImageRaster() { |
|
|
|
|
return new DefaultImageRaster(colorImage, 0); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
public boolean load(boolean flipX, boolean flipY) { |
|
|
|
|
|
|
|
|
|
int imageWidth = colorImage.getWidth(); |
|
|
|
@ -99,8 +110,7 @@ public class ImageBasedHeightMap extends AbstractHeightMap implements ImageHeigh |
|
|
|
|
+ " != imageHeight: " + imageHeight); |
|
|
|
|
|
|
|
|
|
size = imageWidth; |
|
|
|
|
|
|
|
|
|
ByteBuffer buf = colorImage.getData(0); |
|
|
|
|
ImageRaster raster = getImageRaster(); |
|
|
|
|
|
|
|
|
|
heightData = new float[(imageWidth * imageHeight)]; |
|
|
|
|
|
|
|
|
@ -111,13 +121,15 @@ public class ImageBasedHeightMap extends AbstractHeightMap implements ImageHeigh |
|
|
|
|
for (int h = 0; h < imageHeight; ++h) { |
|
|
|
|
if (flipX) { |
|
|
|
|
for (int w = imageWidth - 1; w >= 0; --w) { |
|
|
|
|
int baseIndex = (h * imageWidth)+ w; |
|
|
|
|
heightData[index++] = getHeightAtPostion(buf, colorImage, baseIndex, colorStore)*heightScale; |
|
|
|
|
//int baseIndex = (h * imageWidth)+ w;
|
|
|
|
|
//heightData[index++] = getHeightAtPostion(raster, baseIndex, colorStore)*heightScale;
|
|
|
|
|
heightData[index++] = calculateHeight(raster.getPixel(w, h, colorStore))*heightScale; |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
for (int w = 0; w < imageWidth; ++w) { |
|
|
|
|
int baseIndex = (h * imageWidth)+ w; |
|
|
|
|
heightData[index++] = getHeightAtPostion(buf, colorImage, baseIndex, colorStore)*heightScale; |
|
|
|
|
//int baseIndex = (h * imageWidth)+ w;
|
|
|
|
|
//heightData[index++] = getHeightAtPostion(raster, baseIndex, colorStore)*heightScale;
|
|
|
|
|
heightData[index++] = calculateHeight(raster.getPixel(w, h, colorStore))*heightScale; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -125,13 +137,15 @@ public class ImageBasedHeightMap extends AbstractHeightMap implements ImageHeigh |
|
|
|
|
for (int h = imageHeight - 1; h >= 0; --h) { |
|
|
|
|
if (flipX) { |
|
|
|
|
for (int w = imageWidth - 1; w >= 0; --w) { |
|
|
|
|
int baseIndex = (h * imageWidth)+ w; |
|
|
|
|
heightData[index++] = getHeightAtPostion(buf, colorImage, baseIndex, colorStore)*heightScale; |
|
|
|
|
//int baseIndex = (h * imageWidth)+ w;
|
|
|
|
|
//heightData[index++] = getHeightAtPostion(raster, baseIndex, colorStore)*heightScale;
|
|
|
|
|
heightData[index++] = calculateHeight(raster.getPixel(w, h, colorStore))*heightScale; |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
for (int w = 0; w < imageWidth; ++w) { |
|
|
|
|
int baseIndex = (h * imageWidth)+ w; |
|
|
|
|
heightData[index++] = getHeightAtPostion(buf, colorImage, baseIndex, colorStore)*heightScale; |
|
|
|
|
//int baseIndex = (h * imageWidth)+ w;
|
|
|
|
|
//heightData[index++] = getHeightAtPostion(raster, baseIndex, colorStore)*heightScale;
|
|
|
|
|
heightData[index++] = calculateHeight(raster.getPixel(w, h, colorStore))*heightScale; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
@ -140,7 +154,7 @@ public class ImageBasedHeightMap extends AbstractHeightMap implements ImageHeigh |
|
|
|
|
return true; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
protected float getHeightAtPostion(ByteBuffer buf, Image image, int position, ColorRGBA store) { |
|
|
|
|
/*protected float getHeightAtPostion(ImageRaster image, int position, ColorRGBA store) { |
|
|
|
|
switch (image.getFormat()){ |
|
|
|
|
case RGBA8: |
|
|
|
|
buf.position( position * 4 ); |
|
|
|
@ -172,5 +186,5 @@ public class ImageBasedHeightMap extends AbstractHeightMap implements ImageHeigh |
|
|
|
|
|
|
|
|
|
private float byte2float(byte b){ |
|
|
|
|
return ((float)(b & 0xFF)) / 255f; |
|
|
|
|
} |
|
|
|
|
}*/ |
|
|
|
|
} |