@loaders.gl/tiles 4.0.0-alpha.5 → 4.0.0-alpha.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 (196) hide show
  1. package/dist/bundle.js +2 -2
  2. package/dist/constants.d.ts.map +1 -1
  3. package/dist/constants.js +30 -26
  4. package/dist/dist.min.js +1572 -855
  5. package/dist/es5/bundle.js +6 -0
  6. package/dist/es5/bundle.js.map +1 -0
  7. package/dist/es5/constants.js +44 -0
  8. package/dist/es5/constants.js.map +1 -0
  9. package/dist/es5/index.js +93 -0
  10. package/dist/es5/index.js.map +1 -0
  11. package/dist/es5/tileset/format-3d-tiles/tileset-3d-traverser.js +70 -0
  12. package/dist/es5/tileset/format-3d-tiles/tileset-3d-traverser.js.map +1 -0
  13. package/dist/es5/tileset/format-i3s/i3s-pending-tiles-register.js +45 -0
  14. package/dist/es5/tileset/format-i3s/i3s-pending-tiles-register.js.map +1 -0
  15. package/dist/es5/tileset/format-i3s/i3s-tile-manager.js +84 -0
  16. package/dist/es5/tileset/format-i3s/i3s-tile-manager.js.map +1 -0
  17. package/dist/es5/tileset/format-i3s/i3s-tileset-traverser.js +143 -0
  18. package/dist/es5/tileset/format-i3s/i3s-tileset-traverser.js.map +1 -0
  19. package/dist/es5/tileset/helpers/3d-tiles-options.js +12 -0
  20. package/dist/es5/tileset/helpers/3d-tiles-options.js.map +1 -0
  21. package/dist/es5/tileset/helpers/bounding-volume.js +176 -0
  22. package/dist/es5/tileset/helpers/bounding-volume.js.map +1 -0
  23. package/dist/es5/tileset/helpers/frame-state.js +129 -0
  24. package/dist/es5/tileset/helpers/frame-state.js.map +1 -0
  25. package/dist/es5/tileset/helpers/i3s-lod.js +60 -0
  26. package/dist/es5/tileset/helpers/i3s-lod.js.map +1 -0
  27. package/dist/es5/tileset/helpers/tiles-3d-lod.js +103 -0
  28. package/dist/es5/tileset/helpers/tiles-3d-lod.js.map +1 -0
  29. package/dist/es5/tileset/helpers/transform-utils.js +50 -0
  30. package/dist/es5/tileset/helpers/transform-utils.js.map +1 -0
  31. package/dist/es5/tileset/helpers/zoom.js +63 -0
  32. package/dist/es5/tileset/helpers/zoom.js.map +1 -0
  33. package/dist/es5/tileset/tile-3d.js +565 -0
  34. package/dist/es5/tileset/tile-3d.js.map +1 -0
  35. package/dist/es5/tileset/tileset-3d.js +890 -0
  36. package/dist/es5/tileset/tileset-3d.js.map +1 -0
  37. package/dist/es5/tileset/tileset-cache.js +85 -0
  38. package/dist/es5/tileset/tileset-cache.js.map +1 -0
  39. package/dist/es5/tileset/tileset-traverser.js +328 -0
  40. package/dist/es5/tileset/tileset-traverser.js.map +1 -0
  41. package/dist/es5/types.js +2 -0
  42. package/dist/es5/types.js.map +1 -0
  43. package/dist/es5/utils/doubly-linked-list-node.js +21 -0
  44. package/dist/es5/utils/doubly-linked-list-node.js.map +1 -0
  45. package/dist/es5/utils/doubly-linked-list.js +88 -0
  46. package/dist/es5/utils/doubly-linked-list.js.map +1 -0
  47. package/dist/es5/utils/managed-array.js +126 -0
  48. package/dist/es5/utils/managed-array.js.map +1 -0
  49. package/dist/esm/bundle.js +4 -0
  50. package/dist/esm/bundle.js.map +1 -0
  51. package/dist/esm/constants.js +32 -0
  52. package/dist/esm/constants.js.map +1 -0
  53. package/dist/esm/index.js +10 -0
  54. package/dist/esm/index.js.map +1 -0
  55. package/dist/{tileset/traversers → esm/tileset/format-3d-tiles}/tileset-3d-traverser.js +2 -13
  56. package/dist/esm/tileset/format-3d-tiles/tileset-3d-traverser.js.map +1 -0
  57. package/dist/esm/tileset/format-i3s/i3s-pending-tiles-register.js +26 -0
  58. package/dist/esm/tileset/format-i3s/i3s-pending-tiles-register.js.map +1 -0
  59. package/dist/esm/tileset/format-i3s/i3s-tile-manager.js +79 -0
  60. package/dist/esm/tileset/format-i3s/i3s-tile-manager.js.map +1 -0
  61. package/dist/{tileset/traversers → esm/tileset/format-i3s}/i3s-tileset-traverser.js +14 -26
  62. package/dist/esm/tileset/format-i3s/i3s-tileset-traverser.js.map +1 -0
  63. package/dist/esm/tileset/helpers/3d-tiles-options.js +6 -0
  64. package/dist/esm/tileset/helpers/3d-tiles-options.js.map +1 -0
  65. package/dist/esm/tileset/helpers/bounding-volume.js +155 -0
  66. package/dist/esm/tileset/helpers/bounding-volume.js.map +1 -0
  67. package/dist/esm/tileset/helpers/frame-state.js +109 -0
  68. package/dist/esm/tileset/helpers/frame-state.js.map +1 -0
  69. package/dist/esm/tileset/helpers/i3s-lod.js +53 -0
  70. package/dist/esm/tileset/helpers/i3s-lod.js.map +1 -0
  71. package/dist/esm/tileset/helpers/tiles-3d-lod.js +100 -0
  72. package/dist/{tileset → esm/tileset}/helpers/tiles-3d-lod.js.map +1 -1
  73. package/dist/esm/tileset/helpers/transform-utils.js +50 -0
  74. package/dist/esm/tileset/helpers/transform-utils.js.map +1 -0
  75. package/dist/esm/tileset/helpers/zoom.js +55 -0
  76. package/dist/esm/tileset/helpers/zoom.js.map +1 -0
  77. package/dist/esm/tileset/tile-3d.js +445 -0
  78. package/dist/esm/tileset/tile-3d.js.map +1 -0
  79. package/dist/esm/tileset/tileset-3d.js +637 -0
  80. package/dist/esm/tileset/tileset-3d.js.map +1 -0
  81. package/dist/esm/tileset/tileset-cache.js +60 -0
  82. package/dist/esm/tileset/tileset-cache.js.map +1 -0
  83. package/dist/{tileset/traversers → esm/tileset}/tileset-traverser.js +20 -72
  84. package/dist/esm/tileset/tileset-traverser.js.map +1 -0
  85. package/dist/esm/types.js +2 -0
  86. package/dist/esm/types.js.map +1 -0
  87. package/dist/esm/utils/doubly-linked-list-node.js +12 -0
  88. package/dist/esm/utils/doubly-linked-list-node.js.map +1 -0
  89. package/dist/esm/utils/doubly-linked-list.js +65 -0
  90. package/dist/esm/utils/doubly-linked-list.js.map +1 -0
  91. package/dist/esm/utils/managed-array.js +87 -0
  92. package/dist/esm/utils/managed-array.js.map +1 -0
  93. package/dist/index.d.ts +4 -4
  94. package/dist/index.d.ts.map +1 -1
  95. package/dist/index.js +26 -10
  96. package/dist/tileset/{traversers → format-3d-tiles}/tileset-3d-traverser.d.ts +2 -2
  97. package/dist/tileset/format-3d-tiles/tileset-3d-traverser.d.ts.map +1 -0
  98. package/dist/tileset/format-3d-tiles/tileset-3d-traverser.js +54 -0
  99. package/dist/tileset/format-i3s/i3s-pending-tiles-register.d.ts +27 -0
  100. package/dist/tileset/format-i3s/i3s-pending-tiles-register.d.ts.map +1 -0
  101. package/dist/tileset/format-i3s/i3s-pending-tiles-register.js +47 -0
  102. package/dist/tileset/format-i3s/i3s-tile-manager.d.ts +34 -0
  103. package/dist/tileset/format-i3s/i3s-tile-manager.d.ts.map +1 -0
  104. package/dist/tileset/format-i3s/i3s-tile-manager.js +80 -0
  105. package/dist/tileset/format-i3s/i3s-tileset-traverser.d.ts +25 -0
  106. package/dist/tileset/format-i3s/i3s-tileset-traverser.d.ts.map +1 -0
  107. package/dist/tileset/format-i3s/i3s-tileset-traverser.js +92 -0
  108. package/dist/tileset/helpers/3d-tiles-options.js +8 -5
  109. package/dist/tileset/helpers/bounding-volume.d.ts +10 -0
  110. package/dist/tileset/helpers/bounding-volume.d.ts.map +1 -1
  111. package/dist/tileset/helpers/bounding-volume.js +274 -69
  112. package/dist/tileset/helpers/frame-state.d.ts +16 -5
  113. package/dist/tileset/helpers/frame-state.d.ts.map +1 -1
  114. package/dist/tileset/helpers/frame-state.js +131 -49
  115. package/dist/tileset/helpers/i3s-lod.d.ts +1 -1
  116. package/dist/tileset/helpers/i3s-lod.d.ts.map +1 -1
  117. package/dist/tileset/helpers/i3s-lod.js +82 -64
  118. package/dist/tileset/helpers/tiles-3d-lod.d.ts.map +1 -1
  119. package/dist/tileset/helpers/tiles-3d-lod.js +112 -100
  120. package/dist/tileset/helpers/transform-utils.d.ts.map +1 -1
  121. package/dist/tileset/helpers/transform-utils.js +51 -56
  122. package/dist/tileset/helpers/zoom.d.ts +41 -2
  123. package/dist/tileset/helpers/zoom.d.ts.map +1 -1
  124. package/dist/tileset/helpers/zoom.js +83 -30
  125. package/dist/tileset/tile-3d.d.ts +45 -14
  126. package/dist/tileset/tile-3d.d.ts.map +1 -1
  127. package/dist/tileset/tile-3d.js +593 -534
  128. package/dist/tileset/tileset-3d.d.ts +54 -9
  129. package/dist/tileset/tileset-3d.d.ts.map +1 -1
  130. package/dist/tileset/tileset-3d.js +707 -648
  131. package/dist/tileset/tileset-cache.d.ts +1 -1
  132. package/dist/tileset/tileset-cache.d.ts.map +1 -1
  133. package/dist/tileset/tileset-cache.js +70 -71
  134. package/dist/tileset/{traversers/tileset-traverser.d.ts → tileset-traverser.d.ts} +11 -17
  135. package/dist/tileset/tileset-traverser.d.ts.map +1 -0
  136. package/dist/tileset/tileset-traverser.js +309 -0
  137. package/dist/types.d.ts +34 -0
  138. package/dist/types.d.ts.map +1 -0
  139. package/dist/types.js +2 -0
  140. package/dist/utils/doubly-linked-list-node.d.ts +1 -2
  141. package/dist/utils/doubly-linked-list-node.d.ts.map +1 -1
  142. package/dist/utils/doubly-linked-list-node.js +17 -15
  143. package/dist/utils/doubly-linked-list.d.ts +2 -3
  144. package/dist/utils/doubly-linked-list.d.ts.map +1 -1
  145. package/dist/utils/doubly-linked-list.js +91 -75
  146. package/dist/utils/managed-array.d.ts +1 -1
  147. package/dist/utils/managed-array.d.ts.map +1 -1
  148. package/dist/utils/managed-array.js +144 -109
  149. package/package.json +8 -8
  150. package/src/constants.ts +2 -0
  151. package/src/index.ts +6 -4
  152. package/src/tileset/{traversers → format-3d-tiles}/tileset-3d-traverser.ts +4 -2
  153. package/src/tileset/format-i3s/i3s-pending-tiles-register.ts +44 -0
  154. package/src/tileset/format-i3s/i3s-tile-manager.ts +101 -0
  155. package/src/tileset/{traversers → format-i3s}/i3s-tileset-traverser.ts +25 -12
  156. package/src/tileset/helpers/bounding-volume.ts +136 -0
  157. package/src/tileset/helpers/frame-state.ts +102 -18
  158. package/src/tileset/helpers/i3s-lod.ts +24 -21
  159. package/src/tileset/helpers/tiles-3d-lod.ts +2 -0
  160. package/src/tileset/helpers/transform-utils.ts +2 -0
  161. package/src/tileset/helpers/zoom.ts +84 -9
  162. package/src/tileset/tile-3d.ts +73 -18
  163. package/src/tileset/tileset-3d.ts +205 -43
  164. package/src/tileset/tileset-cache.ts +4 -2
  165. package/src/tileset/{traversers/tileset-traverser.ts → tileset-traverser.ts} +29 -17
  166. package/src/types.ts +36 -0
  167. package/src/utils/doubly-linked-list-node.ts +3 -2
  168. package/src/utils/doubly-linked-list.ts +2 -3
  169. package/src/utils/managed-array.ts +1 -1
  170. package/dist/bundle.js.map +0 -1
  171. package/dist/constants.js.map +0 -1
  172. package/dist/index.js.map +0 -1
  173. package/dist/tileset/helpers/3d-tiles-options.js.map +0 -1
  174. package/dist/tileset/helpers/bounding-volume.js.map +0 -1
  175. package/dist/tileset/helpers/frame-state.js.map +0 -1
  176. package/dist/tileset/helpers/i3s-lod.js.map +0 -1
  177. package/dist/tileset/helpers/transform-utils.js.map +0 -1
  178. package/dist/tileset/helpers/zoom.js.map +0 -1
  179. package/dist/tileset/tile-3d.js.map +0 -1
  180. package/dist/tileset/tileset-3d.js.map +0 -1
  181. package/dist/tileset/tileset-cache.js.map +0 -1
  182. package/dist/tileset/traversers/i3s-tile-manager.d.ts +0 -8
  183. package/dist/tileset/traversers/i3s-tile-manager.d.ts.map +0 -1
  184. package/dist/tileset/traversers/i3s-tile-manager.js +0 -45
  185. package/dist/tileset/traversers/i3s-tile-manager.js.map +0 -1
  186. package/dist/tileset/traversers/i3s-tileset-traverser.d.ts +0 -18
  187. package/dist/tileset/traversers/i3s-tileset-traverser.d.ts.map +0 -1
  188. package/dist/tileset/traversers/i3s-tileset-traverser.js.map +0 -1
  189. package/dist/tileset/traversers/tileset-3d-traverser.d.ts.map +0 -1
  190. package/dist/tileset/traversers/tileset-3d-traverser.js.map +0 -1
  191. package/dist/tileset/traversers/tileset-traverser.d.ts.map +0 -1
  192. package/dist/tileset/traversers/tileset-traverser.js.map +0 -1
  193. package/dist/utils/doubly-linked-list-node.js.map +0 -1
  194. package/dist/utils/doubly-linked-list.js.map +0 -1
  195. package/dist/utils/managed-array.js.map +0 -1
  196. package/src/tileset/traversers/i3s-tile-manager.ts +0 -39
