@itwin/frontend-tiles 3.7.4 → 4.0.0-dev.100
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.rush/temp/operation/build/all.log +3 -0
- package/.rush/temp/operation/build/state.json +3 -0
- package/.rush/temp/{package-deps_build_ci.json → package-deps_build.json} +11 -10
- package/.rush/temp/shrinkwrap-deps.json +195 -46
- package/config/rush-project.json +1 -2
- package/lib/cjs/BatchedModels.d.ts +16 -0
- package/lib/cjs/BatchedModels.d.ts.map +1 -0
- package/lib/cjs/BatchedModels.js +48 -0
- package/lib/cjs/BatchedModels.js.map +1 -0
- package/lib/cjs/BatchedSpatialTileTreeRefs.d.ts +4 -4
- package/lib/cjs/BatchedSpatialTileTreeRefs.d.ts.map +1 -1
- package/lib/cjs/BatchedSpatialTileTreeRefs.js +180 -133
- package/lib/cjs/BatchedSpatialTileTreeRefs.js.map +1 -1
- package/lib/cjs/BatchedTile.d.ts +24 -24
- package/lib/cjs/BatchedTile.d.ts.map +1 -1
- package/lib/cjs/BatchedTile.js +168 -168
- package/lib/cjs/BatchedTile.js.map +1 -1
- package/lib/cjs/BatchedTileContentReader.d.ts +22 -22
- package/lib/cjs/BatchedTileContentReader.js +74 -76
- package/lib/cjs/BatchedTileContentReader.js.map +1 -1
- package/lib/cjs/BatchedTileTree.d.ts +24 -22
- package/lib/cjs/BatchedTileTree.d.ts.map +1 -1
- package/lib/cjs/BatchedTileTree.js +53 -52
- package/lib/cjs/BatchedTileTree.js.map +1 -1
- package/lib/cjs/BatchedTileTreeReference.d.ts +33 -21
- package/lib/cjs/BatchedTileTreeReference.d.ts.map +1 -1
- package/lib/cjs/BatchedTileTreeReference.js +74 -73
- package/lib/cjs/BatchedTileTreeReference.js.map +1 -1
- package/lib/cjs/BatchedTileTreeSupplier.d.ts +9 -5
- package/lib/cjs/BatchedTileTreeSupplier.d.ts.map +1 -1
- package/lib/cjs/BatchedTileTreeSupplier.js +40 -38
- package/lib/cjs/BatchedTileTreeSupplier.js.map +1 -1
- package/lib/cjs/BatchedTilesetReader.d.ts +13 -13
- package/lib/cjs/BatchedTilesetReader.js +87 -88
- package/lib/cjs/BatchedTilesetReader.js.map +1 -1
- package/lib/cjs/FrontendTiles.d.ts +32 -32
- package/lib/cjs/FrontendTiles.d.ts.map +1 -1
- package/lib/cjs/FrontendTiles.js +26 -26
- package/lib/cjs/LoggerCategory.d.ts +2 -2
- package/lib/cjs/LoggerCategory.js +9 -9
- package/lib/cjs/frontend-tiles.d.ts +1 -1
- package/lib/cjs/frontend-tiles.js +21 -17
- package/lib/cjs/frontend-tiles.js.map +1 -1
- package/lib/cjs/tsconfig.tsbuildinfo +1 -1
- package/lib/esm/BatchedModels.d.ts +16 -0
- package/lib/esm/BatchedModels.d.ts.map +1 -0
- package/lib/esm/BatchedModels.js +44 -0
- package/lib/esm/BatchedModels.js.map +1 -0
- package/lib/esm/BatchedSpatialTileTreeRefs.d.ts +4 -4
- package/lib/esm/BatchedSpatialTileTreeRefs.d.ts.map +1 -1
- package/lib/esm/BatchedSpatialTileTreeRefs.js +176 -129
- package/lib/esm/BatchedSpatialTileTreeRefs.js.map +1 -1
- package/lib/esm/BatchedTile.d.ts +24 -24
- package/lib/esm/BatchedTile.d.ts.map +1 -1
- package/lib/esm/BatchedTile.js +164 -164
- package/lib/esm/BatchedTile.js.map +1 -1
- package/lib/esm/BatchedTileContentReader.d.ts +22 -22
- package/lib/esm/BatchedTileContentReader.js +70 -72
- package/lib/esm/BatchedTileContentReader.js.map +1 -1
- package/lib/esm/BatchedTileTree.d.ts +24 -22
- package/lib/esm/BatchedTileTree.d.ts.map +1 -1
- package/lib/esm/BatchedTileTree.js +49 -48
- package/lib/esm/BatchedTileTree.js.map +1 -1
- package/lib/esm/BatchedTileTreeReference.d.ts +33 -21
- package/lib/esm/BatchedTileTreeReference.d.ts.map +1 -1
- package/lib/esm/BatchedTileTreeReference.js +68 -69
- package/lib/esm/BatchedTileTreeReference.js.map +1 -1
- package/lib/esm/BatchedTileTreeSupplier.d.ts +9 -5
- package/lib/esm/BatchedTileTreeSupplier.d.ts.map +1 -1
- package/lib/esm/BatchedTileTreeSupplier.js +36 -34
- package/lib/esm/BatchedTileTreeSupplier.js.map +1 -1
- package/lib/esm/BatchedTilesetReader.d.ts +13 -13
- package/lib/esm/BatchedTilesetReader.js +83 -84
- package/lib/esm/BatchedTilesetReader.js.map +1 -1
- package/lib/esm/FrontendTiles.d.ts +32 -32
- package/lib/esm/FrontendTiles.d.ts.map +1 -1
- package/lib/esm/FrontendTiles.js +21 -21
- package/lib/esm/LoggerCategory.d.ts +2 -2
- package/lib/esm/LoggerCategory.js +6 -6
- package/lib/esm/frontend-tiles.d.ts +1 -1
- package/lib/esm/frontend-tiles.js +5 -5
- package/lib/esm/tsconfig.tsbuildinfo +1 -1
- package/package.json +18 -19
- package/src/BatchedModels.ts +58 -0
- package/src/BatchedSpatialTileTreeRefs.ts +79 -13
- package/src/BatchedTile.ts +1 -0
- package/src/BatchedTileTree.ts +4 -1
- package/src/BatchedTileTreeReference.ts +69 -58
- package/src/BatchedTileTreeSupplier.ts +15 -8
- package/.rush/temp/operation/build_ci/state.json +0 -3
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@itwin/frontend-tiles",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "4.0.0-dev.100",
|
|
4
4
|
"description": "Experimental alternative technique for visualizing the contents of iModels",
|
|
5
5
|
"main": "lib/cjs/frontend-tiles.js",
|
|
6
6
|
"module": "lib/esm/frontend-tiles.js",
|
|
@@ -8,7 +8,8 @@
|
|
|
8
8
|
"license": "MIT",
|
|
9
9
|
"repository": {
|
|
10
10
|
"type": "git",
|
|
11
|
-
"url": "https://github.com/iTwin/itwinjs-core
|
|
11
|
+
"url": "https://github.com/iTwin/itwinjs-core.git",
|
|
12
|
+
"directory": "extensions/frontend-tiles"
|
|
12
13
|
},
|
|
13
14
|
"keywords": [
|
|
14
15
|
"Bentley",
|
|
@@ -22,22 +23,22 @@
|
|
|
22
23
|
"url": "http://www.bentley.com"
|
|
23
24
|
},
|
|
24
25
|
"peerDependencies": {
|
|
25
|
-
"@itwin/core-bentley": "
|
|
26
|
-
"@itwin/core-common": "
|
|
27
|
-
"@itwin/core-frontend": "
|
|
28
|
-
"@itwin/core-geometry": "
|
|
26
|
+
"@itwin/core-bentley": "4.0.0-dev.100",
|
|
27
|
+
"@itwin/core-common": "4.0.0-dev.100",
|
|
28
|
+
"@itwin/core-frontend": "4.0.0-dev.100",
|
|
29
|
+
"@itwin/core-geometry": "4.0.0-dev.100"
|
|
29
30
|
},
|
|
30
31
|
"devDependencies": {
|
|
31
|
-
"@itwin/
|
|
32
|
-
"@
|
|
33
|
-
"
|
|
34
|
-
"@itwin/core-frontend": "3.7.4",
|
|
35
|
-
"@itwin/core-geometry": "3.7.4",
|
|
36
|
-
"@itwin/eslint-plugin": "3.7.4",
|
|
37
|
-
"@types/node": "18.11.5",
|
|
38
|
-
"eslint": "^7.11.0",
|
|
32
|
+
"@itwin/eslint-plugin": "^4.0.0-dev.33",
|
|
33
|
+
"@types/node": "^18.11.5",
|
|
34
|
+
"eslint": "^8.36.0",
|
|
39
35
|
"rimraf": "^3.0.2",
|
|
40
|
-
"typescript": "~
|
|
36
|
+
"typescript": "~5.0.2",
|
|
37
|
+
"@itwin/build-tools": "4.0.0-dev.100",
|
|
38
|
+
"@itwin/core-bentley": "4.0.0-dev.100",
|
|
39
|
+
"@itwin/core-common": "4.0.0-dev.100",
|
|
40
|
+
"@itwin/core-frontend": "4.0.0-dev.100",
|
|
41
|
+
"@itwin/core-geometry": "4.0.0-dev.100"
|
|
41
42
|
},
|
|
42
43
|
"eslintConfig": {
|
|
43
44
|
"plugins": [
|
|
@@ -46,8 +47,7 @@
|
|
|
46
47
|
"extends": "plugin:@itwin/itwinjs-recommended"
|
|
47
48
|
},
|
|
48
49
|
"scripts": {
|
|
49
|
-
"build": "npm run -s build:cjs",
|
|
50
|
-
"build:ci": "npm run -s build && npm run -s build:esm",
|
|
50
|
+
"build": "npm run -s build:cjs && npm run -s build:esm",
|
|
51
51
|
"build:cjs": "tsc 1>&2 --outDir lib/cjs",
|
|
52
52
|
"build:esm": "tsc 1>&2 --module ES2020 --outDir lib/esm",
|
|
53
53
|
"clean": "rimraf lib .rush/temp/package-deps*.json",
|
|
@@ -56,6 +56,5 @@
|
|
|
56
56
|
"lint": "eslint -f visualstudio \"./src/**/*.ts\" 1>&2",
|
|
57
57
|
"test": "",
|
|
58
58
|
"cover": ""
|
|
59
|
-
}
|
|
60
|
-
"readme": "# @itwin/frontend-tiles\r\n\r\nCopyright © Bentley Systems, Incorporated. All rights reserved. See LICENSE.md for license terms and full copyright notice.\r\n\r\n## Description\r\n\r\nThe __@itwin/frontend-tiles__ package provides an experimental alternative technique for visualizing the contents of an iModel. Use `initializeFrontendTiles` to activate it.\r\n\r\n## Documentation\r\n\r\nSee the [iTwin.js](https://www.itwinjs.org) documentation for more information.\r\n\r\n"
|
|
59
|
+
}
|
|
61
60
|
}
|
|
@@ -0,0 +1,58 @@
|
|
|
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
|
+
|
|
6
|
+
import { Id64, Id64String } from "@itwin/core-bentley";
|
|
7
|
+
import { Range3d } from "@itwin/core-geometry";
|
|
8
|
+
import { ModelExtentsProps } from "@itwin/core-common";
|
|
9
|
+
import { IModelConnection, SpatialViewState } from "@itwin/core-frontend";
|
|
10
|
+
|
|
11
|
+
export class BatchedModels {
|
|
12
|
+
private readonly _iModel: IModelConnection;
|
|
13
|
+
private _viewedModels!: Set<Id64String>;
|
|
14
|
+
private readonly _viewedModelIdPairs = new Id64.Uint32Set();
|
|
15
|
+
private readonly _modelRanges = new Map<Id64String, Range3d>();
|
|
16
|
+
private _modelRangePromise?: Promise<void>;
|
|
17
|
+
|
|
18
|
+
public constructor(view: SpatialViewState) {
|
|
19
|
+
this._iModel = view.iModel;
|
|
20
|
+
this.setViewedModels(view.modelSelector.models);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
public setViewedModels(models: Set<Id64String>): void {
|
|
24
|
+
this._viewedModels = models;
|
|
25
|
+
this._viewedModelIdPairs.clear();
|
|
26
|
+
this._viewedModelIdPairs.addIds(models);
|
|
27
|
+
|
|
28
|
+
this._modelRangePromise = undefined;
|
|
29
|
+
const modelIds = Array.from(models).filter((modelId) => !this._modelRanges.has(modelId));
|
|
30
|
+
if (modelIds.length === 0)
|
|
31
|
+
return;
|
|
32
|
+
|
|
33
|
+
const modelRangePromise = this._modelRangePromise = this._iModel.models.queryExtents(modelIds).then((extents: ModelExtentsProps[]) => {
|
|
34
|
+
if (modelRangePromise !== this._modelRangePromise)
|
|
35
|
+
return;
|
|
36
|
+
|
|
37
|
+
this._modelRangePromise = undefined;
|
|
38
|
+
for (const extent of extents)
|
|
39
|
+
this._modelRanges.set(extent.id, Range3d.fromJSON(extent.extents));
|
|
40
|
+
}).catch(() => { });
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
public views(modelId: Id64String): boolean {
|
|
44
|
+
return this._viewedModels.has(modelId);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
public isViewed(modelIdLo: number, modelIdHi: number): boolean {
|
|
48
|
+
return this._viewedModelIdPairs.has(modelIdLo, modelIdHi);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
public unionRange(range: Range3d): void {
|
|
52
|
+
for (const id of this._viewedModels) {
|
|
53
|
+
const extent = this._modelRanges.get(id);
|
|
54
|
+
if (extent)
|
|
55
|
+
range.extendRange(extent);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
@@ -3,38 +3,105 @@
|
|
|
3
3
|
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
4
4
|
*--------------------------------------------------------------------------------------------*/
|
|
5
5
|
|
|
6
|
+
import { assert } from "@itwin/core-bentley";
|
|
7
|
+
import { RenderSchedule } from "@itwin/core-common";
|
|
6
8
|
import {
|
|
7
9
|
AttachToViewportArgs, IModelConnection, SpatialTileTreeReferences, SpatialViewState, TileTreeLoadStatus, TileTreeOwner, TileTreeReference,
|
|
8
10
|
} from "@itwin/core-frontend";
|
|
9
|
-
import {
|
|
11
|
+
import { AnimatedBatchedTileTreeReference, PrimaryBatchedTileTreeReference } from "./BatchedTileTreeReference";
|
|
12
|
+
import { getBatchedTileTreeOwner } from "./BatchedTileTreeSupplier";
|
|
13
|
+
import { BatchedModels } from "./BatchedModels";
|
|
10
14
|
import { ComputeSpatialTilesetBaseUrl, createFallbackSpatialTileTreeReferences } from "./FrontendTiles";
|
|
11
15
|
|
|
12
16
|
// Obtains tiles pre-published by mesh export service.
|
|
13
17
|
class BatchedSpatialTileTreeReferences implements SpatialTileTreeReferences {
|
|
14
|
-
private readonly
|
|
18
|
+
private readonly _view: SpatialViewState;
|
|
19
|
+
private readonly _models: BatchedModels;
|
|
20
|
+
private _currentScript?: RenderSchedule.Script;
|
|
21
|
+
private _primaryRef!: PrimaryBatchedTileTreeReference;
|
|
22
|
+
private readonly _animatedRefs: AnimatedBatchedTileTreeReference[] = [];
|
|
23
|
+
private _onModelSelectorChanged?: () => void;
|
|
15
24
|
|
|
16
|
-
public constructor(
|
|
17
|
-
this.
|
|
25
|
+
public constructor(baseUrl: URL, view: SpatialViewState) {
|
|
26
|
+
this._view = view;
|
|
27
|
+
this._models = new BatchedModels(view);
|
|
28
|
+
|
|
29
|
+
const script = view.displayStyle.scheduleScript;
|
|
30
|
+
this._currentScript = script?.requiresBatching ? script : undefined;
|
|
31
|
+
|
|
32
|
+
this.load(baseUrl, view.iModel);
|
|
33
|
+
|
|
34
|
+
assert(undefined !== this._primaryRef);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
private load(baseUrl: URL, iModel: IModelConnection): void {
|
|
38
|
+
const treeOwner = getBatchedTileTreeOwner(iModel, { baseUrl, script: this._currentScript });
|
|
39
|
+
this._primaryRef = new PrimaryBatchedTileTreeReference(treeOwner, this._models);
|
|
40
|
+
|
|
41
|
+
this.populateAnimatedReferences(treeOwner);
|
|
42
|
+
|
|
43
|
+
const onScriptChanged = (newScript: RenderSchedule.Script | undefined) => {
|
|
44
|
+
if (!newScript?.requiresBatching)
|
|
45
|
+
newScript = undefined;
|
|
46
|
+
|
|
47
|
+
const currentScript = this._currentScript;
|
|
48
|
+
this._currentScript = newScript;
|
|
49
|
+
|
|
50
|
+
if (newScript !== currentScript)
|
|
51
|
+
if (!newScript || !currentScript || !newScript.equals(currentScript))
|
|
52
|
+
this.load(baseUrl, iModel);
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
let removeScriptChangedListener = this._view.displayStyle.onScheduleScriptChanged.addListener((newScript) => onScriptChanged(newScript));
|
|
56
|
+
this._view.onDisplayStyleChanged.addListener((newStyle) => {
|
|
57
|
+
removeScriptChangedListener();
|
|
58
|
+
onScriptChanged(newStyle.scheduleScript);
|
|
59
|
+
removeScriptChangedListener = this._view.displayStyle.onScheduleScriptChanged.addListener((newScript) => onScriptChanged(newScript));
|
|
60
|
+
});
|
|
18
61
|
}
|
|
19
62
|
|
|
20
63
|
public *[Symbol.iterator](): Iterator<TileTreeReference> {
|
|
21
|
-
yield this.
|
|
64
|
+
yield this._primaryRef;
|
|
65
|
+
|
|
66
|
+
for (const animatedRef of this._animatedRefs)
|
|
67
|
+
yield animatedRef;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
private populateAnimatedReferences(treeOwner: TileTreeOwner): void {
|
|
71
|
+
this._animatedRefs.length = 0;
|
|
72
|
+
const script = this._currentScript;
|
|
73
|
+
if (!script)
|
|
74
|
+
return;
|
|
75
|
+
|
|
76
|
+
const getCurrentTimePoint = () => this._view.displayStyle.settings.timePoint ?? script.duration.low;
|
|
77
|
+
for (const timeline of script.modelTimelines) {
|
|
78
|
+
const nodeIds = timeline.transformBatchIds;
|
|
79
|
+
for (const nodeId of nodeIds) {
|
|
80
|
+
this._animatedRefs.push(new AnimatedBatchedTileTreeReference(treeOwner, {
|
|
81
|
+
timeline,
|
|
82
|
+
nodeId,
|
|
83
|
+
getCurrentTimePoint,
|
|
84
|
+
}));
|
|
85
|
+
}
|
|
86
|
+
}
|
|
22
87
|
}
|
|
23
88
|
|
|
24
89
|
public update(): void {
|
|
25
|
-
this.
|
|
90
|
+
this._models.setViewedModels(this._view.modelSelector.models);
|
|
91
|
+
if (this._onModelSelectorChanged)
|
|
92
|
+
this._onModelSelectorChanged();
|
|
26
93
|
}
|
|
27
94
|
|
|
28
95
|
public attachToViewport(args: AttachToViewportArgs): void {
|
|
29
|
-
this.
|
|
96
|
+
this._onModelSelectorChanged = () => args.invalidateSymbologyOverrides();
|
|
30
97
|
}
|
|
31
98
|
|
|
32
99
|
public detachFromViewport(): void {
|
|
33
|
-
this.
|
|
100
|
+
this._onModelSelectorChanged = undefined;
|
|
34
101
|
}
|
|
35
102
|
|
|
36
103
|
public setDeactivated(): void {
|
|
37
|
-
//
|
|
104
|
+
// Used for debugging. Unimplemented here.
|
|
38
105
|
}
|
|
39
106
|
}
|
|
40
107
|
|
|
@@ -79,8 +146,7 @@ class ProxySpatialTileTreeReferences implements SpatialTileTreeReferences {
|
|
|
79
146
|
this._proxyRef = new ProxyTileTreeReference(view.iModel);
|
|
80
147
|
getBaseUrl.then((url: URL | undefined) => {
|
|
81
148
|
if (url) {
|
|
82
|
-
|
|
83
|
-
this.setTreeRefs(new BatchedSpatialTileTreeReferences(ref));
|
|
149
|
+
this.setTreeRefs(new BatchedSpatialTileTreeReferences(url, view));
|
|
84
150
|
} else {
|
|
85
151
|
this.setTreeRefs(createFallbackSpatialTileTreeReferences(view));
|
|
86
152
|
}
|
|
@@ -155,6 +221,6 @@ export function createBatchedSpatialTileTreeReferences(view: SpatialViewState, c
|
|
|
155
221
|
if (entry instanceof Promise)
|
|
156
222
|
return new ProxySpatialTileTreeReferences(view, entry);
|
|
157
223
|
|
|
158
|
-
|
|
159
|
-
return new BatchedSpatialTileTreeReferences(ref);
|
|
224
|
+
return new BatchedSpatialTileTreeReferences(entry, view);
|
|
160
225
|
}
|
|
226
|
+
|
package/src/BatchedTile.ts
CHANGED
package/src/BatchedTileTree.ts
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*--------------------------------------------------------------------------------------------*/
|
|
5
5
|
|
|
6
6
|
import { BeTimePoint } from "@itwin/core-bentley";
|
|
7
|
-
import { RenderMode, ViewFlagOverrides } from "@itwin/core-common";
|
|
7
|
+
import { RenderMode, RenderSchedule, ViewFlagOverrides } from "@itwin/core-common";
|
|
8
8
|
import {
|
|
9
9
|
Tile, TileDrawArgs, TileTree, TileTreeParams,
|
|
10
10
|
} from "@itwin/core-frontend";
|
|
@@ -15,6 +15,7 @@ import { BatchedTilesetReader } from "./BatchedTilesetReader";
|
|
|
15
15
|
export interface BatchedTileTreeParams extends TileTreeParams {
|
|
16
16
|
rootTile: BatchedTileParams;
|
|
17
17
|
reader: BatchedTilesetReader;
|
|
18
|
+
script?: RenderSchedule.Script;
|
|
18
19
|
}
|
|
19
20
|
|
|
20
21
|
const viewFlagOverrides: ViewFlagOverrides = {
|
|
@@ -26,11 +27,13 @@ const viewFlagOverrides: ViewFlagOverrides = {
|
|
|
26
27
|
export class BatchedTileTree extends TileTree {
|
|
27
28
|
private readonly _rootTile: BatchedTile;
|
|
28
29
|
public readonly reader: BatchedTilesetReader;
|
|
30
|
+
public readonly scheduleScript?: RenderSchedule.Script;
|
|
29
31
|
|
|
30
32
|
public constructor(params: BatchedTileTreeParams) {
|
|
31
33
|
super(params);
|
|
32
34
|
this._rootTile = new BatchedTile(params.rootTile, this);
|
|
33
35
|
this.reader = params.reader;
|
|
36
|
+
this.scheduleScript = params.script;
|
|
34
37
|
}
|
|
35
38
|
|
|
36
39
|
public override get rootTile(): BatchedTile {
|
|
@@ -3,85 +3,53 @@
|
|
|
3
3
|
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
4
4
|
*--------------------------------------------------------------------------------------------*/
|
|
5
5
|
|
|
6
|
-
import {
|
|
7
|
-
import { Range3d } from "@itwin/core-geometry";
|
|
6
|
+
import { Range3d, Transform } from "@itwin/core-geometry";
|
|
8
7
|
import {
|
|
9
|
-
BatchType, FeatureAppearance, FeatureAppearanceProvider, FeatureAppearanceSource, GeometryClass,
|
|
8
|
+
BatchType, FeatureAppearance, FeatureAppearanceProvider, FeatureAppearanceSource, GeometryClass, RenderSchedule,
|
|
10
9
|
} from "@itwin/core-common";
|
|
11
10
|
import {
|
|
12
|
-
|
|
11
|
+
AnimationNodeId, formatAnimationBranchId, SceneContext, TileDrawArgs, TileTree, TileTreeOwner, TileTreeReference,
|
|
13
12
|
} from "@itwin/core-frontend";
|
|
14
|
-
import {
|
|
13
|
+
import { BatchedModels } from "./BatchedModels";
|
|
15
14
|
|
|
16
15
|
/** @internal */
|
|
17
|
-
export class BatchedTileTreeReference extends TileTreeReference
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
private readonly _modelRanges = new Map<Id64String, Range3d>();
|
|
22
|
-
private _modelRangePromise?: Promise<void>;
|
|
23
|
-
private _onModelSelectorChanged?: () => void;
|
|
24
|
-
|
|
25
|
-
private constructor(treeOwner: TileTreeOwner, view: SpatialViewState) {
|
|
16
|
+
export abstract class BatchedTileTreeReference extends TileTreeReference {
|
|
17
|
+
protected readonly _treeOwner: TileTreeOwner;
|
|
18
|
+
|
|
19
|
+
protected constructor(treeOwner: TileTreeOwner) {
|
|
26
20
|
super();
|
|
27
21
|
this._treeOwner = treeOwner;
|
|
28
|
-
this._view = view;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
public static create(view: SpatialViewState, baseUrl: URL): BatchedTileTreeReference {
|
|
32
|
-
const owner = getBatchedTileTreeOwner(view.iModel, baseUrl);
|
|
33
|
-
return new BatchedTileTreeReference(owner, view);
|
|
34
22
|
}
|
|
35
23
|
|
|
36
24
|
public override get treeOwner(): TileTreeOwner {
|
|
37
25
|
return this._treeOwner;
|
|
38
26
|
}
|
|
39
27
|
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
this.updateViewedModels();
|
|
28
|
+
protected computeBaseTransform(tree: TileTree): Transform {
|
|
29
|
+
return super.computeTransform(tree);
|
|
43
30
|
}
|
|
44
31
|
|
|
45
|
-
|
|
46
|
-
|
|
32
|
+
protected override computeTransform(tree: TileTree): Transform {
|
|
33
|
+
const baseTf = this.computeBaseTransform(tree);
|
|
34
|
+
// ###TODO this.view.modelDisplayTransformProvider?.getModelDisplayTransform(modelId...)
|
|
35
|
+
return baseTf;
|
|
47
36
|
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export class PrimaryBatchedTileTreeReference extends BatchedTileTreeReference implements FeatureAppearanceProvider {
|
|
40
|
+
private readonly _models: BatchedModels;
|
|
48
41
|
|
|
49
|
-
public
|
|
50
|
-
|
|
51
|
-
this.
|
|
52
|
-
if (!this._onModelSelectorChanged) {
|
|
53
|
-
// Don't bother updating model ranges if we're not attached to a viewport.
|
|
54
|
-
return;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
this._onModelSelectorChanged();
|
|
58
|
-
|
|
59
|
-
this._modelRangePromise = undefined;
|
|
60
|
-
const modelIds = Array.from(this._view.modelSelector.models).filter((modelId) => !this._modelRanges.has(modelId));
|
|
61
|
-
if (modelIds.length === 0)
|
|
62
|
-
return;
|
|
63
|
-
|
|
64
|
-
const modelRangePromise = this._modelRangePromise = this._treeOwner.iModel.models.queryExtents(modelIds).then((extents: ModelExtentsProps[]) => {
|
|
65
|
-
if (modelRangePromise !== this._modelRangePromise)
|
|
66
|
-
return;
|
|
67
|
-
|
|
68
|
-
this._modelRangePromise = undefined;
|
|
69
|
-
for (const extent of extents)
|
|
70
|
-
this._modelRanges.set(extent.id, Range3d.fromJSON(extent.extents));
|
|
71
|
-
}).catch(() => { });
|
|
42
|
+
public constructor(treeOwner: TileTreeOwner, models: BatchedModels) {
|
|
43
|
+
super(treeOwner);
|
|
44
|
+
this._models = models;
|
|
72
45
|
}
|
|
73
46
|
|
|
74
|
-
public override unionFitRange(
|
|
75
|
-
this.
|
|
76
|
-
const id = Id64.fromUint32Pair(low, high);
|
|
77
|
-
const extent = this._modelRanges.get(id);
|
|
78
|
-
if (extent)
|
|
79
|
-
union.extendRange(extent);
|
|
80
|
-
});
|
|
47
|
+
public override unionFitRange(range: Range3d): void {
|
|
48
|
+
this._models.unionRange(range);
|
|
81
49
|
}
|
|
82
50
|
|
|
83
51
|
public override getAppearanceProvider(): FeatureAppearanceProvider | undefined {
|
|
84
|
-
return this
|
|
52
|
+
return this;
|
|
85
53
|
}
|
|
86
54
|
|
|
87
55
|
public getFeatureAppearance(
|
|
@@ -93,10 +61,53 @@ export class BatchedTileTreeReference extends TileTreeReference implements Featu
|
|
|
93
61
|
type: BatchType,
|
|
94
62
|
animationNodeId: number
|
|
95
63
|
): FeatureAppearance | undefined {
|
|
96
|
-
|
|
97
|
-
if (modelHi !== 0xffffff00 && !this._viewedModels.has(modelLo, modelHi))
|
|
64
|
+
if (!this._models.isViewed(modelLo, modelHi))
|
|
98
65
|
return undefined;
|
|
99
66
|
|
|
100
67
|
return source.getAppearance(elemLo, elemHi, subcatLo, subcatHi, geomClass, modelLo, modelHi, type, animationNodeId);
|
|
101
68
|
}
|
|
69
|
+
|
|
70
|
+
public override getAnimationTransformNodeId() {
|
|
71
|
+
return AnimationNodeId.Untransformed;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export interface AnimationNode {
|
|
76
|
+
readonly timeline: RenderSchedule.ModelTimeline;
|
|
77
|
+
readonly nodeId: number;
|
|
78
|
+
getCurrentTimePoint(): number;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
export class AnimatedBatchedTileTreeReference extends BatchedTileTreeReference {
|
|
82
|
+
private readonly _node: AnimationNode;
|
|
83
|
+
private readonly _branchId: string;
|
|
84
|
+
|
|
85
|
+
public constructor(treeOwner: TileTreeOwner, node: AnimationNode) {
|
|
86
|
+
super(treeOwner);
|
|
87
|
+
this._node = node;
|
|
88
|
+
this._branchId = formatAnimationBranchId(node.timeline.modelId, node.nodeId);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
public override getAnimationTransformNodeId(): number {
|
|
92
|
+
return this._node.nodeId;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
public override computeBaseTransform(tree: TileTree): Transform {
|
|
96
|
+
const tf = super.computeBaseTransform(tree);
|
|
97
|
+
const animTf = this._node.timeline.getTransform(this._node.nodeId, this._node.getCurrentTimePoint());
|
|
98
|
+
if (animTf)
|
|
99
|
+
animTf.multiplyTransformTransform(tf, tf);
|
|
100
|
+
|
|
101
|
+
return tf;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
public override createDrawArgs(context: SceneContext): TileDrawArgs | undefined {
|
|
105
|
+
const animBranch = context.viewport.target.animationBranches?.branchStates.get(this._branchId);
|
|
106
|
+
if (animBranch && animBranch.omit)
|
|
107
|
+
return undefined;
|
|
108
|
+
|
|
109
|
+
const args = super.createDrawArgs(context);
|
|
110
|
+
// ###TODO args.boundingRange = args.tree.getTransformNodeRange(this._animationTransformNodeId);
|
|
111
|
+
return args;
|
|
112
|
+
}
|
|
102
113
|
}
|
|
@@ -3,7 +3,8 @@
|
|
|
3
3
|
* See LICENSE.md in the project root for license terms and full copyright notice.
|
|
4
4
|
*--------------------------------------------------------------------------------------------*/
|
|
5
5
|
|
|
6
|
-
import { compareStrings, Logger } from "@itwin/core-bentley";
|
|
6
|
+
import { comparePossiblyUndefined, compareStrings, Logger } from "@itwin/core-bentley";
|
|
7
|
+
import { RenderSchedule } from "@itwin/core-common";
|
|
7
8
|
import {
|
|
8
9
|
IModelConnection, TileTree, TileTreeOwner, TileTreeSupplier,
|
|
9
10
|
} from "@itwin/core-frontend";
|
|
@@ -12,15 +13,19 @@ import { BatchedTilesetReader } from "./BatchedTilesetReader";
|
|
|
12
13
|
import { BatchedTileTree } from "./BatchedTileTree";
|
|
13
14
|
|
|
14
15
|
/** @internal */
|
|
15
|
-
export
|
|
16
|
+
export interface BatchedTileTreeId {
|
|
17
|
+
baseUrl: URL;
|
|
18
|
+
script?: RenderSchedule.Script;
|
|
19
|
+
}
|
|
16
20
|
|
|
17
21
|
class BatchedTileTreeSupplier implements TileTreeSupplier {
|
|
18
|
-
public compareTileTreeIds(lhs:
|
|
19
|
-
|
|
20
|
-
|
|
22
|
+
public compareTileTreeIds(lhs: BatchedTileTreeId, rhs: BatchedTileTreeId): number {
|
|
23
|
+
return compareStrings(lhs.toString(), rhs.toString())
|
|
24
|
+
|| comparePossiblyUndefined((x, y) => x.compareTo(y), lhs.script, rhs.script);
|
|
21
25
|
}
|
|
22
26
|
|
|
23
|
-
public async createTileTree(
|
|
27
|
+
public async createTileTree(treeId: BatchedTileTreeId, iModel: IModelConnection): Promise<TileTree | undefined> {
|
|
28
|
+
const baseUrl = treeId.baseUrl;
|
|
24
29
|
const url = new URL("tileset.json", baseUrl);
|
|
25
30
|
url.search = baseUrl.search;
|
|
26
31
|
try {
|
|
@@ -29,6 +34,8 @@ class BatchedTileTreeSupplier implements TileTreeSupplier {
|
|
|
29
34
|
|
|
30
35
|
const reader = new BatchedTilesetReader(json, iModel, baseUrl);
|
|
31
36
|
const params = await reader.readTileTreeParams();
|
|
37
|
+
|
|
38
|
+
params.script = treeId.script;
|
|
32
39
|
return new BatchedTileTree(params);
|
|
33
40
|
} catch (err) {
|
|
34
41
|
Logger.logException(loggerCategory, err);
|
|
@@ -40,6 +47,6 @@ class BatchedTileTreeSupplier implements TileTreeSupplier {
|
|
|
40
47
|
const batchedTileTreeSupplier: TileTreeSupplier = new BatchedTileTreeSupplier();
|
|
41
48
|
|
|
42
49
|
/** @internal */
|
|
43
|
-
export function getBatchedTileTreeOwner(iModel: IModelConnection,
|
|
44
|
-
return iModel.tiles.getTileTreeOwner(
|
|
50
|
+
export function getBatchedTileTreeOwner(iModel: IModelConnection, treeId: BatchedTileTreeId): TileTreeOwner {
|
|
51
|
+
return iModel.tiles.getTileTreeOwner(treeId, batchedTileTreeSupplier);
|
|
45
52
|
}
|