@loaders.gl/tiles 3.2.3 → 3.2.6

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 (62) hide show
  1. package/dist/dist.min.js +83 -45
  2. package/dist/es5/tileset/helpers/frame-state.js +26 -11
  3. package/dist/es5/tileset/helpers/frame-state.js.map +1 -1
  4. package/dist/es5/tileset/helpers/i3s-lod.js.map +1 -1
  5. package/dist/es5/tileset/tileset-3d.js +11 -11
  6. package/dist/es5/tileset/tileset-3d.js.map +1 -1
  7. package/dist/es5/tileset/traversers/{i3s-frame-counter.js → i3s-pending-tiles-register.js} +19 -9
  8. package/dist/es5/tileset/traversers/i3s-pending-tiles-register.js.map +1 -0
  9. package/dist/es5/tileset/traversers/i3s-tile-manager.js +22 -12
  10. package/dist/es5/tileset/traversers/i3s-tile-manager.js.map +1 -1
  11. package/dist/es5/tileset/traversers/i3s-tileset-traverser.js +3 -3
  12. package/dist/es5/tileset/traversers/i3s-tileset-traverser.js.map +1 -1
  13. package/dist/es5/tileset/traversers/tileset-traverser.js +2 -2
  14. package/dist/es5/tileset/traversers/tileset-traverser.js.map +1 -1
  15. package/dist/esm/tileset/helpers/frame-state.js +25 -9
  16. package/dist/esm/tileset/helpers/frame-state.js.map +1 -1
  17. package/dist/esm/tileset/helpers/i3s-lod.js.map +1 -1
  18. package/dist/esm/tileset/tileset-3d.js +12 -9
  19. package/dist/esm/tileset/tileset-3d.js.map +1 -1
  20. package/dist/esm/tileset/traversers/i3s-pending-tiles-register.js +33 -0
  21. package/dist/esm/tileset/traversers/i3s-pending-tiles-register.js.map +1 -0
  22. package/dist/esm/tileset/traversers/i3s-tile-manager.js +32 -11
  23. package/dist/esm/tileset/traversers/i3s-tile-manager.js.map +1 -1
  24. package/dist/esm/tileset/traversers/i3s-tileset-traverser.js +3 -3
  25. package/dist/esm/tileset/traversers/i3s-tileset-traverser.js.map +1 -1
  26. package/dist/esm/tileset/traversers/tileset-traverser.js +2 -2
  27. package/dist/esm/tileset/traversers/tileset-traverser.js.map +1 -1
  28. package/dist/tileset/helpers/frame-state.d.ts +4 -7
  29. package/dist/tileset/helpers/frame-state.d.ts.map +1 -1
  30. package/dist/tileset/helpers/frame-state.js +26 -12
  31. package/dist/tileset/helpers/i3s-lod.d.ts.map +1 -1
  32. package/dist/tileset/tileset-3d.d.ts +3 -2
  33. package/dist/tileset/tileset-3d.d.ts.map +1 -1
  34. package/dist/tileset/tileset-3d.js +11 -9
  35. package/dist/tileset/traversers/{i3s-frame-counter.d.ts → i3s-pending-tiles-register.d.ts} +7 -4
  36. package/dist/tileset/traversers/i3s-pending-tiles-register.d.ts.map +1 -0
  37. package/dist/tileset/traversers/{i3s-frame-counter.js → i3s-pending-tiles-register.js} +17 -8
  38. package/dist/tileset/traversers/i3s-tile-manager.d.ts +19 -1
  39. package/dist/tileset/traversers/i3s-tile-manager.d.ts.map +1 -1
  40. package/dist/tileset/traversers/i3s-tile-manager.js +32 -12
  41. package/dist/tileset/traversers/i3s-tileset-traverser.d.ts +1 -1
  42. package/dist/tileset/traversers/i3s-tileset-traverser.d.ts.map +1 -1
  43. package/dist/tileset/traversers/i3s-tileset-traverser.js +4 -3
  44. package/dist/tileset/traversers/tileset-traverser.d.ts +1 -1
  45. package/dist/tileset/traversers/tileset-traverser.d.ts.map +1 -1
  46. package/dist/tileset/traversers/tileset-traverser.js +2 -2
  47. package/dist/types.d.ts +21 -0
  48. package/dist/types.d.ts.map +1 -1
  49. package/package.json +5 -5
  50. package/src/tileset/helpers/frame-state.ts +46 -19
  51. package/src/tileset/helpers/i3s-lod.ts +3 -1
  52. package/src/tileset/tileset-3d.ts +17 -14
  53. package/src/tileset/traversers/i3s-pending-tiles-register.ts +44 -0
  54. package/src/tileset/traversers/i3s-tile-manager.ts +47 -11
  55. package/src/tileset/traversers/i3s-tileset-traverser.ts +4 -3
  56. package/src/tileset/traversers/tileset-traverser.ts +2 -2
  57. package/src/types.ts +23 -0
  58. package/dist/es5/tileset/traversers/i3s-frame-counter.js.map +0 -1
  59. package/dist/esm/tileset/traversers/i3s-frame-counter.js +0 -23
  60. package/dist/esm/tileset/traversers/i3s-frame-counter.js.map +0 -1
  61. package/dist/tileset/traversers/i3s-frame-counter.d.ts.map +0 -1
  62. package/src/tileset/traversers/i3s-frame-counter.ts +0 -35
@@ -10,27 +10,36 @@ class I3SPendingTilesRegister {
10
10
  }
