Statistics
| Revision:

svn-gvsig-desktop / trunk / libraries / lib3DMap / src / org / gvsig / gvsig3d / map3d / MapContext3D.java @ 25581

History | View | Annotate | Download (49.9 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.andami.ui.mdiManager.IWindow;
49
import com.iver.cit.gvsig.exceptions.expansionfile.ExpansionFileReadException;
50
import com.iver.cit.gvsig.fmap.MapContext;
51
import com.iver.cit.gvsig.fmap.ViewPort;
52
import com.iver.cit.gvsig.fmap.layers.FBitSet;
53
import com.iver.cit.gvsig.fmap.layers.FLayer;
54
import com.iver.cit.gvsig.fmap.layers.FLayers;
55
import com.iver.cit.gvsig.fmap.layers.FLyrDefault;
56
import com.iver.cit.gvsig.fmap.layers.FLyrVect;
57
import com.iver.cit.gvsig.fmap.layers.FLyrWCS;
58
import com.iver.cit.gvsig.fmap.layers.GraphicLayer;
59
import com.iver.cit.gvsig.fmap.layers.LayerEvent;
60
import com.iver.cit.gvsig.fmap.layers.LayerListener;
61
import com.iver.cit.gvsig.fmap.layers.LegendChangedEvent;
62
import com.iver.cit.gvsig.fmap.layers.SelectableDataSource;
63
import com.iver.cit.gvsig.fmap.layers.SelectionEvent;
64
import com.iver.cit.gvsig.fmap.layers.SelectionListener;
65
import com.iver.cit.gvsig.fmap.layers.SelectionSupport;
66
import com.iver.cit.gvsig.fmap.layers.SingleLayerIterator;
67
import com.iver.cit.gvsig.fmap.layers.XMLException;
68
import com.iver.cit.gvsig.fmap.layers.layerOperations.Classifiable;
69
import com.iver.cit.gvsig.fmap.rendering.LegendListener;
70
import com.iver.cit.gvsig.project.documents.view.gui.BaseView;
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
                                if (recordSet != null) {
458
                                        SelectionSupport selectionSupport = recordSet
459
                                                        .getSelectionSupport();
460
                                        selectionSupport.addSelectionListener(this);
461
                                }
462
                        } catch (ReadDriverException e) {
463
                                // TODO Auto-generated catch block
464
                                e.printStackTrace();
465
                        }
466
                }
467

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

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

    
482
                if (!m_bLoading)
483
                        addLayerToPlanet(layer, order, true);
484

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

    
491
                if (m_bEmptyView && !m_bLoading) {
492
                        if (!((layerListI.size() == 1) && (layerListV.size() == 0))
493
                                        || !((layerListI.size() == 0) && (layerListV.size() == 1))) {
494
                                Layer3DProps prop = getLayer3DProps(layer);
495
                                if(prop.getType() != Layer3DProps.layer3DOSG ) {
496
                                
497
                                        try {
498
                                                zoomToExtent(layer.getFullExtent());
499
                                        } catch (ExpansionFileReadException e) {
500
                                                e.printStackTrace();
501
                                        } catch (ReadDriverException e) {
502
                                                e.printStackTrace();
503
                                        }
504
                                }
505
                                m_bEmptyView = false;
506
                        }
507
                }
508
                if (m_canvas3d != null) {
509
                        m_canvas3d.getOSGViewer().releaseGLContext();
510
                        m_canvas3d.getOSGViewer().configureGLContext();
511
                }
512
                PrintDebugLayers();
513
        }
514

    
515
        public void layerRemoved(FLayers3D parent, FLayer layer) {
516

    
517
                // to remove group layers to 3D, just remove recursively child data
518
                // layers
519
                if (layer instanceof FLayers) {
520
                        FLayers group = (FLayers) layer;
521
                        for (int iChild = 0; iChild < group.getLayersCount(); iChild++) {
522
                                layerRemoved((FLayers3D) group, group.getLayer(iChild));
523
                        }
524
                        getLayer3DProps(layer).setHooked(false);
525
                        return;
526
                }
527

    
528
                if (layer instanceof Classifiable) {
529
                        Classifiable legendLyr = (Classifiable) layer;
530
                        legendLyr.removeLegendListener((LegendListener) this);
531
                }
532
                layer.removeLayerListener((LayerListener) this);
533

    
534
                int order = removeLayerByType(layer);
535
                if (order == -1)
536
                        return;
537

    
538
                this.pepareLayerToRefresh(layer);
539

    
540
                // REPAINTING VIEWER
541
                if (m_canvas3d != null)
542
                        m_canvas3d.repaint();
543

    
544
                ArrayList layerListI = (ArrayList) m_layerLists
545
                                .get(Layer3DProps.layer3DImage);
546
                ArrayList layerListV = (ArrayList) m_layerLists
547
                                .get(Layer3DProps.layer3DVector);
548
                // All layers are removed
549
                if ((layerListI.size() == 0) && (layerListV.size() == 0)) {
550
                        m_bEmptyView = true;
551
                }
552

    
553
                PrintDebugLayers();
554
        }
555

    
556
        /**
557
         * DOCUMENT ME!
558
         * 
559
         * @param e
560
         *            DOCUMENT ME!
561
         */
