@itwin/frontend-tiles 3.7.12 → 3.7.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/.rush/temp/operation/build_ci/state.json +1 -1
  2. package/.rush/temp/package-deps_build_ci.json +23 -0
  3. package/CHANGELOG.json +6 -0
  4. package/CHANGELOG.md +6 -1
  5. package/lib/cjs/BatchedSpatialTileTreeRefs.d.ts +4 -4
  6. package/lib/cjs/BatchedSpatialTileTreeRefs.js +133 -133
  7. package/lib/cjs/BatchedSpatialTileTreeRefs.js.map +1 -1
  8. package/lib/cjs/BatchedTile.d.ts +24 -24
  9. package/lib/cjs/BatchedTile.js +168 -168
  10. package/lib/cjs/BatchedTile.js.map +1 -1
  11. package/lib/cjs/BatchedTileContentReader.d.ts +22 -22
  12. package/lib/cjs/BatchedTileContentReader.js +76 -76
  13. package/lib/cjs/BatchedTileContentReader.js.map +1 -1
  14. package/lib/cjs/BatchedTileTree.d.ts +22 -22
  15. package/lib/cjs/BatchedTileTree.js +52 -52
  16. package/lib/cjs/BatchedTileTree.js.map +1 -1
  17. package/lib/cjs/BatchedTileTreeReference.d.ts +21 -21
  18. package/lib/cjs/BatchedTileTreeReference.js +73 -73
  19. package/lib/cjs/BatchedTileTreeReference.js.map +1 -1
  20. package/lib/cjs/BatchedTileTreeSupplier.d.ts +5 -5
  21. package/lib/cjs/BatchedTileTreeSupplier.js +38 -38
  22. package/lib/cjs/BatchedTileTreeSupplier.js.map +1 -1
  23. package/lib/cjs/BatchedTilesetReader.d.ts +13 -13
  24. package/lib/cjs/BatchedTilesetReader.js +88 -88
  25. package/lib/cjs/BatchedTilesetReader.js.map +1 -1
  26. package/lib/cjs/FrontendTiles.d.ts +32 -32
  27. package/lib/cjs/FrontendTiles.js +26 -26
  28. package/lib/cjs/FrontendTiles.js.map +1 -1
  29. package/lib/cjs/LoggerCategory.d.ts +2 -2
  30. package/lib/cjs/LoggerCategory.js +9 -9
  31. package/lib/cjs/LoggerCategory.js.map +1 -1
  32. package/lib/cjs/frontend-tiles.d.ts +1 -1
  33. package/lib/cjs/frontend-tiles.js +17 -17
  34. package/lib/cjs/frontend-tiles.js.map +1 -1
  35. package/lib/cjs/tsconfig.tsbuildinfo +1 -1
  36. package/lib/esm/BatchedSpatialTileTreeRefs.d.ts +4 -4
  37. package/lib/esm/BatchedSpatialTileTreeRefs.js +129 -129
  38. package/lib/esm/BatchedSpatialTileTreeRefs.js.map +1 -1
  39. package/lib/esm/BatchedTile.d.ts +24 -24
  40. package/lib/esm/BatchedTile.js +164 -164
  41. package/lib/esm/BatchedTile.js.map +1 -1
  42. package/lib/esm/BatchedTileContentReader.d.ts +22 -22
  43. package/lib/esm/BatchedTileContentReader.js +72 -72
  44. package/lib/esm/BatchedTileContentReader.js.map +1 -1
  45. package/lib/esm/BatchedTileTree.d.ts +22 -22
  46. package/lib/esm/BatchedTileTree.js +48 -48
  47. package/lib/esm/BatchedTileTree.js.map +1 -1
  48. package/lib/esm/BatchedTileTreeReference.d.ts +21 -21
  49. package/lib/esm/BatchedTileTreeReference.js +69 -69
  50. package/lib/esm/BatchedTileTreeReference.js.map +1 -1
  51. package/lib/esm/BatchedTileTreeSupplier.d.ts +5 -5
  52. package/lib/esm/BatchedTileTreeSupplier.js +34 -34
  53. package/lib/esm/BatchedTileTreeSupplier.js.map +1 -1
  54. package/lib/esm/BatchedTilesetReader.d.ts +13 -13
  55. package/lib/esm/BatchedTilesetReader.js +84 -84
  56. package/lib/esm/BatchedTilesetReader.js.map +1 -1
  57. package/lib/esm/FrontendTiles.d.ts +32 -32
  58. package/lib/esm/FrontendTiles.js +21 -21
  59. package/lib/esm/FrontendTiles.js.map +1 -1
  60. package/lib/esm/LoggerCategory.d.ts +2 -2
  61. package/lib/esm/LoggerCategory.js +6 -6
  62. package/lib/esm/LoggerCategory.js.map +1 -1
  63. package/lib/esm/frontend-tiles.d.ts +1 -1
  64. package/lib/esm/frontend-tiles.js +5 -5
  65. package/lib/esm/frontend-tiles.js.map +1 -1
  66. package/lib/esm/tsconfig.tsbuildinfo +1 -1
  67. package/package.json +11 -11
  68. package/.rush/temp/0642ba61ecad4685e9e9ec49ba61997a16b8938d.log +0 -10
