@loaders.gl/tiles 3.2.4 → 3.2.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 (62) hide show
  1. package/dist/dist.min.js +88 -46
  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 +17 -12
  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 +18 -10
  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 +18 -10
  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 +4 -4
  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 +24 -15
  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
@@ -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.4",
3
+ "version": "3.2.7",
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.4",
37
- "@loaders.gl/math": "3.2.4",
36
+ "@loaders.gl/loader-utils": "3.2.7",
37
+ "@loaders.gl/math": "3.2.7",
38
38
  "@math.gl/core": "^3.5.1",
39
39
  "@math.gl/culling": "^3.5.1",
40
40
  "@math.gl/geospatial": "^3.5.1",
@@ -44,5 +44,5 @@
44
44
  "peerDependencies": {
45
45
  "@loaders.gl/core": "^3.2.0"
46
46
  },
47
- "gitHead": "69a3cc438e23c98565a2bf3bed825ad7699e7eb9"
47
+ "gitHead": "78b3cc95d3159ac4fc99bd1474ab67008175f2f8"
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
  }
@@ -673,7 +676,13 @@ export default class Tileset3D {
673
676
  this.zoom = 1;
674
677
  return;
675
678
  }
676
- this.cartographicCenter = Ellipsoid.WGS84.cartesianToCartographic(center, new Vector3());
679
+
680
+ // cartographic coordinates are undefined at the center of the ellipsoid
681
+ if (center[0] !== 0 || center[1] !== 0 || center[2] !== 0) {
682
+ this.cartographicCenter = Ellipsoid.WGS84.cartesianToCartographic(center, new Vector3());
683
+ } else {
684
+ this.cartographicCenter = new Vector3(0, 0, -Ellipsoid.WGS84.radii[0]);
685
+ }
677
686
  this.cartesianCenter = center;
678
687
  this.zoom = getZoomFromBoundingVolume(root.boundingVolume, this.cartographicCenter);
679
688
  }
@@ -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
+ }
@@ -1,5 +1,5 @@
1
1
  import {FrameState} from '../helpers/frame-state';
2
- import I3SPendingTilesRegister from './i3s-frame-counter';
2
+ import I3SPendingTilesRegister from './i3s-pending-tiles-register';
3
3
 
