cleaned up terrainQuad constructor.

Added flexibility to image heightmap

git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@8585 75d07b2b-3a1a-0410-a2c5-0572b91ccdca
3.0
bre..ns 13 years ago
parent 866b607acb
commit 6712fccbc3
  1. 2
      engine/src/terrain/com/jme3/terrain/geomipmap/TerrainGrid.java
  2. 2
      engine/src/terrain/com/jme3/terrain/geomipmap/TerrainQuad.java
  3. 10
      engine/src/terrain/com/jme3/terrain/heightmap/ImageBasedHeightMap.java
  4. 50
      engine/src/terrain/com/jme3/terrain/heightmap/ImageBasedHeightMapGrid.java
  5. 29
      engine/src/terrain/com/jme3/terrain/heightmap/ImageHeightmap.java

@ -86,7 +86,7 @@ public class TerrainGrid extends TerrainQuad {
if (q == null) {
// create the new Quad since it doesn't exist
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());
log.log(Level.FINE, "Loaded TerrainQuad {0}", q.getName());
}

@ -161,7 +161,7 @@ public class TerrainQuad extends Node implements Terrain {
* @param 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
* @version $id$
*/
public class ImageBasedHeightMap extends AbstractHeightMap {
public class ImageBasedHeightMap extends AbstractHeightMap implements ImageHeightmap {
static protected class ImageConverter {
@ -137,6 +137,14 @@ public class ImageBasedHeightMap extends AbstractHeightMap {
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
* 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;
/**
* 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 {
@ -26,6 +32,8 @@ public class ImageBasedHeightMapGrid implements HeightMapGrid {
private final AssetManager assetManager;
private final Namer namer;
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) {
this(assetManager, new Namer() {
@ -41,6 +49,27 @@ public class ImageBasedHeightMapGrid implements HeightMapGrid {
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) {
// HEIGHTMAP image (for the terrain heightmap)
int x = (int) location.x;
@ -57,11 +86,28 @@ public class ImageBasedHeightMapGrid implements HeightMapGrid {
InputStream in = assetInfo.openStream();
im = ImageIO.read(in);
} 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);
}
// CREATE HEIGHTMAP
if (imageType == BufferedImage.TYPE_USHORT_GRAY) {
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.load();
} 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…
Cancel
Save