@itwin/frontend-tiles 4.0.0-dev.56 → 4.0.0-dev.58

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.
@@ -1,3 +1,3 @@
1
1
  {
2
- "nonCachedDurationMs": 14838.312799930573
2
+ "nonCachedDurationMs": 15496.83060002327
3
3
  }
@@ -4,15 +4,15 @@
4
4
  "extensions/frontend-tiles/LICENSE.md": "77dfb5043040cc16a3611930daba56d86ef54334",
5
5
  "extensions/frontend-tiles/README.md": "4ea38e83e862cdfa6fab08adc92eb62bcb2fe238",
6
6
  "extensions/frontend-tiles/config/rush-project.json": "10683a57d3bd2b8ae364fbe8f844c01619f1a821",
7
- "extensions/frontend-tiles/package.json": "1cd46e07e71f0e17b15ebe6c4cdd9f88aee6910a",
8
- "extensions/frontend-tiles/src/BatchedSpatialTileTreeRefs.ts": "6e3311dba4539560b7585d640676d98f0c33912a",
9
- "extensions/frontend-tiles/src/BatchedTile.ts": "b67686d0bcea3a6a1a9c563a1574d82e546ee9fa",
7
+ "extensions/frontend-tiles/package.json": "09beb42a240b11fb1f4889f50a4267304af9c8ba",
8
+ "extensions/frontend-tiles/src/BatchedSpatialTileTreeRefs.ts": "1bd92ba0d816eada104e1eb9ec1c198eb69d6842",
9
+ "extensions/frontend-tiles/src/BatchedTile.ts": "5a65ba092f420eb9cd5ff2ee9ae2f80bb5b42945",
10
10
  "extensions/frontend-tiles/src/BatchedTileContentReader.ts": "7a1392a3e55882eedd68f0fb098db9009f190a3e",
11
11
  "extensions/frontend-tiles/src/BatchedTileTree.ts": "bc27ba7b54de36cfe58ce3ecd62c7795569d3509",
12
12
  "extensions/frontend-tiles/src/BatchedTileTreeReference.ts": "0c57e84a7d361ef6d81c1c7c419e9f5891683843",
13
13
  "extensions/frontend-tiles/src/BatchedTileTreeSupplier.ts": "916587d978864b4f9595b560ee1bac3033a123f5",
14
14
  "extensions/frontend-tiles/src/BatchedTilesetReader.ts": "0cc90a58fc8f4cafab8c2bbdac6dc1186337b4f0",
15
- "extensions/frontend-tiles/src/FrontendTiles.ts": "441dade9ada6338bf2e4db805b2af944f8f17a36",
15
+ "extensions/frontend-tiles/src/FrontendTiles.ts": "576ca9d6b519e7c75187507f9243fa2b802787d8",
16
16
  "extensions/frontend-tiles/src/LoggerCategory.ts": "458e67157ea150f6bff37674320dfc8cf5886049",
17
17
  "extensions/frontend-tiles/src/frontend-tiles.ts": "2778da0ad9afc43273e7105641ef1213edc47a83",
18
18
  "extensions/frontend-tiles/tsconfig.json": "67be9deac4eea3b76c3e1a66b0e9004ed0f6255e"
@@ -1,4 +1,5 @@
1
- import { IModelConnection, SpatialTileTreeReferences, SpatialViewState } from "@itwin/core-frontend";
1
+ import { SpatialTileTreeReferences, SpatialViewState } from "@itwin/core-frontend";
2
+ import { ComputeSpatialTilesetBaseUrl } from "./FrontendTiles";
2
3
  /** @internal */
3
- export declare function createBatchedSpatialTileTreeReferences(view: SpatialViewState, computeBaseUrl: (iModel: IModelConnection) => URL): SpatialTileTreeReferences;
4
+ export declare function createBatchedSpatialTileTreeReferences(view: SpatialViewState, computeBaseUrl: ComputeSpatialTilesetBaseUrl): SpatialTileTreeReferences;
4
5
  //# sourceMappingURL=BatchedSpatialTileTreeRefs.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"BatchedSpatialTileTreeRefs.d.ts","sourceRoot":"","sources":["../../src/BatchedSpatialTileTreeRefs.ts"],"names":[],"mappings":"AAKA,OAAO,EACiB,gBAAgB,EAAE,yBAAyB,EAAE,gBAAgB,EACpF,MAAM,sBAAsB,CAAC;AA+B9B,gBAAgB;AAChB,wBAAgB,sCAAsC,CAAC,IAAI,EAAE,gBAAgB,EAAE,cAAc,EAAE,CAAC,MAAM,EAAE,gBAAgB,KAAK,GAAG,GAAG,yBAAyB,CAG3J"}
1
+ {"version":3,"file":"BatchedSpatialTileTreeRefs.d.ts","sourceRoot":"","sources":["../../src/BatchedSpatialTileTreeRefs.ts"],"names":[],"mappings":"AAKA,OAAO,EACmC,yBAAyB,EAAE,gBAAgB,EACpF,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,4BAA4B,EAA2C,MAAM,iBAAiB,CAAC;AA2HxG,gBAAgB;AAChB,wBAAgB,sCAAsC,CAAC,IAAI,EAAE,gBAAgB,EAAE,cAAc,EAAE,4BAA4B,GAAG,yBAAyB,CA0BtJ"}
@@ -5,8 +5,11 @@
5
5
  *--------------------------------------------------------------------------------------------*/
6
6
  Object.defineProperty(exports, "__esModule", { value: true });
7
7
  exports.createBatchedSpatialTileTreeReferences = void 0;
8
+ const core_frontend_1 = require("@itwin/core-frontend");
8
9
  const BatchedTileTreeReference_1 = require("./BatchedTileTreeReference");