@@ -1,165 +1,165 @@
1
- /*---------------------------------------------------------------------------------------------
2
- * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
3
- * See LICENSE.md in the project root for license terms and full copyright notice.
4
- *--------------------------------------------------------------------------------------------*/
5
- import { assert, ByteStream, Logger } from "@itwin/core-bentley";
6
- import { ColorDef } from "@itwin/core-common";
7
- import { GltfReaderProps, ImdlReader, IModelApp, RealityTileLoader, Tile, TileBoundingBoxes, TileRequestChannel, TileTreeLoadStatus, TileVisibility, } from "@itwin/core-frontend";
8
- import { loggerCategory } from "./LoggerCategory";
9
- import { BatchedTileContentReader } from "./BatchedTileContentReader";
10
- import { getMaxLevelsToSkip } from "./FrontendTiles";
11
- let channel;
12
- /** @internal */
13
- export class BatchedTile extends Tile {
14
- constructor(params, tree) {
15
- var _a;
16
- super(params, tree);
17
- // The root tile never has content, so it doesn't count toward max levels to skip.
18
- this._unskippable = 0 === (this.depth % getMaxLevelsToSkip());
19
- if ((_a = params.childrenProps) === null || _a === void 0 ? void 0 : _a.length)
20
- this._childrenProps = params.childrenProps;
21
- if (!this.contentId) {
22
- this.setIsReady();
23
- // mark "undisplayable"
24
- this._maximumSize = 0;
25
- }
26
- }
27
- get batchedTree() {
28
- return this.tree;
29
- }
30
- get _batchedChildren() {
31
- return this.children;
32
- }
33
- computeLoadPriority(viewports, _users) {
34
- // Prioritize tiles closer to camera and center of attention (zoom point or screen center).
35
- return RealityTileLoader.computeTileLocationPriority(this, viewports, this.tree.iModelTransform);
36
- }
37
- selectTiles(selected, args, closestDisplayableAncestor) {
38
- const vis = this.computeVisibility(args);
39
- if (TileVisibility.OutsideFrustum === vis)
40
- return;
41
- if (this._unskippable) {
42
- // Prevent this tile's content from being unloaded due to memory pressure.
43
- args.touchedTiles.add(this);
44
- args.markUsed(this);
45
- }
46
- closestDisplayableAncestor = this.hasGraphics ? this : closestDisplayableAncestor;
47
- if (TileVisibility.TooCoarse === vis && (this.isReady || !this._unskippable)) {
48
- args.markUsed(this);
49
- args.markReady(this);
50
- const childrenLoadStatus = this.loadChildren();
51
- if (TileTreeLoadStatus.Loading === childrenLoadStatus)
52
- args.markChildrenLoading();
53
- const children = this._batchedChildren;
54
- if (children) {
55
- for (const child of children)
56
- child.selectTiles(selected, args, closestDisplayableAncestor);
57
- return;
58
- }
59
- }
60
- // We want to display this tile. Request its content if not already loaded.
61
- if ((TileVisibility.Visible === vis || this._unskippable) && !this.isReady)
62
- args.insertMissing(this);
63
- if (closestDisplayableAncestor)
64
- selected.add(closestDisplayableAncestor);
65
- }
66
- _loadChildren(resolve, reject) {
67
- let children;
68
- if (this._childrenProps) {
69
- try {
70
- for (const childProps of this._childrenProps) {
71
- const params = this.batchedTree.reader.readTileParams(childProps, this);
72
- const child = new BatchedTile(params, this.batchedTree);
73
- children = children !== null && children !== void 0 ? children : [];
74
- children.push(child);
75
- }
76
- }
77
- catch (err) {
78
- Logger.logException(loggerCategory, err);
79
- children = undefined;
80
- if (err instanceof Error)
81
- reject(err);
82
- }
83
- }
84
- resolve(children);
85
- }
86
- get channel() {
87
- if (!channel) {
88
- channel = new TileRequestChannel("itwinjs-batched-models", 20);
89
- IModelApp.tileAdmin.channels.add(channel);
90
- }
91
- return channel;
92
- }
93
- async requestContent(_isCanceled) {
94
- const url = new URL(this.contentId, this.batchedTree.reader.baseUrl);
95
- url.search = this.batchedTree.reader.baseUrl.search;
96
- const response = await fetch(url.toString());
97
- return response.arrayBuffer();
98
- }
99
- async readContent(data, system, shouldAbort) {
100
- assert(data instanceof Uint8Array);
101
- if (!(data instanceof Uint8Array))
102
- return {};
103
- let reader = ImdlReader.create({
104
- stream: ByteStream.fromUint8Array(data),
105
- iModel: this.tree.iModel,
106
- modelId: this.tree.modelId,
107
- is3d: true,
108
- isLeaf: this.isLeaf,
109
- system,
110
- isCanceled: shouldAbort,
111
- options: {
112
- tileId: this.contentId,
113
- },
114
- });
115
- if (!reader) {
116
- const gltfProps = GltfReaderProps.create(data, false, this.batchedTree.reader.baseUrl);
117
- if (gltfProps) {
118
- reader = new BatchedTileContentReader({
119
- props: gltfProps,
120
- iModel: this.tree.iModel,
121
- system,
122
- shouldAbort,
123
- vertexTableRequired: true,
124
- modelId: this.tree.modelId,
125
- isLeaf: this.isLeaf,
126
- range: this.range,
127
- });
128
- }
129
- }
130
- if (!reader)
131
- return {};
132
- return reader.read();
133
- }
134
- addRangeGraphic(builder, type) {
135
- if (TileBoundingBoxes.ChildVolumes !== type) {
136
- super.addRangeGraphic(builder, type);
137
- return;
138
- }
139
- builder.setSymbology(ColorDef.green, ColorDef.green, 2);
140
- builder.addRangeBox(this.range);
141
- this.loadChildren();
142
- const children = this.children;
143
- if (!children)
144
- return;
145
- builder.setSymbology(ColorDef.blue, ColorDef.blue.withTransparency(0xdf), 1);
146
- for (const child of children) {
147
- const range = child.range;
148
- builder.addRangeBox(range);
149
- builder.addRangeBox(range, true);
150
- }
151
- }
152
- prune(olderThan) {
153
- const children = this._batchedChildren;
154
- if (!children)
155
- return;
156
- if (this.usageMarker.isExpired(olderThan)) {
157
- this.disposeChildren();
158
- }
159
- else {
160
- for (const child of children)
161
- child.prune(olderThan);
162
- }
163
- }
164
- }
1
+ /*---------------------------------------------------------------------------------------------
2
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
3
+ * See LICENSE.md in the project root for license terms and full copyright notice.
4
+ *--------------------------------------------------------------------------------------------*/
5
+ import { assert, ByteStream, Logger } from "@itwin/core-bentley";
6
+ import { ColorDef } from "@itwin/core-common";
7
+ import { GltfReaderProps, ImdlReader, IModelApp, RealityTileLoader, Tile, TileBoundingBoxes, TileRequestChannel, TileTreeLoadStatus, TileVisibility, } from "@itwin/core-frontend";
8
+ import { loggerCategory } from "./LoggerCategory";
9
+ import { BatchedTileContentReader } from "./BatchedTileContentReader";
10
+ import { getMaxLevelsToSkip } from "./FrontendTiles";
11
+ let channel;
12
+ /** @internal */
13
+ export class BatchedTile extends Tile {
14
+ constructor(params, tree) {
15
+ var _a;
16
+ super(params, tree);
17
+ // The root tile never has content, so it doesn't count toward max levels to skip.
18
+ this._unskippable = 0 === (this.depth % getMaxLevelsToSkip());
19
+ if ((_a = params.childrenProps) === null || _a === void 0 ? void 0 : _a.length)
20
+ this._childrenProps = params.childrenProps;
21
+ if (!this.contentId) {
22
+ this.setIsReady();
23
+ // mark "undisplayable"
24
+ this._maximumSize = 0;
25
+ }
26
+ }
27
+ get batchedTree() {
28
+ return this.tree;
29
+ }
30
+ get _batchedChildren() {
31
+ return this.children;
32
+ }
33
+ computeLoadPriority(viewports, _users) {
34
+ // Prioritize tiles closer to camera and center of attention (zoom point or screen center).
35
+ return RealityTileLoader.computeTileLocationPriority(this, viewports, this.tree.iModelTransform);
36
+ }
37
+ selectTiles(selected, args, closestDisplayableAncestor) {
38
+ const vis = this.computeVisibility(args);
39
+ if (TileVisibility.OutsideFrustum === vis)
40
+ return;
41
+ if (this._unskippable) {
42
+ // Prevent this tile's content from being unloaded due to memory pressure.
43
+ args.touchedTiles.add(this);
44
+ args.markUsed(this);
45
+ }
46
+ closestDisplayableAncestor = this.hasGraphics ? this : closestDisplayableAncestor;
47
+ if (TileVisibility.TooCoarse === vis && (this.isReady || !this._unskippable)) {
48
+ args.markUsed(this);
49
+ args.markReady(this);
50
+ const childrenLoadStatus = this.loadChildren();
51
+ if (TileTreeLoadStatus.Loading === childrenLoadStatus)
52
+ args.markChildrenLoading();
53
+ const children = this._batchedChildren;
54
+ if (children) {
55
+ for (const child of children)
56
+ child.selectTiles(selected, args, closestDisplayableAncestor);
57
+ return;
58
+ }
59
+ }
60
+ // We want to display this tile. Request its content if not already loaded.
61
+ if ((TileVisibility.Visible === vis || this._unskippable) && !this.isReady)
62
+ args.insertMissing(this);
63
+ if (closestDisplayableAncestor)
64
+ selected.add(closestDisplayableAncestor);
65
+ }
66
+ _loadChildren(resolve, reject) {
67
+ let children;
68
+ if (this._childrenProps) {
69
+ try {
70
+ for (const childProps of this._childrenProps) {
71
+ const params = this.batchedTree.reader.readTileParams(childProps, this);
72
+ const child = new BatchedTile(params, this.batchedTree);
73
+ children = children !== null && children !== void 0 ? children : [];
74
+ children.push(child);
75
+ }
76
+ }
77
+ catch (err) {
78
+ Logger.logException(loggerCategory, err);
79
+ children = undefined;
80
+ if (err instanceof Error)
81
+ reject(err);
82
+ }
83
+ }
84
+ resolve(children);
85
+ }
86
+ get channel() {
87
+ if (!channel) {
88
+ channel = new TileRequestChannel("itwinjs-batched-models", 20);
89
+ IModelApp.tileAdmin.channels.add(channel);
90
+ }
91
+ return channel;
92
+ }
93
+ async requestContent(_isCanceled) {
94
+ const url = new URL(this.contentId, this.batchedTree.reader.baseUrl);
95
+ url.search = this.batchedTree.reader.baseUrl.search;
96
+ const response = await fetch(url.toString());
97
+ return response.arrayBuffer();
98
+ }
99
+ async readContent(data, system, shouldAbort) {
100
+ assert(data instanceof Uint8Array);
101
+ if (!(data instanceof Uint8Array))
102
+ return {};
103
+ let reader = ImdlReader.create({
104
+ stream: ByteStream.fromUint8Array(data),
105
+ iModel: this.tree.iModel,
106
+ modelId: this.tree.modelId,
107
+ is3d: true,
108
+ isLeaf: this.isLeaf,
109
+ system,
110
+ isCanceled: shouldAbort,
111
+ options: {
112
+ tileId: this.contentId,
113
+ },
114
+ });
115
+ if (!reader) {
116
+ const gltfProps = GltfReaderProps.create(data, false, this.batchedTree.reader.baseUrl);
117
+ if (gltfProps) {
118
+ reader = new BatchedTileContentReader({
119
+ props: gltfProps,
120
+ iModel: this.tree.iModel,
121
+ system,
122
+ shouldAbort,
123
+ vertexTableRequired: true,
124
+ modelId: this.tree.modelId,
125
+ isLeaf: this.isLeaf,
126
+ range: this.range,
127
+ });
128
+ }
129
+ }
130
+ if (!reader)
131
+ return {};
132
+ return reader.read();
133
+ }
134
+ addRangeGraphic(builder, type) {
135
+ if (TileBoundingBoxes.ChildVolumes !== type) {
136
+ super.addRangeGraphic(builder, type);
137
+ return;
138
+ }
139
+ builder.setSymbology(ColorDef.green, ColorDef.green, 2);
140
+ builder.addRangeBox(this.range);
141
+ this.loadChildren();
142
+ const children = this.children;
143
+ if (!children)
144
+ return;
145
+ builder.setSymbology(ColorDef.blue, ColorDef.blue.withTransparency(0xdf), 1);
146
+ for (const child of children) {
147
+ const range = child.range;
148
+ builder.addRangeBox(range);
149
+ builder.addRangeBox(range, true);
150
+ }
151
+ }
152
+ prune(olderThan) {
153
+ const children = this._batchedChildren;
154
+ if (!children)
155
+ return;
156
+ if (this.usageMarker.isExpired(olderThan)) {
157
+ this.disposeChildren();
158
+ }
159
+ else {
160
+ for (const child of children)
161
+ child.prune(olderThan);
162
+ }
163
+ }
164
+ }
165
165
  //# sourceMappingURL=BatchedTile.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"BatchedTile.js","sourceRoot":"","sources":["../../src/BatchedTile.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\nimport { assert, BeTimePoint, ByteStream, Logger } from \"@itwin/core-bentley\";\nimport { ColorDef, Tileset3dSchema } from \"@itwin/core-common\";\nimport {\n GltfReaderProps, GraphicBuilder, ImdlReader, IModelApp, RealityTileLoader, RenderSystem, Tile, TileBoundingBoxes, TileContent,\n TileDrawArgs, TileParams, TileRequest, TileRequestChannel, TileTreeLoadStatus, TileUser, TileVisibility, Viewport,\n} from \"@itwin/core-frontend\";\nimport { loggerCategory } from \"./LoggerCategory\";\nimport { BatchedTileTree } from \"./BatchedTileTree\";\nimport { BatchedTileContentReader } from \"./BatchedTileContentReader\";\nimport { getMaxLevelsToSkip } from \"./FrontendTiles\";\n\n/** @internal */\nexport interface BatchedTileParams extends TileParams {\n childrenProps: Tileset3dSchema.Tile[] | undefined;\n}\n\nlet channel: TileRequestChannel | undefined;\n\n/** @internal */\nexport class BatchedTile extends Tile {\n private readonly _childrenProps?: Tileset3dSchema.Tile[];\n private readonly _unskippable: boolean;\n\n public get batchedTree(): BatchedTileTree {\n return this.tree as BatchedTileTree;\n }\n\n public constructor(params: BatchedTileParams, tree: BatchedTileTree) {\n super(params, tree);\n\n // The root tile never has content, so it doesn't count toward max levels to skip.\n this._unskippable = 0 === (this.depth % getMaxLevelsToSkip());\n\n if (params.childrenProps?.length)\n this._childrenProps = params.childrenProps;\n\n if (!this.contentId) {\n this.setIsReady();\n // mark \"undisplayable\"\n this._maximumSize = 0;\n }\n }\n\n private get _batchedChildren(): BatchedTile[] | undefined {\n return this.children as BatchedTile[] | undefined;\n }\n\n public override computeLoadPriority(viewports: Iterable<Viewport>, _users: Iterable<TileUser>): number {\n // Prioritize tiles closer to camera and center of attention (zoom point or screen center).\n return RealityTileLoader.computeTileLocationPriority(this, viewports, this.tree.iModelTransform);\n }\n\n public selectTiles(selected: Set<BatchedTile>, args: TileDrawArgs, closestDisplayableAncestor: BatchedTile | undefined): void {\n const vis = this.computeVisibility(args);\n if (TileVisibility.OutsideFrustum === vis)\n return;\n\n if (this._unskippable) {\n // Prevent this tile's content from being unloaded due to memory pressure.\n args.touchedTiles.add(this);\n args.markUsed(this);\n }\n\n closestDisplayableAncestor = this.hasGraphics ? this : closestDisplayableAncestor;\n if (TileVisibility.TooCoarse === vis && (this.isReady || !this._unskippable)) {\n args.markUsed(this);\n args.markReady(this);\n const childrenLoadStatus = this.loadChildren();\n if (TileTreeLoadStatus.Loading === childrenLoadStatus)\n args.markChildrenLoading();\n\n const children = this._batchedChildren;\n if (children) {\n for (const child of children)\n child.selectTiles(selected, args, closestDisplayableAncestor);\n\n return;\n }\n }\n\n // We want to display this tile. Request its content if not already loaded.\n if ((TileVisibility.Visible === vis || this._unskippable) && !this.isReady)\n args.insertMissing(this);\n\n if (closestDisplayableAncestor)\n selected.add(closestDisplayableAncestor);\n }\n\n protected override _loadChildren(resolve: (children: Tile[] | undefined) => void, reject: (error: Error) => void): void {\n let children: BatchedTile[] | undefined;\n if (this._childrenProps) {\n try {\n for (const childProps of this._childrenProps) {\n const params = this.batchedTree.reader.readTileParams(childProps, this);\n const child = new BatchedTile(params, this.batchedTree);\n children = children ?? [];\n children.push(child);\n }\n } catch (err) {\n Logger.logException(loggerCategory, err);\n children = undefined;\n if (err instanceof Error)\n reject(err);\n }\n }\n\n resolve(children);\n }\n\n public override get channel(): TileRequestChannel {\n if (!channel) {\n channel = new TileRequestChannel(\"itwinjs-batched-models\", 20);\n IModelApp.tileAdmin.channels.add(channel);\n }\n\n return channel;\n }\n\n public override async requestContent(_isCanceled: () => boolean): Promise<TileRequest.Response> {\n const url = new URL(this.contentId, this.batchedTree.reader.baseUrl);\n url.search = this.batchedTree.reader.baseUrl.search;\n const response = await fetch(url.toString());\n return response.arrayBuffer();\n }\n\n public override async readContent(data: TileRequest.ResponseData, system: RenderSystem, shouldAbort?: () => boolean): Promise<TileContent> {\n assert(data instanceof Uint8Array);\n if (!(data instanceof Uint8Array))\n return { };\n\n let reader: ImdlReader | BatchedTileContentReader | undefined = ImdlReader.create({\n stream: ByteStream.fromUint8Array(data),\n iModel: this.tree.iModel,\n modelId: this.tree.modelId,\n is3d: true,\n isLeaf: this.isLeaf,\n system,\n isCanceled: shouldAbort,\n options: {\n tileId: this.contentId,\n },\n });\n\n if (!reader) {\n const gltfProps = GltfReaderProps.create(data, false, this.batchedTree.reader.baseUrl);\n if (gltfProps) {\n reader = new BatchedTileContentReader({\n props: gltfProps,\n iModel: this.tree.iModel,\n system,\n shouldAbort,\n vertexTableRequired: true,\n modelId: this.tree.modelId,\n isLeaf: this.isLeaf,\n range: this.range,\n });\n }\n }\n\n if (!reader)\n return { };\n\n return reader.read();\n }\n\n protected override addRangeGraphic(builder: GraphicBuilder, type: TileBoundingBoxes): void {\n if (TileBoundingBoxes.ChildVolumes !== type) {\n super.addRangeGraphic(builder, type);\n return;\n }\n\n builder.setSymbology(ColorDef.green, ColorDef.green, 2);\n builder.addRangeBox(this.range);\n\n this.loadChildren();\n const children = this.children;\n if (!children)\n return;\n\n builder.setSymbology(ColorDef.blue, ColorDef.blue.withTransparency(0xdf), 1);\n for (const child of children) {\n const range = child.range;\n builder.addRangeBox(range);\n builder.addRangeBox(range, true);\n }\n }\n\n public prune(olderThan: BeTimePoint): void {\n const children = this._batchedChildren;\n if (!children)\n return;\n\n if (this.usageMarker.isExpired(olderThan)) {\n this.disposeChildren();\n } else {\n for (const child of children)\n child.prune(olderThan);\n }\n }\n}\n"]}
