@openglobus/og 0.13.5 → 0.13.8

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 (78) hide show
  1. package/css/og.css +66 -25
  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 +1 -1
  8. package/src/og/Events.js +188 -188
  9. package/src/og/Extent.js +1 -9
  10. package/src/og/Globe.js +1 -0
  11. package/src/og/Object3d.js +384 -0
  12. package/src/og/arial.js +1705 -1703
  13. package/src/og/camera/Camera.js +640 -640
  14. package/src/og/control/DebugInfo.js +15 -4
  15. package/src/og/control/EarthCoordinates.js +151 -160
  16. package/src/og/control/KeyboardNavigation.js +48 -2
  17. package/src/og/control/LayerAnimation.js +115 -0
  18. package/src/og/control/MouseNavigation.js +460 -460
  19. package/src/og/control/Sun.js +170 -170
  20. package/src/og/control/TouchNavigation.js +13 -13
  21. package/src/og/control/ZoomControl.js +1 -3
  22. package/src/og/control/index.js +3 -1
  23. package/src/og/control/ruler/Ruler.js +43 -0
  24. package/src/og/control/ruler/RulerScene.js +370 -0
  25. package/src/og/control/visibleExtent/Segment.js +1 -4
  26. package/src/og/ellipsoid/Ellipsoid.js +20 -1
  27. package/src/og/entity/Entity.js +1 -1
  28. package/src/og/entity/GeoObject.js +1 -1
  29. package/src/og/entity/LabelHandler.js +3 -2
  30. package/src/og/input/input.js +7 -1
  31. package/src/og/layer/CanvasTiles.js +8 -8
  32. package/src/og/layer/KML.js +181 -12
  33. package/src/og/layer/Layer.js +27 -42
  34. package/src/og/layer/Vector.js +80 -14
  35. package/src/og/layer/XYZ.js +8 -2
  36. package/src/og/math/Vec3.js +1 -1
  37. package/src/og/math.js +4 -4
  38. package/src/og/quadTree/Node.js +2 -1
  39. package/src/og/renderer/Renderer.js +1 -2
  40. package/src/og/renderer/RendererEvents.js +17 -3
  41. package/src/og/res/images.js +0 -2
  42. package/src/og/scene/Planet.js +92 -32
  43. package/src/og/segment/Segment.js +1 -8
  44. package/src/og/shaders/label.js +30 -42
  45. package/src/og/terrain/EmptyTerrain.js +164 -146
  46. package/src/og/terrain/Geoid.js +246 -241
  47. package/src/og/terrain/GlobusTerrain.js +23 -24
  48. package/src/og/terrain/MapboxTerrain.js +292 -294
  49. package/src/og/utils/FontAtlas.js +1 -2
  50. package/src/og/utils/Loader.js +160 -112
  51. package/src/og/utils/PlainSegmentWorker.js +38 -26
  52. package/src/og/utils/VectorTileCreator.js +1 -1
  53. package/src/og/utils/units.js +78 -0
  54. package/src/og/webgl/ProgramController.js +143 -143
  55. package/types/Object3d.d.ts +21 -0
  56. package/types/arial.d.ts +1 -0
  57. package/types/control/EarthCoordinates.d.ts +27 -30
  58. package/types/control/KeyboardNavigation.d.ts +3 -0
  59. package/types/control/Sun.d.ts +1 -1
  60. package/types/control/index.d.ts +2 -1
  61. package/types/control/ruler/Ruler.d.ts +13 -0
  62. package/types/control/ruler/RulerScene.d.ts +48 -0
  63. package/types/ellipsoid/Ellipsoid.d.ts +8 -0
  64. package/types/input/input.d.ts +6 -0
  65. package/types/layer/KML.d.ts +26 -1
  66. package/types/layer/Layer.d.ts +23 -31
  67. package/types/layer/Vector.d.ts +2 -0
  68. package/types/layer/XYZ.d.ts +1 -0
  69. package/types/math.d.ts +1 -1
  70. package/types/renderer/RendererEvents.d.ts +2 -0
  71. package/types/res/images.d.ts +0 -1
  72. package/types/scene/Planet.d.ts +12 -3
  73. package/types/terrain/EmptyTerrain.d.ts +4 -1
  74. package/types/terrain/Geoid.d.ts +1 -10
  75. package/types/terrain/GlobusTerrain.d.ts +0 -2
  76. package/types/terrain/MapboxTerrain.d.ts +1 -1
  77. package/types/utils/Loader.d.ts +4 -0
  78. package/types/utils/units.d.ts +20 -0
