@itwin/frontend-tiles 5.7.0-dev.8 → 5.8.0-dev.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,6 +1,11 @@
1
1
  # Change Log - @itwin/frontend-tiles
2
2
 
3
- This log was last generated on Thu, 05 Feb 2026 16:14:10 GMT and should not be manually modified.
3
+ This log was last generated on Fri, 13 Feb 2026 17:13:15 GMT and should not be manually modified.
4
+
5
+ ## 5.6.1
6
+ Fri, 13 Feb 2026 17:11:47 GMT
7
+
8
+ _Version update only_
4
9
 
5
10
  ## 5.6.0
6
11
  Thu, 05 Feb 2026 16:12:37 GMT
@@ -242,7 +242,7 @@ async function fetchTilesetSpec(iModel, computeBaseUrl) {
242
242
  return BatchedTilesetReader_js_1.BatchedTilesetSpec.create(baseUrl, json);
243
243
  }
244
244
  catch (err) {
245
- core_bentley_1.Logger.logException(LoggerCategory_js_1.loggerCategory, err);
245
+ core_bentley_1.Logger.logError(LoggerCategory_js_1.loggerCategory, err);
246
246
  return null;
247
247
  }
248
248
  }
@@ -1 +1 @@
1
- {"version":3,"file":"BatchedSpatialTileTreeRefs.js","sourceRoot":"","sources":["../../src/BatchedSpatialTileTreeRefs.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\nimport { Id64String, Logger, OrderedId64Iterable } from \"@itwin/core-bentley\";\r\nimport { RenderSchedule } from \"@itwin/core-common\";\r\nimport {\r\n AnimationNodeId,\r\n AttachToViewportArgs, collectMaskRefs, createSpatialTileTreeReferences, IModelConnection, SpatialTileTreeReferences, SpatialViewState,\r\n TileTreeLoadStatus, TileTreeOwner, TileTreeReference,\r\n Viewport,\r\n} from \"@itwin/core-frontend\";\r\nimport { Range3d } from \"@itwin/core-geometry\";\r\nimport { BatchedModelGroups } from \"./BatchedModelGroups.js\";\r\nimport { BatchedModels } from \"./BatchedModels.js\";\r\nimport { BatchedTilesetSpec } from \"./BatchedTilesetReader.js\";\r\nimport { BatchedTileTreeReference, BatchedTileTreeReferenceArgs } from \"./BatchedTileTreeReference.js\";\r\nimport { getBatchedTileTreeOwner } from \"./BatchedTileTreeSupplier.js\";\r\nimport { ComputeSpatialTilesetBaseUrl } from \"./FrontendTiles.js\";\r\nimport { loggerCategory } from \"./LoggerCategory.js\";\r\n\r\n// Obtains tiles pre-published by mesh export service.\r\nclass BatchedSpatialTileTreeReferences implements SpatialTileTreeReferences {\r\n private readonly _view: SpatialViewState;\r\n private readonly _models: BatchedModels;\r\n private readonly _groups: BatchedModelGroups;\r\n private readonly _spec: BatchedTilesetSpec;\r\n private _treeOwner: TileTreeOwner;\r\n private _refs: BatchedTileTreeReference[] = [];\r\n private _currentScript?: RenderSchedule.Script;\r\n private _onModelSelectorChanged?: () => void;\r\n /** Provides tile trees for models that are not included in the batched tile set. */\r\n private readonly _excludedRefs: SpatialTileTreeReferences;\r\n private _removeSceneInvalidationListener?: () => void;\r\n\r\n public constructor(spec: BatchedTilesetSpec, view: SpatialViewState) {\r\n this._view = view;\r\n this._models = new BatchedModels(view, spec.models);\r\n this._spec = spec;\r\n\r\n const script = view.displayStyle.scheduleScript;\r\n this._currentScript = script?.requiresBatching ? script : undefined;\r\n\r\n const includedModels = new Set(spec.models.keys());\r\n this._excludedRefs = createSpatialTileTreeReferences(view, includedModels);\r\n\r\n this._groups = new BatchedModelGroups(view, this._currentScript, includedModels, spec.models);\r\n this._treeOwner = this.getTreeOwner();\r\n this.loadRefs();\r\n\r\n this.listenForScriptChange();\r\n }\r\n\r\n private ensureLoaded(): void {\r\n if (!this._groups.update())\r\n return;\r\n\r\n this._treeOwner = this.getTreeOwner();\r\n this.loadRefs();\r\n }\r\n\r\n private getTreeOwner(): TileTreeOwner {\r\n return getBatchedTileTreeOwner(this._view.iModel, {\r\n spec: this._spec,\r\n script: this._currentScript,\r\n modelGroups: this._groups.guid,\r\n });\r\n }\r\n\r\n private listenForScriptChange(): void {\r\n const onScriptChanged = (newScript: RenderSchedule.Script | undefined) => {\r\n if (!newScript?.requiresBatching)\r\n newScript = undefined;\r\n\r\n const currentScript = this._currentScript;\r\n this._currentScript = newScript;\r\n\r\n if (newScript !== currentScript)\r\n if (!newScript || !currentScript || !newScript.equals(currentScript))\r\n this._groups.setScript(newScript);\r\n };\r\n\r\n let rmListener = this._view.displayStyle.onScheduleScriptChanged.addListener((newScript) => onScriptChanged(newScript));\r\n this._view.onDisplayStyleChanged.addListener((newStyle) => {\r\n rmListener();\r\n onScriptChanged(newStyle.scheduleScript);\r\n rmListener = this._view.displayStyle.onScheduleScriptChanged.addListener((newScript) => onScriptChanged(newScript));\r\n });\r\n }\r\n\r\n private loadRefs(): void {\r\n this._refs.length = 0;\r\n const groups = this._groups.groups;\r\n const args: BatchedTileTreeReferenceArgs = {\r\n models: this._models,\r\n groups,\r\n treeOwner: this._treeOwner,\r\n getCurrentTimePoint: () => this._currentScript ? (this._view.displayStyle.settings.timePoint ?? this._currentScript.duration.low) : 0,\r\n getBackgroundBase: () => this._view.displayStyle.settings.mapImagery.backgroundBase,\r\n getBackgroundLayers: () => this._view.displayStyle.settings.mapImagery.backgroundLayers,\r\n iModel: this._view.iModel,\r\n };\r\n\r\n for (let i = 0; i < groups.length; i++) {\r\n const timeline = groups[i].timeline;\r\n this._refs.push(new BatchedTileTreeReference(args, i, timeline ? AnimationNodeId.Untransformed : undefined));\r\n if (timeline) {\r\n for (const nodeId of timeline.transformBatchIds)\r\n this._refs.push(new BatchedTileTreeReference(args, i, nodeId));\r\n }\r\n }\r\n }\r\n\r\n public *[Symbol.iterator](): Iterator<TileTreeReference> {\r\n this.ensureLoaded();\r\n for (const ref of this._refs)\r\n yield ref;\r\n\r\n for (const ref of this._excludedRefs)\r\n yield ref;\r\n }\r\n\r\n public update(): void {\r\n this._excludedRefs.update();\r\n this._models.setViewedModels(this._view.modelSelector.models);\r\n if (this._onModelSelectorChanged)\r\n this._onModelSelectorChanged();\r\n }\r\n\r\n public attachToViewport(args: AttachToViewportArgs): void {\r\n this._onModelSelectorChanged = () => args.invalidateSymbologyOverrides();\r\n this._excludedRefs.attachToViewport(args);\r\n this._removeSceneInvalidationListener = args.onSceneInvalidated.addListener(() => this._groups.invalidateTransforms());\r\n }\r\n\r\n public detachFromViewport(): void {\r\n this._onModelSelectorChanged = undefined;\r\n this._excludedRefs.detachFromViewport();\r\n\r\n if (this._removeSceneInvalidationListener) {\r\n this._removeSceneInvalidationListener();\r\n this._removeSceneInvalidationListener = undefined;\r\n }\r\n }\r\n\r\n // Collects the TileTreeReferences for the models that need to be drawn to create the planar clip mask.\r\n // For every model used by the mask (modelIds), extend the maskRange by that model's range.\r\n public collectMaskRefs(modelIds: OrderedId64Iterable, maskTreeRefs: TileTreeReference[], maskRange: Range3d): void {\r\n // Use V1 tiles for masking - producing the mask from batched tiles can significantly impact performance.\r\n return collectMaskRefs(this._view, modelIds, undefined, maskTreeRefs, maskRange);\r\n }\r\n\r\n // Returns a list of the models that are NOT in the planar clip mask.\r\n public getModelsNotInMask(_maskModels: OrderedId64Iterable | undefined, _useVisible: boolean): Id64String[] | undefined {\r\n return undefined;\r\n }\r\n\r\n // _view.models\r\n public setDeactivated(): void {\r\n // Used for debugging. Unimplemented here.\r\n }\r\n}\r\n\r\n// A placeholder used by [[ProxySpatialTileTreeReferences]] until asynchronous loading completes.\r\n// It provides a TileTreeOwner that never loads a tile tree.\r\n// This ensures that [ViewState.areAllTileTreesLoaded]($frontend) will not return `true` while we are loading.\r\nclass ProxyTileTreeReference extends TileTreeReference {\r\n private readonly _treeOwner: TileTreeOwner;\r\n\r\n public constructor(iModel: IModelConnection) {\r\n super();\r\n this._treeOwner = {\r\n iModel,\r\n tileTree: undefined,\r\n loadStatus: TileTreeLoadStatus.NotLoaded,\r\n load: () => undefined,\r\n [Symbol.dispose]: () => { },\r\n loadTree: async () => Promise.resolve(undefined),\r\n };\r\n }\r\n\r\n public override get treeOwner() {\r\n return this._treeOwner;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public override get _isLoadingComplete() {\r\n return false;\r\n }\r\n}\r\n\r\n// Serves as a placeholder while we asynchronously obtain the base URL for a pre-published tileset (or asynchronously determine\r\n// that no such tileset exists).\r\nclass ProxySpatialTileTreeReferences implements SpatialTileTreeReferences {\r\n // Once async loading completes, all methods will be forwarded to this implementation.\r\n private _impl?: SpatialTileTreeReferences;\r\n private readonly _proxyRef: ProxyTileTreeReference;\r\n // Retained if attachToViewport is called while we are still loading; and reset if detachFromViewport is called while loading.\r\n private _attachArgs?: AttachToViewportArgs;\r\n\r\n public constructor(view: SpatialViewState, getSpec: Promise<BatchedTilesetSpec | null>, nopFallback: boolean = false) {\r\n this._proxyRef = new ProxyTileTreeReference(view.iModel);\r\n getSpec.then((spec: BatchedTilesetSpec | null) => {\r\n if (spec) {\r\n this.setTreeRefs(new BatchedSpatialTileTreeReferences(spec, view));\r\n } else if(nopFallback) {\r\n this.setTreeRefs(new EmptySpatialTileTreeReferences());\r\n }else {\r\n this.setTreeRefs(createSpatialTileTreeReferences(view));\r\n }\r\n }).catch(() => {\r\n if(nopFallback) {\r\n this.setTreeRefs(new EmptySpatialTileTreeReferences());\r\n }else {\r\n this.setTreeRefs(createSpatialTileTreeReferences(view));\r\n }\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 // Force scene invalidation after replacing Proxy with real BatchedTileTree\r\n this._attachArgs.invalidateScene();\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 public collectMaskRefs(modelIds: OrderedId64Iterable, maskTreeRefs: TileTreeReference[], maskRange: Range3d): void {\r\n this._impl?.collectMaskRefs(modelIds, maskTreeRefs, maskRange);\r\n }\r\n\r\n public getModelsNotInMask(maskModels: OrderedId64Iterable | undefined, useVisible: boolean): Id64String[] | undefined {\r\n if (this._impl)\r\n return this._impl.getModelsNotInMask(maskModels, useVisible);\r\n else\r\n return undefined;\r\n }\r\n}\r\n\r\nconst iModelToTilesetSpec = new Map<IModelConnection, BatchedTilesetSpec | null | Promise<BatchedTilesetSpec | null>>();\r\n\r\nasync function fetchTilesetSpec(iModel: IModelConnection, computeBaseUrl: ComputeSpatialTilesetBaseUrl): Promise<BatchedTilesetSpec | null> {\r\n try {\r\n const baseUrl = await computeBaseUrl(iModel);\r\n if (undefined === baseUrl)\r\n return null;\r\n\r\n const url = new URL(\"tileset.json\", baseUrl);\r\n url.search = baseUrl.search;\r\n const response = await fetch(url.toString());\r\n const json = await response.json();\r\n return BatchedTilesetSpec.create(baseUrl, json);\r\n } catch (err) {\r\n Logger.logException(loggerCategory, err);\r\n return null;\r\n }\r\n}\r\n\r\nclass EmptySpatialTileTreeReferences implements SpatialTileTreeReferences {\r\n public update(): void {}\r\n\r\n public setDeactivated(_modelIds: string | string[] | undefined, _deactivated: boolean | undefined, _refs: \"all\" | \"animated\" | \"primary\" | \"section\" | number[]): void {}\r\n\r\n public attachToViewport(_args: Viewport): void {}\r\n\r\n public detachFromViewport(): void {}\r\n\r\n public collectMaskRefs(_modelIds: OrderedId64Iterable, _maskTreeRefs: TileTreeReference[]): void {};\r\n\r\n public getModelsNotInMask(_maskModels: OrderedId64Iterable | undefined, _useVisible: boolean): string[] | undefined {\r\n return undefined;\r\n }\r\n\r\n public *[Symbol.iterator](): Iterator<TileTreeReference> {}\r\n}\r\n\r\n/** @internal */\r\nexport function createBatchedSpatialTileTreeReferences(view: SpatialViewState, computeBaseUrl: ComputeSpatialTilesetBaseUrl, nopFallback: boolean = false): SpatialTileTreeReferences {\r\n const iModel = view.iModel;\r\n let entry = iModelToTilesetSpec.get(iModel);\r\n if (undefined === entry) {\r\n const promise = entry = fetchTilesetSpec(iModel, computeBaseUrl);\r\n iModelToTilesetSpec.set(iModel, entry);\r\n iModel.onClose.addOnce(() => iModelToTilesetSpec.delete(iModel));\r\n\r\n promise.then((spec: BatchedTilesetSpec | null) => {\r\n if (iModelToTilesetSpec.has(iModel))\r\n iModelToTilesetSpec.set(iModel, spec);\r\n }).catch(() => {\r\n if (iModelToTilesetSpec.has(iModel))\r\n iModelToTilesetSpec.set(iModel, null);\r\n });\r\n }\r\n\r\n if (null === entry) {\r\n // No tileset could be obtained for this iModel - use empty tile tree if requested.\r\n if (nopFallback) {\r\n return new EmptySpatialTileTreeReferences();\r\n }\r\n\r\n // No tileset could be obtained for this iModel - use default tile generation instead.\r\n return createSpatialTileTreeReferences(view);\r\n }\r\n\r\n if (entry instanceof Promise)\r\n return new ProxySpatialTileTreeReferences(view, entry, nopFallback);\r\n\r\n return new BatchedSpatialTileTreeReferences(entry, view);\r\n}\r\n\r\n"]}
1
+ {"version":3,"file":"BatchedSpatialTileTreeRefs.js","sourceRoot":"","sources":["../../src/BatchedSpatialTileTreeRefs.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\nimport { Id64String, Logger, OrderedId64Iterable } from \"@itwin/core-bentley\";\r\nimport { RenderSchedule } from \"@itwin/core-common\";\r\nimport {\r\n AnimationNodeId,\r\n AttachToViewportArgs, collectMaskRefs, createSpatialTileTreeReferences, IModelConnection, SpatialTileTreeReferences, SpatialViewState,\r\n TileTreeLoadStatus, TileTreeOwner, TileTreeReference,\r\n Viewport,\r\n} from \"@itwin/core-frontend\";\r\nimport { Range3d } from \"@itwin/core-geometry\";\r\nimport { BatchedModelGroups } from \"./BatchedModelGroups.js\";\r\nimport { BatchedModels } from \"./BatchedModels.js\";\r\nimport { BatchedTilesetSpec } from \"./BatchedTilesetReader.js\";\r\nimport { BatchedTileTreeReference, BatchedTileTreeReferenceArgs } from \"./BatchedTileTreeReference.js\";\r\nimport { getBatchedTileTreeOwner } from \"./BatchedTileTreeSupplier.js\";\r\nimport { ComputeSpatialTilesetBaseUrl } from \"./FrontendTiles.js\";\r\nimport { loggerCategory } from \"./LoggerCategory.js\";\r\n\r\n// Obtains tiles pre-published by mesh export service.\r\nclass BatchedSpatialTileTreeReferences implements SpatialTileTreeReferences {\r\n private readonly _view: SpatialViewState;\r\n private readonly _models: BatchedModels;\r\n private readonly _groups: BatchedModelGroups;\r\n private readonly _spec: BatchedTilesetSpec;\r\n private _treeOwner: TileTreeOwner;\r\n private _refs: BatchedTileTreeReference[] = [];\r\n private _currentScript?: RenderSchedule.Script;\r\n private _onModelSelectorChanged?: () => void;\r\n /** Provides tile trees for models that are not included in the batched tile set. */\r\n private readonly _excludedRefs: SpatialTileTreeReferences;\r\n private _removeSceneInvalidationListener?: () => void;\r\n\r\n public constructor(spec: BatchedTilesetSpec, view: SpatialViewState) {\r\n this._view = view;\r\n this._models = new BatchedModels(view, spec.models);\r\n this._spec = spec;\r\n\r\n const script = view.displayStyle.scheduleScript;\r\n this._currentScript = script?.requiresBatching ? script : undefined;\r\n\r\n const includedModels = new Set(spec.models.keys());\r\n this._excludedRefs = createSpatialTileTreeReferences(view, includedModels);\r\n\r\n this._groups = new BatchedModelGroups(view, this._currentScript, includedModels, spec.models);\r\n this._treeOwner = this.getTreeOwner();\r\n this.loadRefs();\r\n\r\n this.listenForScriptChange();\r\n }\r\n\r\n private ensureLoaded(): void {\r\n if (!this._groups.update())\r\n return;\r\n\r\n this._treeOwner = this.getTreeOwner();\r\n this.loadRefs();\r\n }\r\n\r\n private getTreeOwner(): TileTreeOwner {\r\n return getBatchedTileTreeOwner(this._view.iModel, {\r\n spec: this._spec,\r\n script: this._currentScript,\r\n modelGroups: this._groups.guid,\r\n });\r\n }\r\n\r\n private listenForScriptChange(): void {\r\n const onScriptChanged = (newScript: RenderSchedule.Script | undefined) => {\r\n if (!newScript?.requiresBatching)\r\n newScript = undefined;\r\n\r\n const currentScript = this._currentScript;\r\n this._currentScript = newScript;\r\n\r\n if (newScript !== currentScript)\r\n if (!newScript || !currentScript || !newScript.equals(currentScript))\r\n this._groups.setScript(newScript);\r\n };\r\n\r\n let rmListener = this._view.displayStyle.onScheduleScriptChanged.addListener((newScript) => onScriptChanged(newScript));\r\n this._view.onDisplayStyleChanged.addListener((newStyle) => {\r\n rmListener();\r\n onScriptChanged(newStyle.scheduleScript);\r\n rmListener = this._view.displayStyle.onScheduleScriptChanged.addListener((newScript) => onScriptChanged(newScript));\r\n });\r\n }\r\n\r\n private loadRefs(): void {\r\n this._refs.length = 0;\r\n const groups = this._groups.groups;\r\n const args: BatchedTileTreeReferenceArgs = {\r\n models: this._models,\r\n groups,\r\n treeOwner: this._treeOwner,\r\n getCurrentTimePoint: () => this._currentScript ? (this._view.displayStyle.settings.timePoint ?? this._currentScript.duration.low) : 0,\r\n getBackgroundBase: () => this._view.displayStyle.settings.mapImagery.backgroundBase,\r\n getBackgroundLayers: () => this._view.displayStyle.settings.mapImagery.backgroundLayers,\r\n iModel: this._view.iModel,\r\n };\r\n\r\n for (let i = 0; i < groups.length; i++) {\r\n const timeline = groups[i].timeline;\r\n this._refs.push(new BatchedTileTreeReference(args, i, timeline ? AnimationNodeId.Untransformed : undefined));\r\n if (timeline) {\r\n for (const nodeId of timeline.transformBatchIds)\r\n this._refs.push(new BatchedTileTreeReference(args, i, nodeId));\r\n }\r\n }\r\n }\r\n\r\n public *[Symbol.iterator](): Iterator<TileTreeReference> {\r\n this.ensureLoaded();\r\n for (const ref of this._refs)\r\n yield ref;\r\n\r\n for (const ref of this._excludedRefs)\r\n yield ref;\r\n }\r\n\r\n public update(): void {\r\n this._excludedRefs.update();\r\n this._models.setViewedModels(this._view.modelSelector.models);\r\n if (this._onModelSelectorChanged)\r\n this._onModelSelectorChanged();\r\n }\r\n\r\n public attachToViewport(args: AttachToViewportArgs): void {\r\n this._onModelSelectorChanged = () => args.invalidateSymbologyOverrides();\r\n this._excludedRefs.attachToViewport(args);\r\n this._removeSceneInvalidationListener = args.onSceneInvalidated.addListener(() => this._groups.invalidateTransforms());\r\n }\r\n\r\n public detachFromViewport(): void {\r\n this._onModelSelectorChanged = undefined;\r\n this._excludedRefs.detachFromViewport();\r\n\r\n if (this._removeSceneInvalidationListener) {\r\n this._removeSceneInvalidationListener();\r\n this._removeSceneInvalidationListener = undefined;\r\n }\r\n }\r\n\r\n // Collects the TileTreeReferences for the models that need to be drawn to create the planar clip mask.\r\n // For every model used by the mask (modelIds), extend the maskRange by that model's range.\r\n public collectMaskRefs(modelIds: OrderedId64Iterable, maskTreeRefs: TileTreeReference[], maskRange: Range3d): void {\r\n // Use V1 tiles for masking - producing the mask from batched tiles can significantly impact performance.\r\n return collectMaskRefs(this._view, modelIds, undefined, maskTreeRefs, maskRange);\r\n }\r\n\r\n // Returns a list of the models that are NOT in the planar clip mask.\r\n public getModelsNotInMask(_maskModels: OrderedId64Iterable | undefined, _useVisible: boolean): Id64String[] | undefined {\r\n return undefined;\r\n }\r\n\r\n // _view.models\r\n public setDeactivated(): void {\r\n // Used for debugging. Unimplemented here.\r\n }\r\n}\r\n\r\n// A placeholder used by [[ProxySpatialTileTreeReferences]] until asynchronous loading completes.\r\n// It provides a TileTreeOwner that never loads a tile tree.\r\n// This ensures that [ViewState.areAllTileTreesLoaded]($frontend) will not return `true` while we are loading.\r\nclass ProxyTileTreeReference extends TileTreeReference {\r\n private readonly _treeOwner: TileTreeOwner;\r\n\r\n public constructor(iModel: IModelConnection) {\r\n super();\r\n this._treeOwner = {\r\n iModel,\r\n tileTree: undefined,\r\n loadStatus: TileTreeLoadStatus.NotLoaded,\r\n load: () => undefined,\r\n [Symbol.dispose]: () => { },\r\n loadTree: async () => Promise.resolve(undefined),\r\n };\r\n }\r\n\r\n public override get treeOwner() {\r\n return this._treeOwner;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public override get _isLoadingComplete() {\r\n return false;\r\n }\r\n}\r\n\r\n// Serves as a placeholder while we asynchronously obtain the base URL for a pre-published tileset (or asynchronously determine\r\n// that no such tileset exists).\r\nclass ProxySpatialTileTreeReferences implements SpatialTileTreeReferences {\r\n // Once async loading completes, all methods will be forwarded to this implementation.\r\n private _impl?: SpatialTileTreeReferences;\r\n private readonly _proxyRef: ProxyTileTreeReference;\r\n // Retained if attachToViewport is called while we are still loading; and reset if detachFromViewport is called while loading.\r\n private _attachArgs?: AttachToViewportArgs;\r\n\r\n public constructor(view: SpatialViewState, getSpec: Promise<BatchedTilesetSpec | null>, nopFallback: boolean = false) {\r\n this._proxyRef = new ProxyTileTreeReference(view.iModel);\r\n getSpec.then((spec: BatchedTilesetSpec | null) => {\r\n if (spec) {\r\n this.setTreeRefs(new BatchedSpatialTileTreeReferences(spec, view));\r\n } else if(nopFallback) {\r\n this.setTreeRefs(new EmptySpatialTileTreeReferences());\r\n }else {\r\n this.setTreeRefs(createSpatialTileTreeReferences(view));\r\n }\r\n }).catch(() => {\r\n if(nopFallback) {\r\n this.setTreeRefs(new EmptySpatialTileTreeReferences());\r\n }else {\r\n this.setTreeRefs(createSpatialTileTreeReferences(view));\r\n }\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 // Force scene invalidation after replacing Proxy with real BatchedTileTree\r\n this._attachArgs.invalidateScene();\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 public collectMaskRefs(modelIds: OrderedId64Iterable, maskTreeRefs: TileTreeReference[], maskRange: Range3d): void {\r\n this._impl?.collectMaskRefs(modelIds, maskTreeRefs, maskRange);\r\n }\r\n\r\n public getModelsNotInMask(maskModels: OrderedId64Iterable | undefined, useVisible: boolean): Id64String[] | undefined {\r\n if (this._impl)\r\n return this._impl.getModelsNotInMask(maskModels, useVisible);\r\n else\r\n return undefined;\r\n }\r\n}\r\n\r\nconst iModelToTilesetSpec = new Map<IModelConnection, BatchedTilesetSpec | null | Promise<BatchedTilesetSpec | null>>();\r\n\r\nasync function fetchTilesetSpec(iModel: IModelConnection, computeBaseUrl: ComputeSpatialTilesetBaseUrl): Promise<BatchedTilesetSpec | null> {\r\n try {\r\n const baseUrl = await computeBaseUrl(iModel);\r\n if (undefined === baseUrl)\r\n return null;\r\n\r\n const url = new URL(\"tileset.json\", baseUrl);\r\n url.search = baseUrl.search;\r\n const response = await fetch(url.toString());\r\n const json = await response.json();\r\n return BatchedTilesetSpec.create(baseUrl, json);\r\n } catch (err) {\r\n Logger.logError(loggerCategory, err);\r\n return null;\r\n }\r\n}\r\n\r\nclass EmptySpatialTileTreeReferences implements SpatialTileTreeReferences {\r\n public update(): void {}\r\n\r\n public setDeactivated(_modelIds: string | string[] | undefined, _deactivated: boolean | undefined, _refs: \"all\" | \"animated\" | \"primary\" | \"section\" | number[]): void {}\r\n\r\n public attachToViewport(_args: Viewport): void {}\r\n\r\n public detachFromViewport(): void {}\r\n\r\n public collectMaskRefs(_modelIds: OrderedId64Iterable, _maskTreeRefs: TileTreeReference[]): void {};\r\n\r\n public getModelsNotInMask(_maskModels: OrderedId64Iterable | undefined, _useVisible: boolean): string[] | undefined {\r\n return undefined;\r\n }\r\n\r\n public *[Symbol.iterator](): Iterator<TileTreeReference> {}\r\n}\r\n\r\n/** @internal */\r\nexport function createBatchedSpatialTileTreeReferences(view: SpatialViewState, computeBaseUrl: ComputeSpatialTilesetBaseUrl, nopFallback: boolean = false): SpatialTileTreeReferences {\r\n const iModel = view.iModel;\r\n let entry = iModelToTilesetSpec.get(iModel);\r\n if (undefined === entry) {\r\n const promise = entry = fetchTilesetSpec(iModel, computeBaseUrl);\r\n iModelToTilesetSpec.set(iModel, entry);\r\n iModel.onClose.addOnce(() => iModelToTilesetSpec.delete(iModel));\r\n\r\n promise.then((spec: BatchedTilesetSpec | null) => {\r\n if (iModelToTilesetSpec.has(iModel))\r\n iModelToTilesetSpec.set(iModel, spec);\r\n }).catch(() => {\r\n if (iModelToTilesetSpec.has(iModel))\r\n iModelToTilesetSpec.set(iModel, null);\r\n });\r\n }\r\n\r\n if (null === entry) {\r\n // No tileset could be obtained for this iModel - use empty tile tree if requested.\r\n if (nopFallback) {\r\n return new EmptySpatialTileTreeReferences();\r\n }\r\n\r\n // No tileset could be obtained for this iModel - use default tile generation instead.\r\n return createSpatialTileTreeReferences(view);\r\n }\r\n\r\n if (entry instanceof Promise)\r\n return new ProxySpatialTileTreeReferences(view, entry, nopFallback);\r\n\r\n return new BatchedSpatialTileTreeReferences(entry, view);\r\n}\r\n\r\n"]}
@@ -91,7 +91,7 @@ class BatchedTile extends core_frontend_1.Tile {
91
91
  }
