@itwin/frontend-tiles 4.3.0-dev.37 → 4.3.0-dev.39

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"BatchedModels.js","sourceRoot":"","sources":["../../src/BatchedModels.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 { Id64, Id64String } from \"@itwin/core-bentley\";\r\nimport { Range3d } from \"@itwin/core-geometry\";\r\nimport { ModelExtentsProps } from \"@itwin/core-common\";\r\nimport { IModelConnection, SpatialModelState, SpatialViewState } from \"@itwin/core-frontend\";\r\n\r\ninterface ModelMetadata {\r\n extents?: Range3d;\r\n isRealityModel: boolean;\r\n}\r\n\r\nexport class BatchedModels {\r\n private readonly _iModel: IModelConnection;\r\n private _viewedModels!: Set<Id64String>;\r\n private readonly _viewedExtents = new Range3d();\r\n private readonly _viewedModelIdPairs = new Id64.Uint32Set();\r\n private readonly _metadata = new Map<Id64String, ModelMetadata>();\r\n private _modelRangePromise?: Promise<void>;\r\n public readonly viewedRealityModelIds = new Set<Id64String>();\r\n\r\n public constructor(view: SpatialViewState) {\r\n this._iModel = view.iModel;\r\n this.setViewedModels(view.modelSelector.models);\r\n }\r\n\r\n public setViewedModels(models: Set<Id64String>): void {\r\n this._viewedModels = models;\r\n this._viewedModelIdPairs.clear();\r\n this._viewedModelIdPairs.addIds(models);\r\n this._viewedExtents.setNull();\r\n this.viewedRealityModelIds.clear();\r\n\r\n this._modelRangePromise = undefined;\r\n const rangeQueryModels: Id64String[] = [];\r\n\r\n for (const modelId of models) {\r\n let metadata = this._metadata.get(modelId);\r\n if (!metadata) {\r\n const model = this._iModel.models.getLoaded(modelId);\r\n this._metadata.set(modelId, metadata = { isRealityModel: model instanceof SpatialModelState && model.isRealityModel });\r\n }\r\n\r\n if (metadata.isRealityModel)\r\n this.viewedRealityModelIds.add(modelId);\r\n\r\n if (undefined === metadata.extents)\r\n rangeQueryModels.push(modelId);\r\n else\r\n this._viewedExtents.extendRange(metadata.extents);\r\n }\r\n\r\n if (rangeQueryModels.length === 0)\r\n return;\r\n\r\n const modelRangePromise = this._modelRangePromise = this._iModel.models.queryExtents(rangeQueryModels).then((extents: ModelExtentsProps[]) => {\r\n if (modelRangePromise !== this._modelRangePromise)\r\n return;\r\n\r\n this._modelRangePromise = undefined;\r\n for (const extent of extents) {\r\n const metadata = this._metadata.get(extent.id);\r\n if (metadata) {\r\n metadata.extents = Range3d.fromJSON(extent.extents);\r\n this._viewedExtents.extendRange(metadata.extents);\r\n }\r\n }\r\n }).catch(() => { });\r\n }\r\n\r\n public views(modelId: Id64String): boolean {\r\n return this._viewedModels.has(modelId);\r\n }\r\n\r\n public isViewed(modelIdLo: number, modelIdHi: number): boolean {\r\n return this._viewedModelIdPairs.has(modelIdLo, modelIdHi);\r\n }\r\n\r\n public unionRange(range: Range3d): void {\r\n range.extendRange(this._viewedExtents);\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"BatchedModels.js","sourceRoot":"","sources":["../../src/BatchedModels.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\nimport { Id64, Id64String } from \"@itwin/core-bentley\";\nimport { Range3d } from \"@itwin/core-geometry\";\nimport { ModelExtentsProps } from \"@itwin/core-common\";\nimport { IModelConnection, SpatialModelState, SpatialViewState } from \"@itwin/core-frontend\";\n\ninterface ModelMetadata {\n extents?: Range3d;\n isRealityModel: boolean;\n}\n\nexport class BatchedModels {\n private readonly _iModel: IModelConnection;\n private _viewedModels!: Set<Id64String>;\n private readonly _viewedExtents = new Range3d();\n private readonly _viewedModelIdPairs = new Id64.Uint32Set();\n private readonly _metadata = new Map<Id64String, ModelMetadata>();\n private _modelRangePromise?: Promise<void>;\n public readonly viewedRealityModelIds = new Set<Id64String>();\n\n public constructor(view: SpatialViewState) {\n this._iModel = view.iModel;\n this.setViewedModels(view.modelSelector.models);\n }\n\n public setViewedModels(models: Set<Id64String>): void {\n this._viewedModels = models;\n this._viewedModelIdPairs.clear();\n this._viewedModelIdPairs.addIds(models);\n this._viewedExtents.setNull();\n this.viewedRealityModelIds.clear();\n\n this._modelRangePromise = undefined;\n const rangeQueryModels: Id64String[] = [];\n\n for (const modelId of models) {\n let metadata = this._metadata.get(modelId);\n if (!metadata) {\n const model = this._iModel.models.getLoaded(modelId);\n this._metadata.set(modelId, metadata = { isRealityModel: model instanceof SpatialModelState && model.isRealityModel });\n }\n\n if (metadata.isRealityModel)\n this.viewedRealityModelIds.add(modelId);\n\n if (undefined === metadata.extents)\n rangeQueryModels.push(modelId);\n else\n this._viewedExtents.extendRange(metadata.extents);\n }\n\n if (rangeQueryModels.length === 0)\n return;\n\n const modelRangePromise = this._modelRangePromise = this._iModel.models.queryExtents(rangeQueryModels).then((extents: ModelExtentsProps[]) => {\n if (modelRangePromise !== this._modelRangePromise)\n return;\n\n this._modelRangePromise = undefined;\n for (const extent of extents) {\n const metadata = this._metadata.get(extent.id);\n if (metadata) {\n metadata.extents = Range3d.fromJSON(extent.extents);\n this._viewedExtents.extendRange(metadata.extents);\n }\n }\n }).catch(() => { });\n }\n\n public views(modelId: Id64String): boolean {\n return this._viewedModels.has(modelId);\n }\n\n public isViewed(modelIdLo: number, modelIdHi: number): boolean {\n return this._viewedModelIdPairs.has(modelIdLo, modelIdHi);\n }\n\n public unionRange(range: Range3d): void {\n range.extendRange(this._viewedExtents);\n }\n}\n"]}
@@ -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 { assert, Id64String } from \"@itwin/core-bentley\";\r\nimport { RenderSchedule } from \"@itwin/core-common\";\r\nimport {\r\n AttachToViewportArgs, IModelConnection, SpatialModelState, SpatialTileTreeReferences, SpatialViewState, TileTreeLoadStatus, TileTreeOwner, TileTreeReference,\r\n} from \"@itwin/core-frontend\";\r\nimport { AnimatedBatchedTileTreeReference, PrimaryBatchedTileTreeReference } from \"./BatchedTileTreeReference\";\r\nimport { getBatchedTileTreeOwner } from \"./BatchedTileTreeSupplier\";\r\nimport { BatchedModels } from \"./BatchedModels\";\r\nimport { ComputeSpatialTilesetBaseUrl, createFallbackSpatialTileTreeReferences } from \"./FrontendTiles\";\r\n\r\n// Obtains tiles pre-published by mesh export service.\r\nclass BatchedSpatialTileTreeReferences implements SpatialTileTreeReferences {\r\n private readonly _view: SpatialViewState;\r\n private readonly _models: BatchedModels;\r\n private _currentScript?: RenderSchedule.Script;\r\n private _primaryRef!: PrimaryBatchedTileTreeReference;\r\n private readonly _animatedRefs: AnimatedBatchedTileTreeReference[] = [];\r\n private _realityTreeRefs = new Map<Id64String, TileTreeReference>();\r\n private _onModelSelectorChanged?: () => void;\r\n\r\n public constructor(baseUrl: URL, view: SpatialViewState) {\r\n this._view = view;\r\n this._models = new BatchedModels(view);\r\n\r\n const script = view.displayStyle.scheduleScript;\r\n this._currentScript = script?.requiresBatching ? script : undefined;\r\n\r\n this.load(baseUrl, view.iModel);\r\n\r\n assert(undefined !== this._primaryRef);\r\n }\r\n\r\n private load(baseUrl: URL, iModel: IModelConnection): void {\r\n const treeOwner = getBatchedTileTreeOwner(iModel, { baseUrl, script: this._currentScript });\r\n this._primaryRef = new PrimaryBatchedTileTreeReference(treeOwner, this._models);\r\n\r\n this.populateAnimatedReferences(treeOwner);\r\n this.populateRealityModels();\r\n\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.load(baseUrl, iModel);\r\n };\r\n\r\n let removeScriptChangedListener = this._view.displayStyle.onScheduleScriptChanged.addListener((newScript) => onScriptChanged(newScript));\r\n this._view.onDisplayStyleChanged.addListener((newStyle) => {\r\n removeScriptChangedListener();\r\n onScriptChanged(newStyle.scheduleScript);\r\n removeScriptChangedListener = this._view.displayStyle.onScheduleScriptChanged.addListener((newScript) => onScriptChanged(newScript));\r\n });\r\n }\r\n\r\n public *[Symbol.iterator](): Iterator<TileTreeReference> {\r\n yield this._primaryRef;\r\n\r\n for (const animatedRef of this._animatedRefs)\r\n yield animatedRef;\r\n\r\n for (const realityTreeRef of this._realityTreeRefs.values())\r\n yield realityTreeRef;\r\n }\r\n\r\n private populateAnimatedReferences(treeOwner: TileTreeOwner): void {\r\n this._animatedRefs.length = 0;\r\n const script = this._currentScript;\r\n if (!script)\r\n return;\r\n\r\n const getCurrentTimePoint = () => this._view.displayStyle.settings.timePoint ?? script.duration.low;\r\n for (const timeline of script.modelTimelines) {\r\n const nodeIds = timeline.transformBatchIds;\r\n for (const nodeId of nodeIds) {\r\n this._animatedRefs.push(new AnimatedBatchedTileTreeReference(treeOwner, {\r\n timeline,\r\n nodeId,\r\n getCurrentTimePoint,\r\n }));\r\n }\r\n }\r\n }\r\n\r\n private populateRealityModels(): void {\r\n const prevRefs = this._realityTreeRefs;\r\n this._realityTreeRefs = new Map<Id64String, TileTreeReference>();\r\n for (const modelId of this._models.viewedRealityModelIds) {\r\n let ref = prevRefs.get(modelId);\r\n if (!ref) {\r\n const model = this._view.iModel.models.getLoaded(modelId);\r\n if (model && model instanceof SpatialModelState) {\r\n assert(model.isRealityModel);\r\n ref = model.createTileTreeReference(this._view);\r\n }\r\n }\r\n\r\n if (ref)\r\n this._realityTreeRefs.set(modelId, ref);\r\n }\r\n }\r\n\r\n public update(): void {\r\n this._models.setViewedModels(this._view.modelSelector.models);\r\n this.populateRealityModels();\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 }\r\n\r\n public detachFromViewport(): void {\r\n this._onModelSelectorChanged = undefined;\r\n }\r\n\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 dispose: () => { },\r\n loadTree: async () => Promise.resolve(undefined),\r\n };\r\n }\r\n\r\n public override get treeOwner() {\r\n return this._treeOwner;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public override get _isLoadingComplete() {\r\n return false;\r\n }\r\n}\r\n\r\n// Serves as a placeholder while we asynchronously obtain the base URL for a pre-published tileset (or asynchronously determine\r\n// that no such tileset exists).\r\nclass ProxySpatialTileTreeReferences implements SpatialTileTreeReferences {\r\n // Once async loading completes, all methods will be forwarded to this implementation.\r\n private _impl?: SpatialTileTreeReferences;\r\n private readonly _proxyRef: ProxyTileTreeReference;\r\n // Retained if attachToViewport is called while we are still loading; and reset if detachFromViewport is called while loading.\r\n private _attachArgs?: AttachToViewportArgs;\r\n\r\n public constructor(view: SpatialViewState, getBaseUrl: Promise<URL | undefined>) {\r\n this._proxyRef = new ProxyTileTreeReference(view.iModel);\r\n getBaseUrl.then((url: URL | undefined) => {\r\n if (url) {\r\n this.setTreeRefs(new BatchedSpatialTileTreeReferences(url, view));\r\n } else {\r\n this.setTreeRefs(createFallbackSpatialTileTreeReferences(view));\r\n }\r\n }).catch(() => {\r\n this.setTreeRefs(createFallbackSpatialTileTreeReferences(view));\r\n });\r\n }\r\n\r\n private setTreeRefs(refs: SpatialTileTreeReferences): void {\r\n this._impl = refs;\r\n if (this._attachArgs) {\r\n this._impl.attachToViewport(this._attachArgs);\r\n this._attachArgs.invalidateSymbologyOverrides();\r\n this._attachArgs = undefined;\r\n }\r\n }\r\n\r\n public update(): void {\r\n this._impl?.update();\r\n }\r\n\r\n public attachToViewport(args: AttachToViewportArgs): void {\r\n if (this._impl)\r\n this._impl.attachToViewport(args);\r\n else\r\n this._attachArgs = args;\r\n }\r\n\r\n public detachFromViewport(): void {\r\n if (this._impl)\r\n this._impl.detachFromViewport();\r\n else\r\n this._attachArgs = undefined;\r\n }\r\n\r\n public setDeactivated(): void { }\r\n\r\n public *[Symbol.iterator](): Iterator<TileTreeReference> {\r\n if (this._impl) {\r\n for (const ref of this._impl)\r\n yield ref;\r\n } else {\r\n yield this._proxyRef;\r\n }\r\n }\r\n}\r\n\r\nconst iModelToBaseUrl = new Map<IModelConnection, URL | null | Promise<URL | undefined>>();\r\n\r\n/** @internal */\r\nexport function createBatchedSpatialTileTreeReferences(view: SpatialViewState, computeBaseUrl: ComputeSpatialTilesetBaseUrl): SpatialTileTreeReferences {\r\n const iModel = view.iModel;\r\n let entry = iModelToBaseUrl.get(iModel);\r\n if (undefined === entry) {\r\n const promise = computeBaseUrl(iModel);\r\n iModelToBaseUrl.set(iModel, entry = promise);\r\n iModel.onClose.addOnce(() => iModelToBaseUrl.delete(iModel));\r\n promise.then((url: URL | undefined) => {\r\n if (iModelToBaseUrl.has(iModel))\r\n iModelToBaseUrl.set(iModel, url ?? null);\r\n }).catch(() => {\r\n if (iModelToBaseUrl.has(iModel))\r\n iModelToBaseUrl.set(iModel, null);\r\n });\r\n }\r\n\r\n if (null === entry) {\r\n // No tileset exists for this iModel - use default tile generation instead.\r\n return createFallbackSpatialTileTreeReferences(view);\r\n }\r\n\r\n if (entry instanceof Promise)\r\n return new ProxySpatialTileTreeReferences(view, entry);\r\n\r\n 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":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\nimport { assert, Id64String } from \"@itwin/core-bentley\";\nimport { RenderSchedule } from \"@itwin/core-common\";\nimport {\n AttachToViewportArgs, IModelConnection, SpatialModelState, SpatialTileTreeReferences, SpatialViewState, TileTreeLoadStatus, TileTreeOwner, TileTreeReference,\n} from \"@itwin/core-frontend\";\nimport { AnimatedBatchedTileTreeReference, PrimaryBatchedTileTreeReference } from \"./BatchedTileTreeReference\";\nimport { getBatchedTileTreeOwner } from \"./BatchedTileTreeSupplier\";\nimport { BatchedModels } from \"./BatchedModels\";\nimport { ComputeSpatialTilesetBaseUrl, createFallbackSpatialTileTreeReferences } from \"./FrontendTiles\";\n\n// Obtains tiles pre-published by mesh export service.\nclass BatchedSpatialTileTreeReferences implements SpatialTileTreeReferences {\n private readonly _view: SpatialViewState;\n private readonly _models: BatchedModels;\n private _currentScript?: RenderSchedule.Script;\n private _primaryRef!: PrimaryBatchedTileTreeReference;\n private readonly _animatedRefs: AnimatedBatchedTileTreeReference[] = [];\n private _realityTreeRefs = new Map<Id64String, TileTreeReference>();\n private _onModelSelectorChanged?: () => void;\n\n public constructor(baseUrl: URL, view: SpatialViewState) {\n this._view = view;\n this._models = new BatchedModels(view);\n\n const script = view.displayStyle.scheduleScript;\n this._currentScript = script?.requiresBatching ? script : undefined;\n\n this.load(baseUrl, view.iModel);\n\n assert(undefined !== this._primaryRef);\n }\n\n private load(baseUrl: URL, iModel: IModelConnection): void {\n const treeOwner = getBatchedTileTreeOwner(iModel, { baseUrl, script: this._currentScript });\n this._primaryRef = new PrimaryBatchedTileTreeReference(treeOwner, this._models);\n\n this.populateAnimatedReferences(treeOwner);\n this.populateRealityModels();\n\n const onScriptChanged = (newScript: RenderSchedule.Script | undefined) => {\n if (!newScript?.requiresBatching)\n newScript = undefined;\n\n const currentScript = this._currentScript;\n this._currentScript = newScript;\n\n if (newScript !== currentScript)\n if (!newScript || !currentScript || !newScript.equals(currentScript))\n this.load(baseUrl, iModel);\n };\n\n let removeScriptChangedListener = this._view.displayStyle.onScheduleScriptChanged.addListener((newScript) => onScriptChanged(newScript));\n this._view.onDisplayStyleChanged.addListener((newStyle) => {\n removeScriptChangedListener();\n onScriptChanged(newStyle.scheduleScript);\n removeScriptChangedListener = this._view.displayStyle.onScheduleScriptChanged.addListener((newScript) => onScriptChanged(newScript));\n });\n }\n\n public *[Symbol.iterator](): Iterator<TileTreeReference> {\n yield this._primaryRef;\n\n for (const animatedRef of this._animatedRefs)\n yield animatedRef;\n\n for (const realityTreeRef of this._realityTreeRefs.values())\n yield realityTreeRef;\n }\n\n private populateAnimatedReferences(treeOwner: TileTreeOwner): void {\n this._animatedRefs.length = 0;\n const script = this._currentScript;\n if (!script)\n return;\n\n const getCurrentTimePoint = () => this._view.displayStyle.settings.timePoint ?? script.duration.low;\n for (const timeline of script.modelTimelines) {\n const nodeIds = timeline.transformBatchIds;\n for (const nodeId of nodeIds) {\n this._animatedRefs.push(new AnimatedBatchedTileTreeReference(treeOwner, {\n timeline,\n nodeId,\n getCurrentTimePoint,\n }));\n }\n }\n }\n\n private populateRealityModels(): void {\n const prevRefs = this._realityTreeRefs;\n this._realityTreeRefs = new Map<Id64String, TileTreeReference>();\n for (const modelId of this._models.viewedRealityModelIds) {\n let ref = prevRefs.get(modelId);\n if (!ref) {\n const model = this._view.iModel.models.getLoaded(modelId);\n if (model && model instanceof SpatialModelState) {\n assert(model.isRealityModel);\n ref = model.createTileTreeReference(this._view);\n }\n }\n\n if (ref)\n this._realityTreeRefs.set(modelId, ref);\n }\n }\n\n public update(): void {\n this._models.setViewedModels(this._view.modelSelector.models);\n this.populateRealityModels();\n if (this._onModelSelectorChanged)\n this._onModelSelectorChanged();\n }\n\n public attachToViewport(args: AttachToViewportArgs): void {\n this._onModelSelectorChanged = () => args.invalidateSymbologyOverrides();\n }\n\n public detachFromViewport(): void {\n this._onModelSelectorChanged = undefined;\n }\n\n public setDeactivated(): void {\n // Used for debugging. Unimplemented here.\n }\n}\n\n// A placeholder used by [[ProxySpatialTileTreeReferences]] until asynchronous loading completes.\n// It provides a TileTreeOwner that never loads a tile tree.\n// This ensures that [ViewState.areAllTileTreesLoaded]($frontend) will not return `true` while we are loading.\nclass ProxyTileTreeReference extends TileTreeReference {\n private readonly _treeOwner: TileTreeOwner;\n\n public constructor(iModel: IModelConnection) {\n super();\n this._treeOwner = {\n iModel,\n tileTree: undefined,\n loadStatus: TileTreeLoadStatus.NotLoaded,\n load: () => undefined,\n dispose: () => { },\n loadTree: async () => Promise.resolve(undefined),\n };\n }\n\n public override get treeOwner() {\n return this._treeOwner;\n }\n\n // eslint-disable-next-line @typescript-eslint/naming-convention\n public override get _isLoadingComplete() {\n return false;\n }\n}\n\n// Serves as a placeholder while we asynchronously obtain the base URL for a pre-published tileset (or asynchronously determine\n// that no such tileset exists).\nclass ProxySpatialTileTreeReferences implements SpatialTileTreeReferences {\n // Once async loading completes, all methods will be forwarded to this implementation.\n private _impl?: SpatialTileTreeReferences;\n private readonly _proxyRef: ProxyTileTreeReference;\n // Retained if attachToViewport is called while we are still loading; and reset if detachFromViewport is called while loading.\n private _attachArgs?: AttachToViewportArgs;\n\n public constructor(view: SpatialViewState, getBaseUrl: Promise<URL | undefined>) {\n this._proxyRef = new ProxyTileTreeReference(view.iModel);\n getBaseUrl.then((url: URL | undefined) => {\n if (url) {\n this.setTreeRefs(new BatchedSpatialTileTreeReferences(url, view));\n } else {\n this.setTreeRefs(createFallbackSpatialTileTreeReferences(view));\n }\n }).catch(() => {\n this.setTreeRefs(createFallbackSpatialTileTreeReferences(view));\n });\n }\n\n private setTreeRefs(refs: SpatialTileTreeReferences): void {\n this._impl = refs;\n if (this._attachArgs) {\n this._impl.attachToViewport(this._attachArgs);\n this._attachArgs.invalidateSymbologyOverrides();\n this._attachArgs = undefined;\n }\n }\n\n public update(): void {\n this._impl?.update();\n }\n\n public attachToViewport(args: AttachToViewportArgs): void {\n if (this._impl)\n this._impl.attachToViewport(args);\n else\n this._attachArgs = args;\n }\n\n public detachFromViewport(): void {\n if (this._impl)\n this._impl.detachFromViewport();\n else\n this._attachArgs = undefined;\n }\n\n public setDeactivated(): void { }\n\n public *[Symbol.iterator](): Iterator<TileTreeReference> {\n if (this._impl) {\n for (const ref of this._impl)\n yield ref;\n } else {\n yield this._proxyRef;\n }\n }\n}\n\nconst iModelToBaseUrl = new Map<IModelConnection, URL | null | Promise<URL | undefined>>();\n\n/** @internal */\nexport function createBatchedSpatialTileTreeReferences(view: SpatialViewState, computeBaseUrl: ComputeSpatialTilesetBaseUrl): SpatialTileTreeReferences {\n const iModel = view.iModel;\n let entry = iModelToBaseUrl.get(iModel);\n if (undefined === entry) {\n const promise = computeBaseUrl(iModel);\n iModelToBaseUrl.set(iModel, entry = promise);\n iModel.onClose.addOnce(() => iModelToBaseUrl.delete(iModel));\n promise.then((url: URL | undefined) => {\n if (iModelToBaseUrl.has(iModel))\n iModelToBaseUrl.set(iModel, url ?? null);\n }).catch(() => {\n if (iModelToBaseUrl.has(iModel))\n iModelToBaseUrl.set(iModel, null);\n });\n }\n\n if (null === entry) {\n // No tileset exists for this iModel - use default tile generation instead.\n return createFallbackSpatialTileTreeReferences(view);\n }\n\n if (entry instanceof Promise)\n return new ProxySpatialTileTreeReferences(view, entry);\n\n return new BatchedSpatialTileTreeReferences(entry, view);\n}\n\n"]}
@@ -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 { Transform } from \"@itwin/core-geometry\";\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 { loggerCategory } from \"./LoggerCategory\";\r\nimport { BatchedTileTree } from \"./BatchedTileTree\";\r\nimport { frontendTilesOptions } from \"./FrontendTiles\";\r\n\r\n/** @internal */\r\nexport interface BatchedTileParams extends TileParams {\r\n childrenProps: Tileset3dSchema.Tile[] | undefined;\r\n /** 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\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 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 private get _batchedChildren(): BatchedTile[] | undefined {\r\n return this.children as BatchedTile[] | undefined;\r\n }\r\n\r\n public override computeLoadPriority(viewports: Iterable<Viewport>, _users: Iterable<TileUser>): number {\r\n // Prioritize tiles closer to camera and center of attention (zoom point or screen center).\r\n return RealityTileLoader.computeTileLocationPriority(this, viewports, this.tree.iModelTransform);\r\n }\r\n\r\n public selectTiles(selected: Set<BatchedTile>, args: TileDrawArgs, closestDisplayableAncestor: BatchedTile | undefined): void {\r\n const vis = this.computeVisibility(args);\r\n if (TileVisibility.OutsideFrustum === vis)\r\n return;\r\n\r\n if (this._unskippable) {\r\n // Prevent this tile's content from being unloaded due to memory pressure.\r\n args.touchedTiles.add(this);\r\n args.markUsed(this);\r\n }\r\n\r\n closestDisplayableAncestor = this.hasGraphics ? this : closestDisplayableAncestor;\r\n if (TileVisibility.TooCoarse === vis && (this.isReady || !this._unskippable)) {\r\n args.markUsed(this);\r\n args.markReady(this);\r\n const childrenLoadStatus = this.loadChildren();\r\n if (TileTreeLoadStatus.Loading === childrenLoadStatus)\r\n args.markChildrenLoading();\r\n\r\n const children = this._batchedChildren;\r\n if (children) {\r\n for (const child of children)\r\n child.selectTiles(selected, args, closestDisplayableAncestor);\r\n\r\n return;\r\n }\r\n }\r\n\r\n // We want to display this tile. Request its content if not already loaded.\r\n if ((TileVisibility.Visible === vis || this._unskippable) && !this.isReady)\r\n args.insertMissing(this);\r\n\r\n if (closestDisplayableAncestor)\r\n selected.add(closestDisplayableAncestor);\r\n }\r\n\r\n protected override _loadChildren(resolve: (children: Tile[] | undefined) => void, reject: (error: Error) => void): void {\r\n let children: BatchedTile[] | undefined;\r\n if (this._childrenProps) {\r\n try {\r\n for (const childProps of this._childrenProps) {\r\n const params = this.batchedTree.reader.readTileParams(childProps, this);\r\n const child = new BatchedTile(params, this.batchedTree);\r\n children = children ?? [];\r\n children.push(child);\r\n }\r\n } catch (err) {\r\n Logger.logException(loggerCategory, err);\r\n children = undefined;\r\n if (err instanceof Error)\r\n reject(err);\r\n }\r\n }\r\n\r\n resolve(children);\r\n }\r\n\r\n public override get channel(): TileRequestChannel {\r\n if (!channel) {\r\n channel = new TileRequestChannel(\"itwinjs-batched-models\", 20);\r\n IModelApp.tileAdmin.channels.add(channel);\r\n }\r\n\r\n return channel;\r\n }\r\n\r\n public override async requestContent(_isCanceled: () => boolean): Promise<TileRequest.Response> {\r\n const url = new URL(this.contentId, this.batchedTree.reader.baseUrl);\r\n url.search = this.batchedTree.reader.baseUrl.search;\r\n const response = await fetch(url.toString());\r\n return response.arrayBuffer();\r\n }\r\n\r\n public override async readContent(data: TileRequest.ResponseData, system: RenderSystem, isCanceled?: () => boolean): Promise<TileContent> {\r\n assert(data instanceof Uint8Array);\r\n if (!(data instanceof Uint8Array))\r\n return { };\r\n\r\n try {\r\n 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 });\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":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\nimport { assert, BeTimePoint, ByteStream, Logger } from \"@itwin/core-bentley\";\nimport { Transform } from \"@itwin/core-geometry\";\nimport { ColorDef, Tileset3dSchema } from \"@itwin/core-common\";\nimport {\n GraphicBranch, GraphicBuilder, IModelApp, RealityTileLoader, RenderSystem, Tile, TileBoundingBoxes, TileContent,\n TileDrawArgs, TileParams, TileRequest, TileRequestChannel, TileTreeLoadStatus, TileUser, TileVisibility, Viewport,\n} from \"@itwin/core-frontend\";\nimport { loggerCategory } from \"./LoggerCategory\";\nimport { BatchedTileTree } from \"./BatchedTileTree\";\nimport { frontendTilesOptions } from \"./FrontendTiles\";\n\n/** @internal */\nexport interface BatchedTileParams extends TileParams {\n childrenProps: Tileset3dSchema.Tile[] | undefined;\n /** See BatchedTile.transformToRoot. */\n transformToRoot: Transform | undefined;\n}\n\nlet channel: TileRequestChannel | undefined;\n\n/** @internal */\nexport class BatchedTile extends Tile {\n private readonly _childrenProps?: Tileset3dSchema.Tile[];\n private readonly _unskippable: boolean;\n /** Transform from the tile's local coordinate system to that of the tileset. */\n public readonly transformToRoot?: Transform;\n\n public get batchedTree(): BatchedTileTree {\n return this.tree as BatchedTileTree;\n }\n\n public constructor(params: BatchedTileParams, tree: BatchedTileTree) {\n super(params, tree);\n\n // The root tile never has content, so it doesn't count toward max levels to skip.\n this._unskippable = 0 === (this.depth % frontendTilesOptions.maxLevelsToSkip);\n\n if (params.childrenProps?.length)\n this._childrenProps = params.childrenProps;\n\n if (!this.contentId) {\n this.setIsReady();\n // mark \"undisplayable\"\n this._maximumSize = 0;\n }\n\n if (!params.transformToRoot)\n return;\n\n this.transformToRoot = params.transformToRoot;\n this.boundingSphere.transformBy(this.transformToRoot, this.boundingSphere);\n this.transformToRoot.multiplyRange(this.range, this.range);\n if (this._contentRange)\n this.transformToRoot.multiplyRange(this._contentRange, this._contentRange);\n }\n\n private get _batchedChildren(): BatchedTile[] | undefined {\n return this.children as BatchedTile[] | undefined;\n }\n\n public override computeLoadPriority(viewports: Iterable<Viewport>, _users: Iterable<TileUser>): number {\n // Prioritize tiles closer to camera and center of attention (zoom point or screen center).\n return RealityTileLoader.computeTileLocationPriority(this, viewports, this.tree.iModelTransform);\n }\n\n public selectTiles(selected: Set<BatchedTile>, args: TileDrawArgs, closestDisplayableAncestor: BatchedTile | undefined): void {\n const vis = this.computeVisibility(args);\n if (TileVisibility.OutsideFrustum === vis)\n return;\n\n if (this._unskippable) {\n // Prevent this tile's content from being unloaded due to memory pressure.\n args.touchedTiles.add(this);\n args.markUsed(this);\n }\n\n closestDisplayableAncestor = this.hasGraphics ? this : closestDisplayableAncestor;\n if (TileVisibility.TooCoarse === vis && (this.isReady || !this._unskippable)) {\n args.markUsed(this);\n args.markReady(this);\n const childrenLoadStatus = this.loadChildren();\n if (TileTreeLoadStatus.Loading === childrenLoadStatus)\n args.markChildrenLoading();\n\n const children = this._batchedChildren;\n if (children) {\n for (const child of children)\n child.selectTiles(selected, args, closestDisplayableAncestor);\n\n return;\n }\n }\n\n // We want to display this tile. Request its content if not already loaded.\n if ((TileVisibility.Visible === vis || this._unskippable) && !this.isReady)\n args.insertMissing(this);\n\n if (closestDisplayableAncestor)\n selected.add(closestDisplayableAncestor);\n }\n\n protected override _loadChildren(resolve: (children: Tile[] | undefined) => void, reject: (error: Error) => void): void {\n let children: BatchedTile[] | undefined;\n if (this._childrenProps) {\n try {\n for (const childProps of this._childrenProps) {\n const params = this.batchedTree.reader.readTileParams(childProps, this);\n const child = new BatchedTile(params, this.batchedTree);\n children = children ?? [];\n children.push(child);\n }\n } catch (err) {\n Logger.logException(loggerCategory, err);\n children = undefined;\n if (err instanceof Error)\n reject(err);\n }\n }\n\n resolve(children);\n }\n\n public override get channel(): TileRequestChannel {\n if (!channel) {\n channel = new TileRequestChannel(\"itwinjs-batched-models\", 20);\n IModelApp.tileAdmin.channels.add(channel);\n }\n\n return channel;\n }\n\n public override async requestContent(_isCanceled: () => boolean): Promise<TileRequest.Response> {\n const url = new URL(this.contentId, this.batchedTree.reader.baseUrl);\n url.search = this.batchedTree.reader.baseUrl.search;\n const response = await fetch(url.toString());\n return response.arrayBuffer();\n }\n\n public override async readContent(data: TileRequest.ResponseData, system: RenderSystem, isCanceled?: () => boolean): Promise<TileContent> {\n assert(data instanceof Uint8Array);\n if (!(data instanceof Uint8Array))\n return { };\n\n try {\n const content = await this.batchedTree.decoder.decode({\n stream: ByteStream.fromUint8Array(data),\n options: { tileId: this.contentId },\n system,\n isCanceled,\n isLeaf: this.isLeaf,\n });\n\n if (this.transformToRoot) {\n if (content.graphic) {\n const branch = new GraphicBranch(true);\n branch.add(content.graphic);\n content.graphic = system.createBranch(branch, this.transformToRoot);\n }\n\n if (content.contentRange)\n content.contentRange = this.transformToRoot.multiplyRange(content.contentRange);\n }\n\n return content;\n } catch {\n return { isLeaf: true };\n }\n }\n\n protected override addRangeGraphic(builder: GraphicBuilder, type: TileBoundingBoxes): void {\n if (TileBoundingBoxes.ChildVolumes !== type) {\n super.addRangeGraphic(builder, type);\n return;\n }\n\n builder.setSymbology(ColorDef.green, ColorDef.green, 2);\n builder.addRangeBox(this.range);\n\n this.loadChildren();\n const children = this.children;\n if (!children)\n return;\n\n builder.setSymbology(ColorDef.blue, ColorDef.blue.withTransparency(0xdf), 1);\n for (const child of children) {\n const range = child.range;\n builder.addRangeBox(range);\n builder.addRangeBox(range, true);\n }\n }\n\n public prune(olderThan: BeTimePoint): void {\n const children = this._batchedChildren;\n if (!children)\n return;\n\n if (this.usageMarker.isExpired(olderThan)) {\n this.disposeChildren();\n } else {\n for (const child of children)\n child.prune(olderThan);\n }\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"BatchedTileContentReader.js","sourceRoot":"","sources":["../../src/BatchedTileContentReader.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, Id64, Id64String } from \"@itwin/core-bentley\";\r\nimport { Range3d } from \"@itwin/core-geometry\";\r\nimport { Feature, FeatureTable, TileReadStatus } from \"@itwin/core-common\";\r\nimport {\r\n GltfDataType, GltfMeshPrimitive, GltfReader, GltfReaderArgs, GltfReaderResult,\r\n} from \"@itwin/core-frontend\";\r\n\r\ninterface BatchedTileReaderArgs extends GltfReaderArgs {\r\n modelId: Id64String;\r\n isLeaf: boolean;\r\n range: Range3d;\r\n}\r\n\r\n/** Read batched tiles in 3d Tiles 1.1 format. Currently, we prefer to produce tiles in iMdl format, so this goes unused for now.\r\n * @internal\r\n */\r\nexport class BatchedTileContentReader extends GltfReader {\r\n private readonly _modelId: Id64String;\r\n private readonly _isLeaf: boolean;\r\n private readonly _range: Range3d;\r\n\r\n public constructor(args: BatchedTileReaderArgs) {\r\n super(args);\r\n this._modelId = args.modelId;\r\n this._isLeaf = args.isLeaf;\r\n this._range = args.range;\r\n }\r\n\r\n public override async read(): Promise<GltfReaderResult> {\r\n const featureTable = this.readFeatureTable();\r\n await this.resolveResources();\r\n if (this._isCanceled)\r\n return { readStatus: TileReadStatus.Canceled, isLeaf: this._isLeaf };\r\n\r\n return this.readGltfAndCreateGraphics(this._isLeaf, featureTable, this._range);\r\n }\r\n\r\n private readFeatureTable(): FeatureTable | undefined {\r\n // ###TODO we're just assuming there's one property table with one u64 property containing element Ids.\r\n const tables = this._glTF.extensions?.EXT_structural_metadata?.propertyTables;\r\n const table = tables ? tables[0] : undefined;\r\n const elementIdProperty = table?.properties ? table.properties.ElementId : undefined;\r\n if (!elementIdProperty)\r\n return undefined;\r\n\r\n const bufferView = this._bufferViews[elementIdProperty.values];\r\n if (!bufferView || undefined === bufferView.buffer)\r\n return undefined;\r\n\r\n const bufferData = this._buffers[bufferView.buffer]?.resolvedBuffer;\r\n if (!bufferData)\r\n return undefined;\r\n\r\n assert(undefined !== bufferView.byteLength); // required by spec; TypeScript interface is wrong.\r\n const byteOffset = bufferView.byteOffset ?? 0;\r\n const bytes = bufferData.subarray(byteOffset, byteOffset + bufferView.byteLength);\r\n\r\n // 2 u32s per element Id.\r\n const elementIds = new Uint32Array(bytes.buffer, bytes.byteOffset, bytes.byteLength / 4);\r\n const numFeatures = elementIds.length / 2;\r\n const featureTable = new FeatureTable(numFeatures, this._modelId);\r\n for (let i = 0; i < numFeatures; i++) {\r\n const elementId = Id64.fromUint32Pair(elementIds[i * 2], elementIds[i * 2 + 1]);\r\n featureTable.insertWithIndex(new Feature(elementId), i);\r\n }\r\n\r\n return featureTable;\r\n }\r\n\r\n protected override readPrimitiveFeatures(primitive: GltfMeshPrimitive): Feature | number[] | undefined {\r\n const ext = primitive.extensions?.EXT_mesh_features;\r\n if (ext) {\r\n // ###TODO making assumptions here.\r\n const view = this.getBufferView(primitive.attributes, `_FEATURE_ID_${ext.featureIds[0].attribute}`);\r\n // NB: 32-bit integers are not supported, but 8- and 16-bit integers will be converted to them.\r\n // With more than 64k features in the tile we represent the Ids as floats instead.\r\n const featureIds = view?.toBufferData(GltfDataType.Float) ?? view?.toBufferData(GltfDataType.UInt32);\r\n if (view && featureIds) {\r\n const indices = [];\r\n for (let i = 0; i < featureIds.count; i++) {\r\n const featureId = featureIds.buffer[i * view.stride];\r\n indices.push(featureId);\r\n }\r\n\r\n return indices;\r\n }\r\n }\r\n\r\n return new Feature(this._modelId);\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"BatchedTileContentReader.js","sourceRoot":"","sources":["../../src/BatchedTileContentReader.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\nimport { assert, Id64, Id64String } from \"@itwin/core-bentley\";\nimport { Range3d } from \"@itwin/core-geometry\";\nimport { Feature, FeatureTable, TileReadStatus } from \"@itwin/core-common\";\nimport {\n GltfDataType, GltfMeshPrimitive, GltfReader, GltfReaderArgs, GltfReaderResult,\n} from \"@itwin/core-frontend\";\n\ninterface BatchedTileReaderArgs extends GltfReaderArgs {\n modelId: Id64String;\n isLeaf: boolean;\n range: Range3d;\n}\n\n/** Read batched tiles in 3d Tiles 1.1 format. Currently, we prefer to produce tiles in iMdl format, so this goes unused for now.\n * @internal\n */\nexport class BatchedTileContentReader extends GltfReader {\n private readonly _modelId: Id64String;\n private readonly _isLeaf: boolean;\n private readonly _range: Range3d;\n\n public constructor(args: BatchedTileReaderArgs) {\n super(args);\n this._modelId = args.modelId;\n this._isLeaf = args.isLeaf;\n this._range = args.range;\n }\n\n public override async read(): Promise<GltfReaderResult> {\n const featureTable = this.readFeatureTable();\n await this.resolveResources();\n if (this._isCanceled)\n return { readStatus: TileReadStatus.Canceled, isLeaf: this._isLeaf };\n\n return this.readGltfAndCreateGraphics(this._isLeaf, featureTable, this._range);\n }\n\n private readFeatureTable(): FeatureTable | undefined {\n // ###TODO we're just assuming there's one property table with one u64 property containing element Ids.\n const tables = this._glTF.extensions?.EXT_structural_metadata?.propertyTables;\n const table = tables ? tables[0] : undefined;\n const elementIdProperty = table?.properties ? table.properties.ElementId : undefined;\n if (!elementIdProperty)\n return undefined;\n\n const bufferView = this._bufferViews[elementIdProperty.values];\n if (!bufferView || undefined === bufferView.buffer)\n return undefined;\n\n const bufferData = this._buffers[bufferView.buffer]?.resolvedBuffer;\n if (!bufferData)\n return undefined;\n\n assert(undefined !== bufferView.byteLength); // required by spec; TypeScript interface is wrong.\n const byteOffset = bufferView.byteOffset ?? 0;\n const bytes = bufferData.subarray(byteOffset, byteOffset + bufferView.byteLength);\n\n // 2 u32s per element Id.\n const elementIds = new Uint32Array(bytes.buffer, bytes.byteOffset, bytes.byteLength / 4);\n const numFeatures = elementIds.length / 2;\n const featureTable = new FeatureTable(numFeatures, this._modelId);\n for (let i = 0; i < numFeatures; i++) {\n const elementId = Id64.fromUint32Pair(elementIds[i * 2], elementIds[i * 2 + 1]);\n featureTable.insertWithIndex(new Feature(elementId), i);\n }\n\n return featureTable;\n }\n\n protected override readPrimitiveFeatures(primitive: GltfMeshPrimitive): Feature | number[] | undefined {\n const ext = primitive.extensions?.EXT_mesh_features;\n if (ext) {\n // ###TODO making assumptions here.\n const view = this.getBufferView(primitive.attributes, `_FEATURE_ID_${ext.featureIds[0].attribute}`);\n // NB: 32-bit integers are not supported, but 8- and 16-bit integers will be converted to them.\n // With more than 64k features in the tile we represent the Ids as floats instead.\n const featureIds = view?.toBufferData(GltfDataType.Float) ?? view?.toBufferData(GltfDataType.UInt32);\n if (view && featureIds) {\n const indices = [];\n for (let i = 0; i < featureIds.count; i++) {\n const featureId = featureIds.buffer[i * view.stride];\n indices.push(featureId);\n }\n\n return indices;\n }\n }\n\n return new Feature(this._modelId);\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"BatchedTileTree.js","sourceRoot":"","sources":["../../src/BatchedTileTree.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;;;AAE/F,sDAAkD;AAClD,oDAA8F;AAC9F,wDAE8B;AAC9B,+CAA+D;AAE/D,mDAAuD;AAEvD,MAAM,gBAAgB,GAAsB;IAC1C,UAAU,EAAE,wBAAU,CAAC,WAAW;IAClC,YAAY,EAAE,KAAK;CACpB,CAAC;AASF,gBAAgB;AAChB,MAAa,eAAgB,SAAQ,wBAAQ;IAM3C,YAAmB,MAA6B;QAC9C,KAAK,CAAC,MAAM,CAAC,CAAC;QACd,IAAI,CAAC,SAAS,GAAG,IAAI,yBAAW,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACxD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC5B,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC;QAEpC,IAAI,CAAC,OAAO,GAAG,IAAA,kCAAkB,EAAC;YAChC,IAAI,EAAE,uBAAS,CAAC,OAAO;YACvB,QAAQ,EAAE,IAAI,CAAC,cAAc;YAC7B,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,YAAY,EAAE,IAAI,CAAC,OAAO;YAC1B,IAAI,EAAE,IAAI;YACV,sBAAsB,EAAE,KAAK;YAC7B,QAAQ,EAAE,CAAC,yBAAS,CAAC,SAAS,CAAC,kBAAkB;SAClD,CAAC,CAAC;IACL,CAAC;IAEe,OAAO;QACrB,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QACvB,KAAK,CAAC,OAAO,EAAE,CAAC;IAClB,CAAC;IAED,IAAoB,QAAQ;QAC1B,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED,IAAoB,IAAI;QACtB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAoB,QAAQ;QAC1B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAoB,iBAAiB;QACnC,OAAO,oCAAoB,CAAC,WAAW,CAAC,CAAC,CAAA,EAAG,CAAC,CAAC,CAAC,gBAAgB,CAAC;IAClE,CAAC;IAED,gEAAgE;IAChD,YAAY,CAAC,IAAkB;QAC7C,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAe,CAAC;QACxC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,QAAQ,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;QACrD,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC9B,CAAC;IAEe,IAAI,CAAC,IAAkB;QACrC,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACrC,KAAK,MAAM,IAAI,IAAI,KAAK;YACtB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QAE1B,IAAI,CAAC,YAAY,EAAE,CAAC;IACtB,CAAC;IAEe,KAAK;QACnB,MAAM,SAAS,GAAG,0BAAW,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC/D,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IACjC,CAAC;CACF;AA/DD,0CA+DC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\nimport { BeTimePoint } from \"@itwin/core-bentley\";\r\nimport { BatchType, RenderMode, RenderSchedule, ViewFlagOverrides } from \"@itwin/core-common\";\r\nimport {\r\n acquireImdlDecoder, ImdlDecoder, IModelApp, Tile, TileDrawArgs, TileTree, TileTreeParams,\r\n} from \"@itwin/core-frontend\";\r\nimport { BatchedTile, BatchedTileParams } from \"./BatchedTile\";\r\nimport { BatchedTilesetReader } from \"./BatchedTilesetReader\";\r\nimport { frontendTilesOptions } from \"./FrontendTiles\";\r\n\r\nconst defaultViewFlags: ViewFlagOverrides = {\r\n renderMode: RenderMode.SmoothShade,\r\n visibleEdges: false,\r\n};\r\n\r\n/** @internal */\r\nexport interface BatchedTileTreeParams extends TileTreeParams {\r\n rootTile: BatchedTileParams;\r\n reader: BatchedTilesetReader;\r\n script?: RenderSchedule.Script;\r\n}\r\n\r\n/** @internal */\r\nexport class BatchedTileTree extends TileTree {\r\n private readonly _rootTile: BatchedTile;\r\n public readonly reader: BatchedTilesetReader;\r\n public readonly scheduleScript?: RenderSchedule.Script;\r\n public readonly decoder: ImdlDecoder;\r\n\r\n public constructor(params: BatchedTileTreeParams) {\r\n super(params);\r\n this._rootTile = new BatchedTile(params.rootTile, this);\r\n this.reader = params.reader;\r\n this.scheduleScript = params.script;\r\n\r\n this.decoder = acquireImdlDecoder({\r\n type: BatchType.Primary,\r\n timeline: this.scheduleScript,\r\n iModel: this.iModel,\r\n batchModelId: this.modelId,\r\n is3d: true,\r\n containsTransformNodes: false,\r\n noWorker: !IModelApp.tileAdmin.decodeImdlInWorker,\r\n });\r\n }\r\n\r\n public override dispose(): void {\r\n this.decoder.release();\r\n super.dispose();\r\n }\r\n\r\n public override get rootTile(): BatchedTile {\r\n return this._rootTile;\r\n }\r\n\r\n public override get is3d(): boolean {\r\n return true;\r\n }\r\n\r\n public override get maxDepth(): number | undefined {\r\n return undefined;\r\n }\r\n\r\n public override get viewFlagOverrides(): ViewFlagOverrides {\r\n return frontendTilesOptions.enableEdges ?{ } : defaultViewFlags;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public override _selectTiles(args: TileDrawArgs): Tile[] {\r\n const selected = new Set<BatchedTile>();\r\n this.rootTile.selectTiles(selected, args, undefined);\r\n return Array.from(selected);\r\n }\r\n\r\n public override draw(args: TileDrawArgs): void {\r\n const tiles = this.selectTiles(args);\r\n for (const tile of tiles)\r\n tile.drawGraphics(args);\r\n\r\n args.drawGraphics();\r\n }\r\n\r\n public override prune(): void {\r\n const olderThan = BeTimePoint.now().minus(this.expirationTime);\r\n this.rootTile.prune(olderThan);\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"BatchedTileTree.js","sourceRoot":"","sources":["../../src/BatchedTileTree.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;;;AAE/F,sDAAkD;AAClD,oDAA8F;AAC9F,wDAE8B;AAC9B,+CAA+D;AAE/D,mDAAuD;AAEvD,MAAM,gBAAgB,GAAsB;IAC1C,UAAU,EAAE,wBAAU,CAAC,WAAW;IAClC,YAAY,EAAE,KAAK;CACpB,CAAC;AASF,gBAAgB;AAChB,MAAa,eAAgB,SAAQ,wBAAQ;IAM3C,YAAmB,MAA6B;QAC9C,KAAK,CAAC,MAAM,CAAC,CAAC;QACd,IAAI,CAAC,SAAS,GAAG,IAAI,yBAAW,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACxD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC5B,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC;QAEpC,IAAI,CAAC,OAAO,GAAG,IAAA,kCAAkB,EAAC;YAChC,IAAI,EAAE,uBAAS,CAAC,OAAO;YACvB,QAAQ,EAAE,IAAI,CAAC,cAAc;YAC7B,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,YAAY,EAAE,IAAI,CAAC,OAAO;YAC1B,IAAI,EAAE,IAAI;YACV,sBAAsB,EAAE,KAAK;YAC7B,QAAQ,EAAE,CAAC,yBAAS,CAAC,SAAS,CAAC,kBAAkB;SAClD,CAAC,CAAC;IACL,CAAC;IAEe,OAAO;QACrB,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QACvB,KAAK,CAAC,OAAO,EAAE,CAAC;IAClB,CAAC;IAED,IAAoB,QAAQ;QAC1B,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED,IAAoB,IAAI;QACtB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAoB,QAAQ;QAC1B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAoB,iBAAiB;QACnC,OAAO,oCAAoB,CAAC,WAAW,CAAC,CAAC,CAAA,EAAG,CAAC,CAAC,CAAC,gBAAgB,CAAC;IAClE,CAAC;IAED,gEAAgE;IAChD,YAAY,CAAC,IAAkB;QAC7C,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAe,CAAC;QACxC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,QAAQ,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;QACrD,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC9B,CAAC;IAEe,IAAI,CAAC,IAAkB;QACrC,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACrC,KAAK,MAAM,IAAI,IAAI,KAAK;YACtB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QAE1B,IAAI,CAAC,YAAY,EAAE,CAAC;IACtB,CAAC;IAEe,KAAK;QACnB,MAAM,SAAS,GAAG,0BAAW,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC/D,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IACjC,CAAC;CACF;AA/DD,0CA+DC","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\nimport { BeTimePoint } from \"@itwin/core-bentley\";\nimport { BatchType, RenderMode, RenderSchedule, ViewFlagOverrides } from \"@itwin/core-common\";\nimport {\n acquireImdlDecoder, ImdlDecoder, IModelApp, Tile, TileDrawArgs, TileTree, TileTreeParams,\n} from \"@itwin/core-frontend\";\nimport { BatchedTile, BatchedTileParams } from \"./BatchedTile\";\nimport { BatchedTilesetReader } from \"./BatchedTilesetReader\";\nimport { frontendTilesOptions } from \"./FrontendTiles\";\n\nconst defaultViewFlags: ViewFlagOverrides = {\n renderMode: RenderMode.SmoothShade,\n visibleEdges: false,\n};\n\n/** @internal */\nexport interface BatchedTileTreeParams extends TileTreeParams {\n rootTile: BatchedTileParams;\n reader: BatchedTilesetReader;\n script?: RenderSchedule.Script;\n}\n\n/** @internal */\nexport class BatchedTileTree extends TileTree {\n private readonly _rootTile: BatchedTile;\n public readonly reader: BatchedTilesetReader;\n public readonly scheduleScript?: RenderSchedule.Script;\n public readonly decoder: ImdlDecoder;\n\n public constructor(params: BatchedTileTreeParams) {\n super(params);\n this._rootTile = new BatchedTile(params.rootTile, this);\n this.reader = params.reader;\n this.scheduleScript = params.script;\n\n this.decoder = acquireImdlDecoder({\n type: BatchType.Primary,\n timeline: this.scheduleScript,\n iModel: this.iModel,\n batchModelId: this.modelId,\n is3d: true,\n containsTransformNodes: false,\n noWorker: !IModelApp.tileAdmin.decodeImdlInWorker,\n });\n }\n\n public override dispose(): void {\n this.decoder.release();\n super.dispose();\n }\n\n public override get rootTile(): BatchedTile {\n return this._rootTile;\n }\n\n public override get is3d(): boolean {\n return true;\n }\n\n public override get maxDepth(): number | undefined {\n return undefined;\n }\n\n public override get viewFlagOverrides(): ViewFlagOverrides {\n return frontendTilesOptions.enableEdges ?{ } : defaultViewFlags;\n }\n\n // eslint-disable-next-line @typescript-eslint/naming-convention\n public override _selectTiles(args: TileDrawArgs): Tile[] {\n const selected = new Set<BatchedTile>();\n this.rootTile.selectTiles(selected, args, undefined);\n return Array.from(selected);\n }\n\n public override draw(args: TileDrawArgs): void {\n const tiles = this.selectTiles(args);\n for (const tile of tiles)\n tile.drawGraphics(args);\n\n args.drawGraphics();\n }\n\n public override prune(): void {\n const olderThan = BeTimePoint.now().minus(this.expirationTime);\n this.rootTile.prune(olderThan);\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"BatchedTileTreeReference.js","sourceRoot":"","sources":["../../src/BatchedTileTreeReference.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;;;AAM/F,wDAE8B;AAG9B,gBAAgB;AAChB,MAAsB,wBAAyB,SAAQ,iCAAiB;IAGtE,YAAsB,SAAwB;QAC5C,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;IAC9B,CAAC;IAED,IAAoB,SAAS;QAC3B,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAES,oBAAoB,CAAC,IAAc;QAC3C,OAAO,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC;IAEkB,gBAAgB,CAAC,IAAc;QAChD,MAAM,MAAM,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC;QAC/C,wFAAwF;QACxF,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AArBD,4DAqBC;AAED,MAAa,+BAAgC,SAAQ,wBAAwB;IAG3E,YAAmB,SAAwB,EAAE,MAAqB;QAChE,KAAK,CAAC,SAAS,CAAC,CAAC;QACjB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;IACxB,CAAC;IAEe,aAAa,CAAC,KAAc;QAC1C,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;IAEe,qBAAqB;QACnC,OAAO,IAAI,CAAC;IACd,CAAC;IAEM,oBAAoB,CACzB,MAA+B,EAC/B,MAAc,EAAE,MAAc,EAC9B,QAAgB,EAAE,QAAgB,EAClC,SAAwB,EACxB,OAAe,EAAE,OAAe,EAChC,IAAe,EACf,eAAuB;QAEvB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;YAC1C,OAAO,SAAS,CAAC;QAEnB,OAAO,MAAM,CAAC,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,eAAe,CAAC,CAAC;IACtH,CAAC;IAEe,2BAA2B;QACzC,OAAO,+BAAe,CAAC,aAAa,CAAC;IACvC,CAAC;CACF;AAlCD,0EAkCC;AAQD,MAAa,gCAAiC,SAAQ,wBAAwB;IAI5E,YAAmB,SAAwB,EAAE,IAAmB;QAC9D,KAAK,CAAC,SAAS,CAAC,CAAC;QACjB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,SAAS,GAAG,IAAA,uCAAuB,EAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAC/E,CAAC;IAEe,2BAA2B;QACzC,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;IAC3B,CAAC;IAEe,oBAAoB,CAAC,IAAc;QACjD,MAAM,EAAE,GAAG,KAAK,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC;QAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,mBAAmB,EAAE,CAAC,CAAC;QACrG,IAAI,MAAM;YACR,MAAM,CAAC,0BAA0B,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAE5C,OAAO,EAAE,CAAC;IACZ,CAAC;IAEe,cAAc,CAAC,OAAqB;QAClD,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,iBAAiB,EAAE,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC/F,IAAI,UAAU,IAAI,UAAU,CAAC,IAAI;YAC/B,OAAO,SAAS,CAAC;QAEnB,MAAM,IAAI,GAAG,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QAC3C,gGAAgG;QAChG,OAAO,IAAI,CAAC;IACd,CAAC;CACF;AAhCD,4EAgCC","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 { Range3d, Transform } from \"@itwin/core-geometry\";\r\nimport {\r\n BatchType, FeatureAppearance, FeatureAppearanceProvider, FeatureAppearanceSource, GeometryClass, RenderSchedule,\r\n} from \"@itwin/core-common\";\r\nimport {\r\n AnimationNodeId, formatAnimationBranchId, SceneContext, TileDrawArgs, TileTree, TileTreeOwner, TileTreeReference,\r\n} from \"@itwin/core-frontend\";\r\nimport { BatchedModels } from \"./BatchedModels\";\r\n\r\n/** @internal */\r\nexport abstract class BatchedTileTreeReference extends TileTreeReference {\r\n protected readonly _treeOwner: TileTreeOwner;\r\n\r\n protected constructor(treeOwner: TileTreeOwner) {\r\n super();\r\n this._treeOwner = treeOwner;\r\n }\r\n\r\n public override get treeOwner(): TileTreeOwner {\r\n return this._treeOwner;\r\n }\r\n\r\n protected computeBaseTransform(tree: TileTree): Transform {\r\n return super.computeTransform(tree);\r\n }\r\n\r\n protected override computeTransform(tree: TileTree): Transform {\r\n const baseTf = this.computeBaseTransform(tree);\r\n // ###TODO this.view.modelDisplayTransformProvider?.getModelDisplayTransform(modelId...)\r\n return baseTf;\r\n }\r\n}\r\n\r\nexport class PrimaryBatchedTileTreeReference extends BatchedTileTreeReference implements FeatureAppearanceProvider {\r\n private readonly _models: BatchedModels;\r\n\r\n public constructor(treeOwner: TileTreeOwner, models: BatchedModels) {\r\n super(treeOwner);\r\n this._models = models;\r\n }\r\n\r\n public override unionFitRange(range: Range3d): void {\r\n this._models.unionRange(range);\r\n }\r\n\r\n public override getAppearanceProvider(): FeatureAppearanceProvider | undefined {\r\n return this;\r\n }\r\n\r\n public getFeatureAppearance(\r\n source: FeatureAppearanceSource,\r\n elemLo: number, elemHi: number,\r\n subcatLo: number, subcatHi: number,\r\n geomClass: GeometryClass,\r\n modelLo: number, modelHi: number,\r\n type: BatchType,\r\n animationNodeId: number,\r\n ): FeatureAppearance | undefined {\r\n if (!this._models.isViewed(modelLo, modelHi))\r\n return undefined;\r\n\r\n return source.getAppearance(elemLo, elemHi, subcatLo, subcatHi, geomClass, modelLo, modelHi, type, animationNodeId);\r\n }\r\n\r\n public override getAnimationTransformNodeId() {\r\n return AnimationNodeId.Untransformed;\r\n }\r\n}\r\n\r\nexport interface AnimationNode {\r\n readonly timeline: RenderSchedule.ModelTimeline;\r\n readonly nodeId: number;\r\n getCurrentTimePoint(): number;\r\n}\r\n\r\nexport class AnimatedBatchedTileTreeReference extends BatchedTileTreeReference {\r\n private readonly _node: AnimationNode;\r\n private readonly _branchId: string;\r\n\r\n public constructor(treeOwner: TileTreeOwner, node: AnimationNode) {\r\n super(treeOwner);\r\n this._node = node;\r\n this._branchId = formatAnimationBranchId(node.timeline.modelId, node.nodeId);\r\n }\r\n\r\n public override getAnimationTransformNodeId(): number {\r\n return this._node.nodeId;\r\n }\r\n\r\n public override computeBaseTransform(tree: TileTree): Transform {\r\n const tf = super.computeBaseTransform(tree);\r\n const animTf = this._node.timeline.getTransform(this._node.nodeId, this._node.getCurrentTimePoint());\r\n if (animTf)\r\n animTf.multiplyTransformTransform(tf, tf);\r\n\r\n return tf;\r\n }\r\n\r\n public override createDrawArgs(context: SceneContext): TileDrawArgs | undefined {\r\n const animBranch = context.viewport.target.animationBranches?.branchStates.get(this._branchId);\r\n if (animBranch && animBranch.omit)\r\n return undefined;\r\n\r\n const args = super.createDrawArgs(context);\r\n // ###TODO args.boundingRange = args.tree.getTransformNodeRange(this._animationTransformNodeId);\r\n return args;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"BatchedTileTreeReference.js","sourceRoot":"","sources":["../../src/BatchedTileTreeReference.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\nimport { Range3d, Transform } from \"@itwin/core-geometry\";\nimport {\n BatchType, FeatureAppearance, FeatureAppearanceProvider, FeatureAppearanceSource, GeometryClass, RenderSchedule,\n} from \"@itwin/core-common\";\nimport {\n AnimationNodeId, formatAnimationBranchId, SceneContext, TileDrawArgs, TileTree, TileTreeOwner, TileTreeReference,\n} from \"@itwin/core-frontend\";\nimport { BatchedModels } from \"./BatchedModels\";\n\n/** @internal */\nexport abstract class BatchedTileTreeReference extends TileTreeReference {\n protected readonly _treeOwner: TileTreeOwner;\n\n protected constructor(treeOwner: TileTreeOwner) {\n super();\n this._treeOwner = treeOwner;\n }\n\n public override get treeOwner(): TileTreeOwner {\n return this._treeOwner;\n }\n\n protected computeBaseTransform(tree: TileTree): Transform {\n return super.computeTransform(tree);\n }\n\n protected override computeTransform(tree: TileTree): Transform {\n const baseTf = this.computeBaseTransform(tree);\n // ###TODO this.view.modelDisplayTransformProvider?.getModelDisplayTransform(modelId...)\n return baseTf;\n }\n}\n\nexport class PrimaryBatchedTileTreeReference extends BatchedTileTreeReference implements FeatureAppearanceProvider {\n private readonly _models: BatchedModels;\n\n public constructor(treeOwner: TileTreeOwner, models: BatchedModels) {\n super(treeOwner);\n this._models = models;\n }\n\n public override unionFitRange(range: Range3d): void {\n this._models.unionRange(range);\n }\n\n public override getAppearanceProvider(): FeatureAppearanceProvider | undefined {\n return this;\n }\n\n public getFeatureAppearance(\n source: FeatureAppearanceSource,\n elemLo: number, elemHi: number,\n subcatLo: number, subcatHi: number,\n geomClass: GeometryClass,\n modelLo: number, modelHi: number,\n type: BatchType,\n animationNodeId: number,\n ): FeatureAppearance | undefined {\n if (!this._models.isViewed(modelLo, modelHi))\n return undefined;\n\n return source.getAppearance(elemLo, elemHi, subcatLo, subcatHi, geomClass, modelLo, modelHi, type, animationNodeId);\n }\n\n public override getAnimationTransformNodeId() {\n return AnimationNodeId.Untransformed;\n }\n}\n\nexport interface AnimationNode {\n readonly timeline: RenderSchedule.ModelTimeline;\n readonly nodeId: number;\n getCurrentTimePoint(): number;\n}\n\nexport class AnimatedBatchedTileTreeReference extends BatchedTileTreeReference {\n private readonly _node: AnimationNode;\n private readonly _branchId: string;\n\n public constructor(treeOwner: TileTreeOwner, node: AnimationNode) {\n super(treeOwner);\n this._node = node;\n this._branchId = formatAnimationBranchId(node.timeline.modelId, node.nodeId);\n }\n\n public override getAnimationTransformNodeId(): number {\n return this._node.nodeId;\n }\n\n public override computeBaseTransform(tree: TileTree): Transform {\n const tf = super.computeBaseTransform(tree);\n const animTf = this._node.timeline.getTransform(this._node.nodeId, this._node.getCurrentTimePoint());\n if (animTf)\n animTf.multiplyTransformTransform(tf, tf);\n\n return tf;\n }\n\n public override createDrawArgs(context: SceneContext): TileDrawArgs | undefined {\n const animBranch = context.viewport.target.animationBranches?.branchStates.get(this._branchId);\n if (animBranch && animBranch.omit)\n return undefined;\n\n const args = super.createDrawArgs(context);\n // ###TODO args.boundingRange = args.tree.getTransformNodeRange(this._animationTransformNodeId);\n return args;\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"BatchedTileTreeSupplier.js","sourceRoot":"","sources":["../../src/BatchedTileTreeSupplier.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;;;AAE/F,sDAAuF;AAKvF,qDAAkD;AAClD,iEAA8D;AAC9D,uDAAoD;AAQpD,MAAM,uBAAuB;IACpB,kBAAkB,CAAC,GAAsB,EAAE,GAAsB;QACtE,OAAO,IAAA,6BAAc,EAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,GAAG,CAAC,QAAQ,EAAE,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,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAC/B,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;QAC7C,GAAG,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC5B,IAAI;YACF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC7C,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YAEnC,MAAM,MAAM,GAAG,IAAI,2CAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;YAC/D,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,kBAAkB,EAAE,CAAC;YAEjD,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;YAC9B,OAAO,IAAI,iCAAe,CAAC,MAAM,CAAC,CAAC;SACpC;QAAC,OAAO,GAAG,EAAE;YACZ,qBAAM,CAAC,YAAY,CAAC,+BAAc,EAAE,GAAG,CAAC,CAAC;YACzC,OAAO,SAAS,CAAC;SAClB;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;AAFD,0DAEC","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\nimport { comparePossiblyUndefined, compareStrings, 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 { loggerCategory } from \"./LoggerCategory\";\r\nimport { BatchedTilesetReader } from \"./BatchedTilesetReader\";\r\nimport { BatchedTileTree } from \"./BatchedTileTree\";\r\n\r\n/** @internal */\r\nexport interface BatchedTileTreeId {\r\n baseUrl: URL;\r\n script?: RenderSchedule.Script;\r\n}\r\n\r\nclass BatchedTileTreeSupplier implements TileTreeSupplier {\r\n public compareTileTreeIds(lhs: BatchedTileTreeId, rhs: BatchedTileTreeId): number {\r\n return compareStrings(lhs.toString(), rhs.toString())\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 baseUrl = treeId.baseUrl;\r\n const url = new URL(\"tileset.json\", baseUrl);\r\n url.search = baseUrl.search;\r\n try {\r\n const response = await fetch(url.toString());\r\n const json = await response.json();\r\n\r\n const reader = new BatchedTilesetReader(json, iModel, baseUrl);\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,sDAAuF;AAKvF,qDAAkD;AAClD,iEAA8D;AAC9D,uDAAoD;AAQpD,MAAM,uBAAuB;IACpB,kBAAkB,CAAC,GAAsB,EAAE,GAAsB;QACtE,OAAO,IAAA,6BAAc,EAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,GAAG,CAAC,QAAQ,EAAE,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,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAC/B,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;QAC7C,GAAG,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC5B,IAAI;YACF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC7C,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YAEnC,MAAM,MAAM,GAAG,IAAI,2CAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;YAC/D,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,kBAAkB,EAAE,CAAC;YAEjD,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;YAC9B,OAAO,IAAI,iCAAe,CAAC,MAAM,CAAC,CAAC;SACpC;QAAC,OAAO,GAAG,EAAE;YACZ,qBAAM,CAAC,YAAY,CAAC,+BAAc,EAAE,GAAG,CAAC,CAAC;YACzC,OAAO,SAAS,CAAC;SAClB;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;AAFD,0DAEC","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\nimport { comparePossiblyUndefined, compareStrings, Logger } from \"@itwin/core-bentley\";\nimport { RenderSchedule } from \"@itwin/core-common\";\nimport {\n IModelConnection, TileTree, TileTreeOwner, TileTreeSupplier,\n} from \"@itwin/core-frontend\";\nimport { loggerCategory } from \"./LoggerCategory\";\nimport { BatchedTilesetReader } from \"./BatchedTilesetReader\";\nimport { BatchedTileTree } from \"./BatchedTileTree\";\n\n/** @internal */\nexport interface BatchedTileTreeId {\n baseUrl: URL;\n script?: RenderSchedule.Script;\n}\n\nclass BatchedTileTreeSupplier implements TileTreeSupplier {\n public compareTileTreeIds(lhs: BatchedTileTreeId, rhs: BatchedTileTreeId): number {\n return compareStrings(lhs.toString(), rhs.toString())\n || comparePossiblyUndefined((x, y) => x.compareTo(y), lhs.script, rhs.script);\n }\n\n public async createTileTree(treeId: BatchedTileTreeId, iModel: IModelConnection): Promise<TileTree | undefined> {\n const baseUrl = treeId.baseUrl;\n const url = new URL(\"tileset.json\", baseUrl);\n url.search = baseUrl.search;\n try {\n const response = await fetch(url.toString());\n const json = await response.json();\n\n const reader = new BatchedTilesetReader(json, iModel, baseUrl);\n const params = await reader.readTileTreeParams();\n\n params.script = treeId.script;\n return new BatchedTileTree(params);\n } catch (err) {\n Logger.logException(loggerCategory, err);\n return undefined;\n }\n }\n}\n\nconst batchedTileTreeSupplier: TileTreeSupplier = new BatchedTileTreeSupplier();\n\n/** @internal */\nexport function getBatchedTileTreeOwner(iModel: IModelConnection, treeId: BatchedTileTreeId): TileTreeOwner {\n return iModel.tiles.getTileTreeOwner(treeId, batchedTileTreeSupplier);\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"BatchedTilesetReader.js","sourceRoot":"","sources":["../../src/BatchedTilesetReader.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\nimport {\r\n Matrix3d, Point3d, Range3d, Transform, Vector3d,\r\n} from \"@itwin/core-geometry\";\r\nimport { Tileset3dSchema as schema } from \"@itwin/core-common\";\r\nimport { IModelConnection, RealityModelTileUtils, TileLoadPriority } from \"@itwin/core-frontend\";\r\nimport { BatchedTileTreeParams } from \"./BatchedTileTree\";\r\nimport { BatchedTile, BatchedTileParams } from \"./BatchedTile\";\r\n\r\nfunction isTileset3d(json: unknown): json is schema.Tileset {\r\n if (typeof json !== \"object\")\r\n return false;\r\n\r\n const props = json as schema.Tileset;\r\n\r\n if (!props.root || !props.asset)\r\n return false;\r\n\r\n // ###TODO spec requires geometricError to be present on tileset and all tiles; exporter is omitting from tileset.\r\n if (undefined === props.geometricError)\r\n props.geometricError = props.root.geometricError;\r\n\r\n return true;\r\n}\r\n\r\nfunction rangeFromBoundingVolume(vol: schema.BoundingVolume): Range3d {\r\n if (vol.box) {\r\n const center = new Point3d(vol.box[0], vol.box[1], vol.box[2]);\r\n const ux = new Vector3d(vol.box[3], vol.box[4], vol.box[5]);\r\n const uy = new Vector3d(vol.box[6], vol.box[7], vol.box[8]);\r\n const uz = new Vector3d(vol.box[9], vol.box[10], vol.box[11]);\r\n\r\n const range = Range3d.createNull();\r\n for (let i = -1; i <= 1; i += 2)\r\n for (let j = -1; j <= 1; j += 2)\r\n for (let k = -1; k <= 1; k += 2)\r\n range.extendPoint(center.plus3Scaled(ux, i, uy, j, uz, k));\r\n\r\n return range;\r\n } else if (vol.sphere) {\r\n const center = new Point3d(vol.sphere[0], vol.sphere[1], vol.sphere[2]);\r\n const radius = vol.sphere[3];\r\n return Range3d.createXYZXYZ(center.x - radius, center.y - radius, center.z - radius, center.x + radius, center.y + radius, center.z + radius);\r\n }\r\n\r\n // We won't get region bounding volumes in our tiles.\r\n throw new Error(\"region bounding volume unimplemented\");\r\n}\r\n\r\nfunction transformFromJSON(json: schema.Transform): Transform {\r\n const translation = new Point3d(json[12], json[13], json[14]);\r\n const matrix = Matrix3d.createRowValues(\r\n json[0], json[4], json[8],\r\n json[1], json[5], json[9],\r\n json[2], json[6], json[10],\r\n );\r\n\r\n return Transform.createOriginAndMatrix(translation, matrix);\r\n}\r\n\r\n/** @internal */\r\nexport class BatchedTilesetReader {\r\n private readonly _iModel: IModelConnection;\r\n private readonly _tileset: schema.Tileset;\r\n public readonly baseUrl: URL;\r\n\r\n public constructor(json: unknown, iModel: IModelConnection, baseUrl: URL) {\r\n if (!isTileset3d(json))\r\n throw new Error(\"Invalid tileset JSON\");\r\n\r\n this._iModel = iModel;\r\n this._tileset = json;\r\n this.baseUrl = baseUrl;\r\n }\r\n\r\n public readTileParams(json: schema.Tile, parent?: BatchedTile): BatchedTileParams {\r\n const content = json.content;\r\n const geometricError = json.geometricError;\r\n const range = rangeFromBoundingVolume(json.boundingVolume);\r\n const isLeaf = undefined === json.children || json.children.length === 0;\r\n\r\n let transformToRoot;\r\n if (undefined !== parent) {\r\n const localToParent = json.transform ? transformFromJSON(json.transform) : undefined;\r\n const parentToRoot = parent.transformToRoot;\r\n if (localToParent) {\r\n if (parentToRoot)\r\n localToParent.multiplyTransformTransform(parentToRoot, localToParent);\r\n\r\n transformToRoot = localToParent;\r\n } else {\r\n transformToRoot = parentToRoot;\r\n }\r\n }\r\n\r\n // ###TODO evaluate this. The geometric errors in the tiles seem far too small.\r\n const maximumSizeScale = 8;\r\n return {\r\n parent,\r\n contentId: content?.uri ?? \"\",\r\n range,\r\n contentRange: content?.boundingVolume ? rangeFromBoundingVolume(content.boundingVolume) : undefined,\r\n isLeaf,\r\n maximumSize: maximumSizeScale * RealityModelTileUtils.maximumSizeFromGeometricTolerance(range, geometricError),\r\n childrenProps: isLeaf ? undefined : json.children,\r\n transformToRoot,\r\n };\r\n }\r\n\r\n public async readTileTreeParams(): Promise<BatchedTileTreeParams> {\r\n const root = this._tileset.root;\r\n const location = root.transform ? transformFromJSON(root.transform) : Transform.createIdentity();\r\n\r\n return {\r\n id: \"spatial-models\",\r\n modelId: this._iModel.transientIds.getNext(),\r\n iModel: this._iModel,\r\n location,\r\n priority: TileLoadPriority.Primary,\r\n rootTile: this.readTileParams(root),\r\n reader: this,\r\n };\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"BatchedTilesetReader.js","sourceRoot":"","sources":["../../src/BatchedTilesetReader.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\nimport {\n Matrix3d, Point3d, Range3d, Transform, Vector3d,\n} from \"@itwin/core-geometry\";\nimport { Tileset3dSchema as schema } from \"@itwin/core-common\";\nimport { IModelConnection, RealityModelTileUtils, TileLoadPriority } from \"@itwin/core-frontend\";\nimport { BatchedTileTreeParams } from \"./BatchedTileTree\";\nimport { BatchedTile, BatchedTileParams } from \"./BatchedTile\";\n\nfunction isTileset3d(json: unknown): json is schema.Tileset {\n if (typeof json !== \"object\")\n return false;\n\n const props = json as schema.Tileset;\n\n if (!props.root || !props.asset)\n return false;\n\n // ###TODO spec requires geometricError to be present on tileset and all tiles; exporter is omitting from tileset.\n if (undefined === props.geometricError)\n props.geometricError = props.root.geometricError;\n\n return true;\n}\n\nfunction rangeFromBoundingVolume(vol: schema.BoundingVolume): Range3d {\n if (vol.box) {\n const center = new Point3d(vol.box[0], vol.box[1], vol.box[2]);\n const ux = new Vector3d(vol.box[3], vol.box[4], vol.box[5]);\n const uy = new Vector3d(vol.box[6], vol.box[7], vol.box[8]);\n const uz = new Vector3d(vol.box[9], vol.box[10], vol.box[11]);\n\n const range = Range3d.createNull();\n for (let i = -1; i <= 1; i += 2)\n for (let j = -1; j <= 1; j += 2)\n for (let k = -1; k <= 1; k += 2)\n range.extendPoint(center.plus3Scaled(ux, i, uy, j, uz, k));\n\n return range;\n } else if (vol.sphere) {\n const center = new Point3d(vol.sphere[0], vol.sphere[1], vol.sphere[2]);\n const radius = vol.sphere[3];\n return Range3d.createXYZXYZ(center.x - radius, center.y - radius, center.z - radius, center.x + radius, center.y + radius, center.z + radius);\n }\n\n // We won't get region bounding volumes in our tiles.\n throw new Error(\"region bounding volume unimplemented\");\n}\n\nfunction transformFromJSON(json: schema.Transform): Transform {\n const translation = new Point3d(json[12], json[13], json[14]);\n const matrix = Matrix3d.createRowValues(\n json[0], json[4], json[8],\n json[1], json[5], json[9],\n json[2], json[6], json[10],\n );\n\n return Transform.createOriginAndMatrix(translation, matrix);\n}\n\n/** @internal */\nexport class BatchedTilesetReader {\n private readonly _iModel: IModelConnection;\n private readonly _tileset: schema.Tileset;\n public readonly baseUrl: URL;\n\n public constructor(json: unknown, iModel: IModelConnection, baseUrl: URL) {\n if (!isTileset3d(json))\n throw new Error(\"Invalid tileset JSON\");\n\n this._iModel = iModel;\n this._tileset = json;\n this.baseUrl = baseUrl;\n }\n\n public readTileParams(json: schema.Tile, parent?: BatchedTile): BatchedTileParams {\n const content = json.content;\n const geometricError = json.geometricError;\n const range = rangeFromBoundingVolume(json.boundingVolume);\n const isLeaf = undefined === json.children || json.children.length === 0;\n\n let transformToRoot;\n if (undefined !== parent) {\n const localToParent = json.transform ? transformFromJSON(json.transform) : undefined;\n const parentToRoot = parent.transformToRoot;\n if (localToParent) {\n if (parentToRoot)\n localToParent.multiplyTransformTransform(parentToRoot, localToParent);\n\n transformToRoot = localToParent;\n } else {\n transformToRoot = parentToRoot;\n }\n }\n\n // ###TODO evaluate this. The geometric errors in the tiles seem far too small.\n const maximumSizeScale = 8;\n return {\n parent,\n contentId: content?.uri ?? \"\",\n range,\n contentRange: content?.boundingVolume ? rangeFromBoundingVolume(content.boundingVolume) : undefined,\n isLeaf,\n maximumSize: maximumSizeScale * RealityModelTileUtils.maximumSizeFromGeometricTolerance(range, geometricError),\n childrenProps: isLeaf ? undefined : json.children,\n transformToRoot,\n };\n }\n\n public async readTileTreeParams(): Promise<BatchedTileTreeParams> {\n const root = this._tileset.root;\n const location = root.transform ? transformFromJSON(root.transform) : Transform.createIdentity();\n\n return {\n id: \"spatial-models\",\n modelId: this._iModel.transientIds.getNext(),\n iModel: this._iModel,\n location,\n priority: TileLoadPriority.Primary,\n rootTile: this.readTileParams(root),\n reader: this,\n };\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"FrontendTiles.js","sourceRoot":"","sources":["../../src/FrontendTiles.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\nimport { AccessToken, Logger } from \"@itwin/core-bentley\";\r\nimport { IModelApp, IModelConnection, SpatialTileTreeReferences, SpatialViewState } from \"@itwin/core-frontend\";\r\nimport { loggerCategory } from \"./LoggerCategory\";\r\nimport { createBatchedSpatialTileTreeReferences } from \"./BatchedSpatialTileTreeRefs\";\r\n\r\n/** A function that can provide the base URL where a tileset representing all of the spatial models in a given iModel are stored.\r\n * The tileset is expected to reside at \"baseUrl/tileset.json\" and to have been produced by the [mesh export service](https://developer.bentley.com/apis/mesh-export/).\r\n * If no such tileset exists for the given iModel, return `undefined`.\r\n * @see [[FrontendTilesOptions.computeSpatialTilesetBaseUrl]].\r\n * @beta\r\n */\r\nexport type ComputeSpatialTilesetBaseUrl = (iModel: IModelConnection) => Promise<URL | undefined>;\r\n\r\nfunction createMeshExportServiceQueryUrl(args: { iModelId: string, urlPrefix?: string, changesetId?: string }): string {\r\n const prefix = args.urlPrefix ?? \"\";\r\n let url = `https://${prefix}api.bentley.com/mesh-export/?iModelId=${args.iModelId}&$orderBy=date:desc`;\r\n if (args.changesetId)\r\n url = `${url}&changesetId=${args.changesetId}`;\r\n\r\n return url;\r\n}\r\n\r\n/** Represents the result of a [mesh export](https://developer.bentley.com/apis/mesh-export/operations/get-export/#export).\r\n * @see [[queryCompletedMeshExports]].\r\n * @beta\r\n */\r\nexport interface MeshExport {\r\n id: string;\r\n displayName: string;\r\n status: string;\r\n request: {\r\n iModelId: string;\r\n changesetId: string;\r\n exportType: string;\r\n geometryOptions: any;\r\n viewDefinitionFilter: any;\r\n };\r\n\r\n /* eslint-disable-next-line @typescript-eslint/naming-convention */\r\n _links: {\r\n mesh: {\r\n href: string;\r\n };\r\n };\r\n}\r\n\r\n/** Exposed strictly for tests.\r\n * @internal\r\n */\r\nexport interface MeshExports {\r\n exports: MeshExport[];\r\n\r\n /* eslint-disable-next-line @typescript-eslint/naming-convention */\r\n _links: {\r\n next?: {\r\n href: string;\r\n };\r\n };\r\n}\r\n\r\n/** Arguments supplied to [[queryMeshExports]].\r\n * @beta\r\n */\r\nexport interface QueryMeshExportsArgs {\r\n /** The token used to access the mesh export service. */\r\n accessToken: AccessToken;\r\n /** The Id of the iModel for which to query exports. */\r\n iModelId: string;\r\n /** If defined, constrains the query to exports produced from the specified changeset. */\r\n changesetId?: string;\r\n /** Chiefly used in testing environments. */\r\n urlPrefix?: string;\r\n /** If true, exports whose status is not \"Complete\" (indicating the export successfully finished) will be included in the results. */\r\n includeIncomplete?: boolean;\r\n}\r\n\r\n/** Query the [mesh export service](https://developer.bentley.com/apis/mesh-export/operations/get-exports/) for exports of type \"IMODEL\" matching\r\n * the specified criteria.\r\n * The exports are sorted from most-recently- to least-recently-produced.\r\n * @beta\r\n */\r\nexport async function * queryMeshExports(args: QueryMeshExportsArgs): AsyncIterableIterator<MeshExport> {\r\n const headers = {\r\n /* eslint-disable-next-line @typescript-eslint/naming-convention */\r\n Authorization: args.accessToken ?? await IModelApp.getAccessToken(),\r\n /* eslint-disable-next-line @typescript-eslint/naming-convention */\r\n Accept: \"application/vnd.bentley.itwin-platform.v1+json\",\r\n /* eslint-disable-next-line @typescript-eslint/naming-convention */\r\n Prefer: \"return=representation\",\r\n };\r\n\r\n let url: string | undefined = createMeshExportServiceQueryUrl(args);\r\n while (url) {\r\n let result;\r\n try {\r\n const response = await fetch(url, { headers });\r\n result = await response.json() as MeshExports;\r\n } catch (err) {\r\n Logger.logException(loggerCategory, err);\r\n Logger.logError(loggerCategory, `Failed loading exports for iModel ${args.iModelId}`);\r\n break;\r\n }\r\n\r\n const foundExports = result.exports.filter((x) => x.request.exportType === \"IMODEL\" && (args.includeIncomplete || x.status === \"Complete\"));\r\n for (const foundExport of foundExports)\r\n yield foundExport;\r\n\r\n url = result._links.next?.href;\r\n }\r\n}\r\n\r\n/** Arguments supplied to [[obtainMeshExportTilesetUrl]].\r\n * @beta\r\n */\r\nexport interface ObtainMeshExportTilesetUrlArgs {\r\n /** The iModel for which to obtain a tileset URl. */\r\n iModel: IModelConnection;\r\n /** The token used to access the mesh export service. */\r\n accessToken: AccessToken;\r\n /** Chiefly used in testing environments. */\r\n urlPrefix?: string;\r\n /** If true, only exports produced for `iModel`'s specific changeset will be considered; otherwise, if no exports are found for the changeset,\r\n * the most recent export for any changeset will be used.\r\n */\r\n requireExactChangeset?: boolean;\r\n}\r\n\r\n/** Obtains a URL pointing to a tileset appropriate for visualizing a specific iModel.\r\n * [[queryCompletedMeshExports]] is used to obtain a list of available exports. By default, the list is sorted from most to least recently-exported.\r\n * The first export matching the iModel's changeset is selected; or, if no such export exists, the first export in the list is selected.\r\n * @returns A URL from which the tileset can be loaded, or `undefined` if no appropriate URL could be obtained.\r\n * @beta\r\n */\r\nexport async function obtainMeshExportTilesetUrl(args: ObtainMeshExportTilesetUrlArgs): Promise<URL | undefined> {\r\n if (!args.iModel.iModelId) {\r\n Logger.logInfo(loggerCategory, \"Cannot obtain exports for an iModel with no iModelId\");\r\n return undefined;\r\n }\r\n\r\n const queryArgs: QueryMeshExportsArgs = {\r\n accessToken: args.accessToken,\r\n iModelId: args.iModel.iModelId,\r\n changesetId: args.iModel.changeset.id,\r\n urlPrefix: args.urlPrefix,\r\n };\r\n\r\n let selectedExport;\r\n for await (const exp of queryMeshExports(queryArgs)) {\r\n selectedExport = exp;\r\n break;\r\n }\r\n\r\n if (!selectedExport && !args.requireExactChangeset) {\r\n queryArgs.changesetId = undefined;\r\n for await (const exp of queryMeshExports(queryArgs)) {\r\n selectedExport = exp;\r\n Logger.logInfo(loggerCategory, `No exports for iModel ${args.iModel.iModelId} for changeset ${args.iModel.changeset.id}; falling back to most recent`);\r\n break;\r\n }\r\n }\r\n\r\n if (!selectedExport) {\r\n Logger.logInfo(loggerCategory, `No exports available for iModel ${args.iModel.iModelId}`);\r\n return undefined;\r\n }\r\n\r\n const url = new URL(selectedExport._links.mesh.href);\r\n url.pathname = `${url.pathname}/tileset.json`;\r\n return url;\r\n}\r\n\r\n/** Options supplied to [[initializeFrontendTiles]].\r\n * @beta\r\n */\r\nexport interface FrontendTilesOptions {\r\n /** Provide the base URL for the pre-published tileset for a given iModel.\r\n * If omitted, [[obtainMeshExportTilesetUrl]] will be invoked with default arguments, using the access token provided by [[IModelApp]].\r\n */\r\n computeSpatialTilesetBaseUrl?: ComputeSpatialTilesetBaseUrl;\r\n /** The maximum number of levels in the tile tree to skip loading if they do not provide the desired level of detail for the current view.\r\n * Default: 4.\r\n * Reducing this value will load more intermediate tiles, which causes more gradual refinement: low-resolution tiles will display quickly, followed more gradually by\r\n * successively higher-resolution ones.\r\n * Increasing the value jumps more directly to tiles of the exact level of detail desired, which may load more, smaller tiles up-front, leaving some areas of the view\r\n * vacant for longer; and when zooming out some newly-exposed areas of the view may remain vacant for longer because no lower-resolution tiles are initially available to\r\n * fill them. However, tiles close to the viewer (and therefore likely of most interest to them) will refine to an appropriate level of detail more quickly.\r\n */\r\n maxLevelsToSkip?: number;\r\n /** Specifies whether to permit the user to enable visible edges or wireframe mode for batched tiles.\r\n * The currently-deployed mesh export service does not produce edges, so this currently defaults to `false` to avoid user confusion.\r\n * Set it to `true` if you are loading tiles created with a version of the exporter that does produce edges.\r\n * ###TODO delete this option once we deploy an edge-producing version of the exporter to production.\r\n * @internal\r\n */\r\n enableEdges?: boolean;\r\n}\r\n\r\n/** @internal */\r\nexport const createFallbackSpatialTileTreeReferences = SpatialTileTreeReferences.create;\r\n\r\n/** Global configuration initialized by [[initializeFrontendTiles]].\r\n * @internal\r\n */\r\nexport const frontendTilesOptions = {\r\n maxLevelsToSkip: 4,\r\n enableEdges: false,\r\n};\r\n\r\n/** Initialize the frontend-tiles package to obtain tiles for spatial views.\r\n * @beta\r\n */\r\nexport function initializeFrontendTiles(options: FrontendTilesOptions): void {\r\n if (undefined !== options.maxLevelsToSkip && options.maxLevelsToSkip >= 0)\r\n frontendTilesOptions.maxLevelsToSkip = options.maxLevelsToSkip;\r\n\r\n if (options.enableEdges)\r\n frontendTilesOptions.enableEdges = true;\r\n\r\n const computeUrl = options.computeSpatialTilesetBaseUrl ?? (\r\n async (iModel: IModelConnection) => obtainMeshExportTilesetUrl({ iModel, accessToken: await IModelApp.getAccessToken() })\r\n );\r\n\r\n SpatialTileTreeReferences.create = (view: SpatialViewState) => createBatchedSpatialTileTreeReferences(view, computeUrl);\r\n}\r\n"]}
1
+ {"version":3,"file":"FrontendTiles.js","sourceRoot":"","sources":["../../src/FrontendTiles.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;;;AAE/F,sDAA0D;AAC1D,wDAAgH;AAChH,qDAAkD;AAClD,6EAAsF;AAUtF,SAAS,+BAA+B,CAAC,IAAoE;IAC3G,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC;IACpC,IAAI,GAAG,GAAG,WAAW,MAAM,yCAAyC,IAAI,CAAC,QAAQ,qBAAqB,CAAC;IACvG,IAAI,IAAI,CAAC,WAAW;QAClB,GAAG,GAAG,GAAG,GAAG,gBAAgB,IAAI,CAAC,WAAW,EAAE,CAAC;IAEjD,OAAO,GAAG,CAAC;AACb,CAAC;AAwDD;;;;GAIG;AACI,KAAK,SAAU,CAAC,CAAC,gBAAgB,CAAC,IAA0B;IACjE,MAAM,OAAO,GAAG;QACd,mEAAmE;QACnE,aAAa,EAAE,IAAI,CAAC,WAAW,IAAI,MAAM,yBAAS,CAAC,cAAc,EAAE;QACnE,mEAAmE;QACnE,MAAM,EAAE,gDAAgD;QACxD,mEAAmE;QACnE,MAAM,EAAE,uBAAuB;KAChC,CAAC;IAEF,IAAI,GAAG,GAAuB,+BAA+B,CAAC,IAAI,CAAC,CAAC;IACpE,OAAO,GAAG,EAAE;QACV,IAAI,MAAM,CAAC;QACX,IAAI;YACF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;YAC/C,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAiB,CAAC;SAC/C;QAAC,OAAO,GAAG,EAAE;YACZ,qBAAM,CAAC,YAAY,CAAC,+BAAc,EAAE,GAAG,CAAC,CAAC;YACzC,qBAAM,CAAC,QAAQ,CAAC,+BAAc,EAAE,qCAAqC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC;YACtF,MAAM;SACP;QAED,MAAM,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,iBAAiB,IAAI,CAAC,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC;QAC5I,KAAK,MAAM,WAAW,IAAI,YAAY;YACpC,MAAM,WAAW,CAAC;QAEpB,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC;KAChC;AACH,CAAC;AA5BD,4CA4BC;AAkBD;;;;;GAKG;AACI,KAAK,UAAU,0BAA0B,CAAC,IAAoC;IACnF,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;QACzB,qBAAM,CAAC,OAAO,CAAC,+BAAc,EAAE,sDAAsD,CAAC,CAAC;QACvF,OAAO,SAAS,CAAC;KAClB;IAED,MAAM,SAAS,GAAyB;QACtC,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ;QAC9B,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE;QACrC,SAAS,EAAE,IAAI,CAAC,SAAS;KAC1B,CAAC;IAEF,IAAI,cAAc,CAAC;IACnB,IAAI,KAAK,EAAE,MAAM,GAAG,IAAI,gBAAgB,CAAC,SAAS,CAAC,EAAE;QACnD,cAAc,GAAG,GAAG,CAAC;QACrB,MAAM;KACP;IAED,IAAI,CAAC,cAAc,IAAI,CAAC,IAAI,CAAC,qBAAqB,EAAE;QAClD,SAAS,CAAC,WAAW,GAAG,SAAS,CAAC;QAClC,IAAI,KAAK,EAAE,MAAM,GAAG,IAAI,gBAAgB,CAAC,SAAS,CAAC,EAAE;YACnD,cAAc,GAAG,GAAG,CAAC;YACrB,qBAAM,CAAC,OAAO,CAAC,+BAAc,EAAE,yBAAyB,IAAI,CAAC,MAAM,CAAC,QAAQ,kBAAkB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,+BAA+B,CAAC,CAAC;YACvJ,MAAM;SACP;KACF;IAED,IAAI,CAAC,cAAc,EAAE;QACnB,qBAAM,CAAC,OAAO,CAAC,+BAAc,EAAE,mCAAmC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC1F,OAAO,SAAS,CAAC;KAClB;IAED,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrD,GAAG,CAAC,QAAQ,GAAG,GAAG,GAAG,CAAC,QAAQ,eAAe,CAAC;IAC9C,OAAO,GAAG,CAAC;AACb,CAAC;AApCD,gEAoCC;AA4BD,gBAAgB;AACH,QAAA,uCAAuC,GAAG,yCAAyB,CAAC,MAAM,CAAC;AAExF;;GAEG;AACU,QAAA,oBAAoB,GAAG;IAClC,eAAe,EAAE,CAAC;IAClB,WAAW,EAAE,KAAK;CACnB,CAAC;AAEF;;GAEG;AACH,SAAgB,uBAAuB,CAAC,OAA6B;IACnE,IAAI,SAAS,KAAK,OAAO,CAAC,eAAe,IAAI,OAAO,CAAC,eAAe,IAAI,CAAC;QACvE,4BAAoB,CAAC,eAAe,GAAG,OAAO,CAAC,eAAe,CAAC;IAEjE,IAAI,OAAO,CAAC,WAAW;QACrB,4BAAoB,CAAC,WAAW,GAAG,IAAI,CAAC;IAE1C,MAAM,UAAU,GAAG,OAAO,CAAC,4BAA4B,IAAI,CACzD,KAAK,EAAE,MAAwB,EAAE,EAAE,CAAC,0BAA0B,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,yBAAS,CAAC,cAAc,EAAE,EAAE,CAAC,CAC1H,CAAC;IAEF,yCAAyB,CAAC,MAAM,GAAG,CAAC,IAAsB,EAAE,EAAE,CAAC,IAAA,mEAAsC,EAAC,IAAI,EAAE,UAAU,CAAC,CAAC;AAC1H,CAAC;AAZD,0DAYC","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\nimport { AccessToken, Logger } from \"@itwin/core-bentley\";\nimport { IModelApp, IModelConnection, SpatialTileTreeReferences, SpatialViewState } from \"@itwin/core-frontend\";\nimport { loggerCategory } from \"./LoggerCategory\";\nimport { createBatchedSpatialTileTreeReferences } from \"./BatchedSpatialTileTreeRefs\";\n\n/** A function that can provide the base URL where a tileset representing all of the spatial models in a given iModel are stored.\n * The tileset is expected to reside at \"baseUrl/tileset.json\" and to have been produced by the [mesh export service](https://developer.bentley.com/apis/mesh-export/).\n * If no such tileset exists for the given iModel, return `undefined`.\n * @see [[FrontendTilesOptions.computeSpatialTilesetBaseUrl]].\n * @beta\n */\nexport type ComputeSpatialTilesetBaseUrl = (iModel: IModelConnection) => Promise<URL | undefined>;\n\nfunction createMeshExportServiceQueryUrl(args: { iModelId: string, urlPrefix?: string, changesetId?: string }): string {\n const prefix = args.urlPrefix ?? \"\";\n let url = `https://${prefix}api.bentley.com/mesh-export/?iModelId=${args.iModelId}&$orderBy=date:desc`;\n if (args.changesetId)\n url = `${url}&changesetId=${args.changesetId}`;\n\n return url;\n}\n\n/** Represents the result of a [mesh export](https://developer.bentley.com/apis/mesh-export/operations/get-export/#export).\n * @see [[queryCompletedMeshExports]].\n * @beta\n */\nexport interface MeshExport {\n id: string;\n displayName: string;\n status: string;\n request: {\n iModelId: string;\n changesetId: string;\n exportType: string;\n geometryOptions: any;\n viewDefinitionFilter: any;\n };\n\n /* eslint-disable-next-line @typescript-eslint/naming-convention */\n _links: {\n mesh: {\n href: string;\n };\n };\n}\n\n/** Exposed strictly for tests.\n * @internal\n */\nexport interface MeshExports {\n exports: MeshExport[];\n\n /* eslint-disable-next-line @typescript-eslint/naming-convention */\n _links: {\n next?: {\n href: string;\n };\n };\n}\n\n/** Arguments supplied to [[queryMeshExports]].\n * @beta\n */\nexport interface QueryMeshExportsArgs {\n /** The token used to access the mesh export service. */\n accessToken: AccessToken;\n /** The Id of the iModel for which to query exports. */\n iModelId: string;\n /** If defined, constrains the query to exports produced from the specified changeset. */\n changesetId?: string;\n /** Chiefly used in testing environments. */\n urlPrefix?: string;\n /** If true, exports whose status is not \"Complete\" (indicating the export successfully finished) will be included in the results. */\n includeIncomplete?: boolean;\n}\n\n/** Query the [mesh export service](https://developer.bentley.com/apis/mesh-export/operations/get-exports/) for exports of type \"IMODEL\" matching\n * the specified criteria.\n * The exports are sorted from most-recently- to least-recently-produced.\n * @beta\n */\nexport async function * queryMeshExports(args: QueryMeshExportsArgs): AsyncIterableIterator<MeshExport> {\n const headers = {\n /* eslint-disable-next-line @typescript-eslint/naming-convention */\n Authorization: args.accessToken ?? await IModelApp.getAccessToken(),\n /* eslint-disable-next-line @typescript-eslint/naming-convention */\n Accept: \"application/vnd.bentley.itwin-platform.v1+json\",\n /* eslint-disable-next-line @typescript-eslint/naming-convention */\n Prefer: \"return=representation\",\n };\n\n let url: string | undefined = createMeshExportServiceQueryUrl(args);\n while (url) {\n let result;\n try {\n const response = await fetch(url, { headers });\n result = await response.json() as MeshExports;\n } catch (err) {\n Logger.logException(loggerCategory, err);\n Logger.logError(loggerCategory, `Failed loading exports for iModel ${args.iModelId}`);\n break;\n }\n\n const foundExports = result.exports.filter((x) => x.request.exportType === \"IMODEL\" && (args.includeIncomplete || x.status === \"Complete\"));\n for (const foundExport of foundExports)\n yield foundExport;\n\n url = result._links.next?.href;\n }\n}\n\n/** Arguments supplied to [[obtainMeshExportTilesetUrl]].\n * @beta\n */\nexport interface ObtainMeshExportTilesetUrlArgs {\n /** The iModel for which to obtain a tileset URl. */\n iModel: IModelConnection;\n /** The token used to access the mesh export service. */\n accessToken: AccessToken;\n /** Chiefly used in testing environments. */\n urlPrefix?: string;\n /** If true, only exports produced for `iModel`'s specific changeset will be considered; otherwise, if no exports are found for the changeset,\n * the most recent export for any changeset will be used.\n */\n requireExactChangeset?: boolean;\n}\n\n/** Obtains a URL pointing to a tileset appropriate for visualizing a specific iModel.\n * [[queryCompletedMeshExports]] is used to obtain a list of available exports. By default, the list is sorted from most to least recently-exported.\n * The first export matching the iModel's changeset is selected; or, if no such export exists, the first export in the list is selected.\n * @returns A URL from which the tileset can be loaded, or `undefined` if no appropriate URL could be obtained.\n * @beta\n */\nexport async function obtainMeshExportTilesetUrl(args: ObtainMeshExportTilesetUrlArgs): Promise<URL | undefined> {\n if (!args.iModel.iModelId) {\n Logger.logInfo(loggerCategory, \"Cannot obtain exports for an iModel with no iModelId\");\n return undefined;\n }\n\n const queryArgs: QueryMeshExportsArgs = {\n accessToken: args.accessToken,\n iModelId: args.iModel.iModelId,\n changesetId: args.iModel.changeset.id,\n urlPrefix: args.urlPrefix,\n };\n\n let selectedExport;\n for await (const exp of queryMeshExports(queryArgs)) {\n selectedExport = exp;\n break;\n }\n\n if (!selectedExport && !args.requireExactChangeset) {\n queryArgs.changesetId = undefined;\n for await (const exp of queryMeshExports(queryArgs)) {\n selectedExport = exp;\n Logger.logInfo(loggerCategory, `No exports for iModel ${args.iModel.iModelId} for changeset ${args.iModel.changeset.id}; falling back to most recent`);\n break;\n }\n }\n\n if (!selectedExport) {\n Logger.logInfo(loggerCategory, `No exports available for iModel ${args.iModel.iModelId}`);\n return undefined;\n }\n\n const url = new URL(selectedExport._links.mesh.href);\n url.pathname = `${url.pathname}/tileset.json`;\n return url;\n}\n\n/** Options supplied to [[initializeFrontendTiles]].\n * @beta\n */\nexport interface FrontendTilesOptions {\n /** Provide the base URL for the pre-published tileset for a given iModel.\n * If omitted, [[obtainMeshExportTilesetUrl]] will be invoked with default arguments, using the access token provided by [[IModelApp]].\n */\n computeSpatialTilesetBaseUrl?: ComputeSpatialTilesetBaseUrl;\n /** The maximum number of levels in the tile tree to skip loading if they do not provide the desired level of detail for the current view.\n * Default: 4.\n * Reducing this value will load more intermediate tiles, which causes more gradual refinement: low-resolution tiles will display quickly, followed more gradually by\n * successively higher-resolution ones.\n * Increasing the value jumps more directly to tiles of the exact level of detail desired, which may load more, smaller tiles up-front, leaving some areas of the view\n * vacant for longer; and when zooming out some newly-exposed areas of the view may remain vacant for longer because no lower-resolution tiles are initially available to\n * fill them. However, tiles close to the viewer (and therefore likely of most interest to them) will refine to an appropriate level of detail more quickly.\n */\n maxLevelsToSkip?: number;\n /** Specifies whether to permit the user to enable visible edges or wireframe mode for batched tiles.\n * The currently-deployed mesh export service does not produce edges, so this currently defaults to `false` to avoid user confusion.\n * Set it to `true` if you are loading tiles created with a version of the exporter that does produce edges.\n * ###TODO delete this option once we deploy an edge-producing version of the exporter to production.\n * @internal\n */\n enableEdges?: boolean;\n}\n\n/** @internal */\nexport const createFallbackSpatialTileTreeReferences = SpatialTileTreeReferences.create;\n\n/** Global configuration initialized by [[initializeFrontendTiles]].\n * @internal\n */\nexport const frontendTilesOptions = {\n maxLevelsToSkip: 4,\n enableEdges: false,\n};\n\n/** Initialize the frontend-tiles package to obtain tiles for spatial views.\n * @beta\n */\nexport function initializeFrontendTiles(options: FrontendTilesOptions): void {\n if (undefined !== options.maxLevelsToSkip && options.maxLevelsToSkip >= 0)\n frontendTilesOptions.maxLevelsToSkip = options.maxLevelsToSkip;\n\n if (options.enableEdges)\n frontendTilesOptions.enableEdges = true;\n\n const computeUrl = options.computeSpatialTilesetBaseUrl ?? (\n async (iModel: IModelConnection) => obtainMeshExportTilesetUrl({ iModel, accessToken: await IModelApp.getAccessToken() })\n );\n\n SpatialTileTreeReferences.create = (view: SpatialViewState) => createBatchedSpatialTileTreeReferences(view, computeUrl);\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"LoggerCategory.js","sourceRoot":"","sources":["../../src/LoggerCategory.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;;;AAE/F,gBAAgB;AACH,QAAA,cAAc,GAAG,gBAAgB,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\n/** @internal */\r\nexport const loggerCategory = \"frontend-tiles\";\r\n\r\n"]}
1
+ {"version":3,"file":"LoggerCategory.js","sourceRoot":"","sources":["../../src/LoggerCategory.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;;;AAE/F,gBAAgB;AACH,QAAA,cAAc,GAAG,gBAAgB,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\n/** @internal */\nexport const loggerCategory = \"frontend-tiles\";\n\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"frontend-tiles.js","sourceRoot":"","sources":["../../src/frontend-tiles.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;;;;;;;;;;;;;;;;AAE/F,kDAAgC","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\nexport * from \"./FrontendTiles\";\r\n"]}
1
+ {"version":3,"file":"frontend-tiles.js","sourceRoot":"","sources":["../../src/frontend-tiles.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;;;;;;;;;;;;;;;;AAE/F,kDAAgC","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\nexport * from \"./FrontendTiles\";\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"BatchedModels.js","sourceRoot":"","sources":["../../src/BatchedModels.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 { Id64, Id64String } from \"@itwin/core-bentley\";\r\nimport { Range3d } from \"@itwin/core-geometry\";\r\nimport { ModelExtentsProps } from \"@itwin/core-common\";\r\nimport { IModelConnection, SpatialModelState, SpatialViewState } from \"@itwin/core-frontend\";\r\n\r\ninterface ModelMetadata {\r\n extents?: Range3d;\r\n isRealityModel: boolean;\r\n}\r\n\r\nexport class BatchedModels {\r\n private readonly _iModel: IModelConnection;\r\n private _viewedModels!: Set<Id64String>;\r\n private readonly _viewedExtents = new Range3d();\r\n private readonly _viewedModelIdPairs = new Id64.Uint32Set();\r\n private readonly _metadata = new Map<Id64String, ModelMetadata>();\r\n private _modelRangePromise?: Promise<void>;\r\n public readonly viewedRealityModelIds = new Set<Id64String>();\r\n\r\n public constructor(view: SpatialViewState) {\r\n this._iModel = view.iModel;\r\n this.setViewedModels(view.modelSelector.models);\r\n }\r\n\r\n public setViewedModels(models: Set<Id64String>): void {\r\n this._viewedModels = models;\r\n this._viewedModelIdPairs.clear();\r\n this._viewedModelIdPairs.addIds(models);\r\n this._viewedExtents.setNull();\r\n this.viewedRealityModelIds.clear();\r\n\r\n this._modelRangePromise = undefined;\r\n const rangeQueryModels: Id64String[] = [];\r\n\r\n for (const modelId of models) {\r\n let metadata = this._metadata.get(modelId);\r\n if (!metadata) {\r\n const model = this._iModel.models.getLoaded(modelId);\r\n this._metadata.set(modelId, metadata = { isRealityModel: model instanceof SpatialModelState && model.isRealityModel });\r\n }\r\n\r\n if (metadata.isRealityModel)\r\n this.viewedRealityModelIds.add(modelId);\r\n\r\n if (undefined === metadata.extents)\r\n rangeQueryModels.push(modelId);\r\n else\r\n this._viewedExtents.extendRange(metadata.extents);\r\n }\r\n\r\n if (rangeQueryModels.length === 0)\r\n return;\r\n\r\n const modelRangePromise = this._modelRangePromise = this._iModel.models.queryExtents(rangeQueryModels).then((extents: ModelExtentsProps[]) => {\r\n if (modelRangePromise !== this._modelRangePromise)\r\n return;\r\n\r\n this._modelRangePromise = undefined;\r\n for (const extent of extents) {\r\n const metadata = this._metadata.get(extent.id);\r\n if (metadata) {\r\n metadata.extents = Range3d.fromJSON(extent.extents);\r\n this._viewedExtents.extendRange(metadata.extents);\r\n }\r\n }\r\n }).catch(() => { });\r\n }\r\n\r\n public views(modelId: Id64String): boolean {\r\n return this._viewedModels.has(modelId);\r\n }\r\n\r\n public isViewed(modelIdLo: number, modelIdHi: number): boolean {\r\n return this._viewedModelIdPairs.has(modelIdLo, modelIdHi);\r\n }\r\n\r\n public unionRange(range: Range3d): void {\r\n range.extendRange(this._viewedExtents);\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"BatchedModels.js","sourceRoot":"","sources":["../../src/BatchedModels.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\nimport { Id64, Id64String } from \"@itwin/core-bentley\";\nimport { Range3d } from \"@itwin/core-geometry\";\nimport { ModelExtentsProps } from \"@itwin/core-common\";\nimport { IModelConnection, SpatialModelState, SpatialViewState } from \"@itwin/core-frontend\";\n\ninterface ModelMetadata {\n extents?: Range3d;\n isRealityModel: boolean;\n}\n\nexport class BatchedModels {\n private readonly _iModel: IModelConnection;\n private _viewedModels!: Set<Id64String>;\n private readonly _viewedExtents = new Range3d();\n private readonly _viewedModelIdPairs = new Id64.Uint32Set();\n private readonly _metadata = new Map<Id64String, ModelMetadata>();\n private _modelRangePromise?: Promise<void>;\n public readonly viewedRealityModelIds = new Set<Id64String>();\n\n public constructor(view: SpatialViewState) {\n this._iModel = view.iModel;\n this.setViewedModels(view.modelSelector.models);\n }\n\n public setViewedModels(models: Set<Id64String>): void {\n this._viewedModels = models;\n this._viewedModelIdPairs.clear();\n this._viewedModelIdPairs.addIds(models);\n this._viewedExtents.setNull();\n this.viewedRealityModelIds.clear();\n\n this._modelRangePromise = undefined;\n const rangeQueryModels: Id64String[] = [];\n\n for (const modelId of models) {\n let metadata = this._metadata.get(modelId);\n if (!metadata) {\n const model = this._iModel.models.getLoaded(modelId);\n this._metadata.set(modelId, metadata = { isRealityModel: model instanceof SpatialModelState && model.isRealityModel });\n }\n\n if (metadata.isRealityModel)\n this.viewedRealityModelIds.add(modelId);\n\n if (undefined === metadata.extents)\n rangeQueryModels.push(modelId);\n else\n this._viewedExtents.extendRange(metadata.extents);\n }\n\n if (rangeQueryModels.length === 0)\n return;\n\n const modelRangePromise = this._modelRangePromise = this._iModel.models.queryExtents(rangeQueryModels).then((extents: ModelExtentsProps[]) => {\n if (modelRangePromise !== this._modelRangePromise)\n return;\n\n this._modelRangePromise = undefined;\n for (const extent of extents) {\n const metadata = this._metadata.get(extent.id);\n if (metadata) {\n metadata.extents = Range3d.fromJSON(extent.extents);\n this._viewedExtents.extendRange(metadata.extents);\n }\n }\n }).catch(() => { });\n }\n\n public views(modelId: Id64String): boolean {\n return this._viewedModels.has(modelId);\n }\n\n public isViewed(modelIdLo: number, modelIdHi: number): boolean {\n return this._viewedModelIdPairs.has(modelIdLo, modelIdHi);\n }\n\n public unionRange(range: Range3d): void {\n range.extendRange(this._viewedExtents);\n }\n}\n"]}
@@ -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 { assert, Id64String } from \"@itwin/core-bentley\";\r\nimport { RenderSchedule } from \"@itwin/core-common\";\r\nimport {\r\n AttachToViewportArgs, IModelConnection, SpatialModelState, SpatialTileTreeReferences, SpatialViewState, TileTreeLoadStatus, TileTreeOwner, TileTreeReference,\r\n} from \"@itwin/core-frontend\";\r\nimport { AnimatedBatchedTileTreeReference, PrimaryBatchedTileTreeReference } from \"./BatchedTileTreeReference\";\r\nimport { getBatchedTileTreeOwner } from \"./BatchedTileTreeSupplier\";\r\nimport { BatchedModels } from \"./BatchedModels\";\r\nimport { ComputeSpatialTilesetBaseUrl, createFallbackSpatialTileTreeReferences } from \"./FrontendTiles\";\r\n\r\n// Obtains tiles pre-published by mesh export service.\r\nclass BatchedSpatialTileTreeReferences implements SpatialTileTreeReferences {\r\n private readonly _view: SpatialViewState;\r\n private readonly _models: BatchedModels;\r\n private _currentScript?: RenderSchedule.Script;\r\n private _primaryRef!: PrimaryBatchedTileTreeReference;\r\n private readonly _animatedRefs: AnimatedBatchedTileTreeReference[] = [];\r\n private _realityTreeRefs = new Map<Id64String, TileTreeReference>();\r\n private _onModelSelectorChanged?: () => void;\r\n\r\n public constructor(baseUrl: URL, view: SpatialViewState) {\r\n this._view = view;\r\n this._models = new BatchedModels(view);\r\n\r\n const script = view.displayStyle.scheduleScript;\r\n this._currentScript = script?.requiresBatching ? script : undefined;\r\n\r\n this.load(baseUrl, view.iModel);\r\n\r\n assert(undefined !== this._primaryRef);\r\n }\r\n\r\n private load(baseUrl: URL, iModel: IModelConnection): void {\r\n const treeOwner = getBatchedTileTreeOwner(iModel, { baseUrl, script: this._currentScript });\r\n this._primaryRef = new PrimaryBatchedTileTreeReference(treeOwner, this._models);\r\n\r\n this.populateAnimatedReferences(treeOwner);\r\n this.populateRealityModels();\r\n\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.load(baseUrl, iModel);\r\n };\r\n\r\n let removeScriptChangedListener = this._view.displayStyle.onScheduleScriptChanged.addListener((newScript) => onScriptChanged(newScript));\r\n this._view.onDisplayStyleChanged.addListener((newStyle) => {\r\n removeScriptChangedListener();\r\n onScriptChanged(newStyle.scheduleScript);\r\n removeScriptChangedListener = this._view.displayStyle.onScheduleScriptChanged.addListener((newScript) => onScriptChanged(newScript));\r\n });\r\n }\r\n\r\n public *[Symbol.iterator](): Iterator<TileTreeReference> {\r\n yield this._primaryRef;\r\n\r\n for (const animatedRef of this._animatedRefs)\r\n yield animatedRef;\r\n\r\n for (const realityTreeRef of this._realityTreeRefs.values())\r\n yield realityTreeRef;\r\n }\r\n\r\n private populateAnimatedReferences(treeOwner: TileTreeOwner): void {\r\n this._animatedRefs.length = 0;\r\n const script = this._currentScript;\r\n if (!script)\r\n return;\r\n\r\n const getCurrentTimePoint = () => this._view.displayStyle.settings.timePoint ?? script.duration.low;\r\n for (const timeline of script.modelTimelines) {\r\n const nodeIds = timeline.transformBatchIds;\r\n for (const nodeId of nodeIds) {\r\n this._animatedRefs.push(new AnimatedBatchedTileTreeReference(treeOwner, {\r\n timeline,\r\n nodeId,\r\n getCurrentTimePoint,\r\n }));\r\n }\r\n }\r\n }\r\n\r\n private populateRealityModels(): void {\r\n const prevRefs = this._realityTreeRefs;\r\n this._realityTreeRefs = new Map<Id64String, TileTreeReference>();\r\n for (const modelId of this._models.viewedRealityModelIds) {\r\n let ref = prevRefs.get(modelId);\r\n if (!ref) {\r\n const model = this._view.iModel.models.getLoaded(modelId);\r\n if (model && model instanceof SpatialModelState) {\r\n assert(model.isRealityModel);\r\n ref = model.createTileTreeReference(this._view);\r\n }\r\n }\r\n\r\n if (ref)\r\n this._realityTreeRefs.set(modelId, ref);\r\n }\r\n }\r\n\r\n public update(): void {\r\n this._models.setViewedModels(this._view.modelSelector.models);\r\n this.populateRealityModels();\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 }\r\n\r\n public detachFromViewport(): void {\r\n this._onModelSelectorChanged = undefined;\r\n }\r\n\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 dispose: () => { },\r\n loadTree: async () => Promise.resolve(undefined),\r\n };\r\n }\r\n\r\n public override get treeOwner() {\r\n return this._treeOwner;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public override get _isLoadingComplete() {\r\n return false;\r\n }\r\n}\r\n\r\n// Serves as a placeholder while we asynchronously obtain the base URL for a pre-published tileset (or asynchronously determine\r\n// that no such tileset exists).\r\nclass ProxySpatialTileTreeReferences implements SpatialTileTreeReferences {\r\n // Once async loading completes, all methods will be forwarded to this implementation.\r\n private _impl?: SpatialTileTreeReferences;\r\n private readonly _proxyRef: ProxyTileTreeReference;\r\n // Retained if attachToViewport is called while we are still loading; and reset if detachFromViewport is called while loading.\r\n private _attachArgs?: AttachToViewportArgs;\r\n\r\n public constructor(view: SpatialViewState, getBaseUrl: Promise<URL | undefined>) {\r\n this._proxyRef = new ProxyTileTreeReference(view.iModel);\r\n getBaseUrl.then((url: URL | undefined) => {\r\n if (url) {\r\n this.setTreeRefs(new BatchedSpatialTileTreeReferences(url, view));\r\n } else {\r\n this.setTreeRefs(createFallbackSpatialTileTreeReferences(view));\r\n }\r\n }).catch(() => {\r\n this.setTreeRefs(createFallbackSpatialTileTreeReferences(view));\r\n });\r\n }\r\n\r\n private setTreeRefs(refs: SpatialTileTreeReferences): void {\r\n this._impl = refs;\r\n if (this._attachArgs) {\r\n this._impl.attachToViewport(this._attachArgs);\r\n this._attachArgs.invalidateSymbologyOverrides();\r\n this._attachArgs = undefined;\r\n }\r\n }\r\n\r\n public update(): void {\r\n this._impl?.update();\r\n }\r\n\r\n public attachToViewport(args: AttachToViewportArgs): void {\r\n if (this._impl)\r\n this._impl.attachToViewport(args);\r\n else\r\n this._attachArgs = args;\r\n }\r\n\r\n public detachFromViewport(): void {\r\n if (this._impl)\r\n this._impl.detachFromViewport();\r\n else\r\n this._attachArgs = undefined;\r\n }\r\n\r\n public setDeactivated(): void { }\r\n\r\n public *[Symbol.iterator](): Iterator<TileTreeReference> {\r\n if (this._impl) {\r\n for (const ref of this._impl)\r\n yield ref;\r\n } else {\r\n yield this._proxyRef;\r\n }\r\n }\r\n}\r\n\r\nconst iModelToBaseUrl = new Map<IModelConnection, URL | null | Promise<URL | undefined>>();\r\n\r\n/** @internal */\r\nexport function createBatchedSpatialTileTreeReferences(view: SpatialViewState, computeBaseUrl: ComputeSpatialTilesetBaseUrl): SpatialTileTreeReferences {\r\n const iModel = view.iModel;\r\n let entry = iModelToBaseUrl.get(iModel);\r\n if (undefined === entry) {\r\n const promise = computeBaseUrl(iModel);\r\n iModelToBaseUrl.set(iModel, entry = promise);\r\n iModel.onClose.addOnce(() => iModelToBaseUrl.delete(iModel));\r\n promise.then((url: URL | undefined) => {\r\n if (iModelToBaseUrl.has(iModel))\r\n iModelToBaseUrl.set(iModel, url ?? null);\r\n }).catch(() => {\r\n if (iModelToBaseUrl.has(iModel))\r\n iModelToBaseUrl.set(iModel, null);\r\n });\r\n }\r\n\r\n if (null === entry) {\r\n // No tileset exists for this iModel - use default tile generation instead.\r\n return createFallbackSpatialTileTreeReferences(view);\r\n }\r\n\r\n if (entry instanceof Promise)\r\n return new ProxySpatialTileTreeReferences(view, entry);\r\n\r\n 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":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\nimport { assert, Id64String } from \"@itwin/core-bentley\";\nimport { RenderSchedule } from \"@itwin/core-common\";\nimport {\n AttachToViewportArgs, IModelConnection, SpatialModelState, SpatialTileTreeReferences, SpatialViewState, TileTreeLoadStatus, TileTreeOwner, TileTreeReference,\n} from \"@itwin/core-frontend\";\nimport { AnimatedBatchedTileTreeReference, PrimaryBatchedTileTreeReference } from \"./BatchedTileTreeReference\";\nimport { getBatchedTileTreeOwner } from \"./BatchedTileTreeSupplier\";\nimport { BatchedModels } from \"./BatchedModels\";\nimport { ComputeSpatialTilesetBaseUrl, createFallbackSpatialTileTreeReferences } from \"./FrontendTiles\";\n\n// Obtains tiles pre-published by mesh export service.\nclass BatchedSpatialTileTreeReferences implements SpatialTileTreeReferences {\n private readonly _view: SpatialViewState;\n private readonly _models: BatchedModels;\n private _currentScript?: RenderSchedule.Script;\n private _primaryRef!: PrimaryBatchedTileTreeReference;\n private readonly _animatedRefs: AnimatedBatchedTileTreeReference[] = [];\n private _realityTreeRefs = new Map<Id64String, TileTreeReference>();\n private _onModelSelectorChanged?: () => void;\n\n public constructor(baseUrl: URL, view: SpatialViewState) {\n this._view = view;\n this._models = new BatchedModels(view);\n\n const script = view.displayStyle.scheduleScript;\n this._currentScript = script?.requiresBatching ? script : undefined;\n\n this.load(baseUrl, view.iModel);\n\n assert(undefined !== this._primaryRef);\n }\n\n private load(baseUrl: URL, iModel: IModelConnection): void {\n const treeOwner = getBatchedTileTreeOwner(iModel, { baseUrl, script: this._currentScript });\n this._primaryRef = new PrimaryBatchedTileTreeReference(treeOwner, this._models);\n\n this.populateAnimatedReferences(treeOwner);\n this.populateRealityModels();\n\n const onScriptChanged = (newScript: RenderSchedule.Script | undefined) => {\n if (!newScript?.requiresBatching)\n newScript = undefined;\n\n const currentScript = this._currentScript;\n this._currentScript = newScript;\n\n if (newScript !== currentScript)\n if (!newScript || !currentScript || !newScript.equals(currentScript))\n this.load(baseUrl, iModel);\n };\n\n let removeScriptChangedListener = this._view.displayStyle.onScheduleScriptChanged.addListener((newScript) => onScriptChanged(newScript));\n this._view.onDisplayStyleChanged.addListener((newStyle) => {\n removeScriptChangedListener();\n onScriptChanged(newStyle.scheduleScript);\n removeScriptChangedListener = this._view.displayStyle.onScheduleScriptChanged.addListener((newScript) => onScriptChanged(newScript));\n });\n }\n\n public *[Symbol.iterator](): Iterator<TileTreeReference> {\n yield this._primaryRef;\n\n for (const animatedRef of this._animatedRefs)\n yield animatedRef;\n\n for (const realityTreeRef of this._realityTreeRefs.values())\n yield realityTreeRef;\n }\n\n private populateAnimatedReferences(treeOwner: TileTreeOwner): void {\n this._animatedRefs.length = 0;\n const script = this._currentScript;\n if (!script)\n return;\n\n const getCurrentTimePoint = () => this._view.displayStyle.settings.timePoint ?? script.duration.low;\n for (const timeline of script.modelTimelines) {\n const nodeIds = timeline.transformBatchIds;\n for (const nodeId of nodeIds) {\n this._animatedRefs.push(new AnimatedBatchedTileTreeReference(treeOwner, {\n timeline,\n nodeId,\n getCurrentTimePoint,\n }));\n }\n }\n }\n\n private populateRealityModels(): void {\n const prevRefs = this._realityTreeRefs;\n this._realityTreeRefs = new Map<Id64String, TileTreeReference>();\n for (const modelId of this._models.viewedRealityModelIds) {\n let ref = prevRefs.get(modelId);\n if (!ref) {\n const model = this._view.iModel.models.getLoaded(modelId);\n if (model && model instanceof SpatialModelState) {\n assert(model.isRealityModel);\n ref = model.createTileTreeReference(this._view);\n }\n }\n\n if (ref)\n this._realityTreeRefs.set(modelId, ref);\n }\n }\n\n public update(): void {\n this._models.setViewedModels(this._view.modelSelector.models);\n this.populateRealityModels();\n if (this._onModelSelectorChanged)\n this._onModelSelectorChanged();\n }\n\n public attachToViewport(args: AttachToViewportArgs): void {\n this._onModelSelectorChanged = () => args.invalidateSymbologyOverrides();\n }\n\n public detachFromViewport(): void {\n this._onModelSelectorChanged = undefined;\n }\n\n public setDeactivated(): void {\n // Used for debugging. Unimplemented here.\n }\n}\n\n// A placeholder used by [[ProxySpatialTileTreeReferences]] until asynchronous loading completes.\n// It provides a TileTreeOwner that never loads a tile tree.\n// This ensures that [ViewState.areAllTileTreesLoaded]($frontend) will not return `true` while we are loading.\nclass ProxyTileTreeReference extends TileTreeReference {\n private readonly _treeOwner: TileTreeOwner;\n\n public constructor(iModel: IModelConnection) {\n super();\n this._treeOwner = {\n iModel,\n tileTree: undefined,\n loadStatus: TileTreeLoadStatus.NotLoaded,\n load: () => undefined,\n dispose: () => { },\n loadTree: async () => Promise.resolve(undefined),\n };\n }\n\n public override get treeOwner() {\n return this._treeOwner;\n }\n\n // eslint-disable-next-line @typescript-eslint/naming-convention\n public override get _isLoadingComplete() {\n return false;\n }\n}\n\n// Serves as a placeholder while we asynchronously obtain the base URL for a pre-published tileset (or asynchronously determine\n// that no such tileset exists).\nclass ProxySpatialTileTreeReferences implements SpatialTileTreeReferences {\n // Once async loading completes, all methods will be forwarded to this implementation.\n private _impl?: SpatialTileTreeReferences;\n private readonly _proxyRef: ProxyTileTreeReference;\n // Retained if attachToViewport is called while we are still loading; and reset if detachFromViewport is called while loading.\n private _attachArgs?: AttachToViewportArgs;\n\n public constructor(view: SpatialViewState, getBaseUrl: Promise<URL | undefined>) {\n this._proxyRef = new ProxyTileTreeReference(view.iModel);\n getBaseUrl.then((url: URL | undefined) => {\n if (url) {\n this.setTreeRefs(new BatchedSpatialTileTreeReferences(url, view));\n } else {\n this.setTreeRefs(createFallbackSpatialTileTreeReferences(view));\n }\n }).catch(() => {\n this.setTreeRefs(createFallbackSpatialTileTreeReferences(view));\n });\n }\n\n private setTreeRefs(refs: SpatialTileTreeReferences): void {\n this._impl = refs;\n if (this._attachArgs) {\n this._impl.attachToViewport(this._attachArgs);\n this._attachArgs.invalidateSymbologyOverrides();\n this._attachArgs = undefined;\n }\n }\n\n public update(): void {\n this._impl?.update();\n }\n\n public attachToViewport(args: AttachToViewportArgs): void {\n if (this._impl)\n this._impl.attachToViewport(args);\n else\n this._attachArgs = args;\n }\n\n public detachFromViewport(): void {\n if (this._impl)\n this._impl.detachFromViewport();\n else\n this._attachArgs = undefined;\n }\n\n public setDeactivated(): void { }\n\n public *[Symbol.iterator](): Iterator<TileTreeReference> {\n if (this._impl) {\n for (const ref of this._impl)\n yield ref;\n } else {\n yield this._proxyRef;\n }\n }\n}\n\nconst iModelToBaseUrl = new Map<IModelConnection, URL | null | Promise<URL | undefined>>();\n\n/** @internal */\nexport function createBatchedSpatialTileTreeReferences(view: SpatialViewState, computeBaseUrl: ComputeSpatialTilesetBaseUrl): SpatialTileTreeReferences {\n const iModel = view.iModel;\n let entry = iModelToBaseUrl.get(iModel);\n if (undefined === entry) {\n const promise = computeBaseUrl(iModel);\n iModelToBaseUrl.set(iModel, entry = promise);\n iModel.onClose.addOnce(() => iModelToBaseUrl.delete(iModel));\n promise.then((url: URL | undefined) => {\n if (iModelToBaseUrl.has(iModel))\n iModelToBaseUrl.set(iModel, url ?? null);\n }).catch(() => {\n if (iModelToBaseUrl.has(iModel))\n iModelToBaseUrl.set(iModel, null);\n });\n }\n\n if (null === entry) {\n // No tileset exists for this iModel - use default tile generation instead.\n return createFallbackSpatialTileTreeReferences(view);\n }\n\n if (entry instanceof Promise)\n return new ProxySpatialTileTreeReferences(view, entry);\n\n return new BatchedSpatialTileTreeReferences(entry, view);\n}\n\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"BatchedTile.js","sourceRoot":"","sources":["../../src/BatchedTile.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAE/F,OAAO,EAAE,MAAM,EAAe,UAAU,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAE9E,OAAO,EAAE,QAAQ,EAAmB,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EACL,aAAa,EAAkB,SAAS,EAAE,iBAAiB,EAAgB,IAAI,EAAE,iBAAiB,EAC3D,kBAAkB,EAAE,kBAAkB,EAAY,cAAc,GACxG,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAElD,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AASvD,IAAI,OAAuC,CAAC;AAE5C,gBAAgB;AAChB,MAAM,OAAO,WAAY,SAAQ,IAAI;IAMnC,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,oBAAoB,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;YACnB,IAAI,CAAC,UAAU,EAAE,CAAC;YAClB,uBAAuB;YACvB,IAAI,CAAC,YAAY,GAAG,CAAC,CAAC;SACvB;QAED,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;IAC/E,CAAC;IAED,IAAY,gBAAgB;QAC1B,OAAO,IAAI,CAAC,QAAqC,CAAC;IACpD,CAAC;IAEe,mBAAmB,CAAC,SAA6B,EAAE,MAA0B;QAC3F,2FAA2F;QAC3F,OAAO,iBAAiB,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,cAAc,CAAC,cAAc,KAAK,GAAG;YACvC,OAAO;QAET,IAAI,IAAI,CAAC,YAAY,EAAE;YACrB,0EAA0E;YAC1E,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAC5B,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;SACrB;QAED,0BAA0B,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,0BAA0B,CAAC;QAClF,IAAI,cAAc,CAAC,SAAS,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE;YAC5E,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;YACpB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YACrB,MAAM,kBAAkB,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC;YAC/C,IAAI,kBAAkB,CAAC,OAAO,KAAK,kBAAkB;gBACnD,IAAI,CAAC,mBAAmB,EAAE,CAAC;YAE7B,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC;YACvC,IAAI,QAAQ,EAAE;gBACZ,KAAK,MAAM,KAAK,IAAI,QAAQ;oBAC1B,KAAK,CAAC,WAAW,CAAC,QAAQ,EAAE,IAAI,EAAE,0BAA0B,CAAC,CAAC;gBAEhE,OAAO;aACR;SACF;QAED,2EAA2E;QAC3E,IAAI,CAAC,cAAc,CAAC,OAAO,KAAK,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO;YACxE,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;QAE3B,IAAI,0BAA0B;YAC5B,QAAQ,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;IAC7C,CAAC;IAEkB,aAAa,CAAC,OAA+C,EAAE,MAA8B;QAC9G,IAAI,QAAmC,CAAC;QACxC,IAAI,IAAI,CAAC,cAAc,EAAE;YACvB,IAAI;gBACF,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,cAAc,EAAE;oBAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,cAAc,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;oBACxE,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;oBACxD,QAAQ,GAAG,QAAQ,IAAI,EAAE,CAAC;oBAC1B,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;iBACtB;aACF;YAAC,OAAO,GAAG,EAAE;gBACZ,MAAM,CAAC,YAAY,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;gBACzC,QAAQ,GAAG,SAAS,CAAC;gBACrB,IAAI,GAAG,YAAY,KAAK;oBACtB,MAAM,CAAC,GAAG,CAAC,CAAC;aACf;SACF;QAED,OAAO,CAAC,QAAQ,CAAC,CAAC;IACpB,CAAC;IAED,IAAoB,OAAO;QACzB,IAAI,CAAC,OAAO,EAAE;YACZ,OAAO,GAAG,IAAI,kBAAkB,CAAC,wBAAwB,EAAE,EAAE,CAAC,CAAC;YAC/D,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;SAC3C;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAEe,KAAK,CAAC,cAAc,CAAC,WAA0B;QAC7D,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACrE,GAAG,CAAC,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;QACpD,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;QAC7C,OAAO,QAAQ,CAAC,WAAW,EAAE,CAAC;IAChC,CAAC;IAEe,KAAK,CAAC,WAAW,CAAC,IAA8B,EAAE,MAAoB,EAAE,UAA0B;QAChH,MAAM,CAAC,IAAI,YAAY,UAAU,CAAC,CAAC;QACnC,IAAI,CAAC,CAAC,IAAI,YAAY,UAAU,CAAC;YAC/B,OAAO,EAAG,CAAC;QAEb,IAAI;YACF,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC;gBACpD,MAAM,EAAE,UAAU,CAAC,cAAc,CAAC,IAAI,CAAC;gBACvC,OAAO,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE;gBACnC,MAAM;gBACN,UAAU;gBACV,MAAM,EAAE,IAAI,CAAC,MAAM;aACpB,CAAC,CAAC;YAEH,IAAI,IAAI,CAAC,eAAe,EAAE;gBACxB,IAAI,OAAO,CAAC,OAAO,EAAE;oBACnB,MAAM,MAAM,GAAG,IAAI,aAAa,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;iBACrE;gBAED,IAAI,OAAO,CAAC,YAAY;oBACtB,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;aACnF;YAED,OAAO,OAAO,CAAC;SAChB;QAAC,MAAM;YACN,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;SACzB;IACH,CAAC;IAEkB,eAAe,CAAC,OAAuB,EAAE,IAAuB;QACjF,IAAI,iBAAiB,CAAC,YAAY,KAAK,IAAI,EAAE;YAC3C,KAAK,CAAC,eAAe,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YACrC,OAAO;SACR;QAED,OAAO,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAK,EAAE,QAAQ,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,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QAC7E,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE;YAC5B,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;YAC1B,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;YAC3B,OAAO,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;SAClC;IACH,CAAC;IAEM,KAAK,CAAC,SAAsB;QACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,gBAAgB,CAAC;QACvC,IAAI,CAAC,QAAQ;YACX,OAAO;QAET,IAAI,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE;YACzC,IAAI,CAAC,eAAe,EAAE,CAAC;SACxB;aAAM;YACL,KAAK,MAAM,KAAK,IAAI,QAAQ;gBAC1B,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;SAC1B;IACH,CAAC;CACF","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 { Transform } from \"@itwin/core-geometry\";\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 { loggerCategory } from \"./LoggerCategory\";\r\nimport { BatchedTileTree } from \"./BatchedTileTree\";\r\nimport { frontendTilesOptions } from \"./FrontendTiles\";\r\n\r\n/** @internal */\r\nexport interface BatchedTileParams extends TileParams {\r\n childrenProps: Tileset3dSchema.Tile[] | undefined;\r\n /** 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\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 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 private get _batchedChildren(): BatchedTile[] | undefined {\r\n return this.children as BatchedTile[] | undefined;\r\n }\r\n\r\n public override computeLoadPriority(viewports: Iterable<Viewport>, _users: Iterable<TileUser>): number {\r\n // Prioritize tiles closer to camera and center of attention (zoom point or screen center).\r\n return RealityTileLoader.computeTileLocationPriority(this, viewports, this.tree.iModelTransform);\r\n }\r\n\r\n public selectTiles(selected: Set<BatchedTile>, args: TileDrawArgs, closestDisplayableAncestor: BatchedTile | undefined): void {\r\n const vis = this.computeVisibility(args);\r\n if (TileVisibility.OutsideFrustum === vis)\r\n return;\r\n\r\n if (this._unskippable) {\r\n // Prevent this tile's content from being unloaded due to memory pressure.\r\n args.touchedTiles.add(this);\r\n args.markUsed(this);\r\n }\r\n\r\n closestDisplayableAncestor = this.hasGraphics ? this : closestDisplayableAncestor;\r\n if (TileVisibility.TooCoarse === vis && (this.isReady || !this._unskippable)) {\r\n args.markUsed(this);\r\n args.markReady(this);\r\n const childrenLoadStatus = this.loadChildren();\r\n if (TileTreeLoadStatus.Loading === childrenLoadStatus)\r\n args.markChildrenLoading();\r\n\r\n const children = this._batchedChildren;\r\n if (children) {\r\n for (const child of children)\r\n child.selectTiles(selected, args, closestDisplayableAncestor);\r\n\r\n return;\r\n }\r\n }\r\n\r\n // We want to display this tile. Request its content if not already loaded.\r\n if ((TileVisibility.Visible === vis || this._unskippable) && !this.isReady)\r\n args.insertMissing(this);\r\n\r\n if (closestDisplayableAncestor)\r\n selected.add(closestDisplayableAncestor);\r\n }\r\n\r\n protected override _loadChildren(resolve: (children: Tile[] | undefined) => void, reject: (error: Error) => void): void {\r\n let children: BatchedTile[] | undefined;\r\n if (this._childrenProps) {\r\n try {\r\n for (const childProps of this._childrenProps) {\r\n const params = this.batchedTree.reader.readTileParams(childProps, this);\r\n const child = new BatchedTile(params, this.batchedTree);\r\n children = children ?? [];\r\n children.push(child);\r\n }\r\n } catch (err) {\r\n Logger.logException(loggerCategory, err);\r\n children = undefined;\r\n if (err instanceof Error)\r\n reject(err);\r\n }\r\n }\r\n\r\n resolve(children);\r\n }\r\n\r\n public override get channel(): TileRequestChannel {\r\n if (!channel) {\r\n channel = new TileRequestChannel(\"itwinjs-batched-models\", 20);\r\n IModelApp.tileAdmin.channels.add(channel);\r\n }\r\n\r\n return channel;\r\n }\r\n\r\n public override async requestContent(_isCanceled: () => boolean): Promise<TileRequest.Response> {\r\n const url = new URL(this.contentId, this.batchedTree.reader.baseUrl);\r\n url.search = this.batchedTree.reader.baseUrl.search;\r\n const response = await fetch(url.toString());\r\n return response.arrayBuffer();\r\n }\r\n\r\n public override async readContent(data: TileRequest.ResponseData, system: RenderSystem, isCanceled?: () => boolean): Promise<TileContent> {\r\n assert(data instanceof Uint8Array);\r\n if (!(data instanceof Uint8Array))\r\n return { };\r\n\r\n try {\r\n 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 });\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":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\nimport { assert, BeTimePoint, ByteStream, Logger } from \"@itwin/core-bentley\";\nimport { Transform } from \"@itwin/core-geometry\";\nimport { ColorDef, Tileset3dSchema } from \"@itwin/core-common\";\nimport {\n GraphicBranch, GraphicBuilder, IModelApp, RealityTileLoader, RenderSystem, Tile, TileBoundingBoxes, TileContent,\n TileDrawArgs, TileParams, TileRequest, TileRequestChannel, TileTreeLoadStatus, TileUser, TileVisibility, Viewport,\n} from \"@itwin/core-frontend\";\nimport { loggerCategory } from \"./LoggerCategory\";\nimport { BatchedTileTree } from \"./BatchedTileTree\";\nimport { frontendTilesOptions } from \"./FrontendTiles\";\n\n/** @internal */\nexport interface BatchedTileParams extends TileParams {\n childrenProps: Tileset3dSchema.Tile[] | undefined;\n /** See BatchedTile.transformToRoot. */\n transformToRoot: Transform | undefined;\n}\n\nlet channel: TileRequestChannel | undefined;\n\n/** @internal */\nexport class BatchedTile extends Tile {\n private readonly _childrenProps?: Tileset3dSchema.Tile[];\n private readonly _unskippable: boolean;\n /** Transform from the tile's local coordinate system to that of the tileset. */\n public readonly transformToRoot?: Transform;\n\n public get batchedTree(): BatchedTileTree {\n return this.tree as BatchedTileTree;\n }\n\n public constructor(params: BatchedTileParams, tree: BatchedTileTree) {\n super(params, tree);\n\n // The root tile never has content, so it doesn't count toward max levels to skip.\n this._unskippable = 0 === (this.depth % frontendTilesOptions.maxLevelsToSkip);\n\n if (params.childrenProps?.length)\n this._childrenProps = params.childrenProps;\n\n if (!this.contentId) {\n this.setIsReady();\n // mark \"undisplayable\"\n this._maximumSize = 0;\n }\n\n if (!params.transformToRoot)\n return;\n\n this.transformToRoot = params.transformToRoot;\n this.boundingSphere.transformBy(this.transformToRoot, this.boundingSphere);\n this.transformToRoot.multiplyRange(this.range, this.range);\n if (this._contentRange)\n this.transformToRoot.multiplyRange(this._contentRange, this._contentRange);\n }\n\n private get _batchedChildren(): BatchedTile[] | undefined {\n return this.children as BatchedTile[] | undefined;\n }\n\n public override computeLoadPriority(viewports: Iterable<Viewport>, _users: Iterable<TileUser>): number {\n // Prioritize tiles closer to camera and center of attention (zoom point or screen center).\n return RealityTileLoader.computeTileLocationPriority(this, viewports, this.tree.iModelTransform);\n }\n\n public selectTiles(selected: Set<BatchedTile>, args: TileDrawArgs, closestDisplayableAncestor: BatchedTile | undefined): void {\n const vis = this.computeVisibility(args);\n if (TileVisibility.OutsideFrustum === vis)\n return;\n\n if (this._unskippable) {\n // Prevent this tile's content from being unloaded due to memory pressure.\n args.touchedTiles.add(this);\n args.markUsed(this);\n }\n\n closestDisplayableAncestor = this.hasGraphics ? this : closestDisplayableAncestor;\n if (TileVisibility.TooCoarse === vis && (this.isReady || !this._unskippable)) {\n args.markUsed(this);\n args.markReady(this);\n const childrenLoadStatus = this.loadChildren();\n if (TileTreeLoadStatus.Loading === childrenLoadStatus)\n args.markChildrenLoading();\n\n const children = this._batchedChildren;\n if (children) {\n for (const child of children)\n child.selectTiles(selected, args, closestDisplayableAncestor);\n\n return;\n }\n }\n\n // We want to display this tile. Request its content if not already loaded.\n if ((TileVisibility.Visible === vis || this._unskippable) && !this.isReady)\n args.insertMissing(this);\n\n if (closestDisplayableAncestor)\n selected.add(closestDisplayableAncestor);\n }\n\n protected override _loadChildren(resolve: (children: Tile[] | undefined) => void, reject: (error: Error) => void): void {\n let children: BatchedTile[] | undefined;\n if (this._childrenProps) {\n try {\n for (const childProps of this._childrenProps) {\n const params = this.batchedTree.reader.readTileParams(childProps, this);\n const child = new BatchedTile(params, this.batchedTree);\n children = children ?? [];\n children.push(child);\n }\n } catch (err) {\n Logger.logException(loggerCategory, err);\n children = undefined;\n if (err instanceof Error)\n reject(err);\n }\n }\n\n resolve(children);\n }\n\n public override get channel(): TileRequestChannel {\n if (!channel) {\n channel = new TileRequestChannel(\"itwinjs-batched-models\", 20);\n IModelApp.tileAdmin.channels.add(channel);\n }\n\n return channel;\n }\n\n public override async requestContent(_isCanceled: () => boolean): Promise<TileRequest.Response> {\n const url = new URL(this.contentId, this.batchedTree.reader.baseUrl);\n url.search = this.batchedTree.reader.baseUrl.search;\n const response = await fetch(url.toString());\n return response.arrayBuffer();\n }\n\n public override async readContent(data: TileRequest.ResponseData, system: RenderSystem, isCanceled?: () => boolean): Promise<TileContent> {\n assert(data instanceof Uint8Array);\n if (!(data instanceof Uint8Array))\n return { };\n\n try {\n const content = await this.batchedTree.decoder.decode({\n stream: ByteStream.fromUint8Array(data),\n options: { tileId: this.contentId },\n system,\n isCanceled,\n isLeaf: this.isLeaf,\n });\n\n if (this.transformToRoot) {\n if (content.graphic) {\n const branch = new GraphicBranch(true);\n branch.add(content.graphic);\n content.graphic = system.createBranch(branch, this.transformToRoot);\n }\n\n if (content.contentRange)\n content.contentRange = this.transformToRoot.multiplyRange(content.contentRange);\n }\n\n return content;\n } catch {\n return { isLeaf: true };\n }\n }\n\n protected override addRangeGraphic(builder: GraphicBuilder, type: TileBoundingBoxes): void {\n if (TileBoundingBoxes.ChildVolumes !== type) {\n super.addRangeGraphic(builder, type);\n return;\n }\n\n builder.setSymbology(ColorDef.green, ColorDef.green, 2);\n builder.addRangeBox(this.range);\n\n this.loadChildren();\n const children = this.children;\n if (!children)\n return;\n\n builder.setSymbology(ColorDef.blue, ColorDef.blue.withTransparency(0xdf), 1);\n for (const child of children) {\n const range = child.range;\n builder.addRangeBox(range);\n builder.addRangeBox(range, true);\n }\n }\n\n public prune(olderThan: BeTimePoint): void {\n const children = this._batchedChildren;\n if (!children)\n return;\n\n if (this.usageMarker.isExpired(olderThan)) {\n this.disposeChildren();\n } else {\n for (const child of children)\n child.prune(olderThan);\n }\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"BatchedTileContentReader.js","sourceRoot":"","sources":["../../src/BatchedTileContentReader.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, Id64, Id64String } from \"@itwin/core-bentley\";\r\nimport { Range3d } from \"@itwin/core-geometry\";\r\nimport { Feature, FeatureTable, TileReadStatus } from \"@itwin/core-common\";\r\nimport {\r\n GltfDataType, GltfMeshPrimitive, GltfReader, GltfReaderArgs, GltfReaderResult,\r\n} from \"@itwin/core-frontend\";\r\n\r\ninterface BatchedTileReaderArgs extends GltfReaderArgs {\r\n modelId: Id64String;\r\n isLeaf: boolean;\r\n range: Range3d;\r\n}\r\n\r\n/** Read batched tiles in 3d Tiles 1.1 format. Currently, we prefer to produce tiles in iMdl format, so this goes unused for now.\r\n * @internal\r\n */\r\nexport class BatchedTileContentReader extends GltfReader {\r\n private readonly _modelId: Id64String;\r\n private readonly _isLeaf: boolean;\r\n private readonly _range: Range3d;\r\n\r\n public constructor(args: BatchedTileReaderArgs) {\r\n super(args);\r\n this._modelId = args.modelId;\r\n this._isLeaf = args.isLeaf;\r\n this._range = args.range;\r\n }\r\n\r\n public override async read(): Promise<GltfReaderResult> {\r\n const featureTable = this.readFeatureTable();\r\n await this.resolveResources();\r\n if (this._isCanceled)\r\n return { readStatus: TileReadStatus.Canceled, isLeaf: this._isLeaf };\r\n\r\n return this.readGltfAndCreateGraphics(this._isLeaf, featureTable, this._range);\r\n }\r\n\r\n private readFeatureTable(): FeatureTable | undefined {\r\n // ###TODO we're just assuming there's one property table with one u64 property containing element Ids.\r\n const tables = this._glTF.extensions?.EXT_structural_metadata?.propertyTables;\r\n const table = tables ? tables[0] : undefined;\r\n const elementIdProperty = table?.properties ? table.properties.ElementId : undefined;\r\n if (!elementIdProperty)\r\n return undefined;\r\n\r\n const bufferView = this._bufferViews[elementIdProperty.values];\r\n if (!bufferView || undefined === bufferView.buffer)\r\n return undefined;\r\n\r\n const bufferData = this._buffers[bufferView.buffer]?.resolvedBuffer;\r\n if (!bufferData)\r\n return undefined;\r\n\r\n assert(undefined !== bufferView.byteLength); // required by spec; TypeScript interface is wrong.\r\n const byteOffset = bufferView.byteOffset ?? 0;\r\n const bytes = bufferData.subarray(byteOffset, byteOffset + bufferView.byteLength);\r\n\r\n // 2 u32s per element Id.\r\n const elementIds = new Uint32Array(bytes.buffer, bytes.byteOffset, bytes.byteLength / 4);\r\n const numFeatures = elementIds.length / 2;\r\n const featureTable = new FeatureTable(numFeatures, this._modelId);\r\n for (let i = 0; i < numFeatures; i++) {\r\n const elementId = Id64.fromUint32Pair(elementIds[i * 2], elementIds[i * 2 + 1]);\r\n featureTable.insertWithIndex(new Feature(elementId), i);\r\n }\r\n\r\n return featureTable;\r\n }\r\n\r\n protected override readPrimitiveFeatures(primitive: GltfMeshPrimitive): Feature | number[] | undefined {\r\n const ext = primitive.extensions?.EXT_mesh_features;\r\n if (ext) {\r\n // ###TODO making assumptions here.\r\n const view = this.getBufferView(primitive.attributes, `_FEATURE_ID_${ext.featureIds[0].attribute}`);\r\n // NB: 32-bit integers are not supported, but 8- and 16-bit integers will be converted to them.\r\n // With more than 64k features in the tile we represent the Ids as floats instead.\r\n const featureIds = view?.toBufferData(GltfDataType.Float) ?? view?.toBufferData(GltfDataType.UInt32);\r\n if (view && featureIds) {\r\n const indices = [];\r\n for (let i = 0; i < featureIds.count; i++) {\r\n const featureId = featureIds.buffer[i * view.stride];\r\n indices.push(featureId);\r\n }\r\n\r\n return indices;\r\n }\r\n }\r\n\r\n return new Feature(this._modelId);\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"BatchedTileContentReader.js","sourceRoot":"","sources":["../../src/BatchedTileContentReader.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\nimport { assert, Id64, Id64String } from \"@itwin/core-bentley\";\nimport { Range3d } from \"@itwin/core-geometry\";\nimport { Feature, FeatureTable, TileReadStatus } from \"@itwin/core-common\";\nimport {\n GltfDataType, GltfMeshPrimitive, GltfReader, GltfReaderArgs, GltfReaderResult,\n} from \"@itwin/core-frontend\";\n\ninterface BatchedTileReaderArgs extends GltfReaderArgs {\n modelId: Id64String;\n isLeaf: boolean;\n range: Range3d;\n}\n\n/** Read batched tiles in 3d Tiles 1.1 format. Currently, we prefer to produce tiles in iMdl format, so this goes unused for now.\n * @internal\n */\nexport class BatchedTileContentReader extends GltfReader {\n private readonly _modelId: Id64String;\n private readonly _isLeaf: boolean;\n private readonly _range: Range3d;\n\n public constructor(args: BatchedTileReaderArgs) {\n super(args);\n this._modelId = args.modelId;\n this._isLeaf = args.isLeaf;\n this._range = args.range;\n }\n\n public override async read(): Promise<GltfReaderResult> {\n const featureTable = this.readFeatureTable();\n await this.resolveResources();\n if (this._isCanceled)\n return { readStatus: TileReadStatus.Canceled, isLeaf: this._isLeaf };\n\n return this.readGltfAndCreateGraphics(this._isLeaf, featureTable, this._range);\n }\n\n private readFeatureTable(): FeatureTable | undefined {\n // ###TODO we're just assuming there's one property table with one u64 property containing element Ids.\n const tables = this._glTF.extensions?.EXT_structural_metadata?.propertyTables;\n const table = tables ? tables[0] : undefined;\n const elementIdProperty = table?.properties ? table.properties.ElementId : undefined;\n if (!elementIdProperty)\n return undefined;\n\n const bufferView = this._bufferViews[elementIdProperty.values];\n if (!bufferView || undefined === bufferView.buffer)\n return undefined;\n\n const bufferData = this._buffers[bufferView.buffer]?.resolvedBuffer;\n if (!bufferData)\n return undefined;\n\n assert(undefined !== bufferView.byteLength); // required by spec; TypeScript interface is wrong.\n const byteOffset = bufferView.byteOffset ?? 0;\n const bytes = bufferData.subarray(byteOffset, byteOffset + bufferView.byteLength);\n\n // 2 u32s per element Id.\n const elementIds = new Uint32Array(bytes.buffer, bytes.byteOffset, bytes.byteLength / 4);\n const numFeatures = elementIds.length / 2;\n const featureTable = new FeatureTable(numFeatures, this._modelId);\n for (let i = 0; i < numFeatures; i++) {\n const elementId = Id64.fromUint32Pair(elementIds[i * 2], elementIds[i * 2 + 1]);\n featureTable.insertWithIndex(new Feature(elementId), i);\n }\n\n return featureTable;\n }\n\n protected override readPrimitiveFeatures(primitive: GltfMeshPrimitive): Feature | number[] | undefined {\n const ext = primitive.extensions?.EXT_mesh_features;\n if (ext) {\n // ###TODO making assumptions here.\n const view = this.getBufferView(primitive.attributes, `_FEATURE_ID_${ext.featureIds[0].attribute}`);\n // NB: 32-bit integers are not supported, but 8- and 16-bit integers will be converted to them.\n // With more than 64k features in the tile we represent the Ids as floats instead.\n const featureIds = view?.toBufferData(GltfDataType.Float) ?? view?.toBufferData(GltfDataType.UInt32);\n if (view && featureIds) {\n const indices = [];\n for (let i = 0; i < featureIds.count; i++) {\n const featureId = featureIds.buffer[i * view.stride];\n indices.push(featureId);\n }\n\n return indices;\n }\n }\n\n return new Feature(this._modelId);\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"BatchedTileTree.js","sourceRoot":"","sources":["../../src/BatchedTileTree.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAE/F,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,UAAU,EAAqC,MAAM,oBAAoB,CAAC;AAC9F,OAAO,EACL,kBAAkB,EAAe,SAAS,EAAsB,QAAQ,GACzE,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,WAAW,EAAqB,MAAM,eAAe,CAAC;AAE/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAEvD,MAAM,gBAAgB,GAAsB;IAC1C,UAAU,EAAE,UAAU,CAAC,WAAW;IAClC,YAAY,EAAE,KAAK;CACpB,CAAC;AASF,gBAAgB;AAChB,MAAM,OAAO,eAAgB,SAAQ,QAAQ;IAM3C,YAAmB,MAA6B;QAC9C,KAAK,CAAC,MAAM,CAAC,CAAC;QACd,IAAI,CAAC,SAAS,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACxD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC5B,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC;QAEpC,IAAI,CAAC,OAAO,GAAG,kBAAkB,CAAC;YAChC,IAAI,EAAE,SAAS,CAAC,OAAO;YACvB,QAAQ,EAAE,IAAI,CAAC,cAAc;YAC7B,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,YAAY,EAAE,IAAI,CAAC,OAAO;YAC1B,IAAI,EAAE,IAAI;YACV,sBAAsB,EAAE,KAAK;YAC7B,QAAQ,EAAE,CAAC,SAAS,CAAC,SAAS,CAAC,kBAAkB;SAClD,CAAC,CAAC;IACL,CAAC;IAEe,OAAO;QACrB,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QACvB,KAAK,CAAC,OAAO,EAAE,CAAC;IAClB,CAAC;IAED,IAAoB,QAAQ;QAC1B,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED,IAAoB,IAAI;QACtB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAoB,QAAQ;QAC1B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAoB,iBAAiB;QACnC,OAAO,oBAAoB,CAAC,WAAW,CAAC,CAAC,CAAA,EAAG,CAAC,CAAC,CAAC,gBAAgB,CAAC;IAClE,CAAC;IAED,gEAAgE;IAChD,YAAY,CAAC,IAAkB;QAC7C,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAe,CAAC;QACxC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,QAAQ,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;QACrD,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC9B,CAAC;IAEe,IAAI,CAAC,IAAkB;QACrC,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACrC,KAAK,MAAM,IAAI,IAAI,KAAK;YACtB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QAE1B,IAAI,CAAC,YAAY,EAAE,CAAC;IACtB,CAAC;IAEe,KAAK;QACnB,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC/D,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IACjC,CAAC;CACF","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\nimport { BeTimePoint } from \"@itwin/core-bentley\";\r\nimport { BatchType, RenderMode, RenderSchedule, ViewFlagOverrides } from \"@itwin/core-common\";\r\nimport {\r\n acquireImdlDecoder, ImdlDecoder, IModelApp, Tile, TileDrawArgs, TileTree, TileTreeParams,\r\n} from \"@itwin/core-frontend\";\r\nimport { BatchedTile, BatchedTileParams } from \"./BatchedTile\";\r\nimport { BatchedTilesetReader } from \"./BatchedTilesetReader\";\r\nimport { frontendTilesOptions } from \"./FrontendTiles\";\r\n\r\nconst defaultViewFlags: ViewFlagOverrides = {\r\n renderMode: RenderMode.SmoothShade,\r\n visibleEdges: false,\r\n};\r\n\r\n/** @internal */\r\nexport interface BatchedTileTreeParams extends TileTreeParams {\r\n rootTile: BatchedTileParams;\r\n reader: BatchedTilesetReader;\r\n script?: RenderSchedule.Script;\r\n}\r\n\r\n/** @internal */\r\nexport class BatchedTileTree extends TileTree {\r\n private readonly _rootTile: BatchedTile;\r\n public readonly reader: BatchedTilesetReader;\r\n public readonly scheduleScript?: RenderSchedule.Script;\r\n public readonly decoder: ImdlDecoder;\r\n\r\n public constructor(params: BatchedTileTreeParams) {\r\n super(params);\r\n this._rootTile = new BatchedTile(params.rootTile, this);\r\n this.reader = params.reader;\r\n this.scheduleScript = params.script;\r\n\r\n this.decoder = acquireImdlDecoder({\r\n type: BatchType.Primary,\r\n timeline: this.scheduleScript,\r\n iModel: this.iModel,\r\n batchModelId: this.modelId,\r\n is3d: true,\r\n containsTransformNodes: false,\r\n noWorker: !IModelApp.tileAdmin.decodeImdlInWorker,\r\n });\r\n }\r\n\r\n public override dispose(): void {\r\n this.decoder.release();\r\n super.dispose();\r\n }\r\n\r\n public override get rootTile(): BatchedTile {\r\n return this._rootTile;\r\n }\r\n\r\n public override get is3d(): boolean {\r\n return true;\r\n }\r\n\r\n public override get maxDepth(): number | undefined {\r\n return undefined;\r\n }\r\n\r\n public override get viewFlagOverrides(): ViewFlagOverrides {\r\n return frontendTilesOptions.enableEdges ?{ } : defaultViewFlags;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public override _selectTiles(args: TileDrawArgs): Tile[] {\r\n const selected = new Set<BatchedTile>();\r\n this.rootTile.selectTiles(selected, args, undefined);\r\n return Array.from(selected);\r\n }\r\n\r\n public override draw(args: TileDrawArgs): void {\r\n const tiles = this.selectTiles(args);\r\n for (const tile of tiles)\r\n tile.drawGraphics(args);\r\n\r\n args.drawGraphics();\r\n }\r\n\r\n public override prune(): void {\r\n const olderThan = BeTimePoint.now().minus(this.expirationTime);\r\n this.rootTile.prune(olderThan);\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"BatchedTileTree.js","sourceRoot":"","sources":["../../src/BatchedTileTree.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAE/F,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,UAAU,EAAqC,MAAM,oBAAoB,CAAC;AAC9F,OAAO,EACL,kBAAkB,EAAe,SAAS,EAAsB,QAAQ,GACzE,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,WAAW,EAAqB,MAAM,eAAe,CAAC;AAE/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AAEvD,MAAM,gBAAgB,GAAsB;IAC1C,UAAU,EAAE,UAAU,CAAC,WAAW;IAClC,YAAY,EAAE,KAAK;CACpB,CAAC;AASF,gBAAgB;AAChB,MAAM,OAAO,eAAgB,SAAQ,QAAQ;IAM3C,YAAmB,MAA6B;QAC9C,KAAK,CAAC,MAAM,CAAC,CAAC;QACd,IAAI,CAAC,SAAS,GAAG,IAAI,WAAW,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACxD,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC5B,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC;QAEpC,IAAI,CAAC,OAAO,GAAG,kBAAkB,CAAC;YAChC,IAAI,EAAE,SAAS,CAAC,OAAO;YACvB,QAAQ,EAAE,IAAI,CAAC,cAAc;YAC7B,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,YAAY,EAAE,IAAI,CAAC,OAAO;YAC1B,IAAI,EAAE,IAAI;YACV,sBAAsB,EAAE,KAAK;YAC7B,QAAQ,EAAE,CAAC,SAAS,CAAC,SAAS,CAAC,kBAAkB;SAClD,CAAC,CAAC;IACL,CAAC;IAEe,OAAO;QACrB,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;QACvB,KAAK,CAAC,OAAO,EAAE,CAAC;IAClB,CAAC;IAED,IAAoB,QAAQ;QAC1B,OAAO,IAAI,CAAC,SAAS,CAAC;IACxB,CAAC;IAED,IAAoB,IAAI;QACtB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAoB,QAAQ;QAC1B,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAoB,iBAAiB;QACnC,OAAO,oBAAoB,CAAC,WAAW,CAAC,CAAC,CAAA,EAAG,CAAC,CAAC,CAAC,gBAAgB,CAAC;IAClE,CAAC;IAED,gEAAgE;IAChD,YAAY,CAAC,IAAkB;QAC7C,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAe,CAAC;QACxC,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,QAAQ,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC;QACrD,OAAO,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC9B,CAAC;IAEe,IAAI,CAAC,IAAkB;QACrC,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QACrC,KAAK,MAAM,IAAI,IAAI,KAAK;YACtB,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QAE1B,IAAI,CAAC,YAAY,EAAE,CAAC;IACtB,CAAC;IAEe,KAAK;QACnB,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC/D,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IACjC,CAAC;CACF","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\nimport { BeTimePoint } from \"@itwin/core-bentley\";\nimport { BatchType, RenderMode, RenderSchedule, ViewFlagOverrides } from \"@itwin/core-common\";\nimport {\n acquireImdlDecoder, ImdlDecoder, IModelApp, Tile, TileDrawArgs, TileTree, TileTreeParams,\n} from \"@itwin/core-frontend\";\nimport { BatchedTile, BatchedTileParams } from \"./BatchedTile\";\nimport { BatchedTilesetReader } from \"./BatchedTilesetReader\";\nimport { frontendTilesOptions } from \"./FrontendTiles\";\n\nconst defaultViewFlags: ViewFlagOverrides = {\n renderMode: RenderMode.SmoothShade,\n visibleEdges: false,\n};\n\n/** @internal */\nexport interface BatchedTileTreeParams extends TileTreeParams {\n rootTile: BatchedTileParams;\n reader: BatchedTilesetReader;\n script?: RenderSchedule.Script;\n}\n\n/** @internal */\nexport class BatchedTileTree extends TileTree {\n private readonly _rootTile: BatchedTile;\n public readonly reader: BatchedTilesetReader;\n public readonly scheduleScript?: RenderSchedule.Script;\n public readonly decoder: ImdlDecoder;\n\n public constructor(params: BatchedTileTreeParams) {\n super(params);\n this._rootTile = new BatchedTile(params.rootTile, this);\n this.reader = params.reader;\n this.scheduleScript = params.script;\n\n this.decoder = acquireImdlDecoder({\n type: BatchType.Primary,\n timeline: this.scheduleScript,\n iModel: this.iModel,\n batchModelId: this.modelId,\n is3d: true,\n containsTransformNodes: false,\n noWorker: !IModelApp.tileAdmin.decodeImdlInWorker,\n });\n }\n\n public override dispose(): void {\n this.decoder.release();\n super.dispose();\n }\n\n public override get rootTile(): BatchedTile {\n return this._rootTile;\n }\n\n public override get is3d(): boolean {\n return true;\n }\n\n public override get maxDepth(): number | undefined {\n return undefined;\n }\n\n public override get viewFlagOverrides(): ViewFlagOverrides {\n return frontendTilesOptions.enableEdges ?{ } : defaultViewFlags;\n }\n\n // eslint-disable-next-line @typescript-eslint/naming-convention\n public override _selectTiles(args: TileDrawArgs): Tile[] {\n const selected = new Set<BatchedTile>();\n this.rootTile.selectTiles(selected, args, undefined);\n return Array.from(selected);\n }\n\n public override draw(args: TileDrawArgs): void {\n const tiles = this.selectTiles(args);\n for (const tile of tiles)\n tile.drawGraphics(args);\n\n args.drawGraphics();\n }\n\n public override prune(): void {\n const olderThan = BeTimePoint.now().minus(this.expirationTime);\n this.rootTile.prune(olderThan);\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"BatchedTileTreeReference.js","sourceRoot":"","sources":["../../src/BatchedTileTreeReference.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAM/F,OAAO,EACL,eAAe,EAAE,uBAAuB,EAAuD,iBAAiB,GACjH,MAAM,sBAAsB,CAAC;AAG9B,gBAAgB;AAChB,MAAM,OAAgB,wBAAyB,SAAQ,iBAAiB;IAGtE,YAAsB,SAAwB;QAC5C,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,UAAU,GAAG,SAAS,CAAC;IAC9B,CAAC;IAED,IAAoB,SAAS;QAC3B,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAES,oBAAoB,CAAC,IAAc;QAC3C,OAAO,KAAK,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC;IAEkB,gBAAgB,CAAC,IAAc;QAChD,MAAM,MAAM,GAAG,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC;QAC/C,wFAAwF;QACxF,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AAED,MAAM,OAAO,+BAAgC,SAAQ,wBAAwB;IAG3E,YAAmB,SAAwB,EAAE,MAAqB;QAChE,KAAK,CAAC,SAAS,CAAC,CAAC;QACjB,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC;IACxB,CAAC;IAEe,aAAa,CAAC,KAAc;QAC1C,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;IAEe,qBAAqB;QACnC,OAAO,IAAI,CAAC;IACd,CAAC;IAEM,oBAAoB,CACzB,MAA+B,EAC/B,MAAc,EAAE,MAAc,EAC9B,QAAgB,EAAE,QAAgB,EAClC,SAAwB,EACxB,OAAe,EAAE,OAAe,EAChC,IAAe,EACf,eAAuB;QAEvB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;YAC1C,OAAO,SAAS,CAAC;QAEnB,OAAO,MAAM,CAAC,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,eAAe,CAAC,CAAC;IACtH,CAAC;IAEe,2BAA2B;QACzC,OAAO,eAAe,CAAC,aAAa,CAAC;IACvC,CAAC;CACF;AAQD,MAAM,OAAO,gCAAiC,SAAQ,wBAAwB;IAI5E,YAAmB,SAAwB,EAAE,IAAmB;QAC9D,KAAK,CAAC,SAAS,CAAC,CAAC;QACjB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,SAAS,GAAG,uBAAuB,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAC/E,CAAC;IAEe,2BAA2B;QACzC,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;IAC3B,CAAC;IAEe,oBAAoB,CAAC,IAAc;QACjD,MAAM,EAAE,GAAG,KAAK,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC;QAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,mBAAmB,EAAE,CAAC,CAAC;QACrG,IAAI,MAAM;YACR,MAAM,CAAC,0BAA0B,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QAE5C,OAAO,EAAE,CAAC;IACZ,CAAC;IAEe,cAAc,CAAC,OAAqB;QAClD,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,iBAAiB,EAAE,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC/F,IAAI,UAAU,IAAI,UAAU,CAAC,IAAI;YAC/B,OAAO,SAAS,CAAC;QAEnB,MAAM,IAAI,GAAG,KAAK,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;QAC3C,gGAAgG;QAChG,OAAO,IAAI,CAAC;IACd,CAAC;CACF","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\nimport { Range3d, Transform } from \"@itwin/core-geometry\";\r\nimport {\r\n BatchType, FeatureAppearance, FeatureAppearanceProvider, FeatureAppearanceSource, GeometryClass, RenderSchedule,\r\n} from \"@itwin/core-common\";\r\nimport {\r\n AnimationNodeId, formatAnimationBranchId, SceneContext, TileDrawArgs, TileTree, TileTreeOwner, TileTreeReference,\r\n} from \"@itwin/core-frontend\";\r\nimport { BatchedModels } from \"./BatchedModels\";\r\n\r\n/** @internal */\r\nexport abstract class BatchedTileTreeReference extends TileTreeReference {\r\n protected readonly _treeOwner: TileTreeOwner;\r\n\r\n protected constructor(treeOwner: TileTreeOwner) {\r\n super();\r\n this._treeOwner = treeOwner;\r\n }\r\n\r\n public override get treeOwner(): TileTreeOwner {\r\n return this._treeOwner;\r\n }\r\n\r\n protected computeBaseTransform(tree: TileTree): Transform {\r\n return super.computeTransform(tree);\r\n }\r\n\r\n protected override computeTransform(tree: TileTree): Transform {\r\n const baseTf = this.computeBaseTransform(tree);\r\n // ###TODO this.view.modelDisplayTransformProvider?.getModelDisplayTransform(modelId...)\r\n return baseTf;\r\n }\r\n}\r\n\r\nexport class PrimaryBatchedTileTreeReference extends BatchedTileTreeReference implements FeatureAppearanceProvider {\r\n private readonly _models: BatchedModels;\r\n\r\n public constructor(treeOwner: TileTreeOwner, models: BatchedModels) {\r\n super(treeOwner);\r\n this._models = models;\r\n }\r\n\r\n public override unionFitRange(range: Range3d): void {\r\n this._models.unionRange(range);\r\n }\r\n\r\n public override getAppearanceProvider(): FeatureAppearanceProvider | undefined {\r\n return this;\r\n }\r\n\r\n public getFeatureAppearance(\r\n source: FeatureAppearanceSource,\r\n elemLo: number, elemHi: number,\r\n subcatLo: number, subcatHi: number,\r\n geomClass: GeometryClass,\r\n modelLo: number, modelHi: number,\r\n type: BatchType,\r\n animationNodeId: number,\r\n ): FeatureAppearance | undefined {\r\n if (!this._models.isViewed(modelLo, modelHi))\r\n return undefined;\r\n\r\n return source.getAppearance(elemLo, elemHi, subcatLo, subcatHi, geomClass, modelLo, modelHi, type, animationNodeId);\r\n }\r\n\r\n public override getAnimationTransformNodeId() {\r\n return AnimationNodeId.Untransformed;\r\n }\r\n}\r\n\r\nexport interface AnimationNode {\r\n readonly timeline: RenderSchedule.ModelTimeline;\r\n readonly nodeId: number;\r\n getCurrentTimePoint(): number;\r\n}\r\n\r\nexport class AnimatedBatchedTileTreeReference extends BatchedTileTreeReference {\r\n private readonly _node: AnimationNode;\r\n private readonly _branchId: string;\r\n\r\n public constructor(treeOwner: TileTreeOwner, node: AnimationNode) {\r\n super(treeOwner);\r\n this._node = node;\r\n this._branchId = formatAnimationBranchId(node.timeline.modelId, node.nodeId);\r\n }\r\n\r\n public override getAnimationTransformNodeId(): number {\r\n return this._node.nodeId;\r\n }\r\n\r\n public override computeBaseTransform(tree: TileTree): Transform {\r\n const tf = super.computeBaseTransform(tree);\r\n const animTf = this._node.timeline.getTransform(this._node.nodeId, this._node.getCurrentTimePoint());\r\n if (animTf)\r\n animTf.multiplyTransformTransform(tf, tf);\r\n\r\n return tf;\r\n }\r\n\r\n public override createDrawArgs(context: SceneContext): TileDrawArgs | undefined {\r\n const animBranch = context.viewport.target.animationBranches?.branchStates.get(this._branchId);\r\n if (animBranch && animBranch.omit)\r\n return undefined;\r\n\r\n const args = super.createDrawArgs(context);\r\n // ###TODO args.boundingRange = args.tree.getTransformNodeRange(this._animationTransformNodeId);\r\n return args;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"BatchedTileTreeReference.js","sourceRoot":"","sources":["../../src/BatchedTileTreeReference.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\nimport { Range3d, Transform } from \"@itwin/core-geometry\";\nimport {\n BatchType, FeatureAppearance, FeatureAppearanceProvider, FeatureAppearanceSource, GeometryClass, RenderSchedule,\n} from \"@itwin/core-common\";\nimport {\n AnimationNodeId, formatAnimationBranchId, SceneContext, TileDrawArgs, TileTree, TileTreeOwner, TileTreeReference,\n} from \"@itwin/core-frontend\";\nimport { BatchedModels } from \"./BatchedModels\";\n\n/** @internal */\nexport abstract class BatchedTileTreeReference extends TileTreeReference {\n protected readonly _treeOwner: TileTreeOwner;\n\n protected constructor(treeOwner: TileTreeOwner) {\n super();\n this._treeOwner = treeOwner;\n }\n\n public override get treeOwner(): TileTreeOwner {\n return this._treeOwner;\n }\n\n protected computeBaseTransform(tree: TileTree): Transform {\n return super.computeTransform(tree);\n }\n\n protected override computeTransform(tree: TileTree): Transform {\n const baseTf = this.computeBaseTransform(tree);\n // ###TODO this.view.modelDisplayTransformProvider?.getModelDisplayTransform(modelId...)\n return baseTf;\n }\n}\n\nexport class PrimaryBatchedTileTreeReference extends BatchedTileTreeReference implements FeatureAppearanceProvider {\n private readonly _models: BatchedModels;\n\n public constructor(treeOwner: TileTreeOwner, models: BatchedModels) {\n super(treeOwner);\n this._models = models;\n }\n\n public override unionFitRange(range: Range3d): void {\n this._models.unionRange(range);\n }\n\n public override getAppearanceProvider(): FeatureAppearanceProvider | undefined {\n return this;\n }\n\n public getFeatureAppearance(\n source: FeatureAppearanceSource,\n elemLo: number, elemHi: number,\n subcatLo: number, subcatHi: number,\n geomClass: GeometryClass,\n modelLo: number, modelHi: number,\n type: BatchType,\n animationNodeId: number,\n ): FeatureAppearance | undefined {\n if (!this._models.isViewed(modelLo, modelHi))\n return undefined;\n\n return source.getAppearance(elemLo, elemHi, subcatLo, subcatHi, geomClass, modelLo, modelHi, type, animationNodeId);\n }\n\n public override getAnimationTransformNodeId() {\n return AnimationNodeId.Untransformed;\n }\n}\n\nexport interface AnimationNode {\n readonly timeline: RenderSchedule.ModelTimeline;\n readonly nodeId: number;\n getCurrentTimePoint(): number;\n}\n\nexport class AnimatedBatchedTileTreeReference extends BatchedTileTreeReference {\n private readonly _node: AnimationNode;\n private readonly _branchId: string;\n\n public constructor(treeOwner: TileTreeOwner, node: AnimationNode) {\n super(treeOwner);\n this._node = node;\n this._branchId = formatAnimationBranchId(node.timeline.modelId, node.nodeId);\n }\n\n public override getAnimationTransformNodeId(): number {\n return this._node.nodeId;\n }\n\n public override computeBaseTransform(tree: TileTree): Transform {\n const tf = super.computeBaseTransform(tree);\n const animTf = this._node.timeline.getTransform(this._node.nodeId, this._node.getCurrentTimePoint());\n if (animTf)\n animTf.multiplyTransformTransform(tf, tf);\n\n return tf;\n }\n\n public override createDrawArgs(context: SceneContext): TileDrawArgs | undefined {\n const animBranch = context.viewport.target.animationBranches?.branchStates.get(this._branchId);\n if (animBranch && animBranch.omit)\n return undefined;\n\n const args = super.createDrawArgs(context);\n // ###TODO args.boundingRange = args.tree.getTransformNodeRange(this._animationTransformNodeId);\n return args;\n }\n}\n"]}
@@ -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,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAKvF,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAQpD,MAAM,uBAAuB;IACpB,kBAAkB,CAAC,GAAsB,EAAE,GAAsB;QACtE,OAAO,cAAc,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,GAAG,CAAC,QAAQ,EAAE,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,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAC/B,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;QAC7C,GAAG,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC5B,IAAI;YACF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC7C,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YAEnC,MAAM,MAAM,GAAG,IAAI,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;YAC/D,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;SACpC;QAAC,OAAO,GAAG,EAAE;YACZ,MAAM,CAAC,YAAY,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;YACzC,OAAO,SAAS,CAAC;SAClB;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, 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 { loggerCategory } from \"./LoggerCategory\";\r\nimport { BatchedTilesetReader } from \"./BatchedTilesetReader\";\r\nimport { BatchedTileTree } from \"./BatchedTileTree\";\r\n\r\n/** @internal */\r\nexport interface BatchedTileTreeId {\r\n baseUrl: URL;\r\n script?: RenderSchedule.Script;\r\n}\r\n\r\nclass BatchedTileTreeSupplier implements TileTreeSupplier {\r\n public compareTileTreeIds(lhs: BatchedTileTreeId, rhs: BatchedTileTreeId): number {\r\n return compareStrings(lhs.toString(), rhs.toString())\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 baseUrl = treeId.baseUrl;\r\n const url = new URL(\"tileset.json\", baseUrl);\r\n url.search = baseUrl.search;\r\n try {\r\n const response = await fetch(url.toString());\r\n const json = await response.json();\r\n\r\n const reader = new BatchedTilesetReader(json, iModel, baseUrl);\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,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAKvF,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAQpD,MAAM,uBAAuB;IACpB,kBAAkB,CAAC,GAAsB,EAAE,GAAsB;QACtE,OAAO,cAAc,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,GAAG,CAAC,QAAQ,EAAE,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,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAC/B,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,cAAc,EAAE,OAAO,CAAC,CAAC;QAC7C,GAAG,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;QAC5B,IAAI;YACF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;YAC7C,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;YAEnC,MAAM,MAAM,GAAG,IAAI,oBAAoB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;YAC/D,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;SACpC;QAAC,OAAO,GAAG,EAAE;YACZ,MAAM,CAAC,YAAY,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;YACzC,OAAO,SAAS,CAAC;SAClB;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":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\nimport { comparePossiblyUndefined, compareStrings, Logger } from \"@itwin/core-bentley\";\nimport { RenderSchedule } from \"@itwin/core-common\";\nimport {\n IModelConnection, TileTree, TileTreeOwner, TileTreeSupplier,\n} from \"@itwin/core-frontend\";\nimport { loggerCategory } from \"./LoggerCategory\";\nimport { BatchedTilesetReader } from \"./BatchedTilesetReader\";\nimport { BatchedTileTree } from \"./BatchedTileTree\";\n\n/** @internal */\nexport interface BatchedTileTreeId {\n baseUrl: URL;\n script?: RenderSchedule.Script;\n}\n\nclass BatchedTileTreeSupplier implements TileTreeSupplier {\n public compareTileTreeIds(lhs: BatchedTileTreeId, rhs: BatchedTileTreeId): number {\n return compareStrings(lhs.toString(), rhs.toString())\n || comparePossiblyUndefined((x, y) => x.compareTo(y), lhs.script, rhs.script);\n }\n\n public async createTileTree(treeId: BatchedTileTreeId, iModel: IModelConnection): Promise<TileTree | undefined> {\n const baseUrl = treeId.baseUrl;\n const url = new URL(\"tileset.json\", baseUrl);\n url.search = baseUrl.search;\n try {\n const response = await fetch(url.toString());\n const json = await response.json();\n\n const reader = new BatchedTilesetReader(json, iModel, baseUrl);\n const params = await reader.readTileTreeParams();\n\n params.script = treeId.script;\n return new BatchedTileTree(params);\n } catch (err) {\n Logger.logException(loggerCategory, err);\n return undefined;\n }\n }\n}\n\nconst batchedTileTreeSupplier: TileTreeSupplier = new BatchedTileTreeSupplier();\n\n/** @internal */\nexport function getBatchedTileTreeOwner(iModel: IModelConnection, treeId: BatchedTileTreeId): TileTreeOwner {\n return iModel.tiles.getTileTreeOwner(treeId, batchedTileTreeSupplier);\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"BatchedTilesetReader.js","sourceRoot":"","sources":["../../src/BatchedTilesetReader.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\nimport {\r\n Matrix3d, Point3d, Range3d, Transform, Vector3d,\r\n} from \"@itwin/core-geometry\";\r\nimport { Tileset3dSchema as schema } from \"@itwin/core-common\";\r\nimport { IModelConnection, RealityModelTileUtils, TileLoadPriority } from \"@itwin/core-frontend\";\r\nimport { BatchedTileTreeParams } from \"./BatchedTileTree\";\r\nimport { BatchedTile, BatchedTileParams } from \"./BatchedTile\";\r\n\r\nfunction isTileset3d(json: unknown): json is schema.Tileset {\r\n if (typeof json !== \"object\")\r\n return false;\r\n\r\n const props = json as schema.Tileset;\r\n\r\n if (!props.root || !props.asset)\r\n return false;\r\n\r\n // ###TODO spec requires geometricError to be present on tileset and all tiles; exporter is omitting from tileset.\r\n if (undefined === props.geometricError)\r\n props.geometricError = props.root.geometricError;\r\n\r\n return true;\r\n}\r\n\r\nfunction rangeFromBoundingVolume(vol: schema.BoundingVolume): Range3d {\r\n if (vol.box) {\r\n const center = new Point3d(vol.box[0], vol.box[1], vol.box[2]);\r\n const ux = new Vector3d(vol.box[3], vol.box[4], vol.box[5]);\r\n const uy = new Vector3d(vol.box[6], vol.box[7], vol.box[8]);\r\n const uz = new Vector3d(vol.box[9], vol.box[10], vol.box[11]);\r\n\r\n const range = Range3d.createNull();\r\n for (let i = -1; i <= 1; i += 2)\r\n for (let j = -1; j <= 1; j += 2)\r\n for (let k = -1; k <= 1; k += 2)\r\n range.extendPoint(center.plus3Scaled(ux, i, uy, j, uz, k));\r\n\r\n return range;\r\n } else if (vol.sphere) {\r\n const center = new Point3d(vol.sphere[0], vol.sphere[1], vol.sphere[2]);\r\n const radius = vol.sphere[3];\r\n return Range3d.createXYZXYZ(center.x - radius, center.y - radius, center.z - radius, center.x + radius, center.y + radius, center.z + radius);\r\n }\r\n\r\n // We won't get region bounding volumes in our tiles.\r\n throw new Error(\"region bounding volume unimplemented\");\r\n}\r\n\r\nfunction transformFromJSON(json: schema.Transform): Transform {\r\n const translation = new Point3d(json[12], json[13], json[14]);\r\n const matrix = Matrix3d.createRowValues(\r\n json[0], json[4], json[8],\r\n json[1], json[5], json[9],\r\n json[2], json[6], json[10],\r\n );\r\n\r\n return Transform.createOriginAndMatrix(translation, matrix);\r\n}\r\n\r\n/** @internal */\r\nexport class BatchedTilesetReader {\r\n private readonly _iModel: IModelConnection;\r\n private readonly _tileset: schema.Tileset;\r\n public readonly baseUrl: URL;\r\n\r\n public constructor(json: unknown, iModel: IModelConnection, baseUrl: URL) {\r\n if (!isTileset3d(json))\r\n throw new Error(\"Invalid tileset JSON\");\r\n\r\n this._iModel = iModel;\r\n this._tileset = json;\r\n this.baseUrl = baseUrl;\r\n }\r\n\r\n public readTileParams(json: schema.Tile, parent?: BatchedTile): BatchedTileParams {\r\n const content = json.content;\r\n const geometricError = json.geometricError;\r\n const range = rangeFromBoundingVolume(json.boundingVolume);\r\n const isLeaf = undefined === json.children || json.children.length === 0;\r\n\r\n let transformToRoot;\r\n if (undefined !== parent) {\r\n const localToParent = json.transform ? transformFromJSON(json.transform) : undefined;\r\n const parentToRoot = parent.transformToRoot;\r\n if (localToParent) {\r\n if (parentToRoot)\r\n localToParent.multiplyTransformTransform(parentToRoot, localToParent);\r\n\r\n transformToRoot = localToParent;\r\n } else {\r\n transformToRoot = parentToRoot;\r\n }\r\n }\r\n\r\n // ###TODO evaluate this. The geometric errors in the tiles seem far too small.\r\n const maximumSizeScale = 8;\r\n return {\r\n parent,\r\n contentId: content?.uri ?? \"\",\r\n range,\r\n contentRange: content?.boundingVolume ? rangeFromBoundingVolume(content.boundingVolume) : undefined,\r\n isLeaf,\r\n maximumSize: maximumSizeScale * RealityModelTileUtils.maximumSizeFromGeometricTolerance(range, geometricError),\r\n childrenProps: isLeaf ? undefined : json.children,\r\n transformToRoot,\r\n };\r\n }\r\n\r\n public async readTileTreeParams(): Promise<BatchedTileTreeParams> {\r\n const root = this._tileset.root;\r\n const location = root.transform ? transformFromJSON(root.transform) : Transform.createIdentity();\r\n\r\n return {\r\n id: \"spatial-models\",\r\n modelId: this._iModel.transientIds.getNext(),\r\n iModel: this._iModel,\r\n location,\r\n priority: TileLoadPriority.Primary,\r\n rootTile: this.readTileParams(root),\r\n reader: this,\r\n };\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"BatchedTilesetReader.js","sourceRoot":"","sources":["../../src/BatchedTilesetReader.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\nimport {\n Matrix3d, Point3d, Range3d, Transform, Vector3d,\n} from \"@itwin/core-geometry\";\nimport { Tileset3dSchema as schema } from \"@itwin/core-common\";\nimport { IModelConnection, RealityModelTileUtils, TileLoadPriority } from \"@itwin/core-frontend\";\nimport { BatchedTileTreeParams } from \"./BatchedTileTree\";\nimport { BatchedTile, BatchedTileParams } from \"./BatchedTile\";\n\nfunction isTileset3d(json: unknown): json is schema.Tileset {\n if (typeof json !== \"object\")\n return false;\n\n const props = json as schema.Tileset;\n\n if (!props.root || !props.asset)\n return false;\n\n // ###TODO spec requires geometricError to be present on tileset and all tiles; exporter is omitting from tileset.\n if (undefined === props.geometricError)\n props.geometricError = props.root.geometricError;\n\n return true;\n}\n\nfunction rangeFromBoundingVolume(vol: schema.BoundingVolume): Range3d {\n if (vol.box) {\n const center = new Point3d(vol.box[0], vol.box[1], vol.box[2]);\n const ux = new Vector3d(vol.box[3], vol.box[4], vol.box[5]);\n const uy = new Vector3d(vol.box[6], vol.box[7], vol.box[8]);\n const uz = new Vector3d(vol.box[9], vol.box[10], vol.box[11]);\n\n const range = Range3d.createNull();\n for (let i = -1; i <= 1; i += 2)\n for (let j = -1; j <= 1; j += 2)\n for (let k = -1; k <= 1; k += 2)\n range.extendPoint(center.plus3Scaled(ux, i, uy, j, uz, k));\n\n return range;\n } else if (vol.sphere) {\n const center = new Point3d(vol.sphere[0], vol.sphere[1], vol.sphere[2]);\n const radius = vol.sphere[3];\n return Range3d.createXYZXYZ(center.x - radius, center.y - radius, center.z - radius, center.x + radius, center.y + radius, center.z + radius);\n }\n\n // We won't get region bounding volumes in our tiles.\n throw new Error(\"region bounding volume unimplemented\");\n}\n\nfunction transformFromJSON(json: schema.Transform): Transform {\n const translation = new Point3d(json[12], json[13], json[14]);\n const matrix = Matrix3d.createRowValues(\n json[0], json[4], json[8],\n json[1], json[5], json[9],\n json[2], json[6], json[10],\n );\n\n return Transform.createOriginAndMatrix(translation, matrix);\n}\n\n/** @internal */\nexport class BatchedTilesetReader {\n private readonly _iModel: IModelConnection;\n private readonly _tileset: schema.Tileset;\n public readonly baseUrl: URL;\n\n public constructor(json: unknown, iModel: IModelConnection, baseUrl: URL) {\n if (!isTileset3d(json))\n throw new Error(\"Invalid tileset JSON\");\n\n this._iModel = iModel;\n this._tileset = json;\n this.baseUrl = baseUrl;\n }\n\n public readTileParams(json: schema.Tile, parent?: BatchedTile): BatchedTileParams {\n const content = json.content;\n const geometricError = json.geometricError;\n const range = rangeFromBoundingVolume(json.boundingVolume);\n const isLeaf = undefined === json.children || json.children.length === 0;\n\n let transformToRoot;\n if (undefined !== parent) {\n const localToParent = json.transform ? transformFromJSON(json.transform) : undefined;\n const parentToRoot = parent.transformToRoot;\n if (localToParent) {\n if (parentToRoot)\n localToParent.multiplyTransformTransform(parentToRoot, localToParent);\n\n transformToRoot = localToParent;\n } else {\n transformToRoot = parentToRoot;\n }\n }\n\n // ###TODO evaluate this. The geometric errors in the tiles seem far too small.\n const maximumSizeScale = 8;\n return {\n parent,\n contentId: content?.uri ?? \"\",\n range,\n contentRange: content?.boundingVolume ? rangeFromBoundingVolume(content.boundingVolume) : undefined,\n isLeaf,\n maximumSize: maximumSizeScale * RealityModelTileUtils.maximumSizeFromGeometricTolerance(range, geometricError),\n childrenProps: isLeaf ? undefined : json.children,\n transformToRoot,\n };\n }\n\n public async readTileTreeParams(): Promise<BatchedTileTreeParams> {\n const root = this._tileset.root;\n const location = root.transform ? transformFromJSON(root.transform) : Transform.createIdentity();\n\n return {\n id: \"spatial-models\",\n modelId: this._iModel.transientIds.getNext(),\n iModel: this._iModel,\n location,\n priority: TileLoadPriority.Primary,\n rootTile: this.readTileParams(root),\n reader: this,\n };\n }\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"FrontendTiles.js","sourceRoot":"","sources":["../../src/FrontendTiles.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\nimport { AccessToken, Logger } from \"@itwin/core-bentley\";\r\nimport { IModelApp, IModelConnection, SpatialTileTreeReferences, SpatialViewState } from \"@itwin/core-frontend\";\r\nimport { loggerCategory } from \"./LoggerCategory\";\r\nimport { createBatchedSpatialTileTreeReferences } from \"./BatchedSpatialTileTreeRefs\";\r\n\r\n/** A function that can provide the base URL where a tileset representing all of the spatial models in a given iModel are stored.\r\n * The tileset is expected to reside at \"baseUrl/tileset.json\" and to have been produced by the [mesh export service](https://developer.bentley.com/apis/mesh-export/).\r\n * If no such tileset exists for the given iModel, return `undefined`.\r\n * @see [[FrontendTilesOptions.computeSpatialTilesetBaseUrl]].\r\n * @beta\r\n */\r\nexport type ComputeSpatialTilesetBaseUrl = (iModel: IModelConnection) => Promise<URL | undefined>;\r\n\r\nfunction createMeshExportServiceQueryUrl(args: { iModelId: string, urlPrefix?: string, changesetId?: string }): string {\r\n const prefix = args.urlPrefix ?? \"\";\r\n let url = `https://${prefix}api.bentley.com/mesh-export/?iModelId=${args.iModelId}&$orderBy=date:desc`;\r\n if (args.changesetId)\r\n url = `${url}&changesetId=${args.changesetId}`;\r\n\r\n return url;\r\n}\r\n\r\n/** Represents the result of a [mesh export](https://developer.bentley.com/apis/mesh-export/operations/get-export/#export).\r\n * @see [[queryCompletedMeshExports]].\r\n * @beta\r\n */\r\nexport interface MeshExport {\r\n id: string;\r\n displayName: string;\r\n status: string;\r\n request: {\r\n iModelId: string;\r\n changesetId: string;\r\n exportType: string;\r\n geometryOptions: any;\r\n viewDefinitionFilter: any;\r\n };\r\n\r\n /* eslint-disable-next-line @typescript-eslint/naming-convention */\r\n _links: {\r\n mesh: {\r\n href: string;\r\n };\r\n };\r\n}\r\n\r\n/** Exposed strictly for tests.\r\n * @internal\r\n */\r\nexport interface MeshExports {\r\n exports: MeshExport[];\r\n\r\n /* eslint-disable-next-line @typescript-eslint/naming-convention */\r\n _links: {\r\n next?: {\r\n href: string;\r\n };\r\n };\r\n}\r\n\r\n/** Arguments supplied to [[queryMeshExports]].\r\n * @beta\r\n */\r\nexport interface QueryMeshExportsArgs {\r\n /** The token used to access the mesh export service. */\r\n accessToken: AccessToken;\r\n /** The Id of the iModel for which to query exports. */\r\n iModelId: string;\r\n /** If defined, constrains the query to exports produced from the specified changeset. */\r\n changesetId?: string;\r\n /** Chiefly used in testing environments. */\r\n urlPrefix?: string;\r\n /** If true, exports whose status is not \"Complete\" (indicating the export successfully finished) will be included in the results. */\r\n includeIncomplete?: boolean;\r\n}\r\n\r\n/** Query the [mesh export service](https://developer.bentley.com/apis/mesh-export/operations/get-exports/) for exports of type \"IMODEL\" matching\r\n * the specified criteria.\r\n * The exports are sorted from most-recently- to least-recently-produced.\r\n * @beta\r\n */\r\nexport async function * queryMeshExports(args: QueryMeshExportsArgs): AsyncIterableIterator<MeshExport> {\r\n const headers = {\r\n /* eslint-disable-next-line @typescript-eslint/naming-convention */\r\n Authorization: args.accessToken ?? await IModelApp.getAccessToken(),\r\n /* eslint-disable-next-line @typescript-eslint/naming-convention */\r\n Accept: \"application/vnd.bentley.itwin-platform.v1+json\",\r\n /* eslint-disable-next-line @typescript-eslint/naming-convention */\r\n Prefer: \"return=representation\",\r\n };\r\n\r\n let url: string | undefined = createMeshExportServiceQueryUrl(args);\r\n while (url) {\r\n let result;\r\n try {\r\n const response = await fetch(url, { headers });\r\n result = await response.json() as MeshExports;\r\n } catch (err) {\r\n Logger.logException(loggerCategory, err);\r\n Logger.logError(loggerCategory, `Failed loading exports for iModel ${args.iModelId}`);\r\n break;\r\n }\r\n\r\n const foundExports = result.exports.filter((x) => x.request.exportType === \"IMODEL\" && (args.includeIncomplete || x.status === \"Complete\"));\r\n for (const foundExport of foundExports)\r\n yield foundExport;\r\n\r\n url = result._links.next?.href;\r\n }\r\n}\r\n\r\n/** Arguments supplied to [[obtainMeshExportTilesetUrl]].\r\n * @beta\r\n */\r\nexport interface ObtainMeshExportTilesetUrlArgs {\r\n /** The iModel for which to obtain a tileset URl. */\r\n iModel: IModelConnection;\r\n /** The token used to access the mesh export service. */\r\n accessToken: AccessToken;\r\n /** Chiefly used in testing environments. */\r\n urlPrefix?: string;\r\n /** If true, only exports produced for `iModel`'s specific changeset will be considered; otherwise, if no exports are found for the changeset,\r\n * the most recent export for any changeset will be used.\r\n */\r\n requireExactChangeset?: boolean;\r\n}\r\n\r\n/** Obtains a URL pointing to a tileset appropriate for visualizing a specific iModel.\r\n * [[queryCompletedMeshExports]] is used to obtain a list of available exports. By default, the list is sorted from most to least recently-exported.\r\n * The first export matching the iModel's changeset is selected; or, if no such export exists, the first export in the list is selected.\r\n * @returns A URL from which the tileset can be loaded, or `undefined` if no appropriate URL could be obtained.\r\n * @beta\r\n */\r\nexport async function obtainMeshExportTilesetUrl(args: ObtainMeshExportTilesetUrlArgs): Promise<URL | undefined> {\r\n if (!args.iModel.iModelId) {\r\n Logger.logInfo(loggerCategory, \"Cannot obtain exports for an iModel with no iModelId\");\r\n return undefined;\r\n }\r\n\r\n const queryArgs: QueryMeshExportsArgs = {\r\n accessToken: args.accessToken,\r\n iModelId: args.iModel.iModelId,\r\n changesetId: args.iModel.changeset.id,\r\n urlPrefix: args.urlPrefix,\r\n };\r\n\r\n let selectedExport;\r\n for await (const exp of queryMeshExports(queryArgs)) {\r\n selectedExport = exp;\r\n break;\r\n }\r\n\r\n if (!selectedExport && !args.requireExactChangeset) {\r\n queryArgs.changesetId = undefined;\r\n for await (const exp of queryMeshExports(queryArgs)) {\r\n selectedExport = exp;\r\n Logger.logInfo(loggerCategory, `No exports for iModel ${args.iModel.iModelId} for changeset ${args.iModel.changeset.id}; falling back to most recent`);\r\n break;\r\n }\r\n }\r\n\r\n if (!selectedExport) {\r\n Logger.logInfo(loggerCategory, `No exports available for iModel ${args.iModel.iModelId}`);\r\n return undefined;\r\n }\r\n\r\n const url = new URL(selectedExport._links.mesh.href);\r\n url.pathname = `${url.pathname}/tileset.json`;\r\n return url;\r\n}\r\n\r\n/** Options supplied to [[initializeFrontendTiles]].\r\n * @beta\r\n */\r\nexport interface FrontendTilesOptions {\r\n /** Provide the base URL for the pre-published tileset for a given iModel.\r\n * If omitted, [[obtainMeshExportTilesetUrl]] will be invoked with default arguments, using the access token provided by [[IModelApp]].\r\n */\r\n computeSpatialTilesetBaseUrl?: ComputeSpatialTilesetBaseUrl;\r\n /** The maximum number of levels in the tile tree to skip loading if they do not provide the desired level of detail for the current view.\r\n * Default: 4.\r\n * Reducing this value will load more intermediate tiles, which causes more gradual refinement: low-resolution tiles will display quickly, followed more gradually by\r\n * successively higher-resolution ones.\r\n * Increasing the value jumps more directly to tiles of the exact level of detail desired, which may load more, smaller tiles up-front, leaving some areas of the view\r\n * vacant for longer; and when zooming out some newly-exposed areas of the view may remain vacant for longer because no lower-resolution tiles are initially available to\r\n * fill them. However, tiles close to the viewer (and therefore likely of most interest to them) will refine to an appropriate level of detail more quickly.\r\n */\r\n maxLevelsToSkip?: number;\r\n /** Specifies whether to permit the user to enable visible edges or wireframe mode for batched tiles.\r\n * The currently-deployed mesh export service does not produce edges, so this currently defaults to `false` to avoid user confusion.\r\n * Set it to `true` if you are loading tiles created with a version of the exporter that does produce edges.\r\n * ###TODO delete this option once we deploy an edge-producing version of the exporter to production.\r\n * @internal\r\n */\r\n enableEdges?: boolean;\r\n}\r\n\r\n/** @internal */\r\nexport const createFallbackSpatialTileTreeReferences = SpatialTileTreeReferences.create;\r\n\r\n/** Global configuration initialized by [[initializeFrontendTiles]].\r\n * @internal\r\n */\r\nexport const frontendTilesOptions = {\r\n maxLevelsToSkip: 4,\r\n enableEdges: false,\r\n};\r\n\r\n/** Initialize the frontend-tiles package to obtain tiles for spatial views.\r\n * @beta\r\n */\r\nexport function initializeFrontendTiles(options: FrontendTilesOptions): void {\r\n if (undefined !== options.maxLevelsToSkip && options.maxLevelsToSkip >= 0)\r\n frontendTilesOptions.maxLevelsToSkip = options.maxLevelsToSkip;\r\n\r\n if (options.enableEdges)\r\n frontendTilesOptions.enableEdges = true;\r\n\r\n const computeUrl = options.computeSpatialTilesetBaseUrl ?? (\r\n async (iModel: IModelConnection) => obtainMeshExportTilesetUrl({ iModel, accessToken: await IModelApp.getAccessToken() })\r\n );\r\n\r\n SpatialTileTreeReferences.create = (view: SpatialViewState) => createBatchedSpatialTileTreeReferences(view, computeUrl);\r\n}\r\n"]}
1
+ {"version":3,"file":"FrontendTiles.js","sourceRoot":"","sources":["../../src/FrontendTiles.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\nimport { AccessToken, Logger } from \"@itwin/core-bentley\";\nimport { IModelApp, IModelConnection, SpatialTileTreeReferences, SpatialViewState } from \"@itwin/core-frontend\";\nimport { loggerCategory } from \"./LoggerCategory\";\nimport { createBatchedSpatialTileTreeReferences } from \"./BatchedSpatialTileTreeRefs\";\n\n/** A function that can provide the base URL where a tileset representing all of the spatial models in a given iModel are stored.\n * The tileset is expected to reside at \"baseUrl/tileset.json\" and to have been produced by the [mesh export service](https://developer.bentley.com/apis/mesh-export/).\n * If no such tileset exists for the given iModel, return `undefined`.\n * @see [[FrontendTilesOptions.computeSpatialTilesetBaseUrl]].\n * @beta\n */\nexport type ComputeSpatialTilesetBaseUrl = (iModel: IModelConnection) => Promise<URL | undefined>;\n\nfunction createMeshExportServiceQueryUrl(args: { iModelId: string, urlPrefix?: string, changesetId?: string }): string {\n const prefix = args.urlPrefix ?? \"\";\n let url = `https://${prefix}api.bentley.com/mesh-export/?iModelId=${args.iModelId}&$orderBy=date:desc`;\n if (args.changesetId)\n url = `${url}&changesetId=${args.changesetId}`;\n\n return url;\n}\n\n/** Represents the result of a [mesh export](https://developer.bentley.com/apis/mesh-export/operations/get-export/#export).\n * @see [[queryCompletedMeshExports]].\n * @beta\n */\nexport interface MeshExport {\n id: string;\n displayName: string;\n status: string;\n request: {\n iModelId: string;\n changesetId: string;\n exportType: string;\n geometryOptions: any;\n viewDefinitionFilter: any;\n };\n\n /* eslint-disable-next-line @typescript-eslint/naming-convention */\n _links: {\n mesh: {\n href: string;\n };\n };\n}\n\n/** Exposed strictly for tests.\n * @internal\n */\nexport interface MeshExports {\n exports: MeshExport[];\n\n /* eslint-disable-next-line @typescript-eslint/naming-convention */\n _links: {\n next?: {\n href: string;\n };\n };\n}\n\n/** Arguments supplied to [[queryMeshExports]].\n * @beta\n */\nexport interface QueryMeshExportsArgs {\n /** The token used to access the mesh export service. */\n accessToken: AccessToken;\n /** The Id of the iModel for which to query exports. */\n iModelId: string;\n /** If defined, constrains the query to exports produced from the specified changeset. */\n changesetId?: string;\n /** Chiefly used in testing environments. */\n urlPrefix?: string;\n /** If true, exports whose status is not \"Complete\" (indicating the export successfully finished) will be included in the results. */\n includeIncomplete?: boolean;\n}\n\n/** Query the [mesh export service](https://developer.bentley.com/apis/mesh-export/operations/get-exports/) for exports of type \"IMODEL\" matching\n * the specified criteria.\n * The exports are sorted from most-recently- to least-recently-produced.\n * @beta\n */\nexport async function * queryMeshExports(args: QueryMeshExportsArgs): AsyncIterableIterator<MeshExport> {\n const headers = {\n /* eslint-disable-next-line @typescript-eslint/naming-convention */\n Authorization: args.accessToken ?? await IModelApp.getAccessToken(),\n /* eslint-disable-next-line @typescript-eslint/naming-convention */\n Accept: \"application/vnd.bentley.itwin-platform.v1+json\",\n /* eslint-disable-next-line @typescript-eslint/naming-convention */\n Prefer: \"return=representation\",\n };\n\n let url: string | undefined = createMeshExportServiceQueryUrl(args);\n while (url) {\n let result;\n try {\n const response = await fetch(url, { headers });\n result = await response.json() as MeshExports;\n } catch (err) {\n Logger.logException(loggerCategory, err);\n Logger.logError(loggerCategory, `Failed loading exports for iModel ${args.iModelId}`);\n break;\n }\n\n const foundExports = result.exports.filter((x) => x.request.exportType === \"IMODEL\" && (args.includeIncomplete || x.status === \"Complete\"));\n for (const foundExport of foundExports)\n yield foundExport;\n\n url = result._links.next?.href;\n }\n}\n\n/** Arguments supplied to [[obtainMeshExportTilesetUrl]].\n * @beta\n */\nexport interface ObtainMeshExportTilesetUrlArgs {\n /** The iModel for which to obtain a tileset URl. */\n iModel: IModelConnection;\n /** The token used to access the mesh export service. */\n accessToken: AccessToken;\n /** Chiefly used in testing environments. */\n urlPrefix?: string;\n /** If true, only exports produced for `iModel`'s specific changeset will be considered; otherwise, if no exports are found for the changeset,\n * the most recent export for any changeset will be used.\n */\n requireExactChangeset?: boolean;\n}\n\n/** Obtains a URL pointing to a tileset appropriate for visualizing a specific iModel.\n * [[queryCompletedMeshExports]] is used to obtain a list of available exports. By default, the list is sorted from most to least recently-exported.\n * The first export matching the iModel's changeset is selected; or, if no such export exists, the first export in the list is selected.\n * @returns A URL from which the tileset can be loaded, or `undefined` if no appropriate URL could be obtained.\n * @beta\n */\nexport async function obtainMeshExportTilesetUrl(args: ObtainMeshExportTilesetUrlArgs): Promise<URL | undefined> {\n if (!args.iModel.iModelId) {\n Logger.logInfo(loggerCategory, \"Cannot obtain exports for an iModel with no iModelId\");\n return undefined;\n }\n\n const queryArgs: QueryMeshExportsArgs = {\n accessToken: args.accessToken,\n iModelId: args.iModel.iModelId,\n changesetId: args.iModel.changeset.id,\n urlPrefix: args.urlPrefix,\n };\n\n let selectedExport;\n for await (const exp of queryMeshExports(queryArgs)) {\n selectedExport = exp;\n break;\n }\n\n if (!selectedExport && !args.requireExactChangeset) {\n queryArgs.changesetId = undefined;\n for await (const exp of queryMeshExports(queryArgs)) {\n selectedExport = exp;\n Logger.logInfo(loggerCategory, `No exports for iModel ${args.iModel.iModelId} for changeset ${args.iModel.changeset.id}; falling back to most recent`);\n break;\n }\n }\n\n if (!selectedExport) {\n Logger.logInfo(loggerCategory, `No exports available for iModel ${args.iModel.iModelId}`);\n return undefined;\n }\n\n const url = new URL(selectedExport._links.mesh.href);\n url.pathname = `${url.pathname}/tileset.json`;\n return url;\n}\n\n/** Options supplied to [[initializeFrontendTiles]].\n * @beta\n */\nexport interface FrontendTilesOptions {\n /** Provide the base URL for the pre-published tileset for a given iModel.\n * If omitted, [[obtainMeshExportTilesetUrl]] will be invoked with default arguments, using the access token provided by [[IModelApp]].\n */\n computeSpatialTilesetBaseUrl?: ComputeSpatialTilesetBaseUrl;\n /** The maximum number of levels in the tile tree to skip loading if they do not provide the desired level of detail for the current view.\n * Default: 4.\n * Reducing this value will load more intermediate tiles, which causes more gradual refinement: low-resolution tiles will display quickly, followed more gradually by\n * successively higher-resolution ones.\n * Increasing the value jumps more directly to tiles of the exact level of detail desired, which may load more, smaller tiles up-front, leaving some areas of the view\n * vacant for longer; and when zooming out some newly-exposed areas of the view may remain vacant for longer because no lower-resolution tiles are initially available to\n * fill them. However, tiles close to the viewer (and therefore likely of most interest to them) will refine to an appropriate level of detail more quickly.\n */\n maxLevelsToSkip?: number;\n /** Specifies whether to permit the user to enable visible edges or wireframe mode for batched tiles.\n * The currently-deployed mesh export service does not produce edges, so this currently defaults to `false` to avoid user confusion.\n * Set it to `true` if you are loading tiles created with a version of the exporter that does produce edges.\n * ###TODO delete this option once we deploy an edge-producing version of the exporter to production.\n * @internal\n */\n enableEdges?: boolean;\n}\n\n/** @internal */\nexport const createFallbackSpatialTileTreeReferences = SpatialTileTreeReferences.create;\n\n/** Global configuration initialized by [[initializeFrontendTiles]].\n * @internal\n */\nexport const frontendTilesOptions = {\n maxLevelsToSkip: 4,\n enableEdges: false,\n};\n\n/** Initialize the frontend-tiles package to obtain tiles for spatial views.\n * @beta\n */\nexport function initializeFrontendTiles(options: FrontendTilesOptions): void {\n if (undefined !== options.maxLevelsToSkip && options.maxLevelsToSkip >= 0)\n frontendTilesOptions.maxLevelsToSkip = options.maxLevelsToSkip;\n\n if (options.enableEdges)\n frontendTilesOptions.enableEdges = true;\n\n const computeUrl = options.computeSpatialTilesetBaseUrl ?? (\n async (iModel: IModelConnection) => obtainMeshExportTilesetUrl({ iModel, accessToken: await IModelApp.getAccessToken() })\n );\n\n SpatialTileTreeReferences.create = (view: SpatialViewState) => createBatchedSpatialTileTreeReferences(view, computeUrl);\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"LoggerCategory.js","sourceRoot":"","sources":["../../src/LoggerCategory.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAE/F,gBAAgB;AAChB,MAAM,CAAC,MAAM,cAAc,GAAG,gBAAgB,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\n/** @internal */\r\nexport const loggerCategory = \"frontend-tiles\";\r\n\r\n"]}
1
+ {"version":3,"file":"LoggerCategory.js","sourceRoot":"","sources":["../../src/LoggerCategory.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAE/F,gBAAgB;AAChB,MAAM,CAAC,MAAM,cAAc,GAAG,gBAAgB,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\n/** @internal */\nexport const loggerCategory = \"frontend-tiles\";\n\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"frontend-tiles.js","sourceRoot":"","sources":["../../src/frontend-tiles.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAE/F,cAAc,iBAAiB,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\nexport * from \"./FrontendTiles\";\r\n"]}
1
+ {"version":3,"file":"frontend-tiles.js","sourceRoot":"","sources":["../../src/frontend-tiles.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAE/F,cAAc,iBAAiB,CAAC","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\nexport * from \"./FrontendTiles\";\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@itwin/frontend-tiles",
3
- "version": "4.3.0-dev.37",
3
+ "version": "4.3.0-dev.39",
4
4
  "description": "Experimental alternative technique for visualizing the contents of iModels",
5
5
  "main": "lib/cjs/frontend-tiles.js",
6
6
  "module": "lib/esm/frontend-tiles.js",
@@ -23,10 +23,10 @@
23
23
  "url": "http://www.bentley.com"
24
24
  },
25
25
  "peerDependencies": {
26
- "@itwin/core-bentley": "4.3.0-dev.37",
27
- "@itwin/core-common": "4.3.0-dev.37",
28
- "@itwin/core-frontend": "4.3.0-dev.37",
29
- "@itwin/core-geometry": "4.3.0-dev.37"
26
+ "@itwin/core-bentley": "4.3.0-dev.39",
27
+ "@itwin/core-frontend": "4.3.0-dev.39",
28
+ "@itwin/core-common": "4.3.0-dev.39",
29
+ "@itwin/core-geometry": "4.3.0-dev.39"
30
30
  },
31
31
  "devDependencies": {
32
32
  "@itwin/eslint-plugin": "4.0.0-dev.44",
@@ -47,12 +47,12 @@
47
47
  "source-map-loader": "^4.0.0",
48
48
  "typescript": "~5.0.2",
49
49
  "webpack": "^5.76.0",
50
- "@itwin/build-tools": "4.3.0-dev.37",
51
- "@itwin/core-frontend": "4.3.0-dev.37",
52
- "@itwin/certa": "4.3.0-dev.37",
53
- "@itwin/core-bentley": "4.3.0-dev.37",
54
- "@itwin/core-geometry": "4.3.0-dev.37",
55
- "@itwin/core-common": "4.3.0-dev.37"
50
+ "@itwin/core-bentley": "4.3.0-dev.39",
51
+ "@itwin/build-tools": "4.3.0-dev.39",
52
+ "@itwin/core-common": "4.3.0-dev.39",
53
+ "@itwin/certa": "4.3.0-dev.39",
54
+ "@itwin/core-geometry": "4.3.0-dev.39",
55
+ "@itwin/core-frontend": "4.3.0-dev.39"
56
56
  },
57
57
  "scripts": {
58
58
  "build": "npm run -s build:cjs && npm run -s build:esm",