@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/README.md CHANGED
@@ -1,4 +1,4 @@
1
- # @loaders.gl/tiles (Experimental)
1
+ # @loaders.gl/tiles
2
2
 
3
3
  This module contains the common components for tiles loaders, i.e. [3D tiles](https://github.com/AnalyticalGraphicsInc/3d-tiles).
4
4
 
package/dist/constants.js CHANGED
@@ -36,3 +36,4 @@ export const TILE3D_OPTIMIZATION_HINT = {
36
36
  USE_OPTIMIZATION: 1,
37
37
  SKIP_OPTIMIZATION: 0
38
38
  };
39
+ //# sourceMappingURL=constants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AAAA,aAAa;AACb,+BAA+B;AAC/B,oCAAoC;AAUpC,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,QAAQ,EAAE,CAAC,EAAE,2BAA2B;IACxC,OAAO,EAAE,CAAC,EAAE,kCAAkC;IAC9C,UAAU,EAAE,CAAC,EAAE,8IAA8I;IAC7J,KAAK,EAAE,CAAC,EAAE,mBAAmB;IAC7B,OAAO,EAAE,CAAC,EAAE,8DAA8D;IAC1E,MAAM,EAAE,CAAC,CAAC,kBAAkB;CAC7B,CAAC;AAIF,MAAM,CAAN,IAAY,eAGX;AAHD,WAAY,eAAe;IACzB,mDAAO,CAAA;IACP,2DAAW,CAAA,CAAC,qFAAqF;AACnG,CAAC,EAHW,eAAe,KAAf,eAAe,QAG1B;AAID,MAAM,CAAN,IAAY,SAKX;AALD,WAAY,SAAS;IACnB,4BAAe,CAAA;IACf,sCAAyB,CAAA;IACzB,sCAAyB,CAAA;IACzB,0BAAa,CAAA;AACf,CAAC,EALW,SAAS,KAAT,SAAS,QAKpB;AAID,MAAM,CAAN,IAAY,YAGX;AAHD,WAAY,YAAY;IACtB,2BAAW,CAAA;IACX,mCAAmB,CAAA;AACrB,CAAC,EAHW,YAAY,KAAZ,YAAY,QAGvB;AAID,MAAM,CAAN,IAAY,eAGX;AAHD,WAAY,eAAe;IACzB,qDAAkC,CAAA;IAClC,8DAA2C,CAAA;AAC7C,CAAC,EAHW,eAAe,KAAf,eAAe,QAG1B;AAKD,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,YAAY,EAAE,CAAC,CAAC;IAChB,gBAAgB,EAAE,CAAC;IACnB,iBAAiB,EAAE,CAAC;CACrB,CAAC"}
package/dist/dist.dev.js CHANGED
@@ -4981,6 +4981,20 @@ var __exports__ = (() => {
4981
4981
  this.stats.get(STAT_QUEUED_REQUESTS_EVER);
4982
4982
  this.stats.get(STAT_ACTIVE_REQUESTS_EVER);
4983
4983
  }
4984
+ /**
4985
+ * Update scheduler props. Preserves active and queued requests.
4986
+ */
4987
+ setProps(props) {
4988
+ if (props.throttleRequests !== void 0) {
4989
+ this.props.throttleRequests = props.throttleRequests;
4990
+ }
4991
+ if (props.maxRequests !== void 0) {
4992
+ this.props.maxRequests = props.maxRequests;
4993
+ }
4994
+ if (props.debounceTime !== void 0) {
4995
+ this.props.debounceTime = props.debounceTime;
4996
+ }
4997
+ }
4984
4998
  /**
4985
4999
  * Called by an application that wants to issue a request, without having it deeply queued by the browser
4986
5000
  *
@@ -5100,7 +5114,7 @@ var __exports__ = (() => {
5100
5114
  // ../loader-utils/src/lib/path-utils/path.ts
5101
5115
  function filename(url) {
5102
5116
  const slashIndex = url ? url.lastIndexOf("/") : -1;
5103
- return slashIndex >= 0 ? url.substr(slashIndex + 1) : "";
5117
+ return slashIndex >= 0 ? url.substr(slashIndex + 1) : url;
5104
5118
  }
5105
5119
  function dirname(url) {
5106
5120
  const slashIndex = url ? url.lastIndexOf("/") : -1;
@@ -5407,10 +5421,33 @@ var __exports__ = (() => {
5407
5421
  const toFixedFrameMatrix = fromFixedFrameMatrix.invert();
5408
5422
  tile.cartographicModelMatrix = toFixedFrameMatrix.multiplyRight(modelMatrix);
5409
5423
  tile.cartographicOrigin = cartographicOrigin;
5424
+ const rootNode = _getRootNode(tile);
5425
+ if (rootNode) {
5426
+ tile.cartesianModelMatrix = new Matrix4(modelMatrix).multiplyRight(rootNode.matrix);
5427
+ tile.cartographicModelMatrix.multiplyRight(rootNode.matrix);
5428
+ rootNode.matrix = Matrix4.IDENTITY;
5429
+ }
5410
5430
  if (!tile.coordinateSystem) {
5411
5431
  tile.modelMatrix = tile.cartographicModelMatrix;
5412
5432
  }
5413
5433
  }
5434
+ var TRANSLATION_LIMIT_SQUARED = 1e6 ** 2;
5435
+ function _getRootNode(tile) {
5436
+ const gltf = tile.gltf;
5437
+ if (!gltf) {
5438
+ return null;
5439
+ }
5440
+ const sceneIndex = typeof gltf.scene === "number" ? gltf.scene : 0;
5441
+ const scene = gltf.scenes?.[sceneIndex];
5442
+ const rootNode = scene?.nodes?.[0];
5443
+ if (!rootNode?.matrix)
5444
+ return null;
5445
+ const m = rootNode.matrix;
5446
+ const translationMagnitude = m[12] * m[12] + m[13] * m[13] + m[14] * m[14];
5447
+ if (translationMagnitude <= TRANSLATION_LIMIT_SQUARED)
5448
+ return null;
5449
+ return rootNode;
5450
+ }
5414
5451
 
5415
5452
  // ../../node_modules/@math.gl/culling/dist/constants.js
5416
5453
  var INTERSECTION = {
@@ -6833,7 +6870,7 @@ var __exports__ = (() => {
6833
6870
  }
6834
6871
  }
6835
6872
  }
6836
- return allDescendantsLoaded;
6873
+ return root.hasEmptyContent || allDescendantsLoaded;
6837
6874
  }
6838
6875
  };
6839
6876
 
@@ -6907,6 +6944,13 @@ var __exports__ = (() => {
6907
6944
  _inRequestVolume = false;
6908
6945
  _lodJudge = null;
6909
6946
  // TODO i3s specific, needs to remove
6947
+ /**
6948
+ * Indicates whether the tile has been drawn by the renderer.
6949
+ * Defaults to true for backwards compatibility — renderers that support
6950
+ * transition hold (e.g. deck.gl 9.3+) should set this to false on tile load,
6951
+ * then back to true after first draw to avoid flashes (see deck.gl #7914).
6952
+ */
6953
+ tileDrawn = true;
6910
6954
  /**
6911
6955
  * @constructs
6912
6956
  * Create a Tile3D instance
@@ -7093,14 +7137,15 @@ var __exports__ = (() => {
7093
7137
  try {
7094
7138
  const contentUrl = this.tileset.getTileUrl(this.contentUrl);
7095
7139
  const loader = this.tileset.loader;
7140
+ const tilesetLoaderOptions = this.tileset.loadOptions[loader.id] || {};
7096
7141
  const options = {
7097
7142
  ...this.tileset.loadOptions,
7098
7143
  [loader.id]: {
7099
- // @ts-expect-error
7100
- ...this.tileset.loadOptions[loader.id],
7144
+ ...tilesetLoaderOptions,
7101
7145
  isTileset: this.type === "json",
7102
7146
  ...this._getLoaderSpecificOptions(loader.id)
7103
7147
  }
7148
+ // TODO add typecheck - as const satisfies ...
7104
7149
  };
7105
7150
  this.content = await (0, import_core21.load)(contentUrl, loader, options);
7106
7151
  if (this.tileset.options.contentLoader) {
@@ -7130,6 +7175,7 @@ var __exports__ = (() => {
7130
7175
  }
7131
7176
  this.header.content = null;
7132
7177
  this.contentState = TILE_CONTENT_STATE.UNLOADED;
7178
+ this.tileDrawn = true;
7133
7179
  return true;
7134
7180
  }
7135
7181
  /**
@@ -7623,6 +7669,8 @@ var __exports__ = (() => {
7623
7669
  onTileError: () => {
7624
7670
  },
7625
7671
  onTraversalComplete: (selectedTiles) => selectedTiles,
7672
+ onUpdate: () => {
7673
+ },
7626
7674
  contentLoader: void 0,
7627
7675
  viewDistanceScale: 1,
7628
7676
  maximumScreenSpaceError: 8,
@@ -7716,6 +7764,8 @@ var __exports__ = (() => {
7716
7764
  _traverser;
7717
7765
  _cache = new TilesetCache();
7718
7766
  _requestScheduler;
7767
+ /** Tile IDs held visible during transitions until replacements have drawn */
7768
+ _heldTiles = /* @__PURE__ */ new Set();
7719
7769
  // Promise tracking
7720
7770
  updatePromise = null;
7721
7771
  tilesetInitializationPromise;
@@ -7928,6 +7978,7 @@ var __exports__ = (() => {
7928
7978
  * Update tiles relying on data from all traversers
7929
7979
  */
7930
7980
  _updateTiles() {
7981
+ const previousSelectedTiles = this.selectedTiles;
7931
7982
  this.selectedTiles = [];
7932
7983
  this._requestedTiles = [];
7933
7984
  this._emptyTiles = [];
@@ -7938,12 +7989,42 @@ var __exports__ = (() => {
7938
7989
  this._emptyTiles = this._emptyTiles.concat(frameStateDataValue._emptyTiles);
7939
7990
  }
7940
7991
  this.selectedTiles = this.options.onTraversalComplete(this.selectedTiles);
7992
+ const selectedIds = new Set(this.selectedTiles.map((t) => t.id));
7993
+ const hasUndrawnTiles = this.selectedTiles.some((t) => !t.tileDrawn);
7994
+ let heldBackCount = 0;
7995
+ if (hasUndrawnTiles) {
7996
+ for (const tileId of selectedIds) {
7997
+ this._heldTiles.add(tileId);
7998
+ }
7999
+ for (const tileId of this._heldTiles) {
8000
+ if (selectedIds.has(tileId))
8001
+ continue;
8002
+ const tile = this._tiles[tileId];
8003
+ if (tile && tile.contentAvailable) {
8004
+ tile._selectedFrame = this._frameNumber;
8005
+ this.selectedTiles.push(tile);
8006
+ heldBackCount++;
8007
+ } else {
8008
+ this._heldTiles.delete(tileId);
8009
+ }
8010
+ }
8011
+ } else {
8012
+ this._heldTiles = selectedIds;
8013
+ }
8014
+ if (heldBackCount > 0) {
8015
+ setTimeout(() => {
8016
+ this.selectTiles();
8017
+ }, 0);
8018
+ }
7941
8019
  for (const tile of this.selectedTiles) {
7942
8020
  this._tiles[tile.id] = tile;
7943
8021
  }
7944
8022
  this._loadTiles();
7945
8023
  this._unloadTiles();
7946
8024
  this._updateStats();
8025
+ if (this._tilesChanged(previousSelectedTiles, this.selectedTiles)) {
8026
+ this.options.onUpdate();
8027
+ }
7947
8028
  }
7948
8029
  _tilesChanged(oldSelectedTiles, selectedTiles) {
7949
8030
  if (oldSelectedTiles.length !== selectedTiles.length) {
@@ -7956,6 +8037,7 @@ var __exports__ = (() => {
7956
8037
  return changed;
7957
8038
  }
7958
8039
  _loadTiles() {
8040
+ this._requestedTiles.sort((a, b) => a._priority - b._priority);
7959
8041
  for (const tile of this._requestedTiles) {
7960
8042
  if (tile.contentUnloaded) {
7961
8043
  this._loadTile(tile);
@@ -8277,8 +8359,9 @@ var __exports__ = (() => {
8277
8359
  this.extras = tilesetJson.extras;
8278
8360
  }
8279
8361
  _initializeI3STileset() {
8280
- if (this.loadOptions.i3s && "token" in this.loadOptions.i3s) {
8281
- this._queryParams.token = this.loadOptions.i3s.token;
8362
+ const i3sOptions = this.loadOptions.i3s;
8363
+ if (i3sOptions && typeof i3sOptions === "object" && "token" in i3sOptions) {
8364
+ this._queryParams.token = i3sOptions.token;
8282
8365
  }
8283
8366
  }
8284
8367
  };