562
        public void legendChanged(LegendChangedEvent e) {
563

    
564
                if (!m_bListenToLegend)
565
                        return;
566
                if (e == null) {
567

    
568
                        // find layer whose legend changed
569
                        FLayer found = null;
570
                        SingleLayerIterator lyrIterator = new SingleLayerIterator(layers);
571
                        while (lyrIterator.hasNext()) {
572
                                FLayer lyr = lyrIterator.next();
573
                                if (lyr instanceof FLyrVect) {
574
                                        FLyrVect lyrVect = (FLyrVect) lyr;
575
                                        long newDrawVersion = lyrVect.getDrawVersion();
576
                                        Layer3DProps props3D = getLayer3DProps(lyrVect);
577
//                                        if (true) {
578
                                        if (newDrawVersion != props3D.drawVersion) {
579
                                                props3D.drawVersion = lyrVect.getDrawVersion();
580
                                                // lyrVect.updateDrawVersion();
581
                                                refreshLayerInPlanet(props3D, true);
582
                                                m_bListenToLegend = false;
583
                                                props3D.VerifyLegend(m_planet.getPlanetName());
584
                                                m_bListenToLegend = true;
585
                                                // REPAINTING VIWER
586
                                                if (m_canvas3d != null)
587
                                                        m_canvas3d.repaint();
588
                                        }
589
                                }
590
                        }
591

    
592
                        IWindow f = PluginServices.getMDIManager().getActiveWindow();
593
                        if (f instanceof BaseView) {
594
                                BaseView view3D = (BaseView) f;
595
                                view3D.getTOC().refresh();
596
                        }
597
                }
598

    
599
                // IVectorLegend newLegend = (IVectorLegend) e.getNewLegend();
600
                // // find layer whose legend changed
601
                // FLayer found = null;
602
                // // found.i
603
                // SingleLayerIterator lyrIterator = new SingleLayerIterator(layers);
604
                // while (lyrIterator.hasNext()) {
605
                // FLayer lyr = lyrIterator.next();
606
                // if (lyr instanceof Classifiable) {
607
                // Classifiable classLyr = (Classifiable) lyr;
608
                // ILegend legend = classLyr.getLegend();
609
                // if (legend instanceof IVectorLegend) {
610
                // if ((IVectorLegend) legend == newLegend) {
611
                // found = lyr;
612
                // break;
613
                // }
614
                // }
615
                // }
616
                // }
617

    
618
                // if (found != null) {
619
                // Layer3DProps props3D = getLayer3DProps(found);
620
                // refreshLayerInPlanet(props3D, true);
621
                // if (found instanceof FLyrVect) {
622
                // FLyrVect fvect = (FLyrVect) found;
623
                // props3D.drawVersion = fvect.getDrawVersion();
624
                // }
625
                // m_bListenToLegend = false;
626
                // props3D.VerifyLegend(m_planet.getPlanetName());
627
                // m_bListenToLegend = true;
628
                // // REPAINTING VIWER
629
                // if (m_canvas3d != null)
630
                // m_canvas3d.repaint();
631
                // }
632
        }
633

    
634
        public void visibilityChanged(LayerEvent e) {
635
                FLayer lyr = e.getSource();
636

    
637
                Layer3DProps props3D = getLayer3DProps(lyr);
638

    
639
                if (props3D.getType() == Layer3DProps.layer3DVector) {
640
                        refreshLayerVectorsVisibility(lyr);
641
                } else if (props3D.getType() == Layer3DProps.layer3DOSG) {
642
                        refreshLayer3DOSGVisibility(lyr);
643
                }else {
644
                        refreshLayerVisibility(lyr);
645
                }
646
                if (m_canvas3d != null) {
647
                        m_canvas3d.getOSGViewer().releaseGLContext();
648
                        m_canvas3d.getOSGViewer().configureGLContext();
649
                }
650
        }
651

    
652
        private void refreshLayer3DOSGVisibility(FLayer lyr) {
653
                if (m_planet == null || m_viewProjection == null)
654
                        return;
655

    
656
                Layer3DProps props3D = getLayer3DProps(lyr);
657
                
658
                OSGCacheService cacheService = (OSGCacheService) props3D
659
                                .getCacheService();
660
                if (cacheService != null) {
661
                        // use VectorCacheService to add features to planet
662
                        cacheService.refreshFeaturesToPlanet(lyr.isVisible());
663
                }
664
                
665
        }
666
        private void refreshLayerVisibility(FLayer layer) {
667

    
668
                Layer3DProps props3D = getLayer3DProps(layer);
669
                if (props3D.getType() == Layer3DProps.layer3DImage) {
670
                        m_planet.setEnabledTextureLayer(props3D.getPlanetOrder(), layer
671
                                        .isVisible());
672
                }
673
                if (props3D.getType() == Layer3DProps.layer3DElevation) {
674
                        m_planet.setEnabledHeightfieldLayer(0, layer.isVisible());
675
                }
676
                // REPAINTING VIEWER
677
                if (m_canvas3d != null)
678
                        m_canvas3d.repaint();
679
        }
680

    
681
        private void refreshLayerVectorsVisibility(FLayer lyr) {
682
                if (m_planet == null || m_viewProjection == null)
683
                        return;
684

    
685
                Layer3DProps props3D = getLayer3DProps(lyr);
686

    
687
                VectorCacheService cacheService = (VectorCacheService) props3D
688
                                .getCacheService();
689
                if (cacheService != null) {
690
                        // use VectorCacheService to add features to planet
691
                        cacheService.refreshFeaturesToPlanet(lyr.isVisible());
692
                }
693

    
694
        }
695

    
696
        public void activationChanged(LayerEvent e) {
697
                // TODO Implement this method
698
        }
699

    
700
        public void nameChanged(LayerEvent e) {
701
                // TODO Implement this method
702
        }
703

    
704
        public void editionChanged(LayerEvent e) {
705
                // TODO Implement this method
706

    
707
        }
708

    
709
        public void refreshLayerInPlanet(Layer3DProps props, boolean bRemoveCache) {
710
                if (props == null)
711
                        return;
712

    
713
                if (m_planet == null)
714
                        return; // view not opened yet
715

    
716
                // clear cache
717

    
718
                if (bRemoveCache) {
719
                        String layerCacheDir = Layer3DProps.m_cacheDir + "/"
720
                                        + m_planet.getPlanetName() + "/" + props.getCacheName();
721
                        removeCache(layerCacheDir);
722
                }
723

    
724
                // refresh layer in planet
725

    
726
                int type = props.getType();
727
                if (type == Layer3DProps.layer3DImage) {
728
                        int order = props.getPlanetOrder();
729
                        // m_planet.refreshTextureInfo(order);
730
                        m_planet.invalidateTextureLayer(order);
731
                } else if (type == Layer3DProps.layer3DElevation) {
732
                        m_planet.invalidateHeightfieldLayer(0);
733
                } else if (type == Layer3DProps.layer3DVector) {
734
                        invalidateVectorLayer(props);
735
                }
736

    
737
                if (m_canvas3d != null) {
738
                        m_canvas3d.getOSGViewer().releaseGLContext();
739
                        m_canvas3d.getOSGViewer().configureGLContext();
740
                }
741
        }
742

    
743
        private void invalidateVectorLayer(Layer3DProps props) {
744
                // TODO Auto-generated method stub
745
                if (m_planet == null || m_viewProjection == null)
746
                        return;
747

    
748
                VectorCacheService cacheService = (VectorCacheService) props
749
                                .getCacheService();
750
                if (cacheService != null) {
751
                        // use VectorCacheService to add features to planet
752
                        cacheService.RefreshFeaturesToPlanet();
753
                }
754
        }