92
92
  }
93
93
  catch (err) {
94
- core_bentley_1.Logger.logException(LoggerCategory_js_1.loggerCategory, err);
94
+ core_bentley_1.Logger.logError(LoggerCategory_js_1.loggerCategory, err);
95
95
  children = undefined;
96
96
  if (err instanceof Error)
97
97
  reject(err);
@@ -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,wDAAiD;AAEjD,yDAA0D;AAC1D,2DAAmF;AACnF,2DAAqD;AASrD,IAAI,OAAuC,CAAC;AAE5C,gBAAgB;AAChB,MAAa,WAAY,SAAQ,oBAAI;IAClB,cAAc,CAA0B;IACxC,YAAY,CAAU;IACvC,gFAAgF;IAChE,eAAe,CAAa;IAC3B,WAAW,CAAa;IAEzC,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,uCAAoB,CAAC,eAAe,CAAC,CAAC;QAE9E,IAAI,MAAM,CAAC,aAAa,EAAE,MAAM;YAC9B,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,aAAa,CAAC;QAE7C,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,IAAI,CAAC,UAAU,EAAE,CAAC;YAClB,uBAAuB;YACvB,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;QACxB,CAAC;QAED,IAAI,CAAC,WAAW,GAAG,uCAAoB,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,kCAAc,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,IAAI,oCAAgB,EAAE,CAAC;QAE5H,IAAI,CAAC,MAAM,CAAC,eAAe;YACzB,OAAO;QAET,IAAI,CAAC,eAAe,GAAG,MAAM,CAAC,eAAe,CAAC;QAC9C,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;QAC3E,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3D,IAAI,IAAI,CAAC,aAAa;YACpB,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,IAAI,CAAC,aAAa,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC;IAE/E,CAAC;IAED,IAAY,gBAAgB;QAC1B,OAAO,IAAI,CAAC,QAAqC,CAAC;IACpD,CAAC;IAEe,mBAAmB,CAAC,SAA6B,EAAE,MAA0B;QAC3F,2FAA2F;QAC3F,OAAO,iCAAiB,CAAC,2BAA2B,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IACnG,CAAC;IAEM,WAAW,CAAC,QAA0B,EAAE,IAAkB,EAAE,0BAAmD;QACpH,MAAM,GAAG,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,8BAAc,CAAC,cAAc,KAAK,GAAG;YACvC,OAAO;QAET,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;YACtB,0EAA0E;YAC1E,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC5B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC;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,CAAC;YAC7E,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,CAAC;gBACb,KAAK,MAAM,KAAK,IAAI,QAAQ;oBAC1B,KAAK,CAAC,WAAW,CAAC,QAAQ,EAAE,IAAI,EAAE,0BAA0B,CAAC,CAAC;gBAEhE,OAAO;YACT,CAAC;QACH,CAAC;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,CAAC;YACxB,IAAI,CAAC;gBACH,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;oBAC7C,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;gBACvB,CAAC;YACH,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,qBAAM,CAAC,YAAY,CAAC,kCAAc,EAAE,GAAG,CAAC,CAAC;gBACzC,QAAQ,GAAG,SAAS,CAAC;gBACrB,IAAI,GAAG,YAAY,KAAK;oBACtB,MAAM,CAAC,GAAG,CAAC,CAAC;YAChB,CAAC;QACH,CAAC;QAED,OAAO,CAAC,QAAQ,CAAC,CAAC;IACpB,CAAC;IAED,IAAoB,OAAO;QACzB,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,OAAO,GAAG,IAAI,kCAAkB,CAAC,wBAAwB,EAAE,EAAE,CAAC,CAAC;YAC/D,yBAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC5C,CAAC;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,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,EAAE,EAAE,KAAK,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC9F,OAAO,QAAQ,CAAC;IAClB,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,CAAC;YACH,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC;YAEjD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;gBACpD,MAAM,EAAE,yBAAU,CAAC,cAAc,CAAC,IAAI,CAAC;gBACvC,OAAO,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE;gBACnC,MAAM;gBACN,UAAU;gBACV,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,qGAAqG;gBACrG,WAAW,EAAE,WAAW,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS;gBAC5E,QAAQ,EAAE;oBACR,aAAa,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,YAAY,EAAE,IAAI,yBAAS,CAAC,cAAc,EAAE;oBAC1F,KAAK,EAAE,IAAI,CAAC,KAAK;oBACjB,gBAAgB,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,gBAAgB;iBAC3D;aACF,CAAC,CAAC;YAEH,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;gBACzB,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;oBACpB,MAAM,MAAM,GAAG,IAAI,6BAAa,CAAC,IAAI,CAAC,CAAC;oBACvC,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;oBAC5B,OAAO,CAAC,OAAO,GAAG,MAAM,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;gBACtE,CAAC;gBAED,IAAI,OAAO,CAAC,YAAY;oBACtB,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;YACpF,CAAC;YAED,OAAO,OAAO,CAAC;QACjB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QAC1B,CAAC;IACH,CAAC;IAEkB,eAAe,CAAC,OAAuB,EAAE,IAAuB;QACjF,IAAI,iCAAiB,CAAC,YAAY,KAAK,IAAI,EAAE,CAAC;YAC5C,KAAK,CAAC,eAAe,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YACrC,OAAO;QACT,CAAC;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,CAAC;YAC7B,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;QACnC,CAAC;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,CAAC;YAC1C,IAAI,CAAC,eAAe,EAAE,CAAC;QACzB,CAAC;aAAM,CAAC;YACN,KAAK,MAAM,KAAK,IAAI,QAAQ;gBAC1B,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;CACF;AAnMD,kCAmMC","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 GraphicBranch, GraphicBuilder, IModelApp, RealityTileLoader, RenderSystem, Tile, TileBoundingBoxes, TileContent,\r\n TileDrawArgs, TileParams, TileRequest, TileRequestChannel, TileTreeLoadStatus, TileUser, TileVisibility, Viewport,\r\n} from \"@itwin/core-frontend\";\r\nimport { Transform } from \"@itwin/core-geometry\";\r\nimport { BatchedTileTree } from \"./BatchedTileTree.js\";\r\nimport { frontendTilesOptions } from \"./FrontendTiles.js\";\r\nimport { IndexedDBCache, LocalCache, PassThroughCache } from \"./IndexedDBCache.js\";\r\nimport { loggerCategory } from \"./LoggerCategory.js\";\r\n\r\n/** @internal */\r\nexport interface BatchedTileParams extends TileParams {\r\n childrenProps: Tileset3dSchema.Tile[] | undefined;\r\n /** See BatchedTile.transformToRoot. */\r\n transformToRoot: Transform | undefined;\r\n}\r\n\r\nlet channel: TileRequestChannel | undefined;\r\n\r\n/** @internal */\r\nexport class BatchedTile extends Tile {\r\n private readonly _childrenProps?: Tileset3dSchema.Tile[];\r\n private readonly _unskippable: boolean;\r\n /** Transform from the tile's local coordinate system to that of the tileset. */\r\n public readonly transformToRoot?: Transform;\r\n private readonly _localCache: LocalCache;\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 this._localCache = frontendTilesOptions.useIndexedDBCache ? new IndexedDBCache(\"BatchedTileCache\") : new PassThroughCache();\r\n\r\n if (!params.transformToRoot)\r\n return;\r\n\r\n this.transformToRoot = params.transformToRoot;\r\n this.boundingSphere.transformBy(this.transformToRoot, this.boundingSphere);\r\n this.transformToRoot.multiplyRange(this.range, this.range);\r\n if (this._contentRange)\r\n this.transformToRoot.multiplyRange(this._contentRange, this._contentRange);\r\n\r\n }\r\n\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 this._localCache.fetch(url.pathname.toString(), fetch, url.toString());\r\n return response;\r\n }\r\n\r\n public override async readContent(data: TileRequest.ResponseData, system: RenderSystem, isCanceled?: () => boolean): Promise<TileContent> {\r\n assert(data instanceof Uint8Array);\r\n if (!(data instanceof Uint8Array))\r\n return { };\r\n\r\n try {\r\n const modelGroups = this.batchedTree.modelGroups;\r\n\r\n const content = await this.batchedTree.decoder.decode({\r\n stream: ByteStream.fromUint8Array(data),\r\n options: { tileId: this.contentId },\r\n system,\r\n isCanceled,\r\n isLeaf: this.isLeaf,\r\n // Don't waste time attempting to split based on model groupings if all models are in the same group.\r\n modelGroups: modelGroups && modelGroups.length > 1 ? modelGroups : undefined,\r\n tileData: {\r\n ecefTransform: this.tree.iModel.ecefLocation?.getTransform() ?? Transform.createIdentity(),\r\n range: this.range,\r\n layerClassifiers: this.tree.layerHandler?.layerClassifiers,\r\n },\r\n });\r\n\r\n if (this.transformToRoot) {\r\n if (content.graphic) {\r\n const branch = new GraphicBranch(true);\r\n branch.add(content.graphic);\r\n content.graphic = system.createBranch(branch, this.transformToRoot);\r\n }\r\n\r\n if (content.contentRange)\r\n content.contentRange = this.transformToRoot.multiplyRange(content.contentRange);\r\n }\r\n\r\n return content;\r\n } catch {\r\n return { isLeaf: true };\r\n }\r\n }\r\n\r\n protected override addRangeGraphic(builder: GraphicBuilder, type: TileBoundingBoxes): void {\r\n if (TileBoundingBoxes.ChildVolumes !== type) {\r\n super.addRangeGraphic(builder, type);\r\n return;\r\n }\r\n\r\n builder.setSymbology(ColorDef.green, ColorDef.green, 2);\r\n builder.addRangeBox(this.range);\r\n\r\n this.loadChildren();\r\n const children = this.children;\r\n if (!children)\r\n return;\r\n\r\n builder.setSymbology(ColorDef.blue, ColorDef.blue.withTransparency(0xdf), 1);\r\n for (const child of children) {\r\n const range = child.range;\r\n builder.addRangeBox(range);\r\n builder.addRangeBox(range, true);\r\n }\r\n }\r\n\r\n public prune(olderThan: BeTimePoint): void {\r\n const children = this._batchedChildren;\r\n if (!children)\r\n return;\r\n\r\n if (this.usageMarker.isExpired(olderThan)) {\r\n this.disposeChildren();\r\n } else {\r\n for (const child of children)\r\n child.prune(olderThan);\r\n }\r\n }\r\n}\r\n"]}
1
+ {"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 GraphicBranch, GraphicBuilder, IModelApp, RealityTileLoader, RenderSystem, Tile, TileBoundingBoxes, TileContent,\r\n TileDrawArgs, TileParams, TileRequest, TileRequestChannel, TileTreeLoadStatus, TileUser, TileVisibility, Viewport,\r\n} from \"@itwin/core-frontend\";\r\nimport { Transform } from \"@itwin/core-geometry\";\r\nimport { BatchedTileTree } from \"./BatchedTileTree.js\";\r\nimport { frontendTilesOptions } from \"./FrontendTiles.js\";\r\nimport { IndexedDBCache, LocalCache, PassThroughCache } from \"./IndexedDBCache.js\";\r\nimport { loggerCategory } from \"./LoggerCategory.js\";\r\n\r\n/** @internal */\r\nexport interface BatchedTileParams extends TileParams {\r\n childrenProps: Tileset3dSchema.Tile[] | undefined;\r\n /** See BatchedTile.transformToRoot. */\r\n transformToRoot: Transform | undefined;\r\n}\r\n\r\nlet channel: TileRequestChannel | undefined;\r\n\r\n/** @internal */\r\nexport class BatchedTile extends Tile {\r\n private readonly _childrenProps?: Tileset3dSchema.Tile[];\r\n private readonly _unskippable: boolean;\r\n /** Transform from the tile's local coordinate system to that of the tileset. */\r\n public readonly transformToRoot?: Transform;\r\n private readonly _localCache: LocalCache;\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 this._localCache = frontendTilesOptions.useIndexedDBCache ? new IndexedDBCache(\"BatchedTileCache\") : new PassThroughCache();\r\n\r\n if (!params.transformToRoot)\r\n return;\r\n\r\n this.transformToRoot = params.transformToRoot;\r\n this.boundingSphere.transformBy(this.transformToRoot, this.boundingSphere);\r\n this.transformToRoot.multiplyRange(this.range, this.range);\r\n if (this._contentRange)\r\n this.transformToRoot.multiplyRange(this._contentRange, this._contentRange);\r\n\r\n }\r\n\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.logError(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 this._localCache.fetch(url.pathname.toString(), fetch, url.toString());\r\n return response;\r\n }\r\n\r\n public override async readContent(data: TileRequest.ResponseData, system: RenderSystem, isCanceled?: () => boolean): Promise<TileContent> {\r\n assert(data instanceof Uint8Array);\r\n if (!(data instanceof Uint8Array))\r\n return { };\r\n\r\n try {\r\n const modelGroups = this.batchedTree.modelGroups;\r\n\r\n const content = await this.batchedTree.decoder.decode({\r\n stream: ByteStream.fromUint8Array(data),\r\n options: { tileId: this.contentId },\r\n system,\r\n isCanceled,\r\n isLeaf: this.isLeaf,\r\n // Don't waste time attempting to split based on model groupings if all models are in the same group.\r\n modelGroups: modelGroups && modelGroups.length > 1 ? modelGroups : undefined,\r\n tileData: {\r\n ecefTransform: this.tree.iModel.ecefLocation?.getTransform() ?? Transform.createIdentity(),\r\n range: this.range,\r\n layerClassifiers: this.tree.layerHandler?.layerClassifiers,\r\n },\r\n });\r\n\r\n if (this.transformToRoot) {\r\n if (content.graphic) {\r\n const branch = new GraphicBranch(true);\r\n branch.add(content.graphic);\r\n content.graphic = system.createBranch(branch, this.transformToRoot);\r\n }\r\n\r\n if (content.contentRange)\r\n content.contentRange = this.transformToRoot.multiplyRange(content.contentRange);\r\n }\r\n\r\n return content;\r\n } catch {\r\n return { isLeaf: true };\r\n }\r\n }\r\n\r\n protected override addRangeGraphic(builder: GraphicBuilder, type: TileBoundingBoxes): void {\r\n if (TileBoundingBoxes.ChildVolumes !== type) {\r\n super.addRangeGraphic(builder, type);\r\n return;\r\n }\r\n\r\n builder.setSymbology(ColorDef.green, ColorDef.green, 2);\r\n builder.addRangeBox(this.range);\r\n\r\n this.loadChildren();\r\n const children = this.children;\r\n if (!children)\r\n return;\r\n\r\n builder.setSymbology(ColorDef.blue, ColorDef.blue.withTransparency(0xdf), 1);\r\n for (const child of children) {\r\n const range = child.range;\r\n builder.addRangeBox(range);\r\n builder.addRangeBox(range, true);\r\n }\r\n }\r\n\r\n public prune(olderThan: BeTimePoint): void {\r\n const children = this._batchedChildren;\r\n if (!children)\r\n return;\r\n\r\n if (this.usageMarker.isExpired(olderThan)) {\r\n this.disposeChildren();\r\n } else {\r\n for (const child of children)\r\n child.prune(olderThan);\r\n }\r\n }\r\n}\r\n"]}
@@ -25,7 +25,7 @@ class BatchedTileTreeSupplier {
25
25
  return new BatchedTileTree_js_1.BatchedTileTree(params);
26
26
  }
