| /* |
| * 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 |
| } |
| } |