@loaders.gl/tiles 4.4.0-alpha.2 → 4.4.0

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 (58) hide show
  1. package/README.md +1 -1
  2. package/dist/constants.js +1 -0
  3. package/dist/constants.js.map +1 -0
  4. package/dist/dist.dev.js +89 -6
  5. package/dist/dist.min.js +1 -1
  6. package/dist/index.cjs +75 -5
  7. package/dist/index.cjs.map +3 -3
  8. package/dist/index.js +1 -0
  9. package/dist/index.js.map +1 -0
  10. package/dist/tileset/format-3d-tiles/tileset-3d-traverser.js +1 -0
  11. package/dist/tileset/format-3d-tiles/tileset-3d-traverser.js.map +1 -0
  12. package/dist/tileset/format-i3s/i3s-pending-tiles-register.js +1 -0
  13. package/dist/tileset/format-i3s/i3s-pending-tiles-register.js.map +1 -0
  14. package/dist/tileset/format-i3s/i3s-tile-manager.js +1 -0
  15. package/dist/tileset/format-i3s/i3s-tile-manager.js.map +1 -0
  16. package/dist/tileset/format-i3s/i3s-tileset-traverser.js +1 -0
  17. package/dist/tileset/format-i3s/i3s-tileset-traverser.js.map +1 -0
  18. package/dist/tileset/helpers/3d-tiles-options.js +1 -0
  19. package/dist/tileset/helpers/3d-tiles-options.js.map +1 -0
  20. package/dist/tileset/helpers/bounding-volume.js +1 -0
  21. package/dist/tileset/helpers/bounding-volume.js.map +1 -0
  22. package/dist/tileset/helpers/frame-state.js +1 -0
  23. package/dist/tileset/helpers/frame-state.js.map +1 -0
  24. package/dist/tileset/helpers/i3s-lod.js +1 -0
  25. package/dist/tileset/helpers/i3s-lod.js.map +1 -0
  26. package/dist/tileset/helpers/tiles-3d-lod.js +1 -0
  27. package/dist/tileset/helpers/tiles-3d-lod.js.map +1 -0
  28. package/dist/tileset/helpers/transform-utils.d.ts +2 -1
  29. package/dist/tileset/helpers/transform-utils.d.ts.map +1 -1
  30. package/dist/tileset/helpers/transform-utils.js +35 -0
  31. package/dist/tileset/helpers/transform-utils.js.map +1 -0
  32. package/dist/tileset/helpers/zoom.js +1 -0
  33. package/dist/tileset/helpers/zoom.js.map +1 -0
  34. package/dist/tileset/tile-3d.d.ts +7 -0
  35. package/dist/tileset/tile-3d.d.ts.map +1 -1
  36. package/dist/tileset/tile-3d.js +12 -3
  37. package/dist/tileset/tile-3d.js.map +1 -0
  38. package/dist/tileset/tileset-3d.d.ts +5 -0
  39. package/dist/tileset/tileset-3d.d.ts.map +1 -1
  40. package/dist/tileset/tileset-3d.js +50 -5
  41. package/dist/tileset/tileset-3d.js.map +1 -0
  42. package/dist/tileset/tileset-cache.js +1 -0
  43. package/dist/tileset/tileset-cache.js.map +1 -0
  44. package/dist/tileset/tileset-traverser.js +2 -1
  45. package/dist/tileset/tileset-traverser.js.map +1 -0
  46. package/dist/types.js +1 -0
  47. package/dist/types.js.map +1 -0
  48. package/dist/utils/doubly-linked-list-node.js +1 -0
  49. package/dist/utils/doubly-linked-list-node.js.map +1 -0
  50. package/dist/utils/doubly-linked-list.js +1 -0
  51. package/dist/utils/doubly-linked-list.js.map +1 -0
  52. package/dist/utils/managed-array.js +1 -0
  53. package/dist/utils/managed-array.js.map +1 -0
  54. package/package.json +5 -5
  55. package/src/tileset/helpers/transform-utils.ts +41 -1
  56. package/src/tileset/tile-3d.ts +13 -3
  57. package/src/tileset/tileset-3d.ts +55 -5
  58. package/src/tileset/tileset-traverser.ts +1 -1
