001 //$HeadURL: svn+ssh://rbezema@svn.wald.intevation.org/deegree/base/branches/2.2_testing/src/org/deegree/ogcwebservices/wpvs/j3d/InteractiveWPVSRenderer.java $
002
003 /*---------------- FILE HEADER ------------------------------------------
004
005 This file is part of deegree.
006 Copyright (C) 2001-2008 by:
007 EXSE, Department of Geography, University of Bonn
008 http://www.giub.uni-bonn.de/deegree/
009 lat/lon GmbH
010 http://www.lat-lon.de
011
012 This library is free software; you can redistribute it and/or
013 modify it under the terms of the GNU Lesser General Public
014 License as published by the Free Software Foundation; either
015 version 2.1 of the License, or (at your option) any later version.
016
017 This library is distributed in the hope that it will be useful,
018 but WITHOUT ANY WARRANTY; without even the implied warranty of
019 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
020 Lesser General Public License for more details.
021
022 You should have received a copy of the GNU Lesser General Public
023 License along with this library; if not, write to the Free Software
024 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
025
026 Contact:
027
028 Andreas Poth
029 lat/lon GmbH
030 Aennchenstr. 19
031 53177 Bonn
032 Germany
033 E-Mail: poth@lat-lon.de
034
035 Prof. Dr. Klaus Greve
036 Department of Geography
037 University of Bonn
038 Meckenheimer Allee 166
039 53115 Bonn
040 Germany
041 E-Mail: greve@giub.uni-bonn.de
042
043
044 ---------------------------------------------------------------------------*/
045 package org.deegree.ogcwebservices.wpvs.j3d;
046
047 import java.awt.image.BufferedImage;
048 import java.awt.image.RenderedImage;
049
050 import javax.media.j3d.BoundingSphere;
051 import javax.media.j3d.BranchGroup;
052 import javax.media.j3d.Canvas3D;
053 import javax.media.j3d.Group;
054 import javax.media.j3d.ImageComponent;
055 import javax.media.j3d.ImageComponent2D;
056 import javax.media.j3d.Light;
057 import javax.media.j3d.Locale;
058 import javax.media.j3d.OrderedGroup;
059 import javax.media.j3d.View;
060 import javax.media.j3d.VirtualUniverse;
061 import javax.vecmath.Point3d;
062
063 import com.sun.j3d.utils.behaviors.mouse.MouseRotate;
064 import com.sun.j3d.utils.behaviors.mouse.MouseTranslate;
065 import com.sun.j3d.utils.behaviors.mouse.MouseZoom;
066
067
068 /**
069 * This class sill/shoud provide the ability to render a scence object (s.
070 * com.sun.j3d.loaders.Scene) or a Canvas3D. It's currently used for testing.
071 * @author <a href="mailto:poth@lat-lon.de">Andreas Poth</a>
072 * @version $Revision: 9345 $ $Date: 2007-12-27 17:22:25 +0100 (Do, 27 Dez 2007) $
073 */
074 public class InteractiveWPVSRenderer extends Abstract3DRenderingEngine {
075
076 private int width = 800;
077
078 private int height = 600;
079
080 private Canvas3D offScreenCanvas3D;
081
082 private View view;
083
084 private boolean newSize;
085
086 /**
087 * initialzies the render class with a default width and height (801x601)
088 * @param scene
089 */
090 public InteractiveWPVSRenderer(WPVSScene scene)
091 {
092 this( scene, 801, 601 );
093 }
094
095 /**
096 * initialzies the render class with the submitted width and height
097 * @param scene
098 * @param width
099 * @param height
100 */
101 public InteractiveWPVSRenderer(WPVSScene scene, int width, int height)
102 {
103 super( scene, 2 );
104 this.width = width;
105 this.height = height;
106 view = new View();
107 }
108
109 /**
110 * @param scene
111 */
112 public void setScene(WPVSScene scene) {
113 this.scene = scene;
114 }
115
116 /**Create the VirtualUniverse for the application.
117 * @return the VirtualUniverse for the application.
118 */
119 protected VirtualUniverse createVirtualUniverse() {
120 return new VirtualUniverse();
121 }
122
123 /**
124 * Simple utility method that creates a Locale for the
125 * VirtualUniverse
126 * @param u the universe
127 * @return the Locale
128 */
129 protected Locale createLocale( VirtualUniverse u ) {
130 return new Locale( u );
131 }
132
133 /**
134 * returns the width of the offscreen rendering target
135 * @return the width of the offscreen rendering target
136 */
137 public int getWidth() {
138 return width;
139 }
140
141 /**
142 * @param width the new width of the screen
143 */
144 public void setWidth( int width ) {
145 newSize = true;
146 this.width = width;
147 }
148
149 /**
150 * returns the height of the offscreen rendering target
151 * @return the height of the offscreen rendering target
152 */
153 public int getHeight() {
154 return height;
155 }
156
157 /**
158 * @param height the new Height of the screen
159 */
160 public void setHeight( int height ) {
161 newSize = true;
162 this.height = height;
163 }
164
165 /** renders the scene to an <code>BufferedImage</code>
166 * @return a <code>BufferedImage</code> where the scene has been rendered to
167 */
168 public Object renderScene( ) {
169 if ( newSize ) {
170 view.removeCanvas3D( offScreenCanvas3D );
171
172 offScreenCanvas3D = createOffscreenCanvas3D();
173
174 newSize = false;
175 }
176 view.addCanvas3D( offScreenCanvas3D );
177 view.startView();
178
179 // The viewGroup contains nodes necessary for rendering, viewing, etc
180 // View, ViewPlatform, Canvas3D, PhysBody, PhysEnviron, and Lights
181 BranchGroup viewGroup = new BranchGroup();
182
183 // The sceneGroup conatins obejcts of the scene graph
184 BranchGroup sceneGroup = new BranchGroup();
185
186 setView( view, viewGroup );
187 // createMouseBehaviours( viewGroup );
188
189 OrderedGroup terrainGroup = new OrderedGroup();
190
191 addBackground( scene.getViewPoint(), terrainGroup, scene.getBackground() );
192
193 // add the lights to the view
194 Light[] lights = scene.getLights();
195 for (int i = 0; i < lights.length; i++) {
196 viewGroup.addChild( lights[i] );
197 }
198 /*
199 // add the terrain to the view
200 Shape3D terrain[] = scene.getTerrain();
201 for (int i = terrain.length-1; i >= 0; i--) {
202 terrainGroup.addChild( terrain[i] );
203 }
204 sceneGroup.addChild( terrainGroup );
205
206 // add the features to the view
207 Group[] features = scene.getFeatures();
208 for (int i = 0; i < features.length; i++) {
209 sceneGroup.addChild( features[i] );
210 }
211 */
212 sceneGroup.compile();
213
214 viewGroup.compile();
215
216 VirtualUniverse universe = createVirtualUniverse();
217 Locale locale = createLocale( universe );
218
219 locale.addBranchGraph(sceneGroup);
220 locale.addBranchGraph(viewGroup);
221
222 //BranchGroup mainGroup = new BranchGroup();
223 // mainGroup.addChild( sceneGroup );
224 // mainGroup.addChild( viewGroup );
225 // mainGroup.addChild( bg[0] );
226
227 return offScreenCanvas3D;
228 }
229
230 /**
231 * creates and returns a canvas for offscreen rendering
232 * @return a canvas for rendering
233 */
234 protected Canvas3D createOffscreenCanvas3D()
235 {
236 Canvas3D offScreenCanvas3D = createCanvas( false );
237
238 // offScreenCanvas3D.getScreen3D().setSize( width, height );
239
240 offScreenCanvas3D.getScreen3D().setPhysicalScreenHeight( 0.0254/90 * height );
241 offScreenCanvas3D.getScreen3D().setPhysicalScreenWidth( 0.0254/90 * width );
242
243 BufferedImage renderedImage =
244 new BufferedImage( width, height, BufferedImage.TYPE_3BYTE_BGR );
245
246 ImageComponent2D imageComponent =
247 new ImageComponent2D( ImageComponent.FORMAT_RGB8, renderedImage );
248
249 imageComponent.setCapability( ImageComponent.ALLOW_IMAGE_READ );
250
251 // offScreenCanvas3D.setOffScreenBuffer( imageComponent );
252
253 return offScreenCanvas3D;
254 }
255
256 @SuppressWarnings("unused")
257 private void createMouseBehaviours( Group scene ){
258 Point3d origin = new Point3d(-2584400.880145242, 528.7904086212667, 5615449.9824785);
259 BoundingSphere bounds = new BoundingSphere(origin, 250000);
260 // TransformGroup viewTrans = vp.getViewPlatformTransform();
261
262 // Create the rotate behavior node
263 MouseRotate behavior1 = new MouseRotate(offScreenCanvas3D);
264 scene.addChild(behavior1);
265 behavior1.setSchedulingBounds(bounds);
266
267 // Create the zoom behavior node
268 MouseZoom behavior2 = new MouseZoom(offScreenCanvas3D);
269 scene.addChild(behavior2);
270 behavior2.setSchedulingBounds(bounds);
271
272 // Create the translate behavior node
273 MouseTranslate behavior3 = new MouseTranslate(offScreenCanvas3D);
274 scene.addChild(behavior3);
275 behavior3.setSchedulingBounds(bounds);
276 }
277
278 /**
279 * Called to render the scene into the offscreen Canvas3D
280 * @param offScreenCanvas3D the canvas to render into
281 * @return the Rendered Image
282 */
283 protected RenderedImage getImage(Canvas3D offScreenCanvas3D)
284 {
285 offScreenCanvas3D.renderOffScreenBuffer();
286 offScreenCanvas3D.waitForOffScreenRendering();
287
288 ImageComponent2D imageComponent = offScreenCanvas3D.getOffScreenBuffer();
289
290 return imageComponent.getImage();
291
292 }
293
294 }