@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,169 +1,169 @@
1
- "use strict";
2
- /*---------------------------------------------------------------------------------------------
3
- * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
4
- * See LICENSE.md in the project root for license terms and full copyright notice.
5
- *--------------------------------------------------------------------------------------------*/
6
- Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.BatchedTile = void 0;
8
- const core_bentley_1 = require("@itwin/core-bentley");
9
- const core_common_1 = require("@itwin/core-common");
10
- const core_frontend_1 = require("@itwin/core-frontend");
11
- const LoggerCategory_1 = require("./LoggerCategory");
12
- const BatchedTileContentReader_1 = require("./BatchedTileContentReader");
13
- const FrontendTiles_1 = require("./FrontendTiles");
14
- let channel;
15
- /** @internal */
16
- class BatchedTile extends core_frontend_1.Tile {
17
- constructor(params, tree) {
18
- var _a;
19
- super(params, tree);
20
- // The root tile never has content, so it doesn't count toward max levels to skip.
21
- this._unskippable = 0 === (this.depth % (0, FrontendTiles_1.getMaxLevelsToSkip)());
22
- if ((_a = params.childrenProps) === null || _a === void 0 ? void 0 : _a.length)
23
- this._childrenProps = params.childrenProps;
24
- if (!this.contentId) {
25
- this.setIsReady();
26
- // mark "undisplayable"
27
- this._maximumSize = 0;
28
- }
29
- }
30
- get batchedTree() {
31
- return this.tree;
32
- }
33
- get _batchedChildren() {
34
- return this.children;
35
- }
36
- computeLoadPriority(viewports, _users) {
37
- // Prioritize tiles closer to camera and center of attention (zoom point or screen center).
38
- return core_frontend_1.RealityTileLoader.computeTileLocationPriority(this, viewports, this.tree.iModelTransform);
39
- }
40
- selectTiles(selected, args, closestDisplayableAncestor) {
41
- const vis = this.computeVisibility(args);
42
- if (core_frontend_1.TileVisibility.OutsideFrustum === vis)
43
- return;
44
- if (this._unskippable) {
45
- // Prevent this tile's content from being unloaded due to memory pressure.
46
- args.touchedTiles.add(this);
47
- args.markUsed(this);
48
- }
49
- closestDisplayableAncestor = this.hasGraphics ? this : closestDisplayableAncestor;
50
- if (core_frontend_1.TileVisibility.TooCoarse === vis && (this.isReady || !this._unskippable)) {
51
- args.markUsed(this);
52
- args.markReady(this);
53
- const childrenLoadStatus = this.loadChildren();
54
- if (core_frontend_1.TileTreeLoadStatus.Loading === childrenLoadStatus)
55
- args.markChildrenLoading();
56
- const children = this._batchedChildren;
57
- if (children) {
58
- for (const child of children)
59
- child.selectTiles(selected, args, closestDisplayableAncestor);
60
- return;
61
- }
62
- }
63
- // We want to display this tile. Request its content if not already loaded.
64
- if ((core_frontend_1.TileVisibility.Visible === vis || this._unskippable) && !this.isReady)
65
- args.insertMissing(this);
66
- if (closestDisplayableAncestor)
67
- selected.add(closestDisplayableAncestor);
68
- }
69
- _loadChildren(resolve, reject) {
70
- let children;
71
- if (this._childrenProps) {
72
- try {
73
- for (const childProps of this._childrenProps) {
74
- const params = this.batchedTree.reader.readTileParams(childProps, this);
75
- const child = new BatchedTile(params, this.batchedTree);
76
- children = children !== null && children !== void 0 ? children : [];
77
- children.push(child);
78
- }
79
- }
80
- catch (err) {
81
- core_bentley_1.Logger.logException(LoggerCategory_1.loggerCategory, err);
82
- children = undefined;
83
- if (err instanceof Error)
84
- reject(err);
85
- }
86
- }
87
- resolve(children);
88
- }
89
- get channel() {
90
- if (!channel) {
91
- channel = new core_frontend_1.TileRequestChannel("itwinjs-batched-models", 20);
92
- core_frontend_1.IModelApp.tileAdmin.channels.add(channel);
93
- }
94
- return channel;
95
- }
96
- async requestContent(_isCanceled) {
97
- const url = new URL(this.contentId, this.batchedTree.reader.baseUrl);
98
- url.search = this.batchedTree.reader.baseUrl.search;
99
- const response = await fetch(url.toString());
100
- return response.arrayBuffer();
101
- }
102
- async readContent(data, system, shouldAbort) {
103
- (0, core_bentley_1.assert)(data instanceof Uint8Array);
104
- if (!(data instanceof Uint8Array))
105
- return {};
106
- let reader = core_frontend_1.ImdlReader.create({
107
- stream: core_bentley_1.ByteStream.fromUint8Array(data),
108
- iModel: this.tree.iModel,
109
- modelId: this.tree.modelId,
110
- is3d: true,
111
- isLeaf: this.isLeaf,
112
- system,
113
- isCanceled: shouldAbort,
114
- options: {
115
- tileId: this.contentId,
116
- },
117
- });
118
- if (!reader) {
119
- const gltfProps = core_frontend_1.GltfReaderProps.create(data, false, this.batchedTree.reader.baseUrl);
120
- if (gltfProps) {
121
- reader = new BatchedTileContentReader_1.BatchedTileContentReader({
122
- props: gltfProps,
123
- iModel: this.tree.iModel,
124
- system,
125
- shouldAbort,
126
- vertexTableRequired: true,
127
- modelId: this.tree.modelId,
128
- isLeaf: this.isLeaf,
129
- range: this.range,
130
- });
131
- }
132
- }
133
- if (!reader)
134
- return {};
135
- return reader.read();
136
- }
137
- addRangeGraphic(builder, type) {
138
- if (core_frontend_1.TileBoundingBoxes.ChildVolumes !== type) {
139
- super.addRangeGraphic(builder, type);
140
- return;
141
- }
142
- builder.setSymbology(core_common_1.ColorDef.green, core_common_1.ColorDef.green, 2);
143
- builder.addRangeBox(this.range);
144
- this.loadChildren();
145
- const children = this.children;
146
- if (!children)
147
- return;
148
- builder.setSymbology(core_common_1.ColorDef.blue, core_common_1.ColorDef.blue.withTransparency(0xdf), 1);
149
- for (const child of children) {
150
- const range = child.range;
151
- builder.addRangeBox(range);
152
- builder.addRangeBox(range, true);
153
- }
154
- }
155
- prune(olderThan) {
156
- const children = this._batchedChildren;
157
- if (!children)
158
- return;
159
- if (this.usageMarker.isExpired(olderThan)) {
160
- this.disposeChildren();
161
- }
162
- else {
163
- for (const child of children)
164
- child.prune(olderThan);
165
- }
166
- }
167
- }
168
- exports.BatchedTile = BatchedTile;
1
+ "use strict";
2
+ /*---------------------------------------------------------------------------------------------
3
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
4
+ * See LICENSE.md in the project root for license terms and full copyright notice.
5
+ *--------------------------------------------------------------------------------------------*/
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.BatchedTile = void 0;
8
+ const core_bentley_1 = require("@itwin/core-bentley");
9
+ const core_common_1 = require("@itwin/core-common");
10
+ const core_frontend_1 = require("@itwin/core-frontend");
11
+ const LoggerCategory_1 = require("./LoggerCategory");
12
+ const BatchedTileContentReader_1 = require("./BatchedTileContentReader");
13
+ const FrontendTiles_1 = require("./FrontendTiles");
14
+ let channel;
15
+ /** @internal */
16
+ class BatchedTile extends core_frontend_1.Tile {
17
+ constructor(params, tree) {
18
+ var _a;
19
+ super(params, tree);
20
+ // The root tile never has content, so it doesn't count toward max levels to skip.
21
+ this._unskippable = 0 === (this.depth % (0, FrontendTiles_1.getMaxLevelsToSkip)());
22
+ if ((_a = params.childrenProps) === null || _a === void 0 ? void 0 : _a.length)
23
+ this._childrenProps = params.childrenProps;
24
+ if (!this.contentId) {
25
+ this.setIsReady();
26
+ // mark "undisplayable"
27
+ this._maximumSize = 0;
28
+ }
29
+ }
30
+ get batchedTree() {
31
+ return this.tree;
32
+ }
33
+ get _batchedChildren() {
34
+ return this.children;
35
+ }
36
+ computeLoadPriority(viewports, _users) {
37
+ // Prioritize tiles closer to camera and center of attention (zoom point or screen center).
38
+ return core_frontend_1.RealityTileLoader.computeTileLocationPriority(this, viewports, this.tree.iModelTransform);
39
+ }
40
+ selectTiles(selected, args, closestDisplayableAncestor) {
41
+ const vis = this.computeVisibility(args);
42
+ if (core_frontend_1.TileVisibility.OutsideFrustum === vis)
43
+ return;
44
+ if (this._unskippable) {
45
+ // Prevent this tile's content from being unloaded due to memory pressure.
46
+ args.touchedTiles.add(this);
47
+ args.markUsed(this);
48
+ }
49
+ closestDisplayableAncestor = this.hasGraphics ? this : closestDisplayableAncestor;
50
+ if (core_frontend_1.TileVisibility.TooCoarse === vis && (this.isReady || !this._unskippable)) {
51
+ args.markUsed(this);
52
+ args.markReady(this);
53
+ const childrenLoadStatus = this.loadChildren();
54
+ if (core_frontend_1.TileTreeLoadStatus.Loading === childrenLoadStatus)
55
+ args.markChildrenLoading();
56
+ const children = this._batchedChildren;
57
+ if (children) {
58
+ for (const child of children)
59
+ child.selectTiles(selected, args, closestDisplayableAncestor);
60
+ return;
61
+ }
62
+ }
63
+ // We want to display this tile. Request its content if not already loaded.
64
+ if ((core_frontend_1.TileVisibility.Visible === vis || this._unskippable) && !this.isReady)
65
+ args.insertMissing(this);
66
+ if (closestDisplayableAncestor)
67
+ selected.add(closestDisplayableAncestor);
68
+ }
69
+ _loadChildren(resolve, reject) {
70
+ let children;
71
+ if (this._childrenProps) {
72
+ try {
73
+ for (const childProps of this._childrenProps) {
74
+ const params = this.batchedTree.reader.readTileParams(childProps, this);
75
+ const child = new BatchedTile(params, this.batchedTree);
76
+ children = children !== null && children !== void 0 ? children : [];
77
+ children.push(child);
78
+ }
79
+ }
80
+ catch (err) {
81
+ core_bentley_1.Logger.logException(LoggerCategory_1.loggerCategory, err);
82
+ children = undefined;
83
+ if (err instanceof Error)
84
+ reject(err);
85
+ }
86
+ }
87
+ resolve(children);
88
+ }
89
+ get channel() {
90
+ if (!channel) {
91
+ channel = new core_frontend_1.TileRequestChannel("itwinjs-batched-models", 20);
92
+ core_frontend_1.IModelApp.tileAdmin.channels.add(channel);
93
+ }
94
+ return channel;
95
+ }
96
+ async requestContent(_isCanceled) {
97
+ const url = new URL(this.contentId, this.batchedTree.reader.baseUrl);
98
+ url.search = this.batchedTree.reader.baseUrl.search;
99
+ const response = await fetch(url.toString());
100
+ return response.arrayBuffer();
101
+ }
102
+ async readContent(data, system, shouldAbort) {
103
+ (0, core_bentley_1.assert)(data instanceof Uint8Array);
104
+ if (!(data instanceof Uint8Array))
105
+ return {};
106
+ let reader = core_frontend_1.ImdlReader.create({
107
+ stream: core_bentley_1.ByteStream.fromUint8Array(data),
108
+ iModel: this.tree.iModel,
109
+ modelId: this.tree.modelId,
110
+ is3d: true,
111
+ isLeaf: this.isLeaf,
112
+ system,
113
+ isCanceled: shouldAbort,
114
+ options: {
115
+ tileId: this.contentId,
116
+ },
117
+ });
118
+ if (!reader) {
119
+ const gltfProps = core_frontend_1.GltfReaderProps.create(data, false, this.batchedTree.reader.baseUrl);
120
+ if (gltfProps) {
121
+ reader = new BatchedTileContentReader_1.BatchedTileContentReader({
122
+ props: gltfProps,
123
+ iModel: this.tree.iModel,
124
+ system,
125
+ shouldAbort,
126
+ vertexTableRequired: true,
127
+ modelId: this.tree.modelId,
128
+ isLeaf: this.isLeaf,
129
+ range: this.range,
130
+ });
131
+ }
132
+ }
133
+ if (!reader)
134
+ return {};
135
+ return reader.read();
136
+ }
137
+ addRangeGraphic(builder, type) {
138
+ if (core_frontend_1.TileBoundingBoxes.ChildVolumes !== type) {
139
+ super.addRangeGraphic(builder, type);
140
+ return;
141
+ }
142
+ builder.setSymbology(core_common_1.ColorDef.green, core_common_1.ColorDef.green, 2);
143
+ builder.addRangeBox(this.range);
144
+ this.loadChildren();
145
+ const children = this.children;
146
+ if (!children)
147
+ return;
148
+ builder.setSymbology(core_common_1.ColorDef.blue, core_common_1.ColorDef.blue.withTransparency(0xdf), 1);
149
+ for (const child of children) {
150
+ const range = child.range;
151
+ builder.addRangeBox(range);
152
+ builder.addRangeBox(range, true);
153
+ }
154
+ }
155
+ prune(olderThan) {
156
+ const children = this._batchedChildren;
157
+ if (!children)
158
+ return;
159
+ if (this.usageMarker.isExpired(olderThan)) {
160
+ this.disposeChildren();
161
+ }
162
+ else {
163
+ for (const child of children)
164
+ child.prune(olderThan);
165
+ }
166
+ }
167
+ }
168
+ exports.BatchedTile = BatchedTile;
169
169
  //# 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,77 +1,77 @@
