@gisatcz/deckgl-geolib 1.5.0 → 1.6.0-dev.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/dist/cjs/index.js +1225 -227
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/index.min.js +4 -4
- package/dist/cjs/index.min.js.map +1 -1
- package/dist/cjs/types/geoimage/geoimage.d.ts +4 -0
- package/dist/esm/index.js +1226 -228
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/index.min.js +4 -4
- package/dist/esm/index.min.js.map +1 -1
- package/dist/esm/types/geoimage/geoimage.d.ts +4 -0
- package/package.json +1 -1
- package/src/cogbitmaplayer/CogBitmapLayer.ts +5 -0
- package/src/geoimage/geoimage.ts +5 -1
package/dist/cjs/index.js
CHANGED
|
@@ -4,6 +4,7 @@ var core = require('@deck.gl/core');
|
|
|
4
4
|
var geoLayers = require('@deck.gl/geo-layers');
|
|
5
5
|
var layers = require('@deck.gl/layers');
|
|
6
6
|
var chroma = require('chroma-js');
|
|
7
|
+
var core$1 = require('@luma.gl/core');
|
|
7
8
|
|
|
8
9
|
/******************************************************************************
|
|
9
10
|
Copyright (c) Microsoft Corporation.
|
|
@@ -32,6 +33,1226 @@ function __awaiter(thisArg, _arguments, P, generator) {
|
|
|
32
33
|
});
|
|
33
34
|
}
|
|
34
35
|
|
|
36
|
+
function _typeof(obj) {
|
|
37
|
+
"@babel/helpers - typeof";
|
|
38
|
+
|
|
39
|
+
return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) {
|
|
40
|
+
return typeof obj;
|
|
41
|
+
} : function (obj) {
|
|
42
|
+
return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
|
|
43
|
+
}, _typeof(obj);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function _toPrimitive(input, hint) {
|
|
47
|
+
if (_typeof(input) !== "object" || input === null) return input;
|
|
48
|
+
var prim = input[Symbol.toPrimitive];
|
|
49
|
+
if (prim !== undefined) {
|
|
50
|
+
var res = prim.call(input, hint || "default");
|
|
51
|
+
if (_typeof(res) !== "object") return res;
|
|
52
|
+
throw new TypeError("@@toPrimitive must return a primitive value.");
|
|
53
|
+
}
|
|
54
|
+
return (hint === "string" ? String : Number)(input);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
function _toPropertyKey(arg) {
|
|
58
|
+
var key = _toPrimitive(arg, "string");
|
|
59
|
+
return _typeof(key) === "symbol" ? key : String(key);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function _defineProperty(obj, key, value) {
|
|
63
|
+
key = _toPropertyKey(key);
|
|
64
|
+
if (key in obj) {
|
|
65
|
+
Object.defineProperty(obj, key, {
|
|
66
|
+
value: value,
|
|
67
|
+
enumerable: true,
|
|
68
|
+
configurable: true,
|
|
69
|
+
writable: true
|
|
70
|
+
});
|
|
71
|
+
} else {
|
|
72
|
+
obj[key] = value;
|
|
73
|
+
}
|
|
74
|
+
return obj;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Common utilities
|
|
79
|
+
* @module glMatrix
|
|
80
|
+
*/
|
|
81
|
+
// Configuration Constants
|
|
82
|
+
var ARRAY_TYPE = typeof Float32Array !== 'undefined' ? Float32Array : Array;
|
|
83
|
+
if (!Math.hypot) Math.hypot = function () {
|
|
84
|
+
var y = 0,
|
|
85
|
+
i = arguments.length;
|
|
86
|
+
|
|
87
|
+
while (i--) {
|
|
88
|
+
y += arguments[i] * arguments[i];
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
return Math.sqrt(y);
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* 2 Dimensional Vector
|
|
96
|
+
* @module vec2
|
|
97
|
+
*/
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Creates a new, empty vec2
|
|
101
|
+
*
|
|
102
|
+
* @returns {vec2} a new 2D vector
|
|
103
|
+
*/
|
|
104
|
+
|
|
105
|
+
function create$2() {
|
|
106
|
+
var out = new ARRAY_TYPE(2);
|
|
107
|
+
|
|
108
|
+
if (ARRAY_TYPE != Float32Array) {
|
|
109
|
+
out[0] = 0;
|
|
110
|
+
out[1] = 0;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
return out;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Perform some operation over an array of vec2s.
|
|
117
|
+
*
|
|
118
|
+
* @param {Array} a the array of vectors to iterate over
|
|
119
|
+
* @param {Number} stride Number of elements between the start of each vec2. If 0 assumes tightly packed
|
|
120
|
+
* @param {Number} offset Number of elements to skip at the beginning of the array
|
|
121
|
+
* @param {Number} count Number of vec2s to iterate over. If 0 iterates over entire array
|
|
122
|
+
* @param {Function} fn Function to call for each vector in the array
|
|
123
|
+
* @param {Object} [arg] additional argument to pass to fn
|
|
124
|
+
* @returns {Array} a
|
|
125
|
+
* @function
|
|
126
|
+
*/
|
|
127
|
+
|
|
128
|
+
(function () {
|
|
129
|
+
var vec = create$2();
|
|
130
|
+
return function (a, stride, offset, count, fn, arg) {
|
|
131
|
+
var i, l;
|
|
132
|
+
|
|
133
|
+
if (!stride) {
|
|
134
|
+
stride = 2;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
if (!offset) {
|
|
138
|
+
offset = 0;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
if (count) {
|
|
142
|
+
l = Math.min(count * stride + offset, a.length);
|
|
143
|
+
} else {
|
|
144
|
+
l = a.length;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
for (i = offset; i < l; i += stride) {
|
|
148
|
+
vec[0] = a[i];
|
|
149
|
+
vec[1] = a[i + 1];
|
|
150
|
+
fn(vec, vec, arg);
|
|
151
|
+
a[i] = vec[0];
|
|
152
|
+
a[i + 1] = vec[1];
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
return a;
|
|
156
|
+
};
|
|
157
|
+
})();
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* 3 Dimensional Vector
|
|
161
|
+
* @module vec3
|
|
162
|
+
*/
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* Creates a new, empty vec3
|
|
166
|
+
*
|
|
167
|
+
* @returns {vec3} a new 3D vector
|
|
168
|
+
*/
|
|
169
|
+
|
|
170
|
+
function create$1() {
|
|
171
|
+
var out = new ARRAY_TYPE(3);
|
|
172
|
+
|
|
173
|
+
if (ARRAY_TYPE != Float32Array) {
|
|
174
|
+
out[0] = 0;
|
|
175
|
+
out[1] = 0;
|
|
176
|
+
out[2] = 0;
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
return out;
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Perform some operation over an array of vec3s.
|
|
183
|
+
*
|
|
184
|
+
* @param {Array} a the array of vectors to iterate over
|
|
185
|
+
* @param {Number} stride Number of elements between the start of each vec3. If 0 assumes tightly packed
|
|
186
|
+
* @param {Number} offset Number of elements to skip at the beginning of the array
|
|
187
|
+
* @param {Number} count Number of vec3s to iterate over. If 0 iterates over entire array
|
|
188
|
+
* @param {Function} fn Function to call for each vector in the array
|
|
189
|
+
* @param {Object} [arg] additional argument to pass to fn
|
|
190
|
+
* @returns {Array} a
|
|
191
|
+
* @function
|
|
192
|
+
*/
|
|
193
|
+
|
|
194
|
+
(function () {
|
|
195
|
+
var vec = create$1();
|
|
196
|
+
return function (a, stride, offset, count, fn, arg) {
|
|
197
|
+
var i, l;
|
|
198
|
+
|
|
199
|
+
if (!stride) {
|
|
200
|
+
stride = 3;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
if (!offset) {
|
|
204
|
+
offset = 0;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
if (count) {
|
|
208
|
+
l = Math.min(count * stride + offset, a.length);
|
|
209
|
+
} else {
|
|
210
|
+
l = a.length;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
for (i = offset; i < l; i += stride) {
|
|
214
|
+
vec[0] = a[i];
|
|
215
|
+
vec[1] = a[i + 1];
|
|
216
|
+
vec[2] = a[i + 2];
|
|
217
|
+
fn(vec, vec, arg);
|
|
218
|
+
a[i] = vec[0];
|
|
219
|
+
a[i + 1] = vec[1];
|
|
220
|
+
a[i + 2] = vec[2];
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
return a;
|
|
224
|
+
};
|
|
225
|
+
})();
|
|
226
|
+
|
|
227
|
+
/**
|
|
228
|
+
* 4 Dimensional Vector
|
|
229
|
+
* @module vec4
|
|
230
|
+
*/
|
|
231
|
+
|
|
232
|
+
/**
|
|
233
|
+
* Creates a new, empty vec4
|
|
234
|
+
*
|
|
235
|
+
* @returns {vec4} a new 4D vector
|
|
236
|
+
*/
|
|
237
|
+
|
|
238
|
+
function create() {
|
|
239
|
+
var out = new ARRAY_TYPE(4);
|
|
240
|
+
|
|
241
|
+
if (ARRAY_TYPE != Float32Array) {
|
|
242
|
+
out[0] = 0;
|
|
243
|
+
out[1] = 0;
|
|
244
|
+
out[2] = 0;
|
|
245
|
+
out[3] = 0;
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
return out;
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Perform some operation over an array of vec4s.
|
|
252
|
+
*
|
|
253
|
+
* @param {Array} a the array of vectors to iterate over
|
|
254
|
+
* @param {Number} stride Number of elements between the start of each vec4. If 0 assumes tightly packed
|
|
255
|
+
* @param {Number} offset Number of elements to skip at the beginning of the array
|
|
256
|
+
* @param {Number} count Number of vec4s to iterate over. If 0 iterates over entire array
|
|
257
|
+
* @param {Function} fn Function to call for each vector in the array
|
|
258
|
+
* @param {Object} [arg] additional argument to pass to fn
|
|
259
|
+
* @returns {Array} a
|
|
260
|
+
* @function
|
|
261
|
+
*/
|
|
262
|
+
|
|
263
|
+
(function () {
|
|
264
|
+
var vec = create();
|
|
265
|
+
return function (a, stride, offset, count, fn, arg) {
|
|
266
|
+
var i, l;
|
|
267
|
+
|
|
268
|
+
if (!stride) {
|
|
269
|
+
stride = 4;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
if (!offset) {
|
|
273
|
+
offset = 0;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
if (count) {
|
|
277
|
+
l = Math.min(count * stride + offset, a.length);
|
|
278
|
+
} else {
|
|
279
|
+
l = a.length;
|
|
280
|
+
}
|
|
281
|
+
|
|
282
|
+
for (i = offset; i < l; i += stride) {
|
|
283
|
+
vec[0] = a[i];
|
|
284
|
+
vec[1] = a[i + 1];
|
|
285
|
+
vec[2] = a[i + 2];
|
|
286
|
+
vec[3] = a[i + 3];
|
|
287
|
+
fn(vec, vec, arg);
|
|
288
|
+
a[i] = vec[0];
|
|
289
|
+
a[i + 1] = vec[1];
|
|
290
|
+
a[i + 2] = vec[2];
|
|
291
|
+
a[i + 3] = vec[3];
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
return a;
|
|
295
|
+
};
|
|
296
|
+
})();
|
|
297
|
+
|
|
298
|
+
function joinLayerBounds(layers, viewport) {
|
|
299
|
+
const bounds = [Infinity, Infinity, -Infinity, -Infinity];
|
|
300
|
+
|
|
301
|
+
for (const layer of layers) {
|
|
302
|
+
const layerBounds = layer.getBounds();
|
|
303
|
+
|
|
304
|
+
if (layerBounds) {
|
|
305
|
+
const bottomLeftCommon = layer.projectPosition(layerBounds[0], {
|
|
306
|
+
viewport,
|
|
307
|
+
autoOffset: false
|
|
308
|
+
});
|
|
309
|
+
const topRightCommon = layer.projectPosition(layerBounds[1], {
|
|
310
|
+
viewport,
|
|
311
|
+
autoOffset: false
|
|
312
|
+
});
|
|
313
|
+
bounds[0] = Math.min(bounds[0], bottomLeftCommon[0]);
|
|
314
|
+
bounds[1] = Math.min(bounds[1], bottomLeftCommon[1]);
|
|
315
|
+
bounds[2] = Math.max(bounds[2], topRightCommon[0]);
|
|
316
|
+
bounds[3] = Math.max(bounds[3], topRightCommon[1]);
|
|
317
|
+
}
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
if (Number.isFinite(bounds[0])) {
|
|
321
|
+
return bounds;
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
return null;
|
|
325
|
+
}
|
|
326
|
+
const MAX_VIEWPORT_SIZE = 2048;
|
|
327
|
+
function makeViewport(opts) {
|
|
328
|
+
const {
|
|
329
|
+
bounds,
|
|
330
|
+
viewport,
|
|
331
|
+
border = 0
|
|
332
|
+
} = opts;
|
|
333
|
+
const {
|
|
334
|
+
isGeospatial
|
|
335
|
+
} = viewport;
|
|
336
|
+
|
|
337
|
+
if (bounds[2] <= bounds[0] || bounds[3] <= bounds[1]) {
|
|
338
|
+
return null;
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
const centerWorld = viewport.unprojectPosition([(bounds[0] + bounds[2]) / 2, (bounds[1] + bounds[3]) / 2, 0]);
|
|
342
|
+
let {
|
|
343
|
+
width,
|
|
344
|
+
height,
|
|
345
|
+
zoom
|
|
346
|
+
} = opts;
|
|
347
|
+
|
|
348
|
+
if (zoom === undefined) {
|
|
349
|
+
width = width - border * 2;
|
|
350
|
+
height = height - border * 2;
|
|
351
|
+
const scale = Math.min(width / (bounds[2] - bounds[0]), height / (bounds[3] - bounds[1]));
|
|
352
|
+
zoom = Math.min(Math.log2(scale), 20);
|
|
353
|
+
} else if (!width || !height) {
|
|
354
|
+
const scale = 2 ** zoom;
|
|
355
|
+
width = Math.round(Math.abs(bounds[2] - bounds[0]) * scale);
|
|
356
|
+
height = Math.round(Math.abs(bounds[3] - bounds[1]) * scale);
|
|
357
|
+
const maxSize = MAX_VIEWPORT_SIZE - border * 2;
|
|
358
|
+
|
|
359
|
+
if (width > maxSize || height > maxSize) {
|
|
360
|
+
const r = maxSize / Math.max(width, height);
|
|
361
|
+
width = Math.round(width * r);
|
|
362
|
+
height = Math.round(height * r);
|
|
363
|
+
zoom += Math.log2(r);
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
return isGeospatial ? new core.WebMercatorViewport({
|
|
368
|
+
id: viewport.id,
|
|
369
|
+
x: border,
|
|
370
|
+
y: border,
|
|
371
|
+
width,
|
|
372
|
+
height,
|
|
373
|
+
longitude: centerWorld[0],
|
|
374
|
+
latitude: centerWorld[1],
|
|
375
|
+
zoom,
|
|
376
|
+
orthographic: true
|
|
377
|
+
}) : new core.OrthographicViewport({
|
|
378
|
+
id: viewport.id,
|
|
379
|
+
x: border,
|
|
380
|
+
y: border,
|
|
381
|
+
width,
|
|
382
|
+
height,
|
|
383
|
+
target: centerWorld,
|
|
384
|
+
zoom,
|
|
385
|
+
flipY: false
|
|
386
|
+
});
|
|
387
|
+
}
|
|
388
|
+
function getViewportBounds(viewport, zRange) {
|
|
389
|
+
let viewportBoundsWorld;
|
|
390
|
+
|
|
391
|
+
if (zRange && zRange.length === 2) {
|
|
392
|
+
const [minZ, maxZ] = zRange;
|
|
393
|
+
const bounds0 = viewport.getBounds({
|
|
394
|
+
z: minZ
|
|
395
|
+
});
|
|
396
|
+
const bounds1 = viewport.getBounds({
|
|
397
|
+
z: maxZ
|
|
398
|
+
});
|
|
399
|
+
viewportBoundsWorld = [Math.min(bounds0[0], bounds1[0]), Math.min(bounds0[1], bounds1[1]), Math.max(bounds0[2], bounds1[2]), Math.max(bounds0[3], bounds1[3])];
|
|
400
|
+
} else {
|
|
401
|
+
viewportBoundsWorld = viewport.getBounds();
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
const viewportBottomLeftCommon = viewport.projectPosition(viewportBoundsWorld.slice(0, 2));
|
|
405
|
+
const viewportTopRightCommon = viewport.projectPosition(viewportBoundsWorld.slice(2, 4));
|
|
406
|
+
return [viewportBottomLeftCommon[0], viewportBottomLeftCommon[1], viewportTopRightCommon[0], viewportTopRightCommon[1]];
|
|
407
|
+
}
|
|
408
|
+
function getRenderBounds(layerBounds, viewport, zRange) {
|
|
409
|
+
if (!layerBounds) {
|
|
410
|
+
return [0, 0, 1, 1];
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
const viewportBounds = getViewportBounds(viewport, zRange);
|
|
414
|
+
const paddedBounds = doubleBounds(viewportBounds);
|
|
415
|
+
|
|
416
|
+
if (layerBounds[2] - layerBounds[0] <= paddedBounds[2] - paddedBounds[0] && layerBounds[3] - layerBounds[1] <= paddedBounds[3] - paddedBounds[1]) {
|
|
417
|
+
return layerBounds;
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
return [Math.max(layerBounds[0], paddedBounds[0]), Math.max(layerBounds[1], paddedBounds[1]), Math.min(layerBounds[2], paddedBounds[2]), Math.min(layerBounds[3], paddedBounds[3])];
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
function doubleBounds(bounds) {
|
|
424
|
+
const dx = bounds[2] - bounds[0];
|
|
425
|
+
const dy = bounds[3] - bounds[1];
|
|
426
|
+
const centerX = (bounds[0] + bounds[2]) / 2;
|
|
427
|
+
const centerY = (bounds[1] + bounds[3]) / 2;
|
|
428
|
+
return [centerX - dx, centerY - dy, centerX + dx, centerY + dy];
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
const TERRAIN_MODE = {
|
|
432
|
+
NONE: 0,
|
|
433
|
+
WRITE_HEIGHT_MAP: 1,
|
|
434
|
+
USE_HEIGHT_MAP: 2,
|
|
435
|
+
USE_COVER: 3,
|
|
436
|
+
USE_COVER_ONLY: 4,
|
|
437
|
+
SKIP: 5
|
|
438
|
+
};
|
|
439
|
+
const TERRAIN_MODE_CONSTANTS = Object.keys(TERRAIN_MODE).map(key => "const float TERRAIN_MODE_".concat(key, " = ").concat(TERRAIN_MODE[key], ".0;")).join('\n');
|
|
440
|
+
const terrainModule = {
|
|
441
|
+
name: 'terrain',
|
|
442
|
+
dependencies: [core.project],
|
|
443
|
+
inject: {
|
|
444
|
+
'vs:#decl': "\nuniform float terrain_mode;\nuniform sampler2D terrain_map;\nuniform vec4 terrain_bounds;\nvarying vec3 commonPos;\n".concat(TERRAIN_MODE_CONSTANTS, "\n "),
|
|
445
|
+
'vs:#main-start': "\nif (terrain_mode == TERRAIN_MODE_SKIP) {\n gl_Position = vec4(0.0);\n return;\n}\n",
|
|
446
|
+
'vs:DECKGL_FILTER_GL_POSITION': "\ncommonPos = geometry.position.xyz;\nif (terrain_mode == TERRAIN_MODE_WRITE_HEIGHT_MAP) {\n vec2 texCoords = (commonPos.xy - terrain_bounds.xy) / terrain_bounds.zw;\n position = vec4(texCoords * 2.0 - 1.0, 0.0, 1.0);\n commonPos.z += project_uCommonOrigin.z;\n}\nif (terrain_mode == TERRAIN_MODE_USE_HEIGHT_MAP) {\n vec3 anchor = geometry.worldPosition;\n anchor.z = 0.0;\n vec3 anchorCommon = project_position(anchor);\n vec2 texCoords = (anchorCommon.xy - terrain_bounds.xy) / terrain_bounds.zw;\n if (texCoords.x >= 0.0 && texCoords.y >= 0.0 && texCoords.x <= 1.0 && texCoords.y <= 1.0) {\n float terrainZ = texture2D(terrain_map, texCoords).r;\n geometry.position.z += terrainZ;\n position = project_common_position_to_clipspace(geometry.position);\n }\n}\n ",
|
|
447
|
+
'fs:#decl': "\nuniform float terrain_mode;\nuniform sampler2D terrain_map;\nuniform vec4 terrain_bounds;\nvarying vec3 commonPos;\n".concat(TERRAIN_MODE_CONSTANTS, "\n "),
|
|
448
|
+
'fs:#main-start': "\nif (terrain_mode == TERRAIN_MODE_WRITE_HEIGHT_MAP) {\n gl_FragColor = vec4(commonPos.z, 0.0, 0.0, 1.0);\n return;\n}\n ",
|
|
449
|
+
'fs:DECKGL_FILTER_COLOR': "\nif ((terrain_mode == TERRAIN_MODE_USE_COVER) || (terrain_mode == TERRAIN_MODE_USE_COVER_ONLY)) {\n vec2 texCoords = (commonPos.xy - terrain_bounds.xy) / terrain_bounds.zw;\n vec4 pixel = texture2D(terrain_map, texCoords);\n if (terrain_mode == TERRAIN_MODE_USE_COVER_ONLY) {\n color = pixel;\n } else {\n // pixel is premultiplied\n color = pixel + color * (1.0 - pixel.a);\n }\n return;\n}\n "
|
|
450
|
+
},
|
|
451
|
+
getUniforms: (opts = {}, uniforms) => {
|
|
452
|
+
if ('dummyHeightMap' in opts) {
|
|
453
|
+
const {
|
|
454
|
+
drawToTerrainHeightMap,
|
|
455
|
+
heightMap,
|
|
456
|
+
heightMapBounds,
|
|
457
|
+
dummyHeightMap,
|
|
458
|
+
terrainCover,
|
|
459
|
+
useTerrainHeightMap,
|
|
460
|
+
terrainSkipRender
|
|
461
|
+
} = opts;
|
|
462
|
+
const {
|
|
463
|
+
project_uCommonOrigin
|
|
464
|
+
} = uniforms;
|
|
465
|
+
let mode = terrainSkipRender ? TERRAIN_MODE.SKIP : TERRAIN_MODE.NONE;
|
|
466
|
+
let sampler = dummyHeightMap;
|
|
467
|
+
let bounds = null;
|
|
468
|
+
|
|
469
|
+
if (drawToTerrainHeightMap) {
|
|
470
|
+
mode = TERRAIN_MODE.WRITE_HEIGHT_MAP;
|
|
471
|
+
bounds = heightMapBounds;
|
|
472
|
+
} else if (useTerrainHeightMap && heightMap) {
|
|
473
|
+
mode = TERRAIN_MODE.USE_HEIGHT_MAP;
|
|
474
|
+
sampler = heightMap;
|
|
475
|
+
bounds = heightMapBounds;
|
|
476
|
+
} else if (terrainCover) {
|
|
477
|
+
const isPicking = opts.pickingActive;
|
|
478
|
+
sampler = isPicking ? terrainCover.getPickingFramebuffer() : terrainCover.getRenderFramebuffer();
|
|
479
|
+
|
|
480
|
+
if (isPicking) {
|
|
481
|
+
mode = TERRAIN_MODE.SKIP;
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
if (sampler) {
|
|
485
|
+
mode = mode === TERRAIN_MODE.SKIP ? TERRAIN_MODE.USE_COVER_ONLY : TERRAIN_MODE.USE_COVER;
|
|
486
|
+
bounds = terrainCover.bounds;
|
|
487
|
+
} else {
|
|
488
|
+
sampler = dummyHeightMap;
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
return {
|
|
493
|
+
terrain_mode: mode,
|
|
494
|
+
terrain_map: sampler,
|
|
495
|
+
terrain_bounds: bounds ? [bounds[0] - project_uCommonOrigin[0], bounds[1] - project_uCommonOrigin[1], bounds[2] - bounds[0], bounds[3] - bounds[1]] : [0, 0, 0, 0]
|
|
496
|
+
};
|
|
497
|
+
}
|
|
498
|
+
|
|
499
|
+
return null;
|
|
500
|
+
}
|
|
501
|
+
};
|
|
502
|
+
|
|
503
|
+
function createRenderTarget(gl, opts) {
|
|
504
|
+
return new core$1.Framebuffer(gl, {
|
|
505
|
+
id: opts.id,
|
|
506
|
+
attachments: {
|
|
507
|
+
[36064]: new core$1.Texture2D(gl, { ...(opts.float && {
|
|
508
|
+
format: core$1.isWebGL2(gl) ? 34836 : 6408,
|
|
509
|
+
type: 5126
|
|
510
|
+
}),
|
|
511
|
+
mipmaps: false,
|
|
512
|
+
parameters: {
|
|
513
|
+
[10241]: 9729,
|
|
514
|
+
[10240]: 9729,
|
|
515
|
+
[10242]: 33071,
|
|
516
|
+
[10243]: 33071
|
|
517
|
+
}
|
|
518
|
+
})
|
|
519
|
+
}
|
|
520
|
+
});
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
class TerrainCover {
|
|
524
|
+
constructor(targetLayer) {
|
|
525
|
+
_defineProperty(this, "isDirty", true);
|
|
526
|
+
|
|
527
|
+
_defineProperty(this, "targetLayer", void 0);
|
|
528
|
+
|
|
529
|
+
_defineProperty(this, "renderViewport", null);
|
|
530
|
+
|
|
531
|
+
_defineProperty(this, "bounds", null);
|
|
532
|
+
|
|
533
|
+
_defineProperty(this, "fbo", void 0);
|
|
534
|
+
|
|
535
|
+
_defineProperty(this, "pickingFbo", void 0);
|
|
536
|
+
|
|
537
|
+
_defineProperty(this, "layers", []);
|
|
538
|
+
|
|
539
|
+
_defineProperty(this, "tile", void 0);
|
|
540
|
+
|
|
541
|
+
_defineProperty(this, "targetBounds", null);
|
|
542
|
+
|
|
543
|
+
_defineProperty(this, "targetBoundsCommon", null);
|
|
544
|
+
|
|
545
|
+
this.targetLayer = targetLayer;
|
|
546
|
+
this.tile = getTile(targetLayer);
|
|
547
|
+
}
|
|
548
|
+
|
|
549
|
+
get id() {
|
|
550
|
+
return this.targetLayer.id;
|
|
551
|
+
}
|
|
552
|
+
|
|
553
|
+
get isActive() {
|
|
554
|
+
return Boolean(this.targetLayer.getCurrentLayer());
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
shouldUpdate({
|
|
558
|
+
targetLayer,
|
|
559
|
+
viewport,
|
|
560
|
+
layers,
|
|
561
|
+
layerNeedsRedraw
|
|
562
|
+
}) {
|
|
563
|
+
if (targetLayer) {
|
|
564
|
+
this.targetLayer = targetLayer;
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
const sizeChanged = viewport ? this._updateViewport(viewport) : false;
|
|
568
|
+
let layersChanged = layers ? this._updateLayers(layers) : false;
|
|
569
|
+
|
|
570
|
+
if (layerNeedsRedraw) {
|
|
571
|
+
for (const id of this.layers) {
|
|
572
|
+
if (layerNeedsRedraw[id]) {
|
|
573
|
+
layersChanged = true;
|
|
574
|
+
break;
|
|
575
|
+
}
|
|
576
|
+
}
|
|
577
|
+
}
|
|
578
|
+
|
|
579
|
+
return layersChanged || sizeChanged;
|
|
580
|
+
}
|
|
581
|
+
|
|
582
|
+
_updateLayers(layers) {
|
|
583
|
+
let needsRedraw = false;
|
|
584
|
+
layers = this.tile ? getIntersectingLayers(this.tile, layers) : layers;
|
|
585
|
+
|
|
586
|
+
if (layers.length !== this.layers.length) {
|
|
587
|
+
needsRedraw = true;
|
|
588
|
+
} else {
|
|
589
|
+
for (let i = 0; i < layers.length; i++) {
|
|
590
|
+
const id = layers[i].id;
|
|
591
|
+
|
|
592
|
+
if (id !== this.layers[i]) {
|
|
593
|
+
needsRedraw = true;
|
|
594
|
+
break;
|
|
595
|
+
}
|
|
596
|
+
}
|
|
597
|
+
}
|
|
598
|
+
|
|
599
|
+
if (needsRedraw) {
|
|
600
|
+
this.layers = layers.map(layer => layer.id);
|
|
601
|
+
}
|
|
602
|
+
|
|
603
|
+
return needsRedraw;
|
|
604
|
+
}
|
|
605
|
+
|
|
606
|
+
_updateViewport(viewport) {
|
|
607
|
+
const targetLayer = this.targetLayer;
|
|
608
|
+
let shouldRedraw = false;
|
|
609
|
+
|
|
610
|
+
if (this.tile && 'boundingBox' in this.tile) {
|
|
611
|
+
if (!this.targetBounds) {
|
|
612
|
+
shouldRedraw = true;
|
|
613
|
+
this.targetBounds = this.tile.boundingBox;
|
|
614
|
+
const bottomLeftCommon = viewport.projectPosition(this.targetBounds[0]);
|
|
615
|
+
const topRightCommon = viewport.projectPosition(this.targetBounds[1]);
|
|
616
|
+
this.targetBoundsCommon = [bottomLeftCommon[0], bottomLeftCommon[1], topRightCommon[0], topRightCommon[1]];
|
|
617
|
+
}
|
|
618
|
+
} else if (this.targetBounds !== targetLayer.getBounds()) {
|
|
619
|
+
shouldRedraw = true;
|
|
620
|
+
this.targetBounds = targetLayer.getBounds();
|
|
621
|
+
this.targetBoundsCommon = joinLayerBounds([targetLayer], viewport);
|
|
622
|
+
}
|
|
623
|
+
|
|
624
|
+
if (!this.targetBoundsCommon) {
|
|
625
|
+
return false;
|
|
626
|
+
}
|
|
627
|
+
|
|
628
|
+
const newZoom = Math.ceil(viewport.zoom + 0.5);
|
|
629
|
+
|
|
630
|
+
if (this.tile) {
|
|
631
|
+
this.bounds = this.targetBoundsCommon;
|
|
632
|
+
} else {
|
|
633
|
+
var _this$renderViewport;
|
|
634
|
+
|
|
635
|
+
const oldZoom = (_this$renderViewport = this.renderViewport) === null || _this$renderViewport === void 0 ? void 0 : _this$renderViewport.zoom;
|
|
636
|
+
shouldRedraw = shouldRedraw || newZoom !== oldZoom;
|
|
637
|
+
const newBounds = getRenderBounds(this.targetBoundsCommon, viewport);
|
|
638
|
+
const oldBounds = this.bounds;
|
|
639
|
+
shouldRedraw = shouldRedraw || !oldBounds || newBounds.some((x, i) => x !== oldBounds[i]);
|
|
640
|
+
this.bounds = newBounds;
|
|
641
|
+
}
|
|
642
|
+
|
|
643
|
+
if (shouldRedraw) {
|
|
644
|
+
this.renderViewport = makeViewport({
|
|
645
|
+
bounds: this.bounds,
|
|
646
|
+
zoom: newZoom,
|
|
647
|
+
viewport
|
|
648
|
+
});
|
|
649
|
+
}
|
|
650
|
+
|
|
651
|
+
return shouldRedraw;
|
|
652
|
+
}
|
|
653
|
+
|
|
654
|
+
getRenderFramebuffer() {
|
|
655
|
+
if (!this.renderViewport || this.layers.length === 0) {
|
|
656
|
+
return null;
|
|
657
|
+
}
|
|
658
|
+
|
|
659
|
+
if (!this.fbo) {
|
|
660
|
+
this.fbo = createRenderTarget(this.targetLayer.context.gl, {
|
|
661
|
+
id: this.id
|
|
662
|
+
});
|
|
663
|
+
}
|
|
664
|
+
|
|
665
|
+
return this.fbo;
|
|
666
|
+
}
|
|
667
|
+
|
|
668
|
+
getPickingFramebuffer() {
|
|
669
|
+
if (!this.renderViewport || this.layers.length === 0 && !this.targetLayer.props.pickable) {
|
|
670
|
+
return null;
|
|
671
|
+
}
|
|
672
|
+
|
|
673
|
+
if (!this.pickingFbo) {
|
|
674
|
+
this.pickingFbo = createRenderTarget(this.targetLayer.context.gl, {
|
|
675
|
+
id: "".concat(this.id, "-picking")
|
|
676
|
+
});
|
|
677
|
+
}
|
|
678
|
+
|
|
679
|
+
return this.pickingFbo;
|
|
680
|
+
}
|
|
681
|
+
|
|
682
|
+
filterLayers(layers) {
|
|
683
|
+
return layers.filter(({
|
|
684
|
+
id
|
|
685
|
+
}) => this.layers.includes(id));
|
|
686
|
+
}
|
|
687
|
+
|
|
688
|
+
delete() {
|
|
689
|
+
const {
|
|
690
|
+
fbo,
|
|
691
|
+
pickingFbo
|
|
692
|
+
} = this;
|
|
693
|
+
|
|
694
|
+
if (fbo) {
|
|
695
|
+
fbo.texture.delete();
|
|
696
|
+
fbo.delete();
|
|
697
|
+
}
|
|
698
|
+
|
|
699
|
+
if (pickingFbo) {
|
|
700
|
+
pickingFbo.texture.delete();
|
|
701
|
+
pickingFbo.delete();
|
|
702
|
+
}
|
|
703
|
+
}
|
|
704
|
+
|
|
705
|
+
}
|
|
706
|
+
|
|
707
|
+
function getIntersectingLayers(sourceTile, layers) {
|
|
708
|
+
return layers.filter(layer => {
|
|
709
|
+
const tile = getTile(layer);
|
|
710
|
+
|
|
711
|
+
if (tile) {
|
|
712
|
+
return intersect(sourceTile.boundingBox, tile.boundingBox);
|
|
713
|
+
}
|
|
714
|
+
|
|
715
|
+
return true;
|
|
716
|
+
});
|
|
717
|
+
}
|
|
718
|
+
|
|
719
|
+
function getTile(layer) {
|
|
720
|
+
while (layer) {
|
|
721
|
+
const {
|
|
722
|
+
tile
|
|
723
|
+
} = layer.props;
|
|
724
|
+
|
|
725
|
+
if (tile) {
|
|
726
|
+
return tile;
|
|
727
|
+
}
|
|
728
|
+
|
|
729
|
+
layer = layer.parent;
|
|
730
|
+
}
|
|
731
|
+
|
|
732
|
+
return null;
|
|
733
|
+
}
|
|
734
|
+
|
|
735
|
+
function intersect(b1, b2) {
|
|
736
|
+
if (b1 && b2) {
|
|
737
|
+
return b1[0][0] < b2[1][0] && b2[0][0] < b1[1][0] && b1[0][1] < b2[1][1] && b2[0][1] < b1[1][1];
|
|
738
|
+
}
|
|
739
|
+
|
|
740
|
+
return false;
|
|
741
|
+
}
|
|
742
|
+
|
|
743
|
+
class TerrainPass extends core._LayersPass {
|
|
744
|
+
getRenderableLayers(viewport, opts) {
|
|
745
|
+
const {
|
|
746
|
+
layers
|
|
747
|
+
} = opts;
|
|
748
|
+
const result = [];
|
|
749
|
+
|
|
750
|
+
const drawParamsByIndex = this._getDrawLayerParams(viewport, opts, true);
|
|
751
|
+
|
|
752
|
+
for (let i = 0; i < layers.length; i++) {
|
|
753
|
+
const layer = layers[i];
|
|
754
|
+
|
|
755
|
+
if (!layer.isComposite && drawParamsByIndex[i].shouldDrawLayer) {
|
|
756
|
+
result.push(layer);
|
|
757
|
+
}
|
|
758
|
+
}
|
|
759
|
+
|
|
760
|
+
return result;
|
|
761
|
+
}
|
|
762
|
+
|
|
763
|
+
renderHeightMap(heightMap, opts) {
|
|
764
|
+
const target = heightMap.getRenderFramebuffer();
|
|
765
|
+
const viewport = heightMap.renderViewport;
|
|
766
|
+
|
|
767
|
+
if (!target || !viewport) {
|
|
768
|
+
return;
|
|
769
|
+
}
|
|
770
|
+
|
|
771
|
+
target.resize(viewport);
|
|
772
|
+
core$1.withParameters(this.gl, {
|
|
773
|
+
clearColor: [0, 0, 0, 0],
|
|
774
|
+
blend: true,
|
|
775
|
+
blendFunc: [1, 1],
|
|
776
|
+
blendEquation: 32776,
|
|
777
|
+
depthTest: false
|
|
778
|
+
}, () => this.render({ ...opts,
|
|
779
|
+
target,
|
|
780
|
+
pass: 'terrain-height-map',
|
|
781
|
+
layers: opts.layers,
|
|
782
|
+
viewports: [viewport],
|
|
783
|
+
effects: []
|
|
784
|
+
}));
|
|
785
|
+
}
|
|
786
|
+
|
|
787
|
+
renderTerrainCover(terrainCover, opts) {
|
|
788
|
+
const target = terrainCover.getRenderFramebuffer();
|
|
789
|
+
const viewport = terrainCover.renderViewport;
|
|
790
|
+
|
|
791
|
+
if (!target || !viewport) {
|
|
792
|
+
return;
|
|
793
|
+
}
|
|
794
|
+
|
|
795
|
+
const layers = terrainCover.filterLayers(opts.layers);
|
|
796
|
+
target.resize(viewport);
|
|
797
|
+
core$1.withParameters(this.gl, {
|
|
798
|
+
depthTest: false
|
|
799
|
+
}, () => this.render({ ...opts,
|
|
800
|
+
target,
|
|
801
|
+
pass: "terrain-cover-".concat(terrainCover.id),
|
|
802
|
+
layers,
|
|
803
|
+
effects: [],
|
|
804
|
+
viewports: [viewport]
|
|
805
|
+
}));
|
|
806
|
+
}
|
|
807
|
+
|
|
808
|
+
}
|
|
809
|
+
|
|
810
|
+
class TerrainPickingPass extends core._PickLayersPass {
|
|
811
|
+
constructor(...args) {
|
|
812
|
+
super(...args);
|
|
813
|
+
|
|
814
|
+
_defineProperty(this, "drawParameters", {});
|
|
815
|
+
}
|
|
816
|
+
|
|
817
|
+
getRenderableLayers(viewport, opts) {
|
|
818
|
+
const {
|
|
819
|
+
layers
|
|
820
|
+
} = opts;
|
|
821
|
+
const result = [];
|
|
822
|
+
this.drawParameters = {};
|
|
823
|
+
|
|
824
|
+
this._resetColorEncoder(opts.pickZ);
|
|
825
|
+
|
|
826
|
+
const drawParamsByIndex = this._getDrawLayerParams(viewport, opts);
|
|
827
|
+
|
|
828
|
+
for (let i = 0; i < layers.length; i++) {
|
|
829
|
+
const layer = layers[i];
|
|
830
|
+
|
|
831
|
+
if (!layer.isComposite && drawParamsByIndex[i].shouldDrawLayer) {
|
|
832
|
+
result.push(layer);
|
|
833
|
+
this.drawParameters[layer.id] = drawParamsByIndex[i].layerParameters;
|
|
834
|
+
}
|
|
835
|
+
}
|
|
836
|
+
|
|
837
|
+
return result;
|
|
838
|
+
}
|
|
839
|
+
|
|
840
|
+
renderTerrainCover(terrainCover, opts) {
|
|
841
|
+
const target = terrainCover.getPickingFramebuffer();
|
|
842
|
+
const viewport = terrainCover.renderViewport;
|
|
843
|
+
|
|
844
|
+
if (!target || !viewport) {
|
|
845
|
+
return;
|
|
846
|
+
}
|
|
847
|
+
|
|
848
|
+
const layers = terrainCover.filterLayers(opts.layers);
|
|
849
|
+
const terrainLayer = terrainCover.targetLayer;
|
|
850
|
+
|
|
851
|
+
if (terrainLayer.props.pickable) {
|
|
852
|
+
layers.unshift(terrainLayer);
|
|
853
|
+
}
|
|
854
|
+
|
|
855
|
+
target.resize(viewport);
|
|
856
|
+
core$1.withParameters(this.gl, {
|
|
857
|
+
depthTest: false
|
|
858
|
+
}, () => this.render({ ...opts,
|
|
859
|
+
pickingFBO: target,
|
|
860
|
+
pass: "terrain-cover-picking-".concat(terrainCover.id),
|
|
861
|
+
layers,
|
|
862
|
+
effects: [],
|
|
863
|
+
viewports: [viewport],
|
|
864
|
+
cullRect: undefined,
|
|
865
|
+
deviceRect: viewport,
|
|
866
|
+
pickZ: false
|
|
867
|
+
}));
|
|
868
|
+
}
|
|
869
|
+
|
|
870
|
+
getLayerParameters(layer, layerIndex, viewport) {
|
|
871
|
+
if (this.drawParameters[layer.id]) {
|
|
872
|
+
return this.drawParameters[layer.id];
|
|
873
|
+
}
|
|
874
|
+
|
|
875
|
+
const parameters = super.getLayerParameters(layer, layerIndex, viewport);
|
|
876
|
+
parameters.blend = true;
|
|
877
|
+
return parameters;
|
|
878
|
+
}
|
|
879
|
+
|
|
880
|
+
}
|
|
881
|
+
|
|
882
|
+
const MAP_MAX_SIZE = 2048;
|
|
883
|
+
class HeightMapBuilder {
|
|
884
|
+
static isSupported(gl) {
|
|
885
|
+
return core$1.Framebuffer.isSupported(gl, {
|
|
886
|
+
colorBufferFloat: true
|
|
887
|
+
});
|
|
888
|
+
}
|
|
889
|
+
|
|
890
|
+
constructor(gl) {
|
|
891
|
+
_defineProperty(this, "renderViewport", null);
|
|
892
|
+
|
|
893
|
+
_defineProperty(this, "bounds", null);
|
|
894
|
+
|
|
895
|
+
_defineProperty(this, "fbo", void 0);
|
|
896
|
+
|
|
897
|
+
_defineProperty(this, "gl", void 0);
|
|
898
|
+
|
|
899
|
+
_defineProperty(this, "layers", []);
|
|
900
|
+
|
|
901
|
+
_defineProperty(this, "layersBounds", []);
|
|
902
|
+
|
|
903
|
+
_defineProperty(this, "layersBoundsCommon", null);
|
|
904
|
+
|
|
905
|
+
_defineProperty(this, "lastViewport", null);
|
|
906
|
+
|
|
907
|
+
this.gl = gl;
|
|
908
|
+
}
|
|
909
|
+
|
|
910
|
+
getRenderFramebuffer() {
|
|
911
|
+
if (!this.renderViewport) {
|
|
912
|
+
return null;
|
|
913
|
+
}
|
|
914
|
+
|
|
915
|
+
if (!this.fbo) {
|
|
916
|
+
this.fbo = createRenderTarget(this.gl, {
|
|
917
|
+
id: 'height-map',
|
|
918
|
+
float: true
|
|
919
|
+
});
|
|
920
|
+
}
|
|
921
|
+
|
|
922
|
+
return this.fbo;
|
|
923
|
+
}
|
|
924
|
+
|
|
925
|
+
shouldUpdate({
|
|
926
|
+
layers,
|
|
927
|
+
viewport
|
|
928
|
+
}) {
|
|
929
|
+
const layersChanged = layers.length !== this.layers.length || layers.some((layer, i) => layer !== this.layers[i] || layer.props.transitions || layer.getBounds() !== this.layersBounds[i]);
|
|
930
|
+
|
|
931
|
+
if (layersChanged) {
|
|
932
|
+
this.layers = layers;
|
|
933
|
+
this.layersBounds = layers.map(layer => layer.getBounds());
|
|
934
|
+
this.layersBoundsCommon = joinLayerBounds(layers, viewport);
|
|
935
|
+
}
|
|
936
|
+
|
|
937
|
+
const viewportChanged = !this.lastViewport || !viewport.equals(this.lastViewport);
|
|
938
|
+
|
|
939
|
+
if (!this.layersBoundsCommon) {
|
|
940
|
+
this.renderViewport = null;
|
|
941
|
+
} else if (layersChanged || viewportChanged) {
|
|
942
|
+
const bounds = getRenderBounds(this.layersBoundsCommon, viewport);
|
|
943
|
+
|
|
944
|
+
if (bounds[2] <= bounds[0] || bounds[3] <= bounds[1]) {
|
|
945
|
+
this.renderViewport = null;
|
|
946
|
+
return false;
|
|
947
|
+
}
|
|
948
|
+
|
|
949
|
+
this.bounds = bounds;
|
|
950
|
+
this.lastViewport = viewport;
|
|
951
|
+
const scale = viewport.scale;
|
|
952
|
+
const pixelWidth = (bounds[2] - bounds[0]) * scale;
|
|
953
|
+
const pixelHeight = (bounds[3] - bounds[1]) * scale;
|
|
954
|
+
this.renderViewport = pixelWidth > 0 || pixelHeight > 0 ? makeViewport({
|
|
955
|
+
bounds: [viewport.center[0] - 1, viewport.center[1] - 1, viewport.center[0] + 1, viewport.center[1] + 1],
|
|
956
|
+
zoom: viewport.zoom,
|
|
957
|
+
width: Math.min(pixelWidth, MAP_MAX_SIZE),
|
|
958
|
+
height: Math.min(pixelHeight, MAP_MAX_SIZE),
|
|
959
|
+
viewport
|
|
960
|
+
}) : null;
|
|
961
|
+
return true;
|
|
962
|
+
}
|
|
963
|
+
|
|
964
|
+
return false;
|
|
965
|
+
}
|
|
966
|
+
|
|
967
|
+
delete() {
|
|
968
|
+
if (this.fbo) {
|
|
969
|
+
this.fbo.color.delete();
|
|
970
|
+
this.fbo.delete();
|
|
971
|
+
}
|
|
972
|
+
}
|
|
973
|
+
|
|
974
|
+
}
|
|
975
|
+
|
|
976
|
+
class TerrainEffect {
|
|
977
|
+
constructor() {
|
|
978
|
+
_defineProperty(this, "id", 'terrain-effect');
|
|
979
|
+
|
|
980
|
+
_defineProperty(this, "props", null);
|
|
981
|
+
|
|
982
|
+
_defineProperty(this, "useInPicking", true);
|
|
983
|
+
|
|
984
|
+
_defineProperty(this, "isPicking", false);
|
|
985
|
+
|
|
986
|
+
_defineProperty(this, "isDrapingEnabled", false);
|
|
987
|
+
|
|
988
|
+
_defineProperty(this, "dummyHeightMap", void 0);
|
|
989
|
+
|
|
990
|
+
_defineProperty(this, "heightMap", void 0);
|
|
991
|
+
|
|
992
|
+
_defineProperty(this, "terrainPass", void 0);
|
|
993
|
+
|
|
994
|
+
_defineProperty(this, "terrainPickingPass", void 0);
|
|
995
|
+
|
|
996
|
+
_defineProperty(this, "terrainCovers", new Map());
|
|
997
|
+
}
|
|
998
|
+
|
|
999
|
+
initialize(gl) {
|
|
1000
|
+
this.dummyHeightMap = new core$1.Texture2D(gl, {
|
|
1001
|
+
width: 1,
|
|
1002
|
+
height: 1,
|
|
1003
|
+
data: new Uint8Array([0, 0, 0, 0])
|
|
1004
|
+
});
|
|
1005
|
+
this.terrainPass = new TerrainPass(gl, {
|
|
1006
|
+
id: 'terrain'
|
|
1007
|
+
});
|
|
1008
|
+
this.terrainPickingPass = new TerrainPickingPass(gl, {
|
|
1009
|
+
id: 'terrain-picking'
|
|
1010
|
+
});
|
|
1011
|
+
|
|
1012
|
+
if (HeightMapBuilder.isSupported(gl)) {
|
|
1013
|
+
this.heightMap = new HeightMapBuilder(gl);
|
|
1014
|
+
} else {
|
|
1015
|
+
core.log.warn('Terrain offset mode is not supported by this browser')();
|
|
1016
|
+
}
|
|
1017
|
+
|
|
1018
|
+
core$1.ProgramManager.getDefaultProgramManager(gl).addDefaultModule(terrainModule);
|
|
1019
|
+
}
|
|
1020
|
+
|
|
1021
|
+
preRender(gl, opts) {
|
|
1022
|
+
if (!this.dummyHeightMap) {
|
|
1023
|
+
this.initialize(gl);
|
|
1024
|
+
|
|
1025
|
+
for (const layer of opts.layers) {
|
|
1026
|
+
if (layer.props.operation.includes('terrain')) {
|
|
1027
|
+
layer.setChangeFlags({
|
|
1028
|
+
extensionsChanged: true
|
|
1029
|
+
});
|
|
1030
|
+
}
|
|
1031
|
+
}
|
|
1032
|
+
}
|
|
1033
|
+
|
|
1034
|
+
if (opts.pickZ) {
|
|
1035
|
+
this.isDrapingEnabled = false;
|
|
1036
|
+
return;
|
|
1037
|
+
}
|
|
1038
|
+
|
|
1039
|
+
const {
|
|
1040
|
+
viewports,
|
|
1041
|
+
isPicking = false
|
|
1042
|
+
} = opts;
|
|
1043
|
+
this.isPicking = isPicking;
|
|
1044
|
+
this.isDrapingEnabled = true;
|
|
1045
|
+
const viewport = viewports[0];
|
|
1046
|
+
const layers = (isPicking ? this.terrainPickingPass : this.terrainPass).getRenderableLayers(viewport, opts);
|
|
1047
|
+
const terrainLayers = layers.filter(l => l.props.operation.includes('terrain'));
|
|
1048
|
+
|
|
1049
|
+
if (terrainLayers.length === 0) {
|
|
1050
|
+
return;
|
|
1051
|
+
}
|
|
1052
|
+
|
|
1053
|
+
if (!isPicking) {
|
|
1054
|
+
const offsetLayers = layers.filter(l => l.state.terrainDrawMode === 'offset');
|
|
1055
|
+
|
|
1056
|
+
if (offsetLayers.length > 0) {
|
|
1057
|
+
this._updateHeightMap(terrainLayers, viewport, opts);
|
|
1058
|
+
}
|
|
1059
|
+
}
|
|
1060
|
+
|
|
1061
|
+
const drapeLayers = layers.filter(l => l.state.terrainDrawMode === 'drape');
|
|
1062
|
+
|
|
1063
|
+
this._updateTerrainCovers(terrainLayers, drapeLayers, viewport, opts);
|
|
1064
|
+
}
|
|
1065
|
+
|
|
1066
|
+
getModuleParameters(layer) {
|
|
1067
|
+
var _this$heightMap, _this$heightMap2;
|
|
1068
|
+
|
|
1069
|
+
const {
|
|
1070
|
+
terrainDrawMode
|
|
1071
|
+
} = layer.state;
|
|
1072
|
+
return {
|
|
1073
|
+
heightMap: (_this$heightMap = this.heightMap) === null || _this$heightMap === void 0 ? void 0 : _this$heightMap.getRenderFramebuffer(),
|
|
1074
|
+
heightMapBounds: (_this$heightMap2 = this.heightMap) === null || _this$heightMap2 === void 0 ? void 0 : _this$heightMap2.bounds,
|
|
1075
|
+
dummyHeightMap: this.dummyHeightMap,
|
|
1076
|
+
terrainCover: this.isDrapingEnabled ? this.terrainCovers.get(layer.id) : null,
|
|
1077
|
+
useTerrainHeightMap: terrainDrawMode === 'offset',
|
|
1078
|
+
terrainSkipRender: terrainDrawMode === 'drape' || !layer.props.operation.includes('draw')
|
|
1079
|
+
};
|
|
1080
|
+
}
|
|
1081
|
+
|
|
1082
|
+
cleanup() {
|
|
1083
|
+
if (this.dummyHeightMap) {
|
|
1084
|
+
this.dummyHeightMap.delete();
|
|
1085
|
+
this.dummyHeightMap = undefined;
|
|
1086
|
+
}
|
|
1087
|
+
|
|
1088
|
+
if (this.heightMap) {
|
|
1089
|
+
this.heightMap.delete();
|
|
1090
|
+
this.heightMap = undefined;
|
|
1091
|
+
}
|
|
1092
|
+
|
|
1093
|
+
for (const terrainCover of this.terrainCovers.values()) {
|
|
1094
|
+
terrainCover.delete();
|
|
1095
|
+
}
|
|
1096
|
+
|
|
1097
|
+
this.terrainCovers.clear();
|
|
1098
|
+
}
|
|
1099
|
+
|
|
1100
|
+
_updateHeightMap(terrainLayers, viewport, opts) {
|
|
1101
|
+
if (!this.heightMap) {
|
|
1102
|
+
return;
|
|
1103
|
+
}
|
|
1104
|
+
|
|
1105
|
+
const shouldUpdate = this.heightMap.shouldUpdate({
|
|
1106
|
+
layers: terrainLayers,
|
|
1107
|
+
viewport
|
|
1108
|
+
});
|
|
1109
|
+
|
|
1110
|
+
if (!shouldUpdate) {
|
|
1111
|
+
return;
|
|
1112
|
+
}
|
|
1113
|
+
|
|
1114
|
+
this.terrainPass.renderHeightMap(this.heightMap, { ...opts,
|
|
1115
|
+
layers: terrainLayers,
|
|
1116
|
+
moduleParameters: {
|
|
1117
|
+
heightMapBounds: this.heightMap.bounds,
|
|
1118
|
+
dummyHeightMap: this.dummyHeightMap,
|
|
1119
|
+
devicePixelRatio: 1,
|
|
1120
|
+
drawToTerrainHeightMap: true
|
|
1121
|
+
}
|
|
1122
|
+
});
|
|
1123
|
+
}
|
|
1124
|
+
|
|
1125
|
+
_updateTerrainCovers(terrainLayers, drapeLayers, viewport, opts) {
|
|
1126
|
+
const layerNeedsRedraw = {};
|
|
1127
|
+
|
|
1128
|
+
for (const layer of drapeLayers) {
|
|
1129
|
+
if (layer.state.terrainCoverNeedsRedraw) {
|
|
1130
|
+
layerNeedsRedraw[layer.id] = true;
|
|
1131
|
+
layer.state.terrainCoverNeedsRedraw = false;
|
|
1132
|
+
}
|
|
1133
|
+
}
|
|
1134
|
+
|
|
1135
|
+
for (const terrainCover of this.terrainCovers.values()) {
|
|
1136
|
+
terrainCover.isDirty = terrainCover.isDirty || terrainCover.shouldUpdate({
|
|
1137
|
+
layerNeedsRedraw
|
|
1138
|
+
});
|
|
1139
|
+
}
|
|
1140
|
+
|
|
1141
|
+
for (const layer of terrainLayers) {
|
|
1142
|
+
this._updateTerrainCover(layer, drapeLayers, viewport, opts);
|
|
1143
|
+
}
|
|
1144
|
+
|
|
1145
|
+
if (!this.isPicking) {
|
|
1146
|
+
this._pruneTerrainCovers();
|
|
1147
|
+
}
|
|
1148
|
+
}
|
|
1149
|
+
|
|
1150
|
+
_updateTerrainCover(terrainLayer, drapeLayers, viewport, opts) {
|
|
1151
|
+
const renderPass = this.isPicking ? this.terrainPickingPass : this.terrainPass;
|
|
1152
|
+
let terrainCover = this.terrainCovers.get(terrainLayer.id);
|
|
1153
|
+
|
|
1154
|
+
if (!terrainCover) {
|
|
1155
|
+
terrainCover = new TerrainCover(terrainLayer);
|
|
1156
|
+
this.terrainCovers.set(terrainLayer.id, terrainCover);
|
|
1157
|
+
}
|
|
1158
|
+
|
|
1159
|
+
try {
|
|
1160
|
+
const isDirty = terrainCover.shouldUpdate({
|
|
1161
|
+
targetLayer: terrainLayer,
|
|
1162
|
+
viewport,
|
|
1163
|
+
layers: drapeLayers
|
|
1164
|
+
});
|
|
1165
|
+
|
|
1166
|
+
if (this.isPicking || terrainCover.isDirty || isDirty) {
|
|
1167
|
+
renderPass.renderTerrainCover(terrainCover, { ...opts,
|
|
1168
|
+
layers: drapeLayers,
|
|
1169
|
+
moduleParameters: {
|
|
1170
|
+
dummyHeightMap: this.dummyHeightMap,
|
|
1171
|
+
terrainSkipRender: false,
|
|
1172
|
+
devicePixelRatio: 1
|
|
1173
|
+
}
|
|
1174
|
+
});
|
|
1175
|
+
terrainCover.isDirty = false;
|
|
1176
|
+
}
|
|
1177
|
+
} catch (err) {
|
|
1178
|
+
terrainLayer.raiseError(err, "Error rendering terrain cover ".concat(terrainCover.id));
|
|
1179
|
+
}
|
|
1180
|
+
}
|
|
1181
|
+
|
|
1182
|
+
_pruneTerrainCovers() {
|
|
1183
|
+
const idsToRemove = [];
|
|
1184
|
+
|
|
1185
|
+
for (const [id, terrainCover] of this.terrainCovers) {
|
|
1186
|
+
if (!terrainCover.isActive) {
|
|
1187
|
+
idsToRemove.push(id);
|
|
1188
|
+
}
|
|
1189
|
+
}
|
|
1190
|
+
|
|
1191
|
+
for (const id of idsToRemove) {
|
|
1192
|
+
this.terrainCovers.delete(id);
|
|
1193
|
+
}
|
|
1194
|
+
}
|
|
1195
|
+
|
|
1196
|
+
}
|
|
1197
|
+
|
|
1198
|
+
const defaultProps = {
|
|
1199
|
+
terrainDrawMode: undefined
|
|
1200
|
+
};
|
|
1201
|
+
class TerrainExtension extends core.LayerExtension {
|
|
1202
|
+
getShaders() {
|
|
1203
|
+
return {
|
|
1204
|
+
modules: [terrainModule]
|
|
1205
|
+
};
|
|
1206
|
+
}
|
|
1207
|
+
|
|
1208
|
+
initializeState() {
|
|
1209
|
+
var _this$context$deck;
|
|
1210
|
+
|
|
1211
|
+
(_this$context$deck = this.context.deck) === null || _this$context$deck === void 0 ? void 0 : _this$context$deck._addDefaultEffect(new TerrainEffect());
|
|
1212
|
+
}
|
|
1213
|
+
|
|
1214
|
+
updateState(params) {
|
|
1215
|
+
const {
|
|
1216
|
+
props,
|
|
1217
|
+
oldProps
|
|
1218
|
+
} = params;
|
|
1219
|
+
|
|
1220
|
+
if (this.state.terrainDrawMode && props.terrainDrawMode === oldProps.terrainDrawMode && props.extruded === oldProps.extruded) {
|
|
1221
|
+
return;
|
|
1222
|
+
}
|
|
1223
|
+
|
|
1224
|
+
let {
|
|
1225
|
+
terrainDrawMode
|
|
1226
|
+
} = props;
|
|
1227
|
+
|
|
1228
|
+
if (!terrainDrawMode) {
|
|
1229
|
+
var _this$getAttributeMan;
|
|
1230
|
+
|
|
1231
|
+
const is3d = this.props.extruded;
|
|
1232
|
+
const attributes = (_this$getAttributeMan = this.getAttributeManager()) === null || _this$getAttributeMan === void 0 ? void 0 : _this$getAttributeMan.attributes;
|
|
1233
|
+
const hasAnchor = attributes && 'instancePositions' in attributes;
|
|
1234
|
+
terrainDrawMode = is3d || hasAnchor ? 'offset' : 'drape';
|
|
1235
|
+
}
|
|
1236
|
+
|
|
1237
|
+
this.setState({
|
|
1238
|
+
terrainDrawMode
|
|
1239
|
+
});
|
|
1240
|
+
}
|
|
1241
|
+
|
|
1242
|
+
onNeedsRedraw() {
|
|
1243
|
+
const state = this.state;
|
|
1244
|
+
|
|
1245
|
+
if (state.terrainDrawMode === 'drape') {
|
|
1246
|
+
state.terrainCoverNeedsRedraw = true;
|
|
1247
|
+
}
|
|
1248
|
+
}
|
|
1249
|
+
|
|
1250
|
+
}
|
|
1251
|
+
|
|
1252
|
+
_defineProperty(TerrainExtension, "defaultProps", defaultProps);
|
|
1253
|
+
|
|
1254
|
+
_defineProperty(TerrainExtension, "extensionName", 'TerrainExtension');
|
|
1255
|
+
|
|
35
1256
|
/**
|
|
36
1257
|
* MimeType conversion for common tif image types
|
|
37
1258
|
*/
|
|
@@ -10458,227 +11679,6 @@ var jpegJs = {
|
|
|
10458
11679
|
|
|
10459
11680
|
var jpeg$1 = /*@__PURE__*/getDefaultExportFromCjs(jpegJs);
|
|
10460
11681
|
|
|
10461
|
-
/**
|
|
10462
|
-
* Common utilities
|
|
10463
|
-
* @module glMatrix
|
|
10464
|
-
*/
|
|
10465
|
-
// Configuration Constants
|
|
10466
|
-
var ARRAY_TYPE = typeof Float32Array !== 'undefined' ? Float32Array : Array;
|
|
10467
|
-
if (!Math.hypot) Math.hypot = function () {
|
|
10468
|
-
var y = 0,
|
|
10469
|
-
i = arguments.length;
|
|
10470
|
-
|
|
10471
|
-
while (i--) {
|
|
10472
|
-
y += arguments[i] * arguments[i];
|
|
10473
|
-
}
|
|
10474
|
-
|
|
10475
|
-
return Math.sqrt(y);
|
|
10476
|
-
};
|
|
10477
|
-
|
|
10478
|
-
/**
|
|
10479
|
-
* 4 Dimensional Vector
|
|
10480
|
-
* @module vec4
|
|
10481
|
-
*/
|
|
10482
|
-
|
|
10483
|
-
/**
|
|
10484
|
-
* Creates a new, empty vec4
|
|
10485
|
-
*
|
|
10486
|
-
* @returns {vec4} a new 4D vector
|
|
10487
|
-
*/
|
|
10488
|
-
|
|
10489
|
-
function create$2() {
|
|
10490
|
-
var out = new ARRAY_TYPE(4);
|
|
10491
|
-
|
|
10492
|
-
if (ARRAY_TYPE != Float32Array) {
|
|
10493
|
-
out[0] = 0;
|
|
10494
|
-
out[1] = 0;
|
|
10495
|
-
out[2] = 0;
|
|
10496
|
-
out[3] = 0;
|
|
10497
|
-
}
|
|
10498
|
-
|
|
10499
|
-
return out;
|
|
10500
|
-
}
|
|
10501
|
-
/**
|
|
10502
|
-
* Perform some operation over an array of vec4s.
|
|
10503
|
-
*
|
|
10504
|
-
* @param {Array} a the array of vectors to iterate over
|
|
10505
|
-
* @param {Number} stride Number of elements between the start of each vec4. If 0 assumes tightly packed
|
|
10506
|
-
* @param {Number} offset Number of elements to skip at the beginning of the array
|
|
10507
|
-
* @param {Number} count Number of vec4s to iterate over. If 0 iterates over entire array
|
|
10508
|
-
* @param {Function} fn Function to call for each vector in the array
|
|
10509
|
-
* @param {Object} [arg] additional argument to pass to fn
|
|
10510
|
-
* @returns {Array} a
|
|
10511
|
-
* @function
|
|
10512
|
-
*/
|
|
10513
|
-
|
|
10514
|
-
(function () {
|
|
10515
|
-
var vec = create$2();
|
|
10516
|
-
return function (a, stride, offset, count, fn, arg) {
|
|
10517
|
-
var i, l;
|
|
10518
|
-
|
|
10519
|
-
if (!stride) {
|
|
10520
|
-
stride = 4;
|
|
10521
|
-
}
|
|
10522
|
-
|
|
10523
|
-
if (!offset) {
|
|
10524
|
-
offset = 0;
|
|
10525
|
-
}
|
|
10526
|
-
|
|
10527
|
-
if (count) {
|
|
10528
|
-
l = Math.min(count * stride + offset, a.length);
|
|
10529
|
-
} else {
|
|
10530
|
-
l = a.length;
|
|
10531
|
-
}
|
|
10532
|
-
|
|
10533
|
-
for (i = offset; i < l; i += stride) {
|
|
10534
|
-
vec[0] = a[i];
|
|
10535
|
-
vec[1] = a[i + 1];
|
|
10536
|
-
vec[2] = a[i + 2];
|
|
10537
|
-
vec[3] = a[i + 3];
|
|
10538
|
-
fn(vec, vec, arg);
|
|
10539
|
-
a[i] = vec[0];
|
|
10540
|
-
a[i + 1] = vec[1];
|
|
10541
|
-
a[i + 2] = vec[2];
|
|
10542
|
-
a[i + 3] = vec[3];
|
|
10543
|
-
}
|
|
10544
|
-
|
|
10545
|
-
return a;
|
|
10546
|
-
};
|
|
10547
|
-
})();
|
|
10548
|
-
|
|
10549
|
-
/**
|
|
10550
|
-
* 2 Dimensional Vector
|
|
10551
|
-
* @module vec2
|
|
10552
|
-
*/
|
|
10553
|
-
|
|
10554
|
-
/**
|
|
10555
|
-
* Creates a new, empty vec2
|
|
10556
|
-
*
|
|
10557
|
-
* @returns {vec2} a new 2D vector
|
|
10558
|
-
*/
|
|
10559
|
-
|
|
10560
|
-
function create$1() {
|
|
10561
|
-
var out = new ARRAY_TYPE(2);
|
|
10562
|
-
|
|
10563
|
-
if (ARRAY_TYPE != Float32Array) {
|
|
10564
|
-
out[0] = 0;
|
|
10565
|
-
out[1] = 0;
|
|
10566
|
-
}
|
|
10567
|
-
|
|
10568
|
-
return out;
|
|
10569
|
-
}
|
|
10570
|
-
/**
|
|
10571
|
-
* Perform some operation over an array of vec2s.
|
|
10572
|
-
*
|
|
10573
|
-
* @param {Array} a the array of vectors to iterate over
|
|
10574
|
-
* @param {Number} stride Number of elements between the start of each vec2. If 0 assumes tightly packed
|
|
10575
|
-
* @param {Number} offset Number of elements to skip at the beginning of the array
|
|
10576
|
-
* @param {Number} count Number of vec2s to iterate over. If 0 iterates over entire array
|
|
10577
|
-
* @param {Function} fn Function to call for each vector in the array
|
|
10578
|
-
* @param {Object} [arg] additional argument to pass to fn
|
|
10579
|
-
* @returns {Array} a
|
|
10580
|
-
* @function
|
|
10581
|
-
*/
|
|
10582
|
-
|
|
10583
|
-
(function () {
|
|
10584
|
-
var vec = create$1();
|
|
10585
|
-
return function (a, stride, offset, count, fn, arg) {
|
|
10586
|
-
var i, l;
|
|
10587
|
-
|
|
10588
|
-
if (!stride) {
|
|
10589
|
-
stride = 2;
|
|
10590
|
-
}
|
|
10591
|
-
|
|
10592
|
-
if (!offset) {
|
|
10593
|
-
offset = 0;
|
|
10594
|
-
}
|
|
10595
|
-
|
|
10596
|
-
if (count) {
|
|
10597
|
-
l = Math.min(count * stride + offset, a.length);
|
|
10598
|
-
} else {
|
|
10599
|
-
l = a.length;
|
|
10600
|
-
}
|
|
10601
|
-
|
|
10602
|
-
for (i = offset; i < l; i += stride) {
|
|
10603
|
-
vec[0] = a[i];
|
|
10604
|
-
vec[1] = a[i + 1];
|
|
10605
|
-
fn(vec, vec, arg);
|
|
10606
|
-
a[i] = vec[0];
|
|
10607
|
-
a[i + 1] = vec[1];
|
|
10608
|
-
}
|
|
10609
|
-
|
|
10610
|
-
return a;
|
|
10611
|
-
};
|
|
10612
|
-
})();
|
|
10613
|
-
|
|
10614
|
-
/**
|
|
10615
|
-
* 3 Dimensional Vector
|
|
10616
|
-
* @module vec3
|
|
10617
|
-
*/
|
|
10618
|
-
|
|
10619
|
-
/**
|
|
10620
|
-
* Creates a new, empty vec3
|
|
10621
|
-
*
|
|
10622
|
-
* @returns {vec3} a new 3D vector
|
|
10623
|
-
*/
|
|
10624
|
-
|
|
10625
|
-
function create() {
|
|
10626
|
-
var out = new ARRAY_TYPE(3);
|
|
10627
|
-
|
|
10628
|
-
if (ARRAY_TYPE != Float32Array) {
|
|
10629
|
-
out[0] = 0;
|
|
10630
|
-
out[1] = 0;
|
|
10631
|
-
out[2] = 0;
|
|
10632
|
-
}
|
|
10633
|
-
|
|
10634
|
-
return out;
|
|
10635
|
-
}
|
|
10636
|
-
/**
|
|
10637
|
-
* Perform some operation over an array of vec3s.
|
|
10638
|
-
*
|
|
10639
|
-
* @param {Array} a the array of vectors to iterate over
|
|
10640
|
-
* @param {Number} stride Number of elements between the start of each vec3. If 0 assumes tightly packed
|
|
10641
|
-
* @param {Number} offset Number of elements to skip at the beginning of the array
|
|
10642
|
-
* @param {Number} count Number of vec3s to iterate over. If 0 iterates over entire array
|
|
10643
|
-
* @param {Function} fn Function to call for each vector in the array
|
|
10644
|
-
* @param {Object} [arg] additional argument to pass to fn
|
|
10645
|
-
* @returns {Array} a
|
|
10646
|
-
* @function
|
|
10647
|
-
*/
|
|
10648
|
-
|
|
10649
|
-
(function () {
|
|
10650
|
-
var vec = create();
|
|
10651
|
-
return function (a, stride, offset, count, fn, arg) {
|
|
10652
|
-
var i, l;
|
|
10653
|
-
|
|
10654
|
-
if (!stride) {
|
|
10655
|
-
stride = 3;
|
|
10656
|
-
}
|
|
10657
|
-
|
|
10658
|
-
if (!offset) {
|
|
10659
|
-
offset = 0;
|
|
10660
|
-
}
|
|
10661
|
-
|
|
10662
|
-
if (count) {
|
|
10663
|
-
l = Math.min(count * stride + offset, a.length);
|
|
10664
|
-
} else {
|
|
10665
|
-
l = a.length;
|
|
10666
|
-
}
|
|
10667
|
-
|
|
10668
|
-
for (i = offset; i < l; i += stride) {
|
|
10669
|
-
vec[0] = a[i];
|
|
10670
|
-
vec[1] = a[i + 1];
|
|
10671
|
-
vec[2] = a[i + 2];
|
|
10672
|
-
fn(vec, vec, arg);
|
|
10673
|
-
a[i] = vec[0];
|
|
10674
|
-
a[i + 1] = vec[1];
|
|
10675
|
-
a[i + 2] = vec[2];
|
|
10676
|
-
}
|
|
10677
|
-
|
|
10678
|
-
return a;
|
|
10679
|
-
};
|
|
10680
|
-
})();
|
|
10681
|
-
|
|
10682
11682
|
const PI = Math.PI;
|
|
10683
11683
|
const PI_4 = PI / 4;
|
|
10684
11684
|
const RADIANS_TO_DEGREES = 180 / PI;
|
|
@@ -14604,13 +15604,11 @@ class CogBitmapLayer extends core.CompositeLayer {
|
|
|
14604
15604
|
maxRequests: 6,
|
|
14605
15605
|
extent: this.cogTiles.cog ? this.cogTiles.getBoundsAsLatLon(this.cogTiles.cog) : null,
|
|
14606
15606
|
renderSubLayers: (props) => {
|
|
15607
|
+
var _a, _b, _c, _d, _e, _f, _g;
|
|
14607
15608
|
const { bbox: { west, south, east, north, }, } = props.tile;
|
|
14608
|
-
return new layers.BitmapLayer(props, {
|
|
14609
|
-
|
|
14610
|
-
|
|
14611
|
-
bounds: [west, south, east, north],
|
|
14612
|
-
opacity: 1, // 0.6
|
|
14613
|
-
});
|
|
15609
|
+
return new layers.BitmapLayer(props, Object.assign({ data: null, image: props.data, bounds: [west, south, east, north], opacity: 1, extensions: ((_b = (_a = this.cogTiles) === null || _a === void 0 ? void 0 : _a.options) === null || _b === void 0 ? void 0 : _b.clampToTerrain) ? [new TerrainExtension()] : [] }, (((_e = (_d = (_c = this.cogTiles) === null || _c === void 0 ? void 0 : _c.options) === null || _d === void 0 ? void 0 : _d.clampToTerrain) === null || _e === void 0 ? void 0 : _e.terrainDrawMode)
|
|
15610
|
+
? { terrainDrawMode: (_g = (_f = this.cogTiles) === null || _f === void 0 ? void 0 : _f.options) === null || _g === void 0 ? void 0 : _g.clampToTerrain.terrainDrawMode }
|
|
15611
|
+
: {})));
|
|
14614
15612
|
},
|
|
14615
15613
|
});
|
|
14616
15614
|
return layer;
|