@itwin/frontend-tiles 3.7.5 → 4.0.0-dev.100

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. package/.rush/temp/operation/build/all.log +3 -0
  2. package/.rush/temp/operation/build/state.json +3 -0
  3. package/.rush/temp/package-deps_build.json +24 -0
  4. package/.rush/temp/shrinkwrap-deps.json +195 -46
  5. package/CHANGELOG.json +0 -6
  6. package/CHANGELOG.md +1 -6
  7. package/config/rush-project.json +1 -2
  8. package/lib/cjs/BatchedModels.d.ts +16 -0
  9. package/lib/cjs/BatchedModels.d.ts.map +1 -0
  10. package/lib/cjs/BatchedModels.js +48 -0
  11. package/lib/cjs/BatchedModels.js.map +1 -0
  12. package/lib/cjs/BatchedSpatialTileTreeRefs.d.ts.map +1 -1
  13. package/lib/cjs/BatchedSpatialTileTreeRefs.js +61 -14
  14. package/lib/cjs/BatchedSpatialTileTreeRefs.js.map +1 -1
  15. package/lib/cjs/BatchedTile.d.ts.map +1 -1
  16. package/lib/cjs/BatchedTile.js +6 -6
  17. package/lib/cjs/BatchedTile.js.map +1 -1
  18. package/lib/cjs/BatchedTileContentReader.js +6 -8
  19. package/lib/cjs/BatchedTileContentReader.js.map +1 -1
  20. package/lib/cjs/BatchedTileTree.d.ts +3 -1
  21. package/lib/cjs/BatchedTileTree.d.ts.map +1 -1
  22. package/lib/cjs/BatchedTileTree.js +1 -0
  23. package/lib/cjs/BatchedTileTree.js.map +1 -1
  24. package/lib/cjs/BatchedTileTreeReference.d.ts +28 -16
  25. package/lib/cjs/BatchedTileTreeReference.d.ts.map +1 -1
  26. package/lib/cjs/BatchedTileTreeReference.js +48 -47
  27. package/lib/cjs/BatchedTileTreeReference.js.map +1 -1
  28. package/lib/cjs/BatchedTileTreeSupplier.d.ts +6 -2
  29. package/lib/cjs/BatchedTileTreeSupplier.d.ts.map +1 -1
  30. package/lib/cjs/BatchedTileTreeSupplier.js +7 -5
  31. package/lib/cjs/BatchedTileTreeSupplier.js.map +1 -1
  32. package/lib/cjs/BatchedTilesetReader.js +2 -3
  33. package/lib/cjs/BatchedTilesetReader.js.map +1 -1
  34. package/lib/cjs/FrontendTiles.d.ts +1 -1
  35. package/lib/cjs/FrontendTiles.d.ts.map +1 -1
  36. package/lib/cjs/FrontendTiles.js.map +1 -1
  37. package/lib/cjs/LoggerCategory.js.map +1 -1
  38. package/lib/cjs/frontend-tiles.js +5 -1
  39. package/lib/cjs/frontend-tiles.js.map +1 -1
  40. package/lib/cjs/tsconfig.tsbuildinfo +1 -1
  41. package/lib/esm/BatchedModels.d.ts +16 -0
  42. package/lib/esm/BatchedModels.d.ts.map +1 -0
  43. package/lib/esm/BatchedModels.js +44 -0
  44. package/lib/esm/BatchedModels.js.map +1 -0
  45. package/lib/esm/BatchedSpatialTileTreeRefs.d.ts.map +1 -1
  46. package/lib/esm/BatchedSpatialTileTreeRefs.js +62 -15
  47. package/lib/esm/BatchedSpatialTileTreeRefs.js.map +1 -1
  48. package/lib/esm/BatchedTile.d.ts.map +1 -1
  49. package/lib/esm/BatchedTile.js +6 -6
  50. package/lib/esm/BatchedTile.js.map +1 -1
  51. package/lib/esm/BatchedTileContentReader.js +6 -8
  52. package/lib/esm/BatchedTileContentReader.js.map +1 -1
  53. package/lib/esm/BatchedTileTree.d.ts +3 -1
  54. package/lib/esm/BatchedTileTree.d.ts.map +1 -1
  55. package/lib/esm/BatchedTileTree.js +1 -0
  56. package/lib/esm/BatchedTileTree.js.map +1 -1
  57. package/lib/esm/BatchedTileTreeReference.d.ts +28 -16
  58. package/lib/esm/BatchedTileTreeReference.d.ts.map +1 -1
  59. package/lib/esm/BatchedTileTreeReference.js +45 -46
  60. package/lib/esm/BatchedTileTreeReference.js.map +1 -1
  61. package/lib/esm/BatchedTileTreeSupplier.d.ts +6 -2
  62. package/lib/esm/BatchedTileTreeSupplier.d.ts.map +1 -1
  63. package/lib/esm/BatchedTileTreeSupplier.js +8 -6
  64. package/lib/esm/BatchedTileTreeSupplier.js.map +1 -1
  65. package/lib/esm/BatchedTilesetReader.js +2 -3
  66. package/lib/esm/BatchedTilesetReader.js.map +1 -1
  67. package/lib/esm/FrontendTiles.d.ts +1 -1
  68. package/lib/esm/FrontendTiles.d.ts.map +1 -1
  69. package/lib/esm/FrontendTiles.js.map +1 -1
  70. package/lib/esm/LoggerCategory.js.map +1 -1
  71. package/lib/esm/frontend-tiles.js.map +1 -1
  72. package/lib/esm/tsconfig.tsbuildinfo +1 -1
  73. package/package.json +18 -19
  74. package/src/BatchedModels.ts +58 -0
  75. package/src/BatchedSpatialTileTreeRefs.ts +79 -13
  76. package/src/BatchedTile.ts +1 -0
  77. package/src/BatchedTileTree.ts +4 -1
  78. package/src/BatchedTileTreeReference.ts +69 -58
  79. package/src/BatchedTileTreeSupplier.ts +15 -8
  80. package/.rush/temp/8767d8e57eacc648f9e35b3b97ca2ba97f018069.log +0 -10
  81. package/.rush/temp/operation/build_ci/state.json +0 -3
@@ -0,0 +1,16 @@
1
+ import { Id64String } from "@itwin/core-bentley";
2
+ import { Range3d } from "@itwin/core-geometry";
3
+ import { SpatialViewState } from "@itwin/core-frontend";
4
+ export declare class BatchedModels {
5
+ private readonly _iModel;
6
+ private _viewedModels;
7
+ private readonly _viewedModelIdPairs;
8
+ private readonly _modelRanges;
9
+ private _modelRangePromise?;
10
+ constructor(view: SpatialViewState);
11
+ setViewedModels(models: Set<Id64String>): void;
12
+ views(modelId: Id64String): boolean;
13
+ isViewed(modelIdLo: number, modelIdHi: number): boolean;
14
+ unionRange(range: Range3d): void;
15
+ }
16
+ //# sourceMappingURL=BatchedModels.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BatchedModels.d.ts","sourceRoot":"","sources":["../../src/BatchedModels.ts"],"names":[],"mappings":"AAKA,OAAO,EAAQ,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAE/C,OAAO,EAAoB,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAE1E,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmB;IAC3C,OAAO,CAAC,aAAa,CAAmB;IACxC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAwB;IAC5D,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAkC;IAC/D,OAAO,CAAC,kBAAkB,CAAC,CAAgB;gBAExB,IAAI,EAAE,gBAAgB;IAKlC,eAAe,CAAC,MAAM,EAAE,GAAG,CAAC,UAAU,CAAC,GAAG,IAAI;IAoB9C,KAAK,CAAC,OAAO,EAAE,UAAU,GAAG,OAAO;IAInC,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO;IAIvD,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;CAOxC"}
@@ -0,0 +1,44 @@
1
+ /*---------------------------------------------------------------------------------------------
2
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
3
+ * See LICENSE.md in the project root for license terms and full copyright notice.
4
+ *--------------------------------------------------------------------------------------------*/
5
+ import { Id64 } from "@itwin/core-bentley";
6
+ import { Range3d } from "@itwin/core-geometry";
7
+ export class BatchedModels {
8
+ constructor(view) {
9
+ this._viewedModelIdPairs = new Id64.Uint32Set();
10
+ this._modelRanges = new Map();
11
+ this._iModel = view.iModel;
12
+ this.setViewedModels(view.modelSelector.models);
13
+ }
14
+ setViewedModels(models) {
15
+ this._viewedModels = models;
16
+ this._viewedModelIdPairs.clear();
17
+ this._viewedModelIdPairs.addIds(models);
18
+ this._modelRangePromise = undefined;
19
+ const modelIds = Array.from(models).filter((modelId) => !this._modelRanges.has(modelId));
20
+ if (modelIds.length === 0)
21
+ return;
22
+ const modelRangePromise = this._modelRangePromise = this._iModel.models.queryExtents(modelIds).then((extents) => {
23
+ if (modelRangePromise !== this._modelRangePromise)
24
+ return;
25
+ this._modelRangePromise = undefined;
26
+ for (const extent of extents)
27
+ this._modelRanges.set(extent.id, Range3d.fromJSON(extent.extents));
28
+ }).catch(() => { });
29
+ }
30
+ views(modelId) {
31
+ return this._viewedModels.has(modelId);
32
+ }
33
+ isViewed(modelIdLo, modelIdHi) {
34
+ return this._viewedModelIdPairs.has(modelIdLo, modelIdHi);
35
+ }
36
+ unionRange(range) {
37
+ for (const id of this._viewedModels) {
38
+ const extent = this._modelRanges.get(id);
39
+ if (extent)
40
+ range.extendRange(extent);
41
+ }
42
+ }
43
+ }
44
+ //# sourceMappingURL=BatchedModels.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BatchedModels.js","sourceRoot":"","sources":["../../src/BatchedModels.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAE/F,OAAO,EAAE,IAAI,EAAc,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAI/C,MAAM,OAAO,aAAa;IAOxB,YAAmB,IAAsB;QAJxB,wBAAmB,GAAG,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;QAC3C,iBAAY,GAAG,IAAI,GAAG,EAAuB,CAAC;QAI7D,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC;QAC3B,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IAClD,CAAC;IAEM,eAAe,CAAC,MAAuB;QAC5C,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC;QAC5B,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,CAAC;QACjC,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAExC,IAAI,CAAC,kBAAkB,GAAG,SAAS,CAAC;QACpC,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;QACzF,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;YACvB,OAAO;QAET,MAAM,iBAAiB,GAAG,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,OAA4B,EAAE,EAAE;YACnI,IAAI,iBAAiB,KAAK,IAAI,CAAC,kBAAkB;gBAC/C,OAAO;YAET,IAAI,CAAC,kBAAkB,GAAG,SAAS,CAAC;YACpC,KAAK,MAAM,MAAM,IAAI,OAAO;gBAC1B,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;QACvE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;IACtB,CAAC;IAEM,KAAK,CAAC,OAAmB;QAC9B,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACzC,CAAC;IAEM,QAAQ,CAAC,SAAiB,EAAE,SAAiB;QAClD,OAAO,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IAC5D,CAAC;IAEM,UAAU,CAAC,KAAc;QAC9B,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,aAAa,EAAE;YACnC,MAAM,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YACzC,IAAI,MAAM;gBACR,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;SAC7B;IACH,CAAC;CACF","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\nimport { Id64, Id64String } from \"@itwin/core-bentley\";\r\nimport { Range3d } from \"@itwin/core-geometry\";\r\nimport { ModelExtentsProps } from \"@itwin/core-common\";\r\nimport { IModelConnection, SpatialViewState } from \"@itwin/core-frontend\";\r\n\r\nexport class BatchedModels {\r\n private readonly _iModel: IModelConnection;\r\n private _viewedModels!: Set<Id64String>;\r\n private readonly _viewedModelIdPairs = new Id64.Uint32Set();\r\n private readonly _modelRanges = new Map<Id64String, Range3d>();\r\n private _modelRangePromise?: Promise<void>;\r\n\r\n public constructor(view: SpatialViewState) {\r\n this._iModel = view.iModel;\r\n this.setViewedModels(view.modelSelector.models);\r\n }\r\n\r\n public setViewedModels(models: Set<Id64String>): void {\r\n this._viewedModels = models;\r\n this._viewedModelIdPairs.clear();\r\n this._viewedModelIdPairs.addIds(models);\r\n\r\n this._modelRangePromise = undefined;\r\n const modelIds = Array.from(models).filter((modelId) => !this._modelRanges.has(modelId));\r\n if (modelIds.length === 0)\r\n return;\r\n\r\n const modelRangePromise = this._modelRangePromise = this._iModel.models.queryExtents(modelIds).then((extents: ModelExtentsProps[]) => {\r\n if (modelRangePromise !== this._modelRangePromise)\r\n return;\r\n\r\n this._modelRangePromise = undefined;\r\n for (const extent of extents)\r\n this._modelRanges.set(extent.id, Range3d.fromJSON(extent.extents));\r\n }).catch(() => { });\r\n }\r\n\r\n public views(modelId: Id64String): boolean {\r\n return this._viewedModels.has(modelId);\r\n }\r\n\r\n public isViewed(modelIdLo: number, modelIdHi: number): boolean {\r\n return this._viewedModelIdPairs.has(modelIdLo, modelIdHi);\r\n }\r\n\r\n public unionRange(range: Range3d): void {\r\n for (const id of this._viewedModels) {\r\n const extent = this._modelRanges.get(id);\r\n if (extent)\r\n range.extendRange(extent);\r\n }\r\n }\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"BatchedSpatialTileTreeRefs.d.ts","sourceRoot":"","sources":["../../src/BatchedSpatialTileTreeRefs.ts"],"names":[],"mappings":"AAKA,OAAO,EACmC,yBAAyB,EAAE,gBAAgB,EACpF,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,4BAA4B,EAA2C,MAAM,iBAAiB,CAAC;AA2HxG,gBAAgB;AAChB,wBAAgB,sCAAsC,CAAC,IAAI,EAAE,gBAAgB,EAAE,cAAc,EAAE,4BAA4B,GAAG,yBAAyB,CA0BtJ"}
1
+ {"version":3,"file":"BatchedSpatialTileTreeRefs.d.ts","sourceRoot":"","sources":["../../src/BatchedSpatialTileTreeRefs.ts"],"names":[],"mappings":"AAOA,OAAO,EACmC,yBAAyB,EAAE,gBAAgB,EACpF,MAAM,sBAAsB,CAAC;AAI9B,OAAO,EAAE,4BAA4B,EAA2C,MAAM,iBAAiB,CAAC;AAyLxG,gBAAgB;AAChB,wBAAgB,sCAAsC,CAAC,IAAI,EAAE,gBAAgB,EAAE,cAAc,EAAE,4BAA4B,GAAG,yBAAyB,CAyBtJ"}
@@ -2,28 +2,78 @@
2
2
  * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
