    001    //$HeadURL: https://svn.wald.intevation.org/svn/deegree/base/branches/2.4_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    }