@openglobus/og 0.20.4 → 0.22.0

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 (133) hide show
  1. package/lib/@openglobus/js/Globe.d.ts +5 -1
  2. package/lib/@openglobus/js/Object3d.d.ts +8 -2
  3. package/lib/@openglobus/js/camera/Camera.d.ts +2 -0
  4. package/lib/@openglobus/js/control/geoObjectEditor/GeoObjectEditorScene.d.ts +58 -0
  5. package/lib/@openglobus/js/ellipsoid/Ellipsoid.d.ts +1 -1
  6. package/lib/@openglobus/js/ellipsoid/index.d.ts +4 -3
  7. package/lib/@openglobus/js/ellipsoid/mars.d.ts +6 -0
  8. package/lib/@openglobus/js/ellipsoid/moon.d.ts +6 -0
  9. package/lib/@openglobus/js/entity/Entity.d.ts +4 -2
  10. package/lib/@openglobus/js/entity/EntityCollection.d.ts +3 -2
  11. package/lib/@openglobus/js/entity/GeoObject.d.ts +6 -1
  12. package/lib/@openglobus/js/entity/GeoObjectHandler.d.ts +4 -0
  13. package/lib/@openglobus/js/entity/GeometryHandler.d.ts +3 -2
  14. package/lib/@openglobus/js/entity/Label.d.ts +14 -0
  15. package/lib/@openglobus/js/entity/LabelHandler.d.ts +1 -1
  16. package/lib/@openglobus/js/index.d.ts +3 -3
  17. package/lib/@openglobus/js/layer/Vector.d.ts +12 -29
  18. package/lib/@openglobus/js/proj/equi.d.ts +9 -0
  19. package/lib/@openglobus/js/quadTree/{EPSG4326QuadTreeStrategy.d.ts → EPSG4326/EPSG4326QuadTreeStrategy.d.ts} +2 -2
  20. package/lib/@openglobus/js/quadTree/EntityCollectionNode.d.ts +5 -13
  21. package/lib/@openglobus/js/quadTree/EntityCollectionsTreeStrategy.d.ts +25 -0
  22. package/lib/@openglobus/js/quadTree/QuadTreeStrategy.d.ts +11 -0
  23. package/lib/@openglobus/js/quadTree/earth/EarthEntityCollectionNodeLonLat.d.ts +18 -0
  24. package/lib/@openglobus/js/quadTree/earth/EarthEntityCollectionsTreeStrategy.d.ts +19 -0
  25. package/lib/@openglobus/js/quadTree/earth/EarthQuadTreeStrategy.d.ts +29 -0
  26. package/lib/@openglobus/js/quadTree/equi/EquiEntityCollectionNodeLonLat.d.ts +17 -0
  27. package/lib/@openglobus/js/quadTree/equi/EquiEntityCollectionsTreeStrategy.d.ts +17 -0
  28. package/lib/@openglobus/js/quadTree/equi/EquiQuadTreeStrategy.d.ts +19 -0
  29. package/lib/@openglobus/js/quadTree/index.d.ts +6 -6
  30. package/lib/{js/quadTree → @openglobus/js/quadTree/wgs84}/Wgs84QuadTreeStrategy.d.ts +2 -2
  31. package/lib/@openglobus/js/renderer/Renderer.d.ts +2 -0
  32. package/lib/@openglobus/js/scene/Planet.d.ts +0 -27
  33. package/lib/@openglobus/js/segment/Segment.d.ts +0 -1
  34. package/lib/@openglobus/js/segment/SegmentLonLat.d.ts +0 -4
  35. package/lib/@openglobus/js/segment/{SegmentLonLatWgs84.d.ts → SegmentLonLatEqui.d.ts} +1 -1
  36. package/lib/@openglobus/js/terrain/RgbTerrain.d.ts +20 -0
  37. package/lib/@openglobus/og.esm.js +1 -1
  38. package/lib/@openglobus/og.esm.js.map +1 -1
  39. package/lib/@openglobus/og.umd.js +1 -1
  40. package/lib/@openglobus/og.umd.js.map +1 -1
  41. package/lib/@openglobus/res/fonts/Ephesis-Regular.json +4648 -0
  42. package/lib/@openglobus/res/fonts/Ephesis-Regular.ttf.cfg +1282 -0
  43. package/lib/@openglobus/res/fonts/Ephesis-Regular.ttf.png +0 -0
  44. package/lib/js/Globe.d.ts +5 -1
  45. package/lib/js/Globe.js +13 -4
  46. package/lib/js/Object3d.d.ts +8 -2
  47. package/lib/js/Object3d.js +64 -6
  48. package/lib/js/camera/Camera.d.ts +2 -0
  49. package/lib/js/camera/Camera.js +8 -0
  50. package/lib/js/control/elevationProfile/ElevationProfileScene.js +2 -0
  51. package/lib/js/control/geoObjectEditor/GeoObjectEditorScene.d.ts +58 -0
  52. package/lib/js/control/geoObjectEditor/GeoObjectEditorScene.js +105 -0
  53. package/lib/js/ellipsoid/Ellipsoid.d.ts +1 -1
  54. package/lib/js/ellipsoid/Ellipsoid.js +1 -1
  55. package/lib/js/ellipsoid/index.d.ts +4 -3
  56. package/lib/js/ellipsoid/index.js +4 -3
  57. package/lib/js/ellipsoid/mars.d.ts +6 -0
  58. package/lib/js/ellipsoid/mars.js +6 -0
  59. package/lib/js/ellipsoid/moon.d.ts +6 -0
  60. package/lib/js/ellipsoid/moon.js +6 -0
  61. package/lib/js/entity/Entity.d.ts +4 -2
  62. package/lib/js/entity/Entity.js +4 -1
  63. package/lib/js/entity/EntityCollection.d.ts +3 -2
  64. package/lib/js/entity/EntityCollection.js +26 -2
  65. package/lib/js/entity/GeoObject.d.ts +6 -1
  66. package/lib/js/entity/GeoObject.js +9 -0
  67. package/lib/js/entity/GeoObjectHandler.d.ts +4 -0
  68. package/lib/js/entity/GeoObjectHandler.js +32 -1
  69. package/lib/js/entity/GeometryHandler.d.ts +3 -2
  70. package/lib/js/entity/GeometryHandler.js +58 -0
  71. package/lib/js/entity/Label.d.ts +14 -0
  72. package/lib/js/entity/Label.js +24 -4
  73. package/lib/js/entity/LabelHandler.d.ts +1 -1
  74. package/lib/js/entity/LabelHandler.js +4 -4
  75. package/lib/js/entity/Polyline.js +1 -1
  76. package/lib/js/index.d.ts +3 -3
  77. package/lib/js/index.js +3 -3
  78. package/lib/js/layer/Bing.js +1 -0
  79. package/lib/js/layer/Layer.js +7 -4
  80. package/lib/js/layer/Vector.d.ts +12 -29
  81. package/lib/js/layer/Vector.js +38 -161
  82. package/lib/js/layer/XYZ.js +1 -1
  83. package/lib/js/proj/equi.d.ts +9 -0
  84. package/lib/js/proj/equi.js +9 -0
  85. package/lib/js/quadTree/{EPSG4326QuadTreeStrategy.d.ts → EPSG4326/EPSG4326QuadTreeStrategy.d.ts} +2 -2
  86. package/lib/js/quadTree/EPSG4326/EPSG4326QuadTreeStrategy.js +16 -0
  87. package/lib/js/quadTree/EntityCollectionNode.d.ts +5 -13
  88. package/lib/js/quadTree/EntityCollectionNode.js +18 -83
  89. package/lib/js/quadTree/EntityCollectionsTreeStrategy.d.ts +25 -0
  90. package/lib/js/quadTree/EntityCollectionsTreeStrategy.js +49 -0
  91. package/lib/js/quadTree/Node.js +6 -12
  92. package/lib/js/quadTree/QuadTreeStrategy.d.ts +11 -0
  93. package/lib/js/quadTree/QuadTreeStrategy.js +12 -0
  94. package/lib/js/quadTree/earth/EarthEntityCollectionNodeLonLat.d.ts +18 -0
  95. package/lib/js/quadTree/earth/EarthEntityCollectionNodeLonLat.js +74 -0
  96. package/lib/js/quadTree/earth/EarthEntityCollectionsTreeStrategy.d.ts +19 -0
  97. package/lib/js/quadTree/earth/EarthEntityCollectionsTreeStrategy.js +103 -0
  98. package/lib/js/quadTree/earth/EarthQuadTreeStrategy.d.ts +29 -0
  99. package/lib/js/quadTree/{EarthQuadTreeStrategy.js → earth/EarthQuadTreeStrategy.js} +29 -6
  100. package/lib/js/quadTree/equi/EquiEntityCollectionNodeLonLat.d.ts +17 -0
  101. package/lib/js/quadTree/equi/EquiEntityCollectionNodeLonLat.js +70 -0
  102. package/lib/js/quadTree/equi/EquiEntityCollectionsTreeStrategy.d.ts +17 -0
  103. package/lib/js/quadTree/equi/EquiEntityCollectionsTreeStrategy.js +75 -0
  104. package/lib/js/quadTree/equi/EquiQuadTreeStrategy.d.ts +19 -0
  105. package/lib/js/quadTree/equi/EquiQuadTreeStrategy.js +62 -0
  106. package/lib/js/quadTree/index.d.ts +6 -6
  107. package/lib/js/quadTree/index.js +6 -6
  108. package/lib/{@openglobus/js/quadTree → js/quadTree/wgs84}/Wgs84QuadTreeStrategy.d.ts +2 -2
  109. package/lib/js/quadTree/wgs84/Wgs84QuadTreeStrategy.js +15 -0
  110. package/lib/js/renderer/Renderer.d.ts +2 -0
  111. package/lib/js/renderer/Renderer.js +2 -2
  112. package/lib/js/scene/Planet.d.ts +0 -27
  113. package/lib/js/scene/Planet.js +2 -9
  114. package/lib/js/segment/Segment.d.ts +0 -1
  115. package/lib/js/segment/Segment.js +0 -3
  116. package/lib/js/segment/SegmentLonLat.d.ts +0 -4
  117. package/lib/js/segment/SegmentLonLat.js +0 -11
  118. package/lib/js/segment/{SegmentLonLatWgs84.d.ts → SegmentLonLatEqui.d.ts} +1 -1
  119. package/lib/js/segment/{SegmentLonLatWgs84.js → SegmentLonLatEqui.js} +3 -1
  120. package/lib/js/shaders/geoObject.js +10 -5
  121. package/lib/js/shaders/polyline.js +8 -6
  122. package/lib/js/terrain/RgbTerrain.d.ts +20 -0
  123. package/lib/js/terrain/RgbTerrain.js +227 -214
  124. package/lib/js/utils/PlainSegmentWorker.js +3 -1
  125. package/lib/js/webgl/Handler.js +1 -1
  126. package/package.json +15 -15
  127. package/lib/@openglobus/js/quadTree/EarthQuadTreeStrategy.d.ts +0 -9
  128. package/lib/@openglobus/js/quadTree/MarsQuadTreeStrategy.d.ts +0 -11
  129. package/lib/js/quadTree/EPSG4326QuadTreeStrategy.js +0 -16
  130. package/lib/js/quadTree/EarthQuadTreeStrategy.d.ts +0 -9
  131. package/lib/js/quadTree/MarsQuadTreeStrategy.d.ts +0 -11
  132. package/lib/js/quadTree/MarsQuadTreeStrategy.js +0 -43
  133. package/lib/js/quadTree/Wgs84QuadTreeStrategy.js +0 -15