27
27
  catch (err) {
28
- core_bentley_1.Logger.logException(LoggerCategory_js_1.loggerCategory, err);
28
+ core_bentley_1.Logger.logError(LoggerCategory_js_1.loggerCategory, err);
29
29
  return undefined;
30
30
  }
31
31
  }
@@ -1 +1 @@
1
- {"version":3,"file":"BatchedTileTreeSupplier.js","sourceRoot":"","sources":["../../src/BatchedTileTreeSupplier.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;;AAgD/F,0DAEC;AAhDD,sDAA0G;AAK1G,uEAAqF;AACrF,6DAAuD;AACvD,2DAAqD;AAarD,MAAM,uBAAuB;IACpB,kBAAkB,CAAC,GAAsB,EAAE,GAAsB;QACtE,OAAO,IAAA,6BAAc,EAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;eAC1E,IAAA,6BAAc,EAAC,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,WAAW,CAAC;eAChD,IAAA,uCAAwB,EAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAClF,CAAC;IAEM,KAAK,CAAC,cAAc,CAAC,MAAyB,EAAE,MAAwB;QAC7E,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,gCAAiB,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAClI,MAAM,MAAM,GAAG,IAAI,8CAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;YACnE,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,kBAAkB,EAAE,CAAC;YAEjD,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;YAC9B,OAAO,IAAI,oCAAe,CAAC,MAAM,CAAC,CAAC;QACrC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,qBAAM,CAAC,YAAY,CAAC,kCAAc,EAAE,GAAG,CAAC,CAAC;YACzC,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;CACF;AAED,MAAM,uBAAuB,GAAqB,IAAI,uBAAuB,EAAE,CAAC;AAEhF,gBAAgB;AAChB,SAAgB,uBAAuB,CAAC,MAAwB,EAAE,MAAyB;IACzF,OAAO,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,MAAM,EAAE,uBAAuB,CAAC,CAAC;AACxE,CAAC","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 { comparePossiblyUndefined, compareStrings, CompressedId64Set, Logger } from \"@itwin/core-bentley\";\r\nimport { RenderSchedule } from \"@itwin/core-common\";\r\nimport {\r\n IModelConnection, TileTree, TileTreeOwner, TileTreeSupplier,\r\n} from \"@itwin/core-frontend\";\r\nimport { BatchedTilesetReader, BatchedTilesetSpec } from \"./BatchedTilesetReader.js\";\r\nimport { BatchedTileTree } from \"./BatchedTileTree.js\";\r\nimport { loggerCategory } from \"./LoggerCategory.js\";\r\n\r\n/** @internal */\r\nexport interface BatchedTileTreeId {\r\n spec: BatchedTilesetSpec;\r\n script?: RenderSchedule.Script;\r\n /** A stringified representation of the [[ModelGroup]]s by which to structure the contents of the tiles.\r\n * Every unique combination of model groups has a corresponding unique string representation.\r\n * @see [[BatchedModelGroups.guid]].\r\n */\r\n modelGroups: string;\r\n}\r\n\r\nclass BatchedTileTreeSupplier implements TileTreeSupplier {\r\n public compareTileTreeIds(lhs: BatchedTileTreeId, rhs: BatchedTileTreeId): number {\r\n return compareStrings(lhs.spec.baseUrl.toString(), rhs.spec.baseUrl.toString())\r\n || compareStrings(lhs.modelGroups, rhs.modelGroups)\r\n || comparePossiblyUndefined((x, y) => x.compareTo(y), lhs.script, rhs.script);\r\n }\r\n\r\n public async createTileTree(treeId: BatchedTileTreeId, iModel: IModelConnection): Promise<TileTree | undefined> {\r\n const spec = treeId.spec;\r\n try {\r\n const modelGroups = treeId.modelGroups ? treeId.modelGroups.split(\"_\").map((x) => CompressedId64Set.decompressSet(x)) : undefined;\r\n const reader = new BatchedTilesetReader(spec, iModel, modelGroups);\r\n const params = await reader.readTileTreeParams();\r\n\r\n params.script = treeId.script;\r\n return new BatchedTileTree(params);\r\n } catch (err) {\r\n Logger.logException(loggerCategory, err);\r\n return undefined;\r\n }\r\n }\r\n}\r\n\r\nconst batchedTileTreeSupplier: TileTreeSupplier = new BatchedTileTreeSupplier();\r\n\r\n/** @internal */\r\nexport function getBatchedTileTreeOwner(iModel: IModelConnection, treeId: BatchedTileTreeId): TileTreeOwner {\r\n return iModel.tiles.getTileTreeOwner(treeId, batchedTileTreeSupplier);\r\n}\r\n"]}
1
+ {"version":3,"file":"BatchedTileTreeSupplier.js","sourceRoot":"","sources":["../../src/BatchedTileTreeSupplier.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;;AAgD/F,0DAEC;AAhDD,sDAA0G;AAK1G,uEAAqF;AACrF,6DAAuD;AACvD,2DAAqD;AAarD,MAAM,uBAAuB;IACpB,kBAAkB,CAAC,GAAsB,EAAE,GAAsB;QACtE,OAAO,IAAA,6BAAc,EAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;eAC1E,IAAA,6BAAc,EAAC,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,WAAW,CAAC;eAChD,IAAA,uCAAwB,EAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAClF,CAAC;IAEM,KAAK,CAAC,cAAc,CAAC,MAAyB,EAAE,MAAwB;QAC7E,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,gCAAiB,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAClI,MAAM,MAAM,GAAG,IAAI,8CAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;YACnE,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,kBAAkB,EAAE,CAAC;YAEjD,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;YAC9B,OAAO,IAAI,oCAAe,CAAC,MAAM,CAAC,CAAC;QACrC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,qBAAM,CAAC,QAAQ,CAAC,kCAAc,EAAE,GAAG,CAAC,CAAC;YACrC,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;CACF;AAED,MAAM,uBAAuB,GAAqB,IAAI,uBAAuB,EAAE,CAAC;AAEhF,gBAAgB;AAChB,SAAgB,uBAAuB,CAAC,MAAwB,EAAE,MAAyB;IACzF,OAAO,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,MAAM,EAAE,uBAAuB,CAAC,CAAC;AACxE,CAAC","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 { comparePossiblyUndefined, compareStrings, CompressedId64Set, Logger } from \"@itwin/core-bentley\";\r\nimport { RenderSchedule } from \"@itwin/core-common\";\r\nimport {\r\n IModelConnection, TileTree, TileTreeOwner, TileTreeSupplier,\r\n} from \"@itwin/core-frontend\";\r\nimport { BatchedTilesetReader, BatchedTilesetSpec } from \"./BatchedTilesetReader.js\";\r\nimport { BatchedTileTree } from \"./BatchedTileTree.js\";\r\nimport { loggerCategory } from \"./LoggerCategory.js\";\r\n\r\n/** @internal */\r\nexport interface BatchedTileTreeId {\r\n spec: BatchedTilesetSpec;\r\n script?: RenderSchedule.Script;\r\n /** A stringified representation of the [[ModelGroup]]s by which to structure the contents of the tiles.\r\n * Every unique combination of model groups has a corresponding unique string representation.\r\n * @see [[BatchedModelGroups.guid]].\r\n */\r\n modelGroups: string;\r\n}\r\n\r\nclass BatchedTileTreeSupplier implements TileTreeSupplier {\r\n public compareTileTreeIds(lhs: BatchedTileTreeId, rhs: BatchedTileTreeId): number {\r\n return compareStrings(lhs.spec.baseUrl.toString(), rhs.spec.baseUrl.toString())\r\n || compareStrings(lhs.modelGroups, rhs.modelGroups)\r\n || comparePossiblyUndefined((x, y) => x.compareTo(y), lhs.script, rhs.script);\r\n }\r\n\r\n public async createTileTree(treeId: BatchedTileTreeId, iModel: IModelConnection): Promise<TileTree | undefined> {\r\n const spec = treeId.spec;\r\n try {\r\n const modelGroups = treeId.modelGroups ? treeId.modelGroups.split(\"_\").map((x) => CompressedId64Set.decompressSet(x)) : undefined;\r\n const reader = new BatchedTilesetReader(spec, iModel, modelGroups);\r\n const params = await reader.readTileTreeParams();\r\n\r\n params.script = treeId.script;\r\n return new BatchedTileTree(params);\r\n } catch (err) {\r\n Logger.logError(loggerCategory, err);\r\n return undefined;\r\n }\r\n }\r\n}\r\n\r\nconst batchedTileTreeSupplier: TileTreeSupplier = new BatchedTileTreeSupplier();\r\n\r\n/** @internal */\r\nexport function getBatchedTileTreeOwner(iModel: IModelConnection, treeId: BatchedTileTreeId): TileTreeOwner {\r\n return iModel.tiles.getTileTreeOwner(treeId, batchedTileTreeSupplier);\r\n}\r\n"]}
@@ -47,7 +47,7 @@ async function* queryGraphicRepresentations(args) {
47
47
  result = await response.json();
48
48
  }
49
49
  catch (err) {
50
- core_bentley_1.Logger.logException(LoggerCategory_js_1.loggerCategory, err);
50
+ core_bentley_1.Logger.logError(LoggerCategory_js_1.loggerCategory, err);
51
51
  core_bentley_1.Logger.logError(LoggerCategory_js_1.loggerCategory, `Failed loading Graphics Data for Source ${args.dataSource.id}`);
52
52
  break;
53
53
  }
