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

View differences:

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