@loaders.gl/tiles 4.0.0-alpha.6 → 4.0.0-alpha.7
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 +429 -187
- package/dist/es5/constants.js.map +1 -1
- package/dist/es5/tileset/helpers/3d-tiles-options.js.map +1 -1
- package/dist/es5/tileset/tile-3d.js +42 -71
- package/dist/es5/tileset/tile-3d.js.map +1 -1
- package/dist/es5/tileset/tileset-3d.js +68 -103
- 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 -19
- package/dist/es5/tileset/tileset-traverser.js.map +1 -1
- package/dist/esm/constants.js.map +1 -1
- package/dist/esm/tileset/helpers/3d-tiles-options.js.map +1 -1
- package/dist/esm/tileset/tile-3d.js +40 -71
- package/dist/esm/tileset/tile-3d.js.map +1 -1
- package/dist/esm/tileset/tileset-3d.js +64 -95
- 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 -16
- package/dist/esm/tileset/tileset-traverser.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 +37 -21
- package/dist/tileset/tile-3d.d.ts.map +1 -1
- package/dist/tileset/tile-3d.js +57 -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 +110 -128
- 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 -32
- package/package.json +8 -5
- package/src/constants.ts +18 -0
- package/src/tileset/helpers/3d-tiles-options.ts +3 -1
- package/src/tileset/tile-3d.ts +68 -109
- package/src/tileset/tileset-3d.ts +182 -217
- package/src/tileset/tileset-cache.ts +20 -15
- package/src/tileset/tileset-traverser.ts +52 -65
|
@@ -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
|
|
@@ -96,15 +79,17 @@ export class TilesetTraverser {
|
|
|
96
79
|
this._emptyTraversalStack.reset();
|
|
97
80
|
}
|
|
98
81
|
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
82
|
+
/**
|
|
83
|
+
* Execute traverse
|
|
84
|
+
* Depth-first traversal that traverses all visible tiles and marks tiles for selection.
|
|
85
|
+
* If skipLevelOfDetail is off then a tile does not refine until all children are loaded.
|
|
86
|
+
* This is the traditional replacement refinement approach and is called the base traversal.
|
|
87
|
+
* Tiles that have a greater screen space error than the base screen space error are part of the base traversal,
|
|
88
|
+
* all other tiles are part of the skip traversal. The skip traversal allows for skipping levels of the tree
|
|
89
|
+
* and rendering children and parent tiles simultaneously.
|
|
90
|
+
*/
|
|
106
91
|
/* eslint-disable-next-line complexity, max-statements */
|
|
107
|
-
executeTraversal(root, frameState: FrameState) {
|
|
92
|
+
executeTraversal(root, frameState: FrameState): void {
|
|
108
93
|
// stack to store traversed tiles, only visible tiles should be added to stack
|
|
109
94
|
// visible: visible in the current view frustum
|
|
110
95
|
const stack = this._traversalStack;
|
|
@@ -171,16 +156,15 @@ export class TilesetTraverser {
|
|
|
171
156
|
}
|
|
172
157
|
}
|
|
173
158
|
|
|
174
|
-
updateChildTiles(tile, frameState) {
|
|
159
|
+
updateChildTiles(tile: Tile3D, frameState: FrameState): void {
|
|
175
160
|
const children = tile.children;
|
|
176
161
|
for (const child of children) {
|
|
177
162
|
this.updateTile(child, frameState);
|
|
178
163
|
}
|
|
179
|
-
return true;
|
|
180
164
|
}
|
|
181
165
|
|
|
182
166
|
/* eslint-disable complexity, max-statements */
|
|
183
|
-
updateAndPushChildren(tile, frameState, stack, depth) {
|
|
167
|
+
updateAndPushChildren(tile: Tile3D, frameState: FrameState, stack, depth): boolean {
|
|
184
168
|
const {loadSiblings, skipLevelOfDetail} = this.options;
|
|
185
169
|
|
|
186
170
|
const children = tile.children;
|
|
@@ -235,12 +219,12 @@ export class TilesetTraverser {
|
|
|
235
219
|
}
|
|
236
220
|
/* eslint-enable complexity, max-statements */
|
|
237
221
|
|
|
238
|
-
updateTile(tile, frameState) {
|
|
222
|
+
updateTile(tile: Tile3D, frameState: FrameState): void {
|
|
239
223
|
this.updateTileVisibility(tile, frameState);
|
|
240
224
|
}
|
|
241
225
|
|
|
242
226
|
// tile to render in the browser
|
|
243
|
-
selectTile(tile, frameState) {
|
|
227
|
+
selectTile(tile: Tile3D, frameState: FrameState): void {
|
|
244
228
|
if (this.shouldSelectTile(tile)) {
|
|
245
229
|
// The tile can be selected right away and does not require traverseAndSelect
|
|
246
230
|
tile._selectedFrame = frameState.frameNumber;
|
|
@@ -249,7 +233,7 @@ export class TilesetTraverser {
|
|
|
249
233
|
}
|
|
250
234
|
|
|
251
235
|
// tile to load from server
|
|
252
|
-
loadTile(tile, frameState) {
|
|
236
|
+
loadTile(tile: Tile3D, frameState: FrameState): void {
|
|
253
237
|
if (this.shouldLoadTile(tile)) {
|
|
254
238
|
tile._requestedFrame = frameState.frameNumber;
|
|
255
239
|
tile._priority = tile._getPriority();
|
|
@@ -258,7 +242,7 @@ export class TilesetTraverser {
|
|
|
258
242
|
}
|
|
259
243
|
|
|
260
244
|
// cache tile
|
|
261
|
-
touchTile(tile, frameState) {
|
|
245
|
+
touchTile(tile: Tile3D, frameState: FrameState): void {
|
|
262
246
|
tile.tileset._cache.touch(tile);
|
|
263
247
|
tile._touchedFrame = frameState.frameNumber;
|
|
264
248
|
}
|
|
@@ -266,7 +250,12 @@ export class TilesetTraverser {
|
|
|
266
250
|
// tile should be visible
|
|
267
251
|
// tile should have children
|
|
268
252
|
// tile LoD (level of detail) is not sufficient under current viewport
|
|
269
|
-
canTraverse(
|
|
253
|
+
canTraverse(
|
|
254
|
+
tile: Tile3D,
|
|
255
|
+
frameState: FrameState,
|
|
256
|
+
useParentMetric: boolean = false,
|
|
257
|
+
ignoreVisibility: boolean = false
|
|
258
|
+
): boolean {
|
|
270
259
|
if (!tile.hasChildren) {
|
|
271
260
|
return false;
|
|
272
261
|
}
|
|
@@ -285,20 +274,20 @@ export class TilesetTraverser {
|
|
|
285
274
|
return this.shouldRefine(tile, frameState, useParentMetric);
|
|
286
275
|
}
|
|
287
276
|
|
|
288
|
-
shouldLoadTile(tile) {
|
|
277
|
+
shouldLoadTile(tile: Tile3D): boolean {
|
|
289
278
|
// if request tile is in current frame
|
|
290
279
|
// and has unexpired render content
|
|
291
280
|
return tile.hasUnloadedContent || tile.contentExpired;
|
|
292
281
|
}
|
|
293
282
|
|
|
294
|
-
shouldSelectTile(tile) {
|
|
283
|
+
shouldSelectTile(tile: Tile3D): boolean {
|
|
295
284
|
// if select tile is in current frame
|
|
296
285
|
// and content available
|
|
297
286
|
return tile.contentAvailable && !this.options.skipLevelOfDetail;
|
|
298
287
|
}
|
|
299
288
|
|
|
300
|
-
|
|
301
|
-
shouldRefine(tile, frameState, useParentMetric) {
|
|
289
|
+
/** Decide if tile LoD (level of detail) is not sufficient under current viewport */
|
|
290
|
+
shouldRefine(tile: Tile3D, frameState: FrameState, useParentMetric: boolean = false): boolean {
|
|
302
291
|
let screenSpaceError = tile._screenSpaceError;
|
|
303
292
|
if (useParentMetric) {
|
|
304
293
|
screenSpaceError = tile.getScreenSpaceError(frameState, true);
|
|
@@ -307,7 +296,7 @@ export class TilesetTraverser {
|
|
|
307
296
|
return screenSpaceError > this.options.maximumScreenSpaceError;
|
|
308
297
|
}
|
|
309
298
|
|
|
310
|
-
updateTileVisibility(tile, frameState) {
|
|
299
|
+
updateTileVisibility(tile: Tile3D, frameState: FrameState): void {
|
|
311
300
|
const viewportIds: string[] = [];
|
|
312
301
|
if (this.options.viewportTraversersMap) {
|
|
313
302
|
for (const key in this.options.viewportTraversersMap) {
|
|
@@ -324,14 +313,16 @@ export class TilesetTraverser {
|
|
|
324
313
|
|
|
325
314
|
// UTILITIES
|
|
326
315
|
|
|
327
|
-
compareDistanceToCamera(b, a) {
|
|
316
|
+
compareDistanceToCamera(b: Tile3D, a: Tile3D): number {
|
|
328
317
|
return b._distanceToCamera - a._distanceToCamera;
|
|
329
318
|
}
|
|
330
319
|
|
|
331
|
-
anyChildrenVisible(tile, frameState) {
|
|
320
|
+
anyChildrenVisible(tile: Tile3D, frameState: FrameState): boolean {
|
|
332
321
|
let anyVisible = false;
|
|
333
322
|
for (const child of tile.children) {
|
|
323
|
+
// @ts-expect-error
|
|
334
324
|
child.updateVisibility(frameState);
|
|
325
|
+
// @ts-expect-error
|
|
335
326
|
anyVisible = anyVisible || child.isVisibleAndInRequestVolume;
|
|
336
327
|
}
|
|
337
328
|
return anyVisible;
|
|
@@ -339,7 +330,7 @@ export class TilesetTraverser {
|
|
|
339
330
|
|
|
340
331
|
// Depth-first traversal that checks if all nearest descendants with content are loaded.
|
|
341
332
|
// Ignores visibility.
|
|
342
|
-
executeEmptyTraversal(root, frameState) {
|
|
333
|
+
executeEmptyTraversal(root: Tile3D, frameState: FrameState): boolean {
|
|
343
334
|
let allDescendantsLoaded = true;
|
|
344
335
|
const stack = this._emptyTraversalStack;
|
|
345
336
|
|
|
@@ -377,7 +368,3 @@ export class TilesetTraverser {
|
|
|
377
368
|
return allDescendantsLoaded;
|
|
378
369
|
}
|
|
379
370
|
}
|
|
380
|
-
|
|
381
|
-
// TODO
|
|
382
|
-
// enable expiration
|
|
383
|
-
// enable optimization hint
|