@@ -1 +1 @@
1
- {"version":3,"file":"GraphicRepresentationProvider.js","sourceRoot":"","sources":["../../../src/GraphicsProvider/GraphicRepresentationProvider.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, ITWINJS_CORE_VERSION } from \"@itwin/core-frontend\";\r\nimport { loggerCategory } from \"../LoggerCategory.js\";\r\n\r\n/** The expected format of the Graphic Representation\r\n * @beta\r\n */\r\n// eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents\r\nexport type GraphicRepresentationFormat = \"3DFT\" | \"3DTiles\" | \"CESIUM\" | \"IMODEL\" | string;\r\n\r\n/** Graphic representations are generated from Data Sources.\r\n * The status of a Graphic Representation indicates the progress of that generation process.\r\n * @beta\r\n */\r\nexport type GraphicRepresentationStatus = \"Complete\" | \"InProgress\" | \"Invalid\" | \"NotStarted\";\r\n\r\n/**\r\n * Represents a data source for a graphic representation.\r\n * A data source is usually higher-fidelity and contains more information, but may not be as well suited for visualization\r\n * as a graphic representation.\r\n * @beta\r\n */\r\nexport interface DataSource {\r\n /** The iTwinId associated with the DataSource */\r\n iTwinId: string;\r\n /** The unique identifier of a DataSource.\r\n * For example, a DataSource of type \"IMODEL\" has an iModelId which would be attributed to this value.\r\n */\r\n id: string;\r\n /** The unique identifier for a specific version of a DataSource.\r\n * For example, if a specific version of an iModel is desired, the iModel's changesetId would be attributed to this value.\r\n */\r\n changeId?: string;\r\n /** The type of the data source. For example, a DataSource can be of type \"IMODEL\" or \"RealityData\" */\r\n type: string;\r\n}\r\n\r\n/** Represents a visual representation of a data source, for example a 3d tileset.\r\n * A data source can be an iModel, reality data, or other kind of graphical data.\r\n * @see [[queryGraphicRepresentations]] for its construction as a representation of the data produced by a query of data sources.\r\n * @beta\r\n */\r\nexport interface GraphicRepresentation {\r\n /** The display name of the Graphic Representation */\r\n displayName: string;\r\n /** The unique identifier for the Graphic Representation */\r\n representationId: string;\r\n /** The status of the generation of the Graphic Representation from its Data Source.\r\n * @see [[GraphicRepresentationStatus]] for possible values.\r\n */\r\n status: GraphicRepresentationStatus;\r\n /** The expected format of the Graphic Representation\r\n * @see [[GraphicRepresentationFormat]] for possible values.\r\n */\r\n format: GraphicRepresentationFormat;\r\n /** The data source that the representation originates from.\r\n * For example, a GraphicRepresentation in the 3D Tiles format might have a dataSource that is a specific iModel changeset.\r\n */\r\n dataSource: DataSource;\r\n /** The url of the graphic representation\r\n * @note The url can only be guaranteed to be valid if the status is complete.\r\n */\r\n url: string | undefined;\r\n}\r\n\r\n/** Creates a URL used to query for Graphic Representations\r\n * @internal\r\n */\r\nexport function createGraphicRepresentationsQueryUrl(args: { sourceId: string, sourceType: string, urlPrefix?: string, changeId?: string, enableCDN?: boolean, numExports?: number }): string {\r\n const prefix = args.urlPrefix ?? \"\";\r\n const numExports = args.numExports ?? 5;\r\n let url = `https://${prefix}api.bentley.com/mesh-export/?iModelId=${args.sourceId}&$orderBy=date:desc&$top=${numExports}`;\r\n\r\n if (args.changeId)\r\n url = `${url}&changesetId=${args.changeId}`;\r\n\r\n if (args.enableCDN)\r\n url = `${url}&cdn=1`;\r\n\r\n const tileVersion = IModelApp.tileAdmin.maximumMajorTileFormatVersion.toString();\r\n url = `${url}&tileVersion=${tileVersion}&iTwinJS=${ITWINJS_CORE_VERSION}&exportType=${args.sourceType}`;\r\n\r\n return url;\r\n}\r\n\r\n/** Represents an export object from a response from the Mesh Export Service.\r\n * @internal\r\n */\r\ninterface ServiceJsonResponse {\r\n id: string;\r\n displayName: string;\r\n status: GraphicRepresentationStatus;\r\n request: {\r\n iModelId: string;\r\n changesetId: string;\r\n exportType: string;\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/** Represents a response from the Mesh Export Service.\r\n * @internal\r\n */\r\ninterface ServiceJsonResponses {\r\n exports: ServiceJsonResponse[];\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 [[queryGraphicRepresentations]].\r\n * @beta\r\n */\r\nexport interface QueryGraphicRepresentationsArgs {\r\n /** The token used to access the data source provider. */\r\n accessToken: AccessToken;\r\n /** The unique identifier for the session in which this data source was queried.\r\n * A possible value is IModelApp.sessionId.\r\n */\r\n sessionId: string;\r\n /** The Data Source for which to query the graphic representations */\r\n dataSource: DataSource;\r\n /** The expected format of the graphic representations\r\n * @see [[GraphicRepresentationFormat]] for possible values.\r\n */\r\n format: GraphicRepresentationFormat;\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 /** If true, enables a CDN (content delivery network) to access tiles faster. */\r\n enableCDN?: boolean;\r\n /** Number of exports to query */\r\n numExports?: number;\r\n}\r\n\r\n/** Query Graphic Representations matching the specified criteria, sorted from most-recently- to least-recently-produced.\r\n * @beta\r\n */\r\nexport async function* queryGraphicRepresentations(args: QueryGraphicRepresentationsArgs): AsyncIterableIterator<GraphicRepresentation> {\r\n const headers = {\r\n /* eslint-disable-next-line @typescript-eslint/naming-convention */\r\n Authorization: args.accessToken,\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 /* eslint-disable-next-line @typescript-eslint/naming-convention */\r\n SessionId: args.sessionId,\r\n };\r\n\r\n let url: string | undefined = createGraphicRepresentationsQueryUrl({ sourceId: args.dataSource.id, sourceType: args.dataSource.type, urlPrefix: args.urlPrefix, changeId: args.dataSource.changeId, enableCDN: args.enableCDN, numExports: args.numExports });\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 ServiceJsonResponses;\r\n } catch (err) {\r\n Logger.logException(loggerCategory, err);\r\n Logger.logError(loggerCategory, `Failed loading Graphics Data for Source ${args.dataSource.id}`);\r\n break;\r\n }\r\n\r\n const foundSources = result.exports.filter((x) => x.request.exportType === args.dataSource.type && (args.includeIncomplete || x.status === \"Complete\"));\r\n for (const foundSource of foundSources) {\r\n const graphicRepresentation: GraphicRepresentation = {\r\n displayName: foundSource.displayName,\r\n representationId: foundSource.id,\r\n status: foundSource.status,\r\n format: args.format,\r\n url: foundSource._links?.mesh.href,\r\n dataSource: {\r\n iTwinId: args.dataSource.iTwinId,\r\n id: foundSource.request.iModelId,\r\n changeId: foundSource.request.changesetId,\r\n type: foundSource.request.exportType,\r\n },\r\n };\r\n\r\n yield graphicRepresentation;\r\n }\r\n\r\n url = result._links.next?.href;\r\n }\r\n}\r\n\r\n/** Arguments supplied to [[obtainGraphicRepresentationUrl]].\r\n * @beta\r\n */\r\nexport interface ObtainGraphicRepresentationUrlArgs {\r\n /** The token used to access the mesh export service. */\r\n accessToken: AccessToken;\r\n /** The unique identifier for the session in which this data source was queried.\r\n * A possible value is IModelApp.sessionId.\r\n */\r\n sessionId: string;\r\n /** The data source for which to query the graphic representations */\r\n dataSource: DataSource;\r\n /** The expected format of the graphic representations\r\n * @see [[GraphicRepresentationFormat]] for possible values.\r\n */\r\n format: GraphicRepresentationFormat;\r\n /** Chiefly used in testing environments. */\r\n urlPrefix?: string;\r\n /** If true, only data produced for a specific data source version will be considered;\r\n * otherwise, if no data sources are found with the specified version,the most recent data source version will be used.\r\n */\r\n requireExactVersion?: boolean;\r\n /** If true, enables a CDN (content delivery network) to access tiles faster. */\r\n enableCDN?: boolean;\r\n}\r\n\r\n/** Obtains a URL pointing to a Graphic Representation.\r\n * [[queryGraphicRepresentations]] is used to obtain a list of available representations. By default, the list is sorted from most to least recently-created.\r\n * The first representation matching the source version is selected; or, if no such representation exists, the first representation 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 obtainGraphicRepresentationUrl(args: ObtainGraphicRepresentationUrlArgs): Promise<URL | undefined> {\r\n if (!args.dataSource.id) {\r\n Logger.logInfo(loggerCategory, \"Cannot obtain Graphics Data from a source without an Id\");\r\n return undefined;\r\n }\r\n\r\n const queryArgs: QueryGraphicRepresentationsArgs = {\r\n accessToken: args.accessToken,\r\n sessionId: args.sessionId,\r\n dataSource: args.dataSource,\r\n format: args.format,\r\n urlPrefix: args.urlPrefix,\r\n enableCDN: args.enableCDN,\r\n };\r\n\r\n let selectedData;\r\n for await (const data of queryGraphicRepresentations(queryArgs)) {\r\n selectedData = data;\r\n break;\r\n }\r\n\r\n if (!selectedData && !args.requireExactVersion) {\r\n queryArgs.dataSource.changeId = undefined;\r\n for await (const data of queryGraphicRepresentations(queryArgs)) {\r\n selectedData = data;\r\n Logger.logInfo(loggerCategory, `No data for Data Source ${args.dataSource.id} for version ${args.dataSource.changeId}; falling back to most recent`);\r\n break;\r\n }\r\n }\r\n\r\n if ((!selectedData) || (!selectedData.url)) {\r\n Logger.logInfo(loggerCategory, `No data available for Data Source ${args.dataSource.id}`);\r\n return undefined;\r\n }\r\n\r\n const url = new URL(selectedData.url);\r\n url.pathname = `${url.pathname}/tileset.json`;\r\n return url;\r\n}\r\n"]}
1
+ {"version":3,"file":"GraphicRepresentationProvider.js","sourceRoot":"","sources":["../../../src/GraphicsProvider/GraphicRepresentationProvider.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, ITWINJS_CORE_VERSION } from \"@itwin/core-frontend\";\r\nimport { loggerCategory } from \"../LoggerCategory.js\";\r\n\r\n/** The expected format of the Graphic Representation\r\n * @beta\r\n */\r\n// eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents\r\nexport type GraphicRepresentationFormat = \"3DFT\" | \"3DTiles\" | \"CESIUM\" | \"IMODEL\" | string;\r\n\r\n/** Graphic representations are generated from Data Sources.\r\n * The status of a Graphic Representation indicates the progress of that generation process.\r\n * @beta\r\n */\r\nexport type GraphicRepresentationStatus = \"Complete\" | \"InProgress\" | \"Invalid\" | \"NotStarted\";\r\n\r\n/**\r\n * Represents a data source for a graphic representation.\r\n * A data source is usually higher-fidelity and contains more information, but may not be as well suited for visualization\r\n * as a graphic representation.\r\n * @beta\r\n */\r\nexport interface DataSource {\r\n /** The iTwinId associated with the DataSource */\r\n iTwinId: string;\r\n /** The unique identifier of a DataSource.\r\n * For example, a DataSource of type \"IMODEL\" has an iModelId which would be attributed to this value.\r\n */\r\n id: string;\r\n /** The unique identifier for a specific version of a DataSource.\r\n * For example, if a specific version of an iModel is desired, the iModel's changesetId would be attributed to this value.\r\n */\r\n changeId?: string;\r\n /** The type of the data source. For example, a DataSource can be of type \"IMODEL\" or \"RealityData\" */\r\n type: string;\r\n}\r\n\r\n/** Represents a visual representation of a data source, for example a 3d tileset.\r\n * A data source can be an iModel, reality data, or other kind of graphical data.\r\n * @see [[queryGraphicRepresentations]] for its construction as a representation of the data produced by a query of data sources.\r\n * @beta\r\n */\r\nexport interface GraphicRepresentation {\r\n /** The display name of the Graphic Representation */\r\n displayName: string;\r\n /** The unique identifier for the Graphic Representation */\r\n representationId: string;\r\n /** The status of the generation of the Graphic Representation from its Data Source.\r\n * @see [[GraphicRepresentationStatus]] for possible values.\r\n */\r\n status: GraphicRepresentationStatus;\r\n /** The expected format of the Graphic Representation\r\n * @see [[GraphicRepresentationFormat]] for possible values.\r\n */\r\n format: GraphicRepresentationFormat;\r\n /** The data source that the representation originates from.\r\n * For example, a GraphicRepresentation in the 3D Tiles format might have a dataSource that is a specific iModel changeset.\r\n */\r\n dataSource: DataSource;\r\n /** The url of the graphic representation\r\n * @note The url can only be guaranteed to be valid if the status is complete.\r\n */\r\n url: string | undefined;\r\n}\r\n\r\n/** Creates a URL used to query for Graphic Representations\r\n * @internal\r\n */\r\nexport function createGraphicRepresentationsQueryUrl(args: { sourceId: string, sourceType: string, urlPrefix?: string, changeId?: string, enableCDN?: boolean, numExports?: number }): string {\r\n const prefix = args.urlPrefix ?? \"\";\r\n const numExports = args.numExports ?? 5;\r\n let url = `https://${prefix}api.bentley.com/mesh-export/?iModelId=${args.sourceId}&$orderBy=date:desc&$top=${numExports}`;\r\n\r\n if (args.changeId)\r\n url = `${url}&changesetId=${args.changeId}`;\r\n\r\n if (args.enableCDN)\r\n url = `${url}&cdn=1`;\r\n\r\n const tileVersion = IModelApp.tileAdmin.maximumMajorTileFormatVersion.toString();\r\n url = `${url}&tileVersion=${tileVersion}&iTwinJS=${ITWINJS_CORE_VERSION}&exportType=${args.sourceType}`;\r\n\r\n return url;\r\n}\r\n\r\n/** Represents an export object from a response from the Mesh Export Service.\r\n * @internal\r\n */\r\ninterface ServiceJsonResponse {\r\n id: string;\r\n displayName: string;\r\n status: GraphicRepresentationStatus;\r\n request: {\r\n iModelId: string;\r\n changesetId: string;\r\n exportType: string;\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/** Represents a response from the Mesh Export Service.\r\n * @internal\r\n */\r\ninterface ServiceJsonResponses {\r\n exports: ServiceJsonResponse[];\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 [[queryGraphicRepresentations]].\r\n * @beta\r\n */\r\nexport interface QueryGraphicRepresentationsArgs {\r\n /** The token used to access the data source provider. */\r\n accessToken: AccessToken;\r\n /** The unique identifier for the session in which this data source was queried.\r\n * A possible value is IModelApp.sessionId.\r\n */\r\n sessionId: string;\r\n /** The Data Source for which to query the graphic representations */\r\n dataSource: DataSource;\r\n /** The expected format of the graphic representations\r\n * @see [[GraphicRepresentationFormat]] for possible values.\r\n */\r\n format: GraphicRepresentationFormat;\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 /** If true, enables a CDN (content delivery network) to access tiles faster. */\r\n enableCDN?: boolean;\r\n /** Number of exports to query */\r\n numExports?: number;\r\n}\r\n\r\n/** Query Graphic Representations matching the specified criteria, sorted from most-recently- to least-recently-produced.\r\n * @beta\r\n */\r\nexport async function* queryGraphicRepresentations(args: QueryGraphicRepresentationsArgs): AsyncIterableIterator<GraphicRepresentation> {\r\n const headers = {\r\n /* eslint-disable-next-line @typescript-eslint/naming-convention */\r\n Authorization: args.accessToken,\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 /* eslint-disable-next-line @typescript-eslint/naming-convention */\r\n SessionId: args.sessionId,\r\n };\r\n\r\n let url: string | undefined = createGraphicRepresentationsQueryUrl({ sourceId: args.dataSource.id, sourceType: args.dataSource.type, urlPrefix: args.urlPrefix, changeId: args.dataSource.changeId, enableCDN: args.enableCDN, numExports: args.numExports });\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 ServiceJsonResponses;\r\n } catch (err) {\r\n Logger.logError(loggerCategory, err);\r\n Logger.logError(loggerCategory, `Failed loading Graphics Data for Source ${args.dataSource.id}`);\r\n break;\r\n }\r\n\r\n const foundSources = result.exports.filter((x) => x.request.exportType === args.dataSource.type && (args.includeIncomplete || x.status === \"Complete\"));\r\n for (const foundSource of foundSources) {\r\n const graphicRepresentation: GraphicRepresentation = {\r\n displayName: foundSource.displayName,\r\n representationId: foundSource.id,\r\n status: foundSource.status,\r\n format: args.format,\r\n url: foundSource._links?.mesh.href,\r\n dataSource: {\r\n iTwinId: args.dataSource.iTwinId,\r\n id: foundSource.request.iModelId,\r\n changeId: foundSource.request.changesetId,\r\n type: foundSource.request.exportType,\r\n },\r\n };\r\n\r\n yield graphicRepresentation;\r\n }\r\n\r\n url = result._links.next?.href;\r\n }\r\n}\r\n\r\n/** Arguments supplied to [[obtainGraphicRepresentationUrl]].\r\n * @beta\r\n */\r\nexport interface ObtainGraphicRepresentationUrlArgs {\r\n /** The token used to access the mesh export service. */\r\n accessToken: AccessToken;\r\n /** The unique identifier for the session in which this data source was queried.\r\n * A possible value is IModelApp.sessionId.\r\n */\r\n sessionId: string;\r\n /** The data source for which to query the graphic representations */\r\n dataSource: DataSource;\r\n /** The expected format of the graphic representations\r\n * @see [[GraphicRepresentationFormat]] for possible values.\r\n */\r\n format: GraphicRepresentationFormat;\r\n /** Chiefly used in testing environments. */\r\n urlPrefix?: string;\r\n /** If true, only data produced for a specific data source version will be considered;\r\n * otherwise, if no data sources are found with the specified version,the most recent data source version will be used.\r\n */\r\n requireExactVersion?: boolean;\r\n /** If true, enables a CDN (content delivery network) to access tiles faster. */\r\n enableCDN?: boolean;\r\n}\r\n\r\n/** Obtains a URL pointing to a Graphic Representation.\r\n * [[queryGraphicRepresentations]] is used to obtain a list of available representations. By default, the list is sorted from most to least recently-created.\r\n * The first representation matching the source version is selected; or, if no such representation exists, the first representation 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 obtainGraphicRepresentationUrl(args: ObtainGraphicRepresentationUrlArgs): Promise<URL | undefined> {\r\n if (!args.dataSource.id) {\r\n Logger.logInfo(loggerCategory, \"Cannot obtain Graphics Data from a source without an Id\");\r\n return undefined;\r\n }\r\n\r\n const queryArgs: QueryGraphicRepresentationsArgs = {\r\n accessToken: args.accessToken,\r\n sessionId: args.sessionId,\r\n dataSource: args.dataSource,\r\n format: args.format,\r\n urlPrefix: args.urlPrefix,\r\n enableCDN: args.enableCDN,\r\n };\r\n\r\n let selectedData;\r\n for await (const data of queryGraphicRepresentations(queryArgs)) {\r\n selectedData = data;\r\n break;\r\n }\r\n\r\n if (!selectedData && !args.requireExactVersion) {\r\n queryArgs.dataSource.changeId = undefined;\r\n for await (const data of queryGraphicRepresentations(queryArgs)) {\r\n selectedData = data;\r\n Logger.logInfo(loggerCategory, `No data for Data Source ${args.dataSource.id} for version ${args.dataSource.changeId}; falling back to most recent`);\r\n break;\r\n }\r\n }\r\n\r\n if ((!selectedData) || (!selectedData.url)) {\r\n Logger.logInfo(loggerCategory, `No data available for Data Source ${args.dataSource.id}`);\r\n return undefined;\r\n }\r\n\r\n const url = new URL(selectedData.url);\r\n url.pathname = `${url.pathname}/tileset.json`;\r\n return url;\r\n}\r\n"]}
@@ -239,7 +239,7 @@ async function fetchTilesetSpec(iModel, computeBaseUrl) {
239
239
  return BatchedTilesetSpec.create(baseUrl, json);
240
240
  }