1
+ {"version":3,"file":"BatchedTile.js","sourceRoot":"","sources":["../../src/BatchedTile.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\nimport { assert, BeTimePoint, ByteStream, Logger } from \"@itwin/core-bentley\";\r\nimport { ColorDef, Tileset3dSchema } from \"@itwin/core-common\";\r\nimport {\r\n GltfReaderProps, GraphicBuilder, ImdlReader, IModelApp, RealityTileLoader, RenderSystem, Tile, TileBoundingBoxes, TileContent,\r\n TileDrawArgs, TileParams, TileRequest, TileRequestChannel, TileTreeLoadStatus, TileUser, TileVisibility, Viewport,\r\n} from \"@itwin/core-frontend\";\r\nimport { loggerCategory } from \"./LoggerCategory\";\r\nimport { BatchedTileTree } from \"./BatchedTileTree\";\r\nimport { BatchedTileContentReader } from \"./BatchedTileContentReader\";\r\nimport { getMaxLevelsToSkip } from \"./FrontendTiles\";\r\n\r\n/** @internal */\r\nexport interface BatchedTileParams extends TileParams {\r\n childrenProps: Tileset3dSchema.Tile[] | undefined;\r\n}\r\n\r\nlet channel: TileRequestChannel | undefined;\r\n\r\n/** @internal */\r\nexport class BatchedTile extends Tile {\r\n private readonly _childrenProps?: Tileset3dSchema.Tile[];\r\n private readonly _unskippable: boolean;\r\n\r\n public get batchedTree(): BatchedTileTree {\r\n return this.tree as BatchedTileTree;\r\n }\r\n\r\n public constructor(params: BatchedTileParams, tree: BatchedTileTree) {\r\n super(params, tree);\r\n\r\n // The root tile never has content, so it doesn't count toward max levels to skip.\r\n this._unskippable = 0 === (this.depth % getMaxLevelsToSkip());\r\n\r\n if (params.childrenProps?.length)\r\n this._childrenProps = params.childrenProps;\r\n\r\n if (!this.contentId) {\r\n this.setIsReady();\r\n // mark \"undisplayable\"\r\n this._maximumSize = 0;\r\n }\r\n }\r\n\r\n private get _batchedChildren(): BatchedTile[] | undefined {\r\n return this.children as BatchedTile[] | undefined;\r\n }\r\n\r\n public override computeLoadPriority(viewports: Iterable<Viewport>, _users: Iterable<TileUser>): number {\r\n // Prioritize tiles closer to camera and center of attention (zoom point or screen center).\r\n return RealityTileLoader.computeTileLocationPriority(this, viewports, this.tree.iModelTransform);\r\n }\r\n\r\n public selectTiles(selected: Set<BatchedTile>, args: TileDrawArgs, closestDisplayableAncestor: BatchedTile | undefined): void {\r\n const vis = this.computeVisibility(args);\r\n if (TileVisibility.OutsideFrustum === vis)\r\n return;\r\n\r\n if (this._unskippable) {\r\n // Prevent this tile's content from being unloaded due to memory pressure.\r\n args.touchedTiles.add(this);\r\n args.markUsed(this);\r\n }\r\n\r\n closestDisplayableAncestor = this.hasGraphics ? this : closestDisplayableAncestor;\r\n if (TileVisibility.TooCoarse === vis && (this.isReady || !this._unskippable)) {\r\n args.markUsed(this);\r\n args.markReady(this);\r\n const childrenLoadStatus = this.loadChildren();\r\n if (TileTreeLoadStatus.Loading === childrenLoadStatus)\r\n args.markChildrenLoading();\r\n\r\n const children = this._batchedChildren;\r\n if (children) {\r\n for (const child of children)\r\n child.selectTiles(selected, args, closestDisplayableAncestor);\r\n\r\n return;\r\n }\r\n }\r\n\r\n // We want to display this tile. Request its content if not already loaded.\r\n if ((TileVisibility.Visible === vis || this._unskippable) && !this.isReady)\r\n args.insertMissing(this);\r\n\r\n if (closestDisplayableAncestor)\r\n selected.add(closestDisplayableAncestor);\r\n }\r\n\r\n protected override _loadChildren(resolve: (children: Tile[] | undefined) => void, reject: (error: Error) => void): void {\r\n let children: BatchedTile[] | undefined;\r\n if (this._childrenProps) {\r\n try {\r\n for (const childProps of this._childrenProps) {\r\n const params = this.batchedTree.reader.readTileParams(childProps, this);\r\n const child = new BatchedTile(params, this.batchedTree);\r\n children = children ?? [];\r\n children.push(child);\r\n }\r\n } catch (err) {\r\n Logger.logException(loggerCategory, err);\r\n children = undefined;\r\n if (err instanceof Error)\r\n reject(err);\r\n }\r\n }\r\n\r\n resolve(children);\r\n }\r\n\r\n public override get channel(): TileRequestChannel {\r\n if (!channel) {\r\n channel = new TileRequestChannel(\"itwinjs-batched-models\", 20);\r\n IModelApp.tileAdmin.channels.add(channel);\r\n }\r\n\r\n return channel;\r\n }\r\n\r\n public override async requestContent(_isCanceled: () => boolean): Promise<TileRequest.Response> {\r\n const url = new URL(this.contentId, this.batchedTree.reader.baseUrl);\r\n url.search = this.batchedTree.reader.baseUrl.search;\r\n const response = await fetch(url.toString());\r\n return response.arrayBuffer();\r\n }\r\n\r\n public override async readContent(data: TileRequest.ResponseData, system: RenderSystem, shouldAbort?: () => boolean): Promise<TileContent> {\r\n assert(data instanceof Uint8Array);\r\n if (!(data instanceof Uint8Array))\r\n return { };\r\n\r\n let reader: ImdlReader | BatchedTileContentReader | undefined = ImdlReader.create({\r\n stream: ByteStream.fromUint8Array(data),\r\n iModel: this.tree.iModel,\r\n modelId: this.tree.modelId,\r\n is3d: true,\r\n isLeaf: this.isLeaf,\r\n system,\r\n isCanceled: shouldAbort,\r\n options: {\r\n tileId: this.contentId,\r\n },\r\n });\r\n\r\n if (!reader) {\r\n const gltfProps = GltfReaderProps.create(data, false, this.batchedTree.reader.baseUrl);\r\n if (gltfProps) {\r\n reader = new BatchedTileContentReader({\r\n props: gltfProps,\r\n iModel: this.tree.iModel,\r\n system,\r\n shouldAbort,\r\n vertexTableRequired: true,\r\n modelId: this.tree.modelId,\r\n isLeaf: this.isLeaf,\r\n range: this.range,\r\n });\r\n }\r\n }\r\n\r\n if (!reader)\r\n return { };\r\n\r\n return reader.read();\r\n }\r\n\r\n protected override addRangeGraphic(builder: GraphicBuilder, type: TileBoundingBoxes): void {\r\n if (TileBoundingBoxes.ChildVolumes !== type) {\r\n super.addRangeGraphic(builder, type);\r\n return;\r\n }\r\n\r\n builder.setSymbology(ColorDef.green, ColorDef.green, 2);\r\n builder.addRangeBox(this.range);\r\n\r\n this.loadChildren();\r\n const children = this.children;\r\n if (!children)\r\n return;\r\n\r\n builder.setSymbology(ColorDef.blue, ColorDef.blue.withTransparency(0xdf), 1);\r\n for (const child of children) {\r\n const range = child.range;\r\n builder.addRangeBox(range);\r\n builder.addRangeBox(range, true);\r\n }\r\n }\r\n\r\n public prune(olderThan: BeTimePoint): void {\r\n const children = this._batchedChildren;\r\n if (!children)\r\n return;\r\n\r\n if (this.usageMarker.isExpired(olderThan)) {\r\n this.disposeChildren();\r\n } else {\r\n for (const child of children)\r\n child.prune(olderThan);\r\n }\r\n }\r\n}\r\n"]}
@@ -1,23 +1,23 @@
1
- import { Id64String } from "@itwin/core-bentley";
2
- import { Range3d } from "@itwin/core-geometry";
3
- import { Feature } from "@itwin/core-common";
4
- import { GltfMeshPrimitive, GltfReader, GltfReaderArgs, GltfReaderResult } from "@itwin/core-frontend";
5
- interface BatchedTileReaderArgs extends GltfReaderArgs {
6
- modelId: Id64String;
7
- isLeaf: boolean;
8
- range: Range3d;
9
- }
10
- /** Read batched tiles in 3d Tiles 1.1 format. Currently, we prefer to produce tiles in iMdl format, so this goes unused for now.
11
- * @internal
12
- */
13
- export declare class BatchedTileContentReader extends GltfReader {
14
- private readonly _modelId;
15
- private readonly _isLeaf;
16
- private readonly _range;
17
- constructor(args: BatchedTileReaderArgs);
18
- read(): Promise<GltfReaderResult>;
19
- private readFeatureTable;
20
- protected readPrimitiveFeatures(primitive: GltfMeshPrimitive): Feature | number[] | undefined;
21
- }
22
- export {};
1
+ import { Id64String } from "@itwin/core-bentley";
2
+ import { Range3d } from "@itwin/core-geometry";
3
+ import { Feature } from "@itwin/core-common";
4
+ import { GltfMeshPrimitive, GltfReader, GltfReaderArgs, GltfReaderResult } from "@itwin/core-frontend";
5
+ interface BatchedTileReaderArgs extends GltfReaderArgs {
6
+ modelId: Id64String;
7
+ isLeaf: boolean;
8
+ range: Range3d;
9
+ }
10
+ /** Read batched tiles in 3d Tiles 1.1 format. Currently, we prefer to produce tiles in iMdl format, so this goes unused for now.
11
+ * @internal
12
+ */
13
+ export declare class BatchedTileContentReader extends GltfReader {
14
+ private readonly _modelId;
15
+ private readonly _isLeaf;
16
+ private readonly _range;
17
+ constructor(args: BatchedTileReaderArgs);
18
+ read(): Promise<GltfReaderResult>;
19
+ private readFeatureTable;
20
+ protected readPrimitiveFeatures(primitive: GltfMeshPrimitive): Feature | number[] | undefined;
21
+ }
22
+ export {};
23
23
  //# sourceMappingURL=BatchedTileContentReader.d.ts.map
