@itwin/frontend-tiles 5.4.0-dev.10 → 5.4.0-dev.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +21 -1
- package/lib/cjs/BatchedModelGroups.js.map +1 -1
- package/lib/cjs/BatchedModels.js.map +1 -1
- package/lib/cjs/BatchedSpatialTileTreeRefs.js.map +1 -1
- package/lib/cjs/BatchedTile.js.map +1 -1
- package/lib/cjs/BatchedTileContentReader.js.map +1 -1
- package/lib/cjs/BatchedTileTree.js.map +1 -1
- package/lib/cjs/BatchedTileTreeReference.js.map +1 -1
- package/lib/cjs/BatchedTileTreeSupplier.js.map +1 -1
- package/lib/cjs/BatchedTilesetReader.js.map +1 -1
- package/lib/cjs/FrontendTiles.js.map +1 -1
- package/lib/cjs/GraphicsProvider/GraphicRepresentationProvider.js.map +1 -1
- package/lib/cjs/GraphicsProvider/GraphicsProvider.js.map +1 -1
- package/lib/cjs/GraphicsProvider/tileset-creators/GeoscienceTileset.js.map +1 -1
- package/lib/cjs/GraphicsProvider/url-providers/GeoscienceUrlProvider.js.map +1 -1
- package/lib/cjs/IndexedDBCache.js.map +1 -1
- package/lib/cjs/LoggerCategory.js.map +1 -1
- package/lib/cjs/ModelGroup.js.map +1 -1
- package/lib/cjs/ModelGroupDisplayTransforms.js.map +1 -1
- package/lib/cjs/frontend-tiles.js.map +1 -1
- package/lib/esm/BatchedModelGroups.js.map +1 -1
- package/lib/esm/BatchedModels.js.map +1 -1
- package/lib/esm/BatchedSpatialTileTreeRefs.js.map +1 -1
- package/lib/esm/BatchedTile.js.map +1 -1
- package/lib/esm/BatchedTileContentReader.js.map +1 -1
- package/lib/esm/BatchedTileTree.js.map +1 -1
- package/lib/esm/BatchedTileTreeReference.js.map +1 -1
- package/lib/esm/BatchedTileTreeSupplier.js.map +1 -1
- package/lib/esm/BatchedTilesetReader.js.map +1 -1
- package/lib/esm/FrontendTiles.js.map +1 -1
- package/lib/esm/GraphicsProvider/GraphicRepresentationProvider.js.map +1 -1
- package/lib/esm/GraphicsProvider/GraphicsProvider.js.map +1 -1
- package/lib/esm/GraphicsProvider/tileset-creators/GeoscienceTileset.js.map +1 -1
- package/lib/esm/GraphicsProvider/url-providers/GeoscienceUrlProvider.js.map +1 -1
- package/lib/esm/IndexedDBCache.js.map +1 -1
- package/lib/esm/LoggerCategory.js.map +1 -1
- package/lib/esm/ModelGroup.js.map +1 -1
- package/lib/esm/ModelGroupDisplayTransforms.js.map +1 -1
- package/lib/esm/frontend-tiles.js.map +1 -1
- package/package.json +12 -12
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GraphicRepresentationProvider.js","sourceRoot":"","sources":["../../../src/GraphicsProvider/GraphicRepresentationProvider.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, ITWINJS_CORE_VERSION } from \"@itwin/core-frontend\";\nimport { loggerCategory } from \"../LoggerCategory.js\";\n\n/** The expected format of the Graphic Representation\n * @beta\n */\n// eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents\nexport type GraphicRepresentationFormat = \"3DFT\" | \"3DTiles\" | \"CESIUM\" | \"IMODEL\" | string;\n\n/** Graphic representations are generated from Data Sources.\n * The status of a Graphic Representation indicates the progress of that generation process.\n * @beta\n */\nexport type GraphicRepresentationStatus = \"Complete\" | \"InProgress\" | \"Invalid\" | \"NotStarted\";\n\n/**\n * Represents a data source for a graphic representation.\n * A data source is usually higher-fidelity and contains more information, but may not be as well suited for visualization\n * as a graphic representation.\n * @beta\n */\nexport interface DataSource {\n /** The iTwinId associated with the DataSource */\n iTwinId: string;\n /** The unique identifier of a DataSource.\n * For example, a DataSource of type \"IMODEL\" has an iModelId which would be attributed to this value.\n */\n id: string;\n /** The unique identifier for a specific version of a DataSource.\n * For example, if a specific version of an iModel is desired, the iModel's changesetId would be attributed to this value.\n */\n changeId?: string;\n /** The type of the data source. For example, a DataSource can be of type \"IMODEL\" or \"RealityData\" */\n type: string;\n}\n\n/** Represents a visual representation of a data source, for example a 3d tileset.\n * A data source can be an iModel, reality data, or other kind of graphical data.\n * @see [[queryGraphicRepresentations]] for its construction as a representation of the data produced by a query of data sources.\n * @beta\n */\nexport interface GraphicRepresentation {\n /** The display name of the Graphic Representation */\n displayName: string;\n /** The unique identifier for the Graphic Representation */\n representationId: string;\n /** The status of the generation of the Graphic Representation from its Data Source.\n * @see [[GraphicRepresentationStatus]] for possible values.\n */\n status: GraphicRepresentationStatus;\n /** The expected format of the Graphic Representation\n * @see [[GraphicRepresentationFormat]] for possible values.\n */\n format: GraphicRepresentationFormat;\n /** The data source that the representation originates from.\n * For example, a GraphicRepresentation in the 3D Tiles format might have a dataSource that is a specific iModel changeset.\n */\n dataSource: DataSource;\n /** The url of the graphic representation\n * @note The url can only be guaranteed to be valid if the status is complete.\n */\n url: string | undefined;\n}\n\n/** Creates a URL used to query for Graphic Representations\n * @internal\n */\nexport function createGraphicRepresentationsQueryUrl(args: { sourceId: string, sourceType: string, urlPrefix?: string, changeId?: string, enableCDN?: boolean, numExports?: number }): string {\n const prefix = args.urlPrefix ?? \"\";\n const numExports = args.numExports ?? 5;\n let url = `https://${prefix}api.bentley.com/mesh-export/?iModelId=${args.sourceId}&$orderBy=date:desc&$top=${numExports}`;\n\n if (args.changeId)\n url = `${url}&changesetId=${args.changeId}`;\n\n if (args.enableCDN)\n url = `${url}&cdn=1`;\n\n const tileVersion = IModelApp.tileAdmin.maximumMajorTileFormatVersion.toString();\n url = `${url}&tileVersion=${tileVersion}&iTwinJS=${ITWINJS_CORE_VERSION}&exportType=${args.sourceType}`;\n\n return url;\n}\n\n/** Represents an export object from a response from the Mesh Export Service.\n * @internal\n */\ninterface ServiceJsonResponse {\n id: string;\n displayName: string;\n status: GraphicRepresentationStatus;\n request: {\n iModelId: string;\n changesetId: string;\n exportType: string;\n };\n\n /* eslint-disable-next-line @typescript-eslint/naming-convention */\n _links?: {\n mesh: {\n href: string;\n };\n };\n}\n\n/** Represents a response from the Mesh Export Service.\n * @internal\n */\ninterface ServiceJsonResponses {\n exports: ServiceJsonResponse[];\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 [[queryGraphicRepresentations]].\n * @beta\n */\nexport interface QueryGraphicRepresentationsArgs {\n /** The token used to access the data source provider. */\n accessToken: AccessToken;\n /** The unique identifier for the session in which this data source was queried.\n * A possible value is IModelApp.sessionId.\n */\n sessionId: string;\n /** The Data Source for which to query the graphic representations */\n dataSource: DataSource;\n /** The expected format of the graphic representations\n * @see [[GraphicRepresentationFormat]] for possible values.\n */\n format: GraphicRepresentationFormat;\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 /** If true, enables a CDN (content delivery network) to access tiles faster. */\n enableCDN?: boolean;\n /** Number of exports to query */\n numExports?: number;\n}\n\n/** Query Graphic Representations matching the specified criteria, sorted from most-recently- to least-recently-produced.\n * @beta\n */\nexport async function* queryGraphicRepresentations(args: QueryGraphicRepresentationsArgs): AsyncIterableIterator<GraphicRepresentation> {\n const headers = {\n /* eslint-disable-next-line @typescript-eslint/naming-convention */\n Authorization: args.accessToken,\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 /* eslint-disable-next-line @typescript-eslint/naming-convention */\n SessionId: args.sessionId,\n };\n\n let url: string | undefined = createGraphicRepresentationsQueryUrl({ sourceId: args.dataSource.id, sourceType: args.dataSource.type, urlPrefix: args.urlPrefix, changeId: args.dataSource.changeId, enableCDN: args.enableCDN, numExports: args.numExports });\n while (url) {\n let result;\n try {\n const response = await fetch(url, { headers });\n result = await response.json() as ServiceJsonResponses;\n } catch (err) {\n Logger.logException(loggerCategory, err);\n Logger.logError(loggerCategory, `Failed loading Graphics Data for Source ${args.dataSource.id}`);\n break;\n }\n\n const foundSources = result.exports.filter((x) => x.request.exportType === args.dataSource.type && (args.includeIncomplete || x.status === \"Complete\"));\n for (const foundSource of foundSources) {\n const graphicRepresentation: GraphicRepresentation = {\n displayName: foundSource.displayName,\n representationId: foundSource.id,\n status: foundSource.status,\n format: args.format,\n url: foundSource._links?.mesh.href,\n dataSource: {\n iTwinId: args.dataSource.iTwinId,\n id: foundSource.request.iModelId,\n changeId: foundSource.request.changesetId,\n type: foundSource.request.exportType,\n },\n };\n\n yield graphicRepresentation;\n }\n\n url = result._links.next?.href;\n }\n}\n\n/** Arguments supplied to [[obtainGraphicRepresentationUrl]].\n * @beta\n */\nexport interface ObtainGraphicRepresentationUrlArgs {\n /** The token used to access the mesh export service. */\n accessToken: AccessToken;\n /** The unique identifier for the session in which this data source was queried.\n * A possible value is IModelApp.sessionId.\n */\n sessionId: string;\n /** The data source for which to query the graphic representations */\n dataSource: DataSource;\n /** The expected format of the graphic representations\n * @see [[GraphicRepresentationFormat]] for possible values.\n */\n format: GraphicRepresentationFormat;\n /** Chiefly used in testing environments. */\n urlPrefix?: string;\n /** If true, only data produced for a specific data source version will be considered;\n * otherwise, if no data sources are found with the specified version,the most recent data source version will be used.\n */\n requireExactVersion?: boolean;\n /** If true, enables a CDN (content delivery network) to access tiles faster. */\n enableCDN?: boolean;\n}\n\n/** Obtains a URL pointing to a Graphic Representation.\n * [[queryGraphicRepresentations]] is used to obtain a list of available representations. By default, the list is sorted from most to least recently-created.\n * The first representation matching the source version is selected; or, if no such representation exists, the first representation 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 obtainGraphicRepresentationUrl(args: ObtainGraphicRepresentationUrlArgs): Promise<URL | undefined> {\n if (!args.dataSource.id) {\n Logger.logInfo(loggerCategory, \"Cannot obtain Graphics Data from a source without an Id\");\n return undefined;\n }\n\n const queryArgs: QueryGraphicRepresentationsArgs = {\n accessToken: args.accessToken,\n sessionId: args.sessionId,\n dataSource: args.dataSource,\n format: args.format,\n urlPrefix: args.urlPrefix,\n enableCDN: args.enableCDN,\n };\n\n let selectedData;\n for await (const data of queryGraphicRepresentations(queryArgs)) {\n selectedData = data;\n break;\n }\n\n if (!selectedData && !args.requireExactVersion) {\n queryArgs.dataSource.changeId = undefined;\n for await (const data of queryGraphicRepresentations(queryArgs)) {\n selectedData = data;\n Logger.logInfo(loggerCategory, `No data for Data Source ${args.dataSource.id} for version ${args.dataSource.changeId}; falling back to most recent`);\n break;\n }\n }\n\n if ((!selectedData) || (!selectedData.url)) {\n Logger.logInfo(loggerCategory, `No data available for Data Source ${args.dataSource.id}`);\n return undefined;\n }\n\n const url = new URL(selectedData.url);\n url.pathname = `${url.pathname}/tileset.json`;\n return url;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"GraphicRepresentationProvider.js","sourceRoot":"","sources":["../../../src/GraphicsProvider/GraphicRepresentationProvider.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n * See LICENSE.md in the project root for license terms and full copyright notice.\r\n *--------------------------------------------------------------------------------------------*/\r\n\r\nimport { AccessToken, Logger } from \"@itwin/core-bentley\";\r\nimport { IModelApp, ITWINJS_CORE_VERSION } from \"@itwin/core-frontend\";\r\nimport { loggerCategory } from \"../LoggerCategory.js\";\r\n\r\n/** The expected format of the Graphic Representation\r\n * @beta\r\n */\r\n// eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents\r\nexport type GraphicRepresentationFormat = \"3DFT\" | \"3DTiles\" | \"CESIUM\" | \"IMODEL\" | string;\r\n\r\n/** Graphic representations are generated from Data Sources.\r\n * The status of a Graphic Representation indicates the progress of that generation process.\r\n * @beta\r\n */\r\nexport type GraphicRepresentationStatus = \"Complete\" | \"InProgress\" | \"Invalid\" | \"NotStarted\";\r\n\r\n/**\r\n * Represents a data source for a graphic representation.\r\n * A data source is usually higher-fidelity and contains more information, but may not be as well suited for visualization\r\n * as a graphic representation.\r\n * @beta\r\n */\r\nexport interface DataSource {\r\n /** The iTwinId associated with the DataSource */\r\n iTwinId: string;\r\n /** The unique identifier of a DataSource.\r\n * For example, a DataSource of type \"IMODEL\" has an iModelId which would be attributed to this value.\r\n */\r\n id: string;\r\n /** The unique identifier for a specific version of a DataSource.\r\n * For example, if a specific version of an iModel is desired, the iModel's changesetId would be attributed to this value.\r\n */\r\n changeId?: string;\r\n /** The type of the data source. For example, a DataSource can be of type \"IMODEL\" or \"RealityData\" */\r\n type: string;\r\n}\r\n\r\n/** Represents a visual representation of a data source, for example a 3d tileset.\r\n * A data source can be an iModel, reality data, or other kind of graphical data.\r\n * @see [[queryGraphicRepresentations]] for its construction as a representation of the data produced by a query of data sources.\r\n * @beta\r\n */\r\nexport interface GraphicRepresentation {\r\n /** The display name of the Graphic Representation */\r\n displayName: string;\r\n /** The unique identifier for the Graphic Representation */\r\n representationId: string;\r\n /** The status of the generation of the Graphic Representation from its Data Source.\r\n * @see [[GraphicRepresentationStatus]] for possible values.\r\n */\r\n status: GraphicRepresentationStatus;\r\n /** The expected format of the Graphic Representation\r\n * @see [[GraphicRepresentationFormat]] for possible values.\r\n */\r\n format: GraphicRepresentationFormat;\r\n /** The data source that the representation originates from.\r\n * For example, a GraphicRepresentation in the 3D Tiles format might have a dataSource that is a specific iModel changeset.\r\n */\r\n dataSource: DataSource;\r\n /** The url of the graphic representation\r\n * @note The url can only be guaranteed to be valid if the status is complete.\r\n */\r\n url: string | undefined;\r\n}\r\n\r\n/** Creates a URL used to query for Graphic Representations\r\n * @internal\r\n */\r\nexport function createGraphicRepresentationsQueryUrl(args: { sourceId: string, sourceType: string, urlPrefix?: string, changeId?: string, enableCDN?: boolean, numExports?: number }): string {\r\n const prefix = args.urlPrefix ?? \"\";\r\n const numExports = args.numExports ?? 5;\r\n let url = `https://${prefix}api.bentley.com/mesh-export/?iModelId=${args.sourceId}&$orderBy=date:desc&$top=${numExports}`;\r\n\r\n if (args.changeId)\r\n url = `${url}&changesetId=${args.changeId}`;\r\n\r\n if (args.enableCDN)\r\n url = `${url}&cdn=1`;\r\n\r\n const tileVersion = IModelApp.tileAdmin.maximumMajorTileFormatVersion.toString();\r\n url = `${url}&tileVersion=${tileVersion}&iTwinJS=${ITWINJS_CORE_VERSION}&exportType=${args.sourceType}`;\r\n\r\n return url;\r\n}\r\n\r\n/** Represents an export object from a response from the Mesh Export Service.\r\n * @internal\r\n */\r\ninterface ServiceJsonResponse {\r\n id: string;\r\n displayName: string;\r\n status: GraphicRepresentationStatus;\r\n request: {\r\n iModelId: string;\r\n changesetId: string;\r\n exportType: string;\r\n };\r\n\r\n /* eslint-disable-next-line @typescript-eslint/naming-convention */\r\n _links?: {\r\n mesh: {\r\n href: string;\r\n };\r\n };\r\n}\r\n\r\n/** Represents a response from the Mesh Export Service.\r\n * @internal\r\n */\r\ninterface ServiceJsonResponses {\r\n exports: ServiceJsonResponse[];\r\n\r\n /* eslint-disable-next-line @typescript-eslint/naming-convention */\r\n _links: {\r\n next?: {\r\n href: string;\r\n };\r\n };\r\n}\r\n\r\n/** Arguments supplied to [[queryGraphicRepresentations]].\r\n * @beta\r\n */\r\nexport interface QueryGraphicRepresentationsArgs {\r\n /** The token used to access the data source provider. */\r\n accessToken: AccessToken;\r\n /** The unique identifier for the session in which this data source was queried.\r\n * A possible value is IModelApp.sessionId.\r\n */\r\n sessionId: string;\r\n /** The Data Source for which to query the graphic representations */\r\n dataSource: DataSource;\r\n /** The expected format of the graphic representations\r\n * @see [[GraphicRepresentationFormat]] for possible values.\r\n */\r\n format: GraphicRepresentationFormat;\r\n /** Chiefly used in testing environments. */\r\n urlPrefix?: string;\r\n /** If true, exports whose status is not \"Complete\" (indicating the export successfully finished) will be included in the results */\r\n includeIncomplete?: boolean;\r\n /** If true, enables a CDN (content delivery network) to access tiles faster. */\r\n enableCDN?: boolean;\r\n /** Number of exports to query */\r\n numExports?: number;\r\n}\r\n\r\n/** Query Graphic Representations matching the specified criteria, sorted from most-recently- to least-recently-produced.\r\n * @beta\r\n */\r\nexport async function* queryGraphicRepresentations(args: QueryGraphicRepresentationsArgs): AsyncIterableIterator<GraphicRepresentation> {\r\n const headers = {\r\n /* eslint-disable-next-line @typescript-eslint/naming-convention */\r\n Authorization: args.accessToken,\r\n /* eslint-disable-next-line @typescript-eslint/naming-convention */\r\n Accept: \"application/vnd.bentley.itwin-platform.v1+json\",\r\n /* eslint-disable-next-line @typescript-eslint/naming-convention */\r\n Prefer: \"return=representation\",\r\n /* eslint-disable-next-line @typescript-eslint/naming-convention */\r\n SessionId: args.sessionId,\r\n };\r\n\r\n let url: string | undefined = createGraphicRepresentationsQueryUrl({ sourceId: args.dataSource.id, sourceType: args.dataSource.type, urlPrefix: args.urlPrefix, changeId: args.dataSource.changeId, enableCDN: args.enableCDN, numExports: args.numExports });\r\n while (url) {\r\n let result;\r\n try {\r\n const response = await fetch(url, { headers });\r\n result = await response.json() as ServiceJsonResponses;\r\n } catch (err) {\r\n Logger.logException(loggerCategory, err);\r\n Logger.logError(loggerCategory, `Failed loading Graphics Data for Source ${args.dataSource.id}`);\r\n break;\r\n }\r\n\r\n const foundSources = result.exports.filter((x) => x.request.exportType === args.dataSource.type && (args.includeIncomplete || x.status === \"Complete\"));\r\n for (const foundSource of foundSources) {\r\n const graphicRepresentation: GraphicRepresentation = {\r\n displayName: foundSource.displayName,\r\n representationId: foundSource.id,\r\n status: foundSource.status,\r\n format: args.format,\r\n url: foundSource._links?.mesh.href,\r\n dataSource: {\r\n iTwinId: args.dataSource.iTwinId,\r\n id: foundSource.request.iModelId,\r\n changeId: foundSource.request.changesetId,\r\n type: foundSource.request.exportType,\r\n },\r\n };\r\n\r\n yield graphicRepresentation;\r\n }\r\n\r\n url = result._links.next?.href;\r\n }\r\n}\r\n\r\n/** Arguments supplied to [[obtainGraphicRepresentationUrl]].\r\n * @beta\r\n */\r\nexport interface ObtainGraphicRepresentationUrlArgs {\r\n /** The token used to access the mesh export service. */\r\n accessToken: AccessToken;\r\n /** The unique identifier for the session in which this data source was queried.\r\n * A possible value is IModelApp.sessionId.\r\n */\r\n sessionId: string;\r\n /** The data source for which to query the graphic representations */\r\n dataSource: DataSource;\r\n /** The expected format of the graphic representations\r\n * @see [[GraphicRepresentationFormat]] for possible values.\r\n */\r\n format: GraphicRepresentationFormat;\r\n /** Chiefly used in testing environments. */\r\n urlPrefix?: string;\r\n /** If true, only data produced for a specific data source version will be considered;\r\n * otherwise, if no data sources are found with the specified version,the most recent data source version will be used.\r\n */\r\n requireExactVersion?: boolean;\r\n /** If true, enables a CDN (content delivery network) to access tiles faster. */\r\n enableCDN?: boolean;\r\n}\r\n\r\n/** Obtains a URL pointing to a Graphic Representation.\r\n * [[queryGraphicRepresentations]] is used to obtain a list of available representations. By default, the list is sorted from most to least recently-created.\r\n * The first representation matching the source version is selected; or, if no such representation exists, the first representation in the list is selected.\r\n * @returns A URL from which the tileset can be loaded, or `undefined` if no appropriate URL could be obtained.\r\n * @beta\r\n */\r\nexport async function obtainGraphicRepresentationUrl(args: ObtainGraphicRepresentationUrlArgs): Promise<URL | undefined> {\r\n if (!args.dataSource.id) {\r\n Logger.logInfo(loggerCategory, \"Cannot obtain Graphics Data from a source without an Id\");\r\n return undefined;\r\n }\r\n\r\n const queryArgs: QueryGraphicRepresentationsArgs = {\r\n accessToken: args.accessToken,\r\n sessionId: args.sessionId,\r\n dataSource: args.dataSource,\r\n format: args.format,\r\n urlPrefix: args.urlPrefix,\r\n enableCDN: args.enableCDN,\r\n };\r\n\r\n let selectedData;\r\n for await (const data of queryGraphicRepresentations(queryArgs)) {\r\n selectedData = data;\r\n break;\r\n }\r\n\r\n if (!selectedData && !args.requireExactVersion) {\r\n queryArgs.dataSource.changeId = undefined;\r\n for await (const data of queryGraphicRepresentations(queryArgs)) {\r\n selectedData = data;\r\n Logger.logInfo(loggerCategory, `No data for Data Source ${args.dataSource.id} for version ${args.dataSource.changeId}; falling back to most recent`);\r\n break;\r\n }\r\n }\r\n\r\n if ((!selectedData) || (!selectedData.url)) {\r\n Logger.logInfo(loggerCategory, `No data available for Data Source ${args.dataSource.id}`);\r\n return undefined;\r\n }\r\n\r\n const url = new URL(selectedData.url);\r\n url.pathname = `${url.pathname}/tileset.json`;\r\n return url;\r\n}\r\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GraphicsProvider.js","sourceRoot":"","sources":["../../../src/GraphicsProvider/GraphicsProvider.ts"],"names":[],"mappings":";AAAA;;;gGAGgG;;AAmChG,wDA4BC;AA7DD,sDAA0D;AAC1D,wDAAiD;AACjD,4DAAsD;AACtD,yFAAwH;AAwBxH;;;;;GAKG;AACI,KAAK,UAAU,sBAAsB,CAAC,IAAgC;IAE3E,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACnB,qBAAM,CAAC,OAAO,CAAC,kCAAc,EAAE,4DAA4D,CAAC,CAAC;QAC7F,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QAClB,qBAAM,CAAC,OAAO,CAAC,kCAAc,EAAE,2DAA2D,CAAC,CAAC;QAC5F,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,YAAY,GAAuC;QACvD,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,SAAS,EAAE,yBAAS,CAAC,SAAS;QAC9B,UAAU,EAAE;YACV,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,EAAE,EAAE,IAAI,CAAC,QAAQ;YACjB,QAAQ,EAAE,IAAI,CAAC,WAAW;YAC1B,IAAI,EAAE,QAAQ;SACf;QACD,MAAM,EAAE,QAAQ;QAChB,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,mBAAmB,EAAE,IAAI,CAAC,qBAAqB;QAC/C,SAAS,EAAE,IAAI,CAAC,SAAS;KAC1B,CAAC;IAEF,OAAO,IAAA,iEAA8B,EAAC,YAAY,CAAC,CAAC;AACtD,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 { AccessToken, Logger } from \"@itwin/core-bentley\";\nimport { IModelApp } from \"@itwin/core-frontend\";\nimport { loggerCategory } from \"../LoggerCategory.js\";\nimport { obtainGraphicRepresentationUrl, ObtainGraphicRepresentationUrlArgs } from \"./GraphicRepresentationProvider.js\";\n\n/** Arguments supplied to [[obtainIModelTilesetUrl]].\n * @beta\n */\nexport interface ObtainIModelTilesetUrlArgs {\n /** The iTwin id for which to obtain a tileset URL. */\n iTwinId?: string;\n /** The iModel id for which to obtain a tileset URL. */\n iModelId?: string;\n /** The changeset id for which to obtain a tileset URL. */\n changesetId?: string;\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 /** If true, enables a CDN (content delivery network) to access tiles faster. */\n enableCDN?: 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 obtainIModelTilesetUrl(args: ObtainIModelTilesetUrlArgs):\n Promise<URL | undefined> {\n if (!args.iModelId) {\n Logger.logInfo(loggerCategory, \"Cannot obtain Graphics Data for an iModel with no iModelId\");\n return undefined;\n }\n\n if (!args.iTwinId) {\n Logger.logInfo(loggerCategory, \"Cannot obtain Graphics Data for an iModel with no iTwinId\");\n return undefined;\n }\n\n const graphicsArgs: ObtainGraphicRepresentationUrlArgs = {\n accessToken: args.accessToken,\n sessionId: IModelApp.sessionId,\n dataSource: {\n iTwinId: args.iTwinId,\n id: args.iModelId,\n changeId: args.changesetId,\n type: \"IMODEL\",\n },\n format: \"IMODEL\",\n urlPrefix: args.urlPrefix,\n requireExactVersion: args.requireExactChangeset,\n enableCDN: args.enableCDN,\n };\n\n return obtainGraphicRepresentationUrl(graphicsArgs);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"GraphicsProvider.js","sourceRoot":"","sources":["../../../src/GraphicsProvider/GraphicsProvider.ts"],"names":[],"mappings":";AAAA;;;gGAGgG;;AAmChG,wDA4BC;AA7DD,sDAA0D;AAC1D,wDAAiD;AACjD,4DAAsD;AACtD,yFAAwH;AAwBxH;;;;;GAKG;AACI,KAAK,UAAU,sBAAsB,CAAC,IAAgC;IAE3E,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC;QACnB,qBAAM,CAAC,OAAO,CAAC,kCAAc,EAAE,4DAA4D,CAAC,CAAC;QAC7F,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QAClB,qBAAM,CAAC,OAAO,CAAC,kCAAc,EAAE,2DAA2D,CAAC,CAAC;QAC5F,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,YAAY,GAAuC;QACvD,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,SAAS,EAAE,yBAAS,CAAC,SAAS;QAC9B,UAAU,EAAE;YACV,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,EAAE,EAAE,IAAI,CAAC,QAAQ;YACjB,QAAQ,EAAE,IAAI,CAAC,WAAW;YAC1B,IAAI,EAAE,QAAQ;SACf;QACD,MAAM,EAAE,QAAQ;QAChB,SAAS,EAAE,IAAI,CAAC,SAAS;QACzB,mBAAmB,EAAE,IAAI,CAAC,qBAAqB;QAC/C,SAAS,EAAE,IAAI,CAAC,SAAS;KAC1B,CAAC;IAEF,OAAO,IAAA,iEAA8B,EAAC,YAAY,CAAC,CAAC;AACtD,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 { AccessToken, Logger } from \"@itwin/core-bentley\";\r\nimport { IModelApp } from \"@itwin/core-frontend\";\r\nimport { loggerCategory } from \"../LoggerCategory.js\";\r\nimport { obtainGraphicRepresentationUrl, ObtainGraphicRepresentationUrlArgs } from \"./GraphicRepresentationProvider.js\";\r\n\r\n/** Arguments supplied to [[obtainIModelTilesetUrl]].\r\n * @beta\r\n */\r\nexport interface ObtainIModelTilesetUrlArgs {\r\n /** The iTwin id for which to obtain a tileset URL. */\r\n iTwinId?: string;\r\n /** The iModel id for which to obtain a tileset URL. */\r\n iModelId?: string;\r\n /** The changeset id for which to obtain a tileset URL. */\r\n changesetId?: string;\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 /** If true, enables a CDN (content delivery network) to access tiles faster. */\r\n enableCDN?: boolean;\r\n}\r\n\r\n/** Obtains a URL pointing to a 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 obtainIModelTilesetUrl(args: ObtainIModelTilesetUrlArgs):\r\n Promise<URL | undefined> {\r\n if (!args.iModelId) {\r\n Logger.logInfo(loggerCategory, \"Cannot obtain Graphics Data for an iModel with no iModelId\");\r\n return undefined;\r\n }\r\n\r\n if (!args.iTwinId) {\r\n Logger.logInfo(loggerCategory, \"Cannot obtain Graphics Data for an iModel with no iTwinId\");\r\n return undefined;\r\n }\r\n\r\n const graphicsArgs: ObtainGraphicRepresentationUrlArgs = {\r\n accessToken: args.accessToken,\r\n sessionId: IModelApp.sessionId,\r\n dataSource: {\r\n iTwinId: args.iTwinId,\r\n id: args.iModelId,\r\n changeId: args.changesetId,\r\n type: \"IMODEL\",\r\n },\r\n format: \"IMODEL\",\r\n urlPrefix: args.urlPrefix,\r\n requireExactVersion: args.requireExactChangeset,\r\n enableCDN: args.enableCDN,\r\n };\r\n\r\n return obtainGraphicRepresentationUrl(graphicsArgs);\r\n}\r\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GeoscienceTileset.js","sourceRoot":"","sources":["../../../../src/GraphicsProvider/tileset-creators/GeoscienceTileset.ts"],"names":[],"mappings":";AAAA;;;gGAGgG;;AAgBhG,0DAmBC;AAjCD,sDAA6C;AAC7C,wDAAiD;AACjD,+DAAyD;AACzD,wFAAwG;AAQxG;;GAEG;AACI,KAAK,UAAU,uBAAuB,CAAC,IAAiC;IAC7E,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,IAAA,kDAAuB,EAAC,IAAI,CAAC,CAAC;QAChD,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,qBAAM,CAAC,OAAO,CAAC,kCAAc,EAAE,2CAA2C,IAAI,CAAC,kBAAkB,EAAE,CAAC,CAAC;YACrG,OAAO;QACT,CAAC;aAAM,CAAC;YACN,MAAM,EAAE,GAAG,yBAAS,CAAC,WAAW,CAAC,YAAY,CAAC;YAC9C,IAAI,CAAC,EAAE,EAAE,CAAC;gBACR,qBAAM,CAAC,OAAO,CAAC,kCAAc,EAAE,0CAA0C,CAAC,CAAC;gBAC3E,OAAO;YACT,CAAC;YAED,EAAE,CAAC,YAAY,CAAC,kBAAkB,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;YACxD,OAAO;QACT,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,KAAK,CAAC;IACd,CAAC;AACH,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 { Logger } from \"@itwin/core-bentley\";\nimport { IModelApp } from \"@itwin/core-frontend\";\nimport { loggerCategory } from \"../../LoggerCategory.js\";\nimport { BaseGeoscienceArgs, getGeoscienceTilesetUrl } from \"../url-providers/GeoscienceUrlProvider.js\";\n\n/**\n * Represents the arguments required to initialize geoscience tileset.\n * @alpha\n */\nexport type AttachGeoscienceTilesetArgs = BaseGeoscienceArgs;\n\n/** Initialize the geoscience tileset by attaching it as a Reality Model.\n * @alpha\n */\nexport async function attachGeoscienceTileset(args: AttachGeoscienceTilesetArgs): Promise<void> {\n try {\n const url = await getGeoscienceTilesetUrl(args);\n if (!url) {\n Logger.logInfo(loggerCategory, `No data available for Geoscience Object ${args.geoscienceObjectId}`);\n return;\n } else {\n const vp = IModelApp.viewManager.selectedView;\n if (!vp) {\n Logger.logInfo(loggerCategory, \"Reality Model not successfully attached.\");\n return;\n }\n\n vp.displayStyle.attachRealityModel({ tilesetUrl: url });\n return;\n }\n } catch (error) {\n throw error;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"GeoscienceTileset.js","sourceRoot":"","sources":["../../../../src/GraphicsProvider/tileset-creators/GeoscienceTileset.ts"],"names":[],"mappings":";AAAA;;;gGAGgG;;AAgBhG,0DAmBC;AAjCD,sDAA6C;AAC7C,wDAAiD;AACjD,+DAAyD;AACzD,wFAAwG;AAQxG;;GAEG;AACI,KAAK,UAAU,uBAAuB,CAAC,IAAiC;IAC7E,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,IAAA,kDAAuB,EAAC,IAAI,CAAC,CAAC;QAChD,IAAI,CAAC,GAAG,EAAE,CAAC;YACT,qBAAM,CAAC,OAAO,CAAC,kCAAc,EAAE,2CAA2C,IAAI,CAAC,kBAAkB,EAAE,CAAC,CAAC;YACrG,OAAO;QACT,CAAC;aAAM,CAAC;YACN,MAAM,EAAE,GAAG,yBAAS,CAAC,WAAW,CAAC,YAAY,CAAC;YAC9C,IAAI,CAAC,EAAE,EAAE,CAAC;gBACR,qBAAM,CAAC,OAAO,CAAC,kCAAc,EAAE,0CAA0C,CAAC,CAAC;gBAC3E,OAAO;YACT,CAAC;YAED,EAAE,CAAC,YAAY,CAAC,kBAAkB,CAAC,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,CAAC;YACxD,OAAO;QACT,CAAC;IACH,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,KAAK,CAAC;IACd,CAAC;AACH,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 { Logger } from \"@itwin/core-bentley\";\r\nimport { IModelApp } from \"@itwin/core-frontend\";\r\nimport { loggerCategory } from \"../../LoggerCategory.js\";\r\nimport { BaseGeoscienceArgs, getGeoscienceTilesetUrl } from \"../url-providers/GeoscienceUrlProvider.js\";\r\n\r\n/**\r\n * Represents the arguments required to initialize geoscience tileset.\r\n * @alpha\r\n */\r\nexport type AttachGeoscienceTilesetArgs = BaseGeoscienceArgs;\r\n\r\n/** Initialize the geoscience tileset by attaching it as a Reality Model.\r\n * @alpha\r\n */\r\nexport async function attachGeoscienceTileset(args: AttachGeoscienceTilesetArgs): Promise<void> {\r\n try {\r\n const url = await getGeoscienceTilesetUrl(args);\r\n if (!url) {\r\n Logger.logInfo(loggerCategory, `No data available for Geoscience Object ${args.geoscienceObjectId}`);\r\n return;\r\n } else {\r\n const vp = IModelApp.viewManager.selectedView;\r\n if (!vp) {\r\n Logger.logInfo(loggerCategory, \"Reality Model not successfully attached.\");\r\n return;\r\n }\r\n\r\n vp.displayStyle.attachRealityModel({ tilesetUrl: url });\r\n return;\r\n }\r\n } catch (error) {\r\n throw error;\r\n }\r\n}\r\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GeoscienceUrlProvider.js","sourceRoot":"","sources":["../../../../src/GraphicsProvider/url-providers/GeoscienceUrlProvider.ts"],"names":[],"mappings":";AAAA;;;gGAGgG;;AAwDhG,0DAwBC;AA9ED,sDAA6C;AAC7C,+DAAyD;AAiDzD;;;GAGG;AACI,KAAK,UAAU,uBAAuB,CAAC,IAA8B;IAC1E,MAAM,OAAO,GAAG;QACd,mEAAmE;QACnE,aAAa,EAAE,IAAI,CAAC,WAAW;KAChC,CAAC;IAEF,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC;IACjC,MAAM,GAAG,GAAG,GAAG,OAAO,uBAAuB,IAAI,CAAC,cAAc,eAAe,IAAI,CAAC,WAAW,sBAAsB,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC/I,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;IAE/C,IAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QAChB,qBAAM,CAAC,QAAQ,CAAC,kCAAc,EAAE,kCAAkC,OAAO,aAAa,QAAQ,CAAC,MAAM,WAAW,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;QACvI,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAErC,MAAM,MAAM,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC;IACrG,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,qBAAM,CAAC,QAAQ,CAAC,kCAAc,EAAE,2CAA2C,IAAI,CAAC,kBAAkB,EAAE,CAAC,CAAC;QACtG,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,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 { Logger } from \"@itwin/core-bentley\";\nimport { loggerCategory } from \"../../LoggerCategory.js\";\n\n/**\n * Represents the arguments required for geoscience operations.\n * @alpha\n */\nexport interface BaseGeoscienceArgs {\n /**\n * The endpoint URL for the geoscience service.\n */\n endpointUrl: string;\n\n /**\n * The access token for authentication.\n */\n accessToken: string;\n\n /**\n * The organization ID.\n */\n organizationId: string;\n\n /**\n * The workspace ID.\n */\n workspaceId: string;\n\n /**\n * The geoscience object ID.\n */\n geoscienceObjectId: string;\n}\n\n/**\n * Represents the arguments for obtaining a geoscience tileset.\n * @alpha\n */\nexport interface GetGeoscienceTilesetArgs extends BaseGeoscienceArgs {\n /**\n * The URL prefix for the tileset.\n */\n urlPrefix?: string;\n\n /**\n * Specifies whether to enable the Content Delivery Network (CDN) for the tileset.\n */\n enableCDN?: boolean;\n}\n\n/**\n * Obtains the URL for a geoscience tileset.\n * @alpha\n */\nexport async function getGeoscienceTilesetUrl(args: GetGeoscienceTilesetArgs): Promise<string | undefined> {\n const headers = {\n /* eslint-disable-next-line @typescript-eslint/naming-convention */\n Authorization: args.accessToken,\n };\n\n const baseUrl = args.endpointUrl;\n const url = `${baseUrl}/visualization/orgs/${args.organizationId}/workspaces/${args.workspaceId}/geoscience-object/${args.geoscienceObjectId}`;\n const response = await fetch(url, { headers });\n\n if(!response.ok) {\n Logger.logError(loggerCategory, `Received invalid response from ${baseUrl}, status: ${response.status}, text: ${response.statusText}`);\n return undefined;\n }\n\n const result = await response.json();\n\n const objUrl = URL.createObjectURL(new Blob([JSON.stringify(result)], { type: \"application/json\" }));\n if ((!result) || (!objUrl)) {\n Logger.logError(loggerCategory, `No data available for Geoscience Object ${args.geoscienceObjectId}`);\n return undefined;\n }\n\n return objUrl;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"GeoscienceUrlProvider.js","sourceRoot":"","sources":["../../../../src/GraphicsProvider/url-providers/GeoscienceUrlProvider.ts"],"names":[],"mappings":";AAAA;;;gGAGgG;;AAwDhG,0DAwBC;AA9ED,sDAA6C;AAC7C,+DAAyD;AAiDzD;;;GAGG;AACI,KAAK,UAAU,uBAAuB,CAAC,IAA8B;IAC1E,MAAM,OAAO,GAAG;QACd,mEAAmE;QACnE,aAAa,EAAE,IAAI,CAAC,WAAW;KAChC,CAAC;IAEF,MAAM,OAAO,GAAG,IAAI,CAAC,WAAW,CAAC;IACjC,MAAM,GAAG,GAAG,GAAG,OAAO,uBAAuB,IAAI,CAAC,cAAc,eAAe,IAAI,CAAC,WAAW,sBAAsB,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAC/I,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,CAAC,CAAC;IAE/C,IAAG,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QAChB,qBAAM,CAAC,QAAQ,CAAC,kCAAc,EAAE,kCAAkC,OAAO,aAAa,QAAQ,CAAC,MAAM,WAAW,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;QACvI,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAErC,MAAM,MAAM,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAC;IACrG,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC;QAC3B,qBAAM,CAAC,QAAQ,CAAC,kCAAc,EAAE,2CAA2C,IAAI,CAAC,kBAAkB,EAAE,CAAC,CAAC;QACtG,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,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 { Logger } from \"@itwin/core-bentley\";\r\nimport { loggerCategory } from \"../../LoggerCategory.js\";\r\n\r\n/**\r\n * Represents the arguments required for geoscience operations.\r\n * @alpha\r\n */\r\nexport interface BaseGeoscienceArgs {\r\n /**\r\n * The endpoint URL for the geoscience service.\r\n */\r\n endpointUrl: string;\r\n\r\n /**\r\n * The access token for authentication.\r\n */\r\n accessToken: string;\r\n\r\n /**\r\n * The organization ID.\r\n */\r\n organizationId: string;\r\n\r\n /**\r\n * The workspace ID.\r\n */\r\n workspaceId: string;\r\n\r\n /**\r\n * The geoscience object ID.\r\n */\r\n geoscienceObjectId: string;\r\n}\r\n\r\n/**\r\n * Represents the arguments for obtaining a geoscience tileset.\r\n * @alpha\r\n */\r\nexport interface GetGeoscienceTilesetArgs extends BaseGeoscienceArgs {\r\n /**\r\n * The URL prefix for the tileset.\r\n */\r\n urlPrefix?: string;\r\n\r\n /**\r\n * Specifies whether to enable the Content Delivery Network (CDN) for the tileset.\r\n */\r\n enableCDN?: boolean;\r\n}\r\n\r\n/**\r\n * Obtains the URL for a geoscience tileset.\r\n * @alpha\r\n */\r\nexport async function getGeoscienceTilesetUrl(args: GetGeoscienceTilesetArgs): Promise<string | undefined> {\r\n const headers = {\r\n /* eslint-disable-next-line @typescript-eslint/naming-convention */\r\n Authorization: args.accessToken,\r\n };\r\n\r\n const baseUrl = args.endpointUrl;\r\n const url = `${baseUrl}/visualization/orgs/${args.organizationId}/workspaces/${args.workspaceId}/geoscience-object/${args.geoscienceObjectId}`;\r\n const response = await fetch(url, { headers });\r\n\r\n if(!response.ok) {\r\n Logger.logError(loggerCategory, `Received invalid response from ${baseUrl}, status: ${response.status}, text: ${response.statusText}`);\r\n return undefined;\r\n }\r\n\r\n const result = await response.json();\r\n\r\n const objUrl = URL.createObjectURL(new Blob([JSON.stringify(result)], { type: \"application/json\" }));\r\n if ((!result) || (!objUrl)) {\r\n Logger.logError(loggerCategory, `No data available for Geoscience Object ${args.geoscienceObjectId}`);\r\n return undefined;\r\n }\r\n\r\n return objUrl;\r\n}\r\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"IndexedDBCache.js","sourceRoot":"","sources":["../../src/IndexedDBCache.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*--------------------------------------------------------------------------------------------*/\nimport { Logger } from \"@itwin/core-bentley\";\n\nconst loggerCategory = \"IndexedDBCache\";\n\n/** @internal */\nexport interface LocalCache {\n fetch(url: string, callback: (uniqueId: string) => Promise<Response>, callBackUrl?: string): Promise<ArrayBuffer>;\n}\n\n/** @internal */\nexport class PassThroughCache implements LocalCache {\n public async fetch(uniqueId: string, callback: (url: string) => Promise<Response>, callBackUrl?: string): Promise<ArrayBuffer> {\n if (callBackUrl) {\n return (await callback(callBackUrl)).arrayBuffer();\n }\n return (await callback(uniqueId)).arrayBuffer();\n }\n}\n\n/** @internal */\nexport class IndexedDBCache implements LocalCache{\n private _db: any;\n private _dbName: string;\n private _expirationTime?: number;\n\n public constructor(dbName: string, expirationTime?: number) {\n this._dbName = dbName;\n this._expirationTime = expirationTime ?? undefined;\n }\n\n protected async open(){\n\n // need to return a promise so that we can wait for the db to open before using it\n return new Promise(function (this: IndexedDBCache, resolve: any) {\n\n // open the db\n const openDB = window.indexedDB.open(this._dbName, 1);\n\n openDB.onerror = () => {\n Logger.logError(loggerCategory, \"Error opening IndexedDB\");\n };\n\n // this is the success callback for opening the db, it is called after onupgradeneeded\n openDB.onsuccess = async (event) => {\n\n const target: any = event.target;\n if (target) {\n this._db = target.result;\n return resolve(target.result);\n }\n };\n\n // This will get called when a new version is needed - including going from no database to first version\n // So this is how we set up the specifics of the db structure\n openDB.onupgradeneeded = async (event) => {\n const target: any = event.target;\n\n if (target)\n this._db = target.result;\n\n const initialObjectStore = this._db.createObjectStore(\"cache\", { keyPath: \"uniqueId\" });\n initialObjectStore.createIndex(\"content\", \"content\", {unique: false});\n initialObjectStore.createIndex(\"timeOfStorage\", \"timeOfStorage\", {unique: false});\n };\n }.bind(this));\n }\n\n protected async close() {\n await this._db.close();\n }\n\n protected async retrieveContent(uniqueId: string): Promise<ArrayBuffer | undefined> {\n return new Promise(async (resolve) => {\n await this.open();\n const getTransaction = await this._db.transaction(\"cache\", \"readonly\");\n const storedResponse = await getTransaction.objectStore(\"cache\").get(uniqueId);\n\n // this is successful if the db was successfully searched - not only if a match was found\n storedResponse.onsuccess = async () => {\n\n if (storedResponse.result !== undefined) {\n\n // if the content has an expiration time\n if (this._expirationTime) {\n // We want to know when the result was stored, and how long it's been since that point\n const timeSince = Date.now() - storedResponse.result.timeOfStorage;\n\n // If it's been greater than our time limit, delete it and return undefined.\n if (timeSince > this._expirationTime) {\n await this.deleteContent(uniqueId);\n return resolve(undefined);\n }\n }\n const content = storedResponse.result.content;\n await this.close();\n return resolve(content);\n }\n\n await this.close();\n return resolve(undefined);\n };\n\n storedResponse.onerror = async () => {\n Logger.logError(loggerCategory, \"Error retrieving content from IndexedDB\");\n };\n });\n }\n\n protected async deleteContent(uniqueId: string) {\n return new Promise(async (resolve) => {\n await this.open();\n const deleteTransaction = await this._db.transaction(\"cache\", \"readwrite\");\n const requestDelete = await deleteTransaction.objectStore(\"cache\").delete(uniqueId);\n\n requestDelete.onerror = () => {\n Logger.logError(loggerCategory, \"Error deleting content from IndexedDB\");\n };\n\n deleteTransaction.oncomplete = async () => {\n await this.close();\n return resolve(undefined);\n };\n\n deleteTransaction.onerror = async () => {\n Logger.logError(loggerCategory, \"Error deleting content from IndexedDB\");\n };\n });\n }\n\n protected async addContent(uniqueId: string, content: ArrayBuffer) {\n return new Promise(async (resolve) => {\n await this.open();\n const addTransaction = await this._db.transaction(\"cache\", \"readwrite\");\n const objectStore = await addTransaction.objectStore(\"cache\");\n\n const data = {\n uniqueId,\n content,\n timeOfStorage: Date.now(),\n };\n\n const requestAdd = await objectStore.add(data);\n\n requestAdd.onerror = () => {\n Logger.logError(loggerCategory, \"Error adding content to IndexedDB\");\n };\n\n addTransaction.oncomplete = async () => {\n await this.close();\n return resolve(undefined);\n };\n\n addTransaction.onerror = async () => {\n Logger.logError(loggerCategory, \"Error adding content to IndexedDB in add transaction\");\n await this.close();\n return resolve(undefined);\n };\n });\n }\n\n public async fetch(uniqueId: string, callback: (url: string) => Promise<Response>, callBackUrl?: string): Promise<ArrayBuffer> {\n let response = await this.retrieveContent(uniqueId);\n\n // If nothing was found in the db, fetch normally, then add that content to the db\n if (response === undefined) {\n\n // If necessary, use the callback url\n if (callBackUrl)\n response = await (await callback(callBackUrl)).arrayBuffer();\n else\n response = await (await callback(uniqueId)).arrayBuffer();\n\n await this.addContent(uniqueId, response);\n }\n\n return response;\n }\n}\n\n"]}
|
|
1
|
+
{"version":3,"file":"IndexedDBCache.js","sourceRoot":"","sources":["../../src/IndexedDBCache.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\nimport { Logger } from \"@itwin/core-bentley\";\r\n\r\nconst loggerCategory = \"IndexedDBCache\";\r\n\r\n/** @internal */\r\nexport interface LocalCache {\r\n fetch(url: string, callback: (uniqueId: string) => Promise<Response>, callBackUrl?: string): Promise<ArrayBuffer>;\r\n}\r\n\r\n/** @internal */\r\nexport class PassThroughCache implements LocalCache {\r\n public async fetch(uniqueId: string, callback: (url: string) => Promise<Response>, callBackUrl?: string): Promise<ArrayBuffer> {\r\n if (callBackUrl) {\r\n return (await callback(callBackUrl)).arrayBuffer();\r\n }\r\n return (await callback(uniqueId)).arrayBuffer();\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport class IndexedDBCache implements LocalCache{\r\n private _db: any;\r\n private _dbName: string;\r\n private _expirationTime?: number;\r\n\r\n public constructor(dbName: string, expirationTime?: number) {\r\n this._dbName = dbName;\r\n this._expirationTime = expirationTime ?? undefined;\r\n }\r\n\r\n protected async open(){\r\n\r\n // need to return a promise so that we can wait for the db to open before using it\r\n return new Promise(function (this: IndexedDBCache, resolve: any) {\r\n\r\n // open the db\r\n const openDB = window.indexedDB.open(this._dbName, 1);\r\n\r\n openDB.onerror = () => {\r\n Logger.logError(loggerCategory, \"Error opening IndexedDB\");\r\n };\r\n\r\n // this is the success callback for opening the db, it is called after onupgradeneeded\r\n openDB.onsuccess = async (event) => {\r\n\r\n const target: any = event.target;\r\n if (target) {\r\n this._db = target.result;\r\n return resolve(target.result);\r\n }\r\n };\r\n\r\n // This will get called when a new version is needed - including going from no database to first version\r\n // So this is how we set up the specifics of the db structure\r\n openDB.onupgradeneeded = async (event) => {\r\n const target: any = event.target;\r\n\r\n if (target)\r\n this._db = target.result;\r\n\r\n const initialObjectStore = this._db.createObjectStore(\"cache\", { keyPath: \"uniqueId\" });\r\n initialObjectStore.createIndex(\"content\", \"content\", {unique: false});\r\n initialObjectStore.createIndex(\"timeOfStorage\", \"timeOfStorage\", {unique: false});\r\n };\r\n }.bind(this));\r\n }\r\n\r\n protected async close() {\r\n await this._db.close();\r\n }\r\n\r\n protected async retrieveContent(uniqueId: string): Promise<ArrayBuffer | undefined> {\r\n return new Promise(async (resolve) => {\r\n await this.open();\r\n const getTransaction = await this._db.transaction(\"cache\", \"readonly\");\r\n const storedResponse = await getTransaction.objectStore(\"cache\").get(uniqueId);\r\n\r\n // this is successful if the db was successfully searched - not only if a match was found\r\n storedResponse.onsuccess = async () => {\r\n\r\n if (storedResponse.result !== undefined) {\r\n\r\n // if the content has an expiration time\r\n if (this._expirationTime) {\r\n // We want to know when the result was stored, and how long it's been since that point\r\n const timeSince = Date.now() - storedResponse.result.timeOfStorage;\r\n\r\n // If it's been greater than our time limit, delete it and return undefined.\r\n if (timeSince > this._expirationTime) {\r\n await this.deleteContent(uniqueId);\r\n return resolve(undefined);\r\n }\r\n }\r\n const content = storedResponse.result.content;\r\n await this.close();\r\n return resolve(content);\r\n }\r\n\r\n await this.close();\r\n return resolve(undefined);\r\n };\r\n\r\n storedResponse.onerror = async () => {\r\n Logger.logError(loggerCategory, \"Error retrieving content from IndexedDB\");\r\n };\r\n });\r\n }\r\n\r\n protected async deleteContent(uniqueId: string) {\r\n return new Promise(async (resolve) => {\r\n await this.open();\r\n const deleteTransaction = await this._db.transaction(\"cache\", \"readwrite\");\r\n const requestDelete = await deleteTransaction.objectStore(\"cache\").delete(uniqueId);\r\n\r\n requestDelete.onerror = () => {\r\n Logger.logError(loggerCategory, \"Error deleting content from IndexedDB\");\r\n };\r\n\r\n deleteTransaction.oncomplete = async () => {\r\n await this.close();\r\n return resolve(undefined);\r\n };\r\n\r\n deleteTransaction.onerror = async () => {\r\n Logger.logError(loggerCategory, \"Error deleting content from IndexedDB\");\r\n };\r\n });\r\n }\r\n\r\n protected async addContent(uniqueId: string, content: ArrayBuffer) {\r\n return new Promise(async (resolve) => {\r\n await this.open();\r\n const addTransaction = await this._db.transaction(\"cache\", \"readwrite\");\r\n const objectStore = await addTransaction.objectStore(\"cache\");\r\n\r\n const data = {\r\n uniqueId,\r\n content,\r\n timeOfStorage: Date.now(),\r\n };\r\n\r\n const requestAdd = await objectStore.add(data);\r\n\r\n requestAdd.onerror = () => {\r\n Logger.logError(loggerCategory, \"Error adding content to IndexedDB\");\r\n };\r\n\r\n addTransaction.oncomplete = async () => {\r\n await this.close();\r\n return resolve(undefined);\r\n };\r\n\r\n addTransaction.onerror = async () => {\r\n Logger.logError(loggerCategory, \"Error adding content to IndexedDB in add transaction\");\r\n await this.close();\r\n return resolve(undefined);\r\n };\r\n });\r\n }\r\n\r\n public async fetch(uniqueId: string, callback: (url: string) => Promise<Response>, callBackUrl?: string): Promise<ArrayBuffer> {\r\n let response = await this.retrieveContent(uniqueId);\r\n\r\n // If nothing was found in the db, fetch normally, then add that content to the db\r\n if (response === undefined) {\r\n\r\n // If necessary, use the callback url\r\n if (callBackUrl)\r\n response = await (await callback(callBackUrl)).arrayBuffer();\r\n else\r\n response = await (await callback(uniqueId)).arrayBuffer();\r\n\r\n await this.addContent(uniqueId, response);\r\n }\r\n\r\n return response;\r\n }\r\n}\r\n\r\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":["/*---------------------------------------------------------------------------------------------\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
|
+
{"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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ModelGroup.js","sourceRoot":"","sources":["../../src/ModelGroup.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, Id64Set, Id64String } from \"@itwin/core-bentley\";\nimport { PlanProjectionSettings, RenderSchedule, ViewFlagOverrides } from \"@itwin/core-common\";\nimport { ModelDisplayTransform, RenderClipVolume } from \"@itwin/core-frontend\";\nimport { ModelGroupDisplayTransforms } from \"./ModelGroupDisplayTransforms.js\";\n\n/** Plan projection settings relevant to a [[ModelGroupInfo]].\n * @internal\n */\nexport interface PlanProjectionInfo {\n /** Z elevation, from [PlanProjectionSettings.elevation]($common) if specified, else the default elevation of the model (computed from model extents). */\n elevation: number;\n /** Transparency in [0..1] with 0 being fully opaque. */\n transparency: number;\n /** If true, the graphics are drawn as overlays with no depth test. */\n overlay: boolean;\n}\n\n/** Display settings to be applied to a group of models.\n * @internal\n */\nexport interface ModelGroupInfo {\n displayTransform?: ModelDisplayTransform;\n clip?: RenderClipVolume;\n planProjection?: PlanProjectionInfo;\n timeline?: RenderSchedule.ModelTimeline;\n viewFlags: ViewFlagOverrides;\n}\n\n/** Represents a group of models and the display settings to be applied to them.\n * @internal\n */\nexport interface ModelGroup extends ModelGroupInfo {\n /** The set of models belonging to this group. */\n modelIds: Id64Set;\n}\n\n/** Context supplied to [[groupModels]].\n * @internal\n */\nexport interface ModelGroupingContext {\n modelGroupDisplayTransforms: ModelGroupDisplayTransforms;\n getModelClip(modelId: Id64String): RenderClipVolume | undefined;\n getPlanProjectionSettings(modelId: Id64String): PlanProjectionSettings | undefined;\n getModelTimeline(modelId: Id64String): RenderSchedule.ModelTimeline | undefined;\n getDefaultElevation(modelId: Id64String): number;\n getViewFlagOverrides(modelId: Id64String): ViewFlagOverrides | undefined;\n}\n\nfunction createPlanProjectionInfo(modelId: Id64String, context: ModelGroupingContext): PlanProjectionInfo | undefined {\n const settings = context.getPlanProjectionSettings(modelId);\n if (!settings)\n return undefined;\n\n return {\n elevation: settings.elevation ?? context.getDefaultElevation(modelId),\n transparency: settings.transparency ?? 0,\n overlay: settings.overlay,\n };\n}\n\nfunction equalPlanProjections(a: PlanProjectionInfo, b: PlanProjectionInfo): boolean {\n return a.elevation === b.elevation && a.overlay === b.overlay && a.transparency === b.transparency;\n}\n\nfunction createModelGroupInfo(context: ModelGroupingContext, modelId: Id64String): ModelGroupInfo {\n const planProjection = createPlanProjectionInfo(modelId, context);\n const viewFlags = { ...context.getViewFlagOverrides(modelId) };\n if (planProjection) {\n // Always enable improved z-fighting mitigation for plan projections (they're planar models).\n viewFlags.forceSurfaceDiscard = true;\n }\n\n return {\n displayTransform: context.modelGroupDisplayTransforms.getDisplayTransform(modelId),\n clip: context.getModelClip(modelId),\n planProjection,\n viewFlags,\n timeline: context.getModelTimeline(modelId),\n };\n}\n\nfunction equalViewFlags(a: ViewFlagOverrides, b: ViewFlagOverrides): boolean {\n const lhs = Object.keys(a);\n const rhs = Object.keys(b);\n if (lhs.length !== rhs.length) {\n return false;\n }\n\n for (const propName of lhs) {\n const key = propName as keyof ViewFlagOverrides;\n if (a[key] !== b[key])\n return false;\n }\n\n return true;\n}\n\nfunction equalModelGroupInfo(a: ModelGroupInfo, b: ModelGroupInfo): boolean {\n // If a model has a timeline it cannot be grouped\n if (a.timeline !== b.timeline)\n return false;\n\n // Display transforms are obtained from ModelGroupDisplayTransforms - they are guaranteed to be the same object if they are equivalent.\n if (a.displayTransform !== b.displayTransform)\n return false;\n\n if (a.clip || b.clip) {\n // Note: ClipVector lacks an `isAlmostEqual` method.\n // For two models belonging to the same clip group, we should have the same exact object.\n // But we won't currently detect two different objects that represent effectively identical clips.\n if (!a.clip || !b.clip || a.clip.clipVector !== b.clip.clipVector)\n return false;\n }\n\n if (a.planProjection || b.planProjection) {\n if (!a.planProjection || !b.planProjection || !equalPlanProjections(a.planProjection, b.planProjection)) {\n return false;\n }\n }\n\n if (!equalViewFlags(a.viewFlags, b.viewFlags))\n return false;\n\n return true;\n}\n\n/** Group the supplied `modelIds` such that all models that are to be drawn with equivalent display settings are grouped together.\n * @internal\n */\nexport function groupModels(context: ModelGroupingContext, modelIds: Id64Set): ModelGroup[] {\n const groups: ModelGroup[] = [];\n for (const modelId of modelIds) {\n const info = createModelGroupInfo(context, modelId);\n let group = groups.find((x) => equalModelGroupInfo(x, info));\n if (!group)\n groups.push(group = { ...info, modelIds: new Set<string>() });\n\n assert(!group.modelIds.has(modelId));\n group.modelIds.add(modelId);\n }\n\n return groups;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ModelGroup.js","sourceRoot":"","sources":["../../src/ModelGroup.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, Id64Set, Id64String } from \"@itwin/core-bentley\";\r\nimport { PlanProjectionSettings, RenderSchedule, ViewFlagOverrides } from \"@itwin/core-common\";\r\nimport { ModelDisplayTransform, RenderClipVolume } from \"@itwin/core-frontend\";\r\nimport { ModelGroupDisplayTransforms } from \"./ModelGroupDisplayTransforms.js\";\r\n\r\n/** Plan projection settings relevant to a [[ModelGroupInfo]].\r\n * @internal\r\n */\r\nexport interface PlanProjectionInfo {\r\n /** Z elevation, from [PlanProjectionSettings.elevation]($common) if specified, else the default elevation of the model (computed from model extents). */\r\n elevation: number;\r\n /** Transparency in [0..1] with 0 being fully opaque. */\r\n transparency: number;\r\n /** If true, the graphics are drawn as overlays with no depth test. */\r\n overlay: boolean;\r\n}\r\n\r\n/** Display settings to be applied to a group of models.\r\n * @internal\r\n */\r\nexport interface ModelGroupInfo {\r\n displayTransform?: ModelDisplayTransform;\r\n clip?: RenderClipVolume;\r\n planProjection?: PlanProjectionInfo;\r\n timeline?: RenderSchedule.ModelTimeline;\r\n viewFlags: ViewFlagOverrides;\r\n}\r\n\r\n/** Represents a group of models and the display settings to be applied to them.\r\n * @internal\r\n */\r\nexport interface ModelGroup extends ModelGroupInfo {\r\n /** The set of models belonging to this group. */\r\n modelIds: Id64Set;\r\n}\r\n\r\n/** Context supplied to [[groupModels]].\r\n * @internal\r\n */\r\nexport interface ModelGroupingContext {\r\n modelGroupDisplayTransforms: ModelGroupDisplayTransforms;\r\n getModelClip(modelId: Id64String): RenderClipVolume | undefined;\r\n getPlanProjectionSettings(modelId: Id64String): PlanProjectionSettings | undefined;\r\n getModelTimeline(modelId: Id64String): RenderSchedule.ModelTimeline | undefined;\r\n getDefaultElevation(modelId: Id64String): number;\r\n getViewFlagOverrides(modelId: Id64String): ViewFlagOverrides | undefined;\r\n}\r\n\r\nfunction createPlanProjectionInfo(modelId: Id64String, context: ModelGroupingContext): PlanProjectionInfo | undefined {\r\n const settings = context.getPlanProjectionSettings(modelId);\r\n if (!settings)\r\n return undefined;\r\n\r\n return {\r\n elevation: settings.elevation ?? context.getDefaultElevation(modelId),\r\n transparency: settings.transparency ?? 0,\r\n overlay: settings.overlay,\r\n };\r\n}\r\n\r\nfunction equalPlanProjections(a: PlanProjectionInfo, b: PlanProjectionInfo): boolean {\r\n return a.elevation === b.elevation && a.overlay === b.overlay && a.transparency === b.transparency;\r\n}\r\n\r\nfunction createModelGroupInfo(context: ModelGroupingContext, modelId: Id64String): ModelGroupInfo {\r\n const planProjection = createPlanProjectionInfo(modelId, context);\r\n const viewFlags = { ...context.getViewFlagOverrides(modelId) };\r\n if (planProjection) {\r\n // Always enable improved z-fighting mitigation for plan projections (they're planar models).\r\n viewFlags.forceSurfaceDiscard = true;\r\n }\r\n\r\n return {\r\n displayTransform: context.modelGroupDisplayTransforms.getDisplayTransform(modelId),\r\n clip: context.getModelClip(modelId),\r\n planProjection,\r\n viewFlags,\r\n timeline: context.getModelTimeline(modelId),\r\n };\r\n}\r\n\r\nfunction equalViewFlags(a: ViewFlagOverrides, b: ViewFlagOverrides): boolean {\r\n const lhs = Object.keys(a);\r\n const rhs = Object.keys(b);\r\n if (lhs.length !== rhs.length) {\r\n return false;\r\n }\r\n\r\n for (const propName of lhs) {\r\n const key = propName as keyof ViewFlagOverrides;\r\n if (a[key] !== b[key])\r\n return false;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nfunction equalModelGroupInfo(a: ModelGroupInfo, b: ModelGroupInfo): boolean {\r\n // If a model has a timeline it cannot be grouped\r\n if (a.timeline !== b.timeline)\r\n return false;\r\n\r\n // Display transforms are obtained from ModelGroupDisplayTransforms - they are guaranteed to be the same object if they are equivalent.\r\n if (a.displayTransform !== b.displayTransform)\r\n return false;\r\n\r\n if (a.clip || b.clip) {\r\n // Note: ClipVector lacks an `isAlmostEqual` method.\r\n // For two models belonging to the same clip group, we should have the same exact object.\r\n // But we won't currently detect two different objects that represent effectively identical clips.\r\n if (!a.clip || !b.clip || a.clip.clipVector !== b.clip.clipVector)\r\n return false;\r\n }\r\n\r\n if (a.planProjection || b.planProjection) {\r\n if (!a.planProjection || !b.planProjection || !equalPlanProjections(a.planProjection, b.planProjection)) {\r\n return false;\r\n }\r\n }\r\n\r\n if (!equalViewFlags(a.viewFlags, b.viewFlags))\r\n return false;\r\n\r\n return true;\r\n}\r\n\r\n/** Group the supplied `modelIds` such that all models that are to be drawn with equivalent display settings are grouped together.\r\n * @internal\r\n */\r\nexport function groupModels(context: ModelGroupingContext, modelIds: Id64Set): ModelGroup[] {\r\n const groups: ModelGroup[] = [];\r\n for (const modelId of modelIds) {\r\n const info = createModelGroupInfo(context, modelId);\r\n let group = groups.find((x) => equalModelGroupInfo(x, info));\r\n if (!group)\r\n groups.push(group = { ...info, modelIds: new Set<string>() });\r\n\r\n assert(!group.modelIds.has(modelId));\r\n group.modelIds.add(modelId);\r\n }\r\n\r\n return groups;\r\n}\r\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ModelGroupDisplayTransforms.js","sourceRoot":"","sources":["../../src/ModelGroupDisplayTransforms.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;;;AAE/F,sDAA6E;AAG7E,SAAS,sBAAsB,CAAC,CAAwB,EAAE,CAAwB;IAChF,OAAO,CAAC,CAAC,CAAC,CAAC,WAAW,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;AACvF,CAAC;AAcD,yFAAyF;AACzF,MAAM,UAAU,GAAqC,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;AAElF;;;;GAIG;AACH,MAAa,2BAA2B;IAC9B,MAAM,GAAqC,UAAU,CAAC;IAC7C,SAAS,CAAU;IAEpC,oJAAoJ;IACpJ,YAAmB,QAAiB,EAAE,QAAwC;QAC5E,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;QAC1B,IAAI,QAAQ;YACV,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC1B,CAAC;IAED,0DAA0D;IAC1D,IAAW,IAAI,KAAa,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IAEtD;;OAEG;IACI,mBAAmB,CAAC,OAAmB;QAC5C,OAAO,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,SAAS,CAAC;IAChF,CAAC;IAED,wGAAwG;IACxG,sDAAsD;IAC/C,MAAM,CAAC,QAAmD;QAC/D,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC;QAC9B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QAC1C,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC,IAAI,CAAC;IAC7C,CAAC;IAEO,YAAY,CAAC,QAAmD;QACtE,IAAI,CAAC,QAAQ;YACX,OAAO,UAAU,CAAC;QAEpB,MAAM,UAAU,GAAiC,EAAE,CAAC;QACpD,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACrC,MAAM,SAAS,GAAG,QAAQ,CAAC,wBAAwB,CAAC,OAAO,CAAC,CAAC;YAC7D,IAAI,SAAS,EAAE,CAAC;gBACd,IAAI,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,sBAAsB,CAAC,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;gBACnF,IAAI,CAAC,KAAK;oBACR,UAAU,CAAC,IAAI,CAAC,KAAK,GAAG,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC;gBAE9D,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;QAED,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;YACzB,OAAO,UAAU,CAAC;QAEpB,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,gCAAiB,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC/F,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;IAC9B,CAAC;CACF;AAnDD,kEAmDC","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 { CompressedId64Set, Id64Set, Id64String } from \"@itwin/core-bentley\";\nimport { ModelDisplayTransform, ModelDisplayTransformProvider } from \"@itwin/core-frontend\";\n\nfunction equalDisplayTransforms(a: ModelDisplayTransform, b: ModelDisplayTransform): boolean {\n return !!a.premultiply === !!b.premultiply && a.transform.isAlmostEqual(b.transform);\n}\n\n/** A display transform to be applied to a set of models. */\ninterface ModelGroupDisplayTransform {\n modelIds: Id64Set;\n transform: ModelDisplayTransform;\n}\n\n/** A collection of model Ids grouped according to the unique transforms to be applied to each group. */\ninterface ModelGroupDisplayTransformsState {\n readonly transforms: ReadonlyArray<ModelGroupDisplayTransform>;\n readonly guid: string;\n}\n\n/** Optimization for the common case in which no display transforms are to be applied. */\nconst emptyState: ModelGroupDisplayTransformsState = { transforms: [], guid: \"\" };\n\n/** Manages the display transforms to be applied to all of the models in a BatchedTileTree, enabling all models that share an equivalent transform\n * to be drawn together.\n * Call `update` whenever the transforms may have changed (e.g., after the viewport's scene is invalidated).\n * @internal\n */\nexport class ModelGroupDisplayTransforms {\n private _state: ModelGroupDisplayTransformsState = emptyState;\n private readonly _modelIds: Id64Set;\n\n /** Create a new set of groups for the specified `modelIds`. If `provider` is supplied, the grouping will be applied to those models immediately. */\n public constructor(modelIds: Id64Set, provider?: ModelDisplayTransformProvider) {\n this._modelIds = modelIds;\n if (provider)\n this.update(provider);\n }\n\n /** A string uniquely identifying the current grouping. */\n public get guid(): string { return this._state.guid; }\n\n /** Get the display transform for the specified model.\n * @note This method is guaranteed to return the same object for all models in the same group, at least between calls to `update`.\n */\n public getDisplayTransform(modelId: Id64String): ModelDisplayTransform | undefined {\n return this._state.transforms.find((x) => x.modelIds.has(modelId))?.transform;\n }\n\n // Update the display transforms and the model groupings based on the transforms supplied by `provider`.\n // Return `true` if the groupings changed as a result.\n public update(provider: ModelDisplayTransformProvider | undefined): boolean {\n const prevState = this._state;\n this._state = this.computeState(provider);\n return this._state.guid !== prevState.guid;\n }\n\n private computeState(provider: ModelDisplayTransformProvider | undefined): ModelGroupDisplayTransformsState {\n if (!provider)\n return emptyState;\n\n const transforms: ModelGroupDisplayTransform[] = [];\n for (const modelId of this._modelIds) {\n const transform = provider.getModelDisplayTransform(modelId);\n if (transform) {\n let entry = transforms.find((x) => equalDisplayTransforms(transform, x.transform));\n if (!entry)\n transforms.push(entry = { transform, modelIds: new Set() });\n\n entry.modelIds.add(modelId);\n }\n }\n\n if (transforms.length === 0)\n return emptyState;\n\n const guid = transforms.map((x) => CompressedId64Set.compressSet(x.modelIds)).sort().join(\"_\");\n return { transforms, guid };\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ModelGroupDisplayTransforms.js","sourceRoot":"","sources":["../../src/ModelGroupDisplayTransforms.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;;;AAE/F,sDAA6E;AAG7E,SAAS,sBAAsB,CAAC,CAAwB,EAAE,CAAwB;IAChF,OAAO,CAAC,CAAC,CAAC,CAAC,WAAW,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,IAAI,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;AACvF,CAAC;AAcD,yFAAyF;AACzF,MAAM,UAAU,GAAqC,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;AAElF;;;;GAIG;AACH,MAAa,2BAA2B;IAC9B,MAAM,GAAqC,UAAU,CAAC;IAC7C,SAAS,CAAU;IAEpC,oJAAoJ;IACpJ,YAAmB,QAAiB,EAAE,QAAwC;QAC5E,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;QAC1B,IAAI,QAAQ;YACV,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC1B,CAAC;IAED,0DAA0D;IAC1D,IAAW,IAAI,KAAa,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IAEtD;;OAEG;IACI,mBAAmB,CAAC,OAAmB;QAC5C,OAAO,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,EAAE,SAAS,CAAC;IAChF,CAAC;IAED,wGAAwG;IACxG,sDAAsD;IAC/C,MAAM,CAAC,QAAmD;QAC/D,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC;QAC9B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;QAC1C,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC,IAAI,CAAC;IAC7C,CAAC;IAEO,YAAY,CAAC,QAAmD;QACtE,IAAI,CAAC,QAAQ;YACX,OAAO,UAAU,CAAC;QAEpB,MAAM,UAAU,GAAiC,EAAE,CAAC;QACpD,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACrC,MAAM,SAAS,GAAG,QAAQ,CAAC,wBAAwB,CAAC,OAAO,CAAC,CAAC;YAC7D,IAAI,SAAS,EAAE,CAAC;gBACd,IAAI,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,sBAAsB,CAAC,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;gBACnF,IAAI,CAAC,KAAK;oBACR,UAAU,CAAC,IAAI,CAAC,KAAK,GAAG,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC;gBAE9D,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;QAED,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;YACzB,OAAO,UAAU,CAAC;QAEpB,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,gCAAiB,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC/F,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;IAC9B,CAAC;CACF;AAnDD,kEAmDC","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 { CompressedId64Set, Id64Set, Id64String } from \"@itwin/core-bentley\";\r\nimport { ModelDisplayTransform, ModelDisplayTransformProvider } from \"@itwin/core-frontend\";\r\n\r\nfunction equalDisplayTransforms(a: ModelDisplayTransform, b: ModelDisplayTransform): boolean {\r\n return !!a.premultiply === !!b.premultiply && a.transform.isAlmostEqual(b.transform);\r\n}\r\n\r\n/** A display transform to be applied to a set of models. */\r\ninterface ModelGroupDisplayTransform {\r\n modelIds: Id64Set;\r\n transform: ModelDisplayTransform;\r\n}\r\n\r\n/** A collection of model Ids grouped according to the unique transforms to be applied to each group. */\r\ninterface ModelGroupDisplayTransformsState {\r\n readonly transforms: ReadonlyArray<ModelGroupDisplayTransform>;\r\n readonly guid: string;\r\n}\r\n\r\n/** Optimization for the common case in which no display transforms are to be applied. */\r\nconst emptyState: ModelGroupDisplayTransformsState = { transforms: [], guid: \"\" };\r\n\r\n/** Manages the display transforms to be applied to all of the models in a BatchedTileTree, enabling all models that share an equivalent transform\r\n * to be drawn together.\r\n * Call `update` whenever the transforms may have changed (e.g., after the viewport's scene is invalidated).\r\n * @internal\r\n */\r\nexport class ModelGroupDisplayTransforms {\r\n private _state: ModelGroupDisplayTransformsState = emptyState;\r\n private readonly _modelIds: Id64Set;\r\n\r\n /** Create a new set of groups for the specified `modelIds`. If `provider` is supplied, the grouping will be applied to those models immediately. */\r\n public constructor(modelIds: Id64Set, provider?: ModelDisplayTransformProvider) {\r\n this._modelIds = modelIds;\r\n if (provider)\r\n this.update(provider);\r\n }\r\n\r\n /** A string uniquely identifying the current grouping. */\r\n public get guid(): string { return this._state.guid; }\r\n\r\n /** Get the display transform for the specified model.\r\n * @note This method is guaranteed to return the same object for all models in the same group, at least between calls to `update`.\r\n */\r\n public getDisplayTransform(modelId: Id64String): ModelDisplayTransform | undefined {\r\n return this._state.transforms.find((x) => x.modelIds.has(modelId))?.transform;\r\n }\r\n\r\n // Update the display transforms and the model groupings based on the transforms supplied by `provider`.\r\n // Return `true` if the groupings changed as a result.\r\n public update(provider: ModelDisplayTransformProvider | undefined): boolean {\r\n const prevState = this._state;\r\n this._state = this.computeState(provider);\r\n return this._state.guid !== prevState.guid;\r\n }\r\n\r\n private computeState(provider: ModelDisplayTransformProvider | undefined): ModelGroupDisplayTransformsState {\r\n if (!provider)\r\n return emptyState;\r\n\r\n const transforms: ModelGroupDisplayTransform[] = [];\r\n for (const modelId of this._modelIds) {\r\n const transform = provider.getModelDisplayTransform(modelId);\r\n if (transform) {\r\n let entry = transforms.find((x) => equalDisplayTransforms(transform, x.transform));\r\n if (!entry)\r\n transforms.push(entry = { transform, modelIds: new Set() });\r\n\r\n entry.modelIds.add(modelId);\r\n }\r\n }\r\n\r\n if (transforms.length === 0)\r\n return emptyState;\r\n\r\n const guid = transforms.map((x) => CompressedId64Set.compressSet(x.modelIds)).sort().join(\"_\");\r\n return { transforms, guid };\r\n }\r\n}\r\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"frontend-tiles.js","sourceRoot":"","sources":["../../src/frontend-tiles.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;;;;;;;;;;;;;;;;AAE/F,qDAAmC;AACnC,sFAAoE;AACpE,yEAAuD;AACvD,2FAAyE;AACzE,4FAA0E","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.js\";\nexport * from \"./GraphicsProvider/GraphicRepresentationProvider.js\";\nexport * from \"./GraphicsProvider/GraphicsProvider.js\";\nexport * from \"./GraphicsProvider/tileset-creators/GeoscienceTileset.js\";\nexport * from \"./GraphicsProvider/url-providers/GeoscienceUrlProvider.js\";\n"]}
|
|
1
|
+
{"version":3,"file":"frontend-tiles.js","sourceRoot":"","sources":["../../src/frontend-tiles.ts"],"names":[],"mappings":";AAAA;;;+FAG+F;;;;;;;;;;;;;;;;AAE/F,qDAAmC;AACnC,sFAAoE;AACpE,yEAAuD;AACvD,2FAAyE;AACzE,4FAA0E","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.js\";\r\nexport * from \"./GraphicsProvider/GraphicRepresentationProvider.js\";\r\nexport * from \"./GraphicsProvider/GraphicsProvider.js\";\r\nexport * from \"./GraphicsProvider/tileset-creators/GeoscienceTileset.js\";\r\nexport * from \"./GraphicsProvider/url-providers/GeoscienceUrlProvider.js\";\r\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BatchedModelGroups.js","sourceRoot":"","sources":["../../src/BatchedModelGroups.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*--------------------------------------------------------------------------------------------*/\nimport { assert, CompressedId64Set, Id64Set, Id64String } from \"@itwin/core-bentley\";\nimport { PlanProjectionSettings, RenderSchedule, ViewFlagOverrides } from \"@itwin/core-common\";\nimport { RenderClipVolume, SpatialViewState } from \"@itwin/core-frontend\";\nimport { ModelMetadata } from \"./BatchedTilesetReader.js\";\nimport { groupModels, ModelGroup, ModelGroupingContext } from \"./ModelGroup.js\";\nimport { ModelGroupDisplayTransforms } from \"./ModelGroupDisplayTransforms.js\";\n\n/** Groups the set of spatial models included in a [[BatchedSpatialTileTreeReferences]] based on their display settings.\n * This ensures that models are displayed correctly, while using batching to reduce the number of draw calls to a minimum.\n * The groupings are re-evaluated only when there's a possibility that they may have changed (e.g., if the view's plan projection settings or model clip groups were modified).\n * Unfortunately, there is currently no way to know when the transforms supplied by a [ModelDisplayTransformProvider]($frontend) may have changed, so\n * display transforms are re-evaluated every time the Viewport's scene is invalidated. This may (but usually won't) affect the groupings.\n * The BatchedSpatialTileTreeReferences object allocates new [[BatchedTileTreeReferences]] whenever the groupings change.\n * @internal\n */\nexport class BatchedModelGroups implements ModelGroupingContext {\n private readonly _view: SpatialViewState;\n private readonly _includedModelIds: Id64Set;\n private readonly _metadata: Map<Id64String, ModelMetadata>;\n private _script?: RenderSchedule.Script;\n private _transformsValid = false;\n private _groupsValid = false;\n private _scriptValid = false;\n /** A stringified representation of the current groupings, of the format:\n * group1_group2_group3_..._groupN\n * where each group is a [CompressedId64Set]($bentley).\n * @see [[BatchedTileTreeId.modelGroups]].\n */\n public guid = \"\";\n public groups: ModelGroup[] = [];\n public modelGroupDisplayTransforms: ModelGroupDisplayTransforms;\n\n public constructor(view: SpatialViewState, script: RenderSchedule.Script | undefined, includedModelIds: Id64Set, metadata: Map<Id64String, ModelMetadata>) {\n this._script = script;\n this._view = view;\n this._includedModelIds = includedModelIds;\n this._metadata = metadata;\n this.modelGroupDisplayTransforms = new ModelGroupDisplayTransforms(includedModelIds, view.modelDisplayTransformProvider);\n\n this._view.onModelDisplayTransformProviderChanged.addListener(() => this._transformsValid = false);\n this._view.details.onModelClipGroupsChanged.addListener(() => this._groupsValid = false);\n this.listenForDisplayStyleEvents();\n\n this.update();\n }\n\n public setScript(script: RenderSchedule.Script | undefined): void {\n this._script = script;\n this._scriptValid = false;\n }\n\n public invalidateTransforms(): void { this._transformsValid = false; }\n\n private listenForDisplayStyleEvents(): void {\n const removeListener = this._view.displayStyle.settings.onPlanProjectionSettingsChanged.addListener(() => this._groupsValid = false);\n this._view.onDisplayStyleChanged.addListener(() => {\n this._groupsValid = false;\n removeListener();\n this.listenForDisplayStyleEvents();\n });\n }\n\n public getModelClip(modelId: Id64String): RenderClipVolume | undefined {\n return this._view.getModelClip(modelId);\n }\n\n public getPlanProjectionSettings(modelId: Id64String): PlanProjectionSettings | undefined {\n return this._view.displayStyle.settings.getPlanProjectionSettings(modelId);\n }\n\n public getModelTimeline(modelId: Id64String): RenderSchedule.ModelTimeline | undefined {\n return this._script?.modelTimelines.find((x) => x.modelId === modelId);\n }\n\n public getViewFlagOverrides(modelId: Id64String): ViewFlagOverrides | undefined {\n return this._metadata.get(modelId)?.viewFlags;\n }\n\n public getDefaultElevation(modelId: Id64String): number {\n const range = this._metadata.get(modelId)?.extents;\n if (range) {\n const low = range.low.z;\n const high = range.high.z;\n if (low <= high)\n return (low + high) / 2;\n }\n\n return 0;\n }\n\n /** Re-evaluate transforms and groupings if they may be out of date.\n * @returns true if the groupings changed as a result.\n */\n public update(): boolean {\n if (!this._transformsValid && this.modelGroupDisplayTransforms.update(this._view.modelDisplayTransformProvider)) {\n this._groupsValid = false;\n }\n\n this._transformsValid = true;\n if (this._groupsValid && this._scriptValid) {\n // Update the display transforms on the ModelGroups.\n const getFirstModelId = (ids: Id64Set) => {\n for (const id of ids)\n return id;\n\n return undefined;\n };\n\n for (const group of this.groups) {\n if (group.displayTransform) {\n const modelId = getFirstModelId(group.modelIds);\n assert(undefined !== modelId);\n group.displayTransform = this.modelGroupDisplayTransforms.getDisplayTransform(modelId);\n assert(undefined !== group.displayTransform);\n }\n }\n\n return false; // the groupings haven't changed.\n }\n\n this.groups = groupModels(this, this._includedModelIds);\n const newGuid = this.groups.map((x) => CompressedId64Set.compressSet(x.modelIds)).join(\"_\");\n\n const updated = newGuid !== this.guid || !this._scriptValid;\n\n this.guid = newGuid;\n this._groupsValid = this._scriptValid = true;\n\n return updated;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"BatchedModelGroups.js","sourceRoot":"","sources":["../../src/BatchedModelGroups.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\nimport { assert, CompressedId64Set, Id64Set, Id64String } from \"@itwin/core-bentley\";\r\nimport { PlanProjectionSettings, RenderSchedule, ViewFlagOverrides } from \"@itwin/core-common\";\r\nimport { RenderClipVolume, SpatialViewState } from \"@itwin/core-frontend\";\r\nimport { ModelMetadata } from \"./BatchedTilesetReader.js\";\r\nimport { groupModels, ModelGroup, ModelGroupingContext } from \"./ModelGroup.js\";\r\nimport { ModelGroupDisplayTransforms } from \"./ModelGroupDisplayTransforms.js\";\r\n\r\n/** Groups the set of spatial models included in a [[BatchedSpatialTileTreeReferences]] based on their display settings.\r\n * This ensures that models are displayed correctly, while using batching to reduce the number of draw calls to a minimum.\r\n * The groupings are re-evaluated only when there's a possibility that they may have changed (e.g., if the view's plan projection settings or model clip groups were modified).\r\n * Unfortunately, there is currently no way to know when the transforms supplied by a [ModelDisplayTransformProvider]($frontend) may have changed, so\r\n * display transforms are re-evaluated every time the Viewport's scene is invalidated. This may (but usually won't) affect the groupings.\r\n * The BatchedSpatialTileTreeReferences object allocates new [[BatchedTileTreeReferences]] whenever the groupings change.\r\n * @internal\r\n */\r\nexport class BatchedModelGroups implements ModelGroupingContext {\r\n private readonly _view: SpatialViewState;\r\n private readonly _includedModelIds: Id64Set;\r\n private readonly _metadata: Map<Id64String, ModelMetadata>;\r\n private _script?: RenderSchedule.Script;\r\n private _transformsValid = false;\r\n private _groupsValid = false;\r\n private _scriptValid = false;\r\n /** A stringified representation of the current groupings, of the format:\r\n * group1_group2_group3_..._groupN\r\n * where each group is a [CompressedId64Set]($bentley).\r\n * @see [[BatchedTileTreeId.modelGroups]].\r\n */\r\n public guid = \"\";\r\n public groups: ModelGroup[] = [];\r\n public modelGroupDisplayTransforms: ModelGroupDisplayTransforms;\r\n\r\n public constructor(view: SpatialViewState, script: RenderSchedule.Script | undefined, includedModelIds: Id64Set, metadata: Map<Id64String, ModelMetadata>) {\r\n this._script = script;\r\n this._view = view;\r\n this._includedModelIds = includedModelIds;\r\n this._metadata = metadata;\r\n this.modelGroupDisplayTransforms = new ModelGroupDisplayTransforms(includedModelIds, view.modelDisplayTransformProvider);\r\n\r\n this._view.onModelDisplayTransformProviderChanged.addListener(() => this._transformsValid = false);\r\n this._view.details.onModelClipGroupsChanged.addListener(() => this._groupsValid = false);\r\n this.listenForDisplayStyleEvents();\r\n\r\n this.update();\r\n }\r\n\r\n public setScript(script: RenderSchedule.Script | undefined): void {\r\n this._script = script;\r\n this._scriptValid = false;\r\n }\r\n\r\n public invalidateTransforms(): void { this._transformsValid = false; }\r\n\r\n private listenForDisplayStyleEvents(): void {\r\n const removeListener = this._view.displayStyle.settings.onPlanProjectionSettingsChanged.addListener(() => this._groupsValid = false);\r\n this._view.onDisplayStyleChanged.addListener(() => {\r\n this._groupsValid = false;\r\n removeListener();\r\n this.listenForDisplayStyleEvents();\r\n });\r\n }\r\n\r\n public getModelClip(modelId: Id64String): RenderClipVolume | undefined {\r\n return this._view.getModelClip(modelId);\r\n }\r\n\r\n public getPlanProjectionSettings(modelId: Id64String): PlanProjectionSettings | undefined {\r\n return this._view.displayStyle.settings.getPlanProjectionSettings(modelId);\r\n }\r\n\r\n public getModelTimeline(modelId: Id64String): RenderSchedule.ModelTimeline | undefined {\r\n return this._script?.modelTimelines.find((x) => x.modelId === modelId);\r\n }\r\n\r\n public getViewFlagOverrides(modelId: Id64String): ViewFlagOverrides | undefined {\r\n return this._metadata.get(modelId)?.viewFlags;\r\n }\r\n\r\n public getDefaultElevation(modelId: Id64String): number {\r\n const range = this._metadata.get(modelId)?.extents;\r\n if (range) {\r\n const low = range.low.z;\r\n const high = range.high.z;\r\n if (low <= high)\r\n return (low + high) / 2;\r\n }\r\n\r\n return 0;\r\n }\r\n\r\n /** Re-evaluate transforms and groupings if they may be out of date.\r\n * @returns true if the groupings changed as a result.\r\n */\r\n public update(): boolean {\r\n if (!this._transformsValid && this.modelGroupDisplayTransforms.update(this._view.modelDisplayTransformProvider)) {\r\n this._groupsValid = false;\r\n }\r\n\r\n this._transformsValid = true;\r\n if (this._groupsValid && this._scriptValid) {\r\n // Update the display transforms on the ModelGroups.\r\n const getFirstModelId = (ids: Id64Set) => {\r\n for (const id of ids)\r\n return id;\r\n\r\n return undefined;\r\n };\r\n\r\n for (const group of this.groups) {\r\n if (group.displayTransform) {\r\n const modelId = getFirstModelId(group.modelIds);\r\n assert(undefined !== modelId);\r\n group.displayTransform = this.modelGroupDisplayTransforms.getDisplayTransform(modelId);\r\n assert(undefined !== group.displayTransform);\r\n }\r\n }\r\n\r\n return false; // the groupings haven't changed.\r\n }\r\n\r\n this.groups = groupModels(this, this._includedModelIds);\r\n const newGuid = this.groups.map((x) => CompressedId64Set.compressSet(x.modelIds)).join(\"_\");\r\n\r\n const updated = newGuid !== this.guid || !this._scriptValid;\r\n\r\n this.guid = newGuid;\r\n this._groupsValid = this._scriptValid = true;\r\n\r\n return updated;\r\n }\r\n}\r\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BatchedModels.js","sourceRoot":"","sources":["../../src/BatchedModels.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAE/F,OAAO,EAAE,IAAI,EAAc,MAAM,qBAAqB,CAAC;AAEvD,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAG/C,MAAM,OAAO,aAAa;IAChB,aAAa,CAAmB;IACvB,eAAe,CAAU;IACzB,cAAc,GAAG,IAAI,OAAO,EAAE,CAAC;IAC/B,mBAAmB,GAAG,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;IAC3C,SAAS,CAAiC;IAE3D,YAAmB,IAAsB,EAAE,QAAwC;QACjF,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;QAC1B,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC;QAClD,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IAClD,CAAC;IAEM,eAAe,CAAC,MAAuB;QAC5C,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC;QAC5B,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,CAAC;QACjC,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACxC,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC;QAE9B,KAAK,MAAM,OAAO,IAAI,MAAM,EAAE,CAAC;YAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;YACnD,IAAI,KAAK;gBACP,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAC3C,CAAC;QAED,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;IAC3E,CAAC;IAEM,eAAe,CAAC,OAAmB;QACxC,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC9C,CAAC;IAEM,KAAK,CAAC,OAAmB;QAC9B,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACzC,CAAC;IAEM,QAAQ,CAAC,SAAiB,EAAE,SAAiB;QAClD,OAAO,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IAC5D,CAAC;IAEM,UAAU,CAAC,KAAc;QAC9B,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACzC,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 { Id64, Id64String } from \"@itwin/core-bentley\";\nimport { SpatialViewState } from \"@itwin/core-frontend\";\nimport { Range3d } from \"@itwin/core-geometry\";\nimport { ModelMetadata } from \"./BatchedTilesetReader.js\";\n\nexport class BatchedModels {\n private _viewedModels!: Set<Id64String>;\n private readonly _projectExtents: Range3d;\n private readonly _viewedExtents = new Range3d();\n private readonly _viewedModelIdPairs = new Id64.Uint32Set();\n private readonly _metadata: Map<Id64String, ModelMetadata>;\n\n public constructor(view: SpatialViewState, metadata: Map<Id64String, ModelMetadata>) {\n this._metadata = metadata;\n this._projectExtents = view.iModel.projectExtents;\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\n for (const modelId of models) {\n const range = this._metadata.get(modelId)?.extents;\n if (range)\n this._viewedExtents.extendRange(range);\n }\n\n this._viewedExtents.intersect(this._projectExtents, this._viewedExtents);\n }\n\n public getModelExtents(modelId: Id64String): Range3d | undefined {\n return this._metadata.get(modelId)?.extents;\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
|
+
{"version":3,"file":"BatchedModels.js","sourceRoot":"","sources":["../../src/BatchedModels.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAE/F,OAAO,EAAE,IAAI,EAAc,MAAM,qBAAqB,CAAC;AAEvD,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAG/C,MAAM,OAAO,aAAa;IAChB,aAAa,CAAmB;IACvB,eAAe,CAAU;IACzB,cAAc,GAAG,IAAI,OAAO,EAAE,CAAC;IAC/B,mBAAmB,GAAG,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;IAC3C,SAAS,CAAiC;IAE3D,YAAmB,IAAsB,EAAE,QAAwC;QACjF,IAAI,CAAC,SAAS,GAAG,QAAQ,CAAC;QAC1B,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC;QAClD,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IAClD,CAAC;IAEM,eAAe,CAAC,MAAuB;QAC5C,IAAI,CAAC,aAAa,GAAG,MAAM,CAAC;QAC5B,IAAI,CAAC,mBAAmB,CAAC,KAAK,EAAE,CAAC;QACjC,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACxC,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC;QAE9B,KAAK,MAAM,OAAO,IAAI,MAAM,EAAE,CAAC;YAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;YACnD,IAAI,KAAK;gBACP,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QAC3C,CAAC;QAED,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,cAAc,CAAC,CAAC;IAC3E,CAAC;IAEM,eAAe,CAAC,OAAmB;QACxC,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC9C,CAAC;IAEM,KAAK,CAAC,OAAmB;QAC9B,OAAO,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACzC,CAAC;IAEM,QAAQ,CAAC,SAAiB,EAAE,SAAiB;QAClD,OAAO,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IAC5D,CAAC;IAEM,UAAU,CAAC,KAAc;QAC9B,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACzC,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 { Id64, Id64String } from \"@itwin/core-bentley\";\r\nimport { SpatialViewState } from \"@itwin/core-frontend\";\r\nimport { Range3d } from \"@itwin/core-geometry\";\r\nimport { ModelMetadata } from \"./BatchedTilesetReader.js\";\r\n\r\nexport class BatchedModels {\r\n private _viewedModels!: Set<Id64String>;\r\n private readonly _projectExtents: Range3d;\r\n private readonly _viewedExtents = new Range3d();\r\n private readonly _viewedModelIdPairs = new Id64.Uint32Set();\r\n private readonly _metadata: Map<Id64String, ModelMetadata>;\r\n\r\n public constructor(view: SpatialViewState, metadata: Map<Id64String, ModelMetadata>) {\r\n this._metadata = metadata;\r\n this._projectExtents = view.iModel.projectExtents;\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\r\n for (const modelId of models) {\r\n const range = this._metadata.get(modelId)?.extents;\r\n if (range)\r\n this._viewedExtents.extendRange(range);\r\n }\r\n\r\n this._viewedExtents.intersect(this._projectExtents, this._viewedExtents);\r\n }\r\n\r\n public getModelExtents(modelId: Id64String): Range3d | undefined {\r\n return this._metadata.get(modelId)?.extents;\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 +1 @@
|
|
|
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 { Id64String, Logger, OrderedId64Iterable } from \"@itwin/core-bentley\";\nimport { RenderSchedule } from \"@itwin/core-common\";\nimport {\n AnimationNodeId,\n AttachToViewportArgs, collectMaskRefs, createSpatialTileTreeReferences, IModelConnection, SpatialTileTreeReferences, SpatialViewState,\n TileTreeLoadStatus, TileTreeOwner, TileTreeReference,\n Viewport,\n} from \"@itwin/core-frontend\";\nimport { Range3d } from \"@itwin/core-geometry\";\nimport { BatchedModelGroups } from \"./BatchedModelGroups.js\";\nimport { BatchedModels } from \"./BatchedModels.js\";\nimport { BatchedTilesetSpec } from \"./BatchedTilesetReader.js\";\nimport { BatchedTileTreeReference, BatchedTileTreeReferenceArgs } from \"./BatchedTileTreeReference.js\";\nimport { getBatchedTileTreeOwner } from \"./BatchedTileTreeSupplier.js\";\nimport { ComputeSpatialTilesetBaseUrl } from \"./FrontendTiles.js\";\nimport { loggerCategory } from \"./LoggerCategory.js\";\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 readonly _groups: BatchedModelGroups;\n private readonly _spec: BatchedTilesetSpec;\n private _treeOwner: TileTreeOwner;\n private _refs: BatchedTileTreeReference[] = [];\n private _currentScript?: RenderSchedule.Script;\n private _onModelSelectorChanged?: () => void;\n /** Provides tile trees for models that are not included in the batched tile set. */\n private readonly _excludedRefs: SpatialTileTreeReferences;\n private _removeSceneInvalidationListener?: () => void;\n\n public constructor(spec: BatchedTilesetSpec, view: SpatialViewState) {\n this._view = view;\n this._models = new BatchedModels(view, spec.models);\n this._spec = spec;\n\n const script = view.displayStyle.scheduleScript;\n this._currentScript = script?.requiresBatching ? script : undefined;\n\n const includedModels = new Set(spec.models.keys());\n this._excludedRefs = createSpatialTileTreeReferences(view, includedModels);\n\n this._groups = new BatchedModelGroups(view, this._currentScript, includedModels, spec.models);\n this._treeOwner = this.getTreeOwner();\n this.loadRefs();\n\n this.listenForScriptChange();\n }\n\n private ensureLoaded(): void {\n if (!this._groups.update())\n return;\n\n this._treeOwner = this.getTreeOwner();\n this.loadRefs();\n }\n\n private getTreeOwner(): TileTreeOwner {\n return getBatchedTileTreeOwner(this._view.iModel, {\n spec: this._spec,\n script: this._currentScript,\n modelGroups: this._groups.guid,\n });\n }\n\n private listenForScriptChange(): void {\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._groups.setScript(newScript);\n };\n\n let rmListener = this._view.displayStyle.onScheduleScriptChanged.addListener((newScript) => onScriptChanged(newScript));\n this._view.onDisplayStyleChanged.addListener((newStyle) => {\n rmListener();\n onScriptChanged(newStyle.scheduleScript);\n rmListener = this._view.displayStyle.onScheduleScriptChanged.addListener((newScript) => onScriptChanged(newScript));\n });\n }\n\n private loadRefs(): void {\n this._refs.length = 0;\n const groups = this._groups.groups;\n const args: BatchedTileTreeReferenceArgs = {\n models: this._models,\n groups,\n treeOwner: this._treeOwner,\n getCurrentTimePoint: () => this._currentScript ? (this._view.displayStyle.settings.timePoint ?? this._currentScript.duration.low) : 0,\n getBackgroundBase: () => this._view.displayStyle.settings.mapImagery.backgroundBase,\n getBackgroundLayers: () => this._view.displayStyle.settings.mapImagery.backgroundLayers,\n iModel: this._view.iModel,\n };\n\n for (let i = 0; i < groups.length; i++) {\n const timeline = groups[i].timeline;\n this._refs.push(new BatchedTileTreeReference(args, i, timeline ? AnimationNodeId.Untransformed : undefined));\n if (timeline) {\n for (const nodeId of timeline.transformBatchIds)\n this._refs.push(new BatchedTileTreeReference(args, i, nodeId));\n }\n }\n }\n\n public *[Symbol.iterator](): Iterator<TileTreeReference> {\n this.ensureLoaded();\n for (const ref of this._refs)\n yield ref;\n\n for (const ref of this._excludedRefs)\n yield ref;\n }\n\n public update(): void {\n this._excludedRefs.update();\n this._models.setViewedModels(this._view.modelSelector.models);\n if (this._onModelSelectorChanged)\n this._onModelSelectorChanged();\n }\n\n public attachToViewport(args: AttachToViewportArgs): void {\n this._onModelSelectorChanged = () => args.invalidateSymbologyOverrides();\n this._excludedRefs.attachToViewport(args);\n this._removeSceneInvalidationListener = args.onSceneInvalidated.addListener(() => this._groups.invalidateTransforms());\n }\n\n public detachFromViewport(): void {\n this._onModelSelectorChanged = undefined;\n this._excludedRefs.detachFromViewport();\n\n if (this._removeSceneInvalidationListener) {\n this._removeSceneInvalidationListener();\n this._removeSceneInvalidationListener = undefined;\n }\n }\n\n // Collects the TileTreeReferences for the models that need to be drawn to create the planar clip mask.\n // For every model used by the mask (modelIds), extend the maskRange by that model's range.\n public collectMaskRefs(modelIds: OrderedId64Iterable, maskTreeRefs: TileTreeReference[], maskRange: Range3d): void {\n // Use V1 tiles for masking - producing the mask from batched tiles can significantly impact performance.\n return collectMaskRefs(this._view, modelIds, undefined, maskTreeRefs, maskRange);\n }\n\n // Returns a list of the models that are NOT in the planar clip mask.\n public getModelsNotInMask(_maskModels: OrderedId64Iterable | undefined, _useVisible: boolean): Id64String[] | undefined {\n return undefined;\n }\n\n // _view.models\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 [Symbol.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, getSpec: Promise<BatchedTilesetSpec | null>, nopFallback: boolean = false) {\n this._proxyRef = new ProxyTileTreeReference(view.iModel);\n getSpec.then((spec: BatchedTilesetSpec | null) => {\n if (spec) {\n this.setTreeRefs(new BatchedSpatialTileTreeReferences(spec, view));\n } else if(nopFallback) {\n this.setTreeRefs(new EmptySpatialTileTreeReferences());\n }else {\n this.setTreeRefs(createSpatialTileTreeReferences(view));\n }\n }).catch(() => {\n if(nopFallback) {\n this.setTreeRefs(new EmptySpatialTileTreeReferences());\n }else {\n this.setTreeRefs(createSpatialTileTreeReferences(view));\n }\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 // Force scene invalidation after replacing Proxy with real BatchedTileTree\n this._attachArgs.invalidateScene();\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 public collectMaskRefs(modelIds: OrderedId64Iterable, maskTreeRefs: TileTreeReference[], maskRange: Range3d): void {\n this._impl?.collectMaskRefs(modelIds, maskTreeRefs, maskRange);\n }\n\n public getModelsNotInMask(maskModels: OrderedId64Iterable | undefined, useVisible: boolean): Id64String[] | undefined {\n if (this._impl)\n return this._impl.getModelsNotInMask(maskModels, useVisible);\n else\n return undefined;\n }\n}\n\nconst iModelToTilesetSpec = new Map<IModelConnection, BatchedTilesetSpec | null | Promise<BatchedTilesetSpec | null>>();\n\nasync function fetchTilesetSpec(iModel: IModelConnection, computeBaseUrl: ComputeSpatialTilesetBaseUrl): Promise<BatchedTilesetSpec | null> {\n try {\n const baseUrl = await computeBaseUrl(iModel);\n if (undefined === baseUrl)\n return null;\n\n const url = new URL(\"tileset.json\", baseUrl);\n url.search = baseUrl.search;\n const response = await fetch(url.toString());\n const json = await response.json();\n return BatchedTilesetSpec.create(baseUrl, json);\n } catch (err) {\n Logger.logException(loggerCategory, err);\n return null;\n }\n}\n\nclass EmptySpatialTileTreeReferences implements SpatialTileTreeReferences {\n public update(): void {}\n\n public setDeactivated(_modelIds: string | string[] | undefined, _deactivated: boolean | undefined, _refs: \"all\" | \"animated\" | \"primary\" | \"section\" | number[]): void {}\n\n public attachToViewport(_args: Viewport): void {}\n\n public detachFromViewport(): void {}\n\n public collectMaskRefs(_modelIds: OrderedId64Iterable, _maskTreeRefs: TileTreeReference[]): void {};\n\n public getModelsNotInMask(_maskModels: OrderedId64Iterable | undefined, _useVisible: boolean): string[] | undefined {\n return undefined;\n }\n\n public *[Symbol.iterator](): Iterator<TileTreeReference> {}\n}\n\n/** @internal */\nexport function createBatchedSpatialTileTreeReferences(view: SpatialViewState, computeBaseUrl: ComputeSpatialTilesetBaseUrl, nopFallback: boolean = false): SpatialTileTreeReferences {\n const iModel = view.iModel;\n let entry = iModelToTilesetSpec.get(iModel);\n if (undefined === entry) {\n const promise = entry = fetchTilesetSpec(iModel, computeBaseUrl);\n iModelToTilesetSpec.set(iModel, entry);\n iModel.onClose.addOnce(() => iModelToTilesetSpec.delete(iModel));\n\n promise.then((spec: BatchedTilesetSpec | null) => {\n if (iModelToTilesetSpec.has(iModel))\n iModelToTilesetSpec.set(iModel, spec);\n }).catch(() => {\n if (iModelToTilesetSpec.has(iModel))\n iModelToTilesetSpec.set(iModel, null);\n });\n }\n\n if (null === entry) {\n // No tileset could be obtained for this iModel - use empty tile tree if requested.\n if (nopFallback) {\n return new EmptySpatialTileTreeReferences();\n }\n\n // No tileset could be obtained for this iModel - use default tile generation instead.\n return createSpatialTileTreeReferences(view);\n }\n\n if (entry instanceof Promise)\n return new ProxySpatialTileTreeReferences(view, entry, nopFallback);\n\n return new BatchedSpatialTileTreeReferences(entry, view);\n}\n\n"]}
|
|
1
|
+
{"version":3,"file":"BatchedSpatialTileTreeRefs.js","sourceRoot":"","sources":["../../src/BatchedSpatialTileTreeRefs.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\nimport { Id64String, Logger, OrderedId64Iterable } from \"@itwin/core-bentley\";\r\nimport { RenderSchedule } from \"@itwin/core-common\";\r\nimport {\r\n AnimationNodeId,\r\n AttachToViewportArgs, collectMaskRefs, createSpatialTileTreeReferences, IModelConnection, SpatialTileTreeReferences, SpatialViewState,\r\n TileTreeLoadStatus, TileTreeOwner, TileTreeReference,\r\n Viewport,\r\n} from \"@itwin/core-frontend\";\r\nimport { Range3d } from \"@itwin/core-geometry\";\r\nimport { BatchedModelGroups } from \"./BatchedModelGroups.js\";\r\nimport { BatchedModels } from \"./BatchedModels.js\";\r\nimport { BatchedTilesetSpec } from \"./BatchedTilesetReader.js\";\r\nimport { BatchedTileTreeReference, BatchedTileTreeReferenceArgs } from \"./BatchedTileTreeReference.js\";\r\nimport { getBatchedTileTreeOwner } from \"./BatchedTileTreeSupplier.js\";\r\nimport { ComputeSpatialTilesetBaseUrl } from \"./FrontendTiles.js\";\r\nimport { loggerCategory } from \"./LoggerCategory.js\";\r\n\r\n// Obtains tiles pre-published by mesh export service.\r\nclass BatchedSpatialTileTreeReferences implements SpatialTileTreeReferences {\r\n private readonly _view: SpatialViewState;\r\n private readonly _models: BatchedModels;\r\n private readonly _groups: BatchedModelGroups;\r\n private readonly _spec: BatchedTilesetSpec;\r\n private _treeOwner: TileTreeOwner;\r\n private _refs: BatchedTileTreeReference[] = [];\r\n private _currentScript?: RenderSchedule.Script;\r\n private _onModelSelectorChanged?: () => void;\r\n /** Provides tile trees for models that are not included in the batched tile set. */\r\n private readonly _excludedRefs: SpatialTileTreeReferences;\r\n private _removeSceneInvalidationListener?: () => void;\r\n\r\n public constructor(spec: BatchedTilesetSpec, view: SpatialViewState) {\r\n this._view = view;\r\n this._models = new BatchedModels(view, spec.models);\r\n this._spec = spec;\r\n\r\n const script = view.displayStyle.scheduleScript;\r\n this._currentScript = script?.requiresBatching ? script : undefined;\r\n\r\n const includedModels = new Set(spec.models.keys());\r\n this._excludedRefs = createSpatialTileTreeReferences(view, includedModels);\r\n\r\n this._groups = new BatchedModelGroups(view, this._currentScript, includedModels, spec.models);\r\n this._treeOwner = this.getTreeOwner();\r\n this.loadRefs();\r\n\r\n this.listenForScriptChange();\r\n }\r\n\r\n private ensureLoaded(): void {\r\n if (!this._groups.update())\r\n return;\r\n\r\n this._treeOwner = this.getTreeOwner();\r\n this.loadRefs();\r\n }\r\n\r\n private getTreeOwner(): TileTreeOwner {\r\n return getBatchedTileTreeOwner(this._view.iModel, {\r\n spec: this._spec,\r\n script: this._currentScript,\r\n modelGroups: this._groups.guid,\r\n });\r\n }\r\n\r\n private listenForScriptChange(): void {\r\n const onScriptChanged = (newScript: RenderSchedule.Script | undefined) => {\r\n if (!newScript?.requiresBatching)\r\n newScript = undefined;\r\n\r\n const currentScript = this._currentScript;\r\n this._currentScript = newScript;\r\n\r\n if (newScript !== currentScript)\r\n if (!newScript || !currentScript || !newScript.equals(currentScript))\r\n this._groups.setScript(newScript);\r\n };\r\n\r\n let rmListener = this._view.displayStyle.onScheduleScriptChanged.addListener((newScript) => onScriptChanged(newScript));\r\n this._view.onDisplayStyleChanged.addListener((newStyle) => {\r\n rmListener();\r\n onScriptChanged(newStyle.scheduleScript);\r\n rmListener = this._view.displayStyle.onScheduleScriptChanged.addListener((newScript) => onScriptChanged(newScript));\r\n });\r\n }\r\n\r\n private loadRefs(): void {\r\n this._refs.length = 0;\r\n const groups = this._groups.groups;\r\n const args: BatchedTileTreeReferenceArgs = {\r\n models: this._models,\r\n groups,\r\n treeOwner: this._treeOwner,\r\n getCurrentTimePoint: () => this._currentScript ? (this._view.displayStyle.settings.timePoint ?? this._currentScript.duration.low) : 0,\r\n getBackgroundBase: () => this._view.displayStyle.settings.mapImagery.backgroundBase,\r\n getBackgroundLayers: () => this._view.displayStyle.settings.mapImagery.backgroundLayers,\r\n iModel: this._view.iModel,\r\n };\r\n\r\n for (let i = 0; i < groups.length; i++) {\r\n const timeline = groups[i].timeline;\r\n this._refs.push(new BatchedTileTreeReference(args, i, timeline ? AnimationNodeId.Untransformed : undefined));\r\n if (timeline) {\r\n for (const nodeId of timeline.transformBatchIds)\r\n this._refs.push(new BatchedTileTreeReference(args, i, nodeId));\r\n }\r\n }\r\n }\r\n\r\n public *[Symbol.iterator](): Iterator<TileTreeReference> {\r\n this.ensureLoaded();\r\n for (const ref of this._refs)\r\n yield ref;\r\n\r\n for (const ref of this._excludedRefs)\r\n yield ref;\r\n }\r\n\r\n public update(): void {\r\n this._excludedRefs.update();\r\n this._models.setViewedModels(this._view.modelSelector.models);\r\n if (this._onModelSelectorChanged)\r\n this._onModelSelectorChanged();\r\n }\r\n\r\n public attachToViewport(args: AttachToViewportArgs): void {\r\n this._onModelSelectorChanged = () => args.invalidateSymbologyOverrides();\r\n this._excludedRefs.attachToViewport(args);\r\n this._removeSceneInvalidationListener = args.onSceneInvalidated.addListener(() => this._groups.invalidateTransforms());\r\n }\r\n\r\n public detachFromViewport(): void {\r\n this._onModelSelectorChanged = undefined;\r\n this._excludedRefs.detachFromViewport();\r\n\r\n if (this._removeSceneInvalidationListener) {\r\n this._removeSceneInvalidationListener();\r\n this._removeSceneInvalidationListener = undefined;\r\n }\r\n }\r\n\r\n // Collects the TileTreeReferences for the models that need to be drawn to create the planar clip mask.\r\n // For every model used by the mask (modelIds), extend the maskRange by that model's range.\r\n public collectMaskRefs(modelIds: OrderedId64Iterable, maskTreeRefs: TileTreeReference[], maskRange: Range3d): void {\r\n // Use V1 tiles for masking - producing the mask from batched tiles can significantly impact performance.\r\n return collectMaskRefs(this._view, modelIds, undefined, maskTreeRefs, maskRange);\r\n }\r\n\r\n // Returns a list of the models that are NOT in the planar clip mask.\r\n public getModelsNotInMask(_maskModels: OrderedId64Iterable | undefined, _useVisible: boolean): Id64String[] | undefined {\r\n return undefined;\r\n }\r\n\r\n // _view.models\r\n public setDeactivated(): void {\r\n // Used for debugging. Unimplemented here.\r\n }\r\n}\r\n\r\n// A placeholder used by [[ProxySpatialTileTreeReferences]] until asynchronous loading completes.\r\n// It provides a TileTreeOwner that never loads a tile tree.\r\n// This ensures that [ViewState.areAllTileTreesLoaded]($frontend) will not return `true` while we are loading.\r\nclass ProxyTileTreeReference extends TileTreeReference {\r\n private readonly _treeOwner: TileTreeOwner;\r\n\r\n public constructor(iModel: IModelConnection) {\r\n super();\r\n this._treeOwner = {\r\n iModel,\r\n tileTree: undefined,\r\n loadStatus: TileTreeLoadStatus.NotLoaded,\r\n load: () => undefined,\r\n [Symbol.dispose]: () => { },\r\n loadTree: async () => Promise.resolve(undefined),\r\n };\r\n }\r\n\r\n public override get treeOwner() {\r\n return this._treeOwner;\r\n }\r\n\r\n // eslint-disable-next-line @typescript-eslint/naming-convention\r\n public override get _isLoadingComplete() {\r\n return false;\r\n }\r\n}\r\n\r\n// Serves as a placeholder while we asynchronously obtain the base URL for a pre-published tileset (or asynchronously determine\r\n// that no such tileset exists).\r\nclass ProxySpatialTileTreeReferences implements SpatialTileTreeReferences {\r\n // Once async loading completes, all methods will be forwarded to this implementation.\r\n private _impl?: SpatialTileTreeReferences;\r\n private readonly _proxyRef: ProxyTileTreeReference;\r\n // Retained if attachToViewport is called while we are still loading; and reset if detachFromViewport is called while loading.\r\n private _attachArgs?: AttachToViewportArgs;\r\n\r\n public constructor(view: SpatialViewState, getSpec: Promise<BatchedTilesetSpec | null>, nopFallback: boolean = false) {\r\n this._proxyRef = new ProxyTileTreeReference(view.iModel);\r\n getSpec.then((spec: BatchedTilesetSpec | null) => {\r\n if (spec) {\r\n this.setTreeRefs(new BatchedSpatialTileTreeReferences(spec, view));\r\n } else if(nopFallback) {\r\n this.setTreeRefs(new EmptySpatialTileTreeReferences());\r\n }else {\r\n this.setTreeRefs(createSpatialTileTreeReferences(view));\r\n }\r\n }).catch(() => {\r\n if(nopFallback) {\r\n this.setTreeRefs(new EmptySpatialTileTreeReferences());\r\n }else {\r\n this.setTreeRefs(createSpatialTileTreeReferences(view));\r\n }\r\n });\r\n }\r\n\r\n private setTreeRefs(refs: SpatialTileTreeReferences): void {\r\n this._impl = refs;\r\n if (this._attachArgs) {\r\n this._impl.attachToViewport(this._attachArgs);\r\n this._attachArgs.invalidateSymbologyOverrides();\r\n // Force scene invalidation after replacing Proxy with real BatchedTileTree\r\n this._attachArgs.invalidateScene();\r\n this._attachArgs = undefined;\r\n }\r\n }\r\n\r\n public update(): void {\r\n this._impl?.update();\r\n }\r\n\r\n public attachToViewport(args: AttachToViewportArgs): void {\r\n if (this._impl)\r\n this._impl.attachToViewport(args);\r\n else\r\n this._attachArgs = args;\r\n }\r\n\r\n public detachFromViewport(): void {\r\n if (this._impl)\r\n this._impl.detachFromViewport();\r\n else\r\n this._attachArgs = undefined;\r\n }\r\n\r\n public setDeactivated(): void { }\r\n\r\n public *[Symbol.iterator](): Iterator<TileTreeReference> {\r\n if (this._impl) {\r\n for (const ref of this._impl)\r\n yield ref;\r\n } else {\r\n yield this._proxyRef;\r\n }\r\n }\r\n\r\n public collectMaskRefs(modelIds: OrderedId64Iterable, maskTreeRefs: TileTreeReference[], maskRange: Range3d): void {\r\n this._impl?.collectMaskRefs(modelIds, maskTreeRefs, maskRange);\r\n }\r\n\r\n public getModelsNotInMask(maskModels: OrderedId64Iterable | undefined, useVisible: boolean): Id64String[] | undefined {\r\n if (this._impl)\r\n return this._impl.getModelsNotInMask(maskModels, useVisible);\r\n else\r\n return undefined;\r\n }\r\n}\r\n\r\nconst iModelToTilesetSpec = new Map<IModelConnection, BatchedTilesetSpec | null | Promise<BatchedTilesetSpec | null>>();\r\n\r\nasync function fetchTilesetSpec(iModel: IModelConnection, computeBaseUrl: ComputeSpatialTilesetBaseUrl): Promise<BatchedTilesetSpec | null> {\r\n try {\r\n const baseUrl = await computeBaseUrl(iModel);\r\n if (undefined === baseUrl)\r\n return null;\r\n\r\n const url = new URL(\"tileset.json\", baseUrl);\r\n url.search = baseUrl.search;\r\n const response = await fetch(url.toString());\r\n const json = await response.json();\r\n return BatchedTilesetSpec.create(baseUrl, json);\r\n } catch (err) {\r\n Logger.logException(loggerCategory, err);\r\n return null;\r\n }\r\n}\r\n\r\nclass EmptySpatialTileTreeReferences implements SpatialTileTreeReferences {\r\n public update(): void {}\r\n\r\n public setDeactivated(_modelIds: string | string[] | undefined, _deactivated: boolean | undefined, _refs: \"all\" | \"animated\" | \"primary\" | \"section\" | number[]): void {}\r\n\r\n public attachToViewport(_args: Viewport): void {}\r\n\r\n public detachFromViewport(): void {}\r\n\r\n public collectMaskRefs(_modelIds: OrderedId64Iterable, _maskTreeRefs: TileTreeReference[]): void {};\r\n\r\n public getModelsNotInMask(_maskModels: OrderedId64Iterable | undefined, _useVisible: boolean): string[] | undefined {\r\n return undefined;\r\n }\r\n\r\n public *[Symbol.iterator](): Iterator<TileTreeReference> {}\r\n}\r\n\r\n/** @internal */\r\nexport function createBatchedSpatialTileTreeReferences(view: SpatialViewState, computeBaseUrl: ComputeSpatialTilesetBaseUrl, nopFallback: boolean = false): SpatialTileTreeReferences {\r\n const iModel = view.iModel;\r\n let entry = iModelToTilesetSpec.get(iModel);\r\n if (undefined === entry) {\r\n const promise = entry = fetchTilesetSpec(iModel, computeBaseUrl);\r\n iModelToTilesetSpec.set(iModel, entry);\r\n iModel.onClose.addOnce(() => iModelToTilesetSpec.delete(iModel));\r\n\r\n promise.then((spec: BatchedTilesetSpec | null) => {\r\n if (iModelToTilesetSpec.has(iModel))\r\n iModelToTilesetSpec.set(iModel, spec);\r\n }).catch(() => {\r\n if (iModelToTilesetSpec.has(iModel))\r\n iModelToTilesetSpec.set(iModel, null);\r\n });\r\n }\r\n\r\n if (null === entry) {\r\n // No tileset could be obtained for this iModel - use empty tile tree if requested.\r\n if (nopFallback) {\r\n return new EmptySpatialTileTreeReferences();\r\n }\r\n\r\n // No tileset could be obtained for this iModel - use default tile generation instead.\r\n return createSpatialTileTreeReferences(view);\r\n }\r\n\r\n if (entry instanceof Promise)\r\n return new ProxySpatialTileTreeReferences(view, entry, nopFallback);\r\n\r\n return new BatchedSpatialTileTreeReferences(entry, view);\r\n}\r\n\r\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BatchedTile.js","sourceRoot":"","sources":["../../src/BatchedTile.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\nimport { assert, BeTimePoint, ByteStream, Logger } from \"@itwin/core-bentley\";\nimport { ColorDef, Tileset3dSchema } from \"@itwin/core-common\";\nimport {\n GraphicBranch, GraphicBuilder, IModelApp, RealityTileLoader, RenderSystem, Tile, TileBoundingBoxes, TileContent,\n TileDrawArgs, TileParams, TileRequest, TileRequestChannel, TileTreeLoadStatus, TileUser, TileVisibility, Viewport,\n} from \"@itwin/core-frontend\";\nimport { Transform } from \"@itwin/core-geometry\";\nimport { BatchedTileTree } from \"./BatchedTileTree.js\";\nimport { frontendTilesOptions } from \"./FrontendTiles.js\";\nimport { IndexedDBCache, LocalCache, PassThroughCache } from \"./IndexedDBCache.js\";\nimport { loggerCategory } from \"./LoggerCategory.js\";\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 private readonly _localCache: LocalCache;\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 this._localCache = frontendTilesOptions.useIndexedDBCache ? new IndexedDBCache(\"BatchedTileCache\") : new PassThroughCache();\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\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 this._localCache.fetch(url.pathname.toString(), fetch, url.toString());\n return response;\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 modelGroups = this.batchedTree.modelGroups;\n\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 // Don't waste time attempting to split based on model groupings if all models are in the same group.\n modelGroups: modelGroups && modelGroups.length > 1 ? modelGroups : undefined,\n tileData: {\n ecefTransform: this.tree.iModel.ecefLocation?.getTransform() ?? Transform.createIdentity(),\n range: this.range,\n layerClassifiers: this.tree.layerHandler?.layerClassifiers,\n },\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
|
+
{"version":3,"file":"BatchedTile.js","sourceRoot":"","sources":["../../src/BatchedTile.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\r\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\r\n* See LICENSE.md in the project root for license terms and full copyright notice.\r\n*--------------------------------------------------------------------------------------------*/\r\n\r\nimport { assert, BeTimePoint, ByteStream, Logger } from \"@itwin/core-bentley\";\r\nimport { ColorDef, Tileset3dSchema } from \"@itwin/core-common\";\r\nimport {\r\n GraphicBranch, GraphicBuilder, IModelApp, RealityTileLoader, RenderSystem, Tile, TileBoundingBoxes, TileContent,\r\n TileDrawArgs, TileParams, TileRequest, TileRequestChannel, TileTreeLoadStatus, TileUser, TileVisibility, Viewport,\r\n} from \"@itwin/core-frontend\";\r\nimport { Transform } from \"@itwin/core-geometry\";\r\nimport { BatchedTileTree } from \"./BatchedTileTree.js\";\r\nimport { frontendTilesOptions } from \"./FrontendTiles.js\";\r\nimport { IndexedDBCache, LocalCache, PassThroughCache } from \"./IndexedDBCache.js\";\r\nimport { loggerCategory } from \"./LoggerCategory.js\";\r\n\r\n/** @internal */\r\nexport interface BatchedTileParams extends TileParams {\r\n childrenProps: Tileset3dSchema.Tile[] | undefined;\r\n /** See BatchedTile.transformToRoot. */\r\n transformToRoot: Transform | undefined;\r\n}\r\n\r\nlet channel: TileRequestChannel | undefined;\r\n\r\n/** @internal */\r\nexport class BatchedTile extends Tile {\r\n private readonly _childrenProps?: Tileset3dSchema.Tile[];\r\n private readonly _unskippable: boolean;\r\n /** Transform from the tile's local coordinate system to that of the tileset. */\r\n public readonly transformToRoot?: Transform;\r\n private readonly _localCache: LocalCache;\r\n\r\n public get batchedTree(): BatchedTileTree {\r\n return this.tree as BatchedTileTree;\r\n }\r\n\r\n public constructor(params: BatchedTileParams, tree: BatchedTileTree) {\r\n super(params, tree);\r\n\r\n // The root tile never has content, so it doesn't count toward max levels to skip.\r\n this._unskippable = 0 === (this.depth % frontendTilesOptions.maxLevelsToSkip);\r\n\r\n if (params.childrenProps?.length)\r\n this._childrenProps = params.childrenProps;\r\n\r\n if (!this.contentId) {\r\n this.setIsReady();\r\n // mark \"undisplayable\"\r\n this._maximumSize = 0;\r\n }\r\n\r\n this._localCache = frontendTilesOptions.useIndexedDBCache ? new IndexedDBCache(\"BatchedTileCache\") : new PassThroughCache();\r\n\r\n if (!params.transformToRoot)\r\n return;\r\n\r\n this.transformToRoot = params.transformToRoot;\r\n this.boundingSphere.transformBy(this.transformToRoot, this.boundingSphere);\r\n this.transformToRoot.multiplyRange(this.range, this.range);\r\n if (this._contentRange)\r\n this.transformToRoot.multiplyRange(this._contentRange, this._contentRange);\r\n\r\n }\r\n\r\n private get _batchedChildren(): BatchedTile[] | undefined {\r\n return this.children as BatchedTile[] | undefined;\r\n }\r\n\r\n public override computeLoadPriority(viewports: Iterable<Viewport>, _users: Iterable<TileUser>): number {\r\n // Prioritize tiles closer to camera and center of attention (zoom point or screen center).\r\n return RealityTileLoader.computeTileLocationPriority(this, viewports, this.tree.iModelTransform);\r\n }\r\n\r\n public selectTiles(selected: Set<BatchedTile>, args: TileDrawArgs, closestDisplayableAncestor: BatchedTile | undefined): void {\r\n const vis = this.computeVisibility(args);\r\n if (TileVisibility.OutsideFrustum === vis)\r\n return;\r\n\r\n if (this._unskippable) {\r\n // Prevent this tile's content from being unloaded due to memory pressure.\r\n args.touchedTiles.add(this);\r\n args.markUsed(this);\r\n }\r\n\r\n closestDisplayableAncestor = this.hasGraphics ? this : closestDisplayableAncestor;\r\n if (TileVisibility.TooCoarse === vis && (this.isReady || !this._unskippable)) {\r\n args.markUsed(this);\r\n args.markReady(this);\r\n const childrenLoadStatus = this.loadChildren();\r\n if (TileTreeLoadStatus.Loading === childrenLoadStatus)\r\n args.markChildrenLoading();\r\n\r\n const children = this._batchedChildren;\r\n if (children) {\r\n for (const child of children)\r\n child.selectTiles(selected, args, closestDisplayableAncestor);\r\n\r\n return;\r\n }\r\n }\r\n\r\n // We want to display this tile. Request its content if not already loaded.\r\n if ((TileVisibility.Visible === vis || this._unskippable) && !this.isReady)\r\n args.insertMissing(this);\r\n\r\n if (closestDisplayableAncestor)\r\n selected.add(closestDisplayableAncestor);\r\n }\r\n\r\n protected override _loadChildren(resolve: (children: Tile[] | undefined) => void, reject: (error: Error) => void): void {\r\n let children: BatchedTile[] | undefined;\r\n if (this._childrenProps) {\r\n try {\r\n for (const childProps of this._childrenProps) {\r\n const params = this.batchedTree.reader.readTileParams(childProps, this);\r\n const child = new BatchedTile(params, this.batchedTree);\r\n children = children ?? [];\r\n children.push(child);\r\n }\r\n } catch (err) {\r\n Logger.logException(loggerCategory, err);\r\n children = undefined;\r\n if (err instanceof Error)\r\n reject(err);\r\n }\r\n }\r\n\r\n resolve(children);\r\n }\r\n\r\n public override get channel(): TileRequestChannel {\r\n if (!channel) {\r\n channel = new TileRequestChannel(\"itwinjs-batched-models\", 20);\r\n IModelApp.tileAdmin.channels.add(channel);\r\n }\r\n\r\n return channel;\r\n }\r\n\r\n public override async requestContent(_isCanceled: () => boolean): Promise<TileRequest.Response> {\r\n const url = new URL(this.contentId, this.batchedTree.reader.baseUrl);\r\n url.search = this.batchedTree.reader.baseUrl.search;\r\n const response = await this._localCache.fetch(url.pathname.toString(), fetch, url.toString());\r\n return response;\r\n }\r\n\r\n public override async readContent(data: TileRequest.ResponseData, system: RenderSystem, isCanceled?: () => boolean): Promise<TileContent> {\r\n assert(data instanceof Uint8Array);\r\n if (!(data instanceof Uint8Array))\r\n return { };\r\n\r\n try {\r\n const modelGroups = this.batchedTree.modelGroups;\r\n\r\n const content = await this.batchedTree.decoder.decode({\r\n stream: ByteStream.fromUint8Array(data),\r\n options: { tileId: this.contentId },\r\n system,\r\n isCanceled,\r\n isLeaf: this.isLeaf,\r\n // Don't waste time attempting to split based on model groupings if all models are in the same group.\r\n modelGroups: modelGroups && modelGroups.length > 1 ? modelGroups : undefined,\r\n tileData: {\r\n ecefTransform: this.tree.iModel.ecefLocation?.getTransform() ?? Transform.createIdentity(),\r\n range: this.range,\r\n layerClassifiers: this.tree.layerHandler?.layerClassifiers,\r\n },\r\n });\r\n\r\n if (this.transformToRoot) {\r\n if (content.graphic) {\r\n const branch = new GraphicBranch(true);\r\n branch.add(content.graphic);\r\n content.graphic = system.createBranch(branch, this.transformToRoot);\r\n }\r\n\r\n if (content.contentRange)\r\n content.contentRange = this.transformToRoot.multiplyRange(content.contentRange);\r\n }\r\n\r\n return content;\r\n } catch {\r\n return { isLeaf: true };\r\n }\r\n }\r\n\r\n protected override addRangeGraphic(builder: GraphicBuilder, type: TileBoundingBoxes): void {\r\n if (TileBoundingBoxes.ChildVolumes !== type) {\r\n super.addRangeGraphic(builder, type);\r\n return;\r\n }\r\n\r\n builder.setSymbology(ColorDef.green, ColorDef.green, 2);\r\n builder.addRangeBox(this.range);\r\n\r\n this.loadChildren();\r\n const children = this.children;\r\n if (!children)\r\n return;\r\n\r\n builder.setSymbology(ColorDef.blue, ColorDef.blue.withTransparency(0xdf), 1);\r\n for (const child of children) {\r\n const range = child.range;\r\n builder.addRangeBox(range);\r\n builder.addRangeBox(range, true);\r\n }\r\n }\r\n\r\n public prune(olderThan: BeTimePoint): void {\r\n const children = this._batchedChildren;\r\n if (!children)\r\n return;\r\n\r\n if (this.usageMarker.isExpired(olderThan)) {\r\n this.disposeChildren();\r\n } else {\r\n for (const child of children)\r\n child.prune(olderThan);\r\n }\r\n }\r\n}\r\n"]}
|