241
241
  catch (err) {
242
- Logger.logException(loggerCategory, err);
242
+ Logger.logError(loggerCategory, err);
243
243
  return null;
244
244
  }
245
245
  }
@@ -1 +1 @@
1
- {"version":3,"file":"BatchedSpatialTileTreeRefs.js","sourceRoot":"","sources":["../../src/BatchedSpatialTileTreeRefs.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\nimport { Id64String, Logger, OrderedId64Iterable } from \"@itwin/core-bentley\";\r\nimport { RenderSchedule } from \"@itwin/core-common\";\r\nimport {\r\n AnimationNodeId,\r\n AttachToViewportArgs, collectMaskRefs, createSpatialTileTreeReferences, IModelConnection, SpatialTileTreeReferences, SpatialViewState,\r\n TileTreeLoadStatus, TileTreeOwner, TileTreeReference,\r\n Viewport,\r\n} from \"@itwin/core-frontend\";\r\nimport { Range3d } from \"@itwin/core-geometry\";\r\nimport { BatchedModelGroups } from \"./BatchedModelGroups.js\";\r\nimport { BatchedModels } from \"./BatchedModels.js\";\r\nimport { BatchedTilesetSpec } from \"./BatchedTilesetReader.js\";\r\nimport { BatchedTileTreeReference, BatchedTileTreeReferenceArgs } from \"./BatchedTileTreeReference.js\";\r\nimport { getBatchedTileTreeOwner } from \"./BatchedTileTreeSupplier.js\";\r\nimport { ComputeSpatialTilesetBaseUrl } from \"./FrontendTiles.js\";\r\nimport { loggerCategory } from \"./LoggerCategory.js\";\r\n\r\n// Obtains tiles pre-published by mesh export service.\r\nclass BatchedSpatialTileTreeReferences implements SpatialTileTreeReferences {\r\n private readonly _view: SpatialViewState;\r\n private readonly _models: BatchedModels;\r\n private readonly _groups: BatchedModelGroups;\r\n private readonly _spec: BatchedTilesetSpec;\r\n private _treeOwner: TileTreeOwner;\r\n private _refs: BatchedTileTreeReference[] = [];\r\n private _currentScript?: RenderSchedule.Script;\r\n private _onModelSelectorChanged?: () => void;\r\n /** Provides tile trees for models that are not included in the batched tile set. */\r\n private readonly _excludedRefs: SpatialTileTreeReferences;\r\n private _removeSceneInvalidationListener?: () => void;\r\n\r\n public constructor(spec: BatchedTilesetSpec, view: SpatialViewState) {\r\n this._view = view;\r\n this._models = new BatchedModels(view, spec.models);\r\n this._spec = spec;\r\n\r\n const script = view.displayStyle.scheduleScript;\r\n this._currentScript = script?.requiresBatching ? script : undefined;\r\n\r\n const includedModels = new Set(spec.models.keys());\r\n this._excludedRefs = createSpatialTileTreeReferences(view, includedModels);\r\n\r\n this._groups = new BatchedModelGroups(view, this._currentScript, includedModels, spec.models);\r\n this._treeOwner = this.getTreeOwner();\r\n this.loadRefs();\r\n\r\n this.listenForScriptChange();\r\n }\r\n\r\n private ensureLoaded(): void {\r\n if (!this._groups.update())\r\n return;\r\n\r\n this._treeOwner = this.getTreeOwner();\r\n this.loadRefs();\r\n }\r\n\r\n private getTreeOwner(): TileTreeOwner {\r\n return getBatchedTileTreeOwner(this._view.iModel, {\r\n spec: this._spec,\r\n script: this._currentScript,\r\n modelGroups: this._groups.guid,\r\n });\r\n }\r\n\r\n private listenForScriptChange(): void {\r\n const onScriptChanged = (newScript: RenderSchedule.Script | undefined) => {\r\n if (!newScript?.requiresBatching)\r\n newScript = undefined;\r\n\r\n const currentScript = this._currentScript;\r\n this._currentScript = newScript;\r\n\r\n if (newScript !== currentScript)\r\n if (!newScript || !currentScript || !newScript.equals(currentScript))\r\n this._groups.setScript(newScript);\r\n };\r\n\r\n let rmListener = this._view.displayStyle.onScheduleScriptChanged.addListener((newScript) => onScriptChanged(newScript));\r\n this._view.onDisplayStyleChanged.addListener((newStyle) => {\r\n rmListener();\r\n onScriptChanged(newStyle.scheduleScript);\r\n rmListener = this._view.displayStyle.onScheduleScriptChanged.addListener((newScript) => onScriptChanged(newScript));\r\n });\r\n }\r\n\r\n private loadRefs(): void {\r\n this._refs.length = 0;\r\n const groups = this._groups.groups;\r\n const args: BatchedTileTreeReferenceArgs = {\r\n models: this._models,\r\n groups,\r\n treeOwner: this._treeOwner,\r\n getCurrentTimePoint: () => this._currentScript ? (this._view.displayStyle.settings.timePoint ?? this._currentScript.duration.low) : 0,\r\n getBackgroundBase: () => this._view.displayStyle.settings.mapImagery.backgroundBase,\r\n getBackgroundLayers: () => this._view.displayStyle.settings.mapImagery.backgroundLayers,\r\n iModel: this._view.iModel,\r\n };\r\n\r\n for (let i = 0; i < groups.length; i++) {\r\n const timeline = groups[i].timeline;\r\n this._refs.push(new BatchedTileTreeReference(args, i, timeline ? AnimationNodeId.Untransformed : undefined));\r\n if (timeline) {\r\n for (const nodeId of timeline.transformBatchIds)\r\n this._refs.push(new BatchedTileTreeReference(args, i, nodeId));\r\n }\r\n }\r\n }\r\n\r\n public *[Symbol.iterator](): Iterator<TileTreeReference> {\r\n this.ensureLoaded();\r\n for (const ref of this._refs)\r\n yield ref;\r\n\r\n for (const ref of this._excludedRefs)\r\n yield ref;\r\n }\r\n\r\n public update(): void {\r\n this._excludedRefs.update();\r\n this._models.setViewedModels(this._view.modelSelector.models);\r\n if (this._onModelSelectorChanged)\r\n this._onModelSelectorChanged();\r\n }\r\n\r\n public attachToViewport(args: AttachToViewportArgs): void {\r\n this._onModelSelectorChanged = () => args.invalidateSymbologyOverrides();\r\n this._excludedRefs.attachToViewport(args);\r\n this._removeSceneInvalidationListener = args.onSceneInvalidated.addListener(() => this._groups.invalidateTransforms());\r\n }\r\n\r\n public detachFromViewport(): void {\r\n this._onModelSelectorChanged = undefined;\r\n this._excludedRefs.detachFromViewport();\r\n\r\n if (this._removeSceneInvalidationListener) {\r\n this._removeSceneInvalidationListener();\r\n this._removeSceneInvalidationListener = undefined;\r\n }\r\n }\r\n\r\n // Collects the TileTreeReferences for the models that need to be drawn to create the planar clip mask.\r\n // For every model used by the mask (modelIds), extend the maskRange by that model's range.\r\n public collectMaskRefs(modelIds: OrderedId64Iterable, maskTreeRefs: TileTreeReference[], maskRange: Range3d): void {\r\n // Use V1 tiles for masking - producing the mask from batched tiles can significantly impact performance.\r\n return collectMaskRefs(this._view, modelIds, undefined, maskTreeRefs, maskRange);\r\n }\r\n\r\n // Returns a list of the models that are NOT in the planar clip mask.\r\n public getModelsNotInMask(_maskModels: OrderedId64Iterable | undefined, _useVisible: boolean): Id64String[] | undefined {\r\n return undefined;\r\n }\r\n\r\n // _view.models\r\n public setDeactivated(): void {\r\n // Used for debugging. Unimplemented here.\r\n }\r\n}\r\n\r\n// A placeholder used by [[ProxySpatialTileTreeReferences]] until asynchronous loading completes.\r\n// It provides a TileTreeOwner that never loads a tile tree.\r\n// This ensures that [ViewState.areAllTileTreesLoaded]($frontend) will not return `true` while we are loading.\r\nclass ProxyTileTreeReference extends TileTreeReference {\r\n private readonly _treeOwner: TileTreeOwner;\r\n\r\n public constructor(iModel: IModelConnection) {\r\n super();\r\n this._treeOwner = {\r\n iModel,\r\n tileTree: undefined,\r\n loadStatus: TileTreeLoadStatus.NotLoaded,\r\n load: () => undefined,\r\n [Symbol.dispose]: () => { },\r\n loadTree: async () => Promise.resolve(undefined),\r\n };\r\n }\r\n\r\n public override get treeOwner() {\r\n return this._treeOwner;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public override get _isLoadingComplete() {\r\n return false;\r\n }\r\n}\r\n\r\n// Serves as a placeholder while we asynchronously obtain the base URL for a pre-published tileset (or asynchronously determine\r\n// that no such tileset exists).\r\nclass ProxySpatialTileTreeReferences implements SpatialTileTreeReferences {\r\n // Once async loading completes, all methods will be forwarded to this implementation.\r\n private _impl?: SpatialTileTreeReferences;\r\n private readonly _proxyRef: ProxyTileTreeReference;\r\n // Retained if attachToViewport is called while we are still loading; and reset if detachFromViewport is called while loading.\r\n private _attachArgs?: AttachToViewportArgs;\r\n\r\n public constructor(view: SpatialViewState, getSpec: Promise<BatchedTilesetSpec | null>, nopFallback: boolean = false) {\r\n this._proxyRef = new ProxyTileTreeReference(view.iModel);\r\n getSpec.then((spec: BatchedTilesetSpec | null) => {\r\n if (spec) {\r\n this.setTreeRefs(new BatchedSpatialTileTreeReferences(spec, view));\r\n } else if(nopFallback) {\r\n this.setTreeRefs(new EmptySpatialTileTreeReferences());\r\n }else {\r\n this.setTreeRefs(createSpatialTileTreeReferences(view));\r\n }\r\n }).catch(() => {\r\n if(nopFallback) {\r\n this.setTreeRefs(new EmptySpatialTileTreeReferences());\r\n }else {\r\n this.setTreeRefs(createSpatialTileTreeReferences(view));\r\n }\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 // Force scene invalidation after replacing Proxy with real BatchedTileTree\r\n this._attachArgs.invalidateScene();\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 public collectMaskRefs(modelIds: OrderedId64Iterable, maskTreeRefs: TileTreeReference[], maskRange: Range3d): void {\r\n this._impl?.collectMaskRefs(modelIds, maskTreeRefs, maskRange);\r\n }\r\n\r\n public getModelsNotInMask(maskModels: OrderedId64Iterable | undefined, useVisible: boolean): Id64String[] | undefined {\r\n if (this._impl)\r\n return this._impl.getModelsNotInMask(maskModels, useVisible);\r\n else\r\n return undefined;\r\n }\r\n}\r\n\r\nconst iModelToTilesetSpec = new Map<IModelConnection, BatchedTilesetSpec | null | Promise<BatchedTilesetSpec | null>>();\r\n\r\nasync function fetchTilesetSpec(iModel: IModelConnection, computeBaseUrl: ComputeSpatialTilesetBaseUrl): Promise<BatchedTilesetSpec | null> {\r\n try {\r\n const baseUrl = await computeBaseUrl(iModel);\r\n if (undefined === baseUrl)\r\n return null;\r\n\r\n const url = new URL(\"tileset.json\", baseUrl);\r\n url.search = baseUrl.search;\r\n const response = await fetch(url.toString());\r\n const json = await response.json();\r\n return BatchedTilesetSpec.create(baseUrl, json);\r\n } catch (err) {\r\n Logger.logException(loggerCategory, err);\r\n return null;\r\n }\r\n}\r\n\r\nclass EmptySpatialTileTreeReferences implements SpatialTileTreeReferences {\r\n public update(): void {}\r\n\r\n public setDeactivated(_modelIds: string | string[] | undefined, _deactivated: boolean | undefined, _refs: \"all\" | \"animated\" | \"primary\" | \"section\" | number[]): void {}\r\n\r\n public attachToViewport(_args: Viewport): void {}\r\n\r\n public detachFromViewport(): void {}\r\n\r\n public collectMaskRefs(_modelIds: OrderedId64Iterable, _maskTreeRefs: TileTreeReference[]): void {};\r\n\r\n public getModelsNotInMask(_maskModels: OrderedId64Iterable | undefined, _useVisible: boolean): string[] | undefined {\r\n return undefined;\r\n }\r\n\r\n public *[Symbol.iterator](): Iterator<TileTreeReference> {}\r\n}\r\n\r\n/** @internal */\r\nexport function createBatchedSpatialTileTreeReferences(view: SpatialViewState, computeBaseUrl: ComputeSpatialTilesetBaseUrl, nopFallback: boolean = false): SpatialTileTreeReferences {\r\n const iModel = view.iModel;\r\n let entry = iModelToTilesetSpec.get(iModel);\r\n if (undefined === entry) {\r\n const promise = entry = fetchTilesetSpec(iModel, computeBaseUrl);\r\n iModelToTilesetSpec.set(iModel, entry);\r\n iModel.onClose.addOnce(() => iModelToTilesetSpec.delete(iModel));\r\n\r\n promise.then((spec: BatchedTilesetSpec | null) => {\r\n if (iModelToTilesetSpec.has(iModel))\r\n iModelToTilesetSpec.set(iModel, spec);\r\n }).catch(() => {\r\n if (iModelToTilesetSpec.has(iModel))\r\n iModelToTilesetSpec.set(iModel, null);\r\n });\r\n }\r\n\r\n if (null === entry) {\r\n // No tileset could be obtained for this iModel - use empty tile tree if requested.\r\n if (nopFallback) {\r\n return new EmptySpatialTileTreeReferences();\r\n }\r\n\r\n // No tileset could be obtained for this iModel - use default tile generation instead.\r\n return createSpatialTileTreeReferences(view);\r\n }\r\n\r\n if (entry instanceof Promise)\r\n return new ProxySpatialTileTreeReferences(view, entry, nopFallback);\r\n\r\n return new BatchedSpatialTileTreeReferences(entry, view);\r\n}\r\n\r\n"]}
1
+ {"version":3,"file":"BatchedSpatialTileTreeRefs.js","sourceRoot":"","sources":["../../src/BatchedSpatialTileTreeRefs.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\nimport { Id64String, Logger, OrderedId64Iterable } from \"@itwin/core-bentley\";\r\nimport { RenderSchedule } from \"@itwin/core-common\";\r\nimport {\r\n AnimationNodeId,\r\n AttachToViewportArgs, collectMaskRefs, createSpatialTileTreeReferences, IModelConnection, SpatialTileTreeReferences, SpatialViewState,\r\n TileTreeLoadStatus, TileTreeOwner, TileTreeReference,\r\n Viewport,\r\n} from \"@itwin/core-frontend\";\r\nimport { Range3d } from \"@itwin/core-geometry\";\r\nimport { BatchedModelGroups } from \"./BatchedModelGroups.js\";\r\nimport { BatchedModels } from \"./BatchedModels.js\";\r\nimport { BatchedTilesetSpec } from \"./BatchedTilesetReader.js\";\r\nimport { BatchedTileTreeReference, BatchedTileTreeReferenceArgs } from \"./BatchedTileTreeReference.js\";\r\nimport { getBatchedTileTreeOwner } from \"./BatchedTileTreeSupplier.js\";\r\nimport { ComputeSpatialTilesetBaseUrl } from \"./FrontendTiles.js\";\r\nimport { loggerCategory } from \"./LoggerCategory.js\";\r\n\r\n// Obtains tiles pre-published by mesh export service.\r\nclass BatchedSpatialTileTreeReferences implements SpatialTileTreeReferences {\r\n private readonly _view: SpatialViewState;\r\n private readonly _models: BatchedModels;\r\n private readonly _groups: BatchedModelGroups;\r\n private readonly _spec: BatchedTilesetSpec;\r\n private _treeOwner: TileTreeOwner;\r\n private _refs: BatchedTileTreeReference[] = [];\r\n private _currentScript?: RenderSchedule.Script;\r\n private _onModelSelectorChanged?: () => void;\r\n /** Provides tile trees for models that are not included in the batched tile set. */\r\n private readonly _excludedRefs: SpatialTileTreeReferences;\r\n private _removeSceneInvalidationListener?: () => void;\r\n\r\n public constructor(spec: BatchedTilesetSpec, view: SpatialViewState) {\r\n this._view = view;\r\n this._models = new BatchedModels(view, spec.models);\r\n this._spec = spec;\r\n\r\n const script = view.displayStyle.scheduleScript;\r\n this._currentScript = script?.requiresBatching ? script : undefined;\r\n\r\n const includedModels = new Set(spec.models.keys());\r\n this._excludedRefs = createSpatialTileTreeReferences(view, includedModels);\r\n\r\n this._groups = new BatchedModelGroups(view, this._currentScript, includedModels, spec.models);\r\n this._treeOwner = this.getTreeOwner();\r\n this.loadRefs();\r\n\r\n this.listenForScriptChange();\r\n }\r\n\r\n private ensureLoaded(): void {\r\n if (!this._groups.update())\r\n return;\r\n\r\n this._treeOwner = this.getTreeOwner();\r\n this.loadRefs();\r\n }\r\n\r\n private getTreeOwner(): TileTreeOwner {\r\n return getBatchedTileTreeOwner(this._view.iModel, {\r\n spec: this._spec,\r\n script: this._currentScript,\r\n modelGroups: this._groups.guid,\r\n });\r\n }\r\n\r\n private listenForScriptChange(): void {\r\n const onScriptChanged = (newScript: RenderSchedule.Script | undefined) => {\r\n if (!newScript?.requiresBatching)\r\n newScript = undefined;\r\n\r\n const currentScript = this._currentScript;\r\n this._currentScript = newScript;\r\n\r\n if (newScript !== currentScript)\r\n if (!newScript || !currentScript || !newScript.equals(currentScript))\r\n this._groups.setScript(newScript);\r\n };\r\n\r\n let rmListener = this._view.displayStyle.onScheduleScriptChanged.addListener((newScript) => onScriptChanged(newScript));\r\n this._view.onDisplayStyleChanged.addListener((newStyle) => {\r\n rmListener();\r\n onScriptChanged(newStyle.scheduleScript);\r\n rmListener = this._view.displayStyle.onScheduleScriptChanged.addListener((newScript) => onScriptChanged(newScript));\r\n });\r\n }\r\n\r\n private loadRefs(): void {\r\n this._refs.length = 0;\r\n const groups = this._groups.groups;\r\n const args: BatchedTileTreeReferenceArgs = {\r\n models: this._models,\r\n groups,\r\n treeOwner: this._treeOwner,\r\n getCurrentTimePoint: () => this._currentScript ? (this._view.displayStyle.settings.timePoint ?? this._currentScript.duration.low) : 0,\r\n getBackgroundBase: () => this._view.displayStyle.settings.mapImagery.backgroundBase,\r\n getBackgroundLayers: () => this._view.displayStyle.settings.mapImagery.backgroundLayers,\r\n iModel: this._view.iModel,\r\n };\r\n\r\n for (let i = 0; i < groups.length; i++) {\r\n const timeline = groups[i].timeline;\r\n this._refs.push(new BatchedTileTreeReference(args, i, timeline ? AnimationNodeId.Untransformed : undefined));\r\n if (timeline) {\r\n for (const nodeId of timeline.transformBatchIds)\r\n this._refs.push(new BatchedTileTreeReference(args, i, nodeId));\r\n }\r\n }\r\n }\r\n\r\n public *[Symbol.iterator](): Iterator<TileTreeReference> {\r\n this.ensureLoaded();\r\n for (const ref of this._refs)\r\n yield ref;\r\n\r\n for (const ref of this._excludedRefs)\r\n yield ref;\r\n }\r\n\r\n public update(): void {\r\n this._excludedRefs.update();\r\n this._models.setViewedModels(this._view.modelSelector.models);\r\n if (this._onModelSelectorChanged)\r\n this._onModelSelectorChanged();\r\n }\r\n\r\n public attachToViewport(args: AttachToViewportArgs): void {\r\n this._onModelSelectorChanged = () => args.invalidateSymbologyOverrides();\r\n this._excludedRefs.attachToViewport(args);\r\n this._removeSceneInvalidationListener = args.onSceneInvalidated.addListener(() => this._groups.invalidateTransforms());\r\n }\r\n\r\n public detachFromViewport(): void {\r\n this._onModelSelectorChanged = undefined;\r\n this._excludedRefs.detachFromViewport();\r\n\r\n if (this._removeSceneInvalidationListener) {\r\n this._removeSceneInvalidationListener();\r\n this._removeSceneInvalidationListener = undefined;\r\n }\r\n }\r\n\r\n // Collects the TileTreeReferences for the models that need to be drawn to create the planar clip mask.\r\n // For every model used by the mask (modelIds), extend the maskRange by that model's range.\r\n public collectMaskRefs(modelIds: OrderedId64Iterable, maskTreeRefs: TileTreeReference[], maskRange: Range3d): void {\r\n // Use V1 tiles for masking - producing the mask from batched tiles can significantly impact performance.\r\n return collectMaskRefs(this._view, modelIds, undefined, maskTreeRefs, maskRange);\r\n }\r\n\r\n // Returns a list of the models that are NOT in the planar clip mask.\r\n public getModelsNotInMask(_maskModels: OrderedId64Iterable | undefined, _useVisible: boolean): Id64String[] | undefined {\r\n return undefined;\r\n }\r\n\r\n // _view.models\r\n public setDeactivated(): void {\r\n // Used for debugging. Unimplemented here.\r\n }\r\n}\r\n\r\n// A placeholder used by [[ProxySpatialTileTreeReferences]] until asynchronous loading completes.\r\n// It provides a TileTreeOwner that never loads a tile tree.\r\n// This ensures that [ViewState.areAllTileTreesLoaded]($frontend) will not return `true` while we are loading.\r\nclass ProxyTileTreeReference extends TileTreeReference {\r\n private readonly _treeOwner: TileTreeOwner;\r\n\r\n public constructor(iModel: IModelConnection) {\r\n super();\r\n this._treeOwner = {\r\n iModel,\r\n tileTree: undefined,\r\n loadStatus: TileTreeLoadStatus.NotLoaded,\r\n load: () => undefined,\r\n [Symbol.dispose]: () => { },\r\n loadTree: async () => Promise.resolve(undefined),\r\n };\r\n }\r\n\r\n public override get treeOwner() {\r\n return this._treeOwner;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public override get _isLoadingComplete() {\r\n return false;\r\n }\r\n}\r\n\r\n// Serves as a placeholder while we asynchronously obtain the base URL for a pre-published tileset (or asynchronously determine\r\n// that no such tileset exists).\r\nclass ProxySpatialTileTreeReferences implements SpatialTileTreeReferences {\r\n // Once async loading completes, all methods will be forwarded to this implementation.\r\n private _impl?: SpatialTileTreeReferences;\r\n private readonly _proxyRef: ProxyTileTreeReference;\r\n // Retained if attachToViewport is called while we are still loading; and reset if detachFromViewport is called while loading.\r\n private _attachArgs?: AttachToViewportArgs;\r\n\r\n public constructor(view: SpatialViewState, getSpec: Promise<BatchedTilesetSpec | null>, nopFallback: boolean = false) {\r\n this._proxyRef = new ProxyTileTreeReference(view.iModel);\r\n getSpec.then((spec: BatchedTilesetSpec | null) => {\r\n if (spec) {\r\n this.setTreeRefs(new BatchedSpatialTileTreeReferences(spec, view));\r\n } else if(nopFallback) {\r\n this.setTreeRefs(new EmptySpatialTileTreeReferences());\r\n }else {\r\n this.setTreeRefs(createSpatialTileTreeReferences(view));\r\n }\r\n }).catch(() => {\r\n if(nopFallback) {\r\n this.setTreeRefs(new EmptySpatialTileTreeReferences());\r\n }else {\r\n this.setTreeRefs(createSpatialTileTreeReferences(view));\r\n }\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 // Force scene invalidation after replacing Proxy with real BatchedTileTree\r\n this._attachArgs.invalidateScene();\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 public collectMaskRefs(modelIds: OrderedId64Iterable, maskTreeRefs: TileTreeReference[], maskRange: Range3d): void {\r\n this._impl?.collectMaskRefs(modelIds, maskTreeRefs, maskRange);\r\n }\r\n\r\n public getModelsNotInMask(maskModels: OrderedId64Iterable | undefined, useVisible: boolean): Id64String[] | undefined {\r\n if (this._impl)\r\n return this._impl.getModelsNotInMask(maskModels, useVisible);\r\n else\r\n return undefined;\r\n }\r\n}\r\n\r\nconst iModelToTilesetSpec = new Map<IModelConnection, BatchedTilesetSpec | null | Promise<BatchedTilesetSpec | null>>();\r\n\r\nasync function fetchTilesetSpec(iModel: IModelConnection, computeBaseUrl: ComputeSpatialTilesetBaseUrl): Promise<BatchedTilesetSpec | null> {\r\n try {\r\n const baseUrl = await computeBaseUrl(iModel);\r\n if (undefined === baseUrl)\r\n return null;\r\n\r\n const url = new URL(\"tileset.json\", baseUrl);\r\n url.search = baseUrl.search;\r\n const response = await fetch(url.toString());\r\n const json = await response.json();\r\n return BatchedTilesetSpec.create(baseUrl, json);\r\n } catch (err) {\r\n Logger.logError(loggerCategory, err);\r\n return null;\r\n }\r\n}\r\n\r\nclass EmptySpatialTileTreeReferences implements SpatialTileTreeReferences {\r\n public update(): void {}\r\n\r\n public setDeactivated(_modelIds: string | string[] | undefined, _deactivated: boolean | undefined, _refs: \"all\" | \"animated\" | \"primary\" | \"section\" | number[]): void {}\r\n\r\n public attachToViewport(_args: Viewport): void {}\r\n\r\n public detachFromViewport(): void {}\r\n\r\n public collectMaskRefs(_modelIds: OrderedId64Iterable, _maskTreeRefs: TileTreeReference[]): void {};\r\n\r\n public getModelsNotInMask(_maskModels: OrderedId64Iterable | undefined, _useVisible: boolean): string[] | undefined {\r\n return undefined;\r\n }\r\n\r\n public *[Symbol.iterator](): Iterator<TileTreeReference> {}\r\n}\r\n\r\n/** @internal */\r\nexport function createBatchedSpatialTileTreeReferences(view: SpatialViewState, computeBaseUrl: ComputeSpatialTilesetBaseUrl, nopFallback: boolean = false): SpatialTileTreeReferences {\r\n const iModel = view.iModel;\r\n let entry = iModelToTilesetSpec.get(iModel);\r\n if (undefined === entry) {\r\n const promise = entry = fetchTilesetSpec(iModel, computeBaseUrl);\r\n iModelToTilesetSpec.set(iModel, entry);\r\n iModel.onClose.addOnce(() => iModelToTilesetSpec.delete(iModel));\r\n\r\n promise.then((spec: BatchedTilesetSpec | null) => {\r\n if (iModelToTilesetSpec.has(iModel))\r\n iModelToTilesetSpec.set(iModel, spec);\r\n }).catch(() => {\r\n if (iModelToTilesetSpec.has(iModel))\r\n iModelToTilesetSpec.set(iModel, null);\r\n });\r\n }\r\n\r\n if (null === entry) {\r\n // No tileset could be obtained for this iModel - use empty tile tree if requested.\r\n if (nopFallback) {\r\n return new EmptySpatialTileTreeReferences();\r\n }\r\n\r\n // No tileset could be obtained for this iModel - use default tile generation instead.\r\n return createSpatialTileTreeReferences(view);\r\n }\r\n\r\n if (entry instanceof Promise)\r\n return new ProxySpatialTileTreeReferences(view, entry, nopFallback);\r\n\r\n return new BatchedSpatialTileTreeReferences(entry, view);\r\n}\r\n\r\n"]}
@@ -88,7 +88,7 @@ export class BatchedTile extends Tile {
88
88
  }
