@loaders.gl/tiles 4.4.5 → 5.0.0-alpha.2

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 (227) hide show
  1. package/LICENSE +14 -3
  2. package/README.md +110 -1
  3. package/dist/dist.dev.js +6588 -2057
  4. package/dist/dist.min.js +1 -1
  5. package/dist/image-set.d.ts +94 -0
  6. package/dist/image-set.d.ts.map +1 -0
  7. package/dist/image-set.js +243 -0
  8. package/dist/image-set.js.map +1 -0
  9. package/dist/index.cjs +6872 -2160
  10. package/dist/index.cjs.map +3 -4
  11. package/dist/index.d.ts +33 -9
  12. package/dist/index.d.ts.map +1 -1
  13. package/dist/index.js +18 -8
  14. package/dist/index.js.map +1 -1
  15. package/dist/point-cloud/point-cloud-tile.d.ts +47 -0
  16. package/dist/point-cloud/point-cloud-tile.d.ts.map +1 -0
  17. package/dist/point-cloud/point-cloud-tile.js +70 -0
  18. package/dist/point-cloud/point-cloud-tile.js.map +1 -0
  19. package/dist/point-cloud/point-cloud-tileset.d.ts +131 -0
  20. package/dist/point-cloud/point-cloud-tileset.d.ts.map +1 -0
  21. package/dist/point-cloud/point-cloud-tileset.js +510 -0
  22. package/dist/point-cloud/point-cloud-tileset.js.map +1 -0
  23. package/dist/point-cloud/types.d.ts +64 -0
  24. package/dist/point-cloud/types.d.ts.map +1 -0
  25. package/dist/point-cloud/types.js +5 -0
  26. package/dist/point-cloud/types.js.map +1 -0
  27. package/dist/raster-set.d.ts +113 -0
  28. package/dist/raster-set.d.ts.map +1 -0
  29. package/dist/raster-set.js +274 -0
  30. package/dist/raster-set.js.map +1 -0
  31. package/dist/tileset-2d/adapter.d.ts +38 -0
  32. package/dist/tileset-2d/adapter.d.ts.map +1 -0
  33. package/dist/tileset-2d/adapter.js +5 -0
  34. package/dist/tileset-2d/adapter.js.map +1 -0
  35. package/dist/tileset-2d/index.d.ts +7 -0
  36. package/dist/tileset-2d/index.d.ts.map +1 -0
  37. package/dist/tileset-2d/index.js +6 -0
  38. package/dist/tileset-2d/index.js.map +1 -0
  39. package/dist/tileset-2d/tile-2d-header.d.ts +68 -0
  40. package/dist/tileset-2d/tile-2d-header.d.ts.map +1 -0
  41. package/dist/tileset-2d/tile-2d-header.js +181 -0
  42. package/dist/tileset-2d/tile-2d-header.js.map +1 -0
  43. package/dist/tileset-2d/tileset-2d.d.ts +201 -0
  44. package/dist/tileset-2d/tileset-2d.d.ts.map +1 -0
  45. package/dist/tileset-2d/tileset-2d.js +532 -0
  46. package/dist/tileset-2d/tileset-2d.js.map +1 -0
  47. package/dist/tileset-2d/types.d.ts +44 -0
  48. package/dist/tileset-2d/types.d.ts.map +1 -0
  49. package/dist/tileset-2d/types.js +5 -0
  50. package/dist/tileset-2d/types.js.map +1 -0
  51. package/dist/tileset-2d.d.ts +2 -0
  52. package/dist/tileset-2d.d.ts.map +1 -0
  53. package/dist/tileset-2d.js +5 -0
  54. package/dist/tileset-2d.js.map +1 -0
  55. package/dist/tileset-3d/common/indexed-archive-tileset-source.d.ts +60 -0
  56. package/dist/tileset-3d/common/indexed-archive-tileset-source.d.ts.map +1 -0
  57. package/dist/tileset-3d/common/indexed-archive-tileset-source.js +125 -0
  58. package/dist/tileset-3d/common/indexed-archive-tileset-source.js.map +1 -0
  59. package/dist/{tileset → tileset-3d/common}/tile-3d.d.ts +133 -29
  60. package/dist/tileset-3d/common/tile-3d.d.ts.map +1 -0
  61. package/dist/{tileset → tileset-3d/common}/tile-3d.js +282 -77
  62. package/dist/tileset-3d/common/tile-3d.js.map +1 -0
  63. package/dist/tileset-3d/common/tileset-3d.d.ts +317 -0
  64. package/dist/tileset-3d/common/tileset-3d.d.ts.map +1 -0
  65. package/dist/tileset-3d/common/tileset-3d.js +807 -0
  66. package/dist/tileset-3d/common/tileset-3d.js.map +1 -0
  67. package/dist/tileset-3d/common/tileset-cache.d.ts +29 -0
  68. package/dist/tileset-3d/common/tileset-cache.d.ts.map +1 -0
  69. package/dist/{tileset → tileset-3d/common}/tileset-cache.js +12 -4
  70. package/dist/tileset-3d/common/tileset-cache.js.map +1 -0
  71. package/dist/tileset-3d/common/tileset-source.d.ts +204 -0
  72. package/dist/tileset-3d/common/tileset-source.d.ts.map +1 -0
  73. package/dist/tileset-3d/common/tileset-source.js +17 -0
  74. package/dist/tileset-3d/common/tileset-source.js.map +1 -0
  75. package/dist/{tileset → tileset-3d/common}/tileset-traverser.d.ts +15 -2
  76. package/dist/tileset-3d/common/tileset-traverser.d.ts.map +1 -0
  77. package/dist/{tileset → tileset-3d/common}/tileset-traverser.js +30 -3
  78. package/dist/tileset-3d/common/tileset-traverser.js.map +1 -0
  79. package/dist/tileset-3d/format-3d-tiles/implicit-tiling.d.ts +111 -0
  80. package/dist/tileset-3d/format-3d-tiles/implicit-tiling.d.ts.map +1 -0
  81. package/dist/tileset-3d/format-3d-tiles/implicit-tiling.js +340 -0
  82. package/dist/tileset-3d/format-3d-tiles/implicit-tiling.js.map +1 -0
  83. package/dist/tileset-3d/format-3d-tiles/tiles-3d-source.d.ts +189 -0
  84. package/dist/tileset-3d/format-3d-tiles/tiles-3d-source.d.ts.map +1 -0
  85. package/dist/tileset-3d/format-3d-tiles/tiles-3d-source.js +510 -0
  86. package/dist/tileset-3d/format-3d-tiles/tiles-3d-source.js.map +1 -0
  87. package/dist/tileset-3d/format-3d-tiles/tileset-3d-traverser.d.ts +43 -0
  88. package/dist/tileset-3d/format-3d-tiles/tileset-3d-traverser.d.ts.map +1 -0
  89. package/dist/tileset-3d/format-3d-tiles/tileset-3d-traverser.js +119 -0
  90. package/dist/tileset-3d/format-3d-tiles/tileset-3d-traverser.js.map +1 -0
  91. package/dist/tileset-3d/format-i3s/i3s-pending-tiles-register.d.ts.map +1 -0
  92. package/dist/{tileset → tileset-3d}/format-i3s/i3s-pending-tiles-register.js +3 -0
  93. package/dist/tileset-3d/format-i3s/i3s-pending-tiles-register.js.map +1 -0
  94. package/dist/tileset-3d/format-i3s/i3s-source.d.ts +99 -0
  95. package/dist/tileset-3d/format-i3s/i3s-source.d.ts.map +1 -0
  96. package/dist/tileset-3d/format-i3s/i3s-source.js +299 -0
  97. package/dist/tileset-3d/format-i3s/i3s-source.js.map +1 -0
  98. package/dist/tileset-3d/format-i3s/i3s-tile-manager.d.ts.map +1 -0
  99. package/dist/{tileset → tileset-3d}/format-i3s/i3s-tile-manager.js +5 -2
  100. package/dist/tileset-3d/format-i3s/i3s-tile-manager.js.map +1 -0
  101. package/dist/{tileset → tileset-3d}/format-i3s/i3s-tileset-traverser.d.ts +2 -2
  102. package/dist/tileset-3d/format-i3s/i3s-tileset-traverser.d.ts.map +1 -0
  103. package/dist/{tileset → tileset-3d}/format-i3s/i3s-tileset-traverser.js +17 -23
  104. package/dist/tileset-3d/format-i3s/i3s-tileset-traverser.js.map +1 -0
  105. package/dist/{tileset → tileset-3d}/helpers/3d-tiles-options.d.ts +1 -1
  106. package/dist/tileset-3d/helpers/3d-tiles-options.d.ts.map +1 -0
  107. package/dist/{tileset → tileset-3d}/helpers/3d-tiles-options.js +3 -0
  108. package/dist/tileset-3d/helpers/3d-tiles-options.js.map +1 -0
  109. package/dist/tileset-3d/helpers/bounding-volume.d.ts.map +1 -0
  110. package/dist/{tileset → tileset-3d}/helpers/bounding-volume.js +1 -0
  111. package/dist/tileset-3d/helpers/bounding-volume.js.map +1 -0
  112. package/dist/tileset-3d/helpers/frame-state.d.ts +86 -0
  113. package/dist/tileset-3d/helpers/frame-state.d.ts.map +1 -0
  114. package/dist/{tileset → tileset-3d}/helpers/frame-state.js +84 -9
  115. package/dist/tileset-3d/helpers/frame-state.js.map +1 -0
  116. package/dist/{tileset → tileset-3d}/helpers/i3s-lod.d.ts +1 -1
  117. package/dist/tileset-3d/helpers/i3s-lod.d.ts.map +1 -0
  118. package/dist/{tileset → tileset-3d}/helpers/i3s-lod.js +1 -1
  119. package/dist/tileset-3d/helpers/i3s-lod.js.map +1 -0
  120. package/dist/tileset-3d/helpers/tiles-3d-lod.d.ts +72 -0
  121. package/dist/tileset-3d/helpers/tiles-3d-lod.d.ts.map +1 -0
  122. package/dist/tileset-3d/helpers/tiles-3d-lod.js +257 -0
  123. package/dist/tileset-3d/helpers/tiles-3d-lod.js.map +1 -0
  124. package/dist/tileset-3d/helpers/tiles-3d-request-priority.d.ts +134 -0
  125. package/dist/tileset-3d/helpers/tiles-3d-request-priority.d.ts.map +1 -0
  126. package/dist/tileset-3d/helpers/tiles-3d-request-priority.js +179 -0
  127. package/dist/tileset-3d/helpers/tiles-3d-request-priority.js.map +1 -0
  128. package/dist/{tileset → tileset-3d}/helpers/transform-utils.d.ts +1 -1
  129. package/dist/tileset-3d/helpers/transform-utils.d.ts.map +1 -0
  130. package/dist/tileset-3d/helpers/transform-utils.js.map +1 -0
  131. package/dist/tileset-3d/helpers/zoom.d.ts.map +1 -0
  132. package/dist/tileset-3d/helpers/zoom.js.map +1 -0
  133. package/dist/types.d.ts +9 -0
  134. package/dist/types.d.ts.map +1 -1
  135. package/dist/types.js +3 -0
  136. package/dist/types.js.map +1 -1
  137. package/dist/utils/doubly-linked-list.d.ts.map +1 -1
  138. package/dist/utils/doubly-linked-list.js +1 -0
  139. package/dist/utils/doubly-linked-list.js.map +1 -1
  140. package/dist/utils/managed-array.d.ts.map +1 -1
  141. package/dist/utils/managed-array.js +1 -0
  142. package/dist/utils/managed-array.js.map +1 -1
  143. package/package.json +7 -6
  144. package/src/image-set.ts +328 -0
  145. package/src/index.ts +99 -9
  146. package/src/point-cloud/point-cloud-tile.ts +80 -0
  147. package/src/point-cloud/point-cloud-tileset.ts +713 -0
  148. package/src/point-cloud/types.ts +82 -0
  149. package/src/raster-set.ts +412 -0
  150. package/src/tileset-2d/adapter.ts +47 -0
  151. package/src/tileset-2d/index.ts +33 -0
  152. package/src/tileset-2d/tile-2d-header.ts +224 -0
  153. package/src/tileset-2d/tileset-2d.ts +716 -0
  154. package/src/tileset-2d/types.ts +39 -0
  155. package/src/tileset-2d.ts +5 -0
  156. package/src/tileset-3d/common/indexed-archive-tileset-source.ts +205 -0
  157. package/src/{tileset → tileset-3d/common}/tile-3d.ts +348 -93
  158. package/src/tileset-3d/common/tileset-3d.ts +1087 -0
  159. package/src/{tileset → tileset-3d/common}/tileset-cache.ts +16 -8
  160. package/src/tileset-3d/common/tileset-source.ts +255 -0
  161. package/src/{tileset → tileset-3d/common}/tileset-traverser.ts +32 -4
  162. package/src/tileset-3d/format-3d-tiles/implicit-tiling.ts +534 -0
  163. package/src/tileset-3d/format-3d-tiles/tiles-3d-source.ts +632 -0
  164. package/src/tileset-3d/format-3d-tiles/tileset-3d-traverser.ts +140 -0
  165. package/src/{tileset → tileset-3d}/format-i3s/i3s-pending-tiles-register.ts +4 -0
  166. package/src/tileset-3d/format-i3s/i3s-source.ts +366 -0
  167. package/src/{tileset → tileset-3d}/format-i3s/i3s-tile-manager.ts +6 -2
  168. package/src/{tileset → tileset-3d}/format-i3s/i3s-tileset-traverser.ts +19 -24
  169. package/src/{tileset → tileset-3d}/helpers/3d-tiles-options.ts +5 -1
  170. package/src/{tileset → tileset-3d}/helpers/bounding-volume.ts +2 -0
  171. package/src/tileset-3d/helpers/frame-state.ts +311 -0
  172. package/src/{tileset → tileset-3d}/helpers/i3s-lod.ts +2 -2
  173. package/src/tileset-3d/helpers/tiles-3d-lod.ts +370 -0
  174. package/src/tileset-3d/helpers/tiles-3d-request-priority.ts +301 -0
  175. package/src/{tileset → tileset-3d}/helpers/transform-utils.ts +1 -1
  176. package/src/types.ts +13 -0
  177. package/src/utils/doubly-linked-list.ts +2 -0
  178. package/src/utils/managed-array.ts +2 -0
  179. package/dist/tileset/format-3d-tiles/tileset-3d-traverser.d.ts +0 -7
  180. package/dist/tileset/format-3d-tiles/tileset-3d-traverser.d.ts.map +0 -1
  181. package/dist/tileset/format-3d-tiles/tileset-3d-traverser.js +0 -53
  182. package/dist/tileset/format-3d-tiles/tileset-3d-traverser.js.map +0 -1
  183. package/dist/tileset/format-i3s/i3s-pending-tiles-register.d.ts.map +0 -1
  184. package/dist/tileset/format-i3s/i3s-pending-tiles-register.js.map +0 -1
  185. package/dist/tileset/format-i3s/i3s-tile-manager.d.ts.map +0 -1
  186. package/dist/tileset/format-i3s/i3s-tile-manager.js.map +0 -1
  187. package/dist/tileset/format-i3s/i3s-tileset-traverser.d.ts.map +0 -1
  188. package/dist/tileset/format-i3s/i3s-tileset-traverser.js.map +0 -1
  189. package/dist/tileset/helpers/3d-tiles-options.d.ts.map +0 -1
  190. package/dist/tileset/helpers/3d-tiles-options.js.map +0 -1
  191. package/dist/tileset/helpers/bounding-volume.d.ts.map +0 -1
  192. package/dist/tileset/helpers/bounding-volume.js.map +0 -1
  193. package/dist/tileset/helpers/frame-state.d.ts +0 -28
  194. package/dist/tileset/helpers/frame-state.d.ts.map +0 -1
  195. package/dist/tileset/helpers/frame-state.js.map +0 -1
  196. package/dist/tileset/helpers/i3s-lod.d.ts.map +0 -1
  197. package/dist/tileset/helpers/i3s-lod.js.map +0 -1
  198. package/dist/tileset/helpers/tiles-3d-lod.d.ts +0 -8
  199. package/dist/tileset/helpers/tiles-3d-lod.d.ts.map +0 -1
  200. package/dist/tileset/helpers/tiles-3d-lod.js +0 -113
  201. package/dist/tileset/helpers/tiles-3d-lod.js.map +0 -1
  202. package/dist/tileset/helpers/transform-utils.d.ts.map +0 -1
  203. package/dist/tileset/helpers/transform-utils.js.map +0 -1
  204. package/dist/tileset/helpers/zoom.d.ts.map +0 -1
  205. package/dist/tileset/helpers/zoom.js.map +0 -1
  206. package/dist/tileset/tile-3d.d.ts.map +0 -1
  207. package/dist/tileset/tile-3d.js.map +0 -1
  208. package/dist/tileset/tileset-3d.d.ts +0 -284
  209. package/dist/tileset/tileset-3d.d.ts.map +0 -1
  210. package/dist/tileset/tileset-3d.js +0 -814
  211. package/dist/tileset/tileset-3d.js.map +0 -1
  212. package/dist/tileset/tileset-cache.d.ts +0 -19
  213. package/dist/tileset/tileset-cache.d.ts.map +0 -1
  214. package/dist/tileset/tileset-cache.js.map +0 -1
  215. package/dist/tileset/tileset-traverser.d.ts.map +0 -1
  216. package/dist/tileset/tileset-traverser.js.map +0 -1
  217. package/src/tileset/format-3d-tiles/tileset-3d-traverser.ts +0 -63
  218. package/src/tileset/helpers/frame-state.ts +0 -183
  219. package/src/tileset/helpers/tiles-3d-lod.ts +0 -149
  220. package/src/tileset/tileset-3d.ts +0 -1037
  221. /package/dist/{tileset → tileset-3d}/format-i3s/i3s-pending-tiles-register.d.ts +0 -0
  222. /package/dist/{tileset → tileset-3d}/format-i3s/i3s-tile-manager.d.ts +0 -0
  223. /package/dist/{tileset → tileset-3d}/helpers/bounding-volume.d.ts +0 -0
  224. /package/dist/{tileset → tileset-3d}/helpers/transform-utils.js +0 -0
  225. /package/dist/{tileset → tileset-3d}/helpers/zoom.d.ts +0 -0
  226. /package/dist/{tileset → tileset-3d}/helpers/zoom.js +0 -0
  227. /package/src/{tileset → tileset-3d}/helpers/zoom.ts +0 -0
