@itwin/frontend-tiles 4.2.0-dev.9 → 4.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,6 +1,58 @@
1
1
  # Change Log - @itwin/frontend-tiles
2
2
 
3
- This log was last generated on Thu, 17 Aug 2023 07:50:06 GMT and should not be manually modified.
3
+ This log was last generated on Tue, 24 Oct 2023 15:09:13 GMT and should not be manually modified.
4
+
5
+ ## 4.2.1
6
+ Tue, 24 Oct 2023 15:09:13 GMT
7
+
8
+ _Version update only_
9
+
10
+ ## 4.2.0
11
+ Tue, 17 Oct 2023 15:14:32 GMT
12
+
13
+ ### Updates
14
+
15
+ - Permit visible edges and wireframe mode to be used with batched tiles.
16
+
17
+ ## 4.1.9
18
+ Tue, 10 Oct 2023 18:48:12 GMT
19
+
20
+ _Version update only_
21
+
22
+ ## 4.1.8
23
+ Fri, 06 Oct 2023 04:00:18 GMT
24
+
25
+ _Version update only_
26
+
27
+ ## 4.1.7
28
+ Thu, 28 Sep 2023 21:41:33 GMT
29
+
30
+ _Version update only_
31
+
32
+ ## 4.1.6
33
+ Tue, 12 Sep 2023 15:38:52 GMT
34
+
35
+ _Version update only_
36
+
37
+ ## 4.1.5
38
+ Fri, 08 Sep 2023 13:37:23 GMT
39
+
40
+ _Version update only_
41
+
42
+ ## 4.1.4
43
+ Thu, 07 Sep 2023 18:26:02 GMT
44
+
45
+ _Version update only_
46
+
47
+ ## 4.1.3
48
+ Wed, 30 Aug 2023 15:35:27 GMT
49
+
50
+ _Version update only_
51
+
52
+ ## 4.1.2
53
+ Wed, 23 Aug 2023 15:25:29 GMT
54
+
55
+ _Version update only_
4
56
 
5
57
  ## 4.1.1
6
58
  Fri, 18 Aug 2023 13:02:53 GMT
@@ -64,6 +116,21 @@ Mon, 22 May 2023 15:34:14 GMT
64
116
  - Ensure fitting the view fits to the extents of the currently-viewed models.
65
117
  - Add new experimental package providing alternate technique for visualizing iModels.
66
118
 
119
+ ## 3.7.16
120
+ Mon, 16 Oct 2023 12:49:08 GMT
121
+
122
+ _Version update only_
123
+
124
+ ## 3.7.15
125
+ Tue, 10 Oct 2023 19:58:35 GMT
126
+
127
+ _Version update only_
128
+
129
+ ## 3.7.14
130
+ Fri, 29 Sep 2023 16:57:16 GMT
131
+
132
+ _Version update only_
133
+
67
134
  ## 3.7.13
68
135
  Tue, 08 Aug 2023 19:49:18 GMT
69
136
 
