@itwin/frontend-tiles 4.4.0-dev.9 → 4.4.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/CHANGELOG.md +22 -1
- package/lib/cjs/BatchedModelGroups.d.ts +45 -0
- package/lib/cjs/BatchedModelGroups.d.ts.map +1 -0
- package/lib/cjs/BatchedModelGroups.js +110 -0
- package/lib/cjs/BatchedModelGroups.js.map +1 -0
- package/lib/cjs/BatchedModels.d.ts +2 -3
- package/lib/cjs/BatchedModels.d.ts.map +1 -1
- package/lib/cjs/BatchedModels.js +5 -26
- package/lib/cjs/BatchedModels.js.map +1 -1
- package/lib/cjs/BatchedSpatialTileTreeRefs.d.ts.map +1 -1
- package/lib/cjs/BatchedSpatialTileTreeRefs.js +55 -47
- package/lib/cjs/BatchedSpatialTileTreeRefs.js.map +1 -1
- package/lib/cjs/BatchedTile.d.ts.map +1 -1
- package/lib/cjs/BatchedTile.js +3 -0
- package/lib/cjs/BatchedTile.js.map +1 -1
- package/lib/cjs/BatchedTileContentReader.js.map +1 -1
- package/lib/cjs/BatchedTileTree.d.ts +5 -3
- package/lib/cjs/BatchedTileTree.d.ts.map +1 -1
- package/lib/cjs/BatchedTileTree.js +1 -0
- package/lib/cjs/BatchedTileTree.js.map +1 -1
- package/lib/cjs/BatchedTileTreeReference.d.ts +25 -27
- package/lib/cjs/BatchedTileTreeReference.d.ts.map +1 -1
- package/lib/cjs/BatchedTileTreeReference.js +64 -44
- package/lib/cjs/BatchedTileTreeReference.js.map +1 -1
- package/lib/cjs/BatchedTileTreeSupplier.d.ts +5 -0
- package/lib/cjs/BatchedTileTreeSupplier.d.ts.map +1 -1
- package/lib/cjs/BatchedTileTreeSupplier.js +4 -2
- package/lib/cjs/BatchedTileTreeSupplier.js.map +1 -1
- package/lib/cjs/BatchedTilesetReader.d.ts +29 -12
- package/lib/cjs/BatchedTilesetReader.d.ts.map +1 -1
- package/lib/cjs/BatchedTilesetReader.js +19 -8
- package/lib/cjs/BatchedTilesetReader.js.map +1 -1
- package/lib/cjs/FrontendTiles.js.map +1 -1
- package/lib/cjs/LoggerCategory.js.map +1 -1
- package/lib/cjs/ModelGroup.d.ts +48 -0
- package/lib/cjs/ModelGroup.d.ts.map +1 -0
- package/lib/cjs/ModelGroup.js +89 -0
- package/lib/cjs/ModelGroup.js.map +1 -0
- package/lib/cjs/ModelGroupDisplayTransforms.d.ts +22 -0
- package/lib/cjs/ModelGroupDisplayTransforms.d.ts.map +1 -0
- package/lib/cjs/ModelGroupDisplayTransforms.js +62 -0
- package/lib/cjs/ModelGroupDisplayTransforms.js.map +1 -0
- package/lib/cjs/frontend-tiles.js.map +1 -1
- package/lib/esm/BatchedModelGroups.d.ts +45 -0
- package/lib/esm/BatchedModelGroups.d.ts.map +1 -0
- package/lib/esm/BatchedModelGroups.js +106 -0
- package/lib/esm/BatchedModelGroups.js.map +1 -0
- package/lib/esm/BatchedModels.d.ts +2 -3
- package/lib/esm/BatchedModels.d.ts.map +1 -1
- package/lib/esm/BatchedModels.js +5 -26
- package/lib/esm/BatchedModels.js.map +1 -1
- package/lib/esm/BatchedSpatialTileTreeRefs.d.ts.map +1 -1
- package/lib/esm/BatchedSpatialTileTreeRefs.js +58 -50
- package/lib/esm/BatchedSpatialTileTreeRefs.js.map +1 -1
- package/lib/esm/BatchedTile.d.ts.map +1 -1
- package/lib/esm/BatchedTile.js +3 -0
- package/lib/esm/BatchedTile.js.map +1 -1
- package/lib/esm/BatchedTileContentReader.js.map +1 -1
- package/lib/esm/BatchedTileTree.d.ts +5 -3
- package/lib/esm/BatchedTileTree.d.ts.map +1 -1
- package/lib/esm/BatchedTileTree.js +1 -0
- package/lib/esm/BatchedTileTree.js.map +1 -1
- package/lib/esm/BatchedTileTreeReference.d.ts +25 -27
- package/lib/esm/BatchedTileTreeReference.d.ts.map +1 -1
- package/lib/esm/BatchedTileTreeReference.js +63 -41
- package/lib/esm/BatchedTileTreeReference.js.map +1 -1
- package/lib/esm/BatchedTileTreeSupplier.d.ts +5 -0
- package/lib/esm/BatchedTileTreeSupplier.d.ts.map +1 -1
- package/lib/esm/BatchedTileTreeSupplier.js +5 -3
- package/lib/esm/BatchedTileTreeSupplier.js.map +1 -1
- package/lib/esm/BatchedTilesetReader.d.ts +29 -12
- package/lib/esm/BatchedTilesetReader.d.ts.map +1 -1
- package/lib/esm/BatchedTilesetReader.js +19 -8
- package/lib/esm/BatchedTilesetReader.js.map +1 -1
- package/lib/esm/FrontendTiles.js.map +1 -1
- package/lib/esm/LoggerCategory.js.map +1 -1
- package/lib/esm/ModelGroup.d.ts +48 -0
- package/lib/esm/ModelGroup.d.ts.map +1 -0
- package/lib/esm/ModelGroup.js +85 -0
- package/lib/esm/ModelGroup.js.map +1 -0
- package/lib/esm/ModelGroupDisplayTransforms.d.ts +22 -0
- package/lib/esm/ModelGroupDisplayTransforms.d.ts.map +1 -0
- package/lib/esm/ModelGroupDisplayTransforms.js +58 -0
- package/lib/esm/ModelGroupDisplayTransforms.js.map +1 -0
- package/lib/esm/frontend-tiles.js.map +1 -1
- package/package.json +13 -14
package/CHANGELOG.md
CHANGED
|
@@ -1,6 +1,27 @@
|
|
|
1
1
|
# Change Log - @itwin/frontend-tiles
|
|
2
2
|
|
|
3
|
-
This log was last generated on
|
|
3
|
+
This log was last generated on Fri, 16 Feb 2024 14:17:48 GMT and should not be manually modified.
|
|
4
|
+
|
|
5
|
+
## 4.4.1
|
|
6
|
+
Fri, 16 Feb 2024 14:17:48 GMT
|
|
7
|
+
|
|
8
|
+
_Version update only_
|
|
9
|
+
|
|
10
|
+
## 4.4.0
|
|
11
|
+
Mon, 12 Feb 2024 18:15:58 GMT
|
|
12
|
+
|
|
13
|
+
### Updates
|
|
14
|
+
|
|
15
|
+
- Add support for a transform on leaf tiles.
|
|
16
|
+
- Support nested tile transforms.
|
|
17
|
+
- Add support for per-model display settings including plan projections, display transforms, view flag overrides, and model clip groups.
|
|
18
|
+
- Fix attached reality models not displaying with batched tiles.
|
|
19
|
+
- Fix failure to display private, template, or reality models.
|
|
20
|
+
|
|
21
|
+
## 4.3.3
|
|
22
|
+
Wed, 03 Jan 2024 19:28:38 GMT
|
|
23
|
+
|
|
24
|
+
_Version update only_
|
|
4
25
|
|
|
5
26
|
## 4.3.2
|
|
6
27
|
Thu, 14 Dec 2023 20:23:02 GMT
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { ModelGroupDisplayTransforms } from "./ModelGroupDisplayTransforms";
|
|
2
|
+
import { ModelGroup, ModelGroupingContext } from "./ModelGroup";
|
|
3
|
+
import { RenderClipVolume, SpatialViewState } from "@itwin/core-frontend";
|
|
4
|
+
import { Id64Set, Id64String } from "@itwin/core-bentley";
|
|
5
|
+
import { PlanProjectionSettings, RenderSchedule, ViewFlagOverrides } from "@itwin/core-common";
|
|
6
|
+
import { ModelMetadata } from "./BatchedTilesetReader";
|
|
7
|
+
/** Groups the set of spatial models included in a [[BatchedSpatialTileTreeReferences]] based on their display settings.
|
|
8
|
+
* This ensures that models are displayed correctly, while using batching to reduce the number of draw calls to a minimum.
|
|
9
|
+
* The groupings are re-evaluated only when there's a possibility that they may have changed (e.g., if the view's plan projection settings or model clip groups were modified).
|
|
10
|
+
* Unfortunately, there is currently no way to know when the transforms supplied by a [ModelDisplayTransformProvider]($frontend) may have changed, so
|
|
11
|
+
* display transforms are re-evaluated every time the Viewport's scene is invalidated. This may (but usually won't) affect the groupings.
|
|
12
|
+
* The BatchedSpatialTileTreeReferences object allocates new [[BatchedTileTreeReferences]] whenever the groupings change.
|
|
13
|
+
* @internal
|
|
14
|
+
*/
|
|
15
|
+
export declare class BatchedModelGroups implements ModelGroupingContext {
|
|
16
|
+
private readonly _view;
|
|
17
|
+
private readonly _includedModelIds;
|
|
18
|
+
private readonly _metadata;
|
|
19
|
+
private _script?;
|
|
20
|
+
private _transformsValid;
|
|
21
|
+
private _groupsValid;
|
|
22
|
+
private _scriptValid;
|
|
23
|
+
/** A stringified representation of the current groupings, of the format:
|
|
24
|
+
* group1_group2_group3_..._groupN
|
|
25
|
+
* where each group is a [CompressedId64Set]($bentley).
|
|
26
|
+
* @see [[BatchedTileTreeId.modelGroups]].
|
|
27
|
+
*/
|
|
28
|
+
guid: string;
|
|
29
|
+
groups: ModelGroup[];
|
|
30
|
+
modelGroupDisplayTransforms: ModelGroupDisplayTransforms;
|
|
31
|
+
constructor(view: SpatialViewState, script: RenderSchedule.Script | undefined, includedModelIds: Id64Set, metadata: Map<Id64String, ModelMetadata>);
|
|
32
|
+
setScript(script: RenderSchedule.Script | undefined): void;
|
|
33
|
+
invalidateTransforms(): void;
|
|
34
|
+
private listenForDisplayStyleEvents;
|
|
35
|
+
getModelClip(modelId: Id64String): RenderClipVolume | undefined;
|
|
36
|
+
getPlanProjectionSettings(modelId: Id64String): PlanProjectionSettings | undefined;
|
|
37
|
+
getModelTimeline(modelId: Id64String): RenderSchedule.ModelTimeline | undefined;
|
|
38
|
+
getViewFlagOverrides(modelId: Id64String): ViewFlagOverrides | undefined;
|
|
39
|
+
getDefaultElevation(modelId: Id64String): number;
|
|
40
|
+
/** Re-evaluate transforms and groupings if they may be out of date.
|
|
41
|
+
* @returns true if the groupings changed as a result.
|
|
42
|
+
*/
|
|
43
|
+
update(): boolean;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=BatchedModelGroups.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BatchedModelGroups.d.ts","sourceRoot":"","sources":["../../src/BatchedModelGroups.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAC5E,OAAO,EAAe,UAAU,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAC7E,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC1E,OAAO,EAA6B,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACrF,OAAO,EAAE,sBAAsB,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC/F,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEvD;;;;;;;GAOG;AACH,qBAAa,kBAAmB,YAAW,oBAAoB;IAC7D,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAmB;IACzC,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAU;IAC5C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAiC;IAC3D,OAAO,CAAC,OAAO,CAAC,CAAwB;IACxC,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,YAAY,CAAS;IAC7B;;;;OAIG;IACI,IAAI,SAAM;IACV,MAAM,EAAE,UAAU,EAAE,CAAM;IAC1B,2BAA2B,EAAE,2BAA2B,CAAC;gBAE7C,IAAI,EAAE,gBAAgB,EAAE,MAAM,EAAE,cAAc,CAAC,MAAM,GAAG,SAAS,EAAE,gBAAgB,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,CAAC,UAAU,EAAE,aAAa,CAAC;IAclJ,SAAS,CAAC,MAAM,EAAE,cAAc,CAAC,MAAM,GAAG,SAAS,GAAG,IAAI;IAK1D,oBAAoB,IAAI,IAAI;IAEnC,OAAO,CAAC,2BAA2B;IAS5B,YAAY,CAAC,OAAO,EAAE,UAAU,GAAG,gBAAgB,GAAG,SAAS;IAI/D,yBAAyB,CAAC,OAAO,EAAE,UAAU,GAAG,sBAAsB,GAAG,SAAS;IAIlF,gBAAgB,CAAC,OAAO,EAAE,UAAU,GAAG,cAAc,CAAC,aAAa,GAAG,SAAS;IAI/E,oBAAoB,CAAC,OAAO,EAAE,UAAU,GAAG,iBAAiB,GAAG,SAAS;IAIxE,mBAAmB,CAAC,OAAO,EAAE,UAAU,GAAG,MAAM;IAYvD;;OAEG;IACI,MAAM,IAAI,OAAO;CAqCzB"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BatchedModelGroups = void 0;
|
|
4
|
+
/*---------------------------------------------------------------------------------------------
|
|
5
|
+
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
|
|
6
|
+
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
7
|
+
*--------------------------------------------------------------------------------------------*/
|
|
8
|
+
const ModelGroupDisplayTransforms_1 = require("./ModelGroupDisplayTransforms");
|
|
9
|
+
const ModelGroup_1 = require("./ModelGroup");
|
|
10
|
+
const core_bentley_1 = require("@itwin/core-bentley");
|
|
11
|
+
/** Groups the set of spatial models included in a [[BatchedSpatialTileTreeReferences]] based on their display settings.
|
|
12
|
+
* This ensures that models are displayed correctly, while using batching to reduce the number of draw calls to a minimum.
|
|
13
|
+
* The groupings are re-evaluated only when there's a possibility that they may have changed (e.g., if the view's plan projection settings or model clip groups were modified).
|
|
14
|
+
* Unfortunately, there is currently no way to know when the transforms supplied by a [ModelDisplayTransformProvider]($frontend) may have changed, so
|
|
15
|
+
* display transforms are re-evaluated every time the Viewport's scene is invalidated. This may (but usually won't) affect the groupings.
|
|
16
|
+
* The BatchedSpatialTileTreeReferences object allocates new [[BatchedTileTreeReferences]] whenever the groupings change.
|
|
17
|
+
* @internal
|
|
18
|
+
*/
|
|
19
|
+
class BatchedModelGroups {
|
|
20
|
+
constructor(view, script, includedModelIds, metadata) {
|
|
21
|
+
this._transformsValid = false;
|
|
22
|
+
this._groupsValid = false;
|
|
23
|
+
this._scriptValid = false;
|
|
24
|
+
/** A stringified representation of the current groupings, of the format:
|
|
25
|
+
* group1_group2_group3_..._groupN
|
|
26
|
+
* where each group is a [CompressedId64Set]($bentley).
|
|
27
|
+
* @see [[BatchedTileTreeId.modelGroups]].
|
|
28
|
+
*/
|
|
29
|
+
this.guid = "";
|
|
30
|
+
this.groups = [];
|
|
31
|
+
this._script = script;
|
|
32
|
+
this._view = view;
|
|
33
|
+
this._includedModelIds = includedModelIds;
|
|
34
|
+
this._metadata = metadata;
|
|
35
|
+
this.modelGroupDisplayTransforms = new ModelGroupDisplayTransforms_1.ModelGroupDisplayTransforms(includedModelIds, view.modelDisplayTransformProvider);
|
|
36
|
+
this._view.onModelDisplayTransformProviderChanged.addListener(() => this._transformsValid = false);
|
|
37
|
+
this._view.details.onModelClipGroupsChanged.addListener(() => this._groupsValid = false);
|
|
38
|
+
this.listenForDisplayStyleEvents();
|
|
39
|
+
this.update();
|
|
40
|
+
}
|
|
41
|
+
setScript(script) {
|
|
42
|
+
this._script = script;
|
|
43
|
+
this._scriptValid = false;
|
|
44
|
+
}
|
|
45
|
+
invalidateTransforms() { this._transformsValid = false; }
|
|
46
|
+
listenForDisplayStyleEvents() {
|
|
47
|
+
const removeListener = this._view.displayStyle.settings.onPlanProjectionSettingsChanged.addListener(() => this._groupsValid = false);
|
|
48
|
+
this._view.onDisplayStyleChanged.addListener(() => {
|
|
49
|
+
this._groupsValid = false;
|
|
50
|
+
removeListener();
|
|
51
|
+
this.listenForDisplayStyleEvents();
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
getModelClip(modelId) {
|
|
55
|
+
return this._view.getModelClip(modelId);
|
|
56
|
+
}
|
|
57
|
+
getPlanProjectionSettings(modelId) {
|
|
58
|
+
return this._view.displayStyle.settings.getPlanProjectionSettings(modelId);
|
|
59
|
+
}
|
|
60
|
+
getModelTimeline(modelId) {
|
|
61
|
+
return this._script?.modelTimelines.find((x) => x.modelId === modelId);
|
|
62
|
+
}
|
|
63
|
+
getViewFlagOverrides(modelId) {
|
|
64
|
+
return this._metadata.get(modelId)?.viewFlags;
|
|
65
|
+
}
|
|
66
|
+
getDefaultElevation(modelId) {
|
|
67
|
+
const range = this._metadata.get(modelId)?.extents;
|
|
68
|
+
if (range) {
|
|
69
|
+
const low = range.low.z;
|
|
70
|
+
const high = range.high.z;
|
|
71
|
+
if (low <= high)
|
|
72
|
+
return (low + high) / 2;
|
|
73
|
+
}
|
|
74
|
+
return 0;
|
|
75
|
+
}
|
|
76
|
+
/** Re-evaluate transforms and groupings if they may be out of date.
|
|
77
|
+
* @returns true if the groupings changed as a result.
|
|
78
|
+
*/
|
|
79
|
+
update() {
|
|
80
|
+
if (!this._transformsValid && this.modelGroupDisplayTransforms.update(this._view.modelDisplayTransformProvider)) {
|
|
81
|
+
this._groupsValid = false;
|
|
82
|
+
}
|
|
83
|
+
this._transformsValid = true;
|
|
84
|
+
if (this._groupsValid && this._scriptValid) {
|
|
85
|
+
// Update the display transforms on the ModelGroups.
|
|
86
|
+
const getFirstModelId = (ids) => {
|
|
87
|
+
for (const id of ids)
|
|
88
|
+
return id;
|
|
89
|
+
return undefined;
|
|
90
|
+
};
|
|
91
|
+
for (const group of this.groups) {
|
|
92
|
+
if (group.displayTransform) {
|
|
93
|
+
const modelId = getFirstModelId(group.modelIds);
|
|
94
|
+
(0, core_bentley_1.assert)(undefined !== modelId);
|
|
95
|
+
group.displayTransform = this.modelGroupDisplayTransforms.getDisplayTransform(modelId);
|
|
96
|
+
(0, core_bentley_1.assert)(undefined !== group.displayTransform);
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
return false; // the groupings haven't changed.
|
|
100
|
+
}
|
|
101
|
+
this.groups = (0, ModelGroup_1.groupModels)(this, this._includedModelIds);
|
|
102
|
+
const newGuid = this.groups.map((x) => core_bentley_1.CompressedId64Set.compressSet(x.modelIds)).join("_");
|
|
103
|
+
const updated = newGuid !== this.guid || !this._scriptValid;
|
|
104
|
+
this.guid = newGuid;
|
|
105
|
+
this._groupsValid = this._scriptValid = true;
|
|
106
|
+
return updated;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
exports.BatchedModelGroups = BatchedModelGroups;
|
|
110
|
+
//# sourceMappingURL=BatchedModelGroups.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BatchedModelGroups.js","sourceRoot":"","sources":["../../src/BatchedModelGroups.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*--------------------------------------------------------------------------------------------*/\nimport { ModelGroupDisplayTransforms } from \"./ModelGroupDisplayTransforms\";\nimport { groupModels, ModelGroup, ModelGroupingContext } from \"./ModelGroup\";\nimport { RenderClipVolume, SpatialViewState } from \"@itwin/core-frontend\";\nimport { assert, CompressedId64Set, Id64Set, Id64String } from \"@itwin/core-bentley\";\nimport { PlanProjectionSettings, RenderSchedule, ViewFlagOverrides } from \"@itwin/core-common\";\nimport { ModelMetadata } from \"./BatchedTilesetReader\";\n\n/** Groups the set of spatial models included in a [[BatchedSpatialTileTreeReferences]] based on their display settings.\n * This ensures that models are displayed correctly, while using batching to reduce the number of draw calls to a minimum.\n * The groupings are re-evaluated only when there's a possibility that they may have changed (e.g., if the view's plan projection settings or model clip groups were modified).\n * Unfortunately, there is currently no way to know when the transforms supplied by a [ModelDisplayTransformProvider]($frontend) may have changed, so\n * display transforms are re-evaluated every time the Viewport's scene is invalidated. This may (but usually won't) affect the groupings.\n * The BatchedSpatialTileTreeReferences object allocates new [[BatchedTileTreeReferences]] whenever the groupings change.\n * @internal\n */\nexport class BatchedModelGroups implements ModelGroupingContext {\n private readonly _view: SpatialViewState;\n private readonly _includedModelIds: Id64Set;\n private readonly _metadata: Map<Id64String, ModelMetadata>;\n private _script?: RenderSchedule.Script;\n private _transformsValid = false;\n private _groupsValid = false;\n private _scriptValid = false;\n /** A stringified representation of the current groupings, of the format:\n * group1_group2_group3_..._groupN\n * where each group is a [CompressedId64Set]($bentley).\n * @see [[BatchedTileTreeId.modelGroups]].\n */\n public guid = \"\";\n public groups: ModelGroup[] = [];\n public modelGroupDisplayTransforms: ModelGroupDisplayTransforms;\n\n public constructor(view: SpatialViewState, script: RenderSchedule.Script | undefined, includedModelIds: Id64Set, metadata: Map<Id64String, ModelMetadata>) {\n this._script = script;\n this._view = view;\n this._includedModelIds = includedModelIds;\n this._metadata = metadata;\n this.modelGroupDisplayTransforms = new ModelGroupDisplayTransforms(includedModelIds, view.modelDisplayTransformProvider);\n\n this._view.onModelDisplayTransformProviderChanged.addListener(() => this._transformsValid = false);\n this._view.details.onModelClipGroupsChanged.addListener(() => this._groupsValid = false);\n this.listenForDisplayStyleEvents();\n\n this.update();\n }\n\n public setScript(script: RenderSchedule.Script | undefined): void {\n this._script = script;\n this._scriptValid = false;\n }\n\n public invalidateTransforms(): void { this._transformsValid = false; }\n\n private listenForDisplayStyleEvents(): void {\n const removeListener = this._view.displayStyle.settings.onPlanProjectionSettingsChanged.addListener(() => this._groupsValid = false);\n this._view.onDisplayStyleChanged.addListener(() => {\n this._groupsValid = false;\n removeListener();\n this.listenForDisplayStyleEvents();\n });\n }\n\n public getModelClip(modelId: Id64String): RenderClipVolume | undefined {\n return this._view.getModelClip(modelId);\n }\n\n public getPlanProjectionSettings(modelId: Id64String): PlanProjectionSettings | undefined {\n return this._view.displayStyle.settings.getPlanProjectionSettings(modelId);\n }\n\n public getModelTimeline(modelId: Id64String): RenderSchedule.ModelTimeline | undefined {\n return this._script?.modelTimelines.find((x) => x.modelId === modelId);\n }\n\n public getViewFlagOverrides(modelId: Id64String): ViewFlagOverrides | undefined {\n return this._metadata.get(modelId)?.viewFlags;\n }\n\n public getDefaultElevation(modelId: Id64String): number {\n const range = this._metadata.get(modelId)?.extents;\n if (range) {\n const low = range.low.z;\n const high = range.high.z;\n if (low <= high)\n return (low + high) / 2;\n }\n\n return 0;\n }\n\n /** Re-evaluate transforms and groupings if they may be out of date.\n * @returns true if the groupings changed as a result.\n */\n public update(): boolean {\n if (!this._transformsValid && this.modelGroupDisplayTransforms.update(this._view.modelDisplayTransformProvider)) {\n this._groupsValid = false;\n }\n\n this._transformsValid = true;\n if (this._groupsValid && this._scriptValid) {\n // Update the display transforms on the ModelGroups.\n const getFirstModelId = (ids: Id64Set) => {\n for (const id of ids)\n return id;\n\n return undefined;\n };\n\n for (const group of this.groups) {\n if (group.displayTransform) {\n const modelId = getFirstModelId(group.modelIds);\n assert(undefined !== modelId);\n group.displayTransform = this.modelGroupDisplayTransforms.getDisplayTransform(modelId);\n assert(undefined !== group.displayTransform);\n }\n }\n\n return false; // the groupings haven't changed.\n }\n\n this.groups = groupModels(this, this._includedModelIds);\n const newGuid = this.groups.map((x) => CompressedId64Set.compressSet(x.modelIds)).join(\"_\");\n\n const updated = newGuid !== this.guid || !this._scriptValid;\n\n this.guid = newGuid;\n this._groupsValid = this._scriptValid = true;\n\n return updated;\n }\n}\n"]}
|
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
import { Id64String } from "@itwin/core-bentley";
|
|
2
2
|
import { Range3d } from "@itwin/core-geometry";
|
|
3
3
|
import { SpatialViewState } from "@itwin/core-frontend";
|
|
4
|
+
import { ModelMetadata } from "./BatchedTilesetReader";
|
|
4
5
|
export declare class BatchedModels {
|
|
5
|
-
private readonly _iModel;
|
|
6
6
|
private _viewedModels;
|
|
7
7
|
private readonly _viewedExtents;
|
|
8
8
|
private readonly _viewedModelIdPairs;
|
|
9
9
|
private readonly _metadata;
|
|
10
|
-
|
|
11
|
-
constructor(view: SpatialViewState);
|
|
10
|
+
constructor(view: SpatialViewState, metadata: Map<Id64String, ModelMetadata>);
|
|
12
11
|
setViewedModels(models: Set<Id64String>): void;
|
|
13
12
|
views(modelId: Id64String): boolean;
|
|
14
13
|
isViewed(modelIdLo: number, modelIdHi: number): boolean;
|
|
@@ -1 +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;
|
|
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;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAC;AAEvD,qBAAa,aAAa;IACxB,OAAO,CAAC,aAAa,CAAmB;IACxC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;IAChD,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAwB;IAC5D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAiC;gBAExC,IAAI,EAAE,gBAAgB,EAAE,QAAQ,EAAE,GAAG,CAAC,UAAU,EAAE,aAAa,CAAC;IAK5E,eAAe,CAAC,MAAM,EAAE,GAAG,CAAC,UAAU,CAAC,GAAG,IAAI;IAa9C,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;CAGxC"}
|
package/lib/cjs/BatchedModels.js
CHANGED
|
@@ -8,11 +8,10 @@ exports.BatchedModels = void 0;
|
|
|
8
8
|
const core_bentley_1 = require("@itwin/core-bentley");
|
|
9
9
|
const core_geometry_1 = require("@itwin/core-geometry");
|
|
10
10
|
class BatchedModels {
|
|
11
|
-
constructor(view) {
|
|
11
|
+
constructor(view, metadata) {
|
|
12
12
|
this._viewedExtents = new core_geometry_1.Range3d();
|
|
13
13
|
this._viewedModelIdPairs = new core_bentley_1.Id64.Uint32Set();
|
|
14
|
-
this._metadata =
|
|
15
|
-
this._iModel = view.iModel;
|
|
14
|
+
this._metadata = metadata;
|
|
16
15
|
this.setViewedModels(view.modelSelector.models);
|
|
17
16
|
}
|
|
18
17
|
setViewedModels(models) {
|
|
@@ -20,31 +19,11 @@ class BatchedModels {
|
|
|
20
19
|
this._viewedModelIdPairs.clear();
|
|
21
20
|
this._viewedModelIdPairs.addIds(models);
|
|
22
21
|
this._viewedExtents.setNull();
|
|
23
|
-
this._modelRangePromise = undefined;
|
|
24
|
-
const rangeQueryModels = [];
|
|
25
22
|
for (const modelId of models) {
|
|
26
|
-
|
|
27
|
-
if (
|
|
28
|
-
this.
|
|
29
|
-
if (undefined === metadata.extents)
|
|
30
|
-
rangeQueryModels.push(modelId);
|
|
31
|
-
else
|
|
32
|
-
this._viewedExtents.extendRange(metadata.extents);
|
|
23
|
+
const range = this._metadata.get(modelId)?.extents;
|
|
24
|
+
if (range)
|
|
25
|
+
this._viewedExtents.extendRange(range);
|
|
33
26
|
}
|
|
34
|
-
if (rangeQueryModels.length === 0)
|
|
35
|
-
return;
|
|
36
|
-
const modelRangePromise = this._modelRangePromise = this._iModel.models.queryExtents(rangeQueryModels).then((extents) => {
|
|
37
|
-
if (modelRangePromise !== this._modelRangePromise)
|
|
38
|
-
return;
|
|
39
|
-
this._modelRangePromise = undefined;
|
|
40
|
-
for (const extent of extents) {
|
|
41
|
-
const metadata = this._metadata.get(extent.id);
|
|
42
|
-
if (metadata) {
|
|
43
|
-
metadata.extents = core_geometry_1.Range3d.fromJSON(extent.extents);
|
|
44
|
-
this._viewedExtents.extendRange(metadata.extents);
|
|
45
|
-
}
|
|
46
|
-
}
|
|
47
|
-
}).catch(() => { });
|
|
48
27
|
}
|
|
49
28
|
views(modelId) {
|
|
50
29
|
return this._viewedModels.has(modelId);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BatchedModels.js","sourceRoot":"","sources":["../../src/BatchedModels.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;;;AAE/F,sDAAuD;AACvD,wDAA+C;
|
|
1
|
+
{"version":3,"file":"BatchedModels.js","sourceRoot":"","sources":["../../src/BatchedModels.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;;;AAE/F,sDAAuD;AACvD,wDAA+C;AAI/C,MAAa,aAAa;IAMxB,YAAmB,IAAsB,EAAE,QAAwC;QAJlE,mBAAc,GAAG,IAAI,uBAAO,EAAE,CAAC;QAC/B,wBAAmB,GAAG,IAAI,mBAAI,CAAC,SAAS,EAAE,CAAC;QAI1D,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;QAC1B,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;QACxC,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC;QAE9B,KAAK,MAAM,OAAO,IAAI,MAAM,EAAE;YAC5B,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;YACnD,IAAI,KAAK;gBACP,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;SAC1C;IACH,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,CAAC,WAAW,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACzC,CAAC;CACF;AAnCD,sCAmCC","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 { Id64, Id64String } from \"@itwin/core-bentley\";\nimport { Range3d } from \"@itwin/core-geometry\";\nimport { SpatialViewState } from \"@itwin/core-frontend\";\nimport { ModelMetadata } from \"./BatchedTilesetReader\";\n\nexport class BatchedModels {\n private _viewedModels!: Set<Id64String>;\n private readonly _viewedExtents = new Range3d();\n private readonly _viewedModelIdPairs = new Id64.Uint32Set();\n private readonly _metadata: Map<Id64String, ModelMetadata>;\n\n public constructor(view: SpatialViewState, metadata: Map<Id64String, ModelMetadata>) {\n this._metadata = metadata;\n this.setViewedModels(view.modelSelector.models);\n }\n\n public setViewedModels(models: Set<Id64String>): void {\n this._viewedModels = models;\n this._viewedModelIdPairs.clear();\n this._viewedModelIdPairs.addIds(models);\n this._viewedExtents.setNull();\n\n for (const modelId of models) {\n const range = this._metadata.get(modelId)?.extents;\n if (range)\n this._viewedExtents.extendRange(range);\n }\n }\n\n public views(modelId: Id64String): boolean {\n return this._viewedModels.has(modelId);\n }\n\n public isViewed(modelIdLo: number, modelIdHi: number): boolean {\n return this._viewedModelIdPairs.has(modelIdLo, modelIdHi);\n }\n\n public unionRange(range: Range3d): void {\n range.extendRange(this._viewedExtents);\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BatchedSpatialTileTreeRefs.d.ts","sourceRoot":"","sources":["../../src/BatchedSpatialTileTreeRefs.ts"],"names":[],"mappings":"AAOA,OAAO,
|
|
1
|
+
{"version":3,"file":"BatchedSpatialTileTreeRefs.d.ts","sourceRoot":"","sources":["../../src/BatchedSpatialTileTreeRefs.ts"],"names":[],"mappings":"AAOA,OAAO,EAEoE,yBAAyB,EAAE,gBAAgB,EAErH,MAAM,sBAAsB,CAAC;AAI9B,OAAO,EAAE,4BAA4B,EAAE,MAAM,iBAAiB,CAAC;AA+O/D,gBAAgB;AAChB,wBAAgB,sCAAsC,CAAC,IAAI,EAAE,gBAAgB,EAAE,cAAc,EAAE,4BAA4B,GAAG,yBAAyB,CA0BtJ"}
|
|
@@ -12,35 +12,37 @@ const BatchedTileTreeSupplier_1 = require("./BatchedTileTreeSupplier");
|
|
|
12
12
|
const BatchedModels_1 = require("./BatchedModels");
|
|
13
13
|
const BatchedTilesetReader_1 = require("./BatchedTilesetReader");
|
|
14
14
|
const LoggerCategory_1 = require("./LoggerCategory");
|
|
15
|
+
const BatchedModelGroups_1 = require("./BatchedModelGroups");
|
|
15
16
|
// Obtains tiles pre-published by mesh export service.
|
|
16
17
|
class BatchedSpatialTileTreeReferences {
|
|
17
18
|
constructor(spec, view) {
|
|
18
|
-
this.
|
|
19
|
+
this._refs = [];
|
|
19
20
|
this._view = view;
|
|
20
|
-
this._models = new BatchedModels_1.BatchedModels(view);
|
|
21
|
+
this._models = new BatchedModels_1.BatchedModels(view, spec.models);
|
|
22
|
+
this._spec = spec;
|
|
21
23
|
const script = view.displayStyle.scheduleScript;
|
|
22
24
|
this._currentScript = script?.requiresBatching ? script : undefined;
|
|
23
|
-
const includedModels = spec.
|
|
24
|
-
this._excludedRefs =
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
25
|
+
const includedModels = new Set(spec.models.keys());
|
|
26
|
+
this._excludedRefs = (0, core_frontend_1.createSpatialTileTreeReferences)(view, includedModels);
|
|
27
|
+
this._groups = new BatchedModelGroups_1.BatchedModelGroups(view, this._currentScript, includedModels, spec.models);
|
|
28
|
+
this._treeOwner = this.getTreeOwner();
|
|
29
|
+
this.loadRefs();
|
|
30
|
+
this.listenForScriptChange();
|
|
31
|
+
}
|
|
32
|
+
ensureLoaded() {
|
|
33
|
+
if (!this._groups.update())
|
|
34
|
+
return;
|
|
35
|
+
this._treeOwner = this.getTreeOwner();
|
|
36
|
+
this.loadRefs();
|
|
37
|
+
}
|
|
38
|
+
getTreeOwner() {
|
|
39
|
+
return (0, BatchedTileTreeSupplier_1.getBatchedTileTreeOwner)(this._view.iModel, {
|
|
40
|
+
spec: this._spec,
|
|
41
|
+
script: this._currentScript,
|
|
42
|
+
modelGroups: this._groups.guid,
|
|
43
|
+
});
|
|
39
44
|
}
|
|
40
|
-
|
|
41
|
-
const treeOwner = (0, BatchedTileTreeSupplier_1.getBatchedTileTreeOwner)(iModel, { spec, script: this._currentScript });
|
|
42
|
-
this._primaryRef = new BatchedTileTreeReference_1.PrimaryBatchedTileTreeReference(treeOwner, this._models);
|
|
43
|
-
this.populateAnimatedReferences(treeOwner);
|
|
45
|
+
listenForScriptChange() {
|
|
44
46
|
const onScriptChanged = (newScript) => {
|
|
45
47
|
if (!newScript?.requiresBatching)
|
|
46
48
|
newScript = undefined;
|
|
@@ -48,39 +50,40 @@ class BatchedSpatialTileTreeReferences {
|
|
|
48
50
|
this._currentScript = newScript;
|
|
49
51
|
if (newScript !== currentScript)
|
|
50
52
|
if (!newScript || !currentScript || !newScript.equals(currentScript))
|
|
51
|
-
this.
|
|
53
|
+
this._groups.setScript(newScript);
|
|
52
54
|
};
|
|
53
|
-
let
|
|
55
|
+
let rmListener = this._view.displayStyle.onScheduleScriptChanged.addListener((newScript) => onScriptChanged(newScript));
|
|
54
56
|
this._view.onDisplayStyleChanged.addListener((newStyle) => {
|
|
55
|
-
|
|
57
|
+
rmListener();
|
|
56
58
|
onScriptChanged(newStyle.scheduleScript);
|
|
57
|
-
|
|
59
|
+
rmListener = this._view.displayStyle.onScheduleScriptChanged.addListener((newScript) => onScriptChanged(newScript));
|
|
58
60
|
});
|
|
59
61
|
}
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
for (const nodeId of nodeIds) {
|
|
76
|
-
this._animatedRefs.push(new BatchedTileTreeReference_1.AnimatedBatchedTileTreeReference(treeOwner, {
|
|
77
|
-
timeline,
|
|
78
|
-
nodeId,
|
|
79
|
-
getCurrentTimePoint,
|
|
80
|
-
}));
|
|
62
|
+
loadRefs() {
|
|
63
|
+
this._refs.length = 0;
|
|
64
|
+
const groups = this._groups.groups;
|
|
65
|
+
const args = {
|
|
66
|
+
models: this._models,
|
|
67
|
+
groups,
|
|
68
|
+
treeOwner: this._treeOwner,
|
|
69
|
+
getCurrentTimePoint: () => this._currentScript ? (this._view.displayStyle.settings.timePoint ?? this._currentScript.duration.low) : 0,
|
|
70
|
+
};
|
|
71
|
+
for (let i = 0; i < groups.length; i++) {
|
|
72
|
+
const timeline = groups[i].timeline;
|
|
73
|
+
this._refs.push(new BatchedTileTreeReference_1.BatchedTileTreeReference(args, i, timeline ? core_frontend_1.AnimationNodeId.Untransformed : undefined));
|
|
74
|
+
if (timeline) {
|
|
75
|
+
for (const nodeId of timeline.transformBatchIds)
|
|
76
|
+
this._refs.push(new BatchedTileTreeReference_1.BatchedTileTreeReference(args, i, nodeId));
|
|
81
77
|
}
|
|
82
78
|
}
|
|
83
79
|
}
|
|
80
|
+
*[Symbol.iterator]() {
|
|
81
|
+
this.ensureLoaded();
|
|
82
|
+
for (const ref of this._refs)
|
|
83
|
+
yield ref;
|
|
84
|
+
for (const ref of this._excludedRefs)
|
|
85
|
+
yield ref;
|
|
86
|
+
}
|
|
84
87
|
update() {
|
|
85
88
|
this._excludedRefs.update();
|
|
86
89
|
this._models.setViewedModels(this._view.modelSelector.models);
|
|
@@ -90,10 +93,15 @@ class BatchedSpatialTileTreeReferences {
|
|
|
90
93
|
attachToViewport(args) {
|
|
91
94
|
this._onModelSelectorChanged = () => args.invalidateSymbologyOverrides();
|
|
92
95
|
this._excludedRefs.attachToViewport(args);
|
|
96
|
+
this._removeSceneInvalidationListener = args.onSceneInvalidated.addListener(() => this._groups.invalidateTransforms());
|
|
93
97
|
}
|
|
94
98
|
detachFromViewport() {
|
|
95
99
|
this._onModelSelectorChanged = undefined;
|
|
96
100
|
this._excludedRefs.detachFromViewport();
|
|
101
|
+
if (this._removeSceneInvalidationListener) {
|
|
102
|
+
this._removeSceneInvalidationListener();
|
|
103
|
+
this._removeSceneInvalidationListener = undefined;
|
|
104
|
+
}
|
|
97
105
|
}
|
|
98
106
|
setDeactivated() {
|
|
99
107
|
// Used for debugging. Unimplemented here.
|
|
@@ -1 +1 @@
|
|
|
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, Logger } from \"@itwin/core-bentley\";\r\nimport { RenderSchedule } from \"@itwin/core-common\";\r\nimport {\r\n AttachToViewportArgs, createSpatialTileTreeReferences, IModelConnection, SpatialTileTreeReferences, SpatialViewState,\r\n 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 } from \"./FrontendTiles\";\r\nimport { BatchedTilesetSpec } from \"./BatchedTilesetReader\";\r\nimport { loggerCategory } from \"./LoggerCategory\";\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 /** Provides tile trees for models that are not included in the batched tile set. */\r\n private readonly _excludedRefs: SpatialTileTreeReferences;\r\n\r\n public constructor(spec: BatchedTilesetSpec, 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 const includedModels = spec.props.extensions?.BENTLEY_BatchedTileSet?.includedModels;\r\n this._excludedRefs = includedModels ? createSpatialTileTreeReferences(view, new Set(includedModels)) : {\r\n update: () => { },\r\n setDeactivated: () => { },\r\n attachToViewport: () => { },\r\n detachFromViewport: () => { },\r\n [Symbol.iterator]: () => {\r\n return {\r\n next: () => {\r\n return { done: true, value: undefined };\r\n },\r\n };\r\n },\r\n };\r\n\r\n this.load(spec, view.iModel);\r\n\r\n assert(undefined !== this._primaryRef);\r\n }\r\n\r\n private load(spec: BatchedTilesetSpec, iModel: IModelConnection): void {\r\n const treeOwner = getBatchedTileTreeOwner(iModel, { spec, 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(spec, 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 for (const excludedRef of this._excludedRefs)\r\n yield excludedRef;\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._excludedRefs.update();\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 this._excludedRefs.attachToViewport(args);\r\n }\r\n\r\n public detachFromViewport(): void {\r\n this._onModelSelectorChanged = undefined;\r\n this._excludedRefs.detachFromViewport();\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, getSpec: Promise<BatchedTilesetSpec | null>) {\r\n this._proxyRef = new ProxyTileTreeReference(view.iModel);\r\n getSpec.then((spec: BatchedTilesetSpec | null) => {\r\n if (spec) {\r\n this.setTreeRefs(new BatchedSpatialTileTreeReferences(spec, view));\r\n } else {\r\n this.setTreeRefs(createSpatialTileTreeReferences(view));\r\n }\r\n }).catch(() => {\r\n this.setTreeRefs(createSpatialTileTreeReferences(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 iModelToTilesetSpec = new Map<IModelConnection, BatchedTilesetSpec | null | Promise<BatchedTilesetSpec | null>>();\r\n\r\nasync function fetchTilesetSpec(iModel: IModelConnection, computeBaseUrl: ComputeSpatialTilesetBaseUrl): Promise<BatchedTilesetSpec | null> {\r\n try {\r\n const baseUrl = await computeBaseUrl(iModel);\r\n if (undefined === baseUrl)\r\n return null;\r\n\r\n const url = new URL(\"tileset.json\", baseUrl);\r\n url.search = baseUrl.search;\r\n const response = await fetch(url.toString());\r\n const json = await response.json();\r\n return BatchedTilesetSpec.create(baseUrl, json);\r\n } catch (err) {\r\n Logger.logException(loggerCategory, err);\r\n return null;\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport function createBatchedSpatialTileTreeReferences(view: SpatialViewState, computeBaseUrl: ComputeSpatialTilesetBaseUrl): SpatialTileTreeReferences {\r\n const iModel = view.iModel;\r\n let entry = iModelToTilesetSpec.get(iModel);\r\n if (undefined === entry) {\r\n const promise = entry = fetchTilesetSpec(iModel, computeBaseUrl);\r\n iModelToTilesetSpec.set(iModel, entry);\r\n iModel.onClose.addOnce(() => iModelToTilesetSpec.delete(iModel));\r\n\r\n promise.then((spec: BatchedTilesetSpec | null) => {\r\n if (iModelToTilesetSpec.has(iModel))\r\n iModelToTilesetSpec.set(iModel, spec);\r\n }).catch(() => {\r\n if (iModelToTilesetSpec.has(iModel))\r\n iModelToTilesetSpec.set(iModel, null);\r\n });\r\n }\r\n\r\n if (null === entry) {\r\n // No tileset could be obtained for this iModel - use default tile generation instead.\r\n return createSpatialTileTreeReferences(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
|
+
{"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 { Logger } from \"@itwin/core-bentley\";\nimport { RenderSchedule } from \"@itwin/core-common\";\nimport {\n AnimationNodeId,\n AttachToViewportArgs, createSpatialTileTreeReferences, IModelConnection, SpatialTileTreeReferences, SpatialViewState,\n TileTreeLoadStatus, TileTreeOwner, TileTreeReference,\n} from \"@itwin/core-frontend\";\nimport { BatchedTileTreeReference, BatchedTileTreeReferenceArgs } from \"./BatchedTileTreeReference\";\nimport { getBatchedTileTreeOwner } from \"./BatchedTileTreeSupplier\";\nimport { BatchedModels } from \"./BatchedModels\";\nimport { ComputeSpatialTilesetBaseUrl } from \"./FrontendTiles\";\nimport { BatchedTilesetSpec } from \"./BatchedTilesetReader\";\nimport { loggerCategory } from \"./LoggerCategory\";\nimport { BatchedModelGroups } from \"./BatchedModelGroups\";\n\n// Obtains tiles pre-published by mesh export service.\nclass BatchedSpatialTileTreeReferences implements SpatialTileTreeReferences {\n private readonly _view: SpatialViewState;\n private readonly _models: BatchedModels;\n private readonly _groups: BatchedModelGroups;\n private readonly _spec: BatchedTilesetSpec;\n private _treeOwner: TileTreeOwner;\n private _refs: BatchedTileTreeReference[] = [];\n private _currentScript?: RenderSchedule.Script;\n private _onModelSelectorChanged?: () => void;\n /** Provides tile trees for models that are not included in the batched tile set. */\n private readonly _excludedRefs: SpatialTileTreeReferences;\n private _removeSceneInvalidationListener?: () => void;\n\n public constructor(spec: BatchedTilesetSpec, view: SpatialViewState) {\n this._view = view;\n this._models = new BatchedModels(view, spec.models);\n this._spec = spec;\n\n const script = view.displayStyle.scheduleScript;\n this._currentScript = script?.requiresBatching ? script : undefined;\n\n const includedModels = new Set(spec.models.keys());\n this._excludedRefs = createSpatialTileTreeReferences(view, includedModels);\n\n this._groups = new BatchedModelGroups(view, this._currentScript, includedModels, spec.models);\n this._treeOwner = this.getTreeOwner();\n this.loadRefs();\n\n this.listenForScriptChange();\n }\n\n private ensureLoaded(): void {\n if (!this._groups.update())\n return;\n\n this._treeOwner = this.getTreeOwner();\n this.loadRefs();\n }\n\n private getTreeOwner(): TileTreeOwner {\n return getBatchedTileTreeOwner(this._view.iModel, {\n spec: this._spec,\n script: this._currentScript,\n modelGroups: this._groups.guid,\n });\n }\n\n private listenForScriptChange(): void {\n const onScriptChanged = (newScript: RenderSchedule.Script | undefined) => {\n if (!newScript?.requiresBatching)\n newScript = undefined;\n\n const currentScript = this._currentScript;\n this._currentScript = newScript;\n\n if (newScript !== currentScript)\n if (!newScript || !currentScript || !newScript.equals(currentScript))\n this._groups.setScript(newScript);\n };\n\n let rmListener = this._view.displayStyle.onScheduleScriptChanged.addListener((newScript) => onScriptChanged(newScript));\n this._view.onDisplayStyleChanged.addListener((newStyle) => {\n rmListener();\n onScriptChanged(newStyle.scheduleScript);\n rmListener = this._view.displayStyle.onScheduleScriptChanged.addListener((newScript) => onScriptChanged(newScript));\n });\n }\n\n private loadRefs(): void {\n this._refs.length = 0;\n const groups = this._groups.groups;\n const args: BatchedTileTreeReferenceArgs = {\n models: this._models,\n groups,\n treeOwner: this._treeOwner,\n getCurrentTimePoint: () => this._currentScript ? (this._view.displayStyle.settings.timePoint ?? this._currentScript.duration.low) : 0,\n };\n\n for (let i = 0; i < groups.length; i++) {\n const timeline = groups[i].timeline;\n this._refs.push(new BatchedTileTreeReference(args, i, timeline ? AnimationNodeId.Untransformed : undefined));\n if (timeline) {\n for (const nodeId of timeline.transformBatchIds)\n this._refs.push(new BatchedTileTreeReference(args, i, nodeId));\n }\n }\n }\n\n public *[Symbol.iterator](): Iterator<TileTreeReference> {\n this.ensureLoaded();\n for (const ref of this._refs)\n yield ref;\n\n for (const ref of this._excludedRefs)\n yield ref;\n }\n\n public update(): void {\n this._excludedRefs.update();\n this._models.setViewedModels(this._view.modelSelector.models);\n if (this._onModelSelectorChanged)\n this._onModelSelectorChanged();\n }\n\n public attachToViewport(args: AttachToViewportArgs): void {\n this._onModelSelectorChanged = () => args.invalidateSymbologyOverrides();\n this._excludedRefs.attachToViewport(args);\n this._removeSceneInvalidationListener = args.onSceneInvalidated.addListener(() => this._groups.invalidateTransforms());\n }\n\n public detachFromViewport(): void {\n this._onModelSelectorChanged = undefined;\n this._excludedRefs.detachFromViewport();\n\n if (this._removeSceneInvalidationListener) {\n this._removeSceneInvalidationListener();\n this._removeSceneInvalidationListener = undefined;\n }\n }\n\n public setDeactivated(): void {\n // Used 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, getSpec: Promise<BatchedTilesetSpec | null>) {\n this._proxyRef = new ProxyTileTreeReference(view.iModel);\n getSpec.then((spec: BatchedTilesetSpec | null) => {\n if (spec) {\n this.setTreeRefs(new BatchedSpatialTileTreeReferences(spec, view));\n } else {\n this.setTreeRefs(createSpatialTileTreeReferences(view));\n }\n }).catch(() => {\n this.setTreeRefs(createSpatialTileTreeReferences(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 iModelToTilesetSpec = new Map<IModelConnection, BatchedTilesetSpec | null | Promise<BatchedTilesetSpec | null>>();\n\nasync function fetchTilesetSpec(iModel: IModelConnection, computeBaseUrl: ComputeSpatialTilesetBaseUrl): Promise<BatchedTilesetSpec | null> {\n try {\n const baseUrl = await computeBaseUrl(iModel);\n if (undefined === baseUrl)\n return null;\n\n const url = new URL(\"tileset.json\", baseUrl);\n url.search = baseUrl.search;\n const response = await fetch(url.toString());\n const json = await response.json();\n return BatchedTilesetSpec.create(baseUrl, json);\n } catch (err) {\n Logger.logException(loggerCategory, err);\n return null;\n }\n}\n\n/** @internal */\nexport function createBatchedSpatialTileTreeReferences(view: SpatialViewState, computeBaseUrl: ComputeSpatialTilesetBaseUrl): SpatialTileTreeReferences {\n const iModel = view.iModel;\n let entry = iModelToTilesetSpec.get(iModel);\n if (undefined === entry) {\n const promise = entry = fetchTilesetSpec(iModel, computeBaseUrl);\n iModelToTilesetSpec.set(iModel, entry);\n iModel.onClose.addOnce(() => iModelToTilesetSpec.delete(iModel));\n\n promise.then((spec: BatchedTilesetSpec | null) => {\n if (iModelToTilesetSpec.has(iModel))\n iModelToTilesetSpec.set(iModel, spec);\n }).catch(() => {\n if (iModelToTilesetSpec.has(iModel))\n iModelToTilesetSpec.set(iModel, null);\n });\n }\n\n if (null === entry) {\n // No tileset could be obtained for this iModel - use default tile generation instead.\n return createSpatialTileTreeReferences(view);\n }\n\n if (entry instanceof Promise)\n return new ProxySpatialTileTreeReferences(view, entry);\n\n return new BatchedSpatialTileTreeReferences(entry, view);\n}\n\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,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAY,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EACU,cAAc,EAAgC,YAAY,EAAE,IAAI,EAAE,iBAAiB,EAAE,WAAW,EAC/G,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,kBAAkB,EAAsB,QAAQ,EAAkB,QAAQ,EAClH,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGpD,gBAAgB;AAChB,MAAM,WAAW,iBAAkB,SAAQ,UAAU;IACnD,aAAa,EAAE,eAAe,CAAC,IAAI,EAAE,GAAG,SAAS,CAAC;IAClD,uCAAuC;IACvC,eAAe,EAAE,SAAS,GAAG,SAAS,CAAC;CACxC;AAID,gBAAgB;AAChB,qBAAa,WAAY,SAAQ,IAAI;IACnC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAyB;IACzD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAU;IACvC,gFAAgF;IAChF,SAAgB,eAAe,CAAC,EAAE,SAAS,CAAC;IAE5C,IAAW,WAAW,IAAI,eAAe,CAExC;gBAEkB,MAAM,EAAE,iBAAiB,EAAE,IAAI,EAAE,eAAe;IAyBnE,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,UAAU,CAAC,EAAE,MAAM,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"BatchedTile.d.ts","sourceRoot":"","sources":["../../src/BatchedTile.ts"],"names":[],"mappings":"AAKA,OAAO,EAAU,WAAW,EAAsB,MAAM,qBAAqB,CAAC;AAC9E,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAY,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EACU,cAAc,EAAgC,YAAY,EAAE,IAAI,EAAE,iBAAiB,EAAE,WAAW,EAC/G,YAAY,EAAE,UAAU,EAAE,WAAW,EAAE,kBAAkB,EAAsB,QAAQ,EAAkB,QAAQ,EAClH,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGpD,gBAAgB;AAChB,MAAM,WAAW,iBAAkB,SAAQ,UAAU;IACnD,aAAa,EAAE,eAAe,CAAC,IAAI,EAAE,GAAG,SAAS,CAAC;IAClD,uCAAuC;IACvC,eAAe,EAAE,SAAS,GAAG,SAAS,CAAC;CACxC;AAID,gBAAgB;AAChB,qBAAa,WAAY,SAAQ,IAAI;IACnC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAyB;IACzD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAU;IACvC,gFAAgF;IAChF,SAAgB,eAAe,CAAC,EAAE,SAAS,CAAC;IAE5C,IAAW,WAAW,IAAI,eAAe,CAExC;gBAEkB,MAAM,EAAE,iBAAiB,EAAE,IAAI,EAAE,eAAe;IAyBnE,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,UAAU,CAAC,EAAE,MAAM,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC;cAmCtH,eAAe,CAAC,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,iBAAiB,GAAG,IAAI;IAsBnF,KAAK,CAAC,SAAS,EAAE,WAAW,GAAG,IAAI;CAY3C"}
|
package/lib/cjs/BatchedTile.js
CHANGED
|
@@ -109,12 +109,15 @@ class BatchedTile extends core_frontend_1.Tile {
|
|
|
109
109
|
if (!(data instanceof Uint8Array))
|
|
110
110
|
return {};
|
|
111
111
|
try {
|
|
112
|
+
const modelGroups = this.batchedTree.modelGroups;
|
|
112
113
|
const content = await this.batchedTree.decoder.decode({
|
|
113
114
|
stream: core_bentley_1.ByteStream.fromUint8Array(data),
|
|
114
115
|
options: { tileId: this.contentId },
|
|
115
116
|
system,
|
|
116
117
|
isCanceled,
|
|
117
118
|
isLeaf: this.isLeaf,
|
|
119
|
+
// Don't waste time attempting to split based on model groupings if all models are in the same group.
|
|
120
|
+
modelGroups: modelGroups && modelGroups.length > 1 ? modelGroups : undefined,
|
|
118
121
|
});
|
|
119
122
|
if (this.transformToRoot) {
|
|
120
123
|
if (content.graphic) {
|