Statistics
| Revision:

root / trunk / libraries / lib3DMap / src / org / gvsig / gvsig3d / map3d / MapContext3D.java @ 24882

History | View | Annotate | Download (48.1 KB)

1
package org.gvsig.gvsig3d.map3d;
2

    
3
import java.awt.Component;
4
import java.awt.Dimension;
5
import java.awt.Graphics2D;
6
import java.awt.Point;
7
import java.awt.geom.AffineTransform;
8
import java.awt.geom.Rectangle2D;
9
import java.awt.image.BufferedImage;
10
import java.awt.image.ImagingOpException;
11
import java.awt.image.RenderedImage;
12
import java.io.File;
13
import java.io.IOException;
14
import java.util.ArrayList;
15

    
16
import javax.print.attribute.PrintRequestAttributeSet;
17
import javax.swing.JOptionPane;
18

    
19
import org.apache.log4j.Logger;
20
import org.cresques.cts.IProjection;
21
import org.gvsig.cacheservice.TileNum;
22
import org.gvsig.gvsig3d.cacheservices.FLayerCacheService;
23
import org.gvsig.gvsig3d.cacheservices.OSGCacheService;
24
import org.gvsig.gvsig3d.cacheservices.VectorCacheService;
25
import org.gvsig.gvsig3d.drivers.GvsigDriverOSG;
26
import org.gvsig.gvsig3d.map3d.layers.FLayers3D;
27
import org.gvsig.osgvp.Image;
28
import org.gvsig.osgvp.Matrix;
29
import org.gvsig.osgvp.Node;
30
import org.gvsig.osgvp.Vec3;
31
import org.gvsig.osgvp.Vec4;
32
import org.gvsig.osgvp.exceptions.image.ImageConversionException;
33
import org.gvsig.osgvp.exceptions.node.ChildIndexOutOfBoundsExceptions;
34
import org.gvsig.osgvp.exceptions.node.NodeException;
35
import org.gvsig.osgvp.planets.Planet;
36
import org.gvsig.osgvp.planets.PlanetViewer;
37
import org.gvsig.osgvp.planets.RequestLayerEvent;
38
import org.gvsig.osgvp.planets.RequestLayerListener;
39
import org.gvsig.osgvp.viewer.Camera;
40
import org.gvsig.osgvp.viewer.IViewerContainer;
41
import org.gvsig.osgvp.viewer.PrintUtilities;
42

    
43
import com.hardcode.driverManager.Driver;
44
import com.hardcode.gdbms.driver.exceptions.ReadDriverException;
45
import com.iver.ai2.gvsig3d.map3d.layers.Layer3DProps;
46
import com.iver.andami.PluginServices;
47
import com.iver.andami.messages.NotificationManager;
48
import com.iver.cit.gvsig.exceptions.expansionfile.ExpansionFileReadException;
49
import com.iver.cit.gvsig.fmap.MapContext;
50
import com.iver.cit.gvsig.fmap.ViewPort;
51
import com.iver.cit.gvsig.fmap.layers.FBitSet;
52
import com.iver.cit.gvsig.fmap.layers.FLayer;
53
import com.iver.cit.gvsig.fmap.layers.FLayers;
54
import com.iver.cit.gvsig.fmap.layers.FLyrDefault;
55
import com.iver.cit.gvsig.fmap.layers.FLyrVect;
56
import com.iver.cit.gvsig.fmap.layers.FLyrWCS;
57
import com.iver.cit.gvsig.fmap.layers.GraphicLayer;
58
import com.iver.cit.gvsig.fmap.layers.LayerEvent;
59
import com.iver.cit.gvsig.fmap.layers.LayerListener;
60
import com.iver.cit.gvsig.fmap.layers.LegendChangedEvent;
61
import com.iver.cit.gvsig.fmap.layers.SelectableDataSource;
62
import com.iver.cit.gvsig.fmap.layers.SelectionEvent;
63
import com.iver.cit.gvsig.fmap.layers.SelectionListener;
64
import com.iver.cit.gvsig.fmap.layers.SelectionSupport;
65
import com.iver.cit.gvsig.fmap.layers.SingleLayerIterator;
66
import com.iver.cit.gvsig.fmap.layers.XMLException;
67
import com.iver.cit.gvsig.fmap.layers.layerOperations.Classifiable;
68
import com.iver.cit.gvsig.fmap.rendering.ILegend;
69
import com.iver.cit.gvsig.fmap.rendering.IVectorLegend;
70
import com.iver.cit.gvsig.fmap.rendering.LegendListener;
71
import com.iver.utiles.XMLEntity;
72
import com.iver.utiles.swing.threads.Cancellable;
73

    
74
public class MapContext3D extends MapContext implements RequestLayerListener,
75
                LayerListener, LegendListener, SelectionListener {
76

    
77
        // JOSG library objects
78
        private Planet m_planet;
79

    
80
        private IViewerContainer m_canvas3d;
81

    
82
        private PlanetViewer planetViewer;
83

    
84
        // separate lists for image, elevation and vector layers
85
        private ArrayList m_layerLists = new ArrayList();
86

    
87
        private IProjection m_viewProjection;
88

    
89
        private float verticalExageration;
90

    
91
        private boolean m_bEmptyView = true;
92

    
93
        private boolean m_bListenToLegend = true;
94

    
95
        private boolean m_bLoading = false;
96

    
97
        private FLayers lyrs;
98

    
99
        private PlanetViewer canvasoff = null;
100

    
101
        private PlanetViewer canvasPrint;
102

    
103
        private boolean renewCanvasOff = false;
104

    
105
        private static Logger logger = Logger.getLogger(MapContext3D.class
106
                        .getName());
107

    
108
        PlanetViewer printViewer = null;
109

    
110
        @Override
111
        public void draw(BufferedImage image, Graphics2D g, Cancellable cancel,
112
                        double scale) throws ReadDriverException {
113

    
114
                // Rectangle r = new Rectangle((int) getViewPort().getOffset().getX(),
115
                // (int) getViewPort().getOffset().getY(), image.getWidth(), image
116
                // .getHeight());
117

    
118
                double x = getViewPort().getOffset().getX();
119
                double y = getViewPort().getOffset().getY();
120
                double w = image.getWidth();
121
                double h = image.getHeight();
122

    
123
                // double x = r.getMinX();
124
                // double y = r.getMinY();
125
                // double w = r.getWidth();
126
                // double h = r.getHeight();
127

    
128
                // if ((canvasoff == null) || (isRenewCanvasOff())) {
129
                if (canvasoff == null) {
130
                        try {
131
                                canvasoff = new PlanetViewer();
132
                                canvasoff.setUpViewerInBackground(0, 0, 512, 512);
133
                                canvasoff.addPlanet(((PlanetViewer) m_canvas3d.getOSGViewer())
134
                                                .getPlanet(0));
135
                                canvasoff.addSpecialNode((((PlanetViewer) m_canvas3d
136
                                                .getOSGViewer()).getSpecialNodes()));
137
                                Vec4 color = ((PlanetViewer) m_canvas3d.getOSGViewer())
138
                                                .getClearColor();
139
                                canvasoff.setClearColor(color.x(), color.y(), color.z(), color
140
                                                .w());
141
                                this.setRenewCanvasOff(false);
142
                        } catch (NodeException e) {
143
                                // TODO Auto-generated catch block
144
                                e.printStackTrace();
145
                        }
146

    
147
                }
148

    
149
                Camera refCam = m_canvas3d.getOSGViewer().getCamera();
150
                Matrix refView = refCam.getViewMatrix();
151
                Matrix refProy = refCam.getProjectionMatrix();
152
                Matrix.Perspective pers = refProy.getPerspective();
153
                Camera viewCam = new Camera();
154
                viewCam.setProjectionMatrixAsPerspective(pers.fovy, w / h, pers.zNear,
155
                                pers.zFar);
156
                viewCam.setViewMatrix(refView);
157
                // canvasoff.setSceneData(m_canvas3d.getOSGViewer().getSceneData());
158
                canvasoff.setViewport(0, 0, (int) w, (int) h);
159
                canvasoff.setCamera(viewCam);
160
                // System.err.println("w: " +w);
161
                // System.err.println("h: " +h);
162
                canvasoff.takeScreenshotToMemory();
163
                canvasoff.frame();
164
                // canvasoff.setPolygonMode(OSGViewer.PolygonModeType.GL_LINE);
165

    
166
                Image OSGimage = canvasoff.getScreenshotImage();
167

    
168
                BufferedImage img = null;
169
                try {
170
                        img = OSGimage.getBufferedImage();
171
                } catch (ImageConversionException e1) {
172
                        // TODO Auto-generated catch block
173
                        e1.printStackTrace();
174
                } catch (IOException e1) {
175
                        // TODO Auto-generated catch block
176
                        e1.printStackTrace();
177
                }
178

    
179
                double scalex = w / img.getWidth(null);
180
                double scaley = h / img.getHeight(null);
181
                try {
182
                        AffineTransform xform = AffineTransform.getScaleInstance(scalex,
183
                                        scaley);
184
                        AffineTransform xpos = AffineTransform.getTranslateInstance(x, y);
185
                        xpos.concatenate(xform);
186
                        g.drawRenderedImage(img, xpos);
187
                        // g.drawRenderedImage(img, new AffineTransform());
188
                } catch (ImagingOpException e) {
189
                        NotificationManager.addError("Dibujando FFramePicture", e);
190
                }
191

    
192
        }
193

    
194
        public void print(Graphics2D g, double scale, PrintRequestAttributeSet arg2)
195
                        throws ReadDriverException {
196

    
197
                int x = (int) getViewPort().getOffset().getX();
198
                int y = (int) getViewPort().getOffset().getY();
199
                int w = (int) g.getClipBounds().getWidth();
200
                int h = (int) g.getClipBounds().getHeight();
201
                System.err.println("x " + x + "; y " + y + "; w " + w + "; h" + h);
202

    
203
                Camera viewerCam = m_canvas3d.getOSGViewer().getCamera();
204
                // System.out.println("projmat"
205
                // + viewerCam.getProjectionMatrix().toString());
206
                BufferedImage s = null;
207

    
208
                try {
209
                        int minw = (int) w / 10;
210
                        int minh = (int) h / 10;
211
                        System.out.println("minw" + minw + " minh" + minh);
212

    
213
                        // if (printViewer == null) {
214
                        printViewer = new PlanetViewer();
215

    
216
                        printViewer.addPlanet(((PlanetViewer) m_canvas3d.getOSGViewer())
217
                                        .getPlanet(0));
218
                        printViewer.addSpecialNode((((PlanetViewer) m_canvas3d
219
                                        .getOSGViewer()).getSpecialNodes()));
220
                        Vec4 color = ((PlanetViewer) m_canvas3d.getOSGViewer())
221
                                        .getClearColor();
222
                        printViewer.setClearColor(color.x(), color.y(), color.z(), color
223
                                        .w());
224
                        // }
225
                        printViewer.setUpViewerInBackground(0, 0, minw, minh);
226
                        // printViewer.addPlanet(((PlanetViewer) m_canvas3d.getOSGViewer())
227
                        // .getPlanet(0));
228

    
229
                        // printViewer.setSceneData(((PlanetViewer)
230
                        // m_canvas3d.getOSGViewer())
231
                        // .getScene());
232

    
233
                        // printViewer.setPolygonMode(OSGViewer.PolygonModeType.GL_LINE);
234

    
235
                        PrintUtilities util = new PrintUtilities();
236
                        util.setViewer(printViewer);
237
                        s = util.getHighResolutionImage(viewerCam, w, h);
238

    
239
                        RenderedImage render = s;
240
                } catch (NodeException e1) {
241
                        // TODO Auto-generated catch block
242
                        e1.printStackTrace();
243
                }
244

    
245
                double scalex = w / s.getWidth(null);
246
                double scaley = h / s.getHeight(null);
247
                try {
248
                        AffineTransform xform = AffineTransform.getScaleInstance(scalex,
249
                                        scaley);
250
                        AffineTransform xpos = AffineTransform.getTranslateInstance(x, y);
251
                        xpos.concatenate(xform);
252
                        g.drawRenderedImage(s, xpos);
253
                        // g.drawRenderedImage(img, new AffineTransform());
254
                } catch (ImagingOpException e) {
255
                        NotificationManager.addError("Dibujando FFramePicture", e);
256
                }
257
                printViewer.releaseGLContext();
258
                printViewer.dispose();
259
                System.gc();
260
        }
261

    
262
        public MapContext3D(ViewPort vp) {
263
                super(vp);
264

    
265
                ArrayList textureLayers = new ArrayList();
266
                ArrayList elevationLayers = new ArrayList();
267
                ArrayList vectorLayers = new ArrayList();
268
                ArrayList OSGLayers = new ArrayList();
269
                m_layerLists.add(textureLayers);
270
                m_layerLists.add(elevationLayers);
271
                m_layerLists.add(vectorLayers);
272
                m_layerLists.add(OSGLayers);
273

    
274
                // extentAux = new Rectangle2D.Double(-180.0, 90.0, 180.0, -90.0);
275
        }
276

    
277
        public MapContext3D(FLayers fLayers, ViewPort vp) {
278
                super(fLayers, vp);
279
                ArrayList textureLayers = new ArrayList();
280
                ArrayList elevationLayers = new ArrayList();
281
                ArrayList vectorLayers = new ArrayList();
282
                ArrayList OSGLayers = new ArrayList();
283
                m_layerLists.add(textureLayers);
284
                m_layerLists.add(elevationLayers);
285
                m_layerLists.add(vectorLayers);
286
                m_layerLists.add(OSGLayers);
287

    
288
                // extentAux = new Rectangle2D.Double(-180.0, 90.0, 180.0, -90.0);
289
        }
290

    
291
        public void setPlanet(Planet planet) {
292
                if (planet == m_planet)
293
                        return;
294

    
295
                m_planet = planet;
296

    
297
                // add layers to planet
298

    
299
                for (int iType = 0; iType < 4; iType++) {
300
                        ArrayList layerList = (ArrayList) m_layerLists.get(iType);
301
                        for (int iLayer = 0; iLayer < layerList.size(); iLayer++) {
302

    
303
                                FLayer layer = (FLayer) layerList.get(iLayer);
304
                                Layer3DProps props = getLayer3DProps(layer);
305
                                props.setPlanetOrder(props.getTocOrder());
306
                                addLayerToPlanet(layer, props.getPlanetOrder(), false);
307

    
308
                                // Layer active or not
309
                                if (props.getType() == Layer3DProps.layer3DImage) {
310
                                        m_planet.setEnabledTextureLayer(props.getPlanetOrder(),
311
                                                        layer.isVisible());
312
                                }
313
                                if (props.getType() == Layer3DProps.layer3DElevation) {
314
                                        m_planet.setEnabledHeightfieldLayer(0, layer.isVisible());
315
                                }
316
                        }
317
                        if (iType == Layer3DProps.layer3DElevation && layerList.size() > 0)
318
                                m_planet.invalidateHeightfieldLayer(0);
319
                }
320
        }
321

    
322
        public Planet getPlanet() {
323
                return m_planet;
324
        }
325

    
326
        public void setViewer(IViewerContainer canvas) {
327
                m_canvas3d = canvas;
328
                this.planetViewer = (PlanetViewer) m_canvas3d.getOSGViewer();
329
        }
330

    
331
        public IProjection getViewProjection() {
332
                return m_viewProjection;
333
        }
334

    
335
        public void setViewProjection(IProjection projection) {
336
                m_viewProjection = projection;
337
        }
338

    
339
        public IViewerContainer getCanvas3d() {
340
                return m_canvas3d;
341
        }
342

    
343
        // public void setCanvas3d(IViewerContainer m_canvas3d) {
344
        // this.m_canvas3d = m_canvas3d;
345
        //                
346
        // }
347

    
348
        public float getVerticalExageration() {
349
                return verticalExageration;
350
        }
351

    
352
        public void setVerticalExageration(float verticalExageration) {
353
                this.verticalExageration = verticalExageration;
354
        }
355

    
356
        public void setLoading(boolean bLoading) {
357
                m_bLoading = bLoading;
358
        }
359

    
360
        public FLayers getNewGroupLayer(FLayers parent) {
361
                return new FLayers3D(this, parent, getViewPort());
362
        }
363

    
364
        /** * LAYER CHANGES called by FLayers3D ** */
365

    
366
        public void layerMoved(FLayers3D parent, FLayer layer, int oldPos,
367
                        int newPos) {
368

    
369
                if (layer instanceof FLayers) {
370
                        FLayers group = (FLayers) layer;
371
                        if (newPos > oldPos) {
372
                                for (int iChild = group.getLayersCount() - 1; iChild >= 0; iChild--)
373
                                        layerMoved((FLayers3D) group, group.getLayer(iChild),
374
                                                        oldPos, newPos);
375
                        } else {
376
                                for (int iChild = 0; iChild < group.getLayersCount(); iChild++)
377
                                        layerMoved((FLayers3D) group, group.getLayer(iChild),
378
                                                        oldPos, newPos);
379
                        }
380
                        return;
381
                }
382

    
383
                Layer3DProps props3D = getLayer3DProps(layer);
384
                if (props3D.getType() != Layer3DProps.layer3DImage)
385
                        return;
386

    
387
                refreshLayerOrder();
388

    
389
                ArrayList layerList = (ArrayList) m_layerLists.get(props3D.getType());
390

    
391
                // This will be more complex when we have multiple planets
392
                int currentPlanetOrder = props3D.getPlanetOrder();
393
                int newPlanetOrder = props3D.getTocOrder();
394
                if (currentPlanetOrder != newPlanetOrder) {
395
                        m_planet.reorderTextureLayer(currentPlanetOrder, newPlanetOrder);
396
                        // update planet order for all layers
397
                        for (int iLayer = 0; iLayer < layerList.size(); iLayer++) {
398
                                FLayer eachLayer = (FLayer) layerList.get(iLayer);
399
                                Layer3DProps eachProps3D = getLayer3DProps(eachLayer);
400
                                int currentPlanetOrderI = eachProps3D.getPlanetOrder();
401
                                if (currentPlanetOrder < newPlanetOrder) { // layer moves 'up'
402
                                        if (currentPlanetOrderI > currentPlanetOrder
403
                                                        && currentPlanetOrderI <= newPlanetOrder)
404
                                                eachProps3D.setPlanetOrder(currentPlanetOrderI - 1);
405
                                } else { // layer moves 'down'
406
                                        if (currentPlanetOrderI < currentPlanetOrder
407
                                                        && currentPlanetOrderI >= newPlanetOrder)
408
                                                eachProps3D.setPlanetOrder(currentPlanetOrderI + 1);
409
                                }
410
                        }
411
                        props3D.setPlanetOrder(newPlanetOrder);
412
                }
413

    
414
                // reorder all which may have changed in internal layer list
415
                ArrayList sortedLayers = new ArrayList(layerList.size());
416
                for (int iLayer = 0; iLayer < layerList.size(); iLayer++)
417
                        sortedLayers.add(null);
418

    
419
                for (int iLayer = 0; iLayer < layerList.size(); iLayer++) {
420
                        FLayer eachLayer = (FLayer) layerList.get(iLayer);
421
                        Layer3DProps eachProps3D = getLayer3DProps(eachLayer);
422
                        int newOrder = eachProps3D.getTocOrder();
423
                        sortedLayers.set(newOrder, eachLayer);
424
                }
425
                m_layerLists.set(props3D.getType(), sortedLayers);
426

    
427
                PrintDebugLayers();
428
                // REPAINTING VIEWER
429
                if (m_canvas3d != null)
430
                        m_canvas3d.repaint();
431
        }
432

    
433
        public void layerAdded(FLayers3D parent, FLayer layer) {
434

    
435
                // to add group layers to 3D, just add recursively child data layers
436
                if (layer instanceof FLayers) {
437
                        FLayers group = (FLayers) layer;
438
                        for (int iChild = 0; iChild < group.getLayersCount(); iChild++) {
439
                                layerAdded((FLayers3D) group, group.getLayer(iChild));
440
                        }
441
                        getLayer3DProps(layer).setHooked(true);
442
                        return;
443
                }
444

    
445
                if (layer instanceof Classifiable) {
446
                        Classifiable legendLyr = (Classifiable) layer;
447
                        // legendLyr.addLegendListener((LegendListener) this);
448
                        this.addLayerListener(this);
449
                }
450
                // layer.addLayerListener((LayerListener) this);
451

    
452
                // listener to manage the selection for the layers
453
                if (layer.getClass().equals(FLyrVect.class)) {
454
                        FLyrVect lyr = (FLyrVect) layer;
455
                        try {
456
                                SelectableDataSource recordSet = lyr.getRecordset();
457
                                SelectionSupport selectionSupport = recordSet
458
                                                .getSelectionSupport();
459
                                selectionSupport.addSelectionListener(this);
460
                        } catch (ReadDriverException e) {
461
                                // TODO Auto-generated catch block
462
                                e.printStackTrace();
463
                        }
464
                }
465

    
466
                // LINEAS COMETADAS PARA Q NO PREGUNTE DOS VECES QUE SI QUEREMOS
467
                // REPROYECTAR LA CAPA
468
                // SI SE COMENTA LAS LINEAS CUANDO SE COPIA Y PEGA UNA CAPA NO PREGUNTA
469
                // SI QUEREMOS REPROJECTAR
470
                // if (!m_bLoading)
471
                // checkProjection(layer, getViewPort().getProjection());
472

    
473
                int order = addLayerByType(layer);
474
                if (order == -1) {
475
                        // an error has been generated
476
                        parent.removeLayer(layer);
477
                        return;
478
                }
479

    
480
                if (!m_bLoading)
481
                        addLayerToPlanet(layer, order, true);
482

    
483
                // Only do this the first time to add layer
484
                ArrayList layerListI = (ArrayList) m_layerLists
485
                                .get(Layer3DProps.layer3DImage);
486
                ArrayList layerListV = (ArrayList) m_layerLists
487
                                .get(Layer3DProps.layer3DVector);
488

    
489
                if (m_bEmptyView && !m_bLoading) {
490
                        if (!((layerListI.size() == 1) && (layerListV.size() == 0))
491
                                        || !((layerListI.size() == 0) && (layerListV.size() == 1))) {
492
                                try {
493
                                        zoomToExtent(layer.getFullExtent());
494
                                } catch (ExpansionFileReadException e) {
495
                                        e.printStackTrace();
496
                                } catch (ReadDriverException e) {
497
                                        e.printStackTrace();
498
                                }
499
                                m_bEmptyView = false;
500
                        }
501
                }
502
                m_canvas3d.getOSGViewer().releaseGLContext();
503
                m_canvas3d.getOSGViewer().configureGLContext();
504
                PrintDebugLayers();
505
        }
506

    
507
        public void layerRemoved(FLayers3D parent, FLayer layer) {
508

    
509
                // to remove group layers to 3D, just remove recursively child data
510
                // layers
511
                if (layer instanceof FLayers) {
512
                        FLayers group = (FLayers) layer;
513
                        for (int iChild = 0; iChild < group.getLayersCount(); iChild++) {
514
                                layerRemoved((FLayers3D) group, group.getLayer(iChild));
515
                        }
516
                        getLayer3DProps(layer).setHooked(false);
517
                        return;
518
                }
519

    
520
                if (layer instanceof Classifiable) {
521
                        Classifiable legendLyr = (Classifiable) layer;
522
                        legendLyr.removeLegendListener((LegendListener) this);
523
                }
524
                layer.removeLayerListener((LayerListener) this);
525

    
526
                int order = removeLayerByType(layer);
527
                if (order == -1)
528
                        return;
529

    
530
                this.pepareLayerToRefresh(layer);
531

    
532
                // REPAINTING VIEWER
533
                if (m_canvas3d != null)
534
                        m_canvas3d.repaint();
535

    
536
                ArrayList layerListI = (ArrayList) m_layerLists
537
                                .get(Layer3DProps.layer3DImage);
538
                ArrayList layerListV = (ArrayList) m_layerLists
539
                                .get(Layer3DProps.layer3DVector);
540
                // All layers are removed
541
                if ((layerListI.size() == 0) && (layerListV.size() == 0)) {
542
                        m_bEmptyView = true;
543
                }
544

    
545
                PrintDebugLayers();
546
        }
547

    
548
        /**
549
         * DOCUMENT ME!
550
         * 
551
         * @param e
552
         *            DOCUMENT ME!
553
         */
554
        public void legendChanged(LegendChangedEvent e) {
555

    
556
                if (!m_bListenToLegend)
557
                        return;
558
                if (e == null) {
559

    
560
                        // find layer whose legend changed
561
                        FLayer found = null;
562
                        SingleLayerIterator lyrIterator = new SingleLayerIterator(layers);
563
                        while (lyrIterator.hasNext()) {
564
                                FLayer lyr = lyrIterator.next();
565
                                if (lyr instanceof FLyrVect) {
566
                                        FLyrVect lyrVect = (FLyrVect) lyr;
567
                                        long newDrawVersion = lyrVect.getDrawVersion();
568
                                        Layer3DProps props3D = getLayer3DProps(lyrVect);
569
                                        if (newDrawVersion != props3D.drawVersion){
570
                                                props3D.drawVersion = lyrVect.getDrawVersion();
571
                                                refreshLayerInPlanet(props3D, true);
572
                                                m_bListenToLegend = false;
573
                                                props3D.VerifyLegend(m_planet.getPlanetName());
574
                                                m_bListenToLegend = true;
575
                                                // REPAINTING VIWER
576
                                                if (m_canvas3d != null)
577
                                                        m_canvas3d.repaint();
578
                                        }
579
                                }
580
                        }
581
                }
582

    
583
                // IVectorLegend newLegend = (IVectorLegend) e.getNewLegend();
584
                // // find layer whose legend changed
585
                // FLayer found = null;
586
                // // found.i
587
                // SingleLayerIterator lyrIterator = new SingleLayerIterator(layers);
588
                // while (lyrIterator.hasNext()) {
589
                // FLayer lyr = lyrIterator.next();
590
                // if (lyr instanceof Classifiable) {
591
                // Classifiable classLyr = (Classifiable) lyr;
592
                // ILegend legend = classLyr.getLegend();
593
                // if (legend instanceof IVectorLegend) {
594
                // if ((IVectorLegend) legend == newLegend) {
595
                // found = lyr;
596
                // break;
597
                // }
598
                // }
599
                // }
600
                // }
601

    
602
                // if (found != null) {
603
                // Layer3DProps props3D = getLayer3DProps(found);
604
                // refreshLayerInPlanet(props3D, true);
605
                // if (found instanceof FLyrVect) {
606
                // FLyrVect fvect = (FLyrVect) found;
607
                // props3D.drawVersion = fvect.getDrawVersion();
608
                // }
609
                // m_bListenToLegend = false;
610
                // props3D.VerifyLegend(m_planet.getPlanetName());
611
                // m_bListenToLegend = true;
612
                // // REPAINTING VIWER
613
                // if (m_canvas3d != null)
614
                // m_canvas3d.repaint();
615
                // }
616
        }
617

    
618
        public void visibilityChanged(LayerEvent e) {
619
                FLayer lyr = e.getSource();
620

    
621
                Layer3DProps props3D = getLayer3DProps(lyr);
622

    
623
                if (props3D.getType() == Layer3DProps.layer3DVector) {
624
                        refreshLayerVectorsVisibility(lyr);
625
                } else {
626
                        refreshLayerVisibility(lyr);
627
                }
628
                m_canvas3d.repaint();
629
        }
630

    
631
        private void refreshLayerVisibility(FLayer layer) {
632

    
633
                Layer3DProps props3D = getLayer3DProps(layer);
634
                if (props3D.getType() == Layer3DProps.layer3DImage) {
635
                        m_planet.setEnabledTextureLayer(props3D.getPlanetOrder(), layer
636
                                        .isVisible());
637
                }
638
                if (props3D.getType() == Layer3DProps.layer3DElevation) {
639
                        m_planet.setEnabledHeightfieldLayer(0, layer.isVisible());
640
                }
641
                // REPAINTING VIEWER
642
                if (m_canvas3d != null)
643
                        m_canvas3d.repaint();
644
        }
645

    
646
        private void refreshLayerVectorsVisibility(FLayer lyr) {
647
                if (m_planet == null || m_viewProjection == null)
648
                        return;
649

    
650
                Layer3DProps props3D = getLayer3DProps(lyr);
651

    
652
                VectorCacheService cacheService = (VectorCacheService) props3D
653
                                .getCacheService();
654
                if (cacheService != null) {
655
                        // use VectorCacheService to add features to planet
656
                        cacheService.refreshFeaturesToPlanet(lyr.isVisible());
657
                }
658

    
659
        }
660

    
661
        public void activationChanged(LayerEvent e) {
662
                // TODO Implement this method
663
        }
664

    
665
        public void nameChanged(LayerEvent e) {
666
                // TODO Implement this method
667
        }
668

    
669
        public void editionChanged(LayerEvent e) {
670
                // TODO Implement this method
671

    
672
        }
673

    
674
        public void refreshLayerInPlanet(Layer3DProps props, boolean bRemoveCache) {
675
                if (props == null)
676
                        return;
677

    
678
                if (m_planet == null)
679
                        return; // view not opened yet
680

    
681
                // clear cache
682

    
683
                if (bRemoveCache) {
684
                        String layerCacheDir = Layer3DProps.m_cacheDir + "/"
685
                                        + m_planet.getPlanetName() + "/" + props.getCacheName();
686
                        removeCache(layerCacheDir);
687
                }
688

    
689
                // refresh layer in planet
690

    
691
                int type = props.getType();
692
                if (type == Layer3DProps.layer3DImage) {
693
                        int order = props.getPlanetOrder();
694
                        // m_planet.refreshTextureInfo(order);
695
                        m_planet.invalidateTextureLayer(order);
696
                } else if (type == Layer3DProps.layer3DElevation) {
697
                        m_planet.invalidateHeightfieldLayer(0);
698
                } else if (type == Layer3DProps.layer3DVector) {
699
                        invalidateVectorLayer(props);
700
                }
701

    
702
                // REPAINTING VIEWER
703
                // if (m_canvas3d != null) {
704
                // m_canvas3d.getOSGViewer().releaseGLContext();
705
                // m_canvas3d.getOSGViewer().configureGLContext();
706
                // m_canvas3d.repaint();
707
                // }
708
        }
709

    
710
        private void invalidateVectorLayer(Layer3DProps props) {
711
                // TODO Auto-generated method stub
712
                if (m_planet == null || m_viewProjection == null)
713
                        return;
714

    
715
                VectorCacheService cacheService = (VectorCacheService) props
716
                                .getCacheService();
717
                if (cacheService != null) {
718
                        // use VectorCacheService to add features to planet
719
                        cacheService.RefreshFeaturesToPlanet();
720
                }
721
        }
722

    
723
        private boolean removeCache(String folder) {
724
                File dir = new File(folder);
725
                if (dir.isDirectory()) {
726
                        String[] children = dir.list();
727
                        for (int i = 0; i < children.length; i++) {
728
                                boolean success = removeCache(folder + "/" + children[i]);
729
                                // Do not interrupt if it can't delete one file
730
                                // if (!success) {
731
                                // return false;
732
                                // }
733
                        }
734
                }
735

    
736
                // The directory is now empty so delete it
737
                return dir.delete();
738
        }
739

    
740
        protected Layer3DProps getLayer3DProps(FLayer layer) {
741
                Layer3DProps props3D = Layer3DProps.getLayer3DProps(layer);
742
                if (props3D == null) {
743
                        props3D = new Layer3DProps();
744
                        if (layer instanceof FLyrVect) {
745
                                FLyrVect nLayer = (FLyrVect) layer;
746
                                Driver driver;
747
                                try {
748
                                        driver = nLayer.getRecordset().getDriver();
749
                                        if (driver instanceof GvsigDriverOSG) {
750
                                                props3D.setChooseType(false);
751
                                        }
752
                                } catch (ReadDriverException e) {
753
                                        // TODO Auto-generated catch block
754
                                        e.printStackTrace();
755
                                }
756

    
757
                        }
758
                        props3D.setLayer(layer);
759

    
760
                        props3D.initCacheName(m_planet.getCoordinateSystemType(),
761
                                        m_viewProjection, Planet.CoordinateSystemType.GEOCENTRIC);
762
                        FLyrDefault baseLayer = (FLyrDefault) layer;
763
                        baseLayer.setProperty("3DLayerExtension", props3D);
764
                        props3D.setVerticalEx(this.getVerticalExageration());
765
                } else {
766
                        if (m_bLoading)
767
                                props3D.setChooseType(false);
768
                        props3D.setLayer(layer);
769
                }
770

    
771
                return props3D;
772
        }
773

    
774
        private void addLayerToPlanet(FLayer layer, int order, boolean bVerifyLegend) {
775
                Layer3DProps props3D = getLayer3DProps(layer);
776
                if (props3D.getType() == Layer3DProps.layer3DVector) {
777
                        CreateVectors(layer, props3D); // special case for now without
778
                        // disk cache
779
                } else if (props3D.getType() == Layer3DProps.layer3DOSG) {
780
                        CreateOSGLayer(layer, props3D);
781
                } else {
782
                        Rectangle2D layerExtent = null;
783
                        try {
784
                                layerExtent = layer.getFullExtent();
785
                        } catch (ExpansionFileReadException e) {
786
                                e.printStackTrace();
787
                        } catch (ReadDriverException e) {
788
                                e.printStackTrace();
789
                        }
790
                        if (layerExtent == null) { // hack for missing extents
791
                                if (m_planet.getCoordinateSystemType() == Planet.CoordinateSystemType.GEOCENTRIC)
792
                                        layerExtent = new Rectangle2D.Double(-180.0, -90.0, 360.0,
793
                                                        180.0);
794
                                else
795
                                        layerExtent = new Rectangle2D.Double(-20000000.0,
796
                                                        -10000000.0, 40000000.0, 20000000.0);
797
                                // TODO toggle comment because this code use WCS extension. When
798
                                // WCS extension runs correctly uncoment!!!
799

    
800
                                if (layer instanceof FLyrWCS)
801
                                        ((FLyrWCS) layer).setFullExtent(layerExtent);
802
                                /**/
803
                        }
804
                        if (props3D.getType() == Layer3DProps.layer3DElevation)
805
                                // m_planet.addHeightfieldLayer(layerExtent, 3);
806
                                m_planet.addHeightfieldLayer(layerExtent);
807
                        else if (props3D.getType() == Layer3DProps.layer3DImage) {
808
                                // m_planet.addTextureLayer(layerExtent, 0);
809
                                m_planet.addTextureLayer(layerExtent);
810
                                ArrayList imageList = (ArrayList) m_layerLists
811
                                                .get(Layer3DProps.layer3DImage);
812
                                int currentOrder = imageList.size() - 1;
813
                                if (currentOrder != order) { // had to be added to non-last
814
                                        // position
815
                                        m_planet.reorderTextureLayer(currentOrder, order);
816
                                        for (int iLayer = 0; iLayer < imageList.size(); iLayer++) {
817
                                                FLayer eachLayer = (FLayer) imageList.get(iLayer);
818
                                                Layer3DProps eachProps3D = getLayer3DProps(eachLayer);
819
                                                if (eachProps3D.getPlanetOrder() >= order)
820
                                                        eachProps3D.setPlanetOrder(eachProps3D
821
                                                                        .getPlanetOrder() + 1);
822
                                        }
823
                                }
824
                                props3D.setPlanetOrder(order);
825
                        }
826
                        // REPAINTING VIEWER
827
                        if (m_canvas3d != null)
828
                                m_canvas3d.repaint();
829

    
830
                        if (bVerifyLegend) {
831
                                m_bListenToLegend = false;
832
                                props3D.VerifyLegend(m_planet.getPlanetName());
833
                                m_bListenToLegend = true;
834
                        }
835
                }
836
        }
837

    
838
        private void CreateOSGLayer(FLayer layer, Layer3DProps props3D) {
839
                if (m_planet == null || m_viewProjection == null)
840
                        return;
841

    
842
                OSGCacheService cacheService = (OSGCacheService) props3D
843
                                .getCacheService();
844
                if (cacheService == null) {
845
                        cacheService = new OSGCacheService(m_canvas3d, m_planet, props3D
846
                                        .getCacheName(), layer, m_viewProjection);
847
                        cacheService.setCacheRootDir(Layer3DProps.m_cacheDir);
848
                        props3D.setCacheService(cacheService);
849
                }
850

    
851
                // use VectorCacheService to add features to planet
852
                cacheService.AddFeaturesToPlanet();
853

    
854
        }
855

    
856
        private void refreshLayerOrder() {
857
                int typeOrder[] = new int[4];
858
                typeOrder[Layer3DProps.layer3DImage] = 0;
859
                typeOrder[Layer3DProps.layer3DElevation] = 0;
860
                typeOrder[Layer3DProps.layer3DVector] = 0;
861
                typeOrder[Layer3DProps.layer3DOSG] = 0;
862

    
863
                SingleLayerIterator lyrIterator = new SingleLayerIterator(layers);
864
                while (lyrIterator.hasNext()) {
865
                        FLayer lyr = lyrIterator.next();
866
                        Layer3DProps props3D = getLayer3DProps(lyr);
867
                        int type = props3D.getType();
868
                        // stores new order in properties 3D, but doesn't reorder internal
869
                        // layer lists
870
                        props3D.setTocOrder(typeOrder[type]);
871
                        typeOrder[type] += 1;
872
                }
873
        }
874

    
875
        private int addLayerByType(FLayer layer) {
876
                int resultOrder = -1;
877

    
878
                int typeOrder[] = new int[4];
879
                typeOrder[Layer3DProps.layer3DImage] = 0;
880
                typeOrder[Layer3DProps.layer3DElevation] = 0;
881
                typeOrder[Layer3DProps.layer3DVector] = 0;
882
                typeOrder[Layer3DProps.layer3DOSG] = 0;
883

    
884
                if (layer instanceof FLyrVect) {
885
                        if (((FLyrVect) layer).getSource().getDriver() instanceof GvsigDriverOSG) {
886
                                Layer3DProps props3D = getLayer3DProps(layer);
887
                                props3D.setType(Layer3DProps.layer3DOSG);
888
                        }
889
                }
890

    
891
                SingleLayerIterator lyrIterator = new SingleLayerIterator(layers);
892
                while (lyrIterator.hasNext()) {
893
                        FLayer lyr = lyrIterator.next();
894
                        Layer3DProps props3D = getLayer3DProps(lyr);
895

    
896
                        int type = props3D.getType();
897
                        // in pilot, limit to 1 the number of elevation layers
898
                        if (type == Layer3DProps.layer3DElevation && typeOrder[type] == 1) {
899
                                JOptionPane.showMessageDialog((Component) PluginServices
900
                                                .getMainFrame(), PluginServices.getText(this,
901
                                                "Only_one_elevation_messg"), PluginServices.getText(
902
                                                this, "Only_one_elevation_title"),
903
                                                JOptionPane.INFORMATION_MESSAGE);
904
                                return -1; // error value
905
                        }
906

    
907
                        // stores new order in properties 3D, but doesn't reorder internal
908
                        // layer lists
909
                        props3D.setTocOrder(typeOrder[type]);
910
                        typeOrder[type] += 1;
911

    
912
                        if (layer == lyr) {
913
                                resultOrder = props3D.getTocOrder();
914
                                ArrayList layerList = (ArrayList) m_layerLists.get(type);
915
                                if (resultOrder == layerList.size()
916
                                                || layerList.get(resultOrder) != layer)
917
                                        layerList.add(resultOrder, layer);
918
                        }
919
                }
920

    
921
                return resultOrder;
922
        }
923

    
924
        private int removeLayerByType(FLayer layer) {
925

    
926
                Layer3DProps props3D = getLayer3DProps(layer);
927
                ArrayList layerList = (ArrayList) m_layerLists.get(props3D.getType());
928
                int currentOrder = props3D.getTocOrder();
929
                if (currentOrder == -1)
930
                        return -1;
931

    
932
                layerList.remove(currentOrder);
933

    
934
                for (int i = currentOrder; i < layerList.size(); i++) {
935
                        FLayer lyrAux = (FLayer) layerList.get(i);
936
                        Layer3DProps props3DAux = getLayer3DProps(lyrAux);
937
                        props3DAux.setTocOrder(i);
938
                }
939
                return currentOrder;
940
        }
941

    
942
        private void CreateVectors(FLayer layer, Layer3DProps props3D) {
943
                if (m_planet == null || m_viewProjection == null)
944
                        return;
945

    
946
                VectorCacheService cacheService = (VectorCacheService) props3D
947
                                .getCacheService();
948
                if (cacheService == null) {
949
                        cacheService = new VectorCacheService(m_canvas3d, m_planet, props3D
950
                                        .getCacheName(), layer, m_viewProjection);
951
                        cacheService.setCacheRootDir(Layer3DProps.m_cacheDir);
952
                        props3D.setCacheService(cacheService);
953
                }
954

    
955
                // use VectorCacheService to add features to planet
956
                cacheService.AddFeaturesToPlanet();
957
        }
958

    
959
        private void DeleteVectors(FLayer layer, Layer3DProps props3D) {
960
                if (m_planet == null || m_viewProjection == null)
961
                        return;
962

    
963
                VectorCacheService cacheService = (VectorCacheService) props3D
964
                                .getCacheService();
965
                if (cacheService != null) {
966
                        // use VectorCacheService to delete features to planet
967
                        cacheService.DeleteFeaturesToPlanet();
968
                }
969
        }
970

    
971
        /**
972
         * Sets the given zoom extent to the view
973
         * 
974
         * @param extent
975
         *            The extent to zoom to.
976
         */
977
        public void zoomToExtent(Rectangle2D geoExtent) {
978
                double maxHeight = 0.0;
979

    
980
                // Getting extent positions
981
                double minLat = geoExtent.getMinY();
982
                double maxLat = geoExtent.getMaxY();
983
                double cenLon = geoExtent.getCenterX();
984
                double cenLat = geoExtent.getCenterY();
985

    
986
                double elevation = 0;
987

    
988
                // calculate altitude
989
                double avLat = 0;
990
                if (minLat > 0.0 || maxLat < 0.0)
991
                        avLat = Math.min(Math.abs(minLat), Math.abs(maxLat));
992
                double avLon = Math.min(180.0, geoExtent.getWidth());
993

    
994
                double planetRadius = m_planet.getRadiusEquatorial();
995
                double radiusLat = planetRadius * Math.cos(Math.toRadians(avLat));
996
                double deltaLon = Math.sqrt(2 * radiusLat * radiusLat
997
                                * (1 - Math.cos(Math.toRadians(avLon))));
998
                double deltaLat = Math.sqrt(2 * planetRadius * planetRadius
999
                                * (1 - Math.cos(Math.toRadians(geoExtent.getHeight()))));
1000

    
1001
                double zoomFactor = 1.5;
1002
                elevation = (Math.max(deltaLon, deltaLat) * zoomFactor) + maxHeight;
1003

    
1004
                // Calculate XYZ positions for camera.
1005

    
1006
                int planetType = this.m_planet.getCoordinateSystemType();
1007

    
1008
                Vec3 eye = new Vec3();
1009
                Vec3 center = new Vec3();
1010
                Vec3 up = new Vec3();
1011
                // Calculate positions for PLAIN MODE.
1012
                if (planetType == Planet.CoordinateSystemType.PROJECTED) {
1013

    
1014
                        double difx = (geoExtent.getMaxX() - geoExtent.getX()) / 1.2d;
1015
                        double dify = (geoExtent.getMaxY() - geoExtent.getY()) / 1.2d;
1016
                        double height;
1017

    
1018
                        height = Math.sqrt(difx * difx + dify * dify);
1019

    
1020
                        // EYE
1021
                        eye.setX(cenLon);
1022
                        eye.setY(cenLat);
1023
                        eye.setZ(height);
1024
                        // eye.setZ(5000000 * 4.6);
1025
                        // CENTER
1026
                        center.setX(cenLon);
1027
                        center.setY(cenLat);
1028
                        center.setZ(0.0);
1029
                        // UP
1030
                        up.setX(0.0);
1031
                        up.setY(1.0);
1032
                        up.setZ(0.0);
1033
                } else
1034
                // Calculate positions for SPHERICAL MODE.
1035
                if (planetType == Planet.CoordinateSystemType.GEOCENTRIC) {
1036
                        // EYE
1037
                        Vec3 aux = new Vec3(cenLat, cenLon, elevation);
1038
                        eye = m_planet.convertLatLongHeightToXYZ(aux);
1039
                        // CENTER
1040
                        center.setX(0.0);
1041
                        center.setY(0.0);
1042
                        center.setZ(0.0);
1043
                        // UP
1044
                        up.setX(0.0);
1045
                        up.setY(0.0);
1046
                        up.setZ(1.0);
1047
                }
1048
                Camera cam = new Camera();
1049
                cam.setViewByLookAt(eye, center, up);
1050

    
1051
                // UtilCoord.imprimeCamara(cam);
1052

    
1053
                planetViewer.setCamera(cam);
1054
                // REPAINTING VIEWER
1055
                if (m_canvas3d != null)
1056
                        m_canvas3d.repaint();
1057

    
1058
        }
1059

    
1060
        /** * CALLBACKS for Tiles ** */
1061

    
1062
        public void tileCreated(RequestLayerEvent evt) {
1063
                int textureStage = 0;
1064
                int MDTStage = 0;
1065

    
1066
                SingleLayerIterator lyrIterator = new SingleLayerIterator(layers);
1067
                while (lyrIterator.hasNext()) {
1068
                        FLayer lyr = lyrIterator.next();
1069

    
1070
                        Layer3DProps props3D = getLayer3DProps(lyr);
1071
                        int dataType = props3D.getType();
1072

    
1073
                        if (lyr.isVisible()) { // if (true) {
1074
                                if (dataType == Layer3DProps.layer3DVector)
1075
                                        continue; // get/create cache service
1076
                                FLayerCacheService cacheService = (FLayerCacheService) props3D
1077
                                                .getCacheService();
1078
                                if (cacheService == null) {
1079
                                        cacheService = new FLayerCacheService(m_planet, props3D
1080
                                                        .getCacheName(), lyr, m_viewProjection);
1081
                                        cacheService.setCacheRootDir(Layer3DProps.m_cacheDir);
1082
                                        props3D.setCacheService(cacheService);
1083
                                }
1084

    
1085
                                Point tileIndices = new Point(evt.getX(), evt.getY());
1086
                                TileNum tileNum = new TileNum(evt.getLevel(), tileIndices);
1087
                                String tileFileName;
1088

    
1089
                                double minX = evt.getMinX();
1090
                                double minY = evt.getMinY();
1091
                                double width = evt.getMaxX() - evt.getMinX();
1092
                                double height = evt.getMaxY() - evt.getMinY();
1093

    
1094
                                Rectangle2D extent = new Rectangle2D.Double(minX, minY, width,
1095
                                                height);
1096
                                if (cacheService.intersectsLayer(extent)) { // extent test
1097
                                        // if (cacheService.intersectsLayer(extent)) { // extent
1098
                                        // test
1099
                                        // System.out.println("Extent del evento del tilenum "
1100
                                        // + tileNum + minX + " " + minY + " " + width + " "
1101
                                        // + height);
1102
                                        try {
1103
                                                // tileFileName = cacheService.getTileAsFName(tileNum);
1104
                                                tileFileName = cacheService.getTileAsFName(tileNum,
1105
                                                                extent);
1106
                                                // System.err.println("tile num " + tileNum);
1107
                                                // System.err.println("nombre fichero " + tileFileName);
1108
                                        } catch (Exception e) {
1109
                                                return;
1110
                                        }
1111

    
1112
                                        if (dataType == Layer3DProps.layer3DImage) {
1113
                                                // // float opacity = 1.0f;
1114
                                                // String fileExtension = "png";
1115
                                                // m_planet.setTexture(evt.getTilePagedLod(),
1116
                                                // tileFileName, textureStage);
1117
                                                // m_planet.setTextureOpacityLayer(textureStage, props3D
1118
                                                // .getOpacity());
1119
                                                // textureStage++;
1120
                                        } else if (dataType == Layer3DProps.layer3DElevation) {
1121
                                                // String fileExtension = "tif";
1122
                                                // m_planet.setHeightfield(evt.getTilePagedLod(),
1123
                                                // tileFileName, MDTStage);
1124
                                                // m_planet.setVerticalExaggerationLayer(MDTStage,
1125
                                                // props3D
1126
                                                // .getVerticalEx());
1127
                                                // MDTStage++;
1128
                                        }
1129
                                } else { // no intersection
1130
                                        // if (dataType == Layer3DProps.layer3DImage) {
1131
                                        // m_planet.setTexture(evt.getTilePagedLod(), "",
1132
                                        // textureStage++);
1133
                                        // }
1134
                                        // if (dataType == Layer3DProps.layer3DElevation) {
1135
                                        // m_planet.setHeightfield(evt.getTilePagedLod(), "",
1136
                                        // MDTStage);
1137
                                        // }
1138
                                }
1139
                        } else {
1140
                                if (dataType == Layer3DProps.layer3DImage) {
1141
                                        textureStage++;
1142
                                }
1143
                                if (dataType == Layer3DProps.layer3DElevation) {
1144
                                        MDTStage++;
1145
                                }
1146
                        } // REPAINTING VIEWER
1147
                        if (m_canvas3d != null)
1148
                                m_canvas3d.repaint();
1149
                }
1150
        }
1151

    
1152
        private void PrintDebugLayers() {
1153
                System.out.println("===========================");
1154
                for (int iList = 0; iList < 4; iList++) {
1155
                        ArrayList layerList = (ArrayList) m_layerLists.get(iList);
1156
                        System.out.println("===== List " + iList + "=====");
1157
                        for (int iLayer = 0; iLayer < layerList.size(); iLayer++) {
1158
                                FLayer layer = (FLayer) layerList.get(iLayer);
1159
                                System.out.println("  Layer " + layer.getName());
1160
                                Layer3DProps props3D = getLayer3DProps(layer);
1161
                                System.out.println("    Type " + props3D.getType());
1162
                                System.out.println("    TOC Order " + props3D.getTocOrder());
1163
                                System.out.println("    Planet Order "
1164
                                                + props3D.getPlanetOrder());
1165
                        }
1166
                }
1167
        }
1168

    
1169
        /**
1170
         * Crea un nuevo MapContext(3D) a partir del XMLEntity.
1171
         * 
1172
         * @param xml
1173
         *            XMLEntity
1174
         * 
1175
         * @return Nuevo MapContext3D.
1176
         * 
1177
         * @throws XMLException
1178
         */
1179
        public static MapContext createFromXML(XMLEntity xml) throws XMLException {
1180
                ViewPort3D vp = (ViewPort3D) ViewPort3D.createFromXML(xml.getChild(0));
1181

    
1182
                FLayers layers = new FLayers3D(null, null, vp);
1183
                layers.setXMLEntity(xml.getChild(1));
1184

    
1185
                MapContext fmap = layers.getMapContext();
1186

    
1187
                return fmap;
1188
        }
1189

    
1190
        public static MapContext createFromXML03(XMLEntity xml) throws XMLException {
1191
                ViewPort vp = ViewPort.createFromXML03(xml.getChild(0));
1192

    
1193
                FLayers layers = new FLayers3D(null, null, vp);
1194
                layers.setXMLEntity03(xml.getChild(1));
1195

    
1196
                MapContext fmap = layers.getMapContext();
1197

    
1198
                return fmap;
1199
        }
1200

    
1201
        public GraphicLayer getGraphicsLayer() {
1202
                GraphicLayer3D gra3D = new GraphicLayer3D(this.planetViewer,
1203
                                getPlanet());
1204
                return gra3D;
1205
        }
1206

    
1207
        public Node getSpecialNode() {
1208
                Node specialNode = null;
1209
                try {
1210
                        specialNode = planetViewer.getSpecialNode(0);
1211
                } catch (ChildIndexOutOfBoundsExceptions e) {
1212
                        logger.error("Command: " + "Error child index out of bound.", e);
1213
                }
1214
                return specialNode;
1215
        }
1216

    
1217
        public ViewPort getViewPort() {
1218

    
1219
                ViewPort3D vp = (ViewPort3D) super.getViewPort();
1220

    
1221
                if (m_canvas3d != null)
1222
                        vp.setImageSize(new Dimension(planetViewer.getWidth(), planetViewer
1223
                                        .getHeight()));
1224
                vp.setPlanet(this.getPlanet());
1225
                vp.setViewer(this.m_canvas3d);
1226

    
1227
                return vp;
1228
        }
1229

    
1230
        /**
1231
         * M�todo de conveniencia que se usa provisionalmente para solicitar un
1232
         * refresco de todo lo que dependa del FMap (MapContext). Esto provocar�
1233
         * un evento de cambio de orden de capas que obligar� a redibujar todo lo
1234
         * que depende de FMap (TOC, MapControl, FFrameView, etc).
1235
         */
1236
        public void invalidate() {
1237
                ViewPort3D vp = (ViewPort3D) super.getViewPort();
1238
                if (vp.getDirty()) {
1239
                        vp.setDirty(false);
1240
                        // extentAux = vport.getExtent();
1241

    
1242
                        // Comento el zoom pq no kiero q me lo haga y me cambie la vista
1243
                        // cuando repinto
1244

    
1245
                        // this.zoomToExtent(vp.getExtent());
1246
                        // System.out.println("extend seleccionado: \n Centro: "
1247
                        // + extentAux.getCenterX() + "\n Alto: " + extentAux.getHeight()
1248
                        // + "\n Ancho: " + extentAux.getWidth());
1249

    
1250
                        // TEST
1251

    
1252
                        // Updating all the layers. This operation synchronize the
1253
                        // transparency layer with layer transparency planet layer.
1254
                        // Getting all selected Extent
1255

    
1256
                }
1257
                FLayer[] selectedExtent = getLayers().getActives();
1258

    
1259
                if (selectedExtent.length > 0) {
1260
                        for (int i = 0; i < selectedExtent.length; i++) {
1261
                                if (selectedExtent[0].isAvailable()) {
1262

    
1263
                                        FLayer lyr3D = selectedExtent[i];
1264
                                        Layer3DProps layer3DProps = Layer3DProps
1265
                                                        .getLayer3DProps(lyr3D);
1266

    
1267
                                        int order = layer3DProps.getPlanetOrder();
1268
                                        // float opacity = layer3DProps.getOpacity();
1269
                                        float opacity = (((FLyrDefault) lyr3D).getTransparency())
1270
                                                        / (float) 255;
1271
                                        // Notify the opacity to planet
1272
                                        this.m_planet.setTextureOpacityLayer(order, opacity);
1273
                                }
1274
                        }
1275

    
1276
                }
1277
                // super.invalidate();
1278

    
1279
                m_canvas3d.repaint();
1280
                m_canvas3d.getOSGViewer().releaseGLContext();
1281
                m_canvas3d.getOSGViewer().configureGLContext();
1282
        }
1283

    
1284
        public void selectionChanged(SelectionEvent e) {
1285
                // TODO Auto-generated method stub
1286
                for (int iType = 0; iType < 3; iType++) {
1287
                        ArrayList layerList = (ArrayList) m_layerLists.get(iType);
1288
                        for (int iLayer = 0; iLayer < layerList.size(); iLayer++) {
1289

    
1290
                                FLayer layer = (FLayer) layerList.get(iLayer);
1291
                                if (layer.getClass().equals(FLyrVect.class)) {
1292
                                        FLyrVect lyr = (FLyrVect) layer;
1293

    
1294
                                        FBitSet selection = null;
1295
                                        try {
1296
                                                selection = lyr.getRecordset().getSelectionSupport()
1297
                                                                .getSelection();
1298
                                        } catch (ReadDriverException e1) {
1299
                                                // TODO Auto-generated catch block
1300
                                                e1.printStackTrace();
1301
                                        }
1302

    
1303
                                        // if (!(selection.isEmpty())){
1304
                                        if ((selection.cardinality() == 0)
1305
                                                        || (!(selection.isEmpty()))) {
1306
                                                Layer3DProps props = Layer3DProps
1307
                                                                .getLayer3DProps(layer);
1308
                                                refreshLayerInPlanet(props, true);
1309
                                                if (layer instanceof FLyrVect) {
1310
                                                        FLyrVect fvect = (FLyrVect) layer;
1311
                                                        props.drawVersion = fvect.getDrawVersion();
1312
                                                }
1313
                                        }
1314
                                }
1315

    
1316
                        }
1317
                }
1318
                m_canvas3d.repaint();
1319

    
1320
        }
1321

    
1322
        public void requestElevationLayer(RequestLayerEvent rle) {
1323

    
1324
                // TODO : All this method are not tested
1325
                // ignore for now
1326

    
1327
                /* UNCOMENT FOR TEST IT */
1328
                int order = rle.getOrder();
1329
                ArrayList imageLayers = (ArrayList) m_layerLists
1330
                                .get(Layer3DProps.layer3DElevation);
1331
                FLayer layer = (FLayer) imageLayers.get(order);
1332
                if ((layer == null) || (!layer.isVisible()))
1333
                        return;
1334

    
1335
                Layer3DProps props3D = getLayer3DProps(layer);
1336
                // get/create cache service
1337
                FLayerCacheService cacheService = (FLayerCacheService) props3D
1338
                                .getCacheService();
1339
                if (cacheService == null) {
1340
                        cacheService = new FLayerCacheService(m_planet, props3D
1341
                                        .getCacheName(), layer, m_viewProjection);
1342
                        cacheService.setCacheRootDir(Layer3DProps.m_cacheDir);
1343
                        props3D.setCacheService(cacheService);
1344
                }
1345

    
1346
                int dataType = props3D.getType();
1347
                Point tileIndices = new Point(rle.getX(), rle.getY());
1348
                TileNum tileNum = new TileNum(rle.getLevel(), tileIndices);
1349

    
1350
                String tileFileName;
1351
                double minX = rle.getMinX();
1352
                double minY = rle.getMinY();
1353
                double width = rle.getMaxX() - rle.getMinX();
1354
                double height = rle.getMaxY() - rle.getMinY();
1355
                // Rectangle2D extent = new Rectangle2D.Double(Math.toDegrees(minX),
1356
                // Math.toDegrees(minY), Math.toDegrees(width), Math.toDegrees(height));
1357
                Rectangle2D extent = new Rectangle2D.Double(minX, minY, width, height);
1358
                if (cacheService.intersectsLayer(extent)) { // extent test
1359
                        // if (cacheService.intersectsLayer(extent)) {
1360
                        // System.out.println("Extetn del evento " + minX + " " + minY + " "
1361
                        // + width + " " + height);
1362
                        try {
1363
                                // tileFileName = cacheService.getTileAsFName(tileNum,extent);
1364
                                tileFileName = cacheService.getTileAsFName(tileNum, extent);
1365
                        } catch (Exception e) {
1366
                                m_planet.setFailHeightField(rle.getTerrainNode(), order);
1367
                                return;
1368
                        }
1369

    
1370
                        if (dataType == Layer3DProps.layer3DElevation) {
1371
                                String fileExtension = "tif";
1372
                                // evt.getTilePagedLod().setHeightField(tileFileName,
1373
                                // fileExtension, order);
1374
                                m_planet.setHeightfield(rle.getTerrainNode(), tileFileName,
1375
                                                order);
1376
                                // m_planet.setVerticalExaggeration(order,
1377
                                // ((ProjectView3D) this.m_viewProjection)
1378
                                // .getVerticalExaggeration());
1379
                                m_planet.setVerticalExaggerationLayer(order, props3D
1380
                                                .getVerticalEx());
1381

    
1382
                        }
1383
                } else { // no intersection for elevation layer
1384
                        // This code are not correctly for elevation layer
1385
                        if (dataType == Layer3DProps.layer3DImage) {
1386
                                m_planet.setHeightfield(rle.getTerrainNode(), "", order);
1387
                                // evt.getTilePagedLod().setHeightField("", "", order);
1388
                        }
1389
                }
1390

    
1391
                // REPAINTING VIEWWER
1392
                if (m_canvas3d != null)
1393
                        m_canvas3d.repaint();
1394

    
1395
        }
1396

    
1397
        public void requestTextureLayer(RequestLayerEvent rle) {
1398

    
1399
                int order = rle.getOrder();
1400
                ArrayList imageLayers = (ArrayList) m_layerLists
1401
                                .get(Layer3DProps.layer3DImage);
1402

    
1403
                // if there are not one layer return
1404
                if (imageLayers.size() == 0)
1405
                        return;
1406
                FLayer layer = (FLayer) imageLayers.get(order);
1407
                if ((layer == null) || (!layer.isVisible()))
1408
                        return;
1409

    
1410
                Layer3DProps props3D = getLayer3DProps(layer);
1411
                // get/create cache service
1412
                FLayerCacheService cacheService = (FLayerCacheService) props3D
1413
                                .getCacheService();
1414
                if (cacheService == null) {
1415
                        cacheService = new FLayerCacheService(m_planet, props3D
1416
                                        .getCacheName(), layer, m_viewProjection);
1417
                        cacheService.setCacheRootDir(Layer3DProps.m_cacheDir);
1418
                        props3D.setCacheService(cacheService);
1419
                }
1420

    
1421
                int dataType = props3D.getType();
1422
                Point tileIndices = new Point(rle.getX(), rle.getY());
1423
                TileNum tileNum = new TileNum(rle.getLevel(), tileIndices);
1424

    
1425
                String tileFileName;
1426
                double minX = rle.getMinX();
1427
                double minY = rle.getMinY();
1428
                double width = rle.getMaxX() - rle.getMinX();
1429
                double height = rle.getMaxY() - rle.getMinY();
1430
                // Rectangle2D extent = new Rectangle2D.Double(Math.toDegrees(minX),
1431
                // Math.toDegrees(minY), Math.toDegrees(width), Math.toDegrees(height));
1432
                Rectangle2D extent = new Rectangle2D.Double(minX, minY, width, height);
1433
                if (cacheService.intersectsLayer(extent)) { // extent test
1434
                        // if (cacheService.intersectsLayer(extent)) {
1435
                        try {
1436
                                tileFileName = cacheService.getTileAsFName(tileNum, extent);
1437
                                // tileFileName = cacheService.getTileAsFName(tileNum);
1438
                                // System.err.println("tile num " + tileNum);
1439
                                // System.err.println("nombre fichero " + tileFileName);
1440
                        } catch (Exception e) {
1441
                                m_planet.setFailTexture(rle.getTerrainNode(), order);
1442
                                return;
1443
                        }
1444

    
1445
                        if (dataType == Layer3DProps.layer3DImage) {
1446
                                // float opacity = 1.0f;
1447
                                String fileExtension = "png";
1448
                                // @TODO:aplicar texturas al planeta
1449
                                // evt.getTilePagedLod().setTexture(tileFileName, fileExtension,
1450
                                // order);
1451
                                m_planet.setTexture(rle.getTerrainNode(), tileFileName, order);
1452
                                m_planet.setTextureOpacityLayer(order, props3D.getOpacity());
1453
                        }
1454
                        /*
1455
                         * else { String fileExtension = "tif";
1456
                         * evt.getTilePagedLod().setHeightField(tileFileName,
1457
                         * fileExtension); }
1458
                         */
1459
                } else { // no intersection
1460
                        if (dataType == Layer3DProps.layer3DImage) {
1461
                                m_planet.setTexture(rle.getTerrainNode(), "", order);
1462
                                // evt.getTilePagedLod().setTexture("", "", order);
1463
                        }
1464
                }
1465

    
1466
                // REPAINTING VIEWWER
1467
                if (m_canvas3d != null)
1468
                        m_canvas3d.repaint();
1469

    
1470
        }
1471

    
1472
        public void requestVectorLayer(RequestLayerEvent arg0) {
1473
                // TODO Auto-generated method stub
1474

    
1475
        }
1476

    
1477
        public void pepareLayerToRefresh(FLayer layer) {
1478
                // TODO Auto-generated method stub
1479
                Layer3DProps props3D = getLayer3DProps(layer);
1480

    
1481
                if (props3D.getType() == Layer3DProps.layer3DVector) {
1482
                        DeleteVectors(layer, props3D);
1483
                } else if (props3D.getType() == Layer3DProps.layer3DOSG) {
1484
                        DeleteOSGLayer(layer, props3D);
1485
                } else if (props3D.getType() == Layer3DProps.layer3DImage) {
1486
                        m_planet.removeTextureLayer(props3D.getPlanetOrder());
1487
                        ArrayList layerList = (ArrayList) m_layerLists.get(props3D
1488
                                        .getType());
1489

    
1490
                        for (int iLayer = 0; iLayer < layerList.size(); iLayer++) {
1491
                                FLayer eachLayer = (FLayer) layerList.get(iLayer);
1492
                                Layer3DProps eachProps3D = getLayer3DProps(eachLayer);
1493
                                if (eachProps3D.getPlanetOrder() > props3D.getPlanetOrder())
1494
                                        eachProps3D
1495
                                                        .setPlanetOrder(eachProps3D.getPlanetOrder() - 1);
1496
                        }
1497
                        props3D.setPlanetOrder(-1);
1498
                } else if (props3D.getType() == Layer3DProps.layer3DElevation) {
1499
                        m_planet.removeHeightfieldLayer(props3D.getTocOrder());
1500
                }
1501

    
1502
        }
1503

    
1504
        private void DeleteOSGLayer(FLayer layer, Layer3DProps props3D) {
1505
                if (m_planet == null || m_viewProjection == null)
1506
                        return;
1507

    
1508
                OSGCacheService cacheService = (OSGCacheService) props3D
1509
                                .getCacheService();
1510
                if (cacheService != null) {
1511
                        // use VectorCacheService to delete features to planet
1512
                        cacheService.DeleteFeaturesToPlanet();
1513
                }
1514
        }
1515

    
1516
        public void refreshLayer3DProps(FLayer layer) {
1517
                // TODO Auto-generated method stub
1518
                addLayerByType(layer);
1519
                addLayerToPlanet(layer, Layer3DProps.getLayer3DProps(layer)
1520
                                .getTocOrder(), true);
1521

    
1522
        }
1523

    
1524
        public boolean isRenewCanvasOff() {
1525
                return renewCanvasOff;
1526
        }
1527

    
1528
        public void setRenewCanvasOff(boolean renewCanvasOff) {
1529
                this.renewCanvasOff = renewCanvasOff;
1530
        }
1531

    
1532
        public void drawValueChanged(LayerEvent arg0) {
1533
                // TODO Auto-generated method stub
1534

    
1535
        }
1536

    
1537
}