@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.
- package/lib/@openglobus/js/Globe.d.ts +5 -1
- package/lib/@openglobus/js/Object3d.d.ts +8 -2
- package/lib/@openglobus/js/camera/Camera.d.ts +2 -0
- package/lib/@openglobus/js/control/geoObjectEditor/GeoObjectEditorScene.d.ts +58 -0
- package/lib/@openglobus/js/ellipsoid/Ellipsoid.d.ts +1 -1
- package/lib/@openglobus/js/ellipsoid/index.d.ts +4 -3
- package/lib/@openglobus/js/ellipsoid/mars.d.ts +6 -0
- package/lib/@openglobus/js/ellipsoid/moon.d.ts +6 -0
- package/lib/@openglobus/js/entity/Entity.d.ts +4 -2
- package/lib/@openglobus/js/entity/EntityCollection.d.ts +3 -2
- package/lib/@openglobus/js/entity/GeoObject.d.ts +6 -1
- package/lib/@openglobus/js/entity/GeoObjectHandler.d.ts +4 -0
- package/lib/@openglobus/js/entity/GeometryHandler.d.ts +3 -2
- package/lib/@openglobus/js/entity/Label.d.ts +14 -0
- package/lib/@openglobus/js/entity/LabelHandler.d.ts +1 -1
- package/lib/@openglobus/js/index.d.ts +3 -3
- package/lib/@openglobus/js/layer/Vector.d.ts +12 -29
- package/lib/@openglobus/js/proj/equi.d.ts +9 -0
- package/lib/@openglobus/js/quadTree/{EPSG4326QuadTreeStrategy.d.ts → EPSG4326/EPSG4326QuadTreeStrategy.d.ts} +2 -2
- package/lib/@openglobus/js/quadTree/EntityCollectionNode.d.ts +5 -13
- package/lib/@openglobus/js/quadTree/EntityCollectionsTreeStrategy.d.ts +25 -0
- package/lib/@openglobus/js/quadTree/QuadTreeStrategy.d.ts +11 -0
- package/lib/@openglobus/js/quadTree/earth/EarthEntityCollectionNodeLonLat.d.ts +18 -0
- package/lib/@openglobus/js/quadTree/earth/EarthEntityCollectionsTreeStrategy.d.ts +19 -0
- package/lib/@openglobus/js/quadTree/earth/EarthQuadTreeStrategy.d.ts +29 -0
- package/lib/@openglobus/js/quadTree/equi/EquiEntityCollectionNodeLonLat.d.ts +17 -0
- package/lib/@openglobus/js/quadTree/equi/EquiEntityCollectionsTreeStrategy.d.ts +17 -0
- package/lib/@openglobus/js/quadTree/equi/EquiQuadTreeStrategy.d.ts +19 -0
- package/lib/@openglobus/js/quadTree/index.d.ts +6 -6
- package/lib/{js/quadTree → @openglobus/js/quadTree/wgs84}/Wgs84QuadTreeStrategy.d.ts +2 -2
- package/lib/@openglobus/js/renderer/Renderer.d.ts +2 -0
- package/lib/@openglobus/js/scene/Planet.d.ts +0 -27
- package/lib/@openglobus/js/segment/Segment.d.ts +0 -1
- package/lib/@openglobus/js/segment/SegmentLonLat.d.ts +0 -4
- package/lib/@openglobus/js/segment/{SegmentLonLatWgs84.d.ts → SegmentLonLatEqui.d.ts} +1 -1
- package/lib/@openglobus/js/terrain/RgbTerrain.d.ts +20 -0
- package/lib/@openglobus/og.esm.js +1 -1
- package/lib/@openglobus/og.esm.js.map +1 -1
- package/lib/@openglobus/og.umd.js +1 -1
- package/lib/@openglobus/og.umd.js.map +1 -1
- package/lib/@openglobus/res/fonts/Ephesis-Regular.json +4648 -0
- package/lib/@openglobus/res/fonts/Ephesis-Regular.ttf.cfg +1282 -0
- package/lib/@openglobus/res/fonts/Ephesis-Regular.ttf.png +0 -0
- package/lib/js/Globe.d.ts +5 -1
- package/lib/js/Globe.js +13 -4
- package/lib/js/Object3d.d.ts +8 -2
- package/lib/js/Object3d.js +64 -6
- package/lib/js/camera/Camera.d.ts +2 -0
- package/lib/js/camera/Camera.js +8 -0
- package/lib/js/control/elevationProfile/ElevationProfileScene.js +2 -0
- package/lib/js/control/geoObjectEditor/GeoObjectEditorScene.d.ts +58 -0
- package/lib/js/control/geoObjectEditor/GeoObjectEditorScene.js +105 -0
- package/lib/js/ellipsoid/Ellipsoid.d.ts +1 -1
- package/lib/js/ellipsoid/Ellipsoid.js +1 -1
- package/lib/js/ellipsoid/index.d.ts +4 -3
- package/lib/js/ellipsoid/index.js +4 -3
- package/lib/js/ellipsoid/mars.d.ts +6 -0
- package/lib/js/ellipsoid/mars.js +6 -0
- package/lib/js/ellipsoid/moon.d.ts +6 -0
- package/lib/js/ellipsoid/moon.js +6 -0
- package/lib/js/entity/Entity.d.ts +4 -2
- package/lib/js/entity/Entity.js +4 -1
- package/lib/js/entity/EntityCollection.d.ts +3 -2
- package/lib/js/entity/EntityCollection.js +26 -2
- package/lib/js/entity/GeoObject.d.ts +6 -1
- package/lib/js/entity/GeoObject.js +9 -0
- package/lib/js/entity/GeoObjectHandler.d.ts +4 -0
- package/lib/js/entity/GeoObjectHandler.js +32 -1
- package/lib/js/entity/GeometryHandler.d.ts +3 -2
- package/lib/js/entity/GeometryHandler.js +58 -0
- package/lib/js/entity/Label.d.ts +14 -0
- package/lib/js/entity/Label.js +24 -4
- package/lib/js/entity/LabelHandler.d.ts +1 -1
- package/lib/js/entity/LabelHandler.js +4 -4
- package/lib/js/entity/Polyline.js +1 -1
- package/lib/js/index.d.ts +3 -3
- package/lib/js/index.js +3 -3
- package/lib/js/layer/Bing.js +1 -0
- package/lib/js/layer/Layer.js +7 -4
- package/lib/js/layer/Vector.d.ts +12 -29
- package/lib/js/layer/Vector.js +38 -161
- package/lib/js/layer/XYZ.js +1 -1
- package/lib/js/proj/equi.d.ts +9 -0
- package/lib/js/proj/equi.js +9 -0
- package/lib/js/quadTree/{EPSG4326QuadTreeStrategy.d.ts → EPSG4326/EPSG4326QuadTreeStrategy.d.ts} +2 -2
- package/lib/js/quadTree/EPSG4326/EPSG4326QuadTreeStrategy.js +16 -0
- package/lib/js/quadTree/EntityCollectionNode.d.ts +5 -13
- package/lib/js/quadTree/EntityCollectionNode.js +18 -83
- package/lib/js/quadTree/EntityCollectionsTreeStrategy.d.ts +25 -0
- package/lib/js/quadTree/EntityCollectionsTreeStrategy.js +49 -0
- package/lib/js/quadTree/Node.js +6 -12
- package/lib/js/quadTree/QuadTreeStrategy.d.ts +11 -0
- package/lib/js/quadTree/QuadTreeStrategy.js +12 -0
- package/lib/js/quadTree/earth/EarthEntityCollectionNodeLonLat.d.ts +18 -0
- package/lib/js/quadTree/earth/EarthEntityCollectionNodeLonLat.js +74 -0
- package/lib/js/quadTree/earth/EarthEntityCollectionsTreeStrategy.d.ts +19 -0
- package/lib/js/quadTree/earth/EarthEntityCollectionsTreeStrategy.js +103 -0
- package/lib/js/quadTree/earth/EarthQuadTreeStrategy.d.ts +29 -0
- package/lib/js/quadTree/{EarthQuadTreeStrategy.js → earth/EarthQuadTreeStrategy.js} +29 -6
- package/lib/js/quadTree/equi/EquiEntityCollectionNodeLonLat.d.ts +17 -0
- package/lib/js/quadTree/equi/EquiEntityCollectionNodeLonLat.js +70 -0
- package/lib/js/quadTree/equi/EquiEntityCollectionsTreeStrategy.d.ts +17 -0
- package/lib/js/quadTree/equi/EquiEntityCollectionsTreeStrategy.js +75 -0
- package/lib/js/quadTree/equi/EquiQuadTreeStrategy.d.ts +19 -0
- package/lib/js/quadTree/equi/EquiQuadTreeStrategy.js +62 -0
- package/lib/js/quadTree/index.d.ts +6 -6
- package/lib/js/quadTree/index.js +6 -6
- package/lib/{@openglobus/js/quadTree → js/quadTree/wgs84}/Wgs84QuadTreeStrategy.d.ts +2 -2
- package/lib/js/quadTree/wgs84/Wgs84QuadTreeStrategy.js +15 -0
- package/lib/js/renderer/Renderer.d.ts +2 -0
- package/lib/js/renderer/Renderer.js +2 -2
- package/lib/js/scene/Planet.d.ts +0 -27
- package/lib/js/scene/Planet.js +2 -9
- package/lib/js/segment/Segment.d.ts +0 -1
- package/lib/js/segment/Segment.js +0 -3
- package/lib/js/segment/SegmentLonLat.d.ts +0 -4
- package/lib/js/segment/SegmentLonLat.js +0 -11
- package/lib/js/segment/{SegmentLonLatWgs84.d.ts → SegmentLonLatEqui.d.ts} +1 -1
- package/lib/js/segment/{SegmentLonLatWgs84.js → SegmentLonLatEqui.js} +3 -1
- package/lib/js/shaders/geoObject.js +10 -5
- package/lib/js/shaders/polyline.js +8 -6
- package/lib/js/terrain/RgbTerrain.d.ts +20 -0
- package/lib/js/terrain/RgbTerrain.js +227 -214
- package/lib/js/utils/PlainSegmentWorker.js +3 -1
- package/lib/js/webgl/Handler.js +1 -1
- package/package.json +15 -15
- package/lib/@openglobus/js/quadTree/EarthQuadTreeStrategy.d.ts +0 -9
- package/lib/@openglobus/js/quadTree/MarsQuadTreeStrategy.d.ts +0 -11
- package/lib/js/quadTree/EPSG4326QuadTreeStrategy.js +0 -16
- package/lib/js/quadTree/EarthQuadTreeStrategy.d.ts +0 -9
- package/lib/js/quadTree/MarsQuadTreeStrategy.d.ts +0 -11
- package/lib/js/quadTree/MarsQuadTreeStrategy.js +0 -43
- 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
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
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 || [
|
|
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
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
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
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
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
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
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,
|
|
239
|
+
height = getParentHeight(availableZoomDiff, availableParentOffsetX, availableParentOffsetY, availableParentData, imageSize - 1, imageSize - 1, skipPositiveHeights);
|
|
234
240
|
}
|
|
235
|
-
outCurrenElevations[
|
|
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
|
-
|
|
251
|
-
|
|
252
|
-
|
|
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
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
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
|
|
281
|
-
if ((
|
|
282
|
-
|
|
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
|
-
|
|
289
|
-
destArr
|
|
290
|
-
|
|
291
|
-
|
|
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
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
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
|
-
|
|
308
|
-
|
|
309
|
-
|
|
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
|
-
|
|
312
|
-
|
|
313
|
-
|
|
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
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
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
|
|
376
|
-
if (
|
|
377
|
-
|
|
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
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
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
|
-
|
|
392
|
-
|
|
393
|
-
|
|
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 +
|
|
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
|
-
|
|
60
|
+
isLonLat,
|
|
59
61
|
segment.planet.terrain.gridSizeByZoom[segment.tileZoom],
|
|
60
62
|
segment.planet.terrain.plainGridSize,
|
|
61
63
|
segment._extent.southWest.lon,
|
package/lib/js/webgl/Handler.js
CHANGED
|
@@ -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[
|
|
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 => {
|