159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta/* 259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * To change this template, choose Tools | Templates 359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * and open the template in the editor. 459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 559b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartapackage com.jme3.terrain.geomipmap.grid; 659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 759b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.asset.AssetManager; 859b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.asset.AssetNotFoundException; 959b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.asset.TextureKey; 1059b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.export.JmeExporter; 1159b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.export.JmeImporter; 1259b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.math.Vector3f; 1359b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.terrain.geomipmap.TerrainGridTileLoader; 1459b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.terrain.geomipmap.TerrainQuad; 1559b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.terrain.heightmap.*; 1659b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.texture.Texture; 1759b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.io.IOException; 1859b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.util.logging.Level; 1959b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.util.logging.Logger; 2059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 2159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta/** 2259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 2359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @author Anthyon, normenhansen 2459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 2559b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartapublic class ImageTileLoader implements TerrainGridTileLoader{ 2659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private static final Logger logger = Logger.getLogger(ImageTileLoader.class.getName()); 2759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private final AssetManager assetManager; 2859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private final Namer namer; 2959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private int patchSize; 3059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private int quadSize; 3159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private float heightScale = 1; 3259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta //private int imageType = BufferedImage.TYPE_USHORT_GRAY; // 16 bit grayscale 3359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta //private ImageHeightmap customImageHeightmap; 3459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 3559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public ImageTileLoader(final String textureBase, final String textureExt, AssetManager assetManager) { 3659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta this(assetManager, new Namer() { 3759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 3859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public String getName(int x, int y) { 3959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return textureBase + "_" + x + "_" + y + "." + textureExt; 4059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 4159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta }); 4259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 4359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 4459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public ImageTileLoader(AssetManager assetManager, Namer namer) { 4559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta this.assetManager = assetManager; 4659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta this.namer = namer; 4759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 4859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 4959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 5059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * Effects vertical scale of the height of the terrain when loaded. 5159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 5259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void setHeightScale(float heightScale) { 5359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta this.heightScale = heightScale; 5459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 5559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 5659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 5759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 5859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * Lets you specify the type of images that are being loaded. All images 5959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * must be the same type. 6059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param imageType eg. BufferedImage.TYPE_USHORT_GRAY 6159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 6259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /*public void setImageType(int imageType) { 6359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta this.imageType = imageType; 6459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta }*/ 6559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 6659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /** 6759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * The ImageHeightmap that will parse the image type that you 6859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * specify with setImageType(). 6959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @param customImageHeightmap must extend AbstractHeightmap 7059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 7159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /*public void setCustomImageHeightmap(ImageHeightmap customImageHeightmap) { 7259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (!(customImageHeightmap instanceof AbstractHeightMap)) { 7359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta throw new IllegalArgumentException("customImageHeightmap must be an AbstractHeightMap!"); 7459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 7559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta this.customImageHeightmap = customImageHeightmap; 7659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta }*/ 7759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 7859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private HeightMap getHeightMapAt(Vector3f location) { 7959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // HEIGHTMAP image (for the terrain heightmap) 8059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int x = (int) location.x; 8159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int z = (int) location.z; 8259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 8359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta AbstractHeightMap heightmap = null; 8459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta //BufferedImage im = null; 8559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 8659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta String name = null; 8759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta try { 8859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta name = namer.getName(x, z); 8959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta logger.log(Level.INFO, "Loading heightmap from file: {0}", name); 9059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta final Texture texture = assetManager.loadTexture(new TextureKey(name)); 9159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta heightmap = new ImageBasedHeightMap(texture.getImage()); 9259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /*if (assetInfo != null){ 9359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta InputStream in = assetInfo.openStream(); 9459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta im = ImageIO.read(in); 9559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } else { 9659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta im = new BufferedImage(patchSize, patchSize, imageType); 9759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta logger.log(Level.WARNING, "File: {0} not found, loading zero heightmap instead", name); 9859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta }*/ 9959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // CREATE HEIGHTMAP 10059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta /*if (imageType == BufferedImage.TYPE_USHORT_GRAY) { 10159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta heightmap = new Grayscale16BitHeightMap(im); 10259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } else if (imageType == BufferedImage.TYPE_3BYTE_BGR) { 10359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta heightmap = new ImageBasedHeightMap(im); 10459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } else if (customImageHeightmap != null && customImageHeightmap instanceof AbstractHeightMap) { 10559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // If it gets here, it means you have specified a different image type, and you must 10659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // then also supply a custom image heightmap class that can parse that image into 10759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // a heightmap. 10859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta customImageHeightmap.setImage(im); 10959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta heightmap = (AbstractHeightMap) customImageHeightmap; 11059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } else { 11159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // error, no supported image format and no custom image heightmap specified 11259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (customImageHeightmap == null) 11359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta logger.log(Level.SEVERE, "Custom image type specified [{0}] but no customImageHeightmap declared! Use setCustomImageHeightmap()",imageType); 11459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (!(customImageHeightmap instanceof AbstractHeightMap)) 11559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta logger.severe("customImageHeightmap must be an AbstractHeightMap!"); 11659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return null; 11759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta }*/ 11859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta heightmap.setHeightScale(1); 11959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta heightmap.load(); 12059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta //} catch (IOException e) { 12159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta // e.printStackTrace(); 12259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } catch (AssetNotFoundException e) { 12359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta logger.log(Level.WARNING, "Asset {0} not found, loading zero heightmap instead", name); 12459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 12559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return heightmap; 12659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 12759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 12859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void setSize(int size) { 12959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta this.patchSize = size - 1; 13059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 13159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 13259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public TerrainQuad getTerrainQuadAt(Vector3f location) { 13359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta HeightMap heightMapAt = getHeightMapAt(location); 13459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta TerrainQuad q = new TerrainQuad("Quad" + location, patchSize, quadSize, heightMapAt == null ? null : heightMapAt.getHeightMap()); 13559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return q; 13659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 13759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 13859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void setPatchSize(int patchSize) { 13959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta this.patchSize = patchSize; 14059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 14159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 14259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void setQuadSize(int quadSize) { 14359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta this.quadSize = quadSize; 14459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 14559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 14659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void write(JmeExporter ex) throws IOException { 14759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta //TODO: serialization 14859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 14959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 15059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void read(JmeImporter im) throws IOException { 15159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta //TODO: serialization 15259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 15359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta} 154