11
11
  /**
12
12
  * Register a new pending tile header for the particular frameNumber
13
+ * @param viewportId
13
14
  * @param frameNumber
14
15
  */
15
- register(frameNumber) {
16
- const oldCount = this.frameNumberMap.get(frameNumber) || 0;
17
- this.frameNumberMap.set(frameNumber, oldCount + 1);
16
+ register(viewportId, frameNumber) {
17
+ const viewportMap = this.frameNumberMap.get(viewportId) || new Map();
18
+ const oldCount = viewportMap.get(frameNumber) || 0;
19
+ viewportMap.set(frameNumber, oldCount + 1);
20
+ this.frameNumberMap.set(viewportId, viewportMap);
18
21
  }
19
22
  /**
20
23
  * Deregister a pending tile header for the particular frameNumber
24
+ * @param viewportId
21
25
  * @param frameNumber
22
26
  */
23
- deregister(frameNumber) {
24
- const oldCount = this.frameNumberMap.get(frameNumber) || 1;
25
- this.frameNumberMap.set(frameNumber, oldCount - 1);
27
+ deregister(viewportId, frameNumber) {
28
+ const viewportMap = this.frameNumberMap.get(viewportId);
29
+ if (!viewportMap) {
30
+ return;
31
+ }
32
+ const oldCount = viewportMap.get(frameNumber) || 1;
33
+ viewportMap.set(frameNumber, oldCount - 1);
26
34
  }
27
35
  /**
28
36
  * Check is there are no pending tile headers registered for the particular frameNumber
37
+ * @param viewportId
29
38
  * @param frameNumber
30
39
  * @returns
31
40
  */
32
- isZero(frameNumber) {
33
- const count = this.frameNumberMap.get(frameNumber) || 0;
41
+ isZero(viewportId, frameNumber) {
42
+ const count = this.frameNumberMap.get(viewportId)?.get(frameNumber) || 0;
34
43
  return count === 0;
35
44
  }
36
45
  }
@@ -3,14 +3,32 @@ export default class I3STileManager {
3
3
  private _statusMap;
4
4
  private pendingTilesRegister;
5
5
  constructor();
6
+ /**
7
+ * Add request to map
8
+ * @param request - node metadata request
9
+ * @param key - unique key
10
+ * @param callback - callback after request completed
11
+ * @param frameState - frameState data
12
+ */
6
13
  add(request: any, key: any, callback: any, frameState: FrameState): void;
14
+ /**
15
+ * Update request if it is still actual for the new frameState
16
+ * @param key - unique key
17
+ * @param frameState - frameState data
18
+ */
7
19
  update(key: any, frameState: FrameState): void;
20
+ /**
21
+ * Find request in the map
22
+ * @param key - unique key
23
+ * @returns
24
+ */
8
25
  find(key: any): any;
9
26
  /**
10
27
  * Check it there are pending tile headers for the particular frameNumber
28
+ * @param viewportId
11
29
  * @param frameNumber
12
30
  * @returns
13
31
  */
14
- hasPendingTiles(frameNumber: number): boolean;
32
+ hasPendingTiles(viewportId: string, frameNumber: number): boolean;
15
33
  }
16
34
  //# sourceMappingURL=i3s-tile-manager.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"i3s-tile-manager.d.ts","sourceRoot":"","sources":["../../../src/tileset/traversers/i3s-tile-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAC,MAAM,wBAAwB,CAAC;AAUlD,MAAM,CAAC,OAAO,OAAO,cAAc;IACjC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,oBAAoB,CAAiC;;IAM7D,GAAG,CAAC,OAAO,KAAA,EAAE,GAAG,KAAA,EAAE,QAAQ,KAAA,EAAE,UAAU,EAAE,UAAU;IAwBlD,MAAM,CAAC,GAAG,KAAA,EAAE,UAAU,EAAE,UAAU;IAUlC,IAAI,CAAC,GAAG,KAAA;IAIR;;;;OAIG;IACH,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO;CAG9C"}
1
+ {"version":3,"file":"i3s-tile-manager.d.ts","sourceRoot":"","sources":["../../../src/tileset/traversers/i3s-tile-manager.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAC,MAAM,wBAAwB,CAAC;AAUlD,MAAM,CAAC,OAAO,OAAO,cAAc;IACjC,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,oBAAoB,CAAiC;;IAM7D;;;;;;OAMG;IACH,GAAG,CAAC,OAAO,KAAA,EAAE,GAAG,KAAA,EAAE,QAAQ,KAAA,EAAE,UAAU,EAAE,UAAU;IAiClD;;;;OAIG;IACH,MAAM,CAAC,GAAG,KAAA,EAAE,UAAU,EAAE,UAAU;IAmBlC;;;;OAIG;IACH,IAAI,CAAC,GAAG,KAAA;IAIR;;;;;OAKG;IACH,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO;CAGlE"}
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- const i3s_frame_counter_1 = __importDefault(require("./i3s-frame-counter"));
6
+ const i3s_pending_tiles_register_1 = __importDefault(require("./i3s-pending-tiles-register"));
7
7
  const STATUS = {
8
8
  REQUESTED: 'REQUESTED',
9
9
  COMPLETED: 'COMPLETED',
@@ -12,51 +12,71 @@ const STATUS = {
12
12
  // A helper class to manage tile metadata fetching
13
13
  class I3STileManager {
14
14
  constructor() {
15
- this.pendingTilesRegister = new i3s_frame_counter_1.default();
15
+ this.pendingTilesRegister = new i3s_pending_tiles_register_1.default();
16
16
  this._statusMap = {};
17
17
  }
18
+ /**
19
+ * Add request to map
20
+ * @param request - node metadata request
21
+ * @param key - unique key
22
+ * @param callback - callback after request completed
23
+ * @param frameState - frameState data
24
+ */
18
25
  add(request, key, callback, frameState) {
19
26
  if (!this._statusMap[key]) {
20
- const { frameNumber } = frameState;
27
+ const { frameNumber, viewport: { id } } = frameState;
21
28
  this._statusMap[key] = { request, callback, key, frameState, status: STATUS.REQUESTED };
22
29
  // Register pending request for the frameNumber
23
- this.pendingTilesRegister.register(frameNumber);
30
+ this.pendingTilesRegister.register(id, frameNumber);
24
31
  request()
25
32
  .then((data) => {
26
33
  this._statusMap[key].status = STATUS.COMPLETED;
27
- const { frameNumber: actualFrameNumber } = this._statusMap[key].frameState;
34
+ const { frameNumber: actualFrameNumber, viewport: { id } } = this._statusMap[key].frameState;
28
35
  // Deregister pending request for the frameNumber
29
- this.pendingTilesRegister.deregister(actualFrameNumber);
36
+ this.pendingTilesRegister.deregister(id, actualFrameNumber);
30
37
  this._statusMap[key].callback(data, frameState);
31
38
  })
32
39
  .catch((error) => {
33
40
  this._statusMap[key].status = STATUS.ERROR;
34
- const { frameNumber: actualFrameNumber } = this._statusMap[key].frameState;
41
+ const { frameNumber: actualFrameNumber, viewport: { id } } = this._statusMap[key].frameState;
35
42
  // Deregister pending request for the frameNumber
36
- this.pendingTilesRegister.deregister(actualFrameNumber);
43
+ this.pendingTilesRegister.deregister(id, actualFrameNumber);
37
44
  callback(error);
38
45
  });
39
46
  }
40
47
  }
48
+ /**
49
+ * Update request if it is still actual for the new frameState
50
+ * @param key - unique key
51
+ * @param frameState - frameState data
52
+ */
41
53
  update(key, frameState) {
42
54
  if (this._statusMap[key]) {
43
55
  // Deregister pending request for the old frameNumber
44
- this.pendingTilesRegister.deregister(this._statusMap[key].frameState.frameNumber);
56
+ const { frameNumber, viewport: { id } } = this._statusMap[key].frameState;
57
+ this.pendingTilesRegister.deregister(id, frameNumber);
45
58
  // Register pending request for the new frameNumber
46
- this.pendingTilesRegister.register(frameState.frameNumber);
59
+ const { frameNumber: newFrameNumber, viewport: { id: newViewportId } } = frameState;
60
+ this.pendingTilesRegister.register(newViewportId, newFrameNumber);
47
61
  this._statusMap[key].frameState = frameState;
48
62
  }
49
63
  }
64
+ /**
65
+ * Find request in the map
66
+ * @param key - unique key
67
+ * @returns
68
+ */
50
69
  find(key) {
51
70
  return this._statusMap[key];
52
71
  }
53
72
  /**
54
73
  * Check it there are pending tile headers for the particular frameNumber
74
+ * @param viewportId
55
75
  * @param frameNumber
56
76
  * @returns
57
77
  */
58
- hasPendingTiles(frameNumber) {
59
- return !this.pendingTilesRegister.isZero(frameNumber);
78
+ hasPendingTiles(viewportId, frameNumber) {
79
+ return !this.pendingTilesRegister.isZero(viewportId, frameNumber);
60
80
  }
61
81
  }
62
82
  exports.default = I3STileManager;
@@ -7,7 +7,7 @@ export default class I3STilesetTraverser extends TilesetTraverser {
7
7
  * that means the traversal is finished and we can call
8
8
  * following-up callbacks.
9
9
  */
10
- protected get traversalFinished(): boolean;
10
+ protected traversalFinished(frameState: FrameState): boolean;
11
11
  constructor(options: any);
12
12
  shouldRefine(tile: any, frameState: FrameState): boolean;
13
13
  updateChildTiles(tile: any, frameState: FrameState): boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"i3s-tileset-traverser.d.ts","sourceRoot":"","sources":["../../../src/tileset/traversers/i3s-tileset-traverser.ts"],"names":[],"mappings":"AACA,OAAO,gBAAgB,MAAM,qBAAqB,CAAC;AAKnD,OAAO,EAAC,UAAU,EAAC,MAAM,wBAAwB,CAAC;AAElD,MAAM,CAAC,OAAO,OAAO,mBAAoB,SAAQ,gBAAgB;IAC/D,OAAO,CAAC,YAAY,CAAiB;IAErC;;;;OAIG;IACH,SAAS,KAAK,iBAAiB,IAAI,OAAO,CAEzC;gBAEW,OAAO,KAAA;IAKnB,YAAY,CAAC,IAAI,KAAA,EAAE,UAAU,EAAE,UAAU;IAKzC,gBAAgB,CAAC,IAAI,KAAA,EAAE,UAAU,EAAE,UAAU,GAAG,OAAO;IAoCjD,SAAS,CAAC,MAAM,KAAA,EAAE,OAAO,KAAA;IAgB/B;;;;;;;OAOG;IACH,WAAW,CAAC,MAAM,KAAA,EAAE,IAAI,KAAA,EAAE,UAAU,KAAA;CAerC"}
1
+ {"version":3,"file":"i3s-tileset-traverser.d.ts","sourceRoot":"","sources":["../../../src/tileset/traversers/i3s-tileset-traverser.ts"],"names":[],"mappings":"AACA,OAAO,gBAAgB,MAAM,qBAAqB,CAAC;AAKnD,OAAO,EAAC,UAAU,EAAC,MAAM,wBAAwB,CAAC;AAElD,MAAM,CAAC,OAAO,OAAO,mBAAoB,SAAQ,gBAAgB;IAC/D,OAAO,CAAC,YAAY,CAAiB;IAErC;;;;OAIG;IACH,SAAS,CAAC,iBAAiB,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO;gBAIhD,OAAO,KAAA;IAKnB,YAAY,CAAC,IAAI,KAAA,EAAE,UAAU,EAAE,UAAU;IAKzC,gBAAgB,CAAC,IAAI,KAAA,EAAE,UAAU,EAAE,UAAU,GAAG,OAAO;IAoCjD,SAAS,CAAC,MAAM,KAAA,EAAE,OAAO,KAAA;IAgB/B;;;;;;;OAOG;IACH,WAAW,CAAC,MAAM,KAAA,EAAE,IAAI,KAAA,EAAE,UAAU,KAAA;CAgBrC"}
@@ -18,8 +18,8 @@ class I3STilesetTraverser extends tileset_traverser_1.default {
18
18
  * that means the traversal is finished and we can call
19
19
  * following-up callbacks.
20
20
  */
21
- get traversalFinished() {
22
- return !this._tileManager.hasPendingTiles(this._frameNumber || 0);
21
+ traversalFinished(frameState) {
22
+ return !this._tileManager.hasPendingTiles(frameState.viewport.id, this._frameNumber || 0);
23
23
  }
24
24
  shouldRefine(tile, frameState) {
25
25
  tile._lodJudge = (0, i3s_lod_1.getLodStatus)(tile, frameState);
@@ -86,7 +86,8 @@ class I3STilesetTraverser extends tileset_traverser_1.default {
86
86
  this.updateTile(childTile, frameState);
87
87
  // after tile fetched, resume traversal if still in current update/traversal frame
88
88
  if (this._frameNumber === frameState.frameNumber &&
89
- (this.traversalFinished || new Date().getTime() - this.lastUpdate > this.updateDebounceTime)) {
89
+ (this.traversalFinished(frameState) ||
90
+ new Date().getTime() - this.lastUpdate > this.updateDebounceTime)) {
90
91
  this.executeTraversal(childTile, frameState);
91
92
  }
92
93
  }
@@ -33,7 +33,7 @@ export default class TilesetTraverser {
33
33
  protected _traversalStack: ManagedArray;
34
34
  protected _emptyTraversalStack: ManagedArray;
35
35
  protected _frameNumber: number | null;
36
- protected get traversalFinished(): boolean;
36
+ protected traversalFinished(frameState: FrameState): boolean;
37
37
  constructor(options: TilesetTraverserProps);
38
38
  traverse(root: any, frameState: any, options: any): void;
39
39
  reset(): void;
@@ -1 +1 @@
1
- {"version":3,"file":"tileset-traverser.d.ts","sourceRoot":"","sources":["../../../src/tileset/traversers/tileset-traverser.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,2BAA2B,CAAC;AAErD,OAAO,EAAC,UAAU,EAAC,MAAM,wBAAwB,CAAC;AAElD,oBAAY,qBAAqB,GAAG;IAClC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,cAAc,CAAC,EAAE,CAAC,UAAU,KAAA,KAAK,GAAG,CAAC;IACrC,qBAAqB,CAAC,EAAE;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAC,CAAC;IAC7C,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,oBAAY,KAAK,GAAG;IAClB,YAAY,EAAE,OAAO,CAAC;IACtB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,uBAAuB,EAAE,MAAM,CAAC;IAChC,cAAc,EAAE,CAAC,UAAU,KAAA,KAAK,GAAG,CAAC;IACpC,qBAAqB,EAAE;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAC,CAAC;IAC5C,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,KAQ3B,CAAC;AAEF,MAAM,CAAC,OAAO,OAAO,gBAAgB;IACnC,OAAO,EAAE,KAAK,CAAC;IAEf,IAAI,EAAE,GAAG,CAAC;IACV,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IAEnB,SAAS,CAAC,UAAU,EAAE,MAAM,CAAwB;IACpD,SAAS,CAAC,QAAQ,CAAC,kBAAkB,QAAQ;IAC7C,SAAS,CAAC,eAAe,EAAE,YAAY,CAAC;IACxC,SAAS,CAAC,oBAAoB,EAAE,YAAY,CAAC;IAC7C,SAAS,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAEtC,SAAS,KAAK,iBAAiB,IAAI,OAAO,CAEzC;gBAGW,OAAO,EAAE,qBAAqB;IAuB1C,QAAQ,CAAC,IAAI,KAAA,EAAE,UAAU,KAAA,EAAE,OAAO,KAAA;IAclC,KAAK;IAgBL,gBAAgB,CAAC,IAAI,KAAA,EAAE,UAAU,EAAE,UAAU;IAmE7C,gBAAgB,CAAC,IAAI,KAAA,EAAE,UAAU,KAAA;IASjC,qBAAqB,CAAC,IAAI,KAAA,EAAE,UAAU,KAAA,EAAE,KAAK,KAAA,EAAE,KAAK,KAAA;IAuDpD,UAAU,CAAC,IAAI,KAAA,EAAE,UAAU,KAAA;IAK3B,UAAU,CAAC,IAAI,KAAA,EAAE,UAAU,KAAA;IAS3B,QAAQ,CAAC,IAAI,KAAA,EAAE,UAAU,KAAA;IASzB,SAAS,CAAC,IAAI,KAAA,EAAE,UAAU,KAAA;IAQ1B,WAAW,CAAC,IAAI,KAAA,EAAE,UAAU,KAAA,EAAE,eAAe,UAAQ,EAAE,gBAAgB,UAAQ;IAmB/E,cAAc,CAAC,IAAI,KAAA;IAMnB,gBAAgB,CAAC,IAAI,KAAA;IAOrB,YAAY,CAAC,IAAI,KAAA,EAAE,UAAU,KAAA,EAAE,eAAe,KAAA;IAS9C,oBAAoB,CAAC,IAAI,KAAA,EAAE,UAAU,KAAA;IAiBrC,uBAAuB,CAAC,CAAC,KAAA,EAAE,CAAC,KAAA;IAI5B,kBAAkB,CAAC,IAAI,KAAA,EAAE,UAAU,KAAA;IAWnC,qBAAqB,CAAC,IAAI,KAAA,EAAE,UAAU,KAAA;CAqCvC"}
1
+ {"version":3,"file":"tileset-traverser.d.ts","sourceRoot":"","sources":["../../../src/tileset/traversers/tileset-traverser.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,2BAA2B,CAAC;AAErD,OAAO,EAAC,UAAU,EAAC,MAAM,wBAAwB,CAAC;AAElD,oBAAY,qBAAqB,GAAG;IAClC,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,cAAc,CAAC,EAAE,CAAC,UAAU,KAAA,KAAK,GAAG,CAAC;IACrC,qBAAqB,CAAC,EAAE;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAC,CAAC;IAC7C,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,oBAAY,KAAK,GAAG;IAClB,YAAY,EAAE,OAAO,CAAC;IACtB,iBAAiB,EAAE,OAAO,CAAC;IAC3B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,uBAAuB,EAAE,MAAM,CAAC;IAChC,cAAc,EAAE,CAAC,UAAU,KAAA,KAAK,GAAG,CAAC;IACpC,qBAAqB,EAAE;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAA;KAAC,CAAC;IAC5C,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,eAAO,MAAM,aAAa,EAAE,KAQ3B,CAAC;AAEF,MAAM,CAAC,OAAO,OAAO,gBAAgB;IACnC,OAAO,EAAE,KAAK,CAAC;IAEf,IAAI,EAAE,GAAG,CAAC;IACV,cAAc,EAAE,MAAM,CAAC;IACvB,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IAEnB,SAAS,CAAC,UAAU,EAAE,MAAM,CAAwB;IACpD,SAAS,CAAC,QAAQ,CAAC,kBAAkB,QAAQ;IAC7C,SAAS,CAAC,eAAe,EAAE,YAAY,CAAC;IACxC,SAAS,CAAC,oBAAoB,EAAE,YAAY,CAAC;IAC7C,SAAS,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAEtC,SAAS,CAAC,iBAAiB,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO;gBAKhD,OAAO,EAAE,qBAAqB;IAuB1C,QAAQ,CAAC,IAAI,KAAA,EAAE,UAAU,KAAA,EAAE,OAAO,KAAA;IAclC,KAAK;IAgBL,gBAAgB,CAAC,IAAI,KAAA,EAAE,UAAU,EAAE,UAAU;IAmE7C,gBAAgB,CAAC,IAAI,KAAA,EAAE,UAAU,KAAA;IASjC,qBAAqB,CAAC,IAAI,KAAA,EAAE,UAAU,KAAA,EAAE,KAAK,KAAA,EAAE,KAAK,KAAA;IAuDpD,UAAU,CAAC,IAAI,KAAA,EAAE,UAAU,KAAA;IAK3B,UAAU,CAAC,IAAI,KAAA,EAAE,UAAU,KAAA;IAS3B,QAAQ,CAAC,IAAI,KAAA,EAAE,UAAU,KAAA;IASzB,SAAS,CAAC,IAAI,KAAA,EAAE,UAAU,KAAA;IAQ1B,WAAW,CAAC,IAAI,KAAA,EAAE,UAAU,KAAA,EAAE,eAAe,UAAQ,EAAE,gBAAgB,UAAQ;IAmB/E,cAAc,CAAC,IAAI,KAAA;IAMnB,gBAAgB,CAAC,IAAI,KAAA;IAOrB,YAAY,CAAC,IAAI,KAAA,EAAE,UAAU,KAAA,EAAE,eAAe,KAAA;IAS9C,oBAAoB,CAAC,IAAI,KAAA,EAAE,UAAU,KAAA;IAiBrC,uBAAuB,CAAC,CAAC,KAAA,EAAE,CAAC,KAAA;IAI5B,kBAAkB,CAAC,IAAI,KAAA,EAAE,UAAU,KAAA;IAWnC,qBAAqB,CAAC,IAAI,KAAA,EAAE,UAAU,KAAA;CAqCvC"}
@@ -37,7 +37,7 @@ class TilesetTraverser {
37
37
  // tiles does not have render content
38
38
  this.emptyTiles = {};
39
39
  }
40
- get traversalFinished() {
40
+ traversalFinished(frameState) {
41
41
  return true;
42
42
  }
43
43
  // tiles should be visible
@@ -116,7 +116,7 @@ class TilesetTraverser {
116
116
  tile._shouldRefine = shouldRefine && parentRefines;
117
117
  }
118
118
  const newTime = new Date().getTime();
119
- if (this.traversalFinished || newTime - this.lastUpdate > this.updateDebounceTime) {
119
+ if (this.traversalFinished(frameState) || newTime - this.lastUpdate > this.updateDebounceTime) {
120
120
  this.lastUpdate = newTime;
121
121
  this.options.onTraversalEnd(frameState);
122
122
  }
package/dist/types.d.ts CHANGED
@@ -1,5 +1,26 @@
1
+ import { Vector3 } from '@math.gl/core';
1
2
  export declare type BoundingRectangle = {
2
3
  width: number;
3
4
  height: number;
4
5
  };
6
+ /** Deck.gl Viewport instance type.
7
+ * We can't import it from Deck.gl to avoid circular reference */
8
+ export declare type Viewport = {
9
+ id: string;
10
+ longitude: number;
11
+ latitude: number;
12
+ cameraPosition: [number, number, number];
13
+ cameraDirection: [number, number, number];
14
+ cameraUp: [number, number, number];
15
+ height: number;
16
+ width: number;
17
+ bearing: number;
18
+ zoom: number;
19
+ distanceScales: {
20
+ metersPerUnit: number;
21
+ };
22
+ center: [number, number, number];
23
+ unprojectPosition: (position: [number, number, number] | Vector3) => Vector3;
24
+ project: (coorinates: [number, number, number] | Vector3) => Vector3;
25
+ };
5
26
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,oBAAY,iBAAiB,GAAG;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,OAAO,EAAC,MAAM,eAAe,CAAC;AAEtC,oBAAY,iBAAiB,GAAG;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF;iEACiE;AACjE,oBAAY,QAAQ,GAAG;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACzC,eAAe,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,cAAc,EAAE;QACd,aAAa,EAAE,MAAM,CAAC;KACvB,CAAC;IACF,MAAM,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,iBAAiB,EAAE,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,KAAK,OAAO,CAAC;IAC7E,OAAO,EAAE,CAAC,UAAU,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,KAAK,OAAO,CAAC;CACtE,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@loaders.gl/tiles",
3
- "version": "3.2.3",
3
+ "version": "3.2.6",
4
4
  "description": "Common components for different tiles loaders.",
5
5
  "license": "MIT",
6
6
  "publishConfig": {
@@ -33,8 +33,8 @@
33
33
  "build-bundle": "esbuild src/bundle.ts --bundle --outfile=dist/dist.min.js"
34
34
  },
35
35
  "dependencies": {
36
- "@loaders.gl/loader-utils": "3.2.3",
37
- "@loaders.gl/math": "3.2.3",
36
+ "@loaders.gl/loader-utils": "3.2.6",
37
+ "@loaders.gl/math": "3.2.6",
38
38
  "@math.gl/core": "^3.5.1",
39
39
  "@math.gl/culling": "^3.5.1",
40
40
  "@math.gl/geospatial": "^3.5.1",
@@ -42,7 +42,7 @@
42
42
  "@probe.gl/stats": "^3.5.0"
43
43
  },
44
44
  "peerDependencies": {
45
- "@loaders.gl/core": "3.2.0"
45
+ "@loaders.gl/core": "^3.2.0"
46
46
  },
47
- "gitHead": "ddb4a1f3c0bd948135fd3c3b83481e0a7809f4d7"
47
+ "gitHead": "4c7303904d6d4ea57082cf3c7a66e780b008edb9"
48
48
  }
@@ -2,6 +2,7 @@ import {Tile3D} from '@loaders.gl/tiles';
2
2
  import {Vector3} from '@math.gl/core';
3
3
  import {CullingVolume, Plane} from '@math.gl/culling';
4
4
  import {Ellipsoid} from '@math.gl/geospatial';
5
+ import {Viewport} from '../../types';
5
6
 
6
7
  export type FrameState = {
7
8
  camera: {
@@ -9,8 +10,8 @@ export type FrameState = {
9
10
  direction: number[];
10
11
  up: number[];
11
12
  };
12
- viewport: {[key: string]: any};
13
- topDownViewport: {[key: string]: any}; // Use it to calculate projected radius for a tile
13
+ viewport: Viewport;
14
+ topDownViewport: Viewport; // Use it to calculate projected radius for a tile
14
15
  height: number;
15
16
  cullingVolume: CullingVolume;
16
17
  frameNumber: number; // TODO: This can be the same between updates, what number is unique for between updates?
@@ -30,18 +31,14 @@ const cullingVolume = new CullingVolume([
30
31
 
31
32
  // Extracts a frame state appropriate for tile culling from a deck.gl viewport
32
33
  // TODO - this could likely be generalized and merged back into deck.gl for other culling scenarios
33
- export function getFrameState(viewport, frameNumber: number): FrameState {
34
+ export function getFrameState(viewport: Viewport, frameNumber: number): FrameState {
34
35
  // Traverse and and request. Update _selectedTiles so that we know what to render.
35
36
  const {cameraDirection, cameraUp, height} = viewport;
36
37
  const {metersPerUnit} = viewport.distanceScales;
37
38
 
38
- const viewportCenterCartographic = viewport.unprojectPosition(viewport.center);
39
39
  // TODO - Ellipsoid.eastNorthUpToFixedFrame() breaks on raw array, create a Vector.
40
40
  // TODO - Ellipsoid.eastNorthUpToFixedFrame() takes a cartesian, is that intuitive?
41
- const viewportCenterCartesian = Ellipsoid.WGS84.cartographicToCartesian(
42
- viewportCenterCartographic,
43
- new Vector3()
44
- );
41
+ const viewportCenterCartesian = worldToCartesian(viewport, viewport.center);
45
42
  const enuToFixedTransform = Ellipsoid.WGS84.eastNorthUpToFixedFrame(viewportCenterCartesian);
46
43
 
47
44
  const cameraPositionCartographic = viewport.unprojectPosition(viewport.cameraPosition);
@@ -60,7 +57,7 @@ export function getFrameState(viewport, frameNumber: number): FrameState {
60
57
  enuToFixedTransform.transformAsVector(new Vector3(cameraUp).scale(metersPerUnit))
61
58
  ).normalize();
62
59
 
63
- commonSpacePlanesToWGS84(viewport, viewportCenterCartesian);
60
+ commonSpacePlanesToWGS84(viewport);
64
61
 
65
62
  const ViewportClass = viewport.constructor;
66
63
  const {longitude, latitude, width, bearing, zoom} = viewport;
@@ -131,25 +128,55 @@ export function limitSelectedTiles(
131
128
  return [selectedTiles, unselectedTiles];
132
129
  }
133
130
 
134
- function commonSpacePlanesToWGS84(viewport, viewportCenterCartesian) {
131
+ function commonSpacePlanesToWGS84(viewport) {
135
132
  // Extract frustum planes based on current view.
136
133
  const frustumPlanes = viewport.getFrustumPlanes();
134
+
135
+ // Get the near/far plane centers
136
+ const nearCenterCommon = closestPointOnPlane(frustumPlanes.near, viewport.cameraPosition);
137
+ const nearCenterCartesian = worldToCartesian(viewport, nearCenterCommon);
138
+ const cameraCartesian = worldToCartesian(viewport, viewport.cameraPosition, scratchPosition);
139
+
137
140
  let i = 0;
141
+ cullingVolume.planes[i++].fromPointNormal(
142
+ nearCenterCartesian,
143
+ scratchVector.copy(nearCenterCartesian).subtract(cameraCartesian)
144
+ );
145
+
138
146
  for (const dir in frustumPlanes) {
147
+ if (dir === 'near') {
148
+ continue;
149
+ }
139
150
  const plane = frustumPlanes[dir];
140
- const distanceToCenter = plane.normal.dot(viewport.center);
141
- scratchPosition
142
- .copy(plane.normal)
143
- .scale(plane.distance - distanceToCenter)
144
- .add(viewport.center);
145
- const cartographicPos = viewport.unprojectPosition(scratchPosition);
146
-
147
- const cartesianPos = Ellipsoid.WGS84.cartographicToCartesian(cartographicPos, new Vector3());
151
+ const posCommon = closestPointOnPlane(plane, nearCenterCommon, scratchPosition);
152
+ const cartesianPos = worldToCartesian(viewport, posCommon, scratchPosition);
148
153
 
149
154
  cullingVolume.planes[i++].fromPointNormal(
150
155
  cartesianPos,
151
156
  // Want the normal to point into the frustum since that's what culling expects
152
- scratchVector.copy(viewportCenterCartesian).subtract(cartesianPos)
157
+ scratchVector.copy(nearCenterCartesian).subtract(cartesianPos)
153
158
  );
154
159
  }
155
160
  }
161
+
162
+ function closestPointOnPlane(
163
+ plane: {distance: number; normal: Vector3},
164
+ refPoint: [number, number, number] | Vector3,
165
+ out: Vector3 = new Vector3()
166
+ ): Vector3 {
167
+ const distanceToRef = plane.normal.dot(refPoint);
168
+ out
169
+ .copy(plane.normal)
170
+ .scale(plane.distance - distanceToRef)
171
+ .add(refPoint);
172
+ return out;
173
+ }
174
+
175
+ function worldToCartesian(
176
+ viewport: Viewport,
177
+ point: [number, number, number] | Vector3,
178
+ out: Vector3 = new Vector3()
179
+ ): Vector3 {
180
+ const cartographicPos = viewport.unprojectPosition(point);
181
+ return Ellipsoid.WGS84.cartographicToCartesian(cartographicPos, out);
182
+ }
@@ -80,7 +80,9 @@ export function getProjectedRadius(tile: Tile3D, frameState: FrameState): number
80
80
 
81
81
  // Project center vertex and border vertex and calculate projected radius of MBS
82
82
  const projectedOrigin = viewport.project([mbsLon, mbsLat, mbsZ]);
83
- const projectedMbsBorderVertex = viewport.project(sphereMbsBorderVertexCartographic);
83
+ const projectedMbsBorderVertex = viewport.project(
84
+ sphereMbsBorderVertexCartographic as [number, number, number]
85
+ );
84
86
  const projectedRadius = projectedOriginVector
85
87
  .copy(projectedOrigin)
86
88
  .subtract(projectedMbsBorderVertex)
@@ -55,6 +55,7 @@ import Tileset3DTraverser from './traversers/tileset-3d-traverser';
55
55
  import TilesetTraverser from './traversers/tileset-traverser';
56
56
  import I3SetTraverser from './traversers/i3s-tileset-traverser';
57
57
  import {TILESET_TYPE} from '../constants';
58
+ import {Viewport} from '../types';
58
59
 
59
60
  export type Tileset3DProps = {
60
61
  // loading
@@ -244,7 +245,7 @@ export default class Tileset3D {
244
245
  private _pendingCount: any;
245
246
 
246
247
  // HOLD TRAVERSAL RESULTS
247
- private lastUpdatedVieports: any[] | null;
248
+ private lastUpdatedVieports: Viewport[] | Viewport | null;
248
249
  private _requestedTiles: any;
249
250
  private _emptyTiles: any;
250
251
  private frameStateData: any;
@@ -393,7 +394,7 @@ export default class Tileset3D {
393
394
  * @param viewports - list of viewports
394
395
  * @deprecated
395
396
  */
396
- update(viewports: any[] | null = null) {
397
+ update(viewports: Viewport[] | Viewport | null = null) {
397
398
  // eslint-disable-next-line @typescript-eslint/no-floating-promises
398
399
  this.tilesetInitializationPromise.then(() => {
399
400
  if (!viewports && this.lastUpdatedVieports) {
@@ -401,7 +402,9 @@ export default class Tileset3D {
401
402
  } else {
402
403
  this.lastUpdatedVieports = viewports;
403
404
  }
404
- this.doUpdate(viewports);
405
+ if (viewports) {
406
+ this.doUpdate(viewports);
407
+ }
405
408
  });
406
409
  }
407
410
 
@@ -411,7 +414,7 @@ export default class Tileset3D {
411
414
  * @param viewports viewports
412
415
  * @returns Promise of new frameNumber
413
416
  */
414
- async selectTiles(viewports: any[] | null = null): Promise<number> {
417
+ async selectTiles(viewports: Viewport[] | Viewport | null = null): Promise<number> {
415
418
  await this.tilesetInitializationPromise;
416
419
  if (viewports) {
417
420
  this.lastUpdatedVieports = viewports;
@@ -419,7 +422,9 @@ export default class Tileset3D {
419
422
  if (!this.updatePromise) {
420
423
  this.updatePromise = new Promise<number>((resolve) => {
421
424
  setTimeout(() => {
422
- this.doUpdate(this.lastUpdatedVieports);
425
+ if (this.lastUpdatedVieports) {
426
+ this.doUpdate(this.lastUpdatedVieports);
427
+ }
423
428
  resolve(this._frameNumber);
424
429
  this.updatePromise = null;
425
430
  }, this.options.debounceTime);
@@ -433,24 +438,22 @@ export default class Tileset3D {
433
438
  * @param viewports viewports
434
439
  */
435
440
  // eslint-disable-next-line max-statements, complexity
436
- private doUpdate(viewports: any[] | null = null): void {
441
+ private doUpdate(viewports: Viewport[] | Viewport): void {
437
442
  if ('loadTiles' in this.options && !this.options.loadTiles) {
438
443
  return;
439
444
  }
440
445
  if (this.traverseCounter > 0) {
441
446
  return;
442
447
  }
443
- if (!(viewports instanceof Array)) {
444
- viewports = [viewports];
445
- }
448
+ const preparedViewports = viewports instanceof Array ? viewports : [viewports];
446
449
 
447
450
  this._cache.reset();
448
451
  this._frameNumber++;
449
- this.traverseCounter = viewports.length;
452
+ this.traverseCounter = preparedViewports.length;
450
453
  const viewportsToTraverse: string[] = [];
451
454
  // First loop to decrement traverseCounter
452
- for (const viewport of viewports) {
453
- const id = viewport.id as string;
455
+ for (const viewport of preparedViewports) {
456
+ const id = viewport.id;
454
457
  if (this._needTraverse(id)) {
455
458
  viewportsToTraverse.push(id);
456
459
  } else {
@@ -459,8 +462,8 @@ export default class Tileset3D {
459
462
  }
460
463
 
461
464
  // Second loop to traverse
462
- for (const viewport of viewports) {
463
- const id = viewport.id as string;
465
+ for (const viewport of preparedViewports) {
466
+ const id = viewport.id;
464
467
  if (!this.roots[id]) {
465
468
  this.roots[id] = this._initializeTileHeaders(this.tileset, null);
466
469
  }
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Counter to register pending tile headers for the particular frameNumber
3
+ * Until all tiles are loaded we won't call `onTraversalEnd` callback
4
+ */
5
+ export default class I3SPendingTilesRegister {
6
+ private frameNumberMap: Map<string, Map<number, number>> = new Map();
7
+
8
+ /**
9
+ * Register a new pending tile header for the particular frameNumber
10
+ * @param viewportId
11
+ * @param frameNumber
12
+ */
13
+ register(viewportId: string, frameNumber: number) {
14
+ const viewportMap = this.frameNumberMap.get(viewportId) || new Map();
15
+ const oldCount = viewportMap.get(frameNumber) || 0;
16
+ viewportMap.set(frameNumber, oldCount + 1);
17
+ this.frameNumberMap.set(viewportId, viewportMap);
18
+ }
19
+
20
+ /**
21
+ * Deregister a pending tile header for the particular frameNumber
22
+ * @param viewportId
23
+ * @param frameNumber
24
+ */
25
+ deregister(viewportId: string, frameNumber: number) {
26
+ const viewportMap = this.frameNumberMap.get(viewportId);
27
+ if (!viewportMap) {
28
+ return;
29
+ }
30
+ const oldCount = viewportMap.get(frameNumber) || 1;
31
+ viewportMap.set(frameNumber, oldCount - 1);
32
+ }
33
+
34
+ /**
35
+ * Check is there are no pending tile headers registered for the particular frameNumber
36
+ * @param viewportId
37
+ * @param frameNumber
38
+ * @returns
39
+ */
40
+ isZero(viewportId: string, frameNumber: number) {
41
+ const count = this.frameNumberMap.get(viewportId)?.get(frameNumber) || 0;
42
+ return count === 0;
43
+ }
44
+ }