@@ -88,7 +88,13 @@ const EVENT_NAMES = [
88
88
  * Triggered when all data is loaded
89
89
  * @event og.scene.Planet#rendercompleted
90
90
  */
91
- "rendercompleted"
91
+ "rendercompleted",
92
+
93
+ /**
94
+ * Triggered when all data is loaded
95
+ * @event og.scene.Planet#terraincompleted
96
+ */
97
+ "terraincompleted"
92
98
  ];
93
99
 
94
100
  /**
@@ -221,7 +227,7 @@ export class Planet extends RenderNode {
221
227
  */
222
228
  this.maxCurrZoom = math.MIN;
223
229
 
224
- this._viewExtent = null;
230
+ this._viewExtent = new Extent(new LonLat(180, 180), new LonLat(-180, -180));
225
231
 
226
232
  /**
227
233
  * @protected
@@ -428,6 +434,10 @@ export class Planet extends RenderNode {
428
434
  this.always = [];
429
435
 
430
436
  this._renderCompleted = false;
437
+ this._renderCompletedActivated = false;
438
+
439
+ this._terrainCompleted = false;
440
+ this._terrainCompletedActivated = false;
431
441
  }
432
442
 
433
443
  static getBearingNorthRotationQuat(cartesian) {
@@ -454,6 +464,7 @@ export class Planet extends RenderNode {
454
464
  this._minLodSize = minLodSize || this._minLodSize;
455
465
  this._curLodSize = currentLodSize || this._curLodSize;
456
466
  this._renderCompletedActivated = false;
467
+ this._terrainCompletedActivated = false;
457
468
  }
458
469
 
459
470
  /**
@@ -571,6 +582,7 @@ export class Planet extends RenderNode {
571
582
  */
