diff options
Diffstat (limited to 'engine/src/terrain/com/jme3/terrain/geomipmap/grid/ImageTileLoader.java')
-rw-r--r-- | engine/src/terrain/com/jme3/terrain/geomipmap/grid/ImageTileLoader.java | 153 |
1 files changed, 153 insertions, 0 deletions
diff --git a/engine/src/terrain/com/jme3/terrain/geomipmap/grid/ImageTileLoader.java b/engine/src/terrain/com/jme3/terrain/geomipmap/grid/ImageTileLoader.java new file mode 100644 index 0000000..cef6a72 --- /dev/null +++ b/engine/src/terrain/com/jme3/terrain/geomipmap/grid/ImageTileLoader.java @@ -0,0 +1,153 @@ +/* + * To change this template, choose Tools | Templates + * and open the template in the editor. + */ +package com.jme3.terrain.geomipmap.grid; + +import com.jme3.asset.AssetManager; +import com.jme3.asset.AssetNotFoundException; +import com.jme3.asset.TextureKey; +import com.jme3.export.JmeExporter; +import com.jme3.export.JmeImporter; +import com.jme3.math.Vector3f; +import com.jme3.terrain.geomipmap.TerrainGridTileLoader; +import com.jme3.terrain.geomipmap.TerrainQuad; +import com.jme3.terrain.heightmap.*; +import com.jme3.texture.Texture; +import java.io.IOException; +import java.util.logging.Level; +import java.util.logging.Logger; + +/** + * + * @author Anthyon, normenhansen + */ +public class ImageTileLoader implements TerrainGridTileLoader{ + private static final Logger logger = Logger.getLogger(ImageTileLoader.class.getName()); + private final AssetManager assetManager; + private final Namer namer; + private int patchSize; + private int quadSize; + private float heightScale = 1; + //private int imageType = BufferedImage.TYPE_USHORT_GRAY; // 16 bit grayscale + //private ImageHeightmap customImageHeightmap; + + public ImageTileLoader(final String textureBase, final String textureExt, AssetManager assetManager) { + this(assetManager, new Namer() { + + public String getName(int x, int y) { + return textureBase + "_" + x + "_" + y + "." + textureExt; + } + }); + } + + public ImageTileLoader(AssetManager assetManager, Namer namer) { + this.assetManager = assetManager; + this.namer = namer; + } + + /** + * Effects vertical scale of the height of the terrain when loaded. + */ + public void setHeightScale(float heightScale) { + this.heightScale = heightScale; + } + + + /** + * 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; + }*/ + + private HeightMap getHeightMapAt(Vector3f location) { + // HEIGHTMAP image (for the terrain heightmap) + int x = (int) location.x; + int z = (int) location.z; + + AbstractHeightMap heightmap = null; + //BufferedImage im = null; + + String name = null; + try { + name = namer.getName(x, z); + logger.log(Level.INFO, "Loading heightmap from file: {0}", name); + final Texture texture = assetManager.loadTexture(new TextureKey(name)); + heightmap = new ImageBasedHeightMap(texture.getImage()); + /*if (assetInfo != null){ + InputStream in = assetInfo.openStream(); + im = ImageIO.read(in); + } else { + im = new BufferedImage(patchSize, patchSize, 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(1); + heightmap.load(); + //} catch (IOException e) { + // e.printStackTrace(); + } catch (AssetNotFoundException e) { + logger.log(Level.WARNING, "Asset {0} not found, loading zero heightmap instead", name); + } + return heightmap; + } + + public void setSize(int size) { + this.patchSize = size - 1; + } + + public TerrainQuad getTerrainQuadAt(Vector3f location) { + HeightMap heightMapAt = getHeightMapAt(location); + TerrainQuad q = new TerrainQuad("Quad" + location, patchSize, quadSize, heightMapAt == null ? null : heightMapAt.getHeightMap()); + return q; + } + + public void setPatchSize(int patchSize) { + this.patchSize = patchSize; + } + + public void setQuadSize(int quadSize) { + this.quadSize = quadSize; + } + + public void write(JmeExporter ex) throws IOException { + //TODO: serialization + } + + public void read(JmeImporter im) throws IOException { + //TODO: serialization + } +} |