Statistics
| Revision:

svn-gvsig-desktop / trunk / libraries / lib3DMap / src / com / iver / ai2 / gvsig3d / map3d / MapContext3D.java @ 18219

History | View | Annotate | Download (37.8 KB)

1
package com.iver.ai2.gvsig3d.map3d;
2

    
3
import java.awt.Component;
4
import java.awt.Dimension;
5
import java.awt.Point;
6
import java.awt.geom.Rectangle2D;
7
import java.io.File;
8
import java.util.ArrayList;
9

    
10
import javax.swing.JOptionPane;
11

    
12
import org.cresques.cts.ICoordTrans;
13
import org.cresques.cts.IProjection;
14
import org.gvsig.cacheservice.TileNum;
15

    
16
import com.hardcode.gdbms.driver.exceptions.ReadDriverException;
17
import com.iver.ai2.gvsig3d.cacheservices.FLayerCacheService;
18
import com.iver.ai2.gvsig3d.cacheservices.VectorCacheService;
19
import com.iver.ai2.gvsig3d.map3d.layers.FLayers3D;
20
import com.iver.ai2.gvsig3d.map3d.layers.Layer3DProps;
21
import com.iver.andami.PluginServices;
22
import com.iver.cit.gvsig.AddLayer;
23
import com.iver.cit.gvsig.exceptions.expansionfile.ExpansionFileReadException;
24
import com.iver.cit.gvsig.fmap.MapContext;
25
import com.iver.cit.gvsig.fmap.ViewPort;
26
import com.iver.cit.gvsig.fmap.layers.FLayer;
27
import com.iver.cit.gvsig.fmap.layers.FLayers;
28
import com.iver.cit.gvsig.fmap.layers.FLyrDefault;
29
import com.iver.cit.gvsig.fmap.layers.FLyrVect;
30
import com.iver.cit.gvsig.fmap.layers.FLyrWCS;
31
import com.iver.cit.gvsig.fmap.layers.GraphicLayer;
32
import com.iver.cit.gvsig.fmap.layers.LayerEvent;
33
import com.iver.cit.gvsig.fmap.layers.LayerListener;
34
import com.iver.cit.gvsig.fmap.layers.LegendListener;
35
import com.iver.cit.gvsig.fmap.layers.SingleLayerIterator;
36
import com.iver.cit.gvsig.fmap.layers.XMLException;
37
import com.iver.cit.gvsig.fmap.layers.layerOperations.Classifiable;
38
import com.iver.cit.gvsig.fmap.rendering.ILegend;
39
import com.iver.cit.gvsig.fmap.rendering.IVectorLegend;
40
import com.iver.cit.gvsig.fmap.rendering.LegendChangedEvent;
41
import com.iver.utiles.XMLEntity;
42

    
43
import es.upv.ai2.osgvp.Node;
44
import es.upv.ai2.osgvp.Vec3;
45
import es.upv.ai2.osgvp.planets.Planet;
46
import es.upv.ai2.osgvp.planets.PlanetViewer;
47
import es.upv.ai2.osgvp.planets.RequestLayerListener;
48
import es.upv.ai2.osgvp.planets.TileCreatedListener;
49
import es.upv.ai2.osgvp.planets.TileEvent;
50
import es.upv.ai2.osgvp.viewer.Camera;
51
import es.upv.ai2.osgvp.viewer.IViewerContainer;
52

    
53
public class MapContext3D extends MapContext implements TileCreatedListener,
54
                RequestLayerListener, LayerListener, LegendListener {
55

    
56
        // JOSG library objects
57
        private Planet m_planet;
58

    
59
        private IViewerContainer m_canvas3d;
60

    
61
        private PlanetViewer planetViewer;
62

    
63
        // separate lists for image, elevation and vector layers
64
        private ArrayList m_layerLists = new ArrayList();
65

    
66
        private IProjection m_viewProjection;
67

    
68
        private float verticalExageration;
69

    
70
        private boolean m_bEmptyView = true;
71

    
72
        private boolean m_bListenToLegend = true;
73

    
74
        private boolean m_bLoading = false;
75

    
76
        // private Rectangle2D extentAux;
77

    
78
        // private ViewPort3D vport;
79

    
80
        public MapContext3D(ViewPort vp) {
81
                super(vp);
82

    
83
                ArrayList textureLayers = new ArrayList();
84
                ArrayList elevationLayers = new ArrayList();
85
                ArrayList vectorLayers = new ArrayList();
86
                m_layerLists.add(textureLayers);
87
                m_layerLists.add(elevationLayers);
88
                m_layerLists.add(vectorLayers);
89

    
90
                // extentAux = new Rectangle2D.Double(-180.0, 90.0, 180.0, -90.0);
91
        }
92

    
93
        public MapContext3D(FLayers fLayers, ViewPort vp) {
94
                super(fLayers, vp);
95

    
96
                ArrayList textureLayers = new ArrayList();
97
                ArrayList elevationLayers = new ArrayList();
98
                ArrayList vectorLayers = new ArrayList();
99
                m_layerLists.add(textureLayers);
100
                m_layerLists.add(elevationLayers);
101
                m_layerLists.add(vectorLayers);
102

    
103
                // extentAux = new Rectangle2D.Double(-180.0, 90.0, 180.0, -90.0);
104
        }
105

    
106
        public void setPlanet(Planet planet) {
107
                if (planet == m_planet)
108
                        return;
109

    
110
                m_planet = planet;
111

    
112
                // add layers to planet
113

    
114
                for (int iType = 0; iType < 3; iType++) {
115
                        ArrayList layerList = (ArrayList) m_layerLists.get(iType);
116
                        for (int iLayer = 0; iLayer < layerList.size(); iLayer++) {
117

    
118
                                FLayer layer = (FLayer) layerList.get(iLayer);
119
                                Layer3DProps props = getLayer3DProps(layer);
120
                                props.setPlanetOrder(props.getTocOrder());
121
                                addLayerToPlanet(layer, props.getPlanetOrder(), false);
122

    
123
                                // Layer active or not
124
                                if (props.getType() == Layer3DProps.layer3DImage) {
125
                                        m_planet.setEnabledTextureLayer(props.getPlanetOrder(),
126
                                                        layer.isVisible());
127
                                }
128
                                if (props.getType() == Layer3DProps.layer3DElevation) {
129
                                        m_planet.setEnabledHeightfieldLayer(0, layer.isVisible());
130
                                }
131
                        }
132
                        if (iType == Layer3DProps.layer3DElevation && layerList.size() > 0)
133
                                m_planet.invalidateHeightfieldLayer(0);
134
                }
135
        }
136

    
137
        public Planet getPlanet() {
138
                return m_planet;
139
        }
140

    
141
        public void setViewer(IViewerContainer canvas) {
142
                m_canvas3d = canvas;
143
                this.planetViewer = (PlanetViewer) m_canvas3d.getOSGViewer();
144
        }
145

    
146
        public IProjection getViewProjection() {
147
                return m_viewProjection;
148
        }
149

    
150
        public void setViewProjection(IProjection projection) {
151
                m_viewProjection = projection;
152
        }
153

    
154
        public IViewerContainer getCanvas3d() {
155
                return m_canvas3d;
156
        }
157

    
158
        // public void setCanvas3d(IViewerContainer m_canvas3d) {
159
        // this.m_canvas3d = m_canvas3d;
160
        //                
161
        // }
162

    
163
        public float getVerticalExageration() {
164
                return verticalExageration;
165
        }
166

    
167
        public void setVerticalExageration(float verticalExageration) {
168
                this.verticalExageration = verticalExageration;
169
        }
170

    
171
        public void setLoading(boolean bLoading) {
172
                m_bLoading = bLoading;
173
        }
174

    
175
        public FLayers getNewGroupLayer(FLayers parent) {
176
                return new FLayers3D(this, parent, getViewPort());
177
        }
178

    
179
        /** * LAYER CHANGES called by FLayers3D ** */
180

    
181
        public void layerMoved(FLayers3D parent, FLayer layer, int oldPos,
182
                        int newPos) {
183

    
184
                if (layer instanceof FLayers) {
185
                        FLayers group = (FLayers) layer;
186
                        if (newPos > oldPos) {
187
                                for (int iChild = group.getLayersCount() - 1; iChild >= 0; iChild--)
188
                                        layerMoved((FLayers3D) group, group.getLayer(iChild),
189
                                                        oldPos, newPos);
190
                        } else {
191
                                for (int iChild = 0; iChild < group.getLayersCount(); iChild++)
192
                                        layerMoved((FLayers3D) group, group.getLayer(iChild),
193
                                                        oldPos, newPos);
194
                        }
195
                        return;
196
                }
197

    
198
                Layer3DProps props3D = getLayer3DProps(layer);
199
                if (props3D.getType() != Layer3DProps.layer3DImage)
200
                        return;
201

    
202
                refreshLayerOrder();
203

    
204
                ArrayList layerList = (ArrayList) m_layerLists.get(props3D.getType());
205

    
206
                // This will be more complex when we have multiple planets
207
                int currentPlanetOrder = props3D.getPlanetOrder();
208
                int newPlanetOrder = props3D.getTocOrder();
209
                if (currentPlanetOrder != newPlanetOrder) {
210
                        m_planet.reorderTextureLayer(currentPlanetOrder, newPlanetOrder);
211
                        // update planet order for all layers
212
                        for (int iLayer = 0; iLayer < layerList.size(); iLayer++) {
213
                                FLayer eachLayer = (FLayer) layerList.get(iLayer);
214
                                Layer3DProps eachProps3D = getLayer3DProps(eachLayer);
215
                                int currentPlanetOrderI = eachProps3D.getPlanetOrder();
216
                                if (currentPlanetOrder < newPlanetOrder) { // layer moves 'up'
217
                                        if (currentPlanetOrderI > currentPlanetOrder
218
                                                        && currentPlanetOrderI <= newPlanetOrder)
219
                                                eachProps3D.setPlanetOrder(currentPlanetOrderI - 1);
220
                                } else { // layer moves 'down'
221
                                        if (currentPlanetOrderI < currentPlanetOrder
222
                                                        && currentPlanetOrderI >= newPlanetOrder)
223
                                                eachProps3D.setPlanetOrder(currentPlanetOrderI + 1);
224
                                }
225
                        }
226
                        props3D.setPlanetOrder(newPlanetOrder);
227
                }
228

    
229
                // reorder all which may have changed in internal layer list
230
                ArrayList sortedLayers = new ArrayList(layerList.size());
231
                for (int iLayer = 0; iLayer < layerList.size(); iLayer++)
232
                        sortedLayers.add(null);
233

    
234
                for (int iLayer = 0; iLayer < layerList.size(); iLayer++) {
235
                        FLayer eachLayer = (FLayer) layerList.get(iLayer);
236
                        Layer3DProps eachProps3D = getLayer3DProps(eachLayer);
237
                        int newOrder = eachProps3D.getTocOrder();
238
                        sortedLayers.set(newOrder, eachLayer);
239
                }
240
                m_layerLists.set(props3D.getType(), sortedLayers);
241

    
242
                PrintDebugLayers();
243
                // REPAINTING VIEWER
244
                if (m_canvas3d != null)
245
                        m_canvas3d.repaint();
246
        }
247

    
248
        public void layerAdded(FLayers3D parent, FLayer layer) {
249

    
250
                // to add group layers to 3D, just add recursively child data layers
251
                if (layer instanceof FLayers) {
252
                        FLayers group = (FLayers) layer;
253
                        for (int iChild = 0; iChild < group.getLayersCount(); iChild++) {
254
                                layerAdded((FLayers3D) group, group.getLayer(iChild));
255
                        }
256
                        getLayer3DProps(layer).setHooked(true);
257
                        return;
258
                }
259

    
260
                if (layer instanceof Classifiable) {
261
                        Classifiable legendLyr = (Classifiable) layer;
262
                        legendLyr.addLegendListener((LegendListener) this);
263
                }
264
                layer.addLayerListener((LayerListener) this);
265

    
266
                // LINEAS COMETADAS PARA Q NO PREGUNTE DOS VECES QUE SI QUEREMOS
267
                // REPROYECTAR LA CAPA
268
                // SI SE COMENTA LAS LINEAS CUANDO SE COPIA Y PEGA UNA CAPA NO PREGUNTA
269
                // SI QUEREMOS REPROJECTAR
270
                // if (!m_bLoading)
271
                // checkProjection(layer, getViewPort().getProjection());
272

    
273
                int order = addLayerByType(layer);
274
                if (order == -1) {
275
                        // an error has been generated
276
                        parent.removeLayer(layer);
277
                        return;
278
                }
279

    
280
                if (!m_bLoading)
281
                        addLayerToPlanet(layer, order, true);
282

    
283
                // Only do this the first time to add layer
284
                ArrayList layerListI = (ArrayList) m_layerLists
285
                                .get(Layer3DProps.layer3DImage);
286
                ArrayList layerListV = (ArrayList) m_layerLists
287
                                .get(Layer3DProps.layer3DVector);
288

    
289
                if (m_bEmptyView && !m_bLoading) {
290
                        if (!((layerListI.size() == 1) && (layerListV.size() == 0))
291
                                        || !((layerListI.size() == 0) && (layerListV.size() == 1))) {
292
                                try {
293
                                        zoomToExtent(layer.getFullExtent());
294
                                } catch (ExpansionFileReadException e) {
295
                                        e.printStackTrace();
296
                                } catch (ReadDriverException e) {
297
                                        e.printStackTrace();
298
                                }
299
                                m_bEmptyView = false;
300
                        }
301
                }
302

    
303
                PrintDebugLayers();
304
        }
305

    
306
        public void layerRemoved(FLayers3D parent, FLayer layer) {
307

    
308
                // to remove group layers to 3D, just remove recursively child data
309
                // layers
310
                if (layer instanceof FLayers) {
311
                        FLayers group = (FLayers) layer;
312
                        for (int iChild = 0; iChild < group.getLayersCount(); iChild++) {
313
                                layerRemoved((FLayers3D) group, group.getLayer(iChild));
314
                        }
315
                        getLayer3DProps(layer).setHooked(false);
316
                        return;
317
                }
318

    
319
                if (layer instanceof Classifiable) {
320
                        Classifiable legendLyr = (Classifiable) layer;
321
                        legendLyr.removeLegendListener((LegendListener) this);
322
                }
323
                layer.removeLayerListener((LayerListener) this);
324

    
325
                int order = removeLayerByType(layer);
326
                if (order == -1)
327
                        return;
328

    
329
                Layer3DProps props3D = getLayer3DProps(layer);
330

    
331
                if (props3D.getType() == Layer3DProps.layer3DVector) {
332
                        DeleteVectors(layer, props3D);
333
                } else if (props3D.getType() == Layer3DProps.layer3DImage) {
334
                        m_planet.removeTextureLayer(props3D.getPlanetOrder());
335
                        ArrayList layerList = (ArrayList) m_layerLists.get(props3D
336
                                        .getType());
337

    
338
                        for (int iLayer = 0; iLayer < layerList.size(); iLayer++) {
339
                                FLayer eachLayer = (FLayer) layerList.get(iLayer);
340
                                Layer3DProps eachProps3D = getLayer3DProps(eachLayer);
341
                                if (eachProps3D.getPlanetOrder() > props3D.getPlanetOrder())
342
                                        eachProps3D
343
                                                        .setPlanetOrder(eachProps3D.getPlanetOrder() - 1);
344
                        }
345
                        props3D.setPlanetOrder(-1);
346
                } else if (props3D.getType() == Layer3DProps.layer3DElevation) {
347
                        m_planet.removeHeightfieldLayer(order);
348
                }
349

    
350
                // REPAINTING VIEWER
351
                if (m_canvas3d != null)
352
                        m_canvas3d.repaint();
353

    
354
                ArrayList layerListI = (ArrayList) m_layerLists
355
                                .get(Layer3DProps.layer3DImage);
356
                ArrayList layerListV = (ArrayList) m_layerLists
357
                                .get(Layer3DProps.layer3DVector);
358
                // All layers are removed
359
                if ((layerListI.size() == 0) && (layerListV.size() == 0)) {
360
                        m_bEmptyView = true;
361
                }
362

    
363
                PrintDebugLayers();
364
        }
365

    
366
        /**
367
         * DOCUMENT ME!
368
         * 
369
         * @param e
370
         *            DOCUMENT ME!
371
         */
372
        public void legendChanged(LegendChangedEvent e) {
373

    
374
                if (!m_bListenToLegend)
375
                        return;
376

    
377
                IVectorLegend newLegend = (IVectorLegend) e.getNewLegend();
378
                // find layer whose legend changed
379
                FLayer found = null;
380
                SingleLayerIterator lyrIterator = new SingleLayerIterator(layers);
381
                while (lyrIterator.hasNext()) {
382
                        FLayer lyr = lyrIterator.next();
383
                        if (lyr instanceof Classifiable) {
384
                                Classifiable classLyr = (Classifiable) lyr;
385
                                ILegend legend = classLyr.getLegend();
386
                                if (legend instanceof IVectorLegend) {
387
                                        if ((IVectorLegend) legend == newLegend) {
388
                                                found = lyr;
389
                                                break;
390
                                        }
391
                                }
392
                        }
393
                }
394

    
395
                if (found != null) {
396
                        Layer3DProps props3D = getLayer3DProps(found);
397
                        refreshLayerInPlanet(props3D, true);
398
                        m_bListenToLegend = false;
399
                        props3D.VerifyLegend(m_planet);
400
                        m_bListenToLegend = true;
401
                        // REPAINTING VIWER
402
                        if (m_canvas3d != null)
403
                                m_canvas3d.repaint();
404
                }
405
        }
406

    
407
        public void visibilityChanged(LayerEvent e) {
408
                FLayer lyr = e.getSource();
409

    
410
                Layer3DProps props3D = getLayer3DProps(lyr);
411

    
412
                if (props3D.getType() == Layer3DProps.layer3DVector) {
413
                        refreshLayerVectorsVisibility(lyr);
414
                } else {
415
                        refreshLayerVisibility(lyr);
416
                }
417
                m_canvas3d.repaint();
418
        }
419

    
420
        private void refreshLayerVisibility(FLayer layer) {
421

    
422
                Layer3DProps props3D = getLayer3DProps(layer);
423
                if (props3D.getType() == Layer3DProps.layer3DImage) {
424
                        m_planet.setEnabledTextureLayer(props3D.getPlanetOrder(), layer
425
                                        .isVisible());
426
                }
427
                if (props3D.getType() == Layer3DProps.layer3DElevation) {
428
                        m_planet.setEnabledHeightfieldLayer(0, layer.isVisible());
429
                }
430
                // REPAINTING VIEWER
431
                if (m_canvas3d != null)
432
                        m_canvas3d.repaint();
433
        }
434

    
435
        private void refreshLayerVectorsVisibility(FLayer lyr) {
436
                if (m_planet == null || m_viewProjection == null)
437
                        return;
438

    
439
                Layer3DProps props3D = getLayer3DProps(lyr);
440

    
441
                VectorCacheService cacheService = (VectorCacheService) props3D
442
                                .getCacheService();
443
                if (cacheService != null) {
444
                        // use VectorCacheService to add features to planet
445
                        cacheService.refreshFeaturesToPlanet(lyr.isVisible());
446
                }
447

    
448
        }
449

    
450
        public void activationChanged(LayerEvent e) {
451
                // TODO Implement this method
452
        }
453

    
454
        public void nameChanged(LayerEvent e) {
455
                // TODO Implement this method
456
        }
457

    
458
        public void editionChanged(LayerEvent e) {
459
                // TODO Implement this method
460
        }
461

    
462
        public void refreshLayerInPlanet(Layer3DProps props, boolean bRemoveCache) {
463
                if (props == null)
464
                        return;
465

    
466
                if (m_planet == null)
467
                        return; // view not opened yet
468

    
469
                // clear cache
470

    
471
                if (bRemoveCache) {
472
                        String layerCacheDir = Layer3DProps.m_cacheDir + "/"
473
                                        + m_planet.getPlanetName() + "/" + props.getCacheName();
474
                        removeCache(layerCacheDir);
475
                }
476

    
477
                // refresh layer in planet
478

    
479
                int type = props.getType();
480
                if (type == Layer3DProps.layer3DImage) {
481
                        int order = props.getPlanetOrder();
482
                        // m_planet.refreshTextureInfo(order);
483
                        m_planet.invalidateTextureLayer(order);
484
                } else if (type == Layer3DProps.layer3DElevation) {
485
                        m_planet.invalidateHeightfieldLayer(0);
486
                } else if (type == Layer3DProps.layer3DVector) {
487
                        invalidateVectorLayer(props);
488
                }
489

    
490
                // REPAINTING VIEWER
491
                if (m_canvas3d != null)
492
                        m_canvas3d.repaint();
493
        }
494

    
495
        private void invalidateVectorLayer(Layer3DProps props) {
496
                // TODO Auto-generated method stub
497
                if (m_planet == null || m_viewProjection == null)
498
                        return;
499

    
500
                VectorCacheService cacheService = (VectorCacheService) props
501
                                .getCacheService();
502
                if (cacheService != null) {
503
                        // use VectorCacheService to add features to planet
504
                        cacheService.RefreshFeaturesToPlanet();
505
                }
506
        }
507

    
508
        private boolean removeCache(String folder) {
509
                File dir = new File(folder);
510
                if (dir.isDirectory()) {
511
                        String[] children = dir.list();
512
                        for (int i = 0; i < children.length; i++) {
513
                                boolean success = removeCache(folder + "/" + children[i]);
514
                                // Do not interrupt if it can't delete one file
515
                                // if (!success) {
516
                                // return false;
517
                                // }
518
                        }
519
                }
520

    
521
                // The directory is now empty so delete it
522
                return dir.delete();
523
        }
524

    
525
        protected Layer3DProps getLayer3DProps(FLayer layer) {
526
                Layer3DProps props3D = Layer3DProps.getLayer3DProps(layer);
527
                if (props3D == null) {
528
                        props3D = new Layer3DProps();
529
                        props3D.setLayer(layer);
530
                        props3D.initCacheName(m_planet.getCoordinateSystemType(),
531
                                        m_viewProjection);
532
                        FLyrDefault baseLayer = (FLyrDefault) layer;
533
                        baseLayer.setProperty("3DLayerExtension", props3D);
534
                        props3D.setVerticalEx(this.getVerticalExageration());
535
                } else {
536
                        if (m_bLoading)
537
                                props3D.setChooseType(false);
538
                        props3D.setLayer(layer);
539
                }
540

    
541
                return props3D;
542
        }
543

    
544
        private void addLayerToPlanet(FLayer layer, int order, boolean bVerifyLegend) {
545
                Layer3DProps props3D = getLayer3DProps(layer);
546
                if (props3D.getType() == Layer3DProps.layer3DVector)
547
                        CreateVectors(layer, props3D); // special case for now without
548
                // disk cache
549
                else {
550
                        Rectangle2D layerExtent = null;
551
                        try {
552
                                layerExtent = layer.getFullExtent();
553
                        } catch (ExpansionFileReadException e) {
554
                                e.printStackTrace();
555
                        } catch (ReadDriverException e) {
556
                                e.printStackTrace();
557
                        }
558
                        if (layerExtent == null) { // hack for missing extents
559
                                if (m_planet.getCoordinateSystemType() == Planet.CoordinateSystemType.GEOCENTRIC)
560
                                        layerExtent = new Rectangle2D.Double(-180.0, -90.0, 360.0,
561
                                                        180.0);
562
                                else
563
                                        layerExtent = new Rectangle2D.Double(-20000000.0,
564
                                                        -10000000.0, 40000000.0, 20000000.0);
565
                                // TODO toggle comment because this code use WCS extension. When
566
                                // WCS extension runs correctly uncoment!!!
567

    
568
                                if (layer instanceof FLyrWCS)
569
                                        ((FLyrWCS) layer).setFullExtent(layerExtent);
570
                                /**/
571
                        }
572
                        if (props3D.getType() == Layer3DProps.layer3DElevation)
573
                                m_planet.addHeightfieldLayer(layerExtent, 3);
574
                        else if (props3D.getType() == Layer3DProps.layer3DImage) {
575
                                m_planet.addTextureLayer(layerExtent, 0);
576
                                ArrayList imageList = (ArrayList) m_layerLists
577
                                                .get(Layer3DProps.layer3DImage);
578
                                int currentOrder = imageList.size() - 1;
579
                                if (currentOrder != order) { // had to be added to non-last
580
                                        // position
581
                                        m_planet.reorderTextureLayer(currentOrder, order);
582
                                        for (int iLayer = 0; iLayer < imageList.size(); iLayer++) {
583
                                                FLayer eachLayer = (FLayer) imageList.get(iLayer);
584
                                                Layer3DProps eachProps3D = getLayer3DProps(eachLayer);
585
                                                if (eachProps3D.getPlanetOrder() >= order)
586
                                                        eachProps3D.setPlanetOrder(eachProps3D
587
                                                                        .getPlanetOrder() + 1);
588
                                        }
589
                                }
590
                                props3D.setPlanetOrder(order);
591
                        }
592
                        // REPAINTING VIEWER
593
                        if (m_canvas3d != null)
594
                                m_canvas3d.repaint();
595

    
596
                        if (bVerifyLegend) {
597
                                m_bListenToLegend = false;
598
                                props3D.VerifyLegend(m_planet);
599
                                m_bListenToLegend = true;
600
                        }
601
                }
602
        }
603

    
604
        private void refreshLayerOrder() {
605
                int typeOrder[] = new int[3];
606
                typeOrder[Layer3DProps.layer3DImage] = 0;
607
                typeOrder[Layer3DProps.layer3DElevation] = 0;
608
                typeOrder[Layer3DProps.layer3DVector] = 0;
609

    
610
                SingleLayerIterator lyrIterator = new SingleLayerIterator(layers);
611
                while (lyrIterator.hasNext()) {
612
                        FLayer lyr = lyrIterator.next();
613
                        Layer3DProps props3D = getLayer3DProps(lyr);
614
                        int type = props3D.getType();
615
                        // stores new order in properties 3D, but doesn't reorder internal
616
                        // layer lists
617
                        props3D.setTocOrder(typeOrder[type]);
618
                        typeOrder[type] += 1;
619
                }
620
        }
621

    
622
        private int addLayerByType(FLayer layer) {
623
                int resultOrder = -1;
624

    
625
                int typeOrder[] = new int[3];
626
                typeOrder[Layer3DProps.layer3DImage] = 0;
627
                typeOrder[Layer3DProps.layer3DElevation] = 0;
628
                typeOrder[Layer3DProps.layer3DVector] = 0;
629

    
630
                SingleLayerIterator lyrIterator = new SingleLayerIterator(layers);
631
                while (lyrIterator.hasNext()) {
632
                        FLayer lyr = lyrIterator.next();
633
                        Layer3DProps props3D = getLayer3DProps(lyr);
634
                        int type = props3D.getType();
635
                        // in pilot, limit to 1 the number of elevation layers
636
                        if (type == Layer3DProps.layer3DElevation && typeOrder[type] == 1) {
637
                                JOptionPane.showMessageDialog((Component) PluginServices
638
                                                .getMainFrame(), PluginServices.getText(this,
639
                                                "Only_one_elevation_messg"), PluginServices.getText(
640
                                                this, "Only_one_elevation_title"),
641
                                                JOptionPane.INFORMATION_MESSAGE);
642
                                return -1; // error value
643
                        }
644

    
645
                        // stores new order in properties 3D, but doesn't reorder internal
646
                        // layer lists
647
                        props3D.setTocOrder(typeOrder[type]);
648
                        typeOrder[type] += 1;
649

    
650
                        if (layer == lyr) {
651
                                resultOrder = props3D.getTocOrder();
652
                                ArrayList layerList = (ArrayList) m_layerLists.get(type);
653
                                if (resultOrder == layerList.size()
654
                                                || layerList.get(resultOrder) != layer)
655
                                        layerList.add(resultOrder, layer);
656
                        }
657
                }
658

    
659
                return resultOrder;
660
        }
661

    
662
        private int removeLayerByType(FLayer layer) {
663

    
664
                Layer3DProps props3D = getLayer3DProps(layer);
665
                ArrayList layerList = (ArrayList) m_layerLists.get(props3D.getType());
666
                int currentOrder = props3D.getTocOrder();
667
                if (currentOrder == -1)
668
                        return -1;
669

    
670
                layerList.remove(currentOrder);
671

    
672
                for (int i = currentOrder; i < layerList.size(); i++) {
673
                        FLayer lyrAux = (FLayer) layerList.get(i);
674
                        Layer3DProps props3DAux = getLayer3DProps(lyrAux);
675
                        props3DAux.setTocOrder(i);
676
                }
677
                return currentOrder;
678
        }
679

    
680
        private void CreateVectors(FLayer layer, Layer3DProps props3D) {
681
                if (m_planet == null || m_viewProjection == null)
682
                        return;
683

    
684
                VectorCacheService cacheService = (VectorCacheService) props3D
685
                                .getCacheService();
686
                if (cacheService == null) {
687
                        cacheService = new VectorCacheService(m_canvas3d, m_planet, props3D
688
                                        .getCacheName(), layer, m_viewProjection);
689
                        cacheService.setCacheRootDir(Layer3DProps.m_cacheDir);
690
                        props3D.setCacheService(cacheService);
691
                }
692

    
693
                // use VectorCacheService to add features to planet
694
                cacheService.AddFeaturesToPlanet();
695
        }
696

    
697
        private void DeleteVectors(FLayer layer, Layer3DProps props3D) {
698
                if (m_planet == null || m_viewProjection == null)
699
                        return;
700

    
701
                VectorCacheService cacheService = (VectorCacheService) props3D
702
                                .getCacheService();
703
                if (cacheService != null) {
704
                        // use VectorCacheService to delete features to planet
705
                        cacheService.DeleteFeaturesToPlanet();
706
                }
707
        }
708

    
709
        /**
710
         * Sets the given zoom extent to the view
711
         * 
712
         * @param extent
713
         *            The extent to zoom to.
714
         */
715
        public void zoomToExtent(Rectangle2D geoExtent) {
716
                double maxHeight = 0.0;
717

    
718
                // Getting extent positions
719
                double minLat = geoExtent.getMinY();
720
                double maxLat = geoExtent.getMaxY();
721
                double cenLon = geoExtent.getCenterX();
722
                double cenLat = geoExtent.getCenterY();
723

    
724
                double elevation = 0;
725

    
726
                // calculate altitude
727
                double avLat = 0;
728
                if (minLat > 0.0 || maxLat < 0.0)
729
                        avLat = Math.min(Math.abs(minLat), Math.abs(maxLat));
730
                double avLon = Math.min(180.0, geoExtent.getWidth());
731

    
732
                double planetRadius = m_planet.getRadiusEquatorial();
733
                double radiusLat = planetRadius * Math.cos(Math.toRadians(avLat));
734
                double deltaLon = Math.sqrt(2 * radiusLat * radiusLat
735
                                * (1 - Math.cos(Math.toRadians(avLon))));
736
                double deltaLat = Math.sqrt(2 * planetRadius * planetRadius
737
                                * (1 - Math.cos(Math.toRadians(geoExtent.getHeight()))));
738

    
739
                double zoomFactor = 1.5;
740
                elevation = (Math.max(deltaLon, deltaLat) * zoomFactor) + maxHeight;
741

    
742
                // Calculate XYZ positions for camera.
743

    
744
                int planetType = this.m_planet.getCoordinateSystemType();
745

    
746
                Vec3 eye = new Vec3();
747
                Vec3 center = new Vec3();
748
                Vec3 up = new Vec3();
749
                // Calculate positions for PLAIN MODE.
750
                if (planetType == Planet.CoordinateSystemType.PROJECTED) {
751

    
752
                        double difx = (geoExtent.getMaxX() - geoExtent.getX()) / 1.2d;
753
                        double dify = (geoExtent.getMaxY() - geoExtent.getY()) / 1.2d;
754
                        double height;
755

    
756
                        height = Math.sqrt(difx * difx + dify * dify);
757

    
758
                        // EYE
759
                        eye.setX(cenLon);
760
                        eye.setY(cenLat);
761
                        eye.setZ(height);
762
                        // eye.setZ(5000000 * 4.6);
763
                        // CENTER
764
                        center.setX(cenLon);
765
                        center.setY(cenLat);
766
                        center.setZ(0.0);
767
                        // UP
768
                        up.setX(0.0);
769
                        up.setY(1.0);
770
                        up.setZ(0.0);
771
                } else
772
                // Calculate positions for SPHERICAL MODE.
773
                if (planetType == Planet.CoordinateSystemType.GEOCENTRIC) {
774
                        // EYE
775
                        Vec3 aux = new Vec3(cenLat, cenLon, elevation);
776
                        eye = m_planet.convertLatLongHeightToXYZ(aux);
777
                        // CENTER
778
                        center.setX(0.0);
779
                        center.setY(0.0);
780
                        center.setZ(0.0);
781
                        // UP
782
                        up.setX(0.0);
783
                        up.setY(0.0);
784
                        up.setZ(1.0);
785
                }
786
                Camera cam = new Camera();
787
                cam.setViewByLookAt(eye, center, up);
788

    
789
                // UtilCoord.imprimeCamara(cam);
790

    
791
                planetViewer.setCamera(cam);
792
                // REPAINTING VIEWER
793
                if (m_canvas3d != null)
794
                        m_canvas3d.repaint();
795

    
796
        }
797

    
798
        // Makes sure layer's projection is the same as MapContext's
799

    
800
        private void checkProjection(FLayer lyr, IProjection viewProj) {
801
                if (lyr instanceof FLyrVect) {
802
                        FLyrVect lyrVect = (FLyrVect) lyr;
803
                        IProjection proj = lyr.getProjection();
804
                        // Make sure projection is the same than the view
805
                        if (proj == null) {
806
                                // 
807
                                lyrVect.setProjection(viewProj);
808
                                return;
809
                        }
810
                        if (lyr instanceof FLyrVect) {
811
                                // Comprobar que la projecci�n es la misma que la vista
812
                                if (proj == null) {
813
                                        // SUPONEMOS que la capa est� en la proyecci�n que
814
                                        // estamos pidiendo (que ya es mucho suponer, ya).
815
                                        lyrVect.setProjection(getViewPort().getProjection());
816
                                        return;
817
                                }
818
                                int option = JOptionPane.YES_OPTION;
819
                                if (proj != getViewPort().getProjection()) {
820
                                        option = JOptionPane.showConfirmDialog(
821
                                                        (Component) PluginServices.getMainFrame(),
822
                                                        PluginServices.getText(AddLayer.class,
823
                                                                        "reproyectar_aviso")
824
                                                                        + "\n"
825
                                                                        + PluginServices.getText(AddLayer.class,
826
                                                                                        "Capa") + ": " + lyrVect.getName(),
827
                                                        PluginServices.getText(AddLayer.class,
828
                                                                        "reproyectar_pregunta"),
829
                                                        JOptionPane.YES_NO_OPTION);
830

    
831
                                        if (option != JOptionPane.OK_OPTION) {
832
                                                return;
833
                                        }
834

    
835
                                        ICoordTrans ct = proj.getCT(getViewPort().getProjection());
836
                                        lyrVect.setCoordTrans(ct);
837
                                        System.err.println("coordTrans = " + proj.getAbrev() + " "
838
                                                        + getViewPort().getProjection().getAbrev());
839
                                }
840
                        }
841

    
842
                        /*******************************************************************
843
                         * Version compatible con 1.0.2 y no con el HEAD
844
                         */
845

    
846
                        // if (proj != viewProj) {
847
                        // int option = JOptionPane.YES_OPTION;
848
                        // if (!CRSFactory.doesRigurousTransformations()) {
849
                        // option = JOptionPane.showConfirmDialog(null, PluginServices
850
                        // .getText(this, "reproyectar_aviso"), PluginServices
851
                        // .getText(this, "reproyectar_pregunta"),
852
                        // JOptionPane.YES_NO_OPTION);
853
                        // }
854
                        //
855
                        // if (option == JOptionPane.NO_OPTION) {
856
                        // return;
857
                        // } else {
858
                        // ICoordTrans ct = proj.getCT(viewProj);
859
                        // lyrVect.setCoordTrans(ct);
860
                        // System.err.println("coordTrans = " + proj.getAbrev() + " "
861
                        // + viewProj.getAbrev());
862
                        // }
863
                        // }
864
                }
865
        }
866

    
867
        /** * CALLBACKS for Tiles ** */
868

    
869
        public void tileCreated(TileEvent evt) {
870
                int textureStage = 0;
871
                int MDTStage = 0;
872

    
873
                SingleLayerIterator lyrIterator = new SingleLayerIterator(layers);
874
                while (lyrIterator.hasNext()) {
875
                        FLayer lyr = lyrIterator.next();
876

    
877
                        Layer3DProps props3D = getLayer3DProps(lyr);
878
                        int dataType = props3D.getType();
879

    
880
                        if (lyr.isVisible()) { // if (true) {
881
                                if (dataType == Layer3DProps.layer3DVector)
882
                                        continue; // get/create cache service
883
                                FLayerCacheService cacheService = (FLayerCacheService) props3D
884
                                                .getCacheService();
885
                                if (cacheService == null) {
886
                                        cacheService = new FLayerCacheService(m_planet, props3D
887
                                                        .getCacheName(), lyr, m_viewProjection);
888
                                        cacheService.setCacheRootDir(Layer3DProps.m_cacheDir);
889
                                        props3D.setCacheService(cacheService);
890
                                }
891

    
892
                                Point tileIndices = new Point(evt.getX(), evt.getY());
893
                                TileNum tileNum = new TileNum(evt.getLevel(), tileIndices);
894
                                String tileFileName;
895

    
896
                                double minX = evt.getMinX();
897
                                double minY = evt.getMinY();
898
                                double width = evt.getMaxX() - evt.getMinX();
899
                                double height = evt.getMaxY() - evt.getMinY();
900

    
901
                                Rectangle2D extent = new Rectangle2D.Double(minX, minY, width,
902
                                                height);
903
                                if (cacheService.intersectsLayer(extent)) { // extent test                                
904
                                // if (cacheService.intersectsLayer(extent)) { // extent test
905
//                                        System.out.println("Extent del evento del tilenum "
906
//                                                        + tileNum + minX + " " + minY + " " + width + " "
907
//                                                        + height);
908
                                        try {
909
                                                //tileFileName = cacheService.getTileAsFName(tileNum);
910
                                                 tileFileName = cacheService.getTileAsFName(tileNum,extent);
911
                                                //System.err.println("tile num " + tileNum);
912
                                                //System.err.println("nombre fichero " + tileFileName);
913
                                        } catch (Exception e) {
914
                                                return;
915
                                        }
916

    
917
                                        if (dataType == Layer3DProps.layer3DImage) {
918
                                                // float opacity = 1.0f;
919
                                                String fileExtension = "png";
920
                                                m_planet.setTexture(evt.getTilePagedLod(),
921
                                                                tileFileName, textureStage);
922
                                                m_planet.setTextureOpacityLayer(textureStage, props3D
923
                                                                .getOpacity());
924
                                                textureStage++;
925
                                        } else if (dataType == Layer3DProps.layer3DElevation) {
926
                                                String fileExtension = "tif";
927
                                                m_planet.setHeightfield(evt.getTilePagedLod(),
928
                                                                tileFileName, MDTStage);
929
                                                m_planet.setVerticalExaggerationLayer(MDTStage, props3D
930
                                                                .getVerticalEx());
931
                                                MDTStage++;
932
                                        }
933
                                } else { // no intersection
934
                                        if (dataType == Layer3DProps.layer3DImage) {
935
                                                m_planet.setTexture(evt.getTilePagedLod(), "",
936
                                                                textureStage++);
937
                                        }
938
                                        if (dataType == Layer3DProps.layer3DElevation) {
939
                                                m_planet.setHeightfield(evt.getTilePagedLod(), "",
940
                                                                MDTStage);
941
                                        }
942
                                }
943
                        } else {
944
                                if (dataType == Layer3DProps.layer3DImage) {
945
                                        textureStage++;
946
                                }
947
                                if (dataType == Layer3DProps.layer3DElevation) {
948
                                        MDTStage++;
949
                                }
950
                        } // REPAINTING VIEWER
951
                        if (m_canvas3d != null)
952
                                m_canvas3d.repaint();
953
                }
954
        }
955

    
956
        public void requestMDTLayer(TileEvent evt) {
957

    
958
                // TODO : All this method are not tested
959
                // ignore for now
960

    
961
                /* ********** UNCOMENT FOR TEST IT *************************** */
962
                int order = evt.getRequestedLayer();
963
                ArrayList imageLayers = (ArrayList) m_layerLists
964
                                .get(Layer3DProps.layer3DElevation);
965
                FLayer layer = (FLayer) imageLayers.get(order);
966
                if ((layer == null) || (!layer.isVisible()))
967
                        return;
968

    
969
                Layer3DProps props3D = getLayer3DProps(layer);
970
                // get/create cache service
971
                FLayerCacheService cacheService = (FLayerCacheService) props3D
972
                                .getCacheService();
973
                if (cacheService == null) {
974
                        cacheService = new FLayerCacheService(m_planet, props3D
975
                                        .getCacheName(), layer, m_viewProjection);
976
                        cacheService.setCacheRootDir(Layer3DProps.m_cacheDir);
977
                        props3D.setCacheService(cacheService);
978
                }
979

    
980
                int dataType = props3D.getType();
981
                Point tileIndices = new Point(evt.getX(), evt.getY());
982
                TileNum tileNum = new TileNum(evt.getLevel(), tileIndices);
983

    
984
                String tileFileName;
985
                double minX = evt.getMinX();
986
                double minY = evt.getMinY();
987
                double width = evt.getMaxX() - evt.getMinX();
988
                double height = evt.getMaxY() - evt.getMinY();
989

    
990
                Rectangle2D extent = new Rectangle2D.Double(minX, minY, width, height);
991
                if (cacheService.intersectsLayer(extent)) { // extent test
992
                // if (cacheService.intersectsLayer(extent)) {
993
//                        System.out.println("Extetn del evento " + minX + " " + minY + " "
994
//                                        + width + " " + height);
995
                        try {
996
                                // tileFileName = cacheService.getTileAsFName(tileNum,extent);
997
                                tileFileName = cacheService.getTileAsFName(tileNum, extent);
998
                        } catch (Exception e) {
999
                                return;
1000
                        }
1001

    
1002
                        if (dataType == Layer3DProps.layer3DElevation) {
1003
                                String fileExtension = "tif";
1004
                                // evt.getTilePagedLod().setHeightField(tileFileName,
1005
                                // fileExtension, order);
1006
                                m_planet.setHeightfield(evt.getTilePagedLod(), tileFileName,
1007
                                                order);
1008
                                // m_planet.setVerticalExaggeration(order,
1009
                                // ((ProjectView3D) this.m_viewProjection)
1010
                                // .getVerticalExaggeration());
1011
                                m_planet.setVerticalExaggerationLayer(order, props3D
1012
                                                .getVerticalEx());
1013

    
1014
                        }
1015
                } else { // no intersection for elevation layer
1016
                        // This code are not correctly for elevation layer
1017
                        if (dataType == Layer3DProps.layer3DImage) {
1018
                                m_planet.setHeightfield(evt.getTilePagedLod(), "", order);
1019
                                // evt.getTilePagedLod().setHeightField("", "", order);
1020
                        }
1021
                }
1022

    
1023
                // REPAINTING VIEWWER
1024
                if (m_canvas3d != null)
1025
                        m_canvas3d.repaint();
1026

    
1027
        }
1028

    
1029
        public void requestTextureLayer(TileEvent evt) {
1030

    
1031
                int order = evt.getRequestedLayer();
1032
                ArrayList imageLayers = (ArrayList) m_layerLists
1033
                                .get(Layer3DProps.layer3DImage);
1034

    
1035
                // if there are not one layer return
1036
                if (imageLayers.size() == 0)
1037
                        return;
1038
                FLayer layer = (FLayer) imageLayers.get(order);
1039
                if ((layer == null) || (!layer.isVisible()))
1040
                        return;
1041

    
1042
                Layer3DProps props3D = getLayer3DProps(layer);
1043
                // get/create cache service
1044
                FLayerCacheService cacheService = (FLayerCacheService) props3D
1045
                                .getCacheService();
1046
                if (cacheService == null) {
1047
                        cacheService = new FLayerCacheService(m_planet, props3D
1048
                                        .getCacheName(), layer, m_viewProjection);
1049
                        cacheService.setCacheRootDir(Layer3DProps.m_cacheDir);
1050
                        props3D.setCacheService(cacheService);
1051
                }
1052

    
1053
                int dataType = props3D.getType();
1054
                Point tileIndices = new Point(evt.getX(), evt.getY());
1055
                TileNum tileNum = new TileNum(evt.getLevel(), tileIndices);
1056

    
1057
                String tileFileName;
1058
                double minX  = evt.getMinX();
1059
                double minY = evt.getMinY();
1060
                double width = evt.getMaxX() - evt.getMinX();
1061
                double height = evt.getMaxY() - evt.getMinY();
1062

    
1063
                Rectangle2D extent = new Rectangle2D.Double(minX, minY, width, height);
1064
                if (cacheService.intersectsLayer(extent)) { // extent test
1065
                // if (cacheService.intersectsLayer(extent)) {
1066
                        try {
1067
                                 tileFileName = cacheService.getTileAsFName(tileNum,extent);
1068
                                //tileFileName = cacheService.getTileAsFName(tileNum);
1069
                                // System.err.println("tile num " + tileNum);
1070
                                // System.err.println("nombre fichero " + tileFileName);
1071
                        } catch (Exception e) {
1072
                                return;
1073
                        }
1074

    
1075
                        if (dataType == Layer3DProps.layer3DImage) {
1076
                                // float opacity = 1.0f;
1077
                                String fileExtension = "png";
1078
                                // @TODO:aplicar texturas al planeta
1079
                                // evt.getTilePagedLod().setTexture(tileFileName, fileExtension,
1080
                                // order);
1081
                                m_planet.setTexture(evt.getTilePagedLod(), tileFileName, order);
1082
                                m_planet.setTextureOpacityLayer(order, props3D.getOpacity());
1083
                        }
1084
                        /*
1085
                         * else { String fileExtension = "tif";
1086
                         * evt.getTilePagedLod().setHeightField(tileFileName,
1087
                         * fileExtension); }
1088
                         */
1089
                } else { // no intersection
1090
                        if (dataType == Layer3DProps.layer3DImage) {
1091
                                m_planet.setTexture(evt.getTilePagedLod(), "", order);
1092
                                // evt.getTilePagedLod().setTexture("", "", order);
1093
                        }
1094
                }
1095

    
1096
                // REPAINTING VIEWWER
1097
                if (m_canvas3d != null)
1098
                        m_canvas3d.repaint();
1099
        }
1100

    
1101
        private void PrintDebugLayers() {
1102
                System.out.println("===========================");
1103
                for (int iList = 0; iList < 3; iList++) {
1104
                        ArrayList layerList = (ArrayList) m_layerLists.get(iList);
1105
                        System.out.println("===== List " + iList + "=====");
1106
                        for (int iLayer = 0; iLayer < layerList.size(); iLayer++) {
1107
                                FLayer layer = (FLayer) layerList.get(iLayer);
1108
                                System.out.println("  Layer " + layer.getName());
1109
                                Layer3DProps props3D = getLayer3DProps(layer);
1110
                                System.out.println("    Type " + props3D.getType());
1111
                                System.out.println("    TOC Order " + props3D.getTocOrder());
1112
                                System.out.println("    Planet Order "
1113
                                                + props3D.getPlanetOrder());
1114
                        }
1115
                }
1116
        }
1117

    
1118
        /**
1119
         * Crea un nuevo MapContext(3D) a partir del XMLEntity.
1120
         * 
1121
         * @param xml
1122
         *            XMLEntity
1123
         * 
1124
         * @return Nuevo MapContext3D.
1125
         * 
1126
         * @throws XMLException
1127
         */
1128
        public static MapContext createFromXML(XMLEntity xml) throws XMLException {
1129
                ViewPort3D vp = (ViewPort3D) ViewPort3D.createFromXML(xml.getChild(0));
1130

    
1131
                FLayers layers = new FLayers3D(null, null, vp);
1132
                layers.setXMLEntity(xml.getChild(1));
1133

    
1134
                MapContext fmap = layers.getMapContext();
1135

    
1136
                return fmap;
1137
        }
1138

    
1139
        public static MapContext createFromXML03(XMLEntity xml) throws XMLException {
1140
                ViewPort vp = ViewPort.createFromXML03(xml.getChild(0));
1141

    
1142
                FLayers layers = new FLayers3D(null, null, vp);
1143
                layers.setXMLEntity03(xml.getChild(1));
1144

    
1145
                MapContext fmap = layers.getMapContext();
1146

    
1147
                return fmap;
1148
        }
1149

    
1150
        public GraphicLayer getGraphicsLayer() {
1151
                GraphicLayer3D gra3D = new GraphicLayer3D(this.planetViewer,
1152
                                getPlanet());
1153
                return gra3D;
1154
        }
1155

    
1156
        public Node getSpecialNode() {
1157
                return planetViewer.getSpecialNode(0);
1158
        }
1159

    
1160
        public ViewPort getViewPort() {
1161

    
1162
                ViewPort3D vp = (ViewPort3D) super.getViewPort();
1163

    
1164
                if (m_canvas3d != null)
1165
                        vp.setImageSize(new Dimension(planetViewer.getWidth(), planetViewer
1166
                                        .getHeight()));
1167
                vp.setPlanet(this.getPlanet());
1168
                vp.setViewer(this.m_canvas3d);
1169

    
1170
                return vp;
1171
        }
1172

    
1173
        /**
1174
         * M�todo de conveniencia que se usa provisionalmente para solicitar un
1175
         * refresco de todo lo que dependa del FMap (MapContext). Esto provocar�
1176
         * un evento de cambio de orden de capas que obligar� a redibujar todo lo
1177
         * que depende de FMap (TOC, MapControl, FFrameView, etc).
1178
         */
1179
        public void invalidate() {
1180
                ViewPort3D vp = (ViewPort3D) super.getViewPort();
1181
                if (vp.getDirty()) {
1182
                        vp.setDirty(false);
1183
                        // extentAux = vport.getExtent();
1184
                        
1185
                        //Comento el zoom pq no kiero q me lo haga y me cambie la vista cuando repinto
1186
                        
1187
                        //this.zoomToExtent(vp.getExtent());
1188
                        // System.out.println("extend seleccionado: \n Centro: "
1189
                        // + extentAux.getCenterX() + "\n Alto: " + extentAux.getHeight()
1190
                        // + "\n Ancho: " + extentAux.getWidth());
1191

    
1192
                        // TEST
1193

    
1194
                        // Updating all the layers. This operation synchronize the
1195
                        // transparency layer with layer transparency planet layer.
1196
                        // Getting all selected Extent
1197

    
1198
                }
1199
                FLayer[] selectedExtent = getLayers().getActives();
1200
                
1201
                if (selectedExtent.length > 0) {
1202
                        for (int i = 0; i < selectedExtent.length; i++) {
1203
                                if (selectedExtent[0].isAvailable()) {
1204
                                        
1205
                                        FLayer lyr3D = selectedExtent[i];
1206
                                        Layer3DProps layer3DProps = Layer3DProps
1207
                                        .getLayer3DProps(lyr3D);
1208
                                        
1209
                                        int order = layer3DProps.getPlanetOrder();
1210
                                        // float opacity = layer3DProps.getOpacity();
1211
                                        float opacity = (((FLyrDefault) lyr3D)
1212
                                                        .getTransparency())
1213
                                                        / (float) 255;
1214
                                        // Notify the opacity to planet
1215
                                        this.m_planet.setTextureOpacityLayer(order, opacity);
1216
                                }
1217
                        }
1218
                        
1219
                }
1220
                // super.invalidate();
1221

    
1222
                m_canvas3d.repaint();
1223
        }
1224
}