@openglobus/og 0.11.6 → 0.11.7

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 (185) hide show
  1. package/package.json +11 -11
  2. package/src/og/Globe.js +8 -5
  3. package/src/og/Popup.js +3 -2
  4. package/src/og/camera/PlanetCamera.js +9 -4
  5. package/src/og/control/Lighting.js +33 -2
  6. package/src/og/ellipsoid/Ellipsoid.js +1 -1
  7. package/src/og/entity/BaseBillboard.js +67 -76
  8. package/src/og/entity/BillboardHandler.js +15 -8
  9. package/src/og/entity/Label.js +44 -47
  10. package/src/og/entity/LabelHandler.js +25 -25
  11. package/src/og/entity/LabelWorker.js +21 -16
  12. package/src/og/layer/Layer.js +28 -15
  13. package/src/og/layer/Material.js +1 -1
  14. package/src/og/quadTree/Node.js +16 -30
  15. package/src/og/renderer/Renderer.js +19 -29
  16. package/src/og/renderer/RendererEvents.js +41 -21
  17. package/src/og/scene/Planet.js +11 -28
  18. package/src/og/shaders/drawnode.js +135 -142
  19. package/src/og/shaders/toneMapping.js +1 -0
  20. package/src/og/shapes/BaseShape.js +1 -1
  21. package/src/og/utils/FontAtlas.js +6 -2
  22. package/src/og/utils/TextureAtlas.js +2 -2
  23. package/src/og/utils/VectorTileCreator.js +1 -3
  24. package/src/og/utils/shared.js +1 -1
  25. package/src/og/webgl/Handler.js +152 -118
  26. package/types/Clock.d.ts +0 -94
  27. package/types/Deferred.d.ts +0 -6
  28. package/types/Events.d.ts +0 -77
  29. package/types/Extent.d.ts +0 -166
  30. package/types/Globe.d.ts +0 -82
  31. package/types/ImageCanvas.d.ts +0 -123
  32. package/types/Lock.d.ts +0 -12
  33. package/types/LonLat.d.ts +0 -108
  34. package/types/Popup.d.ts +0 -42
  35. package/types/QueueArray.d.ts +0 -19
  36. package/types/Rectangle.d.ts +0 -80
  37. package/types/Stack.d.ts +0 -19
  38. package/types/ajax.d.ts +0 -24
  39. package/types/arial.d.ts +0 -48
  40. package/types/astro/astro.d.ts +0 -38
  41. package/types/astro/earth.d.ts +0 -7
  42. package/types/astro/jd.d.ts +0 -254
  43. package/types/bv/Box.d.ts +0 -30
  44. package/types/bv/Sphere.d.ts +0 -38
  45. package/types/bv/index.d.ts +0 -3
  46. package/types/camera/Camera.d.ts +0 -312
  47. package/types/camera/Frustum.d.ts +0 -133
  48. package/types/camera/PlanetCamera.d.ts +0 -218
  49. package/types/camera/index.d.ts +0 -3
  50. package/types/cons.d.ts +0 -40
  51. package/types/control/CompassButton.d.ts +0 -17
  52. package/types/control/Control.d.ts +0 -104
  53. package/types/control/DebugInfo.d.ts +0 -15
  54. package/types/control/EarthCoordinates.d.ts +0 -47
  55. package/types/control/EarthNavigation.d.ts +0 -42
  56. package/types/control/GeoImageDragControl.d.ts +0 -6
  57. package/types/control/KeyboardNavigation.d.ts +0 -21
  58. package/types/control/LayerSwitcher.d.ts +0 -21
  59. package/types/control/Lighting.d.ts +0 -16
  60. package/types/control/MouseNavigation.d.ts +0 -47
  61. package/types/control/ScaleControl.d.ts +0 -22
  62. package/types/control/ShowFps.d.ts +0 -11
  63. package/types/control/SimpleNavigation.d.ts +0 -25
  64. package/types/control/Sun.d.ts +0 -50
  65. package/types/control/ToggleWireframe.d.ts +0 -12
  66. package/types/control/TouchNavigation.d.ts +0 -48
  67. package/types/control/ZoomControl.d.ts +0 -27
  68. package/types/control/index.d.ts +0 -17
  69. package/types/ellipsoid/Ellipsoid.d.ts +0 -146
  70. package/types/ellipsoid/index.d.ts +0 -3
  71. package/types/ellipsoid/wgs84.d.ts +0 -6
  72. package/types/entity/BaseBillboard.d.ts +0 -215
  73. package/types/entity/Billboard.d.ts +0 -94
  74. package/types/entity/BillboardHandler.d.ts +0 -78
  75. package/types/entity/Entity.d.ts +0 -348
  76. package/types/entity/EntityCollection.d.ts +0 -317
  77. package/types/entity/GeoObject.d.ts +0 -111
  78. package/types/entity/GeoObjectHandler.d.ts +0 -77
  79. package/types/entity/Geometry.d.ts +0 -74
  80. package/types/entity/GeometryHandler.d.ts +0 -76
  81. package/types/entity/Label.d.ts +0 -189
  82. package/types/entity/LabelHandler.d.ts +0 -31
  83. package/types/entity/LabelWorker.d.ts +0 -9
  84. package/types/entity/PointCloud.d.ts +0 -174
  85. package/types/entity/PointCloudHandler.d.ts +0 -38
  86. package/types/entity/Polyline.d.ts +0 -306
  87. package/types/entity/PolylineHandler.d.ts +0 -18
  88. package/types/entity/Ray.d.ts +0 -124
  89. package/types/entity/RayHandler.d.ts +0 -67
  90. package/types/entity/ShapeHandler.d.ts +0 -22
  91. package/types/entity/Strip.d.ts +0 -119
  92. package/types/entity/StripHandler.d.ts +0 -38
  93. package/types/entity/index.d.ts +0 -8
  94. package/types/index.core.d.ts +0 -65
  95. package/types/index.d.ts +0 -45
  96. package/types/index.webgl.d.ts +0 -7
  97. package/types/input/KeyboardHandler.d.ts +0 -10
  98. package/types/input/MouseHandler.d.ts +0 -5
  99. package/types/input/TouchHandler.d.ts +0 -5
  100. package/types/input/input.d.ts +0 -34
  101. package/types/layer/BaseGeoImage.d.ts +0 -94
  102. package/types/layer/CanvasTiles.d.ts +0 -68
  103. package/types/layer/GeoImage.d.ts +0 -52
  104. package/types/layer/GeoTexture2d.d.ts +0 -8
  105. package/types/layer/GeoVideo.d.ts +0 -55
  106. package/types/layer/KML.d.ts +0 -63
  107. package/types/layer/Layer.d.ts +0 -326
  108. package/types/layer/Material.d.ts +0 -45
  109. package/types/layer/Vector.d.ts +0 -208
  110. package/types/layer/WMS.d.ts +0 -63
  111. package/types/layer/XYZ.d.ts +0 -120
  112. package/types/layer/index.d.ts +0 -10
  113. package/types/light/LightSource.d.ts +0 -178
  114. package/types/math/Line2.d.ts +0 -11
  115. package/types/math/Line3.d.ts +0 -10
  116. package/types/math/Mat3.d.ts +0 -65
  117. package/types/math/Mat4.d.ts +0 -176
  118. package/types/math/Plane.d.ts +0 -18
  119. package/types/math/Quat.d.ts +0 -379
  120. package/types/math/Ray.d.ts +0 -82
  121. package/types/math/Vec2.d.ts +0 -309
  122. package/types/math/Vec3.d.ts +0 -460
  123. package/types/math/Vec4.d.ts +0 -162
  124. package/types/math/coder.d.ts +0 -43
  125. package/types/math/index.d.ts +0 -11
  126. package/types/math.d.ts +0 -261
  127. package/types/mercator.d.ts +0 -92
  128. package/types/proj/EPSG3857.d.ts +0 -6
  129. package/types/proj/EPSG4326.d.ts +0 -6
  130. package/types/proj/Proj.d.ts +0 -42
  131. package/types/quadTree/EntityCollectionNode.d.ts +0 -34
  132. package/types/quadTree/Node.d.ts +0 -61
  133. package/types/quadTree/quadTree.d.ts +0 -40
  134. package/types/renderer/Renderer.d.ts +0 -300
  135. package/types/renderer/RendererEvents.d.ts +0 -233
  136. package/types/res/images.d.ts +0 -3
  137. package/types/scene/Axes.d.ts +0 -11
  138. package/types/scene/BaseNode.d.ts +0 -60
  139. package/types/scene/Planet.d.ts +0 -577
  140. package/types/scene/RenderNode.d.ts +0 -142
  141. package/types/scene/SkyBox.d.ts +0 -10
  142. package/types/scene/index.d.ts +0 -4
  143. package/types/segment/Segment.d.ts +0 -279
  144. package/types/segment/SegmentLonLat.d.ts +0 -16
  145. package/types/segment/segmentHelper.d.ts +0 -13
  146. package/types/shaders/billboard.d.ts +0 -3
  147. package/types/shaders/depth.d.ts +0 -2
  148. package/types/shaders/drawnode.d.ts +0 -7
  149. package/types/shaders/geoObject.d.ts +0 -3
  150. package/types/shaders/label.d.ts +0 -4
  151. package/types/shaders/pointCloud.d.ts +0 -2
  152. package/types/shaders/polyline.d.ts +0 -3
  153. package/types/shaders/ray.d.ts +0 -2
  154. package/types/shaders/screenFrame.d.ts +0 -2
  155. package/types/shaders/shape.d.ts +0 -4
  156. package/types/shaders/skybox.d.ts +0 -2
  157. package/types/shaders/toneMapping.d.ts +0 -2
  158. package/types/shapes/BaseShape.d.ts +0 -250
  159. package/types/shapes/Sphere.d.ts +0 -41
  160. package/types/terrain/BilTerrain.d.ts +0 -7
  161. package/types/terrain/EmptyTerrain.d.ts +0 -72
  162. package/types/terrain/Geoid.d.ts +0 -26
  163. package/types/terrain/GlobusTerrain.d.ts +0 -116
  164. package/types/terrain/MapboxTerrain.d.ts +0 -7
  165. package/types/terrain/index.d.ts +0 -5
  166. package/types/utils/FontAtlas.d.ts +0 -14
  167. package/types/utils/GeoImageCreator.d.ts +0 -30
  168. package/types/utils/ImagesCacheManager.d.ts +0 -10
  169. package/types/utils/Loader.d.ts +0 -25
  170. package/types/utils/NormalMapCreator.d.ts +0 -39
  171. package/types/utils/PlainSegmentWorker.d.ts +0 -10
  172. package/types/utils/TerrainWorker.d.ts +0 -9
  173. package/types/utils/TextureAtlas.d.ts +0 -111
  174. package/types/utils/VectorTileCreator.d.ts +0 -16
  175. package/types/utils/colorTable.d.ts +0 -143
  176. package/types/utils/earcut.d.ts +0 -6
  177. package/types/utils/shared.d.ts +0 -231
  178. package/types/webgl/Framebuffer.d.ts +0 -135
  179. package/types/webgl/Handler.d.ts +0 -397
  180. package/types/webgl/Multisample.d.ts +0 -89
  181. package/types/webgl/Program.d.ts +0 -161
  182. package/types/webgl/ProgramController.d.ts +0 -89
  183. package/types/webgl/callbacks.d.ts +0 -1
  184. package/types/webgl/index.d.ts +0 -6
  185. package/types/webgl/types.d.ts +0 -2
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openglobus/og",
3
- "version": "0.11.6",
3
+ "version": "0.11.7",
4
4
  "description": "[OpenGlobus](http://www.openglobus.org/) is a javascript library designed to display interactive 3d maps and planets with map tiles, imagery and vector data, markers and 3d objects. It uses the WebGL technology, open source and completely free.",
