cleaned up terrainQuad constructor.
Added flexibility to image heightmap git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@8585 75d07b2b-3a1a-0410-a2c5-0572b91ccdca
This commit is contained in:
parent
866b607acb
commit
6712fccbc3
@ -86,7 +86,7 @@ public class TerrainGrid extends TerrainQuad {
|
|||||||
if (q == null) {
|
if (q == null) {
|
||||||
// create the new Quad since it doesn't exist
|
// create the new Quad since it doesn't exist
|
||||||
HeightMap heightMapAt = heightMapGrid.getHeightMapAt(temp);
|
HeightMap heightMapAt = heightMapGrid.getHeightMapAt(temp);
|
||||||
q = new TerrainQuad(getName() + "Quad" + temp, patchSize, quadSize, totalSize, heightMapAt == null ? null : heightMapAt.getHeightMap());
|
q = new TerrainQuad(getName() + "Quad" + temp, patchSize, totalSize, quadSize, heightMapAt == null ? null : heightMapAt.getHeightMap());
|
||||||
q.setMaterial(material.clone());
|
q.setMaterial(material.clone());
|
||||||
log.log(Level.FINE, "Loaded TerrainQuad {0}", q.getName());
|
log.log(Level.FINE, "Loaded TerrainQuad {0}", q.getName());
|
||||||
}
|
}
|
||||||
|
@ -161,7 +161,7 @@ public class TerrainQuad extends Node implements Terrain {
|
|||||||
* @param heightMap
|
* @param heightMap
|
||||||
*/
|
*/
|
||||||
public TerrainQuad(String name, int patchSize, int quadSize, int totalSize, float[] heightMap) {
|
public TerrainQuad(String name, int patchSize, int quadSize, int totalSize, float[] heightMap) {
|
||||||
this(name, patchSize, totalSize, Vector3f.UNIT_XYZ, heightMap);
|
this(name, patchSize, totalSize, quadSize, Vector3f.UNIT_XYZ, heightMap);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -48,7 +48,7 @@ import java.awt.image.WritableRaster;
|
|||||||
* @author Mike Kienenberger
|
* @author Mike Kienenberger
|
||||||
* @version $id$
|
* @version $id$
|
||||||
*/
|
*/
|
||||||
public class ImageBasedHeightMap extends AbstractHeightMap {
|
public class ImageBasedHeightMap extends AbstractHeightMap implements ImageHeightmap {
|
||||||
|
|
||||||
static protected class ImageConverter {
|
static protected class ImageConverter {
|
||||||
|
|
||||||
@ -137,6 +137,14 @@ public class ImageBasedHeightMap extends AbstractHeightMap {
|
|||||||
protected float dampen = 1.0f;
|
protected float dampen = 1.0f;
|
||||||
|
|
||||||
|
|
||||||
|
public void setImage(Image image) {
|
||||||
|
this.colorImage = image;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getSupportedImageType() {
|
||||||
|
return BufferedImage.TYPE_3BYTE_BGR;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a HeightMap from an Image. The image will be converted to
|
* Creates a HeightMap from an Image. The image will be converted to
|
||||||
* grayscale, and the grayscale values will be used to generate the height
|
* grayscale, and the grayscale values will be used to generate the height
|
||||||
|
@ -17,8 +17,14 @@ import java.util.logging.Logger;
|
|||||||
import javax.imageio.ImageIO;
|
import javax.imageio.ImageIO;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* Loads Terrain grid tiles with image heightmaps.
|
||||||
|
* By default it expects a 16-bit grayscale image as the heightmap, but
|
||||||
|
* you can also call setImageType(BufferedImage.TYPE_) to set it to be a different
|
||||||
|
* image type. If you do this, you must also set a custom ImageHeightmap that will
|
||||||
|
* understand and be able to parse the image. By default if you pass in an image of type
|
||||||
|
* BufferedImage.TYPE_3BYTE_BGR, it will use the ImageBasedHeightMap for you.
|
||||||
*
|
*
|
||||||
* @author Anthyon
|
* @author Anthyon, Brent Owens
|
||||||
*/
|
*/
|
||||||
public class ImageBasedHeightMapGrid implements HeightMapGrid {
|
public class ImageBasedHeightMapGrid implements HeightMapGrid {
|
||||||
|
|
||||||
@ -26,6 +32,8 @@ public class ImageBasedHeightMapGrid implements HeightMapGrid {
|
|||||||
private final AssetManager assetManager;
|
private final AssetManager assetManager;
|
||||||
private final Namer namer;
|
private final Namer namer;
|
||||||
private int size;
|
private int size;
|
||||||
|
private int imageType = BufferedImage.TYPE_USHORT_GRAY; // 16 bit grayscale
|
||||||
|
private ImageHeightmap customImageHeightmap;
|
||||||
|
|
||||||
public ImageBasedHeightMapGrid(final String textureBase, final String textureExt, AssetManager assetManager) {
|
public ImageBasedHeightMapGrid(final String textureBase, final String textureExt, AssetManager assetManager) {
|
||||||
this(assetManager, new Namer() {
|
this(assetManager, new Namer() {
|
||||||
@ -41,6 +49,27 @@ public class ImageBasedHeightMapGrid implements HeightMapGrid {
|
|||||||
this.namer = namer;
|
this.namer = namer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Lets you specify the type of images that are being loaded. All images
|
||||||
|
* must be the same type.
|
||||||
|
* @param imageType eg. BufferedImage.TYPE_USHORT_GRAY
|
||||||
|
*/
|
||||||
|
public void setImageType(int imageType) {
|
||||||
|
this.imageType = imageType;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The ImageHeightmap that will parse the image type that you
|
||||||
|
* specify with setImageType().
|
||||||
|
* @param customImageHeightmap must extend AbstractHeightmap
|
||||||
|
*/
|
||||||
|
public void setCustomImageHeightmap(ImageHeightmap customImageHeightmap) {
|
||||||
|
if (!(customImageHeightmap instanceof AbstractHeightMap)) {
|
||||||
|
throw new IllegalArgumentException("customImageHeightmap must be an AbstractHeightMap!");
|
||||||
|
}
|
||||||
|
this.customImageHeightmap = customImageHeightmap;
|
||||||
|
}
|
||||||
|
|
||||||
public HeightMap getHeightMapAt(Vector3f location) {
|
public HeightMap getHeightMapAt(Vector3f location) {
|
||||||
// HEIGHTMAP image (for the terrain heightmap)
|
// HEIGHTMAP image (for the terrain heightmap)
|
||||||
int x = (int) location.x;
|
int x = (int) location.x;
|
||||||
@ -57,11 +86,28 @@ public class ImageBasedHeightMapGrid implements HeightMapGrid {
|
|||||||
InputStream in = assetInfo.openStream();
|
InputStream in = assetInfo.openStream();
|
||||||
im = ImageIO.read(in);
|
im = ImageIO.read(in);
|
||||||
} else {
|
} else {
|
||||||
im = new BufferedImage(size, size, BufferedImage.TYPE_USHORT_GRAY);
|
im = new BufferedImage(size, size, imageType);
|
||||||
logger.log(Level.WARNING, "File: {0} not found, loading zero heightmap instead", name);
|
logger.log(Level.WARNING, "File: {0} not found, loading zero heightmap instead", name);
|
||||||
}
|
}
|
||||||
// CREATE HEIGHTMAP
|
// CREATE HEIGHTMAP
|
||||||
|
if (imageType == BufferedImage.TYPE_USHORT_GRAY) {
|
||||||
heightmap = new Grayscale16BitHeightMap(im);
|
heightmap = new Grayscale16BitHeightMap(im);
|
||||||
|
} else if (imageType == BufferedImage.TYPE_3BYTE_BGR) {
|
||||||
|
heightmap = new ImageBasedHeightMap(im);
|
||||||
|
} else if (customImageHeightmap != null && customImageHeightmap instanceof AbstractHeightMap) {
|
||||||
|
// If it gets here, it means you have specified a different image type, and you must
|
||||||
|
// then also supply a custom image heightmap class that can parse that image into
|
||||||
|
// a heightmap.
|
||||||
|
customImageHeightmap.setImage(im);
|
||||||
|
heightmap = (AbstractHeightMap) customImageHeightmap;
|
||||||
|
} else {
|
||||||
|
// error, no supported image format and no custom image heightmap specified
|
||||||
|
if (customImageHeightmap == null)
|
||||||
|
logger.log(Level.SEVERE, "Custom image type specified [{0}] but no customImageHeightmap declared! Use setCustomImageHeightmap()",imageType);
|
||||||
|
if (!(customImageHeightmap instanceof AbstractHeightMap))
|
||||||
|
logger.severe("customImageHeightmap must be an AbstractHeightMap!");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
heightmap.setHeightScale(256);
|
heightmap.setHeightScale(256);
|
||||||
heightmap.load();
|
heightmap.load();
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
|
@ -0,0 +1,29 @@
|
|||||||
|
/*
|
||||||
|
* To change this template, choose Tools | Templates
|
||||||
|
* and open the template in the editor.
|
||||||
|
*/
|
||||||
|
package com.jme3.terrain.heightmap;
|
||||||
|
|
||||||
|
import java.awt.Image;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A heightmap that is built off an image.
|
||||||
|
* If you want to be able to supply different Image types to
|
||||||
|
* ImageBaseHeightMapGrid, you need to implement this interface,
|
||||||
|
* and have that class extend Abstract heightmap.
|
||||||
|
*
|
||||||
|
* @author bowens
|
||||||
|
*/
|
||||||
|
public interface ImageHeightmap {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the image to use for this heightmap
|
||||||
|
*/
|
||||||
|
public void setImage(Image image);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The BufferedImage.TYPE_ that is supported
|
||||||
|
* by this ImageHeightmap
|
||||||
|
*/
|
||||||
|
public int getSupportedImageType();
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user