755

    
756
        private boolean removeCache(String folder) {
757
                File dir = new File(folder);
758
                if (dir.isDirectory()) {
759
                        String[] children = dir.list();
760
                        for (int i = 0; i < children.length; i++) {
761
                                boolean success = removeCache(folder + "/" + children[i]);
762
                                // Do not interrupt if it can't delete one file
763
                                // if (!success) {
764
                                // return false;
765
                                // }
766
                        }
767
                }
768

    
769
                // The directory is now empty so delete it
770
                return dir.delete();
771
        }
772

    
773
        protected Layer3DProps getLayer3DProps(FLayer layer) {
774
                Layer3DProps props3D = Layer3DProps.getLayer3DProps(layer);
775
                if (props3D == null) {
776
                        props3D = new Layer3DProps();
777
                        if (layer instanceof FLyrVect) {
778
                                FLyrVect nLayer = (FLyrVect) layer;
779
                                Driver driver;
780
                                try {
781
                                        driver = nLayer.getRecordset().getDriver();
782
                                        if (driver instanceof GvsigDriverOSG) {
783
                                                props3D.setChooseType(false);
784
                                        }
785
                                } catch (ReadDriverException e) {
786
                                        // TODO Auto-generated catch block
787
                                        e.printStackTrace();
788
                                }
789

    
790
                        }
791
                        props3D.setLayer(layer);
792

    
793
                        props3D.initCacheName(m_planet.getCoordinateSystemType(),
794
                                        m_viewProjection, Planet.CoordinateSystemType.GEOCENTRIC);
795
                        FLyrDefault baseLayer = (FLyrDefault) layer;
796
                        baseLayer.setProperty("3DLayerExtension", props3D);
797
                        props3D.setVerticalEx(this.getVerticalExageration());
798
                } else {
799
                        if (m_bLoading)
800
                                props3D.setChooseType(false);
801
                        props3D.setLayer(layer);
802
                }
803

    
804
                return props3D;
805
        }
806

    
807
        private void addLayerToPlanet(FLayer layer, int order, boolean bVerifyLegend) {
808
                Layer3DProps props3D = getLayer3DProps(layer);
809
                if (props3D.getType() == Layer3DProps.layer3DVector) {
810
                        CreateVectors(layer, props3D); // special case for now without
811
                        // disk cache
812
                } else if (props3D.getType() == Layer3DProps.layer3DOSG) {
813
                        CreateOSGLayer(layer, props3D);
814
                } else {
815
                        Rectangle2D layerExtent = null;
816
                        try {
817
                                layerExtent = layer.getFullExtent();
818
                        } catch (ExpansionFileReadException e) {
819
                                e.printStackTrace();
820
                        } catch (ReadDriverException e) {
821
                                e.printStackTrace();
822
                        }
823
                        if (layerExtent == null) { // hack for missing extents
824
                                if (m_planet.getCoordinateSystemType() == Planet.CoordinateSystemType.GEOCENTRIC)
825
                                        layerExtent = new Rectangle2D.Double(-180.0, -90.0, 360.0,
826
                                                        180.0);
827
                                else
828
                                        layerExtent = new Rectangle2D.Double(-20000000.0,
829
                                                        -10000000.0, 40000000.0, 20000000.0);
830
                                // TODO toggle comment because this code use WCS extension. When
831
                                // WCS extension runs correctly uncoment!!!
832

    
833
                                if (layer instanceof FLyrWCS)
834
                                        ((FLyrWCS) layer).setFullExtent(layerExtent);
835
                                /**/
836
                        }
837
                        if (props3D.getType() == Layer3DProps.layer3DElevation)
838
                                // m_planet.addHeightfieldLayer(layerExtent, 3);
839
                                m_planet.addHeightfieldLayer(layerExtent);
840
                        else if (props3D.getType() == Layer3DProps.layer3DImage) {
841
                                // m_planet.addTextureLayer(layerExtent, 0);
842
                                m_planet.addTextureLayer(layerExtent);
843
                                ArrayList imageList = (ArrayList) m_layerLists
844
                                                .get(Layer3DProps.layer3DImage);
845
                                int currentOrder = imageList.size() - 1;
846
                                if (currentOrder != order) { // had to be added to non-last
847
                                        // position
848
                                        m_planet.reorderTextureLayer(currentOrder, order);
849
                                        for (int iLayer = 0; iLayer < imageList.size(); iLayer++) {
850
                                                FLayer eachLayer = (FLayer) imageList.get(iLayer);
851
                                                Layer3DProps eachProps3D = getLayer3DProps(eachLayer);
852
                                                if (eachProps3D.getPlanetOrder() >= order)
853
                                                        eachProps3D.setPlanetOrder(eachProps3D
854
                                                                        .getPlanetOrder() + 1);
855
                                        }
856
                                }
857
                                props3D.setPlanetOrder(order);
858
                        }
859
                        // REPAINTING VIEWER
860
                        if (m_canvas3d != null)
861
                                m_canvas3d.repaint();
862

    
863
                        if (bVerifyLegend) {
864
                                m_bListenToLegend = false;
865
                                props3D.VerifyLegend(m_planet.getPlanetName());
866
                                m_bListenToLegend = true;
867
                        }
868
                }
869
        }
870

    
871
        private void CreateOSGLayer(FLayer layer, Layer3DProps props3D) {
872
                if (m_planet == null || m_viewProjection == null)
873
                        return;
874

    
875
                OSGCacheService cacheService = (OSGCacheService) props3D
876
                                .getCacheService();
877
                if (cacheService == null) {
878
                        cacheService = new OSGCacheService(m_canvas3d, m_planet, props3D
879
                                        .getCacheName(), layer, m_viewProjection);
880
                        cacheService.setCacheRootDir(Layer3DProps.m_cacheDir);
881
                        props3D.setCacheService(cacheService);
882
                }
883

    
884
                // use VectorCacheService to add features to planet
885
                cacheService.AddFeaturesToPlanet();
886

    
887
        }
888

    
889
        @Override