9
- class TreeRefs {
10
+ const FrontendTiles_1 = require("./FrontendTiles");
11
+ // Obtains tiles pre-published by mesh export service.
12
+ class BatchedSpatialTileTreeReferences {
10
13
  constructor(treeRef) {
11
14
  this._treeRef = treeRef;
12
15
  }
@@ -26,10 +29,105 @@ class TreeRefs {
26
29
  // This exists chiefly for debugging. Unimplemented here.
27
30
  }
28
31
  }
32
+ // A placeholder used by [[ProxySpatialTileTreeReferences]] until asynchronous loading completes.
33
+ // It provides a TileTreeOwner that never loads a tile tree.
34
+ // This ensures that [ViewState.areAllTileTreesLoaded]($frontend) will not return `true` while we are loading.
35
+ class ProxyTileTreeReference extends core_frontend_1.TileTreeReference {
36
+ constructor(iModel) {
37
+ super();
38
+ this._treeOwner = {
39
+ iModel,
40
+ tileTree: undefined,
41
+ loadStatus: core_frontend_1.TileTreeLoadStatus.NotLoaded,
42
+ load: () => undefined,
43
+ dispose: () => { },
44
+ loadTree: async () => Promise.resolve(undefined),
45
+ };
46
+ }
47
+ get treeOwner() {
48
+ return this._treeOwner;
49
+ }
50
+ // eslint-disable-next-line @typescript-eslint/naming-convention
51
+ get _isLoadingComplete() {
52
+ return false;
53
+ }
54
+ }
55
+ // Serves as a placeholder while we asynchronously obtain the base URL for a pre-published tileset (or asynchronously determine
56
+ // that no such tileset exists).
57
+ class ProxySpatialTileTreeReferences {
58
+ constructor(view, getBaseUrl) {
59
+ this._proxyRef = new ProxyTileTreeReference(view.iModel);
60
+ getBaseUrl.then((url) => {
61
+ if (url) {
62
+ const ref = BatchedTileTreeReference_1.BatchedTileTreeReference.create(view, url);
63
+ this.setTreeRefs(new BatchedSpatialTileTreeReferences(ref));
64
+ }
65
+ else {
66
+ this.setTreeRefs((0, FrontendTiles_1.createFallbackSpatialTileTreeReferences)(view));
67
+ }
68
+ }).catch(() => {
69
+ this.setTreeRefs((0, FrontendTiles_1.createFallbackSpatialTileTreeReferences)(view));
70
+ });
71
+ }
72
+ setTreeRefs(refs) {
73
+ this._impl = refs;
74
+ if (this._attachArgs) {
75
+ this._impl.attachToViewport(this._attachArgs);
76
+ this._attachArgs.invalidateSymbologyOverrides();
77
+ this._attachArgs = undefined;
78
+ }
79
+ }
80
+ update() {
81
+ this._impl?.update();
82
+ }
83
+ attachToViewport(args) {
84
+ if (this._impl)
85
+ this._impl.attachToViewport(args);
86
+ else
87
+ this._attachArgs = args;
88
+ }
89
+ detachFromViewport() {
90
+ if (this._impl)
91
+ this._impl.detachFromViewport();
92
+ else
93
+ this._attachArgs = undefined;
94
+ }
95
+ setDeactivated() { }
96
+ *[Symbol.iterator]() {
97
+ if (this._impl) {
98
+ for (const ref of this._impl)
99
+ yield ref;
100
+ }
101
+ else {
102
+ yield this._proxyRef;
103
+ }
104
+ }
105
+ }
106
+ const iModelToBaseUrl = new Map();
29
107
  /** @internal */
30
108
  function createBatchedSpatialTileTreeReferences(view, computeBaseUrl) {
31
- const treeRef = BatchedTileTreeReference_1.BatchedTileTreeReference.create(view, computeBaseUrl(view.iModel));
32
- return new TreeRefs(treeRef);
109
+ const iModel = view.iModel;
110
+ let entry = iModelToBaseUrl.get(iModel);
111
+ if (undefined === entry) {
112
+ const promise = computeBaseUrl(iModel);
113
+ iModelToBaseUrl.set(iModel, entry = promise);
114
+ iModel.onClose.addOnce(() => iModelToBaseUrl.delete(iModel));
115
+ promise.then((url) => {
116
+ if (iModelToBaseUrl.has(iModel))
117
+ iModelToBaseUrl.set(iModel, url ?? null);
118
+ }).catch(() => {
119
+ if (iModelToBaseUrl.has(iModel))
120
+ iModelToBaseUrl.set(iModel, null);
121
+ });
122
+ }
123
+ if (null === entry) {
124
+ // No tileset exists for this iModel - use default tile generation instead.
125
+ return (0, FrontendTiles_1.createFallbackSpatialTileTreeReferences)(view);
126
+ }
127
+ if (entry instanceof Promise)
128
+ return new ProxySpatialTileTreeReferences(view, entry);
129
+ const ref = BatchedTileTreeReference_1.BatchedTileTreeReference.create(view, entry);
130
+ return new BatchedSpatialTileTreeReferences(ref);
33
131
  }
34
132
  exports.createBatchedSpatialTileTreeReferences = createBatchedSpatialTileTreeReferences;
35
133
  //# sourceMappingURL=BatchedSpatialTileTreeRefs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"BatchedSpatialTileTreeRefs.js","sourceRoot":"","sources":["../../src/BatchedSpatialTileTreeRefs.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;;;AAK/F,yEAAsE;AAEtE,MAAM,QAAQ;IAGZ,YAAmB,OAAiC;QAClD,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC;IAC1B,CAAC;IAEM,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC;QACvB,MAAM,IAAI,CAAC,QAAQ,CAAC;IACtB,CAAC;IAEM,MAAM;QACX,IAAI,CAAC,QAAQ,CAAC,kBAAkB,EAAE,CAAC;IACrC,CAAC;IAEM,gBAAgB,CAAC,IAA0B;QAChD,IAAI,CAAC,QAAQ,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACvC,CAAC;IAEM,kBAAkB;QACvB,IAAI,CAAC,QAAQ,CAAC,kBAAkB,EAAE,CAAC;IACrC,CAAC;IAEM,cAAc;QACnB,yDAAyD;IAC3D,CAAC;CACF;AAED,gBAAgB;AAChB,SAAgB,sCAAsC,CAAC,IAAsB,EAAE,cAAiD;IAC9H,MAAM,OAAO,GAAG,mDAAwB,CAAC,MAAM,CAAC,IAAI,EAAE,cAAc,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC;IACnF,OAAO,IAAI,QAAQ,CAAC,OAAO,CAAC,CAAC;AAC/B,CAAC;AAHD,wFAGC","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 {\r\n AttachToViewportArgs, IModelConnection, SpatialTileTreeReferences, SpatialViewState, TileTreeReference,\r\n} from \"@itwin/core-frontend\";\r\nimport { BatchedTileTreeReference } from \"./BatchedTileTreeReference\";\r\n\r\nclass TreeRefs implements SpatialTileTreeReferences {\r\n private readonly _treeRef: BatchedTileTreeReference;\r\n\r\n public constructor(treeRef: BatchedTileTreeReference) {\r\n this._treeRef = treeRef;\r\n }\r\n\r\n public *[Symbol.iterator](): Iterator<TileTreeReference> {\r\n yield this._treeRef;\r\n }\r\n\r\n public update(): void {\r\n this._treeRef.updateViewedModels();\r\n }\r\n\r\n public attachToViewport(args: AttachToViewportArgs): void {\r\n this._treeRef.attachToViewport(args);\r\n }\r\n\r\n public detachFromViewport(): void {\r\n this._treeRef.detachFromViewport();\r\n }\r\n\r\n public setDeactivated(): void {\r\n // This exists chiefly for debugging. Unimplemented here.\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport function createBatchedSpatialTileTreeReferences(view: SpatialViewState, computeBaseUrl: (iModel: IModelConnection) => URL): SpatialTileTreeReferences {\r\n const treeRef = BatchedTileTreeReference.create(view, computeBaseUrl(view.iModel));\r\n return new TreeRefs(treeRef);\r\n}\r\n"]}
1
+ {"version":3,"file":"BatchedSpatialTileTreeRefs.js","sourceRoot":"","sources":["../../src/BatchedSpatialTileTreeRefs.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\nimport {\r\n AttachToViewportArgs, IModelConnection, SpatialTileTreeReferences, SpatialViewState, TileTreeLoadStatus, TileTreeOwner, TileTreeReference,\r\n} from \"@itwin/core-frontend\";\r\nimport { BatchedTileTreeReference } from \"./BatchedTileTreeReference\";\r\nimport { ComputeSpatialTilesetBaseUrl, createFallbackSpatialTileTreeReferences } from \"./FrontendTiles\";\r\n\r\n// Obtains tiles pre-published by mesh export service.\r\nclass BatchedSpatialTileTreeReferences implements SpatialTileTreeReferences {\r\n private readonly _treeRef: BatchedTileTreeReference;\r\n\r\n public constructor(treeRef: BatchedTileTreeReference) {\r\n this._treeRef = treeRef;\r\n }\r\n\r\n public *[Symbol.iterator](): Iterator<TileTreeReference> {\r\n yield this._treeRef;\r\n }\r\n\r\n public update(): void {\r\n this._treeRef.updateViewedModels();\r\n }\r\n\r\n public attachToViewport(args: AttachToViewportArgs): void {\r\n this._treeRef.attachToViewport(args);\r\n }\r\n\r\n public detachFromViewport(): void {\r\n this._treeRef.detachFromViewport();\r\n }\r\n\r\n public setDeactivated(): void {\r\n // This exists chiefly for debugging. Unimplemented here.\r\n }\r\n}\r\n\r\n// A placeholder used by [[ProxySpatialTileTreeReferences]] until asynchronous loading completes.\r\n// It provides a TileTreeOwner that never loads a tile tree.\r\n// This ensures that [ViewState.areAllTileTreesLoaded]($frontend) will not return `true` while we are loading.\r\nclass ProxyTileTreeReference extends TileTreeReference {\r\n private readonly _treeOwner: TileTreeOwner;\r\n\r\n public constructor(iModel: IModelConnection) {\r\n super();\r\n this._treeOwner = {\r\n iModel,\r\n tileTree: undefined,\r\n loadStatus: TileTreeLoadStatus.NotLoaded,\r\n load: () => undefined,\r\n dispose: () => { },\r\n loadTree: async () => Promise.resolve(undefined),\r\n };\r\n }\r\n\r\n public override get treeOwner() {\r\n return this._treeOwner;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public override get _isLoadingComplete() {\r\n return false;\r\n }\r\n}\r\n\r\n// Serves as a placeholder while we asynchronously obtain the base URL for a pre-published tileset (or asynchronously determine\r\n// that no such tileset exists).\r\nclass ProxySpatialTileTreeReferences implements SpatialTileTreeReferences {\r\n // Once async loading completes, all methods will be forwarded to this implementation.\r\n private _impl?: SpatialTileTreeReferences;\r\n private readonly _proxyRef: ProxyTileTreeReference;\r\n // Retained if attachToViewport is called while we are still loading; and reset if detachFromViewport is called while loading.\r\n private _attachArgs?: AttachToViewportArgs;\r\n\r\n public constructor(view: SpatialViewState, getBaseUrl: Promise<URL | undefined>) {\r\n this._proxyRef = new ProxyTileTreeReference(view.iModel);\r\n getBaseUrl.then((url: URL | undefined) => {\r\n if (url) {\r\n const ref = BatchedTileTreeReference.create(view, url);\r\n this.setTreeRefs(new BatchedSpatialTileTreeReferences(ref));\r\n } else {\r\n this.setTreeRefs(createFallbackSpatialTileTreeReferences(view));\r\n }\r\n }).catch(() => {\r\n this.setTreeRefs(createFallbackSpatialTileTreeReferences(view));\r\n });\r\n }\r\n\r\n private setTreeRefs(refs: SpatialTileTreeReferences): void {\r\n this._impl = refs;\r\n if (this._attachArgs) {\r\n this._impl.attachToViewport(this._attachArgs);\r\n this._attachArgs.invalidateSymbologyOverrides();\r\n this._attachArgs = undefined;\r\n }\r\n }\r\n\r\n public update(): void {\r\n this._impl?.update();\r\n }\r\n\r\n public attachToViewport(args: AttachToViewportArgs): void {\r\n if (this._impl)\r\n this._impl.attachToViewport(args);\r\n else\r\n this._attachArgs = args;\r\n }\r\n\r\n public detachFromViewport(): void {\r\n if (this._impl)\r\n this._impl.detachFromViewport();\r\n else\r\n this._attachArgs = undefined;\r\n }\r\n\r\n public setDeactivated(): void { }\r\n\r\n public *[Symbol.iterator](): Iterator<TileTreeReference> {\r\n if (this._impl) {\r\n for (const ref of this._impl)\r\n yield ref;\r\n } else {\r\n yield this._proxyRef;\r\n }\r\n }\r\n}\r\n\r\nconst iModelToBaseUrl = new Map<IModelConnection, URL | null | Promise<URL | undefined>>();\r\n\r\n/** @internal */\r\nexport function createBatchedSpatialTileTreeReferences(view: SpatialViewState, computeBaseUrl: ComputeSpatialTilesetBaseUrl): SpatialTileTreeReferences {\r\n const iModel = view.iModel;\r\n let entry = iModelToBaseUrl.get(iModel);\r\n if (undefined === entry) {\r\n const promise = computeBaseUrl(iModel);\r\n iModelToBaseUrl.set(iModel, entry = promise);\r\n iModel.onClose.addOnce(() => iModelToBaseUrl.delete(iModel));\r\n promise.then((url: URL | undefined) => {\r\n if (iModelToBaseUrl.has(iModel))\r\n iModelToBaseUrl.set(iModel, url ?? null);\r\n }).catch(() => {\r\n if (iModelToBaseUrl.has(iModel))\r\n iModelToBaseUrl.set(iModel, null);\r\n });\r\n }\r\n\r\n if (null === entry) {\r\n // No tileset exists for this iModel - use default tile generation instead.\r\n return createFallbackSpatialTileTreeReferences(view);\r\n }\r\n\r\n if (entry instanceof Promise)\r\n return new ProxySpatialTileTreeReferences(view, entry);\r\n\r\n const ref = BatchedTileTreeReference.create(view, entry);\r\n return new BatchedSpatialTileTreeReferences(ref);\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"BatchedTile.d.ts","sourceRoot":"","sources":["../../src/BatchedTile.ts"],"names":[],"mappings":"AAKA,OAAO,EAAU,WAAW,EAAsB,MAAM,qBAAqB,CAAC;AAC9E,OAAO,EAAY,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EACY,cAAc,EAA4C,YAAY,EAAE,YAAY,EAAE,IAAI,EAAE,iBAAiB,EAAE,WAAW,EAC3I,YAAY,EAAkB,UAAU,EAAE,WAAW,EAAE,kBAAkB,EAAsB,QAAQ,EAAkB,QAAQ,EAClI,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAGpD,gBAAgB;AAChB,MAAM,WAAW,iBAAkB,SAAQ,UAAU;IACnD,aAAa,EAAE,eAAe,CAAC,IAAI,EAAE,GAAG,SAAS,CAAC;CACnD;AAID,gBAAgB;AAChB,qBAAa,WAAY,SAAQ,IAAI;IACnC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAyB;IAEzD,IAAW,WAAW,IAAI,eAAe,CAExC;gBAEkB,MAAM,EAAE,iBAAiB,EAAE,IAAI,EAAE,eAAe;IAYnE,OAAO,KAAK,gBAAgB,GAE3B;IAEe,mBAAmB,CAAC,SAAS,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,GAAG,MAAM;IAK/F,WAAW,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,GAAG,YAAY;cAgI9E,aAAa,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,GAAG,SAAS,KAAK,IAAI,EAAE,MAAM,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,IAAI;IAqBvH,IAAoB,OAAO,IAAI,kBAAkB,CAOhD;IAEqB,cAAc,CAAC,WAAW,EAAE,MAAM,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC;IAOzE,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,WAAW,CAAC,EAAE,MAAM,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC;cAuCvH,eAAe,CAAC,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,iBAAiB,GAAG,IAAI;IAsBnF,KAAK,CAAC,SAAS,EAAE,WAAW,GAAG,IAAI;CAY3C"}
1
+ {"version":3,"file":"BatchedTile.d.ts","sourceRoot":"","sources":["../../src/BatchedTile.ts"],"names":[],"mappings":"AAKA,OAAO,EAAU,WAAW,EAAsB,MAAM,qBAAqB,CAAC;AAC9E,OAAO,EAAY,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EACY,cAAc,EAA4C,YAAY,EAAE,YAAY,EAAE,IAAI,EAAE,iBAAiB,EAAE,WAAW,EAC3I,YAAY,EAAkB,UAAU,EAAE,WAAW,EAAE,kBAAkB,EAAsB,QAAQ,EAAkB,QAAQ,EAClI,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAIpD,gBAAgB;AAChB,MAAM,WAAW,iBAAkB,SAAQ,UAAU;IACnD,aAAa,EAAE,eAAe,CAAC,IAAI,EAAE,GAAG,SAAS,CAAC;CACnD;AAID,gBAAgB;AAChB,qBAAa,WAAY,SAAQ,IAAI;IACnC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAyB;IAEzD,IAAW,WAAW,IAAI,eAAe,CAExC;gBAEkB,MAAM,EAAE,iBAAiB,EAAE,IAAI,EAAE,eAAe;IAYnE,OAAO,KAAK,gBAAgB,GAE3B;IAEe,mBAAmB,CAAC,SAAS,EAAE,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,GAAG,MAAM;IAK/F,WAAW,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,GAAG,YAAY;cAgI9E,aAAa,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,GAAG,SAAS,KAAK,IAAI,EAAE,MAAM,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,GAAG,IAAI;IAqBvH,IAAoB,OAAO,IAAI,kBAAkB,CAOhD;IAEqB,cAAc,CAAC,WAAW,EAAE,MAAM,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC,QAAQ,CAAC;IAOzE,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,WAAW,CAAC,EAAE,MAAM,OAAO,GAAG,OAAO,CAAC,WAAW,CAAC;cAuCvH,eAAe,CAAC,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,iBAAiB,GAAG,IAAI;IAsBnF,KAAK,CAAC,SAAS,EAAE,WAAW,GAAG,IAAI;CAY3C"}
@@ -10,6 +10,7 @@ const core_common_1 = require("@itwin/core-common");
10
10
  const core_frontend_1 = require("@itwin/core-frontend");
11
11
  const LoggerCategory_1 = require("./LoggerCategory");
12
12
  const BatchedTileContentReader_1 = require("./BatchedTileContentReader");
13
+ const FrontendTiles_1 = require("./FrontendTiles");
13
14
  let channel;
14
15
  /** @internal */
15
16
  class BatchedTile extends core_frontend_1.Tile {
@@ -83,7 +84,7 @@ class BatchedTile extends core_frontend_1.Tile {
83
84
  // This tile is too coarse to draw. Try to draw something more appropriate.
84
85
  // If it is not ready to draw, we may want to skip loading in favor of loading its descendants.
85
86
  // If we previously loaded and later unloaded content for this tile to free memory, don't force it to reload its content - proceed to children.
86
- const maximumLevelsToSkip = core_frontend_1.IModelApp.tileAdmin.maximumLevelsToSkip;
87
+ const maximumLevelsToSkip = (0, FrontendTiles_1.getMaxLevelsToSkip)();
87
88
  let canSkipThisTile = (this._hadGraphics && !this.hasGraphics) /* || this.depth < this.iModelTree.maxInitialTilesToSkip */;
88
89
  if (canSkipThisTile) {
89
90
  numSkipped = 1;
@@ -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 GltfReaderProps, GraphicBuilder, ImdlReader, IModelApp, RealityTileLoader, RenderSystem, SelectParent, Tile, TileBoundingBoxes, TileContent,\r\n TileDrawArgs, TileLoadStatus, TileParams, TileRequest, TileRequestChannel, TileTreeLoadStatus, TileUser, TileVisibility, Viewport,\r\n} from \"@itwin/core-frontend\";\r\nimport { loggerCategory } from \"./LoggerCategory\";\r\nimport { BatchedTileTree } from \"./BatchedTileTree\";\r\nimport { BatchedTileContentReader } from \"./BatchedTileContentReader\";\r\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\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 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: BatchedTile[], args: TileDrawArgs, numSkipped: number): SelectParent {\r\n const vis = this.computeVisibility(args);\r\n if (TileVisibility.OutsideFrustum === vis)\r\n return SelectParent.No;\r\n\r\n if (TileVisibility.Visible === vis) {\r\n // This tile is of appropriate resolution to draw. If need loading or refinement, enqueue.\r\n if (!this.isReady)\r\n args.insertMissing(this);\r\n\r\n if (this.hasGraphics) {\r\n // It can be drawn - select it\r\n args.markReady(this);\r\n selected.push(this);\r\n } else if (!this.isReady) {\r\n // It can't be drawn. Try to draw children in its place; otherwise draw the parent.\r\n // Do not load/request the children for this purpose.\r\n const initialSize = selected.length;\r\n const kids = this._batchedChildren;\r\n if (undefined === kids)\r\n return SelectParent.Yes;\r\n\r\n // Find any descendant to draw, until we exceed max initial tiles to skip.\r\n // if (this.depth < this.iModelTree.maxInitialTilesToSkip) {\r\n // for (const kid of kids) {\r\n // if (SelectParent.Yes === kid.selectTiles(selected, args, numSkipped)) {\r\n // selected.length = initialSize;\r\n // return SelectParent.Yes;\r\n // }\r\n\r\n // return SelectParent.No;\r\n // }\r\n // }\r\n\r\n // If all visible direct children can be drawn, draw them.\r\n for (const kid of kids) {\r\n if (TileVisibility.OutsideFrustum !== kid.computeVisibility(args)) {\r\n if (!kid.hasGraphics) {\r\n selected.length = initialSize;\r\n return SelectParent.Yes;\r\n } else {\r\n selected.push(kid);\r\n }\r\n }\r\n }\r\n\r\n args.markUsed(this);\r\n }\r\n\r\n // We're drawing either this tile, or its direct children.\r\n return SelectParent.No;\r\n }\r\n\r\n // This tile is too coarse to draw. Try to draw something more appropriate.\r\n // If it is not ready to draw, we may want to skip loading in favor of loading its descendants.\r\n // If we previously loaded and later unloaded content for this tile to free memory, don't force it to reload its content - proceed to children.\r\n const maximumLevelsToSkip = IModelApp.tileAdmin.maximumLevelsToSkip;\r\n let canSkipThisTile = (this._hadGraphics && !this.hasGraphics) /* || this.depth < this.iModelTree.maxInitialTilesToSkip */ ;\r\n if (canSkipThisTile) {\r\n numSkipped = 1;\r\n } else {\r\n canSkipThisTile = this.isReady || this.isParentDisplayable /* || this.depth < this.iModelTree.maxInitialTilesToSkip */ ;\r\n if (canSkipThisTile && this.isDisplayable) { // skipping an undisplayable tile doesn't count toward the maximum\r\n // Some tiles do not sub-divide - they only facet the same geometry to a higher resolution. We can skip directly to the correct resolution.\r\n const isNotReady = !this.isReady && !this.hasGraphics /* && !this.hasSizeMultiplier */ ;\r\n if (isNotReady) {\r\n if (numSkipped >= maximumLevelsToSkip)\r\n canSkipThisTile = false;\r\n else\r\n numSkipped += 1;\r\n }\r\n }\r\n }\r\n\r\n const childrenLoadStatus = this.loadChildren(); // NB: asynchronous\r\n const children = canSkipThisTile ? this._batchedChildren : undefined;\r\n if (canSkipThisTile && TileTreeLoadStatus.Loading === childrenLoadStatus) {\r\n args.markChildrenLoading();\r\n args.markUsed(this);\r\n }\r\n\r\n if (undefined !== children) {\r\n // If we are the root tile and we are not displayable, then we want to draw *any* currently available children in our place, or else we would draw nothing.\r\n // Otherwise, if we want to draw children in our place, we should wait for *all* of them to load, or else we would show missing chunks where not-yet-loaded children belong.\r\n const isUndisplayableRootTile = this.isUndisplayableRootTile;\r\n args.markUsed(this);\r\n let drawChildren = true;\r\n const initialSize = selected.length;\r\n for (const child of children) {\r\n // NB: We must continue iterating children so that they can be requested if missing.\r\n if (SelectParent.Yes === child.selectTiles(selected, args, numSkipped)) {\r\n if (child.loadStatus === TileLoadStatus.NotFound) {\r\n // At least one child we want to draw failed to load. e.g., we reached max depth of map tile tree. Draw parent instead.\r\n drawChildren = canSkipThisTile = false;\r\n } else {\r\n // At least one child we want to draw is not yet loaded. Wait for it to load before drawing it and its siblings, unless we have nothing to draw in their place.\r\n drawChildren = isUndisplayableRootTile;\r\n }\r\n }\r\n }\r\n\r\n if (drawChildren)\r\n return SelectParent.No;\r\n\r\n // Some types of tiles (like maps) allow the ready children to be drawn on top of the parent while other children are not yet loaded.\r\n if (args.parentsAndChildrenExclusive)\r\n selected.length = initialSize;\r\n }\r\n\r\n if (this.isReady) {\r\n if (this.hasGraphics) {\r\n selected.push(this);\r\n if (!canSkipThisTile) {\r\n // This tile is too coarse, but we require loading it before we can start loading higher-res children.\r\n args.markReady(this);\r\n }\r\n }\r\n\r\n return SelectParent.No;\r\n }\r\n\r\n // This tile is not ready to be drawn. Request it *only* if we cannot skip it.\r\n if (!canSkipThisTile)\r\n args.insertMissing(this);\r\n\r\n return this.isParentDisplayable ? SelectParent.Yes : SelectParent.No;\r\n }\r\n\r\n protected override _loadChildren(resolve: (children: Tile[] | undefined) => void, reject: (error: Error) => void): void {\r\n let children: BatchedTile[] | undefined;\r\n if (this._childrenProps) {\r\n try {\r\n for (const childProps of this._childrenProps) {\r\n const params = this.batchedTree.reader.readTileParams(childProps, this);\r\n const child = new BatchedTile(params, this.batchedTree);\r\n children = children ?? [];\r\n children.push(child);\r\n }\r\n } catch (err) {\r\n Logger.logException(loggerCategory, err);\r\n children = undefined;\r\n if (err instanceof Error)\r\n reject(err);\r\n }\r\n }\r\n\r\n resolve(children);\r\n }\r\n\r\n public override get channel(): TileRequestChannel {\r\n if (!channel) {\r\n channel = new TileRequestChannel(\"itwinjs-batched-models\", 20);\r\n IModelApp.tileAdmin.channels.add(channel);\r\n }\r\n\r\n return channel;\r\n }\r\n\r\n public override async requestContent(_isCanceled: () => boolean): Promise<TileRequest.Response> {\r\n const url = new URL(this.contentId, this.batchedTree.reader.baseUrl);\r\n url.search = this.batchedTree.reader.baseUrl.search;\r\n const response = await fetch(url.toString());\r\n return response.arrayBuffer();\r\n }\r\n\r\n public override async readContent(data: TileRequest.ResponseData, system: RenderSystem, shouldAbort?: () => boolean): Promise<TileContent> {\r\n assert(data instanceof Uint8Array);\r\n if (!(data instanceof Uint8Array))\r\n return { };\r\n\r\n let reader: ImdlReader | BatchedTileContentReader | undefined = ImdlReader.create({\r\n stream: ByteStream.fromUint8Array(data),\r\n iModel: this.tree.iModel,\r\n modelId: this.tree.modelId,\r\n is3d: true,\r\n system,\r\n isCanceled: shouldAbort,\r\n options: {\r\n tileId: this.contentId,\r\n },\r\n });\r\n\r\n if (!reader) {\r\n const gltfProps = GltfReaderProps.create(data, false, this.batchedTree.reader.baseUrl);\r\n if (gltfProps) {\r\n reader = new BatchedTileContentReader({\r\n props: gltfProps,\r\n iModel: this.tree.iModel,\r\n system,\r\n shouldAbort,\r\n vertexTableRequired: true,\r\n modelId: this.tree.modelId,\r\n isLeaf: this.isLeaf,\r\n range: this.range,\r\n });\r\n }\r\n }\r\n\r\n if (!reader)\r\n return { };\r\n\r\n return reader.read();\r\n }\r\n\r\n protected override addRangeGraphic(builder: GraphicBuilder, type: TileBoundingBoxes): void {\r\n if (TileBoundingBoxes.ChildVolumes !== type) {\r\n super.addRangeGraphic(builder, type);\r\n return;\r\n }\r\n\r\n builder.setSymbology(ColorDef.green, ColorDef.green, 2);\r\n builder.addRangeBox(this.range);\r\n\r\n this.loadChildren();\r\n const children = this.children;\r\n if (!children)\r\n return;\r\n\r\n builder.setSymbology(ColorDef.blue, ColorDef.blue.withTransparency(0xdf), 1);\r\n for (const child of children) {\r\n const range = child.range;\r\n builder.addRangeBox(range);\r\n builder.addRangeBox(range, true);\r\n }\r\n }\r\n\r\n public prune(olderThan: BeTimePoint): void {\r\n const children = this._batchedChildren;\r\n if (!children)\r\n return;\r\n\r\n if (this.usageMarker.isExpired(olderThan)) {\r\n this.disposeChildren();\r\n } else {\r\n for (const child of children)\r\n child.prune(olderThan);\r\n }\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"BatchedTile.js","sourceRoot":"","sources":["../../src/BatchedTile.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\nimport { assert, BeTimePoint, ByteStream, Logger } from \"@itwin/core-bentley\";\r\nimport { ColorDef, Tileset3dSchema } from \"@itwin/core-common\";\r\nimport {\r\n GltfReaderProps, GraphicBuilder, ImdlReader, IModelApp, RealityTileLoader, RenderSystem, SelectParent, Tile, TileBoundingBoxes, TileContent,\r\n TileDrawArgs, TileLoadStatus, TileParams, TileRequest, TileRequestChannel, TileTreeLoadStatus, TileUser, TileVisibility, Viewport,\r\n} from \"@itwin/core-frontend\";\r\nimport { loggerCategory } from \"./LoggerCategory\";\r\nimport { BatchedTileTree } from \"./BatchedTileTree\";\r\nimport { BatchedTileContentReader } from \"./BatchedTileContentReader\";\r\nimport { getMaxLevelsToSkip } from \"./FrontendTiles\";\r\n\r\n/** @internal */\r\nexport interface BatchedTileParams extends TileParams {\r\n childrenProps: Tileset3dSchema.Tile[] | undefined;\r\n}\r\n\r\nlet channel: TileRequestChannel | undefined;\r\n\r\n/** @internal */\r\nexport class BatchedTile extends Tile {\r\n private readonly _childrenProps?: Tileset3dSchema.Tile[];\r\n\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 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: BatchedTile[], args: TileDrawArgs, numSkipped: number): SelectParent {\r\n const vis = this.computeVisibility(args);\r\n if (TileVisibility.OutsideFrustum === vis)\r\n return SelectParent.No;\r\n\r\n if (TileVisibility.Visible === vis) {\r\n // This tile is of appropriate resolution to draw. If need loading or refinement, enqueue.\r\n if (!this.isReady)\r\n args.insertMissing(this);\r\n\r\n if (this.hasGraphics) {\r\n // It can be drawn - select it\r\n args.markReady(this);\r\n selected.push(this);\r\n } else if (!this.isReady) {\r\n // It can't be drawn. Try to draw children in its place; otherwise draw the parent.\r\n // Do not load/request the children for this purpose.\r\n const initialSize = selected.length;\r\n const kids = this._batchedChildren;\r\n if (undefined === kids)\r\n return SelectParent.Yes;\r\n\r\n // Find any descendant to draw, until we exceed max initial tiles to skip.\r\n // if (this.depth < this.iModelTree.maxInitialTilesToSkip) {\r\n // for (const kid of kids) {\r\n // if (SelectParent.Yes === kid.selectTiles(selected, args, numSkipped)) {\r\n // selected.length = initialSize;\r\n // return SelectParent.Yes;\r\n // }\r\n\r\n // return SelectParent.No;\r\n // }\r\n // }\r\n\r\n // If all visible direct children can be drawn, draw them.\r\n for (const kid of kids) {\r\n if (TileVisibility.OutsideFrustum !== kid.computeVisibility(args)) {\r\n if (!kid.hasGraphics) {\r\n selected.length = initialSize;\r\n return SelectParent.Yes;\r\n } else {\r\n selected.push(kid);\r\n }\r\n }\r\n }\r\n\r\n args.markUsed(this);\r\n }\r\n\r\n // We're drawing either this tile, or its direct children.\r\n return SelectParent.No;\r\n }\r\n\r\n // This tile is too coarse to draw. Try to draw something more appropriate.\r\n // If it is not ready to draw, we may want to skip loading in favor of loading its descendants.\r\n // If we previously loaded and later unloaded content for this tile to free memory, don't force it to reload its content - proceed to children.\r\n const maximumLevelsToSkip = getMaxLevelsToSkip();\r\n let canSkipThisTile = (this._hadGraphics && !this.hasGraphics) /* || this.depth < this.iModelTree.maxInitialTilesToSkip */ ;\r\n if (canSkipThisTile) {\r\n numSkipped = 1;\r\n } else {\r\n canSkipThisTile = this.isReady || this.isParentDisplayable /* || this.depth < this.iModelTree.maxInitialTilesToSkip */ ;\r\n if (canSkipThisTile && this.isDisplayable) { // skipping an undisplayable tile doesn't count toward the maximum\r\n // Some tiles do not sub-divide - they only facet the same geometry to a higher resolution. We can skip directly to the correct resolution.\r\n const isNotReady = !this.isReady && !this.hasGraphics /* && !this.hasSizeMultiplier */ ;\r\n if (isNotReady) {\r\n if (numSkipped >= maximumLevelsToSkip)\r\n canSkipThisTile = false;\r\n else\r\n numSkipped += 1;\r\n }\r\n }\r\n }\r\n\r\n const childrenLoadStatus = this.loadChildren(); // NB: asynchronous\r\n const children = canSkipThisTile ? this._batchedChildren : undefined;\r\n if (canSkipThisTile && TileTreeLoadStatus.Loading === childrenLoadStatus) {\r\n args.markChildrenLoading();\r\n args.markUsed(this);\r\n }\r\n\r\n if (undefined !== children) {\r\n // If we are the root tile and we are not displayable, then we want to draw *any* currently available children in our place, or else we would draw nothing.\r\n // Otherwise, if we want to draw children in our place, we should wait for *all* of them to load, or else we would show missing chunks where not-yet-loaded children belong.\r\n const isUndisplayableRootTile = this.isUndisplayableRootTile;\r\n args.markUsed(this);\r\n let drawChildren = true;\r\n const initialSize = selected.length;\r\n for (const child of children) {\r\n // NB: We must continue iterating children so that they can be requested if missing.\r\n if (SelectParent.Yes === child.selectTiles(selected, args, numSkipped)) {\r\n if (child.loadStatus === TileLoadStatus.NotFound) {\r\n // At least one child we want to draw failed to load. e.g., we reached max depth of map tile tree. Draw parent instead.\r\n drawChildren = canSkipThisTile = false;\r\n } else {\r\n // At least one child we want to draw is not yet loaded. Wait for it to load before drawing it and its siblings, unless we have nothing to draw in their place.\r\n drawChildren = isUndisplayableRootTile;\r\n }\r\n }\r\n }\r\n\r\n if (drawChildren)\r\n return SelectParent.No;\r\n\r\n // Some types of tiles (like maps) allow the ready children to be drawn on top of the parent while other children are not yet loaded.\r\n if (args.parentsAndChildrenExclusive)\r\n selected.length = initialSize;\r\n }\r\n\r\n if (this.isReady) {\r\n if (this.hasGraphics) {\r\n selected.push(this);\r\n if (!canSkipThisTile) {\r\n // This tile is too coarse, but we require loading it before we can start loading higher-res children.\r\n args.markReady(this);\r\n }\r\n }\r\n\r\n return SelectParent.No;\r\n }\r\n\r\n // This tile is not ready to be drawn. Request it *only* if we cannot skip it.\r\n if (!canSkipThisTile)\r\n args.insertMissing(this);\r\n\r\n return this.isParentDisplayable ? SelectParent.Yes : SelectParent.No;\r\n }\r\n\r\n protected override _loadChildren(resolve: (children: Tile[] | undefined) => void, reject: (error: Error) => void): void {\r\n let children: BatchedTile[] | undefined;\r\n if (this._childrenProps) {\r\n try {\r\n for (const childProps of this._childrenProps) {\r\n const params = this.batchedTree.reader.readTileParams(childProps, this);\r\n const child = new BatchedTile(params, this.batchedTree);\r\n children = children ?? [];\r\n children.push(child);\r\n }\r\n } catch (err) {\r\n Logger.logException(loggerCategory, err);\r\n children = undefined;\r\n if (err instanceof Error)\r\n reject(err);\r\n }\r\n }\r\n\r\n resolve(children);\r\n }\r\n\r\n public override get channel(): TileRequestChannel {\r\n if (!channel) {\r\n channel = new TileRequestChannel(\"itwinjs-batched-models\", 20);\r\n IModelApp.tileAdmin.channels.add(channel);\r\n }\r\n\r\n return channel;\r\n }\r\n\r\n public override async requestContent(_isCanceled: () => boolean): Promise<TileRequest.Response> {\r\n const url = new URL(this.contentId, this.batchedTree.reader.baseUrl);\r\n url.search = this.batchedTree.reader.baseUrl.search;\r\n const response = await fetch(url.toString());\r\n return response.arrayBuffer();\r\n }\r\n\r\n public override async readContent(data: TileRequest.ResponseData, system: RenderSystem, shouldAbort?: () => boolean): Promise<TileContent> {\r\n assert(data instanceof Uint8Array);\r\n if (!(data instanceof Uint8Array))\r\n return { };\r\n\r\n let reader: ImdlReader | BatchedTileContentReader | undefined = ImdlReader.create({\r\n stream: ByteStream.fromUint8Array(data),\r\n iModel: this.tree.iModel,\r\n modelId: this.tree.modelId,\r\n is3d: true,\r\n system,\r\n isCanceled: shouldAbort,\r\n options: {\r\n tileId: this.contentId,\r\n },\r\n });\r\n\r\n if (!reader) {\r\n const gltfProps = GltfReaderProps.create(data, false, this.batchedTree.reader.baseUrl);\r\n if (gltfProps) {\r\n reader = new BatchedTileContentReader({\r\n props: gltfProps,\r\n iModel: this.tree.iModel,\r\n system,\r\n shouldAbort,\r\n vertexTableRequired: true,\r\n modelId: this.tree.modelId,\r\n isLeaf: this.isLeaf,\r\n range: this.range,\r\n });\r\n }\r\n }\r\n\r\n if (!reader)\r\n return { };\r\n\r\n return reader.read();\r\n }\r\n\r\n protected override addRangeGraphic(builder: GraphicBuilder, type: TileBoundingBoxes): void {\r\n if (TileBoundingBoxes.ChildVolumes !== type) {\r\n super.addRangeGraphic(builder, type);\r\n return;\r\n }\r\n\r\n builder.setSymbology(ColorDef.green, ColorDef.green, 2);\r\n builder.addRangeBox(this.range);\r\n\r\n this.loadChildren();\r\n const children = this.children;\r\n if (!children)\r\n return;\r\n\r\n builder.setSymbology(ColorDef.blue, ColorDef.blue.withTransparency(0xdf), 1);\r\n for (const child of children) {\r\n const range = child.range;\r\n builder.addRangeBox(range);\r\n builder.addRangeBox(range, true);\r\n }\r\n }\r\n\r\n public prune(olderThan: BeTimePoint): void {\r\n const children = this._batchedChildren;\r\n if (!children)\r\n return;\r\n\r\n if (this.usageMarker.isExpired(olderThan)) {\r\n this.disposeChildren();\r\n } else {\r\n for (const child of children)\r\n child.prune(olderThan);\r\n }\r\n }\r\n}\r\n"]}
@@ -1,13 +1,31 @@
1
- import { IModelConnection } from "@itwin/core-frontend";
1
+ import { IModelConnection, SpatialTileTreeReferences } from "@itwin/core-frontend";
2
+ /** A function that can provide the base URL where a tileset representing all of the spatial models in a given iModel are stored.
3
+ * 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/).
4
+ * If no such tileset exists for the given iModel, return `undefined`.
5
+ * @see [[FrontendTilesOptions.computeSpatialTilesetBaseUrl]].
6
+ * @alpha
7
+ */
8
+ export type ComputeSpatialTilesetBaseUrl = (iModel: IModelConnection) => Promise<URL | undefined>;
2
9
  /** Options supplied to [[initializeFrontendTiles]].
3
10
  * @alpha
4
11
  */
5
12
  export interface FrontendTilesOptions {
6
- /** Given an iModel, provide the base URL where the tiles are stored representing all of the spatial models in the iModel.
7
- * It is expected that baseUrl/tileset.json exists and contains a 3d tileset in which all relative URLs are relative to baseUrl.
13
+ /** Provide the base URL for the pre-published tileset for a given iModel. */
14
+ computeSpatialTilesetBaseUrl: ComputeSpatialTilesetBaseUrl;
15
+ /** 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.
16
+ * Default: 4.
17
+ * Reducing this value will load more intermediate tiles, which causes more gradual refinement: low-resolution tiles will display quickly, followed more gradually by
18
+ * successively higher-resolution ones.
19
+ * 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
20
+ * 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
21
+ * 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.
8
22
  */
9
- computeSpatialTilesetBaseUrl: (iModel: IModelConnection) => URL;
23
+ maxLevelsToSkip?: number;
10
24
  }
25
+ /** @internal */
26
+ export declare const createFallbackSpatialTileTreeReferences: typeof SpatialTileTreeReferences.create;
27
+ /** @internal */
28
+ export declare function getMaxLevelsToSkip(): number;
11
29
  /** Initialize the frontend-tiles package to obtain tiles for spatial views.
12
30
  * @alpha
13
31
  */
@@ -1 +1 @@
1
- {"version":3,"file":"FrontendTiles.d.ts","sourceRoot":"","sources":["../../src/FrontendTiles.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,gBAAgB,EAA+C,MAAM,sBAAsB,CAAC;AAGrG;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC;;OAEG;IACH,4BAA4B,EAAE,CAAC,MAAM,EAAE,gBAAgB,KAAK,GAAG,CAAC;CACjE;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,oBAAoB,GAAG,IAAI,CAE3E"}
1
+ {"version":3,"file":"FrontendTiles.d.ts","sourceRoot":"","sources":["../../src/FrontendTiles.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,gBAAgB,EAAE,yBAAyB,EAAoB,MAAM,sBAAsB,CAAC;AAGrG;;;;;GAKG;AACH,MAAM,MAAM,4BAA4B,GAAG,CAAC,MAAM,EAAE,gBAAgB,KAAK,OAAO,CAAC,GAAG,GAAG,SAAS,CAAC,CAAC;AAElG;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,6EAA6E;IAC7E,4BAA4B,EAAE,4BAA4B,CAAC;IAC3D;;;;;;;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,CAK3E"}
@@ -4,13 +4,23 @@
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 = void 0;
7
+ exports.initializeFrontendTiles = exports.getMaxLevelsToSkip = exports.createFallbackSpatialTileTreeReferences = void 0;
8
8
  const core_frontend_1 = require("@itwin/core-frontend");
9
9
  const BatchedSpatialTileTreeRefs_1 = require("./BatchedSpatialTileTreeRefs");
10
+ /** @internal */
11
+ exports.createFallbackSpatialTileTreeReferences = core_frontend_1.SpatialTileTreeReferences.create;
12
+ let maxLevelsToSkip = 4;
13
+ /** @internal */
14
+ function getMaxLevelsToSkip() {
15
+ return maxLevelsToSkip;
16
+ }
17
+ exports.getMaxLevelsToSkip = getMaxLevelsToSkip;
10
18
  /** Initialize the frontend-tiles package to obtain tiles for spatial views.
11
19
  * @alpha
12
20
  */
13
21
  function initializeFrontendTiles(options) {
22
+ if (undefined !== options.maxLevelsToSkip && options.maxLevelsToSkip >= 0)
23
+ maxLevelsToSkip = options.maxLevelsToSkip;
14
24
  core_frontend_1.SpatialTileTreeReferences.create = (view) => (0, BatchedSpatialTileTreeRefs_1.createBatchedSpatialTileTreeReferences)(view, options.computeSpatialTilesetBaseUrl);
15
25
  }
16
26
  exports.initializeFrontendTiles = initializeFrontendTiles;
@@ -1 +1 @@
1
- {"version":3,"file":"FrontendTiles.js","sourceRoot":"","sources":["../../src/FrontendTiles.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;;;AAE/F,wDAAqG;AACrG,6EAAsF;AAYtF;;GAEG;AACH,SAAgB,uBAAuB,CAAC,OAA6B;IACnE,yCAAyB,CAAC,MAAM,GAAG,CAAC,IAAsB,EAAE,EAAE,CAAC,IAAA,mEAAsC,EAAC,IAAI,EAAE,OAAO,CAAC,4BAA4B,CAAC,CAAC;AACpJ,CAAC;AAFD,0DAEC","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 { IModelConnection, SpatialTileTreeReferences, SpatialViewState } from \"@itwin/core-frontend\";\r\nimport { createBatchedSpatialTileTreeReferences } from \"./BatchedSpatialTileTreeRefs\";\r\n\r\n/** Options supplied to [[initializeFrontendTiles]].\r\n * @alpha\r\n */\r\nexport interface FrontendTilesOptions {\r\n /** Given an iModel, provide the base URL where the tiles are stored representing all of the spatial models in the iModel.\r\n * It is expected that baseUrl/tileset.json exists and contains a 3d tileset in which all relative URLs are relative to baseUrl.\r\n */\r\n computeSpatialTilesetBaseUrl: (iModel: IModelConnection) => URL;\r\n}\r\n\r\n/** Initialize the frontend-tiles package to obtain tiles for spatial views.\r\n * @alpha\r\n */\r\nexport function initializeFrontendTiles(options: FrontendTilesOptions): void {\r\n SpatialTileTreeReferences.create = (view: SpatialViewState) => createBatchedSpatialTileTreeReferences(view, options.computeSpatialTilesetBaseUrl);\r\n}\r\n"]}
1
+ {"version":3,"file":"FrontendTiles.js","sourceRoot":"","sources":["../../src/FrontendTiles.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;;;AAE/F,wDAAqG;AACrG,6EAAsF;AA2BtF,gBAAgB;AACH,QAAA,uCAAuC,GAAG,yCAAyB,CAAC,MAAM,CAAC;AAExF,IAAI,eAAe,GAAG,CAAC,CAAC;AAExB,gBAAgB;AAChB,SAAgB,kBAAkB;IAChC,OAAO,eAAe,CAAC;AACzB,CAAC;AAFD,gDAEC;AAED;;GAEG;AACH,SAAgB,uBAAuB,CAAC,OAA6B;IACnE,IAAI,SAAS,KAAK,OAAO,CAAC,eAAe,IAAI,OAAO,CAAC,eAAe,IAAI,CAAC;QACvE,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC;IAE5C,yCAAyB,CAAC,MAAM,GAAG,CAAC,IAAsB,EAAE,EAAE,CAAC,IAAA,mEAAsC,EAAC,IAAI,EAAE,OAAO,CAAC,4BAA4B,CAAC,CAAC;AACpJ,CAAC;AALD,0DAKC","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 { IModelConnection, SpatialTileTreeReferences, SpatialViewState } from \"@itwin/core-frontend\";\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 * @alpha\r\n */\r\nexport type ComputeSpatialTilesetBaseUrl = (iModel: IModelConnection) => Promise<URL | undefined>;\r\n\r\n/** Options supplied to [[initializeFrontendTiles]].\r\n * @alpha\r\n */\r\nexport interface FrontendTilesOptions {\r\n /** Provide the base URL for the pre-published tileset for a given iModel. */\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 * @alpha\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 SpatialTileTreeReferences.create = (view: SpatialViewState) => createBatchedSpatialTileTreeReferences(view, options.computeSpatialTilesetBaseUrl);\r\n}\r\n"]}