89
89
  }
90
90
  catch (err) {
91
- Logger.logException(loggerCategory, err);
91
+ Logger.logError(loggerCategory, err);
92
92
  children = undefined;
93
93
  if (err instanceof Error)
94
94
  reject(err);
@@ -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 GraphicBranch, GraphicBuilder, IModelApp, RealityTileLoader, RenderSystem, Tile, TileBoundingBoxes, TileContent,\r\n TileDrawArgs, TileParams, TileRequest, TileRequestChannel, TileTreeLoadStatus, TileUser, TileVisibility, Viewport,\r\n} from \"@itwin/core-frontend\";\r\nimport { Transform } from \"@itwin/core-geometry\";\r\nimport { BatchedTileTree } from \"./BatchedTileTree.js\";\r\nimport { frontendTilesOptions } from \"./FrontendTiles.js\";\r\nimport { IndexedDBCache, LocalCache, PassThroughCache } from \"./IndexedDBCache.js\";\r\nimport { loggerCategory } from \"./LoggerCategory.js\";\r\n\r\n/** @internal */\r\nexport interface BatchedTileParams extends TileParams {\r\n childrenProps: Tileset3dSchema.Tile[] | undefined;\r\n /** See BatchedTile.transformToRoot. */\r\n transformToRoot: Transform | undefined;\r\n}\r\n\r\nlet channel: TileRequestChannel | undefined;\r\n\r\n/** @internal */\r\nexport class BatchedTile extends Tile {\r\n private readonly _childrenProps?: Tileset3dSchema.Tile[];\r\n private readonly _unskippable: boolean;\r\n /** Transform from the tile's local coordinate system to that of the tileset. */\r\n public readonly transformToRoot?: Transform;\r\n private readonly _localCache: LocalCache;\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 this._localCache = frontendTilesOptions.useIndexedDBCache ? new IndexedDBCache(\"BatchedTileCache\") : new PassThroughCache();\r\n\r\n if (!params.transformToRoot)\r\n return;\r\n\r\n this.transformToRoot = params.transformToRoot;\r\n this.boundingSphere.transformBy(this.transformToRoot, this.boundingSphere);\r\n this.transformToRoot.multiplyRange(this.range, this.range);\r\n if (this._contentRange)\r\n this.transformToRoot.multiplyRange(this._contentRange, this._contentRange);\r\n\r\n }\r\n\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 this._localCache.fetch(url.pathname.toString(), fetch, url.toString());\r\n return response;\r\n }\r\n\r\n public override async readContent(data: TileRequest.ResponseData, system: RenderSystem, isCanceled?: () => boolean): Promise<TileContent> {\r\n assert(data instanceof Uint8Array);\r\n if (!(data instanceof Uint8Array))\r\n return { };\r\n\r\n try {\r\n const modelGroups = this.batchedTree.modelGroups;\r\n\r\n const content = await this.batchedTree.decoder.decode({\r\n stream: ByteStream.fromUint8Array(data),\r\n options: { tileId: this.contentId },\r\n system,\r\n isCanceled,\r\n isLeaf: this.isLeaf,\r\n // Don't waste time attempting to split based on model groupings if all models are in the same group.\r\n modelGroups: modelGroups && modelGroups.length > 1 ? modelGroups : undefined,\r\n tileData: {\r\n ecefTransform: this.tree.iModel.ecefLocation?.getTransform() ?? Transform.createIdentity(),\r\n range: this.range,\r\n layerClassifiers: this.tree.layerHandler?.layerClassifiers,\r\n },\r\n });\r\n\r\n if (this.transformToRoot) {\r\n if (content.graphic) {\r\n const branch = new GraphicBranch(true);\r\n branch.add(content.graphic);\r\n content.graphic = system.createBranch(branch, this.transformToRoot);\r\n }\r\n\r\n if (content.contentRange)\r\n content.contentRange = this.transformToRoot.multiplyRange(content.contentRange);\r\n }\r\n\r\n return content;\r\n } catch {\r\n return { isLeaf: true };\r\n }\r\n }\r\n\r\n protected override addRangeGraphic(builder: GraphicBuilder, type: TileBoundingBoxes): void {\r\n if (TileBoundingBoxes.ChildVolumes !== type) {\r\n super.addRangeGraphic(builder, type);\r\n return;\r\n }\r\n\r\n builder.setSymbology(ColorDef.green, ColorDef.green, 2);\r\n builder.addRangeBox(this.range);\r\n\r\n this.loadChildren();\r\n const children = this.children;\r\n if (!children)\r\n return;\r\n\r\n builder.setSymbology(ColorDef.blue, ColorDef.blue.withTransparency(0xdf), 1);\r\n for (const child of children) {\r\n const range = child.range;\r\n builder.addRangeBox(range);\r\n builder.addRangeBox(range, true);\r\n }\r\n }\r\n\r\n public prune(olderThan: BeTimePoint): void {\r\n const children = this._batchedChildren;\r\n if (!children)\r\n return;\r\n\r\n if (this.usageMarker.isExpired(olderThan)) {\r\n this.disposeChildren();\r\n } else {\r\n for (const child of children)\r\n child.prune(olderThan);\r\n }\r\n }\r\n}\r\n"]}
1
+ {"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 GraphicBranch, GraphicBuilder, IModelApp, RealityTileLoader, RenderSystem, Tile, TileBoundingBoxes, TileContent,\r\n TileDrawArgs, TileParams, TileRequest, TileRequestChannel, TileTreeLoadStatus, TileUser, TileVisibility, Viewport,\r\n} from \"@itwin/core-frontend\";\r\nimport { Transform } from \"@itwin/core-geometry\";\r\nimport { BatchedTileTree } from \"./BatchedTileTree.js\";\r\nimport { frontendTilesOptions } from \"./FrontendTiles.js\";\r\nimport { IndexedDBCache, LocalCache, PassThroughCache } from \"./IndexedDBCache.js\";\r\nimport { loggerCategory } from \"./LoggerCategory.js\";\r\n\r\n/** @internal */\r\nexport interface BatchedTileParams extends TileParams {\r\n childrenProps: Tileset3dSchema.Tile[] | undefined;\r\n /** See BatchedTile.transformToRoot. */\r\n transformToRoot: Transform | undefined;\r\n}\r\n\r\nlet channel: TileRequestChannel | undefined;\r\n\r\n/** @internal */\r\nexport class BatchedTile extends Tile {\r\n private readonly _childrenProps?: Tileset3dSchema.Tile[];\r\n private readonly _unskippable: boolean;\r\n /** Transform from the tile's local coordinate system to that of the tileset. */\r\n public readonly transformToRoot?: Transform;\r\n private readonly _localCache: LocalCache;\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 this._localCache = frontendTilesOptions.useIndexedDBCache ? new IndexedDBCache(\"BatchedTileCache\") : new PassThroughCache();\r\n\r\n if (!params.transformToRoot)\r\n return;\r\n\r\n this.transformToRoot = params.transformToRoot;\r\n this.boundingSphere.transformBy(this.transformToRoot, this.boundingSphere);\r\n this.transformToRoot.multiplyRange(this.range, this.range);\r\n if (this._contentRange)\r\n this.transformToRoot.multiplyRange(this._contentRange, this._contentRange);\r\n\r\n }\r\n\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.logError(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 this._localCache.fetch(url.pathname.toString(), fetch, url.toString());\r\n return response;\r\n }\r\n\r\n public override async readContent(data: TileRequest.ResponseData, system: RenderSystem, isCanceled?: () => boolean): Promise<TileContent> {\r\n assert(data instanceof Uint8Array);\r\n if (!(data instanceof Uint8Array))\r\n return { };\r\n\r\n try {\r\n const modelGroups = this.batchedTree.modelGroups;\r\n\r\n const content = await this.batchedTree.decoder.decode({\r\n stream: ByteStream.fromUint8Array(data),\r\n options: { tileId: this.contentId },\r\n system,\r\n isCanceled,\r\n isLeaf: this.isLeaf,\r\n // Don't waste time attempting to split based on model groupings if all models are in the same group.\r\n modelGroups: modelGroups && modelGroups.length > 1 ? modelGroups : undefined,\r\n tileData: {\r\n ecefTransform: this.tree.iModel.ecefLocation?.getTransform() ?? Transform.createIdentity(),\r\n range: this.range,\r\n layerClassifiers: this.tree.layerHandler?.layerClassifiers,\r\n },\r\n });\r\n\r\n if (this.transformToRoot) {\r\n if (content.graphic) {\r\n const branch = new GraphicBranch(true);\r\n branch.add(content.graphic);\r\n content.graphic = system.createBranch(branch, this.transformToRoot);\r\n }\r\n\r\n if (content.contentRange)\r\n content.contentRange = this.transformToRoot.multiplyRange(content.contentRange);\r\n }\r\n\r\n return content;\r\n } catch {\r\n return { isLeaf: true };\r\n }\r\n }\r\n\r\n protected override addRangeGraphic(builder: GraphicBuilder, type: TileBoundingBoxes): void {\r\n if (TileBoundingBoxes.ChildVolumes !== type) {\r\n super.addRangeGraphic(builder, type);\r\n return;\r\n }\r\n\r\n builder.setSymbology(ColorDef.green, ColorDef.green, 2);\r\n builder.addRangeBox(this.range);\r\n\r\n this.loadChildren();\r\n const children = this.children;\r\n if (!children)\r\n return;\r\n\r\n builder.setSymbology(ColorDef.blue, ColorDef.blue.withTransparency(0xdf), 1);\r\n for (const child of children) {\r\n const range = child.range;\r\n builder.addRangeBox(range);\r\n builder.addRangeBox(range, true);\r\n }\r\n }\r\n\r\n public prune(olderThan: BeTimePoint): void {\r\n const children = this._batchedChildren;\r\n if (!children)\r\n return;\r\n\r\n if (this.usageMarker.isExpired(olderThan)) {\r\n this.disposeChildren();\r\n } else {\r\n for (const child of children)\r\n child.prune(olderThan);\r\n }\r\n }\r\n}\r\n"]}
@@ -22,7 +22,7 @@ class BatchedTileTreeSupplier {
22
22
  return new BatchedTileTree(params);
23
23
  }
