@itwin/core-frontend 3.0.0-dev.154 → 3.0.0-dev.155

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"MapTileTree.js","sourceRoot":"","sources":["../../../../src/tile/map/MapTileTree.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/** @packageDocumentation\r\n * @module Tiles\r\n */\r\n\r\nimport { assert, compareBooleans, compareNumbers, compareStrings, compareStringsOrUndefined, CompressedId64Set, Id64String } from \"@itwin/core-bentley\";\r\nimport {\r\n Angle, AngleSweep, Constant, Ellipsoid, EllipsoidPatch, Point3d, Range1d, Range3d, Ray3d, Transform, Vector3d, XYZProps,\r\n} from \"@itwin/core-geometry\";\r\nimport {\r\n BackgroundMapSettings, BaseLayerSettings, Cartographic, ColorDef, FeatureAppearance, GeoCoordStatus, GlobeMode, MapLayerSettings, PlanarClipMaskPriority, TerrainHeightOriginMode,\r\n TerrainProviderName,\r\n} from \"@itwin/core-common\";\r\nimport { ApproximateTerrainHeights } from \"../../ApproximateTerrainHeights\";\r\nimport { TerrainDisplayOverrides } from \"../../DisplayStyleState\";\r\nimport { HitDetail } from \"../../HitDetail\";\r\nimport { IModelApp } from \"../../IModelApp\";\r\nimport { IModelConnection } from \"../../IModelConnection\";\r\nimport { PlanarClipMaskState } from \"../../PlanarClipMaskState\";\r\nimport { FeatureSymbology } from \"../../render/FeatureSymbology\";\r\nimport { SceneContext } from \"../../ViewContext\";\r\nimport { ScreenViewport } from \"../../Viewport\";\r\nimport {\r\n BingElevationProvider,\r\n createDefaultViewFlagOverrides,\r\n DisclosedTileTreeSet,\r\n EllipsoidTerrainProvider,\r\n getCesiumTerrainProvider,\r\n ImageryMapLayerTreeReference,\r\n ImageryMapTileTree,\r\n MapCartoRectangle,\r\n MapTile,\r\n MapTileLoader,\r\n MapTilingScheme,\r\n PlanarTilePatch,\r\n QuadId,\r\n RealityTileDrawArgs,\r\n RealityTileTree,\r\n RealityTileTreeParams,\r\n Tile,\r\n TileDrawArgs,\r\n TileLoadPriority,\r\n TileParams,\r\n TileTree,\r\n TileTreeLoadStatus,\r\n TileTreeOwner,\r\n TileTreeReference,\r\n TileTreeSupplier,\r\n UpsampledMapTile,\r\n WebMercatorTilingScheme,\r\n} from \"../internal\";\r\n\r\nconst scratchPoint = Point3d.create();\r\nconst scratchCorners = [Point3d.createZero(), Point3d.createZero(), Point3d.createZero(), Point3d.createZero(), Point3d.createZero(), Point3d.createZero(), Point3d.createZero(), Point3d.createZero()];\r\nconst scratchCorner = Point3d.createZero();\r\nconst scratchZNormal = Vector3d.create(0, 0, 1);\r\n/** @internal */\r\nexport class MapTileTree extends RealityTileTree {\r\n private _mercatorFractionToDb: Transform;\r\n public earthEllipsoid: Ellipsoid;\r\n public minEarthEllipsoid: Ellipsoid;\r\n public maxEarthEllipsoid: Ellipsoid;\r\n public globeMode: GlobeMode;\r\n public globeOrigin: Point3d;\r\n\r\n private _mercatorTilingScheme: MapTilingScheme;\r\n public useDepthBuffer: boolean;\r\n public isOverlay: boolean;\r\n public terrainExaggeration: number;\r\n public baseColor?: ColorDef;\r\n public baseTransparent: boolean;\r\n public mapTransparent: boolean;\r\n\r\n constructor(params: RealityTileTreeParams, public ecefToDb: Transform, public bimElevationBias: number, public geodeticOffset: number, public sourceTilingScheme: MapTilingScheme, id: MapTreeId) {\r\n super(params);\r\n this._mercatorTilingScheme = new WebMercatorTilingScheme();\r\n this._mercatorFractionToDb = this._mercatorTilingScheme.computeMercatorFractionToDb(ecefToDb, bimElevationBias, params.iModel, id.applyTerrain);\r\n const quadId = new QuadId(sourceTilingScheme.rootLevel, 0, 0);\r\n this.globeOrigin = this.ecefToDb.getOrigin().clone();\r\n this.earthEllipsoid = Ellipsoid.createCenterMatrixRadii(this.globeOrigin, this.ecefToDb.matrix, Constant.earthRadiusWGS84.equator, Constant.earthRadiusWGS84.equator, Constant.earthRadiusWGS84.polar);\r\n const globalHeightRange = id.applyTerrain ? ApproximateTerrainHeights.instance.globalHeightRange : Range1d.createXX(0, 0);\r\n const globalRectangle = MapCartoRectangle.create();\r\n\r\n this.globeMode = id.globeMode;\r\n this.isOverlay = id.isOverlay;\r\n this.useDepthBuffer = id.useDepthBuffer;\r\n this.terrainExaggeration = id.terrainExaggeration;\r\n this.baseColor = id.baseColor;\r\n this.baseTransparent = id.baseTransparent;\r\n this.mapTransparent = id.mapTransparent;\r\n if (id.applyTerrain) {\r\n this.minEarthEllipsoid = Ellipsoid.createCenterMatrixRadii(this.globeOrigin, this.ecefToDb.matrix, Constant.earthRadiusWGS84.equator + globalHeightRange.low, Constant.earthRadiusWGS84.equator + globalHeightRange.low, Constant.earthRadiusWGS84.polar + globalHeightRange.low);\r\n this.maxEarthEllipsoid = Ellipsoid.createCenterMatrixRadii(this.globeOrigin, this.ecefToDb.matrix, Constant.earthRadiusWGS84.equator + globalHeightRange.high, Constant.earthRadiusWGS84.equator + globalHeightRange.high, Constant.earthRadiusWGS84.polar + globalHeightRange.high);\r\n } else {\r\n this.minEarthEllipsoid = this.earthEllipsoid;\r\n this.maxEarthEllipsoid = this.earthEllipsoid;\r\n }\r\n\r\n const rootPatch = EllipsoidPatch.createCapture(this.maxEarthEllipsoid, AngleSweep.createStartSweepRadians(0, Angle.pi2Radians), AngleSweep.createStartSweepRadians(-Angle.piOver2Radians, Angle.piRadians));\r\n let range;\r\n if (this.globeMode === GlobeMode.Ellipsoid) {\r\n range = rootPatch.range();\r\n } else {\r\n const corners = this.getFractionalTileCorners(quadId);\r\n this._mercatorFractionToDb.multiplyPoint3dArrayInPlace(corners);\r\n range = Range3d.createArray(MapTile.computeRangeCorners(corners, Vector3d.create(0, 0, 1), 0, scratchCorners, globalHeightRange));\r\n }\r\n this._rootTile = this.createGlobeChild({ contentId: quadId.contentId, maximumSize: 0, range }, quadId, range.corners(), globalRectangle, rootPatch, undefined);\r\n\r\n }\r\n\r\n // If we are not depth buffering we force parents and exclusive to false to cause the map tiles to be sorted by depth so that painters algorithm will approximate correct depth display.\r\n public override get parentsAndChildrenExclusive() { return this.useDepthBuffer ? this.loader.parentsAndChildrenExclusive : false; }\r\n\r\n public tileFromQuadId(quadId: QuadId): MapTile | undefined {\r\n return (this._rootTile as MapTile).tileFromQuadId(quadId);\r\n }\r\n\r\n public imageryTrees: ImageryMapTileTree[] = [];\r\n private _layerSettings = new Map<Id64String, MapLayerSettings>();\r\n\r\n public addImageryLayer(tree: ImageryMapTileTree, settings: MapLayerSettings) {\r\n const maxLayers = IModelApp.renderSystem.maxRealityImageryLayers;\r\n if (this.imageryTrees.length < maxLayers) {\r\n this.imageryTrees.push(tree);\r\n this._layerSettings.set(tree.modelId, settings);\r\n } else {\r\n // TBD -- Notify user that layers is being ignored?\r\n }\r\n }\r\n public clearImageryLayers() {\r\n this.imageryTrees.length = 0;\r\n this._layerSettings.clear();\r\n }\r\n public override get isTransparent() {\r\n return this.mapTransparent || this.baseTransparent;\r\n }\r\n\r\n public override get maxDepth() {\r\n let maxDepth = this.loader.maxDepth;\r\n this.imageryTrees?.forEach((imageryTree) => maxDepth = Math.max(maxDepth, imageryTree.maxDepth));\r\n\r\n return maxDepth;\r\n }\r\n public createPlanarChild(params: TileParams, quadId: QuadId, corners: Point3d[], normal: Vector3d, rectangle: MapCartoRectangle, chordHeight: number, heightRange?: Range1d): MapTile {\r\n const patch = new PlanarTilePatch(corners, normal, chordHeight);\r\n const cornerNormals = this.getCornerRays(rectangle);\r\n const ctor = this.mapLoader.isTileAvailable(quadId) ? MapTile : UpsampledMapTile;\r\n return new ctor(params, this, quadId, patch, rectangle, heightRange, cornerNormals);\r\n }\r\n\r\n public createGlobeChild(params: TileParams, quadId: QuadId, _rangeCorners: Point3d[], rectangle: MapCartoRectangle, ellipsoidPatch: EllipsoidPatch, heightRange?: Range1d): MapTile {\r\n return new MapTile(params, this, quadId, ellipsoidPatch, rectangle, heightRange, this.getCornerRays(rectangle));\r\n }\r\n\r\n public getChildHeightRange(quadId: QuadId, rectangle: MapCartoRectangle, parent: MapTile): Range1d | undefined {\r\n return this.mapLoader.getChildHeightRange(quadId, rectangle, parent);\r\n }\r\n\r\n public clearLayers() {\r\n (this._rootTile as MapTile).clearLayers();\r\n }\r\n\r\n public static minReprojectionDepth = 8; // Reprojection does not work with very large tiles so just do linear transform.\r\n public static maxGlobeDisplayDepth = 8;\r\n public static minDisplayableDepth = 3;\r\n public get mapLoader() { return this.loader as MapTileLoader; }\r\n public override getBaseRealityDepth(sceneContext: SceneContext) {\r\n // If the view has ever had global scope then preload low level (global) tiles.\r\n return (sceneContext.viewport.view.maxGlobalScopeFactor > 1) ? MapTileTree.minDisplayableDepth : -1;\r\n }\r\n\r\n public doCreateGlobeChildren(tile: Tile): boolean {\r\n if (this.globeMode !== GlobeMode.Ellipsoid)\r\n return false;\r\n\r\n const childDepth = tile.depth + 1;\r\n if (childDepth < MapTileTree.maxGlobeDisplayDepth) // If the depth is too low (tile is too large) display as globe.\r\n return true;\r\n\r\n return false; // Display as globe if more than 100 KM from project.\r\n }\r\n public override doReprojectChildren(tile: Tile): boolean {\r\n if (this._gcsConverter === undefined)\r\n return false;\r\n\r\n const childDepth = tile.depth + 1;\r\n if (childDepth < MapTileTree.minReprojectionDepth) // If the depth is too low (tile is too large) omit reprojection.\r\n return false;\r\n\r\n return this.cartesianRange.intersectsRange(tile.range);\r\n }\r\n\r\n public getCornerRays(rectangle: MapCartoRectangle): Ray3d[] | undefined {\r\n const rays = new Array<Ray3d>();\r\n if (this.globeMode === GlobeMode.Ellipsoid) {\r\n rays.push(this.earthEllipsoid.radiansToUnitNormalRay(rectangle.low.x, Cartographic.parametricLatitudeFromGeodeticLatitude(rectangle.high.y))!);\r\n rays.push(this.earthEllipsoid.radiansToUnitNormalRay(rectangle.high.x, Cartographic.parametricLatitudeFromGeodeticLatitude(rectangle.high.y))!);\r\n rays.push(this.earthEllipsoid.radiansToUnitNormalRay(rectangle.low.x, Cartographic.parametricLatitudeFromGeodeticLatitude(rectangle.low.y))!);\r\n rays.push(this.earthEllipsoid.radiansToUnitNormalRay(rectangle.high.x, Cartographic.parametricLatitudeFromGeodeticLatitude(rectangle.low.y))!);\r\n } else {\r\n const mercatorFractionRange = rectangle.getTileFractionRange(this._mercatorTilingScheme);\r\n rays.push(Ray3d.createCapture(this._mercatorFractionToDb.multiplyXYZ(mercatorFractionRange.low.x, mercatorFractionRange.high.y), scratchZNormal));\r\n rays.push(Ray3d.createCapture(this._mercatorFractionToDb.multiplyXYZ(mercatorFractionRange.high.x, mercatorFractionRange.high.y), scratchZNormal));\r\n rays.push(Ray3d.createCapture(this._mercatorFractionToDb.multiplyXYZ(mercatorFractionRange.low.x, mercatorFractionRange.low.y), scratchZNormal));\r\n rays.push(Ray3d.createCapture(this._mercatorFractionToDb.multiplyXYZ(mercatorFractionRange.high.x, mercatorFractionRange.low.y), scratchZNormal));\r\n }\r\n return rays;\r\n }\r\n public pointAboveEllipsoid(point: Point3d): boolean {\r\n return this.earthEllipsoid.worldToLocal(point, scratchPoint)!.magnitude() > 1;\r\n }\r\n\r\n private getMercatorFractionChildGridPoints(tile: MapTile, columnCount: number, rowCount: number): Point3d[] {\r\n const gridPoints = [];\r\n const quadId = tile.quadId;\r\n const deltaX = 1.0 / columnCount, deltaY = 1.0 / rowCount;\r\n for (let row = 0; row <= rowCount; row++) {\r\n for (let column = 0; column <= columnCount; column++) {\r\n const xFraction = this.sourceTilingScheme.tileXToFraction(quadId.column + column * deltaX, quadId.level);\r\n const yFraction = this.sourceTilingScheme.tileYToFraction(quadId.row + row * deltaY, quadId.level);\r\n\r\n gridPoints.push(Point3d.create(xFraction, yFraction, 0));\r\n }\r\n }\r\n // If not mercator already need to remap latitude...\r\n if (!(this.sourceTilingScheme instanceof WebMercatorTilingScheme))\r\n for (const gridPoint of gridPoints)\r\n gridPoint.y = this._mercatorTilingScheme.latitudeToYFraction(this.sourceTilingScheme.yFractionToLatitude(gridPoint.y));\r\n\r\n return gridPoints;\r\n }\r\n\r\n private getChildCornersFromGridPoints(gridPoints: Point3d[], columnCount: number, rowCount: number) {\r\n const childCorners = new Array<Point3d[]>();\r\n for (let row = 0; row < rowCount; row++) {\r\n for (let column = 0; column < columnCount; column++) {\r\n const index0 = column + row * (columnCount + 1);\r\n const index1 = index0 + (columnCount + 1);\r\n childCorners.push([gridPoints[index0], gridPoints[index0 + 1], gridPoints[index1], gridPoints[index1 + 1]]);\r\n }\r\n }\r\n return childCorners;\r\n }\r\n\r\n public getCachedReprojectedPoints(gridPoints: Point3d[]): (Point3d | undefined)[] | undefined {\r\n const requestProps = [];\r\n for (const gridPoint of gridPoints)\r\n requestProps.push({\r\n x: this._mercatorTilingScheme.xFractionToLongitude(gridPoint.x) * Angle.degreesPerRadian,\r\n y: this._mercatorTilingScheme.yFractionToLatitude(gridPoint.y) * Angle.degreesPerRadian,\r\n z: this.bimElevationBias,\r\n });\r\n\r\n const iModelCoordinates = this._gcsConverter!.getCachedIModelCoordinatesFromGeoCoordinates(requestProps);\r\n\r\n if (iModelCoordinates.missing)\r\n return undefined;\r\n\r\n return iModelCoordinates.result.map((result) => !result || result.s ? undefined : Point3d.fromJSON(result.p));\r\n }\r\n\r\n // Minimize reprojection requests by requesting this corners tile and a grid that will include all points for 4 levels of descendants.\r\n // This greatly reduces the number of reprojection requests which currently require a roundtrip through the backend.\r\n public async loadReprojectionCache(tile: MapTile): Promise<void> {\r\n const quadId = tile.quadId;\r\n const xRange = Range1d.createXX(this.sourceTilingScheme.tileXToFraction(quadId.column, quadId.level), this.sourceTilingScheme.tileXToFraction(quadId.column + 1, quadId.level));\r\n const yRange = Range1d.createXX(this.sourceTilingScheme.tileYToFraction(quadId.row, quadId.level), this.sourceTilingScheme.tileYToFraction(quadId.row + 1, quadId.level));\r\n const cacheDepth = 4, cacheDimension = 2 ** cacheDepth;\r\n const delta = 1.0 / cacheDimension;\r\n const requestProps = [];\r\n\r\n for (let row = 0; row <= cacheDimension; row++) {\r\n for (let column = 0; column <= cacheDimension; column++) {\r\n let yFraction = yRange.fractionToPoint(row * delta);\r\n if (!(this.sourceTilingScheme instanceof WebMercatorTilingScheme))\r\n yFraction = this._mercatorTilingScheme.latitudeToYFraction(this.sourceTilingScheme.yFractionToLatitude(yFraction));\r\n requestProps.push({\r\n x: this._mercatorTilingScheme.xFractionToLongitude(xRange.fractionToPoint(column * delta)) * Angle.degreesPerRadian,\r\n y: this._mercatorTilingScheme.yFractionToLatitude(yFraction) * Angle.degreesPerRadian,\r\n z: this.bimElevationBias,\r\n });\r\n }\r\n }\r\n\r\n await this._gcsConverter!.getIModelCoordinatesFromGeoCoordinates(requestProps);\r\n }\r\n\r\n private static _scratchCarto = Cartographic.createZero();\r\n\r\n // Get the corners for planar children -- This generally will resolve immediately, but may require an asynchronous request for reprojecting the corners.\r\n public getPlanarChildCorners(tile: MapTile, columnCount: number, rowCount: number, resolve: (childCorners: Point3d[][]) => void) {\r\n const resolveCorners = (points: Point3d[], reprojected: (Point3d | undefined)[] | undefined = undefined) => {\r\n for (let i = 0; i < points.length; i++) {\r\n const gridPoint = points[i];\r\n this._mercatorFractionToDb.multiplyPoint3d(gridPoint, scratchCorner);\r\n if (this.globeMode !== GlobeMode.Ellipsoid || this.cartesianRange.containsPoint(scratchCorner)) {\r\n if (reprojected !== undefined && reprojected[i] !== undefined)\r\n reprojected[i]!.clone(gridPoint);\r\n else\r\n scratchCorner.clone(gridPoint);\r\n } else {\r\n this._mercatorTilingScheme.fractionToCartographic(gridPoint.x, gridPoint.y, MapTileTree._scratchCarto);\r\n this.earthEllipsoid.radiansToPoint(MapTileTree._scratchCarto.longitude, Cartographic.parametricLatitudeFromGeodeticLatitude(MapTileTree._scratchCarto.latitude), gridPoint);\r\n const cartesianDistance = this.cartesianRange.distanceToPoint(scratchCorner);\r\n if (cartesianDistance < this.cartesianTransitionDistance)\r\n scratchCorner.interpolate(cartesianDistance / this.cartesianTransitionDistance, gridPoint, gridPoint);\r\n }\r\n }\r\n resolve(this.getChildCornersFromGridPoints(points, columnCount, rowCount));\r\n };\r\n\r\n let reprojectedPoints: (Point3d | undefined)[] | undefined;\r\n const gridPoints = this.getMercatorFractionChildGridPoints(tile, columnCount, rowCount);\r\n if (this.doReprojectChildren(tile)) {\r\n reprojectedPoints = this.getCachedReprojectedPoints(gridPoints);\r\n if (reprojectedPoints) {\r\n // If the reprojected corners are in the cache, resolve immediately.\r\n resolveCorners(gridPoints, reprojectedPoints);\r\n } else {\r\n // If the reprojected corners are not in cache request them - but also request reprojection of a grid that will include descendent corners to ensure they can\r\n // be reloaded without expensive reprojection requests.\r\n this.loadReprojectionCache(tile).then(() => {\r\n const reprojected = this.getCachedReprojectedPoints(gridPoints);\r\n assert(reprojected !== undefined); // We just cached them... they better be there now.\r\n resolveCorners(gridPoints, reprojected);\r\n }).catch((_error: Error) => {\r\n resolveCorners(gridPoints);\r\n });\r\n }\r\n } else {\r\n resolveCorners(gridPoints);\r\n }\r\n }\r\n\r\n public getFractionalTileCorners(quadId: QuadId): Point3d[] {\r\n const corners: Point3d[] = [];\r\n corners.push(Point3d.create(this.sourceTilingScheme.tileXToFraction(quadId.column, quadId.level), this.sourceTilingScheme.tileYToFraction(quadId.row, quadId.level), 0.0));\r\n corners.push(Point3d.create(this.sourceTilingScheme.tileXToFraction(quadId.column + 1, quadId.level), this.sourceTilingScheme.tileYToFraction(quadId.row, quadId.level), 0.0));\r\n corners.push(Point3d.create(this.sourceTilingScheme.tileXToFraction(quadId.column, quadId.level), this.sourceTilingScheme.tileYToFraction(quadId.row + 1, quadId.level), 0.0));\r\n corners.push(Point3d.create(this.sourceTilingScheme.tileXToFraction(quadId.column + 1, quadId.level), this.sourceTilingScheme.tileYToFraction(quadId.row + 1, quadId.level), 0.0));\r\n return corners;\r\n }\r\n\r\n public getTileRectangle(quadId: QuadId): MapCartoRectangle {\r\n return this.sourceTilingScheme.tileXYToRectangle(quadId.column, quadId.row, quadId.level);\r\n }\r\n public getLayerIndex(imageryTreeId: Id64String) {\r\n for (let index = 0; index < this.imageryTrees.length; index++)\r\n if (imageryTreeId === this.imageryTrees[index].modelId)\r\n return index;\r\n\r\n return -1;\r\n }\r\n\r\n public getLayerTransparency(imageryTreeId: Id64String): number {\r\n const layerSettings = this._layerSettings.get(imageryTreeId);\r\n assert(undefined !== layerSettings);\r\n return undefined === layerSettings || !layerSettings.transparency ? 0.0 : layerSettings.transparency;\r\n }\r\n}\r\n\r\ninterface MapTreeId {\r\n viewportId: number;\r\n applyTerrain: boolean;\r\n terrainProviderName: TerrainProviderName;\r\n terrainHeightOrigin: number;\r\n terrainHeightOriginMode: number;\r\n terrainExaggeration: number;\r\n mapGroundBias: number;\r\n wantSkirts: boolean;\r\n wantNormals: boolean;\r\n globeMode: GlobeMode;\r\n useDepthBuffer: boolean;\r\n isOverlay: boolean;\r\n baseColor?: ColorDef;\r\n baseTransparent: boolean;\r\n mapTransparent: boolean;\r\n maskModelIds?: string;\r\n}\r\n\r\n/** @internal */\r\nclass MapTileTreeProps implements RealityTileTreeParams {\r\n public id: string;\r\n public modelId: string;\r\n public location = Transform.createIdentity();\r\n public yAxisUp = true;\r\n public is3d = true;\r\n public rootTile = { contentId: \"\", range: Range3d.createNull(), maximumSize: 0 };\r\n public loader: MapTileLoader;\r\n public iModel: IModelConnection;\r\n public get priority(): TileLoadPriority { return this.loader.priority; }\r\n\r\n public constructor(modelId: Id64String, loader: MapTileLoader, iModel: IModelConnection, public gcsConverterAvailable: boolean) {\r\n this.id = this.modelId = modelId;\r\n this.loader = loader;\r\n this.iModel = iModel;\r\n }\r\n}\r\n\r\nfunction createViewFlagOverrides(wantLighting: boolean, wantThematic: false | undefined) {\r\n return createDefaultViewFlagOverrides({ clipVolume: false, lighting: wantLighting, thematic: wantThematic });\r\n}\r\n\r\nclass MapTreeSupplier implements TileTreeSupplier {\r\n public readonly isEcefDependent = true;\r\n\r\n public compareTileTreeIds(lhs: MapTreeId, rhs: MapTreeId): number {\r\n let cmp = compareNumbers(lhs.viewportId, rhs.viewportId);\r\n if (0 === cmp) {\r\n cmp = compareStringsOrUndefined(lhs.maskModelIds, rhs.maskModelIds);\r\n if (0 === cmp) {\r\n cmp = compareBooleans(lhs.isOverlay, rhs.isOverlay);\r\n if (0 === cmp && !lhs.isOverlay) {\r\n cmp = compareBooleans(lhs.wantSkirts, rhs.wantSkirts);\r\n if (0 === cmp) {\r\n cmp = compareBooleans(lhs.wantNormals, rhs.wantNormals);\r\n if (0 === cmp) {\r\n cmp = compareNumbers(lhs.globeMode, rhs.globeMode);\r\n if (0 === cmp) {\r\n cmp = compareNumbers(lhs.baseColor ? lhs.baseColor.tbgr : -1, rhs.baseColor ? rhs.baseColor.tbgr : -1);\r\n if (0 === cmp) {\r\n cmp = compareBooleans(lhs.baseTransparent, rhs.baseTransparent);\r\n if (0 === cmp) {\r\n cmp = compareBooleans(lhs.mapTransparent, rhs.mapTransparent);\r\n if (0 === cmp) {\r\n cmp = compareBooleans(lhs.applyTerrain, rhs.applyTerrain);\r\n if (0 === cmp) {\r\n if (lhs.applyTerrain) {\r\n // Terrain-only settings.\r\n cmp = compareStrings(lhs.terrainProviderName, rhs.terrainProviderName);\r\n if (0 === cmp) {\r\n cmp = compareNumbers(lhs.terrainHeightOrigin, rhs.terrainHeightOrigin);\r\n if (0 === cmp) {\r\n cmp = compareNumbers(lhs.terrainHeightOriginMode, rhs.terrainHeightOriginMode);\r\n if (0 === cmp)\r\n cmp = compareNumbers(lhs.terrainExaggeration, rhs.terrainExaggeration);\r\n }\r\n }\r\n } else {\r\n // Non-Terrain (flat) settings.\r\n cmp = compareNumbers(lhs.mapGroundBias, rhs.mapGroundBias);\r\n if (0 === cmp)\r\n cmp = compareBooleans(lhs.useDepthBuffer, rhs.useDepthBuffer);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n return cmp;\r\n }\r\n\r\n private async computeHeightBias(heightOrigin: number, heightOriginMode: TerrainHeightOriginMode, exaggeration: number, iModel: IModelConnection, elevationProvider: BingElevationProvider): Promise<number> {\r\n const projectCenter = iModel.projectExtents.center;\r\n switch (heightOriginMode) {\r\n case TerrainHeightOriginMode.Ground:\r\n return heightOrigin + exaggeration * (await elevationProvider.getHeightValue(projectCenter, iModel, true));\r\n\r\n case TerrainHeightOriginMode.Geodetic:\r\n return heightOrigin;\r\n\r\n case TerrainHeightOriginMode.Geoid:\r\n return heightOrigin + await elevationProvider.getGeodeticToSeaLevelOffset(projectCenter, iModel);\r\n }\r\n }\r\n\r\n public async createTileTree(id: MapTreeId, iModel: IModelConnection): Promise<TileTree | undefined> {\r\n let bimElevationBias, terrainProvider, geodeticOffset = 0;\r\n const modelId = iModel.transientIds.next;\r\n const gcsConverterAvailable = await getGcsConverterAvailable(iModel);\r\n\r\n if (id.applyTerrain) {\r\n assert(id.terrainProviderName === \"CesiumWorldTerrain\");\r\n await ApproximateTerrainHeights.instance.initialize();\r\n const elevationProvider = new BingElevationProvider();\r\n\r\n bimElevationBias = - await this.computeHeightBias(id.terrainHeightOrigin, id.terrainHeightOriginMode, id.terrainExaggeration, iModel, elevationProvider);\r\n geodeticOffset = await elevationProvider.getGeodeticToSeaLevelOffset(iModel.projectExtents.center, iModel);\r\n terrainProvider = await getCesiumTerrainProvider(iModel, modelId, id.wantSkirts, id.wantNormals, id.terrainExaggeration);\r\n } else {\r\n terrainProvider = new EllipsoidTerrainProvider(iModel, modelId, id.wantSkirts);\r\n bimElevationBias = id.mapGroundBias;\r\n }\r\n if (undefined === terrainProvider)\r\n return undefined;\r\n const loader = new MapTileLoader(iModel, modelId, bimElevationBias, terrainProvider);\r\n const ecefToDb = iModel.getMapEcefToDb(bimElevationBias);\r\n\r\n if (undefined === loader) {\r\n assert(false, \"Invalid Terrain Provider\");\r\n return undefined;\r\n }\r\n if (id.maskModelIds)\r\n await iModel.models.load(CompressedId64Set.decompressSet(id.maskModelIds));\r\n\r\n const treeProps = new MapTileTreeProps(modelId, loader, iModel, gcsConverterAvailable);\r\n return new MapTileTree(treeProps, ecefToDb, bimElevationBias, geodeticOffset, terrainProvider.tilingScheme, id);\r\n }\r\n}\r\n\r\nconst mapTreeSupplier = new MapTreeSupplier();\r\n\r\n/** @internal */\r\ntype CheckTerrainDisplayOverride = () => TerrainDisplayOverrides | undefined;\r\n\r\n/** Specialization of tile tree that represents background map.\r\n * @internal\r\n */\r\nexport class MapTileTreeReference extends TileTreeReference {\r\n private _viewportId: number;\r\n private _settings: BackgroundMapSettings;\r\n private readonly _iModel: IModelConnection;\r\n private _baseImageryLayerIncluded = false;\r\n private _baseColor?: ColorDef;\r\n private readonly _imageryTrees: ImageryMapLayerTreeReference[] = new Array<ImageryMapLayerTreeReference>();\r\n private _baseTransparent = false;\r\n private _symbologyOverrides: FeatureSymbology.Overrides | undefined;\r\n private _planarClipMask?: PlanarClipMaskState;\r\n\r\n public constructor(settings: BackgroundMapSettings, private _baseLayerSettings: BaseLayerSettings | undefined, private _layerSettings: MapLayerSettings[], iModel: IModelConnection, viewportId: number, public isOverlay: boolean, private _isDrape: boolean, private _overrideTerrainDisplay?: CheckTerrainDisplayOverride) {\r\n super();\r\n this._viewportId = viewportId;\r\n this._settings = settings;\r\n this._iModel = iModel;\r\n let tree;\r\n if (!isOverlay && this._baseLayerSettings !== undefined) {\r\n if (this._baseLayerSettings instanceof MapLayerSettings) {\r\n tree = IModelApp.mapLayerFormatRegistry.createImageryMapLayerTree(this._baseLayerSettings, 0, iModel);\r\n this._baseTransparent = this._baseLayerSettings.transparency > 0;\r\n } else {\r\n this._baseColor = this._baseLayerSettings;\r\n this._baseTransparent = this._baseColor?.getTransparency() > 0;\r\n }\r\n }\r\n\r\n if (this._baseImageryLayerIncluded = (undefined !== tree))\r\n this._imageryTrees.push(tree);\r\n\r\n for (let i = 0; i < this._layerSettings.length; i++)\r\n if (undefined !== (tree = IModelApp.mapLayerFormatRegistry.createImageryMapLayerTree(this._layerSettings[i], i + 1, iModel)))\r\n this._imageryTrees.push(tree);\r\n\r\n if (this._settings.planarClipMask && this._settings.planarClipMask.isValid)\r\n this._planarClipMask = PlanarClipMaskState.create(this._settings.planarClipMask);\r\n }\r\n public override get isGlobal() { return true; }\r\n public get baseColor(): ColorDef | undefined { return this._baseColor; }\r\n public override get planarclipMaskPriority(): number { return PlanarClipMaskPriority.BackgroundMap; }\r\n\r\n /** Terrain tiles do not contribute to the range used by \"fit view\". */\r\n public override unionFitRange(_range: Range3d): void { }\r\n public get settings(): BackgroundMapSettings { return this._settings; }\r\n public set settings(settings: BackgroundMapSettings) {\r\n this._settings = settings;\r\n this._planarClipMask = settings.planarClipMask ? PlanarClipMaskState.create(settings.planarClipMask) : undefined;\r\n }\r\n public setBaseLayerSettings(baseLayerSettings: BaseLayerSettings) {\r\n assert(!this.isOverlay);\r\n let tree;\r\n this._baseLayerSettings = baseLayerSettings;\r\n\r\n if (baseLayerSettings instanceof MapLayerSettings) {\r\n tree = IModelApp.mapLayerFormatRegistry.createImageryMapLayerTree(baseLayerSettings, 0, this._iModel);\r\n this._baseColor = undefined;\r\n this._baseTransparent = baseLayerSettings.transparency > 0;\r\n } else {\r\n this._baseColor = baseLayerSettings;\r\n this._baseTransparent = this._baseColor.getTransparency() > 0;\r\n }\r\n\r\n if (tree) {\r\n if (this._baseImageryLayerIncluded)\r\n this._imageryTrees[0] = tree;\r\n else\r\n this._imageryTrees.splice(0, 0, tree);\r\n } else {\r\n if (this._baseImageryLayerIncluded)\r\n this._imageryTrees.shift();\r\n }\r\n this._baseImageryLayerIncluded = tree !== undefined;\r\n this.clearLayers();\r\n }\r\n public get layerSettings(): MapLayerSettings[] {\r\n return this._layerSettings;\r\n }\r\n\r\n public setLayerSettings(layerSettings: MapLayerSettings[]) {\r\n this._layerSettings = layerSettings;\r\n const baseLayerIndex = this._baseImageryLayerIncluded ? 1 : 0;\r\n\r\n this._imageryTrees.length = Math.min(layerSettings.length + baseLayerIndex, this._imageryTrees.length); // Truncate if number of layers reduced.\r\n for (let i = 0; i < layerSettings.length; i++) {\r\n const treeIndex = i + baseLayerIndex;\r\n if (treeIndex >= this._imageryTrees.length || !this._imageryTrees[treeIndex].layerSettings.displayMatches(layerSettings[i]))\r\n this._imageryTrees[treeIndex] = IModelApp.mapLayerFormatRegistry.createImageryMapLayerTree(layerSettings[i], treeIndex, this._iModel)!;\r\n }\r\n this.clearLayers();\r\n }\r\n\r\n public clearLayers() {\r\n const tree = this.treeOwner.tileTree as MapTileTree;\r\n if (undefined !== tree)\r\n tree.clearLayers();\r\n }\r\n\r\n public override get castsShadows() {\r\n return false;\r\n }\r\n\r\n protected override get _isLoadingComplete(): boolean {\r\n // Wait until drape tree is fully loaded too.\r\n for (const drapeTree of this._imageryTrees)\r\n if (!drapeTree.isLoadingComplete)\r\n return false;\r\n\r\n return super._isLoadingComplete;\r\n }\r\n public get useDepthBuffer() {\r\n return !this.isOverlay && (this.settings.applyTerrain || this.settings.useDepthBuffer);\r\n }\r\n\r\n public get treeOwner(): TileTreeOwner {\r\n let wantSkirts = (this.settings.applyTerrain || this.useDepthBuffer) && !this.settings.transparency && !this._baseTransparent;\r\n if (wantSkirts) {\r\n const maskTrans = this._planarClipMask?.settings.transparency;\r\n wantSkirts = (undefined === maskTrans || maskTrans <= 0);\r\n }\r\n\r\n const id: MapTreeId = {\r\n viewportId: this._viewportId,\r\n applyTerrain: this.settings.applyTerrain && !this.isOverlay && !this._isDrape,\r\n terrainProviderName: this.settings.terrainSettings.providerName,\r\n terrainHeightOrigin: this.settings.terrainSettings.heightOrigin,\r\n terrainHeightOriginMode: this.settings.terrainSettings.heightOriginMode,\r\n terrainExaggeration: this.settings.terrainSettings.exaggeration,\r\n mapGroundBias: this.settings.groundBias,\r\n wantSkirts,\r\n // Can set to this.settings.terrainSettings.applyLighting if we want to ever apply lighting to terrain again so that normals are retrieved when lighting is on.\r\n wantNormals: false,\r\n globeMode: this._isDrape ? GlobeMode.Plane : this.settings.globeMode,\r\n isOverlay: this.isOverlay,\r\n useDepthBuffer: this.useDepthBuffer,\r\n baseColor: this._baseColor,\r\n baseTransparent: this._baseTransparent,\r\n mapTransparent: this.settings.transparency > 0,\r\n maskModelIds: this._planarClipMask?.settings.compressedModelIds,\r\n };\r\n\r\n if (undefined !== this._overrideTerrainDisplay) {\r\n const ovr = this._overrideTerrainDisplay();\r\n if (undefined !== ovr) {\r\n id.wantSkirts = ovr.wantSkirts ?? id.wantSkirts;\r\n id.wantNormals = ovr.wantNormals ?? id.wantNormals;\r\n }\r\n }\r\n\r\n return this._iModel.tiles.getTileTreeOwner(id, mapTreeSupplier);\r\n }\r\n public getLayerImageryTreeRef(index: number) {\r\n const baseLayerIndex = this._baseImageryLayerIncluded ? 1 : 0;\r\n const treeIndex = index + baseLayerIndex;\r\n return index < 0 || treeIndex >= this._imageryTrees.length ? undefined : this._imageryTrees[treeIndex];\r\n }\r\n\r\n public initializeImagery(): boolean {\r\n const tree = this.treeOwner.load() as MapTileTree;\r\n if (undefined === tree)\r\n return false; // Not loaded yet.\r\n\r\n tree.imageryTrees.length = 0;\r\n if (0 === this._imageryTrees.length)\r\n return !this.isOverlay;\r\n\r\n let treeIndex = this._imageryTrees.length - 1;\r\n // Start displaying at the highest completely opaque layer...\r\n for (; treeIndex >= 1; treeIndex--) {\r\n const imageryTreeRef = this._imageryTrees[treeIndex];\r\n const layerSettings = imageryTreeRef.layerSettings;\r\n if (layerSettings.visible && !imageryTreeRef.layerSettings.allSubLayersInvisible && !layerSettings.transparentBackground && 0 === layerSettings.transparency)\r\n break; // This layer is completely opaque and will obscure all others so ignore lower ones.\r\n }\r\n for (; treeIndex < this._imageryTrees.length; treeIndex++) {\r\n const imageryTreeRef = this._imageryTrees[treeIndex];\r\n if (TileTreeLoadStatus.NotFound !== imageryTreeRef.treeOwner.loadStatus && imageryTreeRef.layerSettings.visible && !imageryTreeRef.layerSettings.allSubLayersInvisible) {\r\n const imageryTree = imageryTreeRef.treeOwner.load();\r\n if (undefined === imageryTree)\r\n return false; // Not loaded yet.\r\n tree.addImageryLayer(imageryTree as ImageryMapTileTree, imageryTreeRef.layerSettings);\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /** Adds this reference's graphics to the scene. By default this invokes [[TileTree.drawScene]] on the referenced TileTree, if it is loaded. */\r\n public override addToScene(context: SceneContext): void {\r\n if (!context.viewFlags.backgroundMap)\r\n return;\r\n\r\n const tree = this.treeOwner.load() as MapTileTree;\r\n if (undefined === tree || !this.initializeImagery())\r\n return; // Not loaded yet.\r\n\r\n if (this._planarClipMask && this._planarClipMask.settings.isValid)\r\n context.addPlanarClassifier(tree.modelId, undefined, this._planarClipMask);\r\n\r\n const nonLocatable = this.settings.locatable ? undefined : true;\r\n const transparency = this.settings.transparency ? this.settings.transparency : undefined;\r\n this._symbologyOverrides = new FeatureSymbology.Overrides();\r\n if (nonLocatable || transparency) {\r\n this._symbologyOverrides.override({\r\n modelId: tree.modelId,\r\n appearance: FeatureAppearance.fromJSON({ transparency, nonLocatable }),\r\n });\r\n }\r\n\r\n const args = this.createDrawArgs(context);\r\n if (undefined !== args)\r\n tree.draw(args);\r\n\r\n tree.clearImageryLayers();\r\n }\r\n\r\n public override createDrawArgs(context: SceneContext): TileDrawArgs | undefined {\r\n const args = super.createDrawArgs(context);\r\n if (undefined === args)\r\n return undefined;\r\n\r\n return new RealityTileDrawArgs(args, args.worldToViewMap, args.frustumPlanes);\r\n }\r\n\r\n protected override getViewFlagOverrides(_tree: TileTree) {\r\n return createViewFlagOverrides(false, this._settings.applyTerrain ? undefined : false);\r\n }\r\n\r\n protected override getSymbologyOverrides(_tree: TileTree) {\r\n return this._symbologyOverrides;\r\n }\r\n\r\n public override discloseTileTrees(trees: DisclosedTileTreeSet): void {\r\n super.discloseTileTrees(trees);\r\n this._imageryTrees.forEach((imageryTree) => trees.disclose(imageryTree));\r\n if (this._planarClipMask)\r\n this._planarClipMask.discloseTileTrees(trees);\r\n }\r\n public imageryTreeFromTreeModelIds(mapTreeModelId: Id64String, layerTreeModelId: Id64String): ImageryMapLayerTreeReference | undefined {\r\n const tree = this.treeOwner.tileTree as MapTileTree;\r\n if (undefined === tree || tree.modelId !== mapTreeModelId)\r\n return undefined;\r\n\r\n for (const imageryTree of this._imageryTrees)\r\n if (imageryTree.treeOwner.tileTree && imageryTree.treeOwner.tileTree.modelId === layerTreeModelId)\r\n return imageryTree;\r\n\r\n return undefined;\r\n }\r\n public layerFromTreeModelIds(mapTreeModelId: Id64String, layerTreeModelId: Id64String): MapLayerSettings | undefined {\r\n const imageryTree = this.imageryTreeFromTreeModelIds(mapTreeModelId, layerTreeModelId);\r\n return imageryTree === undefined ? imageryTree : imageryTree.layerSettings;\r\n }\r\n\r\n public override async getToolTip(hit: HitDetail): Promise<HTMLElement | string | undefined> {\r\n const tree = this.treeOwner.tileTree as MapTileTree;\r\n // eslint-disable-next-line @typescript-eslint/unbound-method\r\n if (undefined === tree || hit.iModel !== tree.iModel || tree.modelId !== hit.modelId || !hit.viewport || !hit.viewport.view.is3d)\r\n return undefined;\r\n\r\n const backgroundMapGeometry = hit.viewport.displayStyle.getBackgroundMapGeometry();\r\n if (undefined === backgroundMapGeometry)\r\n return undefined;\r\n\r\n const worldPoint = hit.hitPoint.clone();\r\n const cartoGraphic = await backgroundMapGeometry.dbToCartographicFromGcs(worldPoint);\r\n const strings = [];\r\n const imageryTreeRef = this.imageryTreeFromTreeModelIds(hit.modelId, hit.sourceId);\r\n if (imageryTreeRef !== undefined) {\r\n strings.push(`Imagery Layer: ${imageryTreeRef.layerSettings.name}`);\r\n if (hit.tileId !== undefined) {\r\n const terrainQuadId = QuadId.createFromContentId(hit.tileId);\r\n const terrainTile = tree.tileFromQuadId(terrainQuadId);\r\n if (terrainTile && terrainTile.imageryTiles) {\r\n const imageryTree = imageryTreeRef.treeOwner.tileTree as ImageryMapTileTree;\r\n if (imageryTree) {\r\n for (const imageryTile of terrainTile.imageryTiles) {\r\n if (imageryTree === imageryTile.imageryTree && imageryTile.rectangle.containsCartographic(cartoGraphic))\r\n await imageryTree.imageryLoader.getToolTip(strings, imageryTile.quadId, cartoGraphic, imageryTree);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n strings.push(`Latitude: ${cartoGraphic.latitudeDegrees.toFixed(4)}`);\r\n strings.push(`Longitude: ${cartoGraphic.longitudeDegrees.toFixed(4)}`);\r\n if (this.settings.applyTerrain) {\r\n const geodeticHeight = (cartoGraphic.height - tree.bimElevationBias) / tree.terrainExaggeration;\r\n strings.push(`Height (Meters) Geodetic: ${geodeticHeight.toFixed(1)} Sea Level: ${(geodeticHeight - tree.geodeticOffset).toFixed(1)}`);\r\n }\r\n const div = document.createElement(\"div\");\r\n div.innerHTML = strings.join(\"<br>\");\r\n return div;\r\n }\r\n\r\n /** Add logo cards to logo div. */\r\n public override addLogoCards(cards: HTMLTableElement, vp: ScreenViewport): void {\r\n const tree = this.treeOwner.tileTree as MapTileTree;\r\n let logo;\r\n if (tree) {\r\n if (undefined !== (logo = tree.mapLoader.terrainProvider.getLogo()))\r\n cards.appendChild(logo);\r\n for (const imageryTreeRef of this._imageryTrees) {\r\n if (imageryTreeRef.layerSettings.visible) {\r\n const imageryTree = imageryTreeRef.treeOwner.tileTree as ImageryMapTileTree;\r\n if (imageryTree && (undefined !== (logo = imageryTree.getLogo(vp))))\r\n cards.appendChild(logo);\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\n/** Returns whether a GCS converter is available.\r\n * @internal\r\n */\r\nexport async function getGcsConverterAvailable(iModel: IModelConnection) {\r\n if (iModel.noGcsDefined)\r\n return false;\r\n\r\n // Determine if we have a usable GCS.\r\n const converter = iModel.geoServices.getConverter(\"WGS84\");\r\n if (undefined === converter)\r\n return false;\r\n const requestProps: XYZProps[] = [{ x: 0, y: 0, z: 0 }];\r\n let haveConverter;\r\n try {\r\n const responseProps = await converter.getIModelCoordinatesFromGeoCoordinates(requestProps);\r\n haveConverter = responseProps.iModelCoords.length === 1 && responseProps.iModelCoords[0].s !== GeoCoordStatus.NoGCSDefined;\r\n } catch {\r\n haveConverter = false;\r\n }\r\n return haveConverter;\r\n}\r\n"]}
1
+ {"version":3,"file":"MapTileTree.js","sourceRoot":"","sources":["../../../../src/tile/map/MapTileTree.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/** @packageDocumentation\r\n * @module Tiles\r\n */\r\n\r\nimport { assert, compareBooleans, compareNumbers, compareStrings, compareStringsOrUndefined, CompressedId64Set, Id64String } from \"@itwin/core-bentley\";\r\nimport {\r\n Angle, AngleSweep, Constant, Ellipsoid, EllipsoidPatch, Point3d, Range1d, Range3d, Ray3d, Transform, Vector3d, XYZProps,\r\n} from \"@itwin/core-geometry\";\r\nimport {\r\n BackgroundMapSettings, BaseLayerSettings, Cartographic, ColorDef, FeatureAppearance, GeoCoordStatus, GlobeMode, MapLayerSettings, PlanarClipMaskPriority, TerrainHeightOriginMode,\r\n TerrainProviderName,\r\n} from \"@itwin/core-common\";\r\nimport { ApproximateTerrainHeights } from \"../../ApproximateTerrainHeights\";\r\nimport { TerrainDisplayOverrides } from \"../../DisplayStyleState\";\r\nimport { HitDetail } from \"../../HitDetail\";\r\nimport { IModelApp } from \"../../IModelApp\";\r\nimport { IModelConnection } from \"../../IModelConnection\";\r\nimport { PlanarClipMaskState } from \"../../PlanarClipMaskState\";\r\nimport { FeatureSymbology } from \"../../render/FeatureSymbology\";\r\nimport { SceneContext } from \"../../ViewContext\";\r\nimport { ScreenViewport } from \"../../Viewport\";\r\nimport {\r\n BingElevationProvider,\r\n createDefaultViewFlagOverrides,\r\n DisclosedTileTreeSet,\r\n EllipsoidTerrainProvider,\r\n getCesiumTerrainProvider,\r\n ImageryMapLayerTreeReference,\r\n ImageryMapTileTree,\r\n MapCartoRectangle,\r\n MapTile,\r\n MapTileLoader,\r\n MapTilingScheme,\r\n PlanarTilePatch,\r\n QuadId,\r\n RealityTileDrawArgs,\r\n RealityTileTree,\r\n RealityTileTreeParams,\r\n Tile,\r\n TileDrawArgs,\r\n TileLoadPriority,\r\n TileParams,\r\n TileTree,\r\n TileTreeLoadStatus,\r\n TileTreeOwner,\r\n TileTreeReference,\r\n TileTreeSupplier,\r\n UpsampledMapTile,\r\n WebMercatorTilingScheme,\r\n} from \"../internal\";\r\n\r\nconst scratchPoint = Point3d.create();\r\nconst scratchCorners = [Point3d.createZero(), Point3d.createZero(), Point3d.createZero(), Point3d.createZero(), Point3d.createZero(), Point3d.createZero(), Point3d.createZero(), Point3d.createZero()];\r\nconst scratchCorner = Point3d.createZero();\r\nconst scratchZNormal = Vector3d.create(0, 0, 1);\r\n/** @internal */\r\nexport class MapTileTree extends RealityTileTree {\r\n private _mercatorFractionToDb: Transform;\r\n public earthEllipsoid: Ellipsoid;\r\n public minEarthEllipsoid: Ellipsoid;\r\n public maxEarthEllipsoid: Ellipsoid;\r\n public globeMode: GlobeMode;\r\n public globeOrigin: Point3d;\r\n\r\n private _mercatorTilingScheme: MapTilingScheme;\r\n public useDepthBuffer: boolean;\r\n public isOverlay: boolean;\r\n public terrainExaggeration: number;\r\n public baseColor?: ColorDef;\r\n public baseTransparent: boolean;\r\n public mapTransparent: boolean;\r\n\r\n constructor(params: RealityTileTreeParams, public ecefToDb: Transform, public bimElevationBias: number, public geodeticOffset: number,\r\n public sourceTilingScheme: MapTilingScheme, id: MapTreeId, applyTerrain: boolean) {\r\n super(params);\r\n this._mercatorTilingScheme = new WebMercatorTilingScheme();\r\n this._mercatorFractionToDb = this._mercatorTilingScheme.computeMercatorFractionToDb(ecefToDb, bimElevationBias, params.iModel, applyTerrain);\r\n const quadId = new QuadId(sourceTilingScheme.rootLevel, 0, 0);\r\n this.globeOrigin = this.ecefToDb.getOrigin().clone();\r\n this.earthEllipsoid = Ellipsoid.createCenterMatrixRadii(this.globeOrigin, this.ecefToDb.matrix, Constant.earthRadiusWGS84.equator, Constant.earthRadiusWGS84.equator, Constant.earthRadiusWGS84.polar);\r\n const globalHeightRange = applyTerrain ? ApproximateTerrainHeights.instance.globalHeightRange : Range1d.createXX(0, 0);\r\n const globalRectangle = MapCartoRectangle.create();\r\n\r\n this.globeMode = id.globeMode;\r\n this.isOverlay = id.isOverlay;\r\n this.useDepthBuffer = id.useDepthBuffer;\r\n this.terrainExaggeration = id.terrainExaggeration;\r\n this.baseColor = id.baseColor;\r\n this.baseTransparent = id.baseTransparent;\r\n this.mapTransparent = id.mapTransparent;\r\n if (applyTerrain) {\r\n this.minEarthEllipsoid = Ellipsoid.createCenterMatrixRadii(this.globeOrigin, this.ecefToDb.matrix, Constant.earthRadiusWGS84.equator + globalHeightRange.low, Constant.earthRadiusWGS84.equator + globalHeightRange.low, Constant.earthRadiusWGS84.polar + globalHeightRange.low);\r\n this.maxEarthEllipsoid = Ellipsoid.createCenterMatrixRadii(this.globeOrigin, this.ecefToDb.matrix, Constant.earthRadiusWGS84.equator + globalHeightRange.high, Constant.earthRadiusWGS84.equator + globalHeightRange.high, Constant.earthRadiusWGS84.polar + globalHeightRange.high);\r\n } else {\r\n this.minEarthEllipsoid = this.earthEllipsoid;\r\n this.maxEarthEllipsoid = this.earthEllipsoid;\r\n }\r\n\r\n const rootPatch = EllipsoidPatch.createCapture(this.maxEarthEllipsoid, AngleSweep.createStartSweepRadians(0, Angle.pi2Radians), AngleSweep.createStartSweepRadians(-Angle.piOver2Radians, Angle.piRadians));\r\n let range;\r\n if (this.globeMode === GlobeMode.Ellipsoid) {\r\n range = rootPatch.range();\r\n } else {\r\n const corners = this.getFractionalTileCorners(quadId);\r\n this._mercatorFractionToDb.multiplyPoint3dArrayInPlace(corners);\r\n range = Range3d.createArray(MapTile.computeRangeCorners(corners, Vector3d.create(0, 0, 1), 0, scratchCorners, globalHeightRange));\r\n }\r\n this._rootTile = this.createGlobeChild({ contentId: quadId.contentId, maximumSize: 0, range }, quadId, range.corners(), globalRectangle, rootPatch, undefined);\r\n\r\n }\r\n\r\n // If we are not depth buffering we force parents and exclusive to false to cause the map tiles to be sorted by depth so that painters algorithm will approximate correct depth display.\r\n public override get parentsAndChildrenExclusive() { return this.useDepthBuffer ? this.loader.parentsAndChildrenExclusive : false; }\r\n\r\n public tileFromQuadId(quadId: QuadId): MapTile | undefined {\r\n return (this._rootTile as MapTile).tileFromQuadId(quadId);\r\n }\r\n\r\n public imageryTrees: ImageryMapTileTree[] = [];\r\n private _layerSettings = new Map<Id64String, MapLayerSettings>();\r\n\r\n public addImageryLayer(tree: ImageryMapTileTree, settings: MapLayerSettings) {\r\n const maxLayers = IModelApp.renderSystem.maxRealityImageryLayers;\r\n if (this.imageryTrees.length < maxLayers) {\r\n this.imageryTrees.push(tree);\r\n this._layerSettings.set(tree.modelId, settings);\r\n } else {\r\n // TBD -- Notify user that layers is being ignored?\r\n }\r\n }\r\n public clearImageryLayers() {\r\n this.imageryTrees.length = 0;\r\n this._layerSettings.clear();\r\n }\r\n public override get isTransparent() {\r\n return this.mapTransparent || this.baseTransparent;\r\n }\r\n\r\n public override get maxDepth() {\r\n let maxDepth = this.loader.maxDepth;\r\n this.imageryTrees?.forEach((imageryTree) => maxDepth = Math.max(maxDepth, imageryTree.maxDepth));\r\n\r\n return maxDepth;\r\n }\r\n public createPlanarChild(params: TileParams, quadId: QuadId, corners: Point3d[], normal: Vector3d, rectangle: MapCartoRectangle, chordHeight: number, heightRange?: Range1d): MapTile {\r\n const patch = new PlanarTilePatch(corners, normal, chordHeight);\r\n const cornerNormals = this.getCornerRays(rectangle);\r\n const ctor = this.mapLoader.isTileAvailable(quadId) ? MapTile : UpsampledMapTile;\r\n return new ctor(params, this, quadId, patch, rectangle, heightRange, cornerNormals);\r\n }\r\n\r\n public createGlobeChild(params: TileParams, quadId: QuadId, _rangeCorners: Point3d[], rectangle: MapCartoRectangle, ellipsoidPatch: EllipsoidPatch, heightRange?: Range1d): MapTile {\r\n return new MapTile(params, this, quadId, ellipsoidPatch, rectangle, heightRange, this.getCornerRays(rectangle));\r\n }\r\n\r\n public getChildHeightRange(quadId: QuadId, rectangle: MapCartoRectangle, parent: MapTile): Range1d | undefined {\r\n return this.mapLoader.getChildHeightRange(quadId, rectangle, parent);\r\n }\r\n\r\n public clearLayers() {\r\n (this._rootTile as MapTile).clearLayers();\r\n }\r\n\r\n public static minReprojectionDepth = 8; // Reprojection does not work with very large tiles so just do linear transform.\r\n public static maxGlobeDisplayDepth = 8;\r\n public static minDisplayableDepth = 3;\r\n public get mapLoader() { return this.loader as MapTileLoader; }\r\n public override getBaseRealityDepth(sceneContext: SceneContext) {\r\n // If the view has ever had global scope then preload low level (global) tiles.\r\n return (sceneContext.viewport.view.maxGlobalScopeFactor > 1) ? MapTileTree.minDisplayableDepth : -1;\r\n }\r\n\r\n public doCreateGlobeChildren(tile: Tile): boolean {\r\n if (this.globeMode !== GlobeMode.Ellipsoid)\r\n return false;\r\n\r\n const childDepth = tile.depth + 1;\r\n if (childDepth < MapTileTree.maxGlobeDisplayDepth) // If the depth is too low (tile is too large) display as globe.\r\n return true;\r\n\r\n return false; // Display as globe if more than 100 KM from project.\r\n }\r\n public override doReprojectChildren(tile: Tile): boolean {\r\n if (this._gcsConverter === undefined)\r\n return false;\r\n\r\n const childDepth = tile.depth + 1;\r\n if (childDepth < MapTileTree.minReprojectionDepth) // If the depth is too low (tile is too large) omit reprojection.\r\n return false;\r\n\r\n return this.cartesianRange.intersectsRange(tile.range);\r\n }\r\n\r\n public getCornerRays(rectangle: MapCartoRectangle): Ray3d[] | undefined {\r\n const rays = new Array<Ray3d>();\r\n if (this.globeMode === GlobeMode.Ellipsoid) {\r\n rays.push(this.earthEllipsoid.radiansToUnitNormalRay(rectangle.low.x, Cartographic.parametricLatitudeFromGeodeticLatitude(rectangle.high.y))!);\r\n rays.push(this.earthEllipsoid.radiansToUnitNormalRay(rectangle.high.x, Cartographic.parametricLatitudeFromGeodeticLatitude(rectangle.high.y))!);\r\n rays.push(this.earthEllipsoid.radiansToUnitNormalRay(rectangle.low.x, Cartographic.parametricLatitudeFromGeodeticLatitude(rectangle.low.y))!);\r\n rays.push(this.earthEllipsoid.radiansToUnitNormalRay(rectangle.high.x, Cartographic.parametricLatitudeFromGeodeticLatitude(rectangle.low.y))!);\r\n } else {\r\n const mercatorFractionRange = rectangle.getTileFractionRange(this._mercatorTilingScheme);\r\n rays.push(Ray3d.createCapture(this._mercatorFractionToDb.multiplyXYZ(mercatorFractionRange.low.x, mercatorFractionRange.high.y), scratchZNormal));\r\n rays.push(Ray3d.createCapture(this._mercatorFractionToDb.multiplyXYZ(mercatorFractionRange.high.x, mercatorFractionRange.high.y), scratchZNormal));\r\n rays.push(Ray3d.createCapture(this._mercatorFractionToDb.multiplyXYZ(mercatorFractionRange.low.x, mercatorFractionRange.low.y), scratchZNormal));\r\n rays.push(Ray3d.createCapture(this._mercatorFractionToDb.multiplyXYZ(mercatorFractionRange.high.x, mercatorFractionRange.low.y), scratchZNormal));\r\n }\r\n return rays;\r\n }\r\n public pointAboveEllipsoid(point: Point3d): boolean {\r\n return this.earthEllipsoid.worldToLocal(point, scratchPoint)!.magnitude() > 1;\r\n }\r\n\r\n private getMercatorFractionChildGridPoints(tile: MapTile, columnCount: number, rowCount: number): Point3d[] {\r\n const gridPoints = [];\r\n const quadId = tile.quadId;\r\n const deltaX = 1.0 / columnCount, deltaY = 1.0 / rowCount;\r\n for (let row = 0; row <= rowCount; row++) {\r\n for (let column = 0; column <= columnCount; column++) {\r\n const xFraction = this.sourceTilingScheme.tileXToFraction(quadId.column + column * deltaX, quadId.level);\r\n const yFraction = this.sourceTilingScheme.tileYToFraction(quadId.row + row * deltaY, quadId.level);\r\n\r\n gridPoints.push(Point3d.create(xFraction, yFraction, 0));\r\n }\r\n }\r\n // If not mercator already need to remap latitude...\r\n if (!(this.sourceTilingScheme instanceof WebMercatorTilingScheme))\r\n for (const gridPoint of gridPoints)\r\n gridPoint.y = this._mercatorTilingScheme.latitudeToYFraction(this.sourceTilingScheme.yFractionToLatitude(gridPoint.y));\r\n\r\n return gridPoints;\r\n }\r\n\r\n private getChildCornersFromGridPoints(gridPoints: Point3d[], columnCount: number, rowCount: number) {\r\n const childCorners = new Array<Point3d[]>();\r\n for (let row = 0; row < rowCount; row++) {\r\n for (let column = 0; column < columnCount; column++) {\r\n const index0 = column + row * (columnCount + 1);\r\n const index1 = index0 + (columnCount + 1);\r\n childCorners.push([gridPoints[index0], gridPoints[index0 + 1], gridPoints[index1], gridPoints[index1 + 1]]);\r\n }\r\n }\r\n return childCorners;\r\n }\r\n\r\n public getCachedReprojectedPoints(gridPoints: Point3d[]): (Point3d | undefined)[] | undefined {\r\n const requestProps = [];\r\n for (const gridPoint of gridPoints)\r\n requestProps.push({\r\n x: this._mercatorTilingScheme.xFractionToLongitude(gridPoint.x) * Angle.degreesPerRadian,\r\n y: this._mercatorTilingScheme.yFractionToLatitude(gridPoint.y) * Angle.degreesPerRadian,\r\n z: this.bimElevationBias,\r\n });\r\n\r\n const iModelCoordinates = this._gcsConverter!.getCachedIModelCoordinatesFromGeoCoordinates(requestProps);\r\n\r\n if (iModelCoordinates.missing)\r\n return undefined;\r\n\r\n return iModelCoordinates.result.map((result) => !result || result.s ? undefined : Point3d.fromJSON(result.p));\r\n }\r\n\r\n // Minimize reprojection requests by requesting this corners tile and a grid that will include all points for 4 levels of descendants.\r\n // This greatly reduces the number of reprojection requests which currently require a roundtrip through the backend.\r\n public async loadReprojectionCache(tile: MapTile): Promise<void> {\r\n const quadId = tile.quadId;\r\n const xRange = Range1d.createXX(this.sourceTilingScheme.tileXToFraction(quadId.column, quadId.level), this.sourceTilingScheme.tileXToFraction(quadId.column + 1, quadId.level));\r\n const yRange = Range1d.createXX(this.sourceTilingScheme.tileYToFraction(quadId.row, quadId.level), this.sourceTilingScheme.tileYToFraction(quadId.row + 1, quadId.level));\r\n const cacheDepth = 4, cacheDimension = 2 ** cacheDepth;\r\n const delta = 1.0 / cacheDimension;\r\n const requestProps = [];\r\n\r\n for (let row = 0; row <= cacheDimension; row++) {\r\n for (let column = 0; column <= cacheDimension; column++) {\r\n let yFraction = yRange.fractionToPoint(row * delta);\r\n if (!(this.sourceTilingScheme instanceof WebMercatorTilingScheme))\r\n yFraction = this._mercatorTilingScheme.latitudeToYFraction(this.sourceTilingScheme.yFractionToLatitude(yFraction));\r\n requestProps.push({\r\n x: this._mercatorTilingScheme.xFractionToLongitude(xRange.fractionToPoint(column * delta)) * Angle.degreesPerRadian,\r\n y: this._mercatorTilingScheme.yFractionToLatitude(yFraction) * Angle.degreesPerRadian,\r\n z: this.bimElevationBias,\r\n });\r\n }\r\n }\r\n\r\n await this._gcsConverter!.getIModelCoordinatesFromGeoCoordinates(requestProps);\r\n }\r\n\r\n private static _scratchCarto = Cartographic.createZero();\r\n\r\n // Get the corners for planar children -- This generally will resolve immediately, but may require an asynchronous request for reprojecting the corners.\r\n public getPlanarChildCorners(tile: MapTile, columnCount: number, rowCount: number, resolve: (childCorners: Point3d[][]) => void) {\r\n const resolveCorners = (points: Point3d[], reprojected: (Point3d | undefined)[] | undefined = undefined) => {\r\n for (let i = 0; i < points.length; i++) {\r\n const gridPoint = points[i];\r\n this._mercatorFractionToDb.multiplyPoint3d(gridPoint, scratchCorner);\r\n if (this.globeMode !== GlobeMode.Ellipsoid || this.cartesianRange.containsPoint(scratchCorner)) {\r\n if (reprojected !== undefined && reprojected[i] !== undefined)\r\n reprojected[i]!.clone(gridPoint);\r\n else\r\n scratchCorner.clone(gridPoint);\r\n } else {\r\n this._mercatorTilingScheme.fractionToCartographic(gridPoint.x, gridPoint.y, MapTileTree._scratchCarto);\r\n this.earthEllipsoid.radiansToPoint(MapTileTree._scratchCarto.longitude, Cartographic.parametricLatitudeFromGeodeticLatitude(MapTileTree._scratchCarto.latitude), gridPoint);\r\n const cartesianDistance = this.cartesianRange.distanceToPoint(scratchCorner);\r\n if (cartesianDistance < this.cartesianTransitionDistance)\r\n scratchCorner.interpolate(cartesianDistance / this.cartesianTransitionDistance, gridPoint, gridPoint);\r\n }\r\n }\r\n resolve(this.getChildCornersFromGridPoints(points, columnCount, rowCount));\r\n };\r\n\r\n let reprojectedPoints: (Point3d | undefined)[] | undefined;\r\n const gridPoints = this.getMercatorFractionChildGridPoints(tile, columnCount, rowCount);\r\n if (this.doReprojectChildren(tile)) {\r\n reprojectedPoints = this.getCachedReprojectedPoints(gridPoints);\r\n if (reprojectedPoints) {\r\n // If the reprojected corners are in the cache, resolve immediately.\r\n resolveCorners(gridPoints, reprojectedPoints);\r\n } else {\r\n // If the reprojected corners are not in cache request them - but also request reprojection of a grid that will include descendent corners to ensure they can\r\n // be reloaded without expensive reprojection requests.\r\n this.loadReprojectionCache(tile).then(() => {\r\n const reprojected = this.getCachedReprojectedPoints(gridPoints);\r\n assert(reprojected !== undefined); // We just cached them... they better be there now.\r\n resolveCorners(gridPoints, reprojected);\r\n }).catch((_error: Error) => {\r\n resolveCorners(gridPoints);\r\n });\r\n }\r\n } else {\r\n resolveCorners(gridPoints);\r\n }\r\n }\r\n\r\n public getFractionalTileCorners(quadId: QuadId): Point3d[] {\r\n const corners: Point3d[] = [];\r\n corners.push(Point3d.create(this.sourceTilingScheme.tileXToFraction(quadId.column, quadId.level), this.sourceTilingScheme.tileYToFraction(quadId.row, quadId.level), 0.0));\r\n corners.push(Point3d.create(this.sourceTilingScheme.tileXToFraction(quadId.column + 1, quadId.level), this.sourceTilingScheme.tileYToFraction(quadId.row, quadId.level), 0.0));\r\n corners.push(Point3d.create(this.sourceTilingScheme.tileXToFraction(quadId.column, quadId.level), this.sourceTilingScheme.tileYToFraction(quadId.row + 1, quadId.level), 0.0));\r\n corners.push(Point3d.create(this.sourceTilingScheme.tileXToFraction(quadId.column + 1, quadId.level), this.sourceTilingScheme.tileYToFraction(quadId.row + 1, quadId.level), 0.0));\r\n return corners;\r\n }\r\n\r\n public getTileRectangle(quadId: QuadId): MapCartoRectangle {\r\n return this.sourceTilingScheme.tileXYToRectangle(quadId.column, quadId.row, quadId.level);\r\n }\r\n public getLayerIndex(imageryTreeId: Id64String) {\r\n for (let index = 0; index < this.imageryTrees.length; index++)\r\n if (imageryTreeId === this.imageryTrees[index].modelId)\r\n return index;\r\n\r\n return -1;\r\n }\r\n\r\n public getLayerTransparency(imageryTreeId: Id64String): number {\r\n const layerSettings = this._layerSettings.get(imageryTreeId);\r\n assert(undefined !== layerSettings);\r\n return undefined === layerSettings || !layerSettings.transparency ? 0.0 : layerSettings.transparency;\r\n }\r\n}\r\n\r\ninterface MapTreeId {\r\n viewportId: number;\r\n applyTerrain: boolean;\r\n terrainProviderName: TerrainProviderName;\r\n terrainHeightOrigin: number;\r\n terrainHeightOriginMode: number;\r\n terrainExaggeration: number;\r\n mapGroundBias: number;\r\n wantSkirts: boolean;\r\n wantNormals: boolean;\r\n globeMode: GlobeMode;\r\n useDepthBuffer: boolean;\r\n isOverlay: boolean;\r\n baseColor?: ColorDef;\r\n baseTransparent: boolean;\r\n mapTransparent: boolean;\r\n maskModelIds?: string;\r\n}\r\n\r\n/** @internal */\r\nclass MapTileTreeProps implements RealityTileTreeParams {\r\n public id: string;\r\n public modelId: string;\r\n public location = Transform.createIdentity();\r\n public yAxisUp = true;\r\n public is3d = true;\r\n public rootTile = { contentId: \"\", range: Range3d.createNull(), maximumSize: 0 };\r\n public loader: MapTileLoader;\r\n public iModel: IModelConnection;\r\n public get priority(): TileLoadPriority { return this.loader.priority; }\r\n\r\n public constructor(modelId: Id64String, loader: MapTileLoader, iModel: IModelConnection, public gcsConverterAvailable: boolean) {\r\n this.id = this.modelId = modelId;\r\n this.loader = loader;\r\n this.iModel = iModel;\r\n }\r\n}\r\n\r\nfunction createViewFlagOverrides(wantLighting: boolean, wantThematic: false | undefined) {\r\n return createDefaultViewFlagOverrides({ clipVolume: false, lighting: wantLighting, thematic: wantThematic });\r\n}\r\n\r\nclass MapTreeSupplier implements TileTreeSupplier {\r\n public readonly isEcefDependent = true;\r\n\r\n public compareTileTreeIds(lhs: MapTreeId, rhs: MapTreeId): number {\r\n let cmp = compareNumbers(lhs.viewportId, rhs.viewportId);\r\n if (0 === cmp) {\r\n cmp = compareStringsOrUndefined(lhs.maskModelIds, rhs.maskModelIds);\r\n if (0 === cmp) {\r\n cmp = compareBooleans(lhs.isOverlay, rhs.isOverlay);\r\n if (0 === cmp && !lhs.isOverlay) {\r\n cmp = compareBooleans(lhs.wantSkirts, rhs.wantSkirts);\r\n if (0 === cmp) {\r\n cmp = compareBooleans(lhs.wantNormals, rhs.wantNormals);\r\n if (0 === cmp) {\r\n cmp = compareNumbers(lhs.globeMode, rhs.globeMode);\r\n if (0 === cmp) {\r\n cmp = compareNumbers(lhs.baseColor ? lhs.baseColor.tbgr : -1, rhs.baseColor ? rhs.baseColor.tbgr : -1);\r\n if (0 === cmp) {\r\n cmp = compareBooleans(lhs.baseTransparent, rhs.baseTransparent);\r\n if (0 === cmp) {\r\n cmp = compareBooleans(lhs.mapTransparent, rhs.mapTransparent);\r\n if (0 === cmp) {\r\n cmp = compareBooleans(lhs.applyTerrain, rhs.applyTerrain);\r\n if (0 === cmp) {\r\n if (lhs.applyTerrain) {\r\n // Terrain-only settings.\r\n cmp = compareStrings(lhs.terrainProviderName, rhs.terrainProviderName);\r\n if (0 === cmp) {\r\n cmp = compareNumbers(lhs.terrainHeightOrigin, rhs.terrainHeightOrigin);\r\n if (0 === cmp) {\r\n cmp = compareNumbers(lhs.terrainHeightOriginMode, rhs.terrainHeightOriginMode);\r\n if (0 === cmp)\r\n cmp = compareNumbers(lhs.terrainExaggeration, rhs.terrainExaggeration);\r\n }\r\n }\r\n } else {\r\n // Non-Terrain (flat) settings.\r\n cmp = compareNumbers(lhs.mapGroundBias, rhs.mapGroundBias);\r\n if (0 === cmp)\r\n cmp = compareBooleans(lhs.useDepthBuffer, rhs.useDepthBuffer);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n return cmp;\r\n }\r\n\r\n private async computeHeightBias(heightOrigin: number, heightOriginMode: TerrainHeightOriginMode, exaggeration: number, iModel: IModelConnection, elevationProvider: BingElevationProvider): Promise<number> {\r\n const projectCenter = iModel.projectExtents.center;\r\n switch (heightOriginMode) {\r\n case TerrainHeightOriginMode.Ground:\r\n return heightOrigin + exaggeration * (await elevationProvider.getHeightValue(projectCenter, iModel, true));\r\n\r\n case TerrainHeightOriginMode.Geodetic:\r\n return heightOrigin;\r\n\r\n case TerrainHeightOriginMode.Geoid:\r\n return heightOrigin + await elevationProvider.getGeodeticToSeaLevelOffset(projectCenter, iModel);\r\n }\r\n }\r\n\r\n public async createTileTree(id: MapTreeId, iModel: IModelConnection): Promise<TileTree | undefined> {\r\n let bimElevationBias = 0, terrainProvider, geodeticOffset = 0;\r\n let applyTerrain = id.applyTerrain;\r\n const modelId = iModel.transientIds.next;\r\n const gcsConverterAvailable = await getGcsConverterAvailable(iModel);\r\n\r\n if (id.applyTerrain) {\r\n assert(id.terrainProviderName === \"CesiumWorldTerrain\");\r\n await ApproximateTerrainHeights.instance.initialize();\r\n const elevationProvider = new BingElevationProvider();\r\n\r\n bimElevationBias = - await this.computeHeightBias(id.terrainHeightOrigin, id.terrainHeightOriginMode, id.terrainExaggeration, iModel, elevationProvider);\r\n geodeticOffset = await elevationProvider.getGeodeticToSeaLevelOffset(iModel.projectExtents.center, iModel);\r\n terrainProvider = await getCesiumTerrainProvider(iModel, modelId, id.wantSkirts, id.wantNormals, id.terrainExaggeration);\r\n\r\n if (!terrainProvider) {\r\n applyTerrain = false;\r\n geodeticOffset = 0;\r\n }\r\n }\r\n\r\n if (!terrainProvider) {\r\n terrainProvider = new EllipsoidTerrainProvider(iModel, modelId, id.wantSkirts);\r\n bimElevationBias = id.mapGroundBias;\r\n }\r\n\r\n const loader = new MapTileLoader(iModel, modelId, bimElevationBias, terrainProvider);\r\n const ecefToDb = iModel.getMapEcefToDb(bimElevationBias);\r\n\r\n if (id.maskModelIds)\r\n await iModel.models.load(CompressedId64Set.decompressSet(id.maskModelIds));\r\n\r\n const treeProps = new MapTileTreeProps(modelId, loader, iModel, gcsConverterAvailable);\r\n return new MapTileTree(treeProps, ecefToDb, bimElevationBias, geodeticOffset, terrainProvider.tilingScheme, id, applyTerrain);\r\n }\r\n}\r\n\r\nconst mapTreeSupplier = new MapTreeSupplier();\r\n\r\n/** @internal */\r\ntype CheckTerrainDisplayOverride = () => TerrainDisplayOverrides | undefined;\r\n\r\n/** Specialization of tile tree that represents background map.\r\n * @internal\r\n */\r\nexport class MapTileTreeReference extends TileTreeReference {\r\n private _viewportId: number;\r\n private _settings: BackgroundMapSettings;\r\n private readonly _iModel: IModelConnection;\r\n private _baseImageryLayerIncluded = false;\r\n private _baseColor?: ColorDef;\r\n private readonly _imageryTrees: ImageryMapLayerTreeReference[] = new Array<ImageryMapLayerTreeReference>();\r\n private _baseTransparent = false;\r\n private _symbologyOverrides: FeatureSymbology.Overrides | undefined;\r\n private _planarClipMask?: PlanarClipMaskState;\r\n\r\n public constructor(settings: BackgroundMapSettings, private _baseLayerSettings: BaseLayerSettings | undefined, private _layerSettings: MapLayerSettings[], iModel: IModelConnection, viewportId: number, public isOverlay: boolean, private _isDrape: boolean, private _overrideTerrainDisplay?: CheckTerrainDisplayOverride) {\r\n super();\r\n this._viewportId = viewportId;\r\n this._settings = settings;\r\n this._iModel = iModel;\r\n let tree;\r\n if (!isOverlay && this._baseLayerSettings !== undefined) {\r\n if (this._baseLayerSettings instanceof MapLayerSettings) {\r\n tree = IModelApp.mapLayerFormatRegistry.createImageryMapLayerTree(this._baseLayerSettings, 0, iModel);\r\n this._baseTransparent = this._baseLayerSettings.transparency > 0;\r\n } else {\r\n this._baseColor = this._baseLayerSettings;\r\n this._baseTransparent = this._baseColor?.getTransparency() > 0;\r\n }\r\n }\r\n\r\n if (this._baseImageryLayerIncluded = (undefined !== tree))\r\n this._imageryTrees.push(tree);\r\n\r\n for (let i = 0; i < this._layerSettings.length; i++)\r\n if (undefined !== (tree = IModelApp.mapLayerFormatRegistry.createImageryMapLayerTree(this._layerSettings[i], i + 1, iModel)))\r\n this._imageryTrees.push(tree);\r\n\r\n if (this._settings.planarClipMask && this._settings.planarClipMask.isValid)\r\n this._planarClipMask = PlanarClipMaskState.create(this._settings.planarClipMask);\r\n }\r\n public override get isGlobal() { return true; }\r\n public get baseColor(): ColorDef | undefined { return this._baseColor; }\r\n public override get planarclipMaskPriority(): number { return PlanarClipMaskPriority.BackgroundMap; }\r\n\r\n /** Terrain tiles do not contribute to the range used by \"fit view\". */\r\n public override unionFitRange(_range: Range3d): void { }\r\n public get settings(): BackgroundMapSettings { return this._settings; }\r\n public set settings(settings: BackgroundMapSettings) {\r\n this._settings = settings;\r\n this._planarClipMask = settings.planarClipMask ? PlanarClipMaskState.create(settings.planarClipMask) : undefined;\r\n }\r\n public setBaseLayerSettings(baseLayerSettings: BaseLayerSettings) {\r\n assert(!this.isOverlay);\r\n let tree;\r\n this._baseLayerSettings = baseLayerSettings;\r\n\r\n if (baseLayerSettings instanceof MapLayerSettings) {\r\n tree = IModelApp.mapLayerFormatRegistry.createImageryMapLayerTree(baseLayerSettings, 0, this._iModel);\r\n this._baseColor = undefined;\r\n this._baseTransparent = baseLayerSettings.transparency > 0;\r\n } else {\r\n this._baseColor = baseLayerSettings;\r\n this._baseTransparent = this._baseColor.getTransparency() > 0;\r\n }\r\n\r\n if (tree) {\r\n if (this._baseImageryLayerIncluded)\r\n this._imageryTrees[0] = tree;\r\n else\r\n this._imageryTrees.splice(0, 0, tree);\r\n } else {\r\n if (this._baseImageryLayerIncluded)\r\n this._imageryTrees.shift();\r\n }\r\n this._baseImageryLayerIncluded = tree !== undefined;\r\n this.clearLayers();\r\n }\r\n public get layerSettings(): MapLayerSettings[] {\r\n return this._layerSettings;\r\n }\r\n\r\n public setLayerSettings(layerSettings: MapLayerSettings[]) {\r\n this._layerSettings = layerSettings;\r\n const baseLayerIndex = this._baseImageryLayerIncluded ? 1 : 0;\r\n\r\n this._imageryTrees.length = Math.min(layerSettings.length + baseLayerIndex, this._imageryTrees.length); // Truncate if number of layers reduced.\r\n for (let i = 0; i < layerSettings.length; i++) {\r\n const treeIndex = i + baseLayerIndex;\r\n if (treeIndex >= this._imageryTrees.length || !this._imageryTrees[treeIndex].layerSettings.displayMatches(layerSettings[i]))\r\n this._imageryTrees[treeIndex] = IModelApp.mapLayerFormatRegistry.createImageryMapLayerTree(layerSettings[i], treeIndex, this._iModel)!;\r\n }\r\n this.clearLayers();\r\n }\r\n\r\n public clearLayers() {\r\n const tree = this.treeOwner.tileTree as MapTileTree;\r\n if (undefined !== tree)\r\n tree.clearLayers();\r\n }\r\n\r\n public override get castsShadows() {\r\n return false;\r\n }\r\n\r\n protected override get _isLoadingComplete(): boolean {\r\n // Wait until drape tree is fully loaded too.\r\n for (const drapeTree of this._imageryTrees)\r\n if (!drapeTree.isLoadingComplete)\r\n return false;\r\n\r\n return super._isLoadingComplete;\r\n }\r\n public get useDepthBuffer() {\r\n return !this.isOverlay && (this.settings.applyTerrain || this.settings.useDepthBuffer);\r\n }\r\n\r\n public get treeOwner(): TileTreeOwner {\r\n let wantSkirts = (this.settings.applyTerrain || this.useDepthBuffer) && !this.settings.transparency && !this._baseTransparent;\r\n if (wantSkirts) {\r\n const maskTrans = this._planarClipMask?.settings.transparency;\r\n wantSkirts = (undefined === maskTrans || maskTrans <= 0);\r\n }\r\n\r\n const id: MapTreeId = {\r\n viewportId: this._viewportId,\r\n applyTerrain: this.settings.applyTerrain && !this.isOverlay && !this._isDrape,\r\n terrainProviderName: this.settings.terrainSettings.providerName,\r\n terrainHeightOrigin: this.settings.terrainSettings.heightOrigin,\r\n terrainHeightOriginMode: this.settings.terrainSettings.heightOriginMode,\r\n terrainExaggeration: this.settings.terrainSettings.exaggeration,\r\n mapGroundBias: this.settings.groundBias,\r\n wantSkirts,\r\n // Can set to this.settings.terrainSettings.applyLighting if we want to ever apply lighting to terrain again so that normals are retrieved when lighting is on.\r\n wantNormals: false,\r\n globeMode: this._isDrape ? GlobeMode.Plane : this.settings.globeMode,\r\n isOverlay: this.isOverlay,\r\n useDepthBuffer: this.useDepthBuffer,\r\n baseColor: this._baseColor,\r\n baseTransparent: this._baseTransparent,\r\n mapTransparent: this.settings.transparency > 0,\r\n maskModelIds: this._planarClipMask?.settings.compressedModelIds,\r\n };\r\n\r\n if (undefined !== this._overrideTerrainDisplay) {\r\n const ovr = this._overrideTerrainDisplay();\r\n if (undefined !== ovr) {\r\n id.wantSkirts = ovr.wantSkirts ?? id.wantSkirts;\r\n id.wantNormals = ovr.wantNormals ?? id.wantNormals;\r\n }\r\n }\r\n\r\n return this._iModel.tiles.getTileTreeOwner(id, mapTreeSupplier);\r\n }\r\n public getLayerImageryTreeRef(index: number) {\r\n const baseLayerIndex = this._baseImageryLayerIncluded ? 1 : 0;\r\n const treeIndex = index + baseLayerIndex;\r\n return index < 0 || treeIndex >= this._imageryTrees.length ? undefined : this._imageryTrees[treeIndex];\r\n }\r\n\r\n public initializeImagery(): boolean {\r\n const tree = this.treeOwner.load() as MapTileTree;\r\n if (undefined === tree)\r\n return false; // Not loaded yet.\r\n\r\n tree.imageryTrees.length = 0;\r\n if (0 === this._imageryTrees.length)\r\n return !this.isOverlay;\r\n\r\n let treeIndex = this._imageryTrees.length - 1;\r\n // Start displaying at the highest completely opaque layer...\r\n for (; treeIndex >= 1; treeIndex--) {\r\n const imageryTreeRef = this._imageryTrees[treeIndex];\r\n const layerSettings = imageryTreeRef.layerSettings;\r\n if (layerSettings.visible && !imageryTreeRef.layerSettings.allSubLayersInvisible && !layerSettings.transparentBackground && 0 === layerSettings.transparency)\r\n break; // This layer is completely opaque and will obscure all others so ignore lower ones.\r\n }\r\n for (; treeIndex < this._imageryTrees.length; treeIndex++) {\r\n const imageryTreeRef = this._imageryTrees[treeIndex];\r\n if (TileTreeLoadStatus.NotFound !== imageryTreeRef.treeOwner.loadStatus && imageryTreeRef.layerSettings.visible && !imageryTreeRef.layerSettings.allSubLayersInvisible) {\r\n const imageryTree = imageryTreeRef.treeOwner.load();\r\n if (undefined === imageryTree)\r\n return false; // Not loaded yet.\r\n tree.addImageryLayer(imageryTree as ImageryMapTileTree, imageryTreeRef.layerSettings);\r\n }\r\n }\r\n\r\n return true;\r\n }\r\n\r\n /** Adds this reference's graphics to the scene. By default this invokes [[TileTree.drawScene]] on the referenced TileTree, if it is loaded. */\r\n public override addToScene(context: SceneContext): void {\r\n if (!context.viewFlags.backgroundMap)\r\n return;\r\n\r\n const tree = this.treeOwner.load() as MapTileTree;\r\n if (undefined === tree || !this.initializeImagery())\r\n return; // Not loaded yet.\r\n\r\n if (this._planarClipMask && this._planarClipMask.settings.isValid)\r\n context.addPlanarClassifier(tree.modelId, undefined, this._planarClipMask);\r\n\r\n const nonLocatable = this.settings.locatable ? undefined : true;\r\n const transparency = this.settings.transparency ? this.settings.transparency : undefined;\r\n this._symbologyOverrides = new FeatureSymbology.Overrides();\r\n if (nonLocatable || transparency) {\r\n this._symbologyOverrides.override({\r\n modelId: tree.modelId,\r\n appearance: FeatureAppearance.fromJSON({ transparency, nonLocatable }),\r\n });\r\n }\r\n\r\n const args = this.createDrawArgs(context);\r\n if (undefined !== args)\r\n tree.draw(args);\r\n\r\n tree.clearImageryLayers();\r\n }\r\n\r\n public override createDrawArgs(context: SceneContext): TileDrawArgs | undefined {\r\n const args = super.createDrawArgs(context);\r\n if (undefined === args)\r\n return undefined;\r\n\r\n return new RealityTileDrawArgs(args, args.worldToViewMap, args.frustumPlanes);\r\n }\r\n\r\n protected override getViewFlagOverrides(_tree: TileTree) {\r\n return createViewFlagOverrides(false, this._settings.applyTerrain ? undefined : false);\r\n }\r\n\r\n protected override getSymbologyOverrides(_tree: TileTree) {\r\n return this._symbologyOverrides;\r\n }\r\n\r\n public override discloseTileTrees(trees: DisclosedTileTreeSet): void {\r\n super.discloseTileTrees(trees);\r\n this._imageryTrees.forEach((imageryTree) => trees.disclose(imageryTree));\r\n if (this._planarClipMask)\r\n this._planarClipMask.discloseTileTrees(trees);\r\n }\r\n public imageryTreeFromTreeModelIds(mapTreeModelId: Id64String, layerTreeModelId: Id64String): ImageryMapLayerTreeReference | undefined {\r\n const tree = this.treeOwner.tileTree as MapTileTree;\r\n if (undefined === tree || tree.modelId !== mapTreeModelId)\r\n return undefined;\r\n\r\n for (const imageryTree of this._imageryTrees)\r\n if (imageryTree.treeOwner.tileTree && imageryTree.treeOwner.tileTree.modelId === layerTreeModelId)\r\n return imageryTree;\r\n\r\n return undefined;\r\n }\r\n public layerFromTreeModelIds(mapTreeModelId: Id64String, layerTreeModelId: Id64String): MapLayerSettings | undefined {\r\n const imageryTree = this.imageryTreeFromTreeModelIds(mapTreeModelId, layerTreeModelId);\r\n return imageryTree === undefined ? imageryTree : imageryTree.layerSettings;\r\n }\r\n\r\n public override async getToolTip(hit: HitDetail): Promise<HTMLElement | string | undefined> {\r\n const tree = this.treeOwner.tileTree as MapTileTree;\r\n // eslint-disable-next-line @typescript-eslint/unbound-method\r\n if (undefined === tree || hit.iModel !== tree.iModel || tree.modelId !== hit.modelId || !hit.viewport || !hit.viewport.view.is3d)\r\n return undefined;\r\n\r\n const backgroundMapGeometry = hit.viewport.displayStyle.getBackgroundMapGeometry();\r\n if (undefined === backgroundMapGeometry)\r\n return undefined;\r\n\r\n const worldPoint = hit.hitPoint.clone();\r\n const cartoGraphic = await backgroundMapGeometry.dbToCartographicFromGcs(worldPoint);\r\n const strings = [];\r\n const imageryTreeRef = this.imageryTreeFromTreeModelIds(hit.modelId, hit.sourceId);\r\n if (imageryTreeRef !== undefined) {\r\n strings.push(`Imagery Layer: ${imageryTreeRef.layerSettings.name}`);\r\n if (hit.tileId !== undefined) {\r\n const terrainQuadId = QuadId.createFromContentId(hit.tileId);\r\n const terrainTile = tree.tileFromQuadId(terrainQuadId);\r\n if (terrainTile && terrainTile.imageryTiles) {\r\n const imageryTree = imageryTreeRef.treeOwner.tileTree as ImageryMapTileTree;\r\n if (imageryTree) {\r\n for (const imageryTile of terrainTile.imageryTiles) {\r\n if (imageryTree === imageryTile.imageryTree && imageryTile.rectangle.containsCartographic(cartoGraphic))\r\n await imageryTree.imageryLoader.getToolTip(strings, imageryTile.quadId, cartoGraphic, imageryTree);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n\r\n strings.push(`Latitude: ${cartoGraphic.latitudeDegrees.toFixed(4)}`);\r\n strings.push(`Longitude: ${cartoGraphic.longitudeDegrees.toFixed(4)}`);\r\n if (this.settings.applyTerrain) {\r\n const geodeticHeight = (cartoGraphic.height - tree.bimElevationBias) / tree.terrainExaggeration;\r\n strings.push(`Height (Meters) Geodetic: ${geodeticHeight.toFixed(1)} Sea Level: ${(geodeticHeight - tree.geodeticOffset).toFixed(1)}`);\r\n }\r\n const div = document.createElement(\"div\");\r\n div.innerHTML = strings.join(\"<br>\");\r\n return div;\r\n }\r\n\r\n /** Add logo cards to logo div. */\r\n public override addLogoCards(cards: HTMLTableElement, vp: ScreenViewport): void {\r\n const tree = this.treeOwner.tileTree as MapTileTree;\r\n let logo;\r\n if (tree) {\r\n if (undefined !== (logo = tree.mapLoader.terrainProvider.getLogo()))\r\n cards.appendChild(logo);\r\n for (const imageryTreeRef of this._imageryTrees) {\r\n if (imageryTreeRef.layerSettings.visible) {\r\n const imageryTree = imageryTreeRef.treeOwner.tileTree as ImageryMapTileTree;\r\n if (imageryTree && (undefined !== (logo = imageryTree.getLogo(vp))))\r\n cards.appendChild(logo);\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\n/** Returns whether a GCS converter is available.\r\n * @internal\r\n */\r\nexport async function getGcsConverterAvailable(iModel: IModelConnection) {\r\n if (iModel.noGcsDefined)\r\n return false;\r\n\r\n // Determine if we have a usable GCS.\r\n const converter = iModel.geoServices.getConverter(\"WGS84\");\r\n if (undefined === converter)\r\n return false;\r\n const requestProps: XYZProps[] = [{ x: 0, y: 0, z: 0 }];\r\n let haveConverter;\r\n try {\r\n const responseProps = await converter.getIModelCoordinatesFromGeoCoordinates(requestProps);\r\n haveConverter = responseProps.iModelCoords.length === 1 && responseProps.iModelCoords[0].s !== GeoCoordStatus.NoGCSDefined;\r\n } catch {\r\n haveConverter = false;\r\n }\r\n return haveConverter;\r\n}\r\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"CesiumTerrainProvider.d.ts","sourceRoot":"","sources":["../../../../src/tile/map/CesiumTerrainProvider.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,OAAO,EAA+C,UAAU,EAA2B,MAAM,qBAAqB,CAAC;AAMvH,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D,OAAO,EAC2F,mBAAmB,EACpH,MAAM,aAAa,CAAC;AASrB;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAEhF;AACD,gBAAgB;AAChB,wBAAgB,wBAAwB,IAAI,MAAM,GAAG,SAAS,CAO7D;AAED,gBAAgB;AAChB,wBAAsB,kCAAkC,CAAC,OAAO,SAAI,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAuBpI;AAED,gBAAgB;AAChB,wBAAsB,wBAAwB,CAAC,MAAM,EAAE,gBAAgB,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,GAAG,SAAS,CAAC,CA8CvM"}
1
+ {"version":3,"file":"CesiumTerrainProvider.d.ts","sourceRoot":"","sources":["../../../../src/tile/map/CesiumTerrainProvider.ts"],"names":[],"mappings":"AAKA;;GAEG;AACH,OAAO,EAA+C,UAAU,EAA2B,MAAM,qBAAqB,CAAC;AAOvH,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D,OAAO,EAC2F,mBAAmB,EACpH,MAAM,aAAa,CAAC;AASrB;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,MAAM,CAEhF;AACD,gBAAgB;AAChB,wBAAgB,wBAAwB,IAAI,MAAM,GAAG,SAAS,CAO7D;AAED,gBAAgB;AAChB,wBAAsB,kCAAkC,CAAC,OAAO,SAAI,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAuBpI;AAaD,gBAAgB;AAChB,wBAAsB,wBAAwB,CAAC,MAAM,EAAE,gBAAgB,EAAE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAAC,mBAAmB,GAAG,SAAS,CAAC,CAiDvM"}
@@ -8,6 +8,7 @@
8
8
  import { assert, BeDuration, BeTimePoint, ByteStream, JsonUtils, utf8ToString } from "@itwin/core-bentley";
9
9
  import { Point2d, Point3d, Range1d, Vector3d } from "@itwin/core-geometry";
10
10
  import { nextPoint3d64FromByteStream, OctEncodedNormal, QParams3d, QPoint2d } from "@itwin/core-common";
11
+ import { MessageSeverity } from "@itwin/appui-abstract";
11
12
  import { request } from "@bentley/itwin-client";
12
13
  import { ApproximateTerrainHeights } from "../../ApproximateTerrainHeights";
13
14
  import { IModelApp } from "../../IModelApp";
@@ -57,28 +58,38 @@ export async function getCesiumAccessTokenAndEndpointUrl(assetId = 1, requestKey
57
58
  return {};
58
59
  }
59
60
  }
61
+ let notifiedTerrainError = false;
62
+ // Notify - once per session - of failure to obtain Cesium terrain provider.
63
+ function notifyTerrainError(detailedDescription) {
64
+ if (notifiedTerrainError)
65
+ return;
66
+ notifiedTerrainError = true;
67
+ IModelApp.notifications.displayMessage(MessageSeverity.Information, IModelApp.localization.getLocalizedString(`BackgroundMap.CannotObtainTerrain`), detailedDescription);
68
+ }
60
69
  /** @internal */
61
70
  export async function getCesiumTerrainProvider(iModel, modelId, wantSkirts, wantNormals, exaggeration) {
62
- let layers;
63
71
  const accessTokenAndEndpointUrl = await getCesiumAccessTokenAndEndpointUrl();
64
- if (!accessTokenAndEndpointUrl.token || !accessTokenAndEndpointUrl.url)
72
+ if (!accessTokenAndEndpointUrl.token || !accessTokenAndEndpointUrl.url) {
73
+ notifyTerrainError(IModelApp.localization.getLocalizedString(`BackgroundMap.MissingCesiumToken`));
65
74
  return undefined;
75
+ }
76
+ let layers;
66
77
  try {
67
78
  const layerRequestOptions = { method: "GET", responseType: "json", headers: { authorization: `Bearer ${accessTokenAndEndpointUrl.token}` } };
68
79
  const layerUrl = `${accessTokenAndEndpointUrl.url}layer.json`;
69
80
  const layerResponse = await request(layerUrl, layerRequestOptions);
70
81
  if (undefined === layerResponse) {
71
- assert(false);
82
+ notifyTerrainError();
72
83
  return undefined;
73
84
  }
74
85
  layers = layerResponse.body;
75
86
  }
76
87
  catch (error) {
77
- assert(false);
88
+ notifyTerrainError();
78
89
  return undefined;
79
90
  }
80
91
  if (undefined === layers.tiles || undefined === layers.version) {
81
- assert(false);
92
+ notifyTerrainError();
82
93
  return undefined;
83
94
  }
84
95
  const tilingScheme = new GeographicTilingScheme();
@@ -1 +1 @@
1
- {"version":3,"file":"CesiumTerrainProvider.js","sourceRoot":"","sources":["../../../../src/tile/map/CesiumTerrainProvider.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\n/** @packageDocumentation\r\n * @module Tiles\r\n */\r\nimport { assert, BeDuration, BeTimePoint, ByteStream, Id64String, JsonUtils, utf8ToString } from \"@itwin/core-bentley\";\r\nimport { Point2d, Point3d, Range1d, Vector3d } from \"@itwin/core-geometry\";\r\nimport { nextPoint3d64FromByteStream, OctEncodedNormal, QParams3d, QPoint2d } from \"@itwin/core-common\";\r\nimport { request, RequestOptions } from \"@bentley/itwin-client\";\r\nimport { ApproximateTerrainHeights } from \"../../ApproximateTerrainHeights\";\r\nimport { IModelApp } from \"../../IModelApp\";\r\nimport { IModelConnection } from \"../../IModelConnection\";\r\nimport { TerrainMeshPrimitive } from \"../../render/primitives/mesh/TerrainMeshPrimitive\";\r\nimport {\r\n GeographicTilingScheme, MapCartoRectangle, MapTile, MapTileProjection, MapTilingScheme, QuadId, TerrainMeshProvider, Tile, TileAvailability,\r\n} from \"../internal\";\r\n\r\n/** @internal */\r\nenum QuantizedMeshExtensionIds {\r\n OctEncodedNormals = 1,\r\n WaterMask = 2,\r\n Metadata = 4,\r\n}\r\n\r\n/** Return the URL for a Cesium ION asset from its asset ID and request Key.\r\n * @public\r\n */\r\nexport function getCesiumAssetUrl(osmAssetId: number, requestKey: string): string {\r\n return `$CesiumIonAsset=${osmAssetId}:${requestKey}`;\r\n}\r\n/** @internal */\r\nexport function getCesiumOSMBuildingsUrl(): string | undefined {\r\n const key = IModelApp.tileAdmin.cesiumIonKey;\r\n if (undefined === key)\r\n return undefined;\r\n\r\n const osmBuildingAssetId = 96188;\r\n return getCesiumAssetUrl(osmBuildingAssetId, key);\r\n}\r\n\r\n/** @internal */\r\nexport async function getCesiumAccessTokenAndEndpointUrl(assetId = 1, requestKey?: string): Promise<{ token?: string, url?: string }> {\r\n\r\n if (undefined === requestKey) {\r\n requestKey = IModelApp.tileAdmin.cesiumIonKey;\r\n if (undefined === requestKey)\r\n return {};\r\n }\r\n\r\n const requestTemplate = `https://api.cesium.com/v1/assets/${assetId}/endpoint?access_token={CesiumRequestToken}`;\r\n const apiUrl: string = requestTemplate.replace(\"{CesiumRequestToken}\", requestKey);\r\n const apiRequestOptions: RequestOptions = { method: \"GET\", responseType: \"json\" };\r\n\r\n try {\r\n const apiResponse = await request(apiUrl, apiRequestOptions);\r\n if (undefined === apiResponse || undefined === apiResponse.body || undefined === apiResponse.body.url) {\r\n assert(false);\r\n return {};\r\n }\r\n return { token: apiResponse.body.accessToken, url: apiResponse.body.url };\r\n } catch (error) {\r\n assert(false);\r\n return {};\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport async function getCesiumTerrainProvider(iModel: IModelConnection, modelId: Id64String, wantSkirts: boolean, wantNormals: boolean, exaggeration: number): Promise<TerrainMeshProvider | undefined> {\r\n let layers;\r\n\r\n const accessTokenAndEndpointUrl = await getCesiumAccessTokenAndEndpointUrl();\r\n if (!accessTokenAndEndpointUrl.token || !accessTokenAndEndpointUrl.url)\r\n return undefined;\r\n\r\n try {\r\n const layerRequestOptions: RequestOptions = { method: \"GET\", responseType: \"json\", headers: { authorization: `Bearer ${accessTokenAndEndpointUrl.token}` } };\r\n const layerUrl = `${accessTokenAndEndpointUrl.url}layer.json`;\r\n const layerResponse = await request(layerUrl, layerRequestOptions);\r\n if (undefined === layerResponse) {\r\n assert(false);\r\n return undefined;\r\n }\r\n layers = layerResponse.body;\r\n\r\n } catch (error) {\r\n assert(false);\r\n return undefined;\r\n }\r\n if (undefined === layers.tiles || undefined === layers.version) {\r\n assert(false);\r\n return undefined;\r\n }\r\n const tilingScheme = new GeographicTilingScheme();\r\n let tileAvailability;\r\n if (undefined !== layers.available) {\r\n const availableTiles = layers.available;\r\n tileAvailability = new TileAvailability(tilingScheme, availableTiles.length);\r\n for (let level = 0; level < layers.available.length; level++) {\r\n const rangesAtLevel = availableTiles[level];\r\n for (const range of rangesAtLevel) {\r\n tileAvailability.addAvailableTileRange(level, range.startX, range.startY, range.endX, range.endY);\r\n }\r\n }\r\n }\r\n\r\n let tileUrlTemplate = accessTokenAndEndpointUrl.url + layers.tiles[0].replace(\"{version}\", layers.version);\r\n if (wantNormals)\r\n tileUrlTemplate = tileUrlTemplate.replace(\"?\", \"?extensions=octvertexnormals-watermask-metadata&\");\r\n\r\n const maxDepth = JsonUtils.asInt(layers.maxzoom, 19);\r\n\r\n // TBD -- When we have an API extract the heights for the project from the terrain tiles - for use temporary Bing elevation.\r\n return new CesiumTerrainProvider(iModel, modelId, accessTokenAndEndpointUrl.token, tileUrlTemplate, maxDepth, wantSkirts, tilingScheme, tileAvailability, layers.metadataAvailability, exaggeration);\r\n}\r\nfunction zigZagDecode(value: number) {\r\n return (value >> 1) ^ (-(value & 1));\r\n}\r\n/**\r\n * Decodes delta and ZigZag encoded vertices. This modifies the buffers in place.\r\n *\r\n * @see {@link https://github.com/AnalyticalGraphicsInc/quantized-mesh|quantized-mesh-1.0 terrain format}\r\n */\r\nfunction zigZagDeltaDecode(uBuffer: Uint16Array, vBuffer: Uint16Array, heightBuffer: Uint16Array) {\r\n const count = uBuffer.length;\r\n let u = 0;\r\n let v = 0;\r\n let height = 0;\r\n\r\n for (let i = 0; i < count; ++i) {\r\n u += zigZagDecode(uBuffer[i]);\r\n v += zigZagDecode(vBuffer[i]);\r\n\r\n uBuffer[i] = u;\r\n vBuffer[i] = v;\r\n\r\n height += zigZagDecode(heightBuffer[i]);\r\n heightBuffer[i] = height;\r\n }\r\n}\r\n\r\nfunction getIndexArray(vertexCount: number, streamBuffer: ByteStream, indexCount: number): Uint16Array | Uint32Array {\r\n const indicesAre32Bit = vertexCount > 64 * 1024;\r\n const indexArray = (indicesAre32Bit) ? new Uint32Array(streamBuffer.arrayBuffer, streamBuffer.curPos, indexCount) : new Uint16Array(streamBuffer.arrayBuffer, streamBuffer.curPos, indexCount);\r\n streamBuffer.advance(indexCount * (indicesAre32Bit ? Uint32Array.BYTES_PER_ELEMENT : Uint16Array.BYTES_PER_ELEMENT));\r\n return indexArray;\r\n}\r\n\r\n/** @internal */\r\nclass CesiumTerrainProvider extends TerrainMeshProvider {\r\n private static _scratchQPoint2d = QPoint2d.fromScalars(0, 0);\r\n private static _scratchPoint2d = Point2d.createZero();\r\n private static _scratchPoint = Point3d.createZero();\r\n private static _scratchNormal = Vector3d.createZero();\r\n private static _scratchHeightRange = Range1d.createNull();\r\n private static _tokenTimeoutInterval = BeDuration.fromSeconds(60 * 30); // Request a new access token every 30 minutes...\r\n private _tokenTimeOut: BeTimePoint;\r\n\r\n public override forceTileLoad(tile: Tile): boolean {\r\n // Force loading of the metadata availability tiles as these are required for determining the availability of descendants.\r\n const mapTile = tile as MapTile;\r\n return undefined !== this._metaDataAvailableLevel && mapTile.quadId.level === this._metaDataAvailableLevel && !mapTile.everLoaded;\r\n }\r\n\r\n constructor(iModel: IModelConnection, modelId: Id64String, private _accessToken: string, private _tileUrlTemplate: string,\r\n private _maxDepth: number, private readonly _wantSkirts: boolean, private _tilingScheme: MapTilingScheme, private _tileAvailability: TileAvailability | undefined, private _metaDataAvailableLevel: number | undefined, private _exaggeration: number) {\r\n super(iModel, modelId);\r\n this._tokenTimeOut = BeTimePoint.now().plus(CesiumTerrainProvider._tokenTimeoutInterval);\r\n }\r\n\r\n public override getLogo(): HTMLTableRowElement {\r\n return IModelApp.makeLogoCard({ iconSrc: `${IModelApp.publicPath}images/cesium-ion.svg`, heading: \"Cesium Ion\", notice: IModelApp.localization.getLocalizedString(\"iModelJs:BackgroundMap.CesiumWorldTerrainAttribution\") });\r\n }\r\n\r\n public get maxDepth(): number { return this._maxDepth; }\r\n public get tilingScheme(): MapTilingScheme { return this._tilingScheme; }\r\n\r\n public isTileAvailable(quadId: QuadId) {\r\n if (quadId.level > this.maxDepth)\r\n return false;\r\n\r\n return this._tileAvailability ? this._tileAvailability.isTileAvailable(quadId.level, quadId.column, quadId.row) : true;\r\n }\r\n\r\n public override async getMesh(tile: MapTile, data: Uint8Array): Promise<TerrainMeshPrimitive | undefined> {\r\n if (BeTimePoint.now().milliseconds > this._tokenTimeOut.milliseconds) {\r\n const accessTokenAndEndpointUrl = await getCesiumAccessTokenAndEndpointUrl();\r\n if (!accessTokenAndEndpointUrl.token) {\r\n assert(false);\r\n return undefined;\r\n }\r\n\r\n this._accessToken = accessTokenAndEndpointUrl.token;\r\n this._tokenTimeOut = BeTimePoint.now().plus(CesiumTerrainProvider._tokenTimeoutInterval);\r\n }\r\n\r\n assert(data instanceof Uint8Array);\r\n assert(tile instanceof MapTile);\r\n const blob = data;\r\n const streamBuffer = new ByteStream(blob.buffer);\r\n const center = nextPoint3d64FromByteStream(streamBuffer);\r\n const quadId = QuadId.createFromContentId(tile.contentId);\r\n const skirtHeight = this.getLevelMaximumGeometricError(quadId.level + 1) * 10.0; // Add 1 to level to restore height calculation to before the quadId level was from root. (4326 unification)\r\n const minHeight = this._exaggeration * streamBuffer.nextFloat32;\r\n const maxHeight = this._exaggeration * streamBuffer.nextFloat32;\r\n const boundCenter = nextPoint3d64FromByteStream(streamBuffer);\r\n const boundRadius = streamBuffer.nextFloat64;\r\n const horizonOcclusion = nextPoint3d64FromByteStream(streamBuffer);\r\n const terrainTile = tile;\r\n\r\n terrainTile.adjustHeights(minHeight, maxHeight);\r\n\r\n if (undefined === center || undefined === boundCenter || undefined === boundRadius || undefined === horizonOcclusion) { }\r\n const pointCount = streamBuffer.nextUint32;\r\n const encodedVertexBuffer = new Uint16Array(blob.buffer, streamBuffer.curPos, pointCount * 3);\r\n streamBuffer.advance(pointCount * 6);\r\n\r\n const uBuffer = encodedVertexBuffer.subarray(0, pointCount);\r\n const vBuffer = encodedVertexBuffer.subarray(pointCount, 2 * pointCount);\r\n const heightBuffer = encodedVertexBuffer.subarray(pointCount * 2, 3 * pointCount);\r\n\r\n zigZagDeltaDecode(uBuffer, vBuffer, heightBuffer);\r\n\r\n let bytesPerIndex = Uint16Array.BYTES_PER_ELEMENT;\r\n const triangleElements = 3;\r\n\r\n if (pointCount > 64 * 1024) {\r\n // More than 64k vertices, so indices are 32-bit.\r\n bytesPerIndex = Uint32Array.BYTES_PER_ELEMENT;\r\n }\r\n\r\n // skip over any additional padding that was added for 2/4 byte alignment\r\n if (streamBuffer.curPos % bytesPerIndex !== 0)\r\n streamBuffer.advance(bytesPerIndex - (streamBuffer.curPos % bytesPerIndex));\r\n\r\n const triangleCount = streamBuffer.nextUint32;\r\n const indexCount = triangleCount * triangleElements;\r\n\r\n const indices = getIndexArray(pointCount, streamBuffer, indexCount);\r\n // High water mark decoding based on decompressIndices_ in webgl-loader's loader.js.\r\n // https://code.google.com/p/webgl-loader/source/browse/trunk/samples/loader.js?r=99#55\r\n // Copyright 2012 Google Inc., Apache 2.0 license.\r\n let highest = 0;\r\n const length = indices.length;\r\n for (let i = 0; i < length; ++i) {\r\n const code = indices[i];\r\n indices[i] = highest - code;\r\n if (code === 0) {\r\n ++highest;\r\n }\r\n }\r\n\r\n CesiumTerrainProvider._scratchHeightRange.low = minHeight - skirtHeight;\r\n CesiumTerrainProvider._scratchHeightRange.high = maxHeight;\r\n const projection = terrainTile.getProjection(CesiumTerrainProvider._scratchHeightRange);\r\n const pointQParams = QParams3d.fromRange(projection.localRange);\r\n\r\n const uvScale = 1.0 / 32767.0;\r\n const heightScale = uvScale * (maxHeight - minHeight);\r\n\r\n const westCount = streamBuffer.nextUint32;\r\n const westIndices = getIndexArray(pointCount, streamBuffer, westCount);\r\n\r\n const southCount = streamBuffer.nextUint32;\r\n const southIndices = getIndexArray(pointCount, streamBuffer, southCount);\r\n\r\n const eastCount = streamBuffer.nextUint32;\r\n const eastIndices = getIndexArray(pointCount, streamBuffer, eastCount);\r\n\r\n const northCount = streamBuffer.nextUint32;\r\n const northIndices = getIndexArray(pointCount, streamBuffer, northCount);\r\n\r\n // Extensions...\r\n let encodedNormalsBuffer;\r\n while (streamBuffer.curPos < streamBuffer.length) {\r\n const extensionId = streamBuffer.nextUint8;\r\n const extensionLength = streamBuffer.nextUint32;\r\n switch (extensionId) {\r\n case QuantizedMeshExtensionIds.OctEncodedNormals:\r\n assert(pointCount * 2 === extensionLength);\r\n encodedNormalsBuffer = new Uint8Array(streamBuffer.arrayBuffer, streamBuffer.curPos, extensionLength);\r\n streamBuffer.advance(extensionLength);\r\n break;\r\n\r\n case QuantizedMeshExtensionIds.Metadata:\r\n const stringLength = streamBuffer.nextUint32;\r\n if (stringLength > 0) {\r\n const strData = streamBuffer.nextBytes(stringLength);\r\n const str = utf8ToString(strData);\r\n if (undefined !== str) {\r\n const metaData = JSON.parse(str);\r\n if (undefined !== metaData.available && undefined !== this._tileAvailability) {\r\n const availableTiles = metaData.available;\r\n for (let offset = 0; offset < availableTiles.length; ++offset) {\r\n const availableLevel = tile.depth + offset; // Our depth is includes root (1 + cesium Depth)\r\n const rangesAtLevel = availableTiles[offset];\r\n\r\n for (const range of rangesAtLevel)\r\n this._tileAvailability.addAvailableTileRange(availableLevel, range.startX, range.startY, range.endX, range.endY);\r\n }\r\n }\r\n }\r\n }\r\n\r\n break;\r\n default:\r\n streamBuffer.advance(extensionLength);\r\n break;\r\n }\r\n\r\n }\r\n\r\n const mesh = TerrainMeshPrimitive.create({ pointQParams, pointCount, indexCount, wantSkirts: this._wantSkirts, westCount, eastCount, southCount, northCount, wantNormals: undefined !== encodedNormalsBuffer });\r\n for (let i = 0; i < indexCount;)\r\n this.addTriangle(mesh, indices[i++], indices[i++], indices[i++]);\r\n\r\n const worldToEcef = tile.iModel.getEcefTransform().matrix;\r\n for (let i = 0; i < pointCount; i++) {\r\n const u = uBuffer[i];\r\n const v = vBuffer[i];\r\n projection.getPoint(uvScale * u, uvScale * v, minHeight + heightBuffer[i] * heightScale, CesiumTerrainProvider._scratchPoint);\r\n CesiumTerrainProvider._scratchQPoint2d.setFromScalars(u * 2, v * 2);\r\n if (encodedNormalsBuffer) {\r\n const normalIndex = i * 2;\r\n OctEncodedNormal.decodeValue(encodedNormalsBuffer[normalIndex + 1] << 8 | encodedNormalsBuffer[normalIndex], CesiumTerrainProvider._scratchNormal);\r\n worldToEcef.multiplyTransposeVector(CesiumTerrainProvider._scratchNormal, CesiumTerrainProvider._scratchNormal);\r\n mesh.addVertex(CesiumTerrainProvider._scratchPoint, CesiumTerrainProvider._scratchQPoint2d, OctEncodedNormal.encode(CesiumTerrainProvider._scratchNormal));\r\n } else {\r\n mesh.addVertex(CesiumTerrainProvider._scratchPoint, CesiumTerrainProvider._scratchQPoint2d);\r\n }\r\n }\r\n\r\n if (this._wantSkirts) {\r\n westIndices.sort((a, b) => vBuffer[a] - vBuffer[b]);\r\n eastIndices.sort((a, b) => vBuffer[a] - vBuffer[b]);\r\n northIndices.sort((a, b) => uBuffer[a] - uBuffer[b]);\r\n southIndices.sort((a, b) => uBuffer[a] - uBuffer[b]);\r\n const wantNormals = (encodedNormalsBuffer !== undefined);\r\n this.generateSkirts(mesh, westIndices, projection, -skirtHeight, heightBuffer, minHeight, heightScale, wantNormals);\r\n this.generateSkirts(mesh, eastIndices, projection, -skirtHeight, heightBuffer, minHeight, heightScale, wantNormals);\r\n this.generateSkirts(mesh, southIndices, projection, -skirtHeight, heightBuffer, minHeight, heightScale, wantNormals);\r\n this.generateSkirts(mesh, northIndices, projection, -skirtHeight, heightBuffer, minHeight, heightScale, wantNormals);\r\n }\r\n assert(mesh.isCompleted);\r\n return mesh;\r\n }\r\n\r\n private addTriangle(mesh: TerrainMeshPrimitive, i0: number, i1: number, i2: number) {\r\n mesh.addTriangle(i0, i1, i2);\r\n }\r\n\r\n private generateSkirts(mesh: TerrainMeshPrimitive, indices: Uint16Array | Uint32Array, projection: MapTileProjection, skirtOffset: number, heightBuffer: Uint16Array, minHeight: number, heightScale: number, wantNormals: boolean) {\r\n for (let i = 0; i < indices.length; i++) {\r\n const index = indices[i];\r\n const paramIndex = index * 2;\r\n const height = minHeight + heightBuffer[index] * heightScale;\r\n CesiumTerrainProvider._scratchQPoint2d.setFromScalars(mesh.uvs[paramIndex], mesh.uvs[paramIndex + 1]);\r\n const uv = mesh.uvQParams.unquantize(CesiumTerrainProvider._scratchQPoint2d.x, CesiumTerrainProvider._scratchQPoint2d.y, CesiumTerrainProvider._scratchPoint2d);\r\n if (wantNormals && mesh.normals) {\r\n mesh.addVertex(projection.getPoint(uv.x, uv.y, height + skirtOffset), CesiumTerrainProvider._scratchQPoint2d, mesh.normals[index]);\r\n } else {\r\n mesh.addVertex(projection.getPoint(uv.x, uv.y, height + skirtOffset), CesiumTerrainProvider._scratchQPoint2d);\r\n }\r\n\r\n if (i) {\r\n this.addTriangle(mesh, index, indices[i - 1], mesh.nextPointIndex - 2);\r\n this.addTriangle(mesh, index, mesh.nextPointIndex - 2, mesh.nextPointIndex - 1);\r\n }\r\n }\r\n }\r\n public override get requestOptions(): RequestOptions {\r\n return { method: \"GET\", responseType: \"arraybuffer\", headers: { authorization: `Bearer ${this._accessToken}` }, accept: \"application/vnd.quantized-mesh;\" /* extensions=octvertexnormals, */ + \"application/octet-stream;q=0.9,*/*;q=0.01\" };\r\n }\r\n\r\n public override constructUrl(row: number, column: number, zoomLevel: number): string {\r\n return this._tileUrlTemplate.replace(\"{z}\", zoomLevel.toString()).replace(\"{x}\", column.toString()).replace(\"{y}\", row.toString());\r\n }\r\n\r\n public getChildHeightRange(quadId: QuadId, rectangle: MapCartoRectangle, parent: MapTile): Range1d | undefined {\r\n return (quadId.level < ApproximateTerrainHeights.maxLevel) ? ApproximateTerrainHeights.instance.getMinimumMaximumHeights(rectangle) : (parent).heightRange;\r\n }\r\n /**\r\n * Specifies the quality of terrain created from heightmaps. A value of 1.0 will\r\n * ensure that adjacent heightmap vertices are separated by no more than\r\n * screen pixels and will probably go very slowly.\r\n * A value of 0.5 will cut the estimated level zero geometric error in half, allowing twice the\r\n * screen pixels between adjacent heightmap vertices and thus rendering more quickly.\r\n * @type {Number}\r\n */\r\n public readonly heightmapTerrainQuality = 0.25;\r\n\r\n /**\r\n * Determines an appropriate geometric error estimate when the geometry comes from a heightmap.\r\n *\r\n * @param {Ellipsoid} ellipsoid The ellipsoid to which the terrain is attached.\r\n * @param {Number} tileImageWidth The width, in pixels, of the heightmap associated with a single tile.\r\n * @param {Number} numberOfTilesAtLevelZero The number of tiles in the horizontal direction at tile level zero.\r\n * @returns {Number} An estimated geometric error.\r\n */\r\n public getEstimatedLevelZeroGeometricErrorForAHeightmap(ellipsoidMaximumRadius = 6378137, tileImageWidth = 65, numberOfTilesAtLevelZero = 2) {\r\n return ellipsoidMaximumRadius * 2 * Math.PI * this.heightmapTerrainQuality / (tileImageWidth * numberOfTilesAtLevelZero);\r\n }\r\n\r\n public getLevelMaximumGeometricError(level: number) {\r\n return this.getEstimatedLevelZeroGeometricErrorForAHeightmap() / (1 << level);\r\n }\r\n\r\n public getHeightRange(parentRange: Range1d, quadId: QuadId): Range1d {\r\n const heightRange = quadId.level <= 6 ? ApproximateTerrainHeights.instance.getTileHeightRange(quadId) : undefined;\r\n\r\n return undefined === heightRange ? parentRange : heightRange;\r\n }\r\n}\r\n"]}
1
+ {"version":3,"file":"CesiumTerrainProvider.js","sourceRoot":"","sources":["../../../../src/tile/map/CesiumTerrainProvider.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\n/** @packageDocumentation\r\n * @module Tiles\r\n */\r\nimport { assert, BeDuration, BeTimePoint, ByteStream, Id64String, JsonUtils, utf8ToString } from \"@itwin/core-bentley\";\r\nimport { Point2d, Point3d, Range1d, Vector3d } from \"@itwin/core-geometry\";\r\nimport { nextPoint3d64FromByteStream, OctEncodedNormal, QParams3d, QPoint2d } from \"@itwin/core-common\";\r\nimport { MessageSeverity } from \"@itwin/appui-abstract\";\r\nimport { request, RequestOptions } from \"@bentley/itwin-client\";\r\nimport { ApproximateTerrainHeights } from \"../../ApproximateTerrainHeights\";\r\nimport { IModelApp } from \"../../IModelApp\";\r\nimport { IModelConnection } from \"../../IModelConnection\";\r\nimport { TerrainMeshPrimitive } from \"../../render/primitives/mesh/TerrainMeshPrimitive\";\r\nimport {\r\n GeographicTilingScheme, MapCartoRectangle, MapTile, MapTileProjection, MapTilingScheme, QuadId, TerrainMeshProvider, Tile, TileAvailability,\r\n} from \"../internal\";\r\n\r\n/** @internal */\r\nenum QuantizedMeshExtensionIds {\r\n OctEncodedNormals = 1,\r\n WaterMask = 2,\r\n Metadata = 4,\r\n}\r\n\r\n/** Return the URL for a Cesium ION asset from its asset ID and request Key.\r\n * @public\r\n */\r\nexport function getCesiumAssetUrl(osmAssetId: number, requestKey: string): string {\r\n return `$CesiumIonAsset=${osmAssetId}:${requestKey}`;\r\n}\r\n/** @internal */\r\nexport function getCesiumOSMBuildingsUrl(): string | undefined {\r\n const key = IModelApp.tileAdmin.cesiumIonKey;\r\n if (undefined === key)\r\n return undefined;\r\n\r\n const osmBuildingAssetId = 96188;\r\n return getCesiumAssetUrl(osmBuildingAssetId, key);\r\n}\r\n\r\n/** @internal */\r\nexport async function getCesiumAccessTokenAndEndpointUrl(assetId = 1, requestKey?: string): Promise<{ token?: string, url?: string }> {\r\n\r\n if (undefined === requestKey) {\r\n requestKey = IModelApp.tileAdmin.cesiumIonKey;\r\n if (undefined === requestKey)\r\n return {};\r\n }\r\n\r\n const requestTemplate = `https://api.cesium.com/v1/assets/${assetId}/endpoint?access_token={CesiumRequestToken}`;\r\n const apiUrl: string = requestTemplate.replace(\"{CesiumRequestToken}\", requestKey);\r\n const apiRequestOptions: RequestOptions = { method: \"GET\", responseType: \"json\" };\r\n\r\n try {\r\n const apiResponse = await request(apiUrl, apiRequestOptions);\r\n if (undefined === apiResponse || undefined === apiResponse.body || undefined === apiResponse.body.url) {\r\n assert(false);\r\n return {};\r\n }\r\n return { token: apiResponse.body.accessToken, url: apiResponse.body.url };\r\n } catch (error) {\r\n assert(false);\r\n return {};\r\n }\r\n}\r\n\r\nlet notifiedTerrainError = false;\r\n\r\n// Notify - once per session - of failure to obtain Cesium terrain provider.\r\nfunction notifyTerrainError(detailedDescription?: string): void {\r\n if (notifiedTerrainError)\r\n return;\r\n\r\n notifiedTerrainError = true;\r\n IModelApp.notifications.displayMessage(MessageSeverity.Information, IModelApp.localization.getLocalizedString(`BackgroundMap.CannotObtainTerrain`), detailedDescription);\r\n}\r\n\r\n/** @internal */\r\nexport async function getCesiumTerrainProvider(iModel: IModelConnection, modelId: Id64String, wantSkirts: boolean, wantNormals: boolean, exaggeration: number): Promise<TerrainMeshProvider | undefined> {\r\n const accessTokenAndEndpointUrl = await getCesiumAccessTokenAndEndpointUrl();\r\n if (!accessTokenAndEndpointUrl.token || !accessTokenAndEndpointUrl.url) {\r\n notifyTerrainError(IModelApp.localization.getLocalizedString(`BackgroundMap.MissingCesiumToken`));\r\n return undefined;\r\n }\r\n\r\n let layers;\r\n try {\r\n const layerRequestOptions: RequestOptions = { method: \"GET\", responseType: \"json\", headers: { authorization: `Bearer ${accessTokenAndEndpointUrl.token}` } };\r\n const layerUrl = `${accessTokenAndEndpointUrl.url}layer.json`;\r\n const layerResponse = await request(layerUrl, layerRequestOptions);\r\n if (undefined === layerResponse) {\r\n notifyTerrainError();\r\n return undefined;\r\n }\r\n\r\n layers = layerResponse.body;\r\n } catch (error) {\r\n notifyTerrainError();\r\n return undefined;\r\n }\r\n\r\n if (undefined === layers.tiles || undefined === layers.version) {\r\n notifyTerrainError();\r\n return undefined;\r\n }\r\n\r\n const tilingScheme = new GeographicTilingScheme();\r\n let tileAvailability;\r\n if (undefined !== layers.available) {\r\n const availableTiles = layers.available;\r\n tileAvailability = new TileAvailability(tilingScheme, availableTiles.length);\r\n for (let level = 0; level < layers.available.length; level++) {\r\n const rangesAtLevel = availableTiles[level];\r\n for (const range of rangesAtLevel) {\r\n tileAvailability.addAvailableTileRange(level, range.startX, range.startY, range.endX, range.endY);\r\n }\r\n }\r\n }\r\n\r\n let tileUrlTemplate = accessTokenAndEndpointUrl.url + layers.tiles[0].replace(\"{version}\", layers.version);\r\n if (wantNormals)\r\n tileUrlTemplate = tileUrlTemplate.replace(\"?\", \"?extensions=octvertexnormals-watermask-metadata&\");\r\n\r\n const maxDepth = JsonUtils.asInt(layers.maxzoom, 19);\r\n\r\n // TBD -- When we have an API extract the heights for the project from the terrain tiles - for use temporary Bing elevation.\r\n return new CesiumTerrainProvider(iModel, modelId, accessTokenAndEndpointUrl.token, tileUrlTemplate, maxDepth, wantSkirts, tilingScheme, tileAvailability, layers.metadataAvailability, exaggeration);\r\n}\r\nfunction zigZagDecode(value: number) {\r\n return (value >> 1) ^ (-(value & 1));\r\n}\r\n/**\r\n * Decodes delta and ZigZag encoded vertices. This modifies the buffers in place.\r\n *\r\n * @see {@link https://github.com/AnalyticalGraphicsInc/quantized-mesh|quantized-mesh-1.0 terrain format}\r\n */\r\nfunction zigZagDeltaDecode(uBuffer: Uint16Array, vBuffer: Uint16Array, heightBuffer: Uint16Array) {\r\n const count = uBuffer.length;\r\n let u = 0;\r\n let v = 0;\r\n let height = 0;\r\n\r\n for (let i = 0; i < count; ++i) {\r\n u += zigZagDecode(uBuffer[i]);\r\n v += zigZagDecode(vBuffer[i]);\r\n\r\n uBuffer[i] = u;\r\n vBuffer[i] = v;\r\n\r\n height += zigZagDecode(heightBuffer[i]);\r\n heightBuffer[i] = height;\r\n }\r\n}\r\n\r\nfunction getIndexArray(vertexCount: number, streamBuffer: ByteStream, indexCount: number): Uint16Array | Uint32Array {\r\n const indicesAre32Bit = vertexCount > 64 * 1024;\r\n const indexArray = (indicesAre32Bit) ? new Uint32Array(streamBuffer.arrayBuffer, streamBuffer.curPos, indexCount) : new Uint16Array(streamBuffer.arrayBuffer, streamBuffer.curPos, indexCount);\r\n streamBuffer.advance(indexCount * (indicesAre32Bit ? Uint32Array.BYTES_PER_ELEMENT : Uint16Array.BYTES_PER_ELEMENT));\r\n return indexArray;\r\n}\r\n\r\n/** @internal */\r\nclass CesiumTerrainProvider extends TerrainMeshProvider {\r\n private static _scratchQPoint2d = QPoint2d.fromScalars(0, 0);\r\n private static _scratchPoint2d = Point2d.createZero();\r\n private static _scratchPoint = Point3d.createZero();\r\n private static _scratchNormal = Vector3d.createZero();\r\n private static _scratchHeightRange = Range1d.createNull();\r\n private static _tokenTimeoutInterval = BeDuration.fromSeconds(60 * 30); // Request a new access token every 30 minutes...\r\n private _tokenTimeOut: BeTimePoint;\r\n\r\n public override forceTileLoad(tile: Tile): boolean {\r\n // Force loading of the metadata availability tiles as these are required for determining the availability of descendants.\r\n const mapTile = tile as MapTile;\r\n return undefined !== this._metaDataAvailableLevel && mapTile.quadId.level === this._metaDataAvailableLevel && !mapTile.everLoaded;\r\n }\r\n\r\n constructor(iModel: IModelConnection, modelId: Id64String, private _accessToken: string, private _tileUrlTemplate: string,\r\n private _maxDepth: number, private readonly _wantSkirts: boolean, private _tilingScheme: MapTilingScheme, private _tileAvailability: TileAvailability | undefined, private _metaDataAvailableLevel: number | undefined, private _exaggeration: number) {\r\n super(iModel, modelId);\r\n this._tokenTimeOut = BeTimePoint.now().plus(CesiumTerrainProvider._tokenTimeoutInterval);\r\n }\r\n\r\n public override getLogo(): HTMLTableRowElement {\r\n return IModelApp.makeLogoCard({ iconSrc: `${IModelApp.publicPath}images/cesium-ion.svg`, heading: \"Cesium Ion\", notice: IModelApp.localization.getLocalizedString(\"iModelJs:BackgroundMap.CesiumWorldTerrainAttribution\") });\r\n }\r\n\r\n public get maxDepth(): number { return this._maxDepth; }\r\n public get tilingScheme(): MapTilingScheme { return this._tilingScheme; }\r\n\r\n public isTileAvailable(quadId: QuadId) {\r\n if (quadId.level > this.maxDepth)\r\n return false;\r\n\r\n return this._tileAvailability ? this._tileAvailability.isTileAvailable(quadId.level, quadId.column, quadId.row) : true;\r\n }\r\n\r\n public override async getMesh(tile: MapTile, data: Uint8Array): Promise<TerrainMeshPrimitive | undefined> {\r\n if (BeTimePoint.now().milliseconds > this._tokenTimeOut.milliseconds) {\r\n const accessTokenAndEndpointUrl = await getCesiumAccessTokenAndEndpointUrl();\r\n if (!accessTokenAndEndpointUrl.token) {\r\n assert(false);\r\n return undefined;\r\n }\r\n\r\n this._accessToken = accessTokenAndEndpointUrl.token;\r\n this._tokenTimeOut = BeTimePoint.now().plus(CesiumTerrainProvider._tokenTimeoutInterval);\r\n }\r\n\r\n assert(data instanceof Uint8Array);\r\n assert(tile instanceof MapTile);\r\n const blob = data;\r\n const streamBuffer = new ByteStream(blob.buffer);\r\n const center = nextPoint3d64FromByteStream(streamBuffer);\r\n const quadId = QuadId.createFromContentId(tile.contentId);\r\n const skirtHeight = this.getLevelMaximumGeometricError(quadId.level + 1) * 10.0; // Add 1 to level to restore height calculation to before the quadId level was from root. (4326 unification)\r\n const minHeight = this._exaggeration * streamBuffer.nextFloat32;\r\n const maxHeight = this._exaggeration * streamBuffer.nextFloat32;\r\n const boundCenter = nextPoint3d64FromByteStream(streamBuffer);\r\n const boundRadius = streamBuffer.nextFloat64;\r\n const horizonOcclusion = nextPoint3d64FromByteStream(streamBuffer);\r\n const terrainTile = tile;\r\n\r\n terrainTile.adjustHeights(minHeight, maxHeight);\r\n\r\n if (undefined === center || undefined === boundCenter || undefined === boundRadius || undefined === horizonOcclusion) { }\r\n const pointCount = streamBuffer.nextUint32;\r\n const encodedVertexBuffer = new Uint16Array(blob.buffer, streamBuffer.curPos, pointCount * 3);\r\n streamBuffer.advance(pointCount * 6);\r\n\r\n const uBuffer = encodedVertexBuffer.subarray(0, pointCount);\r\n const vBuffer = encodedVertexBuffer.subarray(pointCount, 2 * pointCount);\r\n const heightBuffer = encodedVertexBuffer.subarray(pointCount * 2, 3 * pointCount);\r\n\r\n zigZagDeltaDecode(uBuffer, vBuffer, heightBuffer);\r\n\r\n let bytesPerIndex = Uint16Array.BYTES_PER_ELEMENT;\r\n const triangleElements = 3;\r\n\r\n if (pointCount > 64 * 1024) {\r\n // More than 64k vertices, so indices are 32-bit.\r\n bytesPerIndex = Uint32Array.BYTES_PER_ELEMENT;\r\n }\r\n\r\n // skip over any additional padding that was added for 2/4 byte alignment\r\n if (streamBuffer.curPos % bytesPerIndex !== 0)\r\n streamBuffer.advance(bytesPerIndex - (streamBuffer.curPos % bytesPerIndex));\r\n\r\n const triangleCount = streamBuffer.nextUint32;\r\n const indexCount = triangleCount * triangleElements;\r\n\r\n const indices = getIndexArray(pointCount, streamBuffer, indexCount);\r\n // High water mark decoding based on decompressIndices_ in webgl-loader's loader.js.\r\n // https://code.google.com/p/webgl-loader/source/browse/trunk/samples/loader.js?r=99#55\r\n // Copyright 2012 Google Inc., Apache 2.0 license.\r\n let highest = 0;\r\n const length = indices.length;\r\n for (let i = 0; i < length; ++i) {\r\n const code = indices[i];\r\n indices[i] = highest - code;\r\n if (code === 0) {\r\n ++highest;\r\n }\r\n }\r\n\r\n CesiumTerrainProvider._scratchHeightRange.low = minHeight - skirtHeight;\r\n CesiumTerrainProvider._scratchHeightRange.high = maxHeight;\r\n const projection = terrainTile.getProjection(CesiumTerrainProvider._scratchHeightRange);\r\n const pointQParams = QParams3d.fromRange(projection.localRange);\r\n\r\n const uvScale = 1.0 / 32767.0;\r\n const heightScale = uvScale * (maxHeight - minHeight);\r\n\r\n const westCount = streamBuffer.nextUint32;\r\n const westIndices = getIndexArray(pointCount, streamBuffer, westCount);\r\n\r\n const southCount = streamBuffer.nextUint32;\r\n const southIndices = getIndexArray(pointCount, streamBuffer, southCount);\r\n\r\n const eastCount = streamBuffer.nextUint32;\r\n const eastIndices = getIndexArray(pointCount, streamBuffer, eastCount);\r\n\r\n const northCount = streamBuffer.nextUint32;\r\n const northIndices = getIndexArray(pointCount, streamBuffer, northCount);\r\n\r\n // Extensions...\r\n let encodedNormalsBuffer;\r\n while (streamBuffer.curPos < streamBuffer.length) {\r\n const extensionId = streamBuffer.nextUint8;\r\n const extensionLength = streamBuffer.nextUint32;\r\n switch (extensionId) {\r\n case QuantizedMeshExtensionIds.OctEncodedNormals:\r\n assert(pointCount * 2 === extensionLength);\r\n encodedNormalsBuffer = new Uint8Array(streamBuffer.arrayBuffer, streamBuffer.curPos, extensionLength);\r\n streamBuffer.advance(extensionLength);\r\n break;\r\n\r\n case QuantizedMeshExtensionIds.Metadata:\r\n const stringLength = streamBuffer.nextUint32;\r\n if (stringLength > 0) {\r\n const strData = streamBuffer.nextBytes(stringLength);\r\n const str = utf8ToString(strData);\r\n if (undefined !== str) {\r\n const metaData = JSON.parse(str);\r\n if (undefined !== metaData.available && undefined !== this._tileAvailability) {\r\n const availableTiles = metaData.available;\r\n for (let offset = 0; offset < availableTiles.length; ++offset) {\r\n const availableLevel = tile.depth + offset; // Our depth is includes root (1 + cesium Depth)\r\n const rangesAtLevel = availableTiles[offset];\r\n\r\n for (const range of rangesAtLevel)\r\n this._tileAvailability.addAvailableTileRange(availableLevel, range.startX, range.startY, range.endX, range.endY);\r\n }\r\n }\r\n }\r\n }\r\n\r\n break;\r\n default:\r\n streamBuffer.advance(extensionLength);\r\n break;\r\n }\r\n\r\n }\r\n\r\n const mesh = TerrainMeshPrimitive.create({ pointQParams, pointCount, indexCount, wantSkirts: this._wantSkirts, westCount, eastCount, southCount, northCount, wantNormals: undefined !== encodedNormalsBuffer });\r\n for (let i = 0; i < indexCount;)\r\n this.addTriangle(mesh, indices[i++], indices[i++], indices[i++]);\r\n\r\n const worldToEcef = tile.iModel.getEcefTransform().matrix;\r\n for (let i = 0; i < pointCount; i++) {\r\n const u = uBuffer[i];\r\n const v = vBuffer[i];\r\n projection.getPoint(uvScale * u, uvScale * v, minHeight + heightBuffer[i] * heightScale, CesiumTerrainProvider._scratchPoint);\r\n CesiumTerrainProvider._scratchQPoint2d.setFromScalars(u * 2, v * 2);\r\n if (encodedNormalsBuffer) {\r\n const normalIndex = i * 2;\r\n OctEncodedNormal.decodeValue(encodedNormalsBuffer[normalIndex + 1] << 8 | encodedNormalsBuffer[normalIndex], CesiumTerrainProvider._scratchNormal);\r\n worldToEcef.multiplyTransposeVector(CesiumTerrainProvider._scratchNormal, CesiumTerrainProvider._scratchNormal);\r\n mesh.addVertex(CesiumTerrainProvider._scratchPoint, CesiumTerrainProvider._scratchQPoint2d, OctEncodedNormal.encode(CesiumTerrainProvider._scratchNormal));\r\n } else {\r\n mesh.addVertex(CesiumTerrainProvider._scratchPoint, CesiumTerrainProvider._scratchQPoint2d);\r\n }\r\n }\r\n\r\n if (this._wantSkirts) {\r\n westIndices.sort((a, b) => vBuffer[a] - vBuffer[b]);\r\n eastIndices.sort((a, b) => vBuffer[a] - vBuffer[b]);\r\n northIndices.sort((a, b) => uBuffer[a] - uBuffer[b]);\r\n southIndices.sort((a, b) => uBuffer[a] - uBuffer[b]);\r\n const wantNormals = (encodedNormalsBuffer !== undefined);\r\n this.generateSkirts(mesh, westIndices, projection, -skirtHeight, heightBuffer, minHeight, heightScale, wantNormals);\r\n this.generateSkirts(mesh, eastIndices, projection, -skirtHeight, heightBuffer, minHeight, heightScale, wantNormals);\r\n this.generateSkirts(mesh, southIndices, projection, -skirtHeight, heightBuffer, minHeight, heightScale, wantNormals);\r\n this.generateSkirts(mesh, northIndices, projection, -skirtHeight, heightBuffer, minHeight, heightScale, wantNormals);\r\n }\r\n assert(mesh.isCompleted);\r\n return mesh;\r\n }\r\n\r\n private addTriangle(mesh: TerrainMeshPrimitive, i0: number, i1: number, i2: number) {\r\n mesh.addTriangle(i0, i1, i2);\r\n }\r\n\r\n private generateSkirts(mesh: TerrainMeshPrimitive, indices: Uint16Array | Uint32Array, projection: MapTileProjection, skirtOffset: number, heightBuffer: Uint16Array, minHeight: number, heightScale: number, wantNormals: boolean) {\r\n for (let i = 0; i < indices.length; i++) {\r\n const index = indices[i];\r\n const paramIndex = index * 2;\r\n const height = minHeight + heightBuffer[index] * heightScale;\r\n CesiumTerrainProvider._scratchQPoint2d.setFromScalars(mesh.uvs[paramIndex], mesh.uvs[paramIndex + 1]);\r\n const uv = mesh.uvQParams.unquantize(CesiumTerrainProvider._scratchQPoint2d.x, CesiumTerrainProvider._scratchQPoint2d.y, CesiumTerrainProvider._scratchPoint2d);\r\n if (wantNormals && mesh.normals) {\r\n mesh.addVertex(projection.getPoint(uv.x, uv.y, height + skirtOffset), CesiumTerrainProvider._scratchQPoint2d, mesh.normals[index]);\r\n } else {\r\n mesh.addVertex(projection.getPoint(uv.x, uv.y, height + skirtOffset), CesiumTerrainProvider._scratchQPoint2d);\r\n }\r\n\r\n if (i) {\r\n this.addTriangle(mesh, index, indices[i - 1], mesh.nextPointIndex - 2);\r\n this.addTriangle(mesh, index, mesh.nextPointIndex - 2, mesh.nextPointIndex - 1);\r\n }\r\n }\r\n }\r\n public override get requestOptions(): RequestOptions {\r\n return { method: \"GET\", responseType: \"arraybuffer\", headers: { authorization: `Bearer ${this._accessToken}` }, accept: \"application/vnd.quantized-mesh;\" /* extensions=octvertexnormals, */ + \"application/octet-stream;q=0.9,*/*;q=0.01\" };\r\n }\r\n\r\n public override constructUrl(row: number, column: number, zoomLevel: number): string {\r\n return this._tileUrlTemplate.replace(\"{z}\", zoomLevel.toString()).replace(\"{x}\", column.toString()).replace(\"{y}\", row.toString());\r\n }\r\n\r\n public getChildHeightRange(quadId: QuadId, rectangle: MapCartoRectangle, parent: MapTile): Range1d | undefined {\r\n return (quadId.level < ApproximateTerrainHeights.maxLevel) ? ApproximateTerrainHeights.instance.getMinimumMaximumHeights(rectangle) : (parent).heightRange;\r\n }\r\n /**\r\n * Specifies the quality of terrain created from heightmaps. A value of 1.0 will\r\n * ensure that adjacent heightmap vertices are separated by no more than\r\n * screen pixels and will probably go very slowly.\r\n * A value of 0.5 will cut the estimated level zero geometric error in half, allowing twice the\r\n * screen pixels between adjacent heightmap vertices and thus rendering more quickly.\r\n * @type {Number}\r\n */\r\n public readonly heightmapTerrainQuality = 0.25;\r\n\r\n /**\r\n * Determines an appropriate geometric error estimate when the geometry comes from a heightmap.\r\n *\r\n * @param {Ellipsoid} ellipsoid The ellipsoid to which the terrain is attached.\r\n * @param {Number} tileImageWidth The width, in pixels, of the heightmap associated with a single tile.\r\n * @param {Number} numberOfTilesAtLevelZero The number of tiles in the horizontal direction at tile level zero.\r\n * @returns {Number} An estimated geometric error.\r\n */\r\n public getEstimatedLevelZeroGeometricErrorForAHeightmap(ellipsoidMaximumRadius = 6378137, tileImageWidth = 65, numberOfTilesAtLevelZero = 2) {\r\n return ellipsoidMaximumRadius * 2 * Math.PI * this.heightmapTerrainQuality / (tileImageWidth * numberOfTilesAtLevelZero);\r\n }\r\n\r\n public getLevelMaximumGeometricError(level: number) {\r\n return this.getEstimatedLevelZeroGeometricErrorForAHeightmap() / (1 << level);\r\n }\r\n\r\n public getHeightRange(parentRange: Range1d, quadId: QuadId): Range1d {\r\n const heightRange = quadId.level <= 6 ? ApproximateTerrainHeights.instance.getTileHeightRange(quadId) : undefined;\r\n\r\n return undefined === heightRange ? parentRange : heightRange;\r\n }\r\n}\r\n"]}