@openglobus/og 0.14.10 → 0.15.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.
- package/css/og.css +378 -275
- package/dist/@openglobus/og.css +1 -1
- package/dist/@openglobus/og.esm.js +2 -2
- package/dist/@openglobus/og.esm.js.map +1 -1
- package/dist/@openglobus/og.umd.js +2 -2
- package/dist/@openglobus/og.umd.js.map +1 -1
- package/package.json +18 -17
- package/src/og/Clock.js +218 -194
- package/src/og/Globe.js +5 -5
- package/src/og/Object3d.js +104 -145
- package/src/og/camera/Camera.js +31 -27
- package/src/og/camera/PlanetCamera.js +22 -14
- package/src/og/cons.js +107 -107
- package/src/og/control/Atmosphere.js +396 -0
- package/src/og/control/CompassButton.js +11 -18
- package/src/og/control/Control.js +197 -188
- package/src/og/control/GeoImageDragControl.js +84 -66
- package/src/og/control/LayerSwitcher.js +56 -138
- package/src/og/control/Lighting.js +314 -186
- package/src/og/control/MouseNavigation.js +2 -2
- package/src/og/control/RulerSwitcher.js +24 -19
- package/src/og/control/ScaleControl.js +30 -10
- package/src/og/control/SimpleSkyBackground.js +210 -0
- package/src/og/control/Sun.js +3 -1
- package/src/og/control/ZoomControl.js +30 -42
- package/src/og/control/index.js +6 -0
- package/src/og/control/ruler/RulerScene.js +5 -23
- package/src/og/control/selection/Selection.js +99 -0
- package/src/og/control/selection/SelectionScene.js +350 -0
- package/src/og/control/timeline/TimelineControl.js +99 -0
- package/src/og/control/timeline/TimelineModel.js +133 -0
- package/src/og/control/timeline/TimelineView.js +449 -0
- package/src/og/control/timeline/timelineUtils.js +132 -0
- package/src/og/ellipsoid/Ellipsoid.js +120 -93
- package/src/og/ellipsoid/wgs84.js +13 -13
- package/src/og/entity/Entity.js +36 -9
- package/src/og/entity/EntityCollection.js +0 -2
- package/src/og/entity/GeoObject.js +72 -56
- package/src/og/entity/GeoObjectHandler.js +487 -656
- package/src/og/entity/GeometryHandler.js +1341 -1337
- package/src/og/entity/Polyline.js +0 -16
- package/src/og/entity/Ray.js +0 -10
- package/src/og/entity/RayHandler.js +3 -44
- package/src/og/entity/Strip.js +1 -6
- package/src/og/index.js +13 -7
- package/src/og/input/input.js +3 -1
- package/src/og/layer/CanvasTiles.js +39 -34
- package/src/og/layer/Layer.js +69 -9
- package/src/og/layer/Material.js +1 -8
- package/src/og/layer/WMS.js +16 -5
- package/src/og/light/LightSource.js +2 -0
- package/src/og/math/Line3.js +140 -139
- package/src/og/math/Plane.js +118 -117
- package/src/og/math/Ray.js +242 -239
- package/src/og/math/Vec3.js +56 -37
- package/src/og/math/Vec4.js +3 -4
- package/src/og/math.js +21 -21
- package/src/og/quadTree/Node.js +5 -4
- package/src/og/quadTree/index.js +12 -0
- package/src/og/renderer/Renderer.js +64 -37
- package/src/og/renderer/RendererEvents.js +1071 -1065
- package/src/og/scene/Planet.js +354 -174
- package/src/og/scene/RenderNode.js +27 -12
- package/src/og/segment/Segment.js +0 -5
- package/src/og/shaders/atmos.js +332 -0
- package/src/og/shaders/drawnode.js +475 -109
- package/src/og/shaders/geoObject.js +96 -51
- package/src/og/shaders/polyline.js +212 -17
- package/src/og/shaders/ray.js +13 -6
- package/src/og/shaders/toneMapping.js +5 -5
- package/src/og/shaders/utils.js +88 -0
- package/src/og/terrain/GlobusTerrain.js +5 -4
- package/src/og/terrain/MapboxTerrain.js +231 -52
- package/src/og/ui/Button.js +106 -0
- package/src/og/ui/ButtonGroup.js +57 -0
- package/src/og/ui/Dialog.js +242 -0
- package/src/og/ui/Slider.js +144 -0
- package/src/og/ui/ToggleButton.js +51 -0
- package/src/og/{control → ui}/UIhelpers.js +11 -2
- package/src/og/ui/View.js +190 -0
- package/src/og/utils/shared.js +960 -942
- package/src/og/webgl/Framebuffer.js +308 -387
- package/src/og/webgl/Handler.js +90 -30
- package/src/og/webgl/Multisample.js +8 -0
- package/types/Clock.d.ts +7 -2
- package/types/Object3d.d.ts +14 -3
- package/types/camera/Camera.d.ts +18 -17
- package/types/camera/PlanetCamera.d.ts +3 -1
- package/types/control/Atmosphere.d.ts +15 -0
- package/types/control/CompassButton.d.ts +1 -2
- package/types/control/GeoImageDragControl.d.ts +7 -1
- package/types/control/LayerSwitcher.d.ts +5 -6
- package/types/control/Lighting.d.ts +32 -7
- package/types/control/ScaleControl.d.ts +2 -1
- package/types/control/SimpleSkyBackground.d.ts +15 -0
- package/types/control/ZoomControl.d.ts +0 -1
- package/types/control/index.d.ts +4 -1
- package/types/control/ruler/RulerScene.d.ts +0 -1
- package/types/control/selection/Selection.d.ts +49 -0
- package/types/control/selection/SelectionScene.d.ts +34 -0
- package/types/ellipsoid/Ellipsoid.d.ts +3 -2
- package/types/entity/Entity.d.ts +8 -0
- package/types/entity/GeoObject.d.ts +28 -22
- package/types/entity/GeoObjectHandler.d.ts +16 -56
- package/types/entity/Ray.d.ts +0 -3
- package/types/entity/RayHandler.d.ts +0 -4
- package/types/index.d.ts +9 -6
- package/types/input/input.d.ts +2 -0
- package/types/layer/CanvasTiles.d.ts +1 -0
- package/types/layer/Layer.d.ts +9 -0
- package/types/layer/WMS.d.ts +7 -3
- package/types/math/Plane.d.ts +1 -1
- package/types/math/Vec3.d.ts +19 -16
- package/types/math/Vec4.d.ts +2 -3
- package/types/math.d.ts +20 -20
- package/types/quadTree/index.d.ts +10 -0
- package/types/renderer/Renderer.d.ts +11 -37
- package/types/scene/Planet.d.ts +27 -1
- package/types/scene/RenderNode.d.ts +2 -1
- package/types/segment/Segment.d.ts +1 -1
- package/types/shaders/atmos.d.ts +4 -0
- package/types/shaders/drawnode.d.ts +3 -2
- package/types/shaders/utils.d.ts +1 -0
- package/types/terrain/GlobusTerrain.d.ts +1 -1
- package/types/terrain/MapboxTerrain.d.ts +2 -1
- package/types/ui/Button.d.ts +21 -0
- package/types/ui/Dialog.d.ts +41 -0
- package/types/ui/Slider.d.ts +30 -0
- package/types/ui/ToggleButton.d.ts +10 -0
- package/types/{control → ui}/UIhelpers.d.ts +1 -1
- package/types/ui/View.d.ts +32 -0
- package/types/utils/shared.d.ts +16 -14
- package/types/webgl/Framebuffer.d.ts +2 -5
- package/types/webgl/Handler.d.ts +15 -10
- package/types/webgl/Multisample.d.ts +2 -0
- package/src/og/ajax.js +0 -204
- package/src/og/entity/Object3d.js +0 -504
- package/src/og/utils/quadTreeType.js +0 -11
- package/types/ajax.d.ts +0 -24
- package/types/utils/quadTreeType.d.ts +0 -8
|
@@ -42,7 +42,7 @@ const EVENT_NAMES = [
|
|
|
42
42
|
* @param {string} [options.url="//openglobus.org/heights/srtm3/{z}/{y}/{x}.ddm"] - Terrain source path url template. Default is openglobus ddm elevation file.
|
|
43
43
|
* @param {Array.<number>} [options.gridSizeByZoom] - Array of segment triangulation grid sizes where array index agreed to the segment zoom index.
|
|
44
44
|
* @param {number} [options.plainGridSize=32] - Elevation grid size. Default is 32x32. Must be power of two.
|
|
45
|
-
* @param {string} [options.responseType="arraybuffer"] -
|
|
45
|
+
* @param {string} [options.responseType="arraybuffer"] - Responce type.
|
|
46
46
|
* @param {number} [options.MAX_LOADING_TILES] - Maximum at one time loading tiles.
|
|
47
47
|
* @param {Array.<number>} [gridSizeByZoom] - Array of values, where each value corresponds to the size of a tile(or segment) on the globe. Each value must be power of two.
|
|
48
48
|
* @fires og.terrain.GlobusTerrain#load
|
|
@@ -163,7 +163,7 @@ class GlobusTerrain extends EmptyTerrain {
|
|
|
163
163
|
}
|
|
164
164
|
|
|
165
165
|
isBlur(segment) {
|
|
166
|
-
if (segment.tileZoom >=
|
|
166
|
+
if (segment.tileZoom >= 6) {
|
|
167
167
|
return true;
|
|
168
168
|
}
|
|
169
169
|
return false;
|
|
@@ -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
|
|
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) {
|
|
@@ -2,10 +2,15 @@ import { getTileExtent } from "../mercator.js";
|
|
|
2
2
|
import { Layer } from "../layer/Layer.js";
|
|
3
3
|
import { GlobusTerrain } from "./GlobusTerrain.js";
|
|
4
4
|
import { isPowerOfTwo } from "../math.js";
|
|
5
|
+
import * as mercator from "../mercator.js";
|
|
5
6
|
|
|
6
7
|
const KEY =
|
|
7
8
|
"pk.eyJ1IjoiZm94bXVsZGVyODMiLCJhIjoiY2pqYmR3dG5oM2Z1bzNrczJqYm5pODhuNSJ9.Y4DRmEPhb-XSlCR9CAXACQ";
|
|
8
9
|
|
|
10
|
+
const rgb2Height = (r, g, b) => {
|
|
11
|
+
return -10000 + 0.1 * (r * 256 * 256 + g * 256 + b);
|
|
12
|
+
};
|
|
13
|
+
|
|
9
14
|
class MapboxTerrain extends GlobusTerrain {
|
|
10
15
|
constructor(name, options = {}) {
|
|
11
16
|
super(name || "mapbox", options);
|
|
@@ -39,10 +44,12 @@ class MapboxTerrain extends GlobusTerrain {
|
|
|
39
44
|
this._imageSize = options.imageSize || 256;
|
|
40
45
|
|
|
41
46
|
this._ctx = this._createTemporalCanvas(this._imageSize);
|
|
47
|
+
|
|
48
|
+
this._imageDataCache = {};
|
|
42
49
|
}
|
|
43
50
|
|
|
44
51
|
isBlur(segment) {
|
|
45
|
-
if (segment.tileZoom >=
|
|
52
|
+
if (segment.tileZoom >= 16) {
|
|
46
53
|
return true;
|
|
47
54
|
}
|
|
48
55
|
return false;
|
|
@@ -52,15 +59,19 @@ class MapboxTerrain extends GlobusTerrain {
|
|
|
52
59
|
let canvas = document.createElement("canvas");
|
|
53
60
|
canvas.width = size;
|
|
54
61
|
canvas.height = size;
|
|
55
|
-
return canvas.getContext("2d"
|
|
62
|
+
return canvas.getContext("2d",
|
|
63
|
+
{
|
|
64
|
+
willReadFrequently: true
|
|
65
|
+
});
|
|
56
66
|
}
|
|
57
67
|
|
|
58
|
-
_createHeights(data, tileIndex, tileX, tileY, tileZoom, extent) {
|
|
59
|
-
const SIZE = data.width;
|
|
68
|
+
_createHeights(data, tileIndex, tileX, tileY, tileZoom, extent, preventChildren) {
|
|
60
69
|
|
|
61
|
-
this._ctx.clearRect(0, 0,
|
|
70
|
+
this._ctx.clearRect(0, 0, this._imageSize, this._imageSize);
|
|
62
71
|
this._ctx.drawImage(data, 0, 0);
|
|
63
|
-
let rgbaData = this._ctx.getImageData(0, 0,
|
|
72
|
+
let rgbaData = this._ctx.getImageData(0, 0, this._imageSize, this._imageSize).data;
|
|
73
|
+
|
|
74
|
+
const SIZE = data.width;
|
|
64
75
|
|
|
65
76
|
//
|
|
66
77
|
//Non power of two images
|
|
@@ -71,25 +82,42 @@ class MapboxTerrain extends GlobusTerrain {
|
|
|
71
82
|
return outCurrenElevations;
|
|
72
83
|
}
|
|
73
84
|
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
85
|
+
if (this._imageSize === this.plainGridSize) {
|
|
86
|
+
let elevationsSize = (this.plainGridSize + 1) * (this.plainGridSize + 1);
|
|
87
|
+
let outCurrenElevations = new Float32Array(elevationsSize);
|
|
88
|
+
for (let k = 0, len = this._imageSize * this._imageSize; k < len; k++) {
|
|
89
|
+
let j = k % this._imageSize,
|
|
90
|
+
i = Math.floor(k / this._imageSize);
|
|
91
|
+
let fromInd4 = k * 4;
|
|
92
|
+
let h = rgb2Height(rgbaData[fromInd4], rgbaData[fromInd4 + 1], rgbaData[fromInd4 + 2]);
|
|
93
|
+
outCurrenElevations[i * (this._imageSize + 1) + j] = h;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
for (let i = 0, len = this._imageSize; i < len; i++) {
|
|
97
|
+
let j = this._imageSize - 1;
|
|
98
|
+
let fromInd4 = (i * this._imageSize + j) * 4;
|
|
99
|
+
let h = rgb2Height(rgbaData[fromInd4], rgbaData[fromInd4 + 1], rgbaData[fromInd4 + 2]);
|
|
100
|
+
outCurrenElevations[i * (this._imageSize + 1) + this._imageSize] = h;
|
|
101
|
+
}
|
|
78
102
|
|
|
79
|
-
|
|
103
|
+
for (let j = 0, len = this._imageSize; j < len; j++) {
|
|
104
|
+
let i = this._imageSize - 1;
|
|
105
|
+
let fromInd4 = (i * this._imageSize + j) * 4;
|
|
106
|
+
let h = rgb2Height(rgbaData[fromInd4], rgbaData[fromInd4 + 1], rgbaData[fromInd4 + 2]);
|
|
107
|
+
outCurrenElevations[this._imageSize * (this._imageSize + 1) + j] = h;
|
|
108
|
+
}
|
|
80
109
|
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
// outCurrenElevations[i] = -10000 + 0.1 * (rgbaData[i4] * 256 * 256 + rgbaData[i4 + 1] * 256 + rgbaData[i4 + 2]);
|
|
84
|
-
// }
|
|
110
|
+
let h = rgb2Height(rgbaData[rgbaData.length - 4], rgbaData[rgbaData.length - 3], rgbaData[rgbaData.length - 2]);
|
|
111
|
+
outCurrenElevations[outCurrenElevations.length - 1] = h;
|
|
85
112
|
|
|
86
|
-
|
|
87
|
-
|
|
113
|
+
return outCurrenElevations;
|
|
114
|
+
}
|
|
88
115
|
|
|
89
116
|
//
|
|
90
117
|
// Power of two images
|
|
91
118
|
//
|
|
92
119
|
let elevationsSize = (this.plainGridSize + 1) * (this.plainGridSize + 1);
|
|
120
|
+
|
|
93
121
|
let d = SIZE / this.plainGridSize;
|
|
94
122
|
|
|
95
123
|
let outCurrenElevations = new Float32Array(elevationsSize);
|
|
@@ -102,40 +130,99 @@ class MapboxTerrain extends GlobusTerrain {
|
|
|
102
130
|
}
|
|
103
131
|
}
|
|
104
132
|
|
|
105
|
-
|
|
106
|
-
rgbaData,
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
133
|
+
if (preventChildren) {
|
|
134
|
+
extractElevationTilesMapboxNoChildren(rgbaData, this.noDataValues, outCurrenElevations);
|
|
135
|
+
} else {
|
|
136
|
+
extractElevationTilesMapbox(
|
|
137
|
+
rgbaData,
|
|
138
|
+
this.noDataValues,
|
|
139
|
+
outCurrenElevations,
|
|
140
|
+
outChildrenElevations
|
|
141
|
+
);
|
|
142
|
+
}
|
|
111
143
|
|
|
112
144
|
this._elevationCache[tileIndex] = {
|
|
113
145
|
heights: outCurrenElevations,
|
|
114
146
|
extent: extent//segment.getExtent()
|
|
115
147
|
};
|
|
116
148
|
|
|
117
|
-
|
|
118
|
-
for (let
|
|
119
|
-
let
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
149
|
+
if (!preventChildren) {
|
|
150
|
+
for (let i = 0; i < d; i++) {
|
|
151
|
+
for (let j = 0; j < d; j++) {
|
|
152
|
+
let x = tileX * 2 + j,
|
|
153
|
+
y = tileY * 2 + i,
|
|
154
|
+
z = tileZoom + 1;
|
|
155
|
+
let tileIndex = Layer.getTileIndex(x, y, z);
|
|
156
|
+
this._elevationCache[tileIndex] = {
|
|
157
|
+
heights: outChildrenElevations[i][j],
|
|
158
|
+
extent: getTileExtent(x, y, z)
|
|
159
|
+
};
|
|
160
|
+
}
|
|
127
161
|
}
|
|
128
162
|
}
|
|
129
163
|
|
|
130
164
|
return outCurrenElevations;
|
|
131
165
|
}
|
|
166
|
+
|
|
167
|
+
getHeightAsync(lonLat, callback, zoom) {
|
|
168
|
+
if (!lonLat || lonLat.lat > mercator.MAX_LAT || lonLat.lat < mercator.MIN_LAT) {
|
|
169
|
+
callback(0);
|
|
170
|
+
return true;
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
let z = zoom || this.maxZoom,
|
|
174
|
+
size = mercator.POLE2 / Math.pow(2, z),
|
|
175
|
+
merc = mercator.forward(lonLat),
|
|
176
|
+
x = Math.floor((mercator.POLE + merc.lon) / size),
|
|
177
|
+
y = Math.floor((mercator.POLE - merc.lat) / size);
|
|
178
|
+
|
|
179
|
+
let tileIndex = Layer.getTileIndex(x, y, z),
|
|
180
|
+
extent = mercator.getTileExtent(x, y, z);
|
|
181
|
+
|
|
182
|
+
let sizeImgW = extent.getWidth() / (this._imageSize - 1),
|
|
183
|
+
sizeImgH = extent.getHeight() / (this._imageSize - 1);
|
|
184
|
+
|
|
185
|
+
let i = this._imageSize - Math.ceil((merc.lat - extent.southWest.lat) / sizeImgH) - 1,
|
|
186
|
+
j = Math.floor((merc.lon - extent.southWest.lon) / sizeImgW);
|
|
187
|
+
let index = (i * this._imageSize + j) * 4;
|
|
188
|
+
|
|
189
|
+
if (this._imageDataCache[tileIndex]) {
|
|
190
|
+
let data = this._imageDataCache[tileIndex];
|
|
191
|
+
callback(rgb2Height(data[index], data[index + 1], data[index + 2]));
|
|
192
|
+
return true;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
if (!this._fetchCache[tileIndex]) {
|
|
196
|
+
let url = this._buildURL(x, y, z);
|
|
197
|
+
this._fetchCache[tileIndex] = this._loader.fetch({
|
|
198
|
+
src: url,
|
|
199
|
+
type: this._dataType
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
this._fetchCache[tileIndex].then((response) => {
|
|
204
|
+
if (response.status === "ready") {
|
|
205
|
+
this._ctx.clearRect(0, 0, this._imageSize, this._imageSize);
|
|
206
|
+
this._ctx.drawImage(response.data, 0, 0);
|
|
207
|
+
let data = this._ctx.getImageData(0, 0, 256, 256).data;
|
|
208
|
+
this._imageDataCache[tileIndex] = data;
|
|
209
|
+
callback(rgb2Height(data[index], data[index + 1], data[index + 2]));
|
|
210
|
+
} else if (response.status === "error") {
|
|
211
|
+
callback(0);
|
|
212
|
+
} else {
|
|
213
|
+
this._fetchCache[tileIndex] = null;
|
|
214
|
+
delete this._fetchCache[tileIndex];
|
|
215
|
+
}
|
|
216
|
+
});
|
|
217
|
+
|
|
218
|
+
return false;
|
|
219
|
+
}
|
|
132
220
|
}
|
|
133
221
|
|
|
134
222
|
function extractElevationTilesMapboxNonPowerOfTwo(rgbaData, outCurrenElevations) {
|
|
135
223
|
for (let i = 0, len = outCurrenElevations.length; i < len; i++) {
|
|
136
224
|
let i4 = i * 4;
|
|
137
|
-
outCurrenElevations[i] =
|
|
138
|
-
-10000 + 0.1 * (rgbaData[i4] * 256 * 256 + rgbaData[i4 + 1] * 256 + rgbaData[i4 + 2]);
|
|
225
|
+
outCurrenElevations[i] = rgb2Height(rgbaData[i4], rgbaData[i4 + 1], rgbaData[i4 + 2]);
|
|
139
226
|
}
|
|
140
227
|
}
|
|
141
228
|
|
|
@@ -161,8 +248,8 @@ function extractElevationTilesMapbox(
|
|
|
161
248
|
) {
|
|
162
249
|
let k4 = k * 4;
|
|
163
250
|
|
|
164
|
-
let height =
|
|
165
|
-
|
|
251
|
+
let height = rgb2Height(rgbaData[k4], rgbaData[k4 + 1], rgbaData[k4 + 2]);
|
|
252
|
+
//-10000 + 0.1 * (rgbaData[k4] * 256 * 256 + rgbaData[k4 + 1] * 256 + rgbaData[k4 + 2]);
|
|
166
253
|
|
|
167
254
|
let isNoDataCurrent = MapboxTerrain.checkNoDataValue(noDataValues, height),
|
|
168
255
|
isNoDataRight = false,
|
|
@@ -189,9 +276,8 @@ function extractElevationTilesMapbox(
|
|
|
189
276
|
|
|
190
277
|
if ((j + 1) % destSize === 0 && j !== sourceSize - 1) {
|
|
191
278
|
//current tile
|
|
192
|
-
rightHeight =
|
|
193
|
-
|
|
194
|
-
0.1 * (rgbaData[k4 + 4] * 256 * 256 + rgbaData[k4 + 5] * 256 + rgbaData[k4 + 6]);
|
|
279
|
+
rightHeight = rgb2Height(rgbaData[k4 + 4], rgbaData[k4 + 5], rgbaData[k4 + 6]);
|
|
280
|
+
// -10000 + 0.1 * (rgbaData[k4 + 4] * 256 * 256 + rgbaData[k4 + 5] * 256 + rgbaData[k4 + 6]);
|
|
195
281
|
|
|
196
282
|
isNoDataRight = MapboxTerrain.checkNoDataValue(noDataValues, rightHeight);
|
|
197
283
|
|
|
@@ -217,12 +303,8 @@ function extractElevationTilesMapbox(
|
|
|
217
303
|
//current tile
|
|
218
304
|
sourceSize4 = sourceSize * 4;
|
|
219
305
|
|
|
220
|
-
bottomHeight =
|
|
221
|
-
|
|
222
|
-
0.1 *
|
|
223
|
-
(rgbaData[k4 + sourceSize4] * 256 * 256 +
|
|
224
|
-
rgbaData[k4 + sourceSize4 + 1] * 256 +
|
|
225
|
-
rgbaData[k4 + sourceSize4 + 2]);
|
|
306
|
+
bottomHeight = rgb2Height(rgbaData[k4 + sourceSize4], rgbaData[k4 + sourceSize4 + 1], rgbaData[k4 + sourceSize4 + 2]);
|
|
307
|
+
// -10000 + 0.1 * (rgbaData[k4 + sourceSize4] * 256 * 256 + rgbaData[k4 + sourceSize4 + 1] * 256 + rgbaData[k4 + sourceSize4 + 2]);
|
|
226
308
|
|
|
227
309
|
isNoDataBottom = MapboxTerrain.checkNoDataValue(noDataValues, bottomHeight);
|
|
228
310
|
|
|
@@ -251,12 +333,8 @@ function extractElevationTilesMapbox(
|
|
|
251
333
|
i !== sourceSize - 1
|
|
252
334
|
) {
|
|
253
335
|
//current tile
|
|
254
|
-
let rightBottomHeight =
|
|
255
|
-
|
|
256
|
-
0.1 *
|
|
257
|
-
(rgbaData[k4 + sourceSize4 + 4] * 256 * 256 +
|
|
258
|
-
rgbaData[k4 + sourceSize4 + 5] * 256 +
|
|
259
|
-
rgbaData[k4 + sourceSize4 + 6]);
|
|
336
|
+
let rightBottomHeight = rgb2Height(rgbaData[k4 + sourceSize4 + 4], rgbaData[k4 + sourceSize4 + 5], rgbaData[k4 + sourceSize4 + 6]);
|
|
337
|
+
// -10000 + 0.1 * (rgbaData[k4 + sourceSize4 + 4] * 256 * 256 + rgbaData[k4 + sourceSize4 + 5] * 256 + rgbaData[k4 + sourceSize4 + 6]);
|
|
260
338
|
|
|
261
339
|
let isNoDataRightBottom = MapboxTerrain.checkNoDataValue(
|
|
262
340
|
noDataValues,
|
|
@@ -289,4 +367,105 @@ function extractElevationTilesMapbox(
|
|
|
289
367
|
}
|
|
290
368
|
}
|
|
291
369
|
|
|
370
|
+
function extractElevationTilesMapboxNoChildren(
|
|
371
|
+
rgbaData,
|
|
372
|
+
noDataValues,
|
|
373
|
+
outCurrenElevations
|
|
374
|
+
) {
|
|
375
|
+
let destSize = Math.sqrt(outCurrenElevations.length) - 1;
|
|
376
|
+
let sourceSize = Math.sqrt(rgbaData.length / 4);
|
|
377
|
+
let dt = sourceSize / destSize;
|
|
378
|
+
|
|
379
|
+
let rightHeight = 0,
|
|
380
|
+
bottomHeight = 0,
|
|
381
|
+
sourceSize4 = 0;
|
|
382
|
+
|
|
383
|
+
for (
|
|
384
|
+
let k = 0, currIndex = 0, sourceDataLength = rgbaData.length / 4;
|
|
385
|
+
k < sourceDataLength;
|
|
386
|
+
k++
|
|
387
|
+
) {
|
|
388
|
+
let k4 = k * 4;
|
|
389
|
+
|
|
390
|
+
let height = rgb2Height(rgbaData[k4], rgbaData[k4 + 1], rgbaData[k4 + 2]);
|
|
391
|
+
//-10000 + 0.1 * (rgbaData[k4] * 256 * 256 + rgbaData[k4 + 1] * 256 + rgbaData[k4 + 2]);
|
|
392
|
+
|
|
393
|
+
let isNoDataCurrent = MapboxTerrain.checkNoDataValue(noDataValues, height),
|
|
394
|
+
isNoDataRight = false,
|
|
395
|
+
isNoDataBottom = false;
|
|
396
|
+
|
|
397
|
+
let i = Math.floor(k / sourceSize),
|
|
398
|
+
j = k % sourceSize;
|
|
399
|
+
|
|
400
|
+
let tileX = Math.floor(j / destSize),
|
|
401
|
+
tileY = Math.floor(i / destSize);
|
|
402
|
+
|
|
403
|
+
if ((i + tileY) % dt === 0 && (j + tileX) % dt === 0) {
|
|
404
|
+
outCurrenElevations[currIndex++] = height;
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
if ((j + 1) % destSize === 0 && j !== sourceSize - 1) {
|
|
408
|
+
//current tile
|
|
409
|
+
rightHeight = rgb2Height(rgbaData[k4 + 4], rgbaData[k4 + 5], rgbaData[k4 + 6]);
|
|
410
|
+
//-10000 + 0.1 * (rgbaData[k4 + 4] * 256 * 256 + rgbaData[k4 + 5] * 256 + rgbaData[k4 + 6]);
|
|
411
|
+
|
|
412
|
+
isNoDataRight = MapboxTerrain.checkNoDataValue(noDataValues, rightHeight);
|
|
413
|
+
|
|
414
|
+
let middleHeight = height;
|
|
415
|
+
|
|
416
|
+
if (!(isNoDataCurrent || isNoDataRight)) {
|
|
417
|
+
middleHeight = (height + rightHeight) * 0.5;
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
if ((i + tileY) % dt === 0) {
|
|
421
|
+
outCurrenElevations[currIndex++] = middleHeight;
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
|
|
425
|
+
if ((i + 1) % destSize === 0 && i !== sourceSize - 1) {
|
|
426
|
+
//current tile
|
|
427
|
+
sourceSize4 = sourceSize * 4;
|
|
428
|
+
|
|
429
|
+
bottomHeight = rgb2Height(rgbaData[k4 + sourceSize4], rgbaData[k4 + sourceSize4 + 1], rgbaData[k4 + sourceSize4 + 2]);
|
|
430
|
+
// -10000 + 0.1 * (rgbaData[k4 + sourceSize4] * 256 * 256 + rgbaData[k4 + sourceSize4 + 1] * 256 + rgbaData[k4 + sourceSize4 + 2]);
|
|
431
|
+
|
|
432
|
+
isNoDataBottom = MapboxTerrain.checkNoDataValue(noDataValues, bottomHeight);
|
|
433
|
+
|
|
434
|
+
let middleHeight = (height + bottomHeight) * 0.5;
|
|
435
|
+
|
|
436
|
+
if (!(isNoDataCurrent || isNoDataBottom)) {
|
|
437
|
+
middleHeight = (height + bottomHeight) * 0.5;
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
if ((j + tileX) % dt === 0) {
|
|
441
|
+
outCurrenElevations[currIndex++] = middleHeight;
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
if (
|
|
446
|
+
(j + 1) % destSize === 0 &&
|
|
447
|
+
j !== sourceSize - 1 &&
|
|
448
|
+
(i + 1) % destSize === 0 &&
|
|
449
|
+
i !== sourceSize - 1
|
|
450
|
+
) {
|
|
451
|
+
//current tile
|
|
452
|
+
let rightBottomHeight = rgb2Height(rgbaData[k4 + sourceSize4 + 4], rgbaData[k4 + sourceSize4 + 5], rgbaData[k4 + sourceSize4 + 6]);
|
|
453
|
+
// -10000 + 0.1 * (rgbaData[k4 + sourceSize4 + 4] * 256 * 256 + rgbaData[k4 + sourceSize4 + 5] * 256 + rgbaData[k4 + sourceSize4 + 6]);
|
|
454
|
+
|
|
455
|
+
let isNoDataRightBottom = MapboxTerrain.checkNoDataValue(
|
|
456
|
+
noDataValues,
|
|
457
|
+
rightBottomHeight
|
|
458
|
+
);
|
|
459
|
+
|
|
460
|
+
let middleHeight = height;
|
|
461
|
+
|
|
462
|
+
if (!(isNoDataCurrent || isNoDataRight || isNoDataBottom || isNoDataRightBottom)) {
|
|
463
|
+
middleHeight = (height + rightHeight + bottomHeight + rightBottomHeight) * 0.25;
|
|
464
|
+
}
|
|
465
|
+
|
|
466
|
+
outCurrenElevations[currIndex++] = middleHeight;
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
|
|
292
471
|
export { MapboxTerrain };
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
'use strict'
|
|
2
|
+
|
|
3
|
+
import { View } from './View.js';
|
|
4
|
+
import { stringTemplate } from '../utils/shared.js';
|
|
5
|
+
|
|
6
|
+
const TEMPLATE =
|
|
7
|
+
`<div class="og-button">
|
|
8
|
+
<div class="og-button-icon">{icon}</div>
|
|
9
|
+
<div class="og-button-text">{text}</div>
|
|
10
|
+
</div>`;
|
|
11
|
+
|
|
12
|
+
class Button extends View {
|
|
13
|
+
constructor(options = {}) {
|
|
14
|
+
super({
|
|
15
|
+
template: stringTemplate(TEMPLATE, {
|
|
16
|
+
icon: options.icon || "",
|
|
17
|
+
text: options.text || ""
|
|
18
|
+
}),
|
|
19
|
+
...options,
|
|
20
|
+
eventList: ["click", "mousedown", "mouseup", "touchstart", "touchend", "touchcancel", ...(options.eventList || [])]
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
this.name = options.name || "";
|
|
24
|
+
|
|
25
|
+
this.$icon;
|
|
26
|
+
this.$text;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
render(params) {
|
|
30
|
+
super.render(params);
|
|
31
|
+
this.$icon = this.select(".og-button-icon");
|
|
32
|
+
this.$text = this.select(".og-button-text");
|
|
33
|
+
this.el.__og_button__ = this;
|
|
34
|
+
this._initEvents();
|
|
35
|
+
return this;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
_initEvents() {
|
|
39
|
+
this._onMouseClick_ = this._onMouseClick.bind(this);
|
|
40
|
+
this.el.addEventListener("click", this._onMouseClick_);
|
|
41
|
+
|
|
42
|
+
this._onMouseDown_ = this._onMouseDown.bind(this);
|
|
43
|
+
this.el.addEventListener("mousedown", this._onMouseDown_);
|
|
44
|
+
|
|
45
|
+
this._onMouseUp_ = this._onMouseUp.bind(this);
|
|
46
|
+
this.el.addEventListener("mouseup", this._onMouseUp_);
|
|
47
|
+
|
|
48
|
+
this._onTouchStart_ = this._onTouchStart.bind(this);
|
|
49
|
+
this.el.addEventListener("touchstart", this._onTouchStart_);
|
|
50
|
+
|
|
51
|
+
this._onTouchEnd_ = this._onTouchEnd.bind(this);
|
|
52
|
+
this.el.addEventListener("touchend", this._onTouchEnd_);
|
|
53
|
+
|
|
54
|
+
this._onTouchCancel_ = this._onTouchCancel.bind(this);
|
|
55
|
+
this.el.addEventListener("touchcancel", this._onTouchCancel_);
|
|
56
|
+
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
_onMouseDown(e) {
|
|
60
|
+
e = e || window.event;
|
|
61
|
+
e.preventDefault();
|
|
62
|
+
this._events.dispatch(this._events.mousedown, this, e);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
_onMouseUp(e) {
|
|
66
|
+
e = e || window.event;
|
|
67
|
+
e.preventDefault();
|
|
68
|
+
this._events.dispatch(this._events.mouseup, this, e);
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
_onTouchStart(e) {
|
|
72
|
+
e = e || window.event;
|
|
73
|
+
e.preventDefault();
|
|
74
|
+
this._events.dispatch(this._events.touchstart, this, e);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
_onTouchEnd(e) {
|
|
78
|
+
e = e || window.event;
|
|
79
|
+
e.preventDefault();
|
|
80
|
+
this._events.dispatch(this._events.touchend, this, e);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
_onTouchCancel(e) {
|
|
84
|
+
e = e || window.event;
|
|
85
|
+
e.preventDefault();
|
|
86
|
+
this._events.dispatch(this._events.touchcancel, this, e);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
_onMouseClick(e) {
|
|
90
|
+
e = e || window.event;
|
|
91
|
+
e.preventDefault();
|
|
92
|
+
this._events.dispatch(this._events.click, this, e);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
remove() {
|
|
96
|
+
this._clearEvents();
|
|
97
|
+
super.remove();
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
_clearEvents() {
|
|
101
|
+
this.el.removeEventListener("click", this._onMouseClick_);
|
|
102
|
+
this._onMouseClick_ = undefined;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
export { Button }
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
import { Events } from '../Events.js';
|
|
4
|
+
|
|
5
|
+
class ButtonGroup {
|
|
6
|
+
constructor(options) {
|
|
7
|
+
this._events = new Events(["change", ...(options.eventList || [])]);
|
|
8
|
+
|
|
9
|
+
this._buttons = options.buttons
|
|
10
|
+
for (let i = 0; i < this._buttons.length; i++) {
|
|
11
|
+
this._bindButton(this._buttons[i]);
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
on(eventName, callback, sender) {
|
|
16
|
+
this._events.on(eventName, callback, sender);
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
off(eventName, callback) {
|
|
20
|
+
this._events.off(eventName, callback);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
_bindButton(button) {
|
|
24
|
+
button.on("change", this._onChange, this);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
add(button) {
|
|
28
|
+
this._buttons.push(button);
|
|
29
|
+
this._bindButton(button);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
_onChange(isActive, btn) {
|
|
33
|
+
if (isActive) {
|
|
34
|
+
btn.preventClick = true;
|
|
35
|
+
for (let i = 0; i < this._buttons.length; i++) {
|
|
36
|
+
let bi = this._buttons[i];
|
|
37
|
+
if (!bi.isEqual(btn)) {
|
|
38
|
+
bi.setActive(false);
|
|
39
|
+
bi.preventClick = false;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
this._events.dispatch(this._events.change, btn);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
remove(button) {
|
|
47
|
+
for (let i = 0; i < this._buttons.length; i++) {
|
|
48
|
+
if (this._buttons[i].isEqual(button)) {
|
|
49
|
+
this._buttons.splice(i);
|
|
50
|
+
button.off("change", this._onChange);
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export { ButtonGroup }
|