24
24
  catch (err) {
25
- Logger.logException(loggerCategory, err);
25
+ Logger.logError(loggerCategory, err);
26
26
  return undefined;
27
27
  }
28
28
  }
@@ -1 +1 @@
1
- {"version":3,"file":"BatchedTileTreeSupplier.js","sourceRoot":"","sources":["../../src/BatchedTileTreeSupplier.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAE/F,OAAO,EAAE,wBAAwB,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAK1G,OAAO,EAAE,oBAAoB,EAAsB,MAAM,2BAA2B,CAAC;AACrF,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAarD,MAAM,uBAAuB;IACpB,kBAAkB,CAAC,GAAsB,EAAE,GAAsB;QACtE,OAAO,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;eAC1E,cAAc,CAAC,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,WAAW,CAAC;eAChD,wBAAwB,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAClF,CAAC;IAEM,KAAK,CAAC,cAAc,CAAC,MAAyB,EAAE,MAAwB;QAC7E,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAClI,MAAM,MAAM,GAAG,IAAI,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;YACnE,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,kBAAkB,EAAE,CAAC;YAEjD,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;YAC9B,OAAO,IAAI,eAAe,CAAC,MAAM,CAAC,CAAC;QACrC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,YAAY,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;YACzC,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;CACF;AAED,MAAM,uBAAuB,GAAqB,IAAI,uBAAuB,EAAE,CAAC;AAEhF,gBAAgB;AAChB,MAAM,UAAU,uBAAuB,CAAC,MAAwB,EAAE,MAAyB;IACzF,OAAO,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,MAAM,EAAE,uBAAuB,CAAC,CAAC;AACxE,CAAC","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 { comparePossiblyUndefined, compareStrings, CompressedId64Set, Logger } from \"@itwin/core-bentley\";\r\nimport { RenderSchedule } from \"@itwin/core-common\";\r\nimport {\r\n IModelConnection, TileTree, TileTreeOwner, TileTreeSupplier,\r\n} from \"@itwin/core-frontend\";\r\nimport { BatchedTilesetReader, BatchedTilesetSpec } from \"./BatchedTilesetReader.js\";\r\nimport { BatchedTileTree } from \"./BatchedTileTree.js\";\r\nimport { loggerCategory } from \"./LoggerCategory.js\";\r\n\r\n/** @internal */\r\nexport interface BatchedTileTreeId {\r\n spec: BatchedTilesetSpec;\r\n script?: RenderSchedule.Script;\r\n /** A stringified representation of the [[ModelGroup]]s by which to structure the contents of the tiles.\r\n * Every unique combination of model groups has a corresponding unique string representation.\r\n * @see [[BatchedModelGroups.guid]].\r\n */\r\n modelGroups: string;\r\n}\r\n\r\nclass BatchedTileTreeSupplier implements TileTreeSupplier {\r\n public compareTileTreeIds(lhs: BatchedTileTreeId, rhs: BatchedTileTreeId): number {\r\n return compareStrings(lhs.spec.baseUrl.toString(), rhs.spec.baseUrl.toString())\r\n || compareStrings(lhs.modelGroups, rhs.modelGroups)\r\n || comparePossiblyUndefined((x, y) => x.compareTo(y), lhs.script, rhs.script);\r\n }\r\n\r\n public async createTileTree(treeId: BatchedTileTreeId, iModel: IModelConnection): Promise<TileTree | undefined> {\r\n const spec = treeId.spec;\r\n try {\r\n const modelGroups = treeId.modelGroups ? treeId.modelGroups.split(\"_\").map((x) => CompressedId64Set.decompressSet(x)) : undefined;\r\n const reader = new BatchedTilesetReader(spec, iModel, modelGroups);\r\n const params = await reader.readTileTreeParams();\r\n\r\n params.script = treeId.script;\r\n return new BatchedTileTree(params);\r\n } catch (err) {\r\n Logger.logException(loggerCategory, err);\r\n return undefined;\r\n }\r\n }\r\n}\r\n\r\nconst batchedTileTreeSupplier: TileTreeSupplier = new BatchedTileTreeSupplier();\r\n\r\n/** @internal */\r\nexport function getBatchedTileTreeOwner(iModel: IModelConnection, treeId: BatchedTileTreeId): TileTreeOwner {\r\n return iModel.tiles.getTileTreeOwner(treeId, batchedTileTreeSupplier);\r\n}\r\n"]}
1
+ {"version":3,"file":"BatchedTileTreeSupplier.js","sourceRoot":"","sources":["../../src/BatchedTileTreeSupplier.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAE/F,OAAO,EAAE,wBAAwB,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAK1G,OAAO,EAAE,oBAAoB,EAAsB,MAAM,2BAA2B,CAAC;AACrF,OAAO,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAarD,MAAM,uBAAuB;IACpB,kBAAkB,CAAC,GAAsB,EAAE,GAAsB;QACtE,OAAO,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;eAC1E,cAAc,CAAC,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,WAAW,CAAC;eAChD,wBAAwB,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAClF,CAAC;IAEM,KAAK,CAAC,cAAc,CAAC,MAAyB,EAAE,MAAwB;QAC7E,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;QACzB,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,iBAAiB,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAClI,MAAM,MAAM,GAAG,IAAI,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC;YACnE,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,kBAAkB,EAAE,CAAC;YAEjD,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;YAC9B,OAAO,IAAI,eAAe,CAAC,MAAM,CAAC,CAAC;QACrC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,QAAQ,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;YACrC,OAAO,SAAS,CAAC;QACnB,CAAC;IACH,CAAC;CACF;AAED,MAAM,uBAAuB,GAAqB,IAAI,uBAAuB,EAAE,CAAC;AAEhF,gBAAgB;AAChB,MAAM,UAAU,uBAAuB,CAAC,MAAwB,EAAE,MAAyB;IACzF,OAAO,MAAM,CAAC,KAAK,CAAC,gBAAgB,CAAC,MAAM,EAAE,uBAAuB,CAAC,CAAC;AACxE,CAAC","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 { comparePossiblyUndefined, compareStrings, CompressedId64Set, Logger } from \"@itwin/core-bentley\";\r\nimport { RenderSchedule } from \"@itwin/core-common\";\r\nimport {\r\n IModelConnection, TileTree, TileTreeOwner, TileTreeSupplier,\r\n} from \"@itwin/core-frontend\";\r\nimport { BatchedTilesetReader, BatchedTilesetSpec } from \"./BatchedTilesetReader.js\";\r\nimport { BatchedTileTree } from \"./BatchedTileTree.js\";\r\nimport { loggerCategory } from \"./LoggerCategory.js\";\r\n\r\n/** @internal */\r\nexport interface BatchedTileTreeId {\r\n spec: BatchedTilesetSpec;\r\n script?: RenderSchedule.Script;\r\n /** A stringified representation of the [[ModelGroup]]s by which to structure the contents of the tiles.\r\n * Every unique combination of model groups has a corresponding unique string representation.\r\n * @see [[BatchedModelGroups.guid]].\r\n */\r\n modelGroups: string;\r\n}\r\n\r\nclass BatchedTileTreeSupplier implements TileTreeSupplier {\r\n public compareTileTreeIds(lhs: BatchedTileTreeId, rhs: BatchedTileTreeId): number {\r\n return compareStrings(lhs.spec.baseUrl.toString(), rhs.spec.baseUrl.toString())\r\n || compareStrings(lhs.modelGroups, rhs.modelGroups)\r\n || comparePossiblyUndefined((x, y) => x.compareTo(y), lhs.script, rhs.script);\r\n }\r\n\r\n public async createTileTree(treeId: BatchedTileTreeId, iModel: IModelConnection): Promise<TileTree | undefined> {\r\n const spec = treeId.spec;\r\n try {\r\n const modelGroups = treeId.modelGroups ? treeId.modelGroups.split(\"_\").map((x) => CompressedId64Set.decompressSet(x)) : undefined;\r\n const reader = new BatchedTilesetReader(spec, iModel, modelGroups);\r\n const params = await reader.readTileTreeParams();\r\n\r\n params.script = treeId.script;\r\n return new BatchedTileTree(params);\r\n } catch (err) {\r\n Logger.logError(loggerCategory, err);\r\n return undefined;\r\n }\r\n }\r\n}\r\n\r\nconst batchedTileTreeSupplier: TileTreeSupplier = new BatchedTileTreeSupplier();\r\n\r\n/** @internal */\r\nexport function getBatchedTileTreeOwner(iModel: IModelConnection, treeId: BatchedTileTreeId): TileTreeOwner {\r\n return iModel.tiles.getTileTreeOwner(treeId, batchedTileTreeSupplier);\r\n}\r\n"]}
@@ -42,7 +42,7 @@ export async function* queryGraphicRepresentations(args) {
42
42
  result = await response.json();
43
43
  }
44
44
  catch (err) {
45
- Logger.logException(loggerCategory, err);
45
+ Logger.logError(loggerCategory, err);
46
46
  Logger.logError(loggerCategory, `Failed loading Graphics Data for Source ${args.dataSource.id}`);
47
47
  break;
48
48
  }