5
5
  "directories": {
6
6
  "example": "./sandbox"
@@ -17,7 +17,7 @@
17
17
  "test": "jest --env=jsdom",
18
18
  "test_watch": "jest --env=jsdom --watch",
19
19
  "lint": "eslint src/og",
20
- "generate_types": "rm -rf types; tsc src/**/*.js --declaration --allowJs --emitDeclarationOnly --outDir types; exit 0",
20
+ "generate_types": "rm -rf types; tsc src/**/*.js --declaration --allowJs --emitDeclarationOnly --outDir types",
21
21
  "compile_js_as_ts": "tsc src/og/index.js --AllowJs --checkJs --outDir dist/@openglobus/src/"
22
22
  },
23
23
  "repository": {
@@ -43,24 +43,24 @@
43
43
  "./css/og.css": "./css/og.css"
44
44
  },
45
45
  "devDependencies": {
46
- "@babel/preset-env": "^7.16.0",
46
+ "@babel/preset-env": "^7.16.4",
47
47
  "@rollup/plugin-json": "^4.1.0",
48
- "@types/jest": "^27.0.2",
49
- "eslint": "^8.2.0",
48
+ "@types/jest": "^27.0.3",
49
+ "eslint": "^8.3.0",
50
50
  "jaguarjs-jsdoc": "^1.1.0",
51
51
  "jest": "^27.3.1",
52
52
  "jest-canvas-mock": "^2.3.1",
53
53
  "jest-webgl-canvas-mock": "^0.2.3",
54
54
  "jsdoc": "^3.6.7",
55
- "lint-staged": "^11.2.6",
55
+ "lint-staged": "^12.1.2",
56
56
  "local-web-server": "^5.1.1",
57
57
  "msdf-bmfont-xml": "^2.5.4",
58
- "postcss": "^8.3.11",
59
- "prettier": "^2.4.1",
60
- "rollup": "^2.60.0",
61
- "rollup-plugin-postcss": "^4.0.1",
58
+ "postcss": "^8.4.1",
59
+ "prettier": "^2.5.0",
60
+ "rollup": "^2.60.1",
61
+ "rollup-plugin-postcss": "^4.0.2",
62
62
  "rollup-plugin-terser": "^7.0.2",
63
- "typescript": "^4.4.4"
63
+ "typescript": "^4.5.2"
64
64
  },
