@openglobus/og 0.14.4 → 0.15.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/css/og.css +377 -274
- package/dist/@openglobus/og.css +1 -1
- package/dist/@openglobus/og.esm.js +2 -2
- package/dist/@openglobus/og.esm.js.map +1 -1
- package/dist/@openglobus/og.umd.js +2 -2
- package/dist/@openglobus/og.umd.js.map +1 -1
- package/package.json +18 -17
- package/src/og/Clock.js +218 -194
- package/src/og/Globe.js +1 -3
- package/src/og/Object3d.js +104 -145
- package/src/og/camera/Camera.js +23 -19
- package/src/og/cons.js +107 -107
- package/src/og/control/Atmosphere.js +396 -0
- package/src/og/control/CompassButton.js +11 -18
- package/src/og/control/Control.js +187 -188
- package/src/og/control/GeoImageDragControl.js +84 -66
- package/src/og/control/LayerSwitcher.js +46 -145
- package/src/og/control/Lighting.js +314 -186
- package/src/og/control/RulerSwitcher.js +24 -19
- package/src/og/control/SimpleSkyBackground.js +38 -12
- package/src/og/control/Sun.js +2 -0
- package/src/og/control/ZoomControl.js +30 -42
- package/src/og/control/ruler/RulerScene.js +5 -23
- package/src/og/control/selection/Selection.js +21 -50
- package/src/og/control/selection/SelectionScene.js +15 -29
- package/src/og/control/timeline/TimelineControl.js +99 -0
- package/src/og/control/timeline/TimelineModel.js +133 -0
- package/src/og/control/timeline/TimelineView.js +449 -0
- package/src/og/control/timeline/timelineUtils.js +132 -0
- package/src/og/entity/Entity.js +30 -3
- package/src/og/entity/EntityCollection.js +0 -2
- package/src/og/entity/GeoObject.js +72 -56
- package/src/og/entity/GeoObjectHandler.js +487 -656
- package/src/og/input/input.js +3 -1
- package/src/og/layer/CanvasTiles.js +39 -34
- package/src/og/layer/Layer.js +2 -0
- package/src/og/layer/Material.js +1 -8
- package/src/og/light/LightSource.js +2 -0
- package/src/og/quadTree/Node.js +2 -1
- package/src/og/renderer/Renderer.js +26 -42
- package/src/og/renderer/RendererEvents.js +4 -4
- package/src/og/scene/Planet.js +276 -59
- package/src/og/scene/RenderNode.js +27 -12
- package/src/og/segment/Segment.js +0 -5
- package/src/og/shaders/atmos.js +332 -0
- package/src/og/shaders/drawnode.js +475 -109
- package/src/og/shaders/geoObject.js +96 -51
- package/src/og/shaders/polyline.js +212 -17
- package/src/og/shaders/utils.js +88 -0
- package/src/og/terrain/GlobusTerrain.js +2 -2
- package/src/og/ui/Button.js +106 -0
- package/src/og/ui/ButtonGroup.js +57 -0
- package/src/og/ui/Dialog.js +242 -0
- package/src/og/ui/Slider.js +144 -0
- package/src/og/ui/ToggleButton.js +51 -0
- package/src/og/ui/View.js +190 -0
- package/src/og/utils/shared.js +51 -33
- package/src/og/webgl/Framebuffer.js +308 -387
- package/src/og/webgl/Handler.js +68 -21
- package/src/og/webgl/Multisample.js +8 -0
- package/types/Clock.d.ts +7 -2
- package/types/Object3d.d.ts +14 -3
- package/types/camera/Camera.d.ts +15 -14
- package/types/control/Atmosphere.d.ts +15 -0
- package/types/control/CompassButton.d.ts +1 -2
- package/types/control/GeoImageDragControl.d.ts +7 -1
- package/types/control/LayerSwitcher.d.ts +4 -5
- package/types/control/Lighting.d.ts +32 -7
- package/types/control/SimpleSkyBackground.d.ts +4 -0
- package/types/control/ZoomControl.d.ts +0 -1
- package/types/control/ruler/RulerScene.d.ts +0 -1
- package/types/control/selection/Selection.d.ts +2 -4
- package/types/control/selection/SelectionScene.d.ts +0 -1
- package/types/entity/Entity.d.ts +8 -0
- package/types/entity/GeoObject.d.ts +28 -22
- package/types/entity/GeoObjectHandler.d.ts +16 -56
- package/types/input/input.d.ts +2 -0
- package/types/layer/CanvasTiles.d.ts +1 -0
- package/types/layer/Layer.d.ts +1 -0
- package/types/math/Plane.d.ts +1 -1
- package/types/renderer/Renderer.d.ts +7 -1
- package/types/scene/Planet.d.ts +20 -2
- package/types/scene/RenderNode.d.ts +2 -1
- package/types/segment/Segment.d.ts +1 -1
- package/types/shaders/atmos.d.ts +4 -0
- package/types/shaders/drawnode.d.ts +3 -2
- package/types/shaders/utils.d.ts +1 -0
- package/types/terrain/GlobusTerrain.d.ts +1 -1
- package/types/ui/Button.d.ts +21 -0
- package/types/ui/Dialog.d.ts +41 -0
- package/types/ui/Slider.d.ts +30 -0
- package/types/ui/ToggleButton.d.ts +10 -0
- package/types/ui/View.d.ts +32 -0
- package/types/utils/shared.d.ts +16 -14
- package/types/webgl/Framebuffer.d.ts +2 -5
- package/types/webgl/Handler.d.ts +11 -9
- package/types/webgl/Multisample.d.ts +2 -0
- package/src/og/ajax.js +0 -204
- package/src/og/entity/Object3d.js +0 -504
- package/types/ajax.d.ts +0 -24
- /package/src/og/{control → ui}/UIhelpers.js +0 -0
- /package/types/{control → ui}/UIhelpers.d.ts +0 -0
|
@@ -5,8 +5,18 @@
|
|
|
5
5
|
"use strict";
|
|
6
6
|
|
|
7
7
|
import { Control } from "./Control.js";
|
|
8
|
-
import { elementFactory, appendChildren, toggleText, enableElmovement } from "
|
|
8
|
+
import { elementFactory, appendChildren, toggleText, enableElmovement } from "../ui/UIhelpers.js";
|
|
9
9
|
import { compose } from "../utils/functionComposition.js"
|
|
10
|
+
import { Dialog } from "../ui/Dialog.js";
|
|
11
|
+
import { ToggleButton } from "../ui/ToggleButton.js";
|
|
12
|
+
|
|
13
|
+
const ICON_BUTTON_SVG = `<?xml version="1.0" encoding="utf-8"?>
|
|
14
|
+
<!-- Svg Vector Icons : http://www.onlinewebfonts.com/icon -->
|
|
15
|
+
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
|
16
|
+
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 1000 1000" enable-background="new 0 0 1000 1000" xml:space="preserve">
|
|
17
|
+
<metadata> Svg Vector Icons : http://www.onlinewebfonts.com/icon </metadata>
|
|
18
|
+
<g><path d="M500,573.5c-3.2,0-6.5-0.6-9.5-1.9L25,375.6c-9.1-3.8-15-12.7-15-22.6s5.9-18.8,15-22.6l465.5-196c6.1-2.5,12.9-2.5,19,0l465.5,196c9.1,3.8,15,12.7,15,22.6s-5.9,18.8-15,22.6l-465.5,196C506.5,572.9,503.2,573.5,500,573.5L500,573.5z M97.6,353L500,522.4L902.4,353L500,183.6L97.6,353L97.6,353z"/><path d="M500,720.5c-3.2,0-6.5-0.6-9.5-1.9L25,522.6c-12.4-5.2-18.3-19.6-13.1-32.1c5.2-12.5,19.6-18.3,32.1-13.1l456,192l456-192c12.4-5.2,26.9,0.6,32.1,13.1s-0.6,26.9-13.1,32.1l-465.5,196C506.5,719.9,503.2,720.5,500,720.5L500,720.5z"/><path d="M500,867.5c-3.2,0-6.5-0.6-9.5-1.9L25,669.6c-12.4-5.2-18.3-19.6-13.1-32.1c5.2-12.5,19.6-18.3,32.1-13.1l456,192l456-192c12.4-5.2,26.9,0.6,32.1,13.1c5.2,12.5-0.6,26.8-13.1,32.1l-465.5,196C506.5,866.9,503.2,867.5,500,867.5L500,867.5z"/></g>
|
|
19
|
+
</svg>`;
|
|
10
20
|
|
|
11
21
|
/**
|
|
12
22
|
* Advanced :) layer switcher, includes base layers, overlays, geo images etc. groups.
|
|
@@ -22,25 +32,34 @@ class LayerSwitcher extends Control {
|
|
|
22
32
|
...options
|
|
23
33
|
});
|
|
24
34
|
|
|
25
|
-
this._id = LayerSwitcher.numSwitches++;
|
|
26
35
|
this.switcherDependent = options.switcherDependent
|
|
27
36
|
this.expandedSections = options.expandedSections
|
|
28
|
-
this.switcherInMenu = options.switcherInMenu // none (default)
|
|
29
37
|
this.docListener = options.docListener
|
|
30
|
-
}
|
|
31
38
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
39
|
+
this.dialog = new Dialog({
|
|
40
|
+
title: "Layer Switcher",
|
|
41
|
+
top: 15,
|
|
42
|
+
useHide: true,
|
|
43
|
+
visible: false,
|
|
44
|
+
width: 200
|
|
45
|
+
});
|
|
38
46
|
|
|
39
|
-
|
|
40
|
-
|
|
47
|
+
this._menuBtn = new ToggleButton({
|
|
48
|
+
classList: ["og-map-button", "og-layerswitcher_button"],
|
|
49
|
+
icon: ICON_BUTTON_SVG
|
|
50
|
+
});
|
|
41
51
|
}
|
|
42
52
|
|
|
43
53
|
oninit() {
|
|
54
|
+
|
|
55
|
+
this.dialog.appendTo(this.planet.renderer.div);
|
|
56
|
+
|
|
57
|
+
this.dialog.setPosition(this.planet.renderer.div.clientWidth - this.dialog.width - 67)
|
|
58
|
+
|
|
59
|
+
this.dialog.on("visibility", (v) => {
|
|
60
|
+
this._menuBtn.setActive(v);
|
|
61
|
+
});
|
|
62
|
+
|
|
44
63
|
this.setupSwitcher()
|
|
45
64
|
this.planet.events.on("layeradd", this.addNewLayer, this)
|
|
46
65
|
this.planet.events.on("layerremove", this.removeLayer, this)
|
|
@@ -59,11 +78,7 @@ class LayerSwitcher extends Control {
|
|
|
59
78
|
}
|
|
60
79
|
|
|
61
80
|
ondeactivate() {
|
|
62
|
-
|
|
63
|
-
const $dialog = document.getElementById('og-layer-switcher-dialog')
|
|
64
|
-
$menuBtn.remove()
|
|
65
|
-
$dialog.remove()
|
|
66
|
-
document.removeEventListener('click', (e) => this.docListener(e))
|
|
81
|
+
this.dialog.hide();
|
|
67
82
|
}
|
|
68
83
|
|
|
69
84
|
// BASIC DATA COLLECTION-PREPARATION FUNCTIONS
|
|
@@ -156,7 +171,6 @@ class LayerSwitcher extends Control {
|
|
|
156
171
|
this.dialogSectionStructure('Overlays', 'checkbox', overlays),
|
|
157
172
|
]
|
|
158
173
|
}
|
|
159
|
-
// console.log(myData) // enable this to have a visual representation of the dialog structure
|
|
160
174
|
return myData
|
|
161
175
|
}
|
|
162
176
|
|
|
@@ -167,17 +181,13 @@ class LayerSwitcher extends Control {
|
|
|
167
181
|
}
|
|
168
182
|
|
|
169
183
|
addNewLayer(layer) {
|
|
170
|
-
|
|
171
|
-
const
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
const index = this.recordsStructure().data.findIndex(x => x.name == type)
|
|
178
|
-
object[0].data = [layer]
|
|
179
|
-
this.buildRecords(object[0], targets[index], 1, true)
|
|
180
|
-
}
|
|
184
|
+
const { classifyObject } = this.planetDataBasic()
|
|
185
|
+
const targets = [...document.body.querySelectorAll('.og-layer-switcher-record.og-depth-0 > details')]
|
|
186
|
+
const type = classifyObject(layer)
|
|
187
|
+
const object = this.recordsStructure().data.filter(x => x.name == type)
|
|
188
|
+
const index = this.recordsStructure().data.findIndex(x => x.name == type)
|
|
189
|
+
object[0].data = [layer]
|
|
190
|
+
this.buildRecords(object[0], targets[index], 1, true)
|
|
181
191
|
}
|
|
182
192
|
|
|
183
193
|
removeLayer(layer) {
|
|
@@ -194,130 +204,21 @@ class LayerSwitcher extends Control {
|
|
|
194
204
|
getUserPrefs() {
|
|
195
205
|
const switcherDependency = this.switcherDependent == undefined ? true : this.switcherDependent
|
|
196
206
|
const sectionsOpening = this.expandedSections == undefined ? true : this.expandedSections
|
|
197
|
-
const btnInMenu = this.switcherInMenu == undefined ? true : this.switcherInMenu
|
|
198
207
|
|
|
199
|
-
return { switcherDependency, sectionsOpening
|
|
208
|
+
return { switcherDependency, sectionsOpening }
|
|
200
209
|
}
|
|
201
210
|
|
|
202
211
|
buildBasicDOM() {
|
|
203
212
|
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
// Basic DOM creation
|
|
207
|
-
const $menuBtn = elementFactory('div', { id: 'og-layer-switcher-menu-btn', class: 'og-menu-btn og-OFF' },
|
|
208
|
-
elementFactory('div', { id: 'og-layer-switcher-menu-icon', class: 'og-icon-holder' }))
|
|
209
|
-
const $dialog = elementFactory('div', {
|
|
210
|
-
class: 'og-layer-switcher-dialog og-dialog og-not-visible',
|
|
211
|
-
id: 'og-layer-switcher-dialog'
|
|
212
|
-
})
|
|
213
|
-
const $header = elementFactory('div', { class: 'og-layer-switcher-dialog-header' })
|
|
214
|
-
const $header_close = elementFactory('div', {
|
|
215
|
-
id: 'og-layer-switcher-dialog-close-btn',
|
|
216
|
-
class: 'og-dialog-header-btn og-OFF'
|
|
217
|
-
},
|
|
218
|
-
elementFactory('div', { class: 'og-icon-holder' }))
|
|
219
|
-
const $headerMinMax = elementFactory('div', {
|
|
220
|
-
id: 'og-layer-switcher-dialog-minMax-btn',
|
|
221
|
-
class: 'og-dialog-header-btn og-OFF'
|
|
222
|
-
},
|
|
223
|
-
elementFactory('div', { class: 'og-icon-holder' }))
|
|
224
|
-
const $headerTitle = elementFactory('span', { class: 'og-dialog-header-title' }, 'Layer Switcher')
|
|
225
|
-
const $headerPin = elementFactory('div', {
|
|
226
|
-
id: 'og-layer-switcher-dialog-pin-btn',
|
|
227
|
-
class: 'og-dialog-header-btn og-OFF'
|
|
228
|
-
},
|
|
229
|
-
elementFactory('div', { class: 'og-icon-holder' }))
|
|
230
|
-
const $mainContainer = elementFactory('div', { class: 'og-layer-switcher-main-container' })
|
|
231
|
-
|
|
232
|
-
$headerPin.dataset.attachement = 'UNPINNED'
|
|
233
|
-
|
|
234
|
-
// Append children to parents
|
|
235
|
-
appendChildren(this.planet.renderer.div, [$menuBtn, $dialog])
|
|
236
|
-
appendChildren($dialog, [$header, $mainContainer])
|
|
237
|
-
appendChildren($header, [$header_close, $headerMinMax, $headerTitle, $headerPin])
|
|
238
|
-
|
|
239
|
-
// Behaviour according to dependency on switcher
|
|
240
|
-
if (switcherDependency == false) {
|
|
241
|
-
$menuBtn.classList.add('og-hide') // hide menu btn
|
|
242
|
-
$dialog.classList.remove('og-not-visible') // Show dialog when opening webpage
|
|
243
|
-
$headerPin.classList.add('og-not-visible') // hide the pin that attaches the dialog window
|
|
244
|
-
}
|
|
245
|
-
|
|
246
|
-
const dialogBoxInitial = $dialog.getBoundingClientRect() // Initial position of the dialog window
|
|
247
|
-
|
|
248
|
-
// LISTENERS
|
|
249
|
-
const whereClick = (e, wrapper, menuBtn) => {
|
|
250
|
-
if (wrapper.contains(e.target)) {
|
|
251
|
-
return 'inside'
|
|
252
|
-
} else if (menuBtn.contains(e.target)) {
|
|
253
|
-
return 'on-btn'
|
|
254
|
-
} else {
|
|
255
|
-
return 'outside'
|
|
256
|
-
}
|
|
257
|
-
}
|
|
258
|
-
|
|
259
|
-
var whereClickHandler = null
|
|
260
|
-
whereClickHandler = (e) => { // cannot be a const otherwise cannot be created again in onactivate()
|
|
261
|
-
// Check where I clicked : in dialog, in button, elsewhere
|
|
262
|
-
let whereIclicked = $menuBtn ? whereClick(e, $dialog, $menuBtn) : null
|
|
263
|
-
|
|
264
|
-
// If I clicked elsewhere and the dialog is unpinned, then hide dialog and set menu btn to OFF
|
|
265
|
-
if (whereIclicked === 'outside' && $headerPin.dataset.attachement == 'UNPINNED') {
|
|
266
|
-
$dialog.classList.add('og-not-visible')
|
|
267
|
-
$menuBtn.classList.add('og-OFF')
|
|
268
|
-
// If Iclicked on button, toggle dialog and menu btn
|
|
269
|
-
} else if (whereIclicked === 'on-btn') {
|
|
270
|
-
$dialog.classList.toggle('og-not-visible')
|
|
271
|
-
$menuBtn.classList.toggle('og-OFF')
|
|
272
|
-
}
|
|
273
|
-
}
|
|
274
|
-
|
|
275
|
-
this.docListener = whereClickHandler // Function holder so that it is the same during add/remove
|
|
276
|
-
|
|
277
|
-
// Document
|
|
278
|
-
document.addEventListener('click', (e) => this.docListener(e))
|
|
279
|
-
|
|
280
|
-
// Header pin - here I am using instead of CSS classes, the data-* attribute of the DOM element to store the state
|
|
281
|
-
$headerPin.addEventListener('click', () => {
|
|
282
|
-
let newText = toggleText($headerPin.dataset.attachement, ['PINNED', 'UNPINNED'])
|
|
283
|
-
$headerPin.classList.toggle('og-OFF')
|
|
284
|
-
$headerPin.dataset.attachement = newText
|
|
285
|
-
})
|
|
213
|
+
this._menuBtn.appendTo(this.planet.renderer.div);
|
|
286
214
|
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
restoreInitialPos($dialog)
|
|
291
|
-
}, false)
|
|
292
|
-
|
|
293
|
-
const restoreInitialPos = (el) => {
|
|
294
|
-
el.style.top = dialogBoxInitial.top + "px";
|
|
295
|
-
el.style.left = dialogBoxInitial.left + "px";
|
|
296
|
-
}
|
|
297
|
-
|
|
298
|
-
// Header mousedown --> move dialog OR nothing
|
|
299
|
-
const { behaviour, mouseMove } = enableElmovement($dialog, this.planet)
|
|
300
|
-
|
|
301
|
-
$header.addEventListener('mousedown', (e) => {
|
|
302
|
-
if ($headerPin.dataset.attachement == 'UNPINNED') {
|
|
303
|
-
behaviour(e)
|
|
304
|
-
} else {
|
|
305
|
-
document.removeEventListener('mousemove', mouseMove)
|
|
306
|
-
}
|
|
307
|
-
})
|
|
308
|
-
|
|
309
|
-
$header_close.addEventListener('click', () => {
|
|
310
|
-
$dialog.classList.add('og-not-visible')
|
|
311
|
-
$menuBtn.classList.add('og-OFF')
|
|
312
|
-
})
|
|
215
|
+
this._menuBtn.on("change", (isActive) => {
|
|
216
|
+
this.dialog.setVisibility(isActive);
|
|
217
|
+
});
|
|
313
218
|
|
|
314
|
-
$
|
|
315
|
-
$mainContainer.classList.toggle('og-hide')
|
|
316
|
-
$mainContainer.classList.toggle('og-minimized')
|
|
317
|
-
$dialog.classList.toggle('og-minimized')
|
|
318
|
-
})
|
|
219
|
+
const $mainContainer = this.dialog.container;
|
|
319
220
|
|
|
320
|
-
return { $mainContainer
|
|
221
|
+
return { $mainContainer }
|
|
321
222
|
}
|
|
322
223
|
|
|
323
224
|
buildRecords(myData, $mainContainer, depth, createLastDropZone) {
|