@@ -3,19 +3,23 @@ import { GlobusTerrain } from "./GlobusTerrain";
3
3
  import { isPowerOfTwo } from "../math";
4
4
  import { Layer } from "../layer/Layer";
5
5
  import { binarySearchFast } from "../utils/shared";
6
- const rgb2Height = (r, g, b) => {
7
- // Filter for "yellowish" pixels
8
- if (r === 255) {
9
- return -10000;
10
- }
11
- return -10000 + 0.1 * (r * 256 * 256 + g * 256 + b);
12
- };
6
+ /**
7
+ * @class
8
+ * @extends {GlobusTerrain}
9
+ * @param {string} [name=""] - Terrain provider name.
10
+ * @param {IRgbTerrainParams} [options]:
11
+ * @param {boolean} [equalizeNormals=true] - Make normal equalization on the edges of the tiles.
12
+ * @param {string} [key=""] - API key.
13
+ * @param {number} [imageSize=256] - Image size.
14
+ * @param {number} [minHeight=-10000] - Minimal height for rgb to height converter.
15
+ * @param {number} [resolution=0.1] - Height converter resolution.
16
+ */
13
17
  class RgbTerrain extends GlobusTerrain {
14
18
  constructor(name, options = {}) {
15
19
  super(name || "RgbTerrain", {
16
20
  equalizeVertices: options.equalizeVertices != undefined ? options.equalizeVertices : true,
17
21
  maxZoom: options.maxZoom || 17,
18
- noDataValues: options.noDataValues || [-65537, -10000],
22
+ noDataValues: options.noDataValues || [options.minHeight != undefined ? options.minHeight : -10000],
19
23
  plainGridSize: options.plainGridSize || 128,
20
24
  url: options.url != undefined
21
25
  ? options.url
@@ -30,6 +34,8 @@ class RgbTerrain extends GlobusTerrain {
30
34
  this._imageSize = options.imageSize || 256;
31
35
  this._ctx = this._createTemporalCanvas(this._imageSize);
32
36
  this._imageDataCache = {};
37
+ this._minHeight = options.minHeight || -10000.0;
38
+ this._resolution = options.resolution || 0.1;
33
39
  }
34
40
  static checkNoDataValue(noDataValues, value) {
35
41
  if (value > 50000) {
@@ -37,6 +43,13 @@ class RgbTerrain extends GlobusTerrain {
37
43
  }
38
44
  return binarySearchFast(noDataValues, value) !== -1;
39
45
  }
46
+ rgb2Height(r, g, b) {
47
+ // Filter for "yellowish" pixels
48
+ if (r === 255) {
49
+ return this._minHeight;
50
+ }
51
+ return this._minHeight + this._resolution * (r * 256 * 256 + g * 256 + b);
52
+ }
40
53
  isBlur(segment) {
41
54
  return segment.tileZoom >= 16;
42
55
  }
@@ -78,7 +91,7 @@ class RgbTerrain extends GlobusTerrain {
78
91
  //
79
92
  if (!isPowerOfTwo(this._imageSize) && SIZE === this._imageSize) {
80
93
  let outCurrenElevations = new Float32Array(SIZE * SIZE);
81
- extractElevationTilesRgbNonPowerOfTwo(rgbaData, outCurrenElevations, this._heightFactor);
94
+ this.extractElevationTilesRgbNonPowerOfTwo(rgbaData, outCurrenElevations, this._heightFactor);
82
95
  return outCurrenElevations;
83
96
  }
84
97
  //
@@ -88,7 +101,7 @@ class RgbTerrain extends GlobusTerrain {
88
101
  let elevationsSize = (this.plainGridSize + 1) * (this.plainGridSize + 1);
89
102
  let outCurrenElevations = new Float32Array(elevationsSize);
90
103
  let [availableParentOffsetX, availableParentOffsetY, availableZoomDiff] = segment ? getTileOffset(segment.tileX, segment.tileY, segment.tileZoom, availableParentTileX, availableParentTileY, availableParentTileZoom) : [0, 0, 0];
91
- extractElevationSimple(rgbaData, this.noDataValues, availableParentData, availableParentOffsetX, availableParentOffsetY, availableZoomDiff, skipPositiveHeights, outCurrenElevations, this._heightFactor, this._imageSize);
104
+ this.extractElevationSimple(rgbaData, this.noDataValues, availableParentData, availableParentOffsetX, availableParentOffsetY, availableZoomDiff, skipPositiveHeights, outCurrenElevations, this._heightFactor, this._imageSize);
92
105
  return outCurrenElevations;
93
106
  }
94
107
  //
@@ -105,7 +118,7 @@ class RgbTerrain extends GlobusTerrain {
105
118
  }
106
119
  }
107
120
  if (!preventChildren) {
108
- extractElevationTilesRgb(rgbaData, this._heightFactor, this.noDataValues, availableParentData, availableParentTileX, availableParentTileY, availableParentTileZoom, segment ? segment.tileX : 0, segment ? segment.tileY : 0, segment ? segment.tileZoom : 0, skipPositiveHeights, outCurrenElevations, outChildrenElevations);
121
+ this.extractElevationTilesRgb(rgbaData, this._heightFactor, this.noDataValues, availableParentData, availableParentTileX, availableParentTileY, availableParentTileZoom, segment ? segment.tileX : 0, segment ? segment.tileY : 0, segment ? segment.tileZoom : 0, skipPositiveHeights, outCurrenElevations, outChildrenElevations);
109
122
  // Save children data to cache
110
123
  for (let i = 0; i < d; i++) {
111
124
  for (let j = 0; j < d; j++) {
@@ -122,7 +135,7 @@ class RgbTerrain extends GlobusTerrain {
122
135
  }
123
136
  }
124
137
  else {
125
- extractElevationTilesRgbNoChildren(rgbaData, this._heightFactor, this.noDataValues, availableParentData, availableParentTileX, availableParentTileY, availableParentTileZoom, segment ? segment.tileX : 0, segment ? segment.tileY : 0, segment ? segment.tileZoom : 0, skipPositiveHeights, outCurrenElevations);
138
+ this.extractElevationTilesRgbNoChildren(rgbaData, this._heightFactor, this.noDataValues, availableParentData, availableParentTileX, availableParentTileY, availableParentTileZoom, segment ? segment.tileX : 0, segment ? segment.tileY : 0, segment ? segment.tileZoom : 0, skipPositiveHeights, outCurrenElevations);
126
139
  }
127
140
  let tileIndex = Layer.getTileIndex(tileX, tileY, tileZoom, tileGroup);
128
141
  // Save current data to cache
@@ -145,13 +158,13 @@ class RgbTerrain extends GlobusTerrain {
145
158
  const tileIndex = Layer.getTileIndex(x, y, z, tileGroup);
146
159
  if (this._imageDataCache[tileIndex]) {
147
160
  let data = this._imageDataCache[tileIndex];
148
- let height = this._heightFactor * rgb2Height(data[index], data[index + 1], data[index + 2]);
161
+ let height = this._heightFactor * this.rgb2Height(data[index], data[index + 1], data[index + 2]);
149
162
  let isNoData = RgbTerrain.checkNoDataValue(this.noDataValues, height);
150
163
  if (isNoData) {
151
164
  return this.getHeightAsync(lonLat, callback, zoom - 1);
152
165
  }
153
166
  else {
154
- callback(this._heightFactor * rgb2Height(data[index], data[index + 1], data[index + 2]));
167
+ callback(this._heightFactor * this.rgb2Height(data[index], data[index + 1], data[index + 2]));
155
168
  return true;
156
169
  }
157
170
  }
@@ -169,13 +182,13 @@ class RgbTerrain extends GlobusTerrain {
169
182
  this._ctx.drawImage(response.data, 0, 0);
170
183
  let data = this._ctx.getImageData(0, 0, 256, 256).data;
171
184
  this._imageDataCache[tileIndex] = data;
172
- let height = this._heightFactor * rgb2Height(data[index], data[index + 1], data[index + 2]);
185
+ let height = this._heightFactor * this.rgb2Height(data[index], data[index + 1], data[index + 2]);
173
186
  let isNoData = RgbTerrain.checkNoDataValue(this.noDataValues, height);
174
187
  if (isNoData) {
175
188
  return this.getHeightAsync(lonLat, callback, zoom - 1);
176
189
  }
177
190
  else {
178
- callback(this._heightFactor * rgb2Height(data[index], data[index + 1], data[index + 2]));
191
+ callback(this._heightFactor * this.rgb2Height(data[index], data[index + 1], data[index + 2]));
179
192
  }
180
193
  }
181
194
  else if (response.status === "error") {
@@ -189,227 +202,227 @@ class RgbTerrain extends GlobusTerrain {
189
202
  });
190
203
  return false;
191
204
  }
192
- }
193
- function getTileOffset(currentTileX, currentTileY, currentTileZoom, parentTileX, parentTileY, parentTileZoom) {
194
- let dz2 = 2 << (currentTileZoom - parentTileZoom - 1);
195
- return [currentTileX - dz2 * parentTileX, currentTileY - dz2 * parentTileY, 1.0 / dz2];
196
- }
197
- function getChildTileIndex(currentParentTileX, currentParentTileY, currentParentTileZoom, childOffsetX, childOffsetY) {
198
- return [currentParentTileX * 2 + childOffsetX, currentParentTileY * 2 + childOffsetY, currentParentTileZoom + 1];
199
- }
200
- function getParentHeight(oneByDz2, offsetX, offsetY, heights, i, j, skipPositiveHeights) {
201
- let parentGridSize = Math.sqrt(heights.length);
202
- let pi = Math.floor(offsetY * oneByDz2 * parentGridSize + i * oneByDz2), pj = Math.floor(offsetX * oneByDz2 * parentGridSize + j * oneByDz2);
203
- let h = heights[pi * parentGridSize + pj];
204
- return skipPositiveHeights ? (h > 0 ? 0 : h) : h;
205
- }
206
- function extractElevationSimple(rgbaData, noDataValues, availableParentData = null, availableParentOffsetX, availableParentOffsetY, availableZoomDiff, skipPositiveHeights, outCurrenElevations, heightFactor = 1, imageSize) {
207
- for (let k = 0, len = imageSize * imageSize; k < len; k++) {
208
- let j = k % imageSize, i = Math.floor(k / imageSize);
209
- let fromInd4 = k * 4;
210
- let height = heightFactor * rgb2Height(rgbaData[fromInd4], rgbaData[fromInd4 + 1], rgbaData[fromInd4 + 2]);
211
- let isNoData = RgbTerrain.checkNoDataValue(noDataValues, height);
212
- if ((isNoData || height === 0) && availableParentData) {
213
- height = getParentHeight(availableZoomDiff, availableParentOffsetX, availableParentOffsetY, availableParentData, i, j, skipPositiveHeights);
205
+ extractElevationSimple(rgbaData, noDataValues, availableParentData = null, availableParentOffsetX, availableParentOffsetY, availableZoomDiff, skipPositiveHeights, outCurrenElevations, heightFactor = 1, imageSize) {
206
+ for (let k = 0, len = imageSize * imageSize; k < len; k++) {
207
+ let j = k % imageSize, i = Math.floor(k / imageSize);
208
+ let fromInd4 = k * 4;
209
+ let height = heightFactor * this.rgb2Height(rgbaData[fromInd4], rgbaData[fromInd4 + 1], rgbaData[fromInd4 + 2]);
210
+ let isNoData = RgbTerrain.checkNoDataValue(noDataValues, height);
211
+ if ((isNoData || height === 0) && availableParentData) {
212
+ height = getParentHeight(availableZoomDiff, availableParentOffsetX, availableParentOffsetY, availableParentData, i, j, skipPositiveHeights);
213
+ }
214
+ outCurrenElevations[i * (imageSize + 1) + j] = height;
214
215
  }
215
- outCurrenElevations[i * (imageSize + 1) + j] = height;
216
- }
217
- for (let i = 0, len = imageSize; i < len; i++) {
218
- let j = imageSize - 1;
219
- let fromInd4 = (i * imageSize + j) * 4;
220
- let height = heightFactor * rgb2Height(rgbaData[fromInd4], rgbaData[fromInd4 + 1], rgbaData[fromInd4 + 2]);
221
- let isNoData = RgbTerrain.checkNoDataValue(noDataValues, height);
222
- if ((isNoData || height === 0) && availableParentData) {
223
- height = getParentHeight(availableZoomDiff, availableParentOffsetX, availableParentOffsetY, availableParentData, i, j, skipPositiveHeights);
216
+ for (let i = 0, len = imageSize; i < len; i++) {
217
+ let j = imageSize - 1;
218
+ let fromInd4 = (i * imageSize + j) * 4;
219
+ let height = heightFactor * this.rgb2Height(rgbaData[fromInd4], rgbaData[fromInd4 + 1], rgbaData[fromInd4 + 2]);
220
+ let isNoData = RgbTerrain.checkNoDataValue(noDataValues, height);
221
+ if ((isNoData || height === 0) && availableParentData) {
222
+ height = getParentHeight(availableZoomDiff, availableParentOffsetX, availableParentOffsetY, availableParentData, i, j, skipPositiveHeights);
223
+ }
224
+ outCurrenElevations[i * (imageSize + 1) + imageSize] = height;
224
225
  }
225
- outCurrenElevations[i * (imageSize + 1) + imageSize] = height;
226
- }
227
- for (let j = 0, len = imageSize; j < len; j++) {
228
- let i = imageSize - 1;
229
- let fromInd4 = (i * imageSize + j) * 4;
230
- let height = heightFactor * rgb2Height(rgbaData[fromInd4], rgbaData[fromInd4 + 1], rgbaData[fromInd4 + 2]);
226
+ for (let j = 0, len = imageSize; j < len; j++) {
227
+ let i = imageSize - 1;
228
+ let fromInd4 = (i * imageSize + j) * 4;
229
+ let height = heightFactor * this.rgb2Height(rgbaData[fromInd4], rgbaData[fromInd4 + 1], rgbaData[fromInd4 + 2]);
230
+ let isNoData = RgbTerrain.checkNoDataValue(noDataValues, height);
231
+ if ((isNoData || height === 0) && availableParentData) {
232
+ height = getParentHeight(availableZoomDiff, availableParentOffsetX, availableParentOffsetY, availableParentData, i, j, skipPositiveHeights);
233
+ }
234
+ outCurrenElevations[imageSize * (imageSize + 1) + j] = height;
235
+ }
236
+ let height = heightFactor * this.rgb2Height(rgbaData[rgbaData.length - 4], rgbaData[rgbaData.length - 3], rgbaData[rgbaData.length - 2]);
231
237
  let isNoData = RgbTerrain.checkNoDataValue(noDataValues, height);
232
238
  if ((isNoData || height === 0) && availableParentData) {
233
- height = getParentHeight(availableZoomDiff, availableParentOffsetX, availableParentOffsetY, availableParentData, i, j, skipPositiveHeights);
239
+ height = getParentHeight(availableZoomDiff, availableParentOffsetX, availableParentOffsetY, availableParentData, imageSize - 1, imageSize - 1, skipPositiveHeights);
234
240
  }
235
- outCurrenElevations[imageSize * (imageSize + 1) + j] = height;
236
- }
237
- let height = heightFactor * rgb2Height(rgbaData[rgbaData.length - 4], rgbaData[rgbaData.length - 3], rgbaData[rgbaData.length - 2]);
238
- let isNoData = RgbTerrain.checkNoDataValue(noDataValues, height);
239
- if ((isNoData || height === 0) && availableParentData) {
240
- height = getParentHeight(availableZoomDiff, availableParentOffsetX, availableParentOffsetY, availableParentData, imageSize - 1, imageSize - 1, skipPositiveHeights);
241
- }
242
- outCurrenElevations[outCurrenElevations.length - 1] = height;
243
- }
244
- function extractElevationTilesRgbNonPowerOfTwo(rgbaData, outCurrenElevations, heightFactor = 1) {
245
- for (let i = 0, len = outCurrenElevations.length; i < len; i++) {
246
- let i4 = i * 4;
247
- outCurrenElevations[i] = heightFactor * rgb2Height(rgbaData[i4], rgbaData[i4 + 1], rgbaData[i4 + 2]);
241
+ outCurrenElevations[outCurrenElevations.length - 1] = height;
248
242
  }
249
- }
250
- function extractElevationTilesRgb(rgbaData, heightFactor, noDataValues, availableParentData = null, availableParentTileX, availableParentTileY, availableParentTileZoom, currentTileX, currentTileY, currentTileZoom, skipPositiveHeights, outCurrenElevations, outChildrenElevations) {
251
- let destSize = Math.sqrt(outCurrenElevations.length) - 1;
252
- let destSizeOne = destSize + 1;
253
- let sourceSize = Math.sqrt(rgbaData.length / 4);
254
- let dt = sourceSize / destSize;
255
- let rightHeight = 0, bottomHeight = 0, sourceSize4 = 0;
256
- let [availableParentOffsetX, availableParentOffsetY, availableZoomDiff] = getTileOffset(currentTileX, currentTileY, currentTileZoom, availableParentTileX, availableParentTileY, availableParentTileZoom);
257
- for (let k = 0, currIndex = 0, sourceDataLength = rgbaData.length / 4; k < sourceDataLength; k++) {
258
- let k4 = k * 4;
259
- let height = heightFactor * rgb2Height(rgbaData[k4], rgbaData[k4 + 1], rgbaData[k4 + 2]);
260
- let isNoDataCurrent = RgbTerrain.checkNoDataValue(noDataValues, height), isNoDataRight = false, isNoDataBottom = false;
261
- let i = Math.floor(k / sourceSize), j = k % sourceSize;
262
- //
263
- // Try to get current height from the parent data
264
- if ((isNoDataCurrent || height === 0) && availableParentData) {
265
- height = getParentHeight(availableZoomDiff, availableParentOffsetX, availableParentOffsetY, availableParentData, Math.floor(i / dt), Math.floor(j / dt), skipPositiveHeights);
266
- }
267
- let tileX = Math.floor(j / destSize), tileY = Math.floor(i / destSize);
268
- let destArr = outChildrenElevations[tileY][tileX];
269
- let ii = i % destSize, jj = j % destSize;
270
- let destIndex = (ii + tileY) * destSizeOne + jj + tileX;
271
- destArr[destIndex] = height;
272
- if ((i + tileY) % dt === 0 && (j + tileX) % dt === 0) {
273
- outCurrenElevations[currIndex++] = height;
243
+ extractElevationTilesRgbNonPowerOfTwo(rgbaData, outCurrenElevations, heightFactor = 1) {
244
+ for (let i = 0, len = outCurrenElevations.length; i < len; i++) {
245
+ let i4 = i * 4;
246
+ outCurrenElevations[i] = heightFactor * this.rgb2Height(rgbaData[i4], rgbaData[i4 + 1], rgbaData[i4 + 2]);
274
247
  }
275
- if ((j + 1) % destSize === 0 && j !== sourceSize - 1) {
276
- //current tile
277
- rightHeight = heightFactor * rgb2Height(rgbaData[k4 + 4], rgbaData[k4 + 5], rgbaData[k4 + 6]);
278
- isNoDataRight = RgbTerrain.checkNoDataValue(noDataValues, rightHeight);
248
+ }
249
+ extractElevationTilesRgb(rgbaData, heightFactor, noDataValues, availableParentData = null, availableParentTileX, availableParentTileY, availableParentTileZoom, currentTileX, currentTileY, currentTileZoom, skipPositiveHeights, outCurrenElevations, outChildrenElevations) {
250
+ let destSize = Math.sqrt(outCurrenElevations.length) - 1;
251
+ let destSizeOne = destSize + 1;
252
+ let sourceSize = Math.sqrt(rgbaData.length / 4);
253
+ let dt = sourceSize / destSize;
254
+ let rightHeight = 0, bottomHeight = 0, sourceSize4 = 0;
255
+ let [availableParentOffsetX, availableParentOffsetY, availableZoomDiff] = getTileOffset(currentTileX, currentTileY, currentTileZoom, availableParentTileX, availableParentTileY, availableParentTileZoom);
256
+ for (let k = 0, currIndex = 0, sourceDataLength = rgbaData.length / 4; k < sourceDataLength; k++) {
257
+ let k4 = k * 4;
258
+ let height = heightFactor * this.rgb2Height(rgbaData[k4], rgbaData[k4 + 1], rgbaData[k4 + 2]);
259
+ let isNoDataCurrent = RgbTerrain.checkNoDataValue(noDataValues, height), isNoDataRight = false, isNoDataBottom = false;
260
+ let i = Math.floor(k / sourceSize), j = k % sourceSize;
279
261
  //
280
- // Try to get right height from the parent data
281
- if ((isNoDataRight || rightHeight === 0) && availableParentData) {
282
- rightHeight = getParentHeight(availableZoomDiff, availableParentOffsetX, availableParentOffsetY, availableParentData, Math.floor(i / dt), Math.floor((j + 1) / dt), skipPositiveHeights);
283
- }
284
- let middleHeight = height;
285
- if (!(isNoDataCurrent || isNoDataRight)) {
286
- middleHeight = (height + rightHeight) * 0.5;
262
+ // Try to get current height from the parent data
263
+ if ((isNoDataCurrent || height === 0) && availableParentData) {
264
+ height = getParentHeight(availableZoomDiff, availableParentOffsetX, availableParentOffsetY, availableParentData, Math.floor(i / dt), Math.floor(j / dt), skipPositiveHeights);
287
265
  }
288
- destIndex = (ii + tileY) * destSizeOne + jj + 1;
289
- destArr[destIndex] = middleHeight;
290
- if ((i + tileY) % dt === 0) {
291
- outCurrenElevations[currIndex++] = middleHeight;
266
+ let tileX = Math.floor(j / destSize), tileY = Math.floor(i / destSize);
267
+ let destArr = outChildrenElevations[tileY][tileX];
268
+ let ii = i % destSize, jj = j % destSize;
269
+ let destIndex = (ii + tileY) * destSizeOne + jj + tileX;
270
+ destArr[destIndex] = height;
271
+ if ((i + tileY) % dt === 0 && (j + tileX) % dt === 0) {
272
+ outCurrenElevations[currIndex++] = height;
292
273
  }
293
- //next right tile
294
- let rightindex = (ii + tileY) * destSizeOne + ((jj + 1) % destSize);
295
- outChildrenElevations[tileY][tileX + 1][rightindex] = middleHeight;
296
- }
297
- if ((i + 1) % destSize === 0 && i !== sourceSize - 1) {
298
- //current tile
299
- sourceSize4 = sourceSize * 4;
300
- bottomHeight = heightFactor * rgb2Height(rgbaData[k4 + sourceSize4], rgbaData[k4 + sourceSize4 + 1], rgbaData[k4 + sourceSize4 + 2]);
301
- isNoDataBottom = RgbTerrain.checkNoDataValue(noDataValues, bottomHeight);
302
- //
303
- // Try to get bottom height from the parent data
304
- if ((isNoDataBottom || bottomHeight === 0) && availableParentData) {
305
- bottomHeight = getParentHeight(availableZoomDiff, availableParentOffsetX, availableParentOffsetY, availableParentData, Math.floor((i + 1) / dt), Math.floor(j / dt), skipPositiveHeights);
274
+ if ((j + 1) % destSize === 0 && j !== sourceSize - 1) {
275
+ //current tile
276
+ rightHeight = heightFactor * this.rgb2Height(rgbaData[k4 + 4], rgbaData[k4 + 5], rgbaData[k4 + 6]);
277
+ isNoDataRight = RgbTerrain.checkNoDataValue(noDataValues, rightHeight);
278
+ //
279
+ // Try to get right height from the parent data
280
+ if ((isNoDataRight || rightHeight === 0) && availableParentData) {
281
+ rightHeight = getParentHeight(availableZoomDiff, availableParentOffsetX, availableParentOffsetY, availableParentData, Math.floor(i / dt), Math.floor((j + 1) / dt), skipPositiveHeights);
282
+ }
283
+ let middleHeight = height;
284
+ if (!(isNoDataCurrent || isNoDataRight)) {
285
+ middleHeight = (height + rightHeight) * 0.5;
286
+ }
287
+ destIndex = (ii + tileY) * destSizeOne + jj + 1;
288
+ destArr[destIndex] = middleHeight;
289
+ if ((i + tileY) % dt === 0) {
290
+ outCurrenElevations[currIndex++] = middleHeight;
291
+ }
292
+ //next right tile
293
+ let rightindex = (ii + tileY) * destSizeOne + ((jj + 1) % destSize);
294
+ outChildrenElevations[tileY][tileX + 1][rightindex] = middleHeight;
306
295
  }
307
- let middleHeight = (height + bottomHeight) * 0.5;
308
- if (!(isNoDataCurrent || isNoDataBottom)) {
309
- middleHeight = (height + bottomHeight) * 0.5;
296
+ if ((i + 1) % destSize === 0 && i !== sourceSize - 1) {
297
+ //current tile
298
+ sourceSize4 = sourceSize * 4;
299
+ bottomHeight = heightFactor * this.rgb2Height(rgbaData[k4 + sourceSize4], rgbaData[k4 + sourceSize4 + 1], rgbaData[k4 + sourceSize4 + 2]);
300
+ isNoDataBottom = RgbTerrain.checkNoDataValue(noDataValues, bottomHeight);
301
+ //
302
+ // Try to get bottom height from the parent data
303
+ if ((isNoDataBottom || bottomHeight === 0) && availableParentData) {
304
+ bottomHeight = getParentHeight(availableZoomDiff, availableParentOffsetX, availableParentOffsetY, availableParentData, Math.floor((i + 1) / dt), Math.floor(j / dt), skipPositiveHeights);
305
+ }
306
+ let middleHeight = (height + bottomHeight) * 0.5;
307
+ if (!(isNoDataCurrent || isNoDataBottom)) {
308
+ middleHeight = (height + bottomHeight) * 0.5;
309
+ }
310
+ destIndex = (ii + 1) * destSizeOne + jj + tileX;
311
+ destArr[destIndex] = middleHeight;
312
+ if ((j + tileX) % dt === 0) {
313
+ outCurrenElevations[currIndex++] = middleHeight;
314
+ }
315
+ //next bottom tile
316
+ let bottomindex = ((ii + 1) % destSize) * destSizeOne + jj + tileX;
317
+ outChildrenElevations[tileY + 1][tileX][bottomindex] = middleHeight;
310
318
  }
311
- destIndex = (ii + 1) * destSizeOne + jj + tileX;
312
- destArr[destIndex] = middleHeight;
313
- if ((j + tileX) % dt === 0) {
319
+ if ((j + 1) % destSize === 0 && j !== sourceSize - 1 &&
320
+ (i + 1) % destSize === 0 && i !== sourceSize - 1) {
321
+ //current tile
322
+ let rightBottomHeight = heightFactor * this.rgb2Height(rgbaData[k4 + sourceSize4 + 4], rgbaData[k4 + sourceSize4 + 5], rgbaData[k4 + sourceSize4 + 6]);
323
+ let isNoDataRightBottom = RgbTerrain.checkNoDataValue(noDataValues, rightBottomHeight);
324
+ //
325
+ // Try to get right bottom height from the parent data
326
+ if ((isNoDataRightBottom || rightBottomHeight === 0) && availableParentData) {
327
+ rightBottomHeight = getParentHeight(availableZoomDiff, availableParentOffsetX, availableParentOffsetY, availableParentData, Math.floor((i + 1) / dt), Math.floor((j + 1) / dt), skipPositiveHeights);
328
+ }
329
+ let middleHeight = height;
330
+ if (!(isNoDataCurrent || isNoDataRight || isNoDataBottom || isNoDataRightBottom)) {
331
+ middleHeight = (height + rightHeight + bottomHeight + rightBottomHeight) * 0.25;
332
+ }
333
+ destIndex = (ii + 1) * destSizeOne + (jj + 1);
334
+ destArr[destIndex] = middleHeight;
314
335
  outCurrenElevations[currIndex++] = middleHeight;
336
+ //next right tile
337
+ let rightindex = (ii + 1) * destSizeOne;
338
+ outChildrenElevations[tileY][tileX + 1][rightindex] = middleHeight;
339
+ //next bottom tile
340
+ let bottomindex = destSize;
341
+ outChildrenElevations[tileY + 1][tileX][bottomindex] = middleHeight;
342
+ //next right bottom tile
343
+ let rightBottomindex = 0;
344
+ outChildrenElevations[tileY + 1][tileX + 1][rightBottomindex] = middleHeight;
315
345
  }
316
- //next bottom tile
317
- let bottomindex = ((ii + 1) % destSize) * destSizeOne + jj + tileX;
318
- outChildrenElevations[tileY + 1][tileX][bottomindex] = middleHeight;
319
- }
320
- if ((j + 1) % destSize === 0 && j !== sourceSize - 1 &&
321
- (i + 1) % destSize === 0 && i !== sourceSize - 1) {
322
- //current tile
323
- let rightBottomHeight = heightFactor * rgb2Height(rgbaData[k4 + sourceSize4 + 4], rgbaData[k4 + sourceSize4 + 5], rgbaData[k4 + sourceSize4 + 6]);
324
- let isNoDataRightBottom = RgbTerrain.checkNoDataValue(noDataValues, rightBottomHeight);
325
- //
326
- // Try to get right bottom height from the parent data
327
- if ((isNoDataRightBottom || rightBottomHeight === 0) && availableParentData) {
328
- rightBottomHeight = getParentHeight(availableZoomDiff, availableParentOffsetX, availableParentOffsetY, availableParentData, Math.floor((i + 1) / dt), Math.floor((j + 1) / dt), skipPositiveHeights);
329
- }
330
- let middleHeight = height;
331
- if (!(isNoDataCurrent || isNoDataRight || isNoDataBottom || isNoDataRightBottom)) {
332
- middleHeight = (height + rightHeight + bottomHeight + rightBottomHeight) * 0.25;
333
- }
334
- destIndex = (ii + 1) * destSizeOne + (jj + 1);
335
- destArr[destIndex] = middleHeight;
336
- outCurrenElevations[currIndex++] = middleHeight;
337
- //next right tile
338
- let rightindex = (ii + 1) * destSizeOne;
339
- outChildrenElevations[tileY][tileX + 1][rightindex] = middleHeight;
340
- //next bottom tile
341
- let bottomindex = destSize;
342
- outChildrenElevations[tileY + 1][tileX][bottomindex] = middleHeight;
343
- //next right bottom tile
344
- let rightBottomindex = 0;
345
- outChildrenElevations[tileY + 1][tileX + 1][rightBottomindex] = middleHeight;
346
346
  }
347
347
  }
348
- }
349
- function extractElevationTilesRgbNoChildren(rgbaData, heightFactor, noDataValues, availableParentData = null, availableParentTileX, availableParentTileY, availableParentTileZoom, currentTileX, currentTileY, currentTileZoom, skipPositiveHeights, outCurrenElevations) {
350
- let destSize = Math.sqrt(outCurrenElevations.length) - 1;
351
- let destSizeOne = destSize + 1;
352
- let sourceSize = Math.sqrt(rgbaData.length / 4);
353
- let dt = sourceSize / destSize;
354
- let rightHeight = 0, bottomHeight = 0, sourceSize4 = 0;
355
- let [availableParentOffsetX, availableParentOffsetY, availableZoomDiff] = getTileOffset(currentTileX, currentTileY, currentTileZoom, availableParentTileX, availableParentTileY, availableParentTileZoom);
356
- for (let k = 0, currIndex = 0, sourceDataLength = rgbaData.length / 4; k < sourceDataLength; k++) {
357
- let k4 = k * 4;
358
- let height = heightFactor * rgb2Height(rgbaData[k4], rgbaData[k4 + 1], rgbaData[k4 + 2]);
359
- let isNoDataCurrent = RgbTerrain.checkNoDataValue(noDataValues, height), isNoDataRight = false, isNoDataBottom = false;
360
- let i = Math.floor(k / sourceSize), j = k % sourceSize;
361
- if ((isNoDataCurrent || height === 0) && availableParentData) {
362
- height = getParentHeight(availableZoomDiff, availableParentOffsetX, availableParentOffsetY, availableParentData, Math.floor(currIndex / destSizeOne), currIndex % destSizeOne, skipPositiveHeights);
363
- }
364
- let tileX = Math.floor(j / destSize), tileY = Math.floor(i / destSize);
365
- if ((i + tileY) % dt === 0 && (j + tileX) % dt === 0) {
366
- outCurrenElevations[currIndex++] = height;
367
- }
368
- if ((j + 1) % destSize === 0 && j !== sourceSize - 1) {
369
- //current tile
370
- rightHeight = heightFactor * rgb2Height(rgbaData[k4 + 4], rgbaData[k4 + 5], rgbaData[k4 + 6]);
371
- isNoDataRight = RgbTerrain.checkNoDataValue(noDataValues, rightHeight);
372
- if ((isNoDataRight || rightHeight === 0) && availableParentData) {
373
- rightHeight = getParentHeight(availableZoomDiff, availableParentOffsetX, availableParentOffsetY, availableParentData, Math.floor(currIndex / destSizeOne), currIndex % destSizeOne, skipPositiveHeights);
348
+ extractElevationTilesRgbNoChildren(rgbaData, heightFactor, noDataValues, availableParentData = null, availableParentTileX, availableParentTileY, availableParentTileZoom, currentTileX, currentTileY, currentTileZoom, skipPositiveHeights, outCurrenElevations) {
349
+ let destSize = Math.sqrt(outCurrenElevations.length) - 1;
350
+ let destSizeOne = destSize + 1;
351
+ let sourceSize = Math.sqrt(rgbaData.length / 4);
352
+ let dt = sourceSize / destSize;
353
+ let rightHeight = 0, bottomHeight = 0, sourceSize4 = 0;
354
+ let [availableParentOffsetX, availableParentOffsetY, availableZoomDiff] = getTileOffset(currentTileX, currentTileY, currentTileZoom, availableParentTileX, availableParentTileY, availableParentTileZoom);
355
+ for (let k = 0, currIndex = 0, sourceDataLength = rgbaData.length / 4; k < sourceDataLength; k++) {
356
+ let k4 = k * 4;
357
+ let height = heightFactor * this.rgb2Height(rgbaData[k4], rgbaData[k4 + 1], rgbaData[k4 + 2]);
358
+ let isNoDataCurrent = RgbTerrain.checkNoDataValue(noDataValues, height), isNoDataRight = false, isNoDataBottom = false;
359
+ let i = Math.floor(k / sourceSize), j = k % sourceSize;
360
+ if ((isNoDataCurrent || height === 0) && availableParentData) {
361
+ height = getParentHeight(availableZoomDiff, availableParentOffsetX, availableParentOffsetY, availableParentData, Math.floor(currIndex / destSizeOne), currIndex % destSizeOne, skipPositiveHeights);
374
362
  }
375
- let middleHeight = height;
376
- if (!(isNoDataCurrent || isNoDataRight)) {
377
- middleHeight = (height + rightHeight) * 0.5;
378
- }
379
- if ((i + tileY) % dt === 0) {
380
- outCurrenElevations[currIndex++] = middleHeight;
363
+ let tileX = Math.floor(j / destSize), tileY = Math.floor(i / destSize);
364
+ if ((i + tileY) % dt === 0 && (j + tileX) % dt === 0) {
365
+ outCurrenElevations[currIndex++] = height;
381
366
  }
382
- }
383
- if ((i + 1) % destSize === 0 && i !== sourceSize - 1) {
384
- //current tile
385
- sourceSize4 = sourceSize * 4;
386
- bottomHeight = heightFactor * rgb2Height(rgbaData[k4 + sourceSize4], rgbaData[k4 + sourceSize4 + 1], rgbaData[k4 + sourceSize4 + 2]);
387
- isNoDataBottom = RgbTerrain.checkNoDataValue(noDataValues, bottomHeight);
388
- if ((isNoDataBottom || bottomHeight === 0) && availableParentData) {
389
- bottomHeight = getParentHeight(availableZoomDiff, availableParentOffsetX, availableParentOffsetY, availableParentData, Math.floor(currIndex / destSizeOne), currIndex % destSizeOne, skipPositiveHeights);
367
+ if ((j + 1) % destSize === 0 && j !== sourceSize - 1) {
368
+ //current tile
369
+ rightHeight = heightFactor * this.rgb2Height(rgbaData[k4 + 4], rgbaData[k4 + 5], rgbaData[k4 + 6]);
370
+ isNoDataRight = RgbTerrain.checkNoDataValue(noDataValues, rightHeight);
371
+ if ((isNoDataRight || rightHeight === 0) && availableParentData) {
372
+ rightHeight = getParentHeight(availableZoomDiff, availableParentOffsetX, availableParentOffsetY, availableParentData, Math.floor(currIndex / destSizeOne), currIndex % destSizeOne, skipPositiveHeights);
373
+ }
374
+ let middleHeight = height;
375
+ if (!(isNoDataCurrent || isNoDataRight)) {
376
+ middleHeight = (height + rightHeight) * 0.5;
377
+ }
378
+ if ((i + tileY) % dt === 0) {
379
+ outCurrenElevations[currIndex++] = middleHeight;
380
+ }
390
381
  }
391
- let middleHeight = (height + bottomHeight) * 0.5;
392
- if (!(isNoDataCurrent || isNoDataBottom)) {
393
- middleHeight = (height + bottomHeight) * 0.5;
382
+ if ((i + 1) % destSize === 0 && i !== sourceSize - 1) {
383
+ //current tile
384
+ sourceSize4 = sourceSize * 4;
385
+ bottomHeight = heightFactor * this.rgb2Height(rgbaData[k4 + sourceSize4], rgbaData[k4 + sourceSize4 + 1], rgbaData[k4 + sourceSize4 + 2]);
386
+ isNoDataBottom = RgbTerrain.checkNoDataValue(noDataValues, bottomHeight);
387
+ if ((isNoDataBottom || bottomHeight === 0) && availableParentData) {
388
+ bottomHeight = getParentHeight(availableZoomDiff, availableParentOffsetX, availableParentOffsetY, availableParentData, Math.floor(currIndex / destSizeOne), currIndex % destSizeOne, skipPositiveHeights);
389
+ }
390
+ let middleHeight = (height + bottomHeight) * 0.5;
391
+ if (!(isNoDataCurrent || isNoDataBottom)) {
392
+ middleHeight = (height + bottomHeight) * 0.5;
393
+ }
394
+ if ((j + tileX) % dt === 0) {
395
+ outCurrenElevations[currIndex++] = middleHeight;
396
+ }
394
397
  }
395
- if ((j + tileX) % dt === 0) {
398
+ if ((j + 1) % destSize === 0 && j !== sourceSize - 1 &&
399
+ (i + 1) % destSize === 0 && i !== sourceSize - 1) {
400
+ //current tile
401
+ let rightBottomHeight = heightFactor * this.rgb2Height(rgbaData[k4 + sourceSize4 + 4], rgbaData[k4 + sourceSize4 + 5], rgbaData[k4 + sourceSize4 + 6]);
402
+ let isNoDataRightBottom = RgbTerrain.checkNoDataValue(noDataValues, rightBottomHeight);
403
+ if ((isNoDataRightBottom || rightBottomHeight === 0) && availableParentData) {
404
+ rightBottomHeight = getParentHeight(availableZoomDiff, availableParentOffsetX, availableParentOffsetY, availableParentData, Math.floor(currIndex / destSizeOne), currIndex % destSizeOne, skipPositiveHeights);
405
+ }
406
+ let middleHeight = height;
407
+ if (!(isNoDataCurrent || isNoDataRight || isNoDataBottom || isNoDataRightBottom)) {
408
+ middleHeight = (height + rightHeight + bottomHeight + rightBottomHeight) * 0.25;
409
+ }
396
410
  outCurrenElevations[currIndex++] = middleHeight;
397
411
  }
398
412
  }
399
- if ((j + 1) % destSize === 0 && j !== sourceSize - 1 &&
400
- (i + 1) % destSize === 0 && i !== sourceSize - 1) {
401
- //current tile
402
- let rightBottomHeight = heightFactor * rgb2Height(rgbaData[k4 + sourceSize4 + 4], rgbaData[k4 + sourceSize4 + 5], rgbaData[k4 + sourceSize4 + 6]);
403
- let isNoDataRightBottom = RgbTerrain.checkNoDataValue(noDataValues, rightBottomHeight);
404
- if ((isNoDataRightBottom || rightBottomHeight === 0) && availableParentData) {
405
- rightBottomHeight = getParentHeight(availableZoomDiff, availableParentOffsetX, availableParentOffsetY, availableParentData, Math.floor(currIndex / destSizeOne), currIndex % destSizeOne, skipPositiveHeights);
406
- }
407
- let middleHeight = height;
408
- if (!(isNoDataCurrent || isNoDataRight || isNoDataBottom || isNoDataRightBottom)) {
409
- middleHeight = (height + rightHeight + bottomHeight + rightBottomHeight) * 0.25;
410
- }
411
- outCurrenElevations[currIndex++] = middleHeight;
412
- }
413
413
  }
414
414
  }
415
+ function getTileOffset(currentTileX, currentTileY, currentTileZoom, parentTileX, parentTileY, parentTileZoom) {
416
+ let dz2 = 2 << (currentTileZoom - parentTileZoom - 1);
417
+ return [currentTileX - dz2 * parentTileX, currentTileY - dz2 * parentTileY, 1.0 / dz2];
418
+ }
419
+ function getChildTileIndex(currentParentTileX, currentParentTileY, currentParentTileZoom, childOffsetX, childOffsetY) {
420
+ return [currentParentTileX * 2 + childOffsetX, currentParentTileY * 2 + childOffsetY, currentParentTileZoom + 1];
421
+ }
422
+ function getParentHeight(oneByDz2, offsetX, offsetY, heights, i, j, skipPositiveHeights) {
423
+ let parentGridSize = Math.sqrt(heights.length);
424
+ let pi = Math.floor(offsetY * oneByDz2 * parentGridSize + i * oneByDz2), pj = Math.floor(offsetX * oneByDz2 * parentGridSize + j * oneByDz2);
425
+ let h = heights[pi * parentGridSize + pj];
426
+ return skipPositiveHeights ? (h > 0 ? 0 : h) : h;
427
+ }
415
428
  export { RgbTerrain };
@@ -1,5 +1,6 @@
1
1
  // import { QueueArray } from '../QueueArray.js';
2
2
  import { EPSG4326 } from "../proj/EPSG4326";
3
+ import { equi } from "../proj/equi";
3
4
  import { BaseWorker } from "./BaseWorker";
4
5
  class PlainSegmentWorker extends BaseWorker {
5
6
  constructor(numWorkers = 2) {
@@ -53,9 +54,10 @@ class PlainSegmentWorker extends BaseWorker {
53
54
  if (this._workerQueue.length) {
54
55
  let w = this._workerQueue.pop();
55
56
  this._source.set(this._sourceId, segment);
57
+ let isLonLat = (segment._projection.id === EPSG4326.id || segment._projection.id === equi.id) ? 1.0 : 0.0;
56
58
  let params = new Float64Array([
57
59
  this._sourceId,
58
- segment._projection.id === EPSG4326.id ? 1.0 : 0.0,
60
+ isLonLat,
59
61
  segment.planet.terrain.gridSizeByZoom[segment.tileZoom],
60
62
  segment.planet.terrain.plainGridSize,
61
63
  segment._extent.southWest.lon,
@@ -625,7 +625,7 @@ class Handler {
625
625
  this._initPrograms();
626
626
  this._setDefaults();
627
627
  this.intersectionObserver = new IntersectionObserver((entries) => {
628
- this._toggleVisibilityChange(entries[0].isIntersecting);
628
+ this._toggleVisibilityChange(entries[entries.length - 1].isIntersecting);
629
629
  }, { threshold: 0 });
630
630
  this.intersectionObserver.observe(this.canvas);
631
631
  this.resizeObserver = new ResizeObserver(entries => {