@openglobus/og 0.13.12 → 0.14.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 (80) hide show
  1. package/README.md +1 -4
  2. package/css/og.css +1 -1
  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 +2 -2
  9. package/src/og/Globe.js +14 -4
  10. package/src/og/camera/Camera.js +7 -7
  11. package/src/og/camera/PlanetCamera.js +1 -1
  12. package/src/og/control/LayerSwitcher.js +48 -31
  13. package/src/og/control/MouseNavigation.js +2 -2
  14. package/src/og/control/ScaleControl.js +30 -10
  15. package/src/og/control/SimpleSkyBackground.js +184 -0
  16. package/src/og/control/Sun.js +3 -2
  17. package/src/og/ellipsoid/Ellipsoid.js +119 -92
  18. package/src/og/ellipsoid/wgs84.js +13 -13
  19. package/src/og/entity/Entity.js +3 -3
  20. package/src/og/entity/GeometryHandler.js +1341 -1337
  21. package/src/og/entity/Polyline.js +0 -16
  22. package/src/og/entity/Ray.js +0 -10
  23. package/src/og/entity/RayHandler.js +3 -44
  24. package/src/og/entity/Strip.js +1 -6
  25. package/src/og/index.js +106 -95
  26. package/src/og/layer/GeoVideo.js +1 -0
  27. package/src/og/layer/Layer.js +62 -3
  28. package/src/og/layer/XYZ.js +4 -3
  29. package/src/og/math/Line3.js +140 -139
  30. package/src/og/math/Plane.js +118 -117
  31. package/src/og/math/Ray.js +242 -239
  32. package/src/og/math/Vec3.js +56 -37
  33. package/src/og/math/Vec4.js +3 -4
  34. package/src/og/math.js +21 -21
  35. package/src/og/quadTree/EarthQuadTreeStrategy.js +29 -0
  36. package/src/og/quadTree/MarsQuadTreeStrategy.js +27 -0
  37. package/src/og/quadTree/Node.js +55 -218
  38. package/src/og/quadTree/QuadTreeStrategy.js +93 -0
  39. package/src/og/quadTree/Wgs84QuadTreeStrategy.js +26 -0
  40. package/src/og/renderer/Renderer.js +13 -12
  41. package/src/og/renderer/RendererEvents.js +1065 -1065
  42. package/src/og/scene/Planet.js +84 -273
  43. package/src/og/segment/Segment.js +18 -25
  44. package/src/og/segment/SegmentLonLat.js +34 -31
  45. package/src/og/segment/SegmentLonLatWgs84.js +41 -0
  46. package/src/og/shaders/ray.js +13 -6
  47. package/src/og/shaders/toneMapping.js +5 -5
  48. package/src/og/terrain/GlobusTerrain.js +3 -2
  49. package/src/og/terrain/MapboxTerrain.js +231 -52
  50. package/src/og/utils/quadTreeType.js +11 -0
  51. package/src/og/utils/shared.js +942 -942
  52. package/src/og/webgl/Handler.js +22 -9
  53. package/types/Globe.d.ts +7 -0
  54. package/types/camera/Camera.d.ts +3 -3
  55. package/types/camera/PlanetCamera.d.ts +1 -1
  56. package/types/control/LayerSwitcher.d.ts +1 -1
  57. package/types/control/ScaleControl.d.ts +2 -1
  58. package/types/control/SimpleSkyBackground.d.ts +11 -0
  59. package/types/control/Sun.d.ts +2 -1
  60. package/types/ellipsoid/Ellipsoid.d.ts +3 -2
  61. package/types/entity/Ray.d.ts +0 -3
  62. package/types/entity/RayHandler.d.ts +0 -4
  63. package/types/index.d.ts +6 -1
  64. package/types/layer/Layer.d.ts +8 -0
  65. package/types/math/Vec3.d.ts +19 -16
  66. package/types/math/Vec4.d.ts +2 -3
  67. package/types/math.d.ts +20 -20
  68. package/types/quadTree/EarthQuadTreeStrategy.d.ts +3 -0
  69. package/types/quadTree/MarsQuadTreeStrategy.d.ts +3 -0
  70. package/types/quadTree/Node.d.ts +0 -1
  71. package/types/quadTree/QuadTreeStrategy.d.ts +21 -0
  72. package/types/quadTree/Wgs84QuadTreeStrategy.d.ts +3 -0
  73. package/types/renderer/Renderer.d.ts +1 -1
  74. package/types/scene/Planet.d.ts +6 -24
  75. package/types/segment/Segment.d.ts +4 -4
  76. package/types/segment/SegmentLonLat.d.ts +6 -2
  77. package/types/segment/SegmentLonLatWgs84.d.ts +4 -0
  78. package/types/terrain/MapboxTerrain.d.ts +2 -1
  79. package/types/utils/quadTreeType.d.ts +8 -0
  80. package/types/webgl/Handler.d.ts +4 -1
