@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.
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 +429 -187
  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 +42 -71
  8. package/dist/es5/tileset/tile-3d.js.map +1 -1
  9. package/dist/es5/tileset/tileset-3d.js +68 -103
  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 -19
  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 +40 -71
  18. package/dist/esm/tileset/tile-3d.js.map +1 -1
  19. package/dist/esm/tileset/tileset-3d.js +64 -95
  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 -16
  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 +37 -21
  28. package/dist/tileset/tile-3d.d.ts.map +1 -1
  29. package/dist/tileset/tile-3d.js +57 -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 +110 -128
  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 -32
  39. package/package.json +8 -5
  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 +68 -109
  43. package/src/tileset/tileset-3d.ts +182 -217
  44. package/src/tileset/tileset-cache.ts +20 -15
  45. 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 (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
@@ -96,15 +79,17 @@ export class TilesetTraverser {
96
79
  this._emptyTraversalStack.reset();
97
80
  }
98
81
 
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.
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(tile, frameState, useParentMetric = false, ignoreVisibility = false) {
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
- // Decide if tile LoD (level of detail) is not sufficient under current viewport
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