@loaders.gl/tiles 4.4.2 → 5.0.0-alpha.1

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 (198) hide show
  1. package/README.md +110 -1
  2. package/dist/dist.dev.js +4359 -1950
  3. package/dist/dist.min.js +1 -1
  4. package/dist/image-set.d.ts +94 -0
  5. package/dist/image-set.d.ts.map +1 -0
  6. package/dist/image-set.js +243 -0
  7. package/dist/image-set.js.map +1 -0
  8. package/dist/index.cjs +4178 -1892
  9. package/dist/index.cjs.map +4 -4
  10. package/dist/index.d.ts +27 -9
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +17 -8
  13. package/dist/index.js.map +1 -1
  14. package/dist/point-cloud/point-cloud-tile.d.ts +47 -0
  15. package/dist/point-cloud/point-cloud-tile.d.ts.map +1 -0
  16. package/dist/point-cloud/point-cloud-tile.js +67 -0
  17. package/dist/point-cloud/point-cloud-tile.js.map +1 -0
  18. package/dist/point-cloud/point-cloud-tileset.d.ts +131 -0
  19. package/dist/point-cloud/point-cloud-tileset.d.ts.map +1 -0
  20. package/dist/point-cloud/point-cloud-tileset.js +507 -0
  21. package/dist/point-cloud/point-cloud-tileset.js.map +1 -0
  22. package/dist/point-cloud/types.d.ts +64 -0
  23. package/dist/point-cloud/types.d.ts.map +1 -0
  24. package/dist/point-cloud/types.js +2 -0
  25. package/dist/point-cloud/types.js.map +1 -0
  26. package/dist/raster-set.d.ts +107 -0
  27. package/dist/raster-set.d.ts.map +1 -0
  28. package/dist/raster-set.js +268 -0
  29. package/dist/raster-set.js.map +1 -0
  30. package/dist/tileset-2d/adapter.d.ts +38 -0
  31. package/dist/tileset-2d/adapter.d.ts.map +1 -0
  32. package/dist/tileset-2d/adapter.js +5 -0
  33. package/dist/tileset-2d/adapter.js.map +1 -0
  34. package/dist/tileset-2d/index.d.ts +7 -0
  35. package/dist/tileset-2d/index.d.ts.map +1 -0
  36. package/dist/tileset-2d/index.js +6 -0
  37. package/dist/tileset-2d/index.js.map +1 -0
  38. package/dist/tileset-2d/tile-2d-header.d.ts +68 -0
  39. package/dist/tileset-2d/tile-2d-header.d.ts.map +1 -0
  40. package/dist/tileset-2d/tile-2d-header.js +181 -0
  41. package/dist/tileset-2d/tile-2d-header.js.map +1 -0
  42. package/dist/tileset-2d/tileset-2d.d.ts +201 -0
  43. package/dist/tileset-2d/tileset-2d.d.ts.map +1 -0
  44. package/dist/tileset-2d/tileset-2d.js +532 -0
  45. package/dist/tileset-2d/tileset-2d.js.map +1 -0
  46. package/dist/tileset-2d/types.d.ts +44 -0
  47. package/dist/tileset-2d/types.d.ts.map +1 -0
  48. package/dist/tileset-2d/types.js +5 -0
  49. package/dist/tileset-2d/types.js.map +1 -0
  50. package/dist/tileset-2d.d.ts +2 -0
  51. package/dist/tileset-2d.d.ts.map +1 -0
  52. package/dist/tileset-2d.js +5 -0
  53. package/dist/tileset-2d.js.map +1 -0
  54. package/dist/tileset-3d/common/indexed-archive-tileset-source.d.ts +60 -0
  55. package/dist/tileset-3d/common/indexed-archive-tileset-source.d.ts.map +1 -0
  56. package/dist/tileset-3d/common/indexed-archive-tileset-source.js +125 -0
  57. package/dist/tileset-3d/common/indexed-archive-tileset-source.js.map +1 -0
  58. package/dist/{tileset → tileset-3d/common}/tile-3d.d.ts +36 -27
  59. package/dist/tileset-3d/common/tile-3d.d.ts.map +1 -0
  60. package/dist/{tileset → tileset-3d/common}/tile-3d.js +53 -62
  61. package/dist/tileset-3d/common/tile-3d.js.map +1 -0
  62. package/dist/tileset-3d/common/tileset-3d.d.ts +177 -0
  63. package/dist/tileset-3d/common/tileset-3d.d.ts.map +1 -0
  64. package/dist/tileset-3d/common/tileset-3d.js +566 -0
  65. package/dist/tileset-3d/common/tileset-3d.js.map +1 -0
  66. package/dist/tileset-3d/common/tileset-cache.d.ts.map +1 -0
  67. package/dist/{tileset → tileset-3d/common}/tileset-cache.js +1 -1
  68. package/dist/tileset-3d/common/tileset-cache.js.map +1 -0
  69. package/dist/tileset-3d/common/tileset-source.d.ts +186 -0
  70. package/dist/tileset-3d/common/tileset-source.d.ts.map +1 -0
  71. package/dist/tileset-3d/common/tileset-source.js +17 -0
  72. package/dist/tileset-3d/common/tileset-source.js.map +1 -0
  73. package/dist/{tileset → tileset-3d/common}/tileset-traverser.d.ts +2 -2
  74. package/dist/tileset-3d/common/tileset-traverser.d.ts.map +1 -0
  75. package/dist/{tileset → tileset-3d/common}/tileset-traverser.js +2 -2
  76. package/dist/tileset-3d/common/tileset-traverser.js.map +1 -0
  77. package/dist/tileset-3d/format-3d-tiles/tiles-3d-source.d.ts +100 -0
  78. package/dist/tileset-3d/format-3d-tiles/tiles-3d-source.d.ts.map +1 -0
  79. package/dist/tileset-3d/format-3d-tiles/tiles-3d-source.js +312 -0
  80. package/dist/tileset-3d/format-3d-tiles/tiles-3d-source.js.map +1 -0
  81. package/dist/{tileset → tileset-3d}/format-3d-tiles/tileset-3d-traverser.d.ts +1 -1
  82. package/dist/tileset-3d/format-3d-tiles/tileset-3d-traverser.d.ts.map +1 -0
  83. package/dist/{tileset → tileset-3d}/format-3d-tiles/tileset-3d-traverser.js +1 -1
  84. package/dist/tileset-3d/format-3d-tiles/tileset-3d-traverser.js.map +1 -0
  85. package/dist/tileset-3d/format-i3s/i3s-pending-tiles-register.d.ts.map +1 -0
  86. package/dist/tileset-3d/format-i3s/i3s-pending-tiles-register.js.map +1 -0
  87. package/dist/tileset-3d/format-i3s/i3s-source.d.ts +99 -0
  88. package/dist/tileset-3d/format-i3s/i3s-source.d.ts.map +1 -0
  89. package/dist/tileset-3d/format-i3s/i3s-source.js +299 -0
  90. package/dist/tileset-3d/format-i3s/i3s-source.js.map +1 -0
  91. package/dist/tileset-3d/format-i3s/i3s-tile-manager.d.ts.map +1 -0
  92. package/dist/{tileset → tileset-3d}/format-i3s/i3s-tile-manager.js +2 -2
  93. package/dist/tileset-3d/format-i3s/i3s-tile-manager.js.map +1 -0
  94. package/dist/{tileset → tileset-3d}/format-i3s/i3s-tileset-traverser.d.ts +2 -2
  95. package/dist/tileset-3d/format-i3s/i3s-tileset-traverser.d.ts.map +1 -0
  96. package/dist/{tileset → tileset-3d}/format-i3s/i3s-tileset-traverser.js +14 -23
  97. package/dist/tileset-3d/format-i3s/i3s-tileset-traverser.js.map +1 -0
  98. package/dist/{tileset → tileset-3d}/helpers/3d-tiles-options.d.ts +1 -1
  99. package/dist/tileset-3d/helpers/3d-tiles-options.d.ts.map +1 -0
  100. package/dist/tileset-3d/helpers/3d-tiles-options.js.map +1 -0
  101. package/dist/tileset-3d/helpers/bounding-volume.d.ts.map +1 -0
  102. package/dist/tileset-3d/helpers/bounding-volume.js.map +1 -0
  103. package/dist/{tileset → tileset-3d}/helpers/frame-state.d.ts +1 -1
  104. package/dist/tileset-3d/helpers/frame-state.d.ts.map +1 -0
  105. package/dist/tileset-3d/helpers/frame-state.js.map +1 -0
  106. package/dist/{tileset → tileset-3d}/helpers/i3s-lod.d.ts +1 -1
  107. package/dist/tileset-3d/helpers/i3s-lod.d.ts.map +1 -0
  108. package/dist/{tileset → tileset-3d}/helpers/i3s-lod.js +1 -1
  109. package/dist/tileset-3d/helpers/i3s-lod.js.map +1 -0
  110. package/dist/tileset-3d/helpers/tiles-3d-lod.d.ts +20 -0
  111. package/dist/tileset-3d/helpers/tiles-3d-lod.d.ts.map +1 -0
  112. package/dist/{tileset → tileset-3d}/helpers/tiles-3d-lod.js +43 -4
  113. package/dist/tileset-3d/helpers/tiles-3d-lod.js.map +1 -0
  114. package/dist/{tileset → tileset-3d}/helpers/transform-utils.d.ts +1 -1
  115. package/dist/tileset-3d/helpers/transform-utils.d.ts.map +1 -0
  116. package/dist/tileset-3d/helpers/transform-utils.js.map +1 -0
  117. package/dist/tileset-3d/helpers/zoom.d.ts.map +1 -0
  118. package/dist/tileset-3d/helpers/zoom.js.map +1 -0
  119. package/dist/types.d.ts +7 -0
  120. package/dist/types.d.ts.map +1 -1
  121. package/package.json +7 -6
  122. package/src/image-set.ts +328 -0
  123. package/src/index.ts +80 -9
  124. package/src/point-cloud/point-cloud-tile.ts +76 -0
  125. package/src/point-cloud/point-cloud-tileset.ts +709 -0
  126. package/src/point-cloud/types.ts +78 -0
  127. package/src/raster-set.ts +374 -0
  128. package/src/tileset-2d/adapter.ts +47 -0
  129. package/src/tileset-2d/index.ts +33 -0
  130. package/src/tileset-2d/tile-2d-header.ts +224 -0
  131. package/src/tileset-2d/tileset-2d.ts +716 -0
  132. package/src/tileset-2d/types.ts +39 -0
  133. package/src/tileset-2d.ts +5 -0
  134. package/src/tileset-3d/common/indexed-archive-tileset-source.ts +205 -0
  135. package/src/{tileset → tileset-3d/common}/tile-3d.ts +64 -73
  136. package/src/tileset-3d/common/tileset-3d.ts +736 -0
  137. package/src/{tileset → tileset-3d/common}/tileset-cache.ts +1 -1
  138. package/src/tileset-3d/common/tileset-source.ts +234 -0
  139. package/src/{tileset → tileset-3d/common}/tileset-traverser.ts +3 -3
  140. package/src/tileset-3d/format-3d-tiles/tiles-3d-source.ts +379 -0
  141. package/src/{tileset → tileset-3d}/format-3d-tiles/tileset-3d-traverser.ts +1 -1
  142. package/src/tileset-3d/format-i3s/i3s-source.ts +366 -0
  143. package/src/{tileset → tileset-3d}/format-i3s/i3s-tile-manager.ts +2 -2
  144. package/src/{tileset → tileset-3d}/format-i3s/i3s-tileset-traverser.ts +15 -24
  145. package/src/{tileset → tileset-3d}/helpers/3d-tiles-options.ts +1 -1
  146. package/src/{tileset → tileset-3d}/helpers/frame-state.ts +1 -1
  147. package/src/{tileset → tileset-3d}/helpers/i3s-lod.ts +2 -2
  148. package/src/{tileset → tileset-3d}/helpers/tiles-3d-lod.ts +46 -4
  149. package/src/{tileset → tileset-3d}/helpers/transform-utils.ts +1 -1
  150. package/src/types.ts +7 -0
  151. package/dist/tileset/format-3d-tiles/tileset-3d-traverser.d.ts.map +0 -1
  152. package/dist/tileset/format-3d-tiles/tileset-3d-traverser.js.map +0 -1
  153. package/dist/tileset/format-i3s/i3s-pending-tiles-register.d.ts.map +0 -1
  154. package/dist/tileset/format-i3s/i3s-pending-tiles-register.js.map +0 -1
  155. package/dist/tileset/format-i3s/i3s-tile-manager.d.ts.map +0 -1
  156. package/dist/tileset/format-i3s/i3s-tile-manager.js.map +0 -1
  157. package/dist/tileset/format-i3s/i3s-tileset-traverser.d.ts.map +0 -1
  158. package/dist/tileset/format-i3s/i3s-tileset-traverser.js.map +0 -1
  159. package/dist/tileset/helpers/3d-tiles-options.d.ts.map +0 -1
  160. package/dist/tileset/helpers/3d-tiles-options.js.map +0 -1
  161. package/dist/tileset/helpers/bounding-volume.d.ts.map +0 -1
  162. package/dist/tileset/helpers/bounding-volume.js.map +0 -1
  163. package/dist/tileset/helpers/frame-state.d.ts.map +0 -1
  164. package/dist/tileset/helpers/frame-state.js.map +0 -1
  165. package/dist/tileset/helpers/i3s-lod.d.ts.map +0 -1
  166. package/dist/tileset/helpers/i3s-lod.js.map +0 -1
  167. package/dist/tileset/helpers/tiles-3d-lod.d.ts +0 -8
  168. package/dist/tileset/helpers/tiles-3d-lod.d.ts.map +0 -1
  169. package/dist/tileset/helpers/tiles-3d-lod.js.map +0 -1
  170. package/dist/tileset/helpers/transform-utils.d.ts.map +0 -1
  171. package/dist/tileset/helpers/transform-utils.js.map +0 -1
  172. package/dist/tileset/helpers/zoom.d.ts.map +0 -1
  173. package/dist/tileset/helpers/zoom.js.map +0 -1
  174. package/dist/tileset/tile-3d.d.ts.map +0 -1
  175. package/dist/tileset/tile-3d.js.map +0 -1
  176. package/dist/tileset/tileset-3d.d.ts +0 -284
  177. package/dist/tileset/tileset-3d.d.ts.map +0 -1
  178. package/dist/tileset/tileset-3d.js +0 -814
  179. package/dist/tileset/tileset-3d.js.map +0 -1
  180. package/dist/tileset/tileset-cache.d.ts.map +0 -1
  181. package/dist/tileset/tileset-cache.js.map +0 -1
  182. package/dist/tileset/tileset-traverser.d.ts.map +0 -1
  183. package/dist/tileset/tileset-traverser.js.map +0 -1
  184. package/src/tileset/tileset-3d.ts +0 -1037
  185. /package/dist/{tileset → tileset-3d/common}/tileset-cache.d.ts +0 -0
  186. /package/dist/{tileset → tileset-3d}/format-i3s/i3s-pending-tiles-register.d.ts +0 -0
  187. /package/dist/{tileset → tileset-3d}/format-i3s/i3s-pending-tiles-register.js +0 -0
  188. /package/dist/{tileset → tileset-3d}/format-i3s/i3s-tile-manager.d.ts +0 -0
  189. /package/dist/{tileset → tileset-3d}/helpers/3d-tiles-options.js +0 -0
  190. /package/dist/{tileset → tileset-3d}/helpers/bounding-volume.d.ts +0 -0
  191. /package/dist/{tileset → tileset-3d}/helpers/bounding-volume.js +0 -0
  192. /package/dist/{tileset → tileset-3d}/helpers/frame-state.js +0 -0
  193. /package/dist/{tileset → tileset-3d}/helpers/transform-utils.js +0 -0
  194. /package/dist/{tileset → tileset-3d}/helpers/zoom.d.ts +0 -0
  195. /package/dist/{tileset → tileset-3d}/helpers/zoom.js +0 -0
  196. /package/src/{tileset → tileset-3d}/format-i3s/i3s-pending-tiles-register.ts +0 -0
  197. /package/src/{tileset → tileset-3d}/helpers/bounding-volume.ts +0 -0
  198. /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.