@@ -1 +1 @@
1
- {"version":3,"file":"GraphicRepresentationProvider.js","sourceRoot":"","sources":["../../../src/GraphicsProvider/GraphicRepresentationProvider.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, ITWINJS_CORE_VERSION } from \"@itwin/core-frontend\";\r\nimport { loggerCategory } from \"../LoggerCategory.js\";\r\n\r\n/** The expected format of the Graphic Representation\r\n * @beta\r\n */\r\n// eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents\r\nexport type GraphicRepresentationFormat = \"3DFT\" | \"3DTiles\" | \"CESIUM\" | \"IMODEL\" | string;\r\n\r\n/** Graphic representations are generated from Data Sources.\r\n * The status of a Graphic Representation indicates the progress of that generation process.\r\n * @beta\r\n */\r\nexport type GraphicRepresentationStatus = \"Complete\" | \"InProgress\" | \"Invalid\" | \"NotStarted\";\r\n\r\n/**\r\n * Represents a data source for a graphic representation.\r\n * A data source is usually higher-fidelity and contains more information, but may not be as well suited for visualization\r\n * as a graphic representation.\r\n * @beta\r\n */\r\nexport interface DataSource {\r\n /** The iTwinId associated with the DataSource */\r\n iTwinId: string;\r\n /** The unique identifier of a DataSource.\r\n * For example, a DataSource of type \"IMODEL\" has an iModelId which would be attributed to this value.\r\n */\r\n id: string;\r\n /** The unique identifier for a specific version of a DataSource.\r\n * For example, if a specific version of an iModel is desired, the iModel's changesetId would be attributed to this value.\r\n */\r\n changeId?: string;\r\n /** The type of the data source. For example, a DataSource can be of type \"IMODEL\" or \"RealityData\" */\r\n type: string;\r\n}\r\n\r\n/** Represents a visual representation of a data source, for example a 3d tileset.\r\n * A data source can be an iModel, reality data, or other kind of graphical data.\r\n * @see [[queryGraphicRepresentations]] for its construction as a representation of the data produced by a query of data sources.\r\n * @beta\r\n */\r\nexport interface GraphicRepresentation {\r\n /** The display name of the Graphic Representation */\r\n displayName: string;\r\n /** The unique identifier for the Graphic Representation */\r\n representationId: string;\r\n /** The status of the generation of the Graphic Representation from its Data Source.\r\n * @see [[GraphicRepresentationStatus]] for possible values.\r\n */\r\n status: GraphicRepresentationStatus;\r\n /** The expected format of the Graphic Representation\r\n * @see [[GraphicRepresentationFormat]] for possible values.\r\n */\r\n format: GraphicRepresentationFormat;\r\n /** The data source that the representation originates from.\r\n * For example, a GraphicRepresentation in the 3D Tiles format might have a dataSource that is a specific iModel changeset.\r\n */\r\n dataSource: DataSource;\r\n /** The url of the graphic representation\r\n * @note The url can only be guaranteed to be valid if the status is complete.\r\n */\r\n url: string | undefined;\r\n}\r\n\r\n/** Creates a URL used to query for Graphic Representations\r\n * @internal\r\n */\r\nexport function createGraphicRepresentationsQueryUrl(args: { sourceId: string, sourceType: string, urlPrefix?: string, changeId?: string, enableCDN?: boolean, numExports?: number }): string {\r\n const prefix = args.urlPrefix ?? \"\";\r\n const numExports = args.numExports ?? 5;\r\n let url = `https://${prefix}api.bentley.com/mesh-export/?iModelId=${args.sourceId}&$orderBy=date:desc&$top=${numExports}`;\r\n\r\n if (args.changeId)\r\n url = `${url}&changesetId=${args.changeId}`;\r\n\r\n if (args.enableCDN)\r\n url = `${url}&cdn=1`;\r\n\r\n const tileVersion = IModelApp.tileAdmin.maximumMajorTileFormatVersion.toString();\r\n url = `${url}&tileVersion=${tileVersion}&iTwinJS=${ITWINJS_CORE_VERSION}&exportType=${args.sourceType}`;\r\n\r\n return url;\r\n}\r\n\r\n/** Represents an export object from a response from the Mesh Export Service.\r\n * @internal\r\n */\r\ninterface ServiceJsonResponse {\r\n id: string;\r\n displayName: string;\r\n status: GraphicRepresentationStatus;\r\n request: {\r\n iModelId: string;\r\n changesetId: string;\r\n exportType: string;\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/** Represents a response from the Mesh Export Service.\r\n * @internal\r\n */\r\ninterface ServiceJsonResponses {\r\n exports: ServiceJsonResponse[];\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 [[queryGraphicRepresentations]].\r\n * @beta\r\n */\r\nexport interface QueryGraphicRepresentationsArgs {\r\n /** The token used to access the data source provider. */\r\n accessToken: AccessToken;\r\n /** The unique identifier for the session in which this data source was queried.\r\n * A possible value is IModelApp.sessionId.\r\n */\r\n sessionId: string;\r\n /** The Data Source for which to query the graphic representations */\r\n dataSource: DataSource;\r\n /** The expected format of the graphic representations\r\n * @see [[GraphicRepresentationFormat]] for possible values.\r\n */\r\n format: GraphicRepresentationFormat;\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 /** If true, enables a CDN (content delivery network) to access tiles faster. */\r\n enableCDN?: boolean;\r\n /** Number of exports to query */\r\n numExports?: number;\r\n}\r\n\r\n/** Query Graphic Representations matching the specified criteria, sorted from most-recently- to least-recently-produced.\r\n * @beta\r\n */\r\nexport async function* queryGraphicRepresentations(args: QueryGraphicRepresentationsArgs): AsyncIterableIterator<GraphicRepresentation> {\r\n const headers = {\r\n /* eslint-disable-next-line @typescript-eslint/naming-convention */\r\n Authorization: args.accessToken,\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 /* eslint-disable-next-line @typescript-eslint/naming-convention */\r\n SessionId: args.sessionId,\r\n };\r\n\r\n let url: string | undefined = createGraphicRepresentationsQueryUrl({ sourceId: args.dataSource.id, sourceType: args.dataSource.type, urlPrefix: args.urlPrefix, changeId: args.dataSource.changeId, enableCDN: args.enableCDN, numExports: args.numExports });\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 ServiceJsonResponses;\r\n } catch (err) {\r\n Logger.logException(loggerCategory, err);\r\n Logger.logError(loggerCategory, `Failed loading Graphics Data for Source ${args.dataSource.id}`);\r\n break;\r\n }\r\n\r\n const foundSources = result.exports.filter((x) => x.request.exportType === args.dataSource.type && (args.includeIncomplete || x.status === \"Complete\"));\r\n for (const foundSource of foundSources) {\r\n const graphicRepresentation: GraphicRepresentation = {\r\n displayName: foundSource.displayName,\r\n representationId: foundSource.id,\r\n status: foundSource.status,\r\n format: args.format,\r\n url: foundSource._links?.mesh.href,\r\n dataSource: {\r\n iTwinId: args.dataSource.iTwinId,\r\n id: foundSource.request.iModelId,\r\n changeId: foundSource.request.changesetId,\r\n type: foundSource.request.exportType,\r\n },\r\n };\r\n\r\n yield graphicRepresentation;\r\n }\r\n\r\n url = result._links.next?.href;\r\n }\r\n}\r\n\r\n/** Arguments supplied to [[obtainGraphicRepresentationUrl]].\r\n * @beta\r\n */\r\nexport interface ObtainGraphicRepresentationUrlArgs {\r\n /** The token used to access the mesh export service. */\r\n accessToken: AccessToken;\r\n /** The unique identifier for the session in which this data source was queried.\r\n * A possible value is IModelApp.sessionId.\r\n */\r\n sessionId: string;\r\n /** The data source for which to query the graphic representations */\r\n dataSource: DataSource;\r\n /** The expected format of the graphic representations\r\n * @see [[GraphicRepresentationFormat]] for possible values.\r\n */\r\n format: GraphicRepresentationFormat;\r\n /** Chiefly used in testing environments. */\r\n urlPrefix?: string;\r\n /** If true, only data produced for a specific data source version will be considered;\r\n * otherwise, if no data sources are found with the specified version,the most recent data source version will be used.\r\n */\r\n requireExactVersion?: boolean;\r\n /** If true, enables a CDN (content delivery network) to access tiles faster. */\r\n enableCDN?: boolean;\r\n}\r\n\r\n/** Obtains a URL pointing to a Graphic Representation.\r\n * [[queryGraphicRepresentations]] is used to obtain a list of available representations. By default, the list is sorted from most to least recently-created.\r\n * The first representation matching the source version is selected; or, if no such representation exists, the first representation 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 obtainGraphicRepresentationUrl(args: ObtainGraphicRepresentationUrlArgs): Promise<URL | undefined> {\r\n if (!args.dataSource.id) {\r\n Logger.logInfo(loggerCategory, \"Cannot obtain Graphics Data from a source without an Id\");\r\n return undefined;\r\n }\r\n\r\n const queryArgs: QueryGraphicRepresentationsArgs = {\r\n accessToken: args.accessToken,\r\n sessionId: args.sessionId,\r\n dataSource: args.dataSource,\r\n format: args.format,\r\n urlPrefix: args.urlPrefix,\r\n enableCDN: args.enableCDN,\r\n };\r\n\r\n let selectedData;\r\n for await (const data of queryGraphicRepresentations(queryArgs)) {\r\n selectedData = data;\r\n break;\r\n }\r\n\r\n if (!selectedData && !args.requireExactVersion) {\r\n queryArgs.dataSource.changeId = undefined;\r\n for await (const data of queryGraphicRepresentations(queryArgs)) {\r\n selectedData = data;\r\n Logger.logInfo(loggerCategory, `No data for Data Source ${args.dataSource.id} for version ${args.dataSource.changeId}; falling back to most recent`);\r\n break;\r\n }\r\n }\r\n\r\n if ((!selectedData) || (!selectedData.url)) {\r\n Logger.logInfo(loggerCategory, `No data available for Data Source ${args.dataSource.id}`);\r\n return undefined;\r\n }\r\n\r\n const url = new URL(selectedData.url);\r\n url.pathname = `${url.pathname}/tileset.json`;\r\n return url;\r\n}\r\n"]}
1
+ {"version":3,"file":"GraphicRepresentationProvider.js","sourceRoot":"","sources":["../../../src/GraphicsProvider/GraphicRepresentationProvider.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, ITWINJS_CORE_VERSION } from \"@itwin/core-frontend\";\r\nimport { loggerCategory } from \"../LoggerCategory.js\";\r\n\r\n/** The expected format of the Graphic Representation\r\n * @beta\r\n */\r\n// eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents\r\nexport type GraphicRepresentationFormat = \"3DFT\" | \"3DTiles\" | \"CESIUM\" | \"IMODEL\" | string;\r\n\r\n/** Graphic representations are generated from Data Sources.\r\n * The status of a Graphic Representation indicates the progress of that generation process.\r\n * @beta\r\n */\r\nexport type GraphicRepresentationStatus = \"Complete\" | \"InProgress\" | \"Invalid\" | \"NotStarted\";\r\n\r\n/**\r\n * Represents a data source for a graphic representation.\r\n * A data source is usually higher-fidelity and contains more information, but may not be as well suited for visualization\r\n * as a graphic representation.\r\n * @beta\r\n */\r\nexport interface DataSource {\r\n /** The iTwinId associated with the DataSource */\r\n iTwinId: string;\r\n /** The unique identifier of a DataSource.\r\n * For example, a DataSource of type \"IMODEL\" has an iModelId which would be attributed to this value.\r\n */\r\n id: string;\r\n /** The unique identifier for a specific version of a DataSource.\r\n * For example, if a specific version of an iModel is desired, the iModel's changesetId would be attributed to this value.\r\n */\r\n changeId?: string;\r\n /** The type of the data source. For example, a DataSource can be of type \"IMODEL\" or \"RealityData\" */\r\n type: string;\r\n}\r\n\r\n/** Represents a visual representation of a data source, for example a 3d tileset.\r\n * A data source can be an iModel, reality data, or other kind of graphical data.\r\n * @see [[queryGraphicRepresentations]] for its construction as a representation of the data produced by a query of data sources.\r\n * @beta\r\n */\r\nexport interface GraphicRepresentation {\r\n /** The display name of the Graphic Representation */\r\n displayName: string;\r\n /** The unique identifier for the Graphic Representation */\r\n representationId: string;\r\n /** The status of the generation of the Graphic Representation from its Data Source.\r\n * @see [[GraphicRepresentationStatus]] for possible values.\r\n */\r\n status: GraphicRepresentationStatus;\r\n /** The expected format of the Graphic Representation\r\n * @see [[GraphicRepresentationFormat]] for possible values.\r\n */\r\n format: GraphicRepresentationFormat;\r\n /** The data source that the representation originates from.\r\n * For example, a GraphicRepresentation in the 3D Tiles format might have a dataSource that is a specific iModel changeset.\r\n */\r\n dataSource: DataSource;\r\n /** The url of the graphic representation\r\n * @note The url can only be guaranteed to be valid if the status is complete.\r\n */\r\n url: string | undefined;\r\n}\r\n\r\n/** Creates a URL used to query for Graphic Representations\r\n * @internal\r\n */\r\nexport function createGraphicRepresentationsQueryUrl(args: { sourceId: string, sourceType: string, urlPrefix?: string, changeId?: string, enableCDN?: boolean, numExports?: number }): string {\r\n const prefix = args.urlPrefix ?? \"\";\r\n const numExports = args.numExports ?? 5;\r\n let url = `https://${prefix}api.bentley.com/mesh-export/?iModelId=${args.sourceId}&$orderBy=date:desc&$top=${numExports}`;\r\n\r\n if (args.changeId)\r\n url = `${url}&changesetId=${args.changeId}`;\r\n\r\n if (args.enableCDN)\r\n url = `${url}&cdn=1`;\r\n\r\n const tileVersion = IModelApp.tileAdmin.maximumMajorTileFormatVersion.toString();\r\n url = `${url}&tileVersion=${tileVersion}&iTwinJS=${ITWINJS_CORE_VERSION}&exportType=${args.sourceType}`;\r\n\r\n return url;\r\n}\r\n\r\n/** Represents an export object from a response from the Mesh Export Service.\r\n * @internal\r\n */\r\ninterface ServiceJsonResponse {\r\n id: string;\r\n displayName: string;\r\n status: GraphicRepresentationStatus;\r\n request: {\r\n iModelId: string;\r\n changesetId: string;\r\n exportType: string;\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/** Represents a response from the Mesh Export Service.\r\n * @internal\r\n */\r\ninterface ServiceJsonResponses {\r\n exports: ServiceJsonResponse[];\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 [[queryGraphicRepresentations]].\r\n * @beta\r\n */\r\nexport interface QueryGraphicRepresentationsArgs {\r\n /** The token used to access the data source provider. */\r\n accessToken: AccessToken;\r\n /** The unique identifier for the session in which this data source was queried.\r\n * A possible value is IModelApp.sessionId.\r\n */\r\n sessionId: string;\r\n /** The Data Source for which to query the graphic representations */\r\n dataSource: DataSource;\r\n /** The expected format of the graphic representations\r\n * @see [[GraphicRepresentationFormat]] for possible values.\r\n */\r\n format: GraphicRepresentationFormat;\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 /** If true, enables a CDN (content delivery network) to access tiles faster. */\r\n enableCDN?: boolean;\r\n /** Number of exports to query */\r\n numExports?: number;\r\n}\r\n\r\n/** Query Graphic Representations matching the specified criteria, sorted from most-recently- to least-recently-produced.\r\n * @beta\r\n */\r\nexport async function* queryGraphicRepresentations(args: QueryGraphicRepresentationsArgs): AsyncIterableIterator<GraphicRepresentation> {\r\n const headers = {\r\n /* eslint-disable-next-line @typescript-eslint/naming-convention */\r\n Authorization: args.accessToken,\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 /* eslint-disable-next-line @typescript-eslint/naming-convention */\r\n SessionId: args.sessionId,\r\n };\r\n\r\n let url: string | undefined = createGraphicRepresentationsQueryUrl({ sourceId: args.dataSource.id, sourceType: args.dataSource.type, urlPrefix: args.urlPrefix, changeId: args.dataSource.changeId, enableCDN: args.enableCDN, numExports: args.numExports });\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 ServiceJsonResponses;\r\n } catch (err) {\r\n Logger.logError(loggerCategory, err);\r\n Logger.logError(loggerCategory, `Failed loading Graphics Data for Source ${args.dataSource.id}`);\r\n break;\r\n }\r\n\r\n const foundSources = result.exports.filter((x) => x.request.exportType === args.dataSource.type && (args.includeIncomplete || x.status === \"Complete\"));\r\n for (const foundSource of foundSources) {\r\n const graphicRepresentation: GraphicRepresentation = {\r\n displayName: foundSource.displayName,\r\n representationId: foundSource.id,\r\n status: foundSource.status,\r\n format: args.format,\r\n url: foundSource._links?.mesh.href,\r\n dataSource: {\r\n iTwinId: args.dataSource.iTwinId,\r\n id: foundSource.request.iModelId,\r\n changeId: foundSource.request.changesetId,\r\n type: foundSource.request.exportType,\r\n },\r\n };\r\n\r\n yield graphicRepresentation;\r\n }\r\n\r\n url = result._links.next?.href;\r\n }\r\n}\r\n\r\n/** Arguments supplied to [[obtainGraphicRepresentationUrl]].\r\n * @beta\r\n */\r\nexport interface ObtainGraphicRepresentationUrlArgs {\r\n /** The token used to access the mesh export service. */\r\n accessToken: AccessToken;\r\n /** The unique identifier for the session in which this data source was queried.\r\n * A possible value is IModelApp.sessionId.\r\n */\r\n sessionId: string;\r\n /** The data source for which to query the graphic representations */\r\n dataSource: DataSource;\r\n /** The expected format of the graphic representations\r\n * @see [[GraphicRepresentationFormat]] for possible values.\r\n */\r\n format: GraphicRepresentationFormat;\r\n /** Chiefly used in testing environments. */\r\n urlPrefix?: string;\r\n /** If true, only data produced for a specific data source version will be considered;\r\n * otherwise, if no data sources are found with the specified version,the most recent data source version will be used.\r\n */\r\n requireExactVersion?: boolean;\r\n /** If true, enables a CDN (content delivery network) to access tiles faster. */\r\n enableCDN?: boolean;\r\n}\r\n\r\n/** Obtains a URL pointing to a Graphic Representation.\r\n * [[queryGraphicRepresentations]] is used to obtain a list of available representations. By default, the list is sorted from most to least recently-created.\r\n * The first representation matching the source version is selected; or, if no such representation exists, the first representation 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 obtainGraphicRepresentationUrl(args: ObtainGraphicRepresentationUrlArgs): Promise<URL | undefined> {\r\n if (!args.dataSource.id) {\r\n Logger.logInfo(loggerCategory, \"Cannot obtain Graphics Data from a source without an Id\");\r\n return undefined;\r\n }\r\n\r\n const queryArgs: QueryGraphicRepresentationsArgs = {\r\n accessToken: args.accessToken,\r\n sessionId: args.sessionId,\r\n dataSource: args.dataSource,\r\n format: args.format,\r\n urlPrefix: args.urlPrefix,\r\n enableCDN: args.enableCDN,\r\n };\r\n\r\n let selectedData;\r\n for await (const data of queryGraphicRepresentations(queryArgs)) {\r\n selectedData = data;\r\n break;\r\n }\r\n\r\n if (!selectedData && !args.requireExactVersion) {\r\n queryArgs.dataSource.changeId = undefined;\r\n for await (const data of queryGraphicRepresentations(queryArgs)) {\r\n selectedData = data;\r\n Logger.logInfo(loggerCategory, `No data for Data Source ${args.dataSource.id} for version ${args.dataSource.changeId}; falling back to most recent`);\r\n break;\r\n }\r\n }\r\n\r\n if ((!selectedData) || (!selectedData.url)) {\r\n Logger.logInfo(loggerCategory, `No data available for Data Source ${args.dataSource.id}`);\r\n return undefined;\r\n }\r\n\r\n const url = new URL(selectedData.url);\r\n url.pathname = `${url.pathname}/tileset.json`;\r\n return url;\r\n}\r\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@itwin/frontend-tiles",
3
- "version": "5.7.0-dev.8",
3
+ "version": "5.8.0-dev.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",
@@ -28,10 +28,10 @@
28
28
  "url": "http://www.bentley.com"
29
29
  },
30
30
  "peerDependencies": {
31
- "@itwin/core-common": "5.7.0-dev.8",
32
- "@itwin/core-bentley": "5.7.0-dev.8",
33
- "@itwin/core-frontend": "5.7.0-dev.8",
34
- "@itwin/core-geometry": "5.7.0-dev.8"
31
+ "@itwin/core-common": "5.8.0-dev.1",
32
+ "@itwin/core-frontend": "5.8.0-dev.1",
33
+ "@itwin/core-geometry": "5.8.0-dev.1",
34
+ "@itwin/core-bentley": "5.8.0-dev.1"
35
35
  },
36
36
  "devDependencies": {
37
37
  "@itwin/eslint-plugin": "^6.0.0",
@@ -52,13 +52,13 @@
52
52
  "source-map-loader": "^5.0.0",
53
53
  "typescript": "~5.6.2",
54
54
  "webpack": "^5.97.1",
55
- "@itwin/build-tools": "5.7.0-dev.8",
56
- "@itwin/core-bentley": "5.7.0-dev.8",
57
- "@itwin/certa": "5.7.0-dev.8",
58
- "internal-tools": "3.0.0-dev.69",
59
- "@itwin/core-geometry": "5.7.0-dev.8",
60
- "@itwin/core-frontend": "5.7.0-dev.8",
61
- "@itwin/core-common": "5.7.0-dev.8"
55
+ "@itwin/build-tools": "5.8.0-dev.1",
56
+ "@itwin/certa": "5.8.0-dev.1",
57
+ "@itwin/core-frontend": "5.8.0-dev.1",
58
+ "@itwin/core-common": "5.8.0-dev.1",
59
+ "@itwin/core-bentley": "5.8.0-dev.1",
60
+ "@itwin/core-geometry": "5.8.0-dev.1",
61
+ "internal-tools": "3.0.0-dev.69"
62
62
  },
63
63
  "scripts": {
64
64
  "build": "npm run -s build:cjs && npm run -s build:esm",