@@ -19,7 +19,7 @@ class BatchedTile extends core_frontend_1.Tile {
19
19
  constructor(params, tree) {
20
20
  super(params, tree);
21
21
  // The root tile never has content, so it doesn't count toward max levels to skip.
22
- this._unskippable = 0 === (this.depth % (0, FrontendTiles_1.getMaxLevelsToSkip)());
22
+ this._unskippable = 0 === (this.depth % FrontendTiles_1.frontendTilesOptions.maxLevelsToSkip);
23
23
  if (params.childrenProps?.length)
24
24
  this._childrenProps = params.childrenProps;
25
25
  if (!this.contentId) {
@@ -1 +1 @@
1
- {"version":3,"file":"BatchedTile.js","sourceRoot":"","sources":["../../src/BatchedTile.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;;;AAE/F,sDAA8E;AAC9E,oDAA+D;AAC/D,wDAG8B;AAC9B,qDAAkD;AAElD,mDAAqD;AAOrD,IAAI,OAAuC,CAAC;AAE5C,gBAAgB;AAChB,MAAa,WAAY,SAAQ,oBAAI;IAInC,IAAW,WAAW;QACpB,OAAO,IAAI,CAAC,IAAuB,CAAC;IACtC,CAAC;IAED,YAAmB,MAAyB,EAAE,IAAqB;QACjE,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QAEpB,kFAAkF;QAClF,IAAI,CAAC,YAAY,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,GAAG,IAAA,kCAAkB,GAAE,CAAC,CAAC;QAE9D,IAAI,MAAM,CAAC,aAAa,EAAE,MAAM;YAC9B,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,aAAa,CAAC;QAE7C,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE;YACnB,IAAI,CAAC,UAAU,EAAE,CAAC;YAClB,uBAAuB;YACvB,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;SACvB;IACH,CAAC;IAED,IAAY,gBAAgB;QAC1B,OAAO,IAAI,CAAC,QAAqC,CAAC;IACpD,CAAC;IAEe,mBAAmB,CAAC,SAA6B,EAAE,MAA0B;QAC3F,2FAA2F;QAC3F,OAAO,iCAAiB,CAAC,2BAA2B,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IACnG,CAAC;IAEM,WAAW,CAAC,QAA0B,EAAE,IAAkB,EAAE,0BAAmD;QACpH,MAAM,GAAG,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,8BAAc,CAAC,cAAc,KAAK,GAAG;YACvC,OAAO;QAET,IAAI,IAAI,CAAC,YAAY,EAAE;YACrB,0EAA0E;YAC1E,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC5B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;SACrB;QAED,0BAA0B,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,0BAA0B,CAAC;QAClF,IAAI,8BAAc,CAAC,SAAS,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE;YAC5E,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YACpB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YACrB,MAAM,kBAAkB,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;YAC/C,IAAI,kCAAkB,CAAC,OAAO,KAAK,kBAAkB;gBACnD,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAE7B,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC;YACvC,IAAI,QAAQ,EAAE;gBACZ,KAAK,MAAM,KAAK,IAAI,QAAQ;oBAC1B,KAAK,CAAC,WAAW,CAAC,QAAQ,EAAE,IAAI,EAAE,0BAA0B,CAAC,CAAC;gBAEhE,OAAO;aACR;SACF;QAED,2EAA2E;QAC3E,IAAI,CAAC,8BAAc,CAAC,OAAO,KAAK,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO;YACxE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QAE3B,IAAI,0BAA0B;YAC5B,QAAQ,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;IAC7C,CAAC;IAEkB,aAAa,CAAC,OAA+C,EAAE,MAA8B;QAC9G,IAAI,QAAmC,CAAC;QACxC,IAAI,IAAI,CAAC,cAAc,EAAE;YACvB,IAAI;gBACF,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,cAAc,EAAE;oBAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,cAAc,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;oBACxE,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;oBACxD,QAAQ,GAAG,QAAQ,IAAI,EAAE,CAAC;oBAC1B,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;iBACtB;aACF;YAAC,OAAO,GAAG,EAAE;gBACZ,qBAAM,CAAC,YAAY,CAAC,+BAAc,EAAE,GAAG,CAAC,CAAC;gBACzC,QAAQ,GAAG,SAAS,CAAC;gBACrB,IAAI,GAAG,YAAY,KAAK;oBACtB,MAAM,CAAC,GAAG,CAAC,CAAC;aACf;SACF;QAED,OAAO,CAAC,QAAQ,CAAC,CAAC;IACpB,CAAC;IAED,IAAoB,OAAO;QACzB,IAAI,CAAC,OAAO,EAAE;YACZ,OAAO,GAAG,IAAI,kCAAkB,CAAC,wBAAwB,EAAE,EAAE,CAAC,CAAC;YAC/D,yBAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;SAC3C;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAEe,KAAK,CAAC,cAAc,CAAC,WAA0B;QAC7D,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACrE,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;QACpD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC7C,OAAO,QAAQ,CAAC,WAAW,EAAE,CAAC;IAChC,CAAC;IAEe,KAAK,CAAC,WAAW,CAAC,IAA8B,EAAE,MAAoB,EAAE,UAA0B;QAChH,IAAA,qBAAM,EAAC,IAAI,YAAY,UAAU,CAAC,CAAC;QACnC,IAAI,CAAC,CAAC,IAAI,YAAY,UAAU,CAAC;YAC/B,OAAO,EAAG,CAAC;QAEb,IAAI;YACF,OAAO,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;gBAC3C,MAAM,EAAE,yBAAU,CAAC,cAAc,CAAC,IAAI,CAAC;gBACvC,OAAO,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE;gBACnC,MAAM;gBACN,UAAU;gBACV,MAAM,EAAE,IAAI,CAAC,MAAM;aACpB,CAAC,CAAC;SACJ;QAAC,MAAM;YACN,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;SACzB;IACH,CAAC;IAEkB,eAAe,CAAC,OAAuB,EAAE,IAAuB;QACjF,IAAI,iCAAiB,CAAC,YAAY,KAAK,IAAI,EAAE;YAC3C,KAAK,CAAC,eAAe,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YACrC,OAAO;SACR;QAED,OAAO,CAAC,YAAY,CAAC,sBAAQ,CAAC,KAAK,EAAE,sBAAQ,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;QACxD,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAEhC,IAAI,CAAC,YAAY,EAAE,CAAC;QACpB,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC/B,IAAI,CAAC,QAAQ;YACX,OAAO;QAET,OAAO,CAAC,YAAY,CAAC,sBAAQ,CAAC,IAAI,EAAE,sBAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7E,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE;YAC5B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;YAC1B,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;YAC3B,OAAO,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;SAClC;IACH,CAAC;IAEM,KAAK,CAAC,SAAsB;QACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC;QACvC,IAAI,CAAC,QAAQ;YACX,OAAO;QAET,IAAI,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE;YACzC,IAAI,CAAC,eAAe,EAAE,CAAC;SACxB;aAAM;YACL,KAAK,MAAM,KAAK,IAAI,QAAQ;gBAC1B,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;SAC1B;IACH,CAAC;CACF;AA9JD,kCA8JC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\nimport { assert, BeTimePoint, ByteStream, Logger } from \"@itwin/core-bentley\";\r\nimport { ColorDef, Tileset3dSchema } from \"@itwin/core-common\";\r\nimport {\r\n GraphicBuilder, IModelApp, RealityTileLoader, RenderSystem, Tile, TileBoundingBoxes, TileContent,\r\n TileDrawArgs, TileParams, TileRequest, TileRequestChannel, TileTreeLoadStatus, TileUser, TileVisibility, Viewport,\r\n} from \"@itwin/core-frontend\";\r\nimport { loggerCategory } from \"./LoggerCategory\";\r\nimport { BatchedTileTree } from \"./BatchedTileTree\";\r\nimport { 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, isCanceled?: () => boolean): Promise<TileContent> {\r\n assert(data instanceof Uint8Array);\r\n if (!(data instanceof Uint8Array))\r\n return { };\r\n\r\n try {\r\n return await this.batchedTree.decoder.decode({\r\n stream: ByteStream.fromUint8Array(data),\r\n options: { tileId: this.contentId },\r\n system,\r\n isCanceled,\r\n isLeaf: this.isLeaf,\r\n });\r\n } catch {\r\n return { isLeaf: true };\r\n }\r\n }\r\n\r\n protected override addRangeGraphic(builder: GraphicBuilder, type: TileBoundingBoxes): void {\r\n if (TileBoundingBoxes.ChildVolumes !== type) {\r\n super.addRangeGraphic(builder, type);\r\n return;\r\n }\r\n\r\n builder.setSymbology(ColorDef.green, ColorDef.green, 2);\r\n builder.addRangeBox(this.range);\r\n\r\n this.loadChildren();\r\n const children = this.children;\r\n if (!children)\r\n return;\r\n\r\n builder.setSymbology(ColorDef.blue, ColorDef.blue.withTransparency(0xdf), 1);\r\n for (const child of children) {\r\n const range = child.range;\r\n builder.addRangeBox(range);\r\n builder.addRangeBox(range, true);\r\n }\r\n }\r\n\r\n public prune(olderThan: BeTimePoint): void {\r\n const children = this._batchedChildren;\r\n if (!children)\r\n return;\r\n\r\n if (this.usageMarker.isExpired(olderThan)) {\r\n this.disposeChildren();\r\n } else {\r\n for (const child of children)\r\n child.prune(olderThan);\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"BatchedTile.js","sourceRoot":"","sources":["../../src/BatchedTile.ts"],"names":[],"mappings":"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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 GraphicBuilder, IModelApp, RealityTileLoader, RenderSystem, Tile, TileBoundingBoxes, TileContent,\r\n TileDrawArgs, TileParams, TileRequest, TileRequestChannel, TileTreeLoadStatus, TileUser, TileVisibility, Viewport,\r\n} from \"@itwin/core-frontend\";\r\nimport { loggerCategory } from \"./LoggerCategory\";\r\nimport { BatchedTileTree } from \"./BatchedTileTree\";\r\nimport { frontendTilesOptions } from \"./FrontendTiles\";\r\n\r\n/** @internal */\r\nexport interface BatchedTileParams extends TileParams {\r\n childrenProps: Tileset3dSchema.Tile[] | undefined;\r\n}\r\n\r\nlet channel: TileRequestChannel | undefined;\r\n\r\n/** @internal */\r\nexport class BatchedTile extends Tile {\r\n private readonly _childrenProps?: Tileset3dSchema.Tile[];\r\n private readonly _unskippable: boolean;\r\n\r\n public get batchedTree(): BatchedTileTree {\r\n return this.tree as BatchedTileTree;\r\n }\r\n\r\n public constructor(params: BatchedTileParams, tree: BatchedTileTree) {\r\n super(params, tree);\r\n\r\n // The root tile never has content, so it doesn't count toward max levels to skip.\r\n this._unskippable = 0 === (this.depth % frontendTilesOptions.maxLevelsToSkip);\r\n\r\n if (params.childrenProps?.length)\r\n this._childrenProps = params.childrenProps;\r\n\r\n if (!this.contentId) {\r\n this.setIsReady();\r\n // mark \"undisplayable\"\r\n this._maximumSize = 0;\r\n }\r\n }\r\n\r\n private get _batchedChildren(): BatchedTile[] | undefined {\r\n return this.children as BatchedTile[] | undefined;\r\n }\r\n\r\n public override computeLoadPriority(viewports: Iterable<Viewport>, _users: Iterable<TileUser>): number {\r\n // Prioritize tiles closer to camera and center of attention (zoom point or screen center).\r\n return RealityTileLoader.computeTileLocationPriority(this, viewports, this.tree.iModelTransform);\r\n }\r\n\r\n public selectTiles(selected: Set<BatchedTile>, args: TileDrawArgs, closestDisplayableAncestor: BatchedTile | undefined): void {\r\n const vis = this.computeVisibility(args);\r\n if (TileVisibility.OutsideFrustum === vis)\r\n return;\r\n\r\n if (this._unskippable) {\r\n // Prevent this tile's content from being unloaded due to memory pressure.\r\n args.touchedTiles.add(this);\r\n args.markUsed(this);\r\n }\r\n\r\n closestDisplayableAncestor = this.hasGraphics ? this : closestDisplayableAncestor;\r\n if (TileVisibility.TooCoarse === vis && (this.isReady || !this._unskippable)) {\r\n args.markUsed(this);\r\n args.markReady(this);\r\n const childrenLoadStatus = this.loadChildren();\r\n if (TileTreeLoadStatus.Loading === childrenLoadStatus)\r\n args.markChildrenLoading();\r\n\r\n const children = this._batchedChildren;\r\n if (children) {\r\n for (const child of children)\r\n child.selectTiles(selected, args, closestDisplayableAncestor);\r\n\r\n return;\r\n }\r\n }\r\n\r\n // We want to display this tile. Request its content if not already loaded.\r\n if ((TileVisibility.Visible === vis || this._unskippable) && !this.isReady)\r\n args.insertMissing(this);\r\n\r\n if (closestDisplayableAncestor)\r\n selected.add(closestDisplayableAncestor);\r\n }\r\n\r\n protected override _loadChildren(resolve: (children: Tile[] | undefined) => void, reject: (error: Error) => void): void {\r\n let children: BatchedTile[] | undefined;\r\n if (this._childrenProps) {\r\n try {\r\n for (const childProps of this._childrenProps) {\r\n const params = this.batchedTree.reader.readTileParams(childProps, this);\r\n const child = new BatchedTile(params, this.batchedTree);\r\n children = children ?? [];\r\n children.push(child);\r\n }\r\n } catch (err) {\r\n Logger.logException(loggerCategory, err);\r\n children = undefined;\r\n if (err instanceof Error)\r\n reject(err);\r\n }\r\n }\r\n\r\n resolve(children);\r\n }\r\n\r\n public override get channel(): TileRequestChannel {\r\n if (!channel) {\r\n channel = new TileRequestChannel(\"itwinjs-batched-models\", 20);\r\n IModelApp.tileAdmin.channels.add(channel);\r\n }\r\n\r\n return channel;\r\n }\r\n\r\n public override async requestContent(_isCanceled: () => boolean): Promise<TileRequest.Response> {\r\n const url = new URL(this.contentId, this.batchedTree.reader.baseUrl);\r\n url.search = this.batchedTree.reader.baseUrl.search;\r\n const response = await fetch(url.toString());\r\n return response.arrayBuffer();\r\n }\r\n\r\n public override async readContent(data: TileRequest.ResponseData, system: RenderSystem, isCanceled?: () => boolean): Promise<TileContent> {\r\n assert(data instanceof Uint8Array);\r\n if (!(data instanceof Uint8Array))\r\n return { };\r\n\r\n try {\r\n return await this.batchedTree.decoder.decode({\r\n stream: ByteStream.fromUint8Array(data),\r\n options: { tileId: this.contentId },\r\n system,\r\n isCanceled,\r\n isLeaf: this.isLeaf,\r\n });\r\n } catch {\r\n return { isLeaf: true };\r\n }\r\n }\r\n\r\n protected override addRangeGraphic(builder: GraphicBuilder, type: TileBoundingBoxes): void {\r\n if (TileBoundingBoxes.ChildVolumes !== type) {\r\n super.addRangeGraphic(builder, type);\r\n return;\r\n }\r\n\r\n builder.setSymbology(ColorDef.green, ColorDef.green, 2);\r\n builder.addRangeBox(this.range);\r\n\r\n this.loadChildren();\r\n const children = this.children;\r\n if (!children)\r\n return;\r\n\r\n builder.setSymbology(ColorDef.blue, ColorDef.blue.withTransparency(0xdf), 1);\r\n for (const child of children) {\r\n const range = child.range;\r\n builder.addRangeBox(range);\r\n builder.addRangeBox(range, true);\r\n }\r\n }\r\n\r\n public prune(olderThan: BeTimePoint): void {\r\n const children = this._batchedChildren;\r\n if (!children)\r\n return;\r\n\r\n if (this.usageMarker.isExpired(olderThan)) {\r\n this.disposeChildren();\r\n } else {\r\n for (const child of children)\r\n child.prune(olderThan);\r\n }\r\n }\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"BatchedTileTree.d.ts","sourceRoot":"","sources":["../../src/BatchedTileTree.ts"],"names":[],"mappings":"AAMA,OAAO,EAAyB,cAAc,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC9F,OAAO,EACe,WAAW,EAAa,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,cAAc,EACzF,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAC/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAE9D,gBAAgB;AAChB,MAAM,WAAW,qBAAsB,SAAQ,cAAc;IAC3D,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,MAAM,EAAE,oBAAoB,CAAC;IAC7B,MAAM,CAAC,EAAE,cAAc,CAAC,MAAM,CAAC;CAChC;AAOD,gBAAgB;AAChB,qBAAa,eAAgB,SAAQ,QAAQ;IAC3C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAc;IACxC,SAAgB,MAAM,EAAE,oBAAoB,CAAC;IAC7C,SAAgB,cAAc,CAAC,EAAE,cAAc,CAAC,MAAM,CAAC;IACvD,SAAgB,OAAO,EAAE,WAAW,CAAC;gBAElB,MAAM,EAAE,qBAAqB;IAiBhC,OAAO,IAAI,IAAI;IAK/B,IAAoB,QAAQ,IAAI,WAAW,CAE1C;IAED,IAAoB,IAAI,IAAI,OAAO,CAElC;IAED,IAAoB,QAAQ,IAAI,MAAM,GAAG,SAAS,CAEjD;IAED,IAAoB,iBAAiB,IAAI,iBAAiB,CAEzD;IAGe,YAAY,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,EAAE;IAMxC,IAAI,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI;IAQ9B,KAAK,IAAI,IAAI;CAI9B"}
1
+ {"version":3,"file":"BatchedTileTree.d.ts","sourceRoot":"","sources":["../../src/BatchedTileTree.ts"],"names":[],"mappings":"AAMA,OAAO,EAAyB,cAAc,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC9F,OAAO,EACe,WAAW,EAAa,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,cAAc,EACzF,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAC/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAQ9D,gBAAgB;AAChB,MAAM,WAAW,qBAAsB,SAAQ,cAAc;IAC3D,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,MAAM,EAAE,oBAAoB,CAAC;IAC7B,MAAM,CAAC,EAAE,cAAc,CAAC,MAAM,CAAC;CAChC;AAED,gBAAgB;AAChB,qBAAa,eAAgB,SAAQ,QAAQ;IAC3C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAc;IACxC,SAAgB,MAAM,EAAE,oBAAoB,CAAC;IAC7C,SAAgB,cAAc,CAAC,EAAE,cAAc,CAAC,MAAM,CAAC;IACvD,SAAgB,OAAO,EAAE,WAAW,CAAC;gBAElB,MAAM,EAAE,qBAAqB;IAiBhC,OAAO,IAAI,IAAI;IAK/B,IAAoB,QAAQ,IAAI,WAAW,CAE1C;IAED,IAAoB,IAAI,IAAI,OAAO,CAElC;IAED,IAAoB,QAAQ,IAAI,MAAM,GAAG,SAAS,CAEjD;IAED,IAAoB,iBAAiB,IAAI,iBAAiB,CAEzD;IAGe,YAAY,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,EAAE;IAMxC,IAAI,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI;IAQ9B,KAAK,IAAI,IAAI;CAI9B"}
@@ -9,7 +9,8 @@ const core_bentley_1 = require("@itwin/core-bentley");
9
9
  const core_common_1 = require("@itwin/core-common");
10
10
  const core_frontend_1 = require("@itwin/core-frontend");
11
11
  const BatchedTile_1 = require("./BatchedTile");
12
- const viewFlagOverrides = {
12
+ const FrontendTiles_1 = require("./FrontendTiles");
13
+ const defaultViewFlags = {
13
14
  renderMode: core_common_1.RenderMode.SmoothShade,
14
15
  visibleEdges: false,
15
16
  };
@@ -44,7 +45,7 @@ class BatchedTileTree extends core_frontend_1.TileTree {
44
45
  return undefined;
45
46
  }
46
47
  get viewFlagOverrides() {
47
- return viewFlagOverrides;
48
+ return FrontendTiles_1.frontendTilesOptions.enableEdges ? {} : defaultViewFlags;
48
49
  }
49
50
  // eslint-disable-next-line @typescript-eslint/naming-convention
50
51
  _selectTiles(args) {
@@ -1 +1 @@
1
- {"version":3,"file":"BatchedTileTree.js","sourceRoot":"","sources":["../../src/BatchedTileTree.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;;;AAE/F,sDAAkD;AAClD,oDAA8F;AAC9F,wDAE8B;AAC9B,+CAA+D;AAU/D,MAAM,iBAAiB,GAAsB;IAC3C,UAAU,EAAE,wBAAU,CAAC,WAAW;IAClC,YAAY,EAAE,KAAK;CACpB,CAAC;AAEF,gBAAgB;AAChB,MAAa,eAAgB,SAAQ,wBAAQ;IAM3C,YAAmB,MAA6B;QAC9C,KAAK,CAAC,MAAM,CAAC,CAAC;QACd,IAAI,CAAC,SAAS,GAAG,IAAI,yBAAW,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACxD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC5B,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC;QAEpC,IAAI,CAAC,OAAO,GAAG,IAAA,kCAAkB,EAAC;YAChC,IAAI,EAAE,uBAAS,CAAC,OAAO;YACvB,QAAQ,EAAE,IAAI,CAAC,cAAc;YAC7B,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,YAAY,EAAE,IAAI,CAAC,OAAO;YAC1B,IAAI,EAAE,IAAI;YACV,sBAAsB,EAAE,KAAK;YAC7B,QAAQ,EAAE,CAAC,yBAAS,CAAC,SAAS,CAAC,kBAAkB;SAClD,CAAC,CAAC;IACL,CAAC;IAEe,OAAO;QACrB,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QACvB,KAAK,CAAC,OAAO,EAAE,CAAC;IAClB,CAAC;IAED,IAAoB,QAAQ;QAC1B,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED,IAAoB,IAAI;QACtB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAoB,QAAQ;QAC1B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAoB,iBAAiB;QACnC,OAAO,iBAAiB,CAAC;IAC3B,CAAC;IAED,gEAAgE;IAChD,YAAY,CAAC,IAAkB;QAC7C,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAe,CAAC;QACxC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,QAAQ,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;QACrD,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC9B,CAAC;IAEe,IAAI,CAAC,IAAkB;QACrC,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACrC,KAAK,MAAM,IAAI,IAAI,KAAK;YACtB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QAE1B,IAAI,CAAC,YAAY,EAAE,CAAC;IACtB,CAAC;IAEe,KAAK;QACnB,MAAM,SAAS,GAAG,0BAAW,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC/D,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IACjC,CAAC;CACF;AA/DD,0CA+DC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\nimport { BeTimePoint } from \"@itwin/core-bentley\";\r\nimport { BatchType, RenderMode, RenderSchedule, ViewFlagOverrides } from \"@itwin/core-common\";\r\nimport {\r\n acquireImdlDecoder, ImdlDecoder, IModelApp, Tile, TileDrawArgs, TileTree, TileTreeParams,\r\n} from \"@itwin/core-frontend\";\r\nimport { BatchedTile, BatchedTileParams } from \"./BatchedTile\";\r\nimport { BatchedTilesetReader } from \"./BatchedTilesetReader\";\r\n\r\n/** @internal */\r\nexport interface BatchedTileTreeParams extends TileTreeParams {\r\n rootTile: BatchedTileParams;\r\n reader: BatchedTilesetReader;\r\n script?: RenderSchedule.Script;\r\n}\r\n\r\nconst viewFlagOverrides: ViewFlagOverrides = {\r\n renderMode: RenderMode.SmoothShade,\r\n visibleEdges: false,\r\n};\r\n\r\n/** @internal */\r\nexport class BatchedTileTree extends TileTree {\r\n private readonly _rootTile: BatchedTile;\r\n public readonly reader: BatchedTilesetReader;\r\n public readonly scheduleScript?: RenderSchedule.Script;\r\n public readonly decoder: ImdlDecoder;\r\n\r\n public constructor(params: BatchedTileTreeParams) {\r\n super(params);\r\n this._rootTile = new BatchedTile(params.rootTile, this);\r\n this.reader = params.reader;\r\n this.scheduleScript = params.script;\r\n\r\n this.decoder = acquireImdlDecoder({\r\n type: BatchType.Primary,\r\n timeline: this.scheduleScript,\r\n iModel: this.iModel,\r\n batchModelId: this.modelId,\r\n is3d: true,\r\n containsTransformNodes: false,\r\n noWorker: !IModelApp.tileAdmin.decodeImdlInWorker,\r\n });\r\n }\r\n\r\n public override dispose(): void {\r\n this.decoder.release();\r\n super.dispose();\r\n }\r\n\r\n public override get rootTile(): BatchedTile {\r\n return this._rootTile;\r\n }\r\n\r\n public override get is3d(): boolean {\r\n return true;\r\n }\r\n\r\n public override get maxDepth(): number | undefined {\r\n return undefined;\r\n }\r\n\r\n public override get viewFlagOverrides(): ViewFlagOverrides {\r\n return viewFlagOverrides;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public override _selectTiles(args: TileDrawArgs): Tile[] {\r\n const selected = new Set<BatchedTile>();\r\n this.rootTile.selectTiles(selected, args, undefined);\r\n return Array.from(selected);\r\n }\r\n\r\n public override draw(args: TileDrawArgs): void {\r\n const tiles = this.selectTiles(args);\r\n for (const tile of tiles)\r\n tile.drawGraphics(args);\r\n\r\n args.drawGraphics();\r\n }\r\n\r\n public override prune(): void {\r\n const olderThan = BeTimePoint.now().minus(this.expirationTime);\r\n this.rootTile.prune(olderThan);\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"BatchedTileTree.js","sourceRoot":"","sources":["../../src/BatchedTileTree.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;;;AAE/F,sDAAkD;AAClD,oDAA8F;AAC9F,wDAE8B;AAC9B,+CAA+D;AAE/D,mDAAuD;AAEvD,MAAM,gBAAgB,GAAsB;IAC1C,UAAU,EAAE,wBAAU,CAAC,WAAW;IAClC,YAAY,EAAE,KAAK;CACpB,CAAC;AASF,gBAAgB;AAChB,MAAa,eAAgB,SAAQ,wBAAQ;IAM3C,YAAmB,MAA6B;QAC9C,KAAK,CAAC,MAAM,CAAC,CAAC;QACd,IAAI,CAAC,SAAS,GAAG,IAAI,yBAAW,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACxD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC5B,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC;QAEpC,IAAI,CAAC,OAAO,GAAG,IAAA,kCAAkB,EAAC;YAChC,IAAI,EAAE,uBAAS,CAAC,OAAO;YACvB,QAAQ,EAAE,IAAI,CAAC,cAAc;YAC7B,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,YAAY,EAAE,IAAI,CAAC,OAAO;YAC1B,IAAI,EAAE,IAAI;YACV,sBAAsB,EAAE,KAAK;YAC7B,QAAQ,EAAE,CAAC,yBAAS,CAAC,SAAS,CAAC,kBAAkB;SAClD,CAAC,CAAC;IACL,CAAC;IAEe,OAAO;QACrB,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QACvB,KAAK,CAAC,OAAO,EAAE,CAAC;IAClB,CAAC;IAED,IAAoB,QAAQ;QAC1B,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED,IAAoB,IAAI;QACtB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAoB,QAAQ;QAC1B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAoB,iBAAiB;QACnC,OAAO,oCAAoB,CAAC,WAAW,CAAC,CAAC,CAAA,EAAG,CAAC,CAAC,CAAC,gBAAgB,CAAC;IAClE,CAAC;IAED,gEAAgE;IAChD,YAAY,CAAC,IAAkB;QAC7C,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAe,CAAC;QACxC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,QAAQ,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;QACrD,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC9B,CAAC;IAEe,IAAI,CAAC,IAAkB;QACrC,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACrC,KAAK,MAAM,IAAI,IAAI,KAAK;YACtB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QAE1B,IAAI,CAAC,YAAY,EAAE,CAAC;IACtB,CAAC;IAEe,KAAK;QACnB,MAAM,SAAS,GAAG,0BAAW,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC/D,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IACjC,CAAC;CACF;AA/DD,0CA+DC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\nimport { BeTimePoint } from \"@itwin/core-bentley\";\r\nimport { BatchType, RenderMode, RenderSchedule, ViewFlagOverrides } from \"@itwin/core-common\";\r\nimport {\r\n acquireImdlDecoder, ImdlDecoder, IModelApp, Tile, TileDrawArgs, TileTree, TileTreeParams,\r\n} from \"@itwin/core-frontend\";\r\nimport { BatchedTile, BatchedTileParams } from \"./BatchedTile\";\r\nimport { BatchedTilesetReader } from \"./BatchedTilesetReader\";\r\nimport { frontendTilesOptions } from \"./FrontendTiles\";\r\n\r\nconst defaultViewFlags: ViewFlagOverrides = {\r\n renderMode: RenderMode.SmoothShade,\r\n visibleEdges: false,\r\n};\r\n\r\n/** @internal */\r\nexport interface BatchedTileTreeParams extends TileTreeParams {\r\n rootTile: BatchedTileParams;\r\n reader: BatchedTilesetReader;\r\n script?: RenderSchedule.Script;\r\n}\r\n\r\n/** @internal */\r\nexport class BatchedTileTree extends TileTree {\r\n private readonly _rootTile: BatchedTile;\r\n public readonly reader: BatchedTilesetReader;\r\n public readonly scheduleScript?: RenderSchedule.Script;\r\n public readonly decoder: ImdlDecoder;\r\n\r\n public constructor(params: BatchedTileTreeParams) {\r\n super(params);\r\n this._rootTile = new BatchedTile(params.rootTile, this);\r\n this.reader = params.reader;\r\n this.scheduleScript = params.script;\r\n\r\n this.decoder = acquireImdlDecoder({\r\n type: BatchType.Primary,\r\n timeline: this.scheduleScript,\r\n iModel: this.iModel,\r\n batchModelId: this.modelId,\r\n is3d: true,\r\n containsTransformNodes: false,\r\n noWorker: !IModelApp.tileAdmin.decodeImdlInWorker,\r\n });\r\n }\r\n\r\n public override dispose(): void {\r\n this.decoder.release();\r\n super.dispose();\r\n }\r\n\r\n public override get rootTile(): BatchedTile {\r\n return this._rootTile;\r\n }\r\n\r\n public override get is3d(): boolean {\r\n return true;\r\n }\r\n\r\n public override get maxDepth(): number | undefined {\r\n return undefined;\r\n }\r\n\r\n public override get viewFlagOverrides(): ViewFlagOverrides {\r\n return frontendTilesOptions.enableEdges ?{ } : defaultViewFlags;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public override _selectTiles(args: TileDrawArgs): Tile[] {\r\n const selected = new Set<BatchedTile>();\r\n this.rootTile.selectTiles(selected, args, undefined);\r\n return Array.from(selected);\r\n }\r\n\r\n public override draw(args: TileDrawArgs): void {\r\n const tiles = this.selectTiles(args);\r\n for (const tile of tiles)\r\n tile.drawGraphics(args);\r\n\r\n args.drawGraphics();\r\n }\r\n\r\n public override prune(): void {\r\n const olderThan = BeTimePoint.now().minus(this.expirationTime);\r\n this.rootTile.prune(olderThan);\r\n }\r\n}\r\n"]}
@@ -99,11 +99,23 @@ export interface FrontendTilesOptions {
99
99
  * fill them. However, tiles close to the viewer (and therefore likely of most interest to them) will refine to an appropriate level of detail more quickly.
100
100
  */
101
101
  maxLevelsToSkip?: number;
102
+ /** Specifies whether to permit the user to enable visible edges or wireframe mode for batched tiles.
103
+ * The currently-deployed mesh export service does not produce edges, so this currently defaults to `false` to avoid user confusion.
104
+ * Set it to `true` if you are loading tiles created with a version of the exporter that does produce edges.
105
+ * ###TODO delete this option once we deploy an edge-producing version of the exporter to production.
106
+ * @internal
107
+ */
108
+ enableEdges?: boolean;
102
109
  }
103
110
  /** @internal */
104
111
  export declare const createFallbackSpatialTileTreeReferences: typeof SpatialTileTreeReferences.create;
105
- /** @internal */
106
- export declare function getMaxLevelsToSkip(): number;
112
+ /** Global configuration initialized by [[initializeFrontendTiles]].
113
+ * @internal
114
+ */
115
+ export declare const frontendTilesOptions: {
116
+ maxLevelsToSkip: number;
117
+ enableEdges: boolean;
118
+ };
107
119
  /** Initialize the frontend-tiles package to obtain tiles for spatial views.
108
120
  * @beta
109
121
  */
@@ -1 +1 @@
1
- {"version":3,"file":"FrontendTiles.d.ts","sourceRoot":"","sources":["../../src/FrontendTiles.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,WAAW,EAAU,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAa,gBAAgB,EAAE,yBAAyB,EAAoB,MAAM,sBAAsB,CAAC;AAIhH;;;;;GAKG;AACH,MAAM,MAAM,4BAA4B,GAAG,CAAC,MAAM,EAAE,gBAAgB,KAAK,OAAO,CAAC,GAAG,GAAG,SAAS,CAAC,CAAC;AAWlG;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE;QACP,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,MAAM,CAAC;QACnB,eAAe,EAAE,GAAG,CAAC;QACrB,oBAAoB,EAAE,GAAG,CAAC;KAC3B,CAAC;IAGF,MAAM,EAAE;QACN,IAAI,EAAE;YACJ,IAAI,EAAE,MAAM,CAAC;SACd,CAAC;KACH,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,UAAU,EAAE,CAAC;IAGtB,MAAM,EAAE;QACN,IAAI,CAAC,EAAE;YACL,IAAI,EAAE,MAAM,CAAC;SACd,CAAC;KACH,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,wDAAwD;IACxD,WAAW,EAAE,WAAW,CAAC;IACzB,uDAAuD;IACvD,QAAQ,EAAE,MAAM,CAAC;IACjB,yFAAyF;IACzF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4CAA4C;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qIAAqI;IACrI,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED;;;;GAIG;AACH,wBAAwB,gBAAgB,CAAC,IAAI,EAAE,oBAAoB,GAAG,qBAAqB,CAAC,UAAU,CAAC,CA4BtG;AAED;;GAEG;AACH,MAAM,WAAW,8BAA8B;IAC7C,oDAAoD;IACpD,MAAM,EAAE,gBAAgB,CAAC;IACzB,wDAAwD;IACxD,WAAW,EAAE,WAAW,CAAC;IACzB,4CAA4C;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;OAEG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACjC;AAED;;;;;GAKG;AACH,wBAAsB,0BAA0B,CAAC,IAAI,EAAE,8BAA8B,GAAG,OAAO,CAAC,GAAG,GAAG,SAAS,CAAC,CAoC/G;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC;;OAEG;IACH,4BAA4B,CAAC,EAAE,4BAA4B,CAAC;IAC5D;;;;;;;OAOG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,gBAAgB;AAChB,eAAO,MAAM,uCAAuC,yCAAmC,CAAC;AAIxF,gBAAgB;AAChB,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,oBAAoB,GAAG,IAAI,CAS3E"}
1
+ {"version":3,"file":"FrontendTiles.d.ts","sourceRoot":"","sources":["../../src/FrontendTiles.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,WAAW,EAAU,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAa,gBAAgB,EAAE,yBAAyB,EAAoB,MAAM,sBAAsB,CAAC;AAIhH;;;;;GAKG;AACH,MAAM,MAAM,4BAA4B,GAAG,CAAC,MAAM,EAAE,gBAAgB,KAAK,OAAO,CAAC,GAAG,GAAG,SAAS,CAAC,CAAC;AAWlG;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE;QACP,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,MAAM,CAAC;QACnB,eAAe,EAAE,GAAG,CAAC;QACrB,oBAAoB,EAAE,GAAG,CAAC;KAC3B,CAAC;IAGF,MAAM,EAAE;QACN,IAAI,EAAE;YACJ,IAAI,EAAE,MAAM,CAAC;SACd,CAAC;KACH,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,UAAU,EAAE,CAAC;IAGtB,MAAM,EAAE;QACN,IAAI,CAAC,EAAE;YACL,IAAI,EAAE,MAAM,CAAC;SACd,CAAC;KACH,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,wDAAwD;IACxD,WAAW,EAAE,WAAW,CAAC;IACzB,uDAAuD;IACvD,QAAQ,EAAE,MAAM,CAAC;IACjB,yFAAyF;IACzF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4CAA4C;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qIAAqI;IACrI,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED;;;;GAIG;AACH,wBAAwB,gBAAgB,CAAC,IAAI,EAAE,oBAAoB,GAAG,qBAAqB,CAAC,UAAU,CAAC,CA4BtG;AAED;;GAEG;AACH,MAAM,WAAW,8BAA8B;IAC7C,oDAAoD;IACpD,MAAM,EAAE,gBAAgB,CAAC;IACzB,wDAAwD;IACxD,WAAW,EAAE,WAAW,CAAC;IACzB,4CAA4C;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;OAEG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACjC;AAED;;;;;GAKG;AACH,wBAAsB,0BAA0B,CAAC,IAAI,EAAE,8BAA8B,GAAG,OAAO,CAAC,GAAG,GAAG,SAAS,CAAC,CAoC/G;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC;;OAEG;IACH,4BAA4B,CAAC,EAAE,4BAA4B,CAAC;IAC5D;;;;;;;OAOG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;;;OAKG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,gBAAgB;AAChB,eAAO,MAAM,uCAAuC,yCAAmC,CAAC;AAExF;;GAEG;AACH,eAAO,MAAM,oBAAoB;;;CAGhC,CAAC;AAEF;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,oBAAoB,GAAG,IAAI,CAY3E"}
@@ -4,7 +4,7 @@
4
4
  * See LICENSE.md in the project root for license terms and full copyright notice.
5
5
  *--------------------------------------------------------------------------------------------*/
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
- exports.initializeFrontendTiles = exports.getMaxLevelsToSkip = exports.createFallbackSpatialTileTreeReferences = exports.obtainMeshExportTilesetUrl = exports.queryMeshExports = void 0;
7
+ exports.initializeFrontendTiles = exports.frontendTilesOptions = exports.createFallbackSpatialTileTreeReferences = exports.obtainMeshExportTilesetUrl = exports.queryMeshExports = void 0;
8
8
  const core_bentley_1 = require("@itwin/core-bentley");
9
9
  const core_frontend_1 = require("@itwin/core-frontend");
10
10
  const LoggerCategory_1 = require("./LoggerCategory");
@@ -90,18 +90,21 @@ async function obtainMeshExportTilesetUrl(args) {
90
90
  exports.obtainMeshExportTilesetUrl = obtainMeshExportTilesetUrl;
91
91
  /** @internal */
92
92
  exports.createFallbackSpatialTileTreeReferences = core_frontend_1.SpatialTileTreeReferences.create;
93
- let maxLevelsToSkip = 4;
94
- /** @internal */
95
- function getMaxLevelsToSkip() {
96
- return maxLevelsToSkip;
97
- }
98
- exports.getMaxLevelsToSkip = getMaxLevelsToSkip;
93
+ /** Global configuration initialized by [[initializeFrontendTiles]].
94
+ * @internal
95
+ */
96
+ exports.frontendTilesOptions = {
97
+ maxLevelsToSkip: 4,
98
+ enableEdges: false,
99
+ };
99
100
  /** Initialize the frontend-tiles package to obtain tiles for spatial views.
100
101
  * @beta
101
102
  */
102
103
  function initializeFrontendTiles(options) {
103
104
  if (undefined !== options.maxLevelsToSkip && options.maxLevelsToSkip >= 0)
104
- maxLevelsToSkip = options.maxLevelsToSkip;
105
+ exports.frontendTilesOptions.maxLevelsToSkip = options.maxLevelsToSkip;
106
+ if (options.enableEdges)
107
+ exports.frontendTilesOptions.enableEdges = true;
105
108
  const computeUrl = options.computeSpatialTilesetBaseUrl ?? (async (iModel) => obtainMeshExportTilesetUrl({ iModel, accessToken: await core_frontend_1.IModelApp.getAccessToken() }));
106
109
  core_frontend_1.SpatialTileTreeReferences.create = (view) => (0, BatchedSpatialTileTreeRefs_1.createBatchedSpatialTileTreeReferences)(view, computeUrl);
107
110
  }
@@ -1 +1 @@
1
- {"version":3,"file":"FrontendTiles.js","sourceRoot":"","sources":["../../src/FrontendTiles.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 { AccessToken, Logger } from \"@itwin/core-bentley\";\r\nimport { IModelApp, IModelConnection, SpatialTileTreeReferences, SpatialViewState } from \"@itwin/core-frontend\";\r\nimport { loggerCategory } from \"./LoggerCategory\";\r\nimport { createBatchedSpatialTileTreeReferences } from \"./BatchedSpatialTileTreeRefs\";\r\n\r\n/** A function that can provide the base URL where a tileset representing all of the spatial models in a given iModel are stored.\r\n * The tileset is expected to reside at \"baseUrl/tileset.json\" and to have been produced by the [mesh export service](https://developer.bentley.com/apis/mesh-export/).\r\n * If no such tileset exists for the given iModel, return `undefined`.\r\n * @see [[FrontendTilesOptions.computeSpatialTilesetBaseUrl]].\r\n * @beta\r\n */\r\nexport type ComputeSpatialTilesetBaseUrl = (iModel: IModelConnection) => Promise<URL | undefined>;\r\n\r\nfunction createMeshExportServiceQueryUrl(args: { iModelId: string, urlPrefix?: string, changesetId?: string }): string {\r\n const prefix = args.urlPrefix ?? \"\";\r\n let url = `https://${prefix}api.bentley.com/mesh-export/?iModelId=${args.iModelId}&$orderBy=date:desc`;\r\n if (args.changesetId)\r\n url = `${url}&changesetId=${args.changesetId}`;\r\n\r\n return url;\r\n}\r\n\r\n/** Represents the result of a [mesh export](https://developer.bentley.com/apis/mesh-export/operations/get-export/#export).\r\n * @see [[queryCompletedMeshExports]].\r\n * @beta\r\n */\r\nexport interface MeshExport {\r\n id: string;\r\n displayName: string;\r\n status: string;\r\n request: {\r\n iModelId: string;\r\n changesetId: string;\r\n exportType: string;\r\n geometryOptions: any;\r\n viewDefinitionFilter: any;\r\n };\r\n\r\n /* eslint-disable-next-line @typescript-eslint/naming-convention */\r\n _links: {\r\n mesh: {\r\n href: string;\r\n };\r\n };\r\n}\r\n\r\n/** Exposed strictly for tests.\r\n * @internal\r\n */\r\nexport interface MeshExports {\r\n exports: MeshExport[];\r\n\r\n /* eslint-disable-next-line @typescript-eslint/naming-convention */\r\n _links: {\r\n next?: {\r\n href: string;\r\n };\r\n };\r\n}\r\n\r\n/** Arguments supplied to [[queryMeshExports]].\r\n * @beta\r\n */\r\nexport interface QueryMeshExportsArgs {\r\n /** The token used to access the mesh export service. */\r\n accessToken: AccessToken;\r\n /** The Id of the iModel for which to query exports. */\r\n iModelId: string;\r\n /** If defined, constrains the query to exports produced from the specified changeset. */\r\n changesetId?: string;\r\n /** Chiefly used in testing environments. */\r\n urlPrefix?: string;\r\n /** If true, exports whose status is not \"Complete\" (indicating the export successfully finished) will be included in the results. */\r\n includeIncomplete?: boolean;\r\n}\r\n\r\n/** Query the [mesh export service](https://developer.bentley.com/apis/mesh-export/operations/get-exports/) for exports of type \"IMODEL\" matching\r\n * the specified criteria.\r\n * The exports are sorted from most-recently- to least-recently-produced.\r\n * @beta\r\n */\r\nexport async function * queryMeshExports(args: QueryMeshExportsArgs): AsyncIterableIterator<MeshExport> {\r\n const headers = {\r\n /* eslint-disable-next-line @typescript-eslint/naming-convention */\r\n Authorization: args.accessToken ?? await IModelApp.getAccessToken(),\r\n /* eslint-disable-next-line @typescript-eslint/naming-convention */\r\n Accept: \"application/vnd.bentley.itwin-platform.v1+json\",\r\n /* eslint-disable-next-line @typescript-eslint/naming-convention */\r\n Prefer: \"return=representation\",\r\n };\r\n\r\n let url: string | undefined = createMeshExportServiceQueryUrl(args);\r\n while (url) {\r\n let result;\r\n try {\r\n const response = await fetch(url, { headers });\r\n result = await response.json() as MeshExports;\r\n } catch (err) {\r\n Logger.logException(loggerCategory, err);\r\n Logger.logError(loggerCategory, `Failed loading exports for iModel ${args.iModelId}`);\r\n break;\r\n }\r\n\r\n const foundExports = result.exports.filter((x) => x.request.exportType === \"IMODEL\" && (args.includeIncomplete || x.status === \"Complete\"));\r\n for (const foundExport of foundExports)\r\n yield foundExport;\r\n\r\n url = result._links.next?.href;\r\n }\r\n}\r\n\r\n/** Arguments supplied to [[obtainMeshExportTilesetUrl]].\r\n * @beta\r\n */\r\nexport interface ObtainMeshExportTilesetUrlArgs {\r\n /** The iModel for which to obtain a tileset URl. */\r\n iModel: IModelConnection;\r\n /** The token used to access the mesh export service. */\r\n accessToken: AccessToken;\r\n /** Chiefly used in testing environments. */\r\n urlPrefix?: string;\r\n /** If true, only exports produced for `iModel`'s specific changeset will be considered; otherwise, if no exports are found for the changeset,\r\n * the most recent export for any changeset will be used.\r\n */\r\n requireExactChangeset?: boolean;\r\n}\r\n\r\n/** Obtains a URL pointing to a tileset appropriate for visualizing a specific iModel.\r\n * [[queryCompletedMeshExports]] is used to obtain a list of available exports. By default, the list is sorted from most to least recently-exported.\r\n * The first export matching the iModel's changeset is selected; or, if no such export exists, the first export in the list is selected.\r\n * @returns A URL from which the tileset can be loaded, or `undefined` if no appropriate URL could be obtained.\r\n * @beta\r\n */\r\nexport async function obtainMeshExportTilesetUrl(args: ObtainMeshExportTilesetUrlArgs): Promise<URL | undefined> {\r\n if (!args.iModel.iModelId) {\r\n Logger.logInfo(loggerCategory, \"Cannot obtain exports for an iModel with no iModelId\");\r\n return undefined;\r\n }\r\n\r\n const queryArgs: QueryMeshExportsArgs = {\r\n accessToken: args.accessToken,\r\n iModelId: args.iModel.iModelId,\r\n changesetId: args.iModel.changeset.id,\r\n urlPrefix: args.urlPrefix,\r\n };\r\n\r\n let selectedExport;\r\n for await (const exp of queryMeshExports(queryArgs)) {\r\n selectedExport = exp;\r\n break;\r\n }\r\n\r\n if (!selectedExport && !args.requireExactChangeset) {\r\n queryArgs.changesetId = undefined;\r\n for await (const exp of queryMeshExports(queryArgs)) {\r\n selectedExport = exp;\r\n Logger.logInfo(loggerCategory, `No exports for iModel ${args.iModel.iModelId} for changeset ${args.iModel.changeset.id}; falling back to most recent`);\r\n break;\r\n }\r\n }\r\n\r\n if (!selectedExport) {\r\n Logger.logInfo(loggerCategory, `No exports available for iModel ${args.iModel.iModelId}`);\r\n return undefined;\r\n }\r\n\r\n const url = new URL(selectedExport._links.mesh.href);\r\n url.pathname = `${url.pathname}/tileset.json`;\r\n return url;\r\n}\r\n\r\n/** Options supplied to [[initializeFrontendTiles]].\r\n * @beta\r\n */\r\nexport interface FrontendTilesOptions {\r\n /** Provide the base URL for the pre-published tileset for a given iModel.\r\n * If omitted, [[obtainMeshExportTilesetUrl]] will be invoked with default arguments, using the access token provided by [[IModelApp]].\r\n */\r\n computeSpatialTilesetBaseUrl?: ComputeSpatialTilesetBaseUrl;\r\n /** The maximum number of levels in the tile tree to skip loading if they do not provide the desired level of detail for the current view.\r\n * Default: 4.\r\n * Reducing this value will load more intermediate tiles, which causes more gradual refinement: low-resolution tiles will display quickly, followed more gradually by\r\n * successively higher-resolution ones.\r\n * Increasing the value jumps more directly to tiles of the exact level of detail desired, which may load more, smaller tiles up-front, leaving some areas of the view\r\n * vacant for longer; and when zooming out some newly-exposed areas of the view may remain vacant for longer because no lower-resolution tiles are initially available to\r\n * fill them. However, tiles close to the viewer (and therefore likely of most interest to them) will refine to an appropriate level of detail more quickly.\r\n */\r\n maxLevelsToSkip?: number;\r\n}\r\n\r\n/** @internal */\r\nexport const createFallbackSpatialTileTreeReferences = SpatialTileTreeReferences.create;\r\n\r\nlet maxLevelsToSkip = 4;\r\n\r\n/** @internal */\r\nexport function getMaxLevelsToSkip(): number {\r\n return maxLevelsToSkip;\r\n}\r\n\r\n/** Initialize the frontend-tiles package to obtain tiles for spatial views.\r\n * @beta\r\n */\r\nexport function initializeFrontendTiles(options: FrontendTilesOptions): void {\r\n if (undefined !== options.maxLevelsToSkip && options.maxLevelsToSkip >= 0)\r\n maxLevelsToSkip = options.maxLevelsToSkip;\r\n\r\n const computeUrl = options.computeSpatialTilesetBaseUrl ?? (\r\n async (iModel: IModelConnection) => obtainMeshExportTilesetUrl({ iModel, accessToken: await IModelApp.getAccessToken() })\r\n );\r\n\r\n SpatialTileTreeReferences.create = (view: SpatialViewState) => createBatchedSpatialTileTreeReferences(view, computeUrl);\r\n}\r\n"]}
1
+ {"version":3,"file":"FrontendTiles.js","sourceRoot":"","sources":["../../src/FrontendTiles.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 { AccessToken, Logger } from \"@itwin/core-bentley\";\r\nimport { IModelApp, IModelConnection, SpatialTileTreeReferences, SpatialViewState } from \"@itwin/core-frontend\";\r\nimport { loggerCategory } from \"./LoggerCategory\";\r\nimport { createBatchedSpatialTileTreeReferences } from \"./BatchedSpatialTileTreeRefs\";\r\n\r\n/** A function that can provide the base URL where a tileset representing all of the spatial models in a given iModel are stored.\r\n * The tileset is expected to reside at \"baseUrl/tileset.json\" and to have been produced by the [mesh export service](https://developer.bentley.com/apis/mesh-export/).\r\n * If no such tileset exists for the given iModel, return `undefined`.\r\n * @see [[FrontendTilesOptions.computeSpatialTilesetBaseUrl]].\r\n * @beta\r\n */\r\nexport type ComputeSpatialTilesetBaseUrl = (iModel: IModelConnection) => Promise<URL | undefined>;\r\n\r\nfunction createMeshExportServiceQueryUrl(args: { iModelId: string, urlPrefix?: string, changesetId?: string }): string {\r\n const prefix = args.urlPrefix ?? \"\";\r\n let url = `https://${prefix}api.bentley.com/mesh-export/?iModelId=${args.iModelId}&$orderBy=date:desc`;\r\n if (args.changesetId)\r\n url = `${url}&changesetId=${args.changesetId}`;\r\n\r\n return url;\r\n}\r\n\r\n/** Represents the result of a [mesh export](https://developer.bentley.com/apis/mesh-export/operations/get-export/#export).\r\n * @see [[queryCompletedMeshExports]].\r\n * @beta\r\n */\r\nexport interface MeshExport {\r\n id: string;\r\n displayName: string;\r\n status: string;\r\n request: {\r\n iModelId: string;\r\n changesetId: string;\r\n exportType: string;\r\n geometryOptions: any;\r\n viewDefinitionFilter: any;\r\n };\r\n\r\n /* eslint-disable-next-line @typescript-eslint/naming-convention */\r\n _links: {\r\n mesh: {\r\n href: string;\r\n };\r\n };\r\n}\r\n\r\n/** Exposed strictly for tests.\r\n * @internal\r\n */\r\nexport interface MeshExports {\r\n exports: MeshExport[];\r\n\r\n /* eslint-disable-next-line @typescript-eslint/naming-convention */\r\n _links: {\r\n next?: {\r\n href: string;\r\n };\r\n };\r\n}\r\n\r\n/** Arguments supplied to [[queryMeshExports]].\r\n * @beta\r\n */\r\nexport interface QueryMeshExportsArgs {\r\n /** The token used to access the mesh export service. */\r\n accessToken: AccessToken;\r\n /** The Id of the iModel for which to query exports. */\r\n iModelId: string;\r\n /** If defined, constrains the query to exports produced from the specified changeset. */\r\n changesetId?: string;\r\n /** Chiefly used in testing environments. */\r\n urlPrefix?: string;\r\n /** If true, exports whose status is not \"Complete\" (indicating the export successfully finished) will be included in the results. */\r\n includeIncomplete?: boolean;\r\n}\r\n\r\n/** Query the [mesh export service](https://developer.bentley.com/apis/mesh-export/operations/get-exports/) for exports of type \"IMODEL\" matching\r\n * the specified criteria.\r\n * The exports are sorted from most-recently- to least-recently-produced.\r\n * @beta\r\n */\r\nexport async function * queryMeshExports(args: QueryMeshExportsArgs): AsyncIterableIterator<MeshExport> {\r\n const headers = {\r\n /* eslint-disable-next-line @typescript-eslint/naming-convention */\r\n Authorization: args.accessToken ?? await IModelApp.getAccessToken(),\r\n /* eslint-disable-next-line @typescript-eslint/naming-convention */\r\n Accept: \"application/vnd.bentley.itwin-platform.v1+json\",\r\n /* eslint-disable-next-line @typescript-eslint/naming-convention */\r\n Prefer: \"return=representation\",\r\n };\r\n\r\n let url: string | undefined = createMeshExportServiceQueryUrl(args);\r\n while (url) {\r\n let result;\r\n try {\r\n const response = await fetch(url, { headers });\r\n result = await response.json() as MeshExports;\r\n } catch (err) {\r\n Logger.logException(loggerCategory, err);\r\n Logger.logError(loggerCategory, `Failed loading exports for iModel ${args.iModelId}`);\r\n break;\r\n }\r\n\r\n const foundExports = result.exports.filter((x) => x.request.exportType === \"IMODEL\" && (args.includeIncomplete || x.status === \"Complete\"));\r\n for (const foundExport of foundExports)\r\n yield foundExport;\r\n\r\n url = result._links.next?.href;\r\n }\r\n}\r\n\r\n/** Arguments supplied to [[obtainMeshExportTilesetUrl]].\r\n * @beta\r\n */\r\nexport interface ObtainMeshExportTilesetUrlArgs {\r\n /** The iModel for which to obtain a tileset URl. */\r\n iModel: IModelConnection;\r\n /** The token used to access the mesh export service. */\r\n accessToken: AccessToken;\r\n /** Chiefly used in testing environments. */\r\n urlPrefix?: string;\r\n /** If true, only exports produced for `iModel`'s specific changeset will be considered; otherwise, if no exports are found for the changeset,\r\n * the most recent export for any changeset will be used.\r\n */\r\n requireExactChangeset?: boolean;\r\n}\r\n\r\n/** Obtains a URL pointing to a tileset appropriate for visualizing a specific iModel.\r\n * [[queryCompletedMeshExports]] is used to obtain a list of available exports. By default, the list is sorted from most to least recently-exported.\r\n * The first export matching the iModel's changeset is selected; or, if no such export exists, the first export in the list is selected.\r\n * @returns A URL from which the tileset can be loaded, or `undefined` if no appropriate URL could be obtained.\r\n * @beta\r\n */\r\nexport async function obtainMeshExportTilesetUrl(args: ObtainMeshExportTilesetUrlArgs): Promise<URL | undefined> {\r\n if (!args.iModel.iModelId) {\r\n Logger.logInfo(loggerCategory, \"Cannot obtain exports for an iModel with no iModelId\");\r\n return undefined;\r\n }\r\n\r\n const queryArgs: QueryMeshExportsArgs = {\r\n accessToken: args.accessToken,\r\n iModelId: args.iModel.iModelId,\r\n changesetId: args.iModel.changeset.id,\r\n urlPrefix: args.urlPrefix,\r\n };\r\n\r\n let selectedExport;\r\n for await (const exp of queryMeshExports(queryArgs)) {\r\n selectedExport = exp;\r\n break;\r\n }\r\n\r\n if (!selectedExport && !args.requireExactChangeset) {\r\n queryArgs.changesetId = undefined;\r\n for await (const exp of queryMeshExports(queryArgs)) {\r\n selectedExport = exp;\r\n Logger.logInfo(loggerCategory, `No exports for iModel ${args.iModel.iModelId} for changeset ${args.iModel.changeset.id}; falling back to most recent`);\r\n break;\r\n }\r\n }\r\n\r\n if (!selectedExport) {\r\n Logger.logInfo(loggerCategory, `No exports available for iModel ${args.iModel.iModelId}`);\r\n return undefined;\r\n }\r\n\r\n const url = new URL(selectedExport._links.mesh.href);\r\n url.pathname = `${url.pathname}/tileset.json`;\r\n return url;\r\n}\r\n\r\n/** Options supplied to [[initializeFrontendTiles]].\r\n * @beta\r\n */\r\nexport interface FrontendTilesOptions {\r\n /** Provide the base URL for the pre-published tileset for a given iModel.\r\n * If omitted, [[obtainMeshExportTilesetUrl]] will be invoked with default arguments, using the access token provided by [[IModelApp]].\r\n */\r\n computeSpatialTilesetBaseUrl?: ComputeSpatialTilesetBaseUrl;\r\n /** The maximum number of levels in the tile tree to skip loading if they do not provide the desired level of detail for the current view.\r\n * Default: 4.\r\n * Reducing this value will load more intermediate tiles, which causes more gradual refinement: low-resolution tiles will display quickly, followed more gradually by\r\n * successively higher-resolution ones.\r\n * Increasing the value jumps more directly to tiles of the exact level of detail desired, which may load more, smaller tiles up-front, leaving some areas of the view\r\n * vacant for longer; and when zooming out some newly-exposed areas of the view may remain vacant for longer because no lower-resolution tiles are initially available to\r\n * fill them. However, tiles close to the viewer (and therefore likely of most interest to them) will refine to an appropriate level of detail more quickly.\r\n */\r\n maxLevelsToSkip?: number;\r\n /** Specifies whether to permit the user to enable visible edges or wireframe mode for batched tiles.\r\n * The currently-deployed mesh export service does not produce edges, so this currently defaults to `false` to avoid user confusion.\r\n * Set it to `true` if you are loading tiles created with a version of the exporter that does produce edges.\r\n * ###TODO delete this option once we deploy an edge-producing version of the exporter to production.\r\n * @internal\r\n */\r\n enableEdges?: boolean;\r\n}\r\n\r\n/** @internal */\r\nexport const createFallbackSpatialTileTreeReferences = SpatialTileTreeReferences.create;\r\n\r\n/** Global configuration initialized by [[initializeFrontendTiles]].\r\n * @internal\r\n */\r\nexport const frontendTilesOptions = {\r\n maxLevelsToSkip: 4,\r\n enableEdges: false,\r\n};\r\n\r\n/** Initialize the frontend-tiles package to obtain tiles for spatial views.\r\n * @beta\r\n */\r\nexport function initializeFrontendTiles(options: FrontendTilesOptions): void {\r\n if (undefined !== options.maxLevelsToSkip && options.maxLevelsToSkip >= 0)\r\n frontendTilesOptions.maxLevelsToSkip = options.maxLevelsToSkip;\r\n\r\n if (options.enableEdges)\r\n frontendTilesOptions.enableEdges = true;\r\n\r\n const computeUrl = options.computeSpatialTilesetBaseUrl ?? (\r\n async (iModel: IModelConnection) => obtainMeshExportTilesetUrl({ iModel, accessToken: await IModelApp.getAccessToken() })\r\n );\r\n\r\n SpatialTileTreeReferences.create = (view: SpatialViewState) => createBatchedSpatialTileTreeReferences(view, computeUrl);\r\n}\r\n"]}
@@ -6,7 +6,7 @@ import { assert, ByteStream, Logger } from "@itwin/core-bentley";
6
6
  import { ColorDef } from "@itwin/core-common";
7
7
  import { IModelApp, RealityTileLoader, Tile, TileBoundingBoxes, TileRequestChannel, TileTreeLoadStatus, TileVisibility, } from "@itwin/core-frontend";
8
8
  import { loggerCategory } from "./LoggerCategory";
9
- import { getMaxLevelsToSkip } from "./FrontendTiles";
9
+ import { frontendTilesOptions } from "./FrontendTiles";
10
10
  let channel;
11
11
  /** @internal */
12
12
  export class BatchedTile extends Tile {
@@ -16,7 +16,7 @@ export class BatchedTile extends Tile {
16
16
  constructor(params, tree) {
17
17
  super(params, tree);
18
18
  // The root tile never has content, so it doesn't count toward max levels to skip.
19
- this._unskippable = 0 === (this.depth % getMaxLevelsToSkip());
19
+ this._unskippable = 0 === (this.depth % frontendTilesOptions.maxLevelsToSkip);
20
20
  if (params.childrenProps?.length)
21
21
  this._childrenProps = params.childrenProps;
22
22
  if (!this.contentId) {
@@ -1 +1 @@
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 GraphicBuilder, IModelApp, RealityTileLoader, RenderSystem, Tile, TileBoundingBoxes, TileContent,\r\n TileDrawArgs, TileParams, TileRequest, TileRequestChannel, TileTreeLoadStatus, TileUser, TileVisibility, Viewport,\r\n} from \"@itwin/core-frontend\";\r\nimport { loggerCategory } from \"./LoggerCategory\";\r\nimport { BatchedTileTree } from \"./BatchedTileTree\";\r\nimport { 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, isCanceled?: () => boolean): Promise<TileContent> {\r\n assert(data instanceof Uint8Array);\r\n if (!(data instanceof Uint8Array))\r\n return { };\r\n\r\n try {\r\n return await this.batchedTree.decoder.decode({\r\n stream: ByteStream.fromUint8Array(data),\r\n options: { tileId: this.contentId },\r\n system,\r\n isCanceled,\r\n isLeaf: this.isLeaf,\r\n });\r\n } catch {\r\n return { isLeaf: true };\r\n }\r\n }\r\n\r\n protected override addRangeGraphic(builder: GraphicBuilder, type: TileBoundingBoxes): void {\r\n if (TileBoundingBoxes.ChildVolumes !== type) {\r\n super.addRangeGraphic(builder, type);\r\n return;\r\n }\r\n\r\n builder.setSymbology(ColorDef.green, ColorDef.green, 2);\r\n builder.addRangeBox(this.range);\r\n\r\n this.loadChildren();\r\n const children = this.children;\r\n if (!children)\r\n return;\r\n\r\n builder.setSymbology(ColorDef.blue, ColorDef.blue.withTransparency(0xdf), 1);\r\n for (const child of children) {\r\n const range = child.range;\r\n builder.addRangeBox(range);\r\n builder.addRangeBox(range, true);\r\n }\r\n }\r\n\r\n public prune(olderThan: BeTimePoint): void {\r\n const children = this._batchedChildren;\r\n if (!children)\r\n return;\r\n\r\n if (this.usageMarker.isExpired(olderThan)) {\r\n this.disposeChildren();\r\n } else {\r\n for (const child of children)\r\n child.prune(olderThan);\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"BatchedTile.js","sourceRoot":"","sources":["../../src/BatchedTile.ts"],"names":[],"mappings":"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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 GraphicBuilder, IModelApp, RealityTileLoader, RenderSystem, Tile, TileBoundingBoxes, TileContent,\r\n TileDrawArgs, TileParams, TileRequest, TileRequestChannel, TileTreeLoadStatus, TileUser, TileVisibility, Viewport,\r\n} from \"@itwin/core-frontend\";\r\nimport { loggerCategory } from \"./LoggerCategory\";\r\nimport { BatchedTileTree } from \"./BatchedTileTree\";\r\nimport { frontendTilesOptions } from \"./FrontendTiles\";\r\n\r\n/** @internal */\r\nexport interface BatchedTileParams extends TileParams {\r\n childrenProps: Tileset3dSchema.Tile[] | undefined;\r\n}\r\n\r\nlet channel: TileRequestChannel | undefined;\r\n\r\n/** @internal */\r\nexport class BatchedTile extends Tile {\r\n private readonly _childrenProps?: Tileset3dSchema.Tile[];\r\n private readonly _unskippable: boolean;\r\n\r\n public get batchedTree(): BatchedTileTree {\r\n return this.tree as BatchedTileTree;\r\n }\r\n\r\n public constructor(params: BatchedTileParams, tree: BatchedTileTree) {\r\n super(params, tree);\r\n\r\n // The root tile never has content, so it doesn't count toward max levels to skip.\r\n this._unskippable = 0 === (this.depth % frontendTilesOptions.maxLevelsToSkip);\r\n\r\n if (params.childrenProps?.length)\r\n this._childrenProps = params.childrenProps;\r\n\r\n if (!this.contentId) {\r\n this.setIsReady();\r\n // mark \"undisplayable\"\r\n this._maximumSize = 0;\r\n }\r\n }\r\n\r\n private get _batchedChildren(): BatchedTile[] | undefined {\r\n return this.children as BatchedTile[] | undefined;\r\n }\r\n\r\n public override computeLoadPriority(viewports: Iterable<Viewport>, _users: Iterable<TileUser>): number {\r\n // Prioritize tiles closer to camera and center of attention (zoom point or screen center).\r\n return RealityTileLoader.computeTileLocationPriority(this, viewports, this.tree.iModelTransform);\r\n }\r\n\r\n public selectTiles(selected: Set<BatchedTile>, args: TileDrawArgs, closestDisplayableAncestor: BatchedTile | undefined): void {\r\n const vis = this.computeVisibility(args);\r\n if (TileVisibility.OutsideFrustum === vis)\r\n return;\r\n\r\n if (this._unskippable) {\r\n // Prevent this tile's content from being unloaded due to memory pressure.\r\n args.touchedTiles.add(this);\r\n args.markUsed(this);\r\n }\r\n\r\n closestDisplayableAncestor = this.hasGraphics ? this : closestDisplayableAncestor;\r\n if (TileVisibility.TooCoarse === vis && (this.isReady || !this._unskippable)) {\r\n args.markUsed(this);\r\n args.markReady(this);\r\n const childrenLoadStatus = this.loadChildren();\r\n if (TileTreeLoadStatus.Loading === childrenLoadStatus)\r\n args.markChildrenLoading();\r\n\r\n const children = this._batchedChildren;\r\n if (children) {\r\n for (const child of children)\r\n child.selectTiles(selected, args, closestDisplayableAncestor);\r\n\r\n return;\r\n }\r\n }\r\n\r\n // We want to display this tile. Request its content if not already loaded.\r\n if ((TileVisibility.Visible === vis || this._unskippable) && !this.isReady)\r\n args.insertMissing(this);\r\n\r\n if (closestDisplayableAncestor)\r\n selected.add(closestDisplayableAncestor);\r\n }\r\n\r\n protected override _loadChildren(resolve: (children: Tile[] | undefined) => void, reject: (error: Error) => void): void {\r\n let children: BatchedTile[] | undefined;\r\n if (this._childrenProps) {\r\n try {\r\n for (const childProps of this._childrenProps) {\r\n const params = this.batchedTree.reader.readTileParams(childProps, this);\r\n const child = new BatchedTile(params, this.batchedTree);\r\n children = children ?? [];\r\n children.push(child);\r\n }\r\n } catch (err) {\r\n Logger.logException(loggerCategory, err);\r\n children = undefined;\r\n if (err instanceof Error)\r\n reject(err);\r\n }\r\n }\r\n\r\n resolve(children);\r\n }\r\n\r\n public override get channel(): TileRequestChannel {\r\n if (!channel) {\r\n channel = new TileRequestChannel(\"itwinjs-batched-models\", 20);\r\n IModelApp.tileAdmin.channels.add(channel);\r\n }\r\n\r\n return channel;\r\n }\r\n\r\n public override async requestContent(_isCanceled: () => boolean): Promise<TileRequest.Response> {\r\n const url = new URL(this.contentId, this.batchedTree.reader.baseUrl);\r\n url.search = this.batchedTree.reader.baseUrl.search;\r\n const response = await fetch(url.toString());\r\n return response.arrayBuffer();\r\n }\r\n\r\n public override async readContent(data: TileRequest.ResponseData, system: RenderSystem, isCanceled?: () => boolean): Promise<TileContent> {\r\n assert(data instanceof Uint8Array);\r\n if (!(data instanceof Uint8Array))\r\n return { };\r\n\r\n try {\r\n return await this.batchedTree.decoder.decode({\r\n stream: ByteStream.fromUint8Array(data),\r\n options: { tileId: this.contentId },\r\n system,\r\n isCanceled,\r\n isLeaf: this.isLeaf,\r\n });\r\n } catch {\r\n return { isLeaf: true };\r\n }\r\n }\r\n\r\n protected override addRangeGraphic(builder: GraphicBuilder, type: TileBoundingBoxes): void {\r\n if (TileBoundingBoxes.ChildVolumes !== type) {\r\n super.addRangeGraphic(builder, type);\r\n return;\r\n }\r\n\r\n builder.setSymbology(ColorDef.green, ColorDef.green, 2);\r\n builder.addRangeBox(this.range);\r\n\r\n this.loadChildren();\r\n const children = this.children;\r\n if (!children)\r\n return;\r\n\r\n builder.setSymbology(ColorDef.blue, ColorDef.blue.withTransparency(0xdf), 1);\r\n for (const child of children) {\r\n const range = child.range;\r\n builder.addRangeBox(range);\r\n builder.addRangeBox(range, true);\r\n }\r\n }\r\n\r\n public prune(olderThan: BeTimePoint): void {\r\n const children = this._batchedChildren;\r\n if (!children)\r\n return;\r\n\r\n if (this.usageMarker.isExpired(olderThan)) {\r\n this.disposeChildren();\r\n } else {\r\n for (const child of children)\r\n child.prune(olderThan);\r\n }\r\n }\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"BatchedTileTree.d.ts","sourceRoot":"","sources":["../../src/BatchedTileTree.ts"],"names":[],"mappings":"AAMA,OAAO,EAAyB,cAAc,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC9F,OAAO,EACe,WAAW,EAAa,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,cAAc,EACzF,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAC/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAE9D,gBAAgB;AAChB,MAAM,WAAW,qBAAsB,SAAQ,cAAc;IAC3D,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,MAAM,EAAE,oBAAoB,CAAC;IAC7B,MAAM,CAAC,EAAE,cAAc,CAAC,MAAM,CAAC;CAChC;AAOD,gBAAgB;AAChB,qBAAa,eAAgB,SAAQ,QAAQ;IAC3C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAc;IACxC,SAAgB,MAAM,EAAE,oBAAoB,CAAC;IAC7C,SAAgB,cAAc,CAAC,EAAE,cAAc,CAAC,MAAM,CAAC;IACvD,SAAgB,OAAO,EAAE,WAAW,CAAC;gBAElB,MAAM,EAAE,qBAAqB;IAiBhC,OAAO,IAAI,IAAI;IAK/B,IAAoB,QAAQ,IAAI,WAAW,CAE1C;IAED,IAAoB,IAAI,IAAI,OAAO,CAElC;IAED,IAAoB,QAAQ,IAAI,MAAM,GAAG,SAAS,CAEjD;IAED,IAAoB,iBAAiB,IAAI,iBAAiB,CAEzD;IAGe,YAAY,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,EAAE;IAMxC,IAAI,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI;IAQ9B,KAAK,IAAI,IAAI;CAI9B"}
1
+ {"version":3,"file":"BatchedTileTree.d.ts","sourceRoot":"","sources":["../../src/BatchedTileTree.ts"],"names":[],"mappings":"AAMA,OAAO,EAAyB,cAAc,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAC9F,OAAO,EACe,WAAW,EAAa,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,cAAc,EACzF,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,WAAW,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAC/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAQ9D,gBAAgB;AAChB,MAAM,WAAW,qBAAsB,SAAQ,cAAc;IAC3D,QAAQ,EAAE,iBAAiB,CAAC;IAC5B,MAAM,EAAE,oBAAoB,CAAC;IAC7B,MAAM,CAAC,EAAE,cAAc,CAAC,MAAM,CAAC;CAChC;AAED,gBAAgB;AAChB,qBAAa,eAAgB,SAAQ,QAAQ;IAC3C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAc;IACxC,SAAgB,MAAM,EAAE,oBAAoB,CAAC;IAC7C,SAAgB,cAAc,CAAC,EAAE,cAAc,CAAC,MAAM,CAAC;IACvD,SAAgB,OAAO,EAAE,WAAW,CAAC;gBAElB,MAAM,EAAE,qBAAqB;IAiBhC,OAAO,IAAI,IAAI;IAK/B,IAAoB,QAAQ,IAAI,WAAW,CAE1C;IAED,IAAoB,IAAI,IAAI,OAAO,CAElC;IAED,IAAoB,QAAQ,IAAI,MAAM,GAAG,SAAS,CAEjD;IAED,IAAoB,iBAAiB,IAAI,iBAAiB,CAEzD;IAGe,YAAY,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,EAAE;IAMxC,IAAI,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI;IAQ9B,KAAK,IAAI,IAAI;CAI9B"}
@@ -6,7 +6,8 @@ import { BeTimePoint } from "@itwin/core-bentley";
6
6
  import { BatchType, RenderMode } from "@itwin/core-common";
7
7
  import { acquireImdlDecoder, IModelApp, TileTree, } from "@itwin/core-frontend";
8
8
  import { BatchedTile } from "./BatchedTile";
9
- const viewFlagOverrides = {
9
+ import { frontendTilesOptions } from "./FrontendTiles";
10
+ const defaultViewFlags = {
10
11
  renderMode: RenderMode.SmoothShade,
11
12
  visibleEdges: false,
12
13
  };
@@ -41,7 +42,7 @@ export class BatchedTileTree extends TileTree {
41
42
  return undefined;
42
43
  }
43
44
  get viewFlagOverrides() {
44
- return viewFlagOverrides;
45
+ return frontendTilesOptions.enableEdges ? {} : defaultViewFlags;
45
46
  }
46
47
  // eslint-disable-next-line @typescript-eslint/naming-convention
47
48
  _selectTiles(args) {
@@ -1 +1 @@
1
- {"version":3,"file":"BatchedTileTree.js","sourceRoot":"","sources":["../../src/BatchedTileTree.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAE/F,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,UAAU,EAAqC,MAAM,oBAAoB,CAAC;AAC9F,OAAO,EACL,kBAAkB,EAAe,SAAS,EAAsB,QAAQ,GACzE,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,WAAW,EAAqB,MAAM,eAAe,CAAC;AAU/D,MAAM,iBAAiB,GAAsB;IAC3C,UAAU,EAAE,UAAU,CAAC,WAAW;IAClC,YAAY,EAAE,KAAK;CACpB,CAAC;AAEF,gBAAgB;AAChB,MAAM,OAAO,eAAgB,SAAQ,QAAQ;IAM3C,YAAmB,MAA6B;QAC9C,KAAK,CAAC,MAAM,CAAC,CAAC;QACd,IAAI,CAAC,SAAS,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACxD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC5B,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC;QAEpC,IAAI,CAAC,OAAO,GAAG,kBAAkB,CAAC;YAChC,IAAI,EAAE,SAAS,CAAC,OAAO;YACvB,QAAQ,EAAE,IAAI,CAAC,cAAc;YAC7B,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,YAAY,EAAE,IAAI,CAAC,OAAO;YAC1B,IAAI,EAAE,IAAI;YACV,sBAAsB,EAAE,KAAK;YAC7B,QAAQ,EAAE,CAAC,SAAS,CAAC,SAAS,CAAC,kBAAkB;SAClD,CAAC,CAAC;IACL,CAAC;IAEe,OAAO;QACrB,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QACvB,KAAK,CAAC,OAAO,EAAE,CAAC;IAClB,CAAC;IAED,IAAoB,QAAQ;QAC1B,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED,IAAoB,IAAI;QACtB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAoB,QAAQ;QAC1B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAoB,iBAAiB;QACnC,OAAO,iBAAiB,CAAC;IAC3B,CAAC;IAED,gEAAgE;IAChD,YAAY,CAAC,IAAkB;QAC7C,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAe,CAAC;QACxC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,QAAQ,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;QACrD,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC9B,CAAC;IAEe,IAAI,CAAC,IAAkB;QACrC,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACrC,KAAK,MAAM,IAAI,IAAI,KAAK;YACtB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QAE1B,IAAI,CAAC,YAAY,EAAE,CAAC;IACtB,CAAC;IAEe,KAAK;QACnB,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC/D,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IACjC,CAAC;CACF","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\nimport { BeTimePoint } from \"@itwin/core-bentley\";\r\nimport { BatchType, RenderMode, RenderSchedule, ViewFlagOverrides } from \"@itwin/core-common\";\r\nimport {\r\n acquireImdlDecoder, ImdlDecoder, IModelApp, Tile, TileDrawArgs, TileTree, TileTreeParams,\r\n} from \"@itwin/core-frontend\";\r\nimport { BatchedTile, BatchedTileParams } from \"./BatchedTile\";\r\nimport { BatchedTilesetReader } from \"./BatchedTilesetReader\";\r\n\r\n/** @internal */\r\nexport interface BatchedTileTreeParams extends TileTreeParams {\r\n rootTile: BatchedTileParams;\r\n reader: BatchedTilesetReader;\r\n script?: RenderSchedule.Script;\r\n}\r\n\r\nconst viewFlagOverrides: ViewFlagOverrides = {\r\n renderMode: RenderMode.SmoothShade,\r\n visibleEdges: false,\r\n};\r\n\r\n/** @internal */\r\nexport class BatchedTileTree extends TileTree {\r\n private readonly _rootTile: BatchedTile;\r\n public readonly reader: BatchedTilesetReader;\r\n public readonly scheduleScript?: RenderSchedule.Script;\r\n public readonly decoder: ImdlDecoder;\r\n\r\n public constructor(params: BatchedTileTreeParams) {\r\n super(params);\r\n this._rootTile = new BatchedTile(params.rootTile, this);\r\n this.reader = params.reader;\r\n this.scheduleScript = params.script;\r\n\r\n this.decoder = acquireImdlDecoder({\r\n type: BatchType.Primary,\r\n timeline: this.scheduleScript,\r\n iModel: this.iModel,\r\n batchModelId: this.modelId,\r\n is3d: true,\r\n containsTransformNodes: false,\r\n noWorker: !IModelApp.tileAdmin.decodeImdlInWorker,\r\n });\r\n }\r\n\r\n public override dispose(): void {\r\n this.decoder.release();\r\n super.dispose();\r\n }\r\n\r\n public override get rootTile(): BatchedTile {\r\n return this._rootTile;\r\n }\r\n\r\n public override get is3d(): boolean {\r\n return true;\r\n }\r\n\r\n public override get maxDepth(): number | undefined {\r\n return undefined;\r\n }\r\n\r\n public override get viewFlagOverrides(): ViewFlagOverrides {\r\n return viewFlagOverrides;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public override _selectTiles(args: TileDrawArgs): Tile[] {\r\n const selected = new Set<BatchedTile>();\r\n this.rootTile.selectTiles(selected, args, undefined);\r\n return Array.from(selected);\r\n }\r\n\r\n public override draw(args: TileDrawArgs): void {\r\n const tiles = this.selectTiles(args);\r\n for (const tile of tiles)\r\n tile.drawGraphics(args);\r\n\r\n args.drawGraphics();\r\n }\r\n\r\n public override prune(): void {\r\n const olderThan = BeTimePoint.now().minus(this.expirationTime);\r\n this.rootTile.prune(olderThan);\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"BatchedTileTree.js","sourceRoot":"","sources":["../../src/BatchedTileTree.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAE/F,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,UAAU,EAAqC,MAAM,oBAAoB,CAAC;AAC9F,OAAO,EACL,kBAAkB,EAAe,SAAS,EAAsB,QAAQ,GACzE,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,WAAW,EAAqB,MAAM,eAAe,CAAC;AAE/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAEvD,MAAM,gBAAgB,GAAsB;IAC1C,UAAU,EAAE,UAAU,CAAC,WAAW;IAClC,YAAY,EAAE,KAAK;CACpB,CAAC;AASF,gBAAgB;AAChB,MAAM,OAAO,eAAgB,SAAQ,QAAQ;IAM3C,YAAmB,MAA6B;QAC9C,KAAK,CAAC,MAAM,CAAC,CAAC;QACd,IAAI,CAAC,SAAS,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACxD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC5B,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC;QAEpC,IAAI,CAAC,OAAO,GAAG,kBAAkB,CAAC;YAChC,IAAI,EAAE,SAAS,CAAC,OAAO;YACvB,QAAQ,EAAE,IAAI,CAAC,cAAc;YAC7B,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,YAAY,EAAE,IAAI,CAAC,OAAO;YAC1B,IAAI,EAAE,IAAI;YACV,sBAAsB,EAAE,KAAK;YAC7B,QAAQ,EAAE,CAAC,SAAS,CAAC,SAAS,CAAC,kBAAkB;SAClD,CAAC,CAAC;IACL,CAAC;IAEe,OAAO;QACrB,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QACvB,KAAK,CAAC,OAAO,EAAE,CAAC;IAClB,CAAC;IAED,IAAoB,QAAQ;QAC1B,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED,IAAoB,IAAI;QACtB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAoB,QAAQ;QAC1B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAoB,iBAAiB;QACnC,OAAO,oBAAoB,CAAC,WAAW,CAAC,CAAC,CAAA,EAAG,CAAC,CAAC,CAAC,gBAAgB,CAAC;IAClE,CAAC;IAED,gEAAgE;IAChD,YAAY,CAAC,IAAkB;QAC7C,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAe,CAAC;QACxC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,QAAQ,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;QACrD,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC9B,CAAC;IAEe,IAAI,CAAC,IAAkB;QACrC,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACrC,KAAK,MAAM,IAAI,IAAI,KAAK;YACtB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QAE1B,IAAI,CAAC,YAAY,EAAE,CAAC;IACtB,CAAC;IAEe,KAAK;QACnB,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC/D,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IACjC,CAAC;CACF","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\nimport { BeTimePoint } from \"@itwin/core-bentley\";\r\nimport { BatchType, RenderMode, RenderSchedule, ViewFlagOverrides } from \"@itwin/core-common\";\r\nimport {\r\n acquireImdlDecoder, ImdlDecoder, IModelApp, Tile, TileDrawArgs, TileTree, TileTreeParams,\r\n} from \"@itwin/core-frontend\";\r\nimport { BatchedTile, BatchedTileParams } from \"./BatchedTile\";\r\nimport { BatchedTilesetReader } from \"./BatchedTilesetReader\";\r\nimport { frontendTilesOptions } from \"./FrontendTiles\";\r\n\r\nconst defaultViewFlags: ViewFlagOverrides = {\r\n renderMode: RenderMode.SmoothShade,\r\n visibleEdges: false,\r\n};\r\n\r\n/** @internal */\r\nexport interface BatchedTileTreeParams extends TileTreeParams {\r\n rootTile: BatchedTileParams;\r\n reader: BatchedTilesetReader;\r\n script?: RenderSchedule.Script;\r\n}\r\n\r\n/** @internal */\r\nexport class BatchedTileTree extends TileTree {\r\n private readonly _rootTile: BatchedTile;\r\n public readonly reader: BatchedTilesetReader;\r\n public readonly scheduleScript?: RenderSchedule.Script;\r\n public readonly decoder: ImdlDecoder;\r\n\r\n public constructor(params: BatchedTileTreeParams) {\r\n super(params);\r\n this._rootTile = new BatchedTile(params.rootTile, this);\r\n this.reader = params.reader;\r\n this.scheduleScript = params.script;\r\n\r\n this.decoder = acquireImdlDecoder({\r\n type: BatchType.Primary,\r\n timeline: this.scheduleScript,\r\n iModel: this.iModel,\r\n batchModelId: this.modelId,\r\n is3d: true,\r\n containsTransformNodes: false,\r\n noWorker: !IModelApp.tileAdmin.decodeImdlInWorker,\r\n });\r\n }\r\n\r\n public override dispose(): void {\r\n this.decoder.release();\r\n super.dispose();\r\n }\r\n\r\n public override get rootTile(): BatchedTile {\r\n return this._rootTile;\r\n }\r\n\r\n public override get is3d(): boolean {\r\n return true;\r\n }\r\n\r\n public override get maxDepth(): number | undefined {\r\n return undefined;\r\n }\r\n\r\n public override get viewFlagOverrides(): ViewFlagOverrides {\r\n return frontendTilesOptions.enableEdges ?{ } : defaultViewFlags;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public override _selectTiles(args: TileDrawArgs): Tile[] {\r\n const selected = new Set<BatchedTile>();\r\n this.rootTile.selectTiles(selected, args, undefined);\r\n return Array.from(selected);\r\n }\r\n\r\n public override draw(args: TileDrawArgs): void {\r\n const tiles = this.selectTiles(args);\r\n for (const tile of tiles)\r\n tile.drawGraphics(args);\r\n\r\n args.drawGraphics();\r\n }\r\n\r\n public override prune(): void {\r\n const olderThan = BeTimePoint.now().minus(this.expirationTime);\r\n this.rootTile.prune(olderThan);\r\n }\r\n}\r\n"]}
@@ -99,11 +99,23 @@ export interface FrontendTilesOptions {
99
99
  * fill them. However, tiles close to the viewer (and therefore likely of most interest to them) will refine to an appropriate level of detail more quickly.
100
100
  */
101
101
  maxLevelsToSkip?: number;
102
+ /** Specifies whether to permit the user to enable visible edges or wireframe mode for batched tiles.
103
+ * The currently-deployed mesh export service does not produce edges, so this currently defaults to `false` to avoid user confusion.
104
+ * Set it to `true` if you are loading tiles created with a version of the exporter that does produce edges.
105
+ * ###TODO delete this option once we deploy an edge-producing version of the exporter to production.
106
+ * @internal
107
+ */
108
+ enableEdges?: boolean;
102
109
  }
103
110
  /** @internal */
104
111
  export declare const createFallbackSpatialTileTreeReferences: typeof SpatialTileTreeReferences.create;
105
- /** @internal */
106
- export declare function getMaxLevelsToSkip(): number;
112
+ /** Global configuration initialized by [[initializeFrontendTiles]].
113
+ * @internal
114
+ */
115
+ export declare const frontendTilesOptions: {
116
+ maxLevelsToSkip: number;
117
+ enableEdges: boolean;
118
+ };
107
119
  /** Initialize the frontend-tiles package to obtain tiles for spatial views.
108
120
  * @beta
109
121
  */
@@ -1 +1 @@
1
- {"version":3,"file":"FrontendTiles.d.ts","sourceRoot":"","sources":["../../src/FrontendTiles.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,WAAW,EAAU,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAa,gBAAgB,EAAE,yBAAyB,EAAoB,MAAM,sBAAsB,CAAC;AAIhH;;;;;GAKG;AACH,MAAM,MAAM,4BAA4B,GAAG,CAAC,MAAM,EAAE,gBAAgB,KAAK,OAAO,CAAC,GAAG,GAAG,SAAS,CAAC,CAAC;AAWlG;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE;QACP,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,MAAM,CAAC;QACnB,eAAe,EAAE,GAAG,CAAC;QACrB,oBAAoB,EAAE,GAAG,CAAC;KAC3B,CAAC;IAGF,MAAM,EAAE;QACN,IAAI,EAAE;YACJ,IAAI,EAAE,MAAM,CAAC;SACd,CAAC;KACH,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,UAAU,EAAE,CAAC;IAGtB,MAAM,EAAE;QACN,IAAI,CAAC,EAAE;YACL,IAAI,EAAE,MAAM,CAAC;SACd,CAAC;KACH,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,wDAAwD;IACxD,WAAW,EAAE,WAAW,CAAC;IACzB,uDAAuD;IACvD,QAAQ,EAAE,MAAM,CAAC;IACjB,yFAAyF;IACzF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4CAA4C;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qIAAqI;IACrI,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED;;;;GAIG;AACH,wBAAwB,gBAAgB,CAAC,IAAI,EAAE,oBAAoB,GAAG,qBAAqB,CAAC,UAAU,CAAC,CA4BtG;AAED;;GAEG;AACH,MAAM,WAAW,8BAA8B;IAC7C,oDAAoD;IACpD,MAAM,EAAE,gBAAgB,CAAC;IACzB,wDAAwD;IACxD,WAAW,EAAE,WAAW,CAAC;IACzB,4CAA4C;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;OAEG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACjC;AAED;;;;;GAKG;AACH,wBAAsB,0BAA0B,CAAC,IAAI,EAAE,8BAA8B,GAAG,OAAO,CAAC,GAAG,GAAG,SAAS,CAAC,CAoC/G;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC;;OAEG;IACH,4BAA4B,CAAC,EAAE,4BAA4B,CAAC;IAC5D;;;;;;;OAOG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,gBAAgB;AAChB,eAAO,MAAM,uCAAuC,yCAAmC,CAAC;AAIxF,gBAAgB;AAChB,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,oBAAoB,GAAG,IAAI,CAS3E"}
1
+ {"version":3,"file":"FrontendTiles.d.ts","sourceRoot":"","sources":["../../src/FrontendTiles.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,WAAW,EAAU,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAa,gBAAgB,EAAE,yBAAyB,EAAoB,MAAM,sBAAsB,CAAC;AAIhH;;;;;GAKG;AACH,MAAM,MAAM,4BAA4B,GAAG,CAAC,MAAM,EAAE,gBAAgB,KAAK,OAAO,CAAC,GAAG,GAAG,SAAS,CAAC,CAAC;AAWlG;;;GAGG;AACH,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE;QACP,QAAQ,EAAE,MAAM,CAAC;QACjB,WAAW,EAAE,MAAM,CAAC;QACpB,UAAU,EAAE,MAAM,CAAC;QACnB,eAAe,EAAE,GAAG,CAAC;QACrB,oBAAoB,EAAE,GAAG,CAAC;KAC3B,CAAC;IAGF,MAAM,EAAE;QACN,IAAI,EAAE;YACJ,IAAI,EAAE,MAAM,CAAC;SACd,CAAC;KACH,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,UAAU,EAAE,CAAC;IAGtB,MAAM,EAAE;QACN,IAAI,CAAC,EAAE;YACL,IAAI,EAAE,MAAM,CAAC;SACd,CAAC;KACH,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,wDAAwD;IACxD,WAAW,EAAE,WAAW,CAAC;IACzB,uDAAuD;IACvD,QAAQ,EAAE,MAAM,CAAC;IACjB,yFAAyF;IACzF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,4CAA4C;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qIAAqI;IACrI,iBAAiB,CAAC,EAAE,OAAO,CAAC;CAC7B;AAED;;;;GAIG;AACH,wBAAwB,gBAAgB,CAAC,IAAI,EAAE,oBAAoB,GAAG,qBAAqB,CAAC,UAAU,CAAC,CA4BtG;AAED;;GAEG;AACH,MAAM,WAAW,8BAA8B;IAC7C,oDAAoD;IACpD,MAAM,EAAE,gBAAgB,CAAC;IACzB,wDAAwD;IACxD,WAAW,EAAE,WAAW,CAAC;IACzB,4CAA4C;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;OAEG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACjC;AAED;;;;;GAKG;AACH,wBAAsB,0BAA0B,CAAC,IAAI,EAAE,8BAA8B,GAAG,OAAO,CAAC,GAAG,GAAG,SAAS,CAAC,CAoC/G;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC;;OAEG;IACH,4BAA4B,CAAC,EAAE,4BAA4B,CAAC;IAC5D;;;;;;;OAOG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB;;;;;OAKG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,gBAAgB;AAChB,eAAO,MAAM,uCAAuC,yCAAmC,CAAC;AAExF;;GAEG;AACH,eAAO,MAAM,oBAAoB;;;CAGhC,CAAC;AAEF;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,oBAAoB,GAAG,IAAI,CAY3E"}
@@ -85,17 +85,21 @@ export async function obtainMeshExportTilesetUrl(args) {
85
85
  }
86
86
  /** @internal */
87
87
  export const createFallbackSpatialTileTreeReferences = SpatialTileTreeReferences.create;
88
- let maxLevelsToSkip = 4;
89
- /** @internal */
90
- export function getMaxLevelsToSkip() {
91
- return maxLevelsToSkip;
92
- }
88
+ /** Global configuration initialized by [[initializeFrontendTiles]].
89
+ * @internal
90
+ */
91
+ export const frontendTilesOptions = {
92
+ maxLevelsToSkip: 4,
93
+ enableEdges: false,
94
+ };
93
95
  /** Initialize the frontend-tiles package to obtain tiles for spatial views.
94
96
  * @beta
95
97
  */
96
98
  export function initializeFrontendTiles(options) {
97
99
  if (undefined !== options.maxLevelsToSkip && options.maxLevelsToSkip >= 0)
98
- maxLevelsToSkip = options.maxLevelsToSkip;
100
+ frontendTilesOptions.maxLevelsToSkip = options.maxLevelsToSkip;
101
+ if (options.enableEdges)
102
+ frontendTilesOptions.enableEdges = true;
99
103
  const computeUrl = options.computeSpatialTilesetBaseUrl ?? (async (iModel) => obtainMeshExportTilesetUrl({ iModel, accessToken: await IModelApp.getAccessToken() }));
100
104
  SpatialTileTreeReferences.create = (view) => createBatchedSpatialTileTreeReferences(view, computeUrl);
101
105
  }
@@ -1 +1 @@
1
- {"version":3,"file":"FrontendTiles.js","sourceRoot":"","sources":["../../src/FrontendTiles.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 { AccessToken, Logger } from \"@itwin/core-bentley\";\r\nimport { IModelApp, IModelConnection, SpatialTileTreeReferences, SpatialViewState } from \"@itwin/core-frontend\";\r\nimport { loggerCategory } from \"./LoggerCategory\";\r\nimport { createBatchedSpatialTileTreeReferences } from \"./BatchedSpatialTileTreeRefs\";\r\n\r\n/** A function that can provide the base URL where a tileset representing all of the spatial models in a given iModel are stored.\r\n * The tileset is expected to reside at \"baseUrl/tileset.json\" and to have been produced by the [mesh export service](https://developer.bentley.com/apis/mesh-export/).\r\n * If no such tileset exists for the given iModel, return `undefined`.\r\n * @see [[FrontendTilesOptions.computeSpatialTilesetBaseUrl]].\r\n * @beta\r\n */\r\nexport type ComputeSpatialTilesetBaseUrl = (iModel: IModelConnection) => Promise<URL | undefined>;\r\n\r\nfunction createMeshExportServiceQueryUrl(args: { iModelId: string, urlPrefix?: string, changesetId?: string }): string {\r\n const prefix = args.urlPrefix ?? \"\";\r\n let url = `https://${prefix}api.bentley.com/mesh-export/?iModelId=${args.iModelId}&$orderBy=date:desc`;\r\n if (args.changesetId)\r\n url = `${url}&changesetId=${args.changesetId}`;\r\n\r\n return url;\r\n}\r\n\r\n/** Represents the result of a [mesh export](https://developer.bentley.com/apis/mesh-export/operations/get-export/#export).\r\n * @see [[queryCompletedMeshExports]].\r\n * @beta\r\n */\r\nexport interface MeshExport {\r\n id: string;\r\n displayName: string;\r\n status: string;\r\n request: {\r\n iModelId: string;\r\n changesetId: string;\r\n exportType: string;\r\n geometryOptions: any;\r\n viewDefinitionFilter: any;\r\n };\r\n\r\n /* eslint-disable-next-line @typescript-eslint/naming-convention */\r\n _links: {\r\n mesh: {\r\n href: string;\r\n };\r\n };\r\n}\r\n\r\n/** Exposed strictly for tests.\r\n * @internal\r\n */\r\nexport interface MeshExports {\r\n exports: MeshExport[];\r\n\r\n /* eslint-disable-next-line @typescript-eslint/naming-convention */\r\n _links: {\r\n next?: {\r\n href: string;\r\n };\r\n };\r\n}\r\n\r\n/** Arguments supplied to [[queryMeshExports]].\r\n * @beta\r\n */\r\nexport interface QueryMeshExportsArgs {\r\n /** The token used to access the mesh export service. */\r\n accessToken: AccessToken;\r\n /** The Id of the iModel for which to query exports. */\r\n iModelId: string;\r\n /** If defined, constrains the query to exports produced from the specified changeset. */\r\n changesetId?: string;\r\n /** Chiefly used in testing environments. */\r\n urlPrefix?: string;\r\n /** If true, exports whose status is not \"Complete\" (indicating the export successfully finished) will be included in the results. */\r\n includeIncomplete?: boolean;\r\n}\r\n\r\n/** Query the [mesh export service](https://developer.bentley.com/apis/mesh-export/operations/get-exports/) for exports of type \"IMODEL\" matching\r\n * the specified criteria.\r\n * The exports are sorted from most-recently- to least-recently-produced.\r\n * @beta\r\n */\r\nexport async function * queryMeshExports(args: QueryMeshExportsArgs): AsyncIterableIterator<MeshExport> {\r\n const headers = {\r\n /* eslint-disable-next-line @typescript-eslint/naming-convention */\r\n Authorization: args.accessToken ?? await IModelApp.getAccessToken(),\r\n /* eslint-disable-next-line @typescript-eslint/naming-convention */\r\n Accept: \"application/vnd.bentley.itwin-platform.v1+json\",\r\n /* eslint-disable-next-line @typescript-eslint/naming-convention */\r\n Prefer: \"return=representation\",\r\n };\r\n\r\n let url: string | undefined = createMeshExportServiceQueryUrl(args);\r\n while (url) {\r\n let result;\r\n try {\r\n const response = await fetch(url, { headers });\r\n result = await response.json() as MeshExports;\r\n } catch (err) {\r\n Logger.logException(loggerCategory, err);\r\n Logger.logError(loggerCategory, `Failed loading exports for iModel ${args.iModelId}`);\r\n break;\r\n }\r\n\r\n const foundExports = result.exports.filter((x) => x.request.exportType === \"IMODEL\" && (args.includeIncomplete || x.status === \"Complete\"));\r\n for (const foundExport of foundExports)\r\n yield foundExport;\r\n\r\n url = result._links.next?.href;\r\n }\r\n}\r\n\r\n/** Arguments supplied to [[obtainMeshExportTilesetUrl]].\r\n * @beta\r\n */\r\nexport interface ObtainMeshExportTilesetUrlArgs {\r\n /** The iModel for which to obtain a tileset URl. */\r\n iModel: IModelConnection;\r\n /** The token used to access the mesh export service. */\r\n accessToken: AccessToken;\r\n /** Chiefly used in testing environments. */\r\n urlPrefix?: string;\r\n /** If true, only exports produced for `iModel`'s specific changeset will be considered; otherwise, if no exports are found for the changeset,\r\n * the most recent export for any changeset will be used.\r\n */\r\n requireExactChangeset?: boolean;\r\n}\r\n\r\n/** Obtains a URL pointing to a tileset appropriate for visualizing a specific iModel.\r\n * [[queryCompletedMeshExports]] is used to obtain a list of available exports. By default, the list is sorted from most to least recently-exported.\r\n * The first export matching the iModel's changeset is selected; or, if no such export exists, the first export in the list is selected.\r\n * @returns A URL from which the tileset can be loaded, or `undefined` if no appropriate URL could be obtained.\r\n * @beta\r\n */\r\nexport async function obtainMeshExportTilesetUrl(args: ObtainMeshExportTilesetUrlArgs): Promise<URL | undefined> {\r\n if (!args.iModel.iModelId) {\r\n Logger.logInfo(loggerCategory, \"Cannot obtain exports for an iModel with no iModelId\");\r\n return undefined;\r\n }\r\n\r\n const queryArgs: QueryMeshExportsArgs = {\r\n accessToken: args.accessToken,\r\n iModelId: args.iModel.iModelId,\r\n changesetId: args.iModel.changeset.id,\r\n urlPrefix: args.urlPrefix,\r\n };\r\n\r\n let selectedExport;\r\n for await (const exp of queryMeshExports(queryArgs)) {\r\n selectedExport = exp;\r\n break;\r\n }\r\n\r\n if (!selectedExport && !args.requireExactChangeset) {\r\n queryArgs.changesetId = undefined;\r\n for await (const exp of queryMeshExports(queryArgs)) {\r\n selectedExport = exp;\r\n Logger.logInfo(loggerCategory, `No exports for iModel ${args.iModel.iModelId} for changeset ${args.iModel.changeset.id}; falling back to most recent`);\r\n break;\r\n }\r\n }\r\n\r\n if (!selectedExport) {\r\n Logger.logInfo(loggerCategory, `No exports available for iModel ${args.iModel.iModelId}`);\r\n return undefined;\r\n }\r\n\r\n const url = new URL(selectedExport._links.mesh.href);\r\n url.pathname = `${url.pathname}/tileset.json`;\r\n return url;\r\n}\r\n\r\n/** Options supplied to [[initializeFrontendTiles]].\r\n * @beta\r\n */\r\nexport interface FrontendTilesOptions {\r\n /** Provide the base URL for the pre-published tileset for a given iModel.\r\n * If omitted, [[obtainMeshExportTilesetUrl]] will be invoked with default arguments, using the access token provided by [[IModelApp]].\r\n */\r\n computeSpatialTilesetBaseUrl?: ComputeSpatialTilesetBaseUrl;\r\n /** The maximum number of levels in the tile tree to skip loading if they do not provide the desired level of detail for the current view.\r\n * Default: 4.\r\n * Reducing this value will load more intermediate tiles, which causes more gradual refinement: low-resolution tiles will display quickly, followed more gradually by\r\n * successively higher-resolution ones.\r\n * Increasing the value jumps more directly to tiles of the exact level of detail desired, which may load more, smaller tiles up-front, leaving some areas of the view\r\n * vacant for longer; and when zooming out some newly-exposed areas of the view may remain vacant for longer because no lower-resolution tiles are initially available to\r\n * fill them. However, tiles close to the viewer (and therefore likely of most interest to them) will refine to an appropriate level of detail more quickly.\r\n */\r\n maxLevelsToSkip?: number;\r\n}\r\n\r\n/** @internal */\r\nexport const createFallbackSpatialTileTreeReferences = SpatialTileTreeReferences.create;\r\n\r\nlet maxLevelsToSkip = 4;\r\n\r\n/** @internal */\r\nexport function getMaxLevelsToSkip(): number {\r\n return maxLevelsToSkip;\r\n}\r\n\r\n/** Initialize the frontend-tiles package to obtain tiles for spatial views.\r\n * @beta\r\n */\r\nexport function initializeFrontendTiles(options: FrontendTilesOptions): void {\r\n if (undefined !== options.maxLevelsToSkip && options.maxLevelsToSkip >= 0)\r\n maxLevelsToSkip = options.maxLevelsToSkip;\r\n\r\n const computeUrl = options.computeSpatialTilesetBaseUrl ?? (\r\n async (iModel: IModelConnection) => obtainMeshExportTilesetUrl({ iModel, accessToken: await IModelApp.getAccessToken() })\r\n );\r\n\r\n SpatialTileTreeReferences.create = (view: SpatialViewState) => createBatchedSpatialTileTreeReferences(view, computeUrl);\r\n}\r\n"]}
1
+ {"version":3,"file":"FrontendTiles.js","sourceRoot":"","sources":["../../src/FrontendTiles.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 { AccessToken, Logger } from \"@itwin/core-bentley\";\r\nimport { IModelApp, IModelConnection, SpatialTileTreeReferences, SpatialViewState } from \"@itwin/core-frontend\";\r\nimport { loggerCategory } from \"./LoggerCategory\";\r\nimport { createBatchedSpatialTileTreeReferences } from \"./BatchedSpatialTileTreeRefs\";\r\n\r\n/** A function that can provide the base URL where a tileset representing all of the spatial models in a given iModel are stored.\r\n * The tileset is expected to reside at \"baseUrl/tileset.json\" and to have been produced by the [mesh export service](https://developer.bentley.com/apis/mesh-export/).\r\n * If no such tileset exists for the given iModel, return `undefined`.\r\n * @see [[FrontendTilesOptions.computeSpatialTilesetBaseUrl]].\r\n * @beta\r\n */\r\nexport type ComputeSpatialTilesetBaseUrl = (iModel: IModelConnection) => Promise<URL | undefined>;\r\n\r\nfunction createMeshExportServiceQueryUrl(args: { iModelId: string, urlPrefix?: string, changesetId?: string }): string {\r\n const prefix = args.urlPrefix ?? \"\";\r\n let url = `https://${prefix}api.bentley.com/mesh-export/?iModelId=${args.iModelId}&$orderBy=date:desc`;\r\n if (args.changesetId)\r\n url = `${url}&changesetId=${args.changesetId}`;\r\n\r\n return url;\r\n}\r\n\r\n/** Represents the result of a [mesh export](https://developer.bentley.com/apis/mesh-export/operations/get-export/#export).\r\n * @see [[queryCompletedMeshExports]].\r\n * @beta\r\n */\r\nexport interface MeshExport {\r\n id: string;\r\n displayName: string;\r\n status: string;\r\n request: {\r\n iModelId: string;\r\n changesetId: string;\r\n exportType: string;\r\n geometryOptions: any;\r\n viewDefinitionFilter: any;\r\n };\r\n\r\n /* eslint-disable-next-line @typescript-eslint/naming-convention */\r\n _links: {\r\n mesh: {\r\n href: string;\r\n };\r\n };\r\n}\r\n\r\n/** Exposed strictly for tests.\r\n * @internal\r\n */\r\nexport interface MeshExports {\r\n exports: MeshExport[];\r\n\r\n /* eslint-disable-next-line @typescript-eslint/naming-convention */\r\n _links: {\r\n next?: {\r\n href: string;\r\n };\r\n };\r\n}\r\n\r\n/** Arguments supplied to [[queryMeshExports]].\r\n * @beta\r\n */\r\nexport interface QueryMeshExportsArgs {\r\n /** The token used to access the mesh export service. */\r\n accessToken: AccessToken;\r\n /** The Id of the iModel for which to query exports. */\r\n iModelId: string;\r\n /** If defined, constrains the query to exports produced from the specified changeset. */\r\n changesetId?: string;\r\n /** Chiefly used in testing environments. */\r\n urlPrefix?: string;\r\n /** If true, exports whose status is not \"Complete\" (indicating the export successfully finished) will be included in the results. */\r\n includeIncomplete?: boolean;\r\n}\r\n\r\n/** Query the [mesh export service](https://developer.bentley.com/apis/mesh-export/operations/get-exports/) for exports of type \"IMODEL\" matching\r\n * the specified criteria.\r\n * The exports are sorted from most-recently- to least-recently-produced.\r\n * @beta\r\n */\r\nexport async function * queryMeshExports(args: QueryMeshExportsArgs): AsyncIterableIterator<MeshExport> {\r\n const headers = {\r\n /* eslint-disable-next-line @typescript-eslint/naming-convention */\r\n Authorization: args.accessToken ?? await IModelApp.getAccessToken(),\r\n /* eslint-disable-next-line @typescript-eslint/naming-convention */\r\n Accept: \"application/vnd.bentley.itwin-platform.v1+json\",\r\n /* eslint-disable-next-line @typescript-eslint/naming-convention */\r\n Prefer: \"return=representation\",\r\n };\r\n\r\n let url: string | undefined = createMeshExportServiceQueryUrl(args);\r\n while (url) {\r\n let result;\r\n try {\r\n const response = await fetch(url, { headers });\r\n result = await response.json() as MeshExports;\r\n } catch (err) {\r\n Logger.logException(loggerCategory, err);\r\n Logger.logError(loggerCategory, `Failed loading exports for iModel ${args.iModelId}`);\r\n break;\r\n }\r\n\r\n const foundExports = result.exports.filter((x) => x.request.exportType === \"IMODEL\" && (args.includeIncomplete || x.status === \"Complete\"));\r\n for (const foundExport of foundExports)\r\n yield foundExport;\r\n\r\n url = result._links.next?.href;\r\n }\r\n}\r\n\r\n/** Arguments supplied to [[obtainMeshExportTilesetUrl]].\r\n * @beta\r\n */\r\nexport interface ObtainMeshExportTilesetUrlArgs {\r\n /** The iModel for which to obtain a tileset URl. */\r\n iModel: IModelConnection;\r\n /** The token used to access the mesh export service. */\r\n accessToken: AccessToken;\r\n /** Chiefly used in testing environments. */\r\n urlPrefix?: string;\r\n /** If true, only exports produced for `iModel`'s specific changeset will be considered; otherwise, if no exports are found for the changeset,\r\n * the most recent export for any changeset will be used.\r\n */\r\n requireExactChangeset?: boolean;\r\n}\r\n\r\n/** Obtains a URL pointing to a tileset appropriate for visualizing a specific iModel.\r\n * [[queryCompletedMeshExports]] is used to obtain a list of available exports. By default, the list is sorted from most to least recently-exported.\r\n * The first export matching the iModel's changeset is selected; or, if no such export exists, the first export in the list is selected.\r\n * @returns A URL from which the tileset can be loaded, or `undefined` if no appropriate URL could be obtained.\r\n * @beta\r\n */\r\nexport async function obtainMeshExportTilesetUrl(args: ObtainMeshExportTilesetUrlArgs): Promise<URL | undefined> {\r\n if (!args.iModel.iModelId) {\r\n Logger.logInfo(loggerCategory, \"Cannot obtain exports for an iModel with no iModelId\");\r\n return undefined;\r\n }\r\n\r\n const queryArgs: QueryMeshExportsArgs = {\r\n accessToken: args.accessToken,\r\n iModelId: args.iModel.iModelId,\r\n changesetId: args.iModel.changeset.id,\r\n urlPrefix: args.urlPrefix,\r\n };\r\n\r\n let selectedExport;\r\n for await (const exp of queryMeshExports(queryArgs)) {\r\n selectedExport = exp;\r\n break;\r\n }\r\n\r\n if (!selectedExport && !args.requireExactChangeset) {\r\n queryArgs.changesetId = undefined;\r\n for await (const exp of queryMeshExports(queryArgs)) {\r\n selectedExport = exp;\r\n Logger.logInfo(loggerCategory, `No exports for iModel ${args.iModel.iModelId} for changeset ${args.iModel.changeset.id}; falling back to most recent`);\r\n break;\r\n }\r\n }\r\n\r\n if (!selectedExport) {\r\n Logger.logInfo(loggerCategory, `No exports available for iModel ${args.iModel.iModelId}`);\r\n return undefined;\r\n }\r\n\r\n const url = new URL(selectedExport._links.mesh.href);\r\n url.pathname = `${url.pathname}/tileset.json`;\r\n return url;\r\n}\r\n\r\n/** Options supplied to [[initializeFrontendTiles]].\r\n * @beta\r\n */\r\nexport interface FrontendTilesOptions {\r\n /** Provide the base URL for the pre-published tileset for a given iModel.\r\n * If omitted, [[obtainMeshExportTilesetUrl]] will be invoked with default arguments, using the access token provided by [[IModelApp]].\r\n */\r\n computeSpatialTilesetBaseUrl?: ComputeSpatialTilesetBaseUrl;\r\n /** The maximum number of levels in the tile tree to skip loading if they do not provide the desired level of detail for the current view.\r\n * Default: 4.\r\n * Reducing this value will load more intermediate tiles, which causes more gradual refinement: low-resolution tiles will display quickly, followed more gradually by\r\n * successively higher-resolution ones.\r\n * Increasing the value jumps more directly to tiles of the exact level of detail desired, which may load more, smaller tiles up-front, leaving some areas of the view\r\n * vacant for longer; and when zooming out some newly-exposed areas of the view may remain vacant for longer because no lower-resolution tiles are initially available to\r\n * fill them. However, tiles close to the viewer (and therefore likely of most interest to them) will refine to an appropriate level of detail more quickly.\r\n */\r\n maxLevelsToSkip?: number;\r\n /** Specifies whether to permit the user to enable visible edges or wireframe mode for batched tiles.\r\n * The currently-deployed mesh export service does not produce edges, so this currently defaults to `false` to avoid user confusion.\r\n * Set it to `true` if you are loading tiles created with a version of the exporter that does produce edges.\r\n * ###TODO delete this option once we deploy an edge-producing version of the exporter to production.\r\n * @internal\r\n */\r\n enableEdges?: boolean;\r\n}\r\n\r\n/** @internal */\r\nexport const createFallbackSpatialTileTreeReferences = SpatialTileTreeReferences.create;\r\n\r\n/** Global configuration initialized by [[initializeFrontendTiles]].\r\n * @internal\r\n */\r\nexport const frontendTilesOptions = {\r\n maxLevelsToSkip: 4,\r\n enableEdges: false,\r\n};\r\n\r\n/** Initialize the frontend-tiles package to obtain tiles for spatial views.\r\n * @beta\r\n */\r\nexport function initializeFrontendTiles(options: FrontendTilesOptions): void {\r\n if (undefined !== options.maxLevelsToSkip && options.maxLevelsToSkip >= 0)\r\n frontendTilesOptions.maxLevelsToSkip = options.maxLevelsToSkip;\r\n\r\n if (options.enableEdges)\r\n frontendTilesOptions.enableEdges = true;\r\n\r\n const computeUrl = options.computeSpatialTilesetBaseUrl ?? (\r\n async (iModel: IModelConnection) => obtainMeshExportTilesetUrl({ iModel, accessToken: await IModelApp.getAccessToken() })\r\n );\r\n\r\n SpatialTileTreeReferences.create = (view: SpatialViewState) => createBatchedSpatialTileTreeReferences(view, computeUrl);\r\n}\r\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@itwin/frontend-tiles",
3
- "version": "4.2.0-dev.9",
3
+ "version": "4.2.1",
4
4
  "description": "Experimental alternative technique for visualizing the contents of iModels",
5
5
  "main": "lib/cjs/frontend-tiles.js",
6
6
  "module": "lib/esm/frontend-tiles.js",
@@ -23,10 +23,10 @@
23
23
  "url": "http://www.bentley.com"
24
24
  },
25
25
  "peerDependencies": {
26
- "@itwin/core-bentley": "4.2.0-dev.9",
27
- "@itwin/core-common": "4.2.0-dev.9",
28
- "@itwin/core-geometry": "4.2.0-dev.9",
29
- "@itwin/core-frontend": "4.2.0-dev.9"
26
+ "@itwin/core-common": "4.2.1",
27
+ "@itwin/core-bentley": "4.2.1",
28
+ "@itwin/core-geometry": "4.2.1",
29
+ "@itwin/core-frontend": "4.2.1"
30
30
  },
31
31
  "devDependencies": {
32
32
  "@itwin/eslint-plugin": "4.0.0-dev.44",
@@ -37,7 +37,7 @@
37
37
  "@types/sinon": "^10.0.15",
38
38
  "babel-loader": "~8.2.5",
39
39
  "babel-plugin-istanbul": "~6.1.1",
40
- "chai": "^4.1.2",
40
+ "chai": "^4.3.10",
41
41
  "chai-as-promised": "^7",
42
42
  "eslint": "^8.44.0",
43
43
  "glob": "^7.1.2",
@@ -47,12 +47,12 @@
47
47
  "source-map-loader": "^4.0.0",
48
48
  "typescript": "~5.0.2",
49
49
  "webpack": "^5.76.0",
50
- "@itwin/core-common": "4.2.0-dev.9",
51
- "@itwin/build-tools": "4.2.0-dev.9",
52
- "@itwin/core-bentley": "4.2.0-dev.9",
53
- "@itwin/certa": "4.2.0-dev.9",
54
- "@itwin/core-frontend": "4.2.0-dev.9",
55
- "@itwin/core-geometry": "4.2.0-dev.9"
50
+ "@itwin/build-tools": "4.2.1",
51
+ "@itwin/certa": "4.2.1",
52
+ "@itwin/core-frontend": "4.2.1",
53
+ "@itwin/core-common": "4.2.1",
54
+ "@itwin/core-geometry": "4.2.1",
55
+ "@itwin/core-bentley": "4.2.1"
56
56
  },
57
57
  "scripts": {
58
58
  "build": "npm run -s build:cjs && npm run -s build:esm",