Statistics
| Revision:

svn-gvsig-desktop / import / ext3D / trunk / ext3D / src / com / iver / ai2 / gvsig3d / map3d / layers / FLayers3D.java @ 15064

History | View | Annotate | Download (26.9 KB)

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

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

    
8
import org.cresques.cts.IProjection;
9
import org.gvsig.cacheservice.CacheServiceException;
10
import org.gvsig.cacheservice.TileNum;
11

    
12
import com.iver.ai2.gvsig3d.ProjectView3D;
13
import com.iver.ai2.gvsig3d.cacheservices.FLayerCacheService;
14
import com.iver.ai2.gvsig3d.cacheservices.VectorCacheService;
15
import com.iver.ai2.gvsig3d.gui.VectorTest;
16
import com.iver.ai2.gvsig3d.map3d.MapContext3D;
17
import com.iver.ai2.gvsig3d.utils.UtilCoord;
18
import com.iver.cit.gvsig.fmap.DriverException;
19
import com.iver.cit.gvsig.fmap.MapContext;
20
import com.iver.cit.gvsig.fmap.ViewPort;
21
import com.iver.cit.gvsig.fmap.drivers.DriverIOException;
22
import com.iver.cit.gvsig.fmap.layers.FLayer;
23
import com.iver.cit.gvsig.fmap.layers.FLayers;
24
import com.iver.cit.gvsig.fmap.layers.FLyrDefault;
25
import com.iver.cit.gvsig.fmap.layers.FLyrWMS;
26
import com.iver.cit.gvsig.fmap.layers.LayerCollectionEvent;
27
import com.iver.cit.gvsig.fmap.layers.LayerEvent;
28
import com.iver.cit.gvsig.fmap.layers.LayerListener;
29
import com.iver.cit.gvsig.fmap.layers.LayerPositionEvent;
30
import com.iver.cit.gvsig.fmap.layers.LegendListener;
31
import com.iver.cit.gvsig.fmap.layers.SingleLayerIterator;
32
import com.iver.cit.gvsig.fmap.layers.XMLException;
33
import com.iver.cit.gvsig.fmap.layers.layerOperations.Classifiable;
34
import com.iver.cit.gvsig.fmap.rendering.Legend;
35
import com.iver.cit.gvsig.fmap.rendering.LegendChangedEvent;
36
import com.iver.cit.gvsig.fmap.rendering.VectorialLegend;
37
import com.iver.utiles.XMLEntity;
38

    
39
import es.upv.ai2.libjosg.Group;
40
import es.upv.ai2.libjosg.Vec3;
41
import es.upv.ai2.libjosg.Vec4;
42
import es.upv.ai2.libjosg.features.Polyline;
43
import es.upv.ai2.libjosg.features.Text;
44
import es.upv.ai2.libjosg.planets.Planet;
45
import es.upv.ai2.libjosg.planets.RequestLayerListener;
46
import es.upv.ai2.libjosg.planets.TileCreatedListener;
47
import es.upv.ai2.libjosg.planets.TileEvent;
48
import es.upv.ai2.libjosg.planets.Planet.PlanetType;
49
import es.upv.ai2.libjosg.viewer.Camera;
50
import es.upv.ai2.libjosg.viewer.Viewer;
51

    
52
public class FLayers3D extends FLayers implements TileCreatedListener,
53
                RequestLayerListener, LegendListener, LayerListener {
54

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

    
58
        private Viewer m_canvas3d;
59

    
60
        private IProjection m_viewProjection;
61

    
62
        private boolean m_bSettingLayers = false;
63

    
64
        private boolean m_bListenToLegend = true;
65

    
66
        // separate lists for image, elevation and vector layers
67
        private ArrayList m_layerLists = new ArrayList();
68

    
69
        private boolean newView = true;
70

    
71
        /**
72
         * Constructor that can be used to create a MapContext containing the
73
         * FLayers3D
74
         * 
75
         * @param fmap
76
         *            MapContext (can be null)
77
         * @param parent
78
         *            FLayers (can be null)
79
         */
80
        public FLayers3D(MapContext fmap, FLayers parent, ViewPort vp) {
81

    
82
                super(fmap, parent);
83
                if (fmap == null) {
84
                        MapContext newMap = new MapContext3D(this, vp);
85
                        this.fmap = newMap;
86
                } else {
87
                        fmap.setViewPort(vp);
88
                }
89

    
90
                ArrayList textureLayers = new ArrayList();
91
                ArrayList elevationLayers = new ArrayList();
92
                ArrayList vectorLayers = new ArrayList();
93
                m_layerLists.add(textureLayers);
94
                m_layerLists.add(elevationLayers);
95
                m_layerLists.add(vectorLayers);
96
        }
97

    
98
        public void setPlanet(Planet planet) {
99
                if (planet == m_planet)
100
                        return;
101

    
102
                m_planet = planet;
103

    
104
                // add layers to planet
105

    
106
                for (int iType = 0; iType < 3; iType++) {
107
                        ArrayList layerList = (ArrayList) m_layerLists.get(iType);
108
                        for (int iLayer = 0; iLayer < layerList.size(); iLayer++) {
109

    
110
                                FLayer layer = (FLayer) layerList.get(iLayer);
111
                                try {
112
                                        m_planet.addTexture(layer.getFullExtent(), 0);
113
                                } catch (DriverException e) {
114
                                        // TODO Auto-generated catch block
115
                                        e.printStackTrace();
116
                                }
117
                        }
118
                        if (iType == Layer3DProps.layer3DElevation && layerList.size() > 0)
119
                                m_planet.invalidateHeightfield(0);
120
                }
121
        }
122

    
123
        public void setViewer(Viewer canvas) {
124
                m_canvas3d = canvas;
125
        }
126

    
127
        // overrides for layer collection events
128

    
129
        protected void callLayerAdded(LayerCollectionEvent event) {
130
                FLayer layer = event.getAffectedLayer();
131
                layerAddedEvent(layer);
132
                super.callLayerAdded(event);
133
        }
134

    
135
        protected void callLayerRemoved(LayerCollectionEvent event) {
136
                FLayer layer = event.getAffectedLayer();
137
                layerRemovedEvent(layer);
138
                super.callLayerRemoved(event);
139
        }
140

    
141
        protected void callLayerMoved(LayerPositionEvent event) {
142
                super.callLayerMoved(event);
143

    
144
                FLayer layer = event.getAffectedLayer();
145
                Layer3DProps props3D = getLayer3DProps(layer);
146
                if (props3D.getType() != Layer3DProps.layer3DImage)
147
                        return;
148

    
149
                // remove 'old' layer in list
150
                ArrayList layerList = (ArrayList) m_layerLists.get(props3D.getType());
151
                int currentOrder = props3D.getOrder();
152
                layerList.remove(currentOrder);
153

    
154
                int newOrder = addLayerByType(layer);
155
                if (currentOrder == newOrder)
156
                        return;
157

    
158
                m_planet.reorderTexture(currentOrder, newOrder);
159

    
160
                PrintDebugLayers();
161
                // REPAINTING VIEWER
162
                if (m_canvas3d != null)
163
                        m_canvas3d.repaint();
164
        }
165

    
166
        protected void layerAddedEvent(FLayer layer) {
167

    
168
                if (layer instanceof Classifiable) {
169
                        Classifiable legendLyr = (Classifiable) layer;
170
                        legendLyr.addLegendListener((LegendListener) this);
171
                }
172
                layer.addLayerListener((LayerListener) this);
173

    
174
                // if (layer instanceof FLyrWMS) {
175
                // FLyrWMS wmsLayer = (FLyrWMS) layer;
176
                // wmsLayer.setSRS("EPSG:4326");
177
                // }
178

    
179
                int order = addLayerByType(layer);
180
                Layer3DProps props3D = getLayer3DProps(layer);
181

    
182
                if (!m_bSettingLayers) {
183

    
184
                        if (props3D.getType() == Layer3DProps.layer3DVector)
185
                                CreateVectors(layer, props3D); // special case for now without
186
                        // disk cache
187
                        else {
188
                                try {
189
                                        if (props3D.getType() == Layer3DProps.layer3DElevation)
190
                                                m_planet.addHeightfield(layer.getFullExtent(), 3);
191
                                        else if (props3D.getType() == Layer3DProps.layer3DImage) {
192
                                                m_planet.addTexture(layer.getFullExtent(), 0);
193
                                                ArrayList imageList = (ArrayList) m_layerLists
194
                                                                .get(Layer3DProps.layer3DImage);
195
                                                int currentOrder = imageList.size() - 1;
196
                                                if (currentOrder != order)
197
                                                        m_planet.reorderTexture(currentOrder, order);
198
                                        }
199
                                        // REPAINTING VIEWER
200
                                        if (m_canvas3d != null)
201
                                                m_canvas3d.repaint();
202
                                } catch (DriverException e) {
203
                                        // TODO Auto-generated catch block
204
                                        e.printStackTrace();
205
                                }
206

    
207
                                m_bListenToLegend = false;
208
                                props3D.VerifyLegend(m_planet);
209
                                m_bListenToLegend = true;
210
                        }
211
                }
212

    
213
                // Only do this the first time to add layer
214
                ArrayList layerListI = (ArrayList) m_layerLists
215
                                .get(Layer3DProps.layer3DImage);
216
                ArrayList layerListV = (ArrayList) m_layerLists
217
                                .get(Layer3DProps.layer3DVector);
218

    
219
                if (newView) {
220
                        if ((layerListI.size() == 1) || (layerListV.size() == 1)) {
221
                                // Doing Zoom to extend to layer added
222
                                try {
223
                                        zoomToExtent(layer.getFullExtent(), 0);
224
                                        newView = false;
225
                                } catch (DriverException e) {
226
                                        System.out
227
                                                        .println("ZOOM TO EXTEND DON?T WORK CORRECTLY!!!!");
228
                                        e.printStackTrace();
229
                                }
230
                        }
231
                }
232

    
233
                PrintDebugLayers();
234
        }
235

    
236
        protected void layerRemovedEvent(FLayer layer) {
237

    
238
                if (layer instanceof Classifiable) {
239
                        Classifiable legendLyr = (Classifiable) layer;
240
                        legendLyr.removeLegendListener((LegendListener) this);
241
                }
242
                layer.removeLayerListener((LayerListener) this);
243

    
244
                int order = removeLayerByType(layer);
245

    
246
                Layer3DProps props3D = getLayer3DProps(layer);
247

    
248
                if (props3D.getType() == Layer3DProps.layer3DVector) {
249
                        DeleteVectors(layer, props3D);
250
                } else {
251
                        m_planet.removeTexture(order);
252
                }
253

    
254
                // REPAINTING VIEWER
255
                if (m_canvas3d != null)
256
                        m_canvas3d.repaint();
257
                
258
                
259
                ArrayList layerListI = (ArrayList) m_layerLists
260
                                .get(Layer3DProps.layer3DImage);
261
                ArrayList layerListV = (ArrayList) m_layerLists
262
                                .get(Layer3DProps.layer3DVector);
263
                // All layers are removed
264
                if ((layerListI.size() == 0) && (layerListV.size() == 0)) {
265
                        newView = true;
266
                }
267

    
268
                PrintDebugLayers();
269
        }
270

    
271
        /**
272
         * DOCUMENT ME!
273
         * 
274
         * @param e
275
         *            DOCUMENT ME!
276
         */
277
        public void legendChanged(LegendChangedEvent e) {
278

    
279
                if (!m_bListenToLegend)
280
                        return;
281

    
282
                VectorialLegend newLegend = e.getNewLegend();
283
                // find layer whose legend changed
284
                FLayer found = null;
285
                SingleLayerIterator lyrIterator = new SingleLayerIterator(this);
286
                while (lyrIterator.hasNext()) {
287
                        FLayer lyr = lyrIterator.next();
288
                        if (lyr instanceof Classifiable) {
289
                                Classifiable classLyr = (Classifiable) lyr;
290
                                Legend legend = classLyr.getLegend();
291
                                if (legend instanceof VectorialLegend) {
292
                                        if ((VectorialLegend) legend == newLegend) {
293
                                                found = lyr;
294
                                                break;
295
                                        }
296
                                }
297
                        }
298
                }
299

    
300
                if (found != null) {
301
                        Layer3DProps props3D = getLayer3DProps(found);
302
                        refreshLayerInPlanet(props3D, true);
303
                        m_bListenToLegend = false;
304
                        props3D.VerifyLegend(m_planet);
305
                        m_bListenToLegend = true;
306
                        // REPAINTING VIWER
307
                        if (m_canvas3d != null)
308
                                m_canvas3d.repaint();
309
                }
310
        }
311

    
312
        public void visibilityChanged(LayerEvent e) {
313
                FLayer lyr = e.getSource();
314

    
315
                Layer3DProps props3D = getLayer3DProps(lyr);
316

    
317
                if (props3D.getType() == Layer3DProps.layer3DVector) {
318
                        refreshLayerVectorsVisibility(lyr);
319
                } else {
320
                        refreshLayerVisibility(lyr);
321
                }
322
                m_canvas3d.repaint();
323
        }
324

    
325
        private void refreshLayerVectorsVisibility(FLayer lyr) {
326
                if (m_planet == null || m_viewProjection == null)
327
                        return;
328

    
329
                Layer3DProps props3D = getLayer3DProps(lyr);
330

    
331
                VectorCacheService cacheService = (VectorCacheService) props3D
332
                                .getCacheService();
333
                if (cacheService != null) {
334
                        // use VectorCacheService to add features to planet
335
                        cacheService.refreshFeaturesToPlanet(lyr.isVisible());
336
                }
337

    
338
        }
339

    
340
        public void activationChanged(LayerEvent e) {
341
                // TODO Auto-generated method stub
342
        }
343

    
344
        public void nameChanged(LayerEvent e) {
345
                // TODO Auto-generated method stub
346
        }
347

    
348
        public void editionChanged(LayerEvent e) {
349
                // TODO Auto-generated method stub
350
        }
351

    
352
        protected Layer3DProps getLayer3DProps(FLayer layer) {
353
                Layer3DProps props3D = Layer3DProps.getLayer3DProps(layer);
354
                if (props3D == null) {
355
                        props3D = new Layer3DProps();
356
                        props3D.setLayer(layer);
357
                        props3D.initCacheName(m_planet.getType(), m_viewProjection);
358
                        FLyrDefault baseLayer = (FLyrDefault) layer;
359
                        baseLayer.setProperty("3DLayerExtension", props3D);
360
                } else
361
                        props3D.setLayer(layer);
362

    
363
                return props3D;
364
        }
365

    
366
        public void refreshLayerInPlanet(Layer3DProps props, boolean bRemoveCache) {
367
                if (props == null)
368
                        return;
369

    
370
                if (m_planet == null)
371
                        return; // view not opened yet
372

    
373
                // clear cache
374

    
375
                if (bRemoveCache) {
376
                        String layerCacheDir = Layer3DProps.m_cacheDir + "/"
377
                                        + m_planet.getPlanetName() + "/" + props.getCacheName();
378
                        removeCache(layerCacheDir);
379
                }
380

    
381
                // refresh layer in planet
382

    
383
                int type = props.getType();
384
                if (type == Layer3DProps.layer3DImage) {
385
                        int order = props.getOrder();
386
                        // m_planet.refreshTextureInfo(order);
387
                        m_planet.invalidateTexture(order);
388
                } else if (type == Layer3DProps.layer3DElevation) {
389
                        m_planet.invalidateHeightfield(0);
390
                } else if (type == Layer3DProps.layer3DVector) {
391
                        invalidateVectorLayer(props);
392
                }
393

    
394
                // REPAINTING VIEWER
395
                if (m_canvas3d != null)
396
                        m_canvas3d.repaint();
397
        }
398

    
399
        private void invalidateVectorLayer(Layer3DProps props) {
400
                // TODO Auto-generated method stub
401
                if (m_planet == null || m_viewProjection == null)
402
                        return;
403

    
404
                VectorCacheService cacheService = (VectorCacheService) props
405
                                .getCacheService();
406
                if (cacheService != null) {
407
                        // use VectorCacheService to add features to planet
408
                        cacheService.RefreshFeaturesToPlanet();
409
                }
410
        }
411

    
412
        private boolean removeCache(String folder) {
413
                File dir = new File(folder);
414
                if (dir.isDirectory()) {
415
                        String[] children = dir.list();
416
                        for (int i = 0; i < children.length; i++) {
417
                                boolean success = removeCache(folder + "/" + children[i]);
418
                                if (!success) {
419
                                        return false;
420
                                }
421
                        }
422
                }
423

    
424
                // The directory is now empty so delete it
425
                return dir.delete();
426
        }
427

    
428
        private void refreshLayerVisibility(FLayer layer) {
429

    
430
                Layer3DProps props3D = getLayer3DProps(layer);
431
                if (props3D.getType() == Layer3DProps.layer3DImage) {
432
                        m_planet.setEnabledTexture(props3D.getOrder(), layer.isVisible());
433
                }
434
                if (props3D.getType() == Layer3DProps.layer3DElevation) {
435
                        m_planet.setEnabledHeightfield(0, layer.isVisible());
436
                }
437
                // REPAINTING VIEWER
438
                if (m_canvas3d != null)
439
                        m_canvas3d.repaint();
440
        }
441

    
442
        private int addLayerByType(FLayer layer) {
443
                int resultOrder = -1;
444

    
445
                int typeOrder[] = new int[3];
446
                typeOrder[Layer3DProps.layer3DImage] = 0;
447
                typeOrder[Layer3DProps.layer3DElevation] = 0;
448
                typeOrder[Layer3DProps.layer3DVector] = 0;
449

    
450
                SingleLayerIterator lyrIterator = new SingleLayerIterator(this);
451
                while (lyrIterator.hasNext()) {
452
                        FLayer lyr = lyrIterator.next();
453
                        Layer3DProps props3D = getLayer3DProps(lyr);
454
                        int type = props3D.getType();
455
                        props3D.setOrder(typeOrder[type]);
456
                        typeOrder[type] += 1;
457

    
458
                        if (layer == lyr) {
459
                                resultOrder = props3D.getOrder();
460
                                ArrayList layerList = (ArrayList) m_layerLists.get(type);
461
                                if (resultOrder == layerList.size()
462
                                                || layerList.get(resultOrder) != layer)
463
                                        layerList.add(resultOrder, layer);
464
                        }
465
                }
466

    
467
                return resultOrder;
468
        }
469

    
470
        private int removeLayerByType(FLayer layer) {
471

    
472
                Layer3DProps props3D = getLayer3DProps(layer);
473
                ArrayList layerList = (ArrayList) m_layerLists.get(props3D.getType());
474
                int currentOrder = props3D.getOrder();
475
                layerList.remove(currentOrder);
476

    
477
                for (int i = currentOrder; i < layerList.size(); i++) {
478
                        FLayer lyrAux = (FLayer) layerList.get(i);
479
                        Layer3DProps props3DAux = getLayer3DProps(lyrAux);
480
                        props3DAux.setOrder(i);
481
                }
482
                return currentOrder;
483
        }
484

    
485
        private void CreateVectors(FLayer layer, Layer3DProps props3D) {
486
                if (m_planet == null || m_viewProjection == null)
487
                        return;
488

    
489
                VectorCacheService cacheService = (VectorCacheService) props3D
490
                                .getCacheService();
491
                if (cacheService == null) {
492
                        cacheService = new VectorCacheService(m_canvas3d, m_planet, props3D
493
                                        .getCacheName(), layer, m_viewProjection);
494
                        cacheService.setCacheRootDir(Layer3DProps.m_cacheDir);
495
                        props3D.setCacheService(cacheService);
496
                }
497

    
498
                // use VectorCacheService to add features to planet
499
                cacheService.AddFeaturesToPlanet();
500
        }
501

    
502
        private void DeleteVectors(FLayer layer, Layer3DProps props3D) {
503
                if (m_planet == null || m_viewProjection == null)
504
                        return;
505

    
506
                VectorCacheService cacheService = (VectorCacheService) props3D
507
                                .getCacheService();
508
                if (cacheService != null) {
509
                        // use VectorCacheService to delete features to planet
510
                        cacheService.DeleteFeaturesToPlanet();
511
                }
512
        }
513

    
514
        // Object persistence
515

    
516
        /**
517
         * Devuelve el XMLEntity a partir del objeto.
518
         * 
519
         * @return XMLEntity.
520
         * @throws XMLException
521
         */
522
        public XMLEntity getXMLEntity() throws XMLException {
523
                XMLEntity xml = super.getXMLEntity();
524

    
525
                // A?adir aqu? algo si hace falta para 3D
526

    
527
                return xml;
528
        }
529

    
530
        /**
531
         * Inserta los valores de los atributos del XMLEntity al objeto.
532
         * 
533
         * @param xml
534
         *            XMLEntity.
535
         * 
536
         * @throws XMLException
537
         * @throws DriverException
538
         * @throws DriverIOException
539
         */
540
        public void setXMLEntity(XMLEntity xml) throws XMLException {
541
                m_bSettingLayers = true;
542
                super.setXMLEntity(xml);
543
                m_bSettingLayers = false;
544
        }
545

    
546
        public IProjection getViewProjection() {
547
                return m_viewProjection;
548
        }
549

    
550
        public void setViewProjection(IProjection projection) {
551
                m_viewProjection = projection;
552
        }
553

    
554
        public void zoomToExtent(Rectangle2D geoExtent, double maxHeight) {
555

    
556
                double minLat = geoExtent.getMinY();
557
                double maxLat = geoExtent.getMaxY();
558
                double cenLon = geoExtent.getCenterX();
559
                double cenLat = geoExtent.getCenterY();
560
                boolean gazetteer = false;
561

    
562
                // search for Gazetteer
563
                if ((geoExtent.getHeight() == 0) && (geoExtent.getWidth() == 0)) {
564
                        cenLon = geoExtent.getX();
565
                        cenLat = geoExtent.getY();
566
                        gazetteer = true;
567
                        // TODO: Insercion de un simbolo para situar al objeto buscado en
568
                        // Nomenglator
569

    
570
                        Vec3 posI = null, posE = null, posT = null;
571
                        Vec3 posIni = null, posEnd = null, posText = null;
572

    
573
                        if (m_planet.getType() == Planet.PlanetType.SPHERICAL_MODE) {
574
                                posI = new Vec3(cenLat, cenLon, 0);
575
                                posE = new Vec3(cenLat, cenLon, 16000);
576
                                posT = new Vec3(cenLat, cenLon, 16100);
577

    
578
                                posIni = m_planet.convertLatLongHeightToXYZ(posI);
579
                                posEnd = m_planet.convertLatLongHeightToXYZ(posE);
580
                                posText = m_planet.convertLatLongHeightToXYZ(posT);
581

    
582
                        } else if (m_planet.getType() == Planet.PlanetType.PLANE_MODE) {
583
                                posIni = new Vec3(cenLon, cenLat, 0);
584
                                posEnd = new Vec3(cenLon, cenLat, 100000);
585
                                posText = new Vec3(cenLon, cenLat, 100000);
586

    
587
                                System.out.println("posicion del zoom plano, longitud: "
588
                                                + cenLon + "latitud: " + cenLat);
589
                        }
590

    
591
                        Polyline line = (Polyline) VectorTest.insertLineS(posIni, posEnd,
592
                                        new Vec4(1.0, 1.0, 1.0, 1.0), 0);
593
                        // Text text = (Text) VectorTest.insertTextoS("Gazetteer", posText);
594
                        Text text = (Text) VectorTest.insertTextoS(" Gazetteer", posText,
595
                                        new Vec4(1.0, 1.0, 1.0, 1.0), 3000);
596

    
597
                        Group grupo = (Group) this.m_canvas3d.getSpecialNode(0);
598
                        grupo.addChild(line);
599
                        grupo.addChild(text);
600
                        // PositionAttitudeTransform nodeTransform = new
601
                        // PositionAttitudeTransform();
602
                        // nodeTransform.setPosition(m_planet.convertLatLongHeightToXYZ(pos));
603
                        // nodeTransform.setScale(new Vec3(1.5, 1.5, 1.5));
604
                        //
605
                        // Vec3 posO = new Vec3(0.0, 0.0, 0.0);
606
                        // nodeTransform.addChild(VectorTest.insertTextoS("O", posO));
607
                        // nodeTransform.addChild(VectorTest.insertPointS(pos, new
608
                        // Vec4(1.0f,
609
                        // 1.0f, 1.0f, 1.0f), 10000));
610
                        // //
611
                        // nodeTransform.addChild(m_canvas3d.readNodeFile("c:/modelos3d/cow.osg"));
612
                        // grupo.addChild(nodeTransform);
613
                }
614
                double elevation = 0;
615
                if (gazetteer) {
616
                        elevation = 35000;
617
                } else {
618

    
619
                        // calculate altitude
620
                        double avLat = 0;
621
                        if (minLat > 0.0 || maxLat < 0.0)
622
                                avLat = Math.min(Math.abs(minLat), Math.abs(maxLat));
623
                        double avLon = Math.min(180.0, geoExtent.getWidth());
624

    
625
                        double planetRadius = m_planet.getRadiusEquatorial();
626
                        double radiusLat = planetRadius * Math.cos(Math.toRadians(avLat));
627
                        double deltaLon = Math.sqrt(2 * radiusLat * radiusLat
628
                                        * (1 - Math.cos(Math.toRadians(avLon))));
629
                        double deltaLat = Math.sqrt(2 * planetRadius * planetRadius
630
                                        * (1 - Math.cos(Math.toRadians(geoExtent.getHeight()))));
631

    
632
                        double zoomFactor = 1.0;
633
                        elevation = (Math.max(deltaLon, deltaLat) * zoomFactor) + maxHeight;
634
                }
635

    
636
                // Calculate XYZ positions for camera. TODO: define utilities
637
                // to go from GeoCoords to XYZ and viceversa
638

    
639
                int planetType = this.m_planet.getType();
640

    
641
                Vec3 eye = new Vec3();
642
                Vec3 center = new Vec3();
643
                Vec3 up = new Vec3();
644
                // Calculate positions for PLAIN MODE.
645
                if (planetType == PlanetType.PLANE_MODE) {
646

    
647
                        double difx = (geoExtent.getWidth() - geoExtent.getX()) / 2.0d;
648
                        double dify = (geoExtent.getHeight() - geoExtent.getY()) / 2.0d;
649
                        double posx = geoExtent.getX() + difx;
650
                        double posy = geoExtent.getY() + dify;
651

    
652
                        double height;
653
                        height = Math.sqrt(difx * difx + dify * dify);
654

    
655
                        // TESTING FOR PLANE MODE
656

    
657
                        // EYE
658
                        eye.setX(cenLon);
659
                        eye.setY(cenLat);
660
                        eye.setZ(height);
661
                        // eye.setZ(5000000 * 4.6);
662
                        // CENTER
663
                        center.setX(cenLon);
664
                        center.setY(cenLat);
665
                        center.setZ(0.0);
666
                        // UP
667
                        up.setX(0.0);
668
                        up.setY(1.0);
669
                        up.setZ(0.0);
670
                } else
671
                // Calculate positions for SPHERICAL MODE.
672
                if (planetType == PlanetType.SPHERICAL_MODE) {
673
                        // EYE
674
                        // eye = UtilCoord.GeoToCarte((planetRadius + elevation), cenLon,
675
                        // cenLat);
676
                        Vec3 aux = new Vec3(cenLat, cenLon, elevation);
677
                        eye = m_planet.convertLatLongHeightToXYZ(aux);
678
                        // Vec3 aux1 = new Vec3((planetRadius + elevation), cenLon, cenLat);
679
                        // eye = UtilCoord.GeoToCarte(aux1);
680
                        // CENTER
681
                        center.setX(0.0);
682
                        center.setY(0.0);
683
                        center.setZ(0.0);
684
                        // UP
685
                        up.setX(0.0);
686
                        up.setY(0.0);
687
                        up.setZ(1.0);
688
                }
689
                Camera cam = new Camera();
690
                cam.setViewByLookAt(eye, center, up);
691

    
692
                UtilCoord.imprimeCamara(cam);
693

    
694
                m_canvas3d.setCamera(cam);
695
                // REPAINTING VIEWER
696
                if (m_canvas3d != null)
697
                        m_canvas3d.repaint();
698

    
699
        }
700

    
701
        public void tileCreated(TileEvent evt) {
702
                int textureStage = 0;
703
                int MDTStage = 0;
704

    
705
                SingleLayerIterator lyrIterator = new SingleLayerIterator(this);
706
                while (lyrIterator.hasNext()) {
707
                        FLayer lyr = lyrIterator.next();
708

    
709
                        Layer3DProps props3D = getLayer3DProps(lyr);
710
                        int dataType = props3D.getType();
711

    
712
                        if (lyr.isVisible()) {
713
                                // if (true) {
714
                                if (dataType == Layer3DProps.layer3DVector)
715
                                        continue;
716

    
717
                                // get/create cache service
718
                                FLayerCacheService cacheService = (FLayerCacheService) props3D
719
                                                .getCacheService();
720
                                if (cacheService == null) {
721
                                        cacheService = new FLayerCacheService(m_planet, props3D
722
                                                        .getCacheName(), lyr, m_viewProjection);
723
                                        cacheService.setCacheRootDir(Layer3DProps.m_cacheDir);
724
                                        props3D.setCacheService(cacheService);
725
                                }
726

    
727
                                Point tileIndices = new Point(evt.getX(), evt.getY());
728
                                TileNum tileNum = new TileNum(evt.getLevel(), tileIndices);
729

    
730
                                String tileFileName;
731

    
732
                                if (cacheService.intersectsLayer(tileNum)) { // extent test
733
                                        try {
734
                                                tileFileName = cacheService.getTileAsFName(tileNum);
735
                                        } catch (CacheServiceException e) {
736
                                                return;
737
                                        }
738

    
739
                                        if (dataType == Layer3DProps.layer3DImage) {
740
                                                // float opacity = 1.0f;
741
                                                String fileExtension = "png";
742
                                                evt.getTilePagedLod().setTexture(tileFileName,
743
                                                                fileExtension, textureStage);
744
                                                m_planet.setTextureOpacity(textureStage, props3D
745
                                                                .getOpacity());
746
                                                textureStage++;
747
                                        } else if (dataType == Layer3DProps.layer3DElevation) {
748
                                                String fileExtension = "tif";
749
                                                evt.getTilePagedLod().setHeightField(tileFileName,
750
                                                                fileExtension, MDTStage);
751
//                                                m_planet.setVerticalExaggeration(MDTStage,
752
//                                                                ((ProjectView3D) this.m_viewProjection)
753
//                                                                                .getVerticalExaggeration());
754
                                                m_planet.setVerticalExaggeration(MDTStage,props3D.getVerticalEx());
755
                                                MDTStage++;
756
                                        }
757
                                } else { // no intersection
758
                                        if (dataType == Layer3DProps.layer3DImage) {
759
                                                evt.getTilePagedLod()
760
                                                                .setTexture("", "", textureStage++);
761
                                        }
762
                                        if (dataType == Layer3DProps.layer3DElevation) {
763
                                                evt.getTilePagedLod().setHeightField("", "", MDTStage);
764
                                        }
765
                                }
766
                        } else {
767
                                if (dataType == Layer3DProps.layer3DImage) {
768
                                        textureStage++;
769
                                }
770
                                if (dataType == Layer3DProps.layer3DElevation) {
771
                                        MDTStage++;
772
                                }
773
                        }
774

    
775
                        // REPAINTING VIEWER
776
                        if (m_canvas3d != null)
777
                                m_canvas3d.repaint();
778

    
779
                }
780

    
781
        }
782

    
783
        public void requestMDTLayer(TileEvent evt) {
784

    
785
                // TODO : All this method are not tested
786
                // ignore for now
787

    
788
                /* ********** UNCOMENT FOR TEST IT *************************** */
789
                int order = evt.getRequestedLayer();
790
                ArrayList imageLayers = (ArrayList) m_layerLists
791
                                .get(Layer3DProps.layer3DElevation);
792
                FLayer layer = (FLayer) imageLayers.get(order);
793
                if ((layer == null) || (!layer.isVisible()))
794
                        return;
795

    
796
                Layer3DProps props3D = getLayer3DProps(layer);
797
                // get/create cache service
798
                FLayerCacheService cacheService = (FLayerCacheService) props3D
799
                                .getCacheService();
800
                if (cacheService == null) {
801
                        cacheService = new FLayerCacheService(m_planet, props3D
802
                                        .getCacheName(), layer, m_viewProjection);
803
                        cacheService.setCacheRootDir(Layer3DProps.m_cacheDir);
804
                        props3D.setCacheService(cacheService);
805
                }
806

    
807
                int dataType = props3D.getType();
808
                Point tileIndices = new Point(evt.getX(), evt.getY());
809
                TileNum tileNum = new TileNum(evt.getLevel(), tileIndices);
810

    
811
                String tileFileName;
812

    
813
                if (cacheService.intersectsLayer(tileNum)) { // extent test
814
                        try {
815
                                tileFileName = cacheService.getTileAsFName(tileNum);
816
                        } catch (CacheServiceException e) {
817
                                return;
818
                        }
819

    
820
                        if (dataType == Layer3DProps.layer3DElevation) {
821
                                String fileExtension = "tif";
822
                                evt.getTilePagedLod().setHeightField(tileFileName,
823
                                                fileExtension, order);
824
//                                m_planet.setVerticalExaggeration(order,
825
//                                                ((ProjectView3D) this.m_viewProjection)
826
//                                                                .getVerticalExaggeration());
827
                                m_planet.setVerticalExaggeration(order,props3D.getVerticalEx());
828

    
829
                        }
830
                } else { // no intersection for elevation layer
831
                        // This code are not correctly for elevation layer
832
                        if (dataType == Layer3DProps.layer3DImage) {
833
                                evt.getTilePagedLod().setHeightField("", "", order);
834
                        }
835
                }
836

    
837
                // REPAINTING VIEWWER
838
                if (m_canvas3d != null)
839
                        m_canvas3d.repaint();
840

    
841
                /** ************************************************ */
842
        }
843

    
844
        public void requestTextureLayer(TileEvent evt) {
845

    
846
                
847
                int order = evt.getRequestedLayer();
848
                ArrayList imageLayers = (ArrayList) m_layerLists
849
                                .get(Layer3DProps.layer3DImage);
850
                
851
                FLayer layer = (FLayer) imageLayers.get(order);
852
                if ((layer == null) || (!layer.isVisible()))
853
                        return;
854

    
855
                Layer3DProps props3D = getLayer3DProps(layer);
856
                // get/create cache service
857
                FLayerCacheService cacheService = (FLayerCacheService) props3D
858
                                .getCacheService();
859
                if (cacheService == null) {
860
                        cacheService = new FLayerCacheService(m_planet, props3D
861
                                        .getCacheName(), layer, m_viewProjection);
862
                        cacheService.setCacheRootDir(Layer3DProps.m_cacheDir);
863
                        props3D.setCacheService(cacheService);
864
                }
865

    
866
                int dataType = props3D.getType();
867
                Point tileIndices = new Point(evt.getX(), evt.getY());
868
                TileNum tileNum = new TileNum(evt.getLevel(), tileIndices);
869

    
870
                String tileFileName;
871

    
872
                if (cacheService.intersectsLayer(tileNum)) { // extent test
873
                        try {
874
                                tileFileName = cacheService.getTileAsFName(tileNum);
875
                        } catch (CacheServiceException e) {
876
                                return;
877
                        }
878

    
879
                        if (dataType == Layer3DProps.layer3DImage) {
880
                                // float opacity = 1.0f;
881
                                String fileExtension = "png";
882
                                evt.getTilePagedLod().setTexture(tileFileName, fileExtension,
883
                                                order);
884
                                m_planet.setTextureOpacity(order, props3D.getOpacity());
885
                        }
886
                        /*
887
                         * else { String fileExtension = "tif";
888
                         * evt.getTilePagedLod().setHeightField(tileFileName,
889
                         * fileExtension); }
890
                         */
891
                } else { // no intersection
892
                        if (dataType == Layer3DProps.layer3DImage) {
893
                                evt.getTilePagedLod().setTexture("", "", order);
894
                        }
895
                }
896

    
897
                // REPAINTING VIEWWER
898
                if (m_canvas3d != null)
899
                        m_canvas3d.repaint();
900
        }
901

    
902
        private void PrintDebugLayers() {
903
                System.out.println("===========================");
904
                for (int iList = 0; iList < 3; iList++) {
905
                        ArrayList layerList = (ArrayList) m_layerLists.get(iList);
906
                        System.out.println("===== List " + iList + "=====");
907
                        for (int iLayer = 0; iLayer < layerList.size(); iLayer++) {
908
                                FLayer layer = (FLayer) layerList.get(iLayer);
909
                                System.out.println("  Layer " + layer.getName());
910
                                Layer3DProps props3D = getLayer3DProps(layer);
911
                                System.out.println("    Type " + props3D.getType());
912
                                System.out.println("    Order " + props3D.getOrder());
913
                        }
914
                }
915
        }
916

    
917
}