@@ -1,20 +1,27 @@
1
+ // loaders.gl, MIT license
2
+
1
3
  // This file is derived from the Cesium code base under Apache 2 license
2
4
  // See LICENSE.md and https://github.com/AnalyticalGraphicsInc/cesium/blob/master/LICENSE.md
5
+
3
6
  import {Vector3, Matrix4} from '@math.gl/core';
4
7
  import {CullingVolume} from '@math.gl/culling';
5
8
 
6
9
  import {load} from '@loaders.gl/core';
10
+
11
+ // Note: circular dependency
12
+ import type {Tileset3D} from './tileset-3d';
7
13
  import {TILE_REFINEMENT, TILE_CONTENT_STATE, TILESET_TYPE} from '../constants';
8
14
 
9
15
  import {FrameState} from './helpers/frame-state';
10
- import {createBoundingVolume} from './helpers/bounding-volume';
16
+ import {
17
+ createBoundingVolume,
18
+ getCartographicBounds,
19
+ CartographicBounds
20
+ } from './helpers/bounding-volume';
11
21
  import {getTiles3DScreenSpaceError} from './helpers/tiles-3d-lod';
12
22
  import {getProjectedRadius} from './helpers/i3s-lod';
13
23
  import {get3dTilesOptions} from './helpers/3d-tiles-options';
