001 //$HeadURL: svn+ssh://rbezema@svn.wald.intevation.org/deegree/base/tags/2.1/src/org/deegree/ogcwebservices/wpvs/j3d/TerrainModel.java $
002 /*---------------- FILE HEADER ------------------------------------------
003
004 This file is part of deegree.
005 Copyright (C) 2001-2006 by:
006 EXSE, Department of Geography, University of Bonn
007 http://www.giub.uni-bonn.de/exse/
008 lat/lon GmbH
009 http://www.lat-lon.de
010
011 This library is free software; you can redistribute it and/or
012 modify it under the terms of the GNU Lesser General Public
013 License as published by the Free Software Foundation; either
014 version 2.1 of the License, or (at your option) any later version.
015
016 This library is distributed in the hope that it will be useful,
017 but WITHOUT ANY WARRANTY; without even the implied warranty of
018 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
019 Lesser General Public License for more details.
020
021 You should have received a copy of the GNU Lesser General Public
022 License along with this library; if not, write to the Free Software
023 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
024
025 Contact:
026
027 Andreas Poth
028 lat/lon GmbH
029 Aennchenstrasse 19
030 53177 Bonn
031 Germany
032 E-Mail: poth@lat-lon.de
033
034 Jens Fitzke
035 lat/lon GmbH
036 Aennchenstrasse 19
037 53177 Bonn
038 Germany
039 E-Mail: jens.fitzke@uni-bonn.de
040
041 ---------------------------------------------------------------------------*/
042
043 package org.deegree.ogcwebservices.wpvs.j3d;
044
045 import java.awt.image.BufferedImage;
046
047 import javax.media.j3d.Appearance;
048 import javax.media.j3d.Material;
049 import javax.media.j3d.RenderingAttributes;
050 import javax.media.j3d.Shape3D;
051 import javax.vecmath.Color3f;
052
053 import org.deegree.ogcwebservices.wpvs.configuration.RenderingConfiguration;
054
055 /**
056 * The <code>TerrainModel</code> class is a base class for all dgm's (terrains). It is capable of
057 * loading a texture onto the geometry of it's subclasses.
058 *
059 * @author <a href="mailto:bezema@lat-lon.de">Rutger Bezema</a>
060 *
061 * @author last edited by: $Author: rbezema $
062 *
063 * @version $Revision: 7958 $, $Date: 2007-08-09 12:00:18 +0200 (Do, 09 Aug 2007) $
064 *
065 */
066
067 public abstract class TerrainModel extends Shape3D {
068
069 private BufferedImage textureImage = null;
070
071 /**
072 * Creates a TerrainModel with a default Appearance set.
073 * <p>
074 * The default apearance of this terrain is defined as:
075 * <ul>
076 * <li> specularColor = new Color3f( 0.7f, 0.7f, 0.7f )</li>
077 * <li> ambientColor = white </li>
078 * <li> diffuseColor = white </li>
079 * <li> shininess = 75f </li>
080 * <li> lighting is enabled </li>
081 * <li> matieral is writable (Material.ALLOW_COMPONENT_WRITE) </li>
082 * </ul>
083 * </p>
084 */
085 protected TerrainModel() {
086 setCapability( Shape3D.ALLOW_GEOMETRY_WRITE );
087 setAppearance( createDefaultApperance() );
088 }
089
090 protected TerrainModel( BufferedImage textureImage ) {
091 this();
092 this.textureImage = textureImage;
093 }
094
095 /**
096 * This method implements all the necessary steps to generate a Shape3D Terrain (Elevation
097 * model). Before rendering this Class this method should therefor be called prior.
098 */
099 public abstract void createTerrain();
100
101 /**
102 * Creates a J3D Appearance for the surface
103 *
104 * @return a new Appearance object
105 */
106 private Appearance createDefaultApperance() {
107 Appearance appearance = new Appearance();
108
109 // create a material
110 Color3f specular = new Color3f( 0, 0, 0 );
111 Color3f white = new Color3f( 1, 1, 1 );
112 Material targetMaterial = new Material();
113 targetMaterial.setAmbientColor( white );
114 targetMaterial.setDiffuseColor( white );
115
116 targetMaterial.setSpecularColor( specular );
117 targetMaterial.setShininess( 65f );
118 targetMaterial.setLightingEnable( true );
119 targetMaterial.setCapability( Material.ALLOW_COMPONENT_WRITE );
120 targetMaterial.setCapability( Material.ALLOW_COMPONENT_READ );
121 // targetMaterial.setColorTarget( Material.AMBIENT_AND_DIFFUSE );
122 appearance.setMaterial( targetMaterial );
123
124 RenderingConfiguration rc = RenderingConfiguration.getInstance();
125
126 appearance.setColoringAttributes( rc.getColoringAttributes() );
127
128 appearance.setPolygonAttributes( rc.getTerrainPolygonAttributes() );
129
130 RenderingAttributes ra = new RenderingAttributes();
131 ra.setDepthBufferEnable(true);
132 appearance.setRenderingAttributes( ra );
133
134 return appearance;
135 }
136
137 /**
138 * @param textureImage
139 * An other texture value.
140 */
141 public void setTexture( BufferedImage textureImage ) {
142 if ( textureImage != null ) {
143 this.textureImage = textureImage;
144 Appearance appearance = getAppearance();
145
146 RenderingConfiguration rc = RenderingConfiguration.getInstance();
147
148 appearance.setTextureAttributes( rc.getTextureAttributes() );
149 appearance.setTexture( rc.getTexture( textureImage ) );
150
151 setAppearance( appearance );
152 }
153
154 }
155
156 /**
157 * @return the BufferedImage which can be used as a texture or <code>null</code>if no texture was
158 * defined.
159 */
160 public BufferedImage getTexture() {
161 return this.textureImage;
162 }
163
164 @Override
165 public String toString( ){
166 StringBuilder sb = new StringBuilder( 512 );
167 sb.append( "Elevationmodel as a J3D terrainModel: " );
168 if( textureImage != null ){
169 sb.append( " with textureImage and ");
170 }
171 sb.append( "Appearance: " ).append( getAppearance() ).append("\n" );
172 return sb.toString();
173 }
174
175 }