@@ -7,7 +7,7 @@
7
7
 
8
8
  import type {Tileset3D} from './tileset-3d';
9
9
  import type {Tile3D} from './tile-3d';
10
- import {DoublyLinkedList} from '../utils/doubly-linked-list';
10
+ import {DoublyLinkedList} from '../../utils/doubly-linked-list';
11
11
 
12
12
  /**
13
13
  * Stores tiles with content loaded.
@@ -71,24 +71,32 @@ export class TilesetCache {
71
71
  }
72
72
  }
73
73
 
74
- unloadTiles(tileset, unloadCallback): void {
74
+ /**
75
+ * Unloads least-recently-used tiles until the byte-native cache target is met.
76
+ *
77
+ * Tiles touched after the frame sentinel remain protected, so {@link Tileset3D.cacheBytes} is a
78
+ * soft target rather than a hard cap on the visible working set. Overflow headroom affects
79
+ * memory-adjusted SSE, not eviction of unused tiles.
80
+ *
81
+ * @param tileset - Tileset that owns the cache and reports estimated content memory.
82
+ * @param unloadCallback - Callback that releases content and decrements the memory estimate.
83
+ */
84
+ unloadTiles(
85
+ tileset: Tileset3D,
86
+ unloadCallback?: (tileset: Tileset3D, tile: Tile3D) => void
87
+ ): void {
75
88
  const trimTiles = this._trimTiles;
76
89
  this._trimTiles = false;
77
90
 
78
91
  const list = this._list;
79
92
 
80
- const maximumMemoryUsageInBytes = tileset.maximumMemoryUsage * 1024 * 1024;
81
-
82
93
  // Traverse the list only to the sentinel since tiles/nodes to the
83
94
  // right of the sentinel were used this frame.
84
95
  // The sub-list to the left of the sentinel is ordered from LRU to MRU.
85
96
  const sentinel = this._sentinel;
86
97
  let node = list.head;
87
98
 
88
- while (
89
- node !== sentinel &&
90
- (tileset.gpuMemoryUsageInBytes > maximumMemoryUsageInBytes || trimTiles)
91
- ) {
99
+ while (node !== sentinel && (tileset.gpuMemoryUsageInBytes > tileset.cacheBytes || trimTiles)) {
92
100
  // @ts-expect-error
93
101
  const tile = node.item;
94
102
  // @ts-expect-error
@@ -0,0 +1,255 @@
1
+ // loaders.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+
5
+ import type {CoreAPI, LoaderOptions, LoaderWithParser} from '@loaders.gl/loader-utils';
6
+ import type {Vector3} from '@math.gl/core';
7
+ import type {TilesetTraverser, TilesetTraverserProps} from './tileset-traverser';
8
+ import type {Tile3D} from './tile-3d';
9
+ import type {Tileset3D} from './tileset-3d';
10
+ import type {FrameState} from '../helpers/frame-state';
11
+ import type {TILESET_TYPE} from '../../constants';
12
+
13
+ /**
14
+ * Parsed top-level tileset payload consumed by {@link Tileset3D} or a {@link Tileset3DSource}.
15
+ */
16
+ export type TilesetJSON = any;
17
+
18
+ /**
19
+ * Resource-loading strategy used by source implementations to fetch and parse root metadata
20
+ * and tile resources.
21
+ */
22
+ export type TilesetSourceResolver = {
23
+ /**
24
+ * Loads and parses the root metadata resource for a source.
25
+ */
26
+ loadRoot<DataT>(
27
+ url: string,
28
+ loader: LoaderWithParser<DataT>,
29
+ loadOptions: LoaderOptions
30
+ ): Promise<DataT>;
31
+
32
+ /**
33
+ * Loads and parses an arbitrary source-relative resource.
34
+ */
35
+ loadResource<DataT>(
36
+ url: string,
37
+ loader: LoaderWithParser<DataT>,
38
+ loadOptions: LoaderOptions
39
+ ): Promise<DataT>;
40
+ };
41
+
42
+ /**
43
+ * URL-based source input used when a source is responsible for fetching root metadata.
44
+ */
45
+ export type TilesetSourceRequest = {
46
+ /** Absolute root metadata URL. */
47
+ url: string;
48
+ /** Loader used to fetch and parse the root metadata. */
49
+ loader: LoaderWithParser;
50
+ /** Optional base path override for relative resources. */
51
+ basePath?: string;
52
+ /** Optional resource-loading strategy used for archive-backed datasets. */
53
+ resolver?: TilesetSourceResolver;
54
+ /** Optional core API implementation used for nested source loading. */
55
+ coreApi?: CoreAPI;
56
+ };
57
+
58
+ /**
59
+ * Constructor input accepted by explicit source implementations.
60
+ *
61
+ * Request descriptors are the public path. Preloaded metadata remains useful for tests and
62
+ * internal call sites that already own parsed root metadata.
63
+ */
64
+ export type TilesetSourceInput = TilesetJSON | TilesetSourceRequest;
65
+
66
+ /**
67
+ * Result of a source-managed tile content request.
68
+ */
69
+ export type TileContentLoadResult = {
70
+ /** Whether the tile content request produced usable content. */
71
+ loaded: boolean;
72
+ /** Nested tileset metadata to install below the loaded tile, if any. */
73
+ nestedTileset?: TilesetJSON;
74
+ };
75
+
76
+ /** Result of a source-managed lazy child-header request. */
77
+ export type TileChildrenLoadResult = {
78
+ /** Whether a subtree resource was loaded and installed. */
79
+ loaded: boolean;
80
+ /** Number of available tiles described by the subtree, including its existing root placeholder. */
81
+ tileCount: number;
82
+ /** Number of lazy child-subtree references installed at the new boundary. */
83
+ childSubtreeCount: number;
84
+ };
85
+
86
+ /**
87
+ * Flags describing compression and texture formats observed while streaming tile content.
88
+ */
89
+ export type TilesetContentFormats = {
90
+ draco: boolean;
91
+ meshopt: boolean;
92
+ dds: boolean;
93
+ ktx2: boolean;
94
+ };
95
+
96
+ /**
97
+ * Optional view-state metadata exposed by a {@link Tileset3DSource} after initialization.
98
+ */
99
+ export type TilesetSourceViewState = {
100
+ cartographicCenter?: Vector3 | null;
101
+ cartesianCenter?: Vector3 | null;
102
+ zoom?: number;
103
+ boundingVolume?: any;
104
+ description?: string;
105
+ properties?: any;
106
+ extras?: any;
107
+ credits?: any;
108
+ asset?: Record<string, any>;
109
+ };
110
+
111
+ /**
112
+ * Normalized source metadata consumed by {@link Tileset3D}.
113
+ */
114
+ export type TilesetSourceMetadata = {
115
+ /** Format discriminator. */
116
+ type: TILESET_TYPE;
117
+ /** Loader used for metadata and content requests. */
118
+ loader: LoaderWithParser;
119
+ /** Absolute root metadata URL. */
120
+ url: string;
121
+ /** Base path used for relative resource resolution. */
122
+ basePath: string;
123
+ /** Parsed and normalized source payload. */
124
+ tileset: TilesetJSON;
125
+ /** Root lod metric type used as fallback by runtime tiles. */
126
+ lodMetricType: string;
127
+ /** Root lod metric value used as fallback by runtime tiles. */
128
+ lodMetricValue: number;
129
+ /** Root refinement mode used as fallback by runtime tiles. */
130
+ refine: string;
131
+ };
132
+
133
+ /**
134
+ * Format-specific adapter used by {@link Tileset3D} for initialization, loading, and metadata access.
135
+ */
136
+ export interface Tileset3DSource {
137
+ /** Tileset format discriminator. */
138
+ readonly type: TILESET_TYPE;
139
+ /** Loader used for content and metadata requests. */
140
+ readonly loader: LoaderWithParser;
141
+ /** Absolute URL of the root tileset resource. */
142
+ readonly url: string;
143
+ /** Base directory used for relative resource resolution. */
144
+ readonly basePath: string;
145
+ /** Source-specific root tileset payload, when available. */
146
+ readonly tileset?: TilesetJSON | null;
147
+ /** Loader options forwarded to metadata and content requests. */
148
+ readonly loadOptions: LoaderOptions;
149
+ /** Core API used for source-managed loads, when injected by the caller. */
150
+ coreApi?: CoreAPI;
151
+ /** Accumulated content-format flags for the tileset. */
152
+ readonly contentFormats: TilesetContentFormats;
153
+ /** Format-specific asset metadata, if any. */
154
+ asset?: Record<string, any>;
155
+ /** Per-feature property schema, if any. */
156
+ properties?: any;
157
+ /** Application-specific root metadata, if any. */
158
+ extras?: any;
159
+ /** Attribution and credit metadata, if any. */
160
+ credits?: any;
161
+
162
+ /** Normalized source metadata after initialization. */
163
+ metadata?: TilesetSourceMetadata;
164
+
165
+ /**
166
+ * Initializes source state before traversal begins.
167
+ */
168
+ initialize(): Promise<void>;
169
+
170
+ /** Releases source-local caches and prevents late asynchronous work from mutating runtime tiles. */
171
+ destroy?(): void;
172
+
173
+ /**
174
+ * Returns normalized source metadata after initialization completes.
175
+ */
176
+ getMetadata(): TilesetSourceMetadata;
177
+
178
+ /**
179
+ * Returns the root tileset payload after source initialization completes.
180
+ */
181
+ getRootTileset(): Promise<TilesetJSON>;
182
+
183
+ /**
184
+ * Creates the runtime tile tree for a tileset payload or nested subtree.
185
+ */
186
+ initializeTileHeaders(
187
+ tileset: Tileset3D,
188
+ tilesetJson: TilesetJSON,
189
+ parentTile?: Tile3D | null
190
+ ): Tile3D;
191
+
192
+ /**
193
+ * Creates the traverser implementation appropriate for this source.
194
+ */
195
+ createTraverser(options: TilesetTraverserProps): TilesetTraverser;
196
+
197
+ /**
198
+ * Loads renderable content for a tile.
199
+ */
200
+ loadTileContent(tile: Tile3D): Promise<TileContentLoadResult>;
201
+
202
+ /**
203
+ * Loads and installs a complete lazy child-header group for a runtime tile.
204
+ *
205
+ * Sources that implement this hook retain ownership of resource parsing, caching, query
206
+ * inheritance, and archive resolution. Traversal calls it only after visibility and LOD checks.
207
+ */
208
+ loadTileChildren?(tile: Tile3D, frameState: FrameState): Promise<TileChildrenLoadResult>;
209
+
210
+ /**
211
+ * Resolves a tile-relative path to the final request URL.
212
+ */
213
+ getTileUrl(tilePath: string): string;
214
+
215
+ /**
216
+ * Returns tileset-level view metadata derived from the loaded source.
217
+ */
218
+ getViewState(rootTile: Tile3D | null): TilesetSourceViewState;
219
+
220
+ /**
221
+ * Checks whether the source declares a specific extension.
222
+ */
223
+ hasExtension?(extensionName: string): boolean;
224
+
225
+ /**
226
+ * Loads child tile metadata on demand for formats that do not expose the full tree up front.
227
+ */
228
+ loadChildTileHeader?(parentTile: Tile3D, childId: string, frameState: FrameState): Promise<any>;
229
+
230
+ /**
231
+ * Updates source-managed bookkeeping after a tile finishes loading.
232
+ */
233
+ onTileLoaded?(tileset: Tileset3D, tile: Tile3D, loadResult: TileContentLoadResult): void;
234
+
235
+ /**
236
+ * Returns the total known tile count for stats, if available.
237
+ */
238
+ getTilesTotalCount?(): number | null;
239
+ }
240
+
241
+ /**
242
+ * Type guard for distinguishing a source-backed constructor input from other runtime values.
243
+ * @param value Value to test.
244
+ * @returns `true` when the value implements the {@link Tileset3DSource} contract.
245
+ */
246
+ export function isTileset3DSource(value: unknown): value is Tileset3DSource {
247
+ return Boolean(
248
+ value &&
249
+ typeof value === 'object' &&
250
+ 'initialize' in value &&
251
+ 'getRootTileset' in value &&
252
+ 'initializeTileHeaders' in value &&
253
+ 'loadTileContent' in value
254
+ );
255
+ }
@@ -3,9 +3,9 @@
3
3
  // Copyright (c) vis.gl contributors
4
4
 
5
5
  import type {Tile3D} from './tile-3d';
6
- import {ManagedArray} from '../utils/managed-array';
7
- import {TILE_REFINEMENT} from '../constants';
8
- import {FrameState} from './helpers/frame-state';
6
+ import {ManagedArray} from '../../utils/managed-array';
7
+ import {TILE_REFINEMENT} from '../../constants';
8
+ import {FrameState} from '../helpers/frame-state';
9
9
 
10
10
  export type TilesetTraverserProps = {
11
11
  loadSiblings?: boolean;
@@ -35,6 +35,8 @@ export class TilesetTraverser {
35
35
  selectedTiles: Record<string, Tile3D> = {};
36
36
  // tiles should be loaded from server
37
37
  requestedTiles: Record<string, Tile3D> = {};
38
+ /** Tiles intentionally held until the camera has remained still for the configured delay. */
39
+ deferredTiles: Record<string, Tile3D> = {};
38
40
  // tiles does not have render content
39
41
  emptyTiles: Record<string, Tile3D> = {};
40
42
 
@@ -73,6 +75,7 @@ export class TilesetTraverser {
73
75
 
74
76
  reset() {
75
77
  this.requestedTiles = {};
78
+ this.deferredTiles = {};
76
79
  this.selectedTiles = {};
77
80
  this.emptyTiles = {};
78
81
  this._traversalStack.reset();
@@ -235,12 +238,30 @@ export class TilesetTraverser {
235
238
  // tile to load from server
236
239
  loadTile(tile: Tile3D, frameState: FrameState): void {
237
240
  if (this.shouldLoadTile(tile)) {
241
+ if (this.shouldDeferTileRequest(tile)) {
242
+ this.deferredTiles[tile.id] = tile;
243
+ return;
244
+ }
238
245
  tile._requestedFrame = frameState.frameNumber;
239
246
  tile._priority = tile._getPriority();
240
247
  this.requestedTiles[tile.id] = tile;
241
248
  }
242
249
  }
243
250
 
251
+ /**
252
+ * Returns whether an eligible peripheral request should wait for camera motion to settle.
253
+ *
254
+ * Eligibility and the current time window are calculated together when tile visibility updates.
255
+ * Keeping the active state on the tile also lets a queued scheduler callback cancel work that
256
+ * became deferred after its original traversal.
257
+ *
258
+ * @param tile - Tile considered for loading.
259
+ * @returns `true` when the request should be retried after the remaining delay.
260
+ */
261
+ shouldDeferTileRequest(tile: Tile3D): boolean {
262
+ return tile.priorityDeferred;
263
+ }
264
+
244
265
  // cache tile
245
266
  touchTile(tile: Tile3D, frameState: FrameState): void {
246
267
  tile.tileset._cache.touch(tile);
@@ -323,6 +344,7 @@ export class TilesetTraverser {
323
344
  // Ignores visibility.
324
345
  executeEmptyTraversal(root: Tile3D, frameState: FrameState): boolean {
325
346
  let allDescendantsLoaded = true;
347
+ let hasPendingLazyChildren = false;
326
348
  const stack = this._emptyTraversalStack;
327
349
  stack.push(root);
328
350
 
@@ -331,6 +353,12 @@ export class TilesetTraverser {
331
353
 
332
354
  const traverse = !tile.hasRenderContent && this.canTraverse(tile, frameState);
333
355
  const emptyLeaf = !tile.hasRenderContent && tile.children.length === 0;
356
+ if (tile.header.implicitSubtree) {
357
+ // An unresolved implicit boundary is not a proven empty leaf. Treating it as loaded would
358
+ // allow REPLACE traversal to drop its ancestor before availability and content are known.
359
+ hasPendingLazyChildren = true;
360
+ allDescendantsLoaded = false;
361
+ }
334
362
 
335
363
  // Traversal stops but the tile does not have content yet
336
364
  // There will be holes if the parent tries to refine to its children, so don't refine
@@ -353,6 +381,6 @@ export class TilesetTraverser {
353
381
  }
354
382
  }
355
383
  }
356
- return root.hasEmptyContent || allDescendantsLoaded;
384
+ return (root.hasEmptyContent && !hasPendingLazyChildren) || allDescendantsLoaded;
357
385
  }
358
386
  }