14
- import TilesetTraverser from './traversers/tileset-traverser';
15
-
16
- // Note: circular dependency
17
- import type Tileset3D from './tileset-3d';
24
+ import {TilesetTraverser} from './tileset-traverser';
18
25
 
19
26
  const scratchVector = new Vector3();
20
27
 
@@ -25,14 +32,14 @@ function defined(x) {
25
32
  /**
26
33
  * @param tileset - Tileset3D instance
27
34
  * @param header - tile header - JSON loaded from a dataset
28
- * @param parentHeader - parent TileHeader instance
35
+ * @param parentHeader - parent Tile3D instance
29
36
  * @param extendedId - optional ID to separate copies of a tile for different viewports.
30
37
  * const extendedId = `${tile.id}-${frameState.viewport.id}`;
31
38
  */
32
- export type TileHeaderProps = {
39
+ export type Tile3DProps = {
33
40
  tileset: Tileset3D;
34
41
  header: Object;
35
- parentHeader: TileHeader;
42
+ parentHeader: Tile3D;
36
43
  extendedId: string;
37
44
  };
38
45
 
@@ -41,12 +48,12 @@ export type TileHeaderProps = {
41
48
  * the content is loaded on-demand when needed based on the view.
42
49
  * Do not construct this directly, instead access tiles through {@link Tileset3D#tileVisible}.
43
50
  */
44
- export default class TileHeader {
51
+ export class Tile3D {
45
52
  tileset: Tileset3D;
46
53
  header: any;
47
54
  id: string;
48
55
  url: string;
49
- parent: TileHeader;
56
+ parent: Tile3D;
50
57
  refine: number;
51
58
  type: string;
52
59
  contentUrl: string;
@@ -56,11 +63,12 @@ export default class TileHeader {
56
63
  content: any;
57
64
  contentState: any;
58
65
  gpuMemoryUsageInBytes: number;
59
- children: TileHeader[];
66
+ children: Tile3D[];
60
67
  depth: number;
61
68
  viewportIds: any[];
62
69
  transform: Matrix4;
63
70
  extensions: any;
71
+ implicitTiling?: any;
64
72
 
65
73
  // Container to store application specific data
66
74
  userData: {[key: string]: any};
@@ -82,9 +90,10 @@ export default class TileHeader {
82
90
  // @ts-ignore
83
91
  private _shouldRefine: boolean;
84
92
 
93
+ private _boundingBox?: CartographicBounds;
94
+
85
95
  // Members this are updated every frame for tree traversal and rendering optimizations:
86
- // @ts-ignore
87
- private _distanceToCamera: number;
96
+ public _distanceToCamera: number;
88
97
  // @ts-ignore
89
98
  private _centerZDepth: number;
90
99
  private _screenSpaceError: number;
@@ -115,10 +124,10 @@ export default class TileHeader {
115
124
 
116
125
  /**
117
126
  * @constructs
118
- * Create a TileHeader instance
127
+ * Create a Tile3D instance
119
128
  * @param tileset - Tileset3D instance
120
129
  * @param header - tile header - JSON loaded from a dataset
121
- * @param parentHeader - parent TileHeader instance
130
+ * @param parentHeader - parent Tile3D instance
122
131
  * @param extendedId - optional ID to separate copies of a tile for different viewports.
123
132
  * const extendedId = `${tile.id}-${frameState.viewport.id}`;
124
133
  */
@@ -126,7 +135,7 @@ export default class TileHeader {
126
135
  constructor(
127
136
  tileset: Tileset3D,
128
137
  header: {[key: string]: any},
129
- parentHeader?: TileHeader,
138
+ parentHeader?: Tile3D,
130
139
  extendedId = ''
131
140
  ) {
132
141
  // PUBLIC MEMBERS
@@ -206,6 +215,7 @@ export default class TileHeader {
206
215
  // TODO Cesium 3d tiles specific
207
216
  this._expireDate = null;
208
217
  this._expiredContent = null;
218
+ this.implicitTiling = null;
209
219
 
210
220
  Object.seal(this);
211
221
  }
@@ -285,6 +295,31 @@ export default class TileHeader {
285
295
  return this.contentState === TILE_CONTENT_STATE.FAILED;
286
296
  }
287
297
 
298
+ /**
299
+ * Distance from the tile's bounding volume center to the camera
300
+ */
301
+ get distanceToCamera(): number {
302
+ return this._distanceToCamera;
303
+ }
304
+
305
+ /**
306
+ * Screen space error for LOD selection
307
+ */
308
+ get screenSpaceError(): number {
309
+ return this._screenSpaceError;
310
+ }
311
+
312
+ /**
313
+ * Get bounding box in cartographic coordinates
314
+ * @returns [min, max] each in [longitude, latitude, altitude]
315
+ */
316
+ get boundingBox(): CartographicBounds {
317
+ if (!this._boundingBox) {
318
+ this._boundingBox = getCartographicBounds(this.header.boundingVolume, this.boundingVolume);
319
+ }
320
+ return this._boundingBox;
321
+ }
322
+
288
323
  /** Get the tile's screen space error. */
289
324
  getScreenSpaceError(frameState, useParentLodMetric) {
290
325
  switch (this.tileset.type) {
@@ -298,6 +333,14 @@ export default class TileHeader {
298
333
  }
299
334
  }
300
335
 
336
+ /**
337
+ * Make tile unselected than means it won't be shown
338
+ * but it can be still loaded in memory
339
+ */
340
+ unselect(): void {
341
+ this._selectedFrame = 0;
342
+ }
343
+
301
344
  /*
302
345
  * If skipLevelOfDetail is off try to load child tiles as soon as possible so that their parent can refine sooner.
303
346
  * Tiles are prioritized by screen space error.
@@ -749,8 +792,20 @@ export default class TileHeader {
749
792
  case 'i3s':
750
793
  return {
751
794
  ...this.tileset.options.i3s,
752
- tile: this.header,
753
- tileset: this.tileset.tileset,
795
+ _tileOptions: {
796
+ attributeUrls: this.header.attributeUrls,
797
+ textureUrl: this.header.textureUrl,
798
+ textureFormat: this.header.textureFormat,
799
+ textureLoaderOptions: this.header.textureLoaderOptions,
800
+ materialDefinition: this.header.materialDefinition,
801
+ isDracoGeometry: this.header.isDracoGeometry,
802
+ mbs: this.header.mbs
803
+ },
804
+ _tilesetOptions: {
805
+ store: this.tileset.tileset.store,
806
+ attributeStorageInfo: this.tileset.tileset.attributeStorageInfo,
807
+ fields: this.tileset.tileset.fields
808
+ },
754
809
  isTileHeader: false
755
810
  };
756
811
  case '3d-tiles':
@@ -1,3 +1,5 @@
1
+ // loaders.gl, MIT license
2
+
1
3
  // This file is derived from the Cesium code base under Apache 2 license
2
4
  // See LICENSE.md and https://github.com/AnalyticalGraphicsInc/cesium/blob/master/LICENSE.md
3
5
 
@@ -46,15 +48,19 @@ import {
46
48
  LoaderWithParser,
47
49
  LoaderOptions
48
50
  } from '@loaders.gl/loader-utils';
49
- import TilesetCache from './tileset-cache';
51
+ import {TilesetCache} from './tileset-cache';
50
52
  import {calculateTransformProps} from './helpers/transform-utils';
51
- import {FrameState, getFrameState} from './helpers/frame-state';
52
- import {getZoomFromBoundingVolume} from './helpers/zoom';
53
- import Tile3D from './tile-3d';
54
- import Tileset3DTraverser from './traversers/tileset-3d-traverser';
55
- import TilesetTraverser from './traversers/tileset-traverser';
56
- import I3SetTraverser from './traversers/i3s-tileset-traverser';
53
+ import {FrameState, getFrameState, limitSelectedTiles} from './helpers/frame-state';
54
+ import {getZoomFromBoundingVolume, getZoomFromExtent, getZoomFromFullExtent} from './helpers/zoom';
55
+ import {Tile3D} from './tile-3d';
57
56
  import {TILESET_TYPE} from '../constants';
57
+ import {GeospatialViewport, Viewport} from '../types';
58
+
59
+ import {TilesetTraverser} from './tileset-traverser';
60
+
61
+ // TODO - these should be moved into their respective modules
62
+ import {Tileset3DTraverser} from './format-3d-tiles/tileset-3d-traverser';
63
+ import {I3STilesetTraverser} from './format-i3s/i3s-tileset-traverser';
58
64
 
59
65
  export type Tileset3DProps = {
60
66
  // loading
@@ -64,6 +70,8 @@ export type Tileset3DProps = {
64
70
  loadTiles?: boolean;
65
71
  basePath?: string;
66
72
  maximumMemoryUsage?: number;
73
+ maximumTilesSelected?: number;
74
+ debounceTime?: number;
67
75
 
68
76
  // Metadata
69
77
  description?: string;
@@ -93,6 +101,8 @@ type Props = {
93
101
  modelMatrix: Matrix4;
94
102
  throttleRequests: boolean;
95
103
  maximumMemoryUsage: number;
104
+ maximumTilesSelected: number;
105
+ debounceTime: number;
96
106
  onTileLoad: (tile: Tile3D) => any;
97
107
  onTileUnload: (tile: Tile3D) => any;
98
108
  onTileError: (tile: Tile3D, message: string, url: string) => any;
@@ -124,6 +134,10 @@ const DEFAULT_PROPS: Props = {
124
134
  maxRequests: 64,
125
135
 
126
136
  maximumMemoryUsage: 32,
137
+ /** Maximum number limit of tiles selected for show. 0 means no limit */
138
+ maximumTilesSelected: 0,
139
+ /** Delay time before the tileset traversal. It prevents traversal requests spam.*/
140
+ debounceTime: 0,
127
141
 
128
142
  /**
129
143
  * Callback. Indicates this a tile's content was loaded
@@ -149,7 +163,6 @@ const DEFAULT_PROPS: Props = {
149
163
  // View distance scale modifier
150
164
  viewDistanceScale: 1.0,
151
165
 
152
- // TODO CESIUM
153
166
  // The maximum screen space error used to drive level of detail refinement.
154
167
  maximumScreenSpaceError: 8,
155
168
 
@@ -174,10 +187,10 @@ const TILES_LOADED = 'Tiles Loaded';
174
187
  const TILES_LOADING = 'Tiles Loading';
175
188
  const TILES_UNLOADED = 'Tiles Unloaded';
176
189
  const TILES_LOAD_FAILED = 'Failed Tile Loads';
177
- const POINTS_COUNT = 'Points';
190
+ const POINTS_COUNT = 'Points/Vertices';
178
191
  const TILES_GPU_MEMORY = 'Tile Memory Use';
179
192
 
180
- export default class Tileset3D {
193
+ export class Tileset3D {
181
194
  // props: Tileset3DProps;
182
195
  options: Props;
183
196
  loadOptions: {[key: string]: any};
@@ -204,9 +217,14 @@ export default class Tileset3D {
204
217
 
205
218
  stats: Stats;
206
219
 
220
+ /** flags that contain information about data types in nested tiles */
221
+ contentFormats = {draco: false, meshopt: false, dds: false, ktx2: false};
222
+
207
223
  traverseCounter: number;
208
224
  geometricError: number;
209
225
  selectedTiles: Tile3D[];
226
+ private updatePromise: Promise<number> | null = null;
227
+ tilesetInitializationPromise: Promise<void>;
210
228
 
211
229
  cartographicCenter: Vector3 | null;
212
230
  cartesianCenter: Vector3 | null;
@@ -235,7 +253,7 @@ export default class Tileset3D {
235
253
  private _pendingCount: any;
236
254
 
237
255
  // HOLD TRAVERSAL RESULTS
238
- private lastUpdatedVieports: any[] | null;
256
+ private lastUpdatedVieports: Viewport[] | Viewport | null;
239
257
  private _requestedTiles: any;
240
258
  private _emptyTiles: any;
241
259
  private frameStateData: any;
@@ -324,7 +342,7 @@ export default class Tileset3D {
324
342
  this.credits = {};
325
343
  this.description = this.options.description || '';
326
344
 
327
- this._initializeTileSet(json);
345
+ this.tilesetInitializationPromise = this._initializeTileSet(json);
328
346
  }
329
347
 
330
348
  /** Release resources */
@@ -335,7 +353,7 @@ export default class Tileset3D {
335
353
  /** Is the tileset loaded (update needs to have been called at least once) */
336
354
  isLoaded(): boolean {
337
355
  // Check that `_frameNumber !== 0` which means that update was called at least once
338
- return this._pendingCount === 0 && this._frameNumber !== 0;
356
+ return this._pendingCount === 0 && this._frameNumber !== 0 && this._requestedTiles.length === 0;
339
357
  }
340
358
 
341
359
  get tiles(): object[] {
@@ -382,31 +400,68 @@ export default class Tileset3D {
382
400
  /**
383
401
  * Update visible tiles relying on a list of viewports
384
402
  * @param viewports - list of viewports
403
+ * @deprecated
404
+ */
405
+ update(viewports: Viewport[] | Viewport | null = null) {
406
+ // eslint-disable-next-line @typescript-eslint/no-floating-promises
407
+ this.tilesetInitializationPromise.then(() => {
408
+ if (!viewports && this.lastUpdatedVieports) {
409
+ viewports = this.lastUpdatedVieports;
410
+ } else {
411
+ this.lastUpdatedVieports = viewports;
412
+ }
413
+ if (viewports) {
414
+ this.doUpdate(viewports);
415
+ }
416
+ });
417
+ }
418
+
419
+ /**
420
+ * Update visible tiles relying on a list of viewports.
421
+ * Do it with debounce delay to prevent update spam
422
+ * @param viewports viewports
423
+ * @returns Promise of new frameNumber
424
+ */
425
+ async selectTiles(viewports: Viewport[] | Viewport | null = null): Promise<number> {
426
+ await this.tilesetInitializationPromise;
427
+ if (viewports) {
428
+ this.lastUpdatedVieports = viewports;
429
+ }
430
+ if (!this.updatePromise) {
431
+ this.updatePromise = new Promise<number>((resolve) => {
432
+ setTimeout(() => {
433
+ if (this.lastUpdatedVieports) {
434
+ this.doUpdate(this.lastUpdatedVieports);
435
+ }
436
+ resolve(this._frameNumber);
437
+ this.updatePromise = null;
438
+ }, this.options.debounceTime);
439
+ });
440
+ }
441
+ return this.updatePromise;
442
+ }
443
+
444
+ /**
445
+ * Update visible tiles relying on a list of viewports
446
+ * @param viewports viewports
385
447
  */
386
448
  // eslint-disable-next-line max-statements, complexity
387
- update(viewports: any[]): void {
449
+ private doUpdate(viewports: Viewport[] | Viewport): void {
388
450
  if ('loadTiles' in this.options && !this.options.loadTiles) {
389
451
  return;
390
452
  }
391
453
  if (this.traverseCounter > 0) {
392
454
  return;
393
455
  }
394
- if (!viewports && this.lastUpdatedVieports) {
395
- viewports = this.lastUpdatedVieports;
396
- } else {
397
- this.lastUpdatedVieports = viewports;
398
- }
399
- if (!(viewports instanceof Array)) {
400
- viewports = [viewports];
401
- }
456
+ const preparedViewports = viewports instanceof Array ? viewports : [viewports];
402
457
 
403
458
  this._cache.reset();
404
459
  this._frameNumber++;
405
- this.traverseCounter = viewports.length;
460
+ this.traverseCounter = preparedViewports.length;
406
461
  const viewportsToTraverse: string[] = [];
407
462
  // First loop to decrement traverseCounter
408
- for (const viewport of viewports) {
409
- const id = viewport.id as string;
463
+ for (const viewport of preparedViewports) {
464
+ const id = viewport.id;
410
465
  if (this._needTraverse(id)) {
411
466
  viewportsToTraverse.push(id);
412
467
  } else {
@@ -415,8 +470,8 @@ export default class Tileset3D {
415
470
  }
416
471
 
417
472
  // Second loop to traverse
418
- for (const viewport of viewports) {
419
- const id = viewport.id as string;
473
+ for (const viewport of preparedViewports) {
474
+ const id = viewport.id;
420
475
  if (!this.roots[id]) {
421
476
  this.roots[id] = this._initializeTileHeaders(this.tileset, null);
422
477
  }
@@ -424,7 +479,7 @@ export default class Tileset3D {
424
479
  if (!viewportsToTraverse.includes(id)) {
425
480
  continue; // eslint-disable-line no-continue
426
481
  }
427
- const frameState = getFrameState(viewport, this._frameNumber);
482
+ const frameState = getFrameState(viewport as GeospatialViewport, this._frameNumber);
428
483
  this._traverser.traverse(this.roots[id], frameState, this.options);
429
484
  }
430
485
  }
@@ -457,7 +512,16 @@ export default class Tileset3D {
457
512
  }
458
513
  const currentFrameStateData = this.frameStateData[id];
459
514
  const selectedTiles = Object.values(this._traverser.selectedTiles);
460
- currentFrameStateData.selectedTiles = selectedTiles;
515
+ const [filteredSelectedTiles, unselectedTiles] = limitSelectedTiles(
516
+ selectedTiles,
517
+ frameState,
518
+ this.options.maximumTilesSelected
519
+ );
520
+ currentFrameStateData.selectedTiles = filteredSelectedTiles;
521
+ for (const tile of unselectedTiles) {
522
+ tile.unselect();
523
+ }
524
+
461
525
  currentFrameStateData._requestedTiles = Object.values(this._traverser.requestedTiles);
462
526
  currentFrameStateData._emptyTiles = Object.values(this._traverser.emptyTiles);
463
527
 
@@ -531,6 +595,9 @@ export default class Tileset3D {
531
595
  tilesRenderable++;
532
596
  if (tile.content.pointCount) {
533
597
  pointsRenderable += tile.content.pointCount;
598
+ } else {
599
+ // Calculate vertices for non point cloud tiles.
600
+ pointsRenderable += tile.content.vertexCount;
534
601
  }
535
602
  }
536
603
  }
@@ -540,37 +607,92 @@ export default class Tileset3D {
540
607
  this.stats.get(POINTS_COUNT).count = pointsRenderable;
541
608
  }
542
609
 
543
- _initializeTileSet(tilesetJson) {
610
+ async _initializeTileSet(tilesetJson) {
611
+ if (this.type === TILESET_TYPE.I3S) {
612
+ this.calculateViewPropsI3S();
613
+ tilesetJson.root = await tilesetJson.root;
614
+ }
544
615
  this.root = this._initializeTileHeaders(tilesetJson, null);
545
616
 
546
- // TODO CESIUM Specific
547
617
  if (this.type === TILESET_TYPE.TILES3D) {
548
- this._initializeCesiumTileset(tilesetJson);
618
+ this._initializeTiles3DTileset(tilesetJson);
619
+ this.calculateViewPropsTiles3D();
549
620
  }
550
621
 
551
622
  if (this.type === TILESET_TYPE.I3S) {
552
623
  this._initializeI3STileset();
553
624
  }
554
- // Calculate cartographicCenter & zoom props to help apps center view on tileset
555
- this._calculateViewProps();
556
625
  }
557
626
 
558
- // Called during initialize Tileset to initialize the tileset's cartographic center (longitude, latitude) and zoom.
559
- _calculateViewProps() {
627
+ /**
628
+ * Called during initialize Tileset to initialize the tileset's cartographic center (longitude, latitude) and zoom.
629
+ * These metrics help apps center view on tileset
630
+ * For I3S there is extent (<1.8 version) or fullExtent (>=1.8 version) to calculate view props
631
+ * @returns
632
+ */
633
+ private calculateViewPropsI3S() {
634
+ // for I3S 1.8 try to calculate with fullExtent
635
+ const fullExtent = this.tileset.fullExtent;
636
+ if (fullExtent) {
637
+ const {xmin, xmax, ymin, ymax, zmin, zmax} = fullExtent;
638
+ this.cartographicCenter = new Vector3(
639
+ xmin + (xmax - xmin) / 2,
640
+ ymin + (ymax - ymin) / 2,
641
+ zmin + (zmax - zmin) / 2
642
+ );
643
+ this.cartesianCenter = Ellipsoid.WGS84.cartographicToCartesian(
644
+ this.cartographicCenter,
645
+ new Vector3()
646
+ );
647
+ this.zoom = getZoomFromFullExtent(fullExtent, this.cartographicCenter, this.cartesianCenter);
648
+ return;
649
+ }
650
+ // for I3S 1.6-1.7 try to calculate with extent
651
+ const extent = this.tileset.store?.extent;
652
+ if (extent) {
653
+ const [xmin, ymin, xmax, ymax] = extent;
654
+ this.cartographicCenter = new Vector3(xmin + (xmax - xmin) / 2, ymin + (ymax - ymin) / 2, 0);
655
+ this.cartesianCenter = Ellipsoid.WGS84.cartographicToCartesian(
656
+ this.cartographicCenter,
657
+ new Vector3()
658
+ );
659
+ this.zoom = getZoomFromExtent(extent, this.cartographicCenter, this.cartesianCenter);
660
+ return;
661
+ }
662
+ // eslint-disable-next-line no-console
663
+ console.warn('Extent is not defined in the tileset header');
664
+ this.cartographicCenter = new Vector3();
665
+ this.zoom = 1;
666
+ return;
667
+ }
668
+
669
+ /**
670
+ * Called during initialize Tileset to initialize the tileset's cartographic center (longitude, latitude) and zoom.
671
+ * These metrics help apps center view on tileset.
672
+ * For 3DTiles the root tile data is used to calculate view props.
673
+ * @returns
674
+ */
675
+ private calculateViewPropsTiles3D() {
560
676
  const root = this.root as Tile3D;
561
677
  assert(root);
562
678
  const {center} = root.boundingVolume;
563
679
  // TODO - handle all cases
564
680
  if (!center) {
565
- // eslint-disable-next-line
681
+ // eslint-disable-next-line no-console
566
682
  console.warn('center was not pre-calculated for the root tile');
567
683
  this.cartographicCenter = new Vector3();
568
684
  this.zoom = 1;
569
685
  return;
570
686
  }
571
- this.cartographicCenter = Ellipsoid.WGS84.cartesianToCartographic(center, new Vector3());
687
+
688
+ // cartographic coordinates are undefined at the center of the ellipsoid
689
+ if (center[0] !== 0 || center[1] !== 0 || center[2] !== 0) {
690
+ this.cartographicCenter = Ellipsoid.WGS84.cartesianToCartographic(center, new Vector3());
691
+ } else {
692
+ this.cartographicCenter = new Vector3(0, 0, -Ellipsoid.WGS84.radii[0]);
693
+ }
572
694
  this.cartesianCenter = center;
573
- this.zoom = getZoomFromBoundingVolume(root.boundingVolume);
695
+ this.zoom = getZoomFromBoundingVolume(root.boundingVolume, this.cartographicCenter);
574
696
  }
575
697
 
576
698
  _initializeStats() {
@@ -582,7 +704,7 @@ export default class Tileset3D {
582
704
  this.stats.get(TILES_LOADED);
583
705
  this.stats.get(TILES_UNLOADED);
584
706
  this.stats.get(TILES_LOAD_FAILED);
585
- this.stats.get(POINTS_COUNT, 'memory');
707
+ this.stats.get(POINTS_COUNT);
586
708
  this.stats.get(TILES_GPU_MEMORY, 'memory');
587
709
  }
588
710
 
@@ -600,7 +722,7 @@ export default class Tileset3D {
600
722
  rootTile.depth = parentTileHeader.depth + 1;
601
723
  }
602
724
 
603
- // Cesium 3d tiles knows the hierarchy beforehand
725
+ // 3DTiles knows the hierarchy beforehand
604
726
  if (this.type === TILESET_TYPE.TILES3D) {
605
727
  const stack: Tile3D[] = [];
606
728
  stack.push(rootTile);
@@ -629,7 +751,7 @@ export default class Tileset3D {
629
751
  TraverserClass = Tileset3DTraverser;
630
752
  break;
631
753
  case TILESET_TYPE.I3S:
632
- TraverserClass = I3SetTraverser;
754
+ TraverserClass = I3STilesetTraverser;
633
755
  break;
634
756
  default:
635
757
  TraverserClass = TilesetTraverser;
@@ -673,15 +795,55 @@ export default class Tileset3D {
673
795
  return;
674
796
  }
675
797
 
798
+ if (this.type === TILESET_TYPE.I3S) {
799
+ // We can't calculate tiles total in I3S in advance so we calculate it dynamically.
800
+ const nodesInNodePages = this.tileset?.nodePagesTile?.nodesInNodePages || 0;
801
+ this.stats.get(TILES_TOTAL).reset();
802
+ this.stats.get(TILES_TOTAL).addCount(nodesInNodePages);
803
+ }
804
+
676
805
  // add coordinateOrigin and modelMatrix to tile
677
806
  if (tile && tile.content) {
678
807
  calculateTransformProps(tile, tile.content);
679
808
  }
680
809
 
810
+ this.updateContentTypes(tile);
681
811
  this._addTileToCache(tile);
682
812
  this.options.onTileLoad(tile);
683
813
  }
684
814
 
815
+ /**
816
+ * Update information about data types in nested tiles
817
+ * @param tile instance of a nested Tile3D
818
+ */
819
+ private updateContentTypes(tile: Tile3D) {
820
+ if (this.type === TILESET_TYPE.I3S) {
821
+ if (tile.header.isDracoGeometry) {
822
+ this.contentFormats.draco = true;
823
+ }
824
+ switch (tile.header.textureFormat) {
825
+ case 'dds':
826
+ this.contentFormats.dds = true;
827
+ break;
828
+ case 'ktx2':
829
+ this.contentFormats.ktx2 = true;
830
+ break;
831
+ default:
832
+ }
833
+ } else if (this.type === TILESET_TYPE.TILES3D) {
834
+ const {extensionsRemoved = []} = tile.content?.gltf || {};
835
+ if (extensionsRemoved.includes('KHR_draco_mesh_compression')) {
836
+ this.contentFormats.draco = true;
837
+ }
838
+ if (extensionsRemoved.includes('EXT_meshopt_compression')) {
839
+ this.contentFormats.meshopt = true;
840
+ }
841
+ if (extensionsRemoved.includes('KHR_texture_basisu')) {
842
+ this.contentFormats.ktx2 = true;
843
+ }
844
+ }
845
+ }
846
+
685
847
  _onStartTileLoading() {
686
848
  this._pendingCount++;
687
849
  this.stats.get(TILES_LOADING).incrementCount();
@@ -759,7 +921,7 @@ export default class Tileset3D {
759
921
  tile.destroy();
760
922
  }
761
923
 
762
- _initializeCesiumTileset(tilesetJson) {
924
+ _initializeTiles3DTileset(tilesetJson) {
763
925
  this.asset = tilesetJson.asset;
764
926
  if (!this.asset) {
765
927
  throw new Error('Tileset must have an asset property.');
@@ -1,7 +1,9 @@
1
+ // loaders.gl, MIT license
2
+
1
3
  // This file is derived from the Cesium code base under Apache 2 license
2
4
  // See LICENSE.md and https://github.com/AnalyticalGraphicsInc/cesium/blob/master/LICENSE.md
3
5
 
4
- import DoublyLinkedList from '../utils/doubly-linked-list';
6
+ import {DoublyLinkedList} from '../utils/doubly-linked-list';
5
7
 
6
8
  function defined(x) {
7
9
  return x !== undefined && x !== null;
@@ -12,7 +14,7 @@ function defined(x) {
12
14
  *
13
15
  * @private
14
16
  */
15
- export default class TilesetCache {
17
+ export class TilesetCache {
16
18
  private _list: DoublyLinkedList;
17
19
  private _sentinel: any;
18
20
  private _trimTiles: boolean;