cleaned up terrainQuad constructor.
Added flexibility to image heightmap git-svn-id: https://jmonkeyengine.googlecode.com/svn/trunk@8585 75d07b2b-3a1a-0410-a2c5-0572b91ccdca
This commit is contained in:
		
							parent
							
								
									866b607acb
								
							
						
					
					
						commit
						6712fccbc3
					
				| @ -86,7 +86,7 @@ public class TerrainGrid extends TerrainQuad { | ||||
|                     if (q == null) { | ||||
|                         // create the new Quad since it doesn't exist | ||||
|                         HeightMap heightMapAt = heightMapGrid.getHeightMapAt(temp); | ||||
|                         q = new TerrainQuad(getName() + "Quad" + temp, patchSize, quadSize, totalSize, heightMapAt == null ? null : heightMapAt.getHeightMap()); | ||||
|                         q = new TerrainQuad(getName() + "Quad" + temp, patchSize, totalSize, quadSize, heightMapAt == null ? null : heightMapAt.getHeightMap()); | ||||
|                         q.setMaterial(material.clone()); | ||||
|                         log.log(Level.FINE, "Loaded TerrainQuad {0}", q.getName()); | ||||
|                     } | ||||
|  | ||||
| @ -161,7 +161,7 @@ public class TerrainQuad extends Node implements Terrain { | ||||
|      * @param heightMap | ||||
|      */ | ||||
|     public TerrainQuad(String name, int patchSize, int quadSize, int totalSize, float[] heightMap) { | ||||
|         this(name, patchSize, totalSize, Vector3f.UNIT_XYZ, heightMap); | ||||
|         this(name, patchSize, totalSize, quadSize, Vector3f.UNIT_XYZ, heightMap); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|  | ||||
| @ -48,7 +48,7 @@ import java.awt.image.WritableRaster; | ||||
|  * @author Mike Kienenberger | ||||
|  * @version $id$ | ||||
|  */ | ||||
| public class ImageBasedHeightMap extends AbstractHeightMap { | ||||
| public class ImageBasedHeightMap extends AbstractHeightMap implements ImageHeightmap { | ||||
| 
 | ||||
|     static protected class ImageConverter { | ||||
| 
 | ||||
| @ -137,6 +137,14 @@ public class ImageBasedHeightMap extends AbstractHeightMap { | ||||
|     protected float dampen = 1.0f; | ||||
| 
 | ||||
|      | ||||
|     public void setImage(Image image) { | ||||
|         this.colorImage = image; | ||||
|     } | ||||
|      | ||||
|     public int getSupportedImageType() { | ||||
|         return BufferedImage.TYPE_3BYTE_BGR; | ||||
|     } | ||||
|      | ||||
|     /** | ||||
|      * Creates a HeightMap from an Image. The image will be converted to | ||||
|      * grayscale, and the grayscale values will be used to generate the height | ||||
|  | ||||
| @ -17,8 +17,14 @@ import java.util.logging.Logger; | ||||
| import javax.imageio.ImageIO; | ||||
| 
 | ||||
| /** | ||||
|  * Loads Terrain grid tiles with image heightmaps. | ||||
|  * By default it expects a 16-bit grayscale image as the heightmap, but | ||||
|  * you can also call setImageType(BufferedImage.TYPE_) to set it to be a different | ||||
|  * image type. If you do this, you must also set a custom ImageHeightmap that will | ||||
|  * understand and be able to parse the image. By default if you pass in an image of type | ||||
|  * BufferedImage.TYPE_3BYTE_BGR, it will use the ImageBasedHeightMap for you. | ||||
|  *  | ||||
|  * @author Anthyon | ||||
|  * @author Anthyon, Brent Owens | ||||
|  */ | ||||
| public class ImageBasedHeightMapGrid implements HeightMapGrid { | ||||
| 
 | ||||
| @ -26,6 +32,8 @@ public class ImageBasedHeightMapGrid implements HeightMapGrid { | ||||
|     private final AssetManager assetManager; | ||||
|     private final Namer namer; | ||||
|     private int size; | ||||
|     private int imageType = BufferedImage.TYPE_USHORT_GRAY; // 16 bit grayscale | ||||
|     private ImageHeightmap customImageHeightmap; | ||||
| 
 | ||||
|     public ImageBasedHeightMapGrid(final String textureBase, final String textureExt, AssetManager assetManager) { | ||||
|         this(assetManager, new Namer() { | ||||
| @ -41,6 +49,27 @@ public class ImageBasedHeightMapGrid implements HeightMapGrid { | ||||
|         this.namer = namer; | ||||
|     } | ||||
|      | ||||
|     /** | ||||
|      * 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; | ||||
|     } | ||||
| 
 | ||||
|     public HeightMap getHeightMapAt(Vector3f location) { | ||||
|         // HEIGHTMAP image (for the terrain heightmap) | ||||
|         int x = (int) location.x; | ||||
| @ -57,11 +86,28 @@ public class ImageBasedHeightMapGrid implements HeightMapGrid { | ||||
|                 InputStream in = assetInfo.openStream(); | ||||
|                 im = ImageIO.read(in); | ||||
|             } else { | ||||
|                 im = new BufferedImage(size, size, BufferedImage.TYPE_USHORT_GRAY); | ||||
|                 im = new BufferedImage(size, size, 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(256); | ||||
|             heightmap.load(); | ||||
|         } catch (IOException e) { | ||||
|  | ||||
| @ -0,0 +1,29 @@ | ||||
| /* | ||||
|  * To change this template, choose Tools | Templates | ||||
|  * and open the template in the editor. | ||||
|  */ | ||||
| package com.jme3.terrain.heightmap; | ||||
| 
 | ||||
| import java.awt.Image; | ||||
| 
 | ||||
| /** | ||||
|  * A heightmap that is built off an image. | ||||
|  * If you want to be able to supply different Image types to  | ||||
|  * ImageBaseHeightMapGrid, you need to implement this interface, | ||||
|  * and have that class extend Abstract heightmap. | ||||
|  *  | ||||
|  * @author bowens | ||||
|  */ | ||||
| public interface ImageHeightmap { | ||||
|      | ||||
|     /** | ||||
|      * Set the image to use for this heightmap | ||||
|      */ | ||||
|     public void setImage(Image image); | ||||
|      | ||||
|     /** | ||||
|      * The BufferedImage.TYPE_ that is supported | ||||
|      * by this ImageHeightmap | ||||
|      */ | ||||
|     public int getSupportedImageType(); | ||||
| } | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user