890
        public XMLEntity getXMLEntity() throws XMLException {
891
                // TODO Auto-generated method stub
892
                XMLEntity xml = super.getXMLEntity();
893
                
894
                SingleLayerIterator lyrIterator = new SingleLayerIterator(layers);
895
                while (lyrIterator.hasNext()) {
896
                        FLayer lyr = lyrIterator.next();
897
                        Layer3DProps props3D = getLayer3DProps(lyr);
898
                        int type = props3D.getType();
899
                        if (type == Layer3DProps.layer3DOSG){
900
                                
901
                                OSGCacheService cacheService = (OSGCacheService) props3D
902
                                .getCacheService();
903
                                if (cacheService != null) {
904
                                        // use VectorCacheService to add features to planet
905
                                        if (props3D.isEditing()){
906
                                                // TODO: PONER AKI EL CODIGO DE SALVAR
907
                                        }
908
                                }
909
                        }
910
                }
911
                
912
                
913
                return xml;
914
                
915
        }
916

    
917
        private void refreshLayerOrder() {
918
                int typeOrder[] = new int[4];
919
                typeOrder[Layer3DProps.layer3DImage] = 0;
920
                typeOrder[Layer3DProps.layer3DElevation] = 0;
921
                typeOrder[Layer3DProps.layer3DVector] = 0;
922
                typeOrder[Layer3DProps.layer3DOSG] = 0;
923

    
924
                SingleLayerIterator lyrIterator = new SingleLayerIterator(layers);
925
                while (lyrIterator.hasNext()) {
926
                        FLayer lyr = lyrIterator.next();
927
                        Layer3DProps props3D = getLayer3DProps(lyr);
928
                        int type = props3D.getType();
929
                        // stores new order in properties 3D, but doesn't reorder internal
930
                        // layer lists
931
                        props3D.setTocOrder(typeOrder[type]);
932
                        typeOrder[type] += 1;
933
                }
934
        }
935

    
936
        private int addLayerByType(FLayer layer) {
937
                int resultOrder = -1;
938

    
939
                int typeOrder[] = new int[4];
940
                typeOrder[Layer3DProps.layer3DImage] = 0;
941
                typeOrder[Layer3DProps.layer3DElevation] = 0;
942
                typeOrder[Layer3DProps.layer3DVector] = 0;
943
                typeOrder[Layer3DProps.layer3DOSG] = 0;
944

    
945
                if (layer instanceof FLyrVect) {
946
                        if (((FLyrVect) layer).getSource() != null) {
947
                                if (((FLyrVect) layer).getSource().getDriver() instanceof GvsigDriverOSG) {
948
                                        Layer3DProps props3D = getLayer3DProps(layer);
949
                                        props3D.setType(Layer3DProps.layer3DOSG);
950
                                }
951
                        }
952
                }
953

    
954
                SingleLayerIterator lyrIterator = new SingleLayerIterator(layers);
955
                while (lyrIterator.hasNext()) {
956
                        FLayer lyr = lyrIterator.next();
957
                        Layer3DProps props3D = getLayer3DProps(lyr);
958

    
959
                        int type = props3D.getType();
960
                        // in pilot, limit to 1 the number of elevation layers
961
                        if (type == Layer3DProps.layer3DElevation && typeOrder[type] == 1) {
962
                                JOptionPane.showMessageDialog((Component) PluginServices
963
                                                .getMainFrame(), PluginServices.getText(this,
964
                                                "Only_one_elevation_messg"), PluginServices.getText(
965
                                                this, "Only_one_elevation_title"),
966
                                                JOptionPane.INFORMATION_MESSAGE);
967
                                return -1; // error value
968
                        }
969

    
970
                        // stores new order in properties 3D, but doesn't reorder internal
971
                        // layer lists
972
                        props3D.setTocOrder(typeOrder[type]);
973
                        typeOrder[type] += 1;
974

    
975
                        if (layer == lyr) {
976
                                resultOrder = props3D.getTocOrder();
977
                                ArrayList layerList = (ArrayList) m_layerLists.get(type);
978
                                if (resultOrder == layerList.size()
979
                                                || layerList.get(resultOrder) != layer)
980
                                        layerList.add(resultOrder, layer);
981
                        }
982
                }
983

    
984
                return resultOrder;
985
        }
986

    
987
        private int removeLayerByType(FLayer layer) {
988

    
989
                Layer3DProps props3D = getLayer3DProps(layer);
990
                ArrayList layerList = (ArrayList) m_layerLists.get(props3D.getType());
991
                int currentOrder = props3D.getTocOrder();
992
                if (currentOrder == -1)
993
                        return -1;
994

    
995
                layerList.remove(currentOrder);
996

    
997
                for (int i = currentOrder; i < layerList.size(); i++) {
998
                        FLayer lyrAux = (FLayer) layerList.get(i);
999
                        Layer3DProps props3DAux = getLayer3DProps(lyrAux);
1000
                        props3DAux.setTocOrder(i);
1001
                }
1002
                return currentOrder;
1003
        }
1004

    
1005
        private void CreateVectors(FLayer layer, Layer3DProps props3D) {
1006
                if (m_planet == null || m_viewProjection == null)
1007
                        return;
1008

    
1009
                VectorCacheService cacheService = (VectorCacheService) props3D
1010
                                .getCacheService();
1011
                if (cacheService == null) {
1012
                        cacheService = new VectorCacheService(m_canvas3d, m_planet, props3D
1013
                                        .getCacheName(), layer, m_viewProjection);
1014
                        cacheService.setCacheRootDir(Layer3DProps.m_cacheDir);
1015
                        props3D.setCacheService(cacheService);
1016
                }
1017

    
1018
                // use VectorCacheService to add features to planet
1019
                cacheService.AddFeaturesToPlanet();
1020
        }
1021

    
1022
        private void DeleteVectors(FLayer layer, Layer3DProps props3D) {
1023
                if (m_planet == null || m_viewProjection == null)
1024
                        return;
1025

    
1026
                VectorCacheService cacheService = (VectorCacheService) props3D
1027
                                .getCacheService();
1028
                if (cacheService != null) {
1029
                        // use VectorCacheService to delete features to planet
1030
                        cacheService.DeleteFeaturesToPlanet();
1031
                }
1032
        }
1033

    
1034
        /**
1035
         * Sets the given zoom extent to the view
1036
         * 
1037
         * @param extent
1038
         *            The extent to zoom to.
1039
         */