3
3
  * See LICENSE.md in the project root for license terms and full copyright notice.
4
4
  *--------------------------------------------------------------------------------------------*/
5
+ import { assert } from "@itwin/core-bentley";
5
6
  import { TileTreeLoadStatus, TileTreeReference, } from "@itwin/core-frontend";
6
- import { BatchedTileTreeReference } from "./BatchedTileTreeReference";
7
+ import { AnimatedBatchedTileTreeReference, PrimaryBatchedTileTreeReference } from "./BatchedTileTreeReference";
8
+ import { getBatchedTileTreeOwner } from "./BatchedTileTreeSupplier";
9
+ import { BatchedModels } from "./BatchedModels";
7
10
  import { createFallbackSpatialTileTreeReferences } from "./FrontendTiles";
8
11
  // Obtains tiles pre-published by mesh export service.
9
12
  class BatchedSpatialTileTreeReferences {
10
- constructor(treeRef) {
11
- this._treeRef = treeRef;
13
+ constructor(baseUrl, view) {
14
+ this._animatedRefs = [];
15
+ this._view = view;
16
+ this._models = new BatchedModels(view);
17
+ const script = view.displayStyle.scheduleScript;
18
+ this._currentScript = script?.requiresBatching ? script : undefined;
19
+ this.load(baseUrl, view.iModel);
20
+ assert(undefined !== this._primaryRef);
21
+ }
22
+ load(baseUrl, iModel) {
23
+ const treeOwner = getBatchedTileTreeOwner(iModel, { baseUrl, script: this._currentScript });
24
+ this._primaryRef = new PrimaryBatchedTileTreeReference(treeOwner, this._models);
25
+ this.populateAnimatedReferences(treeOwner);
26
+ const onScriptChanged = (newScript) => {
27
+ if (!newScript?.requiresBatching)
28
+ newScript = undefined;
29
+ const currentScript = this._currentScript;
30
+ this._currentScript = newScript;
31
+ if (newScript !== currentScript)
32
+ if (!newScript || !currentScript || !newScript.equals(currentScript))
33
+ this.load(baseUrl, iModel);
34
+ };
35
+ let removeScriptChangedListener = this._view.displayStyle.onScheduleScriptChanged.addListener((newScript) => onScriptChanged(newScript));
36
+ this._view.onDisplayStyleChanged.addListener((newStyle) => {
37
+ removeScriptChangedListener();
38
+ onScriptChanged(newStyle.scheduleScript);
39
+ removeScriptChangedListener = this._view.displayStyle.onScheduleScriptChanged.addListener((newScript) => onScriptChanged(newScript));
40
+ });
12
41
  }
13
42
  *[Symbol.iterator]() {
14
- yield this._treeRef;
43
+ yield this._primaryRef;
44
+ for (const animatedRef of this._animatedRefs)
45
+ yield animatedRef;
46
+ }
47
+ populateAnimatedReferences(treeOwner) {
48
+ this._animatedRefs.length = 0;
49
+ const script = this._currentScript;
50
+ if (!script)
51
+ return;
52
+ const getCurrentTimePoint = () => this._view.displayStyle.settings.timePoint ?? script.duration.low;
53
+ for (const timeline of script.modelTimelines) {
54
+ const nodeIds = timeline.transformBatchIds;
55
+ for (const nodeId of nodeIds) {
56
+ this._animatedRefs.push(new AnimatedBatchedTileTreeReference(treeOwner, {
57
+ timeline,
58
+ nodeId,
59
+ getCurrentTimePoint,
60
+ }));
61
+ }
62
+ }
15
63
  }
16
64
  update() {
17
- this._treeRef.updateViewedModels();
65
+ this._models.setViewedModels(this._view.modelSelector.models);
66
+ if (this._onModelSelectorChanged)
67
+ this._onModelSelectorChanged();
18
68
  }
19
69
  attachToViewport(args) {
20
- this._treeRef.attachToViewport(args);
70
+ this._onModelSelectorChanged = () => args.invalidateSymbologyOverrides();
21
71
  }
22
72
  detachFromViewport() {
23
- this._treeRef.detachFromViewport();
73
+ this._onModelSelectorChanged = undefined;
24
74
  }
25
75
  setDeactivated() {
26
- // This exists chiefly for debugging. Unimplemented here.
76
+ // Used for debugging. Unimplemented here.
27
77
  }
28
78
  }
29
79
  // A placeholder used by [[ProxySpatialTileTreeReferences]] until asynchronous loading completes.
@@ -56,8 +106,7 @@ class ProxySpatialTileTreeReferences {
56
106
  this._proxyRef = new ProxyTileTreeReference(view.iModel);
57
107
  getBaseUrl.then((url) => {
58
108
  if (url) {
59
- const ref = BatchedTileTreeReference.create(view, url);
60
- this.setTreeRefs(new BatchedSpatialTileTreeReferences(ref));
109
+ this.setTreeRefs(new BatchedSpatialTileTreeReferences(url, view));
61
110
  }
62
111
  else {
63
112
  this.setTreeRefs(createFallbackSpatialTileTreeReferences(view));
@@ -75,8 +124,7 @@ class ProxySpatialTileTreeReferences {
75
124
  }
76
125
  }
77
126
  update() {
78
- var _a;
79
- (_a = this._impl) === null || _a === void 0 ? void 0 : _a.update();
127
+ this._impl?.update();
80
128
  }
81
129
  attachToViewport(args) {
82
130
  if (this._impl)
@@ -112,7 +160,7 @@ export function createBatchedSpatialTileTreeReferences(view, computeBaseUrl) {
112
160
  iModel.onClose.addOnce(() => iModelToBaseUrl.delete(iModel));
113
161
  promise.then((url) => {
114
162
  if (iModelToBaseUrl.has(iModel))
115
- iModelToBaseUrl.set(iModel, url !== null && url !== void 0 ? url : null);
163
+ iModelToBaseUrl.set(iModel, url ?? null);
116
164
  }).catch(() => {
117
165
  if (iModelToBaseUrl.has(iModel))
118
166
  iModelToBaseUrl.set(iModel, null);
@@ -124,7 +172,6 @@ export function createBatchedSpatialTileTreeReferences(view, computeBaseUrl) {
124
172
  }
125
173
  if (entry instanceof Promise)
126
174
  return new ProxySpatialTileTreeReferences(view, entry);
127
- const ref = BatchedTileTreeReference.create(view, entry);
128
- return new BatchedSpatialTileTreeReferences(ref);
175
+ return new BatchedSpatialTileTreeReferences(entry, view);
129
176
  }
130
177
  //# sourceMappingURL=BatchedSpatialTileTreeRefs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"BatchedSpatialTileTreeRefs.js","sourceRoot":"","sources":["../../src/BatchedSpatialTileTreeRefs.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\nimport {\n AttachToViewportArgs, IModelConnection, SpatialTileTreeReferences, SpatialViewState, TileTreeLoadStatus, TileTreeOwner, TileTreeReference,\n} from \"@itwin/core-frontend\";\nimport { BatchedTileTreeReference } from \"./BatchedTileTreeReference\";\nimport { ComputeSpatialTilesetBaseUrl, createFallbackSpatialTileTreeReferences } from \"./FrontendTiles\";\n\n// Obtains tiles pre-published by mesh export service.\nclass BatchedSpatialTileTreeReferences implements SpatialTileTreeReferences {\n private readonly _treeRef: BatchedTileTreeReference;\n\n public constructor(treeRef: BatchedTileTreeReference) {\n this._treeRef = treeRef;\n }\n\n public *[Symbol.iterator](): Iterator<TileTreeReference> {\n yield this._treeRef;\n }\n\n public update(): void {\n this._treeRef.updateViewedModels();\n }\n\n public attachToViewport(args: AttachToViewportArgs): void {\n this._treeRef.attachToViewport(args);\n }\n\n public detachFromViewport(): void {\n this._treeRef.detachFromViewport();\n }\n\n public setDeactivated(): void {\n // This exists chiefly for debugging. Unimplemented here.\n }\n}\n\n// A placeholder used by [[ProxySpatialTileTreeReferences]] until asynchronous loading completes.\n// It provides a TileTreeOwner that never loads a tile tree.\n// This ensures that [ViewState.areAllTileTreesLoaded]($frontend) will not return `true` while we are loading.\nclass ProxyTileTreeReference extends TileTreeReference {\n private readonly _treeOwner: TileTreeOwner;\n\n public constructor(iModel: IModelConnection) {\n super();\n this._treeOwner = {\n iModel,\n tileTree: undefined,\n loadStatus: TileTreeLoadStatus.NotLoaded,\n load: () => undefined,\n dispose: () => { },\n loadTree: async () => Promise.resolve(undefined),\n };\n }\n\n public override get treeOwner() {\n return this._treeOwner;\n }\n\n // eslint-disable-next-line @typescript-eslint/naming-convention\n public override get _isLoadingComplete() {\n return false;\n }\n}\n\n// Serves as a placeholder while we asynchronously obtain the base URL for a pre-published tileset (or asynchronously determine\n// that no such tileset exists).\nclass ProxySpatialTileTreeReferences implements SpatialTileTreeReferences {\n // Once async loading completes, all methods will be forwarded to this implementation.\n private _impl?: SpatialTileTreeReferences;\n private readonly _proxyRef: ProxyTileTreeReference;\n // Retained if attachToViewport is called while we are still loading; and reset if detachFromViewport is called while loading.\n private _attachArgs?: AttachToViewportArgs;\n\n public constructor(view: SpatialViewState, getBaseUrl: Promise<URL | undefined>) {\n this._proxyRef = new ProxyTileTreeReference(view.iModel);\n getBaseUrl.then((url: URL | undefined) => {\n if (url) {\n const ref = BatchedTileTreeReference.create(view, url);\n this.setTreeRefs(new BatchedSpatialTileTreeReferences(ref));\n } else {\n this.setTreeRefs(createFallbackSpatialTileTreeReferences(view));\n }\n }).catch(() => {\n this.setTreeRefs(createFallbackSpatialTileTreeReferences(view));\n });\n }\n\n private setTreeRefs(refs: SpatialTileTreeReferences): void {\n this._impl = refs;\n if (this._attachArgs) {\n this._impl.attachToViewport(this._attachArgs);\n this._attachArgs.invalidateSymbologyOverrides();\n this._attachArgs = undefined;\n }\n }\n\n public update(): void {\n this._impl?.update();\n }\n\n public attachToViewport(args: AttachToViewportArgs): void {\n if (this._impl)\n this._impl.attachToViewport(args);\n else\n this._attachArgs = args;\n }\n\n public detachFromViewport(): void {\n if (this._impl)\n this._impl.detachFromViewport();\n else\n this._attachArgs = undefined;\n }\n\n public setDeactivated(): void { }\n\n public *[Symbol.iterator](): Iterator<TileTreeReference> {\n if (this._impl) {\n for (const ref of this._impl)\n yield ref;\n } else {\n yield this._proxyRef;\n }\n }\n}\n\nconst iModelToBaseUrl = new Map<IModelConnection, URL | null | Promise<URL | undefined>>();\n\n/** @internal */\nexport function createBatchedSpatialTileTreeReferences(view: SpatialViewState, computeBaseUrl: ComputeSpatialTilesetBaseUrl): SpatialTileTreeReferences {\n const iModel = view.iModel;\n let entry = iModelToBaseUrl.get(iModel);\n if (undefined === entry) {\n const promise = computeBaseUrl(iModel);\n iModelToBaseUrl.set(iModel, entry = promise);\n iModel.onClose.addOnce(() => iModelToBaseUrl.delete(iModel));\n promise.then((url: URL | undefined) => {\n if (iModelToBaseUrl.has(iModel))\n iModelToBaseUrl.set(iModel, url ?? null);\n }).catch(() => {\n if (iModelToBaseUrl.has(iModel))\n iModelToBaseUrl.set(iModel, null);\n });\n }\n\n if (null === entry) {\n // No tileset exists for this iModel - use default tile generation instead.\n return createFallbackSpatialTileTreeReferences(view);\n }\n\n if (entry instanceof Promise)\n return new ProxySpatialTileTreeReferences(view, entry);\n\n const ref = BatchedTileTreeReference.create(view, entry);\n return new BatchedSpatialTileTreeReferences(ref);\n}\n"]}
1
+ {"version":3,"file":"BatchedSpatialTileTreeRefs.js","sourceRoot":"","sources":["../../src/BatchedSpatialTileTreeRefs.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\nimport { assert } from \"@itwin/core-bentley\";\r\nimport { RenderSchedule } from \"@itwin/core-common\";\r\nimport {\r\n AttachToViewportArgs, IModelConnection, SpatialTileTreeReferences, SpatialViewState, TileTreeLoadStatus, TileTreeOwner, TileTreeReference,\r\n} from \"@itwin/core-frontend\";\r\nimport { AnimatedBatchedTileTreeReference, PrimaryBatchedTileTreeReference } from \"./BatchedTileTreeReference\";\r\nimport { getBatchedTileTreeOwner } from \"./BatchedTileTreeSupplier\";\r\nimport { BatchedModels } from \"./BatchedModels\";\r\nimport { ComputeSpatialTilesetBaseUrl, createFallbackSpatialTileTreeReferences } from \"./FrontendTiles\";\r\n\r\n// Obtains tiles pre-published by mesh export service.\r\nclass BatchedSpatialTileTreeReferences implements SpatialTileTreeReferences {\r\n private readonly _view: SpatialViewState;\r\n private readonly _models: BatchedModels;\r\n private _currentScript?: RenderSchedule.Script;\r\n private _primaryRef!: PrimaryBatchedTileTreeReference;\r\n private readonly _animatedRefs: AnimatedBatchedTileTreeReference[] = [];\r\n private _onModelSelectorChanged?: () => void;\r\n\r\n public constructor(baseUrl: URL, view: SpatialViewState) {\r\n this._view = view;\r\n this._models = new BatchedModels(view);\r\n\r\n const script = view.displayStyle.scheduleScript;\r\n this._currentScript = script?.requiresBatching ? script : undefined;\r\n\r\n this.load(baseUrl, view.iModel);\r\n\r\n assert(undefined !== this._primaryRef);\r\n }\r\n\r\n private load(baseUrl: URL, iModel: IModelConnection): void {\r\n const treeOwner = getBatchedTileTreeOwner(iModel, { baseUrl, script: this._currentScript });\r\n this._primaryRef = new PrimaryBatchedTileTreeReference(treeOwner, this._models);\r\n\r\n this.populateAnimatedReferences(treeOwner);\r\n\r\n const onScriptChanged = (newScript: RenderSchedule.Script | undefined) => {\r\n if (!newScript?.requiresBatching)\r\n newScript = undefined;\r\n\r\n const currentScript = this._currentScript;\r\n this._currentScript = newScript;\r\n\r\n if (newScript !== currentScript)\r\n if (!newScript || !currentScript || !newScript.equals(currentScript))\r\n this.load(baseUrl, iModel);\r\n };\r\n\r\n let removeScriptChangedListener = this._view.displayStyle.onScheduleScriptChanged.addListener((newScript) => onScriptChanged(newScript));\r\n this._view.onDisplayStyleChanged.addListener((newStyle) => {\r\n removeScriptChangedListener();\r\n onScriptChanged(newStyle.scheduleScript);\r\n removeScriptChangedListener = this._view.displayStyle.onScheduleScriptChanged.addListener((newScript) => onScriptChanged(newScript));\r\n });\r\n }\r\n\r\n public *[Symbol.iterator](): Iterator<TileTreeReference> {\r\n yield this._primaryRef;\r\n\r\n for (const animatedRef of this._animatedRefs)\r\n yield animatedRef;\r\n }\r\n\r\n private populateAnimatedReferences(treeOwner: TileTreeOwner): void {\r\n this._animatedRefs.length = 0;\r\n const script = this._currentScript;\r\n if (!script)\r\n return;\r\n\r\n const getCurrentTimePoint = () => this._view.displayStyle.settings.timePoint ?? script.duration.low;\r\n for (const timeline of script.modelTimelines) {\r\n const nodeIds = timeline.transformBatchIds;\r\n for (const nodeId of nodeIds) {\r\n this._animatedRefs.push(new AnimatedBatchedTileTreeReference(treeOwner, {\r\n timeline,\r\n nodeId,\r\n getCurrentTimePoint,\r\n }));\r\n }\r\n }\r\n }\r\n\r\n public update(): void {\r\n this._models.setViewedModels(this._view.modelSelector.models);\r\n if (this._onModelSelectorChanged)\r\n this._onModelSelectorChanged();\r\n }\r\n\r\n public attachToViewport(args: AttachToViewportArgs): void {\r\n this._onModelSelectorChanged = () => args.invalidateSymbologyOverrides();\r\n }\r\n\r\n public detachFromViewport(): void {\r\n this._onModelSelectorChanged = undefined;\r\n }\r\n\r\n public setDeactivated(): void {\r\n // Used for debugging. Unimplemented here.\r\n }\r\n}\r\n\r\n// A placeholder used by [[ProxySpatialTileTreeReferences]] until asynchronous loading completes.\r\n// It provides a TileTreeOwner that never loads a tile tree.\r\n// This ensures that [ViewState.areAllTileTreesLoaded]($frontend) will not return `true` while we are loading.\r\nclass ProxyTileTreeReference extends TileTreeReference {\r\n private readonly _treeOwner: TileTreeOwner;\r\n\r\n public constructor(iModel: IModelConnection) {\r\n super();\r\n this._treeOwner = {\r\n iModel,\r\n tileTree: undefined,\r\n loadStatus: TileTreeLoadStatus.NotLoaded,\r\n load: () => undefined,\r\n dispose: () => { },\r\n loadTree: async () => Promise.resolve(undefined),\r\n };\r\n }\r\n\r\n public override get treeOwner() {\r\n return this._treeOwner;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public override get _isLoadingComplete() {\r\n return false;\r\n }\r\n}\r\n\r\n// Serves as a placeholder while we asynchronously obtain the base URL for a pre-published tileset (or asynchronously determine\r\n// that no such tileset exists).\r\nclass ProxySpatialTileTreeReferences implements SpatialTileTreeReferences {\r\n // Once async loading completes, all methods will be forwarded to this implementation.\r\n private _impl?: SpatialTileTreeReferences;\r\n private readonly _proxyRef: ProxyTileTreeReference;\r\n // Retained if attachToViewport is called while we are still loading; and reset if detachFromViewport is called while loading.\r\n private _attachArgs?: AttachToViewportArgs;\r\n\r\n public constructor(view: SpatialViewState, getBaseUrl: Promise<URL | undefined>) {\r\n this._proxyRef = new ProxyTileTreeReference(view.iModel);\r\n getBaseUrl.then((url: URL | undefined) => {\r\n if (url) {\r\n this.setTreeRefs(new BatchedSpatialTileTreeReferences(url, view));\r\n } else {\r\n this.setTreeRefs(createFallbackSpatialTileTreeReferences(view));\r\n }\r\n }).catch(() => {\r\n this.setTreeRefs(createFallbackSpatialTileTreeReferences(view));\r\n });\r\n }\r\n\r\n private setTreeRefs(refs: SpatialTileTreeReferences): void {\r\n this._impl = refs;\r\n if (this._attachArgs) {\r\n this._impl.attachToViewport(this._attachArgs);\r\n this._attachArgs.invalidateSymbologyOverrides();\r\n this._attachArgs = undefined;\r\n }\r\n }\r\n\r\n public update(): void {\r\n this._impl?.update();\r\n }\r\n\r\n public attachToViewport(args: AttachToViewportArgs): void {\r\n if (this._impl)\r\n this._impl.attachToViewport(args);\r\n else\r\n this._attachArgs = args;\r\n }\r\n\r\n public detachFromViewport(): void {\r\n if (this._impl)\r\n this._impl.detachFromViewport();\r\n else\r\n this._attachArgs = undefined;\r\n }\r\n\r\n public setDeactivated(): void { }\r\n\r\n public *[Symbol.iterator](): Iterator<TileTreeReference> {\r\n if (this._impl) {\r\n for (const ref of this._impl)\r\n yield ref;\r\n } else {\r\n yield this._proxyRef;\r\n }\r\n }\r\n}\r\n\r\nconst iModelToBaseUrl = new Map<IModelConnection, URL | null | Promise<URL | undefined>>();\r\n\r\n/** @internal */\r\nexport function createBatchedSpatialTileTreeReferences(view: SpatialViewState, computeBaseUrl: ComputeSpatialTilesetBaseUrl): SpatialTileTreeReferences {\r\n const iModel = view.iModel;\r\n let entry = iModelToBaseUrl.get(iModel);\r\n if (undefined === entry) {\r\n const promise = computeBaseUrl(iModel);\r\n iModelToBaseUrl.set(iModel, entry = promise);\r\n iModel.onClose.addOnce(() => iModelToBaseUrl.delete(iModel));\r\n promise.then((url: URL | undefined) => {\r\n if (iModelToBaseUrl.has(iModel))\r\n iModelToBaseUrl.set(iModel, url ?? null);\r\n }).catch(() => {\r\n if (iModelToBaseUrl.has(iModel))\r\n iModelToBaseUrl.set(iModel, null);\r\n });\r\n }\r\n\r\n if (null === entry) {\r\n // No tileset exists for this iModel - use default tile generation instead.\r\n return createFallbackSpatialTileTreeReferences(view);\r\n }\r\n\r\n if (entry instanceof Promise)\r\n return new ProxySpatialTileTreeReferences(view, entry);\r\n\r\n return new BatchedSpatialTileTreeReferences(entry, view);\r\n}\r\n\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"BatchedTile.d.ts","sourceRoot":"","sources":["../../src/BatchedTile.ts"],"names":[],"mappings":"AAKA,OAAO,EAAU,WAAW,EAAsB,MAAM,qBAAqB,CAAC;AAC9E,OAAO,EAAY,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EACY,cAAc,EAA4C,YAAY,EAAE,IAAI,EAAE,iBAAiB,EAAE,WAAW,EAC7H,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,kBAAkB,EAAsB,QAAQ,EAAkB,QAAQ,EAClH,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAIpD,gBAAgB;AAChB,MAAM,WAAW,iBAAkB,SAAQ,UAAU;IACnD,aAAa,EAAE,eAAe,CAAC,IAAI,EAAE,GAAG,SAAS,CAAC;CACnD;AAID,gBAAgB;AAChB,qBAAa,WAAY,SAAQ,IAAI;IACnC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAyB;IACzD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAU;IAEvC,IAAW,WAAW,IAAI,eAAe,CAExC;gBAEkB,MAAM,EAAE,iBAAiB,EAAE,IAAI,EAAE,eAAe;IAgBnE,OAAO,KAAK,gBAAgB,GAE3B;IAEe,mBAAmB,CAAC,SAAS,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,GAAG,MAAM;IAK/F,WAAW,CAAC,QAAQ,EAAE,GAAG,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,0BAA0B,EAAE,WAAW,GAAG,SAAS,GAAG,IAAI;cAoC1G,aAAa,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,GAAG,SAAS,KAAK,IAAI,EAAE,MAAM,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,IAAI;IAqBvH,IAAoB,OAAO,IAAI,kBAAkB,CAOhD;IAEqB,cAAc,CAAC,WAAW,EAAE,MAAM,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC;IAOzE,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,WAAW,CAAC,EAAE,MAAM,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC;cAwCvH,eAAe,CAAC,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,iBAAiB,GAAG,IAAI;IAsBnF,KAAK,CAAC,SAAS,EAAE,WAAW,GAAG,IAAI;CAY3C"}
1
+ {"version":3,"file":"BatchedTile.d.ts","sourceRoot":"","sources":["../../src/BatchedTile.ts"],"names":[],"mappings":"AAKA,OAAO,EAAU,WAAW,EAAsB,MAAM,qBAAqB,CAAC;AAC9E,OAAO,EAAY,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EACY,cAAc,EAA4C,YAAY,EAAE,IAAI,EAAE,iBAAiB,EAAE,WAAW,EAC7H,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,kBAAkB,EAAsB,QAAQ,EAAkB,QAAQ,EAClH,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAIpD,gBAAgB;AAChB,MAAM,WAAW,iBAAkB,SAAQ,UAAU;IACnD,aAAa,EAAE,eAAe,CAAC,IAAI,EAAE,GAAG,SAAS,CAAC;CACnD;AAID,gBAAgB;AAChB,qBAAa,WAAY,SAAQ,IAAI;IACnC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAyB;IACzD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAU;IAEvC,IAAW,WAAW,IAAI,eAAe,CAExC;gBAEkB,MAAM,EAAE,iBAAiB,EAAE,IAAI,EAAE,eAAe;IAgBnE,OAAO,KAAK,gBAAgB,GAE3B;IAEe,mBAAmB,CAAC,SAAS,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,GAAG,MAAM;IAK/F,WAAW,CAAC,QAAQ,EAAE,GAAG,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,YAAY,EAAE,0BAA0B,EAAE,WAAW,GAAG,SAAS,GAAG,IAAI;cAoC1G,aAAa,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,GAAG,SAAS,KAAK,IAAI,EAAE,MAAM,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,IAAI;IAqBvH,IAAoB,OAAO,IAAI,kBAAkB,CAOhD;IAEqB,cAAc,CAAC,WAAW,EAAE,MAAM,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC;IAOzE,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,WAAW,CAAC,EAAE,MAAM,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC;cAyCvH,eAAe,CAAC,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,iBAAiB,GAAG,IAAI;IAsBnF,KAAK,CAAC,SAAS,EAAE,WAAW,GAAG,IAAI;CAY3C"}
@@ -11,12 +11,14 @@ import { getMaxLevelsToSkip } from "./FrontendTiles";
11
11
  let channel;
12
12
  /** @internal */
13
13
  export class BatchedTile extends Tile {
14
+ get batchedTree() {
15
+ return this.tree;
16
+ }
14
17
  constructor(params, tree) {
15
- var _a;
16
18
  super(params, tree);
17
19
  // The root tile never has content, so it doesn't count toward max levels to skip.
18
20
  this._unskippable = 0 === (this.depth % getMaxLevelsToSkip());
19
- if ((_a = params.childrenProps) === null || _a === void 0 ? void 0 : _a.length)
21
+ if (params.childrenProps?.length)
20
22
  this._childrenProps = params.childrenProps;
21
23
  if (!this.contentId) {
22
24
  this.setIsReady();
@@ -24,9 +26,6 @@ export class BatchedTile extends Tile {
24
26
  this._maximumSize = 0;
25
27
  }
26
28
  }
27
- get batchedTree() {
28
- return this.tree;
29
- }
30
29
  get _batchedChildren() {
31
30
  return this.children;
32
31
  }
@@ -70,7 +69,7 @@ export class BatchedTile extends Tile {
70
69
  for (const childProps of this._childrenProps) {
71
70
  const params = this.batchedTree.reader.readTileParams(childProps, this);
72
71
  const child = new BatchedTile(params, this.batchedTree);
73
- children = children !== null && children !== void 0 ? children : [];
72
+ children = children ?? [];
74
73
  children.push(child);
75
74
  }
76
75
  }
@@ -108,6 +107,7 @@ export class BatchedTile extends Tile {
108
107
  isLeaf: this.isLeaf,
109
108
  system,
110
109
  isCanceled: shouldAbort,
110
+ timeline: this.batchedTree.scheduleScript,
111
111
  options: {
112
112
  tileId: this.contentId,
113
113
  },
@@ -1 +1 @@
1
- {"version":3,"file":"BatchedTile.js","sourceRoot":"","sources":["../../src/BatchedTile.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\nimport { assert, BeTimePoint, ByteStream, Logger } from \"@itwin/core-bentley\";\nimport { ColorDef, Tileset3dSchema } from \"@itwin/core-common\";\nimport {\n GltfReaderProps, GraphicBuilder, ImdlReader, IModelApp, RealityTileLoader, RenderSystem, Tile, TileBoundingBoxes, TileContent,\n TileDrawArgs, TileParams, TileRequest, TileRequestChannel, TileTreeLoadStatus, TileUser, TileVisibility, Viewport,\n} from \"@itwin/core-frontend\";\nimport { loggerCategory } from \"./LoggerCategory\";\nimport { BatchedTileTree } from \"./BatchedTileTree\";\nimport { BatchedTileContentReader } from \"./BatchedTileContentReader\";\nimport { getMaxLevelsToSkip } from \"./FrontendTiles\";\n\n/** @internal */\nexport interface BatchedTileParams extends TileParams {\n childrenProps: Tileset3dSchema.Tile[] | undefined;\n}\n\nlet channel: TileRequestChannel | undefined;\n\n/** @internal */\nexport class BatchedTile extends Tile {\n private readonly _childrenProps?: Tileset3dSchema.Tile[];\n private readonly _unskippable: boolean;\n\n public get batchedTree(): BatchedTileTree {\n return this.tree as BatchedTileTree;\n }\n\n public constructor(params: BatchedTileParams, tree: BatchedTileTree) {\n super(params, tree);\n\n // The root tile never has content, so it doesn't count toward max levels to skip.\n this._unskippable = 0 === (this.depth % getMaxLevelsToSkip());\n\n if (params.childrenProps?.length)\n this._childrenProps = params.childrenProps;\n\n if (!this.contentId) {\n this.setIsReady();\n // mark \"undisplayable\"\n this._maximumSize = 0;\n }\n }\n\n private get _batchedChildren(): BatchedTile[] | undefined {\n return this.children as BatchedTile[] | undefined;\n }\n\n public override computeLoadPriority(viewports: Iterable<Viewport>, _users: Iterable<TileUser>): number {\n // Prioritize tiles closer to camera and center of attention (zoom point or screen center).\n return RealityTileLoader.computeTileLocationPriority(this, viewports, this.tree.iModelTransform);\n }\n\n public selectTiles(selected: Set<BatchedTile>, args: TileDrawArgs, closestDisplayableAncestor: BatchedTile | undefined): void {\n const vis = this.computeVisibility(args);\n if (TileVisibility.OutsideFrustum === vis)\n return;\n\n if (this._unskippable) {\n // Prevent this tile's content from being unloaded due to memory pressure.\n args.touchedTiles.add(this);\n args.markUsed(this);\n }\n\n closestDisplayableAncestor = this.hasGraphics ? this : closestDisplayableAncestor;\n if (TileVisibility.TooCoarse === vis && (this.isReady || !this._unskippable)) {\n args.markUsed(this);\n args.markReady(this);\n const childrenLoadStatus = this.loadChildren();\n if (TileTreeLoadStatus.Loading === childrenLoadStatus)\n args.markChildrenLoading();\n\n const children = this._batchedChildren;\n if (children) {\n for (const child of children)\n child.selectTiles(selected, args, closestDisplayableAncestor);\n\n return;\n }\n }\n\n // We want to display this tile. Request its content if not already loaded.\n if ((TileVisibility.Visible === vis || this._unskippable) && !this.isReady)\n args.insertMissing(this);\n\n if (closestDisplayableAncestor)\n selected.add(closestDisplayableAncestor);\n }\n\n protected override _loadChildren(resolve: (children: Tile[] | undefined) => void, reject: (error: Error) => void): void {\n let children: BatchedTile[] | undefined;\n if (this._childrenProps) {\n try {\n for (const childProps of this._childrenProps) {\n const params = this.batchedTree.reader.readTileParams(childProps, this);\n const child = new BatchedTile(params, this.batchedTree);\n children = children ?? [];\n children.push(child);\n }\n } catch (err) {\n Logger.logException(loggerCategory, err);\n children = undefined;\n if (err instanceof Error)\n reject(err);\n }\n }\n\n resolve(children);\n }\n\n public override get channel(): TileRequestChannel {\n if (!channel) {\n channel = new TileRequestChannel(\"itwinjs-batched-models\", 20);\n IModelApp.tileAdmin.channels.add(channel);\n }\n\n return channel;\n }\n\n public override async requestContent(_isCanceled: () => boolean): Promise<TileRequest.Response> {\n const url = new URL(this.contentId, this.batchedTree.reader.baseUrl);\n url.search = this.batchedTree.reader.baseUrl.search;\n const response = await fetch(url.toString());\n return response.arrayBuffer();\n }\n\n public override async readContent(data: TileRequest.ResponseData, system: RenderSystem, shouldAbort?: () => boolean): Promise<TileContent> {\n assert(data instanceof Uint8Array);\n if (!(data instanceof Uint8Array))\n return { };\n\n let reader: ImdlReader | BatchedTileContentReader | undefined = ImdlReader.create({\n stream: ByteStream.fromUint8Array(data),\n iModel: this.tree.iModel,\n modelId: this.tree.modelId,\n is3d: true,\n isLeaf: this.isLeaf,\n system,\n isCanceled: shouldAbort,\n options: {\n tileId: this.contentId,\n },\n });\n\n if (!reader) {\n const gltfProps = GltfReaderProps.create(data, false, this.batchedTree.reader.baseUrl);\n if (gltfProps) {\n reader = new BatchedTileContentReader({\n props: gltfProps,\n iModel: this.tree.iModel,\n system,\n shouldAbort,\n vertexTableRequired: true,\n modelId: this.tree.modelId,\n isLeaf: this.isLeaf,\n range: this.range,\n });\n }\n }\n\n if (!reader)\n return { };\n\n return reader.read();\n }\n\n protected override addRangeGraphic(builder: GraphicBuilder, type: TileBoundingBoxes): void {\n if (TileBoundingBoxes.ChildVolumes !== type) {\n super.addRangeGraphic(builder, type);\n return;\n }\n\n builder.setSymbology(ColorDef.green, ColorDef.green, 2);\n builder.addRangeBox(this.range);\n\n this.loadChildren();\n const children = this.children;\n if (!children)\n return;\n\n builder.setSymbology(ColorDef.blue, ColorDef.blue.withTransparency(0xdf), 1);\n for (const child of children) {\n const range = child.range;\n builder.addRangeBox(range);\n builder.addRangeBox(range, true);\n }\n }\n\n public prune(olderThan: BeTimePoint): void {\n const children = this._batchedChildren;\n if (!children)\n return;\n\n if (this.usageMarker.isExpired(olderThan)) {\n this.disposeChildren();\n } else {\n for (const child of children)\n child.prune(olderThan);\n }\n }\n}\n"]}
1
+ {"version":3,"file":"BatchedTile.js","sourceRoot":"","sources":["../../src/BatchedTile.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\nimport { assert, BeTimePoint, ByteStream, Logger } from \"@itwin/core-bentley\";\r\nimport { ColorDef, Tileset3dSchema } from \"@itwin/core-common\";\r\nimport {\r\n GltfReaderProps, GraphicBuilder, ImdlReader, IModelApp, RealityTileLoader, RenderSystem, Tile, TileBoundingBoxes, TileContent,\r\n TileDrawArgs, TileParams, TileRequest, TileRequestChannel, TileTreeLoadStatus, TileUser, TileVisibility, Viewport,\r\n} from \"@itwin/core-frontend\";\r\nimport { loggerCategory } from \"./LoggerCategory\";\r\nimport { BatchedTileTree } from \"./BatchedTileTree\";\r\nimport { BatchedTileContentReader } from \"./BatchedTileContentReader\";\r\nimport { getMaxLevelsToSkip } from \"./FrontendTiles\";\r\n\r\n/** @internal */\r\nexport interface BatchedTileParams extends TileParams {\r\n childrenProps: Tileset3dSchema.Tile[] | undefined;\r\n}\r\n\r\nlet channel: TileRequestChannel | undefined;\r\n\r\n/** @internal */\r\nexport class BatchedTile extends Tile {\r\n private readonly _childrenProps?: Tileset3dSchema.Tile[];\r\n private readonly _unskippable: boolean;\r\n\r\n public get batchedTree(): BatchedTileTree {\r\n return this.tree as BatchedTileTree;\r\n }\r\n\r\n public constructor(params: BatchedTileParams, tree: BatchedTileTree) {\r\n super(params, tree);\r\n\r\n // The root tile never has content, so it doesn't count toward max levels to skip.\r\n this._unskippable = 0 === (this.depth % getMaxLevelsToSkip());\r\n\r\n if (params.childrenProps?.length)\r\n this._childrenProps = params.childrenProps;\r\n\r\n if (!this.contentId) {\r\n this.setIsReady();\r\n // mark \"undisplayable\"\r\n this._maximumSize = 0;\r\n }\r\n }\r\n\r\n private get _batchedChildren(): BatchedTile[] | undefined {\r\n return this.children as BatchedTile[] | undefined;\r\n }\r\n\r\n public override computeLoadPriority(viewports: Iterable<Viewport>, _users: Iterable<TileUser>): number {\r\n // Prioritize tiles closer to camera and center of attention (zoom point or screen center).\r\n return RealityTileLoader.computeTileLocationPriority(this, viewports, this.tree.iModelTransform);\r\n }\r\n\r\n public selectTiles(selected: Set<BatchedTile>, args: TileDrawArgs, closestDisplayableAncestor: BatchedTile | undefined): void {\r\n const vis = this.computeVisibility(args);\r\n if (TileVisibility.OutsideFrustum === vis)\r\n return;\r\n\r\n if (this._unskippable) {\r\n // Prevent this tile's content from being unloaded due to memory pressure.\r\n args.touchedTiles.add(this);\r\n args.markUsed(this);\r\n }\r\n\r\n closestDisplayableAncestor = this.hasGraphics ? this : closestDisplayableAncestor;\r\n if (TileVisibility.TooCoarse === vis && (this.isReady || !this._unskippable)) {\r\n args.markUsed(this);\r\n args.markReady(this);\r\n const childrenLoadStatus = this.loadChildren();\r\n if (TileTreeLoadStatus.Loading === childrenLoadStatus)\r\n args.markChildrenLoading();\r\n\r\n const children = this._batchedChildren;\r\n if (children) {\r\n for (const child of children)\r\n child.selectTiles(selected, args, closestDisplayableAncestor);\r\n\r\n return;\r\n }\r\n }\r\n\r\n // We want to display this tile. Request its content if not already loaded.\r\n if ((TileVisibility.Visible === vis || this._unskippable) && !this.isReady)\r\n args.insertMissing(this);\r\n\r\n if (closestDisplayableAncestor)\r\n selected.add(closestDisplayableAncestor);\r\n }\r\n\r\n protected override _loadChildren(resolve: (children: Tile[] | undefined) => void, reject: (error: Error) => void): void {\r\n let children: BatchedTile[] | undefined;\r\n if (this._childrenProps) {\r\n try {\r\n for (const childProps of this._childrenProps) {\r\n const params = this.batchedTree.reader.readTileParams(childProps, this);\r\n const child = new BatchedTile(params, this.batchedTree);\r\n children = children ?? [];\r\n children.push(child);\r\n }\r\n } catch (err) {\r\n Logger.logException(loggerCategory, err);\r\n children = undefined;\r\n if (err instanceof Error)\r\n reject(err);\r\n }\r\n }\r\n\r\n resolve(children);\r\n }\r\n\r\n public override get channel(): TileRequestChannel {\r\n if (!channel) {\r\n channel = new TileRequestChannel(\"itwinjs-batched-models\", 20);\r\n IModelApp.tileAdmin.channels.add(channel);\r\n }\r\n\r\n return channel;\r\n }\r\n\r\n public override async requestContent(_isCanceled: () => boolean): Promise<TileRequest.Response> {\r\n const url = new URL(this.contentId, this.batchedTree.reader.baseUrl);\r\n url.search = this.batchedTree.reader.baseUrl.search;\r\n const response = await fetch(url.toString());\r\n return response.arrayBuffer();\r\n }\r\n\r\n public override async readContent(data: TileRequest.ResponseData, system: RenderSystem, shouldAbort?: () => boolean): Promise<TileContent> {\r\n assert(data instanceof Uint8Array);\r\n if (!(data instanceof Uint8Array))\r\n return { };\r\n\r\n let reader: ImdlReader | BatchedTileContentReader | undefined = ImdlReader.create({\r\n stream: ByteStream.fromUint8Array(data),\r\n iModel: this.tree.iModel,\r\n modelId: this.tree.modelId,\r\n is3d: true,\r\n isLeaf: this.isLeaf,\r\n system,\r\n isCanceled: shouldAbort,\r\n timeline: this.batchedTree.scheduleScript,\r\n options: {\r\n tileId: this.contentId,\r\n },\r\n });\r\n\r\n if (!reader) {\r\n const gltfProps = GltfReaderProps.create(data, false, this.batchedTree.reader.baseUrl);\r\n if (gltfProps) {\r\n reader = new BatchedTileContentReader({\r\n props: gltfProps,\r\n iModel: this.tree.iModel,\r\n system,\r\n shouldAbort,\r\n vertexTableRequired: true,\r\n modelId: this.tree.modelId,\r\n isLeaf: this.isLeaf,\r\n range: this.range,\r\n });\r\n }\r\n }\r\n\r\n if (!reader)\r\n return { };\r\n\r\n return reader.read();\r\n }\r\n\r\n protected override addRangeGraphic(builder: GraphicBuilder, type: TileBoundingBoxes): void {\r\n if (TileBoundingBoxes.ChildVolumes !== type) {\r\n super.addRangeGraphic(builder, type);\r\n return;\r\n }\r\n\r\n builder.setSymbology(ColorDef.green, ColorDef.green, 2);\r\n builder.addRangeBox(this.range);\r\n\r\n this.loadChildren();\r\n const children = this.children;\r\n if (!children)\r\n return;\r\n\r\n builder.setSymbology(ColorDef.blue, ColorDef.blue.withTransparency(0xdf), 1);\r\n for (const child of children) {\r\n const range = child.range;\r\n builder.addRangeBox(range);\r\n builder.addRangeBox(range, true);\r\n }\r\n }\r\n\r\n public prune(olderThan: BeTimePoint): void {\r\n const children = this._batchedChildren;\r\n if (!children)\r\n return;\r\n\r\n if (this.usageMarker.isExpired(olderThan)) {\r\n this.disposeChildren();\r\n } else {\r\n for (const child of children)\r\n child.prune(olderThan);\r\n }\r\n }\r\n}\r\n"]}
@@ -23,21 +23,20 @@ export class BatchedTileContentReader extends GltfReader {
23
23
  return this.readGltfAndCreateGraphics(this._isLeaf, featureTable, this._range);
24
24
  }
25
25
  readFeatureTable() {
26
- var _a, _b, _c, _d;
27
26
  // ###TODO we're just assuming there's one property table with one u64 property containing element Ids.
28
- const tables = (_b = (_a = this._glTF.extensions) === null || _a === void 0 ? void 0 : _a.EXT_structural_metadata) === null || _b === void 0 ? void 0 : _b.propertyTables;
27
+ const tables = this._glTF.extensions?.EXT_structural_metadata?.propertyTables;
29
28
  const table = tables ? tables[0] : undefined;
30
- const elementIdProperty = (table === null || table === void 0 ? void 0 : table.properties) ? table.properties.ElementId : undefined;
29
+ const elementIdProperty = table?.properties ? table.properties.ElementId : undefined;
31
30
  if (!elementIdProperty)
32
31
  return undefined;
33
32
  const bufferView = this._bufferViews[elementIdProperty.values];
34
33
  if (!bufferView || undefined === bufferView.buffer)
35
34
  return undefined;
36
- const bufferData = (_c = this._buffers[bufferView.buffer]) === null || _c === void 0 ? void 0 : _c.resolvedBuffer;
35
+ const bufferData = this._buffers[bufferView.buffer]?.resolvedBuffer;
37
36
  if (!bufferData)
38
37
  return undefined;
39
38
  assert(undefined !== bufferView.byteLength); // required by spec; TypeScript interface is wrong.
40
- const byteOffset = (_d = bufferView.byteOffset) !== null && _d !== void 0 ? _d : 0;
39
+ const byteOffset = bufferView.byteOffset ?? 0;
41
40
  const bytes = bufferData.subarray(byteOffset, byteOffset + bufferView.byteLength);
42
41
  // 2 u32s per element Id.
43
42
  const elementIds = new Uint32Array(bytes.buffer, bytes.byteOffset, bytes.byteLength / 4);
@@ -50,14 +49,13 @@ export class BatchedTileContentReader extends GltfReader {
50
49
  return featureTable;
51
50
  }
52
51
  readPrimitiveFeatures(primitive) {
53
- var _a, _b;
54
- const ext = (_a = primitive.extensions) === null || _a === void 0 ? void 0 : _a.EXT_mesh_features;
52
+ const ext = primitive.extensions?.EXT_mesh_features;
55
53
  if (ext) {
56
54
  // ###TODO making assumptions here.
57
55
  const view = this.getBufferView(primitive.attributes, `_FEATURE_ID_${ext.featureIds[0].attribute}`);
58
56
  // NB: 32-bit integers are not supported, but 8- and 16-bit integers will be converted to them.
59
57
  // With more than 64k features in the tile we represent the Ids as floats instead.
60
- const featureIds = (_b = view === null || view === void 0 ? void 0 : view.toBufferData(GltfDataType.Float)) !== null && _b !== void 0 ? _b : view === null || view === void 0 ? void 0 : view.toBufferData(GltfDataType.UInt32);
58
+ const featureIds = view?.toBufferData(GltfDataType.Float) ?? view?.toBufferData(GltfDataType.UInt32);
61
59
  if (view && featureIds) {
62
60
  const indices = [];
63
61
  for (let i = 0; i < featureIds.count; i++) {
@@ -1 +1 @@
1
- {"version":3,"file":"BatchedTileContentReader.js","sourceRoot":"","sources":["../../src/BatchedTileContentReader.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\nimport { assert, Id64, Id64String } from \"@itwin/core-bentley\";\nimport { Range3d } from \"@itwin/core-geometry\";\nimport { Feature, FeatureTable, TileReadStatus } from \"@itwin/core-common\";\nimport {\n GltfDataType, GltfMeshPrimitive, GltfReader, GltfReaderArgs, GltfReaderResult,\n} from \"@itwin/core-frontend\";\n\ninterface BatchedTileReaderArgs extends GltfReaderArgs {\n modelId: Id64String;\n isLeaf: boolean;\n range: Range3d;\n}\n\n/** Read batched tiles in 3d Tiles 1.1 format. Currently, we prefer to produce tiles in iMdl format, so this goes unused for now.\n * @internal\n */\nexport class BatchedTileContentReader extends GltfReader {\n private readonly _modelId: Id64String;\n private readonly _isLeaf: boolean;\n private readonly _range: Range3d;\n\n public constructor(args: BatchedTileReaderArgs) {\n super(args);\n this._modelId = args.modelId;\n this._isLeaf = args.isLeaf;\n this._range = args.range;\n }\n\n public override async read(): Promise<GltfReaderResult> {\n const featureTable = this.readFeatureTable();\n await this.resolveResources();\n if (this._isCanceled)\n return { readStatus: TileReadStatus.Canceled, isLeaf: this._isLeaf };\n\n return this.readGltfAndCreateGraphics(this._isLeaf, featureTable, this._range);\n }\n\n private readFeatureTable(): FeatureTable | undefined {\n // ###TODO we're just assuming there's one property table with one u64 property containing element Ids.\n const tables = this._glTF.extensions?.EXT_structural_metadata?.propertyTables;\n const table = tables ? tables[0] : undefined;\n const elementIdProperty = table?.properties ? table.properties.ElementId : undefined;\n if (!elementIdProperty)\n return undefined;\n\n const bufferView = this._bufferViews[elementIdProperty.values];\n if (!bufferView || undefined === bufferView.buffer)\n return undefined;\n\n const bufferData = this._buffers[bufferView.buffer]?.resolvedBuffer;\n if (!bufferData)\n return undefined;\n\n assert(undefined !== bufferView.byteLength); // required by spec; TypeScript interface is wrong.\n const byteOffset = bufferView.byteOffset ?? 0;\n const bytes = bufferData.subarray(byteOffset, byteOffset + bufferView.byteLength);\n\n // 2 u32s per element Id.\n const elementIds = new Uint32Array(bytes.buffer, bytes.byteOffset, bytes.byteLength / 4);\n const numFeatures = elementIds.length / 2;\n const featureTable = new FeatureTable(numFeatures, this._modelId);\n for (let i = 0; i < numFeatures; i++) {\n const elementId = Id64.fromUint32Pair(elementIds[i * 2], elementIds[i * 2 + 1]);\n featureTable.insertWithIndex(new Feature(elementId), i);\n }\n\n return featureTable;\n }\n\n protected override readPrimitiveFeatures(primitive: GltfMeshPrimitive): Feature | number[] | undefined {\n const ext = primitive.extensions?.EXT_mesh_features;\n if (ext) {\n // ###TODO making assumptions here.\n const view = this.getBufferView(primitive.attributes, `_FEATURE_ID_${ext.featureIds[0].attribute}`);\n // NB: 32-bit integers are not supported, but 8- and 16-bit integers will be converted to them.\n // With more than 64k features in the tile we represent the Ids as floats instead.\n const featureIds = view?.toBufferData(GltfDataType.Float) ?? view?.toBufferData(GltfDataType.UInt32);\n if (view && featureIds) {\n const indices = [];\n for (let i = 0; i < featureIds.count; i++) {\n const featureId = featureIds.buffer[i * view.stride];\n indices.push(featureId);\n }\n\n return indices;\n }\n }\n\n return new Feature(this._modelId);\n }\n}\n"]}
1
+ {"version":3,"file":"BatchedTileContentReader.js","sourceRoot":"","sources":["../../src/BatchedTileContentReader.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\nimport { assert, Id64, Id64String } from \"@itwin/core-bentley\";\r\nimport { Range3d } from \"@itwin/core-geometry\";\r\nimport { Feature, FeatureTable, TileReadStatus } from \"@itwin/core-common\";\r\nimport {\r\n GltfDataType, GltfMeshPrimitive, GltfReader, GltfReaderArgs, GltfReaderResult,\r\n} from \"@itwin/core-frontend\";\r\n\r\ninterface BatchedTileReaderArgs extends GltfReaderArgs {\r\n modelId: Id64String;\r\n isLeaf: boolean;\r\n range: Range3d;\r\n}\r\n\r\n/** Read batched tiles in 3d Tiles 1.1 format. Currently, we prefer to produce tiles in iMdl format, so this goes unused for now.\r\n * @internal\r\n */\r\nexport class BatchedTileContentReader extends GltfReader {\r\n private readonly _modelId: Id64String;\r\n private readonly _isLeaf: boolean;\r\n private readonly _range: Range3d;\r\n\r\n public constructor(args: BatchedTileReaderArgs) {\r\n super(args);\r\n this._modelId = args.modelId;\r\n this._isLeaf = args.isLeaf;\r\n this._range = args.range;\r\n }\r\n\r\n public override async read(): Promise<GltfReaderResult> {\r\n const featureTable = this.readFeatureTable();\r\n await this.resolveResources();\r\n if (this._isCanceled)\r\n return { readStatus: TileReadStatus.Canceled, isLeaf: this._isLeaf };\r\n\r\n return this.readGltfAndCreateGraphics(this._isLeaf, featureTable, this._range);\r\n }\r\n\r\n private readFeatureTable(): FeatureTable | undefined {\r\n // ###TODO we're just assuming there's one property table with one u64 property containing element Ids.\r\n const tables = this._glTF.extensions?.EXT_structural_metadata?.propertyTables;\r\n const table = tables ? tables[0] : undefined;\r\n const elementIdProperty = table?.properties ? table.properties.ElementId : undefined;\r\n if (!elementIdProperty)\r\n return undefined;\r\n\r\n const bufferView = this._bufferViews[elementIdProperty.values];\r\n if (!bufferView || undefined === bufferView.buffer)\r\n return undefined;\r\n\r\n const bufferData = this._buffers[bufferView.buffer]?.resolvedBuffer;\r\n if (!bufferData)\r\n return undefined;\r\n\r\n assert(undefined !== bufferView.byteLength); // required by spec; TypeScript interface is wrong.\r\n const byteOffset = bufferView.byteOffset ?? 0;\r\n const bytes = bufferData.subarray(byteOffset, byteOffset + bufferView.byteLength);\r\n\r\n // 2 u32s per element Id.\r\n const elementIds = new Uint32Array(bytes.buffer, bytes.byteOffset, bytes.byteLength / 4);\r\n const numFeatures = elementIds.length / 2;\r\n const featureTable = new FeatureTable(numFeatures, this._modelId);\r\n for (let i = 0; i < numFeatures; i++) {\r\n const elementId = Id64.fromUint32Pair(elementIds[i * 2], elementIds[i * 2 + 1]);\r\n featureTable.insertWithIndex(new Feature(elementId), i);\r\n }\r\n\r\n return featureTable;\r\n }\r\n\r\n protected override readPrimitiveFeatures(primitive: GltfMeshPrimitive): Feature | number[] | undefined {\r\n const ext = primitive.extensions?.EXT_mesh_features;\r\n if (ext) {\r\n // ###TODO making assumptions here.\r\n const view = this.getBufferView(primitive.attributes, `_FEATURE_ID_${ext.featureIds[0].attribute}`);\r\n // NB: 32-bit integers are not supported, but 8- and 16-bit integers will be converted to them.\r\n // With more than 64k features in the tile we represent the Ids as floats instead.\r\n const featureIds = view?.toBufferData(GltfDataType.Float) ?? view?.toBufferData(GltfDataType.UInt32);\r\n if (view && featureIds) {\r\n const indices = [];\r\n for (let i = 0; i < featureIds.count; i++) {\r\n const featureId = featureIds.buffer[i * view.stride];\r\n indices.push(featureId);\r\n }\r\n\r\n return indices;\r\n }\r\n }\r\n\r\n return new Feature(this._modelId);\r\n }\r\n}\r\n"]}
@@ -1,4 +1,4 @@
1
- import { ViewFlagOverrides } from "@itwin/core-common";
1
+ import { RenderSchedule, ViewFlagOverrides } from "@itwin/core-common";
2
2
  import { Tile, TileDrawArgs, TileTree, TileTreeParams } from "@itwin/core-frontend";
3
3
  import { BatchedTile, BatchedTileParams } from "./BatchedTile";
4
4
  import { BatchedTilesetReader } from "./BatchedTilesetReader";
@@ -6,11 +6,13 @@ import { BatchedTilesetReader } from "./BatchedTilesetReader";
6
6
  export interface BatchedTileTreeParams extends TileTreeParams {
7
7
  rootTile: BatchedTileParams;
8
8
  reader: BatchedTilesetReader;
9
+ script?: RenderSchedule.Script;
9
10
  }
10
11
  /** @internal */
11
12
  export declare class BatchedTileTree extends TileTree {
12
13
  private readonly _rootTile;
13
14
  readonly reader: BatchedTilesetReader;
15
+ readonly scheduleScript?: RenderSchedule.Script;
14
16
  constructor(params: BatchedTileTreeParams);
15
17
  get rootTile(): BatchedTile;
16
18
  get is3d(): boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"BatchedTileTree.d.ts","sourceRoot":"","sources":["../../src/BatchedTileTree.ts"],"names":[],"mappings":"AAMA,OAAO,EAAc,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACnE,OAAO,EACL,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,cAAc,EAC7C,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAC/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAE9D,gBAAgB;AAChB,MAAM,WAAW,qBAAsB,SAAQ,cAAc;IAC3D,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,MAAM,EAAE,oBAAoB,CAAC;CAC9B;AAOD,gBAAgB;AAChB,qBAAa,eAAgB,SAAQ,QAAQ;IAC3C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAc;IACxC,SAAgB,MAAM,EAAE,oBAAoB,CAAC;gBAE1B,MAAM,EAAE,qBAAqB;IAMhD,IAAoB,QAAQ,IAAI,WAAW,CAE1C;IAED,IAAoB,IAAI,IAAI,OAAO,CAElC;IAED,IAAoB,QAAQ,IAAI,MAAM,GAAG,SAAS,CAEjD;IAED,IAAoB,iBAAiB,IAAI,iBAAiB,CAEzD;IAGe,YAAY,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,EAAE;IAMxC,IAAI,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI;IAQ9B,KAAK,IAAI,IAAI;CAI9B"}
1
+ {"version":3,"file":"BatchedTileTree.d.ts","sourceRoot":"","sources":["../../src/BatchedTileTree.ts"],"names":[],"mappings":"AAMA,OAAO,EAAc,cAAc,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AACnF,OAAO,EACL,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,cAAc,EAC7C,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAC/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAE9D,gBAAgB;AAChB,MAAM,WAAW,qBAAsB,SAAQ,cAAc;IAC3D,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,MAAM,EAAE,oBAAoB,CAAC;IAC7B,MAAM,CAAC,EAAE,cAAc,CAAC,MAAM,CAAC;CAChC;AAOD,gBAAgB;AAChB,qBAAa,eAAgB,SAAQ,QAAQ;IAC3C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAc;IACxC,SAAgB,MAAM,EAAE,oBAAoB,CAAC;IAC7C,SAAgB,cAAc,CAAC,EAAE,cAAc,CAAC,MAAM,CAAC;gBAEpC,MAAM,EAAE,qBAAqB;IAOhD,IAAoB,QAAQ,IAAI,WAAW,CAE1C;IAED,IAAoB,IAAI,IAAI,OAAO,CAElC;IAED,IAAoB,QAAQ,IAAI,MAAM,GAAG,SAAS,CAEjD;IAED,IAAoB,iBAAiB,IAAI,iBAAiB,CAEzD;IAGe,YAAY,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,EAAE;IAMxC,IAAI,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI;IAQ9B,KAAK,IAAI,IAAI;CAI9B"}
@@ -16,6 +16,7 @@ export class BatchedTileTree extends TileTree {
16
16
  super(params);
17
17
  this._rootTile = new BatchedTile(params.rootTile, this);
18
18
  this.reader = params.reader;
19
+ this.scheduleScript = params.script;
19
20
  }
20
21
  get rootTile() {
21
22
  return this._rootTile;
@@ -1 +1 @@
1
- {"version":3,"file":"BatchedTileTree.js","sourceRoot":"","sources":["../../src/BatchedTileTree.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAE/F,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAqB,MAAM,oBAAoB,CAAC;AACnE,OAAO,EACe,QAAQ,GAC7B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,WAAW,EAAqB,MAAM,eAAe,CAAC;AAS/D,MAAM,iBAAiB,GAAsB;IAC3C,UAAU,EAAE,UAAU,CAAC,WAAW;IAClC,YAAY,EAAE,KAAK;CACpB,CAAC;AAEF,gBAAgB;AAChB,MAAM,OAAO,eAAgB,SAAQ,QAAQ;IAI3C,YAAmB,MAA6B;QAC9C,KAAK,CAAC,MAAM,CAAC,CAAC;QACd,IAAI,CAAC,SAAS,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACxD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IAC9B,CAAC;IAED,IAAoB,QAAQ;QAC1B,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED,IAAoB,IAAI;QACtB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAoB,QAAQ;QAC1B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAoB,iBAAiB;QACnC,OAAO,iBAAiB,CAAC;IAC3B,CAAC;IAED,gEAAgE;IAChD,YAAY,CAAC,IAAkB;QAC7C,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAe,CAAC;QACxC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,QAAQ,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;QACrD,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC9B,CAAC;IAEe,IAAI,CAAC,IAAkB;QACrC,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACrC,KAAK,MAAM,IAAI,IAAI,KAAK;YACtB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QAE1B,IAAI,CAAC,YAAY,EAAE,CAAC;IACtB,CAAC;IAEe,KAAK;QACnB,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC/D,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IACjC,CAAC;CACF","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\nimport { BeTimePoint } from \"@itwin/core-bentley\";\nimport { RenderMode, ViewFlagOverrides } from \"@itwin/core-common\";\nimport {\n Tile, TileDrawArgs, TileTree, TileTreeParams,\n} from \"@itwin/core-frontend\";\nimport { BatchedTile, BatchedTileParams } from \"./BatchedTile\";\nimport { BatchedTilesetReader } from \"./BatchedTilesetReader\";\n\n/** @internal */\nexport interface BatchedTileTreeParams extends TileTreeParams {\n rootTile: BatchedTileParams;\n reader: BatchedTilesetReader;\n}\n\nconst viewFlagOverrides: ViewFlagOverrides = {\n renderMode: RenderMode.SmoothShade,\n visibleEdges: false,\n};\n\n/** @internal */\nexport class BatchedTileTree extends TileTree {\n private readonly _rootTile: BatchedTile;\n public readonly reader: BatchedTilesetReader;\n\n public constructor(params: BatchedTileTreeParams) {\n super(params);\n this._rootTile = new BatchedTile(params.rootTile, this);\n this.reader = params.reader;\n }\n\n public override get rootTile(): BatchedTile {\n return this._rootTile;\n }\n\n public override get is3d(): boolean {\n return true;\n }\n\n public override get maxDepth(): number | undefined {\n return undefined;\n }\n\n public override get viewFlagOverrides(): ViewFlagOverrides {\n return viewFlagOverrides;\n }\n\n // eslint-disable-next-line @typescript-eslint/naming-convention\n public override _selectTiles(args: TileDrawArgs): Tile[] {\n const selected = new Set<BatchedTile>();\n this.rootTile.selectTiles(selected, args, undefined);\n return Array.from(selected);\n }\n\n public override draw(args: TileDrawArgs): void {\n const tiles = this.selectTiles(args);\n for (const tile of tiles)\n tile.drawGraphics(args);\n\n args.drawGraphics();\n }\n\n public override prune(): void {\n const olderThan = BeTimePoint.now().minus(this.expirationTime);\n this.rootTile.prune(olderThan);\n }\n}\n"]}
1
+ {"version":3,"file":"BatchedTileTree.js","sourceRoot":"","sources":["../../src/BatchedTileTree.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAE/F,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAqC,MAAM,oBAAoB,CAAC;AACnF,OAAO,EACe,QAAQ,GAC7B,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,WAAW,EAAqB,MAAM,eAAe,CAAC;AAU/D,MAAM,iBAAiB,GAAsB;IAC3C,UAAU,EAAE,UAAU,CAAC,WAAW;IAClC,YAAY,EAAE,KAAK;CACpB,CAAC;AAEF,gBAAgB;AAChB,MAAM,OAAO,eAAgB,SAAQ,QAAQ;IAK3C,YAAmB,MAA6B;QAC9C,KAAK,CAAC,MAAM,CAAC,CAAC;QACd,IAAI,CAAC,SAAS,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACxD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC5B,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC;IACtC,CAAC;IAED,IAAoB,QAAQ;QAC1B,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED,IAAoB,IAAI;QACtB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAoB,QAAQ;QAC1B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAoB,iBAAiB;QACnC,OAAO,iBAAiB,CAAC;IAC3B,CAAC;IAED,gEAAgE;IAChD,YAAY,CAAC,IAAkB;QAC7C,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAe,CAAC;QACxC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,QAAQ,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;QACrD,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC9B,CAAC;IAEe,IAAI,CAAC,IAAkB;QACrC,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACrC,KAAK,MAAM,IAAI,IAAI,KAAK;YACtB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QAE1B,IAAI,CAAC,YAAY,EAAE,CAAC;IACtB,CAAC;IAEe,KAAK;QACnB,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC/D,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IACjC,CAAC;CACF","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\nimport { BeTimePoint } from \"@itwin/core-bentley\";\r\nimport { RenderMode, RenderSchedule, ViewFlagOverrides } from \"@itwin/core-common\";\r\nimport {\r\n Tile, TileDrawArgs, TileTree, TileTreeParams,\r\n} from \"@itwin/core-frontend\";\r\nimport { BatchedTile, BatchedTileParams } from \"./BatchedTile\";\r\nimport { BatchedTilesetReader } from \"./BatchedTilesetReader\";\r\n\r\n/** @internal */\r\nexport interface BatchedTileTreeParams extends TileTreeParams {\r\n rootTile: BatchedTileParams;\r\n reader: BatchedTilesetReader;\r\n script?: RenderSchedule.Script;\r\n}\r\n\r\nconst viewFlagOverrides: ViewFlagOverrides = {\r\n renderMode: RenderMode.SmoothShade,\r\n visibleEdges: false,\r\n};\r\n\r\n/** @internal */\r\nexport class BatchedTileTree extends TileTree {\r\n private readonly _rootTile: BatchedTile;\r\n public readonly reader: BatchedTilesetReader;\r\n public readonly scheduleScript?: RenderSchedule.Script;\r\n\r\n public constructor(params: BatchedTileTreeParams) {\r\n super(params);\r\n this._rootTile = new BatchedTile(params.rootTile, this);\r\n this.reader = params.reader;\r\n this.scheduleScript = params.script;\r\n }\r\n\r\n public override get rootTile(): BatchedTile {\r\n return this._rootTile;\r\n }\r\n\r\n public override get is3d(): boolean {\r\n return true;\r\n }\r\n\r\n public override get maxDepth(): number | undefined {\r\n return undefined;\r\n }\r\n\r\n public override get viewFlagOverrides(): ViewFlagOverrides {\r\n return viewFlagOverrides;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public override _selectTiles(args: TileDrawArgs): Tile[] {\r\n const selected = new Set<BatchedTile>();\r\n this.rootTile.selectTiles(selected, args, undefined);\r\n return Array.from(selected);\r\n }\r\n\r\n public override draw(args: TileDrawArgs): void {\r\n const tiles = this.selectTiles(args);\r\n for (const tile of tiles)\r\n tile.drawGraphics(args);\r\n\r\n args.drawGraphics();\r\n }\r\n\r\n public override prune(): void {\r\n const olderThan = BeTimePoint.now().minus(this.expirationTime);\r\n this.rootTile.prune(olderThan);\r\n }\r\n}\r\n"]}
@@ -1,22 +1,34 @@
1
- import { Range3d } from "@itwin/core-geometry";
2
- import { BatchType, FeatureAppearance, FeatureAppearanceProvider, FeatureAppearanceSource, GeometryClass } from "@itwin/core-common";
3
- import { AttachToViewportArgs, SpatialViewState, TileTreeOwner, TileTreeReference } from "@itwin/core-frontend";
1
+ import { Range3d, Transform } from "@itwin/core-geometry";
2
+ import { BatchType, FeatureAppearance, FeatureAppearanceProvider, FeatureAppearanceSource, GeometryClass, RenderSchedule } from "@itwin/core-common";
3
+ import { AnimationNodeId, SceneContext, TileDrawArgs, TileTree, TileTreeOwner, TileTreeReference } from "@itwin/core-frontend";
4
+ import { BatchedModels } from "./BatchedModels";
4
5
  /** @internal */
5
- export declare class BatchedTileTreeReference extends TileTreeReference implements FeatureAppearanceProvider {
6
- private readonly _treeOwner;
7
- private readonly _view;
8
- private readonly _viewedModels;
9
- private readonly _modelRanges;
10
- private _modelRangePromise?;
11
- private _onModelSelectorChanged?;
12
- private constructor();
13
- static create(view: SpatialViewState, baseUrl: URL): BatchedTileTreeReference;
6
+ export declare abstract class BatchedTileTreeReference extends TileTreeReference {
7
+ protected readonly _treeOwner: TileTreeOwner;
8
+ protected constructor(treeOwner: TileTreeOwner);
14
9
  get treeOwner(): TileTreeOwner;
15
- attachToViewport(args: AttachToViewportArgs): void;
16
- detachFromViewport(): void;
17
- updateViewedModels(): void;
18
- unionFitRange(union: Range3d): void;
10
+ protected computeBaseTransform(tree: TileTree): Transform;
11
+ protected computeTransform(tree: TileTree): Transform;
12
+ }
13
+ export declare class PrimaryBatchedTileTreeReference extends BatchedTileTreeReference implements FeatureAppearanceProvider {
14
+ private readonly _models;
15
+ constructor(treeOwner: TileTreeOwner, models: BatchedModels);
16
+ unionFitRange(range: Range3d): void;
19
17
  getAppearanceProvider(): FeatureAppearanceProvider | undefined;
20
18
  getFeatureAppearance(source: FeatureAppearanceSource, elemLo: number, elemHi: number, subcatLo: number, subcatHi: number, geomClass: GeometryClass, modelLo: number, modelHi: number, type: BatchType, animationNodeId: number): FeatureAppearance | undefined;
19
+ getAnimationTransformNodeId(): AnimationNodeId;
20
+ }
21
+ export interface AnimationNode {
22
+ readonly timeline: RenderSchedule.ModelTimeline;
23
+ readonly nodeId: number;
24
+ getCurrentTimePoint(): number;
25
+ }
26
+ export declare class AnimatedBatchedTileTreeReference extends BatchedTileTreeReference {
27
+ private readonly _node;
28
+ private readonly _branchId;
29
+ constructor(treeOwner: TileTreeOwner, node: AnimationNode);
30
+ getAnimationTransformNodeId(): number;
31
+ computeBaseTransform(tree: TileTree): Transform;
32
+ createDrawArgs(context: SceneContext): TileDrawArgs | undefined;
21
33
  }
22
34
  //# sourceMappingURL=BatchedTileTreeReference.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"BatchedTileTreeReference.d.ts","sourceRoot":"","sources":["../../src/BatchedTileTreeReference.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAC/C,OAAO,EACL,SAAS,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,uBAAuB,EAAE,aAAa,EAChG,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,oBAAoB,EAAE,gBAAgB,EAAE,aAAa,EAAE,iBAAiB,EACzE,MAAM,sBAAsB,CAAC;AAG9B,gBAAgB;AAChB,qBAAa,wBAAyB,SAAQ,iBAAkB,YAAW,yBAAyB;IAClG,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAgB;IAC3C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAmB;IACzC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAwB;IACtD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAkC;IAC/D,OAAO,CAAC,kBAAkB,CAAC,CAAgB;IAC3C,OAAO,CAAC,uBAAuB,CAAC,CAAa;IAE7C,OAAO;WAMO,MAAM,CAAC,IAAI,EAAE,gBAAgB,EAAE,OAAO,EAAE,GAAG,GAAG,wBAAwB;IAKpF,IAAoB,SAAS,IAAI,aAAa,CAE7C;IAEM,gBAAgB,CAAC,IAAI,EAAE,oBAAoB,GAAG,IAAI;IAKlD,kBAAkB,IAAI,IAAI;IAI1B,kBAAkB,IAAI,IAAI;IAyBjB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IASnC,qBAAqB,IAAI,yBAAyB,GAAG,SAAS;IAIvE,oBAAoB,CACzB,MAAM,EAAE,uBAAuB,EAC/B,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAC9B,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAClC,SAAS,EAAE,aAAa,EACxB,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAChC,IAAI,EAAE,SAAS,EACf,eAAe,EAAE,MAAM,GACtB,iBAAiB,GAAG,SAAS;CAOjC"}
1
+ {"version":3,"file":"BatchedTileTreeReference.d.ts","sourceRoot":"","sources":["../../src/BatchedTileTreeReference.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AAC1D,OAAO,EACL,SAAS,EAAE,iBAAiB,EAAE,yBAAyB,EAAE,uBAAuB,EAAE,aAAa,EAAE,cAAc,EAChH,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EACL,eAAe,EAA2B,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,iBAAiB,EACjH,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD,gBAAgB;AAChB,8BAAsB,wBAAyB,SAAQ,iBAAiB;IACtE,SAAS,CAAC,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAC;IAE7C,SAAS,aAAa,SAAS,EAAE,aAAa;IAK9C,IAAoB,SAAS,IAAI,aAAa,CAE7C;IAED,SAAS,CAAC,oBAAoB,CAAC,IAAI,EAAE,QAAQ,GAAG,SAAS;cAItC,gBAAgB,CAAC,IAAI,EAAE,QAAQ,GAAG,SAAS;CAK/D;AAED,qBAAa,+BAAgC,SAAQ,wBAAyB,YAAW,yBAAyB;IAChH,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAgB;gBAErB,SAAS,EAAE,aAAa,EAAE,MAAM,EAAE,aAAa;IAKlD,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAInC,qBAAqB,IAAI,yBAAyB,GAAG,SAAS;IAIvE,oBAAoB,CACzB,MAAM,EAAE,uBAAuB,EAC/B,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAC9B,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAClC,SAAS,EAAE,aAAa,EACxB,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAChC,IAAI,EAAE,SAAS,EACf,eAAe,EAAE,MAAM,GACtB,iBAAiB,GAAG,SAAS;IAOhB,2BAA2B;CAG5C;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC,aAAa,CAAC;IAChD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,mBAAmB,IAAI,MAAM,CAAC;CAC/B;AAED,qBAAa,gCAAiC,SAAQ,wBAAwB;IAC5E,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAgB;IACtC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEhB,SAAS,EAAE,aAAa,EAAE,IAAI,EAAE,aAAa;IAMhD,2BAA2B,IAAI,MAAM;IAIrC,oBAAoB,CAAC,IAAI,EAAE,QAAQ,GAAG,SAAS;IAS/C,cAAc,CAAC,OAAO,EAAE,YAAY,GAAG,YAAY,GAAG,SAAS;CAShF"}