@openglobus/og 0.14.10 → 0.15.1

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 (140) hide show
  1. package/css/og.css +378 -275
  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 +5 -5
  10. package/src/og/Object3d.js +104 -145
  11. package/src/og/camera/Camera.js +31 -27
  12. package/src/og/camera/PlanetCamera.js +22 -14
  13. package/src/og/cons.js +107 -107
  14. package/src/og/control/Atmosphere.js +396 -0
  15. package/src/og/control/CompassButton.js +11 -18
  16. package/src/og/control/Control.js +197 -188
  17. package/src/og/control/GeoImageDragControl.js +84 -66
  18. package/src/og/control/LayerSwitcher.js +56 -138
  19. package/src/og/control/Lighting.js +314 -186
  20. package/src/og/control/MouseNavigation.js +2 -2
  21. package/src/og/control/RulerSwitcher.js +24 -19
  22. package/src/og/control/ScaleControl.js +30 -10
  23. package/src/og/control/SimpleSkyBackground.js +210 -0
  24. package/src/og/control/Sun.js +3 -1
  25. package/src/og/control/ZoomControl.js +30 -42
  26. package/src/og/control/index.js +6 -0
  27. package/src/og/control/ruler/RulerScene.js +5 -23
  28. package/src/og/control/selection/Selection.js +99 -0
  29. package/src/og/control/selection/SelectionScene.js +350 -0
  30. package/src/og/control/timeline/TimelineControl.js +99 -0
  31. package/src/og/control/timeline/TimelineModel.js +133 -0
  32. package/src/og/control/timeline/TimelineView.js +449 -0
  33. package/src/og/control/timeline/timelineUtils.js +132 -0
  34. package/src/og/ellipsoid/Ellipsoid.js +120 -93
  35. package/src/og/ellipsoid/wgs84.js +13 -13
  36. package/src/og/entity/Entity.js +36 -9
  37. package/src/og/entity/EntityCollection.js +0 -2
  38. package/src/og/entity/GeoObject.js +72 -56
  39. package/src/og/entity/GeoObjectHandler.js +487 -656
  40. package/src/og/entity/GeometryHandler.js +1341 -1337
  41. package/src/og/entity/Polyline.js +0 -16
  42. package/src/og/entity/Ray.js +0 -10
  43. package/src/og/entity/RayHandler.js +3 -44
  44. package/src/og/entity/Strip.js +1 -6
  45. package/src/og/index.js +13 -7
  46. package/src/og/input/input.js +3 -1
  47. package/src/og/layer/CanvasTiles.js +39 -34
  48. package/src/og/layer/Layer.js +69 -9
  49. package/src/og/layer/Material.js +1 -8
  50. package/src/og/layer/WMS.js +16 -5
  51. package/src/og/light/LightSource.js +2 -0
  52. package/src/og/math/Line3.js +140 -139
  53. package/src/og/math/Plane.js +118 -117
  54. package/src/og/math/Ray.js +242 -239
  55. package/src/og/math/Vec3.js +56 -37
  56. package/src/og/math/Vec4.js +3 -4
  57. package/src/og/math.js +21 -21
  58. package/src/og/quadTree/Node.js +5 -4
  59. package/src/og/quadTree/index.js +12 -0
  60. package/src/og/renderer/Renderer.js +64 -37
  61. package/src/og/renderer/RendererEvents.js +1071 -1065
  62. package/src/og/scene/Planet.js +354 -174
  63. package/src/og/scene/RenderNode.js +27 -12
  64. package/src/og/segment/Segment.js +0 -5
  65. package/src/og/shaders/atmos.js +332 -0
  66. package/src/og/shaders/drawnode.js +475 -109
  67. package/src/og/shaders/geoObject.js +96 -51
  68. package/src/og/shaders/polyline.js +212 -17
  69. package/src/og/shaders/ray.js +13 -6
  70. package/src/og/shaders/toneMapping.js +5 -5
  71. package/src/og/shaders/utils.js +88 -0
  72. package/src/og/terrain/GlobusTerrain.js +5 -4
  73. package/src/og/terrain/MapboxTerrain.js +231 -52
  74. package/src/og/ui/Button.js +106 -0
  75. package/src/og/ui/ButtonGroup.js +57 -0
  76. package/src/og/ui/Dialog.js +242 -0
  77. package/src/og/ui/Slider.js +144 -0
  78. package/src/og/ui/ToggleButton.js +51 -0
  79. package/src/og/{control → ui}/UIhelpers.js +11 -2
  80. package/src/og/ui/View.js +190 -0
  81. package/src/og/utils/shared.js +960 -942
  82. package/src/og/webgl/Framebuffer.js +308 -387
  83. package/src/og/webgl/Handler.js +90 -30
  84. package/src/og/webgl/Multisample.js +8 -0
  85. package/types/Clock.d.ts +7 -2
  86. package/types/Object3d.d.ts +14 -3
  87. package/types/camera/Camera.d.ts +18 -17
  88. package/types/camera/PlanetCamera.d.ts +3 -1
  89. package/types/control/Atmosphere.d.ts +15 -0
  90. package/types/control/CompassButton.d.ts +1 -2
  91. package/types/control/GeoImageDragControl.d.ts +7 -1
  92. package/types/control/LayerSwitcher.d.ts +5 -6
  93. package/types/control/Lighting.d.ts +32 -7
  94. package/types/control/ScaleControl.d.ts +2 -1
  95. package/types/control/SimpleSkyBackground.d.ts +15 -0
  96. package/types/control/ZoomControl.d.ts +0 -1
  97. package/types/control/index.d.ts +4 -1
  98. package/types/control/ruler/RulerScene.d.ts +0 -1
  99. package/types/control/selection/Selection.d.ts +49 -0
  100. package/types/control/selection/SelectionScene.d.ts +34 -0
  101. package/types/ellipsoid/Ellipsoid.d.ts +3 -2
  102. package/types/entity/Entity.d.ts +8 -0
  103. package/types/entity/GeoObject.d.ts +28 -22
  104. package/types/entity/GeoObjectHandler.d.ts +16 -56
  105. package/types/entity/Ray.d.ts +0 -3
  106. package/types/entity/RayHandler.d.ts +0 -4
  107. package/types/index.d.ts +9 -6
  108. package/types/input/input.d.ts +2 -0
  109. package/types/layer/CanvasTiles.d.ts +1 -0
  110. package/types/layer/Layer.d.ts +9 -0
  111. package/types/layer/WMS.d.ts +7 -3
  112. package/types/math/Plane.d.ts +1 -1
  113. package/types/math/Vec3.d.ts +19 -16
  114. package/types/math/Vec4.d.ts +2 -3
  115. package/types/math.d.ts +20 -20
  116. package/types/quadTree/index.d.ts +10 -0
  117. package/types/renderer/Renderer.d.ts +11 -37
  118. package/types/scene/Planet.d.ts +27 -1
  119. package/types/scene/RenderNode.d.ts +2 -1
  120. package/types/segment/Segment.d.ts +1 -1
  121. package/types/shaders/atmos.d.ts +4 -0
  122. package/types/shaders/drawnode.d.ts +3 -2
  123. package/types/shaders/utils.d.ts +1 -0
  124. package/types/terrain/GlobusTerrain.d.ts +1 -1
  125. package/types/terrain/MapboxTerrain.d.ts +2 -1
  126. package/types/ui/Button.d.ts +21 -0
  127. package/types/ui/Dialog.d.ts +41 -0
  128. package/types/ui/Slider.d.ts +30 -0
  129. package/types/ui/ToggleButton.d.ts +10 -0
  130. package/types/{control → ui}/UIhelpers.d.ts +1 -1
  131. package/types/ui/View.d.ts +32 -0
  132. package/types/utils/shared.d.ts +16 -14
  133. package/types/webgl/Framebuffer.d.ts +2 -5
  134. package/types/webgl/Handler.d.ts +15 -10
  135. package/types/webgl/Multisample.d.ts +2 -0
  136. package/src/og/ajax.js +0 -204
  137. package/src/og/entity/Object3d.js +0 -504
  138. package/src/og/utils/quadTreeType.js +0 -11
  139. package/types/ajax.d.ts +0 -24
  140. package/types/utils/quadTreeType.d.ts +0 -8