package/dist/index.cjs CHANGED
@@ -224,10 +224,34 @@ function calculateTransformProps(tileHeader, tile) {
224
224
  const toFixedFrameMatrix = fromFixedFrameMatrix.invert();
225
225
  tile.cartographicModelMatrix = toFixedFrameMatrix.multiplyRight(modelMatrix);
226
226
  tile.cartographicOrigin = cartographicOrigin;
227
+ const rootNode = _getRootNode(tile);
228
+ if (rootNode) {
229
+ tile.cartesianModelMatrix = new import_core.Matrix4(modelMatrix).multiplyRight(rootNode.matrix);
230
+ tile.cartographicModelMatrix.multiplyRight(rootNode.matrix);
231
+ rootNode.matrix = import_core.Matrix4.IDENTITY;
232
+ }
227
233
  if (!tile.coordinateSystem) {
228
234
  tile.modelMatrix = tile.cartographicModelMatrix;
229
235
  }
230
236
  }
237
+ var TRANSLATION_LIMIT_SQUARED = 1e6 ** 2;
238
+ function _getRootNode(tile) {
239
+ var _a, _b;
240
+ const gltf = tile.gltf;
241
+ if (!gltf) {
242
+ return null;
243
+ }
244
+ const sceneIndex = typeof gltf.scene === "number" ? gltf.scene : 0;
245
+ const scene = (_a = gltf.scenes) == null ? void 0 : _a[sceneIndex];
246
+ const rootNode = (_b = scene == null ? void 0 : scene.nodes) == null ? void 0 : _b[0];
247
+ if (!(rootNode == null ? void 0 : rootNode.matrix))
248
+ return null;
249
+ const m = rootNode.matrix;
250
+ const translationMagnitude = m[12] * m[12] + m[13] * m[13] + m[14] * m[14];
251
+ if (translationMagnitude <= TRANSLATION_LIMIT_SQUARED)
252
+ return null;
253
+ return rootNode;
254
+ }
231
255
 
232
256
  // dist/tileset/helpers/frame-state.js
233
257
  var import_core2 = require("@math.gl/core");
@@ -1095,7 +1119,7 @@ var TilesetTraverser = class {
1095
1119
  }
1096
1120
  }
1097
1121
  }
1098
- return allDescendantsLoaded;
1122
+ return root.hasEmptyContent || allDescendantsLoaded;
1099
1123
  }
1100
1124
  };
1101
1125
 
