@loaders.gl/tiles 4.1.0-alpha.9 → 4.1.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.
package/dist/dist.dev.js CHANGED
@@ -6368,7 +6368,6 @@ var __exports__ = (() => {
6368
6368
  var DEFAULT_PROPS2 = {
6369
6369
  loadSiblings: false,
6370
6370
  skipLevelOfDetail: false,
6371
- maximumScreenSpaceError: 2,
6372
6371
  updateTransforms: true,
6373
6372
  onTraversalEnd: () => {
6374
6373
  },
@@ -6541,7 +6540,7 @@ var __exports__ = (() => {
6541
6540
  if (useParentMetric) {
6542
6541
  screenSpaceError = tile.getScreenSpaceError(frameState, true);
6543
6542
  }
6544
- return screenSpaceError > this.options.maximumScreenSpaceError;
6543
+ return screenSpaceError > tile.tileset.memoryAdjustedScreenSpaceError;
6545
6544
  }
6546
6545
  updateTileVisibility(tile, frameState) {
6547
6546
  const viewportIds = [];
@@ -7199,6 +7198,7 @@ var __exports__ = (() => {
7199
7198
  throttleRequests: true,
7200
7199
  maxRequests: 64,
7201
7200
  maximumMemoryUsage: 32,
7201
+ memoryCacheOverflow: 1,
7202
7202
  maximumTilesSelected: 0,
7203
7203
  debounceTime: 0,
7204
7204
  onTileLoad: () => {
@@ -7211,6 +7211,7 @@ var __exports__ = (() => {
7211
7211
  contentLoader: void 0,
7212
7212
  viewDistanceScale: 1,
7213
7213
  maximumScreenSpaceError: 8,
7214
+ memoryAdjustedScreenSpaceError: false,
7214
7215
  loadTiles: true,
7215
7216
  updateTransforms: true,
7216
7217
  viewportTraversersMap: null,
@@ -7231,6 +7232,7 @@ var __exports__ = (() => {
7231
7232
  var TILES_LOAD_FAILED = "Failed Tile Loads";
7232
7233
  var POINTS_COUNT = "Points/Vertices";
7233
7234
  var TILES_GPU_MEMORY = "Tile Memory Use";
7235
+ var MAXIMUM_SSE = "Maximum Screen Space Error";
7234
7236
  var Tileset3D = class {
7235
7237
  root = null;
7236
7238
  roots = {};
@@ -7252,6 +7254,9 @@ var __exports__ = (() => {
7252
7254
  dynamicScreenSpaceErrorComputedDensity = 0;
7253
7255
  maximumMemoryUsage = 32;
7254
7256
  gpuMemoryUsageInBytes = 0;
7257
+ memoryAdjustedScreenSpaceError = 0;
7258
+ _cacheBytes = 0;
7259
+ _cacheOverflowBytes = 0;
7255
7260
  _frameNumber = 0;
7256
7261
  _queryParams = {};
7257
7262
  _extensionsUsed = [];
@@ -7287,6 +7292,9 @@ var __exports__ = (() => {
7287
7292
  throttleRequests: this.options.throttleRequests,
7288
7293
  maxRequests: this.options.maxRequests
7289
7294
  });
7295
+ this.memoryAdjustedScreenSpaceError = this.options.maximumScreenSpaceError;
7296
+ this._cacheBytes = this.options.maximumMemoryUsage * 1024 * 1024;
7297
+ this._cacheOverflowBytes = this.options.memoryCacheOverflow * 1024 * 1024;
7290
7298
  this.stats = new Stats({
7291
7299
  id: this.url
7292
7300
  });
@@ -7358,6 +7366,13 @@ var __exports__ = (() => {
7358
7366
  }
7359
7367
  return this.updatePromise;
7360
7368
  }
7369
+ adjustScreenSpaceError() {
7370
+ if (this.gpuMemoryUsageInBytes < this._cacheBytes) {
7371
+ this.memoryAdjustedScreenSpaceError = Math.max(this.memoryAdjustedScreenSpaceError / 1.02, this.options.maximumScreenSpaceError);
7372
+ } else if (this.gpuMemoryUsageInBytes > this._cacheBytes + this._cacheOverflowBytes) {
7373
+ this.memoryAdjustedScreenSpaceError *= 1.02;
7374
+ }
7375
+ }
7361
7376
  doUpdate(viewports) {
7362
7377
  if ("loadTiles" in this.options && !this.options.loadTiles) {
7363
7378
  return;
@@ -7478,6 +7493,7 @@ var __exports__ = (() => {
7478
7493
  this.stats.get(TILES_IN_VIEW).count = this.selectedTiles.length;
7479
7494
  this.stats.get(TILES_RENDERABLE).count = tilesRenderable;
7480
7495
  this.stats.get(POINTS_COUNT).count = pointsRenderable;
7496
+ this.stats.get(MAXIMUM_SSE).count = this.memoryAdjustedScreenSpaceError;
7481
7497
  }
7482
7498
  async _initializeTileSet(tilesetJson) {
7483
7499
  if (this.type === TILESET_TYPE.I3S) {
@@ -7555,6 +7571,7 @@ var __exports__ = (() => {
7555
7571
  this.stats.get(TILES_LOAD_FAILED);
7556
7572
  this.stats.get(POINTS_COUNT);
7557
7573
  this.stats.get(TILES_GPU_MEMORY, "memory");
7574
+ this.stats.get(MAXIMUM_SSE);
7558
7575
  }
7559
7576
  _initializeTileHeaders(tilesetJson, parentTileHeader) {
7560
7577
  const rootTile = new Tile3D(this, tilesetJson.root, parentTileHeader);
@@ -7687,6 +7704,9 @@ var __exports__ = (() => {
7687
7704
  this.stats.get(TILES_IN_MEMORY).incrementCount();
7688
7705
  this.gpuMemoryUsageInBytes += tile.gpuMemoryUsageInBytes || 0;
7689
7706
  this.stats.get(TILES_GPU_MEMORY).count = this.gpuMemoryUsageInBytes;
7707
+ if (this.options.memoryAdjustedScreenSpaceError) {
7708
+ this.adjustScreenSpaceError();
7709
+ }
7690
7710
  }
7691
7711
  _unloadTile(tile) {
7692
7712
  this.gpuMemoryUsageInBytes -= tile.gpuMemoryUsageInBytes || 0;
package/dist/index.cjs CHANGED
@@ -892,7 +892,6 @@ var ManagedArray = class {
892
892
  var DEFAULT_PROPS = {
893
893
  loadSiblings: false,
894
894
  skipLevelOfDetail: false,
895
- maximumScreenSpaceError: 2,
896
895
  updateTransforms: true,
897
896
  onTraversalEnd: () => {
898
897
  },
@@ -1089,7 +1088,7 @@ var TilesetTraverser = class {
1089
1088
  if (useParentMetric) {
1090
1089
  screenSpaceError = tile.getScreenSpaceError(frameState, true);
1091
1090
  }
1092
- return screenSpaceError > this.options.maximumScreenSpaceError;
1091
+ return screenSpaceError > tile.tileset.memoryAdjustedScreenSpaceError;
1093
1092
  }
1094
1093
  updateTileVisibility(tile, frameState) {
1095
1094
  const viewportIds = [];
@@ -1908,7 +1907,9 @@ var DEFAULT_PROPS2 = {
1908
1907
  modelMatrix: new import_core10.Matrix4(),
1909
1908
  throttleRequests: true,
1910
1909
  maxRequests: 64,
1910
+ /** Default memory values optimized for viewing mesh-based 3D Tiles on both mobile and desktop devices */
1911
1911
  maximumMemoryUsage: 32,
1912
+ memoryCacheOverflow: 1,
1912
1913
  maximumTilesSelected: 0,
1913
1914
  debounceTime: 0,
1914
1915
  onTileLoad: () => {
@@ -1921,6 +1922,7 @@ var DEFAULT_PROPS2 = {
1921
1922
  contentLoader: void 0,
1922
1923
  viewDistanceScale: 1,
1923
1924
  maximumScreenSpaceError: 8,
1925
+ memoryAdjustedScreenSpaceError: false,
1924
1926
  loadTiles: true,
1925
1927
  updateTransforms: true,
1926
1928
  viewportTraversersMap: null,
@@ -1939,6 +1941,7 @@ var TILES_UNLOADED = "Tiles Unloaded";
1939
1941
  var TILES_LOAD_FAILED = "Failed Tile Loads";
1940
1942
  var POINTS_COUNT = "Points/Vertices";
1941
1943
  var TILES_GPU_MEMORY = "Tile Memory Use";
1944
+ var MAXIMUM_SSE = "Maximum Screen Space Error";
1942
1945
  var Tileset3D = class {
1943
1946
  /**
1944
1947
  * Create a new Tileset3D
@@ -1973,6 +1976,15 @@ var Tileset3D = class {
1973
1976
  this.maximumMemoryUsage = 32;
1974
1977
  /** The total amount of GPU memory in bytes used by the tileset. */
1975
1978
  this.gpuMemoryUsageInBytes = 0;
1979
+ /**
1980
+ * If loading the level of detail required by maximumScreenSpaceError
1981
+ * results in the memory usage exceeding maximumMemoryUsage (GPU), level of detail refinement
1982
+ * will instead use this (larger) adjusted screen space error to achieve the
1983
+ * best possible visual quality within the available memory.
1984
+ */
1985
+ this.memoryAdjustedScreenSpaceError = 0;
1986
+ this._cacheBytes = 0;
1987
+ this._cacheOverflowBytes = 0;
1976
1988
  /** Update tracker. increase in each update cycle. */
1977
1989
  this._frameNumber = 0;
1978
1990
  this._queryParams = {};
@@ -2009,6 +2021,9 @@ var Tileset3D = class {
2009
2021
  throttleRequests: this.options.throttleRequests,
2010
2022
  maxRequests: this.options.maxRequests
2011
2023
  });
2024
+ this.memoryAdjustedScreenSpaceError = this.options.maximumScreenSpaceError;
2025
+ this._cacheBytes = this.options.maximumMemoryUsage * 1024 * 1024;
2026
+ this._cacheOverflowBytes = this.options.memoryCacheOverflow * 1024 * 1024;
2012
2027
  this.stats = new import_stats.Stats({ id: this.url });
2013
2028
  this._initializeStats();
2014
2029
  this.tilesetInitializationPromise = this._initializeTileSet(tileset);
@@ -2097,6 +2112,16 @@ var Tileset3D = class {
2097
2112
  }
2098
2113
  return this.updatePromise;
2099
2114
  }
2115
+ adjustScreenSpaceError() {
2116
+ if (this.gpuMemoryUsageInBytes < this._cacheBytes) {
2117
+ this.memoryAdjustedScreenSpaceError = Math.max(
2118
+ this.memoryAdjustedScreenSpaceError / 1.02,
2119
+ this.options.maximumScreenSpaceError
2120
+ );
2121
+ } else if (this.gpuMemoryUsageInBytes > this._cacheBytes + this._cacheOverflowBytes) {
2122
+ this.memoryAdjustedScreenSpaceError *= 1.02;
2123
+ }
2124
+ }
2100
2125
  /**
2101
2126
  * Update visible tiles relying on a list of viewports
2102
2127
  * @param viewports viewports
@@ -2234,6 +2259,7 @@ var Tileset3D = class {
2234
2259
  this.stats.get(TILES_IN_VIEW).count = this.selectedTiles.length;
2235
2260
  this.stats.get(TILES_RENDERABLE).count = tilesRenderable;
2236
2261
  this.stats.get(POINTS_COUNT).count = pointsRenderable;
2262
+ this.stats.get(MAXIMUM_SSE).count = this.memoryAdjustedScreenSpaceError;
2237
2263
  }
2238
2264
  async _initializeTileSet(tilesetJson) {
2239
2265
  if (this.type === "I3S" /* I3S */) {
@@ -2319,6 +2345,7 @@ var Tileset3D = class {
2319
2345
  this.stats.get(TILES_LOAD_FAILED);
2320
2346
  this.stats.get(POINTS_COUNT);
2321
2347
  this.stats.get(TILES_GPU_MEMORY, "memory");
2348
+ this.stats.get(MAXIMUM_SSE);
2322
2349
  }
2323
2350
  // Installs the main tileset JSON file or a tileset JSON file referenced from a tile.
2324
2351
  // eslint-disable-next-line max-statements
@@ -2458,6 +2485,9 @@ var Tileset3D = class {
2458
2485
  this.stats.get(TILES_IN_MEMORY).incrementCount();
2459
2486
  this.gpuMemoryUsageInBytes += tile.gpuMemoryUsageInBytes || 0;
2460
2487
  this.stats.get(TILES_GPU_MEMORY).count = this.gpuMemoryUsageInBytes;
2488
+ if (this.options.memoryAdjustedScreenSpaceError) {
2489
+ this.adjustScreenSpaceError();
2490
+ }
2461
2491
  }
2462
2492
  _unloadTile(tile) {
2463
2493
  this.gpuMemoryUsageInBytes -= tile.gpuMemoryUsageInBytes || 0;
@@ -14,6 +14,7 @@ export type Tileset3DProps = {
14
14
  loadTiles?: boolean;
15
15
  basePath?: string;
16
16
  maximumMemoryUsage?: number;
17
+ memoryCacheOverflow?: number;
17
18
  maximumTilesSelected?: number;
18
19
  debounceTime?: number;
19
20
  description?: string;
@@ -21,6 +22,7 @@ export type Tileset3DProps = {
21
22
  ellipsoid?: object;
22
23
  modelMatrix?: Matrix4;
23
24
  maximumScreenSpaceError?: number;
25
+ memoryAdjustedScreenSpaceError?: boolean;
24
26
  viewportTraversersMap?: any;
25
27
  updateTransforms?: boolean;
26
28
  viewDistanceScale?: number;
@@ -40,6 +42,7 @@ type Props = {
40
42
  /** Number of simultaneous requsts, if throttleRequests is true */
41
43
  maxRequests: number;
42
44
  maximumMemoryUsage: number;
45
+ memoryCacheOverflow: number;
43
46
  /** Maximum number limit of tiles selected for show. 0 means no limit */
44
47
  maximumTilesSelected: number;
45
48
  /** Delay time before the tileset traversal. It prevents traversal requests spam.*/
@@ -54,6 +57,8 @@ type Props = {
54
57
  onTraversalComplete: (selectedTiles: Tile3D[]) => Tile3D[];
55
58
  /** The maximum screen space error used to drive level of detail refinement. */
56
59
  maximumScreenSpaceError: number;
60
+ /** Whether to adjust the maximum screen space error to comply with the maximum memory limitation */
61
+ memoryAdjustedScreenSpaceError: boolean;
57
62
  viewportTraversersMap: Record<string, any> | null;
58
63
  attributions: string[];
59
64
  loadTiles: boolean;
@@ -143,6 +148,15 @@ export declare class Tileset3D {
143
148
  maximumMemoryUsage: number;
144
149
  /** The total amount of GPU memory in bytes used by the tileset. */
145
150
  gpuMemoryUsageInBytes: number;
151
+ /**
152
+ * If loading the level of detail required by maximumScreenSpaceError
153
+ * results in the memory usage exceeding maximumMemoryUsage (GPU), level of detail refinement
154
+ * will instead use this (larger) adjusted screen space error to achieve the
155
+ * best possible visual quality within the available memory.
156
+ */
157
+ memoryAdjustedScreenSpaceError: number;
158
+ private _cacheBytes;
159
+ private _cacheOverflowBytes;
146
160
  /** Update tracker. increase in each update cycle. */
147
161
  _frameNumber: number;
148
162
  private _queryParams;
@@ -197,6 +211,7 @@ export declare class Tileset3D {
197
211
  * @returns Promise of new frameNumber
198
212
  */
199
213
  selectTiles(viewports?: Viewport[] | Viewport | null): Promise<number>;
214
+ adjustScreenSpaceError(): void;
200
215
  /**
201
216
  * Update visible tiles relying on a list of viewports
202
217
  * @param viewports viewports
@@ -1 +1 @@
1
- {"version":3,"file":"tileset-3d.d.ts","sourceRoot":"","sources":["../../src/tileset/tileset-3d.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tileset-3d.d.ts","sourceRoot":"","sources":["../../src/tileset/tileset-3d.ts"],"names":[],"mappings":"AAMA,OAAO,EAAC,OAAO,EAAE,OAAO,EAAC,MAAM,eAAe,CAAC;AAE/C,OAAO,EAAC,KAAK,EAAC,MAAM,iBAAiB,CAAC;AACtC,OAAO,EAAC,gBAAgB,EAAQ,gBAAgB,EAAE,aAAa,EAAC,MAAM,0BAA0B,CAAC;AACjG,OAAO,EAAC,YAAY,EAAC,MAAM,iBAAiB,CAAC;AAE7C,OAAO,EAAC,UAAU,EAAoC,MAAM,uBAAuB,CAAC;AAGpF,OAAO,KAAK,EAAqB,QAAQ,EAAC,MAAM,UAAU,CAAC;AAC3D,OAAO,EAAC,MAAM,EAAC,MAAM,WAAW,CAAC;AAGjC,OAAO,EAAC,gBAAgB,EAAC,MAAM,qBAAqB,CAAC;AAMrD,MAAM,MAAM,WAAW,GAAG,GAAG,CAAC;AAqB9B,MAAM,MAAM,cAAc,GAAG;IAE3B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,aAAa,CAAC;IAC5B,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAC5B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,YAAY,CAAC,EAAE,MAAM,CAAC;IAGtB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IAGxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,OAAO,CAAC;IAGtB,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,8BAA8B,CAAC,EAAE,OAAO,CAAC;IACzC,qBAAqB,CAAC,EAAE,GAAG,CAAC;IAC5B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAG3B,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,GAAG,CAAC;IACnC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,GAAG,CAAC;IACrC,WAAW,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,GAAG,CAAC;IAClE,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,mBAAmB,CAAC,EAAE,CAAC,aAAa,EAAE,MAAM,EAAE,KAAK,MAAM,EAAE,CAAC;CAC7D,CAAC;AAEF,KAAK,KAAK,GAAG;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,CAAC;IAClB,sEAAsE;IACtE,WAAW,EAAE,OAAO,CAAC;IACrB,yDAAyD;IACzD,gBAAgB,EAAE,OAAO,CAAC;IAC1B,kEAAkE;IAClE,WAAW,EAAE,MAAM,CAAC;IAEpB,kBAAkB,EAAE,MAAM,CAAC;IAE3B,mBAAmB,EAAE,MAAM,CAAC;IAC5B,wEAAwE;IACxE,oBAAoB,EAAE,MAAM,CAAC;IAC7B,mFAAmF;IACnF,YAAY,EAAE,MAAM,CAAC;IACrB,2DAA2D;IAC3D,UAAU,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,0EAA0E;IAC1E,YAAY,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,+DAA+D;IAC/D,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IAClE,yEAAyE;IACzE,mBAAmB,EAAE,CAAC,aAAa,EAAE,MAAM,EAAE,KAAK,MAAM,EAAE,CAAC;IAC3D,+EAA+E;IAC/E,uBAAuB,EAAE,MAAM,CAAC;IAChC,oGAAoG;IACpG,8BAA8B,EAAE,OAAO,CAAC;IACxC,qBAAqB,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC;IAClD,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,EAAE,aAAa,CAAC;IAC3B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,mCAAmC;IACnC,iBAAiB,EAAE,MAAM,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,yCAAyC;IACzC,aAAa,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAChD,iEAAiE;IACjE,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAC1B,CAAC;AA2CF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgCE;AACF,qBAAa,SAAS;IAEpB,OAAO,EAAE,KAAK,CAAC;IACf,WAAW,EAAE,aAAa,CAAC;IAE3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,WAAW,CAAC;IACrB,MAAM,EAAE,gBAAgB,CAAC;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,OAAO,CAAC;IACrB,SAAS,EAAE,GAAG,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,cAAc,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,GAAG,IAAI,CAAQ;IAC3B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAM;IACnC,yBAAyB;IACzB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAM;IAGhC,WAAW,EAAE,MAAM,CAAM;IACzB,UAAU,EAAE,GAAG,CAAC;IAEhB,MAAM,EAAE,GAAG,CAAQ;IACnB,YAAY,EAAE,GAAG,CAAM;IACvB,OAAO,EAAE,GAAG,CAAM;IAElB,KAAK,EAAE,KAAK,CAAC;IAEb,sEAAsE;IACtE,cAAc;;;;;MAA2D;IAGzE,kBAAkB,EAAE,OAAO,GAAG,IAAI,CAAQ;IAC1C,eAAe,EAAE,OAAO,GAAG,IAAI,CAAQ;IACvC,IAAI,EAAE,MAAM,CAAK;IACjB,cAAc,EAAE,GAAG,CAAQ;IAE3B,yDAAyD;IACzD,sCAAsC,EAAE,MAAM,CAAO;IAIrD;;;OAGG;IACH,kBAAkB,EAAE,MAAM,CAAM;IAEhC,mEAAmE;IACnE,qBAAqB,EAAE,MAAM,CAAK;IAElC;;;;;OAKG;IACH,8BAA8B,EAAE,MAAM,CAAO;IAE7C,OAAO,CAAC,WAAW,CAAa;IAChC,OAAO,CAAC,mBAAmB,CAAa;IAExC,qDAAqD;IACrD,YAAY,EAAE,MAAM,CAAK;IACzB,OAAO,CAAC,YAAY,CAA8B;IAClD,OAAO,CAAC,eAAe,CAAgB;IACvC,OAAO,CAAC,MAAM,CAA8B;IAE5C,0CAA0C;IAC1C,OAAO,CAAC,aAAa,CAAa;IAElC,6BAA6B;IAC7B,aAAa,EAAE,MAAM,EAAE,CAAM;IAG7B,eAAe,EAAE,MAAM,CAAK;IAC5B,cAAc,EAAE,MAAM,CAAK;IAC3B,OAAO,CAAC,mBAAmB,CAAsC;IACjE,OAAO,CAAC,eAAe,CAAgB;IACvC,OAAO,CAAC,WAAW,CAAgB;IACnC,OAAO,CAAC,cAAc,CAAW;IAEjC,UAAU,EAAE,gBAAgB,CAAC;IAC7B,MAAM,eAAsB;IAC5B,iBAAiB,EAAE,gBAAgB,CAAC;IAGpC,OAAO,CAAC,aAAa,CAAgC;IACrD,4BAA4B,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAE5C;;;;OAIG;gBAES,OAAO,EAAE,WAAW,EAAE,OAAO,CAAC,EAAE,cAAc;IAwC1D,wBAAwB;IACxB,OAAO,IAAI,IAAI;IAIf,6EAA6E;IAC7E,QAAQ,IAAI,OAAO;IAKnB,IAAI,KAAK,IAAI,MAAM,EAAE,CAEpB;IAED,IAAI,WAAW,IAAI,MAAM,CAExB;IAED,IAAI,WAAW,IAAI,MAAM,CAExB;IAED,QAAQ,CAAC,KAAK,EAAE,cAAc,GAAG,IAAI;IAIrC,kBAAkB;IAKlB;;;OAGG;IACH,UAAU,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;IAcpC,YAAY,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO;IAI5C;;;;OAIG;IACH,MAAM,CAAC,SAAS,GAAE,QAAQ,EAAE,GAAG,QAAQ,GAAG,IAAW;IAcrD;;;;;OAKG;IACG,WAAW,CAAC,SAAS,GAAE,QAAQ,EAAE,GAAG,QAAQ,GAAG,IAAW,GAAG,OAAO,CAAC,MAAM,CAAC;IAmBlF,sBAAsB,IAAI,IAAI;IAU9B;;;OAGG;IAEH,OAAO,CAAC,QAAQ;IAsChB;;;;OAIG;IACH,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO;IAY1C;;;OAGG;IACH,eAAe,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI;IA4B7C;;OAEG;IACH,YAAY,IAAI,IAAI;IAuBpB,aAAa,CAAC,gBAAgB,EAAE,MAAM,EAAE,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,OAAO;IAW3E,UAAU,IAAI,IAAI;IAYlB,YAAY,IAAI,IAAI;IAKpB,YAAY,IAAI,IAAI;IAqBd,kBAAkB,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBjE;;;;;OAKG;IACH,OAAO,CAAC,qBAAqB;IAgC7B;;;;;OAKG;IACH,OAAO,CAAC,yBAAyB;IAuBjC,gBAAgB;IAgBhB,sBAAsB,CAAC,WAAW,EAAE,WAAW,EAAE,gBAAgB,CAAC,EAAE,GAAG;IA6CvE,oBAAoB,IAAI,gBAAgB;IAoBxC,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI;IAIvC,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAa5C,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI;IAUlD,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI;IAsBhD;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IA4B1B,mBAAmB;IAKnB,iBAAiB;IAKjB,eAAe,CAAC,IAAI,EAAE,MAAM;IAI5B,iBAAiB,CAAC,IAAI,KAAA;IAetB,WAAW,CAAC,IAAI,KAAA;IAYhB,QAAQ;IAoBR,eAAe,CAAC,IAAI,KAAA;IAgBpB,YAAY,CAAC,IAAI,KAAA;IAMjB,yBAAyB,CAAC,WAAW,KAAA;IAuCrC,qBAAqB;CAOtB"}
@@ -18,6 +18,7 @@ const DEFAULT_PROPS = {
18
18
  throttleRequests: true,
19
19
  maxRequests: 64,
20
20
  maximumMemoryUsage: 32,
21
+ memoryCacheOverflow: 1,
21
22
  maximumTilesSelected: 0,
22
23
  debounceTime: 0,
23
24
  onTileLoad: () => {},
@@ -27,6 +28,7 @@ const DEFAULT_PROPS = {
27
28
  contentLoader: undefined,
28
29
  viewDistanceScale: 1.0,
29
30
  maximumScreenSpaceError: 8,
31
+ memoryAdjustedScreenSpaceError: false,
30
32
  loadTiles: true,
31
33
  updateTransforms: true,
32
34
  viewportTraversersMap: null,
@@ -47,6 +49,7 @@ const TILES_UNLOADED = 'Tiles Unloaded';
47
49
  const TILES_LOAD_FAILED = 'Failed Tile Loads';
48
50
  const POINTS_COUNT = 'Points/Vertices';
49
51
  const TILES_GPU_MEMORY = 'Tile Memory Use';
52
+ const MAXIMUM_SSE = 'Maximum Screen Space Error';
50
53
  export class Tileset3D {
51
54
  constructor(tileset, options) {
52
55
  this.options = void 0;
@@ -83,6 +86,9 @@ export class Tileset3D {
83
86
  this.dynamicScreenSpaceErrorComputedDensity = 0.0;
84
87
  this.maximumMemoryUsage = 32;
85
88
  this.gpuMemoryUsageInBytes = 0;
89
+ this.memoryAdjustedScreenSpaceError = 0.0;
90
+ this._cacheBytes = 0;
91
+ this._cacheOverflowBytes = 0;
86
92
  this._frameNumber = 0;
87
93
  this._queryParams = {};
88
94
  this._extensionsUsed = [];
@@ -120,6 +126,9 @@ export class Tileset3D {
120
126
  throttleRequests: this.options.throttleRequests,
121
127
  maxRequests: this.options.maxRequests
122
128
  });
129
+ this.memoryAdjustedScreenSpaceError = this.options.maximumScreenSpaceError;
130
+ this._cacheBytes = this.options.maximumMemoryUsage * 1024 * 1024;
131
+ this._cacheOverflowBytes = this.options.memoryCacheOverflow * 1024 * 1024;
123
132
  this.stats = new Stats({
124
133
  id: this.url
125
134
  });
@@ -193,6 +202,13 @@ export class Tileset3D {
193
202
  }
194
203
  return this.updatePromise;
195
204
  }
205
+ adjustScreenSpaceError() {
206
+ if (this.gpuMemoryUsageInBytes < this._cacheBytes) {
207
+ this.memoryAdjustedScreenSpaceError = Math.max(this.memoryAdjustedScreenSpaceError / 1.02, this.options.maximumScreenSpaceError);
208
+ } else if (this.gpuMemoryUsageInBytes > this._cacheBytes + this._cacheOverflowBytes) {
209
+ this.memoryAdjustedScreenSpaceError *= 1.02;
210
+ }
211
+ }
196
212
  doUpdate(viewports) {
197
213
  if ('loadTiles' in this.options && !this.options.loadTiles) {
198
214
  return;
@@ -313,6 +329,7 @@ export class Tileset3D {
313
329
  this.stats.get(TILES_IN_VIEW).count = this.selectedTiles.length;
314
330
  this.stats.get(TILES_RENDERABLE).count = tilesRenderable;
315
331
  this.stats.get(POINTS_COUNT).count = pointsRenderable;
332
+ this.stats.get(MAXIMUM_SSE).count = this.memoryAdjustedScreenSpaceError;
316
333
  }
317
334
  async _initializeTileSet(tilesetJson) {
318
335
  if (this.type === TILESET_TYPE.I3S) {
@@ -391,6 +408,7 @@ export class Tileset3D {
391
408
  this.stats.get(TILES_LOAD_FAILED);
392
409
  this.stats.get(POINTS_COUNT);
393
410
  this.stats.get(TILES_GPU_MEMORY, 'memory');
411
+ this.stats.get(MAXIMUM_SSE);
394
412
  }
395
413
  _initializeTileHeaders(tilesetJson, parentTileHeader) {
396
414
  const rootTile = new Tile3D(this, tilesetJson.root, parentTileHeader);
@@ -526,6 +544,9 @@ export class Tileset3D {
526
544
  this.stats.get(TILES_IN_MEMORY).incrementCount();
527
545
  this.gpuMemoryUsageInBytes += tile.gpuMemoryUsageInBytes || 0;
528
546
  this.stats.get(TILES_GPU_MEMORY).count = this.gpuMemoryUsageInBytes;
547
+ if (this.options.memoryAdjustedScreenSpaceError) {
548
+ this.adjustScreenSpaceError();
549
+ }
529
550
  }
530
551
  _unloadTile(tile) {
531
552
  this.gpuMemoryUsageInBytes -= tile.gpuMemoryUsageInBytes || 0;
@@ -1 +1 @@
1
- {"version":3,"file":"tileset-3d.js","names":["Matrix4","Vector3","Ellipsoid","Stats","RequestScheduler","path","TilesetCache","calculateTransformProps","getFrameState","limitSelectedTiles","getZoomFromBoundingVolume","getZoomFromExtent","getZoomFromFullExtent","Tile3D","TILESET_TYPE","TilesetTraverser","Tileset3DTraverser","I3STilesetTraverser","DEFAULT_PROPS","description","ellipsoid","WGS84","modelMatrix","throttleRequests","maxRequests","maximumMemoryUsage","maximumTilesSelected","debounceTime","onTileLoad","onTileUnload","onTileError","onTraversalComplete","selectedTiles","contentLoader","undefined","viewDistanceScale","maximumScreenSpaceError","loadTiles","updateTransforms","viewportTraversersMap","loadOptions","fetch","attributions","basePath","i3s","TILES_TOTAL","TILES_IN_MEMORY","TILES_IN_VIEW","TILES_RENDERABLE","TILES_LOADED","TILES_LOADING","TILES_UNLOADED","TILES_LOAD_FAILED","POINTS_COUNT","TILES_GPU_MEMORY","Tileset3D","constructor","tileset","options","type","loader","url","lodMetricType","lodMetricValue","refine","root","roots","asset","properties","extras","credits","stats","contentFormats","draco","meshopt","dds","ktx2","cartographicCenter","cartesianCenter","zoom","boundingVolume","dynamicScreenSpaceErrorComputedDensity","gpuMemoryUsageInBytes","_frameNumber","_queryParams","_extensionsUsed","_tiles","_pendingCount","traverseCounter","geometricError","lastUpdatedVieports","_requestedTiles","_emptyTiles","frameStateData","_traverser","_cache","_requestScheduler","updatePromise","tilesetInitializationPromise","dirname","_initializeTraverser","id","_initializeStats","_initializeTileSet","destroy","_destroy","isLoaded","length","tiles","Object","values","frameNumber","queryParams","URLSearchParams","toString","setProps","props","getTileUrl","tilePath","isDataUrl","startsWith","tileUrl","includes","hasExtension","extensionName","Boolean","indexOf","update","viewports","arguments","then","doUpdate","selectTiles","Promise","resolve","setTimeout","preparedViewports","Array","reset","viewportsToTraverse","viewport","_needTraverse","push","_initializeTileHeaders","frameState","traverse","viewportId","traverserId","_onTraversalEnd","currentFrameStateData","filteredSelectedTiles","unselectedTiles","tile","unselect","requestedTiles","emptyTiles","_updateTiles","frameStateKey","frameStateDataValue","concat","_loadTiles","_unloadTiles","_updateStats","_tilesChanged","oldSelectedTiles","set1","Set","map","t","set2","changed","filter","x","has","contentUnloaded","_loadTile","unloadTiles","_unloadTile","tilesRenderable","pointsRenderable","contentAvailable","content","pointCount","vertexCount","get","count","tilesetJson","I3S","calculateViewPropsI3S","TILES3D","_initializeTiles3DTileset","calculateViewPropsTiles3D","_initializeI3STileset","_this$tileset$store","fullExtent","xmin","xmax","ymin","ymax","zmin","zmax","cartographicToCartesian","extent","store","console","warn","center","cartesianToCartographic","radii","parentTileHeader","rootTile","children","depth","stack","pop","incrementCount","header","childHeader","_childTile$contentUrl","childTile","contentUrl","URL","session","searchParams","TraverserClass","onTraversalEnd","bind","_destroyTileHeaders","parentTile","_destroySubtree","loaded","_onStartTileLoading","loadContent","error","_onTileLoadError","Error","_onEndTileLoading","_onTileLoad","message","_this$tileset","_this$tileset$nodePag","nodesInNodePages","nodePagesTile","addCount","updateContentTypes","_addTileToCache","isDracoGeometry","textureFormat","_tile$content","extensionsRemoved","gltf","decrementCount","add","_updateCacheStats","unloadContent","child","_destroyTile","unloadTile","queryString","fromEntries","entries","version","v","tilesetVersion","extensionsUsed","token"],"sources":["../../src/tileset/tileset-3d.ts"],"sourcesContent":["// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n// This file is derived from the Cesium code base under Apache 2 license\n// See LICENSE.md and https://github.com/AnalyticalGraphicsInc/cesium/blob/master/LICENSE.md\n\nimport {Matrix4, Vector3} from '@math.gl/core';\nimport {Ellipsoid} from '@math.gl/geospatial';\nimport {Stats} from '@probe.gl/stats';\nimport {RequestScheduler, path, LoaderWithParser, LoaderOptions} from '@loaders.gl/loader-utils';\nimport {TilesetCache} from './tileset-cache';\nimport {calculateTransformProps} from './helpers/transform-utils';\nimport {FrameState, getFrameState, limitSelectedTiles} from './helpers/frame-state';\nimport {getZoomFromBoundingVolume, getZoomFromExtent, getZoomFromFullExtent} from './helpers/zoom';\n\nimport type {GeospatialViewport, Viewport} from '../types';\nimport {Tile3D} from './tile-3d';\nimport {TILESET_TYPE} from '../constants';\n\nimport {TilesetTraverser} from './tileset-traverser';\n\n// TODO - these should be moved into their respective modules\nimport {Tileset3DTraverser} from './format-3d-tiles/tileset-3d-traverser';\nimport {I3STilesetTraverser} from './format-i3s/i3s-tileset-traverser';\n\nexport type TilesetJSON = any;\n\n/*\nexport type TilesetJSON = {\n loader;\n // could be 3d tiles, i3s\n type: 'I3S' | '3DTILES';\n /** The url to the top level tileset JSON file. *\n url: string;\n basePath?: string;\n // Geometric error when the tree is not rendered at all\n lodMetricType: string;\n lodMetricValue: number;\n root: {\n refine: string;\n [key: string]: unknown;\n },\n [key: string]: unknown;\n};\n*/\n\nexport type Tileset3DProps = {\n // loading\n throttleRequests?: boolean;\n maxRequests?: number;\n loadOptions?: LoaderOptions;\n loadTiles?: boolean;\n basePath?: string;\n maximumMemoryUsage?: number;\n maximumTilesSelected?: number;\n debounceTime?: number;\n\n // Metadata\n description?: string;\n attributions?: string[];\n\n // Transforms\n ellipsoid?: object;\n modelMatrix?: Matrix4;\n\n // Traversal\n maximumScreenSpaceError?: number;\n viewportTraversersMap?: any;\n updateTransforms?: boolean;\n viewDistanceScale?: number;\n\n // Callbacks\n onTileLoad?: (tile: Tile3D) => any;\n onTileUnload?: (tile: Tile3D) => any;\n onTileError?: (tile: Tile3D, message: string, url: string) => any;\n contentLoader?: (tile: Tile3D) => Promise<void>;\n onTraversalComplete?: (selectedTiles: Tile3D[]) => Tile3D[];\n};\n\ntype Props = {\n description: string;\n ellipsoid: object;\n /** A 4x4 transformation matrix this transforms the entire tileset. */\n modelMatrix: Matrix4;\n /** Set to false to disable network request throttling */\n throttleRequests: boolean;\n /** Number of simultaneous requsts, if throttleRequests is true */\n maxRequests: number;\n maximumMemoryUsage: number;\n /** Maximum number limit of tiles selected for show. 0 means no limit */\n maximumTilesSelected: number;\n /** Delay time before the tileset traversal. It prevents traversal requests spam.*/\n debounceTime: number;\n /** Callback. Indicates this a tile's content was loaded */\n onTileLoad: (tile: Tile3D) => void;\n /** Callback. Indicates this a tile's content was unloaded (cache full) */\n onTileUnload: (tile: Tile3D) => void;\n /** Callback. Indicates this a tile's content failed to load */\n onTileError: (tile: Tile3D, message: string, url: string) => void;\n /** Callback. Allows post-process selectedTiles right after traversal. */\n onTraversalComplete: (selectedTiles: Tile3D[]) => Tile3D[];\n /** The maximum screen space error used to drive level of detail refinement. */\n maximumScreenSpaceError: number;\n viewportTraversersMap: Record<string, any> | null;\n attributions: string[];\n loadTiles: boolean;\n loadOptions: LoaderOptions;\n updateTransforms: boolean;\n /** View distance scale modifier */\n viewDistanceScale: number;\n basePath: string;\n /** Optional async tile content loader */\n contentLoader?: (tile: Tile3D) => Promise<void>;\n /** @todo I3S specific knowledge should be moved to I3S module */\n i3s: Record<string, any>;\n};\n\nconst DEFAULT_PROPS: Props = {\n description: '',\n ellipsoid: Ellipsoid.WGS84,\n modelMatrix: new Matrix4(),\n throttleRequests: true,\n maxRequests: 64,\n maximumMemoryUsage: 32,\n maximumTilesSelected: 0,\n debounceTime: 0,\n onTileLoad: () => {},\n onTileUnload: () => {},\n onTileError: () => {},\n onTraversalComplete: (selectedTiles: Tile3D[]) => selectedTiles,\n contentLoader: undefined,\n viewDistanceScale: 1.0,\n maximumScreenSpaceError: 8,\n loadTiles: true,\n updateTransforms: true,\n viewportTraversersMap: null,\n loadOptions: {fetch: {}},\n attributions: [],\n basePath: '',\n i3s: {}\n};\n\n// Tracked Stats\nconst TILES_TOTAL = 'Tiles In Tileset(s)';\nconst TILES_IN_MEMORY = 'Tiles In Memory';\nconst TILES_IN_VIEW = 'Tiles In View';\nconst TILES_RENDERABLE = 'Tiles To Render';\nconst TILES_LOADED = 'Tiles Loaded';\nconst TILES_LOADING = 'Tiles Loading';\nconst TILES_UNLOADED = 'Tiles Unloaded';\nconst TILES_LOAD_FAILED = 'Failed Tile Loads';\nconst POINTS_COUNT = 'Points/Vertices';\nconst TILES_GPU_MEMORY = 'Tile Memory Use';\n\n/**\n * The Tileset loading and rendering flow is as below,\n * A rendered (i.e. deck.gl `Tile3DLayer`) triggers `tileset.update()` after a `tileset` is loaded\n * `tileset` starts traversing the tile tree and update `requestTiles` (tiles of which content need\n * to be fetched) and `selectedTiles` (tiles ready for rendering under the current viewport).\n * `Tile3DLayer` will update rendering based on `selectedTiles`.\n * `Tile3DLayer` also listens to `onTileLoad` callback and trigger another round of `update and then traversal`\n * when new tiles are loaded.\n\n * As I3S tileset have stored `tileHeader` file (metadata) and tile content files (geometry, texture, ...) separately.\n * During each traversal, it issues `tilHeader` requests if that `tileHeader` is not yet fetched,\n * after the tile header is fulfilled, it will resume the traversal starting from the tile just fetched (not root).\n\n * Tile3DLayer\n * |\n * await load(tileset)\n * |\n * tileset.update()\n * | async load tileHeader\n * tileset.traverse() -------------------------- Queued\n * | resume traversal after fetched |\n * |----------------------------------------|\n * |\n * | async load tile content\n * tilset.requestedTiles ----------------------------- RequestScheduler\n * |\n * tilset.selectedTiles (ready for rendering) |\n * | Listen to |\n * Tile3DLayer ----------- onTileLoad ----------------------|\n * | | notify new tile is available\n * updateLayers |\n * tileset.update // trigger another round of update\n*/\nexport class Tileset3D {\n // props: Tileset3DProps;\n options: Props;\n loadOptions: LoaderOptions;\n\n type: string;\n tileset: TilesetJSON;\n loader: LoaderWithParser;\n url: string;\n basePath: string;\n modelMatrix: Matrix4;\n ellipsoid: any;\n lodMetricType: string;\n lodMetricValue: number;\n refine: string;\n root: Tile3D | null = null;\n roots: Record<string, Tile3D> = {};\n /** @todo any->unknown */\n asset: Record<string, any> = {};\n\n // Metadata for the entire tileset\n description: string = '';\n properties: any;\n\n extras: any = null;\n attributions: any = {};\n credits: any = {};\n\n stats: Stats;\n\n /** flags that contain information about data types in nested tiles */\n contentFormats = {draco: false, meshopt: false, dds: false, ktx2: false};\n\n // view props\n cartographicCenter: Vector3 | null = null;\n cartesianCenter: Vector3 | null = null;\n zoom: number = 1;\n boundingVolume: any = null;\n\n /** Updated based on the camera position and direction */\n dynamicScreenSpaceErrorComputedDensity: number = 0.0;\n\n // METRICS\n\n /**\n * The maximum amount of GPU memory (in MB) that may be used to cache tiles\n * Tiles not in view are unloaded to enforce private\n */\n maximumMemoryUsage: number = 32;\n\n /** The total amount of GPU memory in bytes used by the tileset. */\n gpuMemoryUsageInBytes: number = 0;\n\n /** Update tracker. increase in each update cycle. */\n _frameNumber: number = 0;\n private _queryParams: Record<string, string> = {};\n private _extensionsUsed: string[] = [];\n private _tiles: Record<string, Tile3D> = {};\n\n /** counter for tracking tiles requests */\n private _pendingCount: number = 0;\n\n /** Hold traversal results */\n selectedTiles: Tile3D[] = [];\n\n // TRAVERSAL\n traverseCounter: number = 0;\n geometricError: number = 0;\n private lastUpdatedVieports: Viewport[] | Viewport | null = null;\n private _requestedTiles: Tile3D[] = [];\n private _emptyTiles: Tile3D[] = [];\n private frameStateData: any = {};\n\n _traverser: TilesetTraverser;\n _cache = new TilesetCache();\n _requestScheduler: RequestScheduler;\n\n // Promise tracking\n private updatePromise: Promise<number> | null = null;\n tilesetInitializationPromise: Promise<void>;\n\n /**\n * Create a new Tileset3D\n * @param json\n * @param props\n */\n // eslint-disable-next-line max-statements\n constructor(tileset: TilesetJSON, options?: Tileset3DProps) {\n // PUBLIC MEMBERS\n this.options = {...DEFAULT_PROPS, ...options};\n // raw data\n this.tileset = tileset;\n this.loader = tileset.loader;\n // could be 3d tiles, i3s\n this.type = tileset.type;\n // The url to a tileset JSON file.\n this.url = tileset.url;\n this.basePath = tileset.basePath || path.dirname(this.url);\n this.modelMatrix = this.options.modelMatrix;\n this.ellipsoid = this.options.ellipsoid;\n\n // Geometric error when the tree is not rendered at all\n this.lodMetricType = tileset.lodMetricType;\n this.lodMetricValue = tileset.lodMetricValue;\n this.refine = tileset.root.refine;\n\n this.loadOptions = this.options.loadOptions || {};\n\n // TRAVERSAL\n this._traverser = this._initializeTraverser();\n this._requestScheduler = new RequestScheduler({\n throttleRequests: this.options.throttleRequests,\n maxRequests: this.options.maxRequests\n });\n\n // METRICS\n // The total amount of GPU memory in bytes used by the tileset.\n this.stats = new Stats({id: this.url});\n this._initializeStats();\n\n this.tilesetInitializationPromise = this._initializeTileSet(tileset);\n }\n\n /** Release resources */\n destroy(): void {\n this._destroy();\n }\n\n /** Is the tileset loaded (update needs to have been called at least once) */\n isLoaded(): boolean {\n // Check that `_frameNumber !== 0` which means that update was called at least once\n return this._pendingCount === 0 && this._frameNumber !== 0 && this._requestedTiles.length === 0;\n }\n\n get tiles(): object[] {\n return Object.values(this._tiles);\n }\n\n get frameNumber(): number {\n return this._frameNumber;\n }\n\n get queryParams(): string {\n return new URLSearchParams(this._queryParams).toString();\n }\n\n setProps(props: Tileset3DProps): void {\n this.options = {...this.options, ...props};\n }\n\n /** @deprecated */\n // setOptions(options: Tileset3DProps): void {\n // this.options = {...this.options, ...options};\n // }\n\n /**\n * Return a loadable tile url for a specific tile subpath\n * @param tilePath a tile subpath\n */\n getTileUrl(tilePath: string): string {\n const isDataUrl = tilePath.startsWith('data:');\n if (isDataUrl) {\n return tilePath;\n }\n\n let tileUrl = tilePath;\n if (this.queryParams.length) {\n tileUrl = `${tilePath}${tilePath.includes('?') ? '&' : '?'}${this.queryParams}`;\n }\n return tileUrl;\n }\n\n // TODO CESIUM specific\n hasExtension(extensionName: string): boolean {\n return Boolean(this._extensionsUsed.indexOf(extensionName) > -1);\n }\n\n /**\n * Update visible tiles relying on a list of viewports\n * @param viewports - list of viewports\n * @deprecated\n */\n update(viewports: Viewport[] | Viewport | null = null) {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.tilesetInitializationPromise.then(() => {\n if (!viewports && this.lastUpdatedVieports) {\n viewports = this.lastUpdatedVieports;\n } else {\n this.lastUpdatedVieports = viewports;\n }\n if (viewports) {\n this.doUpdate(viewports);\n }\n });\n }\n\n /**\n * Update visible tiles relying on a list of viewports.\n * Do it with debounce delay to prevent update spam\n * @param viewports viewports\n * @returns Promise of new frameNumber\n */\n async selectTiles(viewports: Viewport[] | Viewport | null = null): Promise<number> {\n await this.tilesetInitializationPromise;\n if (viewports) {\n this.lastUpdatedVieports = viewports;\n }\n if (!this.updatePromise) {\n this.updatePromise = new Promise<number>((resolve) => {\n setTimeout(() => {\n if (this.lastUpdatedVieports) {\n this.doUpdate(this.lastUpdatedVieports);\n }\n resolve(this._frameNumber);\n this.updatePromise = null;\n }, this.options.debounceTime);\n });\n }\n return this.updatePromise;\n }\n\n /**\n * Update visible tiles relying on a list of viewports\n * @param viewports viewports\n */\n // eslint-disable-next-line max-statements, complexity\n private doUpdate(viewports: Viewport[] | Viewport): void {\n if ('loadTiles' in this.options && !this.options.loadTiles) {\n return;\n }\n if (this.traverseCounter > 0) {\n return;\n }\n const preparedViewports = viewports instanceof Array ? viewports : [viewports];\n\n this._cache.reset();\n this._frameNumber++;\n this.traverseCounter = preparedViewports.length;\n const viewportsToTraverse: string[] = [];\n // First loop to decrement traverseCounter\n for (const viewport of preparedViewports) {\n const id = viewport.id;\n if (this._needTraverse(id)) {\n viewportsToTraverse.push(id);\n } else {\n this.traverseCounter--;\n }\n }\n\n // Second loop to traverse\n for (const viewport of preparedViewports) {\n const id = viewport.id;\n if (!this.roots[id]) {\n this.roots[id] = this._initializeTileHeaders(this.tileset, null);\n }\n\n if (!viewportsToTraverse.includes(id)) {\n continue; // eslint-disable-line no-continue\n }\n const frameState = getFrameState(viewport as GeospatialViewport, this._frameNumber);\n this._traverser.traverse(this.roots[id], frameState, this.options);\n }\n }\n\n /**\n * Check if traversal is needed for particular viewport\n * @param {string} viewportId - id of a viewport\n * @return {boolean}\n */\n _needTraverse(viewportId: string): boolean {\n let traverserId = viewportId;\n if (this.options.viewportTraversersMap) {\n traverserId = this.options.viewportTraversersMap[viewportId];\n }\n if (traverserId !== viewportId) {\n return false;\n }\n\n return true;\n }\n\n /**\n * The callback to post-process tiles after traversal procedure\n * @param frameState - frame state for tile culling\n */\n _onTraversalEnd(frameState: FrameState): void {\n const id = frameState.viewport.id;\n if (!this.frameStateData[id]) {\n this.frameStateData[id] = {selectedTiles: [], _requestedTiles: [], _emptyTiles: []};\n }\n const currentFrameStateData = this.frameStateData[id];\n const selectedTiles = Object.values(this._traverser.selectedTiles);\n const [filteredSelectedTiles, unselectedTiles] = limitSelectedTiles(\n selectedTiles,\n frameState,\n this.options.maximumTilesSelected\n );\n currentFrameStateData.selectedTiles = filteredSelectedTiles;\n for (const tile of unselectedTiles) {\n tile.unselect();\n }\n\n currentFrameStateData._requestedTiles = Object.values(this._traverser.requestedTiles);\n currentFrameStateData._emptyTiles = Object.values(this._traverser.emptyTiles);\n\n this.traverseCounter--;\n if (this.traverseCounter > 0) {\n return;\n }\n\n this._updateTiles();\n }\n\n /**\n * Update tiles relying on data from all traversers\n */\n _updateTiles(): void {\n this.selectedTiles = [];\n this._requestedTiles = [];\n this._emptyTiles = [];\n\n for (const frameStateKey in this.frameStateData) {\n const frameStateDataValue = this.frameStateData[frameStateKey];\n this.selectedTiles = this.selectedTiles.concat(frameStateDataValue.selectedTiles);\n this._requestedTiles = this._requestedTiles.concat(frameStateDataValue._requestedTiles);\n this._emptyTiles = this._emptyTiles.concat(frameStateDataValue._emptyTiles);\n }\n\n this.selectedTiles = this.options.onTraversalComplete(this.selectedTiles);\n\n for (const tile of this.selectedTiles) {\n this._tiles[tile.id] = tile;\n }\n\n this._loadTiles();\n this._unloadTiles();\n this._updateStats();\n }\n\n _tilesChanged(oldSelectedTiles: Tile3D[], selectedTiles: Tile3D[]): boolean {\n if (oldSelectedTiles.length !== selectedTiles.length) {\n return true;\n }\n const set1 = new Set(oldSelectedTiles.map((t) => t.id));\n const set2 = new Set(selectedTiles.map((t) => t.id));\n let changed = oldSelectedTiles.filter((x) => !set2.has(x.id)).length > 0;\n changed = changed || selectedTiles.filter((x) => !set1.has(x.id)).length > 0;\n return changed;\n }\n\n _loadTiles(): void {\n // Sort requests by priority before making any requests.\n // This makes it less likely this requests will be cancelled after being issued.\n // requestedTiles.sort((a, b) => a._priority - b._priority);\n for (const tile of this._requestedTiles) {\n if (tile.contentUnloaded) {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this._loadTile(tile);\n }\n }\n }\n\n _unloadTiles(): void {\n // unload tiles from cache when hit maximumMemoryUsage\n this._cache.unloadTiles(this, (tileset, tile) => tileset._unloadTile(tile));\n }\n\n _updateStats(): void {\n let tilesRenderable = 0;\n let pointsRenderable = 0;\n for (const tile of this.selectedTiles) {\n if (tile.contentAvailable && tile.content) {\n tilesRenderable++;\n if (tile.content.pointCount) {\n pointsRenderable += tile.content.pointCount;\n } else {\n // Calculate vertices for non point cloud tiles.\n pointsRenderable += tile.content.vertexCount;\n }\n }\n }\n\n this.stats.get(TILES_IN_VIEW).count = this.selectedTiles.length;\n this.stats.get(TILES_RENDERABLE).count = tilesRenderable;\n this.stats.get(POINTS_COUNT).count = pointsRenderable;\n }\n\n async _initializeTileSet(tilesetJson: TilesetJSON): Promise<void> {\n if (this.type === TILESET_TYPE.I3S) {\n this.calculateViewPropsI3S();\n tilesetJson.root = await tilesetJson.root;\n }\n this.root = this._initializeTileHeaders(tilesetJson, null);\n\n if (this.type === TILESET_TYPE.TILES3D) {\n this._initializeTiles3DTileset(tilesetJson);\n this.calculateViewPropsTiles3D();\n }\n\n if (this.type === TILESET_TYPE.I3S) {\n this._initializeI3STileset();\n }\n }\n\n /**\n * Called during initialize Tileset to initialize the tileset's cartographic center (longitude, latitude) and zoom.\n * These metrics help apps center view on tileset\n * For I3S there is extent (<1.8 version) or fullExtent (>=1.8 version) to calculate view props\n * @returns\n */\n private calculateViewPropsI3S(): void {\n // for I3S 1.8 try to calculate with fullExtent\n const fullExtent = this.tileset.fullExtent;\n if (fullExtent) {\n const {xmin, xmax, ymin, ymax, zmin, zmax} = fullExtent;\n this.cartographicCenter = new Vector3(\n xmin + (xmax - xmin) / 2,\n ymin + (ymax - ymin) / 2,\n zmin + (zmax - zmin) / 2\n );\n this.cartesianCenter = new Vector3();\n Ellipsoid.WGS84.cartographicToCartesian(this.cartographicCenter, this.cartesianCenter);\n this.zoom = getZoomFromFullExtent(fullExtent, this.cartographicCenter, this.cartesianCenter);\n return;\n }\n // for I3S 1.6-1.7 try to calculate with extent\n const extent = this.tileset.store?.extent;\n if (extent) {\n const [xmin, ymin, xmax, ymax] = extent;\n this.cartographicCenter = new Vector3(xmin + (xmax - xmin) / 2, ymin + (ymax - ymin) / 2, 0);\n this.cartesianCenter = new Vector3();\n Ellipsoid.WGS84.cartographicToCartesian(this.cartographicCenter, this.cartesianCenter);\n this.zoom = getZoomFromExtent(extent, this.cartographicCenter, this.cartesianCenter);\n return;\n }\n // eslint-disable-next-line no-console\n console.warn('Extent is not defined in the tileset header');\n this.cartographicCenter = new Vector3();\n this.zoom = 1;\n return;\n }\n\n /**\n * Called during initialize Tileset to initialize the tileset's cartographic center (longitude, latitude) and zoom.\n * These metrics help apps center view on tileset.\n * For 3DTiles the root tile data is used to calculate view props.\n * @returns\n */\n private calculateViewPropsTiles3D() {\n const root = this.root as Tile3D;\n const {center} = root.boundingVolume;\n // TODO - handle all cases\n if (!center) {\n // eslint-disable-next-line no-console\n console.warn('center was not pre-calculated for the root tile');\n this.cartographicCenter = new Vector3();\n this.zoom = 1;\n return;\n }\n\n // cartographic coordinates are undefined at the center of the ellipsoid\n if (center[0] !== 0 || center[1] !== 0 || center[2] !== 0) {\n this.cartographicCenter = new Vector3();\n Ellipsoid.WGS84.cartesianToCartographic(center, this.cartographicCenter);\n } else {\n this.cartographicCenter = new Vector3(0, 0, -Ellipsoid.WGS84.radii[0]);\n }\n this.cartesianCenter = center;\n this.zoom = getZoomFromBoundingVolume(root.boundingVolume, this.cartographicCenter);\n }\n\n _initializeStats() {\n this.stats.get(TILES_TOTAL);\n this.stats.get(TILES_LOADING);\n this.stats.get(TILES_IN_MEMORY);\n this.stats.get(TILES_IN_VIEW);\n this.stats.get(TILES_RENDERABLE);\n this.stats.get(TILES_LOADED);\n this.stats.get(TILES_UNLOADED);\n this.stats.get(TILES_LOAD_FAILED);\n this.stats.get(POINTS_COUNT);\n this.stats.get(TILES_GPU_MEMORY, 'memory');\n }\n\n // Installs the main tileset JSON file or a tileset JSON file referenced from a tile.\n // eslint-disable-next-line max-statements\n _initializeTileHeaders(tilesetJson: TilesetJSON, parentTileHeader?: any) {\n // A tileset JSON file referenced from a tile may exist in a different directory than the root tileset.\n // Get the basePath relative to the external tileset.\n const rootTile = new Tile3D(this, tilesetJson.root, parentTileHeader); // resource\n\n // If there is a parentTileHeader, add the root of the currently loading tileset\n // to parentTileHeader's children, and update its depth.\n if (parentTileHeader) {\n parentTileHeader.children.push(rootTile);\n rootTile.depth = parentTileHeader.depth + 1;\n }\n\n // 3DTiles knows the hierarchy beforehand\n if (this.type === TILESET_TYPE.TILES3D) {\n const stack: Tile3D[] = [];\n stack.push(rootTile);\n\n while (stack.length > 0) {\n const tile = stack.pop() as Tile3D;\n this.stats.get(TILES_TOTAL).incrementCount();\n const children = tile.header.children || [];\n for (const childHeader of children) {\n const childTile = new Tile3D(this, childHeader, tile);\n\n // Special handling for Google\n // A session key must be used for all tile requests\n if (childTile.contentUrl?.includes('?session=')) {\n const url = new URL(childTile.contentUrl);\n const session = url.searchParams.get('session');\n // eslint-disable-next-line max-depth\n if (session) {\n this._queryParams.session = session;\n }\n }\n\n tile.children.push(childTile);\n childTile.depth = tile.depth + 1;\n stack.push(childTile);\n }\n }\n }\n\n return rootTile;\n }\n\n _initializeTraverser(): TilesetTraverser {\n let TraverserClass;\n const type = this.type;\n switch (type) {\n case TILESET_TYPE.TILES3D:\n TraverserClass = Tileset3DTraverser;\n break;\n case TILESET_TYPE.I3S:\n TraverserClass = I3STilesetTraverser;\n break;\n default:\n TraverserClass = TilesetTraverser;\n }\n\n return new TraverserClass({\n basePath: this.basePath,\n onTraversalEnd: this._onTraversalEnd.bind(this)\n });\n }\n\n _destroyTileHeaders(parentTile: Tile3D): void {\n this._destroySubtree(parentTile);\n }\n\n async _loadTile(tile: Tile3D): Promise<void> {\n let loaded;\n try {\n this._onStartTileLoading();\n loaded = await tile.loadContent();\n } catch (error: unknown) {\n this._onTileLoadError(tile, error instanceof Error ? error : new Error('load failed'));\n } finally {\n this._onEndTileLoading();\n this._onTileLoad(tile, loaded);\n }\n }\n\n _onTileLoadError(tile: Tile3D, error: Error): void {\n this.stats.get(TILES_LOAD_FAILED).incrementCount();\n\n const message = error.message || error.toString();\n const url = tile.url;\n // TODO - Allow for probe log to be injected instead of console?\n console.error(`A 3D tile failed to load: ${tile.url} ${message}`); // eslint-disable-line\n this.options.onTileError(tile, message, url);\n }\n\n _onTileLoad(tile: Tile3D, loaded: boolean): void {\n if (!loaded) {\n return;\n }\n\n if (this.type === TILESET_TYPE.I3S) {\n // We can't calculate tiles total in I3S in advance so we calculate it dynamically.\n const nodesInNodePages = this.tileset?.nodePagesTile?.nodesInNodePages || 0;\n this.stats.get(TILES_TOTAL).reset();\n this.stats.get(TILES_TOTAL).addCount(nodesInNodePages);\n }\n\n // add coordinateOrigin and modelMatrix to tile\n if (tile && tile.content) {\n calculateTransformProps(tile, tile.content);\n }\n\n this.updateContentTypes(tile);\n this._addTileToCache(tile);\n this.options.onTileLoad(tile);\n }\n\n /**\n * Update information about data types in nested tiles\n * @param tile instance of a nested Tile3D\n */\n private updateContentTypes(tile: Tile3D) {\n if (this.type === TILESET_TYPE.I3S) {\n if (tile.header.isDracoGeometry) {\n this.contentFormats.draco = true;\n }\n switch (tile.header.textureFormat) {\n case 'dds':\n this.contentFormats.dds = true;\n break;\n case 'ktx2':\n this.contentFormats.ktx2 = true;\n break;\n default:\n }\n } else if (this.type === TILESET_TYPE.TILES3D) {\n const {extensionsRemoved = []} = tile.content?.gltf || {};\n if (extensionsRemoved.includes('KHR_draco_mesh_compression')) {\n this.contentFormats.draco = true;\n }\n if (extensionsRemoved.includes('EXT_meshopt_compression')) {\n this.contentFormats.meshopt = true;\n }\n if (extensionsRemoved.includes('KHR_texture_basisu')) {\n this.contentFormats.ktx2 = true;\n }\n }\n }\n\n _onStartTileLoading() {\n this._pendingCount++;\n this.stats.get(TILES_LOADING).incrementCount();\n }\n\n _onEndTileLoading() {\n this._pendingCount--;\n this.stats.get(TILES_LOADING).decrementCount();\n }\n\n _addTileToCache(tile: Tile3D) {\n this._cache.add(this, tile, (tileset) => tileset._updateCacheStats(tile));\n }\n\n _updateCacheStats(tile) {\n this.stats.get(TILES_LOADED).incrementCount();\n this.stats.get(TILES_IN_MEMORY).incrementCount();\n\n // Good enough? Just use the raw binary ArrayBuffer's byte length.\n this.gpuMemoryUsageInBytes += tile.gpuMemoryUsageInBytes || 0;\n this.stats.get(TILES_GPU_MEMORY).count = this.gpuMemoryUsageInBytes;\n }\n\n _unloadTile(tile) {\n this.gpuMemoryUsageInBytes -= tile.gpuMemoryUsageInBytes || 0;\n\n this.stats.get(TILES_IN_MEMORY).decrementCount();\n this.stats.get(TILES_UNLOADED).incrementCount();\n this.stats.get(TILES_GPU_MEMORY).count = this.gpuMemoryUsageInBytes;\n\n this.options.onTileUnload(tile);\n tile.unloadContent();\n }\n\n // Traverse the tree and destroy all tiles\n _destroy() {\n const stack: Tile3D[] = [];\n\n if (this.root) {\n stack.push(this.root);\n }\n\n while (stack.length > 0) {\n const tile: Tile3D = stack.pop() as Tile3D;\n\n for (const child of tile.children) {\n stack.push(child);\n }\n\n this._destroyTile(tile);\n }\n this.root = null;\n }\n\n // Traverse the tree and destroy all sub tiles\n _destroySubtree(tile) {\n const root = tile;\n const stack: Tile3D[] = [];\n stack.push(root);\n while (stack.length > 0) {\n tile = stack.pop();\n for (const child of tile.children) {\n stack.push(child);\n }\n if (tile !== root) {\n this._destroyTile(tile);\n }\n }\n root.children = [];\n }\n\n _destroyTile(tile) {\n this._cache.unloadTile(this, tile);\n this._unloadTile(tile);\n tile.destroy();\n }\n\n _initializeTiles3DTileset(tilesetJson) {\n if (tilesetJson.queryString) {\n const searchParams = new URLSearchParams(tilesetJson.queryString);\n const queryParams = Object.fromEntries(searchParams.entries());\n this._queryParams = {...this._queryParams, ...queryParams};\n }\n\n this.asset = tilesetJson.asset;\n if (!this.asset) {\n throw new Error('Tileset must have an asset property.');\n }\n if (\n this.asset.version !== '0.0' &&\n this.asset.version !== '1.0' &&\n this.asset.version !== '1.1'\n ) {\n throw new Error('The tileset must be 3D Tiles version either 0.0 or 1.0 or 1.1.');\n }\n\n // Note: `asset.tilesetVersion` is version of the tileset itself (not the version of the 3D TILES standard)\n // We add this version as a `v=1.0` query param to fetch the right version and not get an older cached version\n if ('tilesetVersion' in this.asset) {\n this._queryParams.v = this.asset.tilesetVersion;\n }\n\n // TODO - ion resources have a credits property we can use for additional attribution.\n this.credits = {\n attributions: this.options.attributions || []\n };\n this.description = this.options.description || '';\n\n // Gets the tileset's properties dictionary object, which contains metadata about per-feature properties.\n this.properties = tilesetJson.properties;\n this.geometricError = tilesetJson.geometricError;\n this._extensionsUsed = tilesetJson.extensionsUsed || [];\n // Returns the extras property at the top of the tileset JSON (application specific metadata).\n this.extras = tilesetJson.extras;\n }\n\n _initializeI3STileset() {\n // @ts-expect-error\n if (this.loadOptions.i3s && 'token' in this.loadOptions.i3s) {\n // @ts-ignore\n this._queryParams.token = this.loadOptions.i3s.token as string;\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"tileset-3d.js","names":["Matrix4","Vector3","Ellipsoid","Stats","RequestScheduler","path","TilesetCache","calculateTransformProps","getFrameState","limitSelectedTiles","getZoomFromBoundingVolume","getZoomFromExtent","getZoomFromFullExtent","Tile3D","TILESET_TYPE","TilesetTraverser","Tileset3DTraverser","I3STilesetTraverser","DEFAULT_PROPS","description","ellipsoid","WGS84","modelMatrix","throttleRequests","maxRequests","maximumMemoryUsage","memoryCacheOverflow","maximumTilesSelected","debounceTime","onTileLoad","onTileUnload","onTileError","onTraversalComplete","selectedTiles","contentLoader","undefined","viewDistanceScale","maximumScreenSpaceError","memoryAdjustedScreenSpaceError","loadTiles","updateTransforms","viewportTraversersMap","loadOptions","fetch","attributions","basePath","i3s","TILES_TOTAL","TILES_IN_MEMORY","TILES_IN_VIEW","TILES_RENDERABLE","TILES_LOADED","TILES_LOADING","TILES_UNLOADED","TILES_LOAD_FAILED","POINTS_COUNT","TILES_GPU_MEMORY","MAXIMUM_SSE","Tileset3D","constructor","tileset","options","type","loader","url","lodMetricType","lodMetricValue","refine","root","roots","asset","properties","extras","credits","stats","contentFormats","draco","meshopt","dds","ktx2","cartographicCenter","cartesianCenter","zoom","boundingVolume","dynamicScreenSpaceErrorComputedDensity","gpuMemoryUsageInBytes","_cacheBytes","_cacheOverflowBytes","_frameNumber","_queryParams","_extensionsUsed","_tiles","_pendingCount","traverseCounter","geometricError","lastUpdatedVieports","_requestedTiles","_emptyTiles","frameStateData","_traverser","_cache","_requestScheduler","updatePromise","tilesetInitializationPromise","dirname","_initializeTraverser","id","_initializeStats","_initializeTileSet","destroy","_destroy","isLoaded","length","tiles","Object","values","frameNumber","queryParams","URLSearchParams","toString","setProps","props","getTileUrl","tilePath","isDataUrl","startsWith","tileUrl","includes","hasExtension","extensionName","Boolean","indexOf","update","viewports","arguments","then","doUpdate","selectTiles","Promise","resolve","setTimeout","adjustScreenSpaceError","Math","max","preparedViewports","Array","reset","viewportsToTraverse","viewport","_needTraverse","push","_initializeTileHeaders","frameState","traverse","viewportId","traverserId","_onTraversalEnd","currentFrameStateData","filteredSelectedTiles","unselectedTiles","tile","unselect","requestedTiles","emptyTiles","_updateTiles","frameStateKey","frameStateDataValue","concat","_loadTiles","_unloadTiles","_updateStats","_tilesChanged","oldSelectedTiles","set1","Set","map","t","set2","changed","filter","x","has","contentUnloaded","_loadTile","unloadTiles","_unloadTile","tilesRenderable","pointsRenderable","contentAvailable","content","pointCount","vertexCount","get","count","tilesetJson","I3S","calculateViewPropsI3S","TILES3D","_initializeTiles3DTileset","calculateViewPropsTiles3D","_initializeI3STileset","_this$tileset$store","fullExtent","xmin","xmax","ymin","ymax","zmin","zmax","cartographicToCartesian","extent","store","console","warn","center","cartesianToCartographic","radii","parentTileHeader","rootTile","children","depth","stack","pop","incrementCount","header","childHeader","_childTile$contentUrl","childTile","contentUrl","URL","session","searchParams","TraverserClass","onTraversalEnd","bind","_destroyTileHeaders","parentTile","_destroySubtree","loaded","_onStartTileLoading","loadContent","error","_onTileLoadError","Error","_onEndTileLoading","_onTileLoad","message","_this$tileset","_this$tileset$nodePag","nodesInNodePages","nodePagesTile","addCount","updateContentTypes","_addTileToCache","isDracoGeometry","textureFormat","_tile$content","extensionsRemoved","gltf","decrementCount","add","_updateCacheStats","unloadContent","child","_destroyTile","unloadTile","queryString","fromEntries","entries","version","v","tilesetVersion","extensionsUsed","token"],"sources":["../../src/tileset/tileset-3d.ts"],"sourcesContent":["// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\n// This file is derived from the Cesium code base under Apache 2 license\n// See LICENSE.md and https://github.com/AnalyticalGraphicsInc/cesium/blob/master/LICENSE.md\n\nimport {Matrix4, Vector3} from '@math.gl/core';\nimport {Ellipsoid} from '@math.gl/geospatial';\nimport {Stats} from '@probe.gl/stats';\nimport {RequestScheduler, path, LoaderWithParser, LoaderOptions} from '@loaders.gl/loader-utils';\nimport {TilesetCache} from './tileset-cache';\nimport {calculateTransformProps} from './helpers/transform-utils';\nimport {FrameState, getFrameState, limitSelectedTiles} from './helpers/frame-state';\nimport {getZoomFromBoundingVolume, getZoomFromExtent, getZoomFromFullExtent} from './helpers/zoom';\n\nimport type {GeospatialViewport, Viewport} from '../types';\nimport {Tile3D} from './tile-3d';\nimport {TILESET_TYPE} from '../constants';\n\nimport {TilesetTraverser} from './tileset-traverser';\n\n// TODO - these should be moved into their respective modules\nimport {Tileset3DTraverser} from './format-3d-tiles/tileset-3d-traverser';\nimport {I3STilesetTraverser} from './format-i3s/i3s-tileset-traverser';\n\nexport type TilesetJSON = any;\n\n/*\nexport type TilesetJSON = {\n loader;\n // could be 3d tiles, i3s\n type: 'I3S' | '3DTILES';\n /** The url to the top level tileset JSON file. *\n url: string;\n basePath?: string;\n // Geometric error when the tree is not rendered at all\n lodMetricType: string;\n lodMetricValue: number;\n root: {\n refine: string;\n [key: string]: unknown;\n },\n [key: string]: unknown;\n};\n*/\n\nexport type Tileset3DProps = {\n // loading\n throttleRequests?: boolean;\n maxRequests?: number;\n loadOptions?: LoaderOptions;\n loadTiles?: boolean;\n basePath?: string;\n maximumMemoryUsage?: number;\n memoryCacheOverflow?: number;\n maximumTilesSelected?: number;\n debounceTime?: number;\n\n // Metadata\n description?: string;\n attributions?: string[];\n\n // Transforms\n ellipsoid?: object;\n modelMatrix?: Matrix4;\n\n // Traversal\n maximumScreenSpaceError?: number;\n memoryAdjustedScreenSpaceError?: boolean;\n viewportTraversersMap?: any;\n updateTransforms?: boolean;\n viewDistanceScale?: number;\n\n // Callbacks\n onTileLoad?: (tile: Tile3D) => any;\n onTileUnload?: (tile: Tile3D) => any;\n onTileError?: (tile: Tile3D, message: string, url: string) => any;\n contentLoader?: (tile: Tile3D) => Promise<void>;\n onTraversalComplete?: (selectedTiles: Tile3D[]) => Tile3D[];\n};\n\ntype Props = {\n description: string;\n ellipsoid: object;\n /** A 4x4 transformation matrix this transforms the entire tileset. */\n modelMatrix: Matrix4;\n /** Set to false to disable network request throttling */\n throttleRequests: boolean;\n /** Number of simultaneous requsts, if throttleRequests is true */\n maxRequests: number;\n /* Maximum amount of GPU memory (in MB) that may be used to cache tiles. */\n maximumMemoryUsage: number;\n /* The maximum additional memory (in MB) to allow for cache headroom before adjusting the screen spacer error */\n memoryCacheOverflow: number;\n /** Maximum number limit of tiles selected for show. 0 means no limit */\n maximumTilesSelected: number;\n /** Delay time before the tileset traversal. It prevents traversal requests spam.*/\n debounceTime: number;\n /** Callback. Indicates this a tile's content was loaded */\n onTileLoad: (tile: Tile3D) => void;\n /** Callback. Indicates this a tile's content was unloaded (cache full) */\n onTileUnload: (tile: Tile3D) => void;\n /** Callback. Indicates this a tile's content failed to load */\n onTileError: (tile: Tile3D, message: string, url: string) => void;\n /** Callback. Allows post-process selectedTiles right after traversal. */\n onTraversalComplete: (selectedTiles: Tile3D[]) => Tile3D[];\n /** The maximum screen space error used to drive level of detail refinement. */\n maximumScreenSpaceError: number;\n /** Whether to adjust the maximum screen space error to comply with the maximum memory limitation */\n memoryAdjustedScreenSpaceError: boolean;\n viewportTraversersMap: Record<string, any> | null;\n attributions: string[];\n loadTiles: boolean;\n loadOptions: LoaderOptions;\n updateTransforms: boolean;\n /** View distance scale modifier */\n viewDistanceScale: number;\n basePath: string;\n /** Optional async tile content loader */\n contentLoader?: (tile: Tile3D) => Promise<void>;\n /** @todo I3S specific knowledge should be moved to I3S module */\n i3s: Record<string, any>;\n};\n\nconst DEFAULT_PROPS: Props = {\n description: '',\n ellipsoid: Ellipsoid.WGS84,\n modelMatrix: new Matrix4(),\n throttleRequests: true,\n maxRequests: 64,\n /** Default memory values optimized for viewing mesh-based 3D Tiles on both mobile and desktop devices */\n maximumMemoryUsage: 32,\n memoryCacheOverflow: 1,\n maximumTilesSelected: 0,\n debounceTime: 0,\n onTileLoad: () => {},\n onTileUnload: () => {},\n onTileError: () => {},\n onTraversalComplete: (selectedTiles: Tile3D[]) => selectedTiles,\n contentLoader: undefined,\n viewDistanceScale: 1.0,\n maximumScreenSpaceError: 8,\n memoryAdjustedScreenSpaceError: false,\n loadTiles: true,\n updateTransforms: true,\n viewportTraversersMap: null,\n loadOptions: {fetch: {}},\n attributions: [],\n basePath: '',\n i3s: {}\n};\n\n// Tracked Stats\nconst TILES_TOTAL = 'Tiles In Tileset(s)';\nconst TILES_IN_MEMORY = 'Tiles In Memory';\nconst TILES_IN_VIEW = 'Tiles In View';\nconst TILES_RENDERABLE = 'Tiles To Render';\nconst TILES_LOADED = 'Tiles Loaded';\nconst TILES_LOADING = 'Tiles Loading';\nconst TILES_UNLOADED = 'Tiles Unloaded';\nconst TILES_LOAD_FAILED = 'Failed Tile Loads';\nconst POINTS_COUNT = 'Points/Vertices';\nconst TILES_GPU_MEMORY = 'Tile Memory Use';\nconst MAXIMUM_SSE = 'Maximum Screen Space Error';\n\n/**\n * The Tileset loading and rendering flow is as below,\n * A rendered (i.e. deck.gl `Tile3DLayer`) triggers `tileset.update()` after a `tileset` is loaded\n * `tileset` starts traversing the tile tree and update `requestTiles` (tiles of which content need\n * to be fetched) and `selectedTiles` (tiles ready for rendering under the current viewport).\n * `Tile3DLayer` will update rendering based on `selectedTiles`.\n * `Tile3DLayer` also listens to `onTileLoad` callback and trigger another round of `update and then traversal`\n * when new tiles are loaded.\n\n * As I3S tileset have stored `tileHeader` file (metadata) and tile content files (geometry, texture, ...) separately.\n * During each traversal, it issues `tilHeader` requests if that `tileHeader` is not yet fetched,\n * after the tile header is fulfilled, it will resume the traversal starting from the tile just fetched (not root).\n\n * Tile3DLayer\n * |\n * await load(tileset)\n * |\n * tileset.update()\n * | async load tileHeader\n * tileset.traverse() -------------------------- Queued\n * | resume traversal after fetched |\n * |----------------------------------------|\n * |\n * | async load tile content\n * tilset.requestedTiles ----------------------------- RequestScheduler\n * |\n * tilset.selectedTiles (ready for rendering) |\n * | Listen to |\n * Tile3DLayer ----------- onTileLoad ----------------------|\n * | | notify new tile is available\n * updateLayers |\n * tileset.update // trigger another round of update\n*/\nexport class Tileset3D {\n // props: Tileset3DProps;\n options: Props;\n loadOptions: LoaderOptions;\n\n type: string;\n tileset: TilesetJSON;\n loader: LoaderWithParser;\n url: string;\n basePath: string;\n modelMatrix: Matrix4;\n ellipsoid: any;\n lodMetricType: string;\n lodMetricValue: number;\n refine: string;\n root: Tile3D | null = null;\n roots: Record<string, Tile3D> = {};\n /** @todo any->unknown */\n asset: Record<string, any> = {};\n\n // Metadata for the entire tileset\n description: string = '';\n properties: any;\n\n extras: any = null;\n attributions: any = {};\n credits: any = {};\n\n stats: Stats;\n\n /** flags that contain information about data types in nested tiles */\n contentFormats = {draco: false, meshopt: false, dds: false, ktx2: false};\n\n // view props\n cartographicCenter: Vector3 | null = null;\n cartesianCenter: Vector3 | null = null;\n zoom: number = 1;\n boundingVolume: any = null;\n\n /** Updated based on the camera position and direction */\n dynamicScreenSpaceErrorComputedDensity: number = 0.0;\n\n // METRICS\n\n /**\n * The maximum amount of GPU memory (in MB) that may be used to cache tiles\n * Tiles not in view are unloaded to enforce private\n */\n maximumMemoryUsage: number = 32;\n\n /** The total amount of GPU memory in bytes used by the tileset. */\n gpuMemoryUsageInBytes: number = 0;\n\n /**\n * If loading the level of detail required by maximumScreenSpaceError\n * results in the memory usage exceeding maximumMemoryUsage (GPU), level of detail refinement\n * will instead use this (larger) adjusted screen space error to achieve the\n * best possible visual quality within the available memory.\n */\n memoryAdjustedScreenSpaceError: number = 0.0;\n\n private _cacheBytes: number = 0;\n private _cacheOverflowBytes: number = 0;\n\n /** Update tracker. increase in each update cycle. */\n _frameNumber: number = 0;\n private _queryParams: Record<string, string> = {};\n private _extensionsUsed: string[] = [];\n private _tiles: Record<string, Tile3D> = {};\n\n /** counter for tracking tiles requests */\n private _pendingCount: number = 0;\n\n /** Hold traversal results */\n selectedTiles: Tile3D[] = [];\n\n // TRAVERSAL\n traverseCounter: number = 0;\n geometricError: number = 0;\n private lastUpdatedVieports: Viewport[] | Viewport | null = null;\n private _requestedTiles: Tile3D[] = [];\n private _emptyTiles: Tile3D[] = [];\n private frameStateData: any = {};\n\n _traverser: TilesetTraverser;\n _cache = new TilesetCache();\n _requestScheduler: RequestScheduler;\n\n // Promise tracking\n private updatePromise: Promise<number> | null = null;\n tilesetInitializationPromise: Promise<void>;\n\n /**\n * Create a new Tileset3D\n * @param json\n * @param props\n */\n // eslint-disable-next-line max-statements\n constructor(tileset: TilesetJSON, options?: Tileset3DProps) {\n // PUBLIC MEMBERS\n this.options = {...DEFAULT_PROPS, ...options};\n // raw data\n this.tileset = tileset;\n this.loader = tileset.loader;\n // could be 3d tiles, i3s\n this.type = tileset.type;\n // The url to a tileset JSON file.\n this.url = tileset.url;\n this.basePath = tileset.basePath || path.dirname(this.url);\n this.modelMatrix = this.options.modelMatrix;\n this.ellipsoid = this.options.ellipsoid;\n\n // Geometric error when the tree is not rendered at all\n this.lodMetricType = tileset.lodMetricType;\n this.lodMetricValue = tileset.lodMetricValue;\n this.refine = tileset.root.refine;\n\n this.loadOptions = this.options.loadOptions || {};\n\n // TRAVERSAL\n this._traverser = this._initializeTraverser();\n this._requestScheduler = new RequestScheduler({\n throttleRequests: this.options.throttleRequests,\n maxRequests: this.options.maxRequests\n });\n\n this.memoryAdjustedScreenSpaceError = this.options.maximumScreenSpaceError;\n this._cacheBytes = this.options.maximumMemoryUsage * 1024 * 1024;\n this._cacheOverflowBytes = this.options.memoryCacheOverflow * 1024 * 1024;\n\n // METRICS\n // The total amount of GPU memory in bytes used by the tileset.\n this.stats = new Stats({id: this.url});\n this._initializeStats();\n\n this.tilesetInitializationPromise = this._initializeTileSet(tileset);\n }\n\n /** Release resources */\n destroy(): void {\n this._destroy();\n }\n\n /** Is the tileset loaded (update needs to have been called at least once) */\n isLoaded(): boolean {\n // Check that `_frameNumber !== 0` which means that update was called at least once\n return this._pendingCount === 0 && this._frameNumber !== 0 && this._requestedTiles.length === 0;\n }\n\n get tiles(): object[] {\n return Object.values(this._tiles);\n }\n\n get frameNumber(): number {\n return this._frameNumber;\n }\n\n get queryParams(): string {\n return new URLSearchParams(this._queryParams).toString();\n }\n\n setProps(props: Tileset3DProps): void {\n this.options = {...this.options, ...props};\n }\n\n /** @deprecated */\n // setOptions(options: Tileset3DProps): void {\n // this.options = {...this.options, ...options};\n // }\n\n /**\n * Return a loadable tile url for a specific tile subpath\n * @param tilePath a tile subpath\n */\n getTileUrl(tilePath: string): string {\n const isDataUrl = tilePath.startsWith('data:');\n if (isDataUrl) {\n return tilePath;\n }\n\n let tileUrl = tilePath;\n if (this.queryParams.length) {\n tileUrl = `${tilePath}${tilePath.includes('?') ? '&' : '?'}${this.queryParams}`;\n }\n return tileUrl;\n }\n\n // TODO CESIUM specific\n hasExtension(extensionName: string): boolean {\n return Boolean(this._extensionsUsed.indexOf(extensionName) > -1);\n }\n\n /**\n * Update visible tiles relying on a list of viewports\n * @param viewports - list of viewports\n * @deprecated\n */\n update(viewports: Viewport[] | Viewport | null = null) {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.tilesetInitializationPromise.then(() => {\n if (!viewports && this.lastUpdatedVieports) {\n viewports = this.lastUpdatedVieports;\n } else {\n this.lastUpdatedVieports = viewports;\n }\n if (viewports) {\n this.doUpdate(viewports);\n }\n });\n }\n\n /**\n * Update visible tiles relying on a list of viewports.\n * Do it with debounce delay to prevent update spam\n * @param viewports viewports\n * @returns Promise of new frameNumber\n */\n async selectTiles(viewports: Viewport[] | Viewport | null = null): Promise<number> {\n await this.tilesetInitializationPromise;\n if (viewports) {\n this.lastUpdatedVieports = viewports;\n }\n if (!this.updatePromise) {\n this.updatePromise = new Promise<number>((resolve) => {\n setTimeout(() => {\n if (this.lastUpdatedVieports) {\n this.doUpdate(this.lastUpdatedVieports);\n }\n resolve(this._frameNumber);\n this.updatePromise = null;\n }, this.options.debounceTime);\n });\n }\n return this.updatePromise;\n }\n\n adjustScreenSpaceError(): void {\n if (this.gpuMemoryUsageInBytes < this._cacheBytes) {\n this.memoryAdjustedScreenSpaceError = Math.max(\n this.memoryAdjustedScreenSpaceError / 1.02,\n this.options.maximumScreenSpaceError\n );\n } else if (this.gpuMemoryUsageInBytes > this._cacheBytes + this._cacheOverflowBytes) {\n this.memoryAdjustedScreenSpaceError *= 1.02;\n }\n }\n /**\n * Update visible tiles relying on a list of viewports\n * @param viewports viewports\n */\n // eslint-disable-next-line max-statements, complexity\n private doUpdate(viewports: Viewport[] | Viewport): void {\n if ('loadTiles' in this.options && !this.options.loadTiles) {\n return;\n }\n if (this.traverseCounter > 0) {\n return;\n }\n const preparedViewports = viewports instanceof Array ? viewports : [viewports];\n\n this._cache.reset();\n this._frameNumber++;\n this.traverseCounter = preparedViewports.length;\n const viewportsToTraverse: string[] = [];\n // First loop to decrement traverseCounter\n for (const viewport of preparedViewports) {\n const id = viewport.id;\n if (this._needTraverse(id)) {\n viewportsToTraverse.push(id);\n } else {\n this.traverseCounter--;\n }\n }\n\n // Second loop to traverse\n for (const viewport of preparedViewports) {\n const id = viewport.id;\n if (!this.roots[id]) {\n this.roots[id] = this._initializeTileHeaders(this.tileset, null);\n }\n\n if (!viewportsToTraverse.includes(id)) {\n continue; // eslint-disable-line no-continue\n }\n const frameState = getFrameState(viewport as GeospatialViewport, this._frameNumber);\n this._traverser.traverse(this.roots[id], frameState, this.options);\n }\n }\n\n /**\n * Check if traversal is needed for particular viewport\n * @param {string} viewportId - id of a viewport\n * @return {boolean}\n */\n _needTraverse(viewportId: string): boolean {\n let traverserId = viewportId;\n if (this.options.viewportTraversersMap) {\n traverserId = this.options.viewportTraversersMap[viewportId];\n }\n if (traverserId !== viewportId) {\n return false;\n }\n\n return true;\n }\n\n /**\n * The callback to post-process tiles after traversal procedure\n * @param frameState - frame state for tile culling\n */\n _onTraversalEnd(frameState: FrameState): void {\n const id = frameState.viewport.id;\n if (!this.frameStateData[id]) {\n this.frameStateData[id] = {selectedTiles: [], _requestedTiles: [], _emptyTiles: []};\n }\n const currentFrameStateData = this.frameStateData[id];\n const selectedTiles = Object.values(this._traverser.selectedTiles);\n const [filteredSelectedTiles, unselectedTiles] = limitSelectedTiles(\n selectedTiles,\n frameState,\n this.options.maximumTilesSelected\n );\n currentFrameStateData.selectedTiles = filteredSelectedTiles;\n for (const tile of unselectedTiles) {\n tile.unselect();\n }\n\n currentFrameStateData._requestedTiles = Object.values(this._traverser.requestedTiles);\n currentFrameStateData._emptyTiles = Object.values(this._traverser.emptyTiles);\n\n this.traverseCounter--;\n if (this.traverseCounter > 0) {\n return;\n }\n\n this._updateTiles();\n }\n\n /**\n * Update tiles relying on data from all traversers\n */\n _updateTiles(): void {\n this.selectedTiles = [];\n this._requestedTiles = [];\n this._emptyTiles = [];\n\n for (const frameStateKey in this.frameStateData) {\n const frameStateDataValue = this.frameStateData[frameStateKey];\n this.selectedTiles = this.selectedTiles.concat(frameStateDataValue.selectedTiles);\n this._requestedTiles = this._requestedTiles.concat(frameStateDataValue._requestedTiles);\n this._emptyTiles = this._emptyTiles.concat(frameStateDataValue._emptyTiles);\n }\n\n this.selectedTiles = this.options.onTraversalComplete(this.selectedTiles);\n\n for (const tile of this.selectedTiles) {\n this._tiles[tile.id] = tile;\n }\n\n this._loadTiles();\n this._unloadTiles();\n this._updateStats();\n }\n\n _tilesChanged(oldSelectedTiles: Tile3D[], selectedTiles: Tile3D[]): boolean {\n if (oldSelectedTiles.length !== selectedTiles.length) {\n return true;\n }\n const set1 = new Set(oldSelectedTiles.map((t) => t.id));\n const set2 = new Set(selectedTiles.map((t) => t.id));\n let changed = oldSelectedTiles.filter((x) => !set2.has(x.id)).length > 0;\n changed = changed || selectedTiles.filter((x) => !set1.has(x.id)).length > 0;\n return changed;\n }\n\n _loadTiles(): void {\n // Sort requests by priority before making any requests.\n // This makes it less likely this requests will be cancelled after being issued.\n // requestedTiles.sort((a, b) => a._priority - b._priority);\n for (const tile of this._requestedTiles) {\n if (tile.contentUnloaded) {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this._loadTile(tile);\n }\n }\n }\n\n _unloadTiles(): void {\n // unload tiles from cache when hit maximumMemoryUsage\n this._cache.unloadTiles(this, (tileset, tile) => tileset._unloadTile(tile));\n }\n\n _updateStats(): void {\n let tilesRenderable = 0;\n let pointsRenderable = 0;\n for (const tile of this.selectedTiles) {\n if (tile.contentAvailable && tile.content) {\n tilesRenderable++;\n if (tile.content.pointCount) {\n pointsRenderable += tile.content.pointCount;\n } else {\n // Calculate vertices for non point cloud tiles.\n pointsRenderable += tile.content.vertexCount;\n }\n }\n }\n\n this.stats.get(TILES_IN_VIEW).count = this.selectedTiles.length;\n this.stats.get(TILES_RENDERABLE).count = tilesRenderable;\n this.stats.get(POINTS_COUNT).count = pointsRenderable;\n this.stats.get(MAXIMUM_SSE).count = this.memoryAdjustedScreenSpaceError;\n }\n\n async _initializeTileSet(tilesetJson: TilesetJSON): Promise<void> {\n if (this.type === TILESET_TYPE.I3S) {\n this.calculateViewPropsI3S();\n tilesetJson.root = await tilesetJson.root;\n }\n this.root = this._initializeTileHeaders(tilesetJson, null);\n\n if (this.type === TILESET_TYPE.TILES3D) {\n this._initializeTiles3DTileset(tilesetJson);\n this.calculateViewPropsTiles3D();\n }\n\n if (this.type === TILESET_TYPE.I3S) {\n this._initializeI3STileset();\n }\n }\n\n /**\n * Called during initialize Tileset to initialize the tileset's cartographic center (longitude, latitude) and zoom.\n * These metrics help apps center view on tileset\n * For I3S there is extent (<1.8 version) or fullExtent (>=1.8 version) to calculate view props\n * @returns\n */\n private calculateViewPropsI3S(): void {\n // for I3S 1.8 try to calculate with fullExtent\n const fullExtent = this.tileset.fullExtent;\n if (fullExtent) {\n const {xmin, xmax, ymin, ymax, zmin, zmax} = fullExtent;\n this.cartographicCenter = new Vector3(\n xmin + (xmax - xmin) / 2,\n ymin + (ymax - ymin) / 2,\n zmin + (zmax - zmin) / 2\n );\n this.cartesianCenter = new Vector3();\n Ellipsoid.WGS84.cartographicToCartesian(this.cartographicCenter, this.cartesianCenter);\n this.zoom = getZoomFromFullExtent(fullExtent, this.cartographicCenter, this.cartesianCenter);\n return;\n }\n // for I3S 1.6-1.7 try to calculate with extent\n const extent = this.tileset.store?.extent;\n if (extent) {\n const [xmin, ymin, xmax, ymax] = extent;\n this.cartographicCenter = new Vector3(xmin + (xmax - xmin) / 2, ymin + (ymax - ymin) / 2, 0);\n this.cartesianCenter = new Vector3();\n Ellipsoid.WGS84.cartographicToCartesian(this.cartographicCenter, this.cartesianCenter);\n this.zoom = getZoomFromExtent(extent, this.cartographicCenter, this.cartesianCenter);\n return;\n }\n // eslint-disable-next-line no-console\n console.warn('Extent is not defined in the tileset header');\n this.cartographicCenter = new Vector3();\n this.zoom = 1;\n return;\n }\n\n /**\n * Called during initialize Tileset to initialize the tileset's cartographic center (longitude, latitude) and zoom.\n * These metrics help apps center view on tileset.\n * For 3DTiles the root tile data is used to calculate view props.\n * @returns\n */\n private calculateViewPropsTiles3D() {\n const root = this.root as Tile3D;\n const {center} = root.boundingVolume;\n // TODO - handle all cases\n if (!center) {\n // eslint-disable-next-line no-console\n console.warn('center was not pre-calculated for the root tile');\n this.cartographicCenter = new Vector3();\n this.zoom = 1;\n return;\n }\n\n // cartographic coordinates are undefined at the center of the ellipsoid\n if (center[0] !== 0 || center[1] !== 0 || center[2] !== 0) {\n this.cartographicCenter = new Vector3();\n Ellipsoid.WGS84.cartesianToCartographic(center, this.cartographicCenter);\n } else {\n this.cartographicCenter = new Vector3(0, 0, -Ellipsoid.WGS84.radii[0]);\n }\n this.cartesianCenter = center;\n this.zoom = getZoomFromBoundingVolume(root.boundingVolume, this.cartographicCenter);\n }\n\n _initializeStats() {\n this.stats.get(TILES_TOTAL);\n this.stats.get(TILES_LOADING);\n this.stats.get(TILES_IN_MEMORY);\n this.stats.get(TILES_IN_VIEW);\n this.stats.get(TILES_RENDERABLE);\n this.stats.get(TILES_LOADED);\n this.stats.get(TILES_UNLOADED);\n this.stats.get(TILES_LOAD_FAILED);\n this.stats.get(POINTS_COUNT);\n this.stats.get(TILES_GPU_MEMORY, 'memory');\n this.stats.get(MAXIMUM_SSE);\n }\n\n // Installs the main tileset JSON file or a tileset JSON file referenced from a tile.\n // eslint-disable-next-line max-statements\n _initializeTileHeaders(tilesetJson: TilesetJSON, parentTileHeader?: any) {\n // A tileset JSON file referenced from a tile may exist in a different directory than the root tileset.\n // Get the basePath relative to the external tileset.\n const rootTile = new Tile3D(this, tilesetJson.root, parentTileHeader); // resource\n\n // If there is a parentTileHeader, add the root of the currently loading tileset\n // to parentTileHeader's children, and update its depth.\n if (parentTileHeader) {\n parentTileHeader.children.push(rootTile);\n rootTile.depth = parentTileHeader.depth + 1;\n }\n\n // 3DTiles knows the hierarchy beforehand\n if (this.type === TILESET_TYPE.TILES3D) {\n const stack: Tile3D[] = [];\n stack.push(rootTile);\n\n while (stack.length > 0) {\n const tile = stack.pop() as Tile3D;\n this.stats.get(TILES_TOTAL).incrementCount();\n const children = tile.header.children || [];\n for (const childHeader of children) {\n const childTile = new Tile3D(this, childHeader, tile);\n\n // Special handling for Google\n // A session key must be used for all tile requests\n if (childTile.contentUrl?.includes('?session=')) {\n const url = new URL(childTile.contentUrl);\n const session = url.searchParams.get('session');\n // eslint-disable-next-line max-depth\n if (session) {\n this._queryParams.session = session;\n }\n }\n\n tile.children.push(childTile);\n childTile.depth = tile.depth + 1;\n stack.push(childTile);\n }\n }\n }\n\n return rootTile;\n }\n\n _initializeTraverser(): TilesetTraverser {\n let TraverserClass;\n const type = this.type;\n switch (type) {\n case TILESET_TYPE.TILES3D:\n TraverserClass = Tileset3DTraverser;\n break;\n case TILESET_TYPE.I3S:\n TraverserClass = I3STilesetTraverser;\n break;\n default:\n TraverserClass = TilesetTraverser;\n }\n\n return new TraverserClass({\n basePath: this.basePath,\n onTraversalEnd: this._onTraversalEnd.bind(this)\n });\n }\n\n _destroyTileHeaders(parentTile: Tile3D): void {\n this._destroySubtree(parentTile);\n }\n\n async _loadTile(tile: Tile3D): Promise<void> {\n let loaded;\n try {\n this._onStartTileLoading();\n loaded = await tile.loadContent();\n } catch (error: unknown) {\n this._onTileLoadError(tile, error instanceof Error ? error : new Error('load failed'));\n } finally {\n this._onEndTileLoading();\n this._onTileLoad(tile, loaded);\n }\n }\n\n _onTileLoadError(tile: Tile3D, error: Error): void {\n this.stats.get(TILES_LOAD_FAILED).incrementCount();\n\n const message = error.message || error.toString();\n const url = tile.url;\n // TODO - Allow for probe log to be injected instead of console?\n console.error(`A 3D tile failed to load: ${tile.url} ${message}`); // eslint-disable-line\n this.options.onTileError(tile, message, url);\n }\n\n _onTileLoad(tile: Tile3D, loaded: boolean): void {\n if (!loaded) {\n return;\n }\n\n if (this.type === TILESET_TYPE.I3S) {\n // We can't calculate tiles total in I3S in advance so we calculate it dynamically.\n const nodesInNodePages = this.tileset?.nodePagesTile?.nodesInNodePages || 0;\n this.stats.get(TILES_TOTAL).reset();\n this.stats.get(TILES_TOTAL).addCount(nodesInNodePages);\n }\n\n // add coordinateOrigin and modelMatrix to tile\n if (tile && tile.content) {\n calculateTransformProps(tile, tile.content);\n }\n\n this.updateContentTypes(tile);\n this._addTileToCache(tile);\n this.options.onTileLoad(tile);\n }\n\n /**\n * Update information about data types in nested tiles\n * @param tile instance of a nested Tile3D\n */\n private updateContentTypes(tile: Tile3D) {\n if (this.type === TILESET_TYPE.I3S) {\n if (tile.header.isDracoGeometry) {\n this.contentFormats.draco = true;\n }\n switch (tile.header.textureFormat) {\n case 'dds':\n this.contentFormats.dds = true;\n break;\n case 'ktx2':\n this.contentFormats.ktx2 = true;\n break;\n default:\n }\n } else if (this.type === TILESET_TYPE.TILES3D) {\n const {extensionsRemoved = []} = tile.content?.gltf || {};\n if (extensionsRemoved.includes('KHR_draco_mesh_compression')) {\n this.contentFormats.draco = true;\n }\n if (extensionsRemoved.includes('EXT_meshopt_compression')) {\n this.contentFormats.meshopt = true;\n }\n if (extensionsRemoved.includes('KHR_texture_basisu')) {\n this.contentFormats.ktx2 = true;\n }\n }\n }\n\n _onStartTileLoading() {\n this._pendingCount++;\n this.stats.get(TILES_LOADING).incrementCount();\n }\n\n _onEndTileLoading() {\n this._pendingCount--;\n this.stats.get(TILES_LOADING).decrementCount();\n }\n\n _addTileToCache(tile: Tile3D) {\n this._cache.add(this, tile, (tileset) => tileset._updateCacheStats(tile));\n }\n\n _updateCacheStats(tile) {\n this.stats.get(TILES_LOADED).incrementCount();\n this.stats.get(TILES_IN_MEMORY).incrementCount();\n\n // TODO: Calculate GPU memory usage statistics for a tile.\n this.gpuMemoryUsageInBytes += tile.gpuMemoryUsageInBytes || 0;\n\n this.stats.get(TILES_GPU_MEMORY).count = this.gpuMemoryUsageInBytes;\n\n // Adjust SSE based on cache limits\n if (this.options.memoryAdjustedScreenSpaceError) {\n this.adjustScreenSpaceError();\n }\n }\n\n _unloadTile(tile) {\n this.gpuMemoryUsageInBytes -= tile.gpuMemoryUsageInBytes || 0;\n\n this.stats.get(TILES_IN_MEMORY).decrementCount();\n this.stats.get(TILES_UNLOADED).incrementCount();\n this.stats.get(TILES_GPU_MEMORY).count = this.gpuMemoryUsageInBytes;\n\n this.options.onTileUnload(tile);\n tile.unloadContent();\n }\n\n // Traverse the tree and destroy all tiles\n _destroy() {\n const stack: Tile3D[] = [];\n\n if (this.root) {\n stack.push(this.root);\n }\n\n while (stack.length > 0) {\n const tile: Tile3D = stack.pop() as Tile3D;\n\n for (const child of tile.children) {\n stack.push(child);\n }\n\n this._destroyTile(tile);\n }\n this.root = null;\n }\n\n // Traverse the tree and destroy all sub tiles\n _destroySubtree(tile) {\n const root = tile;\n const stack: Tile3D[] = [];\n stack.push(root);\n while (stack.length > 0) {\n tile = stack.pop();\n for (const child of tile.children) {\n stack.push(child);\n }\n if (tile !== root) {\n this._destroyTile(tile);\n }\n }\n root.children = [];\n }\n\n _destroyTile(tile) {\n this._cache.unloadTile(this, tile);\n this._unloadTile(tile);\n tile.destroy();\n }\n\n _initializeTiles3DTileset(tilesetJson) {\n if (tilesetJson.queryString) {\n const searchParams = new URLSearchParams(tilesetJson.queryString);\n const queryParams = Object.fromEntries(searchParams.entries());\n this._queryParams = {...this._queryParams, ...queryParams};\n }\n\n this.asset = tilesetJson.asset;\n if (!this.asset) {\n throw new Error('Tileset must have an asset property.');\n }\n if (\n this.asset.version !== '0.0' &&\n this.asset.version !== '1.0' &&\n this.asset.version !== '1.1'\n ) {\n throw new Error('The tileset must be 3D Tiles version either 0.0 or 1.0 or 1.1.');\n }\n\n // Note: `asset.tilesetVersion` is version of the tileset itself (not the version of the 3D TILES standard)\n // We add this version as a `v=1.0` query param to fetch the right version and not get an older cached version\n if ('tilesetVersion' in this.asset) {\n this._queryParams.v = this.asset.tilesetVersion;\n }\n\n // TODO - ion resources have a credits property we can use for additional attribution.\n this.credits = {\n attributions: this.options.attributions || []\n };\n this.description = this.options.description || '';\n\n // Gets the tileset's properties dictionary object, which contains metadata about per-feature properties.\n this.properties = tilesetJson.properties;\n this.geometricError = tilesetJson.geometricError;\n this._extensionsUsed = tilesetJson.extensionsUsed || [];\n // Returns the extras property at the top of the tileset JSON (application specific metadata).\n this.extras = tilesetJson.extras;\n }\n\n _initializeI3STileset() {\n // @ts-expect-error\n if (this.loadOptions.i3s && 'token' in this.loadOptions.i3s) {\n // @ts-ignore\n this._queryParams.token = this.loadOptions.i3s.token as string;\n }\n }\n}\n"],"mappings":"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"}
@@ -5,7 +5,6 @@ export type TilesetTraverserProps = {
5
5
  loadSiblings?: boolean;
6
6
  skipLevelOfDetail?: boolean;
7
7
  updateTransforms?: boolean;
8
- maximumScreenSpaceError?: number;
9
8
  onTraversalEnd?: (frameState: any) => any;
10
9
  viewportTraversersMap?: Record<string, any>;
11
10
  basePath?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"tileset-traverser.d.ts","sourceRoot":"","sources":["../../src/tileset/tileset-traverser.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tileset-traverser.d.ts","sourceRoot":"","sources":["../../src/tileset/tileset-traverser.ts"],"names":[],"mappings":"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"}
@@ -3,7 +3,6 @@ import { TILE_REFINEMENT } from "../constants.js";
3
3
  export const DEFAULT_PROPS = {
4
4
  loadSiblings: false,
5
5
  skipLevelOfDetail: false,
6
- maximumScreenSpaceError: 2,
7
6
  updateTransforms: true,
8
7
  onTraversalEnd: () => {},
9
8
  viewportTraversersMap: {},
@@ -179,7 +178,7 @@ export class TilesetTraverser {
179
178
  if (useParentMetric) {
180
179
  screenSpaceError = tile.getScreenSpaceError(frameState, true);
181
180
  }
182
- return screenSpaceError > this.options.maximumScreenSpaceError;
181
+ return screenSpaceError > tile.tileset.memoryAdjustedScreenSpaceError;
183
182
  }
184
183
  updateTileVisibility(tile, frameState) {
185
184
  const viewportIds = [];
@@ -1 +1 @@
1
- {"version":3,"file":"tileset-traverser.js","names":["ManagedArray","TILE_REFINEMENT","DEFAULT_PROPS","loadSiblings","skipLevelOfDetail","maximumScreenSpaceError","updateTransforms","onTraversalEnd","viewportTraversersMap","basePath","TilesetTraverser","traversalFinished","frameState","constructor","options","root","selectedTiles","requestedTiles","emptyTiles","lastUpdate","Date","getTime","updateDebounceTime","_traversalStack","_emptyTraversalStack","_frameNumber","traverse","reset","updateTile","frameNumber","executeTraversal","stack","_selectionDepth","push","length","tile","pop","shouldRefine","canTraverse","updateChildTiles","updateAndPushChildren","hasRenderContent","parent","parentRefines","Boolean","_shouldRefine","stoppedRefining","id","loadTile","selectTile","refine","ADD","REPLACE","touchTile","newTime","children","child","depth","sort","compareDistanceToCamera","bind","checkRefines","hasVisibleChild","refines","isVisibleAndInRequestVolume","find","delete","childRefines","_inRequestVolume","executeEmptyTraversal","contentAvailable","updateTileVisibility","shouldSelectTile","_selectedFrame","shouldLoadTile","_requestedFrame","_priority","_getPriority","tileset","_cache","touch","_touchedFrame","useParentMetric","arguments","undefined","ignoreVisibility","hasChildren","hasTilesetContent","contentExpired","hasUnloadedContent","screenSpaceError","_screenSpaceError","getScreenSpaceError","viewportIds","key","value","viewport","updateVisibility","b","a","_distanceToCamera","anyChildrenVisible","anyVisible","allDescendantsLoaded","emptyLeaf"],"sources":["../../src/tileset/tileset-traverser.ts"],"sourcesContent":["// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {Tile3D} from './tile-3d';\nimport {ManagedArray} from '../utils/managed-array';\nimport {TILE_REFINEMENT} from '../constants';\nimport {FrameState} from './helpers/frame-state';\n\nexport type TilesetTraverserProps = {\n loadSiblings?: boolean;\n skipLevelOfDetail?: boolean;\n updateTransforms?: boolean;\n maximumScreenSpaceError?: number;\n onTraversalEnd?: (frameState) => any;\n viewportTraversersMap?: Record<string, any>;\n basePath?: string;\n};\n\nexport const DEFAULT_PROPS: Required<TilesetTraverserProps> = {\n loadSiblings: false,\n skipLevelOfDetail: false,\n maximumScreenSpaceError: 2,\n updateTransforms: true,\n onTraversalEnd: () => {},\n viewportTraversersMap: {},\n basePath: ''\n};\n\nexport class TilesetTraverser {\n options: Required<TilesetTraverserProps>;\n\n // fulfill in traverse call\n root: any = null;\n\n // tiles should be rendered\n selectedTiles: Record<string, Tile3D> = {};\n // tiles should be loaded from server\n requestedTiles: Record<string, Tile3D> = {};\n // tiles does not have render content\n emptyTiles: Record<string, Tile3D> = {};\n\n protected lastUpdate: number = new Date().getTime();\n protected readonly updateDebounceTime = 1000;\n /** temporary storage to hold the traversed tiles during a traversal */\n protected _traversalStack = new ManagedArray();\n protected _emptyTraversalStack = new ManagedArray();\n /** set in every traverse cycle */\n protected _frameNumber: number | null = null;\n\n // RESULT\n protected traversalFinished(frameState: FrameState): boolean {\n return true;\n }\n\n // TODO nested props\n constructor(options: TilesetTraverserProps) {\n this.options = {...DEFAULT_PROPS, ...options};\n }\n\n // tiles should be visible\n traverse(root, frameState, options) {\n this.root = root; // for root screen space error\n this.options = {...this.options, ...options};\n\n // reset result\n this.reset();\n\n // update tile (visibility and expiration)\n this.updateTile(root, frameState);\n\n this._frameNumber = frameState.frameNumber;\n this.executeTraversal(root, frameState);\n }\n\n reset() {\n this.requestedTiles = {};\n this.selectedTiles = {};\n this.emptyTiles = {};\n this._traversalStack.reset();\n this._emptyTraversalStack.reset();\n }\n\n /**\n * Execute traverse\n * Depth-first traversal that traverses all visible tiles and marks tiles for selection.\n * If skipLevelOfDetail is off then a tile does not refine until all children are loaded.\n * This is the traditional replacement refinement approach and is called the base traversal.\n * Tiles that have a greater screen space error than the base screen space error are part of the base traversal,\n * all other tiles are part of the skip traversal. The skip traversal allows for skipping levels of the tree\n * and rendering children and parent tiles simultaneously.\n */\n /* eslint-disable-next-line complexity, max-statements */\n executeTraversal(root, frameState: FrameState): void {\n // stack to store traversed tiles, only visible tiles should be added to stack\n // visible: visible in the current view frustum\n const stack = this._traversalStack;\n root._selectionDepth = 1;\n\n stack.push(root);\n while (stack.length > 0) {\n // 1. pop tile\n const tile = stack.pop();\n\n // 2. check if tile needs to be refine, needs refine if a tile's LoD is not sufficient and tile has available children (available content)\n let shouldRefine = false;\n if (this.canTraverse(tile, frameState)) {\n this.updateChildTiles(tile, frameState);\n shouldRefine = this.updateAndPushChildren(\n tile,\n frameState,\n stack,\n tile.hasRenderContent ? tile._selectionDepth + 1 : tile._selectionDepth\n );\n }\n\n // 3. decide if should render (select) this tile\n // - tile does not have render content\n // - tile has render content and tile is `add` type (pointcloud)\n // - tile has render content and tile is `replace` type (photogrammetry) and can't refine any further\n const parent = tile.parent;\n const parentRefines = Boolean(!parent || parent._shouldRefine);\n const stoppedRefining = !shouldRefine;\n\n if (!tile.hasRenderContent) {\n this.emptyTiles[tile.id] = tile;\n this.loadTile(tile, frameState);\n if (stoppedRefining) {\n this.selectTile(tile, frameState);\n }\n // additive tiles\n } else if (tile.refine === TILE_REFINEMENT.ADD) {\n // Additive tiles are always loaded and selected\n this.loadTile(tile, frameState);\n this.selectTile(tile, frameState);\n\n // replace tiles\n } else if (tile.refine === TILE_REFINEMENT.REPLACE) {\n // Always load tiles in the base traversal\n // Select tiles that can't refine further\n this.loadTile(tile, frameState);\n if (stoppedRefining) {\n this.selectTile(tile, frameState);\n }\n }\n\n // 3. update cache, most recent touched tiles have higher priority to be fetched from server\n this.touchTile(tile, frameState);\n\n // 4. update tile refine prop and parent refinement status to trickle down to the descendants\n tile._shouldRefine = shouldRefine && parentRefines;\n }\n\n const newTime = new Date().getTime();\n if (this.traversalFinished(frameState) || newTime - this.lastUpdate > this.updateDebounceTime) {\n this.lastUpdate = newTime;\n this.options.onTraversalEnd(frameState);\n }\n }\n\n updateChildTiles(tile: Tile3D, frameState: FrameState): void {\n const children = tile.children;\n for (const child of children) {\n this.updateTile(child, frameState);\n }\n }\n\n /* eslint-disable complexity, max-statements */\n updateAndPushChildren(tile: Tile3D, frameState: FrameState, stack, depth): boolean {\n const {loadSiblings, skipLevelOfDetail} = this.options;\n\n const children = tile.children;\n\n // sort children tiles\n children.sort(this.compareDistanceToCamera.bind(this));\n\n // For traditional replacement refinement only refine if all children are loaded.\n // Empty tiles are exempt since it looks better if children stream in as they are loaded to fill the empty space.\n const checkRefines =\n tile.refine === TILE_REFINEMENT.REPLACE && tile.hasRenderContent && !skipLevelOfDetail;\n\n let hasVisibleChild = false;\n let refines = true;\n\n for (const child of children) {\n child._selectionDepth = depth;\n if (child.isVisibleAndInRequestVolume) {\n if (stack.find(child)) {\n stack.delete(child);\n }\n stack.push(child);\n hasVisibleChild = true;\n } else if (checkRefines || loadSiblings) {\n // Keep non-visible children loaded since they are still needed before the parent can refine.\n // Or loadSiblings is true so always load tiles regardless of visibility.\n this.loadTile(child, frameState);\n this.touchTile(child, frameState);\n }\n\n if (checkRefines) {\n let childRefines;\n if (!child._inRequestVolume) {\n childRefines = false;\n } else if (!child.hasRenderContent) {\n childRefines = this.executeEmptyTraversal(child, frameState);\n } else {\n childRefines = child.contentAvailable;\n }\n refines = refines && childRefines;\n\n if (!refines) {\n return false;\n }\n }\n }\n\n if (!hasVisibleChild) {\n refines = false;\n }\n return refines;\n }\n /* eslint-enable complexity, max-statements */\n\n updateTile(tile: Tile3D, frameState: FrameState): void {\n this.updateTileVisibility(tile, frameState);\n }\n\n // tile to render in the browser\n selectTile(tile: Tile3D, frameState: FrameState): void {\n if (this.shouldSelectTile(tile)) {\n // The tile can be selected right away and does not require traverseAndSelect\n tile._selectedFrame = frameState.frameNumber;\n this.selectedTiles[tile.id] = tile;\n }\n }\n\n // tile to load from server\n loadTile(tile: Tile3D, frameState: FrameState): void {\n if (this.shouldLoadTile(tile)) {\n tile._requestedFrame = frameState.frameNumber;\n tile._priority = tile._getPriority();\n this.requestedTiles[tile.id] = tile;\n }\n }\n\n // cache tile\n touchTile(tile: Tile3D, frameState: FrameState): void {\n tile.tileset._cache.touch(tile);\n tile._touchedFrame = frameState.frameNumber;\n }\n\n // tile should be visible\n // tile should have children\n // tile LoD (level of detail) is not sufficient under current viewport\n canTraverse(\n tile: Tile3D,\n frameState: FrameState,\n useParentMetric: boolean = false,\n ignoreVisibility: boolean = false\n ): boolean {\n if (!tile.hasChildren) {\n return false;\n }\n\n // cesium specific\n if (tile.hasTilesetContent) {\n // Traverse external this to visit its root tile\n // Don't traverse if the subtree is expired because it will be destroyed\n return !tile.contentExpired;\n }\n\n if (!ignoreVisibility && !tile.isVisibleAndInRequestVolume) {\n return false;\n }\n\n return this.shouldRefine(tile, frameState, useParentMetric);\n }\n\n shouldLoadTile(tile: Tile3D): boolean {\n // if request tile is in current frame\n // and has unexpired render content\n return tile.hasUnloadedContent || tile.contentExpired;\n }\n\n shouldSelectTile(tile: Tile3D): boolean {\n // if select tile is in current frame\n // and content available\n return tile.contentAvailable && !this.options.skipLevelOfDetail;\n }\n\n /** Decide if tile LoD (level of detail) is not sufficient under current viewport */\n shouldRefine(tile: Tile3D, frameState: FrameState, useParentMetric: boolean = false): boolean {\n let screenSpaceError = tile._screenSpaceError;\n if (useParentMetric) {\n screenSpaceError = tile.getScreenSpaceError(frameState, true);\n }\n\n return screenSpaceError > this.options.maximumScreenSpaceError;\n }\n\n updateTileVisibility(tile: Tile3D, frameState: FrameState): void {\n const viewportIds: string[] = [];\n if (this.options.viewportTraversersMap) {\n for (const key in this.options.viewportTraversersMap) {\n const value = this.options.viewportTraversersMap[key];\n if (value === frameState.viewport.id) {\n viewportIds.push(key);\n }\n }\n } else {\n viewportIds.push(frameState.viewport.id);\n }\n tile.updateVisibility(frameState, viewportIds);\n }\n\n // UTILITIES\n\n compareDistanceToCamera(b: Tile3D, a: Tile3D): number {\n return b._distanceToCamera - a._distanceToCamera;\n }\n\n anyChildrenVisible(tile: Tile3D, frameState: FrameState): boolean {\n let anyVisible = false;\n for (const child of tile.children) {\n // @ts-expect-error\n child.updateVisibility(frameState);\n // @ts-expect-error\n anyVisible = anyVisible || child.isVisibleAndInRequestVolume;\n }\n return anyVisible;\n }\n\n // Depth-first traversal that checks if all nearest descendants with content are loaded.\n // Ignores visibility.\n executeEmptyTraversal(root: Tile3D, frameState: FrameState): boolean {\n let allDescendantsLoaded = true;\n const stack = this._emptyTraversalStack;\n stack.push(root);\n\n while (stack.length > 0) {\n const tile = stack.pop();\n\n const traverse = !tile.hasRenderContent && this.canTraverse(tile, frameState, false, false);\n const emptyLeaf = !tile.hasRenderContent && tile.children.length === 0;\n\n // Traversal stops but the tile does not have content yet\n // There will be holes if the parent tries to refine to its children, so don't refine\n // One exception: a parent may refine even if one of its descendants is an empty leaf\n if (!traverse && !tile.contentAvailable && !emptyLeaf) {\n allDescendantsLoaded = false;\n }\n\n this.updateTile(tile, frameState);\n\n if (!tile.isVisibleAndInRequestVolume) {\n this.loadTile(tile, frameState);\n this.touchTile(tile, frameState);\n }\n\n if (traverse) {\n const children = tile.children;\n for (const child of children) {\n stack.push(child);\n }\n }\n }\n return allDescendantsLoaded;\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"tileset-traverser.js","names":["ManagedArray","TILE_REFINEMENT","DEFAULT_PROPS","loadSiblings","skipLevelOfDetail","updateTransforms","onTraversalEnd","viewportTraversersMap","basePath","TilesetTraverser","traversalFinished","frameState","constructor","options","root","selectedTiles","requestedTiles","emptyTiles","lastUpdate","Date","getTime","updateDebounceTime","_traversalStack","_emptyTraversalStack","_frameNumber","traverse","reset","updateTile","frameNumber","executeTraversal","stack","_selectionDepth","push","length","tile","pop","shouldRefine","canTraverse","updateChildTiles","updateAndPushChildren","hasRenderContent","parent","parentRefines","Boolean","_shouldRefine","stoppedRefining","id","loadTile","selectTile","refine","ADD","REPLACE","touchTile","newTime","children","child","depth","sort","compareDistanceToCamera","bind","checkRefines","hasVisibleChild","refines","isVisibleAndInRequestVolume","find","delete","childRefines","_inRequestVolume","executeEmptyTraversal","contentAvailable","updateTileVisibility","shouldSelectTile","_selectedFrame","shouldLoadTile","_requestedFrame","_priority","_getPriority","tileset","_cache","touch","_touchedFrame","useParentMetric","arguments","undefined","ignoreVisibility","hasChildren","hasTilesetContent","contentExpired","hasUnloadedContent","screenSpaceError","_screenSpaceError","getScreenSpaceError","memoryAdjustedScreenSpaceError","viewportIds","key","value","viewport","updateVisibility","b","a","_distanceToCamera","anyChildrenVisible","anyVisible","allDescendantsLoaded","emptyLeaf"],"sources":["../../src/tileset/tileset-traverser.ts"],"sourcesContent":["// loaders.gl\n// SPDX-License-Identifier: MIT\n// Copyright (c) vis.gl contributors\n\nimport type {Tile3D} from './tile-3d';\nimport {ManagedArray} from '../utils/managed-array';\nimport {TILE_REFINEMENT} from '../constants';\nimport {FrameState} from './helpers/frame-state';\n\nexport type TilesetTraverserProps = {\n loadSiblings?: boolean;\n skipLevelOfDetail?: boolean;\n updateTransforms?: boolean;\n onTraversalEnd?: (frameState) => any;\n viewportTraversersMap?: Record<string, any>;\n basePath?: string;\n};\n\nexport const DEFAULT_PROPS: Required<TilesetTraverserProps> = {\n loadSiblings: false,\n skipLevelOfDetail: false,\n updateTransforms: true,\n onTraversalEnd: () => {},\n viewportTraversersMap: {},\n basePath: ''\n};\n\nexport class TilesetTraverser {\n options: Required<TilesetTraverserProps>;\n\n // fulfill in traverse call\n root: any = null;\n\n // tiles should be rendered\n selectedTiles: Record<string, Tile3D> = {};\n // tiles should be loaded from server\n requestedTiles: Record<string, Tile3D> = {};\n // tiles does not have render content\n emptyTiles: Record<string, Tile3D> = {};\n\n protected lastUpdate: number = new Date().getTime();\n protected readonly updateDebounceTime = 1000;\n /** temporary storage to hold the traversed tiles during a traversal */\n protected _traversalStack = new ManagedArray();\n protected _emptyTraversalStack = new ManagedArray();\n /** set in every traverse cycle */\n protected _frameNumber: number | null = null;\n\n // RESULT\n protected traversalFinished(frameState: FrameState): boolean {\n return true;\n }\n\n // TODO nested props\n constructor(options: TilesetTraverserProps) {\n this.options = {...DEFAULT_PROPS, ...options};\n }\n\n // tiles should be visible\n traverse(root, frameState, options) {\n this.root = root; // for root screen space error\n this.options = {...this.options, ...options};\n\n // reset result\n this.reset();\n\n // update tile (visibility and expiration)\n this.updateTile(root, frameState);\n\n this._frameNumber = frameState.frameNumber;\n this.executeTraversal(root, frameState);\n }\n\n reset() {\n this.requestedTiles = {};\n this.selectedTiles = {};\n this.emptyTiles = {};\n this._traversalStack.reset();\n this._emptyTraversalStack.reset();\n }\n\n /**\n * Execute traverse\n * Depth-first traversal that traverses all visible tiles and marks tiles for selection.\n * If skipLevelOfDetail is off then a tile does not refine until all children are loaded.\n * This is the traditional replacement refinement approach and is called the base traversal.\n * Tiles that have a greater screen space error than the base screen space error are part of the base traversal,\n * all other tiles are part of the skip traversal. The skip traversal allows for skipping levels of the tree\n * and rendering children and parent tiles simultaneously.\n */\n /* eslint-disable-next-line complexity, max-statements */\n executeTraversal(root, frameState: FrameState): void {\n // stack to store traversed tiles, only visible tiles should be added to stack\n // visible: visible in the current view frustum\n const stack = this._traversalStack;\n root._selectionDepth = 1;\n\n stack.push(root);\n while (stack.length > 0) {\n // 1. pop tile\n const tile = stack.pop();\n\n // 2. check if tile needs to be refine, needs refine if a tile's LoD is not sufficient and tile has available children (available content)\n let shouldRefine = false;\n if (this.canTraverse(tile, frameState)) {\n this.updateChildTiles(tile, frameState);\n shouldRefine = this.updateAndPushChildren(\n tile,\n frameState,\n stack,\n tile.hasRenderContent ? tile._selectionDepth + 1 : tile._selectionDepth\n );\n }\n\n // 3. decide if should render (select) this tile\n // - tile does not have render content\n // - tile has render content and tile is `add` type (pointcloud)\n // - tile has render content and tile is `replace` type (photogrammetry) and can't refine any further\n const parent = tile.parent;\n const parentRefines = Boolean(!parent || parent._shouldRefine);\n const stoppedRefining = !shouldRefine;\n\n if (!tile.hasRenderContent) {\n this.emptyTiles[tile.id] = tile;\n this.loadTile(tile, frameState);\n if (stoppedRefining) {\n this.selectTile(tile, frameState);\n }\n // additive tiles\n } else if (tile.refine === TILE_REFINEMENT.ADD) {\n // Additive tiles are always loaded and selected\n this.loadTile(tile, frameState);\n this.selectTile(tile, frameState);\n\n // replace tiles\n } else if (tile.refine === TILE_REFINEMENT.REPLACE) {\n // Always load tiles in the base traversal\n // Select tiles that can't refine further\n this.loadTile(tile, frameState);\n if (stoppedRefining) {\n this.selectTile(tile, frameState);\n }\n }\n\n // 3. update cache, most recent touched tiles have higher priority to be fetched from server\n this.touchTile(tile, frameState);\n\n // 4. update tile refine prop and parent refinement status to trickle down to the descendants\n tile._shouldRefine = shouldRefine && parentRefines;\n }\n\n const newTime = new Date().getTime();\n if (this.traversalFinished(frameState) || newTime - this.lastUpdate > this.updateDebounceTime) {\n this.lastUpdate = newTime;\n this.options.onTraversalEnd(frameState);\n }\n }\n\n updateChildTiles(tile: Tile3D, frameState: FrameState): void {\n const children = tile.children;\n for (const child of children) {\n this.updateTile(child, frameState);\n }\n }\n\n /* eslint-disable complexity, max-statements */\n updateAndPushChildren(tile: Tile3D, frameState: FrameState, stack, depth): boolean {\n const {loadSiblings, skipLevelOfDetail} = this.options;\n\n const children = tile.children;\n\n // sort children tiles\n children.sort(this.compareDistanceToCamera.bind(this));\n\n // For traditional replacement refinement only refine if all children are loaded.\n // Empty tiles are exempt since it looks better if children stream in as they are loaded to fill the empty space.\n const checkRefines =\n tile.refine === TILE_REFINEMENT.REPLACE && tile.hasRenderContent && !skipLevelOfDetail;\n\n let hasVisibleChild = false;\n let refines = true;\n\n for (const child of children) {\n child._selectionDepth = depth;\n if (child.isVisibleAndInRequestVolume) {\n if (stack.find(child)) {\n stack.delete(child);\n }\n stack.push(child);\n hasVisibleChild = true;\n } else if (checkRefines || loadSiblings) {\n // Keep non-visible children loaded since they are still needed before the parent can refine.\n // Or loadSiblings is true so always load tiles regardless of visibility.\n this.loadTile(child, frameState);\n this.touchTile(child, frameState);\n }\n\n if (checkRefines) {\n let childRefines;\n if (!child._inRequestVolume) {\n childRefines = false;\n } else if (!child.hasRenderContent) {\n childRefines = this.executeEmptyTraversal(child, frameState);\n } else {\n childRefines = child.contentAvailable;\n }\n refines = refines && childRefines;\n\n if (!refines) {\n return false;\n }\n }\n }\n\n if (!hasVisibleChild) {\n refines = false;\n }\n return refines;\n }\n /* eslint-enable complexity, max-statements */\n\n updateTile(tile: Tile3D, frameState: FrameState): void {\n this.updateTileVisibility(tile, frameState);\n }\n\n // tile to render in the browser\n selectTile(tile: Tile3D, frameState: FrameState): void {\n if (this.shouldSelectTile(tile)) {\n // The tile can be selected right away and does not require traverseAndSelect\n tile._selectedFrame = frameState.frameNumber;\n this.selectedTiles[tile.id] = tile;\n }\n }\n\n // tile to load from server\n loadTile(tile: Tile3D, frameState: FrameState): void {\n if (this.shouldLoadTile(tile)) {\n tile._requestedFrame = frameState.frameNumber;\n tile._priority = tile._getPriority();\n this.requestedTiles[tile.id] = tile;\n }\n }\n\n // cache tile\n touchTile(tile: Tile3D, frameState: FrameState): void {\n tile.tileset._cache.touch(tile);\n tile._touchedFrame = frameState.frameNumber;\n }\n\n // tile should be visible\n // tile should have children\n // tile LoD (level of detail) is not sufficient under current viewport\n canTraverse(\n tile: Tile3D,\n frameState: FrameState,\n useParentMetric: boolean = false,\n ignoreVisibility: boolean = false\n ): boolean {\n if (!tile.hasChildren) {\n return false;\n }\n\n // cesium specific\n if (tile.hasTilesetContent) {\n // Traverse external this to visit its root tile\n // Don't traverse if the subtree is expired because it will be destroyed\n return !tile.contentExpired;\n }\n\n if (!ignoreVisibility && !tile.isVisibleAndInRequestVolume) {\n return false;\n }\n\n return this.shouldRefine(tile, frameState, useParentMetric);\n }\n\n shouldLoadTile(tile: Tile3D): boolean {\n // if request tile is in current frame\n // and has unexpired render content\n return tile.hasUnloadedContent || tile.contentExpired;\n }\n\n shouldSelectTile(tile: Tile3D): boolean {\n // if select tile is in current frame\n // and content available\n return tile.contentAvailable && !this.options.skipLevelOfDetail;\n }\n\n /** Decide if tile LoD (level of detail) is not sufficient under current viewport */\n shouldRefine(tile: Tile3D, frameState: FrameState, useParentMetric: boolean = false): boolean {\n let screenSpaceError = tile._screenSpaceError;\n if (useParentMetric) {\n screenSpaceError = tile.getScreenSpaceError(frameState, true);\n }\n\n return screenSpaceError > tile.tileset.memoryAdjustedScreenSpaceError;\n }\n\n updateTileVisibility(tile: Tile3D, frameState: FrameState): void {\n const viewportIds: string[] = [];\n if (this.options.viewportTraversersMap) {\n for (const key in this.options.viewportTraversersMap) {\n const value = this.options.viewportTraversersMap[key];\n if (value === frameState.viewport.id) {\n viewportIds.push(key);\n }\n }\n } else {\n viewportIds.push(frameState.viewport.id);\n }\n tile.updateVisibility(frameState, viewportIds);\n }\n\n // UTILITIES\n\n compareDistanceToCamera(b: Tile3D, a: Tile3D): number {\n return b._distanceToCamera - a._distanceToCamera;\n }\n\n anyChildrenVisible(tile: Tile3D, frameState: FrameState): boolean {\n let anyVisible = false;\n for (const child of tile.children) {\n // @ts-expect-error\n child.updateVisibility(frameState);\n // @ts-expect-error\n anyVisible = anyVisible || child.isVisibleAndInRequestVolume;\n }\n return anyVisible;\n }\n\n // Depth-first traversal that checks if all nearest descendants with content are loaded.\n // Ignores visibility.\n executeEmptyTraversal(root: Tile3D, frameState: FrameState): boolean {\n let allDescendantsLoaded = true;\n const stack = this._emptyTraversalStack;\n stack.push(root);\n\n while (stack.length > 0) {\n const tile = stack.pop();\n\n const traverse = !tile.hasRenderContent && this.canTraverse(tile, frameState, false, false);\n const emptyLeaf = !tile.hasRenderContent && tile.children.length === 0;\n\n // Traversal stops but the tile does not have content yet\n // There will be holes if the parent tries to refine to its children, so don't refine\n // One exception: a parent may refine even if one of its descendants is an empty leaf\n if (!traverse && !tile.contentAvailable && !emptyLeaf) {\n allDescendantsLoaded = false;\n }\n\n this.updateTile(tile, frameState);\n\n if (!tile.isVisibleAndInRequestVolume) {\n this.loadTile(tile, frameState);\n this.touchTile(tile, frameState);\n }\n\n if (traverse) {\n const children = tile.children;\n for (const child of children) {\n stack.push(child);\n }\n }\n }\n return allDescendantsLoaded;\n }\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@loaders.gl/tiles",
3
- "version": "4.1.0-alpha.9",
3
+ "version": "4.1.1",
4
4
  "description": "Common components for different tiles loaders.",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -25,9 +25,9 @@
25
25
  "module": "dist/index.js",
26
26
  "exports": {
27
27
  ".": {
28
+ "types": "./dist/index.d.ts",
28
29
  "import": "./dist/index.js",
29
- "require": "./dist/index.cjs",
30
- "types": "./dist/index.d.ts"
30
+ "require": "./dist/index.cjs"
31
31
  }
32
32
  },
33
33
  "sideEffects": false,
@@ -41,8 +41,8 @@
41
41
  "build-bundle": "ocular-bundle ./src/index.ts"
42
42
  },
43
43
  "dependencies": {
44
- "@loaders.gl/loader-utils": "4.1.0-alpha.9",
45
- "@loaders.gl/math": "4.1.0-alpha.9",
44
+ "@loaders.gl/loader-utils": "4.1.1",
45
+ "@loaders.gl/math": "4.1.1",
46
46
  "@math.gl/core": "^4.0.0",
47
47
  "@math.gl/culling": "^4.0.0",
48
48
  "@math.gl/geospatial": "^4.0.0",
@@ -55,5 +55,5 @@
55
55
  "devDependencies": {
56
56
  "@deck.gl/core": "^8.9.0"
57
57
  },
58
- "gitHead": "0291d4d78d71202385d0368942f84778d6aafa82"
58
+ "gitHead": "b4a8cb4e5c2b67ac0e1afaa21ae45b3a45a91db0"
59
59
  }
@@ -1,4 +1,3 @@
1
- // loaders.gl
2
1
  // SPDX-License-Identifier: MIT
3
2
  // Copyright (c) vis.gl contributors
4
3
 
@@ -53,6 +52,7 @@ export type Tileset3DProps = {
53
52
  loadTiles?: boolean;
54
53
  basePath?: string;
55
54
  maximumMemoryUsage?: number;
55
+ memoryCacheOverflow?: number;
56
56
  maximumTilesSelected?: number;
57
57
  debounceTime?: number;
58
58
 
@@ -66,6 +66,7 @@ export type Tileset3DProps = {
66
66
 
67
67
  // Traversal
68
68
  maximumScreenSpaceError?: number;
69
+ memoryAdjustedScreenSpaceError?: boolean;
69
70
  viewportTraversersMap?: any;
70
71
  updateTransforms?: boolean;
71
72
  viewDistanceScale?: number;
@@ -87,7 +88,10 @@ type Props = {
87
88
  throttleRequests: boolean;
88
89
  /** Number of simultaneous requsts, if throttleRequests is true */
89
90
  maxRequests: number;
91
+ /* Maximum amount of GPU memory (in MB) that may be used to cache tiles. */
90
92
  maximumMemoryUsage: number;
93
+ /* The maximum additional memory (in MB) to allow for cache headroom before adjusting the screen spacer error */
94
+ memoryCacheOverflow: number;
91
95
  /** Maximum number limit of tiles selected for show. 0 means no limit */
92
96
  maximumTilesSelected: number;
93
97
  /** Delay time before the tileset traversal. It prevents traversal requests spam.*/
@@ -102,6 +106,8 @@ type Props = {
102
106
  onTraversalComplete: (selectedTiles: Tile3D[]) => Tile3D[];
103
107
  /** The maximum screen space error used to drive level of detail refinement. */
104
108
  maximumScreenSpaceError: number;
109
+ /** Whether to adjust the maximum screen space error to comply with the maximum memory limitation */
110
+ memoryAdjustedScreenSpaceError: boolean;
105
111
  viewportTraversersMap: Record<string, any> | null;
106
112
  attributions: string[];
107
113
  loadTiles: boolean;
@@ -122,7 +128,9 @@ const DEFAULT_PROPS: Props = {
122
128
  modelMatrix: new Matrix4(),
123
129
  throttleRequests: true,
124
130
  maxRequests: 64,
131
+ /** Default memory values optimized for viewing mesh-based 3D Tiles on both mobile and desktop devices */
125
132
  maximumMemoryUsage: 32,
133
+ memoryCacheOverflow: 1,
126
134
  maximumTilesSelected: 0,
127
135
  debounceTime: 0,
128
136
  onTileLoad: () => {},
@@ -132,6 +140,7 @@ const DEFAULT_PROPS: Props = {
132
140
  contentLoader: undefined,
133
141
  viewDistanceScale: 1.0,
134
142
  maximumScreenSpaceError: 8,
143
+ memoryAdjustedScreenSpaceError: false,
135
144
  loadTiles: true,
136
145
  updateTransforms: true,
137
146
  viewportTraversersMap: null,
@@ -152,6 +161,7 @@ const TILES_UNLOADED = 'Tiles Unloaded';
152
161
  const TILES_LOAD_FAILED = 'Failed Tile Loads';
153
162
  const POINTS_COUNT = 'Points/Vertices';
154
163
  const TILES_GPU_MEMORY = 'Tile Memory Use';
164
+ const MAXIMUM_SSE = 'Maximum Screen Space Error';
155
165
 
156
166
  /**
157
167
  * The Tileset loading and rendering flow is as below,
@@ -239,6 +249,17 @@ export class Tileset3D {
239
249
  /** The total amount of GPU memory in bytes used by the tileset. */
240
250
  gpuMemoryUsageInBytes: number = 0;
241
251
 
252
+ /**
253
+ * If loading the level of detail required by maximumScreenSpaceError
254
+ * results in the memory usage exceeding maximumMemoryUsage (GPU), level of detail refinement
255
+ * will instead use this (larger) adjusted screen space error to achieve the
256
+ * best possible visual quality within the available memory.
257
+ */
258
+ memoryAdjustedScreenSpaceError: number = 0.0;
259
+
260
+ private _cacheBytes: number = 0;
261
+ private _cacheOverflowBytes: number = 0;
262
+
242
263
  /** Update tracker. increase in each update cycle. */
243
264
  _frameNumber: number = 0;
244
265
  private _queryParams: Record<string, string> = {};
@@ -301,6 +322,10 @@ export class Tileset3D {
301
322
  maxRequests: this.options.maxRequests
302
323
  });
303
324
 
325
+ this.memoryAdjustedScreenSpaceError = this.options.maximumScreenSpaceError;
326
+ this._cacheBytes = this.options.maximumMemoryUsage * 1024 * 1024;
327
+ this._cacheOverflowBytes = this.options.memoryCacheOverflow * 1024 * 1024;
328
+
304
329
  // METRICS
305
330
  // The total amount of GPU memory in bytes used by the tileset.
306
331
  this.stats = new Stats({id: this.url});
@@ -407,6 +432,16 @@ export class Tileset3D {
407
432
  return this.updatePromise;
408
433
  }
409
434
 
435
+ adjustScreenSpaceError(): void {
436
+ if (this.gpuMemoryUsageInBytes < this._cacheBytes) {
437
+ this.memoryAdjustedScreenSpaceError = Math.max(
438
+ this.memoryAdjustedScreenSpaceError / 1.02,
439
+ this.options.maximumScreenSpaceError
440
+ );
441
+ } else if (this.gpuMemoryUsageInBytes > this._cacheBytes + this._cacheOverflowBytes) {
442
+ this.memoryAdjustedScreenSpaceError *= 1.02;
443
+ }
444
+ }
410
445
  /**
411
446
  * Update visible tiles relying on a list of viewports
412
447
  * @param viewports viewports
@@ -571,6 +606,7 @@ export class Tileset3D {
571
606
  this.stats.get(TILES_IN_VIEW).count = this.selectedTiles.length;
572
607
  this.stats.get(TILES_RENDERABLE).count = tilesRenderable;
573
608
  this.stats.get(POINTS_COUNT).count = pointsRenderable;
609
+ this.stats.get(MAXIMUM_SSE).count = this.memoryAdjustedScreenSpaceError;
574
610
  }
575
611
 
576
612
  async _initializeTileSet(tilesetJson: TilesetJSON): Promise<void> {
@@ -668,6 +704,7 @@ export class Tileset3D {
668
704
  this.stats.get(TILES_LOAD_FAILED);
669
705
  this.stats.get(POINTS_COUNT);
670
706
  this.stats.get(TILES_GPU_MEMORY, 'memory');
707
+ this.stats.get(MAXIMUM_SSE);
671
708
  }
672
709
 
673
710
  // Installs the main tileset JSON file or a tileset JSON file referenced from a tile.
@@ -836,9 +873,15 @@ export class Tileset3D {
836
873
  this.stats.get(TILES_LOADED).incrementCount();
837
874
  this.stats.get(TILES_IN_MEMORY).incrementCount();
838
875
 
839
- // Good enough? Just use the raw binary ArrayBuffer's byte length.
876
+ // TODO: Calculate GPU memory usage statistics for a tile.
840
877
  this.gpuMemoryUsageInBytes += tile.gpuMemoryUsageInBytes || 0;
878
+
841
879
  this.stats.get(TILES_GPU_MEMORY).count = this.gpuMemoryUsageInBytes;
880
+
881
+ // Adjust SSE based on cache limits
882
+ if (this.options.memoryAdjustedScreenSpaceError) {
883
+ this.adjustScreenSpaceError();
884
+ }
842
885
  }
843
886
 
844
887
  _unloadTile(tile) {
@@ -11,7 +11,6 @@ export type TilesetTraverserProps = {
11
11
  loadSiblings?: boolean;
12
12
  skipLevelOfDetail?: boolean;
13
13
  updateTransforms?: boolean;
14
- maximumScreenSpaceError?: number;
15
14
  onTraversalEnd?: (frameState) => any;
16
15
  viewportTraversersMap?: Record<string, any>;
17
16
  basePath?: string;
@@ -20,7 +19,6 @@ export type TilesetTraverserProps = {
20
19
  export const DEFAULT_PROPS: Required<TilesetTraverserProps> = {
21
20
  loadSiblings: false,
22
21
  skipLevelOfDetail: false,
23
- maximumScreenSpaceError: 2,
24
22
  updateTransforms: true,
25
23
  onTraversalEnd: () => {},
26
24
  viewportTraversersMap: {},
@@ -295,7 +293,7 @@ export class TilesetTraverser {
295
293
  screenSpaceError = tile.getScreenSpaceError(frameState, true);
296
294
  }
297
295
 
298
- return screenSpaceError > this.options.maximumScreenSpaceError;
296
+ return screenSpaceError > tile.tileset.memoryAdjustedScreenSpaceError;
299
297
  }
300
298
 
301
299
  updateTileVisibility(tile: Tile3D, frameState: FrameState): void {