001    //$HeadURL: https://svn.wald.intevation.org/svn/deegree/base/branches/2.3_testing/src/org/deegree/ogcwebservices/wpvs/j3d/TexturedHeightMapTerrain.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    package org.deegree.ogcwebservices.wpvs.j3d;
042    
043    import static org.deegree.framework.log.LoggerFactory.getLogger;
044    
045    import java.awt.image.BufferedImage;
046    import java.net.URL;
047    import java.util.Arrays;
048    
049    import javax.media.j3d.GeometryArray;
050    import javax.vecmath.Vector3f;
051    
052    import org.deegree.framework.log.ILogger;
053    import org.deegree.framework.util.ImageUtils;
054    import org.deegree.ogcwebservices.wpvs.configuration.RenderingConfiguration;
055    import org.j3d.geom.GeometryData;
056    import org.j3d.geom.UnsupportedTypeException;
057    import org.j3d.geom.terrain.ElevationGridGenerator;
058    
059    /**
060     * 
061     * @author <a href="mailto:poth@lat-lon.de">Andreas Poth</a>
062     * @author last edited by: $Author: rbezema $
063     * 
064     *         $Revision: 20601 $, $Date: 2009-11-05 16:25:55 +0100 (Do, 05. Nov 2009) $
065     */
066    public class TexturedHeightMapTerrain extends HeightMapTerrain {
067    
068        private static final ILogger LOG = getLogger( TexturedHeightMapTerrain.class );
069    
070        /**
071         * @param width
072         *            width of the terrains bbox
073         * @param depth
074         *            depth/height of the terrains bbox
075         * @param heights
076         *            terrain data; heights
077         * @param translation
078         *            of the lowerleft point to the Java3D model.
079         * @param geometryType
080         *            for a description see
081         *            {@link HeightMapTerrain#HeightMapTerrain(float, float, float[][], Vector3f, int, boolean)}
082         * @param centerTerrain
083         */
084        public TexturedHeightMapTerrain( float width, float depth, float[][] heights, Vector3f translation,
085                                         int geometryType, boolean centerTerrain ) {
086            super( width, depth, heights, translation, geometryType, centerTerrain );
087        }
088    
089        /**
090         * No translation of the lowerleft point.
091         * 
092         * @param width
093         *            width of the terrains bbox
094         * @param depth
095         *            depth/height of the terrains bbox
096         * @param heights
097         *            terrain data; heights
098         * @param geometryType
099         *            for a description see
100         *            {@link HeightMapTerrain#HeightMapTerrain(float, float, float[][], Vector3f, int, boolean)}
101         * @param centerTerrain
102         * @param texture
103         */
104        public TexturedHeightMapTerrain( float width, float depth, float[][] heights, int geometryType,
105                                         boolean centerTerrain, BufferedImage texture ) {
106    
107            super( width, depth, heights, new Vector3f( 0, 0, 0 ), geometryType, centerTerrain );
108            setTexture( texture );
109        }
110    
111        /**
112         * No translation of the lowerleft point.
113         * 
114         * @param width
115         *            width of the terrains bbox
116         * @param depth
117         *            depth/height of the terrains bbox
118         * @param heights
119         *            terrain data; heights
120         * @param geometryType
121         *            for a description see
122         *            {@link HeightMapTerrain#HeightMapTerrain(float, float, float[][], Vector3f, int, boolean)}
123         * @param centerTerrain
124         * @param textureFile
125         */
126        public TexturedHeightMapTerrain( float width, float depth, float[][] heights, int geometryType,
127                                         boolean centerTerrain, URL textureFile ) {
128    
129            super( width, depth, heights, new Vector3f( 0, 0, 0 ), geometryType, centerTerrain );
130            try {
131                setTexture( ImageUtils.loadImage( textureFile ) );
132            } catch ( Exception e ) {
133                LOG.logError( e );
134            }
135        }
136    
137        /**
138         * Must be called before rendering the terrain!!i<br>
139         */
140        @Override
141        public void createTerrain() {
142            // System.out.println( "terrain#material: " +getAppearance().getMaterial() );
143            ElevationGridGenerator gridGenerator = new ElevationGridGenerator( getTerrainWidth(), getTerrainDepth(),
144                                                                               getTerrainHeights()[0].length,
145                                                                               getTerrainHeights().length,
146                                                                               getTranslation(), isTerrainCentered() );
147    
148            // set the terrain into the elevation grid handler
149            gridGenerator.setTerrainDetail( getTerrainHeights(), 0 );
150    
151            GeometryData data = new GeometryData();
152            data.geometryType = getGeometryType();
153            data.geometryComponents = GeometryData.NORMAL_DATA;
154    
155            if ( getTexture() != null ) {
156                data.geometryComponents |= GeometryData.TEXTURE_2D_DATA;
157            }
158            try {
159                gridGenerator.generate( data );
160            } catch ( UnsupportedTypeException ute ) {
161                LOG.logError( "Geometry type is not supported.", ute );
162            }
163            int format = GeometryArray.COORDINATES | GeometryArray.NORMALS;
164            if ( getTexture() != null ) {
165                format |= GeometryArray.TEXTURE_COORDINATE_2;
166            }
167            if ( !RenderingConfiguration.getInstance().isTerrainShadingEnabled() ) {
168                format |= GeometryArray.COLOR_3;
169            }
170            GeometryArray geom = createGeometryArray( data, format );
171    
172            geom.setCoordinates( 0, data.coordinates );
173            geom.setNormals( 0, data.normals );
174            if ( !RenderingConfiguration.getInstance().isTerrainShadingEnabled() ) {
175                float[] colors = new float[geom.getVertexCount() * 3];
176                Arrays.fill( colors, 1 );
177                geom.setColors( 0, colors );
178            }
179    
180            if ( getTexture() != null ) {
181                geom.setTextureCoordinates( 0, 0, data.textureCoordinates );
182            }
183            setGeometry( geom );
184        }
185    
186        // private void addTexture() {
187        // Appearance appearance = getAppearance();
188        // appearance.setMaterial( targetMaterial );
189        //
190        // PolygonAttributes targetPolyAttr = new PolygonAttributes();
191        // int capabilities = PolygonAttributes.ALLOW_MODE_WRITE |
192        // PolygonAttributes.ALLOW_CULL_FACE_WRITE |
193        // PolygonAttributes.ALLOW_NORMAL_FLIP_WRITE |
194        // PolygonAttributes.POLYGON_FILL;
195        // targetPolyAttr.setCapability( capabilities );
196        // appearance.setPolygonAttributes( targetPolyAttr );
197        // if ( getTexture() != null ) {
198        // try {
199        // Texture texture = new TextureLoader( getTexture() ).getTexture();
200        // texture.setEnable( true );
201        // texture.setCapability( Texture.ALLOW_ENABLE_WRITE );
202        // appearance.setTexture( texture );
203        // } catch ( Exception e ) {
204        // e.printStackTrace();
205        // }
206        // setCapability( Shape3D.ALLOW_GEOMETRY_WRITE );
207        // setAppearance( appearance );
208        // }
209        // }
210    
211    }