1040
        public void zoomToExtent(Rectangle2D geoExtent) {
1041
                double maxHeight = 0.0;
1042

    
1043
                // Getting extent positions
1044
                double minLat = geoExtent.getMinY();
1045
                double maxLat = geoExtent.getMaxY();
1046
                double cenLon = geoExtent.getCenterX();
1047
                double cenLat = geoExtent.getCenterY();
1048

    
1049
                double elevation = 0;
1050

    
1051
                // calculate altitude
1052
                double avLat = 0;
1053
                if (minLat > 0.0 || maxLat < 0.0)
1054
                        avLat = Math.min(Math.abs(minLat), Math.abs(maxLat));
1055
                double avLon = Math.min(180.0, geoExtent.getWidth());
1056

    
1057
                double planetRadius = m_planet.getRadiusEquatorial();
1058
                double radiusLat = planetRadius * Math.cos(Math.toRadians(avLat));
1059
                double deltaLon = Math.sqrt(2 * radiusLat * radiusLat
1060
                                * (1 - Math.cos(Math.toRadians(avLon))));
1061
                double deltaLat = Math.sqrt(2 * planetRadius * planetRadius
1062
                                * (1 - Math.cos(Math.toRadians(geoExtent.getHeight()))));
1063

    
1064
                double zoomFactor = 1.5;
1065
                elevation = (Math.max(deltaLon, deltaLat) * zoomFactor) + maxHeight;
1066

    
1067
                // Calculate XYZ positions for camera.
1068

    
1069
                int planetType = this.m_planet.getCoordinateSystemType();
1070

    
1071
                Vec3 eye = new Vec3();
1072
                Vec3 center = new Vec3();
1073
                Vec3 up = new Vec3();
1074
                // Calculate positions for PLAIN MODE.
1075
                if (planetType == Planet.CoordinateSystemType.PROJECTED) {
1076

    
1077
                        double difx = (geoExtent.getMaxX() - geoExtent.getX()) / 1.2d;
1078
                        double dify = (geoExtent.getMaxY() - geoExtent.getY()) / 1.2d;
1079
                        double height;
1080

    
1081
                        height = Math.sqrt(difx * difx + dify * dify);
1082
                        double fullWindowFactor = 1.7;
1083
                        // EYE
1084
                        eye.setX(cenLon);
1085
                        eye.setY(cenLat);
1086
                        eye.setZ(height * fullWindowFactor);
1087
                //        eye.setZ(5000000 * 4.6);
1088
                        // CENTER
1089
                        center.setX(cenLon);
1090
                        center.setY(cenLat);
1091
                        center.setZ(0.0);
1092
                        // UP
1093
                        up.setX(0.0);
1094
                        up.setY(1.0);
1095
                        up.setZ(0.0);
1096
                } else
1097
                // Calculate positions for SPHERICAL MODE.
1098
                if (planetType == Planet.CoordinateSystemType.GEOCENTRIC) {
1099
                        // EYE
1100
                        Vec3 aux = new Vec3(cenLat, cenLon, elevation);
1101
                        eye = m_planet.convertLatLongHeightToXYZ(aux);
1102
                        // CENTER
1103
                        center.setX(0.0);
1104
                        center.setY(0.0);
1105
                        center.setZ(0.0);
1106
                        // UP
1107
                        up.setX(0.0);
1108
                        up.setY(0.0);
1109
                        up.setZ(1.0);
1110
                }
1111
                Camera cam = new Camera();
1112
                cam.setViewByLookAt(eye, center, up);
1113

    
1114
                // UtilCoord.imprimeCamara(cam);
1115

    
1116
                planetViewer.setCamera(cam);
1117
                // REPAINTING VIEWER
1118
                if (m_canvas3d != null)
1119
                        m_canvas3d.repaint();
1120

    
1121
        }
1122

    
1123
        /** * CALLBACKS for Tiles ** */
1124

    
1125
        /*public void tileCreated(RequestLayerEvent evt) {
1126
                int textureStage = 0;
1127
                int MDTStage = 0;
1128

1129
                SingleLayerIterator lyrIterator = new SingleLayerIterator(layers);
1130
                while (lyrIterator.hasNext()) {
1131
                        FLayer lyr = lyrIterator.next();
1132

1133
                        Layer3DProps props3D = getLayer3DProps(lyr);
1134
                        int dataType = props3D.getType();
1135

1136
                        if (lyr.isVisible()) { // if (true) {
1137
                                if (dataType == Layer3DProps.layer3DVector)
1138
                                        continue; // get/create cache service
1139
                                FLayerCacheService cacheService = (FLayerCacheService) props3D
1140
                                                .getCacheService();
1141
                                if (cacheService == null) {
1142
                                        cacheService = new FLayerCacheService(m_planet, props3D
1143
                                                        .getCacheName(), lyr, m_viewProjection);
1144
                                        cacheService.setCacheRootDir(Layer3DProps.m_cacheDir);
1145
                                        props3D.setCacheService(cacheService);
1146
                                }
1147

1148
                                Point tileIndices = new Point(evt.getX(), evt.getY());
1149
                                TileNum tileNum = new TileNum(evt.getLevel(), tileIndices);
1150
                                String tileFileName;
1151

1152
                                double minX = evt.getMinX();
1153
                                double minY = evt.getMinY();
1154
                                double width = evt.getMaxX() - evt.getMinX();
1155
                                double height = evt.getMaxY() - evt.getMinY();
1156

1157
                                Rectangle2D extent = new Rectangle2D.Double(minX, minY, width,
1158
                                                height);
1159
                                if (cacheService.intersectsLayer(extent)) { // extent test
1160
                                        // if (cacheService.intersectsLayer(extent)) { // extent
1161
                                        // test
1162
                                        // System.out.println("Extent del evento del tilenum "
1163
                                        // + tileNum + minX + " " + minY + " " + width + " "
1164
                                        // + height);
1165
                                        try {
1166
                                                // tileFileName = cacheService.getTileAsFName(tileNum);
1167
                                                tileFileName = cacheService.getTileAsFName(tileNum,
1168
                                                                extent);
1169
                                                // System.err.println("tile num " + tileNum);
1170
                                                // System.err.println("nombre fichero " + tileFileName);
1171
                                        } catch (Exception e) {
1172
                                                return;
1173
                                        }
1174

1175
                                        if (dataType == Layer3DProps.layer3DImage) {
1176
                                                // // float opacity = 1.0f;
1177
                                                // String fileExtension = "png";
1178
                                                // m_planet.setTexture(evt.getTilePagedLod(),
1179
                                                // tileFileName, textureStage);
1180
                                                // m_planet.setTextureOpacityLayer(textureStage, props3D
1181
                                                // .getOpacity());
1182
                                                // textureStage++;
1183
                                        } else if (dataType == Layer3DProps.layer3DElevation) {
1184
                                                // String fileExtension = "tif";
1185
                                                // m_planet.setHeightfield(evt.getTilePagedLod(),
1186
                                                // tileFileName, MDTStage);
1187
                                                // m_planet.setVerticalExaggerationLayer(MDTStage,
1188
                                                // props3D
1189
                                                // .getVerticalEx());
1190
                                                // MDTStage++;
1191
                                        }
1192
                                } else { // no intersection
1193
                                        // if (dataType == Layer3DProps.layer3DImage) {
1194
                                        // m_planet.setTexture(evt.getTilePagedLod(), "",
1195
                                        // textureStage++);
1196
                                        // }
1197
                                        // if (dataType == Layer3DProps.layer3DElevation) {
1198
                                        // m_planet.setHeightfield(evt.getTilePagedLod(), "",
1199
                                        // MDTStage);
1200
                                        // }
1201
                                }
1202
                        } else {
1203
                                if (dataType == Layer3DProps.layer3DImage) {
1204
                                        textureStage++;
1205
                                }
1206
                                if (dataType == Layer3DProps.layer3DElevation) {
1207
                                        MDTStage++;
1208
                                }
1209
                        } // REPAINTING VIEWER
1210
                        if (m_canvas3d != null)
1211
                                m_canvas3d.repaint();
1212
                }
1213
        }*/