1
- "use strict";
2
- /*---------------------------------------------------------------------------------------------
3
- * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
4
- * See LICENSE.md in the project root for license terms and full copyright notice.
5
- *--------------------------------------------------------------------------------------------*/
6
- Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.BatchedTileContentReader = void 0;
8
- const core_bentley_1 = require("@itwin/core-bentley");
9
- const core_common_1 = require("@itwin/core-common");
10
- const core_frontend_1 = require("@itwin/core-frontend");
11
- /** Read batched tiles in 3d Tiles 1.1 format. Currently, we prefer to produce tiles in iMdl format, so this goes unused for now.
12
- * @internal
13
- */
14
- class BatchedTileContentReader extends core_frontend_1.GltfReader {
15
- constructor(args) {
16
- super(args);
17
- this._modelId = args.modelId;
18
- this._isLeaf = args.isLeaf;
19
- this._range = args.range;
20
- }
21
- async read() {
22
- const featureTable = this.readFeatureTable();
23
- await this.resolveResources();
24
- if (this._isCanceled)
25
- return { readStatus: core_common_1.TileReadStatus.Canceled, isLeaf: this._isLeaf };
26
- return this.readGltfAndCreateGraphics(this._isLeaf, featureTable, this._range);
27
- }
28
- readFeatureTable() {
29
- var _a, _b, _c, _d;
30
- // ###TODO we're just assuming there's one property table with one u64 property containing element Ids.
31
- 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;
32
- const table = tables ? tables[0] : undefined;
33
- const elementIdProperty = (table === null || table === void 0 ? void 0 : table.properties) ? table.properties.ElementId : undefined;
34
- if (!elementIdProperty)
35
- return undefined;
36
- const bufferView = this._bufferViews[elementIdProperty.values];
37
- if (!bufferView || undefined === bufferView.buffer)
38
- return undefined;
39
- const bufferData = (_c = this._buffers[bufferView.buffer]) === null || _c === void 0 ? void 0 : _c.resolvedBuffer;
40
- if (!bufferData)
41
- return undefined;
42
- (0, core_bentley_1.assert)(undefined !== bufferView.byteLength); // required by spec; TypeScript interface is wrong.
43
- const byteOffset = (_d = bufferView.byteOffset) !== null && _d !== void 0 ? _d : 0;
44
- const bytes = bufferData.subarray(byteOffset, byteOffset + bufferView.byteLength);
45
- // 2 u32s per element Id.
46
- const elementIds = new Uint32Array(bytes.buffer, bytes.byteOffset, bytes.byteLength / 4);
47
- const numFeatures = elementIds.length / 2;
48
- const featureTable = new core_common_1.FeatureTable(numFeatures, this._modelId);
49
- for (let i = 0; i < numFeatures; i++) {
50
- const elementId = core_bentley_1.Id64.fromUint32Pair(elementIds[i * 2], elementIds[i * 2 + 1]);
51
- featureTable.insertWithIndex(new core_common_1.Feature(elementId), i);
52
- }
53
- return featureTable;
54
- }
55
- readPrimitiveFeatures(primitive) {
56
- var _a, _b;
57
- const ext = (_a = primitive.extensions) === null || _a === void 0 ? void 0 : _a.EXT_mesh_features;
58
- if (ext) {
59
- // ###TODO making assumptions here.
60
- const view = this.getBufferView(primitive.attributes, `_FEATURE_ID_${ext.featureIds[0].attribute}`);
61
- // NB: 32-bit integers are not supported, but 8- and 16-bit integers will be converted to them.
62
- // With more than 64k features in the tile we represent the Ids as floats instead.
63
- const featureIds = (_b = view === null || view === void 0 ? void 0 : view.toBufferData(core_frontend_1.GltfDataType.Float)) !== null && _b !== void 0 ? _b : view === null || view === void 0 ? void 0 : view.toBufferData(core_frontend_1.GltfDataType.UInt32);
64
- if (view && featureIds) {
65
- const indices = [];
66
- for (let i = 0; i < featureIds.count; i++) {
67
- const featureId = featureIds.buffer[i * view.stride];
68
- indices.push(featureId);
69
- }
70
- return indices;
71
- }
72
- }
73
- return new core_common_1.Feature(this._modelId);
74
- }
75
- }
76
- exports.BatchedTileContentReader = BatchedTileContentReader;
1
+ "use strict";
2
+ /*---------------------------------------------------------------------------------------------
3
+ * Copyright (c) Bentley Systems, Incorporated. All rights reserved.
4
+ * See LICENSE.md in the project root for license terms and full copyright notice.
5
+ *--------------------------------------------------------------------------------------------*/
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.BatchedTileContentReader = void 0;
8
+ const core_bentley_1 = require("@itwin/core-bentley");
9
+ const core_common_1 = require("@itwin/core-common");
10
+ const core_frontend_1 = require("@itwin/core-frontend");
11
+ /** Read batched tiles in 3d Tiles 1.1 format. Currently, we prefer to produce tiles in iMdl format, so this goes unused for now.
12
+ * @internal
13
+ */
14
+ class BatchedTileContentReader extends core_frontend_1.GltfReader {
15
+ constructor(args) {
16
+ super(args);
17
+ this._modelId = args.modelId;
18
+ this._isLeaf = args.isLeaf;
19
+ this._range = args.range;
20
+ }
21
+ async read() {
22
+ const featureTable = this.readFeatureTable();
23
+ await this.resolveResources();
24
+ if (this._isCanceled)
25
+ return { readStatus: core_common_1.TileReadStatus.Canceled, isLeaf: this._isLeaf };
26
+ return this.readGltfAndCreateGraphics(this._isLeaf, featureTable, this._range);
27
+ }
28
+ readFeatureTable() {
29
+ var _a, _b, _c, _d;
30
+ // ###TODO we're just assuming there's one property table with one u64 property containing element Ids.
31
+ 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;
32
+ const table = tables ? tables[0] : undefined;
33
+ const elementIdProperty = (table === null || table === void 0 ? void 0 : table.properties) ? table.properties.ElementId : undefined;
34
+ if (!elementIdProperty)
35
+ return undefined;
36
+ const bufferView = this._bufferViews[elementIdProperty.values];
37
+ if (!bufferView || undefined === bufferView.buffer)
38
+ return undefined;
39
+ const bufferData = (_c = this._buffers[bufferView.buffer]) === null || _c === void 0 ? void 0 : _c.resolvedBuffer;
40
+ if (!bufferData)
41
+ return undefined;
42
+ (0, core_bentley_1.assert)(undefined !== bufferView.byteLength); // required by spec; TypeScript interface is wrong.
43
+ const byteOffset = (_d = bufferView.byteOffset) !== null && _d !== void 0 ? _d : 0;
44
+ const bytes = bufferData.subarray(byteOffset, byteOffset + bufferView.byteLength);
45
+ // 2 u32s per element Id.
46
+ const elementIds = new Uint32Array(bytes.buffer, bytes.byteOffset, bytes.byteLength / 4);
47
+ const numFeatures = elementIds.length / 2;
48
+ const featureTable = new core_common_1.FeatureTable(numFeatures, this._modelId);
49
+ for (let i = 0; i < numFeatures; i++) {
50
+ const elementId = core_bentley_1.Id64.fromUint32Pair(elementIds[i * 2], elementIds[i * 2 + 1]);
51
+ featureTable.insertWithIndex(new core_common_1.Feature(elementId), i);
52
+ }
53
+ return featureTable;
54
+ }
55
+ readPrimitiveFeatures(primitive) {
56
+ var _a, _b;
57
+ const ext = (_a = primitive.extensions) === null || _a === void 0 ? void 0 : _a.EXT_mesh_features;
58
+ if (ext) {
59
+ // ###TODO making assumptions here.
60
+ const view = this.getBufferView(primitive.attributes, `_FEATURE_ID_${ext.featureIds[0].attribute}`);
61
+ // NB: 32-bit integers are not supported, but 8- and 16-bit integers will be converted to them.
62
+ // With more than 64k features in the tile we represent the Ids as floats instead.
63
+ const featureIds = (_b = view === null || view === void 0 ? void 0 : view.toBufferData(core_frontend_1.GltfDataType.Float)) !== null && _b !== void 0 ? _b : view === null || view === void 0 ? void 0 : view.toBufferData(core_frontend_1.GltfDataType.UInt32);
64
+ if (view && featureIds) {
65
+ const indices = [];
66
+ for (let i = 0; i < featureIds.count; i++) {
67
+ const featureId = featureIds.buffer[i * view.stride];
68
+ indices.push(featureId);
69
+ }
70
+ return indices;
71
+ }
72
+ }
73
+ return new core_common_1.Feature(this._modelId);
74
+ }
75
+ }
76
+ exports.BatchedTileContentReader = BatchedTileContentReader;
77
77
  //# 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,sDAA+D;AAE/D,oDAA2E;AAC3E,wDAE8B;AAQ9B;;GAEG;AACH,MAAa,wBAAyB,SAAQ,0BAAU;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,4BAAc,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,IAAA,qBAAM,EAAC,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,0BAAY,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,mBAAI,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,qBAAO,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,4BAAY,CAAC,KAAK,CAAC,mCAAI,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,YAAY,CAAC,4BAAY,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,qBAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACpC,CAAC;CACF;AA1ED,4DA0EC","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"]}