aboutsummaryrefslogtreecommitdiff
path: root/engine/src/terrain/com/jme3/terrain/geomipmap/grid/ImageTileLoader.java
diff options
context:
space:
mode:
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.java153
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
+ }
+}