@loaders.gl/tiles 3.4.0-alpha.4 → 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.
Files changed (45) hide show
  1. package/dist/constants.d.ts +6 -0
  2. package/dist/constants.d.ts.map +1 -1
  3. package/dist/constants.js +0 -1
  4. package/dist/dist.min.js +171 -151
  5. package/dist/es5/constants.js.map +1 -1
  6. package/dist/es5/tileset/helpers/3d-tiles-options.js.map +1 -1
  7. package/dist/es5/tileset/tile-3d.js +41 -71
  8. package/dist/es5/tileset/tile-3d.js.map +1 -1
  9. package/dist/es5/tileset/tileset-3d.js +68 -102
  10. package/dist/es5/tileset/tileset-3d.js.map +1 -1
  11. package/dist/es5/tileset/tileset-cache.js +4 -7
  12. package/dist/es5/tileset/tileset-cache.js.map +1 -1
  13. package/dist/es5/tileset/tileset-traverser.js +12 -22
  14. package/dist/es5/tileset/tileset-traverser.js.map +1 -1
  15. package/dist/esm/constants.js.map +1 -1
  16. package/dist/esm/tileset/helpers/3d-tiles-options.js.map +1 -1
  17. package/dist/esm/tileset/tile-3d.js +39 -71
  18. package/dist/esm/tileset/tile-3d.js.map +1 -1
  19. package/dist/esm/tileset/tileset-3d.js +64 -94
  20. package/dist/esm/tileset/tileset-3d.js.map +1 -1
  21. package/dist/esm/tileset/tileset-cache.js +4 -7
  22. package/dist/esm/tileset/tileset-cache.js.map +1 -1
  23. package/dist/esm/tileset/tileset-traverser.js +9 -19
  24. package/dist/esm/tileset/tileset-traverser.js.map +1 -1
  25. package/dist/tileset/helpers/3d-tiles-options.d.ts +3 -2
  26. package/dist/tileset/helpers/3d-tiles-options.d.ts.map +1 -1
  27. package/dist/tileset/tile-3d.d.ts +36 -21
  28. package/dist/tileset/tile-3d.d.ts.map +1 -1
  29. package/dist/tileset/tile-3d.js +58 -43
  30. package/dist/tileset/tileset-3d.d.ts +90 -43
  31. package/dist/tileset/tileset-3d.d.ts.map +1 -1
  32. package/dist/tileset/tileset-3d.js +108 -127
  33. package/dist/tileset/tileset-cache.d.ts +5 -4
  34. package/dist/tileset/tileset-cache.d.ts.map +1 -1
  35. package/dist/tileset/tileset-cache.js +4 -10
  36. package/dist/tileset/tileset-traverser.d.ts +32 -21
  37. package/dist/tileset/tileset-traverser.d.ts.map +1 -1
  38. package/dist/tileset/tileset-traverser.js +23 -35
  39. package/package.json +4 -4
  40. package/src/constants.ts +18 -0
  41. package/src/tileset/helpers/3d-tiles-options.ts +3 -1
  42. package/src/tileset/tile-3d.ts +70 -109
  43. package/src/tileset/tileset-3d.ts +178 -216
  44. package/src/tileset/tileset-cache.ts +20 -15
  45. 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 (defined(node)) {
36
+ if (node) {
40
37
  this._list.splice(this._sentinel, node);
41
38
  }
42
39
  }
43
40
 
44
- add(tileset, tile, addCallback) {
45
- if (!defined(tile._cacheNode)) {
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(tileset, tile, unloadCallback?) {
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 (!defined(node)) {
61
+ if (!node) {
57
62
  return;
58
63
  }
59
64
 
60
65
  this._list.remove(node);
61
- tile._cacheNode = undefined;
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?: {[key: string]: any};
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
- root: any;
39
- requestedTiles: object;
40
- selectedTiles: object;
41
- emptyTiles: object;
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
- protected _traversalStack: ManagedArray;
46
- protected _emptyTraversalStack: ManagedArray;
47
- protected _frameNumber: number | null;
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
- // execute traverse
100
- // Depth-first traversal that traverses all visible tiles and marks tiles for selection.
101
- // If skipLevelOfDetail is off then a tile does not refine until all children are loaded.
102
- // This is the traditional replacement refinement approach and is called the base traversal.
103
- // Tiles that have a greater screen space error than the base screen space error are part of the base traversal,
104
- // all other tiles are part of the skip traversal. The skip traversal allows for skipping levels of the tree
105
- // and rendering children and parent tiles simultaneously.
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(tile, frameState, useParentMetric = false, ignoreVisibility = false) {
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
- // Decide if tile LoD (level of detail) is not sufficient under current viewport
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