|
| 1 | +<!DOCTYPE html> |
1 | 2 | <html>
|
2 | 3 | <head>
|
3 | 4 | <title>Itowns - Stereo</title>
|
|
18 | 19 | <script src="../dist/itowns.js"></script>
|
19 | 20 | <script src="js/GUI/LoadingScreen.js"></script>
|
20 | 21 | <script src="../dist/debug.js"></script>
|
21 |
| - <script type="text/javascript"> |
22 |
| - var THREE = itowns.THREE; |
| 22 | + |
| 23 | + <script type="importmap"> |
| 24 | + { |
| 25 | + "imports": { |
| 26 | + "three": "https://unpkg.com/[email protected]/build/three.module.js", |
| 27 | + "three/addons/": "https://unpkg.com/[email protected]/examples/jsm/" |
| 28 | + } |
| 29 | + } |
23 | 30 | </script>
|
24 |
| - <script src="https://cdn.rawgit.com/mrdoob/three.js/dev/examples/js/effects/AnaglyphEffect.js"></script> |
25 |
| - <script src="https://cdn.rawgit.com/mrdoob/three.js/dev/examples/js/effects/ParallaxBarrierEffect.js"></script> |
26 |
| - <script src="https://cdn.rawgit.com/mrdoob/three.js/dev/examples/js/effects/StereoEffect.js"></script> |
27 |
| - <script type="text/javascript"> |
| 31 | + |
| 32 | + <script type="module"> |
| 33 | + // Warning: For now, three is imported twice: in the itowns bundle |
| 34 | + // and from the unpkg CDN. |
| 35 | + import * as THREE from 'three'; |
| 36 | + import { AnaglyphEffect } from 'three/addons/effects/AnaglyphEffect.js'; |
| 37 | + import { ParallaxBarrierEffect } from 'three/addons/effects/ParallaxBarrierEffect.js'; |
| 38 | + import { StereoEffect } from 'three/addons/effects/StereoEffect.js'; |
| 39 | + |
28 | 40 | // Define initial camera position
|
29 |
| - var placement = { |
| 41 | + const placement = { |
30 | 42 | coord: new itowns.Coordinates('EPSG:4326', 2.351323, 48.856712),
|
31 | 43 | range: 25000000,
|
32 | 44 | }
|
33 |
| - var promises = []; |
34 |
| - var effect; |
| 45 | + const promises = []; |
| 46 | + let effect; |
35 | 47 |
|
36 | 48 | // `viewerDiv` will contain iTowns' rendering area (`<canvas>`)
|
37 |
| - var viewerDiv = document.getElementById('viewerDiv'); |
| 49 | + const viewerDiv = document.getElementById('viewerDiv'); |
38 | 50 |
|
39 | 51 | // Instanciate iTowns GlobeView*
|
40 |
| - var view = new itowns.GlobeView(viewerDiv, placement); |
| 52 | + const view = new itowns.GlobeView(viewerDiv, placement); |
41 | 53 |
|
42 | 54 | // Eye separation value
|
43 |
| - var eyeSep = 0.064; |
| 55 | + let eyeSep = 0.064; |
44 | 56 |
|
45 | 57 | // Save StereoCamera update function
|
46 |
| - var fnUpdateStereoCamera = itowns.THREE.StereoCamera.prototype.update; |
| 58 | + const fnUpdateStereoCamera = THREE.StereoCamera.prototype.update; |
47 | 59 |
|
48 | 60 | setupLoadingScreen(viewerDiv, view);
|
49 | 61 |
|
50 |
| - itowns.THREE.StereoCamera.prototype.update = function _update(camera) { |
| 62 | + THREE.StereoCamera.prototype.update = function _update(camera) { |
51 | 63 | this.cameraL.far = camera.far;
|
52 | 64 | this.cameraR.far = camera.far;
|
53 | 65 | this.cameraL.layers = camera.layers;
|
|
61 | 73 | // This layer is defined in a json file but it could be defined as a plain js
|
62 | 74 | // object. See Layer* for more info.
|
63 | 75 | itowns.Fetcher.json('./layers/JSONLayers/Ortho.json').then(function _(config) {
|
64 |
| - var source = new itowns.WMTSSource(config.source); |
65 |
| - var layer = new itowns.ColorLayer(config.id, { source }); |
| 76 | + const source = new itowns.WMTSSource(config.source); |
| 77 | + const layer = new itowns.ColorLayer(config.id, { source }); |
66 | 78 | view.addLayer(layer).then(menuGlobe.addLayerGUI.bind(menuGlobe));
|
67 | 79 | });
|
68 | 80 | // Add two elevation layers.
|
69 | 81 | // These will deform iTowns globe geometry to represent terrain elevation.
|
70 | 82 | function addElevationLayerFromConfig(config) {
|
71 | 83 | config.source = new itowns.WMTSSource(config.source);
|
72 |
| - var layer = new itowns.ElevationLayer(config.id, config); |
| 84 | + const layer = new itowns.ElevationLayer(config.id, config); |
73 | 85 | view.addLayer(layer).then(menuGlobe.addLayerGUI.bind(menuGlobe));
|
74 | 86 | }
|
75 | 87 | itowns.Fetcher.json('./layers/JSONLayers/IGN_MNT_HIGHRES.json').then(addElevationLayerFromConfig);
|
|
88 | 100 | if (effect && effect.dispose) {
|
89 | 101 | effect.dispose();
|
90 | 102 | }
|
91 |
| - var g = view.mainLoop.gfxEngine; |
92 |
| - var size = g.getWindowSize(); |
| 103 | + const g = view.mainLoop.gfxEngine; |
| 104 | + const size = g.getWindowSize(); |
93 | 105 | effect = null;
|
94 | 106 | view.render = null;
|
95 | 107 | g.renderer.setViewport(0, 0, size.x, size.y);
|
96 | 108 | view.notifyChange();
|
97 | 109 | }
|
98 | 110 |
|
99 | 111 | function enableEffect(_eff) {
|
100 |
| - var size; |
101 |
| - var g = view.mainLoop.gfxEngine; |
102 |
| - var r = g.renderer; |
| 112 | + let size; |
| 113 | + const g = view.mainLoop.gfxEngine; |
| 114 | + const r = g.renderer; |
103 | 115 |
|
104 | 116 | if (effect) {
|
105 | 117 | disableEffect();
|
|
123 | 135 | * for more information about this effect.
|
124 | 136 | */
|
125 | 137 | function enableAnaglyph() {
|
126 |
| - var _eff; |
127 |
| - if (effect instanceof THREE.AnaglyphEffect) return; |
128 |
| - _eff = new THREE.AnaglyphEffect(view.mainLoop.gfxEngine.renderer, view.camera3D); |
| 138 | + let _eff; |
| 139 | + if (effect instanceof AnaglyphEffect) return; |
| 140 | + _eff = new AnaglyphEffect(view.mainLoop.gfxEngine.renderer, view.camera3D); |
129 | 141 | enableEffect(_eff);
|
130 | 142 | }
|
131 | 143 |
|
|
136 | 148 | * about this effect.
|
137 | 149 | */
|
138 | 150 | function enableParallax() {
|
139 |
| - var _eff; |
140 |
| - if (effect instanceof THREE.ParallaxBarrierEffect) return; |
141 |
| - _eff = new THREE.ParallaxBarrierEffect(view.mainLoop.gfxEngine.renderer, view.camera3D); |
| 151 | + let _eff; |
| 152 | + if (effect instanceof ParallaxBarrierEffect) return; |
| 153 | + _eff = new ParallaxBarrierEffect(view.mainLoop.gfxEngine.renderer, view.camera3D); |
142 | 154 | enableEffect(_eff);
|
143 | 155 | }
|
144 | 156 |
|
145 | 157 | /**
|
146 | 158 | * Activate a stereo effect to the view.
|
147 | 159 | */
|
148 | 160 | function enableStereo() {
|
149 |
| - var _eff; |
150 |
| - if (effect instanceof THREE.StereoEffect) return; |
151 |
| - _eff = new THREE.StereoEffect(view.mainLoop.gfxEngine.renderer, view.camera3D); |
| 161 | + let _eff; |
| 162 | + if (effect instanceof StereoEffect) return; |
| 163 | + _eff = new StereoEffect(view.mainLoop.gfxEngine.renderer, view.camera3D); |
152 | 164 | enableEffect(_eff);
|
153 | 165 | }
|
154 | 166 |
|
155 |
| - var menuGlobe = new GuiTools('menuDiv', view); |
156 |
| - var divScaleWidget = document.getElementById('divScaleWidget'); |
| 167 | + const menuGlobe = new GuiTools('menuDiv', view); |
| 168 | + const divScaleWidget = document.getElementById('divScaleWidget'); |
157 | 169 |
|
158 |
| - var d = new debug.Debug(view, menuGlobe.gui); |
| 170 | + const d = new debug.Debug(view, menuGlobe.gui); |
159 | 171 | debug.createTileDebugUI(menuGlobe.gui, view, view.tileLayer, d);
|
160 | 172 |
|
161 | 173 | const stereoeffect = {
|
|
177 | 189 | guiEyeSep.onChange(updateEyeSep);
|
178 | 190 |
|
179 | 191 | function updateScaleWidget() {
|
180 |
| - var value = view.getPixelsToMeters(200); |
| 192 | + let value = view.getPixelsToMeters(200); |
181 | 193 | value = Math.floor(value);
|
182 |
| - var digit = Math.pow(10, value.toString().length - 1); |
| 194 | + const digit = Math.pow(10, value.toString().length - 1); |
183 | 195 | value = Math.round(value / digit) * digit;
|
184 |
| - var pix = view.getMetersToPixels(value); |
185 |
| - var unit = 'm'; |
| 196 | + const pix = view.getMetersToPixels(value); |
| 197 | + let unit = 'm'; |
186 | 198 | if (value >= 1000) {
|
187 | 199 | value /= 1000;
|
188 | 200 | unit = 'km';
|
|
200 | 212 | view.controls.addEventListener(itowns.CONTROL_EVENTS.RANGE_CHANGED, () => {
|
201 | 213 | updateScaleWidget();
|
202 | 214 | });
|
| 215 | + |
| 216 | + |
| 217 | + // Warning: the following code is not part of this example, those |
| 218 | + // variables are only exposed for internal functional test uses. |
| 219 | + window.view = view; |
| 220 | + |
203 | 221 | </script>
|
204 | 222 | </body>
|
205 | 223 | </html>
|
0 commit comments