001 //$HeadURL: svn+ssh://jwilden@svn.wald.intevation.org/deegree/base/branches/2.5_testing/src/org/deegree/ogcwebservices/wpvs/j3d/HeightMapTerrain.java $
002 /*----------------------------------------------------------------------------
003 This file is part of deegree.
004 Copyright (C) 2001-2009 by:
005 Department of Geography, University of Bonn
006 http://www.geographie.uni-bonn.de/deegree/
007 and
008 lat/lon GmbH
009 http://lat-lon.de/
010
011 Additional copyright notes:
012
013 This class uses some code fragments taken from J3D.org open source project
014 which has been published under LGPL at www.jd3.org.
015
016 This library is free software; you can redistribute it and/or modify it under
017 the terms of the GNU Lesser General Public License as published by the Free
018 Software Foundation; either version 2.1 of the License, or (at your option)
019 any later version.
020 This library is distributed in the hope that it will be useful, but WITHOUT
021 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
022 FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
023 details.
024 You should have received a copy of the GNU Lesser General Public License
025 along with this library; if not, write to the Free Software Foundation, Inc.,
026 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
027
028 Contact information:
029
030 lat/lon GmbH
031 Aennchenstr. 19, 53177 Bonn
032 Germany
033
034 Department of Geography, University of Bonn
035 Prof. Dr. Klaus Greve
036 Postfach 1147, 53001 Bonn
037 Germany
038
039 e-mail: info@deegree.org
040 ----------------------------------------------------------------------------*/
041
042 package org.deegree.ogcwebservices.wpvs.j3d;
043
044 // import java.awt.Color;
045
046 import java.awt.Color;
047
048 import javax.media.j3d.GeometryArray;
049 import javax.media.j3d.IndexedGeometryArray;
050 import javax.media.j3d.IndexedQuadArray;
051 import javax.media.j3d.IndexedTriangleArray;
052 import javax.media.j3d.IndexedTriangleFanArray;
053 import javax.media.j3d.IndexedTriangleStripArray;
054 import javax.media.j3d.QuadArray;
055 import javax.media.j3d.TriangleArray;
056 import javax.media.j3d.TriangleFanArray;
057 import javax.media.j3d.TriangleStripArray;
058 import javax.vecmath.Color3f;
059 import javax.vecmath.Vector3f;
060
061 import org.j3d.geom.GeometryData;
062 import org.j3d.geom.UnsupportedTypeException;
063 import org.j3d.geom.terrain.ColorRampGenerator;
064 import org.j3d.geom.terrain.ElevationGridGenerator;
065
066 /**
067 *
068 * @author <a href="mailto:poth@lat-lon.de">Andreas Poth</a>
069 * @author last edited by: $Author: rbezema $
070 *
071 * @version $Revision: 20601 $, $Date: 2009-11-05 16:25:55 +0100 (Do, 05 Nov 2009) $
072 */
073 public class HeightMapTerrain extends TerrainModel {
074
075 /** Width of the terrain to generate */
076 private float terrainWidth;
077
078 /** Depth of the terrain to generate */
079 private float terrainDepth;
080
081 /** The last generated terrain heights */
082 private float[][] terrainHeights;
083
084 /** coloring informations */
085 private ColorRampGenerator colorGenerator;
086
087 private int geometryType;
088
089 private boolean centerTerrain;
090
091 private Vector3f translation;
092
093 /**
094 *
095 * @param width
096 * width of the terrains bbox
097 * @param depth
098 * depth/height of the terrains bbox
099 * @param heights
100 * terrain data; heights
101 * @param translation
102 * of the lowerleft point of the heightmap to the lowerleftpoint of the Java3D model.
103 * @param geometryType
104 * defines the type/format of the used GeometryArray. supported are:
105 * <ul>
106 * <li>GeometryData.TRIANGLES
107 * <li>GeometryData.QUADS
108 * <li>GeometryData.INDEXED_QUADS
109 * <li>GeometryData.INDEXED_TRIANGLES
110 * <li>GeometryData.TRIANGLE_STRIPS
111 * <li>GeometryData.TRIANGLE_FANS
112 * <li>GeometryData.INDEXED_TRIANGLE_STRIPS:
113 * <li>GeometryData.INDEXED_TRIANGLE_FANS
114 * </ul>
115 * @param centerTerrain
116 */
117 public HeightMapTerrain( float width, float depth, float[][] heights, Vector3f translation, int geometryType,
118 boolean centerTerrain ) {
119 terrainWidth = width;
120 terrainDepth = depth;
121 this.terrainHeights = heights;
122 this.translation = translation;
123 colorGenerator = createDefaultColorGenerator();
124 this.geometryType = geometryType;
125 this.centerTerrain = centerTerrain;
126 }
127
128 /**
129 *
130 * @param width
131 * width of the terrains bbox
132 * @param depth
133 * depth/height of the terrains bbox
134 * @param heights
135 * terrain data; heights
136 * @param geometryType
137 * for a description see
138 * {@link HeightMapTerrain#HeightMapTerrain(float, float, float[][], Vector3f, int, boolean)}
139 * @param centerTerrain
140 * @param colorGenerator
141 */
142 public HeightMapTerrain( float width, float depth, float[][] heights, int geometryType, boolean centerTerrain,
143 ColorRampGenerator colorGenerator ) {
144
145 terrainWidth = width;
146 terrainDepth = depth;
147 this.terrainHeights = heights;
148 this.colorGenerator = colorGenerator;
149 if ( this.colorGenerator == null )
150 this.colorGenerator = createDefaultColorGenerator();
151 this.geometryType = geometryType;
152 this.centerTerrain = centerTerrain;
153 }
154
155 /**
156 * Generate height values only based on the current configuration.
157 *
158 * @return The last generated height values
159 */
160 public float[][] getTerrainHeights() {
161 return terrainHeights;
162 }
163
164 /**
165 * Must be called before rendering the terrain!!
166 *
167 *
168 */
169 @Override
170 public void createTerrain() {
171
172 ElevationGridGenerator gridGenerator = new ElevationGridGenerator( terrainWidth, terrainDepth,
173 terrainHeights[0].length,
174 terrainHeights.length, translation,
175 centerTerrain );
176
177 // set the terrain into the elevation grid handler
178 gridGenerator.setTerrainDetail( terrainHeights, 0 );
179
180 GeometryData data = new GeometryData();
181 data.geometryType = geometryType;
182 data.geometryComponents = GeometryData.NORMAL_DATA;
183 try {
184 gridGenerator.generate( data );
185 } catch ( UnsupportedTypeException ute ) {
186 System.out.println( "Geometry type is not supported" );
187 }
188
189 int format = GeometryArray.COORDINATES | GeometryArray.NORMALS | GeometryArray.COLOR_3;
190 colorGenerator.generate( data );
191
192 GeometryArray geom = createGeometryArray( data, format );
193
194 geom.setCoordinates( 0, data.coordinates );
195 geom.setNormals( 0, data.normals );
196 // geom.setColors( 0, data.colors );
197
198 setGeometry( geom );
199 }
200
201 /**
202 * @return the terrainDepth value.
203 */
204 public float getTerrainDepth() {
205 return terrainDepth;
206 }
207
208 /**
209 * @return the terrainWidth value.
210 */
211 public float getTerrainWidth() {
212 return terrainWidth;
213 }
214
215 /**
216 * @return true if the Terrain should be centered.
217 */
218 public boolean isTerrainCentered() {
219 return centerTerrain;
220 }
221
222 /**
223 * @return the geometryType. For a description of possible values see
224 * {@link HeightMapTerrain#HeightMapTerrain(float, float, float[][], Vector3f, int, boolean)}
225 */
226 public int getGeometryType() {
227 return geometryType;
228 }
229
230 /**
231 * Methodfor creating a GeometryArray depending on the passed array format. supported are:
232 *
233 * @param data
234 * actual geometry
235 * @param format
236 * the Internal formats the GeometryArray should have see {@link GeometryArray#GeometryArray(int, int)};
237 * @return a GeometryArray instantiated according to the GeometryType in the GeometryData.
238 */
239 protected GeometryArray createGeometryArray( GeometryData data, int format ) {
240 GeometryArray geom = null;
241 IndexedGeometryArray i_geom;
242
243 switch ( data.geometryType ) {
244 case GeometryData.TRIANGLES:
245 geom = new TriangleArray( data.vertexCount, format );
246 break;
247
248 case GeometryData.QUADS:
249 geom = new QuadArray( data.vertexCount, format );
250 break;
251
252 case GeometryData.INDEXED_QUADS:
253
254 i_geom = new IndexedQuadArray( data.vertexCount, format, data.indexesCount );
255 i_geom.setCoordinateIndices( 0, data.indexes );
256 i_geom.setColorIndices( 0, data.indexes );
257 i_geom.setNormalIndices( 0, data.indexes );
258 geom = i_geom;
259 break;
260 case GeometryData.INDEXED_TRIANGLES:
261
262 i_geom = new IndexedTriangleArray( data.vertexCount, format, data.indexesCount );
263 i_geom.setCoordinateIndices( 0, data.indexes );
264 i_geom.setColorIndices( 0, data.indexes );
265 i_geom.setNormalIndices( 0, data.indexes );
266 geom = i_geom;
267 break;
268
269 case GeometryData.TRIANGLE_STRIPS:
270 geom = new TriangleStripArray( data.vertexCount, format, data.stripCounts );
271 break;
272
273 case GeometryData.TRIANGLE_FANS:
274 geom = new TriangleFanArray( data.vertexCount, format, data.stripCounts );
275 break;
276
277 case GeometryData.INDEXED_TRIANGLE_STRIPS:
278 i_geom = new IndexedTriangleStripArray( data.vertexCount, format, data.indexesCount, data.stripCounts );
279 i_geom.setCoordinateIndices( 0, data.indexes );
280 i_geom.setColorIndices( 0, data.indexes );
281 i_geom.setNormalIndices( 0, data.indexes );
282 geom = i_geom;
283 break;
284
285 case GeometryData.INDEXED_TRIANGLE_FANS:
286 i_geom = new IndexedTriangleFanArray( data.vertexCount, format, data.indexesCount, data.stripCounts );
287 i_geom.setCoordinateIndices( 0, data.indexes );
288 i_geom.setColorIndices( 0, data.indexes );
289 i_geom.setNormalIndices( 0, data.indexes );
290 geom = i_geom;
291 break;
292 }
293 return geom;
294 }
295
296 private ColorRampGenerator createDefaultColorGenerator() {
297 Color3f[] colors = new Color3f[2];
298 colors[0] = new Color3f( Color.WHITE );
299 colors[1] = new Color3f( Color.BLACK );
300 float[] heights = new float[2];
301 heights[0] = -150;
302 heights[1] = 1500;
303 return new ColorRampGenerator( heights, colors );
304 }
305
306 /**
307 * @return the translation value.
308 */
309 public Vector3f getTranslation() {
310 return translation;
311 }
312 }