@openglobus/og 0.13.8 → 0.13.10

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 (85) hide show
  1. package/README.md +1 -1
  2. package/css/og.css +388 -129
  3. package/dist/@openglobus/og.css +1 -1
  4. package/dist/@openglobus/og.esm.js +2 -2
  5. package/dist/@openglobus/og.esm.js.map +1 -1
  6. package/dist/@openglobus/og.umd.js +2 -2
  7. package/dist/@openglobus/og.umd.js.map +1 -1
  8. package/package.json +20 -19
  9. package/src/og/Globe.js +15 -16
  10. package/src/og/Object3d.js +33 -0
  11. package/src/og/control/GeoImageDragControl.js +102 -75
  12. package/src/og/control/LayerAnimation.js +306 -38
  13. package/src/og/control/LayerSwitcher.js +506 -159
  14. package/src/og/control/Lighting.js +27 -27
  15. package/src/og/control/RulerSwitcher.js +69 -0
  16. package/src/og/control/UIhelpers.js +146 -0
  17. package/src/og/control/index.js +3 -1
  18. package/src/og/control/ruler/RulerScene.js +6 -2
  19. package/src/og/control/visibleExtent/Segment.js +2 -1
  20. package/src/og/ellipsoid/wgs84.js +1 -1
  21. package/src/og/entity/LabelHandler.js +5 -2
  22. package/src/og/entity/LabelWorker.js +38 -53
  23. package/src/og/layer/BaseGeoImage.js +347 -312
  24. package/src/og/layer/CanvasTiles.js +312 -290
  25. package/src/og/layer/GeoImage.js +222 -214
  26. package/src/og/layer/GeoVideo.js +291 -291
  27. package/src/og/layer/Layer.js +71 -30
  28. package/src/og/layer/Material.js +109 -109
  29. package/src/og/layer/Vector.js +1 -0
  30. package/src/og/layer/XYZ.js +20 -12
  31. package/src/og/light/LightSource.js +364 -363
  32. package/src/og/math.js +2 -2
  33. package/src/og/quadTree/Node.js +7 -5
  34. package/src/og/renderer/Renderer.js +1 -1
  35. package/src/og/scene/Planet.js +103 -42
  36. package/src/og/segment/Segment.js +34 -56
  37. package/src/og/segment/Slice.js +1 -1
  38. package/src/og/shaders/drawnode.js +1 -1
  39. package/src/og/terrain/GlobusTerrain.js +31 -20
  40. package/src/og/terrain/MapboxTerrain.js +1 -1
  41. package/src/og/utils/BaseWorker.js +46 -0
  42. package/src/og/utils/GeoImageCreator.js +164 -161
  43. package/src/og/utils/Loader.js +60 -33
  44. package/src/og/utils/NormalMapCreator.js +403 -412
  45. package/src/og/utils/PlainSegmentWorker.js +29 -55
  46. package/src/og/utils/TerrainWorker.js +572 -589
  47. package/src/og/utils/functionComposition.js +13 -0
  48. package/src/og/webgl/Handler.js +42 -41
  49. package/types/Object3d.d.ts +1 -0
  50. package/types/camera/PlanetCamera.d.ts +4 -0
  51. package/types/control/GeoImageDragControl.d.ts +2 -0
  52. package/types/control/LayerAnimation.d.ts +73 -0
  53. package/types/control/LayerSwitcher.d.ts +55 -11
  54. package/types/control/MouseNavigation.d.ts +1 -0
  55. package/types/control/MouseWheelZoomControl.d.ts +1 -0
  56. package/types/control/Sun.d.ts +1 -0
  57. package/types/control/TouchNavigation.d.ts +1 -0
  58. package/types/control/UIhelpers.d.ts +13 -0
  59. package/types/control/index.d.ts +2 -1
  60. package/types/entity/LabelHandler.d.ts +2 -0
  61. package/types/entity/LabelWorker.d.ts +5 -7
  62. package/types/layer/BaseGeoImage.d.ts +9 -1
  63. package/types/layer/CanvasTiles.d.ts +5 -1
  64. package/types/layer/GeoImage.d.ts +1 -0
  65. package/types/layer/GeoTexture2d.d.ts +1 -0
  66. package/types/layer/Layer.d.ts +5 -1
  67. package/types/layer/Vector.d.ts +7 -0
  68. package/types/layer/WMS.d.ts +1 -0
  69. package/types/layer/XYZ.d.ts +8 -6
  70. package/types/math.d.ts +1 -1
  71. package/types/quadTree/EntityCollectionNode.d.ts +7 -0
  72. package/types/quadTree/Node.d.ts +1 -2
  73. package/types/renderer/Renderer.d.ts +1 -1
  74. package/types/renderer/RendererEvents.d.ts +16 -0
  75. package/types/scene/Planet.d.ts +19 -4
  76. package/types/segment/SegmentLonLat.d.ts +2 -0
  77. package/types/terrain/BilTerrain.d.ts +6 -0
  78. package/types/terrain/GlobusTerrain.d.ts +7 -0
  79. package/types/terrain/MapboxTerrain.d.ts +8 -0
  80. package/types/utils/BaseWorker.d.ts +14 -0
  81. package/types/utils/Loader.d.ts +3 -1
  82. package/types/utils/PlainSegmentWorker.d.ts +4 -6
  83. package/types/utils/TerrainWorker.d.ts +4 -6
  84. package/types/utils/functionComposition.d.ts +5 -0
  85. package/types/webgl/Handler.d.ts +4 -1