@@ -1,73 +1,73 @@
1
- /*---------------------------------------------------------------------------------------------
2
- * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
3
- * See LICENSE.md in the project root for license terms and full copyright notice.
4
- *--------------------------------------------------------------------------------------------*/
5
- import { assert, Id64 } from "@itwin/core-bentley";
6
- import { Feature, FeatureTable, TileReadStatus } from "@itwin/core-common";
7
- import { GltfDataType, GltfReader, } from "@itwin/core-frontend";
8
- /** Read batched tiles in 3d Tiles 1.1 format. Currently, we prefer to produce tiles in iMdl format, so this goes unused for now.
9
- * @internal
10
- */
11
- export class BatchedTileContentReader extends GltfReader {
12
- constructor(args) {
13
- super(args);
14
- this._modelId = args.modelId;
15
- this._isLeaf = args.isLeaf;
16
- this._range = args.range;
17
- }
18
- async read() {
19
- const featureTable = this.readFeatureTable();
20
- await this.resolveResources();
21
- if (this._isCanceled)
22
- return { readStatus: TileReadStatus.Canceled, isLeaf: this._isLeaf };
23
- return this.readGltfAndCreateGraphics(this._isLeaf, featureTable, this._range);
24
- }
25
- readFeatureTable() {
26
- var _a, _b, _c, _d;
27
- // ###TODO we're just assuming there's one property table with one u64 property containing element Ids.
28
- const tables = (_b = (_a = this._glTF.extensions) === null || _a === void 0 ? void 0 : _a.EXT_structural_metadata) === null || _b === void 0 ? void 0 : _b.propertyTables;
29
- const table = tables ? tables[0] : undefined;
30
- const elementIdProperty = (table === null || table === void 0 ? void 0 : table.properties) ? table.properties.ElementId : undefined;
31
- if (!elementIdProperty)
32
- return undefined;
33
- const bufferView = this._bufferViews[elementIdProperty.values];
34
- if (!bufferView || undefined === bufferView.buffer)
35
- return undefined;
36
- const bufferData = (_c = this._buffers[bufferView.buffer]) === null || _c === void 0 ? void 0 : _c.resolvedBuffer;
37
- if (!bufferData)
38
- return undefined;
39
- assert(undefined !== bufferView.byteLength); // required by spec; TypeScript interface is wrong.
40
- const byteOffset = (_d = bufferView.byteOffset) !== null && _d !== void 0 ? _d : 0;
41
- const bytes = bufferData.subarray(byteOffset, byteOffset + bufferView.byteLength);
42
- // 2 u32s per element Id.
43
- const elementIds = new Uint32Array(bytes.buffer, bytes.byteOffset, bytes.byteLength / 4);
44
- const numFeatures = elementIds.length / 2;
45
- const featureTable = new FeatureTable(numFeatures, this._modelId);
46
- for (let i = 0; i < numFeatures; i++) {
47
- const elementId = Id64.fromUint32Pair(elementIds[i * 2], elementIds[i * 2 + 1]);
48
- featureTable.insertWithIndex(new Feature(elementId), i);
49
- }
50
- return featureTable;
51
- }
52
- readPrimitiveFeatures(primitive) {
53
- var _a, _b;
54
- const ext = (_a = primitive.extensions) === null || _a === void 0 ? void 0 : _a.EXT_mesh_features;
55
- if (ext) {
56
- // ###TODO making assumptions here.
57
- const view = this.getBufferView(primitive.attributes, `_FEATURE_ID_${ext.featureIds[0].attribute}`);
58
- // NB: 32-bit integers are not supported, but 8- and 16-bit integers will be converted to them.
59
- // With more than 64k features in the tile we represent the Ids as floats instead.
60
- const featureIds = (_b = view === null || view === void 0 ? void 0 : view.toBufferData(GltfDataType.Float)) !== null && _b !== void 0 ? _b : view === null || view === void 0 ? void 0 : view.toBufferData(GltfDataType.UInt32);
61
- if (view && featureIds) {
62
- const indices = [];
63
- for (let i = 0; i < featureIds.count; i++) {
64
- const featureId = featureIds.buffer[i * view.stride];
65
- indices.push(featureId);
66
- }
67
- return indices;
68
- }
69
- }
70
- return new Feature(this._modelId);
71
- }
72
- }
1
+ /*---------------------------------------------------------------------------------------------
2
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
3
+ * See LICENSE.md in the project root for license terms and full copyright notice.
4
+ *--------------------------------------------------------------------------------------------*/
5
+ import { assert, Id64 } from "@itwin/core-bentley";
6
+ import { Feature, FeatureTable, TileReadStatus } from "@itwin/core-common";
7
+ import { GltfDataType, GltfReader, } from "@itwin/core-frontend";
8
+ /** Read batched tiles in 3d Tiles 1.1 format. Currently, we prefer to produce tiles in iMdl format, so this goes unused for now.
9
+ * @internal
10
+ */
11
+ export class BatchedTileContentReader extends GltfReader {
12
+ constructor(args) {
13
+ super(args);
14
+ this._modelId = args.modelId;
15
+ this._isLeaf = args.isLeaf;
16
+ this._range = args.range;
17
+ }
18
+ async read() {
19
+ const featureTable = this.readFeatureTable();
20
+ await this.resolveResources();
21
+ if (this._isCanceled)
22
+ return { readStatus: TileReadStatus.Canceled, isLeaf: this._isLeaf };
23
+ return this.readGltfAndCreateGraphics(this._isLeaf, featureTable, this._range);
24
+ }
25
+ readFeatureTable() {
26
+ var _a, _b, _c, _d;
27
+ // ###TODO we're just assuming there's one property table with one u64 property containing element Ids.
28
+ const tables = (_b = (_a = this._glTF.extensions) === null || _a === void 0 ? void 0 : _a.EXT_structural_metadata) === null || _b === void 0 ? void 0 : _b.propertyTables;
29
+ const table = tables ? tables[0] : undefined;
30
+ const elementIdProperty = (table === null || table === void 0 ? void 0 : table.properties) ? table.properties.ElementId : undefined;
31
+ if (!elementIdProperty)
32
+ return undefined;
33
+ const bufferView = this._bufferViews[elementIdProperty.values];
34
+ if (!bufferView || undefined === bufferView.buffer)
35
+ return undefined;
36
+ const bufferData = (_c = this._buffers[bufferView.buffer]) === null || _c === void 0 ? void 0 : _c.resolvedBuffer;
37
+ if (!bufferData)
38
+ return undefined;
39
+ assert(undefined !== bufferView.byteLength); // required by spec; TypeScript interface is wrong.
40
+ const byteOffset = (_d = bufferView.byteOffset) !== null && _d !== void 0 ? _d : 0;
41
+ const bytes = bufferData.subarray(byteOffset, byteOffset + bufferView.byteLength);
42
+ // 2 u32s per element Id.
43
+ const elementIds = new Uint32Array(bytes.buffer, bytes.byteOffset, bytes.byteLength / 4);
44
+ const numFeatures = elementIds.length / 2;
45
+ const featureTable = new FeatureTable(numFeatures, this._modelId);
46
+ for (let i = 0; i < numFeatures; i++) {
47
+ const elementId = Id64.fromUint32Pair(elementIds[i * 2], elementIds[i * 2 + 1]);
48
+ featureTable.insertWithIndex(new Feature(elementId), i);
49
+ }
50
+ return featureTable;
51
+ }
52
+ readPrimitiveFeatures(primitive) {
53
+ var _a, _b;
54
+ const ext = (_a = primitive.extensions) === null || _a === void 0 ? void 0 : _a.EXT_mesh_features;
55
+ if (ext) {
56
+ // ###TODO making assumptions here.
57
+ const view = this.getBufferView(primitive.attributes, `_FEATURE_ID_${ext.featureIds[0].attribute}`);
58
+ // NB: 32-bit integers are not supported, but 8- and 16-bit integers will be converted to them.
59
+ // With more than 64k features in the tile we represent the Ids as floats instead.
60
+ const featureIds = (_b = view === null || view === void 0 ? void 0 : view.toBufferData(GltfDataType.Float)) !== null && _b !== void 0 ? _b : view === null || view === void 0 ? void 0 : view.toBufferData(GltfDataType.UInt32);
61
+ if (view && featureIds) {
62
+ const indices = [];
63
+ for (let i = 0; i < featureIds.count; i++) {
64
+ const featureId = featureIds.buffer[i * view.stride];
65
+ indices.push(featureId);
66
+ }
67
+ return indices;
68
+ }
69
+ }
70
+ return new Feature(this._modelId);
71
+ }
72
+ }
73
73
  //# sourceMappingURL=BatchedTileContentReader.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"BatchedTileContentReader.js","sourceRoot":"","sources":["../../src/BatchedTileContentReader.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\nimport { assert, Id64, Id64String } from \"@itwin/core-bentley\";\nimport { Range3d } from \"@itwin/core-geometry\";\nimport { Feature, FeatureTable, TileReadStatus } from \"@itwin/core-common\";\nimport {\n GltfDataType, GltfMeshPrimitive, GltfReader, GltfReaderArgs, GltfReaderResult,\n} from \"@itwin/core-frontend\";\n\ninterface BatchedTileReaderArgs extends GltfReaderArgs {\n modelId: Id64String;\n isLeaf: boolean;\n range: Range3d;\n}\n\n/** Read batched tiles in 3d Tiles 1.1 format. Currently, we prefer to produce tiles in iMdl format, so this goes unused for now.\n * @internal\n */\nexport class BatchedTileContentReader extends GltfReader {\n private readonly _modelId: Id64String;\n private readonly _isLeaf: boolean;\n private readonly _range: Range3d;\n\n public constructor(args: BatchedTileReaderArgs) {\n super(args);\n this._modelId = args.modelId;\n this._isLeaf = args.isLeaf;\n this._range = args.range;\n }\n\n public override async read(): Promise<GltfReaderResult> {\n const featureTable = this.readFeatureTable();\n await this.resolveResources();\n if (this._isCanceled)\n return { readStatus: TileReadStatus.Canceled, isLeaf: this._isLeaf };\n\n return this.readGltfAndCreateGraphics(this._isLeaf, featureTable, this._range);\n }\n\n private readFeatureTable(): FeatureTable | undefined {\n // ###TODO we're just assuming there's one property table with one u64 property containing element Ids.\n const tables = this._glTF.extensions?.EXT_structural_metadata?.propertyTables;\n const table = tables ? tables[0] : undefined;\n const elementIdProperty = table?.properties ? table.properties.ElementId : undefined;\n if (!elementIdProperty)\n return undefined;\n\n const bufferView = this._bufferViews[elementIdProperty.values];\n if (!bufferView || undefined === bufferView.buffer)\n return undefined;\n\n const bufferData = this._buffers[bufferView.buffer]?.resolvedBuffer;\n if (!bufferData)\n return undefined;\n\n assert(undefined !== bufferView.byteLength); // required by spec; TypeScript interface is wrong.\n const byteOffset = bufferView.byteOffset ?? 0;\n const bytes = bufferData.subarray(byteOffset, byteOffset + bufferView.byteLength);\n\n // 2 u32s per element Id.\n const elementIds = new Uint32Array(bytes.buffer, bytes.byteOffset, bytes.byteLength / 4);\n const numFeatures = elementIds.length / 2;\n const featureTable = new FeatureTable(numFeatures, this._modelId);\n for (let i = 0; i < numFeatures; i++) {\n const elementId = Id64.fromUint32Pair(elementIds[i * 2], elementIds[i * 2 + 1]);\n featureTable.insertWithIndex(new Feature(elementId), i);\n }\n\n return featureTable;\n }\n\n protected override readPrimitiveFeatures(primitive: GltfMeshPrimitive): Feature | number[] | undefined {\n const ext = primitive.extensions?.EXT_mesh_features;\n if (ext) {\n // ###TODO making assumptions here.\n const view = this.getBufferView(primitive.attributes, `_FEATURE_ID_${ext.featureIds[0].attribute}`);\n // NB: 32-bit integers are not supported, but 8- and 16-bit integers will be converted to them.\n // With more than 64k features in the tile we represent the Ids as floats instead.\n const featureIds = view?.toBufferData(GltfDataType.Float) ?? view?.toBufferData(GltfDataType.UInt32);\n if (view && featureIds) {\n const indices = [];\n for (let i = 0; i < featureIds.count; i++) {\n const featureId = featureIds.buffer[i * view.stride];\n indices.push(featureId);\n }\n\n return indices;\n }\n }\n\n return new Feature(this._modelId);\n }\n}\n"]}