@@ -1169,6 +1193,13 @@ var Tile3D = class {
1169
1193
  _inRequestVolume = false;
1170
1194
  _lodJudge = null;
1171
1195
  // TODO i3s specific, needs to remove
1196
+ /**
1197
+ * Indicates whether the tile has been drawn by the renderer.
1198
+ * Defaults to true for backwards compatibility — renderers that support
1199
+ * transition hold (e.g. deck.gl 9.3+) should set this to false on tile load,
1200
+ * then back to true after first draw to avoid flashes (see deck.gl #7914).
1201
+ */
1202
+ tileDrawn = true;
1172
1203
  /**
1173
1204
  * @constructs
1174
1205
  * Create a Tile3D instance
@@ -1350,14 +1381,15 @@ var Tile3D = class {
1350
1381
  try {
1351
1382
  const contentUrl = this.tileset.getTileUrl(this.contentUrl);
1352
1383
  const loader = this.tileset.loader;
1384
+ const tilesetLoaderOptions = this.tileset.loadOptions[loader.id] || {};
1353
1385
  const options = {
1354
1386
  ...this.tileset.loadOptions,
1355
1387
  [loader.id]: {
1356
- // @ts-expect-error
1357
- ...this.tileset.loadOptions[loader.id],
1388
+ ...tilesetLoaderOptions,
1358
1389
  isTileset: this.type === "json",
1359
1390
  ...this._getLoaderSpecificOptions(loader.id)
1360
1391
  }
1392
+ // TODO add typecheck - as const satisfies ...
1361
1393
  };
1362
1394
  this.content = await (0, import_core8.load)(contentUrl, loader, options);
1363
1395
  if (this.tileset.options.contentLoader) {
@@ -1387,6 +1419,7 @@ var Tile3D = class {
1387
1419
  }
1388
1420
  this.header.content = null;
1389
1421
  this.contentState = TILE_CONTENT_STATE.UNLOADED;
1422
+ this.tileDrawn = true;
1390
1423
  return true;
1391
1424
  }
1392
1425
  /**
@@ -1847,6 +1880,8 @@ var DEFAULT_PROPS2 = {
1847
1880
  onTileError: () => {
1848
1881
  },
1849
1882
  onTraversalComplete: (selectedTiles) => selectedTiles,
1883
+ onUpdate: () => {
1884
+ },
1850
1885
  contentLoader: void 0,
1851
1886
  viewDistanceScale: 1,
1852
1887
  maximumScreenSpaceError: 8,
@@ -1940,6 +1975,8 @@ var Tileset3D = class {
1940
1975
  _traverser;
1941
1976
  _cache = new TilesetCache();
1942
1977
  _requestScheduler;
1978
+ /** Tile IDs held visible during transitions until replacements have drawn */
1979
+ _heldTiles = /* @__PURE__ */ new Set();
1943
1980
  // Promise tracking
1944
1981
  updatePromise = null;
1945
1982
  tilesetInitializationPromise;
@@ -2145,6 +2182,7 @@ var Tileset3D = class {
2145
2182
  * Update tiles relying on data from all traversers
2146
2183
  */
2147
2184
  _updateTiles() {
2185
+ const previousSelectedTiles = this.selectedTiles;
2148
2186
  this.selectedTiles = [];
2149
2187
  this._requestedTiles = [];
2150
2188
  this._emptyTiles = [];
@@ -2155,12 +2193,42 @@ var Tileset3D = class {
2155
2193
  this._emptyTiles = this._emptyTiles.concat(frameStateDataValue._emptyTiles);
2156
2194
  }
2157
2195
  this.selectedTiles = this.options.onTraversalComplete(this.selectedTiles);
2196
+ const selectedIds = new Set(this.selectedTiles.map((t) => t.id));
2197
+ const hasUndrawnTiles = this.selectedTiles.some((t) => !t.tileDrawn);
2198
+ let heldBackCount = 0;
2199
+ if (hasUndrawnTiles) {
2200
+ for (const tileId of selectedIds) {
2201
+ this._heldTiles.add(tileId);
2202
+ }
2203
+ for (const tileId of this._heldTiles) {
2204
+ if (selectedIds.has(tileId))
2205
+ continue;
2206
+ const tile = this._tiles[tileId];
2207
+ if (tile && tile.contentAvailable) {
2208
+ tile._selectedFrame = this._frameNumber;
2209
+ this.selectedTiles.push(tile);
2210
+ heldBackCount++;
2211
+ } else {
2212
+ this._heldTiles.delete(tileId);
2213
+ }
2214
+ }
2215
+ } else {
2216
+ this._heldTiles = selectedIds;
2217
+ }
2218
+ if (heldBackCount > 0) {
2219
+ setTimeout(() => {
2220
+ this.selectTiles();
2221
+ }, 0);
2222
+ }
2158
2223
  for (const tile of this.selectedTiles) {
2159
2224
  this._tiles[tile.id] = tile;
2160
2225
  }
2161
2226
  this._loadTiles();
2162
2227
  this._unloadTiles();
2163
2228
  this._updateStats();
2229
+ if (this._tilesChanged(previousSelectedTiles, this.selectedTiles)) {
2230
+ this.options.onUpdate();
2231
+ }
2164
2232
  }
2165
2233
  _tilesChanged(oldSelectedTiles, selectedTiles) {
2166
2234
  if (oldSelectedTiles.length !== selectedTiles.length) {
@@ -2173,6 +2241,7 @@ var Tileset3D = class {
2173
2241
  return changed;
2174
2242
  }
2175
2243
  _loadTiles() {
2244
+ this._requestedTiles.sort((a, b) => a._priority - b._priority);
2176
2245
  for (const tile of this._requestedTiles) {
2177
2246
  if (tile.contentUnloaded) {
2178
2247
  this._loadTile(tile);
@@ -2494,8 +2563,9 @@ var Tileset3D = class {
2494
2563
  this.extras = tilesetJson.extras;
2495
2564
  }
2496
2565
  _initializeI3STileset() {
2497
- if (this.loadOptions.i3s && "token" in this.loadOptions.i3s) {
2498
- this._queryParams.token = this.loadOptions.i3s.token;
2566
+ const i3sOptions = this.loadOptions.i3s;
2567
+ if (i3sOptions && typeof i3sOptions === "object" && "token" in i3sOptions) {
2568
+ this._queryParams.token = i3sOptions.token;
2499
2569
  }
2500
2570
  }
2501
2571
  };