1214

    
1215
        private void PrintDebugLayers() {
1216
                System.out.println("===========================");
1217
                for (int iList = 0; iList < 4; iList++) {
1218
                        ArrayList layerList = (ArrayList) m_layerLists.get(iList);
1219
                        System.out.println("===== List " + iList + "=====");
1220
                        for (int iLayer = 0; iLayer < layerList.size(); iLayer++) {
1221
                                FLayer layer = (FLayer) layerList.get(iLayer);
1222
                                System.out.println("  Layer " + layer.getName());
1223
                                Layer3DProps props3D = getLayer3DProps(layer);
1224
                                System.out.println("    Type " + props3D.getType());
1225
                                System.out.println("    TOC Order " + props3D.getTocOrder());
1226
                                System.out.println("    Planet Order "
1227
                                                + props3D.getPlanetOrder());
1228
                        }
1229
                }
1230
        }
1231

    
1232
        /**
1233
         * Crea un nuevo MapContext(3D) a partir del XMLEntity.
1234
         * 
1235
         * @param xml
1236
         *            XMLEntity
1237
         * 
1238
         * @return Nuevo MapContext3D.
1239
         * 
1240
         * @throws XMLException
1241
         */
1242
        public static MapContext createFromXML(XMLEntity xml) throws XMLException {
1243
                ViewPort3D vp = (ViewPort3D) ViewPort3D.createFromXML(xml.getChild(0));
1244

    
1245
                FLayers layers = new FLayers3D(null, null, vp);
1246
                layers.setXMLEntity(xml.getChild(1));
1247

    
1248
                MapContext fmap = layers.getMapContext();
1249

    
1250
                return fmap;
1251
        }
1252

    
1253
        public static MapContext createFromXML03(XMLEntity xml) throws XMLException {
1254
                ViewPort vp = ViewPort.createFromXML03(xml.getChild(0));
1255

    
1256
                FLayers layers = new FLayers3D(null, null, vp);
1257
                layers.setXMLEntity03(xml.getChild(1));
1258

    
1259
                MapContext fmap = layers.getMapContext();
1260

    
1261
                return fmap;
1262
        }
1263

    
1264
        public GraphicLayer getGraphicsLayer() {
1265
                GraphicLayer3D gra3D = new GraphicLayer3D(this.planetViewer,
1266
                                getPlanet());
1267
                return gra3D;
1268
        }
1269

    
1270
        public Node getSpecialNode() {
1271
                Node specialNode = null;
1272
                try {
1273
                        specialNode = planetViewer.getSpecialNode(0);
1274
                } catch (ChildIndexOutOfBoundsExceptions e) {
1275
                        logger.error("Command: " + "Error child index out of bound.", e);
1276
                }
1277
                return specialNode;
1278
        }
1279

    
1280
        public ViewPort getViewPort() {
1281

    
1282
                ViewPort3D vp = (ViewPort3D) super.getViewPort();
1283

    
1284
                if (m_canvas3d != null)
1285
                        vp.setImageSize(new Dimension(planetViewer.getWidth(), planetViewer
1286
                                        .getHeight()));
1287
                vp.setPlanet(this.getPlanet());
1288
                vp.setViewer(this.m_canvas3d);
1289

    
1290
                return vp;
1291
        }
1292

    
1293
        /**
1294
         * M�todo de conveniencia que se usa provisionalmente para solicitar un
1295
         * refresco de todo lo que dependa del FMap (MapContext). Esto provocar�
1296
         * un evento de cambio de orden de capas que obligar� a redibujar todo lo
1297
         * que depende de FMap (TOC, MapControl, FFrameView, etc).
1298
         */
1299
        public void invalidate() {
1300
                ViewPort3D vp = (ViewPort3D) super.getViewPort();
1301
                if (vp.getDirty()) {
1302
                        vp.setDirty(false);
1303
                        // extentAux = vport.getExtent();
1304

    
1305
                        // Comento el zoom pq no kiero q me lo haga y me cambie la vista
1306
                        // cuando repinto
1307

    
1308
                        // this.zoomToExtent(vp.getExtent());
1309
                        // System.out.println("extend seleccionado: \n Centro: "
1310
                        // + extentAux.getCenterX() + "\n Alto: " + extentAux.getHeight()
1311
                        // + "\n Ancho: " + extentAux.getWidth());
1312

    
1313
                        // TEST
1314

    
1315
                        // Updating all the layers. This operation synchronize the
1316
                        // transparency layer with layer transparency planet layer.
1317
                        // Getting all selected Extent
1318

    
1319
                }
1320
                FLayer[] selectedExtent = getLayers().getActives();
1321

    
1322
                if (selectedExtent.length > 0) {
1323
                        for (int i = 0; i < selectedExtent.length; i++) {
1324
                                if (selectedExtent[0].isAvailable()) {
1325

    
1326
                                        FLayer lyr3D = selectedExtent[i];
1327
                                        Layer3DProps layer3DProps = Layer3DProps
1328
                                                        .getLayer3DProps(lyr3D);
1329

    
1330
                                        int order = layer3DProps.getPlanetOrder();
1331
                                        // float opacity = layer3DProps.getOpacity();
1332
                                        float opacity = (((FLyrDefault) lyr3D).getTransparency())
1333
                                                        / (float) 255;
1334
                                        // Notify the opacity to planet
1335
                                        this.m_planet.setTextureOpacityLayer(order, opacity);
1336
                                }
1337
                        }
1338

    
1339
                }
1340
                // super.invalidate();
1341

    
1342
                m_canvas3d.repaint();
1343
                //m_canvas3d.getOSGViewer().releaseGLContext();
1344
                //m_canvas3d.getOSGViewer().configureGLContext();
1345
        }