@@ -14,6 +14,10 @@ import * as segmentHelper from "../segment/segmentHelper.js";
14
14
  import { getMatrixSubArray } from "../utils/shared.js";
15
15
  import { Slice } from "./Slice.js";
16
16
 
17
+ export const TILEGROUP_COMMON = 0;
18
+ export const TILEGROUP_NORTH = 1;
19
+ export const TILEGROUP_SOUTH = 2;
20
+
17
21
  var _tempHigh = new Vec3();
18
22
  var _tempLow = new Vec3();
19
23
 
@@ -57,7 +61,7 @@ class Segment {
57
61
  constructor(node, planet, tileZoom, extent) {
58
62
  this.isPole = false;
59
63
 
60
- this._tileGroup = 0;
64
+ this._tileGroup = TILEGROUP_COMMON;
61
65
 
62
66
  this._projection = EPSG3857;
63
67
 
@@ -246,6 +250,10 @@ class Segment {
246
250
  this.plainProcessing = false;
247
251
  }
248
252
 
253
+ checkZoom() {
254
+ return this.tileZoom < this.planet.terrain._maxNodeZoom;
255
+ }
256
+
249
257
  /**
250
258
  * Returns entity terrain point.
251
259
  * @public
@@ -890,19 +898,10 @@ class Segment {
890
898
  this.deleteElevations();
891
899
  }
892
900
 
893
- /**
894
- * Removes cache records.
895
- */
896
- _freeCache() {
897
- this.planet._quadTreeNodesCacheMerc[this.tileIndex] = null;
898
- delete this.planet._quadTreeNodesCacheMerc[this.tileIndex];
899
- }
900
-
901
901
  /**
902
902
  * Clear and destroy all segment data.
903
903
  */
904
904
  destroySegment() {
905
- this._freeCache();
906
905
 
907
906
  this.clearSegment();
908
907
 
@@ -1206,7 +1205,9 @@ class Segment {
1206
1205
  }
1207
1206
 
1208
1207
  _assignTileIndexes() {
1209
- this._tileGroup = 0;
1208
+
1209
+ this._tileGroup = TILEGROUP_COMMON;
1210
+
1210
1211
  var tileZoom = this.tileZoom;
1211
1212
  var extent = this._extent;
1212
1213
  var pole = mercator.POLE;
@@ -1224,25 +1225,17 @@ class Segment {
1224
1225
  this.tileYS = this.tileY + 1;
1225
1226
 
1226
1227
  this.tileIndex = Layer.getTileIndex(this.tileX, this.tileY, tileZoom);
1227
- this.planet._quadTreeNodesCacheMerc[this.tileIndex] = this.node;
1228
1228
  }
1229
1229
 
1230
1230
  initialize() {
1231
1231
  var p = this.planet;
1232
1232
  var n = this.node;
1233
1233
 
1234
- n.sideSize[0] =
1235
- n.sideSize[1] =
1236
- n.sideSize[2] =
1237
- n.sideSize[3] =
1238
- this.gridSize =
1239
- p.terrain.gridSizeByZoom[this.tileZoom] || p.terrain.plainGridSize;
1234
+ this.gridSize =
1235
+ p.terrain.gridSizeByZoom[this.tileZoom] || p.terrain.plainGridSize;
1240
1236
 
1241
- n.sideSizeLog2[0] =
1242
- n.sideSizeLog2[1] =
1243
- n.sideSizeLog2[2] =
1244
- n.sideSizeLog2[3] =
1245
- Math.log2(p.terrain.gridSizeByZoom[this.tileZoom] || p.terrain.plainGridSize);
1237
+ n.sideSizeLog2[0] = n.sideSizeLog2[1] = n.sideSizeLog2[2] = n.sideSizeLog2[3] =
1238
+ Math.log2(this.gridSize);
1246
1239
 
1247
1240
  if (this.tileZoom <= p.terrain.maxZoom) {
1248
1241
  var nmc = this.planet._normalMapCreator;
@@ -1628,8 +1621,8 @@ class Segment {
1628
1621
  }
1629
1622
 
1630
1623
  _getIndexBuffer() {
1631
- var s = this.node.sideSizeLog2;
1632
- var cache = this.planet._indexesCache[Math.log2(this.gridSize)][s[0]][s[1]][s[2]][s[3]];
1624
+ let s = this.node.sideSizeLog2;
1625
+ let cache = this.planet._indexesCache[Math.log2(this.gridSize)][s[0]][s[1]][s[2]][s[3]];
1633
1626
  if (!cache.buffer) {
1634
1627
  let indexes = segmentHelper.getInstance().createSegmentIndexes(Math.log2(this.gridSize), [s[0], s[1], s[2], s[3]]);
1635
1628
  cache.buffer = this.planet.renderer.handler.createElementArrayBuffer(indexes, 1);
@@ -7,11 +7,10 @@ import { Vec3 } from "../math/Vec3.js";
7
7
  import * as mercator from "../mercator.js";
8
8
  import { EPSG4326 } from "../proj/EPSG4326.js";
9
9
  import * as quadTree from "../quadTree/quadTree.js";
10
- import { Segment } from "./Segment.js";
10
+ import { Segment, TILEGROUP_NORTH, TILEGROUP_SOUTH } from "./Segment.js";
11
11
 
12
- const _heightLat = 90.0 - mercator.MAX_LAT;
13
- const _maxPoleZoom = 7;
14
- const _pieceSize = _heightLat / Math.pow(2, _maxPoleZoom);
12
+ const MAX_POLE_ZOOM = 7;
13
+ export const POLE_PIECE_SIZE = (90.0 - mercator.MAX_LAT) / Math.pow(2, MAX_POLE_ZOOM);
15
14
 
16
15
  let _tempHigh = new Vec3(),
17
16
  _tempLow = new Vec3();
@@ -35,16 +34,19 @@ class SegmentLonLat extends Segment {
35
34
  constructor(node, planet, tileZoom, extent) {
36
35
  super(node, planet, tileZoom, extent);
37
36
 
38
- // TODO:
39
- // be carefull with functions in constructor _assignTileIndexes
40
- // this._isNorth = false;
41
-
42
37
  this._projection = EPSG4326;
43
38
 
44
39
  this._extentMerc = new Extent(
45
40
  extent.southWest.forwardMercatorEPS01(),
46
41
  extent.northEast.forwardMercatorEPS01()
47
42
  );
43
+
44
+ if (this._extent.northEast.lat > 0) {
45
+ this._isNorth = true;
46
+ } else {
47
+ this._isNorth = false;
48
+ }
49
+
48
50
  this.isPole = true;
49
51
  }
50
52
 
@@ -64,56 +66,56 @@ class SegmentLonLat extends Segment {
64
66
  return xyz.length() - res.length();
65
67
  }
66
68
 
67
- acceptForRendering(camera) {
68
- var maxPoleZoom;
69
- var lat = this._extent.northEast.lat;
69
+ _getMaxZoom() {
70
+ let maxPoleZoom = 0;
70
71
  if (this._isNorth) {
71
72
  //north pole limits
72
- let Yz = Math.floor((90.0 - lat) / _pieceSize);
73
+ let Yz = Math.floor((90.0 - this._extent.northEast.lat) / POLE_PIECE_SIZE);
73
74
  maxPoleZoom = Math.floor(Yz / 16) + 7;
74
75
  } else {
75
76
  //south pole limits
76
- let Yz = Math.floor((mercator.MIN_LAT - lat) / _pieceSize);
77
+ let Yz = Math.floor((mercator.MIN_LAT - this._extent.northEast.lat) / POLE_PIECE_SIZE);
77
78
  maxPoleZoom = 12 - Math.floor(Yz / 16);
78
79
  }
79
- return (
80
- Segment.prototype.acceptForRendering.call(this, camera) || this.tileZoom >= maxPoleZoom
81
- );
80
+ return maxPoleZoom;
81
+ }
82
+
83
+ checkZoom() {
84
+ return super.checkZoom() && this.tileZoom <= this._getMaxZoom();
82
85
  }
83
86
 
84
87
  _assignTileIndexes() {
85
- var tileZoom = this.tileZoom;
86
- var extent = this._extent;
88
+ this._assignTileXIndexes(this._extent);
89
+ this._assignTileYIndexes(this._extent);
90
+ this.tileIndex = Layer.getTileIndex(this.tileX, this.tileY, this.tileZoom);
91
+ }
87
92
 
93
+ _assignTileXIndexes(extent) {
88
94
  this.tileX = Math.round(
89
95
  Math.abs(-180.0 - extent.southWest.lon) / (extent.northEast.lon - extent.southWest.lon)
90
96
  );
91
97
 
92
- var lat = extent.northEast.lat;
98
+ let p2 = 1 << this.tileZoom;
99
+ this.tileXE = (this.tileX + 1) % p2;
100
+ this.tileXW = (p2 + this.tileX - 1) % p2;
101
+ }
93
102
 
103
+ _assignTileYIndexes(extent) {
104
+ var lat = extent.northEast.lat;
94
105
  if (lat > 0) {
95
- //north pole
96
- this._isNorth = true;
97
- this._tileGroup = 1;
106
+ this._tileGroup = TILEGROUP_NORTH;
98
107
  this.tileY = Math.round((90.0 - lat) / (extent.northEast.lat - extent.southWest.lat));
99
108
  } else {
100
- //south pole
101
- this._tileGroup = 2;
109
+ this._tileGroup = TILEGROUP_SOUTH;
102
110
  this.tileY = Math.round(
103
111
  (mercator.MIN_LAT - lat) / (extent.northEast.lat - extent.southWest.lat)
104
112
  );
105
113
  }
106
-
107
- var p2 = 1 << tileZoom;
108
- this.tileXE = (this.tileX + 1) % p2;
109
- this.tileXW = (p2 + this.tileX - 1) % p2;
110
-
111
114
  this.tileYN = this.tileY - 1;
112
115
  this.tileYS = this.tileY + 1;
113
-
114
- this.tileIndex = Layer.getTileIndex(this.tileX, this.tileY, tileZoom);
115
116
  }
116
117
 
118
+
117
119
  _createPlainVertices() {
118
120
  var gridSize = this.planet.terrain.gridSizeByZoom[this.tileZoom];
119
121
 
@@ -292,4 +294,5 @@ class SegmentLonLat extends Segment {
292
294
  //empty for a time
293
295
  }
294
296
  }
297
+
295
298
  export { SegmentLonLat };
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+
3
+ import { POLE_PIECE_SIZE, SegmentLonLat } from "./SegmentLonLat.js";
4
+ import { Segment, TILEGROUP_COMMON } from "./Segment.js";
5
+ import * as mercator from "../mercator.js";
6
+
7
+ export class SegmentLonLatWgs84 extends SegmentLonLat {
8
+ constructor(node, planet, tileZoom, extent) {
9
+ super(node, planet, tileZoom, extent);
10
+ this.isPole = false;
11
+ this._tileGroup = TILEGROUP_COMMON;
12
+ }
13
+
14
+ _getMaxZoom() {
15
+ return 150;
16
+ // let lat = 0;
17
+ // if (this._isNorth) {
18
+ // lat = this._extent.northEast.lat;
19
+ // } else {
20
+ // lat = Math.abs(this._extent.southWest.lat);
21
+ // }
22
+ // let Yz = Math.floor((90 - lat) / POLE_PIECE_SIZE);
23
+ // return Math.floor(Yz / 16) + 7;
24
+ }
25
+
26
+ _assignTileYIndexes(extent) {
27
+ this.tileY = Math.round((90.0 - extent.northEast.lat) / (extent.northEast.lat - extent.southWest.lat));
28
+ this.tileYN = this.tileY - 1;
29
+ this.tileYS = this.tileY + 1;
30
+ }
31
+
32
+ _assignTileXIndexes(extent) {
33
+ this.tileX = Math.round(
34
+ Math.abs(-180.0 - extent.southWest.lon) / (extent.northEast.lon - extent.southWest.lon)
35
+ );
36
+
37
+ let p2 = (1 << this.tileZoom) * 2;
38
+ this.tileXE = (this.tileX + 1) % p2;
39
+ this.tileXW = (p2 + this.tileX - 1) % p2;
40
+ }
41
+ }
@@ -22,7 +22,6 @@ export function rayScreen() {
22
22
  a_startPosLow: "vec3",
23
23
  a_endPosHigh: "vec3",
24
24
  a_endPosLow: "vec3",
25
- a_length: "float",
26
25
  a_thickness: "float",
27
26
  a_rgba: "vec4"
28
27
  },
@@ -34,7 +33,6 @@ export function rayScreen() {
34
33
  attribute vec3 a_endPosHigh;
35
34
  attribute vec3 a_endPosLow;
36
35
  attribute float a_thickness;
37
- attribute float a_length;
38
36
  attribute vec4 a_rgba;
39
37
 
40
38
  varying vec4 v_rgba;
@@ -53,8 +51,9 @@ export function rayScreen() {
53
51
  vec3 camPos = eyePositionHigh + eyePositionLow;
54
52
 
55
53
  vec3 startPos = a_startPosHigh + a_startPosLow;
54
+ float length = length((a_endPosHigh + a_endPosLow) - startPos);
56
55
  vec3 direction = normalize((a_endPosHigh + a_endPosLow) - startPos);
57
- vec3 vertPos = startPos + a_vertices.y * direction * a_length;
56
+ vec3 vertPos = startPos + a_vertices.y * direction * length;
58
57
 
59
58
  vec3 look = vertPos - camPos;
60
59
  vec3 up = normalize(direction);
@@ -62,10 +61,18 @@ export function rayScreen() {
62
61
 
63
62
  float dist = dot(camPos - vertPos, vec3(viewMatrix[0][2], viewMatrix[1][2], viewMatrix[2][2]));
64
63
  float focalSize = 2.0 * dist * resolution;
65
- vec3 rr = right * a_thickness * focalSize * a_vertices.x + up * a_length * a_vertices.y;
64
+ vec3 rr = right * a_thickness * focalSize * a_vertices.x;
66
65
 
67
- vec3 highDiff = a_startPosHigh - eyePositionHigh;
68
- vec3 lowDiff = a_startPosLow + rr - eyePositionLow;
66
+ vec3 highDiff = -eyePositionHigh;
67
+ vec3 lowDiff = rr - eyePositionLow;
68
+
69
+ if(a_vertices.y == 0.0){
70
+ highDiff += a_startPosHigh;
71
+ lowDiff += a_startPosLow;
72
+ }else{
73
+ highDiff += a_endPosHigh;
74
+ lowDiff += a_endPosLow;
75
+ }
69
76
 
70
77
  mat4 viewMatrixRTE = viewMatrix;
71
78
  viewMatrixRTE[3] = vec4(0.0, 0.0, 0.0, 1.0);
@@ -75,16 +75,16 @@ export function toneMapping() {
75
75
  layout(location = 0) out vec4 fragColor;
76
76
 
77
77
  void main(void) {
78
- vec3 hdrColor = texture(hdrBuffer, tc).rgb;
78
+ vec4 hdrColor = texture(hdrBuffer, tc).rgba;
79
79
 
80
80
  float oneByGamma = gamma / gamma;
81
81
  float oneByWhitePoint = whitepoint / whitepoint;
82
- vec3 mapped = ReinhardToneMapping2(hdrColor) * oneByGamma * oneByWhitePoint;
83
- //vec3 mapped = ACESFilmicToneMapping(hdrColor) * oneByGamma * oneByWhitePoint;
82
+ vec3 mapped = ReinhardToneMapping2(hdrColor.rgb) * oneByGamma * oneByWhitePoint;
83
+ //vec3 mapped = ACESFilmicToneMapping(hdrColor.rgb) * oneByGamma * oneByWhitePoint;
84
84
 
85
85
  mapped = pow(mapped, vec3(1.0 / gamma));
86
-
87
- fragColor = vec4(mapped, 1.0);
86
+
87
+ fragColor = vec4(mapped, hdrColor.a);
88
88
  }`
89
89
  });
90
90
  }
@@ -369,7 +369,8 @@ class GlobusTerrain extends EmptyTerrain {
369
369
  let heights = this._createHeights(response.data,
370
370
  segment.tileIndex,
371
371
  segment.tileX, segment.tileY, segment.tileZoom,
372
- segment.getExtent()
372
+ segment.getExtent(),
373
+ segment.tileZoom === this.maxZoom
373
374
  );
374
375
 
375
376
  this._elevationCache[segment.tileIndex] = {
@@ -399,7 +400,7 @@ class GlobusTerrain extends EmptyTerrain {
399
400
 
400
401
  _getSubdomain() {
401
402
  this._requestCount++;
402
- return this._s[Math.floor(this._requestCount % (this._requestsPeerSubdomian * this._s.length) / this._requestsPeerSubdomian)];
403
+ return this._s[Math.floor(this._requestCount % (this._requestsPeerSubdomian * this._s.length) / this._requestsPeerSubdomian)];
403
404
  }
404
405
 
405
406
  _buildURL(x, y, z) {