1/*
2 * To change this template, choose Tools | Templates
3 * and open the template in the editor.
4 */
5package com.jme3.terrain.geomipmap.grid;
6
7import com.jme3.asset.AssetManager;
8import com.jme3.asset.AssetNotFoundException;
9import com.jme3.asset.TextureKey;
10import com.jme3.export.JmeExporter;
11import com.jme3.export.JmeImporter;
12import com.jme3.math.Vector3f;
13import com.jme3.terrain.geomipmap.TerrainGridTileLoader;
14import com.jme3.terrain.geomipmap.TerrainQuad;
15import com.jme3.terrain.heightmap.*;
16import com.jme3.texture.Texture;
17import java.io.IOException;
18import java.util.logging.Level;
19import java.util.logging.Logger;
20
21/**
22 *
23 * @author Anthyon, normenhansen
24 */
25public class ImageTileLoader implements TerrainGridTileLoader{
26    private static final Logger logger = Logger.getLogger(ImageTileLoader.class.getName());
27    private final AssetManager assetManager;
28    private final Namer namer;
29    private int patchSize;
30    private int quadSize;
31    private float heightScale = 1;
32    //private int imageType = BufferedImage.TYPE_USHORT_GRAY; // 16 bit grayscale
33    //private ImageHeightmap customImageHeightmap;
34
35    public ImageTileLoader(final String textureBase, final String textureExt, AssetManager assetManager) {
36        this(assetManager, new Namer() {
37
38            public String getName(int x, int y) {
39                return textureBase + "_" + x + "_" + y + "." + textureExt;
40            }
41        });
42    }
43
44    public ImageTileLoader(AssetManager assetManager, Namer namer) {
45        this.assetManager = assetManager;
46        this.namer = namer;
47    }
48
49    /**
50     * Effects vertical scale of the height of the terrain when loaded.
51     */
52    public void setHeightScale(float heightScale) {
53        this.heightScale = heightScale;
54    }
55
56
57    /**
58     * Lets you specify the type of images that are being loaded. All images
59     * must be the same type.
60     * @param imageType eg. BufferedImage.TYPE_USHORT_GRAY
61     */
62    /*public void setImageType(int imageType) {
63        this.imageType = imageType;
64    }*/
65
66    /**
67     * The ImageHeightmap that will parse the image type that you
68     * specify with setImageType().
69     * @param customImageHeightmap must extend AbstractHeightmap
70     */
71    /*public void setCustomImageHeightmap(ImageHeightmap customImageHeightmap) {
72        if (!(customImageHeightmap instanceof AbstractHeightMap)) {
73            throw new IllegalArgumentException("customImageHeightmap must be an AbstractHeightMap!");
74        }
75        this.customImageHeightmap = customImageHeightmap;
76    }*/
77
78    private HeightMap getHeightMapAt(Vector3f location) {
79        // HEIGHTMAP image (for the terrain heightmap)
80        int x = (int) location.x;
81        int z = (int) location.z;
82
83        AbstractHeightMap heightmap = null;
84        //BufferedImage im = null;
85
86        String name = null;
87        try {
88            name = namer.getName(x, z);
89            logger.log(Level.INFO, "Loading heightmap from file: {0}", name);
90            final Texture texture = assetManager.loadTexture(new TextureKey(name));
91            heightmap = new ImageBasedHeightMap(texture.getImage());
92            /*if (assetInfo != null){
93                InputStream in = assetInfo.openStream();
94                im = ImageIO.read(in);
95            } else {
96                im = new BufferedImage(patchSize, patchSize, imageType);
97                logger.log(Level.WARNING, "File: {0} not found, loading zero heightmap instead", name);
98            }*/
99            // CREATE HEIGHTMAP
100            /*if (imageType == BufferedImage.TYPE_USHORT_GRAY) {
101                heightmap = new Grayscale16BitHeightMap(im);
102            } else if (imageType == BufferedImage.TYPE_3BYTE_BGR) {
103                heightmap = new ImageBasedHeightMap(im);
104            } else if (customImageHeightmap != null && customImageHeightmap instanceof AbstractHeightMap) {
105                // If it gets here, it means you have specified a different image type, and you must
106                // then also supply a custom image heightmap class that can parse that image into
107                // a heightmap.
108                customImageHeightmap.setImage(im);
109                heightmap = (AbstractHeightMap) customImageHeightmap;
110            } else {
111                // error, no supported image format and no custom image heightmap specified
112                if (customImageHeightmap == null)
113                    logger.log(Level.SEVERE, "Custom image type specified [{0}] but no customImageHeightmap declared! Use setCustomImageHeightmap()",imageType);
114                if (!(customImageHeightmap instanceof AbstractHeightMap))
115                    logger.severe("customImageHeightmap must be an AbstractHeightMap!");
116                return null;
117            }*/
118            heightmap.setHeightScale(1);
119            heightmap.load();
120        //} catch (IOException e) {
121        //    e.printStackTrace();
122        } catch (AssetNotFoundException e) {
123            logger.log(Level.WARNING, "Asset {0} not found, loading zero heightmap instead", name);
124        }
125        return heightmap;
126    }
127
128    public void setSize(int size) {
129        this.patchSize = size - 1;
130    }
131
132    public TerrainQuad getTerrainQuadAt(Vector3f location) {
133        HeightMap heightMapAt = getHeightMapAt(location);
134        TerrainQuad q = new TerrainQuad("Quad" + location, patchSize, quadSize, heightMapAt == null ? null : heightMapAt.getHeightMap());
135        return q;
136    }
137
138    public void setPatchSize(int patchSize) {
139        this.patchSize = patchSize;
140    }
141
142    public void setQuadSize(int quadSize) {
143        this.quadSize = quadSize;
144    }
145
146    public void write(JmeExporter ex) throws IOException {
147        //TODO: serialization
148    }
149
150    public void read(JmeImporter im) throws IOException {
151        //TODO: serialization
152    }
153}
154