@itwin/frontend-tiles 4.4.0-dev.20 → 4.4.0-dev.24
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/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 +3 -2
- package/lib/cjs/BatchedModels.d.ts.map +1 -1
- package/lib/cjs/BatchedModels.js +3 -3
- package/lib/cjs/BatchedModels.js.map +1 -1
- package/lib/cjs/BatchedSpatialTileTreeRefs.d.ts.map +1 -1
- package/lib/cjs/BatchedSpatialTileTreeRefs.js +56 -35
- 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/BatchedTileTree.d.ts +5 -4
- 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 +24 -7
- package/lib/cjs/BatchedTilesetReader.d.ts.map +1 -1
- package/lib/cjs/BatchedTilesetReader.js +15 -10
- package/lib/cjs/BatchedTilesetReader.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/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 +3 -2
- package/lib/esm/BatchedModels.d.ts.map +1 -1
- package/lib/esm/BatchedModels.js +3 -3
- package/lib/esm/BatchedModels.js.map +1 -1
- package/lib/esm/BatchedSpatialTileTreeRefs.d.ts.map +1 -1
- package/lib/esm/BatchedSpatialTileTreeRefs.js +59 -38
- 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/BatchedTileTree.d.ts +5 -4
- 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 +24 -7
- package/lib/esm/BatchedTilesetReader.d.ts.map +1 -1
- package/lib/esm/BatchedTilesetReader.js +15 -10
- package/lib/esm/BatchedTilesetReader.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/package.json +12 -14
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*---------------------------------------------------------------------------------------------
|
|
3
|
+
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
|
|
4
|
+
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
5
|
+
*--------------------------------------------------------------------------------------------*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.groupModels = void 0;
|
|
8
|
+
const core_bentley_1 = require("@itwin/core-bentley");
|
|
9
|
+
function createPlanProjectionInfo(modelId, context) {
|
|
10
|
+
const settings = context.getPlanProjectionSettings(modelId);
|
|
11
|
+
if (!settings)
|
|
12
|
+
return undefined;
|
|
13
|
+
return {
|
|
14
|
+
elevation: settings.elevation ?? context.getDefaultElevation(modelId),
|
|
15
|
+
transparency: settings.transparency ?? 0,
|
|
16
|
+
overlay: settings.overlay,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
function equalPlanProjections(a, b) {
|
|
20
|
+
return a.elevation === b.elevation && a.overlay === b.overlay && a.transparency === b.transparency;
|
|
21
|
+
}
|
|
22
|
+
function createModelGroupInfo(context, modelId) {
|
|
23
|
+
const planProjection = createPlanProjectionInfo(modelId, context);
|
|
24
|
+
const viewFlags = { ...context.getViewFlagOverrides(modelId) };
|
|
25
|
+
if (planProjection) {
|
|
26
|
+
// Always enable improved z-fighting mitigation for plan projections (they're planar models).
|
|
27
|
+
viewFlags.forceSurfaceDiscard = true;
|
|
28
|
+
}
|
|
29
|
+
return {
|
|
30
|
+
displayTransform: context.modelGroupDisplayTransforms.getDisplayTransform(modelId),
|
|
31
|
+
clip: context.getModelClip(modelId),
|
|
32
|
+
planProjection,
|
|
33
|
+
viewFlags,
|
|
34
|
+
timeline: context.getModelTimeline(modelId),
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
function equalViewFlags(a, b) {
|
|
38
|
+
const lhs = Object.keys(a);
|
|
39
|
+
const rhs = Object.keys(b);
|
|
40
|
+
if (lhs.length !== rhs.length) {
|
|
41
|
+
return false;
|
|
42
|
+
}
|
|
43
|
+
for (const propName of lhs) {
|
|
44
|
+
const key = propName;
|
|
45
|
+
if (a[key] !== b[key])
|
|
46
|
+
return false;
|
|
47
|
+
}
|
|
48
|
+
return true;
|
|
49
|
+
}
|
|
50
|
+
function equalModelGroupInfo(a, b) {
|
|
51
|
+
// If a model has a timeline it cannot be grouped
|
|
52
|
+
if (a.timeline !== b.timeline)
|
|
53
|
+
return false;
|
|
54
|
+
// Display transforms are obtained from ModelGroupDisplayTransforms - they are guaranteed to be the same object if they are equivalent.
|
|
55
|
+
if (a.displayTransform !== b.displayTransform)
|
|
56
|
+
return false;
|
|
57
|
+
if (a.clip || b.clip) {
|
|
58
|
+
// Note: ClipVector lacks an `isAlmostEqual` method.
|
|
59
|
+
// For two models belonging to the same clip group, we should have the same exact object.
|
|
60
|
+
// But we won't currently detect two different objects that represent effectively identical clips.
|
|
61
|
+
if (!a.clip || !b.clip || a.clip.clipVector !== b.clip.clipVector)
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
if (a.planProjection || b.planProjection) {
|
|
65
|
+
if (!a.planProjection || !b.planProjection || !equalPlanProjections(a.planProjection, b.planProjection)) {
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
if (!equalViewFlags(a.viewFlags, b.viewFlags))
|
|
70
|
+
return false;
|
|
71
|
+
return true;
|
|
72
|
+
}
|
|
73
|
+
/** Group the supplied `modelIds` such that all models that are to be drawn with equivalent display settings are grouped together.
|
|
74
|
+
* @internal
|
|
75
|
+
*/
|
|
76
|
+
function groupModels(context, modelIds) {
|
|
77
|
+
const groups = [];
|
|
78
|
+
for (const modelId of modelIds) {
|
|
79
|
+
const info = createModelGroupInfo(context, modelId);
|
|
80
|
+
let group = groups.find((x) => equalModelGroupInfo(x, info));
|
|
81
|
+
if (!group)
|
|
82
|
+
groups.push(group = { ...info, modelIds: new Set() });
|
|
83
|
+
(0, core_bentley_1.assert)(!group.modelIds.has(modelId));
|
|
84
|
+
group.modelIds.add(modelId);
|
|
85
|
+
}
|
|
86
|
+
return groups;
|
|
87
|
+
}
|
|
88
|
+
exports.groupModels = groupModels;
|
|
89
|
+
//# sourceMappingURL=ModelGroup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ModelGroup.js","sourceRoot":"","sources":["../../src/ModelGroup.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, Id64Set, Id64String } from \"@itwin/core-bentley\";\r\nimport { PlanProjectionSettings, RenderSchedule, ViewFlagOverrides } from \"@itwin/core-common\";\r\nimport { ModelDisplayTransform, RenderClipVolume } from \"@itwin/core-frontend\";\r\nimport { ModelGroupDisplayTransforms } from \"./ModelGroupDisplayTransforms\";\r\n\r\n/** Plan projection settings relevant to a [[ModelGroupInfo]].\r\n * @internal\r\n */\r\nexport interface PlanProjectionInfo {\r\n /** Z elevation, from [PlanProjectionSettings.elevation]($common) if specified, else the default elevation of the model (computed from model extents). */\r\n elevation: number;\r\n /** Transparency in [0..1] with 0 being fully opaque. */\r\n transparency: number;\r\n /** If true, the graphics are drawn as overlays with no depth test. */\r\n overlay: boolean;\r\n}\r\n\r\n/** Display settings to be applied to a group of models.\r\n * @internal\r\n */\r\nexport interface ModelGroupInfo {\r\n displayTransform?: ModelDisplayTransform;\r\n clip?: RenderClipVolume;\r\n planProjection?: PlanProjectionInfo;\r\n timeline?: RenderSchedule.ModelTimeline;\r\n viewFlags: ViewFlagOverrides;\r\n}\r\n\r\n/** Represents a group of models and the display settings to be applied to them.\r\n * @internal\r\n */\r\nexport interface ModelGroup extends ModelGroupInfo {\r\n /** The set of models belonging to this group. */\r\n modelIds: Id64Set;\r\n}\r\n\r\n/** Context supplied to [[groupModels]].\r\n * @internal\r\n */\r\nexport interface ModelGroupingContext {\r\n modelGroupDisplayTransforms: ModelGroupDisplayTransforms;\r\n getModelClip(modelId: Id64String): RenderClipVolume | undefined;\r\n getPlanProjectionSettings(modelId: Id64String): PlanProjectionSettings | undefined;\r\n getModelTimeline(modelId: Id64String): RenderSchedule.ModelTimeline | undefined;\r\n getDefaultElevation(modelId: Id64String): number;\r\n getViewFlagOverrides(modelId: Id64String): ViewFlagOverrides | undefined;\r\n}\r\n\r\nfunction createPlanProjectionInfo(modelId: Id64String, context: ModelGroupingContext): PlanProjectionInfo | undefined {\r\n const settings = context.getPlanProjectionSettings(modelId);\r\n if (!settings)\r\n return undefined;\r\n\r\n return {\r\n elevation: settings.elevation ?? context.getDefaultElevation(modelId),\r\n transparency: settings.transparency ?? 0,\r\n overlay: settings.overlay,\r\n };\r\n}\r\n\r\nfunction equalPlanProjections(a: PlanProjectionInfo, b: PlanProjectionInfo): boolean {\r\n return a.elevation === b.elevation && a.overlay === b.overlay && a.transparency === b.transparency;\r\n}\r\n\r\nfunction createModelGroupInfo(context: ModelGroupingContext, modelId: Id64String): ModelGroupInfo {\r\n const planProjection = createPlanProjectionInfo(modelId, context);\r\n const viewFlags = { ...context.getViewFlagOverrides(modelId) };\r\n if (planProjection) {\r\n // Always enable improved z-fighting mitigation for plan projections (they're planar models).\r\n viewFlags.forceSurfaceDiscard = true;\r\n }\r\n\r\n return {\r\n displayTransform: context.modelGroupDisplayTransforms.getDisplayTransform(modelId),\r\n clip: context.getModelClip(modelId),\r\n planProjection,\r\n viewFlags,\r\n timeline: context.getModelTimeline(modelId),\r\n };\r\n}\r\n\r\nfunction equalViewFlags(a: ViewFlagOverrides, b: ViewFlagOverrides): boolean {\r\n const lhs = Object.keys(a);\r\n const rhs = Object.keys(b);\r\n if (lhs.length !== rhs.length) {\r\n return false;\r\n }\r\n\r\n for (const propName of lhs) {\r\n const key = propName as keyof ViewFlagOverrides;\r\n if (a[key] !== b[key])\r\n return false;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nfunction equalModelGroupInfo(a: ModelGroupInfo, b: ModelGroupInfo): boolean {\r\n // If a model has a timeline it cannot be grouped\r\n if (a.timeline !== b.timeline)\r\n return false;\r\n\r\n // Display transforms are obtained from ModelGroupDisplayTransforms - they are guaranteed to be the same object if they are equivalent.\r\n if (a.displayTransform !== b.displayTransform)\r\n return false;\r\n\r\n if (a.clip || b.clip) {\r\n // Note: ClipVector lacks an `isAlmostEqual` method.\r\n // For two models belonging to the same clip group, we should have the same exact object.\r\n // But we won't currently detect two different objects that represent effectively identical clips.\r\n if (!a.clip || !b.clip || a.clip.clipVector !== b.clip.clipVector)\r\n return false;\r\n }\r\n\r\n if (a.planProjection || b.planProjection) {\r\n if (!a.planProjection || !b.planProjection || !equalPlanProjections(a.planProjection, b.planProjection)) {\r\n return false;\r\n }\r\n }\r\n\r\n if (!equalViewFlags(a.viewFlags, b.viewFlags))\r\n return false;\r\n\r\n return true;\r\n}\r\n\r\n/** Group the supplied `modelIds` such that all models that are to be drawn with equivalent display settings are grouped together.\r\n * @internal\r\n */\r\nexport function groupModels(context: ModelGroupingContext, modelIds: Id64Set): ModelGroup[] {\r\n const groups: ModelGroup[] = [];\r\n for (const modelId of modelIds) {\r\n const info = createModelGroupInfo(context, modelId);\r\n let group = groups.find((x) => equalModelGroupInfo(x, info));\r\n if (!group)\r\n groups.push(group = { ...info, modelIds: new Set<string>() });\r\n\r\n assert(!group.modelIds.has(modelId));\r\n group.modelIds.add(modelId);\r\n }\r\n\r\n return groups;\r\n}\r\n"]}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { Id64Set, Id64String } from "@itwin/core-bentley";
|
|
2
|
+
import { ModelDisplayTransform, ModelDisplayTransformProvider } from "@itwin/core-frontend";
|
|
3
|
+
/** Manages the display transforms to be applied to all of the models in a BatchedTileTree, enabling all models that share an equivalent transform
|
|
4
|
+
* to be drawn together.
|
|
5
|
+
* Call `update` whenever the transforms may have changed (e.g., after the viewport's scene is invalidated).
|
|
6
|
+
* @internal
|
|
7
|
+
*/
|
|
8
|
+
export declare class ModelGroupDisplayTransforms {
|
|
9
|
+
private _state;
|
|
10
|
+
private readonly _modelIds;
|
|
11
|
+
/** Create a new set of groups for the specified `modelIds`. If `provider` is supplied, the grouping will be applied to those models immediately. */
|
|
12
|
+
constructor(modelIds: Id64Set, provider?: ModelDisplayTransformProvider);
|
|
13
|
+
/** A string uniquely identifying the current grouping. */
|
|
14
|
+
get guid(): string;
|
|
15
|
+
/** Get the display transform for the specified model.
|
|
16
|
+
* @note This method is guaranteed to return the same object for all models in the same group, at least between calls to `update`.
|
|
17
|
+
*/
|
|
18
|
+
getDisplayTransform(modelId: Id64String): ModelDisplayTransform | undefined;
|
|
19
|
+
update(provider: ModelDisplayTransformProvider | undefined): boolean;
|
|
20
|
+
private computeState;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=ModelGroupDisplayTransforms.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ModelGroupDisplayTransforms.d.ts","sourceRoot":"","sources":["../../src/ModelGroupDisplayTransforms.ts"],"names":[],"mappings":"AAKA,OAAO,EAAqB,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC7E,OAAO,EAAE,qBAAqB,EAAE,6BAA6B,EAAE,MAAM,sBAAsB,CAAC;AAqB5F;;;;GAIG;AACH,qBAAa,2BAA2B;IACtC,OAAO,CAAC,MAAM,CAAgD;IAC9D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAU;IAEpC,oJAAoJ;gBACjI,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,6BAA6B;IAM9E,0DAA0D;IAC1D,IAAW,IAAI,IAAI,MAAM,CAA6B;IAEtD;;OAEG;IACI,mBAAmB,CAAC,OAAO,EAAE,UAAU,GAAG,qBAAqB,GAAG,SAAS;IAM3E,MAAM,CAAC,QAAQ,EAAE,6BAA6B,GAAG,SAAS,GAAG,OAAO;IAM3E,OAAO,CAAC,YAAY;CAsBrB"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/*---------------------------------------------------------------------------------------------
|
|
3
|
+
* Copyright (c) Bentley Systems, Incorporated. All rights reserved.
|
|
4
|
+
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
5
|
+
*--------------------------------------------------------------------------------------------*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.ModelGroupDisplayTransforms = void 0;
|
|
8
|
+
const core_bentley_1 = require("@itwin/core-bentley");
|
|
9
|
+
function equalDisplayTransforms(a, b) {
|
|
10
|
+
return !!a.premultiply === !!b.premultiply && a.transform.isAlmostEqual(b.transform);
|
|
11
|
+
}
|
|
12
|
+
/** Optimization for the common case in which no display transforms are to be applied. */
|
|
13
|
+
const emptyState = { transforms: [], guid: "" };
|
|
14
|
+
/** Manages the display transforms to be applied to all of the models in a BatchedTileTree, enabling all models that share an equivalent transform
|
|
15
|
+
* to be drawn together.
|
|
16
|
+
* Call `update` whenever the transforms may have changed (e.g., after the viewport's scene is invalidated).
|
|
17
|
+
* @internal
|
|
18
|
+
*/
|
|
19
|
+
class ModelGroupDisplayTransforms {
|
|
20
|
+
/** Create a new set of groups for the specified `modelIds`. If `provider` is supplied, the grouping will be applied to those models immediately. */
|
|
21
|
+
constructor(modelIds, provider) {
|
|
22
|
+
this._state = emptyState;
|
|
23
|
+
this._modelIds = modelIds;
|
|
24
|
+
if (provider)
|
|
25
|
+
this.update(provider);
|
|
26
|
+
}
|
|
27
|
+
/** A string uniquely identifying the current grouping. */
|
|
28
|
+
get guid() { return this._state.guid; }
|
|
29
|
+
/** Get the display transform for the specified model.
|
|
30
|
+
* @note This method is guaranteed to return the same object for all models in the same group, at least between calls to `update`.
|
|
31
|
+
*/
|
|
32
|
+
getDisplayTransform(modelId) {
|
|
33
|
+
return this._state.transforms.find((x) => x.modelIds.has(modelId))?.transform;
|
|
34
|
+
}
|
|
35
|
+
// Update the display transforms and the model groupings based on the transforms supplied by `provider`.
|
|
36
|
+
// Return `true` if the groupings changed as a result.
|
|
37
|
+
update(provider) {
|
|
38
|
+
const prevState = this._state;
|
|
39
|
+
this._state = this.computeState(provider);
|
|
40
|
+
return this._state.guid !== prevState.guid;
|
|
41
|
+
}
|
|
42
|
+
computeState(provider) {
|
|
43
|
+
if (!provider)
|
|
44
|
+
return emptyState;
|
|
45
|
+
const transforms = [];
|
|
46
|
+
for (const modelId of this._modelIds) {
|
|
47
|
+
const transform = provider.getModelDisplayTransform(modelId);
|
|
48
|
+
if (transform) {
|
|
49
|
+
let entry = transforms.find((x) => equalDisplayTransforms(transform, x.transform));
|
|
50
|
+
if (!entry)
|
|
51
|
+
transforms.push(entry = { transform, modelIds: new Set() });
|
|
52
|
+
entry.modelIds.add(modelId);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
if (transforms.length === 0)
|
|
56
|
+
return emptyState;
|
|
57
|
+
const guid = transforms.map((x) => core_bentley_1.CompressedId64Set.compressSet(x.modelIds)).sort().join("_");
|
|
58
|
+
return { transforms, guid };
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
exports.ModelGroupDisplayTransforms = ModelGroupDisplayTransforms;
|
|
62
|
+
//# sourceMappingURL=ModelGroupDisplayTransforms.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ModelGroupDisplayTransforms.js","sourceRoot":"","sources":["../../src/ModelGroupDisplayTransforms.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;;;AAE/F,sDAA6E;AAG7E,SAAS,sBAAsB,CAAC,CAAwB,EAAE,CAAwB;IAChF,OAAO,CAAC,CAAC,CAAC,CAAC,WAAW,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;AACvF,CAAC;AAcD,yFAAyF;AACzF,MAAM,UAAU,GAAqC,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;AAElF;;;;GAIG;AACH,MAAa,2BAA2B;IAItC,oJAAoJ;IACpJ,YAAmB,QAAiB,EAAE,QAAwC;QAJtE,WAAM,GAAqC,UAAU,CAAC;QAK5D,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;QAC1B,IAAI,QAAQ;YACV,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC1B,CAAC;IAED,0DAA0D;IAC1D,IAAW,IAAI,KAAa,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IAEtD;;OAEG;IACI,mBAAmB,CAAC,OAAmB;QAC5C,OAAO,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,SAAS,CAAC;IAChF,CAAC;IAED,wGAAwG;IACxG,sDAAsD;IAC/C,MAAM,CAAC,QAAmD;QAC/D,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC;QAC9B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QAC1C,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC,IAAI,CAAC;IAC7C,CAAC;IAEO,YAAY,CAAC,QAAmD;QACtE,IAAI,CAAC,QAAQ;YACX,OAAO,UAAU,CAAC;QAEpB,MAAM,UAAU,GAAiC,EAAE,CAAC;QACpD,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,SAAS,EAAE;YACpC,MAAM,SAAS,GAAG,QAAQ,CAAC,wBAAwB,CAAC,OAAO,CAAC,CAAC;YAC7D,IAAI,SAAS,EAAE;gBACb,IAAI,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,sBAAsB,CAAC,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;gBACnF,IAAI,CAAC,KAAK;oBACR,UAAU,CAAC,IAAI,CAAC,KAAK,GAAG,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC;gBAE9D,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;aAC7B;SACF;QAED,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;YACzB,OAAO,UAAU,CAAC;QAEpB,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,gCAAiB,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC/F,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;IAC9B,CAAC;CACF;AAnDD,kEAmDC","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 { CompressedId64Set, Id64Set, Id64String } from \"@itwin/core-bentley\";\r\nimport { ModelDisplayTransform, ModelDisplayTransformProvider } from \"@itwin/core-frontend\";\r\n\r\nfunction equalDisplayTransforms(a: ModelDisplayTransform, b: ModelDisplayTransform): boolean {\r\n return !!a.premultiply === !!b.premultiply && a.transform.isAlmostEqual(b.transform);\r\n}\r\n\r\n/** A display transform to be applied to a set of models. */\r\ninterface ModelGroupDisplayTransform {\r\n modelIds: Id64Set;\r\n transform: ModelDisplayTransform;\r\n}\r\n\r\n/** A collection of model Ids grouped according to the unique transforms to be applied to each group. */\r\ninterface ModelGroupDisplayTransformsState {\r\n readonly transforms: ReadonlyArray<ModelGroupDisplayTransform>;\r\n readonly guid: string;\r\n}\r\n\r\n/** Optimization for the common case in which no display transforms are to be applied. */\r\nconst emptyState: ModelGroupDisplayTransformsState = { transforms: [], guid: \"\" };\r\n\r\n/** Manages the display transforms to be applied to all of the models in a BatchedTileTree, enabling all models that share an equivalent transform\r\n * to be drawn together.\r\n * Call `update` whenever the transforms may have changed (e.g., after the viewport's scene is invalidated).\r\n * @internal\r\n */\r\nexport class ModelGroupDisplayTransforms {\r\n private _state: ModelGroupDisplayTransformsState = emptyState;\r\n private readonly _modelIds: Id64Set;\r\n\r\n /** Create a new set of groups for the specified `modelIds`. If `provider` is supplied, the grouping will be applied to those models immediately. */\r\n public constructor(modelIds: Id64Set, provider?: ModelDisplayTransformProvider) {\r\n this._modelIds = modelIds;\r\n if (provider)\r\n this.update(provider);\r\n }\r\n\r\n /** A string uniquely identifying the current grouping. */\r\n public get guid(): string { return this._state.guid; }\r\n\r\n /** Get the display transform for the specified model.\r\n * @note This method is guaranteed to return the same object for all models in the same group, at least between calls to `update`.\r\n */\r\n public getDisplayTransform(modelId: Id64String): ModelDisplayTransform | undefined {\r\n return this._state.transforms.find((x) => x.modelIds.has(modelId))?.transform;\r\n }\r\n\r\n // Update the display transforms and the model groupings based on the transforms supplied by `provider`.\r\n // Return `true` if the groupings changed as a result.\r\n public update(provider: ModelDisplayTransformProvider | undefined): boolean {\r\n const prevState = this._state;\r\n this._state = this.computeState(provider);\r\n return this._state.guid !== prevState.guid;\r\n }\r\n\r\n private computeState(provider: ModelDisplayTransformProvider | undefined): ModelGroupDisplayTransformsState {\r\n if (!provider)\r\n return emptyState;\r\n\r\n const transforms: ModelGroupDisplayTransform[] = [];\r\n for (const modelId of this._modelIds) {\r\n const transform = provider.getModelDisplayTransform(modelId);\r\n if (transform) {\r\n let entry = transforms.find((x) => equalDisplayTransforms(transform, x.transform));\r\n if (!entry)\r\n transforms.push(entry = { transform, modelIds: new Set() });\r\n\r\n entry.modelIds.add(modelId);\r\n }\r\n }\r\n\r\n if (transforms.length === 0)\r\n return emptyState;\r\n\r\n const guid = transforms.map((x) => CompressedId64Set.compressSet(x.modelIds)).sort().join(\"_\");\r\n return { transforms, guid };\r\n }\r\n}\r\n"]}
|
|
@@ -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,106 @@
|
|
|
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 { ModelGroupDisplayTransforms } from "./ModelGroupDisplayTransforms";
|
|
6
|
+
import { groupModels } from "./ModelGroup";
|
|
7
|
+
import { assert, CompressedId64Set } from "@itwin/core-bentley";
|
|
8
|
+
/** Groups the set of spatial models included in a [[BatchedSpatialTileTreeReferences]] based on their display settings.
|
|
9
|
+
* This ensures that models are displayed correctly, while using batching to reduce the number of draw calls to a minimum.
|
|
10
|
+
* 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).
|
|
11
|
+
* Unfortunately, there is currently no way to know when the transforms supplied by a [ModelDisplayTransformProvider]($frontend) may have changed, so
|
|
12
|
+
* display transforms are re-evaluated every time the Viewport's scene is invalidated. This may (but usually won't) affect the groupings.
|
|
13
|
+
* The BatchedSpatialTileTreeReferences object allocates new [[BatchedTileTreeReferences]] whenever the groupings change.
|
|
14
|
+
* @internal
|
|
15
|
+
*/
|
|
16
|
+
export class BatchedModelGroups {
|
|
17
|
+
constructor(view, script, includedModelIds, metadata) {
|
|
18
|
+
this._transformsValid = false;
|
|
19
|
+
this._groupsValid = false;
|
|
20
|
+
this._scriptValid = false;
|
|
21
|
+
/** A stringified representation of the current groupings, of the format:
|
|
22
|
+
* group1_group2_group3_..._groupN
|
|
23
|
+
* where each group is a [CompressedId64Set]($bentley).
|
|
24
|
+
* @see [[BatchedTileTreeId.modelGroups]].
|
|
25
|
+
*/
|
|
26
|
+
this.guid = "";
|
|
27
|
+
this.groups = [];
|
|
28
|
+
this._script = script;
|
|
29
|
+
this._view = view;
|
|
30
|
+
this._includedModelIds = includedModelIds;
|
|
31
|
+
this._metadata = metadata;
|
|
32
|
+
this.modelGroupDisplayTransforms = new ModelGroupDisplayTransforms(includedModelIds, view.modelDisplayTransformProvider);
|
|
33
|
+
this._view.onModelDisplayTransformProviderChanged.addListener(() => this._transformsValid = false);
|
|
34
|
+
this._view.details.onModelClipGroupsChanged.addListener(() => this._groupsValid = false);
|
|
35
|
+
this.listenForDisplayStyleEvents();
|
|
36
|
+
this.update();
|
|
37
|
+
}
|
|
38
|
+
setScript(script) {
|
|
39
|
+
this._script = script;
|
|
40
|
+
this._scriptValid = false;
|
|
41
|
+
}
|
|
42
|
+
invalidateTransforms() { this._transformsValid = false; }
|
|
43
|
+
listenForDisplayStyleEvents() {
|
|
44
|
+
const removeListener = this._view.displayStyle.settings.onPlanProjectionSettingsChanged.addListener(() => this._groupsValid = false);
|
|
45
|
+
this._view.onDisplayStyleChanged.addListener(() => {
|
|
46
|
+
this._groupsValid = false;
|
|
47
|
+
removeListener();
|
|
48
|
+
this.listenForDisplayStyleEvents();
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
getModelClip(modelId) {
|
|
52
|
+
return this._view.getModelClip(modelId);
|
|
53
|
+
}
|
|
54
|
+
getPlanProjectionSettings(modelId) {
|
|
55
|
+
return this._view.displayStyle.settings.getPlanProjectionSettings(modelId);
|
|
56
|
+
}
|
|
57
|
+
getModelTimeline(modelId) {
|
|
58
|
+
return this._script?.modelTimelines.find((x) => x.modelId === modelId);
|
|
59
|
+
}
|
|
60
|
+
getViewFlagOverrides(modelId) {
|
|
61
|
+
return this._metadata.get(modelId)?.viewFlags;
|
|
62
|
+
}
|
|
63
|
+
getDefaultElevation(modelId) {
|
|
64
|
+
const range = this._metadata.get(modelId)?.extents;
|
|
65
|
+
if (range) {
|
|
66
|
+
const low = range.low.z;
|
|
67
|
+
const high = range.high.z;
|
|
68
|
+
if (low <= high)
|
|
69
|
+
return (low + high) / 2;
|
|
70
|
+
}
|
|
71
|
+
return 0;
|
|
72
|
+
}
|
|
73
|
+
/** Re-evaluate transforms and groupings if they may be out of date.
|
|
74
|
+
* @returns true if the groupings changed as a result.
|
|
75
|
+
*/
|
|
76
|
+
update() {
|
|
77
|
+
if (!this._transformsValid && this.modelGroupDisplayTransforms.update(this._view.modelDisplayTransformProvider)) {
|
|
78
|
+
this._groupsValid = false;
|
|
79
|
+
}
|
|
80
|
+
this._transformsValid = true;
|
|
81
|
+
if (this._groupsValid && this._scriptValid) {
|
|
82
|
+
// Update the display transforms on the ModelGroups.
|
|
83
|
+
const getFirstModelId = (ids) => {
|
|
84
|
+
for (const id of ids)
|
|
85
|
+
return id;
|
|
86
|
+
return undefined;
|
|
87
|
+
};
|
|
88
|
+
for (const group of this.groups) {
|
|
89
|
+
if (group.displayTransform) {
|
|
90
|
+
const modelId = getFirstModelId(group.modelIds);
|
|
91
|
+
assert(undefined !== modelId);
|
|
92
|
+
group.displayTransform = this.modelGroupDisplayTransforms.getDisplayTransform(modelId);
|
|
93
|
+
assert(undefined !== group.displayTransform);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
return false; // the groupings haven't changed.
|
|
97
|
+
}
|
|
98
|
+
this.groups = groupModels(this, this._includedModelIds);
|
|
99
|
+
const newGuid = this.groups.map((x) => CompressedId64Set.compressSet(x.modelIds)).join("_");
|
|
100
|
+
const updated = newGuid !== this.guid || !this._scriptValid;
|
|
101
|
+
this.guid = newGuid;
|
|
102
|
+
this._groupsValid = this._scriptValid = true;
|
|
103
|
+
return updated;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=BatchedModelGroups.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BatchedModelGroups.js","sourceRoot":"","sources":["../../src/BatchedModelGroups.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F,OAAO,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAC5E,OAAO,EAAE,WAAW,EAAoC,MAAM,cAAc,CAAC;AAE7E,OAAO,EAAE,MAAM,EAAE,iBAAiB,EAAuB,MAAM,qBAAqB,CAAC;AAIrF;;;;;;;GAOG;AACH,MAAM,OAAO,kBAAkB;IAiB7B,YAAmB,IAAsB,EAAE,MAAyC,EAAE,gBAAyB,EAAE,QAAwC;QAZjJ,qBAAgB,GAAG,KAAK,CAAC;QACzB,iBAAY,GAAG,KAAK,CAAC;QACrB,iBAAY,GAAG,KAAK,CAAC;QAC7B;;;;WAIG;QACI,SAAI,GAAG,EAAE,CAAC;QACV,WAAM,GAAiB,EAAE,CAAC;QAI/B,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,iBAAiB,GAAG,gBAAgB,CAAC;QAC1C,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;QAC1B,IAAI,CAAC,2BAA2B,GAAG,IAAI,2BAA2B,CAAC,gBAAgB,EAAE,IAAI,CAAC,6BAA6B,CAAC,CAAC;QAEzH,IAAI,CAAC,KAAK,CAAC,sCAAsC,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC,CAAC;QACnG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,wBAAwB,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,CAAC;QACzF,IAAI,CAAC,2BAA2B,EAAE,CAAC;QAEnC,IAAI,CAAC,MAAM,EAAE,CAAC;IAChB,CAAC;IAEM,SAAS,CAAC,MAAyC;QACxD,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;QACtB,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;IAC5B,CAAC;IAEM,oBAAoB,KAAW,IAAI,CAAC,gBAAgB,GAAG,KAAK,CAAC,CAAC,CAAC;IAE9D,2BAA2B;QACjC,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,CAAC,+BAA+B,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC,CAAC;QACrI,IAAI,CAAC,KAAK,CAAC,qBAAqB,CAAC,WAAW,CAAC,GAAG,EAAE;YAChD,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;YAC1B,cAAc,EAAE,CAAC;YACjB,IAAI,CAAC,2BAA2B,EAAE,CAAC;QACrC,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,YAAY,CAAC,OAAmB;QACrC,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;IAC1C,CAAC;IAEM,yBAAyB,CAAC,OAAmB;QAClD,OAAO,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,QAAQ,CAAC,yBAAyB,CAAC,OAAO,CAAC,CAAC;IAC7E,CAAC;IAEM,gBAAgB,CAAC,OAAmB;QACzC,OAAO,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC;IACzE,CAAC;IAEM,oBAAoB,CAAC,OAAmB;QAC7C,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,SAAS,CAAC;IAChD,CAAC;IAEM,mBAAmB,CAAC,OAAmB;QAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;QACnD,IAAI,KAAK,EAAE;YACT,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;YACxB,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;YAC1B,IAAI,GAAG,IAAI,IAAI;gBACb,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;SAC3B;QAED,OAAO,CAAC,CAAC;IACX,CAAC;IAED;;OAEG;IACI,MAAM;QACX,IAAI,CAAC,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,2BAA2B,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,6BAA6B,CAAC,EAAE;YAC/G,IAAI,CAAC,YAAY,GAAG,KAAK,CAAC;SAC3B;QAED,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC;QAC7B,IAAI,IAAI,CAAC,YAAY,IAAI,IAAI,CAAC,YAAY,EAAE;YAC1C,oDAAoD;YACpD,MAAM,eAAe,GAAG,CAAC,GAAY,EAAE,EAAE;gBACvC,KAAK,MAAM,EAAE,IAAI,GAAG;oBAClB,OAAO,EAAE,CAAC;gBAEZ,OAAO,SAAS,CAAC;YACnB,CAAC,CAAC;YAEF,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,EAAE;gBAC/B,IAAI,KAAK,CAAC,gBAAgB,EAAE;oBAC1B,MAAM,OAAO,GAAG,eAAe,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;oBAChD,MAAM,CAAC,SAAS,KAAK,OAAO,CAAC,CAAC;oBAC9B,KAAK,CAAC,gBAAgB,GAAG,IAAI,CAAC,2BAA2B,CAAC,mBAAmB,CAAC,OAAO,CAAC,CAAC;oBACvF,MAAM,CAAC,SAAS,KAAK,KAAK,CAAC,gBAAgB,CAAC,CAAC;iBAC9C;aACF;YAED,OAAO,KAAK,CAAC,CAAC,iCAAiC;SAChD;QAED,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,iBAAiB,CAAC,CAAC;QACxD,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAE5F,MAAM,OAAO,GAAG,OAAO,KAAK,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC;QAE5D,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC;QACpB,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC;QAE7C,OAAO,OAAO,CAAC;IACjB,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\nimport { ModelGroupDisplayTransforms } from \"./ModelGroupDisplayTransforms\";\r\nimport { groupModels, ModelGroup, ModelGroupingContext } from \"./ModelGroup\";\r\nimport { RenderClipVolume, SpatialViewState } from \"@itwin/core-frontend\";\r\nimport { assert, CompressedId64Set, Id64Set, Id64String } from \"@itwin/core-bentley\";\r\nimport { PlanProjectionSettings, RenderSchedule, ViewFlagOverrides } from \"@itwin/core-common\";\r\nimport { ModelMetadata } from \"./BatchedTilesetReader\";\r\n\r\n/** Groups the set of spatial models included in a [[BatchedSpatialTileTreeReferences]] based on their display settings.\r\n * This ensures that models are displayed correctly, while using batching to reduce the number of draw calls to a minimum.\r\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).\r\n * Unfortunately, there is currently no way to know when the transforms supplied by a [ModelDisplayTransformProvider]($frontend) may have changed, so\r\n * display transforms are re-evaluated every time the Viewport's scene is invalidated. This may (but usually won't) affect the groupings.\r\n * The BatchedSpatialTileTreeReferences object allocates new [[BatchedTileTreeReferences]] whenever the groupings change.\r\n * @internal\r\n */\r\nexport class BatchedModelGroups implements ModelGroupingContext {\r\n private readonly _view: SpatialViewState;\r\n private readonly _includedModelIds: Id64Set;\r\n private readonly _metadata: Map<Id64String, ModelMetadata>;\r\n private _script?: RenderSchedule.Script;\r\n private _transformsValid = false;\r\n private _groupsValid = false;\r\n private _scriptValid = false;\r\n /** A stringified representation of the current groupings, of the format:\r\n * group1_group2_group3_..._groupN\r\n * where each group is a [CompressedId64Set]($bentley).\r\n * @see [[BatchedTileTreeId.modelGroups]].\r\n */\r\n public guid = \"\";\r\n public groups: ModelGroup[] = [];\r\n public modelGroupDisplayTransforms: ModelGroupDisplayTransforms;\r\n\r\n public constructor(view: SpatialViewState, script: RenderSchedule.Script | undefined, includedModelIds: Id64Set, metadata: Map<Id64String, ModelMetadata>) {\r\n this._script = script;\r\n this._view = view;\r\n this._includedModelIds = includedModelIds;\r\n this._metadata = metadata;\r\n this.modelGroupDisplayTransforms = new ModelGroupDisplayTransforms(includedModelIds, view.modelDisplayTransformProvider);\r\n\r\n this._view.onModelDisplayTransformProviderChanged.addListener(() => this._transformsValid = false);\r\n this._view.details.onModelClipGroupsChanged.addListener(() => this._groupsValid = false);\r\n this.listenForDisplayStyleEvents();\r\n\r\n this.update();\r\n }\r\n\r\n public setScript(script: RenderSchedule.Script | undefined): void {\r\n this._script = script;\r\n this._scriptValid = false;\r\n }\r\n\r\n public invalidateTransforms(): void { this._transformsValid = false; }\r\n\r\n private listenForDisplayStyleEvents(): void {\r\n const removeListener = this._view.displayStyle.settings.onPlanProjectionSettingsChanged.addListener(() => this._groupsValid = false);\r\n this._view.onDisplayStyleChanged.addListener(() => {\r\n this._groupsValid = false;\r\n removeListener();\r\n this.listenForDisplayStyleEvents();\r\n });\r\n }\r\n\r\n public getModelClip(modelId: Id64String): RenderClipVolume | undefined {\r\n return this._view.getModelClip(modelId);\r\n }\r\n\r\n public getPlanProjectionSettings(modelId: Id64String): PlanProjectionSettings | undefined {\r\n return this._view.displayStyle.settings.getPlanProjectionSettings(modelId);\r\n }\r\n\r\n public getModelTimeline(modelId: Id64String): RenderSchedule.ModelTimeline | undefined {\r\n return this._script?.modelTimelines.find((x) => x.modelId === modelId);\r\n }\r\n\r\n public getViewFlagOverrides(modelId: Id64String): ViewFlagOverrides | undefined {\r\n return this._metadata.get(modelId)?.viewFlags;\r\n }\r\n\r\n public getDefaultElevation(modelId: Id64String): number {\r\n const range = this._metadata.get(modelId)?.extents;\r\n if (range) {\r\n const low = range.low.z;\r\n const high = range.high.z;\r\n if (low <= high)\r\n return (low + high) / 2;\r\n }\r\n\r\n return 0;\r\n }\r\n\r\n /** Re-evaluate transforms and groupings if they may be out of date.\r\n * @returns true if the groupings changed as a result.\r\n */\r\n public update(): boolean {\r\n if (!this._transformsValid && this.modelGroupDisplayTransforms.update(this._view.modelDisplayTransformProvider)) {\r\n this._groupsValid = false;\r\n }\r\n\r\n this._transformsValid = true;\r\n if (this._groupsValid && this._scriptValid) {\r\n // Update the display transforms on the ModelGroups.\r\n const getFirstModelId = (ids: Id64Set) => {\r\n for (const id of ids)\r\n return id;\r\n\r\n return undefined;\r\n };\r\n\r\n for (const group of this.groups) {\r\n if (group.displayTransform) {\r\n const modelId = getFirstModelId(group.modelIds);\r\n assert(undefined !== modelId);\r\n group.displayTransform = this.modelGroupDisplayTransforms.getDisplayTransform(modelId);\r\n assert(undefined !== group.displayTransform);\r\n }\r\n }\r\n\r\n return false; // the groupings haven't changed.\r\n }\r\n\r\n this.groups = groupModels(this, this._includedModelIds);\r\n const newGuid = this.groups.map((x) => CompressedId64Set.compressSet(x.modelIds)).join(\"_\");\r\n\r\n const updated = newGuid !== this.guid || !this._scriptValid;\r\n\r\n this.guid = newGuid;\r\n this._groupsValid = this._scriptValid = true;\r\n\r\n return updated;\r\n }\r\n}\r\n"]}
|
|
@@ -1,12 +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
6
|
private _viewedModels;
|
|
6
7
|
private readonly _viewedExtents;
|
|
7
8
|
private readonly _viewedModelIdPairs;
|
|
8
|
-
private readonly
|
|
9
|
-
constructor(view: SpatialViewState,
|
|
9
|
+
private readonly _metadata;
|
|
10
|
+
constructor(view: SpatialViewState, metadata: Map<Id64String, ModelMetadata>);
|
|
10
11
|
setViewedModels(models: Set<Id64String>): void;
|
|
11
12
|
views(modelId: Id64String): boolean;
|
|
12
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;AAC/C,OAAO,EAAE,gBAAgB,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/esm/BatchedModels.js
CHANGED
|
@@ -5,10 +5,10 @@
|
|
|
5
5
|
import { Id64 } from "@itwin/core-bentley";
|
|
6
6
|
import { Range3d } from "@itwin/core-geometry";
|
|
7
7
|
export class BatchedModels {
|
|
8
|
-
constructor(view,
|
|
8
|
+
constructor(view, metadata) {
|
|
9
9
|
this._viewedExtents = new Range3d();
|
|
10
10
|
this._viewedModelIdPairs = new Id64.Uint32Set();
|
|
11
|
-
this.
|
|
11
|
+
this._metadata = metadata;
|
|
12
12
|
this.setViewedModels(view.modelSelector.models);
|
|
13
13
|
}
|
|
14
14
|
setViewedModels(models) {
|
|
@@ -17,7 +17,7 @@ export class BatchedModels {
|
|
|
17
17
|
this._viewedModelIdPairs.addIds(models);
|
|
18
18
|
this._viewedExtents.setNull();
|
|
19
19
|
for (const modelId of models) {
|
|
20
|
-
const range = this.
|
|
20
|
+
const range = this._metadata.get(modelId)?.extents;
|
|
21
21
|
if (range)
|
|
22
22
|
this._viewedExtents.extendRange(range);
|
|
23
23
|
}
|
|
@@ -1 +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;
|
|
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;IAMxB,YAAmB,IAAsB,EAAE,QAAwC;QAJlE,mBAAc,GAAG,IAAI,OAAO,EAAE,CAAC;QAC/B,wBAAmB,GAAG,IAAI,IAAI,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","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 { SpatialViewState } from \"@itwin/core-frontend\";\r\nimport { ModelMetadata } from \"./BatchedTilesetReader\";\r\n\r\nexport class BatchedModels {\r\n private _viewedModels!: Set<Id64String>;\r\n private readonly _viewedExtents = new Range3d();\r\n private readonly _viewedModelIdPairs = new Id64.Uint32Set();\r\n private readonly _metadata: Map<Id64String, ModelMetadata>;\r\n\r\n public constructor(view: SpatialViewState, metadata: Map<Id64String, ModelMetadata>) {\r\n this._metadata = metadata;\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 this._viewedExtents.setNull();\r\n\r\n for (const modelId of models) {\r\n const range = this._metadata.get(modelId)?.extents;\r\n if (range)\r\n this._viewedExtents.extendRange(range);\r\n }\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 range.extendRange(this._viewedExtents);\r\n }\r\n}\r\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"}
|
|
@@ -2,29 +2,44 @@
|
|
|
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 {
|
|
6
|
-
import { createSpatialTileTreeReferences, TileTreeLoadStatus, TileTreeReference, } from "@itwin/core-frontend";
|
|
7
|
-
import {
|
|
5
|
+
import { Logger } from "@itwin/core-bentley";
|
|
6
|
+
import { AnimationNodeId, createSpatialTileTreeReferences, TileTreeLoadStatus, TileTreeReference, } from "@itwin/core-frontend";
|
|
7
|
+
import { BatchedTileTreeReference } from "./BatchedTileTreeReference";
|
|
8
8
|
import { getBatchedTileTreeOwner } from "./BatchedTileTreeSupplier";
|
|
9
9
|
import { BatchedModels } from "./BatchedModels";
|
|
10
10
|
import { BatchedTilesetSpec } from "./BatchedTilesetReader";
|
|
11
11
|
import { loggerCategory } from "./LoggerCategory";
|
|
12
|
+
import { BatchedModelGroups } from "./BatchedModelGroups";
|
|
12
13
|
// Obtains tiles pre-published by mesh export service.
|
|
13
14
|
class BatchedSpatialTileTreeReferences {
|
|
14
15
|
constructor(spec, view) {
|
|
15
|
-
this.
|
|
16
|
+
this._refs = [];
|
|
16
17
|
this._view = view;
|
|
17
|
-
this._models = new BatchedModels(view, spec.
|
|
18
|
+
this._models = new BatchedModels(view, spec.models);
|
|
19
|
+
this._spec = spec;
|
|
18
20
|
const script = view.displayStyle.scheduleScript;
|
|
19
21
|
this._currentScript = script?.requiresBatching ? script : undefined;
|
|
20
|
-
|
|
21
|
-
this.
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
22
|
+
const includedModels = new Set(spec.models.keys());
|
|
23
|
+
this._excludedRefs = createSpatialTileTreeReferences(view, includedModels);
|
|
24
|
+
this._groups = new BatchedModelGroups(view, this._currentScript, includedModels, spec.models);
|
|
25
|
+
this._treeOwner = this.getTreeOwner();
|
|
26
|
+
this.loadRefs();
|
|
27
|
+
this.listenForScriptChange();
|
|
28
|
+
}
|
|
29
|
+
ensureLoaded() {
|
|
30
|
+
if (!this._groups.update())
|
|
31
|
+
return;
|
|
32
|
+
this._treeOwner = this.getTreeOwner();
|
|
33
|
+
this.loadRefs();
|
|
34
|
+
}
|
|
35
|
+
getTreeOwner() {
|
|
36
|
+
return getBatchedTileTreeOwner(this._view.iModel, {
|
|
37
|
+
spec: this._spec,
|
|
38
|
+
script: this._currentScript,
|
|
39
|
+
modelGroups: this._groups.guid,
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
listenForScriptChange() {
|
|
28
43
|
const onScriptChanged = (newScript) => {
|
|
29
44
|
if (!newScript?.requiresBatching)
|
|
30
45
|
newScript = undefined;
|
|
@@ -32,39 +47,40 @@ class BatchedSpatialTileTreeReferences {
|
|
|
32
47
|
this._currentScript = newScript;
|
|
33
48
|
if (newScript !== currentScript)
|
|
34
49
|
if (!newScript || !currentScript || !newScript.equals(currentScript))
|
|
35
|
-
this.
|
|
50
|
+
this._groups.setScript(newScript);
|
|
36
51
|
};
|
|
37
|
-
let
|
|
52
|
+
let rmListener = this._view.displayStyle.onScheduleScriptChanged.addListener((newScript) => onScriptChanged(newScript));
|
|
38
53
|
this._view.onDisplayStyleChanged.addListener((newStyle) => {
|
|
39
|
-
|
|
54
|
+
rmListener();
|
|
40
55
|
onScriptChanged(newStyle.scheduleScript);
|
|
41
|
-
|
|
56
|
+
rmListener = this._view.displayStyle.onScheduleScriptChanged.addListener((newScript) => onScriptChanged(newScript));
|
|
42
57
|
});
|
|
43
58
|
}
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
for (const nodeId of nodeIds) {
|
|
60
|
-
this._animatedRefs.push(new AnimatedBatchedTileTreeReference(treeOwner, {
|
|
61
|
-
timeline,
|
|
62
|
-
nodeId,
|
|
63
|
-
getCurrentTimePoint,
|
|
64
|
-
}));
|
|
59
|
+
loadRefs() {
|
|
60
|
+
this._refs.length = 0;
|
|
61
|
+
const groups = this._groups.groups;
|
|
62
|
+
const args = {
|
|
63
|
+
models: this._models,
|
|
64
|
+
groups,
|
|
65
|
+
treeOwner: this._treeOwner,
|
|
66
|
+
getCurrentTimePoint: () => this._currentScript ? (this._view.displayStyle.settings.timePoint ?? this._currentScript.duration.low) : 0,
|
|
67
|
+
};
|
|
68
|
+
for (let i = 0; i < groups.length; i++) {
|
|
69
|
+
const timeline = groups[i].timeline;
|
|
70
|
+
this._refs.push(new BatchedTileTreeReference(args, i, timeline ? AnimationNodeId.Untransformed : undefined));
|
|
71
|
+
if (timeline) {
|
|
72
|
+
for (const nodeId of timeline.transformBatchIds)
|
|
73
|
+
this._refs.push(new BatchedTileTreeReference(args, i, nodeId));
|
|
65
74
|
}
|
|
66
75
|
}
|
|
67
76
|
}
|
|
77
|
+
*[Symbol.iterator]() {
|
|
78
|
+
this.ensureLoaded();
|
|
79
|
+
for (const ref of this._refs)
|
|
80
|
+
yield ref;
|
|
81
|
+
for (const ref of this._excludedRefs)
|
|
82
|
+
yield ref;
|
|
83
|
+
}
|
|
68
84
|
update() {
|
|
69
85
|
this._excludedRefs.update();
|
|
70
86
|
this._models.setViewedModels(this._view.modelSelector.models);
|
|
@@ -74,10 +90,15 @@ class BatchedSpatialTileTreeReferences {
|
|
|
74
90
|
attachToViewport(args) {
|
|
75
91
|
this._onModelSelectorChanged = () => args.invalidateSymbologyOverrides();
|
|
76
92
|
this._excludedRefs.attachToViewport(args);
|
|
93
|
+
this._removeSceneInvalidationListener = args.onSceneInvalidated.addListener(() => this._groups.invalidateTransforms());
|
|
77
94
|
}
|
|
78
95
|
detachFromViewport() {
|
|
79
96
|
this._onModelSelectorChanged = undefined;
|
|
80
97
|
this._excludedRefs.detachFromViewport();
|
|
98
|
+
if (this._removeSceneInvalidationListener) {
|
|
99
|
+
this._removeSceneInvalidationListener();
|
|
100
|
+
this._removeSceneInvalidationListener = undefined;
|
|
101
|
+
}
|
|
81
102
|
}
|
|
82
103
|
setDeactivated() {
|
|
83
104
|
// Used for debugging. Unimplemented here.
|