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