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