@@ -0,0 +1,234 @@
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
+ /**
77
+ * Flags describing compression and texture formats observed while streaming tile content.
78
+ */
79
+ export type TilesetContentFormats = {
80
+ draco: boolean;
81
+ meshopt: boolean;
82
+ dds: boolean;
83
+ ktx2: boolean;
84
+ };
85
+
86
+ /**
87
+ * Optional view-state metadata exposed by a {@link Tileset3DSource} after initialization.
88
+ */
89
+ export type TilesetSourceViewState = {
90
+ cartographicCenter?: Vector3 | null;
91
+ cartesianCenter?: Vector3 | null;
92
+ zoom?: number;
93
+ boundingVolume?: any;
94
+ description?: string;
95
+ properties?: any;
96
+ extras?: any;
97
+ credits?: any;
98
+ asset?: Record<string, any>;
99
+ };
100
+
101
+ /**
102
+ * Normalized source metadata consumed by {@link Tileset3D}.
103
+ */
104
+ export type TilesetSourceMetadata = {
105
+ /** Format discriminator. */
106
+ type: TILESET_TYPE;
107
+ /** Loader used for metadata and content requests. */
108
+ loader: LoaderWithParser;
109
+ /** Absolute root metadata URL. */
110
+ url: string;
111
+ /** Base path used for relative resource resolution. */
112
+ basePath: string;
113
+ /** Parsed and normalized source payload. */
114
+ tileset: TilesetJSON;
115
+ /** Root lod metric type used as fallback by runtime tiles. */
116
+ lodMetricType: string;
117
+ /** Root lod metric value used as fallback by runtime tiles. */
118
+ lodMetricValue: number;
119
+ /** Root refinement mode used as fallback by runtime tiles. */
120
+ refine: string;
121
+ };
122
+
123
+ /**
124
+ * Format-specific adapter used by {@link Tileset3D} for initialization, loading, and metadata access.
125
+ */
126
+ export interface Tileset3DSource {
127
+ /** Tileset format discriminator. */
128
+ readonly type: TILESET_TYPE;
129
+ /** Loader used for content and metadata requests. */
130
+ readonly loader: LoaderWithParser;
131
+ /** Absolute URL of the root tileset resource. */
132
+ readonly url: string;
133
+ /** Base directory used for relative resource resolution. */
134
+ readonly basePath: string;
135
+ /** Source-specific root tileset payload, when available. */
136
+ readonly tileset?: TilesetJSON | null;
137
+ /** Loader options forwarded to metadata and content requests. */
138
+ readonly loadOptions: LoaderOptions;
139
+ /** Core API used for source-managed loads, when injected by the caller. */
140
+ coreApi?: CoreAPI;
141
+ /** Accumulated content-format flags for the tileset. */
142
+ readonly contentFormats: TilesetContentFormats;
143
+ /** Format-specific asset metadata, if any. */
144
+ asset?: Record<string, any>;
145
+ /** Per-feature property schema, if any. */
146
+ properties?: any;
147
+ /** Application-specific root metadata, if any. */
148
+ extras?: any;
149
+ /** Attribution and credit metadata, if any. */
150
+ credits?: any;
151
+
152
+ /** Normalized source metadata after initialization. */
153
+ metadata?: TilesetSourceMetadata;
154
+
155
+ /**
156
+ * Initializes source state before traversal begins.
157
+ */
158
+ initialize(): Promise<void>;
159
+
160
+ /**
161
+ * Returns normalized source metadata after initialization completes.
162
+ */
163
+ getMetadata(): TilesetSourceMetadata;
164
+
165
+ /**
166
+ * Returns the root tileset payload after source initialization completes.
167
+ */
168
+ getRootTileset(): Promise<TilesetJSON>;
169
+
170
+ /**
171
+ * Creates the runtime tile tree for a tileset payload or nested subtree.
172
+ */
173
+ initializeTileHeaders(
174
+ tileset: Tileset3D,
175
+ tilesetJson: TilesetJSON,
176
+ parentTile?: Tile3D | null
177
+ ): Tile3D;
178
+
179
+ /**
180
+ * Creates the traverser implementation appropriate for this source.
181
+ */
182
+ createTraverser(options: TilesetTraverserProps): TilesetTraverser;
183
+
184
+ /**
185
+ * Loads renderable content for a tile.
186
+ */
187
+ loadTileContent(tile: Tile3D): Promise<TileContentLoadResult>;
188
+
189
+ /**
190
+ * Resolves a tile-relative path to the final request URL.
191
+ */
192
+ getTileUrl(tilePath: string): string;
193
+
194
+ /**
195
+ * Returns tileset-level view metadata derived from the loaded source.
196
+ */
197
+ getViewState(rootTile: Tile3D | null): TilesetSourceViewState;
198
+
199
+ /**
200
+ * Checks whether the source declares a specific extension.
201
+ */
202
+ hasExtension?(extensionName: string): boolean;
203
+
204
+ /**
205
+ * Loads child tile metadata on demand for formats that do not expose the full tree up front.
206
+ */
207
+ loadChildTileHeader?(parentTile: Tile3D, childId: string, frameState: FrameState): Promise<any>;
208
+
209
+ /**
210
+ * Updates source-managed bookkeeping after a tile finishes loading.
211
+ */
212
+ onTileLoaded?(tileset: Tileset3D, tile: Tile3D, loadResult: TileContentLoadResult): void;
213
+
214
+ /**
215
+ * Returns the total known tile count for stats, if available.
216
+ */
217
+ getTilesTotalCount?(): number | null;
218
+ }
219
+
220
+ /**
221
+ * Type guard for distinguishing a source-backed constructor input from other runtime values.
222
+ * @param value Value to test.
223
+ * @returns `true` when the value implements the {@link Tileset3DSource} contract.
224
+ */
225
+ export function isTileset3DSource(value: unknown): value is Tileset3DSource {
226
+ return Boolean(
227
+ value &&
228
+ typeof value === 'object' &&
229
+ 'initialize' in value &&
230
+ 'getRootTileset' in value &&
231
+ 'initializeTileHeaders' in value &&
232
+ 'loadTileContent' in value
233
+ );
234
+ }
@@ -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;
@@ -0,0 +1,379 @@
1
+ // loaders.gl
2
+ // SPDX-License-Identifier: MIT
3
+ // Copyright (c) vis.gl contributors
4
+
5
+ import {path} from '@loaders.gl/loader-utils';
6
+ import {Ellipsoid} from '@math.gl/geospatial';
7
+ import {Vector3} from '@math.gl/core';
8
+ import type {CoreAPI, LoaderOptions, LoaderWithParser} from '@loaders.gl/loader-utils';
9
+ import type {Tile3D} from '../common/tile-3d';
10
+ import {Tileset3DTraverser} from './tileset-3d-traverser';
11
+ import type {Tileset3D} from '../common/tileset-3d';
12
+ import type {
13
+ TileContentLoadResult,
14
+ TilesetContentFormats,
15
+ TilesetJSON,
16
+ Tileset3DSource,
17
+ TilesetSourceInput,
18
+ TilesetSourceMetadata,
19
+ TilesetSourceRequest,
20
+ TilesetSourceResolver,
21
+ TilesetSourceViewState
22
+ } from '../common/tileset-source';
23
+ import {Tile3D as Tile3DNode} from '../common/tile-3d';
24
+ import {getZoomFromBoundingVolume} from '../helpers/zoom';
25
+ import {TILESET_TYPE} from '../../constants';
26
+ import type {TilesetTraverser, TilesetTraverserProps} from '../common/tileset-traverser';
27
+
28
+ const EMPTY_CONTENT_FORMATS: TilesetContentFormats = {
29
+ draco: false,
30
+ meshopt: false,
31
+ dds: false,
32
+ ktx2: false
33
+ };
34
+
35
+ /**
36
+ * {@link Tileset3DSource} implementation for 3D Tiles datasets.
37
+ */
38
+ export class Tiles3DSource implements Tileset3DSource {
39
+ /** 3D Tiles format discriminator. */
40
+ readonly type = TILESET_TYPE.TILES3D;
41
+ /** Loader used for tile content requests. */
42
+ readonly loader: LoaderWithParser;
43
+ /** Root tileset URL. */
44
+ readonly url: string;
45
+ /** Base path used for relative tile resource resolution. */
46
+ readonly basePath: string;
47
+ /** Parsed root tileset payload. */
48
+ tileset: TilesetJSON | null = null;
49
+ /** Loader options forwarded to content requests. */
50
+ readonly loadOptions: LoaderOptions;
51
+ /** Core API used for root and tile-content loads when injected by the caller. */
52
+ coreApi?: CoreAPI;
53
+ /** Aggregate content-format flags discovered during streaming. */
54
+ readonly contentFormats: TilesetContentFormats = {...EMPTY_CONTENT_FORMATS};
55
+
56
+ /** Top-level 3D Tiles asset metadata. */
57
+ asset?: Record<string, any>;
58
+ /** Top-level per-feature properties metadata. */
59
+ properties?: any;
60
+ /** Top-level application-specific metadata. */
61
+ extras?: any;
62
+ /** Source-provided attribution metadata. */
63
+ credits?: any;
64
+ /** Normalized source metadata after initialization. */
65
+ metadata?: TilesetSourceMetadata;
66
+
67
+ private readonly queryParams: Record<string, string> = {};
68
+ private readonly extensionsUsed: string[] = [];
69
+ private readonly resolver?: TilesetSourceResolver;
70
+ private rootTileset: TilesetJSON;
71
+
72
+ /**
73
+ * Creates a 3D Tiles source.
74
+ * @param input Root metadata request, or preloaded root metadata for tests and internal callers.
75
+ * @param loadOptions Loader options forwarded to tile requests.
76
+ */
77
+ constructor(input: TilesetSourceInput, loadOptions: LoaderOptions = {}) {
78
+ const request = normalizeTiles3DRequest(input);
79
+ this.rootTileset = isTilesetRequest(input) ? null : input;
80
+ this.tileset = this.rootTileset;
81
+ this.loader = request.loader;
82
+ this.url = request.url;
83
+ this.basePath = request.basePath || path.dirname(request.url);
84
+ this.resolver = request.resolver;
85
+ this.coreApi = request.coreApi;
86
+ this.loadOptions = loadOptions;
87
+ }
88
+
89
+ /**
90
+ * Fetches and validates top-level metadata, then normalizes common fields used by {@link Tileset3D}.
91
+ */
92
+ async initialize(): Promise<void> {
93
+ if (!this.rootTileset) {
94
+ const loaderOptions = (this.loadOptions[this.loader.id] as Record<string, unknown>) || {};
95
+ this.rootTileset = await this.loadRootData(this.url, {
96
+ ...this.loadOptions,
97
+ [this.loader.id]: {
98
+ ...loaderOptions,
99
+ isTileset: true
100
+ }
101
+ });
102
+ }
103
+ this.tileset = this.rootTileset;
104
+
105
+ if (this.rootTileset.queryString) {
106
+ const searchParams = new URLSearchParams(this.rootTileset.queryString);
107
+ Object.assign(this.queryParams, Object.fromEntries(searchParams.entries()));
108
+ }
109
+
110
+ this.asset = this.rootTileset.asset;
111
+ if (!this.asset) {
112
+ throw new Error('Tileset must have an asset property.');
113
+ }
114
+ if (
115
+ this.asset.version !== '0.0' &&
116
+ this.asset.version !== '1.0' &&
117
+ this.asset.version !== '1.1'
118
+ ) {
119
+ throw new Error('The tileset must be 3D Tiles version either 0.0 or 1.0 or 1.1.');
120
+ }
121
+
122
+ if ('tilesetVersion' in this.asset) {
123
+ this.queryParams.v = this.asset.tilesetVersion;
124
+ }
125
+
126
+ this.properties = this.rootTileset.properties;
127
+ this.extras = this.rootTileset.extras;
128
+ this.credits = {attributions: []};
129
+ this.extensionsUsed.splice(
130
+ 0,
131
+ this.extensionsUsed.length,
132
+ ...(this.rootTileset.extensionsUsed || [])
133
+ );
134
+ this.metadata = {
135
+ type: this.type,
136
+ loader: this.loader,
137
+ url: this.url,
138
+ basePath: this.basePath,
139
+ tileset: this.rootTileset,
140
+ lodMetricType: this.rootTileset.lodMetricType,
141
+ lodMetricValue: this.rootTileset.lodMetricValue,
142
+ refine: this.rootTileset.root?.refine
143
+ };
144
+ }
145
+
146
+ /**
147
+ * Returns normalized source metadata after initialization.
148
+ */
149
+ getMetadata(): TilesetSourceMetadata {
150
+ if (!this.metadata) {
151
+ throw new Error('Tiles3DSource has not been initialized');
152
+ }
153
+ return this.metadata;
154
+ }
155
+
156
+ /**
157
+ * Returns the root 3D Tiles payload.
158
+ */
159
+ async getRootTileset(): Promise<TilesetJSON> {
160
+ return this.getMetadata().tileset;
161
+ }
162
+
163
+ /**
164
+ * Builds the eager runtime tile tree for a 3D Tiles subtree.
165
+ */
166
+ initializeTileHeaders(
167
+ tileset: Tileset3D,
168
+ tilesetJson: TilesetJSON,
169
+ parentTile?: Tile3D | null
170
+ ): Tile3D {
171
+ const rootTile = new Tile3DNode(tileset, tilesetJson.root, parentTile || undefined);
172
+
173
+ if (parentTile) {
174
+ parentTile.children.push(rootTile);
175
+ rootTile.depth = parentTile.depth + 1;
176
+ }
177
+
178
+ const stack: Tile3D[] = [rootTile];
179
+ while (stack.length > 0) {
180
+ const tile = stack.pop() as Tile3D;
181
+ tileset.stats.get('Tiles In Tileset(s)').incrementCount();
182
+ const children = tile.header.children || [];
183
+ for (const childHeader of children) {
184
+ const childTile = new Tile3DNode(tileset, childHeader, tile);
185
+ if (childTile.contentUrl?.includes('?session=')) {
186
+ const url = new URL(childTile.contentUrl);
187
+ const session = url.searchParams.get('session');
188
+ if (session) {
189
+ this.queryParams.session = session;
190
+ }
191
+ }
192
+ tile.children.push(childTile);
193
+ childTile.depth = tile.depth + 1;
194
+ stack.push(childTile);
195
+ }
196
+ }
197
+
198
+ return rootTile;
199
+ }
200
+
201
+ /**
202
+ * Creates the standard 3D Tiles traverser.
203
+ */
204
+ createTraverser(options: TilesetTraverserProps): TilesetTraverser {
205
+ return new Tileset3DTraverser(options);
206
+ }
207
+
208
+ /**
209
+ * Loads binary content or nested tileset JSON for a runtime tile.
210
+ */
211
+ async loadTileContent(tile: Tile3D): Promise<TileContentLoadResult> {
212
+ const contentUrl = this.getTileUrl(tile.contentUrl);
213
+ const tilesetLoaderOptions =
214
+ (this.loadOptions[this.loader.id] as Record<string, unknown>) || {};
215
+ const options = {
216
+ ...this.loadOptions,
217
+ [this.loader.id]: {
218
+ ...tilesetLoaderOptions,
219
+ isTileset: tile.type === 'json',
220
+ assetGltfUpAxis: (this.asset && this.asset.gltfUpAxis) || 'Y'
221
+ }
222
+ };
223
+
224
+ const content = await this.loadResourceData(contentUrl, options);
225
+ tile.content = content;
226
+
227
+ return {
228
+ loaded: true,
229
+ nestedTileset: tile.contentUrl.includes('.json') ? content : undefined
230
+ };
231
+ }
232
+
233
+ /**
234
+ * Resolves a tile content URL with source-managed query parameters.
235
+ */
236
+ getTileUrl(tilePath: string): string {
237
+ if (tilePath.startsWith('data:')) {
238
+ return tilePath;
239
+ }
240
+
241
+ if (!Object.keys(this.queryParams).length) {
242
+ return tilePath;
243
+ }
244
+
245
+ const [pathWithoutQuery, existingQuery = ''] = tilePath.split('?');
246
+ const mergedQueryParams = new URLSearchParams(existingQuery);
247
+
248
+ for (const [key, value] of Object.entries(this.queryParams)) {
249
+ if (!mergedQueryParams.has(key)) {
250
+ mergedQueryParams.set(key, value);
251
+ }
252
+ }
253
+
254
+ const queryParams = mergedQueryParams.toString();
255
+ return queryParams ? `${pathWithoutQuery}?${queryParams}` : pathWithoutQuery;
256
+ }
257
+
258
+ /**
259
+ * Derives the default view state from the root bounding volume.
260
+ */
261
+ getViewState(rootTile: Tile3D | null): TilesetSourceViewState {
262
+ if (!rootTile) {
263
+ return {
264
+ asset: this.asset,
265
+ properties: this.properties,
266
+ extras: this.extras,
267
+ credits: this.credits
268
+ };
269
+ }
270
+
271
+ const {center} = rootTile.boundingVolume;
272
+ let cartographicCenter: Vector3;
273
+ if (center && (center[0] !== 0 || center[1] !== 0 || center[2] !== 0)) {
274
+ cartographicCenter = new Vector3();
275
+ Ellipsoid.WGS84.cartesianToCartographic(center, cartographicCenter);
276
+ } else {
277
+ cartographicCenter = new Vector3(0, 0, -Ellipsoid.WGS84.radii[0]);
278
+ }
279
+
280
+ return {
281
+ asset: this.asset,
282
+ properties: this.properties,
283
+ extras: this.extras,
284
+ credits: this.credits,
285
+ boundingVolume: rootTile.boundingVolume,
286
+ cartographicCenter,
287
+ cartesianCenter: center,
288
+ zoom: getZoomFromBoundingVolume(rootTile.boundingVolume, cartographicCenter)
289
+ };
290
+ }
291
+
292
+ /**
293
+ * Checks whether the root tileset declares the given extension.
294
+ */
295
+ hasExtension(extensionName: string): boolean {
296
+ return this.extensionsUsed.includes(extensionName);
297
+ }
298
+
299
+ /**
300
+ * Updates content-format flags and installs nested tileset subtrees.
301
+ */
302
+ onTileLoaded(tileset: Tileset3D, tile: Tile3D, loadResult: TileContentLoadResult): void {
303
+ const {extensionsRemoved = []} = tile.content?.gltf || {};
304
+ if (extensionsRemoved.includes('KHR_draco_mesh_compression')) {
305
+ this.contentFormats.draco = true;
306
+ }
307
+ if (extensionsRemoved.includes('EXT_meshopt_compression')) {
308
+ this.contentFormats.meshopt = true;
309
+ }
310
+ if (extensionsRemoved.includes('KHR_texture_basisu')) {
311
+ this.contentFormats.ktx2 = true;
312
+ }
313
+
314
+ if (loadResult.nestedTileset) {
315
+ tileset._initializeTileHeaders(loadResult.nestedTileset, tile);
316
+ }
317
+ }
318
+
319
+ /**
320
+ * Loads data through injected core APIs so this module stays independent from `@loaders.gl/core`.
321
+ */
322
+ private async loadWithCoreApi(url: string, options: LoaderOptions): Promise<any> {
323
+ if (!this.coreApi) {
324
+ throw new Error('Tiles3DSource requires an injected coreApi to load tileset data');
325
+ }
326
+
327
+ return await this.coreApi.load(url, this.loader, options);
328
+ }
329
+
330
+ /**
331
+ * Loads data through an injected resolver when present, otherwise through the injected core API.
332
+ */
333
+ private async loadRootData(url: string, options: LoaderOptions): Promise<any> {
334
+ if (this.resolver) {
335
+ return await this.resolver.loadRoot(url, this.loader, options);
336
+ }
337
+
338
+ return await this.loadWithCoreApi(url, options);
339
+ }
340
+
341
+ /**
342
+ * Loads tile content through an injected resolver when present, otherwise through the injected core API.
343
+ */
344
+ private async loadResourceData(url: string, options: LoaderOptions): Promise<any> {
345
+ if (this.resolver) {
346
+ return await this.resolver.loadResource(url, this.loader, options);
347
+ }
348
+
349
+ return await this.loadWithCoreApi(url, options);
350
+ }
351
+ }
352
+
353
+ function isTilesetRequest(input: TilesetSourceInput): input is TilesetSourceRequest {
354
+ return Boolean(
355
+ input && typeof input === 'object' && 'url' in input && 'loader' in input && !('type' in input)
356
+ );
357
+ }
358
+
359
+ /**
360
+ * Normalizes constructor input into a URL request descriptor.
361
+ * @param input Constructor input for {@link Tiles3DSource}.
362
+ * @returns A normalized request with a resolved base path.
363
+ */
364
+ function normalizeTiles3DRequest(input: TilesetSourceInput): TilesetSourceRequest {
365
+ if (isTilesetRequest(input)) {
366
+ return {
367
+ ...input,
368
+ basePath: input.basePath || path.dirname(input.url)
369
+ };
370
+ }
371
+
372
+ return {
373
+ url: input.url,
374
+ loader: input.loader,
375
+ basePath: input.basePath || path.dirname(input.url),
376
+ resolver: (input as TilesetSourceRequest).resolver,
377
+ coreApi: (input as TilesetSourceRequest).coreApi
378
+ };
379
+ }
@@ -6,7 +6,7 @@
6
6
  // See LICENSE.md and https://github.com/AnalyticalGraphicsInc/cesium/blob/master/LICENSE.md
7
7
 
8
8
  import {TILE3D_OPTIMIZATION_HINT, TILE_REFINEMENT} from '../../constants';
9
- import {TilesetTraverser} from '../tileset-traverser';
9
+ import {TilesetTraverser} from '../common/tileset-traverser';
10
10
 
11
11
  export class Tileset3DTraverser extends TilesetTraverser {
12
12
  compareDistanceToCamera(a, b) {