Author: zzorn Date: 2007-06-30 16:05:22 -0700 (Sat, 30 Jun 2007) New Revision: 26105 Added: geotools/trunk/spike/zzorn/geotools-renderer3d/src/main/java/org/geotools/renderer3d/navigationgestures/ geotools/trunk/spike/zzorn/geotools-renderer3d/src/main/java/org/geotools/renderer3d/navigationgestures/AbstractNavigationGesture.java geotools/trunk/spike/zzorn/geotools-renderer3d/src/main/java/org/geotools/renderer3d/navigationgestures/CameraAccessor.java geotools/trunk/spike/zzorn/geotools-renderer3d/src/main/java/org/geotools/renderer3d/navigationgestures/NavigationGesture.java geotools/trunk/spike/zzorn/geotools-renderer3d/src/main/java/org/geotools/renderer3d/navigationgestures/PanGesture.java geotools/trunk/spike/zzorn/geotools-renderer3d/src/main/java/org/geotools/renderer3d/utils/canvas3d/ geotools/trunk/spike/zzorn/geotools-renderer3d/src/main/java/org/geotools/renderer3d/utils/canvas3d/Canvas3D.java geotools/trunk/spike/zzorn/geotools-renderer3d/src/main/java/org/geotools/renderer3d/utils/canvas3d/CanvasRenderer.java Removed: geotools/trunk/spike/zzorn/geotools-renderer3d/src/main/java/org/geotools/renderer3d/impl/AbstractNavigationGesture.java geotools/trunk/spike/zzorn/geotools-renderer3d/src/main/java/org/geotools/renderer3d/impl/CanvasRenderer.java geotools/trunk/spike/zzorn/geotools-renderer3d/src/main/java/org/geotools/renderer3d/impl/NavigationGesture.java geotools/trunk/spike/zzorn/geotools-renderer3d/src/main/java/org/geotools/renderer3d/impl/PanGesture.java Modified: geotools/trunk/spike/zzorn/geotools-renderer3d/src/main/java/org/geotools/renderer3d/Renderer3D.java geotools/trunk/spike/zzorn/geotools-renderer3d/src/main/java/org/geotools/renderer3d/impl/Renderer3DImpl.java Log: Refactored the 3D Canvas to its own class, simplifying the renderer class and making the 3D Canvas more reusable. Also moved things into packages a bit to clarify the directory structure. Modified: geotools/trunk/spike/zzorn/geotools-renderer3d/src/main/java/org/geotools/renderer3d/Renderer3D.java =================================================================== --- geotools/trunk/spike/zzorn/geotools-renderer3d/src/main/java/org/geotools/renderer3d/Renderer3D.java 2007-06-30 20:59:46 UTC (rev 26104) +++ geotools/trunk/spike/zzorn/geotools-renderer3d/src/main/java/org/geotools/renderer3d/Renderer3D.java 2007-06-30 23:05:22 UTC (rev 26105) @@ -2,7 +2,7 @@ import com.jme.scene.Spatial; import org.geotools.map.MapContext; -import org.geotools.renderer3d.impl.NavigationGesture; +import org.geotools.renderer3d.navigationgestures.NavigationGesture; import java.awt.Component; Deleted: geotools/trunk/spike/zzorn/geotools-renderer3d/src/main/java/org/geotools/renderer3d/impl/AbstractNavigationGesture.java =================================================================== --- geotools/trunk/spike/zzorn/geotools-renderer3d/src/main/java/org/geotools/renderer3d/impl/AbstractNavigationGesture.java 2007-06-30 20:59:46 UTC (rev 26104) +++ geotools/trunk/spike/zzorn/geotools-renderer3d/src/main/java/org/geotools/renderer3d/impl/AbstractNavigationGesture.java 2007-06-30 23:05:22 UTC (rev 26105) @@ -1,60 +0,0 @@ -package org.geotools.renderer3d.impl; - -import com.jme.renderer.Camera; - -import javax.swing.event.MouseInputAdapter; -import java.awt.event.MouseWheelEvent; - -/** - * Contains common functionality for navigationGestureListeners. - * - * @author Hans Hstr */ -public abstract class AbstractNavigationGesture - extends MouseInputAdapter - implements NavigationGesture -{ - - //====================================================================== - // Private Fields - - private CanvasRenderer myCanvasRenderer = null; - - //====================================================================== - // Public Methods - - //---------------------------------------------------------------------- - // MouseWheelListener Implementation - - public void mouseWheelMoved( final MouseWheelEvent e ) - { - // Override if needed - } - - //---------------------------------------------------------------------- - // NavigationGesture Implementation - - public void setCanvasRenderer( final CanvasRenderer canvasRenderer ) - { - myCanvasRenderer = canvasRenderer; - } - - //====================================================================== - // Protected Methods - - /** - * @return the camera that has been assigned to this navigation gesture listener, or null if no camera has yet been assigned. - */ - protected Camera getCamera() - { - if ( myCanvasRenderer != null ) - { - return myCanvasRenderer.getCamera(); - } - else - { - return null; - } - } - -} Deleted: geotools/trunk/spike/zzorn/geotools-renderer3d/src/main/java/org/geotools/renderer3d/impl/CanvasRenderer.java =================================================================== --- geotools/trunk/spike/zzorn/geotools-renderer3d/src/main/java/org/geotools/renderer3d/impl/CanvasRenderer.java 2007-06-30 20:59:46 UTC (rev 26104) +++ geotools/trunk/spike/zzorn/geotools-renderer3d/src/main/java/org/geotools/renderer3d/impl/CanvasRenderer.java 2007-06-30 23:05:22 UTC (rev 26105) @@ -1,152 +0,0 @@ -package org.geotools.renderer3d.impl; - -import com.jme.renderer.Camera; -import com.jme.renderer.Renderer; -import com.jme.scene.Spatial; -import com.jmex.awt.SimpleCanvasImpl; -import org.geotools.renderer3d.utils.ParameterChecker; - -import java.awt.Canvas; -import java.awt.event.ComponentAdapter; -import java.awt.event.ComponentEvent; - -/** - * A renderer that renders a 3D object in a 3D Canvas. - * - * @author Hans Hstr */ -public final class CanvasRenderer - extends SimpleCanvasImpl -{ - - //====================================================================== - // Private Fields - - private final Spatial myCanvasRootNode; - private final Canvas myCanvas; - - private long startTime = 0; - private long fps = 0; - - private boolean myAspectRatioNeedsCorrecting = true; - - //====================================================================== - // Private Constants - - private static final float DEFAULT_VIEWLD_OF_VIEW_DEGREES = 45; - - //====================================================================== - // Public Methods - - //---------------------------------------------------------------------- - // Constructors - - /** - * Creates a new renderer that renders the specified spatial in a 3D canvas. - * - * @param width initial size of the canvas. Should be larger than 0. - * @param height initial size of the canvas. Should be larger than 0. - * @param canvasRootNode the 3D object to render. Should not be null. - * @param canvas the canvas we are rendering to. Needed for listening to resize events. - */ - public CanvasRenderer( final int width, - final int height, - final Spatial canvasRootNode, - final Canvas canvas ) - { - super( width, height ); - - ParameterChecker.checkPositiveNonZeroInteger( width, "width" ); - ParameterChecker.checkPositiveNonZeroInteger( height, "height" ); - ParameterChecker.checkNotNull( canvasRootNode, "canvasRootNode" ); - ParameterChecker.checkNotNull( canvas, "canvas" ); - - myCanvasRootNode = canvasRootNode; - myCanvas = canvas; - - // When the component is resized, adjust the size of the 3D viewport too. - myCanvas.addComponentListener( new ComponentAdapter() - { - - public void componentResized( ComponentEvent ce ) - { - resizeCanvas( myCanvas.getWidth(), myCanvas.getHeight() ); - myAspectRatioNeedsCorrecting = true; - } - - } ); - } - - //---------------------------------------------------------------------- - // Other Public Methods - - @Override - public void simpleSetup() - { - rootNode.attachChild( myCanvasRootNode ); - } - - - public void simpleUpdate() - { - // Frames per second counter - // DEBUG: To be removed in production code - if ( startTime > System.currentTimeMillis() ) - { - fps++; - } - else - { - long timeUsed = 5000 + ( startTime - System.currentTimeMillis() ); - startTime = System.currentTimeMillis() + 5000; - System.out.println( fps + " frames in " + ( timeUsed / 1000f ) + " seconds = " - + ( fps / ( timeUsed / 1000f ) ) + " FPS (average)" ); - fps = 0; - } - } - - - public void simpleRender() - { - // Setup aspect ratio for camera on the first frame (the camera is not created before the rendering starts) - if ( myAspectRatioNeedsCorrecting ) - { - correctCameraAspectRatio(); - - myAspectRatioNeedsCorrecting = false; - } - } - - //====================================================================== - // Private Methods - - /** - * Sets the aspect ratio of the camera to the aspect ratio of the viewport size. - */ - private void correctCameraAspectRatio() - { - final Renderer renderer = getRenderer(); - - if ( renderer != null ) - { - // Get size on screen - final float height = renderer.getHeight(); - final float width = renderer.getWidth(); - - // Calculate aspect ratio - float aspectRatio = 1; - if ( height > 0 ) - { - aspectRatio = width / height; - } - - // Set aspect ratio and field of view to camera - final Camera camera = getCamera(); - camera.setFrustumPerspective( DEFAULT_VIEWLD_OF_VIEW_DEGREES, - aspectRatio, - camera.getFrustumNear(), - camera.getFrustumFar() ); - } - } - -} Deleted: geotools/trunk/spike/zzorn/geotools-renderer3d/src/main/java/org/geotools/renderer3d/impl/NavigationGesture.java =================================================================== --- geotools/trunk/spike/zzorn/geotools-renderer3d/src/main/java/org/geotools/renderer3d/impl/NavigationGesture.java 2007-06-30 20:59:46 UTC (rev 26104) +++ geotools/trunk/spike/zzorn/geotools-renderer3d/src/main/java/org/geotools/renderer3d/impl/NavigationGesture.java 2007-06-30 23:05:22 UTC (rev 26105) @@ -1,19 +0,0 @@ -package org.geotools.renderer3d.impl; - -import javax.swing.event.MouseInputListener; -import java.awt.event.MouseWheelListener; - -/** - * An interface for handling navigation gestures done to the 3D view. - * - * @author Hans Hstr */ -public interface NavigationGesture - extends MouseInputListener, MouseWheelListener -{ - /** - * @param canvasRenderer the 3D renderer used. - * Can be asked for the camera that the navigation gesture listener should modify when gestures happen. - */ - void setCanvasRenderer( CanvasRenderer canvasRenderer ); -} Deleted: geotools/trunk/spike/zzorn/geotools-renderer3d/src/main/java/org/geotools/renderer3d/impl/PanGesture.java =================================================================== --- geotools/trunk/spike/zzorn/geotools-renderer3d/src/main/java/org/geotools/renderer3d/impl/PanGesture.java 2007-06-30 20:59:46 UTC (rev 26104) +++ geotools/trunk/spike/zzorn/geotools-renderer3d/src/main/java/org/geotools/renderer3d/impl/PanGesture.java 2007-06-30 23:05:22 UTC (rev 26105) @@ -1,67 +0,0 @@ -package org.geotools.renderer3d.impl; - -import com.jme.math.Vector3f; -import com.jme.renderer.Camera; - -import java.awt.event.MouseEvent; - -/** - * Implements a panning gesture for the 3D renderer. - * - * @author Hans Hstr */ -public final class PanGesture - extends AbstractNavigationGesture -{ - - //====================================================================== - // Private Fields - - private int myOldX = 0; - private int myOldY = 0; - - //====================================================================== - // Private Constants - - private static final float SCALE = 0.1f; - - //====================================================================== - // Public Methods - - //---------------------------------------------------------------------- - // MouseListener Implementation - - public void mousePressed( final MouseEvent e ) - { - myOldX = e.getX(); - myOldY = e.getY(); - } - - //---------------------------------------------------------------------- - // MouseMotionListener Implementation - - - public void mouseDragged( final MouseEvent e ) - { - final Camera camera = getCamera(); - - if ( camera != null ) - { - final int currentX = e.getX(); - final int currentY = e.getY(); - - final float deltaX = ( currentX - myOldX ) * SCALE; - final float deltaY = ( currentY - myOldY ) * SCALE; - - final Vector3f newLocation = new Vector3f( camera.getLocation() ); - newLocation.x -= deltaX; - newLocation.y += deltaY; - - camera.setLocation( newLocation ); - - myOldX = currentX; - myOldY = currentY; - } - } - -} Modified: geotools/trunk/spike/zzorn/geotools-renderer3d/src/main/java/org/geotools/renderer3d/impl/Renderer3DImpl.java =================================================================== --- geotools/trunk/spike/zzorn/geotools-renderer3d/src/main/java/org/geotools/renderer3d/impl/Renderer3DImpl.java 2007-06-30 20:59:46 UTC (rev 26104) +++ geotools/trunk/spike/zzorn/geotools-renderer3d/src/main/java/org/geotools/renderer3d/impl/Renderer3DImpl.java 2007-06-30 23:05:22 UTC (rev 26105) @@ -2,19 +2,14 @@ import com.jme.scene.Node; import com.jme.scene.Spatial; -import com.jme.system.DisplaySystem; -import com.jmex.awt.JMECanvas; import org.geotools.map.MapContext; import org.geotools.renderer3d.Renderer3D; -import org.geotools.renderer3d.utils.ParameterChecker; +import org.geotools.renderer3d.navigationgestures.NavigationGesture; +import org.geotools.renderer3d.utils.canvas3d.Canvas3D; import org.geotools.renderer3d.utils.quadtree.QuadTree; import org.geotools.renderer3d.utils.quadtree.QuadTreeImpl; -import java.awt.Canvas; import java.awt.Component; -import java.awt.Dimension; -import java.util.HashSet; -import java.util.Set; /** * @author Hans Hstr@ -26,21 +21,17 @@ //====================================================================== // Private Fields + private final Canvas3D myCanvas3D = new Canvas3D(); + private MapContext myMapContext = null; private QuadTree myQuadTree; - private Component myView3D = null; private Node myTerrainNode = null; - private Set<NavigationGesture> myNavigationGestures = new HashSet<NavigationGesture>(); - private Canvas myCanvas = null; - private CanvasRenderer myCanvasRenderer = null; //====================================================================== // Private Constants private static final int DEFAULT_START_RADIUS_M = 10; private static final TerrainBlockFactory TERRAIN_BLOCK_FACTORY = new TerrainBlockFactory(); - private static final int DEFAULT_WIDTH = 800; - private static final int DEFAULT_HEIGHT = 600; //====================================================================== // Public Methods @@ -90,9 +81,6 @@ { myQuadTree = new QuadTreeImpl( startRadius_m, TERRAIN_BLOCK_FACTORY ); myMapContext = mapContextToRender; - - // Add default navigation gestures - addNavigationGesture( new PanGesture() ); } //---------------------------------------------------------------------- @@ -118,63 +106,51 @@ public Component get3DView() { - if ( myView3D == null ) - { - myView3D = createView3D(); - } + initializeTerrainNodeIfNeeded(); - return myView3D; + return myCanvas3D.get3DView(); } public Spatial get3DNode() { - if ( myTerrainNode == null ) - { - myTerrainNode = createTerrainNode(); - } + initializeTerrainNodeIfNeeded(); return myTerrainNode; } - public void addNavigationGesture( NavigationGesture addedNavigationGesture ) + public void addNavigationGesture( final NavigationGesture addedNavigationGesture ) { - ParameterChecker.checkNotNull( addedNavigationGesture, "addedNavigationGesture" ); - ParameterChecker.checkNotAlreadyContained( addedNavigationGesture, - myNavigationGestures, - "myNavigationGestures" ); - - myNavigationGestures.add( addedNavigationGesture ); - - registerNavigationGestureListener( addedNavigationGesture ); + myCanvas3D.addNavigationGesture( addedNavigationGesture ); } - public void removeNavigationGesture( NavigationGesture removedNavigationGesture ) + public void removeNavigationGesture( final NavigationGesture removedNavigationGesture ) { - ParameterChecker.checkNotNull( removedNavigationGesture, "removedNavigationGesture" ); - ParameterChecker.checkContained( removedNavigationGesture, - myNavigationGestures, - "myNavigationGestures" ); - - myNavigationGestures.remove( removedNavigationGesture ); - - unRegisterNavigationGestureListener( removedNavigationGesture ); + myCanvas3D.removeNavigationGesture( removedNavigationGesture ); } public void removeAllNavigationGestures() { - myNavigationGestures.clear(); + myCanvas3D.removeAllNavigationGestures(); + } - for ( NavigationGesture navigationGesture : myNavigationGestures ) + //====================================================================== + // Private Methods + + private void initializeTerrainNodeIfNeeded() + { + if ( myTerrainNode == null ) { - unRegisterNavigationGestureListener( navigationGesture ); + myTerrainNode = createTerrainNode(); + + myCanvas3D.set3DNode( myTerrainNode ); } } - //====================================================================== +//====================================================================== // Private Methods private Node createTerrainNode() @@ -187,105 +163,4 @@ return node; } - - private Component createView3D() - { - final int width = DEFAULT_WIDTH; - final int height = DEFAULT_HEIGHT; - - // REFACTOR: Package the whole 3D canvas into one class, with a awt canvas as output, - // and a Spatial node and gesture listeners as input. Then this class can concentrate on the map integration. - - // Create the 3D canvas - myCanvas = DisplaySystem.getDisplaySystem( "lwjgl" ).createCanvas( width, height ); - myCanvas.setMinimumSize( new Dimension( 0, 0 ) ); // Make sure it is shrinkable - final JMECanvas jmeCanvas = ( (JMECanvas) myCanvas ); - - // Set the renderer that renders the canvas contents - myCanvasRenderer = new CanvasRenderer( width, height, get3DNode(), myCanvas ); - jmeCanvas.setImplementor( myCanvasRenderer ); - - // Add navigation gesture listeners to the created 3D canvas - for ( NavigationGesture navigationGesture : myNavigationGestures ) - { - registerNavigationGestureListener( navigationGesture ); - } - - // We need to repaint the component to see the updates, so we create a repaint calling thread - final Thread repaintThread = new Thread( new Repainter( myCanvas ) ); - repaintThread.setDaemon( true ); // Do not keep the JVM alive if only the repaint thread is left running - repaintThread.start(); - - return myCanvas; - } - - - private void registerNavigationGestureListener( final NavigationGesture navigationGesture ) - { - if ( myCanvas != null ) - { - myCanvas.addMouseMotionListener( navigationGesture ); - myCanvas.addMouseListener( navigationGesture ); - myCanvas.addMouseWheelListener( navigationGesture ); - navigationGesture.setCanvasRenderer( myCanvasRenderer ); - } - } - - - private void unRegisterNavigationGestureListener( final NavigationGesture navigationGesture ) - { - if ( myCanvas != null ) - { - myCanvas.removeMouseMotionListener( navigationGesture ); - myCanvas.removeMouseListener( navigationGesture ); - myCanvas.removeMouseWheelListener( navigationGesture ); - navigationGesture.setCanvasRenderer( null ); - } - } - - //====================================================================== - // Inner Classes - - private static final class Repainter - implements Runnable - { - - //====================================================================== - // Private Fields - - private final Canvas myCanvas; - - //====================================================================== - // Public Methods - - //---------------------------------------------------------------------- - // Constructors - - public Repainter( final Canvas canvas ) - { - myCanvas = canvas; - } - - //---------------------------------------------------------------------- - // Runnable Implementation - - public void run() - { - while ( true ) - { - myCanvas.repaint(); - - try - { - Thread.sleep( 10 ); - } - catch ( InterruptedException e ) - { - // Ignore - } - } - } - - } - } Copied: geotools/trunk/spike/zzorn/geotools-renderer3d/src/main/java/org/geotools/renderer3d/navigationgestures/AbstractNavigationGesture.java (from rev 26101, geotools/trunk/spike/zzorn/geotools-renderer3d/src/main/java/org/geotools/renderer3d/impl/AbstractNavigationGesture.java) =================================================================== --- geotools/trunk/spike/zzorn/geotools-renderer3d/src/main/java/org/geotools/renderer3d/impl/AbstractNavigationGesture.java 2007-06-30 13:06:06 UTC (rev 26101) +++ geotools/trunk/spike/zzorn/geotools-renderer3d/src/main/java/org/geotools/renderer3d/navigationgestures/AbstractNavigationGesture.java 2007-06-30 23:05:22 UTC (rev 26105) @@ -0,0 +1,61 @@ +package org.geotools.renderer3d.navigationgestures; + +import com.jme.renderer.Camera; + +import javax.swing.event.MouseInputAdapter; +import java.awt.event.MouseWheelEvent; + + +/** + * Contains common functionality for navigationGestureListeners. + * + * @author Hans Hstr */ +public abstract class AbstractNavigationGesture + extends MouseInputAdapter + implements NavigationGesture +{ + + //====================================================================== + // Private Fields + + private CameraAccessor myCameraAccessor = null; + + //====================================================================== + // Public Methods + + //---------------------------------------------------------------------- + // MouseWheelListener Implementation + + public void mouseWheelMoved( final MouseWheelEvent e ) + { + // Override if needed + } + + //---------------------------------------------------------------------- + // NavigationGesture Implementation + + public final void setCameraAccessor( final CameraAccessor cameraAccessor ) + { + myCameraAccessor = cameraAccessor; + } + + //====================================================================== + // Protected Methods + + /** + * @return the camera that has been assigned to this navigation gesture listener, or null if no camera has yet been assigned. + */ + protected Camera getCamera() + { + if ( myCameraAccessor != null ) + { + return myCameraAccessor.getCamera(); + } + else + { + return null; + } + } + +} Property changes on: geotools/trunk/spike/zzorn/geotools-renderer3d/src/main/java/org/geotools/renderer3d/navigationgestures/AbstractNavigationGesture.java ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:keywords + Id Name: svn:eol-style + native Added: geotools/trunk/spike/zzorn/geotools-renderer3d/src/main/java/org/geotools/renderer3d/navigationgestures/CameraAccessor.java =================================================================== --- geotools/trunk/spike/zzorn/geotools-renderer3d/src/main/java/org/geotools/renderer3d/navigationgestures/CameraAccessor.java 2007-06-30 20:59:46 UTC (rev 26104) +++ geotools/trunk/spike/zzorn/geotools-renderer3d/src/main/java/org/geotools/renderer3d/navigationgestures/CameraAccessor.java 2007-06-30 23:05:22 UTC (rev 26105) @@ -0,0 +1,16 @@ +package org.geotools.renderer3d.navigationgestures; + +import com.jme.renderer.Camera; + +/** + * An interface that allows accessing the camera for a 3D view. + * + * @author Hans Hstr */ +public interface CameraAccessor +{ + /** + * @return the camera for a 3D view. Can be modified by calling camera modifying methods. + */ + Camera getCamera(); +} Property changes on: geotools/trunk/spike/zzorn/geotools-renderer3d/src/main/java/org/geotools/renderer3d/navigationgestures/CameraAccessor.java ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:keywords + Id Name: svn:eol-style + native Copied: geotools/trunk/spike/zzorn/geotools-renderer3d/src/main/java/org/geotools/renderer3d/navigationgestures/NavigationGesture.java (from rev 26101, geotools/trunk/spike/zzorn/geotools-renderer3d/src/main/java/org/geotools/renderer3d/impl/NavigationGesture.java) =================================================================== --- geotools/trunk/spike/zzorn/geotools-renderer3d/src/main/java/org/geotools/renderer3d/impl/NavigationGesture.java 2007-06-30 13:06:06 UTC (rev 26101) +++ geotools/trunk/spike/zzorn/geotools-renderer3d/src/main/java/org/geotools/renderer3d/navigationgestures/NavigationGesture.java 2007-06-30 23:05:22 UTC (rev 26105) @@ -0,0 +1,19 @@ +package org.geotools.renderer3d.navigationgestures; + + +import javax.swing.event.MouseInputListener; +import java.awt.event.MouseWheelListener; + +/** + * An interface for handling navigation gestures done to the 3D view. + * + * @author Hans Hstr */ +public interface NavigationGesture + extends MouseInputListener, MouseWheelListener +{ + /** + * @param cameraAccessor Can be asked for the camera that the navigation gesture listener should modify when gestures happen. + */ + void setCameraAccessor( CameraAccessor cameraAccessor ); +} Property changes on: geotools/trunk/spike/zzorn/geotools-renderer3d/src/main/java/org/geotools/renderer3d/navigationgestures/NavigationGesture.java ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:keywords + Id Name: svn:eol-style + native Copied: geotools/trunk/spike/zzorn/geotools-renderer3d/src/main/java/org/geotools/renderer3d/navigationgestures/PanGesture.java (from rev 26101, geotools/trunk/spike/zzorn/geotools-renderer3d/src/main/java/org/geotools/renderer3d/impl/PanGesture.java) =================================================================== --- geotools/trunk/spike/zzorn/geotools-renderer3d/src/main/java/org/geotools/renderer3d/impl/PanGesture.java 2007-06-30 13:06:06 UTC (rev 26101) +++ geotools/trunk/spike/zzorn/geotools-renderer3d/src/main/java/org/geotools/renderer3d/navigationgestures/PanGesture.java 2007-06-30 23:05:22 UTC (rev 26105) @@ -0,0 +1,67 @@ +package org.geotools.renderer3d.navigationgestures; + +import com.jme.math.Vector3f; +import com.jme.renderer.Camera; + +import java.awt.event.MouseEvent; + +/** + * Implements a panning gesture for the 3D renderer. + * + * @author Hans Hstr */ +public final class PanGesture + extends AbstractNavigationGesture +{ + + //====================================================================== + // Private Fields + + private int myOldX = 0; + private int myOldY = 0; + + //====================================================================== + // Private Constants + + private static final float SCALE = 0.1f; + + //====================================================================== + // Public Methods + + //---------------------------------------------------------------------- + // MouseListener Implementation + + public void mousePressed( final MouseEvent e ) + { + myOldX = e.getX(); + myOldY = e.getY(); + } + + //---------------------------------------------------------------------- + // MouseMotionListener Implementation + + + public void mouseDragged( final MouseEvent e ) + { + final Camera camera = getCamera(); + + if ( camera != null ) + { + final int currentX = e.getX(); + final int currentY = e.getY(); + + final float deltaX = ( currentX - myOldX ) * SCALE; + final float deltaY = ( currentY - myOldY ) * SCALE; + + final Vector3f newLocation = new Vector3f( camera.getLocation() ); + newLocation.x -= deltaX; + newLocation.y += deltaY; + + camera.setLocation( newLocation ); + + myOldX = currentX; + myOldY = currentY; + } + } + +} Property changes on: geotools/trunk/spike/zzorn/geotools-renderer3d/src/main/java/org/geotools/renderer3d/navigationgestures/PanGesture.java ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:keywords + Id Name: svn:eol-style + native Added: geotools/trunk/spike/zzorn/geotools-renderer3d/src/main/java/org/geotools/renderer3d/utils/canvas3d/Canvas3D.java =================================================================== --- geotools/trunk/spike/zzorn/geotools-renderer3d/src/main/java/org/geotools/renderer3d/utils/canvas3d/Canvas3D.java 2007-06-30 20:59:46 UTC (rev 26104) +++ geotools/trunk/spike/zzorn/geotools-renderer3d/src/main/java/org/geotools/renderer3d/utils/canvas3d/Canvas3D.java 2007-06-30 23:05:22 UTC (rev 26105) @@ -0,0 +1,241 @@ +package org.geotools.renderer3d.utils.canvas3d; + +import com.jme.renderer.Camera; +import com.jme.scene.Spatial; +import com.jme.system.DisplaySystem; +import com.jmex.awt.JMECanvas; +import org.geotools.renderer3d.navigationgestures.CameraAccessor; +import org.geotools.renderer3d.navigationgestures.NavigationGesture; +import org.geotools.renderer3d.navigationgestures.PanGesture; +import org.geotools.renderer3d.utils.ParameterChecker; + +import java.awt.Canvas; +import java.awt.Component; +import java.awt.Dimension; +import java.util.HashSet; +import java.util.Set; + +/** + * A 3D Canvas, showing a 3D object in an AWT Canvas component. + * <p/> + * Allows registering Gestures, that can be used to navigate the 3D view (already has default gestures registered). + * + * @author Hans Hstr */ +public final class Canvas3D +{ + + //====================================================================== + // Private Fields + + private final Set<NavigationGesture> myNavigationGestures = new HashSet<NavigationGesture>(); + private final CameraAccessor myCameraAccessor = new CameraAccessor() + { + + public Camera getCamera() + { + if ( myCanvasRenderer != null ) + { + return myCanvasRenderer.getCamera(); + } + else + { + return null; + } + } + + }; + + private Spatial my3DNode = null; + private Component myView3D = null; + private Canvas myCanvas = null; + private CanvasRenderer myCanvasRenderer = null; + + //====================================================================== + // Private Constants + + private static final int DEFAULT_WIDTH = 800; + private static final int DEFAULT_HEIGHT = 600; + + //====================================================================== + // Public Methods + + //---------------------------------------------------------------------- + // Constructors + + public Canvas3D() + { + this( null ); + } + + + public Canvas3D( final Spatial a3dNode ) + { + my3DNode = a3dNode; + + // Add default navigation gestures + addNavigationGesture( new PanGesture() ); + } + + //---------------------------------------------------------------------- + // Other Public Methods + + public void set3DNode( final Spatial a3dNode ) + { + my3DNode = a3dNode; + + if ( myCanvasRenderer != null ) + { + myCanvasRenderer.setCanvasRootNode( a3dNode ); + } + } + + + public Component get3DView() + { + if ( myView3D == null ) + { + myView3D = createView3D(); + } + + return myView3D; + } + + + public void addNavigationGesture( NavigationGesture addedNavigationGesture ) + { + ParameterChecker.checkNotNull( addedNavigationGesture, "addedNavigationGesture" ); + ParameterChecker.checkNotAlreadyContained( addedNavigationGesture, + myNavigationGestures, + "myNavigationGestures" ); + + myNavigationGestures.add( addedNavigationGesture ); + + registerNavigationGestureListener( addedNavigationGesture ); + } + + + public void removeNavigationGesture( NavigationGesture removedNavigationGesture ) + { + ParameterChecker.checkNotNull( removedNavigationGesture, "removedNavigationGesture" ); + ParameterChecker.checkContained( removedNavigationGesture, + myNavigationGestures, + "myNavigationGestures" ); + + myNavigationGestures.remove( removedNavigationGesture ); + + unRegisterNavigationGestureListener( removedNavigationGesture ); + } + + + public void removeAllNavigationGestures() + { + myNavigationGestures.clear(); + + for ( NavigationGesture navigationGesture : myNavigationGestures ) + { + unRegisterNavigationGestureListener( navigationGesture ); + } + } + + //====================================================================== + // Private Methods + + private void registerNavigationGestureListener( final NavigationGesture navigationGesture ) + { + if ( myCanvas != null ) + { + myCanvas.addMouseMotionListener( navigationGesture ); + myCanvas.addMouseListener( navigationGesture ); + myCanvas.addMouseWheelListener( navigationGesture ); + navigationGesture.setCameraAccessor( myCameraAccessor ); + } + } + + + private void unRegisterNavigationGestureListener( final NavigationGesture navigationGesture ) + { + if ( myCanvas != null ) + { + myCanvas.removeMouseMotionListener( navigationGesture ); + myCanvas.removeMouseListener( navigationGesture ); + myCanvas.removeMouseWheelListener( navigationGesture ); + navigationGesture.setCameraAccessor( null ); + } + } + + + private Component createView3D() + { + final int width = DEFAULT_WIDTH; + final int height = DEFAULT_HEIGHT; + + // Create the 3D canvas + myCanvas = DisplaySystem.getDisplaySystem( "lwjgl" ).createCanvas( width, height ); + myCanvas.setMinimumSize( new Dimension( 0, 0 ) ); // Make sure it is shrinkable + final JMECanvas jmeCanvas = ( (JMECanvas) myCanvas ); + + // Set the renderer that renders the canvas contents + myCanvasRenderer = new CanvasRenderer( width, height, my3DNode, myCanvas ); + jmeCanvas.setImplementor( myCanvasRenderer ); + + // Add navigation gesture listeners to the created 3D canvas + for ( NavigationGesture navigationGesture : myNavigationGestures ) + { + registerNavigationGestureListener( navigationGesture ); + } + + // We need to repaint the component to see the updates, so we create a repaint calling thread + final Thread repaintThread = new Thread( new Repainter( myCanvas ) ); + repaintThread.setDaemon( true ); // Do not keep the JVM alive if only the repaint thread is left running + repaintThread.start(); + + return myCanvas; + } + + //====================================================================== + // Inner Classes + + private static final class Repainter + implements Runnable + { + + //====================================================================== + // Private Fields + + private final Canvas myCanvas; + + //====================================================================== + // Public Methods + + //---------------------------------------------------------------------- + // Constructors + + public Repainter( final Canvas canvas ) + { + myCanvas = canvas; + } + + //---------------------------------------------------------------------- + // Runnable Implementation + + public void run() + { + while ( true ) + { + myCanvas.repaint(); + + try + { + Thread.sleep( 10 ); + } + catch ( InterruptedException e ) + { + // Ignore + } + } + } + + } + +} Property changes on: geotools/trunk/spike/zzorn/geotools-renderer3d/src/main/java/org/geotools/renderer3d/utils/canvas3d/Canvas3D.java ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:keywords + Id Name: svn:eol-style + native Copied: geotools/trunk/spike/zzorn/geotools-renderer3d/src/main/java/org/geotools/renderer3d/utils/canvas3d/CanvasRenderer.java (from rev 26101, geotools/trunk/spike/zzorn/geotools-renderer3d/src/main/java/org/geotools/renderer3d/impl/CanvasRenderer.java) =================================================================== --- geotools/trunk/spike/zzorn/geotools-renderer3d/src/main/java/org/geotools/renderer3d/impl/CanvasRenderer.java 2007-06-30 13:06:06 UTC (rev 26101) +++ geotools/trunk/spike/zzorn/geotools-renderer3d/src/main/java/org/geotools/renderer3d/utils/canvas3d/CanvasRenderer.java 2007-06-30 23:05:22 UTC (rev 26105) @@ -0,0 +1,179 @@ +package org.geotools.renderer3d.utils.canvas3d; + +import com.jme.renderer.Camera; +import com.jme.renderer.Renderer; +import com.jme.scene.Spatial; +import com.jmex.awt.SimpleCanvasImpl; +import org.geotools.renderer3d.utils.ParameterChecker; + +import java.awt.Canvas; +import java.awt.event.ComponentAdapter; +import java.awt.event.ComponentEvent; + +/** + * A renderer that renders a 3D object in a 3D Canvas. + * <p/> + * REFACTOR: Change to an inner class of Canvas3D? + * + * @author Hans Hstr */ +final class CanvasRenderer + extends SimpleCanvasImpl +{ + + //====================================================================== + // Private Fields + + private final Canvas myCanvas; + + private Spatial myCanvasRootNode; + + private long startTime = 0; + private long fps = 0; + + private boolean myAspectRatioNeedsCorrecting = true; + + //====================================================================== + // Private Constants + + private static final float DEFAULT_VIEWLD_OF_VIEW_DEGREES = 45; + + //====================================================================== + // Public Methods + + //---------------------------------------------------------------------- + // Constructors + + /** + * Creates a new renderer that renders the specified spatial in a 3D canvas. + * + * @param width initial size of the canvas. Should be larger than 0. + * @param height initial size of the canvas. Should be larger than 0. + * @param canvasRootNode the 3D object to render. + * May be null, in which case nothing is rendered (black area) + * @param canvas the canvas we are rendering to. Needed for listening to resize events. + */ + public CanvasRenderer( final int width, + final int height, + final Spatial canvasRootNode, + final Canvas canvas ) + { + super( width, height ); + + ParameterChecker.checkPositiveNonZeroInteger( width, "width" ); + ParameterChecker.checkPositiveNonZeroInteger( height, "height" ); + ParameterChecker.checkNotNull( canvas, "canvas" ); + + myCanvasRootNode = canvasRootNode; + myCanvas = canvas; + + // When the component is resized, adjust the size of the 3D viewport too. + myCanvas.addComponentListener( new ComponentAdapter() + { + + public void componentResized( ComponentEvent ce ) + { + resizeCanvas( myCanvas.getWidth(), myCanvas.getHeight() ); + myAspectRatioNeedsCorrecting = true; + } + + } ); + } + + //---------------------------------------------------------------------- + // Other Public Methods + + /** + * @param canvasRootNode the spatial to render with this CanvasRenderer. + * May be null, in which case nothing is rendered (black area) + */ + public void setCanvasRootNode( final Spatial canvasRootNode ) + { + if ( rootNode != null && myCanvasRootNode != null ) + { + rootNode.detachChild( myCanvasRootNode ); + } + + myCanvasRootNode = canvasRootNode; + + if ( rootNode != null && myCanvasRootNode != null ) + { + rootNode.attachChild( myCanvasRootNode ); + } + } + + + @Override + public void simpleSetup() + { + if ( myCanvasRootNode != null ) + { + rootNode.attachChild( myCanvasRootNode ); + } + } + + + @Override + public void simpleUpdate() + { + // Frames per second counter + // DEBUG: To be removed in production code + if ( startTime > System.currentTimeMillis() ) + { + fps++; + } + else + { + long timeUsed = 5000 + ( startTime - System.currentTimeMillis() ); + startTime = System.currentTimeMillis() + 5000; + System.out.println( fps + " frames in " + ( timeUsed / 1000f ) + " seconds = " + + ( fps / ( timeUsed / 1000f ) ) + " FPS (average)" ); + fps = 0; + } + } + + + public void simpleRender() + { + // Setup aspect ratio for camera on the first frame (the camera is not created before the rendering starts) + if ( myAspectRatioNeedsCorrecting ) + { + correctCameraAspectRatio(); + + myAspectRatioNeedsCorrecting = false; + } + } + + //====================================================================== + // Private Methods + + /** + * Sets the aspect ratio of the camera to the aspect ratio of the viewport size. + */ + private void correctCameraAspectRatio() + { + final Renderer renderer = getRenderer(); + + if ( renderer != null ) + { + // Get size on screen + final float height = renderer.getHeight(); + final float width = renderer.getWidth(); + + // Calculate aspect ratio + float aspectRatio = 1; + if ( height > 0 ) + { + aspectRatio = width / height; + } + + // Set aspect ratio and field of view to camera + final Camera camera = getCamera(); + camera.setFrustumPerspective( DEFAULT_VIEWLD_OF_VIEW_DEGREES, + aspectRatio, + camera.getFrustumNear(), + camera.getFrustumFar() ); + } + } + +} Property changes on: geotools/trunk/spike/zzorn/geotools-renderer3d/src/main/java/org/geotools/renderer3d/utils/canvas3d/CanvasRenderer.java ___________________________________________________________________ Name: svn:mime-type + text/plain Name: svn:keywords + Id Name: svn:eol-style + native |