572
583
  setHeightFactor(factor) {
573
584
  this._renderCompletedActivated = false;
585
+ this._terrainCompletedActivated = false;
574
586
 
575
587
  if (this._heightFactor !== factor) {
576
588
  this._heightFactor = factor;
@@ -593,6 +605,7 @@ export class Planet extends RenderNode {
593
605
  */
594
606
  setTerrain(terrain) {
595
607
  this._renderCompletedActivated = false;
608
+ this._terrainCompletedActivated = false;
596
609
 
597
610
  if (this._initialized) {
598
611
  this.memClear();
@@ -613,21 +626,36 @@ export class Planet extends RenderNode {
613
626
  this._quadTree.destroyBranches();
614
627
  }
615
628
 
616
- if (terrain._geoid) {
617
- if (!terrain._geoid.model) {
618
- terrain._geoid.model = null;
619
- Geoid.loadModel(terrain._geoid.src)
620
- .then((m) => {
621
- terrain.getGeoid().setModel(m);
622
- this._plainSegmentWorker.setGeoid(terrain.getGeoid());
623
- })
624
- .catch((err) => {
625
- console.log(err);
626
- });
627
- } else {
628
- this._plainSegmentWorker.setGeoid(terrain.getGeoid());
629
- }
629
+ //if (terrain._geoid) {
630
+
631
+ if (terrain._geoid.model) {
632
+ this._plainSegmentWorker.setGeoid(terrain.getGeoid());
633
+ terrain._isReady = true;
634
+ } else {
635
+ Geoid.loadModel(terrain._geoid.src)
636
+ .then((m) => {
637
+ terrain.getGeoid().setModel(m);
638
+ this._plainSegmentWorker.setGeoid(terrain.getGeoid());
639
+ terrain._isReady = true;
640
+ })
641
+ .catch((err) => {
642
+ console.log(err);
643
+ });
630
644
  }
645
+
646
+ // if (!terrain._geoid.model) {
647
+ // Geoid.loadModel(terrain._geoid.src)
648
+ // .then((m) => {
649
+ // terrain.getGeoid().setModel(m);
650
+ // this._plainSegmentWorker.setGeoid(terrain.getGeoid());
651
+ // })
652
+ // .catch((err) => {
653
+ // console.log(err);
654
+ // });
655
+ // } else {
656
+ // this._plainSegmentWorker.setGeoid(terrain.getGeoid());
657
+ // }
658
+ //}
631
659
  }
632
660
 
633
661
  /**
@@ -677,10 +705,10 @@ export class Planet extends RenderNode {
677
705
  !this._indexesCache[i][j] && (this._indexesCache[i][j] = new Array(TABLESIZE));
678
706
  for (var k = 0; k <= TABLESIZE; k++) {
679
707
  !this._indexesCache[i][j][k] &&
680
- (this._indexesCache[i][j][k] = new Array(TABLESIZE));
708
+ (this._indexesCache[i][j][k] = new Array(TABLESIZE));
681
709
  for (var m = 0; m <= TABLESIZE; m++) {
682
710
  !this._indexesCache[i][j][k][m] &&
683
- (this._indexesCache[i][j][k][m] = new Array(TABLESIZE));
711
+ (this._indexesCache[i][j][k][m] = new Array(TABLESIZE));
684
712
  for (var q = 0; q <= TABLESIZE; q++) {
685
713
  let ptr = {
686
714
  buffer: null
@@ -708,6 +736,7 @@ export class Planet extends RenderNode {
708
736
 
709
737
  this.renderer.events.on("resize", () => {
710
738
  this._renderCompletedActivated = false;
739
+ this._terrainCompletedActivated = false;
711
740
  });
712
741
 
713
742
  // Initialize texture coordinates buffer pool
@@ -917,15 +946,7 @@ export class Planet extends RenderNode {
917
946
  }
918
947
  }
919
948
 
920
- if (this.renderer) {
921
- if (html.length) {
922
- this.renderer.div.attributions.style.display = "block";
923
- this.renderer.div.attributions.innerHTML = "<ul>" + html + "</ul>";
924
- } else {
925
- this.renderer.div.attributions.style.display = "none";
926
- this.renderer.div.attributions.innerHTML = "";
927
- }
928
- }
949
+ this._applyAttribution(html)
929
950
  }
930
951
 
931
952
  /**
@@ -971,17 +992,28 @@ export class Planet extends RenderNode {
971
992
  }
972
993
  }
973
994
 
995
+ this._applyAttribution(html);
996
+
997
+ this._sortLayers();
998
+ }
999
+
1000
+ /**
1001
+ * Apply to render list of layer attributions
1002
+ * @private
1003
+ */
1004
+ _applyAttribution(html) {
974
1005
  if (this.renderer) {
975
1006
  if (html.length) {
976
- this.renderer.div.attributions.style.display = "block";
977
- this.renderer.div.attributions.innerHTML = "<ul>" + html + "</ul>";
1007
+ html = "<ul>" + html + "</ul>";
1008
+ if (this.renderer.div.attributions.innerHTML !== html) {
1009
+ this.renderer.div.attributions.style.display = "block";
1010
+ this.renderer.div.attributions.innerHTML = html;
1011
+ }
978
1012
  } else {
979
1013
  this.renderer.div.attributions.style.display = "none";
980
1014
  this.renderer.div.attributions.innerHTML = "";
981
1015
  }
982
1016
  }
983
-
984
- this._sortLayers();
985
1017
  }
986
1018
 
987
1019
  /**
@@ -1040,7 +1072,8 @@ export class Planet extends RenderNode {
1040
1072
  // clear first
1041
1073
  this._clearRenderedNodeList();
1042
1074
 
1043
- this._viewExtent = null;
1075
+ this._viewExtent.southWest.set(180, 180);
1076
+ this._viewExtent.northEast.set(-180, -180);
1044
1077
 
1045
1078
  this._visibleNodes = {};
1046
1079
  this._visibleNodesNorth = {};
@@ -1138,6 +1171,17 @@ export class Planet extends RenderNode {
1138
1171
  this._renderCompletedActivated = false;
1139
1172
  }
1140
1173
  this._renderCompleted = true;
1174
+
1175
+ if (this._terrainCompleted) {
1176
+ if (!this._terrainCompletedActivated) {
1177
+ this._terrainCompletedActivated = true;
1178
+ this.events.dispatch(this.events.terraincompleted, true);
1179
+ }
1180
+ } else {
1181
+ this._terrainCompletedActivated = false;
1182
+ }
1183
+
1184
+ this._terrainCompleted = true;
1141
1185
  }
1142
1186
 
1143
1187
  /**
@@ -1789,4 +1833,20 @@ export class Planet extends RenderNode {
1789
1833
  }
1790
1834
  }
1791
1835
  }
1836
+
1837
+ async getHeightDefault(lonLat) {
1838
+ return new Promise((resolve, reject) => {
1839
+ this.terrain.getHeightAsync(lonLat.clone(), (alt) => {
1840
+ resolve(alt);
1841
+ });
1842
+ });
1843
+ }
1844
+
1845
+ async getHeightAboveELL(lonLat) {
1846
+ return new Promise((resolve, reject) => {
1847
+ this.terrain.getHeightAsync(lonLat.clone(), (alt) => {
1848
+ resolve(alt + this.terrain.geoid.getHeightLonLat(lonLat));
1849
+ });
1850
+ });
1851
+ }
1792
1852
  }
@@ -1209,14 +1209,6 @@ class Segment {
1209
1209
  _addViewExtent() {
1210
1210
  var ext = this._extentLonLat;
1211
1211
 
1212
- if (!this.planet._viewExtent) {
1213
- this.planet._viewExtent = new Extent(
1214
- new LonLat(ext.southWest.lon, ext.southWest.lat),
1215
- new LonLat(ext.northEast.lon, ext.northEast.lat)
1216
- );
1217
- return;
1218
- }
1219
-
1220
1212
  var viewExt = this.planet._viewExtent;
1221
1213
 
1222
1214
  if (ext.southWest.lon < viewExt.southWest.lon) {
@@ -1488,6 +1480,7 @@ class Segment {
1488
1480
 
1489
1481
  if (!m.isReady) {
1490
1482
  this.planet._renderCompleted = false;
1483
+ this.planet._terrainReady = false;
1491
1484
  }
1492
1485
 
1493
1486
  slice.append(li, m);
@@ -92,6 +92,7 @@ export function label_webgl2() {
92
92
 
93
93
  if(a_texCoord.w == EMPTY) {
94
94
  gl_Position = vec4(0.0);
95
+ v_fontIndex = -1;
95
96
  return;
96
97
  }
97
98
 
@@ -154,7 +155,6 @@ export function label_webgl2() {
154
155
  uniform int isOutlinePass;
155
156
 
156
157
  precision highp float;
157
- precision highp int;
158
158
 
159
159
  const int MAX_SIZE = 11;
160
160
 
@@ -207,51 +207,33 @@ export function label_webgl2() {
207
207
  }
208
208
  return median(msdf.r, msdf.g, msdf.b);
209
209
  }
210
-
211
- vec4 getSDFParams() {
212
- if(v_fontIndex == 0) {
213
- return sdfParamsArr[0];
214
- } else if(v_fontIndex == 1){
215
- return sdfParamsArr[1];
216
- } else if(v_fontIndex == 2){
217
- return sdfParamsArr[2];
218
- } else if(v_fontIndex == 3){
219
- return sdfParamsArr[3];
220
- } else if(v_fontIndex == 4){
221
- return sdfParamsArr[4];
222
- } else if(v_fontIndex == 5){
223
- return sdfParamsArr[5];
224
- } else if(v_fontIndex == 6){
225
- return sdfParamsArr[6];
226
- } else if(v_fontIndex == 7){
227
- return sdfParamsArr[7];
228
- } else if(v_fontIndex == 8){
229
- return sdfParamsArr[8];
230
- } else if(v_fontIndex == 9){
231
- return sdfParamsArr[9];
232
- } else if(v_fontIndex == 10){
233
- return sdfParamsArr[10];
234
- }
235
- }
236
210
 
237
211
  void main () {
238
-
239
- vec4 sdfParams = getSDFParams();
212
+
213
+ if(v_fontIndex == -1) {
214
+ return;
215
+ }
216
+
217
+ vec4 sdfParams = sdfParamsArr[v_fontIndex];
240
218
  float sd = getDistance();
241
219
  vec2 dxdy = fwidth(v_uv) * sdfParams.xy;
242
- float dist = sd + min(0.001, 0.5 - 1.0 / sdfParams.w) - 0.5;
243
- float opacity = clamp(dist * sdfParams.w / length(dxdy) + 0.5, 0.0, 1.0);
244
220
 
245
221
  if(isOutlinePass == 0){
222
+ float dist = sd + min(0.001, 0.5 - 1.0 / sdfParams.w) - 0.5;
223
+ float opacity = clamp(dist * sdfParams.w / length(dxdy) + 0.5, 0.0, 1.0);
224
+ if(opacity <= 0.1){
225
+ discard;
226
+ }
246
227
  outScreen = vec4(v_rgba.rgb, opacity * v_rgba.a);
247
- } else {
248
- float strokeDist = sd + min(v_outline, 0.5 - 1.0 / sdfParams.w) - 0.5;
249
- float strokeAlpha = v_rgba.a * clamp(strokeDist * sdfParams.w / length(dxdy) + 0.5, 0.0, 1.0);
250
- if(strokeAlpha < 0.1){
228
+ } else {
229
+ float dist = sd + min(v_outline, 0.5 - 1.0 / sdfParams.w) - 0.5;
230
+ float opacity = clamp(dist * sdfParams.w / length(dxdy) + 0.5, 0.0, 1.0);
231
+ if(opacity <= 0.1){
251
232
  discard;
252
233
  }
253
- outScreen = v_rgba * strokeAlpha * (0.5 - opacity) * 2.0;
254
- }
234
+ outScreen = vec4(v_rgba.rgb, opacity * v_rgba.a);
235
+ //outScreen = v_rgba * strokeAlpha * (0.5 - opacity) * 2.0;
236
+ }
255
237
  }`
256
238
  });
257
239
  }
@@ -326,6 +308,7 @@ export function label_screen() {
326
308
 
327
309
  if(a_texCoord.w == EMPTY) {
328
310
  gl_Position = vec4(0.0);
311
+ v_fontIndex = -1.0;
329
312
  return;
330
313
  }
331
314
 
@@ -469,6 +452,10 @@ export function label_screen() {
469
452
 
470
453
  fontIndex = v_fontIndex + 0.1;
471
454
 
455
+ if(v_fontIndex < 0.0){
456
+ return;
457
+ }
458
+
472
459
  vec4 sdfParams = getSDFParams();
473
460
  float sd = getDistance();
474
461
  vec2 dxdy = fwidth(v_uv) * sdfParams.xy;
@@ -476,14 +463,14 @@ export function label_screen() {
476
463
  float opacity = clamp(dist * sdfParams.w / length(dxdy) + 0.5, 0.0, 1.0);
477
464
 
478
465
  if(isOutlinePass == 0){
479
- gl_FragColor = vec4(v_rgba.rgb, opacity * v_rgba.a);
466
+ //gl_FragColor = vec4(v_rgba.rgb, opacity * v_rgba.a);
480
467
  } else {
481
468
  float strokeDist = sd + min(v_outline, 0.5 - 1.0 / sdfParams.w) - 0.5;
482
469
  float strokeAlpha = v_rgba.a * clamp(strokeDist * sdfParams.w / length(dxdy) + 0.5, 0.0, 1.0);
483
470
  if(strokeAlpha < 0.1){
484
471
  discard;
485
472
  }
486
- gl_FragColor = v_rgba * strokeAlpha * (0.5 - opacity) * 2.0;
473
+ //gl_FragColor = v_rgba * strokeAlpha * (0.5 - opacity) * 2.0;
487
474
  }
488
475
  }`
489
476
  });
@@ -549,15 +536,16 @@ export function labelPicking() {
549
536
  void main() {
550
537
  vec3 a_positions = a_positionsHigh + a_positionsLow;
551
538
  vec3 cameraPos = eyePositionHigh + eyePositionLow;
552
-
539
+ v_rgba = a_rgba;
540
+
553
541
  if(a_texCoord.w == EMPTY) {
542
+ v_rgba.a = 0.0;
554
543
  gl_Position = vec4(0.0);
555
544
  return;
556
545
  }
557
546
 
558
547
  vec3 look = a_positions - cameraPos;
559
548
  float lookDist = length(look);
560
- v_rgba = a_rgba;
561
549
  if(opacity * step(lookDist, sqrt(dot(cameraPos,cameraPos) - planetRadius) + sqrt(dot(a_positions,a_positions) - planetRadius)) == 0.0){
562
550
  return;
563
551
  }
@@ -611,7 +599,7 @@ export function labelPicking() {
611
599
 
612
600
  vec4 color = v_rgba;
613
601
  if (color.a < 0.05) {
614
- discard;
602
+ return;
615
603
  }
616
604
 
617
605
  gl_FragColor = vec4(v_rgba.rgb, v_rgba.a);