@@ -144,7 +144,7 @@ class Lighting extends Control {
144
144
  this._selectedLayer = layer;
145
145
 
146
146
  document.getElementById("opacity").value = layer.opacity;
147
- document.querySelector(".og-value.opacity").innerHTML = layer.opacity.toString();
147
+ document.querySelector(".og-value.opacity").innerText = layer.opacity.toString();
148
148
  }
149
149
 
150
150
  oninit() {
@@ -166,15 +166,15 @@ class Lighting extends Control {
166
166
 
167
167
  document.getElementById("gamma").addEventListener("input", function (e) {
168
168
  _this.planet.renderer.gamma = Number(this.value);
169
- document.querySelector(".og-value.gamma").innerHTML = this.value;
169
+ document.querySelector(".og-value.gamma").innerText = this.value;
170
170
  });
171
171
  document.getElementById("exposure").addEventListener("input", function (e) {
172
172
  _this.planet.renderer.exposure = Number(this.value);
173
- document.querySelector(".og-value.exposure").innerHTML = this.value;
173
+ document.querySelector(".og-value.exposure").innerText = this.value;
174
174
  });
175
175
 
176
- document.querySelector(".og-value.gamma").innerHTML = this.planet.renderer.gamma.toString();
177
- document.querySelector(".og-value.exposure").innerHTML =
176
+ document.querySelector(".og-value.gamma").innerText = this.planet.renderer.gamma.toString();
177
+ document.querySelector(".og-value.exposure").innerText =
178
178
  this.planet.renderer.exposure.toString();
179
179
 
180
180
  document.getElementById("gamma").value = this.planet.renderer.gamma;
@@ -184,51 +184,51 @@ class Lighting extends Control {
184
184
  if (_this._selectedLayer) {
185
185
  _this._selectedLayer.opacity = Number(this.value);
186
186
  }
187
- document.querySelector(".og-value.opacity").innerHTML = this.value;
187
+ document.querySelector(".og-value.opacity").innerText = this.value;
188
188
  });
189
189
 
190
190
  document.getElementById("ambient-r").addEventListener("input", function (e) {
191
191
  _this.planet._ambient[0] = Number(this.value);
192
- document.querySelector(".og-value.ambient-r").innerHTML = this.value;
192
+ document.querySelector(".og-value.ambient-r").innerText = this.value;
193
193
  });
194
194
  document.getElementById("ambient-g").addEventListener("input", function (e) {
195
195
  _this.planet._ambient[1] = Number(this.value);
196
- document.querySelector(".og-value.ambient-g").innerHTML = this.value;
196
+ document.querySelector(".og-value.ambient-g").innerText = this.value;
197
197
  });
198
198
  document.getElementById("ambient-b").addEventListener("input", function (e) {
199
199
  _this.planet._ambient[2] = Number(this.value);
200
- document.querySelector(".og-value.ambient-b").innerHTML = this.value;
200
+ document.querySelector(".og-value.ambient-b").innerText = this.value;
201
201
  });
202
202
 
203
203
  document.getElementById("diffuse-r").addEventListener("input", function (e) {
204
204
  _this.planet._diffuse[0] = Number(this.value);
205
- document.querySelector(".og-value.diffuse-r").innerHTML = this.value;
205
+ document.querySelector(".og-value.diffuse-r").innerText = this.value;
206
206
  });
207
207
  document.getElementById("diffuse-g").addEventListener("input", function (e) {
208
208
  _this.planet._diffuse[1] = Number(this.value);
209
- document.querySelector(".og-value.diffuse-g").innerHTML = this.value;
209
+ document.querySelector(".og-value.diffuse-g").innerText = this.value;
210
210
  });
211
211
  document.getElementById("diffuse-b").addEventListener("input", function (e) {
212
212
  _this.planet._diffuse[2] = Number(this.value);
213
- document.querySelector(".og-value.diffuse-b").innerHTML = this.value;
213
+ document.querySelector(".og-value.diffuse-b").innerText = this.value;
214
214
  });
215
215
 
216
216
  document.getElementById("specular-r").addEventListener("input", function (e) {
217
217
  _this.planet._specular[0] = Number(this.value);
218
- document.querySelector(".og-value.specular-r").innerHTML = this.value;
218
+ document.querySelector(".og-value.specular-r").innerText = this.value;
219
219
  });
220
220
  document.getElementById("specular-g").addEventListener("input", function (e) {
221
221
  _this.planet._specular[1] = Number(this.value);
222
- document.querySelector(".og-value.specular-g").innerHTML = this.value;
222
+ document.querySelector(".og-value.specular-g").innerText = this.value;
223
223
  });
224
224
  document.getElementById("specular-b").addEventListener("input", function (e) {
225
225
  _this.planet._specular[2] = Number(this.value);
226
- document.querySelector(".og-value.specular-b").innerHTML = this.value;
226
+ document.querySelector(".og-value.specular-b").innerText = this.value;
227
227
  });
228
228
 
229
229
  document.getElementById("shininess").addEventListener("input", function (e) {
230
230
  _this.planet._specular[3] = Number(this.value);
231
- document.querySelector(".og-value.shininess").innerHTML = this.value;
231
+ document.querySelector(".og-value.shininess").innerText = this.value;
232
232
  });
233
233
 
234
234
  if (this.planet) {
@@ -248,18 +248,18 @@ class Lighting extends Control {
248
248
  document.getElementById("specular-b").value = this.planet._specular[2];
249
249
  document.getElementById("shininess").value = this.planet._specular[3];
250
250
 
251
- document.querySelector(".og-value.ambient-r").innerHTML = this.planet._ambient[0].toString();
252
- document.querySelector(".og-value.ambient-g").innerHTML = this.planet._ambient[1].toString();
253
- document.querySelector(".og-value.ambient-b").innerHTML = this.planet._ambient[2].toString();
251
+ document.querySelector(".og-value.ambient-r").innerText = this.planet._ambient[0].toString();
252
+ document.querySelector(".og-value.ambient-g").innerText = this.planet._ambient[1].toString();
253
+ document.querySelector(".og-value.ambient-b").innerText = this.planet._ambient[2].toString();
254
254
 
255
- document.querySelector(".og-value.diffuse-r").innerHTML = this.planet._diffuse[0].toString();
256
- document.querySelector(".og-value.diffuse-g").innerHTML = this.planet._diffuse[1].toString();
257
- document.querySelector(".og-value.diffuse-b").innerHTML = this.planet._diffuse[2].toString();
255
+ document.querySelector(".og-value.diffuse-r").innerText = this.planet._diffuse[0].toString();
256
+ document.querySelector(".og-value.diffuse-g").innerText = this.planet._diffuse[1].toString();
257
+ document.querySelector(".og-value.diffuse-b").innerText = this.planet._diffuse[2].toString();
258
258
 
259
- document.querySelector(".og-value.specular-r").innerHTML = this.planet._specular[0].toString();
260
- document.querySelector(".og-value.specular-g").innerHTML = this.planet._specular[1].toString();
261
- document.querySelector(".og-value.specular-b").innerHTML = this.planet._specular[2].toString();
262
- document.querySelector(".og-value.shininess").innerHTML = this.planet._specular[3].toString();
259
+ document.querySelector(".og-value.specular-r").innerText = this.planet._specular[0].toString();
260
+ document.querySelector(".og-value.specular-g").innerText = this.planet._specular[1].toString();
261
+ document.querySelector(".og-value.specular-b").innerText = this.planet._specular[2].toString();
262
+ document.querySelector(".og-value.shininess").innerText = this.planet._specular[3].toString();
263
263
  }
264
264
 
265
265
  this._fetchLayers();
@@ -277,7 +277,7 @@ class Lighting extends Control {
277
277
  this.bindLayer(e);
278
278
  let opt = document.createElement("option");
279
279
  opt.value = e.name;
280
- opt.innerHTML = e.name;
280
+ opt.innerText = e.name;
281
281
  document.getElementById("layers").appendChild(opt);
282
282
  document.getElementById("layers").value = e.name;
283
283
  }
@@ -0,0 +1,69 @@
1
+ /**
2
+ * @module og/control/Ruler
3
+ */
4
+
5
+ "use strict";
6
+
7
+ import { Control } from "./Control.js";
8
+ import { Ruler } from "./ruler/Ruler.js";
9
+ import { elementFactory, btnClickHandler } from "./UIhelpers.js";
10
+
11
+ /**
12
+ * Activate ruler
13
+ * @class
14
+ * @extends {Control}
15
+ * @param {Object} [options] - Control options.
16
+ */
17
+ class RulerSwitcher extends Control {
18
+ constructor(options = {}) {
19
+ super(options);
20
+
21
+ this.ruler = new Ruler({
22
+ ignoreTerrain: options.ignoreTerrain
23
+ });
24
+ }
25
+
26
+ oninit() {
27
+ this.planet.addControl(this.ruler);
28
+ this._createMenuBtn();
29
+ }
30
+
31
+ onactivate() {
32
+ this.ruler.activate();
33
+ }
34
+
35
+ ondeactivate() {
36
+ this.ruler.deactivate();
37
+ }
38
+
39
+ _createMenuBtn() {
40
+ let btn = elementFactory(
41
+ 'div',
42
+ { id: 'og-ruler-menu-btn', class: 'og-ruler og-menu-btn og-OFF' },
43
+ elementFactory(
44
+ 'div',
45
+ { id: 'og-ruler-menu-icon', class: 'og-icon-holder' }
46
+ )
47
+ );
48
+
49
+ this.renderer.div.appendChild(btn);
50
+
51
+ btn.addEventListener('click', () => {
52
+ if (btn.classList.contains('og-OFF')) {
53
+ this.onactivate();
54
+ } else {
55
+ this.ondeactivate();
56
+ }
57
+ });
58
+
59
+ btnClickHandler(
60
+ btn,
61
+ null,
62
+ null,
63
+ '#og-ruler-menu-icon'
64
+ );
65
+ }
66
+ }
67
+
68
+ export { RulerSwitcher };
69
+
@@ -0,0 +1,146 @@
1
+ 'use strict';
2
+
3
+ /*
4
+ * Helper functions for UI/UX
5
+ */
6
+
7
+ // Creates new DOM elements and assigns attributes
8
+ export function elementFactory(type, attributes, ...children) {
9
+ const el = document.createElement(type)
10
+ let key = null;
11
+ for (key in attributes) {
12
+ el.setAttribute(key, attributes[key])
13
+ }
14
+
15
+ children.forEach(child => {
16
+ if (typeof child === 'string') {
17
+ el.appendChild(document.createTextNode(child))
18
+ } else {
19
+ el.appendChild(child)
20
+ }
21
+ })
22
+
23
+ return el;
24
+ }
25
+
26
+ // Appends array of children to parent
27
+ export function appendChildren(parent, childrenArray) {
28
+ childrenArray.forEach(child => parent.appendChild(child))
29
+ }
30
+
31
+ // Cycles an array of text and outputs next
32
+ export function toggleText(elementText, textArray) {
33
+ let textIndex = textArray.indexOf(elementText);
34
+ let nextIndex;
35
+ textIndex >= 0 && textIndex < textArray.length - 1 ?
36
+ nextIndex = textIndex + 1 :
37
+ nextIndex = 0;
38
+ return textArray[nextIndex];
39
+ }
40
+
41
+ // Enables a movement of a DOM element. Also disables/enables mouse navigations for og-planet
42
+ export function enableElmovement(el, planet) {
43
+
44
+ let newPosX = 0,
45
+ newPosY = 0,
46
+ startPosX = 0,
47
+ startPosY = 0;
48
+
49
+ const behaviour = (e) => {
50
+ e.preventDefault();
51
+ planet.renderer.controls.mouseNavigation.deactivate()
52
+ // get the starting position of the cursor
53
+ startPosX = e.clientX;
54
+ startPosY = e.clientY;
55
+
56
+ document.addEventListener('mousemove', mouseMove);
57
+
58
+ document.addEventListener('mouseup', function (e) {
59
+ document.removeEventListener('mousemove', mouseMove);
60
+ planet.renderer.controls.mouseNavigation.activate();
61
+ });
62
+ }
63
+
64
+ const mouseMove = (e) => {
65
+ // calculate the new position
66
+ newPosX = startPosX - e.clientX;
67
+ newPosY = startPosY - e.clientY;
68
+
69
+ // with each move we also want to update the start X and Y
70
+ startPosX = e.clientX;
71
+ startPosY = e.clientY;
72
+
73
+ // set the element's new position:
74
+ el.style.top = (el.offsetTop - newPosY) + "px";
75
+ el.style.left = (el.offsetLeft - newPosX) + "px";
76
+ }
77
+
78
+ return { behaviour, mouseMove }
79
+ }
80
+
81
+ // Get all nodes of a class
82
+ export function getAllnodes(CSSclass) {
83
+ return document.querySelectorAll(CSSclass);
84
+ }
85
+
86
+ // Convert nodelist to an Array
87
+ export function nodesToArray(nodeList) {
88
+ return Array.from(nodeList);
89
+ }
90
+
91
+ // Adds a class to all elements selected
92
+ export function setAllCSSclass(CSSclass, nodeArray) {
93
+ return nodeArray.forEach(x => x.classList.add(CSSclass));
94
+ }
95
+
96
+ // Sets all menu buttons to off
97
+ export function allMenuBtnOFF() {
98
+ setAllCSSclass('og-OFF', nodesToArray(getAllnodes('.og-menu-btn')));
99
+ }
100
+
101
+ // Hides all dialoges of main menu
102
+ export function allDialogsHide() {
103
+ setAllCSSclass('og-hide', nodesToArray(getAllnodes('.og-dialog')));
104
+ }
105
+
106
+ function isString(v) {
107
+ return typeof v === 'string' || v instanceof String;
108
+ }
109
+
110
+ // Handles the click inside/outside a dialog - closes dialog when click outside
111
+ export function btnClickHandler(btn_id, dialog_id, dialog_selector, btn_icon_id) {
112
+ let btn = isString(btn_id) ? document.getElementById(btn_id) : btn_id;
113
+ let dialog = document.getElementById(dialog_id);
114
+ btn.onclick = function (e) {
115
+ if (this.classList.contains('og-OFF')) {
116
+ // Turn to ON
117
+ allMenuBtnOFF();
118
+ allDialogsHide();
119
+ this.classList.remove('og-OFF');
120
+ if (dialog) {
121
+ dialog.classList.remove('og-hide');
122
+ }
123
+
124
+ if (this.classList.contains('og-has-dialog')) {
125
+ document.addEventListener('click', (e) => {
126
+ if (e.target.matches(dialog_selector) || e.target.matches(btn_icon_id)) { //inside
127
+ return;
128
+ } else {//outside
129
+ btn.classList.add('og-OFF');
130
+ if (dialog) {
131
+ dialog.classList.add('og-hide')
132
+ }
133
+ // TODO needs fix
134
+ // this.removeEventListener('click', arguments.callee);
135
+ }
136
+ })
137
+ }
138
+ } else {
139
+ // Turn to OFF
140
+ this.classList.add('og-OFF');
141
+ if (dialog) {
142
+ dialog.classList.add('og-hide');
143
+ }
144
+ }
145
+ }
146
+ }
@@ -16,6 +16,7 @@ import { Sun } from "./Sun.js";
16
16
  import { ZoomControl } from "./ZoomControl.js";
17
17
  import { MouseWheelZoomControl } from "./MouseWheelZoomControl.js";
18
18
  import { Lighting } from "./Lighting.js";
19
+ import { LayerAnimation } from "./LayerAnimation.js";
19
20
 
20
21
  export {
21
22
  Control,
@@ -35,5 +36,6 @@ export {
35
36
  ZoomControl,
36
37
  MouseWheelZoomControl,
37
38
  Lighting,
38
- Ruler
39
+ Ruler,
40
+ LayerAnimation
39
41
  };
@@ -112,12 +112,14 @@ class RulerScene extends RenderNode {
112
112
  entities: [this._trackEntity, this._propsLabel],
113
113
  pickingEnabled: false,
114
114
  polygonOffsetUnits: -1.0,
115
- relativeToGround: true
115
+ relativeToGround: true,
116
+ displayInLayerSwitcher: false
116
117
  });
117
118
 
118
119
  this._cornersLayer = new Vector("corners", {
119
120
  entities: [this._cornerEntity[0], this._cornerEntity[1]],
120
- pickingEnabled: true
121
+ pickingEnabled: true,
122
+ displayInLayerSwitcher: false
121
123
  });
122
124
  }
123
125
 
@@ -141,6 +143,7 @@ class RulerScene extends RenderNode {
141
143
  }
142
144
 
143
145
  _activate() {
146
+
144
147
  this._propsLabel.label.setVisibility(false);
145
148
  this._onLclick_ = this._onLclick.bind(this);
146
149
  this.renderer.events.on("lclick", this._onLclick_, this);
@@ -163,6 +166,7 @@ class RulerScene extends RenderNode {
163
166
 
164
167
  this._planet.addLayer(this._trackLayer);
165
168
  this._planet.addLayer(this._cornersLayer);
169
+
166
170
  }
167
171
 
168
172
  _deactivate() {
@@ -400,8 +400,9 @@ class Segment {
400
400
  * @param {Float32Array} elevations - Elevation data.
401
401
  */
402
402
  elevationsExists(elevations) {
403
+ const segment = this;
403
404
  if (this.plainReady && this.terrainIsLoading) {
404
- this.planet._terrainWorker.make(this, elevations);
405
+ this.planet._terrainWorker.make(segment, elevations);
405
406
 
406
407
  this.plainVerticesHigh = null;
407
408
  this.plainVerticesLow = null;
@@ -10,4 +10,4 @@ import { Ellipsoid } from "./Ellipsoid.js";
10
10
  * WGS84 ellipsoid object.
11
11
  * @type {Ellipsoid}
12
12
  */
13
- export const wgs84 = new Ellipsoid(6378137.0, 6356752.3142);
13
+ export const wgs84 = new Ellipsoid(6378137.0, 6356752.3142); // Equitorial Radius (m), Polar Radius (m)
@@ -85,7 +85,8 @@ class LabelHandler extends BillboardHandler {
85
85
  }
86
86
 
87
87
  _addLabelToArrays(label) {
88
- this._renderer.labelWorker.make(this, label);
88
+ this._renderer.labelWorker.make(label);
89
+ console.time(`label${label.id}`)
89
90
  }
90
91
 
91
92
  assignFontAtlas(label) {
@@ -121,6 +122,8 @@ class LabelHandler extends BillboardHandler {
121
122
  label.update();
122
123
 
123
124
  this.refresh();
125
+ console.timeEnd(`label${label.id}`)
126
+ console.log(label)
124
127
  }
125
128
  }
126
129
 
@@ -386,7 +389,7 @@ class LabelHandler extends BillboardHandler {
386
389
  if (isRTL) {
387
390
  _rtl_ = RTL;
388
391
  }
389
-
392
+
390
393
  let offset = 0.0;
391
394
  let kern = fa.kernings;
392
395
 
@@ -2,76 +2,61 @@
2
2
 
3
3
  // import { QueueArray } from '../QueueArray.js';
4
4
 
5
+ import { BaseWorker } from "../utils/BaseWorker.js";
6
+
5
7
  export const LOCK_UPDATE = -2;
6
8
  export const LOCK_FREE = -1;
7
9
 
8
- class LabelWorker {
10
+ class LabelWorker extends BaseWorker {
9
11
  constructor(numWorkers = 4) {
10
- this._id = 0;
11
- this._source = {};
12
-
13
- this._freeWorkerQueue = []; //new QueueArray(numWorkers);
14
- var labelProgramm = new Blob([_programm], { type: "application/javascript" });
15
-
16
- var that = this;
17
-
18
- for (let i = 0; i < numWorkers; i++) {
19
- var w = new Worker(URL.createObjectURL(labelProgramm));
20
- w.onmessage = function (e) {
21
-
22
- let s = that._source[e.data.id];
23
-
24
- if (s.label._lockId === LOCK_UPDATE) {
25
- that.make(s.handler, s.label);
26
- } else {
27
- s.handler.workerCallback(e.data, s.label);
28
- }
12
+ super(numWorkers, _programm);
13
+ this._source = new Map();
14
+ }
29
15
 
30
- that._source[e.data.id] = null;
31
- delete that._source[e.data.id];
32
- that._freeWorkerQueue.unshift(this);
16
+ _onMessage(e) {
33
17
 
34
- that.check();
35
- };
18
+ let label = this._source.get(e.data.id);
36
19
 
37
- this._freeWorkerQueue.push(w);
20
+ if (label._lockId === LOCK_UPDATE) {
21
+ requestAnimationFrame(() => {
22
+ this.make(label);
23
+ });
24
+ } else {
25
+ label._handler.workerCallback(e.data, label);
38
26
  }
39
27
 
40
- this._pendingQueue = []; //new QueueArray(512);
41
- }
28
+ this._source.delete(e.data.id);
29
+ super._onMessage(e)
42
30
 
43
- check() {
44
- if (this._pendingQueue.length) {
45
- var p = this._pendingQueue.pop();
46
- this.make(p.handler, p.label);
47
- }
31
+ this.check();
48
32
  }
49
33
 
50
- make(handler, label) {
51
34
 
35
+ make() {
36
+ const label = arguments[0],
37
+ handler = label._handler;
52
38
  if (handler._entityCollection) {
53
- let source = { handler: handler, label: label };
54
39
 
55
- if (this._freeWorkerQueue.length) {
56
- var w = this._freeWorkerQueue.pop();
40
+ if (this._workerQueue.length) {
41
+ var w = this._workerQueue.pop();
57
42
 
58
- this._source[this._id] = source;
43
+ this._source.set(this._id, label);
59
44
 
60
45
  let labelData = new Float32Array([
61
- /*0*/this._id++,
62
- /*1*/handler._maxLetters,
63
- /*2*/label.getVisibility() ? 1 : 0,
64
- /*3, 4, 5*/label._positionHigh.x, label._positionHigh.y, label._positionHigh.z,
65
- /*6, 7, 8*/label._positionLow.x, label._positionLow.y, label._positionLow.z,
66
- /*9*/label._size,
67
- /*10, 11, 12*/label._offset.x, label._offset.y, label._offset.z,
68
- /*13, 14, 15, 16*/label._color.x, label._color.y, label._color.z, label._color.w,
69
- /*17*/label._rotation,
70
- /*18, 19, 20*/label._alignedAxis.x, label._alignedAxis.y, label._alignedAxis.z,
71
- /*21*/label._fontIndex,
72
- /*22*/label._outline,
73
- /*23, 24, 25, 26*/label._outlineColor.x, label._outlineColor.y, label._outlineColor.z, label._outlineColor.w,
74
- /*27, 28, 29*/label._entity._pickingColor.x, label._entity._pickingColor.y, label._entity._pickingColor.z
46
+ /*0*/this._id++,
47
+ /*1*/handler._maxLetters,
48
+ /*2*/label.getVisibility() ? 1 : 0,
49
+ /*3, 4, 5*/label._positionHigh.x, label._positionHigh.y, label._positionHigh.z,
50
+ /*6, 7, 8*/label._positionLow.x, label._positionLow.y, label._positionLow.z,
51
+ /*9*/label._size,
52
+ /*10, 11, 12*/label._offset.x, label._offset.y, label._offset.z,
53
+ /*13, 14, 15, 16*/label._color.x, label._color.y, label._color.z, label._color.w,
54
+ /*17*/label._rotation,
55
+ /*18, 19, 20*/label._alignedAxis.x, label._alignedAxis.y, label._alignedAxis.z,
56
+ /*21*/label._fontIndex,
57
+ /*22*/label._outline,
58
+ /*23, 24, 25, 26*/label._outlineColor.x, label._outlineColor.y, label._outlineColor.z, label._outlineColor.w,
59
+ /*27, 28, 29*/label._entity._pickingColor.x, label._entity._pickingColor.y, label._entity._pickingColor.z
75
60
  ]);
76
61
 
77
62
  label._lockId = this._id;
@@ -82,7 +67,7 @@ class LabelWorker {
82
67
  labelData.buffer,
83
68
  ]);
84
69
  } else {
85
- this._pendingQueue.push(source);
70
+ this._pendingQueue.push(label);
86
71
  }
87
72
  }
88
73
  }