2 Copyright (C) 2001, 2006 United States Government
3 as represented by the Administrator of the
4 National Aeronautics and Space Administration.
7 package gov
.nasa
.worldwind
;
9 import gov
.nasa
.worldwind
.geom
.*;
11 import javax
.media
.opengl
.*;
12 import javax
.swing
.event
.*;
17 * A non-platform specific {@link WorldWindow} class. This class can be aggregated into platform-specific classes to
18 * provide the core functionality of World Wind.
21 * @version $Id: WorldWindowGLAutoDrawable.java 2150 2007-06-26 07:40:58Z tgaskins $
23 public class WorldWindowGLAutoDrawable
extends WorldWindowImpl
implements GLEventListener
25 private final GLAutoDrawable drawable
;
26 private final EventListenerList eventListeners
= new EventListenerList();
29 * Construct a new <code>WorldWindowGLCanvase</code> for a specified {@link GLDrawable}.
31 * @param drawable the drawable associated with the window.
32 * @throws IllegalArgumentException if <code>drawable</code> is <code>null</code>.
34 public WorldWindowGLAutoDrawable(GLAutoDrawable drawable
)
38 String message
= WorldWind
.retrieveErrMsg("WorldWindowGLCanvas.GLAutoDrawableNullToConstructor");
39 WorldWind
.logger().log(java
.util
.logging
.Level
.FINE
, message
);
40 throw new IllegalArgumentException(message
);
43 this.drawable
= drawable
;
44 this.drawable
.setAutoSwapBufferMode(false); // to prevent buffer swapping after a pick traversal
45 drawable
.addGLEventListener(this);
47 SceneController sc
= this.getSceneController();
50 sc
.addPropertyChangeListener(this);
55 public void propertyChange(PropertyChangeEvent propertyChangeEvent
)
57 if (propertyChangeEvent
== null)
59 String msg
= WorldWind
.retrieveErrMsg("nullValue.PropertyChangeEventIsNull");
60 WorldWind
.logger().log(java
.util
.logging
.Level
.FINE
, msg
);
61 throw new IllegalArgumentException(msg
);
63 this.drawable
.repaint(); // Queue a JOGL repaint request.
67 * See {@link GLEventListener#init(GLAutoDrawable)}.
69 * @param glAutoDrawable the drawable
71 public void init(GLAutoDrawable glAutoDrawable
)
73 // This GLEventListener callback method is not used.
74 // this.drawable.setGL(new DebugGL(this.drawable.getGL()));
78 * See {@link GLEventListener#display(GLAutoDrawable)}.
80 * @param glAutoDrawable the drawable
81 * @throws IllegalStateException if no {@link SceneController} exists for this canvas
83 public void display(GLAutoDrawable glAutoDrawable
)
87 SceneController sc
= this.getSceneController();
90 String message
= WorldWind
.retrieveErrMsg("WorldWindowGLCanvas.ScnCntrllerNullOnRepaint");
91 WorldWind
.logger().log(java
.util
.logging
.Level
.FINE
, message
);
92 throw new IllegalStateException(message
);
95 Position positionAtStart
= this.getCurrentPosition();
96 PickedObject selectionAtStart
= this.getCurrentSelection();
100 this.callRenderingListeners(new RenderingEvent(this.drawable
, RenderingEvent
.BEFORE_RENDERING
));
104 WorldWind
.logger().log(java
.util
.logging
.Level
.FINE
, WorldWind
.retrieveErrMsg(
105 "WorldWindowGLAutoDrawable.ExceptionDuringGLEventListenerDisplay"), e
);
111 this.callRenderingListeners(new RenderingEvent(this.drawable
, RenderingEvent
.BEFORE_BUFFER_SWAP
));
115 WorldWind
.logger().log(java
.util
.logging
.Level
.FINE
, WorldWind
.retrieveErrMsg(
116 "WorldWindowGLAutoDrawable.ExceptionDuringGLEventListenerDisplay"), e
);
119 this.drawable
.swapBuffers();
121 Double frameTime
= this.sceneController
.getFrameTime();
122 if (frameTime
!= null)
123 this.setValue(AVKey
.FRAME_TIME
, frameTime
);
125 Double frameRate
= this.sceneController
.getFramesPerSecond();
126 if (frameTime
!= null)
127 this.setValue(AVKey
.FRAME_RATE
, frameRate
);
129 this.callRenderingListeners(new RenderingEvent(this.drawable
, RenderingEvent
.AFTER_BUFFER_SWAP
));
131 Position positionAtEnd
= this.getCurrentPosition();
132 if (positionAtStart
== null || positionAtEnd
== null)
134 if (positionAtStart
!= positionAtEnd
)
135 this.callPositionListeners(new PositionEvent(this.drawable
, this.sceneController
.getPickPoint(),
136 positionAtStart
, positionAtEnd
));
138 else if (!positionAtEnd
.equals(positionAtStart
))
140 this.callPositionListeners(new PositionEvent(this.drawable
, this.sceneController
.getPickPoint(),
141 positionAtStart
, positionAtEnd
));
144 PickedObject selectionAtEnd
= this.getCurrentSelection();
145 if (selectionAtStart
== null || selectionAtEnd
== null)
147 if (selectionAtStart
!= selectionAtEnd
)
148 this.callSelectListeners(new SelectEvent(this.drawable
, SelectEvent
.ROLLOVER
,
149 this.sceneController
.getPickPoint(), this.sceneController
.getPickedObjectList()));
151 else if (!selectionAtEnd
.equals(selectionAtStart
))
153 this.callSelectListeners(new SelectEvent(this.drawable
, SelectEvent
.ROLLOVER
,
154 this.sceneController
.getPickPoint(), this.sceneController
.getPickedObjectList()));
159 WorldWind
.logger().log(java
.util
.logging
.Level
.FINE
, WorldWind
.retrieveErrMsg(
160 "WorldWindowGLCanvas.ExceptionAttemptingRepaintWorldWindow"), e
);
165 * See {@link GLEventListener#reshape(GLAutoDrawable,int,int,int,int)}.
167 * @param glAutoDrawable the drawable
169 public void reshape(GLAutoDrawable glAutoDrawable
, int x
, int y
, int w
, int h
)
174 * See {@link GLEventListener#displayChanged(GLAutoDrawable,boolean,boolean)}.
176 * @param glAutoDrawable the drawable
178 public void displayChanged(GLAutoDrawable glAutoDrawable
, boolean b
, boolean b1
)
180 WorldWind
.logger().log(java
.util
.logging
.Level
.FINEST
, WorldWind
.retrieveErrMsg(
181 "WorldWindowGLCanvas.DisplayEventListenersDisplayChangedMethodCalled"));
184 public void displayNow()
186 this.drawable
.display();
189 public Position
getCurrentPosition()
191 if (this.sceneController
== null)
194 PickedObjectList pol
= this.getSceneController().getPickedObjectList();
195 if (pol
== null || pol
.size() < 1)
199 PickedObject top
= pol
.getTopPickedObject();
200 if (top
!= null && top
.hasPosition())
201 p
= top
.getPosition();
202 else if (pol
.getTerrainObject() != null)
203 p
= pol
.getTerrainObject().getPosition();
208 private PickedObject
getCurrentSelection()
210 if (this.sceneController
== null)
213 PickedObjectList pol
= this.getSceneController().getPickedObjectList();
214 if (pol
== null || pol
.size() < 1)
217 PickedObject top
= pol
.getTopPickedObject();
218 return top
.isTerrain() ?
null : top
;
221 public void addRenderingListener(RenderingListener listener
)
223 this.eventListeners
.add(RenderingListener
.class, listener
);
226 public void removeRenderingListener(RenderingListener listener
)
228 this.eventListeners
.remove(RenderingListener
.class, listener
);
231 private void callRenderingListeners(RenderingEvent event
)
233 for (RenderingListener listener
: this.eventListeners
.getListeners(RenderingListener
.class))
235 listener
.stageChanged(event
);
239 public void addPositionListener(PositionListener listener
)
241 this.eventListeners
.add(PositionListener
.class, listener
);
244 public void removePositionListener(PositionListener listener
)
246 this.eventListeners
.remove(PositionListener
.class, listener
);
249 private void callPositionListeners(final PositionEvent event
)
251 EventQueue
.invokeLater(new Runnable()
255 for (PositionListener listener
: eventListeners
.getListeners(PositionListener
.class))
257 listener
.moved(event
);
263 public void addSelectListener(SelectListener listener
)
265 this.eventListeners
.add(SelectListener
.class, listener
);
268 public void removeSelectListener(SelectListener listener
)
270 this.eventListeners
.remove(SelectListener
.class, listener
);
273 private void callSelectListeners(final SelectEvent event
)
275 EventQueue
.invokeLater(new Runnable()
279 for (SelectListener listener
: eventListeners
.getListeners(SelectListener
.class))
281 listener
.selected(event
);