@@ -5,8 +5,19 @@
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>`;
20
+
10
21
  /**
11
22
  * Advanced :) layer switcher, includes base layers, overlays, geo images etc. groups.
12
23
  * Double click for zoom, drag-and-drop to change zIndex
@@ -21,48 +32,53 @@ class LayerSwitcher extends Control {
21
32
  ...options
22
33
  });
23
34
 
24
- this._id = LayerSwitcher.numSwitches++;
25
35
  this.switcherDependent = options.switcherDependent
26
36
  this.expandedSections = options.expandedSections
27
- this.switcherInMenu = options.switcherInMenu // none (default)
28
37
  this.docListener = options.docListener
29
- }
30
38
 
31
- static get numSwitches() {
32
- if (!this._counter && this._counter !== 0) {
33
- this._counter = 0;
34
- }
35
- return this._counter;
36
- }
39
+ this.dialog = new Dialog({
40
+ title: "Layer Switcher",
41
+ top: 15,
42
+ useHide: true,
43
+ visible: false,
44
+ width: 200
45
+ });
37
46
 
38
- static set numSwitches(n) {
39
- this._counter = n;
47
+ this._menuBtn = new ToggleButton({
48
+ classList: ["og-map-button", "og-layerswitcher_button"],
49
+ icon: ICON_BUTTON_SVG
50
+ });
40
51
  }
41
52
 
42
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
+
43
63
  this.setupSwitcher()
44
64
  this.planet.events.on("layeradd", this.addNewLayer, this)
45
65
  this.planet.events.on("layerremove", this.removeLayer, this)
46
66
 
47
67
  }
48
68
 
49
- setupSwitcher () {
69
+ setupSwitcher() {
50
70
  const myData = this.getRecords(this.planet)
51
71
  const { $mainContainer } = this.buildBasicDOM()
52
72
  this.buildRecords(myData, $mainContainer, 0)
53
-
73
+
54
74
  }
55
-
56
- onactivate() {
75
+
76
+ onactivate() {
57
77
  this.setupSwitcher()
58
78
  }
59
79
 
60
80
  ondeactivate() {
61
- const $menuBtn = document.getElementById('og-layer-switcher-menu-btn')
62
- const $dialog = document.getElementById('og-layer-switcher-dialog')
63
- $menuBtn.remove()
64
- $dialog.remove()
65
- document.removeEventListener('click', (e) => this.docListener(e))
81
+ this.dialog.hide();
66
82
  }
67
83
 
68
84
  // BASIC DATA COLLECTION-PREPARATION FUNCTIONS
@@ -87,9 +103,8 @@ class LayerSwitcher extends Control {
87
103
  const classifyObject = (object) => {
88
104
  let r = object.isBaseLayer()
89
105
  if (r === true || r === false) {
90
- return r === true ? 'BaseLayers' : 'Overlays'
91
- }
92
- else {
106
+ return r === true ? 'Base Layers' : 'Overlays'
107
+ } else {
93
108
  return 'Terrain Providers'
94
109
  }
95
110
  }
@@ -117,8 +132,10 @@ class LayerSwitcher extends Control {
117
132
  // OUTPOUT TERRAINS, BASELAYERS, OVERLAYS
118
133
  planetDataReturn(planet) {
119
134
 
120
- const { collectTerrains, collectLayers, pickBaseLayers, pickOverlays,
121
- sortByZIndex, serializeZIndices, normalizeOverlay } = this.planetDataBasic()
135
+ const {
136
+ collectTerrains, collectLayers, pickBaseLayers, pickOverlays,
137
+ sortByZIndex, serializeZIndices, normalizeOverlay
138
+ } = this.planetDataBasic()
122
139
 
123
140
  const terrains = collectTerrains(planet)
124
141
 
@@ -154,7 +171,6 @@ class LayerSwitcher extends Control {
154
171
  this.dialogSectionStructure('Overlays', 'checkbox', overlays),
155
172
  ]
156
173
  }
157
- // console.log(myData) // enable this to have a visual representation of the dialog structure
158
174
  return myData
159
175
  }
160
176
 
@@ -165,9 +181,6 @@ class LayerSwitcher extends Control {
165
181
  }
166
182
 
167
183
  addNewLayer(layer) {
168
- // Put the data(layer) to the appropriate recordsStructure section and run the build function
169
- const $dialog = document.getElementById('og-layer-switcher-dialog')
170
- if($dialog){
171
184
  const { classifyObject } = this.planetDataBasic()
172
185
  const targets = [...document.body.querySelectorAll('.og-layer-switcher-record.og-depth-0 > details')]
173
186
  const type = classifyObject(layer)
@@ -175,132 +188,37 @@ class LayerSwitcher extends Control {
175
188
  const index = this.recordsStructure().data.findIndex(x => x.name == type)
176
189
  object[0].data = [layer]
177
190
  this.buildRecords(object[0], targets[index], 1, true)
178
- }
179
191
  }
180
192
 
181
193
  removeLayer(layer) {
182
- // TODO...Haven't tested it yet
183
194
  let id = layer.getID()
184
- let el = document.body.querySelector('#' + id + ".og-layer-switcher-record.og-depth-1")
185
- el.remove()
186
-
187
- if (layer.displayInLayerSwitcher) { // check necessary, or else error with layers not in switcher - e.g rulerScene layers.
188
- layer._removeCallback();
189
- layer._removeCallback = null
195
+ let arr = document.body.querySelectorAll(`.og-layer-switcher-record.og-depth-1`)
196
+ for (let i = 0; i < arr.length; i++) {
197
+ if (arr[i].id == id) {
198
+ arr[i].remove();
199
+ break;
200
+ }
190
201
  }
191
202
  }
192
203
 
193
204
  getUserPrefs() {
194
205
  const switcherDependency = this.switcherDependent == undefined ? true : this.switcherDependent
195
206
  const sectionsOpening = this.expandedSections == undefined ? true : this.expandedSections
196
- const btnInMenu = this.switcherInMenu == undefined ? true : this.switcherInMenu
197
207
 
198
- return { switcherDependency, sectionsOpening, btnInMenu }
208
+ return { switcherDependency, sectionsOpening }
199
209
  }
200
210
 
201
211
  buildBasicDOM() {
202
212
 
203
- const { switcherDependency, sectionsOpening, btnInMenu } = this.getUserPrefs()
204
-
205
- // Basic DOM creation
206
- const $menuBtn = elementFactory('div', { id: 'og-layer-switcher-menu-btn', class: 'og-menu-btn og-OFF' },
207
- elementFactory('div', { id: 'og-layer-switcher-menu-icon', class: 'og-icon-holder' }))
208
- const $dialog = elementFactory('div', { class: 'og-layer-switcher-dialog og-dialog og-not-visible', id: 'og-layer-switcher-dialog' })
209
- const $header = elementFactory('div', { class: 'og-layer-switcher-dialog-header' })
210
- const $header_close = elementFactory('div', { id: 'og-layer-switcher-dialog-close-btn', class: 'og-dialog-header-btn og-OFF' },
211
- elementFactory('div', { class: 'og-icon-holder' }))
212
- const $headerMinMax = elementFactory('div', { id: 'og-layer-switcher-dialog-minMax-btn', class: 'og-dialog-header-btn og-OFF' },
213
- elementFactory('div', { class: 'og-icon-holder' }))
214
- const $headerTitle = elementFactory('span', { class: 'og-dialog-header-title' }, 'Layer Switcher')
215
- const $headerPin = elementFactory('div', { id: 'og-layer-switcher-dialog-pin-btn', class: 'og-dialog-header-btn og-OFF' },
216
- elementFactory('div', { class: 'og-icon-holder' }))
217
- const $mainContainer = elementFactory('div', { class: 'og-layer-switcher-main-container' })
218
-
219
- $headerPin.dataset.attachement = 'UNPINNED'
220
-
221
- // Append children to parents
222
- appendChildren(this.planet.renderer.div, [$menuBtn, $dialog])
223
- appendChildren($dialog, [$header, $mainContainer])
224
- appendChildren($header, [$header_close, $headerMinMax, $headerTitle, $headerPin])
225
-
226
- // Behaviour according to dependency on switcher
227
- if (switcherDependency == false) {
228
- $menuBtn.classList.add('og-hide') // hide menu btn
229
- $dialog.classList.remove('og-not-visible') // Show dialog when opening webpage
230
- $headerPin.classList.add('og-not-visible') // hide the pin that attaches the dialog window
231
- }
232
-
233
- const dialogBoxInitial = $dialog.getBoundingClientRect() // Initial position of the dialog window
234
-
235
- // LISTENERS
236
- const whereClick = (e, wrapper, menuBtn) => {
237
- if (wrapper.contains(e.target)) { return 'inside' }
238
- else if (menuBtn.contains(e.target)) { return 'on-btn' }
239
- else { return 'outside' }
240
- }
241
-
242
- var whereClickHandler = null
243
- whereClickHandler = (e) => { // cannot be a const otherwise cannot be created again in onactivate()
244
- // Check where I clicked : in dialog, in button, elsewhere
245
- let whereIclicked = $menuBtn ? whereClick(e, $dialog, $menuBtn) : null
246
-
247
- // If I clicked elsewhere and the dialog is unpinned, then hide dialog and set menu btn to OFF
248
- if (whereIclicked === 'outside' && $headerPin.dataset.attachement == 'UNPINNED') {
249
- $dialog.classList.add('og-not-visible')
250
- $menuBtn.classList.add('og-OFF')
251
- // If Iclicked on button, toggle dialog and menu btn
252
- } else if (whereIclicked === 'on-btn') {
253
- $dialog.classList.toggle('og-not-visible')
254
- $menuBtn.classList.toggle('og-OFF')
255
- }
256
- }
257
-
258
- this.docListener = whereClickHandler // Function holder so that it is the same during add/remove
259
-
260
- // Document
261
- document.addEventListener('click', (e) => this.docListener(e))
213
+ this._menuBtn.appendTo(this.planet.renderer.div);
262
214
 
263
- // Header pin - here I am using instead of CSS classes, the data-* attribute of the DOM element to store the state
264
- $headerPin.addEventListener('click', () => {
265
- let newText = toggleText($headerPin.dataset.attachement, ['PINNED', 'UNPINNED'])
266
- $headerPin.classList.toggle('og-OFF')
267
- $headerPin.dataset.attachement = newText
268
- })
269
-
270
- // Header double click
271
- $header.addEventListener('dblclick', (e) => {
272
- if ($header !== e.target) return
273
- restoreInitialPos($dialog)
274
- }, false)
275
-
276
- const restoreInitialPos = (el) => {
277
- el.style.top = dialogBoxInitial.top + "px";
278
- el.style.left = dialogBoxInitial.left + "px";
279
- }
280
-
281
- // Header mousedown --> move dialog OR nothing
282
- const { behaviour, mouseMove } = enableElmovement($dialog, this.planet)
283
-
284
- $header.addEventListener('mousedown', (e) => {
285
- if ($headerPin.dataset.attachement == 'UNPINNED') {
286
- behaviour(e)
287
- } else {
288
- document.removeEventListener('mousemove', mouseMove)
289
- }
290
- })
291
-
292
- $header_close.addEventListener('click', () => {
293
- $dialog.classList.add('og-not-visible')
294
- $menuBtn.classList.add('og-OFF')
295
- })
215
+ this._menuBtn.on("change", (isActive) => {
216
+ this.dialog.setVisibility(isActive);
217
+ });
296
218
 
297
- $headerMinMax.addEventListener('click', () => {
298
- $mainContainer.classList.toggle('og-hide')
299
- $mainContainer.classList.toggle('og-minimized')
300
- $dialog.classList.toggle('og-minimized')
301
- })
219
+ const $mainContainer = this.dialog.container;
302
220
 
303
- return { $mainContainer, whereClickHandler }
221
+ return { $mainContainer }
304
222
  }
305
223
 
306
224
  buildRecords(myData, $mainContainer, depth, createLastDropZone) {