1
+ {"version":3,"file":"BatchedTileContentReader.js","sourceRoot":"","sources":["../../src/BatchedTileContentReader.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAE/F,OAAO,EAAE,MAAM,EAAE,IAAI,EAAc,MAAM,qBAAqB,CAAC;AAE/D,OAAO,EAAE,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAC3E,OAAO,EACL,YAAY,EAAqB,UAAU,GAC5C,MAAM,sBAAsB,CAAC;AAQ9B;;GAEG;AACH,MAAM,OAAO,wBAAyB,SAAQ,UAAU;IAKtD,YAAmB,IAA2B;QAC5C,KAAK,CAAC,IAAI,CAAC,CAAC;QACZ,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC;QAC7B,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC;QAC3B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC;IAC3B,CAAC;IAEe,KAAK,CAAC,IAAI;QACxB,MAAM,YAAY,GAAG,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC7C,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC9B,IAAI,IAAI,CAAC,WAAW;YAClB,OAAO,EAAE,UAAU,EAAE,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;QAEvE,OAAO,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,OAAO,EAAE,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACjF,CAAC;IAEO,gBAAgB;;QACtB,uGAAuG;QACvG,MAAM,MAAM,GAAG,MAAA,MAAA,IAAI,CAAC,KAAK,CAAC,UAAU,0CAAE,uBAAuB,0CAAE,cAAc,CAAC;QAC9E,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QAC7C,MAAM,iBAAiB,GAAG,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,UAAU,EAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;QACrF,IAAI,CAAC,iBAAiB;YACpB,OAAO,SAAS,CAAC;QAEnB,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,CAAC,iBAAiB,CAAC,MAAM,CAAC,CAAC;QAC/D,IAAI,CAAC,UAAU,IAAI,SAAS,KAAK,UAAU,CAAC,MAAM;YAChD,OAAO,SAAS,CAAC;QAEnB,MAAM,UAAU,GAAG,MAAA,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,0CAAE,cAAc,CAAC;QACpE,IAAI,CAAC,UAAU;YACb,OAAO,SAAS,CAAC;QAEnB,MAAM,CAAC,SAAS,KAAK,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC,mDAAmD;QAChG,MAAM,UAAU,GAAG,MAAA,UAAU,CAAC,UAAU,mCAAI,CAAC,CAAC;QAC9C,MAAM,KAAK,GAAG,UAAU,CAAC,QAAQ,CAAC,UAAU,EAAE,UAAU,GAAG,UAAU,CAAC,UAAU,CAAC,CAAC;QAElF,yBAAyB;QACzB,MAAM,UAAU,GAAG,IAAI,WAAW,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC;QACzF,MAAM,WAAW,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;QAC1C,MAAM,YAAY,GAAG,IAAI,YAAY,CAAC,WAAW,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;QAClE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,WAAW,EAAE,CAAC,EAAE,EAAE;YACpC,MAAM,SAAS,GAAG,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;YAChF,YAAY,CAAC,eAAe,CAAC,IAAI,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC;SACzD;QAED,OAAO,YAAY,CAAC;IACtB,CAAC;IAEkB,qBAAqB,CAAC,SAA4B;;QACnE,MAAM,GAAG,GAAG,MAAA,SAAS,CAAC,UAAU,0CAAE,iBAAiB,CAAC;QACpD,IAAI,GAAG,EAAE;YACP,mCAAmC;YACnC,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,UAAU,EAAE,eAAe,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC;YACpG,+FAA+F;YAC/F,kFAAkF;YAClF,MAAM,UAAU,GAAG,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,YAAY,CAAC,YAAY,CAAC,KAAK,CAAC,mCAAI,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,YAAY,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;YACrG,IAAI,IAAI,IAAI,UAAU,EAAE;gBACtB,MAAM,OAAO,GAAG,EAAE,CAAC;gBACnB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;oBACzC,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;oBACrD,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;iBACzB;gBAED,OAAO,OAAO,CAAC;aAChB;SACF;QAED,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACpC,CAAC;CACF","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\nimport { assert, Id64, Id64String } from \"@itwin/core-bentley\";\r\nimport { Range3d } from \"@itwin/core-geometry\";\r\nimport { Feature, FeatureTable, TileReadStatus } from \"@itwin/core-common\";\r\nimport {\r\n GltfDataType, GltfMeshPrimitive, GltfReader, GltfReaderArgs, GltfReaderResult,\r\n} from \"@itwin/core-frontend\";\r\n\r\ninterface BatchedTileReaderArgs extends GltfReaderArgs {\r\n modelId: Id64String;\r\n isLeaf: boolean;\r\n range: Range3d;\r\n}\r\n\r\n/** Read batched tiles in 3d Tiles 1.1 format. Currently, we prefer to produce tiles in iMdl format, so this goes unused for now.\r\n * @internal\r\n */\r\nexport class BatchedTileContentReader extends GltfReader {\r\n private readonly _modelId: Id64String;\r\n private readonly _isLeaf: boolean;\r\n private readonly _range: Range3d;\r\n\r\n public constructor(args: BatchedTileReaderArgs) {\r\n super(args);\r\n this._modelId = args.modelId;\r\n this._isLeaf = args.isLeaf;\r\n this._range = args.range;\r\n }\r\n\r\n public override async read(): Promise<GltfReaderResult> {\r\n const featureTable = this.readFeatureTable();\r\n await this.resolveResources();\r\n if (this._isCanceled)\r\n return { readStatus: TileReadStatus.Canceled, isLeaf: this._isLeaf };\r\n\r\n return this.readGltfAndCreateGraphics(this._isLeaf, featureTable, this._range);\r\n }\r\n\r\n private readFeatureTable(): FeatureTable | undefined {\r\n // ###TODO we're just assuming there's one property table with one u64 property containing element Ids.\r\n const tables = this._glTF.extensions?.EXT_structural_metadata?.propertyTables;\r\n const table = tables ? tables[0] : undefined;\r\n const elementIdProperty = table?.properties ? table.properties.ElementId : undefined;\r\n if (!elementIdProperty)\r\n return undefined;\r\n\r\n const bufferView = this._bufferViews[elementIdProperty.values];\r\n if (!bufferView || undefined === bufferView.buffer)\r\n return undefined;\r\n\r\n const bufferData = this._buffers[bufferView.buffer]?.resolvedBuffer;\r\n if (!bufferData)\r\n return undefined;\r\n\r\n assert(undefined !== bufferView.byteLength); // required by spec; TypeScript interface is wrong.\r\n const byteOffset = bufferView.byteOffset ?? 0;\r\n const bytes = bufferData.subarray(byteOffset, byteOffset + bufferView.byteLength);\r\n\r\n // 2 u32s per element Id.\r\n const elementIds = new Uint32Array(bytes.buffer, bytes.byteOffset, bytes.byteLength / 4);\r\n const numFeatures = elementIds.length / 2;\r\n const featureTable = new FeatureTable(numFeatures, this._modelId);\r\n for (let i = 0; i < numFeatures; i++) {\r\n const elementId = Id64.fromUint32Pair(elementIds[i * 2], elementIds[i * 2 + 1]);\r\n featureTable.insertWithIndex(new Feature(elementId), i);\r\n }\r\n\r\n return featureTable;\r\n }\r\n\r\n protected override readPrimitiveFeatures(primitive: GltfMeshPrimitive): Feature | number[] | undefined {\r\n const ext = primitive.extensions?.EXT_mesh_features;\r\n if (ext) {\r\n // ###TODO making assumptions here.\r\n const view = this.getBufferView(primitive.attributes, `_FEATURE_ID_${ext.featureIds[0].attribute}`);\r\n // NB: 32-bit integers are not supported, but 8- and 16-bit integers will be converted to them.\r\n // With more than 64k features in the tile we represent the Ids as floats instead.\r\n const featureIds = view?.toBufferData(GltfDataType.Float) ?? view?.toBufferData(GltfDataType.UInt32);\r\n if (view && featureIds) {\r\n const indices = [];\r\n for (let i = 0; i < featureIds.count; i++) {\r\n const featureId = featureIds.buffer[i * view.stride];\r\n indices.push(featureId);\r\n }\r\n\r\n return indices;\r\n }\r\n }\r\n\r\n return new Feature(this._modelId);\r\n }\r\n}\r\n"]}