Revision 521 2.1/trunk/org.gvsig.view3d/org.gvsig.view3d.swing/org.gvsig.view3d.swing.impl/src/main/java/org/gvsig/view3d/swing/impl/DefaultSynchronizer.java
DefaultSynchronizer.java | ||
---|---|---|
1 | 1 |
package org.gvsig.view3d.swing.impl; |
2 | 2 |
|
3 |
import gov.nasa.worldwind.Model;
|
|
3 |
import gov.nasa.worldwind.WorldWindow;
|
|
4 | 4 |
import gov.nasa.worldwind.avlist.AVKey; |
5 | 5 |
import gov.nasa.worldwind.avlist.AVList; |
6 |
import gov.nasa.worldwind.geom.Angle; |
|
7 |
import gov.nasa.worldwind.geom.Box; |
|
8 |
import gov.nasa.worldwind.geom.Position; |
|
9 |
import gov.nasa.worldwind.geom.Sector; |
|
6 | 10 |
import gov.nasa.worldwind.globes.ElevationModel; |
7 | 11 |
import gov.nasa.worldwind.layers.Layer; |
8 | 12 |
import gov.nasa.worldwind.terrain.CompoundElevationModel; |
13 |
import gov.nasa.worldwind.view.orbit.OrbitView; |
|
9 | 14 |
|
15 |
import java.awt.geom.Point2D; |
|
10 | 16 |
import java.util.ArrayList; |
11 | 17 |
import java.util.HashMap; |
12 | 18 |
import java.util.List; |
... | ... | |
14 | 20 |
import java.util.Map.Entry; |
15 | 21 |
|
16 | 22 |
import org.gvsig.fmap.dal.exception.DataException; |
23 |
import org.gvsig.fmap.geom.primitive.Envelope; |
|
17 | 24 |
import org.gvsig.fmap.mapcontext.MapContext; |
25 |
import org.gvsig.fmap.mapcontext.ViewPort; |
|
26 |
import org.gvsig.fmap.mapcontext.events.ColorEvent; |
|
27 |
import org.gvsig.fmap.mapcontext.events.ExtentEvent; |
|
28 |
import org.gvsig.fmap.mapcontext.events.ProjectionEvent; |
|
29 |
import org.gvsig.fmap.mapcontext.events.listeners.ViewPortListener; |
|
18 | 30 |
import org.gvsig.fmap.mapcontext.layers.CancelationException; |
19 | 31 |
import org.gvsig.fmap.mapcontext.layers.FLayer; |
20 | 32 |
import org.gvsig.fmap.mapcontext.layers.FLayers; |
... | ... | |
29 | 41 |
import org.gvsig.view3d.lib.api.View3DLocator; |
30 | 42 |
import org.gvsig.view3d.lib.api.View3DManager; |
31 | 43 |
import org.gvsig.view3d.lib.api.properties.LayerProperties3D; |
44 |
import org.gvsig.view3d.swing.api.View3DSwingLocator; |
|
45 |
import org.gvsig.view3d.swing.api.View3DSwingManager; |
|
46 |
import org.gvsig.view3d.swing.api.properties.GeneralProperties3D; |
|
32 | 47 |
import org.gvsig.view3d.swing.api.properties.MapControlProperties3D; |
33 | 48 |
import org.gvsig.view3d.swing.impl.data.DefaultTiledImageLayer; |
34 | 49 |
import org.slf4j.Logger; |
... | ... | |
47 | 62 |
|
48 | 63 |
private DefaultMapControl3D mapControl3D; |
49 | 64 |
private MapContext mapContext; |
50 |
private Model modelWW;
|
|
65 |
private WorldWindow wwd;
|
|
51 | 66 |
|
52 | 67 |
protected DefaultSynchronizer(DefaultMapControl3D theMapControl3D, |
53 |
MapContext theMapContext, Model theModelWW) {
|
|
68 |
MapContext theMapContext, WorldWindow wwd) {
|
|
54 | 69 |
|
55 | 70 |
this.mapControl3D = theMapControl3D; |
56 | 71 |
this.mapContext = theMapContext; |
57 |
this.modelWW = theModelWW;
|
|
72 |
this.wwd = wwd;
|
|
58 | 73 |
|
59 | 74 |
intializeRegisters(); |
60 | 75 |
|
61 | 76 |
addLayerCollectionListener(mapContext.getLayers()); |
62 | 77 |
addLayerListener(mapContext.getLayers()); |
78 |
addViewPortListener(mapContext.getViewPort()); |
|
63 | 79 |
} |
64 | 80 |
|
65 | 81 |
private void intializeRegisters() { |
... | ... | |
187 | 203 |
} |
188 | 204 |
}; |
189 | 205 |
} |
206 |
|
|
207 |
private void addViewPortListener(ViewPort viewPort) { |
|
208 |
|
|
209 |
viewPort.addViewPortListener(new ViewPortListener() { |
|
210 |
|
|
211 |
public void projectionChanged(ProjectionEvent e) { |
|
212 |
} |
|
213 |
|
|
214 |
public void extentChanged(ExtentEvent e) { |
|
215 |
MapControlProperties3D properties = |
|
216 |
mapControl3D.getProperties(); |
|
217 |
boolean autoViewSynchronize = |
|
218 |
properties.getAutoViewSynchronize(); |
|
219 |
if (autoViewSynchronize) { |
|
220 |
synchronizeViewPorts(); |
|
221 |
} |
|
222 |
} |
|
223 |
|
|
224 |
public void backColorChanged(ColorEvent e) { |
|
225 |
} |
|
226 |
}); |
|
227 |
} |
|
190 | 228 |
|
229 |
|
|
191 | 230 |
private Layer getTileImageLayer(FLayer layer) { |
192 | 231 |
List<Layer> layers = |
193 |
modelWW.getLayers().getLayersByClass(DefaultTiledImageLayer.class);
|
|
232 |
wwd.getModel().getLayers().getLayersByClass(DefaultTiledImageLayer.class);
|
|
194 | 233 |
for (Layer tiledLayer : layers) { |
195 | 234 |
AVList constructionParams = |
196 | 235 |
(AVList) tiledLayer.getValue(AVKey.CONSTRUCTION_PARAMETERS); |
... | ... | |
207 | 246 |
} |
208 | 247 |
|
209 | 248 |
private ElevationModel getElevationModel(FLayer layer) { |
210 |
ElevationModel elevationModel = modelWW.getGlobe().getElevationModel();
|
|
249 |
ElevationModel elevationModel = wwd.getModel().getGlobe().getElevationModel();
|
|
211 | 250 |
|
212 | 251 |
if (elevationModel instanceof CompoundElevationModel) { |
213 | 252 |
CompoundElevationModel compoundModel = |
... | ... | |
327 | 366 |
} |
328 | 367 |
|
329 | 368 |
protected void synchronizeViewPorts() { |
330 |
throw new UnsupportedOperationException(); |
|
369 |
|
|
370 |
// Convert envelope to WorldWind sector |
|
371 |
ViewPort viewPort = this.mapContext.getViewPort(); |
|
372 |
Envelope envelope = viewPort.getEnvelope(); |
|
373 |
Sector sector = getSector(envelope); |
|
374 |
|
|
375 |
// Create a bounding box for the specified sector in order to estimate |
|
376 |
// its size in model coordinates. |
|
377 |
Box extent = Sector.computeBoundingBox(wwd.getModel().getGlobe(), |
|
378 |
mapControl3D.getVerticalExaggeration(), sector); |
|
379 |
|
|
380 |
// Estimate the distance between the center position and the eye |
|
381 |
// position that is necessary to cause the sector to |
|
382 |
// fill a viewport with the specified field of view. Note that we change |
|
383 |
// the distance between the center and eye |
|
384 |
// position here, and leave the field of view constant. |
|
385 |
Angle fov = wwd.getView().getFieldOfView(); |
|
386 |
double zoom = extent.getRadius() / fov.cosHalfAngle() / fov.tanHalfAngle(); |
|
387 |
|
|
388 |
View3DSwingManager swingManager = View3DSwingLocator.getManager(); |
|
389 |
GeneralProperties3D general3dProperties = swingManager.getGeneral3DProperties(); |
|
390 |
|
|
391 |
if(general3dProperties.getViewPortAnimation()){ |
|
392 |
wwd.getView().goTo(new Position(sector.getCentroid(), 0d), zoom); |
|
393 |
} else { |
|
394 |
((OrbitView) wwd.getView()).setCenterPosition(new Position(sector |
|
395 |
.getCentroid(), 0d)); |
|
396 |
((OrbitView) wwd.getView()).setZoom(zoom); |
|
397 |
wwd.redraw(); |
|
398 |
} |
|
331 | 399 |
} |
332 | 400 |
|
401 |
private Sector getSector(Envelope envelope) { |
|
402 |
|
|
403 |
Point2D p1 = null; |
|
404 |
Point2D p2 = null; |
|
405 |
|
|
406 |
p1 = new Point2D.Double(envelope.getMinimum(0), envelope.getMinimum(1)); |
|
407 |
p2 = new Point2D.Double(envelope.getMaximum(0), envelope.getMaximum(1)); |
|
408 |
|
|
409 |
double minLatitude = |
|
410 |
Double.isInfinite(p1.getY()) || p1.getY() < Angle.NEG90.degrees |
|
411 |
? Angle.NEG90.degrees : p1.getY(); |
|
412 |
double maxLatitude = |
|
413 |
Double.isInfinite(p2.getY()) || p2.getY() > Angle.POS90.degrees |
|
414 |
? Angle.POS90.degrees : p2.getY(); |
|
415 |
double minLongitude = |
|
416 |
Double.isInfinite(p1.getX()) || p1.getX() < Angle.NEG180.degrees |
|
417 |
? Angle.NEG180.degrees : p1.getX(); |
|
418 |
double maxLongitude = |
|
419 |
Double.isInfinite(p2.getX()) || p2.getX() > Angle.POS180.degrees |
|
420 |
? Angle.POS180.degrees : p2.getX(); |
|
421 |
|
|
422 |
Sector sector = |
|
423 |
new Sector(Sector.fromDegrees(minLatitude, maxLatitude, |
|
424 |
minLongitude, maxLongitude)); |
|
425 |
|
|
426 |
return sector; |
|
427 |
} |
|
428 |
|
|
333 | 429 |
private void updateLayer(FLayer layer) { |
334 | 430 |
int index = getLayerIndex(layer); |
335 | 431 |
removeLayer(layer); |
... | ... | |
345 | 441 |
if(layerProperties.getElevation()){ |
346 | 442 |
ElevationModel layerEModel = getElevationModel(layer); |
347 | 443 |
CompoundElevationModel eModel = |
348 |
(CompoundElevationModel) modelWW.getGlobe().getElevationModel();
|
|
444 |
(CompoundElevationModel) wwd.getModel().getGlobe().getElevationModel();
|
|
349 | 445 |
if(layerEModel != null){ |
350 | 446 |
|
351 | 447 |
index = eModel.getElevationModels().indexOf(layerEModel); |
... | ... | |
356 | 452 |
|
357 | 453 |
Layer tileImageLayer = getTileImageLayer(layer); |
358 | 454 |
if(tileImageLayer != null){ |
359 |
index = modelWW.getLayers().indexOf(tileImageLayer);
|
|
455 |
index = wwd.getModel().getLayers().indexOf(tileImageLayer);
|
|
360 | 456 |
} else { |
361 |
return modelWW.getLayers().size();
|
|
457 |
return wwd.getModel().getLayers().size();
|
|
362 | 458 |
} |
363 | 459 |
} |
364 | 460 |
|
... | ... | |
388 | 484 |
|
389 | 485 |
if (eModel != null) { |
390 | 486 |
CompoundElevationModel compoundEModel = |
391 |
(CompoundElevationModel) modelWW.getGlobe().getElevationModel();
|
|
487 |
(CompoundElevationModel) wwd.getModel().getGlobe().getElevationModel();
|
|
392 | 488 |
compoundEModel.removeElevationModel(eModel); |
393 | 489 |
} else if (tiledImageLayer != null) { |
394 |
modelWW.getLayers().remove(tiledImageLayer);
|
|
490 |
wwd.getModel().getLayers().remove(tiledImageLayer);
|
|
395 | 491 |
} |
396 | 492 |
} |
397 | 493 |
|
Also available in: Unified diff