@itwin/frontend-tiles 4.3.0-dev.9 → 4.4.0-dev.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 +33 -1
- package/lib/cjs/BatchedModels.d.ts +2 -1
- package/lib/cjs/BatchedModels.d.ts.map +1 -1
- package/lib/cjs/BatchedModels.js +23 -11
- package/lib/cjs/BatchedModels.js.map +1 -1
- package/lib/cjs/BatchedSpatialTileTreeRefs.d.ts.map +1 -1
- package/lib/cjs/BatchedSpatialTileTreeRefs.js +60 -24
- package/lib/cjs/BatchedSpatialTileTreeRefs.js.map +1 -1
- package/lib/cjs/BatchedTile.d.ts +5 -0
- package/lib/cjs/BatchedTile.d.ts.map +1 -1
- package/lib/cjs/BatchedTile.js +18 -1
- package/lib/cjs/BatchedTile.js.map +1 -1
- package/lib/cjs/BatchedTileTree.d.ts +2 -0
- package/lib/cjs/BatchedTileTree.d.ts.map +1 -1
- package/lib/cjs/BatchedTileTree.js.map +1 -1
- package/lib/cjs/BatchedTileTreeSupplier.d.ts +2 -1
- package/lib/cjs/BatchedTileTreeSupplier.d.ts.map +1 -1
- package/lib/cjs/BatchedTileTreeSupplier.js +2 -6
- package/lib/cjs/BatchedTileTreeSupplier.js.map +1 -1
- package/lib/cjs/BatchedTilesetReader.d.ts +22 -1
- package/lib/cjs/BatchedTilesetReader.d.ts.map +1 -1
- package/lib/cjs/BatchedTilesetReader.js +32 -7
- package/lib/cjs/BatchedTilesetReader.js.map +1 -1
- package/lib/cjs/FrontendTiles.d.ts +1 -3
- package/lib/cjs/FrontendTiles.d.ts.map +1 -1
- package/lib/cjs/FrontendTiles.js +1 -3
- package/lib/cjs/FrontendTiles.js.map +1 -1
- package/lib/esm/BatchedModels.d.ts +2 -1
- package/lib/esm/BatchedModels.d.ts.map +1 -1
- package/lib/esm/BatchedModels.js +23 -11
- package/lib/esm/BatchedModels.js.map +1 -1
- package/lib/esm/BatchedSpatialTileTreeRefs.d.ts.map +1 -1
- package/lib/esm/BatchedSpatialTileTreeRefs.js +62 -26
- package/lib/esm/BatchedSpatialTileTreeRefs.js.map +1 -1
- package/lib/esm/BatchedTile.d.ts +5 -0
- package/lib/esm/BatchedTile.d.ts.map +1 -1
- package/lib/esm/BatchedTile.js +19 -2
- package/lib/esm/BatchedTile.js.map +1 -1
- package/lib/esm/BatchedTileTree.d.ts +2 -0
- package/lib/esm/BatchedTileTree.d.ts.map +1 -1
- package/lib/esm/BatchedTileTree.js.map +1 -1
- package/lib/esm/BatchedTileTreeSupplier.d.ts +2 -1
- package/lib/esm/BatchedTileTreeSupplier.d.ts.map +1 -1
- package/lib/esm/BatchedTileTreeSupplier.js +2 -6
- package/lib/esm/BatchedTileTreeSupplier.js.map +1 -1
- package/lib/esm/BatchedTilesetReader.d.ts +22 -1
- package/lib/esm/BatchedTilesetReader.d.ts.map +1 -1
- package/lib/esm/BatchedTilesetReader.js +31 -6
- package/lib/esm/BatchedTilesetReader.js.map +1 -1
- package/lib/esm/FrontendTiles.d.ts +1 -3
- package/lib/esm/FrontendTiles.d.ts.map +1 -1
- package/lib/esm/FrontendTiles.js +0 -2
- package/lib/esm/FrontendTiles.js.map +1 -1
- package/package.json +12 -12
package/CHANGELOG.md
CHANGED
|
@@ -1,6 +1,33 @@
|
|
|
1
1
|
# Change Log - @itwin/frontend-tiles
|
|
2
2
|
|
|
3
|
-
This log was last generated on
|
|
3
|
+
This log was last generated on Thu, 30 Nov 2023 17:07:27 GMT and should not be manually modified.
|
|
4
|
+
|
|
5
|
+
## 4.2.4
|
|
6
|
+
Mon, 20 Nov 2023 16:14:45 GMT
|
|
7
|
+
|
|
8
|
+
_Version update only_
|
|
9
|
+
|
|
10
|
+
## 4.2.3
|
|
11
|
+
Mon, 06 Nov 2023 14:01:52 GMT
|
|
12
|
+
|
|
13
|
+
_Version update only_
|
|
14
|
+
|
|
15
|
+
## 4.2.2
|
|
16
|
+
Thu, 02 Nov 2023 15:36:21 GMT
|
|
17
|
+
|
|
18
|
+
_Version update only_
|
|
19
|
+
|
|
20
|
+
## 4.2.1
|
|
21
|
+
Tue, 24 Oct 2023 15:09:13 GMT
|
|
22
|
+
|
|
23
|
+
_Version update only_
|
|
24
|
+
|
|
25
|
+
## 4.2.0
|
|
26
|
+
Tue, 17 Oct 2023 15:14:32 GMT
|
|
27
|
+
|
|
28
|
+
### Updates
|
|
29
|
+
|
|
30
|
+
- Permit visible edges and wireframe mode to be used with batched tiles.
|
|
4
31
|
|
|
5
32
|
## 4.1.9
|
|
6
33
|
Tue, 10 Oct 2023 18:48:12 GMT
|
|
@@ -104,6 +131,11 @@ Mon, 22 May 2023 15:34:14 GMT
|
|
|
104
131
|
- Ensure fitting the view fits to the extents of the currently-viewed models.
|
|
105
132
|
- Add new experimental package providing alternate technique for visualizing iModels.
|
|
106
133
|
|
|
134
|
+
## 3.7.17
|
|
135
|
+
Mon, 20 Nov 2023 18:24:23 GMT
|
|
136
|
+
|
|
137
|
+
_Version update only_
|
|
138
|
+
|
|
107
139
|
## 3.7.16
|
|
108
140
|
Mon, 16 Oct 2023 12:49:08 GMT
|
|
109
141
|
|
|
@@ -4,8 +4,9 @@ import { SpatialViewState } from "@itwin/core-frontend";
|
|
|
4
4
|
export declare class BatchedModels {
|
|
5
5
|
private readonly _iModel;
|
|
6
6
|
private _viewedModels;
|
|
7
|
+
private readonly _viewedExtents;
|
|
7
8
|
private readonly _viewedModelIdPairs;
|
|
8
|
-
private readonly
|
|
9
|
+
private readonly _metadata;
|
|
9
10
|
private _modelRangePromise?;
|
|
10
11
|
constructor(view: SpatialViewState);
|
|
11
12
|
setViewedModels(models: Set<Id64String>): void;
|
|
@@ -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;AAE/C,OAAO,EAAoB,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;AAE/C,OAAO,EAAoB,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAM1E,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAmB;IAC3C,OAAO,CAAC,aAAa,CAAmB;IACxC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAiB;IAChD,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAwB;IAC5D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAwC;IAClE,OAAO,CAAC,kBAAkB,CAAC,CAAgB;gBAExB,IAAI,EAAE,gBAAgB;IAKlC,eAAe,CAAC,MAAM,EAAE,GAAG,CAAC,UAAU,CAAC,GAAG,IAAI;IAsC9C,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
|
@@ -9,8 +9,9 @@ const core_bentley_1 = require("@itwin/core-bentley");
|
|
|
9
9
|
const core_geometry_1 = require("@itwin/core-geometry");
|
|
10
10
|
class BatchedModels {
|
|
11
11
|
constructor(view) {
|
|
12
|
+
this._viewedExtents = new core_geometry_1.Range3d();
|
|
12
13
|
this._viewedModelIdPairs = new core_bentley_1.Id64.Uint32Set();
|
|
13
|
-
this.
|
|
14
|
+
this._metadata = new Map();
|
|
14
15
|
this._iModel = view.iModel;
|
|
15
16
|
this.setViewedModels(view.modelSelector.models);
|
|
16
17
|
}
|
|
@@ -18,16 +19,31 @@ class BatchedModels {
|
|
|
18
19
|
this._viewedModels = models;
|
|
19
20
|
this._viewedModelIdPairs.clear();
|
|
20
21
|
this._viewedModelIdPairs.addIds(models);
|
|
22
|
+
this._viewedExtents.setNull();
|
|
21
23
|
this._modelRangePromise = undefined;
|
|
22
|
-
const
|
|
23
|
-
|
|
24
|
+
const rangeQueryModels = [];
|
|
25
|
+
for (const modelId of models) {
|
|
26
|
+
let metadata = this._metadata.get(modelId);
|
|
27
|
+
if (!metadata)
|
|
28
|
+
this._metadata.set(modelId, metadata = {});
|
|
29
|
+
if (undefined === metadata.extents)
|
|
30
|
+
rangeQueryModels.push(modelId);
|
|
31
|
+
else
|
|
32
|
+
this._viewedExtents.extendRange(metadata.extents);
|
|
33
|
+
}
|
|
34
|
+
if (rangeQueryModels.length === 0)
|
|
24
35
|
return;
|
|
25
|
-
const modelRangePromise = this._modelRangePromise = this._iModel.models.queryExtents(
|
|
36
|
+
const modelRangePromise = this._modelRangePromise = this._iModel.models.queryExtents(rangeQueryModels).then((extents) => {
|
|
26
37
|
if (modelRangePromise !== this._modelRangePromise)
|
|
27
38
|
return;
|
|
28
39
|
this._modelRangePromise = undefined;
|
|
29
|
-
for (const extent of extents)
|
|
30
|
-
this.
|
|
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
|
+
}
|
|
31
47
|
}).catch(() => { });
|
|
32
48
|
}
|
|
33
49
|
views(modelId) {
|
|
@@ -37,11 +53,7 @@ class BatchedModels {
|
|
|
37
53
|
return this._viewedModelIdPairs.has(modelIdLo, modelIdHi);
|
|
38
54
|
}
|
|
39
55
|
unionRange(range) {
|
|
40
|
-
|
|
41
|
-
const extent = this._modelRanges.get(id);
|
|
42
|
-
if (extent)
|
|
43
|
-
range.extendRange(extent);
|
|
44
|
-
}
|
|
56
|
+
range.extendRange(this._viewedExtents);
|
|
45
57
|
}
|
|
46
58
|
}
|
|
47
59
|
exports.BatchedModels = BatchedModels;
|
|
@@ -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;AAQ/C,MAAa,aAAa;IAQxB,YAAmB,IAAsB;QALxB,mBAAc,GAAG,IAAI,uBAAO,EAAE,CAAC;QAC/B,wBAAmB,GAAG,IAAI,mBAAI,CAAC,SAAS,EAAE,CAAC;QAC3C,cAAS,GAAG,IAAI,GAAG,EAA6B,CAAC;QAIhE,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC;QAC3B,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IAClD,CAAC;IAEM,eAAe,CAAC,MAAuB;QAC5C,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC;QAC5B,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,CAAC;QACjC,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACxC,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC;QAE9B,IAAI,CAAC,kBAAkB,GAAG,SAAS,CAAC;QACpC,MAAM,gBAAgB,GAAiB,EAAE,CAAC;QAE1C,KAAK,MAAM,OAAO,IAAI,MAAM,EAAE;YAC5B,IAAI,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC3C,IAAI,CAAC,QAAQ;gBACX,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,EAAE,QAAQ,GAAG,EAAG,CAAC,CAAC;YAE9C,IAAI,SAAS,KAAK,QAAQ,CAAC,OAAO;gBAChC,gBAAgB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;;gBAE/B,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;SACrD;QAED,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC;YAC/B,OAAO;QAET,MAAM,iBAAiB,GAAG,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAAC,CAAC,OAA4B,EAAE,EAAE;YAC3I,IAAI,iBAAiB,KAAK,IAAI,CAAC,kBAAkB;gBAC/C,OAAO;YAET,IAAI,CAAC,kBAAkB,GAAG,SAAS,CAAC;YACpC,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE;gBAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;gBAC/C,IAAI,QAAQ,EAAE;oBACZ,QAAQ,CAAC,OAAO,GAAG,uBAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;oBACpD,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;iBACnD;aACF;QACH,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;IACtB,CAAC;IAEM,KAAK,CAAC,OAAmB;QAC9B,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACzC,CAAC;IAEM,QAAQ,CAAC,SAAiB,EAAE,SAAiB;QAClD,OAAO,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IAC5D,CAAC;IAEM,UAAU,CAAC,KAAc;QAC9B,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACzC,CAAC;CACF;AA9DD,sCA8DC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\nimport { Id64, Id64String } from \"@itwin/core-bentley\";\r\nimport { Range3d } from \"@itwin/core-geometry\";\r\nimport { ModelExtentsProps } from \"@itwin/core-common\";\r\nimport { IModelConnection, SpatialViewState } from \"@itwin/core-frontend\";\r\n\r\ninterface ModelMetadata {\r\n extents?: Range3d;\r\n}\r\n\r\nexport class BatchedModels {\r\n private readonly _iModel: IModelConnection;\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 = new Map<Id64String, ModelMetadata>();\r\n private _modelRangePromise?: Promise<void>;\r\n\r\n public constructor(view: SpatialViewState) {\r\n this._iModel = view.iModel;\r\n this.setViewedModels(view.modelSelector.models);\r\n }\r\n\r\n public setViewedModels(models: Set<Id64String>): void {\r\n this._viewedModels = models;\r\n this._viewedModelIdPairs.clear();\r\n this._viewedModelIdPairs.addIds(models);\r\n this._viewedExtents.setNull();\r\n\r\n this._modelRangePromise = undefined;\r\n const rangeQueryModels: Id64String[] = [];\r\n\r\n for (const modelId of models) {\r\n let metadata = this._metadata.get(modelId);\r\n if (!metadata)\r\n this._metadata.set(modelId, metadata = { });\r\n\r\n if (undefined === metadata.extents)\r\n rangeQueryModels.push(modelId);\r\n else\r\n this._viewedExtents.extendRange(metadata.extents);\r\n }\r\n\r\n if (rangeQueryModels.length === 0)\r\n return;\r\n\r\n const modelRangePromise = this._modelRangePromise = this._iModel.models.queryExtents(rangeQueryModels).then((extents: ModelExtentsProps[]) => {\r\n if (modelRangePromise !== this._modelRangePromise)\r\n return;\r\n\r\n this._modelRangePromise = undefined;\r\n for (const extent of extents) {\r\n const metadata = this._metadata.get(extent.id);\r\n if (metadata) {\r\n metadata.extents = Range3d.fromJSON(extent.extents);\r\n this._viewedExtents.extendRange(metadata.extents);\r\n }\r\n }\r\n }).catch(() => { });\r\n }\r\n\r\n public views(modelId: Id64String): boolean {\r\n return this._viewedModels.has(modelId);\r\n }\r\n\r\n public isViewed(modelIdLo: number, modelIdHi: number): boolean {\r\n return this._viewedModelIdPairs.has(modelIdLo, modelIdHi);\r\n }\r\n\r\n public unionRange(range: Range3d): void {\r\n 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,EACoE,yBAAyB,EAAE,gBAAgB,EAErH,MAAM,sBAAsB,CAAC;AAI9B,OAAO,EAAE,4BAA4B,EAAE,MAAM,iBAAiB,CAAC;AAmO/D,gBAAgB;AAChB,wBAAgB,sCAAsC,CAAC,IAAI,EAAE,gBAAgB,EAAE,cAAc,EAAE,4BAA4B,GAAG,yBAAyB,CA0BtJ"}
|
|
@@ -10,20 +10,35 @@ const core_frontend_1 = require("@itwin/core-frontend");
|
|
|
10
10
|
const BatchedTileTreeReference_1 = require("./BatchedTileTreeReference");
|
|
11
11
|
const BatchedTileTreeSupplier_1 = require("./BatchedTileTreeSupplier");
|
|
12
12
|
const BatchedModels_1 = require("./BatchedModels");
|
|
13
|
-
const
|
|
13
|
+
const BatchedTilesetReader_1 = require("./BatchedTilesetReader");
|
|
14
|
+
const LoggerCategory_1 = require("./LoggerCategory");
|
|
14
15
|
// Obtains tiles pre-published by mesh export service.
|
|
15
16
|
class BatchedSpatialTileTreeReferences {
|
|
16
|
-
constructor(
|
|
17
|
+
constructor(spec, view) {
|
|
17
18
|
this._animatedRefs = [];
|
|
18
19
|
this._view = view;
|
|
19
20
|
this._models = new BatchedModels_1.BatchedModels(view);
|
|
20
21
|
const script = view.displayStyle.scheduleScript;
|
|
21
22
|
this._currentScript = script?.requiresBatching ? script : undefined;
|
|
22
|
-
|
|
23
|
+
const includedModels = spec.props.extensions?.BENTLEY_BatchedTileSet?.includedModels;
|
|
24
|
+
this._excludedRefs = includedModels ? (0, core_frontend_1.createSpatialTileTreeReferences)(view, new Set(includedModels)) : {
|
|
25
|
+
update: () => { },
|
|
26
|
+
setDeactivated: () => { },
|
|
27
|
+
attachToViewport: () => { },
|
|
28
|
+
detachFromViewport: () => { },
|
|
29
|
+
[Symbol.iterator]: () => {
|
|
30
|
+
return {
|
|
31
|
+
next: () => {
|
|
32
|
+
return { done: true, value: undefined };
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
this.load(spec, view.iModel);
|
|
23
38
|
(0, core_bentley_1.assert)(undefined !== this._primaryRef);
|
|
24
39
|
}
|
|
25
|
-
load(
|
|
26
|
-
const treeOwner = (0, BatchedTileTreeSupplier_1.getBatchedTileTreeOwner)(iModel, {
|
|
40
|
+
load(spec, iModel) {
|
|
41
|
+
const treeOwner = (0, BatchedTileTreeSupplier_1.getBatchedTileTreeOwner)(iModel, { spec, script: this._currentScript });
|
|
27
42
|
this._primaryRef = new BatchedTileTreeReference_1.PrimaryBatchedTileTreeReference(treeOwner, this._models);
|
|
28
43
|
this.populateAnimatedReferences(treeOwner);
|
|
29
44
|
const onScriptChanged = (newScript) => {
|
|
@@ -33,7 +48,7 @@ class BatchedSpatialTileTreeReferences {
|
|
|
33
48
|
this._currentScript = newScript;
|
|
34
49
|
if (newScript !== currentScript)
|
|
35
50
|
if (!newScript || !currentScript || !newScript.equals(currentScript))
|
|
36
|
-
this.load(
|
|
51
|
+
this.load(spec, iModel);
|
|
37
52
|
};
|
|
38
53
|
let removeScriptChangedListener = this._view.displayStyle.onScheduleScriptChanged.addListener((newScript) => onScriptChanged(newScript));
|
|
39
54
|
this._view.onDisplayStyleChanged.addListener((newStyle) => {
|
|
@@ -46,6 +61,8 @@ class BatchedSpatialTileTreeReferences {
|
|
|
46
61
|
yield this._primaryRef;
|
|
47
62
|
for (const animatedRef of this._animatedRefs)
|
|
48
63
|
yield animatedRef;
|
|
64
|
+
for (const excludedRef of this._excludedRefs)
|
|
65
|
+
yield excludedRef;
|
|
49
66
|
}
|
|
50
67
|
populateAnimatedReferences(treeOwner) {
|
|
51
68
|
this._animatedRefs.length = 0;
|
|
@@ -65,15 +82,18 @@ class BatchedSpatialTileTreeReferences {
|
|
|
65
82
|
}
|
|
66
83
|
}
|
|
67
84
|
update() {
|
|
85
|
+
this._excludedRefs.update();
|
|
68
86
|
this._models.setViewedModels(this._view.modelSelector.models);
|
|
69
87
|
if (this._onModelSelectorChanged)
|
|
70
88
|
this._onModelSelectorChanged();
|
|
71
89
|
}
|
|
72
90
|
attachToViewport(args) {
|
|
73
91
|
this._onModelSelectorChanged = () => args.invalidateSymbologyOverrides();
|
|
92
|
+
this._excludedRefs.attachToViewport(args);
|
|
74
93
|
}
|
|
75
94
|
detachFromViewport() {
|
|
76
95
|
this._onModelSelectorChanged = undefined;
|
|
96
|
+
this._excludedRefs.detachFromViewport();
|
|
77
97
|
}
|
|
78
98
|
setDeactivated() {
|
|
79
99
|
// Used for debugging. Unimplemented here.
|
|
@@ -105,17 +125,17 @@ class ProxyTileTreeReference extends core_frontend_1.TileTreeReference {
|
|
|
105
125
|
// Serves as a placeholder while we asynchronously obtain the base URL for a pre-published tileset (or asynchronously determine
|
|
106
126
|
// that no such tileset exists).
|
|
107
127
|
class ProxySpatialTileTreeReferences {
|
|
108
|
-
constructor(view,
|
|
128
|
+
constructor(view, getSpec) {
|
|
109
129
|
this._proxyRef = new ProxyTileTreeReference(view.iModel);
|
|
110
|
-
|
|
111
|
-
if (
|
|
112
|
-
this.setTreeRefs(new BatchedSpatialTileTreeReferences(
|
|
130
|
+
getSpec.then((spec) => {
|
|
131
|
+
if (spec) {
|
|
132
|
+
this.setTreeRefs(new BatchedSpatialTileTreeReferences(spec, view));
|
|
113
133
|
}
|
|
114
134
|
else {
|
|
115
|
-
this.setTreeRefs((0,
|
|
135
|
+
this.setTreeRefs((0, core_frontend_1.createSpatialTileTreeReferences)(view));
|
|
116
136
|
}
|
|
117
137
|
}).catch(() => {
|
|
118
|
-
this.setTreeRefs((0,
|
|
138
|
+
this.setTreeRefs((0, core_frontend_1.createSpatialTileTreeReferences)(view));
|
|
119
139
|
});
|
|
120
140
|
}
|
|
121
141
|
setTreeRefs(refs) {
|
|
@@ -152,26 +172,42 @@ class ProxySpatialTileTreeReferences {
|
|
|
152
172
|
}
|
|
153
173
|
}
|
|
154
174
|
}
|
|
155
|
-
const
|
|
175
|
+
const iModelToTilesetSpec = new Map();
|
|
176
|
+
async function fetchTilesetSpec(iModel, computeBaseUrl) {
|
|
177
|
+
try {
|
|
178
|
+
const baseUrl = await computeBaseUrl(iModel);
|
|
179
|
+
if (undefined === baseUrl)
|
|
180
|
+
return null;
|
|
181
|
+
const url = new URL("tileset.json", baseUrl);
|
|
182
|
+
url.search = baseUrl.search;
|
|
183
|
+
const response = await fetch(url.toString());
|
|
184
|
+
const json = await response.json();
|
|
185
|
+
return BatchedTilesetReader_1.BatchedTilesetSpec.create(baseUrl, json);
|
|
186
|
+
}
|
|
187
|
+
catch (err) {
|
|
188
|
+
core_bentley_1.Logger.logException(LoggerCategory_1.loggerCategory, err);
|
|
189
|
+
return null;
|
|
190
|
+
}
|
|
191
|
+
}
|
|
156
192
|
/** @internal */
|
|
157
193
|
function createBatchedSpatialTileTreeReferences(view, computeBaseUrl) {
|
|
158
194
|
const iModel = view.iModel;
|
|
159
|
-
let entry =
|
|
195
|
+
let entry = iModelToTilesetSpec.get(iModel);
|
|
160
196
|
if (undefined === entry) {
|
|
161
|
-
const promise =
|
|
162
|
-
|
|
163
|
-
iModel.onClose.addOnce(() =>
|
|
164
|
-
promise.then((
|
|
165
|
-
if (
|
|
166
|
-
|
|
197
|
+
const promise = entry = fetchTilesetSpec(iModel, computeBaseUrl);
|
|
198
|
+
iModelToTilesetSpec.set(iModel, entry);
|
|
199
|
+
iModel.onClose.addOnce(() => iModelToTilesetSpec.delete(iModel));
|
|
200
|
+
promise.then((spec) => {
|
|
201
|
+
if (iModelToTilesetSpec.has(iModel))
|
|
202
|
+
iModelToTilesetSpec.set(iModel, spec);
|
|
167
203
|
}).catch(() => {
|
|
168
|
-
if (
|
|
169
|
-
|
|
204
|
+
if (iModelToTilesetSpec.has(iModel))
|
|
205
|
+
iModelToTilesetSpec.set(iModel, null);
|
|
170
206
|
});
|
|
171
207
|
}
|
|
172
208
|
if (null === entry) {
|
|
173
|
-
// No tileset
|
|
174
|
-
return (0,
|
|
209
|
+
// No tileset could be obtained for this iModel - use default tile generation instead.
|
|
210
|
+
return (0, core_frontend_1.createSpatialTileTreeReferences)(view);
|
|
175
211
|
}
|
|
176
212
|
if (entry instanceof Promise)
|
|
177
213
|
return new ProxySpatialTileTreeReferences(view, entry);
|
|
@@ -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 } from \"@itwin/core-bentley\";\r\nimport { RenderSchedule } from \"@itwin/core-common\";\r\nimport {\r\n AttachToViewportArgs, IModelConnection, SpatialTileTreeReferences, SpatialViewState, TileTreeLoadStatus, TileTreeOwner, TileTreeReference,\r\n} from \"@itwin/core-frontend\";\r\nimport { AnimatedBatchedTileTreeReference, PrimaryBatchedTileTreeReference } from \"./BatchedTileTreeReference\";\r\nimport { getBatchedTileTreeOwner } from \"./BatchedTileTreeSupplier\";\r\nimport { BatchedModels } from \"./BatchedModels\";\r\nimport { ComputeSpatialTilesetBaseUrl, createFallbackSpatialTileTreeReferences } from \"./FrontendTiles\";\r\n\r\n// Obtains tiles pre-published by mesh export service.\r\nclass BatchedSpatialTileTreeReferences implements SpatialTileTreeReferences {\r\n private readonly _view: SpatialViewState;\r\n private readonly _models: BatchedModels;\r\n private _currentScript?: RenderSchedule.Script;\r\n private _primaryRef!: PrimaryBatchedTileTreeReference;\r\n private readonly _animatedRefs: AnimatedBatchedTileTreeReference[] = [];\r\n private _onModelSelectorChanged?: () => void;\r\n\r\n public constructor(baseUrl: URL, view: SpatialViewState) {\r\n this._view = view;\r\n this._models = new BatchedModels(view);\r\n\r\n const script = view.displayStyle.scheduleScript;\r\n this._currentScript = script?.requiresBatching ? script : undefined;\r\n\r\n this.load(baseUrl, view.iModel);\r\n\r\n assert(undefined !== this._primaryRef);\r\n }\r\n\r\n private load(baseUrl: URL, iModel: IModelConnection): void {\r\n const treeOwner = getBatchedTileTreeOwner(iModel, { baseUrl, script: this._currentScript });\r\n this._primaryRef = new PrimaryBatchedTileTreeReference(treeOwner, this._models);\r\n\r\n this.populateAnimatedReferences(treeOwner);\r\n\r\n const onScriptChanged = (newScript: RenderSchedule.Script | undefined) => {\r\n if (!newScript?.requiresBatching)\r\n newScript = undefined;\r\n\r\n const currentScript = this._currentScript;\r\n this._currentScript = newScript;\r\n\r\n if (newScript !== currentScript)\r\n if (!newScript || !currentScript || !newScript.equals(currentScript))\r\n this.load(baseUrl, iModel);\r\n };\r\n\r\n let removeScriptChangedListener = this._view.displayStyle.onScheduleScriptChanged.addListener((newScript) => onScriptChanged(newScript));\r\n this._view.onDisplayStyleChanged.addListener((newStyle) => {\r\n removeScriptChangedListener();\r\n onScriptChanged(newStyle.scheduleScript);\r\n removeScriptChangedListener = this._view.displayStyle.onScheduleScriptChanged.addListener((newScript) => onScriptChanged(newScript));\r\n });\r\n }\r\n\r\n public *[Symbol.iterator](): Iterator<TileTreeReference> {\r\n yield this._primaryRef;\r\n\r\n for (const animatedRef of this._animatedRefs)\r\n yield animatedRef;\r\n }\r\n\r\n private populateAnimatedReferences(treeOwner: TileTreeOwner): void {\r\n this._animatedRefs.length = 0;\r\n const script = this._currentScript;\r\n if (!script)\r\n return;\r\n\r\n const getCurrentTimePoint = () => this._view.displayStyle.settings.timePoint ?? script.duration.low;\r\n for (const timeline of script.modelTimelines) {\r\n const nodeIds = timeline.transformBatchIds;\r\n for (const nodeId of nodeIds) {\r\n this._animatedRefs.push(new AnimatedBatchedTileTreeReference(treeOwner, {\r\n timeline,\r\n nodeId,\r\n getCurrentTimePoint,\r\n }));\r\n }\r\n }\r\n }\r\n\r\n public update(): void {\r\n this._models.setViewedModels(this._view.modelSelector.models);\r\n if (this._onModelSelectorChanged)\r\n this._onModelSelectorChanged();\r\n }\r\n\r\n public attachToViewport(args: AttachToViewportArgs): void {\r\n this._onModelSelectorChanged = () => args.invalidateSymbologyOverrides();\r\n }\r\n\r\n public detachFromViewport(): void {\r\n this._onModelSelectorChanged = undefined;\r\n }\r\n\r\n public setDeactivated(): void {\r\n // Used for debugging. Unimplemented here.\r\n }\r\n}\r\n\r\n// A placeholder used by [[ProxySpatialTileTreeReferences]] until asynchronous loading completes.\r\n// It provides a TileTreeOwner that never loads a tile tree.\r\n// This ensures that [ViewState.areAllTileTreesLoaded]($frontend) will not return `true` while we are loading.\r\nclass ProxyTileTreeReference extends TileTreeReference {\r\n private readonly _treeOwner: TileTreeOwner;\r\n\r\n public constructor(iModel: IModelConnection) {\r\n super();\r\n this._treeOwner = {\r\n iModel,\r\n tileTree: undefined,\r\n loadStatus: TileTreeLoadStatus.NotLoaded,\r\n load: () => undefined,\r\n dispose: () => { },\r\n loadTree: async () => Promise.resolve(undefined),\r\n };\r\n }\r\n\r\n public override get treeOwner() {\r\n return this._treeOwner;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public override get _isLoadingComplete() {\r\n return false;\r\n }\r\n}\r\n\r\n// Serves as a placeholder while we asynchronously obtain the base URL for a pre-published tileset (or asynchronously determine\r\n// that no such tileset exists).\r\nclass ProxySpatialTileTreeReferences implements SpatialTileTreeReferences {\r\n // Once async loading completes, all methods will be forwarded to this implementation.\r\n private _impl?: SpatialTileTreeReferences;\r\n private readonly _proxyRef: ProxyTileTreeReference;\r\n // Retained if attachToViewport is called while we are still loading; and reset if detachFromViewport is called while loading.\r\n private _attachArgs?: AttachToViewportArgs;\r\n\r\n public constructor(view: SpatialViewState, getBaseUrl: Promise<URL | undefined>) {\r\n this._proxyRef = new ProxyTileTreeReference(view.iModel);\r\n getBaseUrl.then((url: URL | undefined) => {\r\n if (url) {\r\n this.setTreeRefs(new BatchedSpatialTileTreeReferences(url, view));\r\n } else {\r\n this.setTreeRefs(createFallbackSpatialTileTreeReferences(view));\r\n }\r\n }).catch(() => {\r\n this.setTreeRefs(createFallbackSpatialTileTreeReferences(view));\r\n });\r\n }\r\n\r\n private setTreeRefs(refs: SpatialTileTreeReferences): void {\r\n this._impl = refs;\r\n if (this._attachArgs) {\r\n this._impl.attachToViewport(this._attachArgs);\r\n this._attachArgs.invalidateSymbologyOverrides();\r\n this._attachArgs = undefined;\r\n }\r\n }\r\n\r\n public update(): void {\r\n this._impl?.update();\r\n }\r\n\r\n public attachToViewport(args: AttachToViewportArgs): void {\r\n if (this._impl)\r\n this._impl.attachToViewport(args);\r\n else\r\n this._attachArgs = args;\r\n }\r\n\r\n public detachFromViewport(): void {\r\n if (this._impl)\r\n this._impl.detachFromViewport();\r\n else\r\n this._attachArgs = undefined;\r\n }\r\n\r\n public setDeactivated(): void { }\r\n\r\n public *[Symbol.iterator](): Iterator<TileTreeReference> {\r\n if (this._impl) {\r\n for (const ref of this._impl)\r\n yield ref;\r\n } else {\r\n yield this._proxyRef;\r\n }\r\n }\r\n}\r\n\r\nconst iModelToBaseUrl = new Map<IModelConnection, URL | null | Promise<URL | undefined>>();\r\n\r\n/** @internal */\r\nexport function createBatchedSpatialTileTreeReferences(view: SpatialViewState, computeBaseUrl: ComputeSpatialTilesetBaseUrl): SpatialTileTreeReferences {\r\n const iModel = view.iModel;\r\n let entry = iModelToBaseUrl.get(iModel);\r\n if (undefined === entry) {\r\n const promise = computeBaseUrl(iModel);\r\n iModelToBaseUrl.set(iModel, entry = promise);\r\n iModel.onClose.addOnce(() => iModelToBaseUrl.delete(iModel));\r\n promise.then((url: URL | undefined) => {\r\n if (iModelToBaseUrl.has(iModel))\r\n iModelToBaseUrl.set(iModel, url ?? null);\r\n }).catch(() => {\r\n if (iModelToBaseUrl.has(iModel))\r\n iModelToBaseUrl.set(iModel, null);\r\n });\r\n }\r\n\r\n if (null === entry) {\r\n // No tileset exists for this iModel - use default tile generation instead.\r\n return createFallbackSpatialTileTreeReferences(view);\r\n }\r\n\r\n if (entry instanceof Promise)\r\n return new ProxySpatialTileTreeReferences(view, entry);\r\n\r\n return new BatchedSpatialTileTreeReferences(entry, view);\r\n}\r\n\r\n"]}
|
|
1
|
+
{"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"]}
|
package/lib/cjs/BatchedTile.d.ts
CHANGED
|
@@ -1,15 +1,20 @@
|
|
|
1
1
|
import { BeTimePoint } from "@itwin/core-bentley";
|
|
2
|
+
import { Transform } from "@itwin/core-geometry";
|
|
2
3
|
import { Tileset3dSchema } from "@itwin/core-common";
|
|
3
4
|
import { GraphicBuilder, RenderSystem, Tile, TileBoundingBoxes, TileContent, TileDrawArgs, TileParams, TileRequest, TileRequestChannel, TileUser, Viewport } from "@itwin/core-frontend";
|
|
4
5
|
import { BatchedTileTree } from "./BatchedTileTree";
|
|
5
6
|
/** @internal */
|
|
6
7
|
export interface BatchedTileParams extends TileParams {
|
|
7
8
|
childrenProps: Tileset3dSchema.Tile[] | undefined;
|
|
9
|
+
/** See BatchedTile.transformToRoot. */
|
|
10
|
+
transformToRoot: Transform | undefined;
|
|
8
11
|
}
|
|
9
12
|
/** @internal */
|
|
10
13
|
export declare class BatchedTile extends Tile {
|
|
11
14
|
private readonly _childrenProps?;
|
|
12
15
|
private readonly _unskippable;
|
|
16
|
+
/** Transform from the tile's local coordinate system to that of the tileset. */
|
|
17
|
+
readonly transformToRoot?: Transform;
|
|
13
18
|
get batchedTree(): BatchedTileTree;
|
|
14
19
|
constructor(params: BatchedTileParams, tree: BatchedTileTree);
|
|
15
20
|
private get _batchedChildren();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BatchedTile.d.ts","sourceRoot":"","sources":["../../src/BatchedTile.ts"],"names":[],"mappings":"AAKA,OAAO,EAAU,WAAW,EAAsB,MAAM,qBAAqB,CAAC;AAC9E,OAAO,EAAY,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,
|
|
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;cA+BtH,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
|
@@ -27,6 +27,13 @@ class BatchedTile extends core_frontend_1.Tile {
|
|
|
27
27
|
// mark "undisplayable"
|
|
28
28
|
this._maximumSize = 0;
|
|
29
29
|
}
|
|
30
|
+
if (!params.transformToRoot)
|
|
31
|
+
return;
|
|
32
|
+
this.transformToRoot = params.transformToRoot;
|
|
33
|
+
this.boundingSphere.transformBy(this.transformToRoot, this.boundingSphere);
|
|
34
|
+
this.transformToRoot.multiplyRange(this.range, this.range);
|
|
35
|
+
if (this._contentRange)
|
|
36
|
+
this.transformToRoot.multiplyRange(this._contentRange, this._contentRange);
|
|
30
37
|
}
|
|
31
38
|
get _batchedChildren() {
|
|
32
39
|
return this.children;
|
|
@@ -102,13 +109,23 @@ class BatchedTile extends core_frontend_1.Tile {
|
|
|
102
109
|
if (!(data instanceof Uint8Array))
|
|
103
110
|
return {};
|
|
104
111
|
try {
|
|
105
|
-
|
|
112
|
+
const content = await this.batchedTree.decoder.decode({
|
|
106
113
|
stream: core_bentley_1.ByteStream.fromUint8Array(data),
|
|
107
114
|
options: { tileId: this.contentId },
|
|
108
115
|
system,
|
|
109
116
|
isCanceled,
|
|
110
117
|
isLeaf: this.isLeaf,
|
|
111
118
|
});
|
|
119
|
+
if (this.transformToRoot) {
|
|
120
|
+
if (content.graphic) {
|
|
121
|
+
const branch = new core_frontend_1.GraphicBranch(true);
|
|
122
|
+
branch.add(content.graphic);
|
|
123
|
+
content.graphic = system.createBranch(branch, this.transformToRoot);
|
|
124
|
+
}
|
|
125
|
+
if (content.contentRange)
|
|
126
|
+
content.contentRange = this.transformToRoot.multiplyRange(content.contentRange);
|
|
127
|
+
}
|
|
128
|
+
return content;
|
|
112
129
|
}
|
|
113
130
|
catch {
|
|
114
131
|
return { isLeaf: true };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BatchedTile.js","sourceRoot":"","sources":["../../src/BatchedTile.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;;;AAE/F,sDAA8E;AAC9E,oDAA+D;AAC/D,wDAG8B;AAC9B,qDAAkD;AAElD,mDAAuD;AAOvD,IAAI,OAAuC,CAAC;AAE5C,gBAAgB;AAChB,MAAa,WAAY,SAAQ,oBAAI;IAInC,IAAW,WAAW;QACpB,OAAO,IAAI,CAAC,IAAuB,CAAC;IACtC,CAAC;IAED,YAAmB,MAAyB,EAAE,IAAqB;QACjE,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAEpB,kFAAkF;QAClF,IAAI,CAAC,YAAY,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,oCAAoB,CAAC,eAAe,CAAC,CAAC;QAE9E,IAAI,MAAM,CAAC,aAAa,EAAE,MAAM;YAC9B,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,aAAa,CAAC;QAE7C,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YACnB,IAAI,CAAC,UAAU,EAAE,CAAC;YAClB,uBAAuB;YACvB,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;SACvB;IACH,CAAC;IAED,IAAY,gBAAgB;QAC1B,OAAO,IAAI,CAAC,QAAqC,CAAC;IACpD,CAAC;IAEe,mBAAmB,CAAC,SAA6B,EAAE,MAA0B;QAC3F,2FAA2F;QAC3F,OAAO,iCAAiB,CAAC,2BAA2B,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IACnG,CAAC;IAEM,WAAW,CAAC,QAA0B,EAAE,IAAkB,EAAE,0BAAmD;QACpH,MAAM,GAAG,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,8BAAc,CAAC,cAAc,KAAK,GAAG;YACvC,OAAO;QAET,IAAI,IAAI,CAAC,YAAY,EAAE;YACrB,0EAA0E;YAC1E,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC5B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;SACrB;QAED,0BAA0B,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,0BAA0B,CAAC;QAClF,IAAI,8BAAc,CAAC,SAAS,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE;YAC5E,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YACpB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YACrB,MAAM,kBAAkB,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;YAC/C,IAAI,kCAAkB,CAAC,OAAO,KAAK,kBAAkB;gBACnD,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAE7B,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC;YACvC,IAAI,QAAQ,EAAE;gBACZ,KAAK,MAAM,KAAK,IAAI,QAAQ;oBAC1B,KAAK,CAAC,WAAW,CAAC,QAAQ,EAAE,IAAI,EAAE,0BAA0B,CAAC,CAAC;gBAEhE,OAAO;aACR;SACF;QAED,2EAA2E;QAC3E,IAAI,CAAC,8BAAc,CAAC,OAAO,KAAK,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO;YACxE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QAE3B,IAAI,0BAA0B;YAC5B,QAAQ,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;IAC7C,CAAC;IAEkB,aAAa,CAAC,OAA+C,EAAE,MAA8B;QAC9G,IAAI,QAAmC,CAAC;QACxC,IAAI,IAAI,CAAC,cAAc,EAAE;YACvB,IAAI;gBACF,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,cAAc,EAAE;oBAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,cAAc,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;oBACxE,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;oBACxD,QAAQ,GAAG,QAAQ,IAAI,EAAE,CAAC;oBAC1B,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;iBACtB;aACF;YAAC,OAAO,GAAG,EAAE;gBACZ,qBAAM,CAAC,YAAY,CAAC,+BAAc,EAAE,GAAG,CAAC,CAAC;gBACzC,QAAQ,GAAG,SAAS,CAAC;gBACrB,IAAI,GAAG,YAAY,KAAK;oBACtB,MAAM,CAAC,GAAG,CAAC,CAAC;aACf;SACF;QAED,OAAO,CAAC,QAAQ,CAAC,CAAC;IACpB,CAAC;IAED,IAAoB,OAAO;QACzB,IAAI,CAAC,OAAO,EAAE;YACZ,OAAO,GAAG,IAAI,kCAAkB,CAAC,wBAAwB,EAAE,EAAE,CAAC,CAAC;YAC/D,yBAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;SAC3C;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAEe,KAAK,CAAC,cAAc,CAAC,WAA0B;QAC7D,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACrE,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;QACpD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC7C,OAAO,QAAQ,CAAC,WAAW,EAAE,CAAC;IAChC,CAAC;IAEe,KAAK,CAAC,WAAW,CAAC,IAA8B,EAAE,MAAoB,EAAE,UAA0B;QAChH,IAAA,qBAAM,EAAC,IAAI,YAAY,UAAU,CAAC,CAAC;QACnC,IAAI,CAAC,CAAC,IAAI,YAAY,UAAU,CAAC;YAC/B,OAAO,EAAG,CAAC;QAEb,IAAI;YACF,OAAO,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;gBAC3C,MAAM,EAAE,yBAAU,CAAC,cAAc,CAAC,IAAI,CAAC;gBACvC,OAAO,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE;gBACnC,MAAM;gBACN,UAAU;gBACV,MAAM,EAAE,IAAI,CAAC,MAAM;aACpB,CAAC,CAAC;SACJ;QAAC,MAAM;YACN,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;SACzB;IACH,CAAC;IAEkB,eAAe,CAAC,OAAuB,EAAE,IAAuB;QACjF,IAAI,iCAAiB,CAAC,YAAY,KAAK,IAAI,EAAE;YAC3C,KAAK,CAAC,eAAe,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YACrC,OAAO;SACR;QAED,OAAO,CAAC,YAAY,CAAC,sBAAQ,CAAC,KAAK,EAAE,sBAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACxD,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAEhC,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC/B,IAAI,CAAC,QAAQ;YACX,OAAO;QAET,OAAO,CAAC,YAAY,CAAC,sBAAQ,CAAC,IAAI,EAAE,sBAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7E,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE;YAC5B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;YAC1B,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;YAC3B,OAAO,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;SAClC;IACH,CAAC;IAEM,KAAK,CAAC,SAAsB;QACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC;QACvC,IAAI,CAAC,QAAQ;YACX,OAAO;QAET,IAAI,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE;YACzC,IAAI,CAAC,eAAe,EAAE,CAAC;SACxB;aAAM;YACL,KAAK,MAAM,KAAK,IAAI,QAAQ;gBAC1B,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;SAC1B;IACH,CAAC;CACF;AA9JD,kCA8JC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\nimport { assert, BeTimePoint, ByteStream, Logger } from \"@itwin/core-bentley\";\r\nimport { ColorDef, Tileset3dSchema } from \"@itwin/core-common\";\r\nimport {\r\n GraphicBuilder, IModelApp, RealityTileLoader, RenderSystem, Tile, TileBoundingBoxes, TileContent,\r\n TileDrawArgs, TileParams, TileRequest, TileRequestChannel, TileTreeLoadStatus, TileUser, TileVisibility, Viewport,\r\n} from \"@itwin/core-frontend\";\r\nimport { loggerCategory } from \"./LoggerCategory\";\r\nimport { BatchedTileTree } from \"./BatchedTileTree\";\r\nimport { frontendTilesOptions } from \"./FrontendTiles\";\r\n\r\n/** @internal */\r\nexport interface BatchedTileParams extends TileParams {\r\n childrenProps: Tileset3dSchema.Tile[] | undefined;\r\n}\r\n\r\nlet channel: TileRequestChannel | undefined;\r\n\r\n/** @internal */\r\nexport class BatchedTile extends Tile {\r\n private readonly _childrenProps?: Tileset3dSchema.Tile[];\r\n private readonly _unskippable: boolean;\r\n\r\n public get batchedTree(): BatchedTileTree {\r\n return this.tree as BatchedTileTree;\r\n }\r\n\r\n public constructor(params: BatchedTileParams, tree: BatchedTileTree) {\r\n super(params, tree);\r\n\r\n // The root tile never has content, so it doesn't count toward max levels to skip.\r\n this._unskippable = 0 === (this.depth % frontendTilesOptions.maxLevelsToSkip);\r\n\r\n if (params.childrenProps?.length)\r\n this._childrenProps = params.childrenProps;\r\n\r\n if (!this.contentId) {\r\n this.setIsReady();\r\n // mark \"undisplayable\"\r\n this._maximumSize = 0;\r\n }\r\n }\r\n\r\n private get _batchedChildren(): BatchedTile[] | undefined {\r\n return this.children as BatchedTile[] | undefined;\r\n }\r\n\r\n public override computeLoadPriority(viewports: Iterable<Viewport>, _users: Iterable<TileUser>): number {\r\n // Prioritize tiles closer to camera and center of attention (zoom point or screen center).\r\n return RealityTileLoader.computeTileLocationPriority(this, viewports, this.tree.iModelTransform);\r\n }\r\n\r\n public selectTiles(selected: Set<BatchedTile>, args: TileDrawArgs, closestDisplayableAncestor: BatchedTile | undefined): void {\r\n const vis = this.computeVisibility(args);\r\n if (TileVisibility.OutsideFrustum === vis)\r\n return;\r\n\r\n if (this._unskippable) {\r\n // Prevent this tile's content from being unloaded due to memory pressure.\r\n args.touchedTiles.add(this);\r\n args.markUsed(this);\r\n }\r\n\r\n closestDisplayableAncestor = this.hasGraphics ? this : closestDisplayableAncestor;\r\n if (TileVisibility.TooCoarse === vis && (this.isReady || !this._unskippable)) {\r\n args.markUsed(this);\r\n args.markReady(this);\r\n const childrenLoadStatus = this.loadChildren();\r\n if (TileTreeLoadStatus.Loading === childrenLoadStatus)\r\n args.markChildrenLoading();\r\n\r\n const children = this._batchedChildren;\r\n if (children) {\r\n for (const child of children)\r\n child.selectTiles(selected, args, closestDisplayableAncestor);\r\n\r\n return;\r\n }\r\n }\r\n\r\n // We want to display this tile. Request its content if not already loaded.\r\n if ((TileVisibility.Visible === vis || this._unskippable) && !this.isReady)\r\n args.insertMissing(this);\r\n\r\n if (closestDisplayableAncestor)\r\n selected.add(closestDisplayableAncestor);\r\n }\r\n\r\n protected override _loadChildren(resolve: (children: Tile[] | undefined) => void, reject: (error: Error) => void): void {\r\n let children: BatchedTile[] | undefined;\r\n if (this._childrenProps) {\r\n try {\r\n for (const childProps of this._childrenProps) {\r\n const params = this.batchedTree.reader.readTileParams(childProps, this);\r\n const child = new BatchedTile(params, this.batchedTree);\r\n children = children ?? [];\r\n children.push(child);\r\n }\r\n } catch (err) {\r\n Logger.logException(loggerCategory, err);\r\n children = undefined;\r\n if (err instanceof Error)\r\n reject(err);\r\n }\r\n }\r\n\r\n resolve(children);\r\n }\r\n\r\n public override get channel(): TileRequestChannel {\r\n if (!channel) {\r\n channel = new TileRequestChannel(\"itwinjs-batched-models\", 20);\r\n IModelApp.tileAdmin.channels.add(channel);\r\n }\r\n\r\n return channel;\r\n }\r\n\r\n public override async requestContent(_isCanceled: () => boolean): Promise<TileRequest.Response> {\r\n const url = new URL(this.contentId, this.batchedTree.reader.baseUrl);\r\n url.search = this.batchedTree.reader.baseUrl.search;\r\n const response = await fetch(url.toString());\r\n return response.arrayBuffer();\r\n }\r\n\r\n public override async readContent(data: TileRequest.ResponseData, system: RenderSystem, isCanceled?: () => boolean): Promise<TileContent> {\r\n assert(data instanceof Uint8Array);\r\n if (!(data instanceof Uint8Array))\r\n return { };\r\n\r\n try {\r\n return await this.batchedTree.decoder.decode({\r\n stream: ByteStream.fromUint8Array(data),\r\n options: { tileId: this.contentId },\r\n system,\r\n isCanceled,\r\n isLeaf: this.isLeaf,\r\n });\r\n } catch {\r\n return { isLeaf: true };\r\n }\r\n }\r\n\r\n protected override addRangeGraphic(builder: GraphicBuilder, type: TileBoundingBoxes): void {\r\n if (TileBoundingBoxes.ChildVolumes !== type) {\r\n super.addRangeGraphic(builder, type);\r\n return;\r\n }\r\n\r\n builder.setSymbology(ColorDef.green, ColorDef.green, 2);\r\n builder.addRangeBox(this.range);\r\n\r\n this.loadChildren();\r\n const children = this.children;\r\n if (!children)\r\n return;\r\n\r\n builder.setSymbology(ColorDef.blue, ColorDef.blue.withTransparency(0xdf), 1);\r\n for (const child of children) {\r\n const range = child.range;\r\n builder.addRangeBox(range);\r\n builder.addRangeBox(range, true);\r\n }\r\n }\r\n\r\n public prune(olderThan: BeTimePoint): void {\r\n const children = this._batchedChildren;\r\n if (!children)\r\n return;\r\n\r\n if (this.usageMarker.isExpired(olderThan)) {\r\n this.disposeChildren();\r\n } else {\r\n for (const child of children)\r\n child.prune(olderThan);\r\n }\r\n }\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"file":"BatchedTile.js","sourceRoot":"","sources":["../../src/BatchedTile.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;;;AAE/F,sDAA8E;AAE9E,oDAA+D;AAC/D,wDAG8B;AAC9B,qDAAkD;AAElD,mDAAuD;AASvD,IAAI,OAAuC,CAAC;AAE5C,gBAAgB;AAChB,MAAa,WAAY,SAAQ,oBAAI;IAMnC,IAAW,WAAW;QACpB,OAAO,IAAI,CAAC,IAAuB,CAAC;IACtC,CAAC;IAED,YAAmB,MAAyB,EAAE,IAAqB;QACjE,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAEpB,kFAAkF;QAClF,IAAI,CAAC,YAAY,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,oCAAoB,CAAC,eAAe,CAAC,CAAC;QAE9E,IAAI,MAAM,CAAC,aAAa,EAAE,MAAM;YAC9B,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,aAAa,CAAC;QAE7C,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YACnB,IAAI,CAAC,UAAU,EAAE,CAAC;YAClB,uBAAuB;YACvB,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;SACvB;QAED,IAAI,CAAC,MAAM,CAAC,eAAe;YACzB,OAAO;QAET,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,eAAe,CAAC;QAC9C,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;QAC3E,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3D,IAAI,IAAI,CAAC,aAAa;YACpB,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;IAC/E,CAAC;IAED,IAAY,gBAAgB;QAC1B,OAAO,IAAI,CAAC,QAAqC,CAAC;IACpD,CAAC;IAEe,mBAAmB,CAAC,SAA6B,EAAE,MAA0B;QAC3F,2FAA2F;QAC3F,OAAO,iCAAiB,CAAC,2BAA2B,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IACnG,CAAC;IAEM,WAAW,CAAC,QAA0B,EAAE,IAAkB,EAAE,0BAAmD;QACpH,MAAM,GAAG,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,8BAAc,CAAC,cAAc,KAAK,GAAG;YACvC,OAAO;QAET,IAAI,IAAI,CAAC,YAAY,EAAE;YACrB,0EAA0E;YAC1E,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC5B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;SACrB;QAED,0BAA0B,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,0BAA0B,CAAC;QAClF,IAAI,8BAAc,CAAC,SAAS,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE;YAC5E,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YACpB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YACrB,MAAM,kBAAkB,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;YAC/C,IAAI,kCAAkB,CAAC,OAAO,KAAK,kBAAkB;gBACnD,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAE7B,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC;YACvC,IAAI,QAAQ,EAAE;gBACZ,KAAK,MAAM,KAAK,IAAI,QAAQ;oBAC1B,KAAK,CAAC,WAAW,CAAC,QAAQ,EAAE,IAAI,EAAE,0BAA0B,CAAC,CAAC;gBAEhE,OAAO;aACR;SACF;QAED,2EAA2E;QAC3E,IAAI,CAAC,8BAAc,CAAC,OAAO,KAAK,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO;YACxE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QAE3B,IAAI,0BAA0B;YAC5B,QAAQ,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;IAC7C,CAAC;IAEkB,aAAa,CAAC,OAA+C,EAAE,MAA8B;QAC9G,IAAI,QAAmC,CAAC;QACxC,IAAI,IAAI,CAAC,cAAc,EAAE;YACvB,IAAI;gBACF,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,cAAc,EAAE;oBAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,cAAc,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;oBACxE,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;oBACxD,QAAQ,GAAG,QAAQ,IAAI,EAAE,CAAC;oBAC1B,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;iBACtB;aACF;YAAC,OAAO,GAAG,EAAE;gBACZ,qBAAM,CAAC,YAAY,CAAC,+BAAc,EAAE,GAAG,CAAC,CAAC;gBACzC,QAAQ,GAAG,SAAS,CAAC;gBACrB,IAAI,GAAG,YAAY,KAAK;oBACtB,MAAM,CAAC,GAAG,CAAC,CAAC;aACf;SACF;QAED,OAAO,CAAC,QAAQ,CAAC,CAAC;IACpB,CAAC;IAED,IAAoB,OAAO;QACzB,IAAI,CAAC,OAAO,EAAE;YACZ,OAAO,GAAG,IAAI,kCAAkB,CAAC,wBAAwB,EAAE,EAAE,CAAC,CAAC;YAC/D,yBAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;SAC3C;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAEe,KAAK,CAAC,cAAc,CAAC,WAA0B;QAC7D,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACrE,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;QACpD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC7C,OAAO,QAAQ,CAAC,WAAW,EAAE,CAAC;IAChC,CAAC;IAEe,KAAK,CAAC,WAAW,CAAC,IAA8B,EAAE,MAAoB,EAAE,UAA0B;QAChH,IAAA,qBAAM,EAAC,IAAI,YAAY,UAAU,CAAC,CAAC;QACnC,IAAI,CAAC,CAAC,IAAI,YAAY,UAAU,CAAC;YAC/B,OAAO,EAAG,CAAC;QAEb,IAAI;YACF,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;gBACpD,MAAM,EAAE,yBAAU,CAAC,cAAc,CAAC,IAAI,CAAC;gBACvC,OAAO,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE;gBACnC,MAAM;gBACN,UAAU;gBACV,MAAM,EAAE,IAAI,CAAC,MAAM;aACpB,CAAC,CAAC;YAEH,IAAI,IAAI,CAAC,eAAe,EAAE;gBACxB,IAAI,OAAO,CAAC,OAAO,EAAE;oBACnB,MAAM,MAAM,GAAG,IAAI,6BAAa,CAAC,IAAI,CAAC,CAAC;oBACvC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;oBAC5B,OAAO,CAAC,OAAO,GAAG,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;iBACrE;gBAED,IAAI,OAAO,CAAC,YAAY;oBACtB,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;aACnF;YAED,OAAO,OAAO,CAAC;SAChB;QAAC,MAAM;YACN,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;SACzB;IACH,CAAC;IAEkB,eAAe,CAAC,OAAuB,EAAE,IAAuB;QACjF,IAAI,iCAAiB,CAAC,YAAY,KAAK,IAAI,EAAE;YAC3C,KAAK,CAAC,eAAe,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YACrC,OAAO;SACR;QAED,OAAO,CAAC,YAAY,CAAC,sBAAQ,CAAC,KAAK,EAAE,sBAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACxD,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAEhC,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC/B,IAAI,CAAC,QAAQ;YACX,OAAO;QAET,OAAO,CAAC,YAAY,CAAC,sBAAQ,CAAC,IAAI,EAAE,sBAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7E,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE;YAC5B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;YAC1B,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;YAC3B,OAAO,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;SAClC;IACH,CAAC;IAEM,KAAK,CAAC,SAAsB;QACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC;QACvC,IAAI,CAAC,QAAQ;YACX,OAAO;QAET,IAAI,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE;YACzC,IAAI,CAAC,eAAe,EAAE,CAAC;SACxB;aAAM;YACL,KAAK,MAAM,KAAK,IAAI,QAAQ;gBAC1B,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;SAC1B;IACH,CAAC;CACF;AAtLD,kCAsLC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\nimport { assert, BeTimePoint, ByteStream, Logger } from \"@itwin/core-bentley\";\r\nimport { Transform } from \"@itwin/core-geometry\";\r\nimport { ColorDef, Tileset3dSchema } from \"@itwin/core-common\";\r\nimport {\r\n GraphicBranch, GraphicBuilder, IModelApp, RealityTileLoader, RenderSystem, Tile, TileBoundingBoxes, TileContent,\r\n TileDrawArgs, TileParams, TileRequest, TileRequestChannel, TileTreeLoadStatus, TileUser, TileVisibility, Viewport,\r\n} from \"@itwin/core-frontend\";\r\nimport { loggerCategory } from \"./LoggerCategory\";\r\nimport { BatchedTileTree } from \"./BatchedTileTree\";\r\nimport { frontendTilesOptions } from \"./FrontendTiles\";\r\n\r\n/** @internal */\r\nexport interface BatchedTileParams extends TileParams {\r\n childrenProps: Tileset3dSchema.Tile[] | undefined;\r\n /** See BatchedTile.transformToRoot. */\r\n transformToRoot: Transform | undefined;\r\n}\r\n\r\nlet channel: TileRequestChannel | undefined;\r\n\r\n/** @internal */\r\nexport class BatchedTile extends Tile {\r\n private readonly _childrenProps?: Tileset3dSchema.Tile[];\r\n private readonly _unskippable: boolean;\r\n /** Transform from the tile's local coordinate system to that of the tileset. */\r\n public readonly transformToRoot?: Transform;\r\n\r\n public get batchedTree(): BatchedTileTree {\r\n return this.tree as BatchedTileTree;\r\n }\r\n\r\n public constructor(params: BatchedTileParams, tree: BatchedTileTree) {\r\n super(params, tree);\r\n\r\n // The root tile never has content, so it doesn't count toward max levels to skip.\r\n this._unskippable = 0 === (this.depth % frontendTilesOptions.maxLevelsToSkip);\r\n\r\n if (params.childrenProps?.length)\r\n this._childrenProps = params.childrenProps;\r\n\r\n if (!this.contentId) {\r\n this.setIsReady();\r\n // mark \"undisplayable\"\r\n this._maximumSize = 0;\r\n }\r\n\r\n if (!params.transformToRoot)\r\n return;\r\n\r\n this.transformToRoot = params.transformToRoot;\r\n this.boundingSphere.transformBy(this.transformToRoot, this.boundingSphere);\r\n this.transformToRoot.multiplyRange(this.range, this.range);\r\n if (this._contentRange)\r\n this.transformToRoot.multiplyRange(this._contentRange, this._contentRange);\r\n }\r\n\r\n private get _batchedChildren(): BatchedTile[] | undefined {\r\n return this.children as BatchedTile[] | undefined;\r\n }\r\n\r\n public override computeLoadPriority(viewports: Iterable<Viewport>, _users: Iterable<TileUser>): number {\r\n // Prioritize tiles closer to camera and center of attention (zoom point or screen center).\r\n return RealityTileLoader.computeTileLocationPriority(this, viewports, this.tree.iModelTransform);\r\n }\r\n\r\n public selectTiles(selected: Set<BatchedTile>, args: TileDrawArgs, closestDisplayableAncestor: BatchedTile | undefined): void {\r\n const vis = this.computeVisibility(args);\r\n if (TileVisibility.OutsideFrustum === vis)\r\n return;\r\n\r\n if (this._unskippable) {\r\n // Prevent this tile's content from being unloaded due to memory pressure.\r\n args.touchedTiles.add(this);\r\n args.markUsed(this);\r\n }\r\n\r\n closestDisplayableAncestor = this.hasGraphics ? this : closestDisplayableAncestor;\r\n if (TileVisibility.TooCoarse === vis && (this.isReady || !this._unskippable)) {\r\n args.markUsed(this);\r\n args.markReady(this);\r\n const childrenLoadStatus = this.loadChildren();\r\n if (TileTreeLoadStatus.Loading === childrenLoadStatus)\r\n args.markChildrenLoading();\r\n\r\n const children = this._batchedChildren;\r\n if (children) {\r\n for (const child of children)\r\n child.selectTiles(selected, args, closestDisplayableAncestor);\r\n\r\n return;\r\n }\r\n }\r\n\r\n // We want to display this tile. Request its content if not already loaded.\r\n if ((TileVisibility.Visible === vis || this._unskippable) && !this.isReady)\r\n args.insertMissing(this);\r\n\r\n if (closestDisplayableAncestor)\r\n selected.add(closestDisplayableAncestor);\r\n }\r\n\r\n protected override _loadChildren(resolve: (children: Tile[] | undefined) => void, reject: (error: Error) => void): void {\r\n let children: BatchedTile[] | undefined;\r\n if (this._childrenProps) {\r\n try {\r\n for (const childProps of this._childrenProps) {\r\n const params = this.batchedTree.reader.readTileParams(childProps, this);\r\n const child = new BatchedTile(params, this.batchedTree);\r\n children = children ?? [];\r\n children.push(child);\r\n }\r\n } catch (err) {\r\n Logger.logException(loggerCategory, err);\r\n children = undefined;\r\n if (err instanceof Error)\r\n reject(err);\r\n }\r\n }\r\n\r\n resolve(children);\r\n }\r\n\r\n public override get channel(): TileRequestChannel {\r\n if (!channel) {\r\n channel = new TileRequestChannel(\"itwinjs-batched-models\", 20);\r\n IModelApp.tileAdmin.channels.add(channel);\r\n }\r\n\r\n return channel;\r\n }\r\n\r\n public override async requestContent(_isCanceled: () => boolean): Promise<TileRequest.Response> {\r\n const url = new URL(this.contentId, this.batchedTree.reader.baseUrl);\r\n url.search = this.batchedTree.reader.baseUrl.search;\r\n const response = await fetch(url.toString());\r\n return response.arrayBuffer();\r\n }\r\n\r\n public override async readContent(data: TileRequest.ResponseData, system: RenderSystem, isCanceled?: () => boolean): Promise<TileContent> {\r\n assert(data instanceof Uint8Array);\r\n if (!(data instanceof Uint8Array))\r\n return { };\r\n\r\n try {\r\n const content = await this.batchedTree.decoder.decode({\r\n stream: ByteStream.fromUint8Array(data),\r\n options: { tileId: this.contentId },\r\n system,\r\n isCanceled,\r\n isLeaf: this.isLeaf,\r\n });\r\n\r\n if (this.transformToRoot) {\r\n if (content.graphic) {\r\n const branch = new GraphicBranch(true);\r\n branch.add(content.graphic);\r\n content.graphic = system.createBranch(branch, this.transformToRoot);\r\n }\r\n\r\n if (content.contentRange)\r\n content.contentRange = this.transformToRoot.multiplyRange(content.contentRange);\r\n }\r\n\r\n return content;\r\n } catch {\r\n return { isLeaf: true };\r\n }\r\n }\r\n\r\n protected override addRangeGraphic(builder: GraphicBuilder, type: TileBoundingBoxes): void {\r\n if (TileBoundingBoxes.ChildVolumes !== type) {\r\n super.addRangeGraphic(builder, type);\r\n return;\r\n }\r\n\r\n builder.setSymbology(ColorDef.green, ColorDef.green, 2);\r\n builder.addRangeBox(this.range);\r\n\r\n this.loadChildren();\r\n const children = this.children;\r\n if (!children)\r\n return;\r\n\r\n builder.setSymbology(ColorDef.blue, ColorDef.blue.withTransparency(0xdf), 1);\r\n for (const child of children) {\r\n const range = child.range;\r\n builder.addRangeBox(range);\r\n builder.addRangeBox(range, true);\r\n }\r\n }\r\n\r\n public prune(olderThan: BeTimePoint): void {\r\n const children = this._batchedChildren;\r\n if (!children)\r\n return;\r\n\r\n if (this.usageMarker.isExpired(olderThan)) {\r\n this.disposeChildren();\r\n } else {\r\n for (const child of children)\r\n child.prune(olderThan);\r\n }\r\n }\r\n}\r\n"]}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { Id64String } from "@itwin/core-bentley";
|
|
1
2
|
import { RenderSchedule, ViewFlagOverrides } from "@itwin/core-common";
|
|
2
3
|
import { ImdlDecoder, Tile, TileDrawArgs, TileTree, TileTreeParams } from "@itwin/core-frontend";
|
|
3
4
|
import { BatchedTile, BatchedTileParams } from "./BatchedTile";
|
|
@@ -7,6 +8,7 @@ export interface BatchedTileTreeParams extends TileTreeParams {
|
|
|
7
8
|
rootTile: BatchedTileParams;
|
|
8
9
|
reader: BatchedTilesetReader;
|
|
9
10
|
script?: RenderSchedule.Script;
|
|
11
|
+
includedModels?: Set<Id64String>;
|
|
10
12
|
}
|
|
11
13
|
/** @internal */
|
|
12
14
|
export declare class BatchedTileTree extends TileTree {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BatchedTileTree.d.ts","sourceRoot":"","sources":["../../src/BatchedTileTree.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"BatchedTileTree.d.ts","sourceRoot":"","sources":["../../src/BatchedTileTree.ts"],"names":[],"mappings":"AAKA,OAAO,EAAe,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAC9D,OAAO,EAAyB,cAAc,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC9F,OAAO,EACe,WAAW,EAAa,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,cAAc,EACzF,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAC/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAQ9D,gBAAgB;AAChB,MAAM,WAAW,qBAAsB,SAAQ,cAAc;IAC3D,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,MAAM,EAAE,oBAAoB,CAAC;IAC7B,MAAM,CAAC,EAAE,cAAc,CAAC,MAAM,CAAC;IAC/B,cAAc,CAAC,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC;CAClC;AAED,gBAAgB;AAChB,qBAAa,eAAgB,SAAQ,QAAQ;IAC3C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAc;IACxC,SAAgB,MAAM,EAAE,oBAAoB,CAAC;IAC7C,SAAgB,cAAc,CAAC,EAAE,cAAc,CAAC,MAAM,CAAC;IACvD,SAAgB,OAAO,EAAE,WAAW,CAAC;gBAElB,MAAM,EAAE,qBAAqB;IAiBhC,OAAO,IAAI,IAAI;IAK/B,IAAoB,QAAQ,IAAI,WAAW,CAE1C;IAED,IAAoB,IAAI,IAAI,OAAO,CAElC;IAED,IAAoB,QAAQ,IAAI,MAAM,GAAG,SAAS,CAEjD;IAED,IAAoB,iBAAiB,IAAI,iBAAiB,CAEzD;IAGe,YAAY,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,EAAE;IAMxC,IAAI,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI;IAQ9B,KAAK,IAAI,IAAI;CAI9B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BatchedTileTree.js","sourceRoot":"","sources":["../../src/BatchedTileTree.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;;;AAE/F,
|
|
1
|
+
{"version":3,"file":"BatchedTileTree.js","sourceRoot":"","sources":["../../src/BatchedTileTree.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;;;AAE/F,sDAA8D;AAC9D,oDAA8F;AAC9F,wDAE8B;AAC9B,+CAA+D;AAE/D,mDAAuD;AAEvD,MAAM,gBAAgB,GAAsB;IAC1C,UAAU,EAAE,wBAAU,CAAC,WAAW;IAClC,YAAY,EAAE,KAAK;CACpB,CAAC;AAUF,gBAAgB;AAChB,MAAa,eAAgB,SAAQ,wBAAQ;IAM3C,YAAmB,MAA6B;QAC9C,KAAK,CAAC,MAAM,CAAC,CAAC;QACd,IAAI,CAAC,SAAS,GAAG,IAAI,yBAAW,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACxD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC5B,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC;QAEpC,IAAI,CAAC,OAAO,GAAG,IAAA,kCAAkB,EAAC;YAChC,IAAI,EAAE,uBAAS,CAAC,OAAO;YACvB,QAAQ,EAAE,IAAI,CAAC,cAAc;YAC7B,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,YAAY,EAAE,IAAI,CAAC,OAAO;YAC1B,IAAI,EAAE,IAAI;YACV,sBAAsB,EAAE,KAAK;YAC7B,QAAQ,EAAE,CAAC,yBAAS,CAAC,SAAS,CAAC,kBAAkB;SAClD,CAAC,CAAC;IACL,CAAC;IAEe,OAAO;QACrB,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QACvB,KAAK,CAAC,OAAO,EAAE,CAAC;IAClB,CAAC;IAED,IAAoB,QAAQ;QAC1B,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED,IAAoB,IAAI;QACtB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAoB,QAAQ;QAC1B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAoB,iBAAiB;QACnC,OAAO,oCAAoB,CAAC,WAAW,CAAC,CAAC,CAAA,EAAG,CAAC,CAAC,CAAC,gBAAgB,CAAC;IAClE,CAAC;IAED,gEAAgE;IAChD,YAAY,CAAC,IAAkB;QAC7C,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAe,CAAC;QACxC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,QAAQ,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;QACrD,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC9B,CAAC;IAEe,IAAI,CAAC,IAAkB;QACrC,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACrC,KAAK,MAAM,IAAI,IAAI,KAAK;YACtB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QAE1B,IAAI,CAAC,YAAY,EAAE,CAAC;IACtB,CAAC;IAEe,KAAK;QACnB,MAAM,SAAS,GAAG,0BAAW,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC/D,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IACjC,CAAC;CACF;AA/DD,0CA+DC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\nimport { BeTimePoint, Id64String } from \"@itwin/core-bentley\";\r\nimport { BatchType, RenderMode, RenderSchedule, ViewFlagOverrides } from \"@itwin/core-common\";\r\nimport {\r\n acquireImdlDecoder, ImdlDecoder, IModelApp, Tile, TileDrawArgs, TileTree, TileTreeParams,\r\n} from \"@itwin/core-frontend\";\r\nimport { BatchedTile, BatchedTileParams } from \"./BatchedTile\";\r\nimport { BatchedTilesetReader } from \"./BatchedTilesetReader\";\r\nimport { frontendTilesOptions } from \"./FrontendTiles\";\r\n\r\nconst defaultViewFlags: ViewFlagOverrides = {\r\n renderMode: RenderMode.SmoothShade,\r\n visibleEdges: false,\r\n};\r\n\r\n/** @internal */\r\nexport interface BatchedTileTreeParams extends TileTreeParams {\r\n rootTile: BatchedTileParams;\r\n reader: BatchedTilesetReader;\r\n script?: RenderSchedule.Script;\r\n includedModels?: Set<Id64String>;\r\n}\r\n\r\n/** @internal */\r\nexport class BatchedTileTree extends TileTree {\r\n private readonly _rootTile: BatchedTile;\r\n public readonly reader: BatchedTilesetReader;\r\n public readonly scheduleScript?: RenderSchedule.Script;\r\n public readonly decoder: ImdlDecoder;\r\n\r\n public constructor(params: BatchedTileTreeParams) {\r\n super(params);\r\n this._rootTile = new BatchedTile(params.rootTile, this);\r\n this.reader = params.reader;\r\n this.scheduleScript = params.script;\r\n\r\n this.decoder = acquireImdlDecoder({\r\n type: BatchType.Primary,\r\n timeline: this.scheduleScript,\r\n iModel: this.iModel,\r\n batchModelId: this.modelId,\r\n is3d: true,\r\n containsTransformNodes: false,\r\n noWorker: !IModelApp.tileAdmin.decodeImdlInWorker,\r\n });\r\n }\r\n\r\n public override dispose(): void {\r\n this.decoder.release();\r\n super.dispose();\r\n }\r\n\r\n public override get rootTile(): BatchedTile {\r\n return this._rootTile;\r\n }\r\n\r\n public override get is3d(): boolean {\r\n return true;\r\n }\r\n\r\n public override get maxDepth(): number | undefined {\r\n return undefined;\r\n }\r\n\r\n public override get viewFlagOverrides(): ViewFlagOverrides {\r\n return frontendTilesOptions.enableEdges ?{ } : defaultViewFlags;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public override _selectTiles(args: TileDrawArgs): Tile[] {\r\n const selected = new Set<BatchedTile>();\r\n this.rootTile.selectTiles(selected, args, undefined);\r\n return Array.from(selected);\r\n }\r\n\r\n public override draw(args: TileDrawArgs): void {\r\n const tiles = this.selectTiles(args);\r\n for (const tile of tiles)\r\n tile.drawGraphics(args);\r\n\r\n args.drawGraphics();\r\n }\r\n\r\n public override prune(): void {\r\n const olderThan = BeTimePoint.now().minus(this.expirationTime);\r\n this.rootTile.prune(olderThan);\r\n }\r\n}\r\n"]}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { RenderSchedule } from "@itwin/core-common";
|
|
2
2
|
import { IModelConnection, TileTreeOwner } from "@itwin/core-frontend";
|
|
3
|
+
import { BatchedTilesetSpec } from "./BatchedTilesetReader";
|
|
3
4
|
/** @internal */
|
|
4
5
|
export interface BatchedTileTreeId {
|
|
5
|
-
|
|
6
|
+
spec: BatchedTilesetSpec;
|
|
6
7
|
script?: RenderSchedule.Script;
|
|
7
8
|
}
|
|
8
9
|
/** @internal */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BatchedTileTreeSupplier.d.ts","sourceRoot":"","sources":["../../src/BatchedTileTreeSupplier.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EACL,gBAAgB,EAAY,aAAa,EAC1C,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"BatchedTileTreeSupplier.d.ts","sourceRoot":"","sources":["../../src/BatchedTileTreeSupplier.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,EACL,gBAAgB,EAAY,aAAa,EAC1C,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAwB,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAGlF,gBAAgB;AAChB,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,kBAAkB,CAAC;IACzB,MAAM,CAAC,EAAE,cAAc,CAAC,MAAM,CAAC;CAChC;AAyBD,gBAAgB;AAChB,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,iBAAiB,GAAG,aAAa,CAE1G"}
|
|
@@ -15,13 +15,9 @@ class BatchedTileTreeSupplier {
|
|
|
15
15
|
|| (0, core_bentley_1.comparePossiblyUndefined)((x, y) => x.compareTo(y), lhs.script, rhs.script);
|
|
16
16
|
}
|
|
17
17
|
async createTileTree(treeId, iModel) {
|
|
18
|
-
const
|
|
19
|
-
const url = new URL("tileset.json", baseUrl);
|
|
20
|
-
url.search = baseUrl.search;
|
|
18
|
+
const spec = treeId.spec;
|
|
21
19
|
try {
|
|
22
|
-
const
|
|
23
|
-
const json = await response.json();
|
|
24
|
-
const reader = new BatchedTilesetReader_1.BatchedTilesetReader(json, iModel, baseUrl);
|
|
20
|
+
const reader = new BatchedTilesetReader_1.BatchedTilesetReader(spec, iModel);
|
|
25
21
|
const params = await reader.readTileTreeParams();
|
|
26
22
|
params.script = treeId.script;
|
|
27
23
|
return new BatchedTileTree_1.BatchedTileTree(params);
|