1346

    
1347
        public void selectionChanged(SelectionEvent e) {
1348
                // TODO Auto-generated method stub
1349
                for (int iType = 0; iType < 3; iType++) {
1350
                        ArrayList layerList = (ArrayList) m_layerLists.get(iType);
1351
                        for (int iLayer = 0; iLayer < layerList.size(); iLayer++) {
1352

    
1353
                                FLayer layer = (FLayer) layerList.get(iLayer);
1354
                                if (layer.getClass().equals(FLyrVect.class)) {
1355
                                        FLyrVect lyr = (FLyrVect) layer;
1356

    
1357
                                        FBitSet selection = null;
1358
                                        try {
1359
                                                selection = lyr.getRecordset().getSelectionSupport()
1360
                                                                .getSelection();
1361
                                        } catch (ReadDriverException e1) {
1362
                                                // TODO Auto-generated catch block
1363
                                                e1.printStackTrace();
1364
                                        }
1365

    
1366
                                        // if (!(selection.isEmpty())){
1367
                                        if ((selection.cardinality() == 0)
1368
                                                        || (!(selection.isEmpty()))) {
1369
                                                Layer3DProps props = Layer3DProps
1370
                                                                .getLayer3DProps(layer);
1371
                                                refreshLayerInPlanet(props, true);
1372
                                                if (layer instanceof FLyrVect) {
1373
                                                        FLyrVect fvect = (FLyrVect) layer;
1374
                                                        props.drawVersion = fvect.getDrawVersion();
1375
                                                }
1376
                                        }
1377
                                }
1378

    
1379
                        }
1380
                }
1381
                m_canvas3d.repaint();
1382

    
1383
        }
1384

    
1385
        synchronized public void requestElevationLayer(RequestLayerEvent rle) {
1386

    
1387
                // TODO : All this method are not tested
1388
                // ignore for now
1389

    
1390
                /* UNCOMENT FOR TEST IT */
1391
                int order = rle.getOrder();
1392
                ArrayList imageLayers = (ArrayList) m_layerLists
1393
                                .get(Layer3DProps.layer3DElevation);
1394
                FLayer layer = (FLayer) imageLayers.get(order);
1395
                if ((layer == null) || (!layer.isVisible()))
1396
                        return;
1397

    
1398
                Layer3DProps props3D = getLayer3DProps(layer);
1399
                // get/create cache service
1400
                FLayerCacheService cacheService = (FLayerCacheService) props3D
1401
                                .getCacheService();
1402
                if (cacheService == null) {
1403
                        cacheService = new FLayerCacheService(m_planet, props3D
1404
                                        .getCacheName(), layer, m_viewProjection);
1405
                        cacheService.setCacheRootDir(Layer3DProps.m_cacheDir);
1406
                        props3D.setCacheService(cacheService);
1407
                }
1408

    
1409
                int dataType = props3D.getType();
1410
                Point tileIndices = new Point(rle.getX(), rle.getY());
1411
                TileNum tileNum = new TileNum(rle.getLevel(), tileIndices);
1412

    
1413
                String tileFileName;
1414
                double minX = rle.getMinX();
1415
                double minY = rle.getMinY();
1416
                double width = rle.getMaxX() - rle.getMinX();
1417
                double height = rle.getMaxY() - rle.getMinY();
1418
                // Rectangle2D extent = new Rectangle2D.Double(Math.toDegrees(minX),
1419
                // Math.toDegrees(minY), Math.toDegrees(width), Math.toDegrees(height));
1420
                Rectangle2D extent = new Rectangle2D.Double(minX, minY, width, height);
1421
                if (cacheService.intersectsLayer(extent)) { // extent test
1422
                        // if (cacheService.intersectsLayer(extent)) {
1423
                        // System.out.println("Extetn del evento " + minX + " " + minY + " "
1424
                        // + width + " " + height);
1425
                        try {
1426
                                // tileFileName = cacheService.getTileAsFName(tileNum,extent);
1427
                                tileFileName = cacheService.getTileAsFName(tileNum, extent);
1428
                        } catch (Exception e) {
1429
                                m_planet.setFailHeightField(rle.getTerrainNode(), order);
1430
                                return;
1431
                        }
1432

    
1433
                        if (dataType == Layer3DProps.layer3DElevation) {
1434
                                String fileExtension = "tif";
1435
                                // evt.getTilePagedLod().setHeightField(tileFileName,
1436
                                // fileExtension, order);
1437
                                m_planet.setHeightfield(rle.getTerrainNode(), tileFileName,
1438
                                                order);
1439
                                // m_planet.setVerticalExaggeration(order,
1440
                                // ((ProjectView3D) this.m_viewProjection)
1441
                                // .getVerticalExaggeration());
1442
                                m_planet.setVerticalExaggerationLayer(order, props3D
1443
                                                .getVerticalEx());
1444

    
1445
                        }
1446
                } else { // no intersection for elevation layer
1447
                        // This code are not correctly for elevation layer
1448
                        if (dataType == Layer3DProps.layer3DImage) {
1449
                                m_planet.setHeightfield(rle.getTerrainNode(), "", order);
1450
                                // evt.getTilePagedLod().setHeightField("", "", order);
1451
                        }
1452
                }
1453

    
1454
                // REPAINTING VIEWWER
1455
                if (m_canvas3d != null)
1456
                        m_canvas3d.repaint();
1457

    
1458
        }