65
65
  "lint-staged": {
66
66
  "*.{js,ts}": [
package/src/og/Globe.js CHANGED
@@ -16,7 +16,7 @@ import { Renderer } from "./renderer/Renderer.js";
16
16
  import { Planet } from "./scene/Planet.js";
17
17
  import { EmptyTerrain } from "./terrain/EmptyTerrain.js";
18
18
  import { isEmpty } from "./utils/shared.js";
19
- import { Handler } from "./webgl/Handler.js";
19
+ import { Handler } from "./webgl/Handler.js";
20
20
 
21
21
  /** @const {string} */
22
22
  const CANVAS_ID_PREFIX = "globus_viewport_";
@@ -60,8 +60,10 @@ const PLANET_NAME_PREFIX = "globus_planet_";
60
60
  * @param {DOMElement} [options.attributionContainer] - Container for attribution list.
61
61
  * @param {Number} [options.maxGridSize] = Maximal segment grid size. 128 is default
62
62
  * @param {boolean} [options.useSpecularTexture] - use specular water mask
63
- * @param {boolean} [options.useNightTexture] - show night cities
64
- * @param {Number} [options.maxEqualZoomAltitude=850000.0] - Maximal altitude since segments on the screen bacame the same zoom level
63
+ * @param {boolean} [options.useNightTexture] - show night cities
64
+ * @param {Number} [options.maxAltitude=15000000.0] - Maximal camera altitude above terrain
65
+ * @param {Number} [options.minAltitude=1.0] - Minimal camera altitude above terrain
66
+ * @param {Number} [options.maxEqualZoomAltitude=15000000.0] - Maximal altitude since segments on the screen bacame the same zoom level
65
67
  * @param {Number} [options.minEqualZoomAltitude=10000.0] - Minimal altitude since segments on the screen bacame the same zoom level
66
68
  * @param {Number} [options.minEqualZoomCameraSlope=0.8] - Minimal camera slope above te globe where segments on the screen bacame the same zoom level
67
69
  */
@@ -117,7 +119,8 @@ class Globe {
117
119
  * @type {Renderer}
118
120
  */
119
121
  this.renderer = new Renderer(
120
- new Handler(_canvasId, {
122
+ new Handler(_canvasId, {
123
+ pixelRatio: window.devicePixelRatio,
121
124
  context: {
122
125
  alpha: false,
123
126
  antialias: false,
@@ -165,7 +168,7 @@ class Globe {
165
168
  useNightTexture: options.useNightTexture,
166
169
  useSpecularTexture: options.useSpecularTexture,
167
170
  minAltitude: options.minAltitude,
168
- maxAltitude: options.maxAltitude,
171
+ maxAltitude: options.maxAltitude || 15000000,
169
172
  maxEqualZoomAltitude: options.maxEqualZoomAltitude,
170
173
  minEqualZoomAltitude: options.minEqualZoomAltitude,
171
174
  minEqualZoomCameraSlope: options.minEqualZoomCameraSlope
package/src/og/Popup.js CHANGED
@@ -74,11 +74,12 @@ class Popup {
74
74
 
75
75
  setScreen(p) {
76
76
  if (this._planet) {
77
+ let r = this._planet.renderer.handler.pixelRatio;
77
78
  this.el.style.transform =
78
79
  "translate(" +
79
- (p.x - this.clientWidth * 0.5) +
80
+ (p.x / r - this.clientWidth * 0.5) +
80
81
  "px, " +
81
- (p.y - this._planet.renderer.handler.canvas.height - this._tipEl.clientHeight) +
82
+ (p.y / r - this._planet.renderer.handler.canvas.clientHeight - this._tipEl.clientHeight) +
82
83
  "px)";
83
84
  }
84
85
  }
@@ -41,7 +41,7 @@ class PlanetCamera extends Camera {
41
41
  Object.assign(
42
42
  {},
43
43
  {
44
- frustums: /*[[100, 10000000]]*/ [
44
+ frustums: /*[[100, 10000000]]*/[
45
45
  [1, 100 + 0.075],
46
46
  [100, 1000 + 0.075],
47
47
  [1000, 1e6 + 10000],
@@ -636,15 +636,20 @@ class PlanetCamera extends Camera {
636
636
  getHeading() {
637
637
  let u = this.eye.normal();
638
638
  let f = Vec3.proj_b_to_plane(
639
- this.slope >= 0.97 ? this.getUp() : this.getForward(),
640
- u
641
- ).normalize(),
639
+ this.slope >= 0.97 ? this.getUp() : this.getForward(),
640
+ u
641
+ ).normalize(),
642
642
  n = Vec3.proj_b_to_plane(Vec3.UP, u).normalize();
643
643
  let res = Math.sign(u.dot(f.cross(n))) * Math.acos(f.dot(n)) * math.DEGREES;
644
644
  if (res < 0.0) {
645
645
  return 360.0 + res;
646
646
  }
647
647
  return res;
648
+ }
649
+
650
+ isVisible(poi) {
651
+ let e = this.eye.length();
652
+ return this.eye.distance(poi) < Math.sqrt(e * e - this.planet.ellipsoid._a2);
648
653
  }
649
654
  }
650
655
 
@@ -10,6 +10,11 @@ import { parseHTML } from "../utils/shared.js";
10
10
  const TEMPLATE = `<div class="og-lighing">
11
11
 
12
12
  <div class="og-screen-options">
13
+
14
+ <div class="og-option">
15
+ <div class="og-caption">Lighting enabled<input type="checkbox" id="lighting" name="light"/></div>
16
+ </div>
17
+
13
18
  <div class="og-option">
14
19
  <div class="og-caption">Gamma</div>
15
20
  <div class="og-slider">
@@ -32,6 +37,14 @@ const TEMPLATE = `<div class="og-lighing">
32
37
  </div>
33
38
 
34
39
  <div class="og-color-options">
40
+ <div class="og-caption">Opacity</div>
41
+ <div class="og-option">
42
+ <div class="og-label">A</div>
43
+ <div class="og-slider">
44
+ <input type="range" id="opacity" name="opacity" value="0.0" min="0.0" max="2.0" step="0.01" />
45
+ </div>
46
+ <div class="og-value opacity"></div>
47
+ </div>
35
48
  <div class="og-caption">Ambient</div>
36
49
  <div class="og-option">
37
50
  <div class="og-label">R</div>
@@ -128,6 +141,8 @@ class Lighting extends Control {
128
141
  bindLayer(layer) {
129
142
  this._selectedLayer = layer;
130
143
 
144
+ document.getElementById("opacity").value = layer.opacity;
145
+
131
146
  document.getElementById("ambient-r").value = layer.ambient.x;
132
147
  document.getElementById("ambient-g").value = layer.ambient.y;
133
148
  document.getElementById("ambient-b").value = layer.ambient.z;
@@ -142,6 +157,8 @@ class Lighting extends Control {
142
157
 
143
158
  document.getElementById("shininess").value = layer.shininess;
144
159
 
160
+ document.querySelector(".og-value.opacity").innerHTML = layer.opacity.toString();
161
+
145
162
  document.querySelector(".og-value.ambient-r").innerHTML = layer.ambient.x.toString();
146
163
  document.querySelector(".og-value.ambient-g").innerHTML = layer.ambient.y.toString();
147
164
  document.querySelector(".og-value.ambient-b").innerHTML = layer.ambient.z.toString();
@@ -163,8 +180,15 @@ class Lighting extends Control {
163
180
 
164
181
  var _this = this;
165
182
 
183
+ document.getElementById("lighting").checked = this.planet.lightEnabled;
184
+
185
+ document.getElementById("lighting").addEventListener("change", (e) => {
186
+ _this.planet.lightEnabled = e.target.checked;
187
+ });
188
+
166
189
  document.getElementById("layers").addEventListener("change", (e) => {
167
- this._selectedLayer = _this.planet.getLayerByName(e.target.value);
190
+ //this._selectedLayer = _this.planet.getLayerByName(e.target.value);
191
+ this.bindLayer(_this.planet.getLayerByName(e.target.value));
168
192
  });
169
193
 
170
194
  document.getElementById("gamma").addEventListener("input", function (e) {
@@ -183,6 +207,13 @@ class Lighting extends Control {
183
207
  document.getElementById("gamma").value = this.planet.renderer.gamma;
184
208
  document.getElementById("exposure").value = this.planet.renderer.exposure;
185
209
 
210
+ document.getElementById("opacity").addEventListener("input", function (e) {
211
+ if (_this._selectedLayer) {
212
+ _this._selectedLayer.opacity = Number(this.value);
213
+ }
214
+ document.querySelector(".og-value.opacity").innerHTML = this.value;
215
+ });
216
+
186
217
  document.getElementById("ambient-r").addEventListener("input", function (e) {
187
218
  if (_this._selectedLayer) {
188
219
  _this._selectedLayer.ambient.x = Number(this.value);
@@ -272,7 +303,7 @@ class Lighting extends Control {
272
303
  document.getElementById("layers").value = e.name;
273
304
  }
274
305
 
275
- _onLayerRemove(e) {}
306
+ _onLayerRemove(e) { }
276
307
  }
277
308
 
278
309
  export function lighting(options) {
@@ -562,7 +562,7 @@ class Ellipsoid {
562
562
  // qw >= 0.0. Looking outward or tangent.
563
563
  return null;
564
564
  }
565
- }
565
+ }
566
566
  }
567
567
 
568
568
  export { Ellipsoid };
@@ -6,6 +6,7 @@
6
6
 
7
7
  import * as utils from "../utils/shared.js";
8
8
  import { Vec3 } from "../math/Vec3.js";
9
+ import { LOCK_FREE, LOCK_UPDATE } from "./LabelWorker.js";
9
10
 
10
11
  /**
11
12
  * Base prototype for billboard and label classes.
@@ -97,16 +98,16 @@ class BaseBillboard {
97
98
  * @protected
98
99
  * @type {number}
99
100
  */
100
- this._handlerIndex = -1;
101
-
102
- /**
103
- * An indication that the object is ready to draw
104
- * @protected
105
- * @type {number}
106
- */
107
- this._isReady = false;
108
-
109
- this._lockId = -1;
101
+ this._handlerIndex = -1;
102
+
103
+ /**
104
+ * An indication that the object is ready to draw
105
+ * @protected
106
+ * @type {number}
107
+ */
108
+ this._isReady = false;
109
+
110
+ this._lockId = LOCK_FREE;
110
111
  }
111
112
 
112
113
  static get _staticCounter() {
@@ -132,10 +133,10 @@ class BaseBillboard {
132
133
  this._position.y = y;
133
134
  this._position.z = z;
134
135
  Vec3.doubleToTwoFloats(this._position, this._positionHigh, this._positionLow);
135
- if (this._isReady) {
136
- this._handler.setPositionArr(this._handlerIndex, this._positionHigh, this._positionLow);
137
- } else if (this._lockId !== -1) {
138
- this._lockId = -2;
136
+ if (this._isReady) {
137
+ this._handler.setPositionArr(this._handlerIndex, this._positionHigh, this._positionLow);
138
+ } else if (this._lockId !== LOCK_FREE) {
139
+ this._lockId = LOCK_UPDATE;
139
140
  }
140
141
  }
141
142
 
@@ -149,10 +150,10 @@ class BaseBillboard {
149
150
  this._position.y = position.y;
150
151
  this._position.z = position.z;
151
152
  Vec3.doubleToTwoFloats(position, this._positionHigh, this._positionLow);
152
- if (this._isReady) {
153
- this._handler.setPositionArr(this._handlerIndex, this._positionHigh, this._positionLow);
154
- } else if (this._lockId !== -1) {
155
- this._lockId = -2;
153
+ if (this._isReady) {
154
+ this._handler.setPositionArr(this._handlerIndex, this._positionHigh, this._positionLow);
155
+ } else if (this._lockId !== LOCK_FREE) {
156
+ this._lockId = LOCK_UPDATE;
156
157
  }
157
158
  }
158
159
 
@@ -176,10 +177,10 @@ class BaseBillboard {
176
177
  this._offset.x = x;
177
178
  this._offset.y = y;
178
179
  z != undefined && (this._offset.z = z);
179
- if (this._isReady) {
180
- this._handler.setOffsetArr(this._handlerIndex, this._offset);
181
- } else if (this._lockId !== -1) {
182
- this._lockId = -2;
180
+ if (this._isReady) {
181
+ this._handler.setOffsetArr(this._handlerIndex, this._offset);
182
+ } else if (this._lockId !== LOCK_FREE) {
183
+ this._lockId = LOCK_UPDATE;
183
184
  }
184
185
  }
185
186
 
@@ -189,14 +190,7 @@ class BaseBillboard {
189
190
  * @param {Vec2} offset - Offset size.
190
191
  */
191
192
  setOffset3v(offset) {
192
- this._offset.x = offset.x;
193
- this._offset.y = offset.y;
194
- offset.z != undefined && (this._offset.z = offset.z);
195
- if (this._isReady) {
196
- this._handler.setOffsetArr(this._handlerIndex, offset);
197
- } else if (this._lockId !== -1) {
198
- this._lockId = -2;
199
- }
193
+ this.setOffset(offset.x, offset.y, offset.z);
200
194
  }
201
195
 
202
196
  /**
@@ -214,11 +208,13 @@ class BaseBillboard {
214
208
  * @param {number} rotation - Screen space rotation in radians.
215
209
  */
216
210
  setRotation(rotation) {
217
- this._rotation = rotation;
218
- if (this._isReady) {
219
- this._handler.setRotationArr(this._handlerIndex, rotation);
220
- } else if (this._lockId !== -1) {
221
- this._lockId = -2;
211
+ if (rotation !== this._rotation) {
212
+ this._rotation = rotation;
213
+ if (this._isReady) {
214
+ this._handler.setRotationArr(this._handlerIndex, rotation);
215
+ } else if (this._lockId !== LOCK_FREE) {
216
+ this._lockId = LOCK_UPDATE;
217
+ }
222
218
  }
223
219
  }
224
220
 
@@ -237,8 +233,14 @@ class BaseBillboard {
237
233
  * @param {number} a - Billboard opacity.
238
234
  */
239
235
  setOpacity(a) {
240
- this._color.w = a;
241
- this.setColor(this._color.x, this._color.y, this._color.z, a);
236
+ if (a !== this._color.w) {
237
+ a != undefined && (this._color.w = a);
238
+ if (this._isReady) {
239
+ this._handler.setRgbaArr(this._handlerIndex, this._color);
240
+ } else if (this._lockId !== LOCK_FREE) {
241
+ this._lockId = LOCK_UPDATE;
242
+ }
243
+ }
242
244
  }
243
245
 
244
246
  /**
@@ -250,14 +252,16 @@ class BaseBillboard {
250
252
  * @param {number} a - Alpha.
251
253
  */
252
254
  setColor(r, g, b, a) {
253
- this._color.x = r;
254
- this._color.y = g;
255
- this._color.z = b;
256
- a != undefined && (this._color.w = a);
257
- if (this._isReady) {
258
- this._handler.setRgbaArr(this._handlerIndex, this._color);
259
- } else if (this._lockId !== -1) {
260
- this._lockId = -2;
255
+ if (a !== this._color.w || r !== this._color.x || g !== this._color.y || this._color.z !== b) {
256
+ this._color.x = r;
257
+ this._color.y = g;
258
+ this._color.z = b;
259
+ a != undefined && (this._color.w = a);
260
+ if (this._isReady) {
261
+ this._handler.setRgbaArr(this._handlerIndex, this._color);
262
+ } else if (this._lockId !== LOCK_FREE) {
263
+ this._lockId = LOCK_UPDATE;
264
+ }
261
265
  }
262
266
  }
263
267
 
@@ -267,15 +271,7 @@ class BaseBillboard {
267
271
  * @param {Vec4} color - RGBA vector.
268
272
  */
269
273
  setColor4v(color) {
270
- this._color.x = color.x;
271
- this._color.y = color.y;
272
- this._color.z = color.z;
273
- color.w != undefined && (this._color.w = color.w);
274
- if (this._isReady) {
275
- this._handler.setRgbaArr(this._handlerIndex, color);
276
- } else if (this._lockId !== -1) {
277
- this._lockId = -2;
278
- }
274
+ this.setColor(color.x, color.y, color.z, color.w);
279
275
  }
280
276
 
281
277
  /**
@@ -302,11 +298,13 @@ class BaseBillboard {
302
298
  * @param {boolean} visibility - Visibility flag.
303
299
  */
304
300
  setVisibility(visibility) {
305
- this._visibility = visibility;
306
- if (this._isReady) {
307
- this._handler.setVisibility(this._handlerIndex, visibility);
308
- } else if (this._lockId !== -1) {
309
- this._lockId = -2;
301
+ if (visibility !== this._visibility) {
302
+ this._visibility = visibility;
303
+ if (this._isReady) {
304
+ this._handler.setVisibility(this._handlerIndex, visibility);
305
+ } else if (this._lockId !== LOCK_FREE) {
306
+ this._lockId = LOCK_UPDATE;
307
+ }
310
308
  }
311
309
  }
312
310
 
@@ -330,10 +328,10 @@ class BaseBillboard {
330
328
  this._alignedAxis.x = x;
331
329
  this._alignedAxis.y = y;
332
330
  this._alignedAxis.z = z;
333
- if (this._isReady) {
334
- this._handler.setAlignedAxisArr(this._handlerIndex, this._alignedAxis);
335
- } else if (this._lockId !== -1) {
336
- this._lockId = -2;
331
+ if (this._isReady) {
332
+ this._handler.setAlignedAxisArr(this._handlerIndex, this._alignedAxis);
333
+ } else if (this._lockId !== LOCK_FREE) {
334
+ this._lockId = LOCK_UPDATE;
337
335
  }
338
336
  }
339
337
 
@@ -343,14 +341,7 @@ class BaseBillboard {
343
341
  * @param {math.Vecto3} alignedAxis - Vector to align.
344
342
  */
345
343
  setAlignedAxis3v(alignedAxis) {
346
- this._alignedAxis.x = alignedAxis.x;
347
- this._alignedAxis.y = alignedAxis.y;
348
- this._alignedAxis.z = alignedAxis.z;
349
- if (this._isReady) {
350
- this._handler.setAlignedAxisArr(this._handlerIndex, alignedAxis);
351
- } else if (this._lockId !== -1) {
352
- this._lockId = -2;
353
- }
344
+ this.setAlignedAxis(alignedAxis.x, alignedAxis.y, alignedAxis.z);
354
345
  }
355
346
 
356
347
  /**
@@ -377,12 +368,12 @@ class BaseBillboard {
377
368
  * @param {Vec3} color - Picking color.
378
369
  */
379
370
  setPickingColor3v(color) {
380
- if (this._isReady) {
381
- this._handler.setPickingColorArr(this._handlerIndex, color);
382
- } else if (this._lockId !== -1) {
383
- this._lockId = -2;
371
+ if (this._isReady) {
372
+ this._handler.setPickingColorArr(this._handlerIndex, color);
373
+ } else if (this._lockId !== LOCK_FREE) {
374
+ this._lockId = LOCK_UPDATE;
384
375
  }
385
376
  }
386
377
  }
387
378
 
388
- export { BaseBillboard };
379
+ export { BaseBillboard };
@@ -6,6 +6,7 @@
6
6
 
7
7
  import * as shaders from "../shaders/billboard.js";
8
8
  import { concatTypedArrays, spliceTypedArray } from "../utils/shared.js";
9
+ import { LOCK_UPDATE, LOCK_FREE } from "./LabelWorker.js";
9
10
 
10
11
  const PICKINGCOLOR_BUFFER = 0;
11
12
  const POSITION_BUFFER = 1;
@@ -80,6 +81,10 @@ class BillboardHandler {
80
81
  this.__staticId = BillboardHandler._staticCounter++;
81
82
  }
82
83
 
84
+ isEqual(handler) {
85
+ return handler && (handler.__staticId === this.__staticId);
86
+ }
87
+
83
88
  static get _staticCounter() {
84
89
  if (!this._counter && this._counter !== 0) {
85
90
  this._counter = 0;
@@ -126,9 +131,9 @@ class BillboardHandler {
126
131
  while (i--) {
127
132
  var bi = this._billboards[i];
128
133
  bi._handlerIndex = -1;
129
- bi._handler = null;
130
- bi._isReady = false;
131
- bi._lockId = -1;
134
+ bi._handler = null;
135
+ bi._isReady = false;
136
+ bi._lockId = LOCK_FREE;
132
137
  }
133
138
  this._billboards.length = 0;
134
139
  this._billboards = [];
@@ -202,7 +207,7 @@ class BillboardHandler {
202
207
  }
203
208
 
204
209
  add(billboard) {
205
- if (billboard._handlerIndex == -1) {
210
+ if (billboard._handlerIndex == -1) {
206
211
  billboard._isReady = true;
207
212
  billboard._handler = this;
208
213
  billboard._handlerIndex = this._billboards.length;
@@ -625,14 +630,16 @@ class BillboardHandler {
625
630
  this.refresh();
626
631
 
627
632
  billboard._handlerIndex = -1;
628
- billboard._handler = null;
629
- billboard._isReady = false;
630
- billboard._lockId = -1;
633
+ billboard._handler = null;
634
+ billboard._isReady = false;
635
+ billboard._lockId = LOCK_FREE;
631
636
  }
632
637
 
633
638
  remove(billboard) {
634
639
  if (billboard._isReady && this.__staticId == billboard._handler.__staticId) {
635
640
  this._removeBillboard(billboard);
641
+ } else {
642
+ billboard._handler = null;
636
643
  }
637
644
  }
638
645
 
@@ -1042,4 +1049,4 @@ class BillboardHandler {
1042
1049
  }
1043
1050
  }
1044
1051
 
1045
- export { BillboardHandler };
1052
+ export { BillboardHandler };