@loaders.gl/tiles 4.4.0-alpha.13 → 4.4.0-alpha.15

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.
package/dist/index.cjs CHANGED
@@ -1169,6 +1169,13 @@ var Tile3D = class {
1169
1169
  _inRequestVolume = false;
1170
1170
  _lodJudge = null;
1171
1171
  // TODO i3s specific, needs to remove
1172
+ /**
1173
+ * Indicates whether the tile has been drawn by the renderer.
1174
+ * Defaults to true for backwards compatibility — renderers that support
1175
+ * transition hold (e.g. deck.gl 9.3+) should set this to false on tile load,
1176
+ * then back to true after first draw to avoid flashes (see deck.gl #7914).
1177
+ */
1178
+ tileDrawn = true;
1172
1179
  /**
1173
1180
  * @constructs
1174
1181
  * Create a Tile3D instance
@@ -1388,6 +1395,7 @@ var Tile3D = class {
1388
1395
  }
1389
1396
  this.header.content = null;
1390
1397
  this.contentState = TILE_CONTENT_STATE.UNLOADED;
1398
+ this.tileDrawn = true;
1391
1399
  return true;
1392
1400
  }
1393
1401
  /**
@@ -1848,6 +1856,8 @@ var DEFAULT_PROPS2 = {
1848
1856
  onTileError: () => {
1849
1857
  },
1850
1858
  onTraversalComplete: (selectedTiles) => selectedTiles,
1859
+ onUpdate: () => {
1860
+ },
1851
1861
  contentLoader: void 0,
1852
1862
  viewDistanceScale: 1,
1853
1863
  maximumScreenSpaceError: 8,
@@ -1941,6 +1951,8 @@ var Tileset3D = class {
1941
1951
  _traverser;
1942
1952
  _cache = new TilesetCache();
1943
1953
  _requestScheduler;
1954
+ /** Tile IDs held visible during transitions until replacements have drawn */
1955
+ _heldTiles = /* @__PURE__ */ new Set();
1944
1956
  // Promise tracking
1945
1957
  updatePromise = null;
1946
1958
  tilesetInitializationPromise;
@@ -2146,6 +2158,7 @@ var Tileset3D = class {
2146
2158
  * Update tiles relying on data from all traversers
2147
2159
  */
2148
2160
  _updateTiles() {
2161
+ const previousSelectedTiles = this.selectedTiles;
2149
2162
  this.selectedTiles = [];
2150
2163
  this._requestedTiles = [];
2151
2164
  this._emptyTiles = [];
@@ -2156,12 +2169,42 @@ var Tileset3D = class {
2156
2169
  this._emptyTiles = this._emptyTiles.concat(frameStateDataValue._emptyTiles);
2157
2170
  }
2158
2171
  this.selectedTiles = this.options.onTraversalComplete(this.selectedTiles);
2172
+ const selectedIds = new Set(this.selectedTiles.map((t) => t.id));
2173
+ const hasUndrawnTiles = this.selectedTiles.some((t) => !t.tileDrawn);
2174
+ let heldBackCount = 0;
2175
+ if (hasUndrawnTiles) {
2176
+ for (const tileId of selectedIds) {
2177
+ this._heldTiles.add(tileId);
2178
+ }
2179
+ for (const tileId of this._heldTiles) {
2180
+ if (selectedIds.has(tileId))
2181
+ continue;
2182
+ const tile = this._tiles[tileId];
2183
+ if (tile && tile.contentAvailable) {
2184
+ tile._selectedFrame = this._frameNumber;
2185
+ this.selectedTiles.push(tile);
2186
+ heldBackCount++;
2187
+ } else {
2188
+ this._heldTiles.delete(tileId);
2189
+ }
2190
+ }
2191
+ } else {
2192
+ this._heldTiles = selectedIds;
2193
+ }
2194
+ if (heldBackCount > 0) {
2195
+ setTimeout(() => {
2196
+ this.selectTiles();
2197
+ }, 0);
2198
+ }
2159
2199
  for (const tile of this.selectedTiles) {
2160
2200
  this._tiles[tile.id] = tile;
2161
2201
  }
2162
2202
  this._loadTiles();
2163
2203
  this._unloadTiles();
2164
2204
  this._updateStats();
2205
+ if (this._tilesChanged(previousSelectedTiles, this.selectedTiles)) {
2206
+ this.options.onUpdate();
2207
+ }
2165
2208
  }
2166
2209
  _tilesChanged(oldSelectedTiles, selectedTiles) {
2167
2210
  if (oldSelectedTiles.length !== selectedTiles.length) {