4
4
  const STATUS = {
5
5
  REQUESTED: 'REQUESTED',
@@ -16,50 +16,86 @@ export default class I3STileManager {
16
16
  this._statusMap = {};
17
17
  }
18
18
 
19
+ /**
20
+ * Add request to map
21
+ * @param request - node metadata request
22
+ * @param key - unique key
23
+ * @param callback - callback after request completed
24
+ * @param frameState - frameState data
25
+ */
19
26
  add(request, key, callback, frameState: FrameState) {
20
27
  if (!this._statusMap[key]) {
21
- const {frameNumber} = frameState;
28
+ const {
29
+ frameNumber,
30
+ viewport: {id}
31
+ } = frameState;
22
32
  this._statusMap[key] = {request, callback, key, frameState, status: STATUS.REQUESTED};
23
33
  // Register pending request for the frameNumber
24
- this.pendingTilesRegister.register(frameNumber);
34
+ this.pendingTilesRegister.register(id, frameNumber);
25
35
  request()
26
36
  .then((data) => {
27
37
  this._statusMap[key].status = STATUS.COMPLETED;
28
- const {frameNumber: actualFrameNumber} = this._statusMap[key].frameState;
38
+ const {
39
+ frameNumber: actualFrameNumber,
40
+ viewport: {id}
41
+ } = this._statusMap[key].frameState;
29
42
  // Deregister pending request for the frameNumber
30
- this.pendingTilesRegister.deregister(actualFrameNumber);
43
+ this.pendingTilesRegister.deregister(id, actualFrameNumber);
31
44
  this._statusMap[key].callback(data, frameState);
32
45
  })
33
46
  .catch((error) => {
34
47
  this._statusMap[key].status = STATUS.ERROR;
35
- const {frameNumber: actualFrameNumber} = this._statusMap[key].frameState;
48
+ const {
49
+ frameNumber: actualFrameNumber,
50
+ viewport: {id}
51
+ } = this._statusMap[key].frameState;
36
52
  // Deregister pending request for the frameNumber
37
- this.pendingTilesRegister.deregister(actualFrameNumber);
53
+ this.pendingTilesRegister.deregister(id, actualFrameNumber);
38
54
  callback(error);
39
55
  });
40
56
  }
41
57
  }
42
58
 
59
+ /**
60
+ * Update request if it is still actual for the new frameState
61
+ * @param key - unique key
62
+ * @param frameState - frameState data
63
+ */
43
64
  update(key, frameState: FrameState) {
44
65
  if (this._statusMap[key]) {
45
66
  // Deregister pending request for the old frameNumber
46
- this.pendingTilesRegister.deregister(this._statusMap[key].frameState.frameNumber);
67
+ const {
68
+ frameNumber,
69
+ viewport: {id}
70
+ } = this._statusMap[key].frameState;
71
+ this.pendingTilesRegister.deregister(id, frameNumber);
72
+
47
73
  // Register pending request for the new frameNumber
48
- this.pendingTilesRegister.register(frameState.frameNumber);
74
+ const {
75
+ frameNumber: newFrameNumber,
76
+ viewport: {id: newViewportId}
77
+ } = frameState;
78
+ this.pendingTilesRegister.register(newViewportId, newFrameNumber);
49
79
  this._statusMap[key].frameState = frameState;
50
80
  }
51
81
  }
52
82
 
83
+ /**
84
+ * Find request in the map
85
+ * @param key - unique key
86
+ * @returns
87
+ */
53
88
  find(key) {
54
89
  return this._statusMap[key];
55
90
  }
56
91
 
57
92
  /**
58
93
  * Check it there are pending tile headers for the particular frameNumber
94
+ * @param viewportId
59
95
  * @param frameNumber
60
96
  * @returns
61
97
  */
62
- hasPendingTiles(frameNumber: number): boolean {
63
- return !this.pendingTilesRegister.isZero(frameNumber);
98
+ hasPendingTiles(viewportId: string, frameNumber: number): boolean {
99
+ return !this.pendingTilesRegister.isZero(viewportId, frameNumber);
64
100
  }
65
101
  }
@@ -14,8 +14,8 @@ export default class I3STilesetTraverser extends TilesetTraverser {
14
14
  * that means the traversal is finished and we can call
15
15
  * following-up callbacks.
16
16
  */
17
- protected get traversalFinished(): boolean {
18
- return !this._tileManager.hasPendingTiles(this._frameNumber || 0);
17
+ protected traversalFinished(frameState: FrameState): boolean {
18
+ return !this._tileManager.hasPendingTiles(frameState.viewport.id, this._frameNumber || 0);
19
19
  }
20
20
 
21
21
  constructor(options) {
@@ -98,7 +98,8 @@ export default class I3STilesetTraverser extends TilesetTraverser {
98
98
  // after tile fetched, resume traversal if still in current update/traversal frame
99
99
  if (
100
100
  this._frameNumber === frameState.frameNumber &&
101
- (this.traversalFinished || new Date().getTime() - this.lastUpdate > this.updateDebounceTime)
101
+ (this.traversalFinished(frameState) ||
102
+ new Date().getTime() - this.lastUpdate > this.updateDebounceTime)
102
103
  ) {
103
104
  this.executeTraversal(childTile, frameState);
104
105
  }
@@ -45,7 +45,7 @@ export default class TilesetTraverser {
45
45
  protected _emptyTraversalStack: ManagedArray;
46
46
  protected _frameNumber: number | null;
47
47
 
48
- protected get traversalFinished(): boolean {
48
+ protected traversalFinished(frameState: FrameState): boolean {
49
49
  return true;
50
50
  }
51
51
 
@@ -164,7 +164,7 @@ export default class TilesetTraverser {
164
164
  }
165
165
 
166
166
  const newTime = new Date().getTime();
167
- if (this.traversalFinished || newTime - this.lastUpdate > this.updateDebounceTime) {
167
+ if (this.traversalFinished(frameState) || newTime - this.lastUpdate > this.updateDebounceTime) {
168
168
  this.lastUpdate = newTime;
169
169
  this.options.onTraversalEnd(frameState);
170
170
  }
package/src/types.ts CHANGED
@@ -1,4 +1,27 @@
1
+ import {Vector3} from '@math.gl/core';
2
+
1
3
  export type BoundingRectangle = {
2
4
  width: number;
3
5
  height: number;
4
6
  };
7
+
8
+ /** Deck.gl Viewport instance type.
9
+ * We can't import it from Deck.gl to avoid circular reference */
10
+ export type Viewport = {
11
+ id: string;
12
+ longitude: number;
13
+ latitude: number;
14
+ cameraPosition: [number, number, number];
15
+ cameraDirection: [number, number, number];
16
+ cameraUp: [number, number, number];
17
+ height: number;
18
+ width: number;
19
+ bearing: number;
20
+ zoom: number;
21
+ distanceScales: {
22
+ metersPerUnit: number;
23
+ };
24
+ center: [number, number, number];
25
+ unprojectPosition: (position: [number, number, number] | Vector3) => Vector3;
26
+ project: (coorinates: [number, number, number] | Vector3) => Vector3;
27
+ };
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../../src/tileset/traversers/i3s-frame-counter.ts"],"names":["I3SPendingTilesRegister","Map","frameNumber","oldCount","frameNumberMap","get","set","count"],"mappings":";;;;;;;;;;;;;;;IAIqBA,uB;;;0DAC2B,IAAIC,GAAJ,E;;;;;WAM9C,kBAASC,WAAT,EAA8B;AAC5B,UAAMC,QAAQ,GAAG,KAAKC,cAAL,CAAoBC,GAApB,CAAwBH,WAAxB,KAAwC,CAAzD;AACA,WAAKE,cAAL,CAAoBE,GAApB,CAAwBJ,WAAxB,EAAqCC,QAAQ,GAAG,CAAhD;AACD;;;WAMD,oBAAWD,WAAX,EAAgC;AAC9B,UAAMC,QAAQ,GAAG,KAAKC,cAAL,CAAoBC,GAApB,CAAwBH,WAAxB,KAAwC,CAAzD;AACA,WAAKE,cAAL,CAAoBE,GAApB,CAAwBJ,WAAxB,EAAqCC,QAAQ,GAAG,CAAhD;AACD;;;WAOD,gBAAOD,WAAP,EAA4B;AAC1B,UAAMK,KAAK,GAAG,KAAKH,cAAL,CAAoBC,GAApB,CAAwBH,WAAxB,KAAwC,CAAtD;AACA,aAAOK,KAAK,KAAK,CAAjB;AACD","sourcesContent":["/**\n * Counter to register pending tile headers for the particular frameNumber\n * Until all tiles are loaded we won't call `onTraversalEnd` callback\n */\nexport default class I3SPendingTilesRegister {\n private frameNumberMap: Map<number, number> = new Map();\n\n /**\n * Register a new pending tile header for the particular frameNumber\n * @param frameNumber\n */\n register(frameNumber: number) {\n const oldCount = this.frameNumberMap.get(frameNumber) || 0;\n this.frameNumberMap.set(frameNumber, oldCount + 1);\n }\n\n /**\n * Deregister a pending tile header for the particular frameNumber\n * @param frameNumber\n */\n deregister(frameNumber: number) {\n const oldCount = this.frameNumberMap.get(frameNumber) || 1;\n this.frameNumberMap.set(frameNumber, oldCount - 1);\n }\n\n /**\n * Check is there are no pending tile headers registered for the particular frameNumber\n * @param frameNumber\n * @returns\n */\n isZero(frameNumber: number) {\n const count = this.frameNumberMap.get(frameNumber) || 0;\n return count === 0;\n }\n}\n"],"file":"i3s-frame-counter.js"}
@@ -1,23 +0,0 @@
1
- import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
2
- export default class I3SPendingTilesRegister {
3
- constructor() {
4
- _defineProperty(this, "frameNumberMap", new Map());
5
- }
6
-
7
- register(frameNumber) {
8
- const oldCount = this.frameNumberMap.get(frameNumber) || 0;
9
- this.frameNumberMap.set(frameNumber, oldCount + 1);
10
- }
11
-
12
- deregister(frameNumber) {
13
- const oldCount = this.frameNumberMap.get(frameNumber) || 1;
14
- this.frameNumberMap.set(frameNumber, oldCount - 1);
15
- }
16
-
17
- isZero(frameNumber) {
18
- const count = this.frameNumberMap.get(frameNumber) || 0;
19
- return count === 0;
20
- }
21
-
22
- }
23
- //# sourceMappingURL=i3s-frame-counter.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../../src/tileset/traversers/i3s-frame-counter.ts"],"names":["I3SPendingTilesRegister","Map","register","frameNumber","oldCount","frameNumberMap","get","set","deregister","isZero","count"],"mappings":";AAIA,eAAe,MAAMA,uBAAN,CAA8B;AAAA;AAAA,4CACG,IAAIC,GAAJ,EADH;AAAA;;AAO3CC,EAAAA,QAAQ,CAACC,WAAD,EAAsB;AAC5B,UAAMC,QAAQ,GAAG,KAAKC,cAAL,CAAoBC,GAApB,CAAwBH,WAAxB,KAAwC,CAAzD;AACA,SAAKE,cAAL,CAAoBE,GAApB,CAAwBJ,WAAxB,EAAqCC,QAAQ,GAAG,CAAhD;AACD;;AAMDI,EAAAA,UAAU,CAACL,WAAD,EAAsB;AAC9B,UAAMC,QAAQ,GAAG,KAAKC,cAAL,CAAoBC,GAApB,CAAwBH,WAAxB,KAAwC,CAAzD;AACA,SAAKE,cAAL,CAAoBE,GAApB,CAAwBJ,WAAxB,EAAqCC,QAAQ,GAAG,CAAhD;AACD;;AAODK,EAAAA,MAAM,CAACN,WAAD,EAAsB;AAC1B,UAAMO,KAAK,GAAG,KAAKL,cAAL,CAAoBC,GAApB,CAAwBH,WAAxB,KAAwC,CAAtD;AACA,WAAOO,KAAK,KAAK,CAAjB;AACD;;AA7B0C","sourcesContent":["/**\n * Counter to register pending tile headers for the particular frameNumber\n * Until all tiles are loaded we won't call `onTraversalEnd` callback\n */\nexport default class I3SPendingTilesRegister {\n private frameNumberMap: Map<number, number> = new Map();\n\n /**\n * Register a new pending tile header for the particular frameNumber\n * @param frameNumber\n */\n register(frameNumber: number) {\n const oldCount = this.frameNumberMap.get(frameNumber) || 0;\n this.frameNumberMap.set(frameNumber, oldCount + 1);\n }\n\n /**\n * Deregister a pending tile header for the particular frameNumber\n * @param frameNumber\n */\n deregister(frameNumber: number) {\n const oldCount = this.frameNumberMap.get(frameNumber) || 1;\n this.frameNumberMap.set(frameNumber, oldCount - 1);\n }\n\n /**\n * Check is there are no pending tile headers registered for the particular frameNumber\n * @param frameNumber\n * @returns\n */\n isZero(frameNumber: number) {\n const count = this.frameNumberMap.get(frameNumber) || 0;\n return count === 0;\n }\n}\n"],"file":"i3s-frame-counter.js"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"i3s-frame-counter.d.ts","sourceRoot":"","sources":["../../../src/tileset/traversers/i3s-frame-counter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,CAAC,OAAO,OAAO,uBAAuB;IAC1C,OAAO,CAAC,cAAc,CAAkC;IAExD;;;OAGG;IACH,QAAQ,CAAC,WAAW,EAAE,MAAM;IAK5B;;;OAGG;IACH,UAAU,CAAC,WAAW,EAAE,MAAM;IAK9B;;;;OAIG;IACH,MAAM,CAAC,WAAW,EAAE,MAAM;CAI3B"}
@@ -1,35 +0,0 @@
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<number, number> = new Map();
7
-
8
- /**
9
- * Register a new pending tile header for the particular frameNumber
10
- * @param frameNumber
11
- */
12
- register(frameNumber: number) {
13
- const oldCount = this.frameNumberMap.get(frameNumber) || 0;
14
- this.frameNumberMap.set(frameNumber, oldCount + 1);
15
- }
16
-
17
- /**
18
- * Deregister a pending tile header for the particular frameNumber
19
- * @param frameNumber
20
- */
21
- deregister(frameNumber: number) {
22
- const oldCount = this.frameNumberMap.get(frameNumber) || 1;
23
- this.frameNumberMap.set(frameNumber, oldCount - 1);
24
- }
25
-
26
- /**
27
- * Check is there are no pending tile headers registered for the particular frameNumber
28
- * @param frameNumber
29
- * @returns
30
- */
31
- isZero(frameNumber: number) {
32
- const count = this.frameNumberMap.get(frameNumber) || 0;
33
- return count === 0;
34
- }
35
- }