@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.
Files changed (102) hide show
  1. package/css/og.css +377 -274
  2. package/dist/@openglobus/og.css +1 -1
  3. package/dist/@openglobus/og.esm.js +2 -2
  4. package/dist/@openglobus/og.esm.js.map +1 -1
  5. package/dist/@openglobus/og.umd.js +2 -2
  6. package/dist/@openglobus/og.umd.js.map +1 -1
  7. package/package.json +18 -17
  8. package/src/og/Clock.js +218 -194
  9. package/src/og/Globe.js +1 -3
  10. package/src/og/Object3d.js +104 -145
  11. package/src/og/camera/Camera.js +23 -19
  12. package/src/og/cons.js +107 -107
  13. package/src/og/control/Atmosphere.js +396 -0
  14. package/src/og/control/CompassButton.js +11 -18
  15. package/src/og/control/Control.js +187 -188
  16. package/src/og/control/GeoImageDragControl.js +84 -66
  17. package/src/og/control/LayerSwitcher.js +46 -145
  18. package/src/og/control/Lighting.js +314 -186
  19. package/src/og/control/RulerSwitcher.js +24 -19
  20. package/src/og/control/SimpleSkyBackground.js +38 -12
  21. package/src/og/control/Sun.js +2 -0
  22. package/src/og/control/ZoomControl.js +30 -42
  23. package/src/og/control/ruler/RulerScene.js +5 -23
  24. package/src/og/control/selection/Selection.js +21 -50
  25. package/src/og/control/selection/SelectionScene.js +15 -29
  26. package/src/og/control/timeline/TimelineControl.js +99 -0
  27. package/src/og/control/timeline/TimelineModel.js +133 -0
  28. package/src/og/control/timeline/TimelineView.js +449 -0
  29. package/src/og/control/timeline/timelineUtils.js +132 -0
  30. package/src/og/entity/Entity.js +30 -3
  31. package/src/og/entity/EntityCollection.js +0 -2
  32. package/src/og/entity/GeoObject.js +72 -56
  33. package/src/og/entity/GeoObjectHandler.js +487 -656
  34. package/src/og/input/input.js +3 -1
  35. package/src/og/layer/CanvasTiles.js +39 -34
  36. package/src/og/layer/Layer.js +2 -0
  37. package/src/og/layer/Material.js +1 -8
  38. package/src/og/light/LightSource.js +2 -0
  39. package/src/og/quadTree/Node.js +2 -1
  40. package/src/og/renderer/Renderer.js +26 -42
  41. package/src/og/renderer/RendererEvents.js +4 -4
  42. package/src/og/scene/Planet.js +276 -59
  43. package/src/og/scene/RenderNode.js +27 -12
  44. package/src/og/segment/Segment.js +0 -5
  45. package/src/og/shaders/atmos.js +332 -0
  46. package/src/og/shaders/drawnode.js +475 -109
  47. package/src/og/shaders/geoObject.js +96 -51
  48. package/src/og/shaders/polyline.js +212 -17
  49. package/src/og/shaders/utils.js +88 -0
  50. package/src/og/terrain/GlobusTerrain.js +2 -2
  51. package/src/og/ui/Button.js +106 -0
  52. package/src/og/ui/ButtonGroup.js +57 -0
  53. package/src/og/ui/Dialog.js +242 -0
  54. package/src/og/ui/Slider.js +144 -0
  55. package/src/og/ui/ToggleButton.js +51 -0
  56. package/src/og/ui/View.js +190 -0
  57. package/src/og/utils/shared.js +51 -33
  58. package/src/og/webgl/Framebuffer.js +308 -387
  59. package/src/og/webgl/Handler.js +68 -21
  60. package/src/og/webgl/Multisample.js +8 -0
  61. package/types/Clock.d.ts +7 -2
  62. package/types/Object3d.d.ts +14 -3
  63. package/types/camera/Camera.d.ts +15 -14
  64. package/types/control/Atmosphere.d.ts +15 -0
  65. package/types/control/CompassButton.d.ts +1 -2
  66. package/types/control/GeoImageDragControl.d.ts +7 -1
  67. package/types/control/LayerSwitcher.d.ts +4 -5
  68. package/types/control/Lighting.d.ts +32 -7
  69. package/types/control/SimpleSkyBackground.d.ts +4 -0
  70. package/types/control/ZoomControl.d.ts +0 -1
  71. package/types/control/ruler/RulerScene.d.ts +0 -1
  72. package/types/control/selection/Selection.d.ts +2 -4
  73. package/types/control/selection/SelectionScene.d.ts +0 -1
  74. package/types/entity/Entity.d.ts +8 -0
  75. package/types/entity/GeoObject.d.ts +28 -22
  76. package/types/entity/GeoObjectHandler.d.ts +16 -56
  77. package/types/input/input.d.ts +2 -0
  78. package/types/layer/CanvasTiles.d.ts +1 -0
  79. package/types/layer/Layer.d.ts +1 -0
  80. package/types/math/Plane.d.ts +1 -1
  81. package/types/renderer/Renderer.d.ts +7 -1
  82. package/types/scene/Planet.d.ts +20 -2
  83. package/types/scene/RenderNode.d.ts +2 -1
  84. package/types/segment/Segment.d.ts +1 -1
  85. package/types/shaders/atmos.d.ts +4 -0
  86. package/types/shaders/drawnode.d.ts +3 -2
  87. package/types/shaders/utils.d.ts +1 -0
  88. package/types/terrain/GlobusTerrain.d.ts +1 -1
  89. package/types/ui/Button.d.ts +21 -0
  90. package/types/ui/Dialog.d.ts +41 -0
  91. package/types/ui/Slider.d.ts +30 -0
  92. package/types/ui/ToggleButton.d.ts +10 -0
  93. package/types/ui/View.d.ts +32 -0
  94. package/types/utils/shared.d.ts +16 -14
  95. package/types/webgl/Framebuffer.d.ts +2 -5
  96. package/types/webgl/Handler.d.ts +11 -9
  97. package/types/webgl/Multisample.d.ts +2 -0
  98. package/src/og/ajax.js +0 -204
  99. package/src/og/entity/Object3d.js +0 -504
  100. package/types/ajax.d.ts +0 -24
  101. /package/src/og/{control → ui}/UIhelpers.js +0 -0
  102. /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 "./UIhelpers.js";
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
- static get numSwitches() {
33
- if (!this._counter && this._counter !== 0) {
34
- this._counter = 0;
35
- }
36
- return this._counter;
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
- static set numSwitches(n) {
40
- this._counter = n;
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
- const $menuBtn = document.getElementById('og-layer-switcher-menu-btn')
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
- // Put the data(layer) to the appropriate recordsStructure section and run the build function
171
- const $dialog = document.getElementById('og-layer-switcher-dialog')
172
- if ($dialog) {
173
- const { classifyObject } = this.planetDataBasic()
174
- const targets = [...document.body.querySelectorAll('.og-layer-switcher-record.og-depth-0 > details')]
175
- const type = classifyObject(layer)
176
- const object = this.recordsStructure().data.filter(x => x.name == type)
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, btnInMenu }
208
+ return { switcherDependency, sectionsOpening }
200
209
  }
201
210
 
202
211
  buildBasicDOM() {
203
212
 
204
- const { switcherDependency, sectionsOpening, btnInMenu } = this.getUserPrefs()
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
- // Header double click
288
- $header.addEventListener('dblclick', (e) => {
289
- if ($header !== e.target) return
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
- $headerMinMax.addEventListener('click', () => {
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, whereClickHandler }
221
+ return { $mainContainer }
321
222
  }
322
223
 
323
224
  buildRecords(myData, $mainContainer, depth, createLastDropZone) {