@loaders.gl/tiles 3.4.0-alpha.3 → 3.4.0-alpha.5
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/constants.d.ts +6 -0
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +0 -1
- package/dist/dist.min.js +240 -440
- package/dist/es5/constants.js.map +1 -1
- package/dist/es5/tileset/format-i3s/i3s-pending-tiles-register.js.map +1 -1
- package/dist/es5/tileset/format-i3s/i3s-tile-manager.js.map +1 -1
- package/dist/es5/tileset/format-i3s/i3s-tileset-traverser.js.map +1 -1
- package/dist/es5/tileset/helpers/3d-tiles-options.js.map +1 -1
- package/dist/es5/tileset/helpers/bounding-volume.js.map +1 -1
- package/dist/es5/tileset/helpers/frame-state.js.map +1 -1
- package/dist/es5/tileset/helpers/i3s-lod.js.map +1 -1
- package/dist/es5/tileset/helpers/tiles-3d-lod.js.map +1 -1
- package/dist/es5/tileset/helpers/transform-utils.js.map +1 -1
- package/dist/es5/tileset/helpers/zoom.js.map +1 -1
- package/dist/es5/tileset/tile-3d.js +41 -71
- package/dist/es5/tileset/tile-3d.js.map +1 -1
- package/dist/es5/tileset/tileset-3d.js +68 -102
- package/dist/es5/tileset/tileset-3d.js.map +1 -1
- package/dist/es5/tileset/tileset-cache.js +4 -7
- package/dist/es5/tileset/tileset-cache.js.map +1 -1
- package/dist/es5/tileset/tileset-traverser.js +12 -22
- package/dist/es5/tileset/tileset-traverser.js.map +1 -1
- package/dist/es5/utils/managed-array.js.map +1 -1
- package/dist/esm/constants.js.map +1 -1
- package/dist/esm/tileset/format-i3s/i3s-pending-tiles-register.js.map +1 -1
- package/dist/esm/tileset/format-i3s/i3s-tile-manager.js.map +1 -1
- package/dist/esm/tileset/format-i3s/i3s-tileset-traverser.js.map +1 -1
- package/dist/esm/tileset/helpers/3d-tiles-options.js.map +1 -1
- package/dist/esm/tileset/helpers/bounding-volume.js.map +1 -1
- package/dist/esm/tileset/helpers/frame-state.js.map +1 -1
- package/dist/esm/tileset/helpers/i3s-lod.js.map +1 -1
- package/dist/esm/tileset/helpers/tiles-3d-lod.js.map +1 -1
- package/dist/esm/tileset/helpers/transform-utils.js.map +1 -1
- package/dist/esm/tileset/helpers/zoom.js.map +1 -1
- package/dist/esm/tileset/tile-3d.js +39 -71
- package/dist/esm/tileset/tile-3d.js.map +1 -1
- package/dist/esm/tileset/tileset-3d.js +64 -94
- package/dist/esm/tileset/tileset-3d.js.map +1 -1
- package/dist/esm/tileset/tileset-cache.js +4 -7
- package/dist/esm/tileset/tileset-cache.js.map +1 -1
- package/dist/esm/tileset/tileset-traverser.js +9 -19
- package/dist/esm/tileset/tileset-traverser.js.map +1 -1
- package/dist/esm/utils/managed-array.js.map +1 -1
- package/dist/tileset/helpers/3d-tiles-options.d.ts +3 -2
- package/dist/tileset/helpers/3d-tiles-options.d.ts.map +1 -1
- package/dist/tileset/tile-3d.d.ts +36 -21
- package/dist/tileset/tile-3d.d.ts.map +1 -1
- package/dist/tileset/tile-3d.js +58 -43
- package/dist/tileset/tileset-3d.d.ts +90 -43
- package/dist/tileset/tileset-3d.d.ts.map +1 -1
- package/dist/tileset/tileset-3d.js +108 -127
- package/dist/tileset/tileset-cache.d.ts +5 -4
- package/dist/tileset/tileset-cache.d.ts.map +1 -1
- package/dist/tileset/tileset-cache.js +4 -10
- package/dist/tileset/tileset-traverser.d.ts +32 -21
- package/dist/tileset/tileset-traverser.d.ts.map +1 -1
- package/dist/tileset/tileset-traverser.js +23 -35
- package/package.json +4 -4
- package/src/constants.ts +18 -0
- package/src/tileset/helpers/3d-tiles-options.ts +3 -1
- package/src/tileset/tile-3d.ts +70 -109
- package/src/tileset/tileset-3d.ts +178 -216
- package/src/tileset/tileset-cache.ts +20 -15
- package/src/tileset/tileset-traverser.ts +52 -68
|
@@ -3,15 +3,12 @@
|
|
|
3
3
|
// This file is derived from the Cesium code base under Apache 2 license
|
|
4
4
|
// See LICENSE.md and https://github.com/AnalyticalGraphicsInc/cesium/blob/master/LICENSE.md
|
|
5
5
|
|
|
6
|
+
import type {Tileset3D} from './tileset-3d';
|
|
7
|
+
import type {Tile3D} from './tile-3d';
|
|
6
8
|
import {DoublyLinkedList} from '../utils/doubly-linked-list';
|
|
7
9
|
|
|
8
|
-
function defined(x) {
|
|
9
|
-
return x !== undefined && x !== null;
|
|
10
|
-
}
|
|
11
|
-
|
|
12
10
|
/**
|
|
13
11
|
* Stores tiles with content loaded.
|
|
14
|
-
*
|
|
15
12
|
* @private
|
|
16
13
|
*/
|
|
17
14
|
export class TilesetCache {
|
|
@@ -27,22 +24,26 @@ export class TilesetCache {
|
|
|
27
24
|
this._trimTiles = false;
|
|
28
25
|
}
|
|
29
26
|
|
|
30
|
-
reset() {
|
|
27
|
+
reset(): void {
|
|
31
28
|
// Move sentinel node to the tail so, at the start of the frame, all tiles
|
|
32
29
|
// may be potentially replaced. Tiles are moved to the right of the sentinel
|
|
33
30
|
// when they are selected so they will not be replaced.
|
|
34
31
|
this._list.splice(this._list.tail, this._sentinel);
|
|
35
32
|
}
|
|
36
33
|
|
|
37
|
-
touch(tile) {
|
|
34
|
+
touch(tile: Tile3D): void {
|
|
38
35
|
const node = tile._cacheNode;
|
|
39
|
-
if (
|
|
36
|
+
if (node) {
|
|
40
37
|
this._list.splice(this._sentinel, node);
|
|
41
38
|
}
|
|
42
39
|
}
|
|
43
40
|
|
|
44
|
-
add(
|
|
45
|
-
|
|
41
|
+
add(
|
|
42
|
+
tileset: Tileset3D,
|
|
43
|
+
tile: Tile3D,
|
|
44
|
+
addCallback?: (tileset: Tileset3D, tile: Tile3D) => void
|
|
45
|
+
): void {
|
|
46
|
+
if (!tile._cacheNode) {
|
|
46
47
|
tile._cacheNode = this._list.add(tile);
|
|
47
48
|
|
|
48
49
|
if (addCallback) {
|
|
@@ -51,20 +52,24 @@ export class TilesetCache {
|
|
|
51
52
|
}
|
|
52
53
|
}
|
|
53
54
|
|
|
54
|
-
unloadTile(
|
|
55
|
+
unloadTile(
|
|
56
|
+
tileset: Tileset3D,
|
|
57
|
+
tile: Tile3D,
|
|
58
|
+
unloadCallback?: (tileset: Tileset3D, tile: Tile3D) => void
|
|
59
|
+
): void {
|
|
55
60
|
const node = tile._cacheNode;
|
|
56
|
-
if (!
|
|
61
|
+
if (!node) {
|
|
57
62
|
return;
|
|
58
63
|
}
|
|
59
64
|
|
|
60
65
|
this._list.remove(node);
|
|
61
|
-
tile._cacheNode =
|
|
66
|
+
tile._cacheNode = null;
|
|
62
67
|
if (unloadCallback) {
|
|
63
68
|
unloadCallback(tileset, tile);
|
|
64
69
|
}
|
|
65
70
|
}
|
|
66
71
|
|
|
67
|
-
unloadTiles(tileset, unloadCallback) {
|
|
72
|
+
unloadTiles(tileset, unloadCallback): void {
|
|
68
73
|
const trimTiles = this._trimTiles;
|
|
69
74
|
this._trimTiles = false;
|
|
70
75
|
|
|
@@ -90,7 +95,7 @@ export class TilesetCache {
|
|
|
90
95
|
}
|
|
91
96
|
}
|
|
92
97
|
|
|
93
|
-
trim() {
|
|
98
|
+
trim(): void {
|
|
94
99
|
this._trimTiles = true;
|
|
95
100
|
}
|
|
96
101
|
}
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
// loaders.gl, MIT license
|
|
2
|
+
|
|
3
|
+
import type {Tile3D} from './tile-3d';
|
|
1
4
|
import {ManagedArray} from '../utils/managed-array';
|
|
2
5
|
import {TILE_REFINEMENT} from '../constants';
|
|
3
6
|
import {FrameState} from './helpers/frame-state';
|
|
@@ -5,23 +8,13 @@ import {FrameState} from './helpers/frame-state';
|
|
|
5
8
|
export type TilesetTraverserProps = {
|
|
6
9
|
loadSiblings?: boolean;
|
|
7
10
|
skipLevelOfDetail?: boolean;
|
|
11
|
+
updateTransforms?: boolean;
|
|
8
12
|
maximumScreenSpaceError?: number;
|
|
9
13
|
onTraversalEnd?: (frameState) => any;
|
|
10
|
-
viewportTraversersMap?:
|
|
14
|
+
viewportTraversersMap?: Record<string, any>;
|
|
11
15
|
basePath?: string;
|
|
12
|
-
updateTransforms?: boolean;
|
|
13
16
|
};
|
|
14
17
|
|
|
15
|
-
// export type Props = {
|
|
16
|
-
// loadSiblings: boolean;
|
|
17
|
-
// skipLevelOfDetail: boolean;
|
|
18
|
-
// updateTransforms: boolean;
|
|
19
|
-
// maximumScreenSpaceError: number;
|
|
20
|
-
// onTraversalEnd: (frameState) => any;
|
|
21
|
-
// viewportTraversersMap: {[key: string]: any};
|
|
22
|
-
// basePath: string;
|
|
23
|
-
// };
|
|
24
|
-
|
|
25
18
|
export const DEFAULT_PROPS: Required<TilesetTraverserProps> = {
|
|
26
19
|
loadSiblings: false,
|
|
27
20
|
skipLevelOfDetail: false,
|
|
@@ -35,17 +28,25 @@ export const DEFAULT_PROPS: Required<TilesetTraverserProps> = {
|
|
|
35
28
|
export class TilesetTraverser {
|
|
36
29
|
options: Required<TilesetTraverserProps>;
|
|
37
30
|
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
31
|
+
// fulfill in traverse call
|
|
32
|
+
root: any = null;
|
|
33
|
+
|
|
34
|
+
// tiles should be rendered
|
|
35
|
+
selectedTiles: Record<string, Tile3D> = {};
|
|
36
|
+
// tiles should be loaded from server
|
|
37
|
+
requestedTiles: Record<string, Tile3D> = {};
|
|
38
|
+
// tiles does not have render content
|
|
39
|
+
emptyTiles: Record<string, Tile3D> = {};
|
|
42
40
|
|
|
43
41
|
protected lastUpdate: number = new Date().getTime();
|
|
44
42
|
protected readonly updateDebounceTime = 1000;
|
|
45
|
-
|
|
46
|
-
protected
|
|
47
|
-
protected
|
|
43
|
+
/** temporary storage to hold the traversed tiles during a traversal */
|
|
44
|
+
protected _traversalStack = new ManagedArray();
|
|
45
|
+
protected _emptyTraversalStack = new ManagedArray();
|
|
46
|
+
/** set in every traverse cycle */
|
|
47
|
+
protected _frameNumber: number | null = null;
|
|
48
48
|
|
|
49
|
+
// RESULT
|
|
49
50
|
protected traversalFinished(frameState: FrameState): boolean {
|
|
50
51
|
return true;
|
|
51
52
|
}
|
|
@@ -53,24 +54,6 @@ export class TilesetTraverser {
|
|
|
53
54
|
// TODO nested props
|
|
54
55
|
constructor(options: TilesetTraverserProps) {
|
|
55
56
|
this.options = {...DEFAULT_PROPS, ...options};
|
|
56
|
-
// TRAVERSAL
|
|
57
|
-
// temporary storage to hold the traversed tiles during a traversal
|
|
58
|
-
this._traversalStack = new ManagedArray();
|
|
59
|
-
this._emptyTraversalStack = new ManagedArray();
|
|
60
|
-
|
|
61
|
-
// set in every traverse cycle
|
|
62
|
-
this._frameNumber = null;
|
|
63
|
-
|
|
64
|
-
// fulfill in traverse call
|
|
65
|
-
this.root = null;
|
|
66
|
-
|
|
67
|
-
// RESULT
|
|
68
|
-
// tiles should be rendered
|
|
69
|
-
this.selectedTiles = {};
|
|
70
|
-
// tiles should be loaded from server
|
|
71
|
-
this.requestedTiles = {};
|
|
72
|
-
// tiles does not have render content
|
|
73
|
-
this.emptyTiles = {};
|
|
74
57
|
}
|
|
75
58
|
|
|
76
59
|
// tiles should be visible
|
|
@@ -89,22 +72,21 @@ export class TilesetTraverser {
|
|
|
89
72
|
}
|
|
90
73
|
|
|
91
74
|
reset() {
|
|
92
|
-
this.requestedTiles = {};
|
|
93
|
-
this.selectedTiles = {};
|
|
94
|
-
this.emptyTiles = {};
|
|
95
75
|
this._traversalStack.reset();
|
|
96
76
|
this._emptyTraversalStack.reset();
|
|
97
77
|
}
|
|
98
78
|
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
79
|
+
/**
|
|
80
|
+
* Execute traverse
|
|
81
|
+
* Depth-first traversal that traverses all visible tiles and marks tiles for selection.
|
|
82
|
+
* If skipLevelOfDetail is off then a tile does not refine until all children are loaded.
|
|
83
|
+
* This is the traditional replacement refinement approach and is called the base traversal.
|
|
84
|
+
* Tiles that have a greater screen space error than the base screen space error are part of the base traversal,
|
|
85
|
+
* all other tiles are part of the skip traversal. The skip traversal allows for skipping levels of the tree
|
|
86
|
+
* and rendering children and parent tiles simultaneously.
|
|
87
|
+
*/
|
|
106
88
|
/* eslint-disable-next-line complexity, max-statements */
|
|
107
|
-
executeTraversal(root, frameState: FrameState) {
|
|
89
|
+
executeTraversal(root, frameState: FrameState): void {
|
|
108
90
|
// stack to store traversed tiles, only visible tiles should be added to stack
|
|
109
91
|
// visible: visible in the current view frustum
|
|
110
92
|
const stack = this._traversalStack;
|
|
@@ -171,16 +153,15 @@ export class TilesetTraverser {
|
|
|
171
153
|
}
|
|
172
154
|
}
|
|
173
155
|
|
|
174
|
-
updateChildTiles(tile, frameState) {
|
|
156
|
+
updateChildTiles(tile: Tile3D, frameState: FrameState): void {
|
|
175
157
|
const children = tile.children;
|
|
176
158
|
for (const child of children) {
|
|
177
159
|
this.updateTile(child, frameState);
|
|
178
160
|
}
|
|
179
|
-
return true;
|
|
180
161
|
}
|
|
181
162
|
|
|
182
163
|
/* eslint-disable complexity, max-statements */
|
|
183
|
-
updateAndPushChildren(tile, frameState, stack, depth) {
|
|
164
|
+
updateAndPushChildren(tile: Tile3D, frameState: FrameState, stack, depth): boolean {
|
|
184
165
|
const {loadSiblings, skipLevelOfDetail} = this.options;
|
|
185
166
|
|
|
186
167
|
const children = tile.children;
|
|
@@ -235,12 +216,12 @@ export class TilesetTraverser {
|
|
|
235
216
|
}
|
|
236
217
|
/* eslint-enable complexity, max-statements */
|
|
237
218
|
|
|
238
|
-
updateTile(tile, frameState) {
|
|
219
|
+
updateTile(tile: Tile3D, frameState: FrameState): void {
|
|
239
220
|
this.updateTileVisibility(tile, frameState);
|
|
240
221
|
}
|
|
241
222
|
|
|
242
223
|
// tile to render in the browser
|
|
243
|
-
selectTile(tile, frameState) {
|
|
224
|
+
selectTile(tile: Tile3D, frameState: FrameState): void {
|
|
244
225
|
if (this.shouldSelectTile(tile)) {
|
|
245
226
|
// The tile can be selected right away and does not require traverseAndSelect
|
|
246
227
|
tile._selectedFrame = frameState.frameNumber;
|
|
@@ -249,7 +230,7 @@ export class TilesetTraverser {
|
|
|
249
230
|
}
|
|
250
231
|
|
|
251
232
|
// tile to load from server
|
|
252
|
-
loadTile(tile, frameState) {
|
|
233
|
+
loadTile(tile: Tile3D, frameState: FrameState): void {
|
|
253
234
|
if (this.shouldLoadTile(tile)) {
|
|
254
235
|
tile._requestedFrame = frameState.frameNumber;
|
|
255
236
|
tile._priority = tile._getPriority();
|
|
@@ -258,7 +239,7 @@ export class TilesetTraverser {
|
|
|
258
239
|
}
|
|
259
240
|
|
|
260
241
|
// cache tile
|
|
261
|
-
touchTile(tile, frameState) {
|
|
242
|
+
touchTile(tile: Tile3D, frameState: FrameState): void {
|
|
262
243
|
tile.tileset._cache.touch(tile);
|
|
263
244
|
tile._touchedFrame = frameState.frameNumber;
|
|
264
245
|
}
|
|
@@ -266,7 +247,12 @@ export class TilesetTraverser {
|
|
|
266
247
|
// tile should be visible
|
|
267
248
|
// tile should have children
|
|
268
249
|
// tile LoD (level of detail) is not sufficient under current viewport
|
|
269
|
-
canTraverse(
|
|
250
|
+
canTraverse(
|
|
251
|
+
tile: Tile3D,
|
|
252
|
+
frameState: FrameState,
|
|
253
|
+
useParentMetric: boolean = false,
|
|
254
|
+
ignoreVisibility: boolean = false
|
|
255
|
+
): boolean {
|
|
270
256
|
if (!tile.hasChildren) {
|
|
271
257
|
return false;
|
|
272
258
|
}
|
|
@@ -285,20 +271,20 @@ export class TilesetTraverser {
|
|
|
285
271
|
return this.shouldRefine(tile, frameState, useParentMetric);
|
|
286
272
|
}
|
|
287
273
|
|
|
288
|
-
shouldLoadTile(tile) {
|
|
274
|
+
shouldLoadTile(tile: Tile3D): boolean {
|
|
289
275
|
// if request tile is in current frame
|
|
290
276
|
// and has unexpired render content
|
|
291
277
|
return tile.hasUnloadedContent || tile.contentExpired;
|
|
292
278
|
}
|
|
293
279
|
|
|
294
|
-
shouldSelectTile(tile) {
|
|
280
|
+
shouldSelectTile(tile: Tile3D): boolean {
|
|
295
281
|
// if select tile is in current frame
|
|
296
282
|
// and content available
|
|
297
283
|
return tile.contentAvailable && !this.options.skipLevelOfDetail;
|
|
298
284
|
}
|
|
299
285
|
|
|
300
|
-
|
|
301
|
-
shouldRefine(tile, frameState, useParentMetric) {
|
|
286
|
+
/** Decide if tile LoD (level of detail) is not sufficient under current viewport */
|
|
287
|
+
shouldRefine(tile: Tile3D, frameState: FrameState, useParentMetric: boolean = false): boolean {
|
|
302
288
|
let screenSpaceError = tile._screenSpaceError;
|
|
303
289
|
if (useParentMetric) {
|
|
304
290
|
screenSpaceError = tile.getScreenSpaceError(frameState, true);
|
|
@@ -307,7 +293,7 @@ export class TilesetTraverser {
|
|
|
307
293
|
return screenSpaceError > this.options.maximumScreenSpaceError;
|
|
308
294
|
}
|
|
309
295
|
|
|
310
|
-
updateTileVisibility(tile, frameState) {
|
|
296
|
+
updateTileVisibility(tile: Tile3D, frameState: FrameState): void {
|
|
311
297
|
const viewportIds: string[] = [];
|
|
312
298
|
if (this.options.viewportTraversersMap) {
|
|
313
299
|
for (const key in this.options.viewportTraversersMap) {
|
|
@@ -324,14 +310,16 @@ export class TilesetTraverser {
|
|
|
324
310
|
|
|
325
311
|
// UTILITIES
|
|
326
312
|
|
|
327
|
-
compareDistanceToCamera(b, a) {
|
|
313
|
+
compareDistanceToCamera(b: Tile3D, a: Tile3D): number {
|
|
328
314
|
return b._distanceToCamera - a._distanceToCamera;
|
|
329
315
|
}
|
|
330
316
|
|
|
331
|
-
anyChildrenVisible(tile, frameState) {
|
|
317
|
+
anyChildrenVisible(tile: Tile3D, frameState: FrameState): boolean {
|
|
332
318
|
let anyVisible = false;
|
|
333
319
|
for (const child of tile.children) {
|
|
320
|
+
// @ts-expect-error
|
|
334
321
|
child.updateVisibility(frameState);
|
|
322
|
+
// @ts-expect-error
|
|
335
323
|
anyVisible = anyVisible || child.isVisibleAndInRequestVolume;
|
|
336
324
|
}
|
|
337
325
|
return anyVisible;
|
|
@@ -339,7 +327,7 @@ export class TilesetTraverser {
|
|
|
339
327
|
|
|
340
328
|
// Depth-first traversal that checks if all nearest descendants with content are loaded.
|
|
341
329
|
// Ignores visibility.
|
|
342
|
-
executeEmptyTraversal(root, frameState) {
|
|
330
|
+
executeEmptyTraversal(root: Tile3D, frameState: FrameState): boolean {
|
|
343
331
|
let allDescendantsLoaded = true;
|
|
344
332
|
const stack = this._emptyTraversalStack;
|
|
345
333
|
|
|
@@ -377,7 +365,3 @@ export class TilesetTraverser {
|
|
|
377
365
|
return allDescendantsLoaded;
|
|
378
366
|
}
|
|
379
367
|
}
|
|
380
|
-
|
|
381
|
-
// TODO
|
|
382
|
-
// enable expiration
|
|
383
|
-
// enable optimization hint
|