1459

    
1460
        synchronized public void requestTextureLayer(RequestLayerEvent rle) {
1461

    
1462
                int order = rle.getOrder();
1463
                ArrayList imageLayers = (ArrayList) m_layerLists
1464
                                .get(Layer3DProps.layer3DImage);
1465

    
1466
                // if there are not one layer return
1467
                if (imageLayers.size() == 0)
1468
                        return;
1469
                FLayer layer = (FLayer) imageLayers.get(order);
1470
                if ((layer == null) || (!layer.isVisible()))
1471
                        return;
1472

    
1473
                Layer3DProps props3D = getLayer3DProps(layer);
1474
                // get/create cache service
1475
                FLayerCacheService cacheService = (FLayerCacheService) props3D
1476
                                .getCacheService();
1477
                if (cacheService == null) {
1478
                        cacheService = new FLayerCacheService(m_planet, props3D
1479
                                        .getCacheName(), layer, m_viewProjection);
1480
                        cacheService.setCacheRootDir(Layer3DProps.m_cacheDir);
1481
                        props3D.setCacheService(cacheService);
1482
                }
1483

    
1484
                int dataType = props3D.getType();
1485
                Point tileIndices = new Point(rle.getX(), rle.getY());
1486
                TileNum tileNum = new TileNum(rle.getLevel(), tileIndices);
1487

    
1488
                String tileFileName;
1489
                double minX = rle.getMinX();
1490
                double minY = rle.getMinY();
1491
                double width = rle.getMaxX() - rle.getMinX();
1492
                double height = rle.getMaxY() - rle.getMinY();
1493
                // Rectangle2D extent = new Rectangle2D.Double(Math.toDegrees(minX),
1494
                // Math.toDegrees(minY), Math.toDegrees(width), Math.toDegrees(height));
1495
                Rectangle2D extent = new Rectangle2D.Double(minX, minY, width, height);
1496
                if (cacheService.intersectsLayer(extent)) { // extent test
1497
                        // if (cacheService.intersectsLayer(extent)) {
1498
                        try {
1499
                                tileFileName = cacheService.getTileAsFName(tileNum, extent);
1500
                                // tileFileName = cacheService.getTileAsFName(tileNum);
1501
                                // System.err.println("tile num " + tileNum);
1502
                                // System.err.println("nombre fichero " + tileFileName);
1503
                        } catch (Exception e) {
1504
                                m_planet.setFailTexture(rle.getTerrainNode(), order);
1505
                                return;
1506
                        }
1507

    
1508
                        if (dataType == Layer3DProps.layer3DImage) {
1509
                                // float opacity = 1.0f;
1510
                                String fileExtension = "png";
1511
                                // @TODO:aplicar texturas al planeta
1512
                                // evt.getTilePagedLod().setTexture(tileFileName, fileExtension,
1513
                                // order);
1514
                                m_planet.setTexture(rle.getTerrainNode(), tileFileName, order);
1515
                                m_planet.setTextureOpacityLayer(order, props3D.getOpacity());
1516
                        }
1517
                        /*
1518
                         * else { String fileExtension = "tif";
1519
                         * evt.getTilePagedLod().setHeightField(tileFileName,
1520
                         * fileExtension); }
1521
                         */
1522
                } else { // no intersection
1523
                        if (dataType == Layer3DProps.layer3DImage) {
1524
                                m_planet.setTexture(rle.getTerrainNode(), "", order);
1525
                                // evt.getTilePagedLod().setTexture("", "", order);
1526
                        }
1527
                }
1528

    
1529
                // REPAINTING VIEWWER
1530
                if (m_canvas3d != null)
1531
                        m_canvas3d.repaint();
1532

    
1533
        }
1534

    
1535
        synchronized public void requestVectorLayer(RequestLayerEvent arg0) {
1536
                // TODO Auto-generated method stub
1537

    
1538
        }
1539

    
1540
        public void pepareLayerToRefresh(FLayer layer) {
1541
                // TODO Auto-generated method stub
1542
                Layer3DProps props3D = getLayer3DProps(layer);
1543

    
1544
                if (props3D.getType() == Layer3DProps.layer3DVector) {
1545
                        DeleteVectors(layer, props3D);
1546
                } else if (props3D.getType() == Layer3DProps.layer3DOSG) {
1547
                        DeleteOSGLayer(layer, props3D);
1548
                } else if (props3D.getType() == Layer3DProps.layer3DImage) {
1549
                        m_planet.removeTextureLayer(props3D.getPlanetOrder());
1550
                        ArrayList layerList = (ArrayList) m_layerLists.get(props3D
1551
                                        .getType());
1552

    
1553
                        for (int iLayer = 0; iLayer < layerList.size(); iLayer++) {
1554
                                FLayer eachLayer = (FLayer) layerList.get(iLayer);
1555
                                Layer3DProps eachProps3D = getLayer3DProps(eachLayer);
1556
                                if (eachProps3D.getPlanetOrder() > props3D.getPlanetOrder())
1557
                                        eachProps3D
1558
                                                        .setPlanetOrder(eachProps3D.getPlanetOrder() - 1);
1559
                        }
1560
                        props3D.setPlanetOrder(-1);
1561
                } else if (props3D.getType() == Layer3DProps.layer3DElevation) {
1562
                        m_planet.removeHeightfieldLayer(props3D.getTocOrder());
1563
                }
1564

    
1565
        }
1566

    
1567
        private void DeleteOSGLayer(FLayer layer, Layer3DProps props3D) {
1568
                if (m_planet == null || m_viewProjection == null)
1569
                        return;
1570

    
1571
                OSGCacheService cacheService = (OSGCacheService) props3D
1572
                                .getCacheService();
1573
                if (cacheService != null) {
1574
                        // use VectorCacheService to delete features to planet
1575
                        cacheService.DeleteFeaturesToPlanet();
1576
                }
1577
        }
1578

    
1579
        public void refreshLayer3DProps(FLayer layer) {
1580
                // TODO Auto-generated method stub
1581
                addLayerByType(layer);
1582
                addLayerToPlanet(layer, Layer3DProps.getLayer3DProps(layer)
1583
                                .getTocOrder(), true);
1584

    
1585
        }
1586

    
1587
        public boolean isRenewCanvasOff() {
1588
                return renewCanvasOff;
1589
        }
1590

    
1591
        public void setRenewCanvasOff(boolean renewCanvasOff) {
1592
                this.renewCanvasOff = renewCanvasOff;
1593
        }
1594

    
1595
        public void drawValueChanged(LayerEvent arg0) {
1596
                // TODO Auto-generated method stub
1597

    
1598
        }
1599

    
1600
}