@itwin/core-frontend 5.0.0-dev.50 → 5.0.0-dev.52
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/cjs/AccuDraw.d.ts +13 -1
- package/lib/cjs/AccuDraw.d.ts.map +1 -1
- package/lib/cjs/AccuDraw.js +13 -1
- package/lib/cjs/AccuDraw.js.map +1 -1
- package/lib/cjs/DisplayStyleState.d.ts +1 -3
- package/lib/cjs/DisplayStyleState.d.ts.map +1 -1
- package/lib/cjs/DisplayStyleState.js +4 -8
- package/lib/cjs/DisplayStyleState.js.map +1 -1
- package/lib/cjs/PlanarClipMaskState.js +2 -2
- package/lib/cjs/PlanarClipMaskState.js.map +1 -1
- package/lib/cjs/SpatialViewState.d.ts +1 -1
- package/lib/cjs/SpatialViewState.d.ts.map +1 -1
- package/lib/cjs/SpatialViewState.js +6 -5
- package/lib/cjs/SpatialViewState.js.map +1 -1
- package/lib/cjs/ViewState.d.ts +7 -7
- package/lib/cjs/ViewState.d.ts.map +1 -1
- package/lib/cjs/ViewState.js +31 -16
- package/lib/cjs/ViewState.js.map +1 -1
- package/lib/cjs/ViewingSpace.d.ts.map +1 -1
- package/lib/cjs/ViewingSpace.js +5 -4
- package/lib/cjs/ViewingSpace.js.map +1 -1
- package/lib/cjs/Viewport.d.ts +11 -5
- package/lib/cjs/Viewport.d.ts.map +1 -1
- package/lib/cjs/Viewport.js +49 -36
- package/lib/cjs/Viewport.js.map +1 -1
- package/lib/cjs/render/webgl/SolarShadowMap.js +4 -4
- package/lib/cjs/render/webgl/SolarShadowMap.js.map +1 -1
- package/lib/cjs/tile/TiledGraphicsProvider.d.ts +14 -1
- package/lib/cjs/tile/TiledGraphicsProvider.d.ts.map +1 -1
- package/lib/cjs/tile/TiledGraphicsProvider.js +15 -0
- package/lib/cjs/tile/TiledGraphicsProvider.js.map +1 -1
- package/lib/cjs/tile/map/MapTiledGraphicsProvider.d.ts +1 -0
- package/lib/cjs/tile/map/MapTiledGraphicsProvider.d.ts.map +1 -1
- package/lib/cjs/tile/map/MapTiledGraphicsProvider.js +6 -0
- package/lib/cjs/tile/map/MapTiledGraphicsProvider.js.map +1 -1
- package/lib/cjs/tools/AccuDrawViewportUI.d.ts +5 -0
- package/lib/cjs/tools/AccuDrawViewportUI.d.ts.map +1 -1
- package/lib/cjs/tools/AccuDrawViewportUI.js +10 -7
- package/lib/cjs/tools/AccuDrawViewportUI.js.map +1 -1
- package/lib/esm/AccuDraw.d.ts +13 -1
- package/lib/esm/AccuDraw.d.ts.map +1 -1
- package/lib/esm/AccuDraw.js +13 -1
- package/lib/esm/AccuDraw.js.map +1 -1
- package/lib/esm/DisplayStyleState.d.ts +1 -3
- package/lib/esm/DisplayStyleState.d.ts.map +1 -1
- package/lib/esm/DisplayStyleState.js +4 -8
- package/lib/esm/DisplayStyleState.js.map +1 -1
- package/lib/esm/PlanarClipMaskState.js +2 -2
- package/lib/esm/PlanarClipMaskState.js.map +1 -1
- package/lib/esm/SpatialViewState.d.ts +1 -1
- package/lib/esm/SpatialViewState.d.ts.map +1 -1
- package/lib/esm/SpatialViewState.js +6 -5
- package/lib/esm/SpatialViewState.js.map +1 -1
- package/lib/esm/ViewState.d.ts +7 -7
- package/lib/esm/ViewState.d.ts.map +1 -1
- package/lib/esm/ViewState.js +31 -16
- package/lib/esm/ViewState.js.map +1 -1
- package/lib/esm/ViewingSpace.d.ts.map +1 -1
- package/lib/esm/ViewingSpace.js +5 -4
- package/lib/esm/ViewingSpace.js.map +1 -1
- package/lib/esm/Viewport.d.ts +11 -5
- package/lib/esm/Viewport.d.ts.map +1 -1
- package/lib/esm/Viewport.js +49 -36
- package/lib/esm/Viewport.js.map +1 -1
- package/lib/esm/render/webgl/SolarShadowMap.js +4 -4
- package/lib/esm/render/webgl/SolarShadowMap.js.map +1 -1
- package/lib/esm/tile/TiledGraphicsProvider.d.ts +14 -1
- package/lib/esm/tile/TiledGraphicsProvider.d.ts.map +1 -1
- package/lib/esm/tile/TiledGraphicsProvider.js +15 -0
- package/lib/esm/tile/TiledGraphicsProvider.js.map +1 -1
- package/lib/esm/tile/map/MapTiledGraphicsProvider.d.ts +1 -0
- package/lib/esm/tile/map/MapTiledGraphicsProvider.d.ts.map +1 -1
- package/lib/esm/tile/map/MapTiledGraphicsProvider.js +6 -0
- package/lib/esm/tile/map/MapTiledGraphicsProvider.js.map +1 -1
- package/lib/esm/tools/AccuDrawViewportUI.d.ts +5 -0
- package/lib/esm/tools/AccuDrawViewportUI.d.ts.map +1 -1
- package/lib/esm/tools/AccuDrawViewportUI.js +10 -7
- package/lib/esm/tools/AccuDrawViewportUI.js.map +1 -1
- package/package.json +16 -16
|
@@ -251,7 +251,7 @@ export class SolarShadowMap {
|
|
|
251
251
|
const shadowRange = worldToMapTransform.multiplyRange(iModel.projectExtents);
|
|
252
252
|
// Limit the map to only displayed models.
|
|
253
253
|
const viewTileRange = Range3d.createNull();
|
|
254
|
-
view.
|
|
254
|
+
for (const ref of view.getTileTreeRefs()) {
|
|
255
255
|
if (ref.castsShadows) {
|
|
256
256
|
if (ref.isGlobal) {
|
|
257
257
|
// A shadow-casting tile tree that spans the globe. Limit its range to the viewed extents.
|
|
@@ -267,7 +267,7 @@ export class SolarShadowMap {
|
|
|
267
267
|
ref.accumulateTransformedRange(viewTileRange, worldToMap, undefined);
|
|
268
268
|
}
|
|
269
269
|
}
|
|
270
|
-
}
|
|
270
|
+
}
|
|
271
271
|
if (!viewTileRange.isNull)
|
|
272
272
|
viewTileRange.clone(shadowRange);
|
|
273
273
|
// Expand shadow range to include both the shadowers and shadowed portion of background map.
|
|
@@ -296,7 +296,7 @@ export class SolarShadowMap {
|
|
|
296
296
|
mapToWorld.multiplyPoint3dArrayQuietNormalize(this._shadowFrustum.points);
|
|
297
297
|
const tileRange = Range3d.createNull();
|
|
298
298
|
scratchFrustumPlanes.init(this._shadowFrustum);
|
|
299
|
-
view.
|
|
299
|
+
for (const ref of view.getTileTreeRefs()) {
|
|
300
300
|
if (!ref.castsShadows)
|
|
301
301
|
return;
|
|
302
302
|
const drawArgs = createDrawArgs(context, this, ref, scratchFrustumPlanes, (tiles) => {
|
|
@@ -307,7 +307,7 @@ export class SolarShadowMap {
|
|
|
307
307
|
return;
|
|
308
308
|
const tileToMapTransform = worldToMapTransform.multiplyTransformTransform(drawArgs.location, this._scratchTransform);
|
|
309
309
|
drawArgs.tree.draw(drawArgs);
|
|
310
|
-
}
|
|
310
|
+
}
|
|
311
311
|
if (tileRange.isNull) {
|
|
312
312
|
this.clearGraphics(true);
|
|
313
313
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SolarShadowMap.js","sourceRoot":"","sources":["../../../../src/render/webgl/SolarShadowMap.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\n/** @packageDocumentation\n * @module WebGL\n */\n\nimport { assert, dispose } from \"@itwin/core-bentley\";\nimport { ClipUtilities, ConvexClipPlaneSet, Geometry, GrowableXYZArray, Map4d, Matrix3d, Matrix4d, Point3d, Range3d, Transform, Vector3d } from \"@itwin/core-geometry\";\nimport {\n Frustum, FrustumPlanes, RenderMode, RenderTexture, SolarShadowSettings, TextureTransparency, ViewFlags,\n} from \"@itwin/core-common\";\nimport { RenderType } from \"@itwin/webgl-compatibility\";\nimport { Tile, TileDrawArgs, TileTreeReference, TileVisibility } from \"../../tile/internal\";\nimport { SceneContext } from \"../../ViewContext\";\nimport { RenderGraphic } from \"../RenderGraphic\";\nimport { RenderMemory } from \"../RenderMemory\";\nimport { BranchStack } from \"./BranchStack\";\nimport { BatchState } from \"./BatchState\";\nimport { EVSMGeometry } from \"./CachedGeometry\";\nimport { WebGLDisposable } from \"./Disposable\";\nimport { FrameBuffer } from \"./FrameBuffer\";\nimport { GL } from \"./GL\";\nimport { RenderCommands } from \"./RenderCommands\";\nimport { RenderPass, TextureUnit } from \"./RenderFlags\";\nimport { RenderState } from \"./RenderState\";\nimport { getDrawParams } from \"./ScratchDrawParams\";\nimport { System } from \"./System\";\nimport { Target } from \"./Target\";\nimport { Texture, TextureHandle } from \"./Texture\";\n\ntype ProcessTiles = (tiles: Tile[]) => void;\n\nfunction createDrawArgs(sceneContext: SceneContext, solarShadowMap: SolarShadowMap, tree: TileTreeReference, frustumPlanes: FrustumPlanes, processTiles: ProcessTiles): TileDrawArgs | undefined {\n class SolarShadowMapDrawArgs extends TileDrawArgs {\n private _useViewportMap?: boolean;\n private readonly _processTiles: ProcessTiles;\n\n constructor(private _mapFrustumPlanes: FrustumPlanes, private _shadowMap: SolarShadowMap, args: TileDrawArgs, process: ProcessTiles) {\n super(args);\n this._processTiles = process;\n }\n\n // The solar shadow projection is parallel - which can cause excessive tile selection if it is along an axis of an unbounded tile\n // tree such as the OSM buildings. Rev limit the selection here.\n public override get maxRealityTreeSelectionCount(): undefined | number { return 500; }\n\n public override processSelectedTiles(tiles: Tile[]): void {\n this._processTiles(tiles);\n }\n\n public override get frustumPlanes(): FrustumPlanes {\n if (true === this._useViewportMap)\n return super.frustumPlanes;\n else\n return this._mapFrustumPlanes;\n }\n\n public override get worldToViewMap(): Map4d {\n if (true === this._useViewportMap)\n return super.worldToViewMap;\n else\n return this._shadowMap.worldToViewMap;\n }\n\n public override drawGraphics(): void {\n const graphics = this.produceGraphics();\n if (graphics)\n this._shadowMap.addGraphic(graphics);\n }\n\n public override getPixelSize(tile: Tile): number {\n // For tiles that are part of the scene, size them based on the viewport frustum so that shadow map uses same resolution tiles as scene\n // - otherwise artifacts like shadow acne may result.\n // For tiles that are NOT part of the scene, size them based on the shadow frustum, not the viewport frustum\n // - otherwise excessive numbers of excessively detailed may be requested for the shadow map.\n if (undefined === this._useViewportMap) {\n this._useViewportMap = true;\n const vis = tile.computeVisibility(this);\n this._useViewportMap = TileVisibility.OutsideFrustum !== vis;\n }\n\n const size = super.getPixelSize(tile);\n this._useViewportMap = undefined;\n return size;\n }\n\n public static create(context: SceneContext, shadowMap: SolarShadowMap, tileTree: TileTreeReference, planes: FrustumPlanes, process: ProcessTiles) {\n const args = tileTree.createDrawArgs(context);\n return undefined !== args ? new SolarShadowMapDrawArgs(planes, shadowMap, args, process) : undefined;\n }\n }\n\n return SolarShadowMapDrawArgs.create(sceneContext, solarShadowMap, tree, frustumPlanes, processTiles);\n}\n\nconst shadowMapWidth = 4096; // size of original depth buffer map\nconst shadowMapHeight = shadowMapWidth; // TBD - Adjust for aspect ratio.\nconst evsmWidth = shadowMapWidth / 2; // EVSM buffer is 1/2 size each direction\nconst evsmHeight = shadowMapHeight / 2;\nconst postProjectionMatrixNpc = Matrix4d.createRowValues(/* Row 1 */ 0, 1, 0, 0, /* Row 2 */ 0, 0, 1, 0, /* Row 3 */ 1, 0, 0, 0, /* Row 4 */ 0, 0, 0, 1);\n\n// Bundles up the disposable, create-once-and-reuse members of a SolarShadowMap.\nclass Bundle implements WebGLDisposable {\n private constructor(\n public readonly depthTexture: Texture,\n public readonly shadowMapTexture: Texture,\n public readonly fbo: FrameBuffer,\n public readonly fboSM: FrameBuffer,\n public readonly evsmGeom: EVSMGeometry,\n public readonly renderCommands: RenderCommands) {\n }\n\n public static create(target: Target, stack: BranchStack, batch: BatchState): Bundle | undefined {\n const depthTextureHandle = System.instance.createDepthBuffer(shadowMapWidth, shadowMapHeight) as TextureHandle;\n if (undefined === depthTextureHandle)\n return undefined;\n\n let pixelDataType = GL.Texture.DataType.Float;\n switch (System.instance.maxRenderType) {\n case RenderType.TextureFloat:\n break;\n case RenderType.TextureHalfFloat:\n pixelDataType = System.instance.context.HALF_FLOAT;\n break;\n /* falls through */\n default:\n return undefined;\n }\n\n const colorTextures: TextureHandle[] = [];\n\n const fbo = FrameBuffer.create(colorTextures, depthTextureHandle);\n if (undefined === fbo)\n return undefined;\n\n // shadowMap texture is 1/4 size the depth texture (and averaged down when converting)\n const shadowMapTextureHandle = TextureHandle.createForAttachment(evsmWidth, evsmHeight, GL.Texture.Format.Rgba, pixelDataType);\n if (undefined === shadowMapTextureHandle)\n return undefined;\n\n const fboSM = FrameBuffer.create([shadowMapTextureHandle]);\n if (undefined === fboSM)\n return undefined;\n\n const depthTexture = new Texture({ ownership: \"external\", type: RenderTexture.Type.TileSection, handle: depthTextureHandle, transparency: TextureTransparency.Opaque });\n const evsmGeom = EVSMGeometry.createGeometry(depthTexture.texture.getHandle()!, shadowMapWidth, shadowMapHeight);\n if (undefined === evsmGeom)\n return undefined;\n\n const shadowMapTexture = new Texture({ type: RenderTexture.Type.Normal, ownership: \"external\", handle: shadowMapTextureHandle, transparency: TextureTransparency.Opaque });\n const renderCommands = new RenderCommands(target, stack, batch);\n return new Bundle(depthTexture, shadowMapTexture, fbo, fboSM, evsmGeom, renderCommands);\n }\n\n public get isDisposed(): boolean {\n return this.depthTexture.isDisposed\n && this.shadowMapTexture.isDisposed\n && this.fbo.isDisposed\n && this.fboSM.isDisposed\n && this.evsmGeom.isDisposed;\n }\n\n public [Symbol.dispose](): void {\n dispose(this.depthTexture);\n dispose(this.shadowMapTexture);\n dispose(this.fbo);\n dispose(this.fboSM);\n dispose(this.evsmGeom);\n }\n}\n\n/** Describes the set of parameters which, when they change, require us to recreate the shadow map. */\nclass ShadowMapParams {\n public readonly direction = new Vector3d();\n public readonly viewFrustum = new Frustum();\n public settings: SolarShadowSettings;\n\n public constructor(viewFrustum: Frustum, direction: Vector3d, settings: SolarShadowSettings) {\n direction.clone(this.direction);\n this.viewFrustum.setFrom(viewFrustum);\n this.settings = settings;\n }\n\n public update(viewFrustum: Frustum, direction: Vector3d, settings: SolarShadowSettings): void {\n this.settings = settings;\n this.viewFrustum.setFrom(viewFrustum);\n direction.clone(this.direction);\n }\n}\n\nconst defaultSunDirection = Vector3d.create(-1, -1, -1).normalize()!;\nconst scratchFrustum = new Frustum();\nconst scratchFrustumPlanes = FrustumPlanes.createEmpty();\n\nexport class SolarShadowMap implements RenderMemory.Consumer, WebGLDisposable {\n private _bundle?: Bundle;\n private _projectionMatrix = Matrix4d.createIdentity();\n private _graphics: RenderGraphic[] = [];\n private _shadowFrustum = new Frustum();\n private _isReady = false;\n private _isDrawing = false;\n private _enabled = false;\n private _params?: ShadowMapParams;\n private readonly _scratchRange = Range3d.createNull();\n private readonly _scratchTransform = Transform.createIdentity();\n\n private readonly _scratchViewFlags = new ViewFlags();\n private readonly _renderState: RenderState;\n private readonly _noZRenderState: RenderState;\n private readonly _batchState: BatchState;\n private _worldToViewMap = Map4d.createIdentity();\n private readonly _target: Target;\n\n // This exists chiefly for debugging. See ToggleShadowMapTilesTool.\n public onGraphicsChanged?: (graphics: RenderGraphic[]) => void;\n\n private getBundle(target: Target): Bundle | undefined {\n if (undefined === this._bundle) {\n this._bundle = Bundle.create(target, target.uniforms.branch.stack, this._batchState);\n assert(undefined !== this._bundle);\n }\n\n return this._bundle;\n }\n\n public get isReady() { return this._isReady; }\n public get isDrawing() { return this._isDrawing; }\n public get isEnabled() { return this._enabled; }\n public get projectionMatrix(): Matrix4d { return this._projectionMatrix; }\n public get depthTexture(): Texture | undefined { return undefined !== this._bundle ? this._bundle.depthTexture : undefined; }\n public get shadowMapTexture(): Texture | undefined { return undefined !== this._bundle ? this._bundle.shadowMapTexture : undefined; }\n public get settings(): SolarShadowSettings | undefined { return undefined !== this._params ? this._params.settings : undefined; }\n public get direction(): Vector3d | undefined { return undefined !== this._params ? this._params.direction : undefined; }\n public get frustum(): Frustum { return this._shadowFrustum; }\n public get worldToViewMap(): Map4d { return this._worldToViewMap; }\n public addGraphic(graphic: RenderGraphic) { this._graphics.push(graphic); }\n\n public constructor(target: Target) {\n this._target = target;\n this._renderState = new RenderState();\n this._renderState.flags.depthMask = true;\n this._renderState.flags.blend = false;\n this._renderState.flags.depthTest = true;\n\n this._noZRenderState = new RenderState();\n this._noZRenderState.flags.depthMask = false;\n\n this._batchState = new BatchState(target.uniforms.branch.stack);\n }\n\n public disable() {\n this._enabled = this._isReady = false;\n this._bundle = dispose(this._bundle);\n this.clearGraphics(true);\n this._target.uniforms.shadow.update();\n }\n\n public collectStatistics(stats: RenderMemory.Statistics): void {\n const bundle = this._bundle;\n if (undefined !== bundle)\n stats.addShadowMap(bundle.depthTexture.bytesUsed + bundle.shadowMapTexture.bytesUsed);\n }\n\n public get isDisposed(): boolean { return undefined === this._bundle && 0 === this._graphics.length; }\n\n public [Symbol.dispose]() {\n this._bundle = dispose(this._bundle);\n this.clearGraphics(true);\n }\n\n private clearGraphics(notify: boolean) {\n for (const graphic of this._graphics)\n graphic[Symbol.dispose]();\n\n this._graphics.length = 0;\n if (notify)\n this.notifyGraphicsChanged();\n }\n\n private notifyGraphicsChanged(): void {\n if (undefined !== this.onGraphicsChanged)\n this.onGraphicsChanged(this._graphics);\n }\n\n public update(context: SceneContext | undefined) {\n this._isReady = false;\n this.clearGraphics(false);\n\n if (undefined === context || !context.viewport.view.isSpatialView()) {\n this.disable();\n this.notifyGraphicsChanged();\n return;\n }\n\n const view = context.viewport.view;\n const style = view.getDisplayStyle3d();\n const sunDirection = style.sunDirection ?? defaultSunDirection;\n\n const minimumHorizonDirection = -.01;\n if (sunDirection.z > minimumHorizonDirection) {\n this.notifyGraphicsChanged();\n return;\n }\n\n this._enabled = true;\n const viewFrustum = context.viewingSpace.getFrustum();\n const settings = style.settings.solarShadows;\n if (undefined === this._params)\n this._params = new ShadowMapParams(viewFrustum, sunDirection, settings);\n else\n this._params.update(viewFrustum, sunDirection, settings);\n\n const iModel = view.iModel;\n\n const worldToMapTransform = Transform.createRefs(Point3d.createZero(), Matrix3d.createRigidHeadsUp(this._params.direction.negate()).inverse()!);\n const worldToMap = Matrix4d.createTransform(worldToMapTransform);\n const mapToWorld = worldToMap.createInverse()!;\n\n // Start with entire project.\n const shadowRange = worldToMapTransform.multiplyRange(iModel.projectExtents);\n\n // Limit the map to only displayed models.\n const viewTileRange = Range3d.createNull();\n view.forEachTileTreeRef((ref) => {\n if (ref.castsShadows) {\n if (ref.isGlobal) {\n // A shadow-casting tile tree that spans the globe. Limit its range to the viewed extents.\n for (const p3 of viewFrustum.points) {\n const p4 = worldToMap.multiplyPoint3d(p3, 1);\n if (p4.w > 0.0001)\n viewTileRange.extendXYZW(p4.x, p4.y, p4.z, p4.w);\n else\n viewTileRange.high.z = Math.max(1.0, viewTileRange.high.z); // behind eye plane.\n }\n } else {\n ref.accumulateTransformedRange(viewTileRange, worldToMap, undefined);\n }\n }\n });\n\n if (!viewTileRange.isNull)\n viewTileRange.clone(shadowRange);\n\n // Expand shadow range to include both the shadowers and shadowed portion of background map.\n scratchFrustum.initFromRange(shadowRange);\n mapToWorld.multiplyPoint3dArrayQuietNormalize(scratchFrustum.points); // This frustum represents the shadowing geometry. Intersect it with background geometry and expand the range depth to include that intersection.\n const backgroundMapGeometry = context.viewport.view.displayStyle.getBackgroundMapGeometry();\n if (undefined !== backgroundMapGeometry) {\n const backgroundDepthRange = backgroundMapGeometry.getFrustumIntersectionDepthRange(this._shadowFrustum, iModel.projectExtents);\n if (!backgroundDepthRange.isNull)\n shadowRange.low.z = Math.min(shadowRange.low.z, backgroundDepthRange.low);\n }\n\n this._params.viewFrustum.transformBy(worldToMapTransform, scratchFrustum);\n scratchFrustumPlanes.init(scratchFrustum);\n\n const viewIntersectShadowRange = Range3d.createNull();\n const viewClipPlanes = ConvexClipPlaneSet.createPlanes(scratchFrustumPlanes.planes);\n ClipUtilities.announceLoopsOfConvexClipPlaneSetIntersectRange(viewClipPlanes, shadowRange, (points: GrowableXYZArray) => {\n for (const point of points.getPoint3dArray())\n viewIntersectShadowRange.extendPoint(point);\n });\n if (viewIntersectShadowRange.isNull) {\n this.notifyGraphicsChanged();\n return;\n }\n viewIntersectShadowRange.high.z = shadowRange.high.z; // We need to include shadowing geometry that may be outside view (along the solar axis).\n\n this._shadowFrustum.initFromRange(viewIntersectShadowRange);\n mapToWorld.multiplyPoint3dArrayQuietNormalize(this._shadowFrustum.points);\n\n const tileRange = Range3d.createNull();\n scratchFrustumPlanes.init(this._shadowFrustum);\n view.forEachTileTreeRef(((ref) => {\n if (!ref.castsShadows)\n return;\n\n const drawArgs = createDrawArgs(context, this, ref, scratchFrustumPlanes, (tiles: Tile[]) => {\n for (const tile of tiles)\n tileRange.extendRange(tileToMapTransform.multiplyRange(tile.range, this._scratchRange));\n });\n\n if (undefined === drawArgs)\n return;\n\n const tileToMapTransform = worldToMapTransform.multiplyTransformTransform(drawArgs.location, this._scratchTransform);\n drawArgs.tree.draw(drawArgs);\n }));\n\n if (tileRange.isNull) {\n this.clearGraphics(true);\n } else if (this._graphics.length > 0) {\n // Avoid an uninvertible matrix on empty range...\n if (Geometry.isAlmostEqualNumber(shadowRange.low.x, shadowRange.high.x) ||\n Geometry.isAlmostEqualNumber(shadowRange.low.y, shadowRange.high.y) ||\n Geometry.isAlmostEqualNumber(shadowRange.low.z, shadowRange.high.z)) {\n this.clearGraphics(true);\n return;\n }\n\n const frustumMap = this._shadowFrustum.toMap4d();\n if (undefined === frustumMap) {\n this.clearGraphics(true);\n assert(false);\n return;\n }\n\n this._projectionMatrix = frustumMap.transform0.clone();\n\n const worldToNpc = postProjectionMatrixNpc.multiplyMatrixMatrix(this._projectionMatrix);\n const npcToView = Map4d.createBoxMap(Point3d.create(0, 0, 0), Point3d.create(1, 1, 1), Point3d.create(0, 0, 0), Point3d.create(shadowMapWidth, shadowMapHeight, 1))!;\n const npcToWorld = worldToNpc.createInverse();\n if (undefined === npcToWorld) {\n this.clearGraphics(true);\n return;\n }\n\n const worldToNpcMap = Map4d.createRefs(worldToNpc, npcToWorld);\n this._worldToViewMap = npcToView.multiplyMapMap(worldToNpcMap);\n }\n\n this._target.uniforms.shadow.update();\n this.notifyGraphicsChanged();\n }\n\n public draw(target: Target) {\n assert(this.isEnabled);\n\n if (this.isReady || 0 === this._graphics.length)\n return;\n\n const bundle = this.getBundle(target);\n if (undefined === bundle)\n return;\n\n this._isDrawing = true;\n\n const prevState = System.instance.currentRenderState.clone();\n const gl = System.instance.context;\n gl.viewport(0, 0, shadowMapWidth, shadowMapHeight);\n\n // NB: textures and materials are needed because their transparencies affect whether or not a surface casts shadows\n const viewFlags = target.currentViewFlags.copy({\n renderMode: RenderMode.SmoothShade,\n wiremesh: false,\n transparency: false,\n lighting: false,\n shadows: false,\n monochrome: false,\n ambientOcclusion: false,\n visibleEdges: false,\n hiddenEdges: false,\n });\n\n System.instance.applyRenderState(this._renderState);\n const prevPlan = target.plan;\n\n target.changeFrustum(this._shadowFrustum, this._shadowFrustum.getFraction(), true);\n target.uniforms.branch.changeRenderPlan(viewFlags, target.plan.is3d, target.plan.hline);\n\n const renderCommands = bundle.renderCommands;\n renderCommands.reset(target, target.uniforms.branch.stack, this._batchState);\n renderCommands.addGraphics(this._graphics);\n\n System.instance.frameBufferStack.execute(bundle.fbo, true, false, () => {\n System.instance.context.clearDepth(1.0);\n System.instance.context.clear(GL.BufferBit.Depth);\n target.techniques.execute(target, renderCommands.getCommands(RenderPass.OpaquePlanar), RenderPass.PlanarClassification); // Draw these with RenderPass.PlanarClassification (rather than Opaque...) so that the pick ordering is avoided.\n target.techniques.execute(target, renderCommands.getCommands(RenderPass.OpaqueGeneral), RenderPass.PlanarClassification); // Draw these with RenderPass.PlanarClassification (rather than Opaque...) so that the pick ordering is avoided.\n });\n\n // copy depth buffer to EVSM shadow buffer and average down for AA effect\n gl.viewport(0, 0, evsmWidth, evsmHeight);\n System.instance.frameBufferStack.execute(bundle.fboSM, true, false, () => {\n System.instance.applyRenderState(this._noZRenderState);\n const params = getDrawParams(target, bundle.evsmGeom);\n target.techniques.draw(params);\n });\n\n // mipmap resulting EVSM texture and set filtering options\n System.instance.activateTexture2d(TextureUnit.ShadowMap, bundle.shadowMapTexture.texture.getHandle());\n gl.generateMipmap(gl.TEXTURE_2D);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n\n System.instance.setMaxAnisotropy(undefined);\n // target.recordPerformanceMetric(\"Compute EVSM\");\n\n this._batchState.reset(); // Reset the batch Ids...\n target.changeRenderPlan(prevPlan);\n\n System.instance.applyRenderState(prevState);\n System.instance.context.viewport(0, 0, target.viewRect.width, target.viewRect.height); // Restore viewport\n this.clearGraphics(false);\n this._isDrawing = false;\n this._isReady = true;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"SolarShadowMap.js","sourceRoot":"","sources":["../../../../src/render/webgl/SolarShadowMap.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n\n/** @packageDocumentation\n * @module WebGL\n */\n\nimport { assert, dispose } from \"@itwin/core-bentley\";\nimport { ClipUtilities, ConvexClipPlaneSet, Geometry, GrowableXYZArray, Map4d, Matrix3d, Matrix4d, Point3d, Range3d, Transform, Vector3d } from \"@itwin/core-geometry\";\nimport {\n Frustum, FrustumPlanes, RenderMode, RenderTexture, SolarShadowSettings, TextureTransparency, ViewFlags,\n} from \"@itwin/core-common\";\nimport { RenderType } from \"@itwin/webgl-compatibility\";\nimport { Tile, TileDrawArgs, TileTreeReference, TileVisibility } from \"../../tile/internal\";\nimport { SceneContext } from \"../../ViewContext\";\nimport { RenderGraphic } from \"../RenderGraphic\";\nimport { RenderMemory } from \"../RenderMemory\";\nimport { BranchStack } from \"./BranchStack\";\nimport { BatchState } from \"./BatchState\";\nimport { EVSMGeometry } from \"./CachedGeometry\";\nimport { WebGLDisposable } from \"./Disposable\";\nimport { FrameBuffer } from \"./FrameBuffer\";\nimport { GL } from \"./GL\";\nimport { RenderCommands } from \"./RenderCommands\";\nimport { RenderPass, TextureUnit } from \"./RenderFlags\";\nimport { RenderState } from \"./RenderState\";\nimport { getDrawParams } from \"./ScratchDrawParams\";\nimport { System } from \"./System\";\nimport { Target } from \"./Target\";\nimport { Texture, TextureHandle } from \"./Texture\";\n\ntype ProcessTiles = (tiles: Tile[]) => void;\n\nfunction createDrawArgs(sceneContext: SceneContext, solarShadowMap: SolarShadowMap, tree: TileTreeReference, frustumPlanes: FrustumPlanes, processTiles: ProcessTiles): TileDrawArgs | undefined {\n class SolarShadowMapDrawArgs extends TileDrawArgs {\n private _useViewportMap?: boolean;\n private readonly _processTiles: ProcessTiles;\n\n constructor(private _mapFrustumPlanes: FrustumPlanes, private _shadowMap: SolarShadowMap, args: TileDrawArgs, process: ProcessTiles) {\n super(args);\n this._processTiles = process;\n }\n\n // The solar shadow projection is parallel - which can cause excessive tile selection if it is along an axis of an unbounded tile\n // tree such as the OSM buildings. Rev limit the selection here.\n public override get maxRealityTreeSelectionCount(): undefined | number { return 500; }\n\n public override processSelectedTiles(tiles: Tile[]): void {\n this._processTiles(tiles);\n }\n\n public override get frustumPlanes(): FrustumPlanes {\n if (true === this._useViewportMap)\n return super.frustumPlanes;\n else\n return this._mapFrustumPlanes;\n }\n\n public override get worldToViewMap(): Map4d {\n if (true === this._useViewportMap)\n return super.worldToViewMap;\n else\n return this._shadowMap.worldToViewMap;\n }\n\n public override drawGraphics(): void {\n const graphics = this.produceGraphics();\n if (graphics)\n this._shadowMap.addGraphic(graphics);\n }\n\n public override getPixelSize(tile: Tile): number {\n // For tiles that are part of the scene, size them based on the viewport frustum so that shadow map uses same resolution tiles as scene\n // - otherwise artifacts like shadow acne may result.\n // For tiles that are NOT part of the scene, size them based on the shadow frustum, not the viewport frustum\n // - otherwise excessive numbers of excessively detailed may be requested for the shadow map.\n if (undefined === this._useViewportMap) {\n this._useViewportMap = true;\n const vis = tile.computeVisibility(this);\n this._useViewportMap = TileVisibility.OutsideFrustum !== vis;\n }\n\n const size = super.getPixelSize(tile);\n this._useViewportMap = undefined;\n return size;\n }\n\n public static create(context: SceneContext, shadowMap: SolarShadowMap, tileTree: TileTreeReference, planes: FrustumPlanes, process: ProcessTiles) {\n const args = tileTree.createDrawArgs(context);\n return undefined !== args ? new SolarShadowMapDrawArgs(planes, shadowMap, args, process) : undefined;\n }\n }\n\n return SolarShadowMapDrawArgs.create(sceneContext, solarShadowMap, tree, frustumPlanes, processTiles);\n}\n\nconst shadowMapWidth = 4096; // size of original depth buffer map\nconst shadowMapHeight = shadowMapWidth; // TBD - Adjust for aspect ratio.\nconst evsmWidth = shadowMapWidth / 2; // EVSM buffer is 1/2 size each direction\nconst evsmHeight = shadowMapHeight / 2;\nconst postProjectionMatrixNpc = Matrix4d.createRowValues(/* Row 1 */ 0, 1, 0, 0, /* Row 2 */ 0, 0, 1, 0, /* Row 3 */ 1, 0, 0, 0, /* Row 4 */ 0, 0, 0, 1);\n\n// Bundles up the disposable, create-once-and-reuse members of a SolarShadowMap.\nclass Bundle implements WebGLDisposable {\n private constructor(\n public readonly depthTexture: Texture,\n public readonly shadowMapTexture: Texture,\n public readonly fbo: FrameBuffer,\n public readonly fboSM: FrameBuffer,\n public readonly evsmGeom: EVSMGeometry,\n public readonly renderCommands: RenderCommands) {\n }\n\n public static create(target: Target, stack: BranchStack, batch: BatchState): Bundle | undefined {\n const depthTextureHandle = System.instance.createDepthBuffer(shadowMapWidth, shadowMapHeight) as TextureHandle;\n if (undefined === depthTextureHandle)\n return undefined;\n\n let pixelDataType = GL.Texture.DataType.Float;\n switch (System.instance.maxRenderType) {\n case RenderType.TextureFloat:\n break;\n case RenderType.TextureHalfFloat:\n pixelDataType = System.instance.context.HALF_FLOAT;\n break;\n /* falls through */\n default:\n return undefined;\n }\n\n const colorTextures: TextureHandle[] = [];\n\n const fbo = FrameBuffer.create(colorTextures, depthTextureHandle);\n if (undefined === fbo)\n return undefined;\n\n // shadowMap texture is 1/4 size the depth texture (and averaged down when converting)\n const shadowMapTextureHandle = TextureHandle.createForAttachment(evsmWidth, evsmHeight, GL.Texture.Format.Rgba, pixelDataType);\n if (undefined === shadowMapTextureHandle)\n return undefined;\n\n const fboSM = FrameBuffer.create([shadowMapTextureHandle]);\n if (undefined === fboSM)\n return undefined;\n\n const depthTexture = new Texture({ ownership: \"external\", type: RenderTexture.Type.TileSection, handle: depthTextureHandle, transparency: TextureTransparency.Opaque });\n const evsmGeom = EVSMGeometry.createGeometry(depthTexture.texture.getHandle()!, shadowMapWidth, shadowMapHeight);\n if (undefined === evsmGeom)\n return undefined;\n\n const shadowMapTexture = new Texture({ type: RenderTexture.Type.Normal, ownership: \"external\", handle: shadowMapTextureHandle, transparency: TextureTransparency.Opaque });\n const renderCommands = new RenderCommands(target, stack, batch);\n return new Bundle(depthTexture, shadowMapTexture, fbo, fboSM, evsmGeom, renderCommands);\n }\n\n public get isDisposed(): boolean {\n return this.depthTexture.isDisposed\n && this.shadowMapTexture.isDisposed\n && this.fbo.isDisposed\n && this.fboSM.isDisposed\n && this.evsmGeom.isDisposed;\n }\n\n public [Symbol.dispose](): void {\n dispose(this.depthTexture);\n dispose(this.shadowMapTexture);\n dispose(this.fbo);\n dispose(this.fboSM);\n dispose(this.evsmGeom);\n }\n}\n\n/** Describes the set of parameters which, when they change, require us to recreate the shadow map. */\nclass ShadowMapParams {\n public readonly direction = new Vector3d();\n public readonly viewFrustum = new Frustum();\n public settings: SolarShadowSettings;\n\n public constructor(viewFrustum: Frustum, direction: Vector3d, settings: SolarShadowSettings) {\n direction.clone(this.direction);\n this.viewFrustum.setFrom(viewFrustum);\n this.settings = settings;\n }\n\n public update(viewFrustum: Frustum, direction: Vector3d, settings: SolarShadowSettings): void {\n this.settings = settings;\n this.viewFrustum.setFrom(viewFrustum);\n direction.clone(this.direction);\n }\n}\n\nconst defaultSunDirection = Vector3d.create(-1, -1, -1).normalize()!;\nconst scratchFrustum = new Frustum();\nconst scratchFrustumPlanes = FrustumPlanes.createEmpty();\n\nexport class SolarShadowMap implements RenderMemory.Consumer, WebGLDisposable {\n private _bundle?: Bundle;\n private _projectionMatrix = Matrix4d.createIdentity();\n private _graphics: RenderGraphic[] = [];\n private _shadowFrustum = new Frustum();\n private _isReady = false;\n private _isDrawing = false;\n private _enabled = false;\n private _params?: ShadowMapParams;\n private readonly _scratchRange = Range3d.createNull();\n private readonly _scratchTransform = Transform.createIdentity();\n\n private readonly _scratchViewFlags = new ViewFlags();\n private readonly _renderState: RenderState;\n private readonly _noZRenderState: RenderState;\n private readonly _batchState: BatchState;\n private _worldToViewMap = Map4d.createIdentity();\n private readonly _target: Target;\n\n // This exists chiefly for debugging. See ToggleShadowMapTilesTool.\n public onGraphicsChanged?: (graphics: RenderGraphic[]) => void;\n\n private getBundle(target: Target): Bundle | undefined {\n if (undefined === this._bundle) {\n this._bundle = Bundle.create(target, target.uniforms.branch.stack, this._batchState);\n assert(undefined !== this._bundle);\n }\n\n return this._bundle;\n }\n\n public get isReady() { return this._isReady; }\n public get isDrawing() { return this._isDrawing; }\n public get isEnabled() { return this._enabled; }\n public get projectionMatrix(): Matrix4d { return this._projectionMatrix; }\n public get depthTexture(): Texture | undefined { return undefined !== this._bundle ? this._bundle.depthTexture : undefined; }\n public get shadowMapTexture(): Texture | undefined { return undefined !== this._bundle ? this._bundle.shadowMapTexture : undefined; }\n public get settings(): SolarShadowSettings | undefined { return undefined !== this._params ? this._params.settings : undefined; }\n public get direction(): Vector3d | undefined { return undefined !== this._params ? this._params.direction : undefined; }\n public get frustum(): Frustum { return this._shadowFrustum; }\n public get worldToViewMap(): Map4d { return this._worldToViewMap; }\n public addGraphic(graphic: RenderGraphic) { this._graphics.push(graphic); }\n\n public constructor(target: Target) {\n this._target = target;\n this._renderState = new RenderState();\n this._renderState.flags.depthMask = true;\n this._renderState.flags.blend = false;\n this._renderState.flags.depthTest = true;\n\n this._noZRenderState = new RenderState();\n this._noZRenderState.flags.depthMask = false;\n\n this._batchState = new BatchState(target.uniforms.branch.stack);\n }\n\n public disable() {\n this._enabled = this._isReady = false;\n this._bundle = dispose(this._bundle);\n this.clearGraphics(true);\n this._target.uniforms.shadow.update();\n }\n\n public collectStatistics(stats: RenderMemory.Statistics): void {\n const bundle = this._bundle;\n if (undefined !== bundle)\n stats.addShadowMap(bundle.depthTexture.bytesUsed + bundle.shadowMapTexture.bytesUsed);\n }\n\n public get isDisposed(): boolean { return undefined === this._bundle && 0 === this._graphics.length; }\n\n public [Symbol.dispose]() {\n this._bundle = dispose(this._bundle);\n this.clearGraphics(true);\n }\n\n private clearGraphics(notify: boolean) {\n for (const graphic of this._graphics)\n graphic[Symbol.dispose]();\n\n this._graphics.length = 0;\n if (notify)\n this.notifyGraphicsChanged();\n }\n\n private notifyGraphicsChanged(): void {\n if (undefined !== this.onGraphicsChanged)\n this.onGraphicsChanged(this._graphics);\n }\n\n public update(context: SceneContext | undefined) {\n this._isReady = false;\n this.clearGraphics(false);\n\n if (undefined === context || !context.viewport.view.isSpatialView()) {\n this.disable();\n this.notifyGraphicsChanged();\n return;\n }\n\n const view = context.viewport.view;\n const style = view.getDisplayStyle3d();\n const sunDirection = style.sunDirection ?? defaultSunDirection;\n\n const minimumHorizonDirection = -.01;\n if (sunDirection.z > minimumHorizonDirection) {\n this.notifyGraphicsChanged();\n return;\n }\n\n this._enabled = true;\n const viewFrustum = context.viewingSpace.getFrustum();\n const settings = style.settings.solarShadows;\n if (undefined === this._params)\n this._params = new ShadowMapParams(viewFrustum, sunDirection, settings);\n else\n this._params.update(viewFrustum, sunDirection, settings);\n\n const iModel = view.iModel;\n\n const worldToMapTransform = Transform.createRefs(Point3d.createZero(), Matrix3d.createRigidHeadsUp(this._params.direction.negate()).inverse()!);\n const worldToMap = Matrix4d.createTransform(worldToMapTransform);\n const mapToWorld = worldToMap.createInverse()!;\n\n // Start with entire project.\n const shadowRange = worldToMapTransform.multiplyRange(iModel.projectExtents);\n\n // Limit the map to only displayed models.\n const viewTileRange = Range3d.createNull();\n for (const ref of view.getTileTreeRefs()) {\n if (ref.castsShadows) {\n if (ref.isGlobal) {\n // A shadow-casting tile tree that spans the globe. Limit its range to the viewed extents.\n for (const p3 of viewFrustum.points) {\n const p4 = worldToMap.multiplyPoint3d(p3, 1);\n if (p4.w > 0.0001)\n viewTileRange.extendXYZW(p4.x, p4.y, p4.z, p4.w);\n else\n viewTileRange.high.z = Math.max(1.0, viewTileRange.high.z); // behind eye plane.\n }\n } else {\n ref.accumulateTransformedRange(viewTileRange, worldToMap, undefined);\n }\n }\n }\n\n if (!viewTileRange.isNull)\n viewTileRange.clone(shadowRange);\n\n // Expand shadow range to include both the shadowers and shadowed portion of background map.\n scratchFrustum.initFromRange(shadowRange);\n mapToWorld.multiplyPoint3dArrayQuietNormalize(scratchFrustum.points); // This frustum represents the shadowing geometry. Intersect it with background geometry and expand the range depth to include that intersection.\n const backgroundMapGeometry = context.viewport.view.displayStyle.getBackgroundMapGeometry();\n if (undefined !== backgroundMapGeometry) {\n const backgroundDepthRange = backgroundMapGeometry.getFrustumIntersectionDepthRange(this._shadowFrustum, iModel.projectExtents);\n if (!backgroundDepthRange.isNull)\n shadowRange.low.z = Math.min(shadowRange.low.z, backgroundDepthRange.low);\n }\n\n this._params.viewFrustum.transformBy(worldToMapTransform, scratchFrustum);\n scratchFrustumPlanes.init(scratchFrustum);\n\n const viewIntersectShadowRange = Range3d.createNull();\n const viewClipPlanes = ConvexClipPlaneSet.createPlanes(scratchFrustumPlanes.planes);\n ClipUtilities.announceLoopsOfConvexClipPlaneSetIntersectRange(viewClipPlanes, shadowRange, (points: GrowableXYZArray) => {\n for (const point of points.getPoint3dArray())\n viewIntersectShadowRange.extendPoint(point);\n });\n if (viewIntersectShadowRange.isNull) {\n this.notifyGraphicsChanged();\n return;\n }\n viewIntersectShadowRange.high.z = shadowRange.high.z; // We need to include shadowing geometry that may be outside view (along the solar axis).\n\n this._shadowFrustum.initFromRange(viewIntersectShadowRange);\n mapToWorld.multiplyPoint3dArrayQuietNormalize(this._shadowFrustum.points);\n\n const tileRange = Range3d.createNull();\n scratchFrustumPlanes.init(this._shadowFrustum);\n for (const ref of view.getTileTreeRefs()) {\n if (!ref.castsShadows)\n return;\n\n const drawArgs = createDrawArgs(context, this, ref, scratchFrustumPlanes, (tiles: Tile[]) => {\n for (const tile of tiles)\n tileRange.extendRange(tileToMapTransform.multiplyRange(tile.range, this._scratchRange));\n });\n\n if (undefined === drawArgs)\n return;\n\n const tileToMapTransform = worldToMapTransform.multiplyTransformTransform(drawArgs.location, this._scratchTransform);\n drawArgs.tree.draw(drawArgs);\n }\n\n if (tileRange.isNull) {\n this.clearGraphics(true);\n } else if (this._graphics.length > 0) {\n // Avoid an uninvertible matrix on empty range...\n if (Geometry.isAlmostEqualNumber(shadowRange.low.x, shadowRange.high.x) ||\n Geometry.isAlmostEqualNumber(shadowRange.low.y, shadowRange.high.y) ||\n Geometry.isAlmostEqualNumber(shadowRange.low.z, shadowRange.high.z)) {\n this.clearGraphics(true);\n return;\n }\n\n const frustumMap = this._shadowFrustum.toMap4d();\n if (undefined === frustumMap) {\n this.clearGraphics(true);\n assert(false);\n return;\n }\n\n this._projectionMatrix = frustumMap.transform0.clone();\n\n const worldToNpc = postProjectionMatrixNpc.multiplyMatrixMatrix(this._projectionMatrix);\n const npcToView = Map4d.createBoxMap(Point3d.create(0, 0, 0), Point3d.create(1, 1, 1), Point3d.create(0, 0, 0), Point3d.create(shadowMapWidth, shadowMapHeight, 1))!;\n const npcToWorld = worldToNpc.createInverse();\n if (undefined === npcToWorld) {\n this.clearGraphics(true);\n return;\n }\n\n const worldToNpcMap = Map4d.createRefs(worldToNpc, npcToWorld);\n this._worldToViewMap = npcToView.multiplyMapMap(worldToNpcMap);\n }\n\n this._target.uniforms.shadow.update();\n this.notifyGraphicsChanged();\n }\n\n public draw(target: Target) {\n assert(this.isEnabled);\n\n if (this.isReady || 0 === this._graphics.length)\n return;\n\n const bundle = this.getBundle(target);\n if (undefined === bundle)\n return;\n\n this._isDrawing = true;\n\n const prevState = System.instance.currentRenderState.clone();\n const gl = System.instance.context;\n gl.viewport(0, 0, shadowMapWidth, shadowMapHeight);\n\n // NB: textures and materials are needed because their transparencies affect whether or not a surface casts shadows\n const viewFlags = target.currentViewFlags.copy({\n renderMode: RenderMode.SmoothShade,\n wiremesh: false,\n transparency: false,\n lighting: false,\n shadows: false,\n monochrome: false,\n ambientOcclusion: false,\n visibleEdges: false,\n hiddenEdges: false,\n });\n\n System.instance.applyRenderState(this._renderState);\n const prevPlan = target.plan;\n\n target.changeFrustum(this._shadowFrustum, this._shadowFrustum.getFraction(), true);\n target.uniforms.branch.changeRenderPlan(viewFlags, target.plan.is3d, target.plan.hline);\n\n const renderCommands = bundle.renderCommands;\n renderCommands.reset(target, target.uniforms.branch.stack, this._batchState);\n renderCommands.addGraphics(this._graphics);\n\n System.instance.frameBufferStack.execute(bundle.fbo, true, false, () => {\n System.instance.context.clearDepth(1.0);\n System.instance.context.clear(GL.BufferBit.Depth);\n target.techniques.execute(target, renderCommands.getCommands(RenderPass.OpaquePlanar), RenderPass.PlanarClassification); // Draw these with RenderPass.PlanarClassification (rather than Opaque...) so that the pick ordering is avoided.\n target.techniques.execute(target, renderCommands.getCommands(RenderPass.OpaqueGeneral), RenderPass.PlanarClassification); // Draw these with RenderPass.PlanarClassification (rather than Opaque...) so that the pick ordering is avoided.\n });\n\n // copy depth buffer to EVSM shadow buffer and average down for AA effect\n gl.viewport(0, 0, evsmWidth, evsmHeight);\n System.instance.frameBufferStack.execute(bundle.fboSM, true, false, () => {\n System.instance.applyRenderState(this._noZRenderState);\n const params = getDrawParams(target, bundle.evsmGeom);\n target.techniques.draw(params);\n });\n\n // mipmap resulting EVSM texture and set filtering options\n System.instance.activateTexture2d(TextureUnit.ShadowMap, bundle.shadowMapTexture.texture.getHandle());\n gl.generateMipmap(gl.TEXTURE_2D);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_LINEAR);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR);\n\n System.instance.setMaxAnisotropy(undefined);\n // target.recordPerformanceMetric(\"Compute EVSM\");\n\n this._batchState.reset(); // Reset the batch Ids...\n target.changeRenderPlan(prevPlan);\n\n System.instance.applyRenderState(prevState);\n System.instance.context.viewport(0, 0, target.viewRect.width, target.viewRect.height); // Restore viewport\n this.clearGraphics(false);\n this._isDrawing = false;\n this._isReady = true;\n }\n}\n"]}
|
|
@@ -12,8 +12,16 @@ import { TileTreeReference } from "./internal";
|
|
|
12
12
|
* @extensions
|
|
13
13
|
*/
|
|
14
14
|
export interface TiledGraphicsProvider {
|
|
15
|
-
/** For each [[TileTreeReference]] belonging to this provider that should be drawn in the specified [[Viewport]], apply the provided function.
|
|
15
|
+
/** For each [[TileTreeReference]] belonging to this provider that should be drawn in the specified [[Viewport]], apply the provided function.
|
|
16
|
+
* This method is inefficient because it does not permit the caller to prematurely halt iteration; and awkward because `func` cannot be `async` nor
|
|
17
|
+
* return any value.
|
|
18
|
+
* Implementations should implement [[getReferences]], and callers should prefer to call [[TiledGraphicsProvider.getTileTreeRefs]].
|
|
19
|
+
*/
|
|
16
20
|
forEachTileTreeRef(viewport: Viewport, func: (ref: TileTreeReference) => void): void;
|
|
21
|
+
/** If defined, iterates over the [[TileTreeReference]]s belonging to this provider that should be drawn in the specified [[Viewport]].
|
|
22
|
+
* [[TiledGraphicsProvider.getTileTreeRefs]] will call this more efficient method if defined, and fall back to the less efficient [[forEachTileTreeRef]] otherwise.
|
|
23
|
+
*/
|
|
24
|
+
getReferences?: (viewport: Viewport) => Iterable<TileTreeReference>;
|
|
17
25
|
/** If defined, overrides the logic for adding this provider's graphics into the scene.
|
|
18
26
|
* Otherwise, [[TileTreeReference.addToScene]] is invoked for each reference.
|
|
19
27
|
*/
|
|
@@ -31,5 +39,10 @@ export declare namespace TiledGraphicsProvider {
|
|
|
31
39
|
function addToScene(provider: TiledGraphicsProvider, context: SceneContext): void;
|
|
32
40
|
/** @internal because TypeDoc can't disambiguate with the interface method by same name. */
|
|
33
41
|
function isLoadingComplete(provider: TiledGraphicsProvider, viewport: Viewport): boolean;
|
|
42
|
+
/** Obtain an iterator over all of the [[TileTreeReference]]s belonging to this provider that should be drawn in the specified [[Viewport]].
|
|
43
|
+
* This function invokes [[TiledGraphicsProvider.getReferences]] if implemented by `provider`; otherwise, it populates an iterable from the references
|
|
44
|
+
* provided by [[TiledGraphicsProvider.forEachTileTreeRef]], which is less efficient.
|
|
45
|
+
*/
|
|
46
|
+
function getTileTreeRefs(provider: TiledGraphicsProvider, viewport: Viewport): Iterable<TileTreeReference>;
|
|
34
47
|
}
|
|
35
48
|
//# sourceMappingURL=TiledGraphicsProvider.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TiledGraphicsProvider.d.ts","sourceRoot":"","sources":["../../../src/tile/TiledGraphicsProvider.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE/C;;;;;;GAMG;AACH,MAAM,WAAW,qBAAqB;IACpC
|
|
1
|
+
{"version":3,"file":"TiledGraphicsProvider.d.ts","sourceRoot":"","sources":["../../../src/tile/TiledGraphicsProvider.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC9C,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAE/C;;;;;;GAMG;AACH,MAAM,WAAW,qBAAqB;IACpC;;;;OAIG;IACH,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,GAAG,EAAE,iBAAiB,KAAK,IAAI,GAAG,IAAI,CAAC;IAErF;;OAEG;IACH,aAAa,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,QAAQ,CAAC,iBAAiB,CAAC,CAAC;IAEpE;;OAEG;IACH,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,YAAY,KAAK,IAAI,CAAC;IAE7C;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,OAAO,CAAC;CACrD;AAED,cAAc;AACd,yBAAiB,qBAAqB,CAAC;IACrC,2FAA2F;IAC3F,SAAgB,UAAU,CAAC,QAAQ,EAAE,qBAAqB,EAAE,OAAO,EAAE,YAAY,GAAG,IAAI,CAKvF;IAED,2FAA2F;IAC3F,SAAgB,iBAAiB,CAAC,QAAQ,EAAE,qBAAqB,EAAE,QAAQ,EAAE,QAAQ,GAAG,OAAO,CAU9F;IAED;;;OAGG;IACH,SAAgB,eAAe,CAAC,QAAQ,EAAE,qBAAqB,EAAE,QAAQ,EAAE,QAAQ,GAAG,QAAQ,CAAC,iBAAiB,CAAC,CAWhH;CACF"}
|
|
@@ -27,5 +27,20 @@ export var TiledGraphicsProvider;
|
|
|
27
27
|
return allLoaded;
|
|
28
28
|
}
|
|
29
29
|
TiledGraphicsProvider.isLoadingComplete = isLoadingComplete;
|
|
30
|
+
/** Obtain an iterator over all of the [[TileTreeReference]]s belonging to this provider that should be drawn in the specified [[Viewport]].
|
|
31
|
+
* This function invokes [[TiledGraphicsProvider.getReferences]] if implemented by `provider`; otherwise, it populates an iterable from the references
|
|
32
|
+
* provided by [[TiledGraphicsProvider.forEachTileTreeRef]], which is less efficient.
|
|
33
|
+
*/
|
|
34
|
+
function getTileTreeRefs(provider, viewport) {
|
|
35
|
+
if (provider.getReferences) {
|
|
36
|
+
return provider.getReferences(viewport);
|
|
37
|
+
}
|
|
38
|
+
const refs = [];
|
|
39
|
+
provider.forEachTileTreeRef(viewport, (ref) => {
|
|
40
|
+
refs.push(ref);
|
|
41
|
+
});
|
|
42
|
+
return refs;
|
|
43
|
+
}
|
|
44
|
+
TiledGraphicsProvider.getTileTreeRefs = getTileTreeRefs;
|
|
30
45
|
})(TiledGraphicsProvider || (TiledGraphicsProvider = {}));
|
|
31
46
|
//# sourceMappingURL=TiledGraphicsProvider.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TiledGraphicsProvider.js","sourceRoot":"","sources":["../../../src/tile/TiledGraphicsProvider.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F;;GAEG;
|
|
1
|
+
{"version":3,"file":"TiledGraphicsProvider.js","sourceRoot":"","sources":["../../../src/tile/TiledGraphicsProvider.ts"],"names":[],"mappings":"AAAA;;;+FAG+F;AAC/F;;GAEG;AAuCH,cAAc;AACd,MAAM,KAAW,qBAAqB,CAsCrC;AAtCD,WAAiB,qBAAqB;IACpC,2FAA2F;IAC3F,SAAgB,UAAU,CAAC,QAA+B,EAAE,OAAqB;QAC/E,IAAI,QAAQ,CAAC,UAAU;YACrB,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;;YAE7B,QAAQ,CAAC,kBAAkB,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;IACpF,CAAC;IALe,gCAAU,aAKzB,CAAA;IAED,2FAA2F;IAC3F,SAAgB,iBAAiB,CAAC,QAA+B,EAAE,QAAkB;QACnF,IAAI,QAAQ,CAAC,iBAAiB,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC,QAAQ,CAAC;YACrE,OAAO,KAAK,CAAC;QAEf,IAAI,SAAS,GAAG,IAAI,CAAC;QACrB,QAAQ,CAAC,kBAAkB,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE;YAC5C,SAAS,KAAK,GAAG,CAAC,iBAAiB,CAAC;QACtC,CAAC,CAAC,CAAC;QAEH,OAAO,SAAS,CAAC;IACnB,CAAC;IAVe,uCAAiB,oBAUhC,CAAA;IAED;;;OAGG;IACH,SAAgB,eAAe,CAAC,QAA+B,EAAE,QAAkB;QACjF,IAAI,QAAQ,CAAC,aAAa,EAAE,CAAC;YAC3B,OAAO,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QAC1C,CAAC;QAED,MAAM,IAAI,GAAwB,EAAE,CAAC;QACrC,QAAQ,CAAC,kBAAkB,CAAC,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE;YAC5C,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACjB,CAAC,CAAC,CAAC;QAEH,OAAO,IAAI,CAAC;IACd,CAAC;IAXe,qCAAe,kBAW9B,CAAA;AACH,CAAC,EAtCgB,qBAAqB,KAArB,qBAAqB,QAsCrC","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module Views\n */\n\nimport { Viewport } from \"../Viewport\";\nimport { SceneContext } from \"../ViewContext\";\nimport { TileTreeReference } from \"./internal\";\n\n/** Provides a way for applications to inject additional non-decorative graphics into a [[Viewport]] by supplying one or more [[TileTreeReference]]s capable of loading and drawing the graphics.\n * @see [[Viewport.addTiledGraphicsProvider]] to register a provider to be drawn in a viewport.\n * @see [Exploded View Sample](https://www.itwinjs.org/sample-showcase/?group=Viewer+Features&sample=explode-sample&imodel=House+Sample) for an interactive\n * demonstration of a custom provider.\n * @public\n * @extensions\n */\nexport interface TiledGraphicsProvider {\n /** For each [[TileTreeReference]] belonging to this provider that should be drawn in the specified [[Viewport]], apply the provided function.\n * This method is inefficient because it does not permit the caller to prematurely halt iteration; and awkward because `func` cannot be `async` nor\n * return any value.\n * Implementations should implement [[getReferences]], and callers should prefer to call [[TiledGraphicsProvider.getTileTreeRefs]].\n */\n forEachTileTreeRef(viewport: Viewport, func: (ref: TileTreeReference) => void): void;\n\n /** If defined, iterates over the [[TileTreeReference]]s belonging to this provider that should be drawn in the specified [[Viewport]].\n * [[TiledGraphicsProvider.getTileTreeRefs]] will call this more efficient method if defined, and fall back to the less efficient [[forEachTileTreeRef]] otherwise.\n */\n getReferences?: (viewport: Viewport) => Iterable<TileTreeReference>;\n\n /** If defined, overrides the logic for adding this provider's graphics into the scene.\n * Otherwise, [[TileTreeReference.addToScene]] is invoked for each reference.\n */\n addToScene?: (context: SceneContext) => void;\n\n /** If defined, returns true if the [[TileTree]]s required for displaying this provider's graphics in the specified [[Viewport]] are loaded and ready to draw.\n * Otherwise, [[TileTreeReference.isLoadingComplete]] is invoked for each reference.\n * A provider might supply this function if it needs to perform some asynchronous work before it can supply its [[TileTreeReference]]s and/or after its\n * [[TileTree]]s are loaded.\n */\n isLoadingComplete?: (viewport: Viewport) => boolean;\n}\n\n/** @public */\nexport namespace TiledGraphicsProvider {\n /** @internal because TypeDoc can't disambiguate with the interface method by same name. */\n export function addToScene(provider: TiledGraphicsProvider, context: SceneContext): void {\n if (provider.addToScene)\n provider.addToScene(context);\n else\n provider.forEachTileTreeRef(context.viewport, (ref) => ref.addToScene(context));\n }\n\n /** @internal because TypeDoc can't disambiguate with the interface method by same name. */\n export function isLoadingComplete(provider: TiledGraphicsProvider, viewport: Viewport): boolean {\n if (provider.isLoadingComplete && !provider.isLoadingComplete(viewport))\n return false;\n\n let allLoaded = true;\n provider.forEachTileTreeRef(viewport, (ref) => {\n allLoaded &&= ref.isLoadingComplete;\n });\n\n return allLoaded;\n }\n\n /** Obtain an iterator over all of the [[TileTreeReference]]s belonging to this provider that should be drawn in the specified [[Viewport]].\n * This function invokes [[TiledGraphicsProvider.getReferences]] if implemented by `provider`; otherwise, it populates an iterable from the references\n * provided by [[TiledGraphicsProvider.forEachTileTreeRef]], which is less efficient.\n */\n export function getTileTreeRefs(provider: TiledGraphicsProvider, viewport: Viewport): Iterable<TileTreeReference> {\n if (provider.getReferences) {\n return provider.getReferences(viewport);\n }\n\n const refs: TileTreeReference[] = [];\n provider.forEachTileTreeRef(viewport, (ref) => {\n refs.push(ref);\n });\n\n return refs;\n }\n}\n"]}
|
|
@@ -25,6 +25,7 @@ export declare class MapTiledGraphicsProvider implements TiledGraphicsProvider {
|
|
|
25
25
|
readonly overlayMap: MapTileTreeReference;
|
|
26
26
|
readonly backgroundDrapeMap: MapTileTreeReference;
|
|
27
27
|
private readonly _detachFromDisplayStyle;
|
|
28
|
+
getReferences(viewport: Viewport): Iterable<TileTreeReference>;
|
|
28
29
|
forEachTileTreeRef(viewport: Viewport, func: (ref: TileTreeReference) => void): void;
|
|
29
30
|
constructor(viewportId: number, displayStyle: DisplayStyleState);
|
|
30
31
|
setView(newView: ViewState): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MapTiledGraphicsProvider.d.ts","sourceRoot":"","sources":["../../../../src/tile/map/MapTiledGraphicsProvider.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAwB,uBAAuB,EAAE,wBAAwB,EAAE,oBAAoB,EAAE,qBAAqB,EAA2B,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAG/L;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B;;MAEE;IACF,SAAS,EAAE,OAAO,CAAC;IAEnB;;MAEE;IACF,KAAK,EAAE,MAAM,CAAC;CACf;AAED,gBAAgB;AAChB,qBAAa,wBAAyB,YAAW,qBAAqB;IACpE,SAAgB,aAAa,EAAE,oBAAoB,CAAC;IACpD,SAAgB,UAAU,EAAE,oBAAoB,CAAC;IACjD,SAAgB,kBAAkB,EAAE,oBAAoB,CAAC;IACzD,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAsB;
|
|
1
|
+
{"version":3,"file":"MapTiledGraphicsProvider.d.ts","sourceRoot":"","sources":["../../../../src/tile/map/MapTiledGraphicsProvider.ts"],"names":[],"mappings":"AAIA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAEjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAwB,uBAAuB,EAAE,wBAAwB,EAAE,oBAAoB,EAAE,qBAAqB,EAA2B,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAG/L;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B;;MAEE;IACF,SAAS,EAAE,OAAO,CAAC;IAEnB;;MAEE;IACF,KAAK,EAAE,MAAM,CAAC;CACf;AAED,gBAAgB;AAChB,qBAAa,wBAAyB,YAAW,qBAAqB;IACpE,SAAgB,aAAa,EAAE,oBAAoB,CAAC;IACpD,SAAgB,UAAU,EAAE,oBAAoB,CAAC;IACjD,SAAgB,kBAAkB,EAAE,oBAAoB,CAAC;IACzD,OAAO,CAAC,QAAQ,CAAC,uBAAuB,CAAsB;IAErD,aAAa,CAAC,QAAQ,EAAE,QAAQ,GAAG,QAAQ,CAAC,iBAAiB,CAAC;IAOhE,kBAAkB,CAAC,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,GAAG,EAAE,iBAAiB,KAAK,IAAI,GAAG,IAAI;gBAO/E,UAAU,EAAE,MAAM,EAAE,YAAY,EAAE,iBAAiB;IAyCxD,OAAO,CAAC,OAAO,EAAE,SAAS;IAsB1B,sBAAsB,IAAI,IAAI;IAKrC,gBAAgB;IACT,0BAA0B,CAAC,aAAa,EAAE,aAAa,GAAG,uBAAuB,GAAG,SAAS;IAK7F,aAAa,CAAC,aAAa,EAAE,aAAa;IAKjD;;OAEG;IACI,yBAAyB,CAAC,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,GAAG,aAAa,EAAE;IAkBjG,gBAAgB;IACT,eAAe,CAAC,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,GAAG,wBAAwB,EAAE;CAKnG"}
|
|
@@ -10,6 +10,12 @@ import { DisclosedTileTreeSet, MapTileTreeReference } from "../internal";
|
|
|
10
10
|
import { IModelApp } from "../../IModelApp";
|
|
11
11
|
/** @internal */
|
|
12
12
|
export class MapTiledGraphicsProvider {
|
|
13
|
+
*getReferences(viewport) {
|
|
14
|
+
if (viewport.viewFlags.backgroundMap) {
|
|
15
|
+
yield this.backgroundMap;
|
|
16
|
+
yield this.overlayMap;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
13
19
|
forEachTileTreeRef(viewport, func) {
|
|
14
20
|
if (viewport.viewFlags.backgroundMap) {
|
|
15
21
|
func(this.backgroundMap);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MapTiledGraphicsProvider.js","sourceRoot":"","sources":["../../../../src/tile/map/MapTiledGraphicsProvider.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module Tiles\n */\n\nimport { Id64String } from \"@itwin/core-bentley\";\nimport { BaseMapLayerSettings, MapImagerySettings, MapLayerSettings } from \"@itwin/core-common\";\nimport { DisplayStyleState } from \"../../DisplayStyleState\";\nimport { ViewState } from \"../../ViewState\";\nimport { Viewport } from \"../../Viewport\";\nimport { DisclosedTileTreeSet, MapLayerImageryProvider, MapLayerInfoFromTileTree, MapTileTreeReference, TiledGraphicsProvider, TileTree, TileTreeOwner, TileTreeReference } from \"../internal\";\nimport { IModelApp } from \"../../IModelApp\";\n\n/** Position of a map-layer in the display style's map (i.e. background/overlay map)\n * @public\n */\nexport interface MapLayerIndex {\n /** True if map-layer is part of [[DisplayStyleState]]'s overlay map, otherwise map-layer is part of [[DisplayStyleState]]'s background map\n * @see [[DisplayStyleState.mapLayerAtIndex]].\n */\n isOverlay: boolean;\n\n /** Index of the map-layer in [[DisplayStyleState]]'s background/overlay map\n * @see [[DisplayStyleState.mapLayerAtIndex]].\n */\n index: number;\n}\n\n/** @internal */\nexport class MapTiledGraphicsProvider implements TiledGraphicsProvider {\n public readonly backgroundMap: MapTileTreeReference;\n public readonly overlayMap: MapTileTreeReference;\n public readonly backgroundDrapeMap: MapTileTreeReference;\n private readonly _detachFromDisplayStyle: VoidFunction[] = [];\n\n public forEachTileTreeRef(viewport: Viewport, func: (ref: TileTreeReference) => void): void {\n if (viewport.viewFlags.backgroundMap) {\n func(this.backgroundMap);\n func(this.overlayMap);\n }\n }\n constructor(viewportId: number, displayStyle: DisplayStyleState) {\n const mapSettings = displayStyle.backgroundMapSettings;\n const mapImagery = displayStyle.settings.mapImagery;\n this.backgroundMap = new MapTileTreeReference(mapSettings, mapImagery.backgroundBase, mapImagery.backgroundLayers, displayStyle.iModel, viewportId, false, false, () => displayStyle.overrideTerrainDisplay());\n this.overlayMap = new MapTileTreeReference(mapSettings, undefined, mapImagery.overlayLayers, displayStyle.iModel, viewportId, true, false);\n this.backgroundDrapeMap = new MapTileTreeReference(mapSettings, mapImagery.backgroundBase, mapImagery.backgroundLayers, displayStyle.iModel, viewportId, false, true);\n\n const removals = this._detachFromDisplayStyle;\n removals.push(displayStyle.settings.onBackgroundMapChanged.addListener((settings) => {\n this.backgroundMap.settings = settings;\n this.overlayMap.settings = settings;\n this.backgroundDrapeMap.settings = settings;\n }));\n\n removals.push(displayStyle.settings.onMapImageryChanged.addListener((imagery: Readonly<MapImagerySettings>) => {\n this.backgroundMap.setBaseLayerSettings(imagery.backgroundBase);\n this.backgroundMap.setLayerSettings(imagery.backgroundLayers);\n this.backgroundDrapeMap.setBaseLayerSettings(mapImagery.backgroundBase);\n this.backgroundDrapeMap.setLayerSettings(mapImagery.backgroundLayers);\n this.overlayMap.setLayerSettings(imagery.overlayLayers);\n }));\n\n // We need to clear imagery tiles assigned to map tiles every time a new ImageryTileTree is loaded,\n // otherwise the imagery tiles won't refresh correctly.\n const clearMapLayers = (loadedTileTree: TileTree, mapTileTreeToClear: MapTileTreeReference) => {\n const trees = new DisclosedTileTreeSet();\n mapTileTreeToClear.discloseTileTrees(trees);\n if (trees.has(loadedTileTree)) {\n mapTileTreeToClear.clearLayers();\n }\n };\n removals.push(IModelApp.tileAdmin.onTileTreeLoad.addListener((tileTree: TileTreeOwner) => {\n if (tileTree.tileTree !== undefined) {\n clearMapLayers(tileTree.tileTree, this.backgroundMap);\n clearMapLayers(tileTree.tileTree, this.overlayMap);\n }\n }));\n }\n\n // This is used in inital view setup and when views are synchronized. If view is being synchronized\n // we need to clear the layers which purges tile graphics if the settings or layers are changed.\n public setView(newView: ViewState) {\n const layersMatch = ((layers1: MapLayerSettings[], layers2: MapLayerSettings[]): boolean => {\n if (layers1.length !== layers2.length)\n return false;\n\n for (let i = 0; i < layers1.length; i++)\n if (!layers1[i].displayMatches(layers2[i]))\n return false;\n\n return true;\n });\n const mapImagery = newView.displayStyle.settings.mapImagery;\n if (!newView.displayStyle.backgroundMapSettings.equals(this.backgroundMap.settings)\n || !layersMatch(mapImagery.backgroundLayers, this.backgroundMap.layerSettings)\n || (mapImagery.backgroundBase instanceof BaseMapLayerSettings && !layersMatch([mapImagery.backgroundBase], this.backgroundDrapeMap.layerSettings))) {\n this.backgroundMap.clearLayers();\n this.backgroundDrapeMap.clearLayers();\n }\n if (!layersMatch(mapImagery.overlayLayers, this.overlayMap.layerSettings))\n this.overlayMap.clearLayers();\n }\n\n public detachFromDisplayStyle(): void {\n this._detachFromDisplayStyle.forEach((f) => f());\n this._detachFromDisplayStyle.length = 0;\n }\n\n /** @internal */\n public getMapLayerImageryProvider(mapLayerIndex: MapLayerIndex): MapLayerImageryProvider | undefined {\n const imageryTreeRef = mapLayerIndex.isOverlay ? this.overlayMap.getLayerImageryTreeRef(mapLayerIndex.index) : this.backgroundMap.getLayerImageryTreeRef(mapLayerIndex.index);\n return imageryTreeRef?.imageryProvider;\n }\n\n public resetMapLayer(mapLayerIndex: MapLayerIndex) {\n const imageryTreeRef = mapLayerIndex.isOverlay ? this.overlayMap.getLayerImageryTreeRef(mapLayerIndex.index) : this.backgroundMap.getLayerImageryTreeRef(mapLayerIndex.index);\n imageryTreeRef?.resetTreeOwner();\n }\n\n /** Return a list of map-layers indexes matching a given MapTile tree Id and a layer imagery tree id.\n * @internal\n */\n public getMapLayerIndexesFromIds(mapTreeId: Id64String, layerTreeId: Id64String): MapLayerIndex[] {\n const layers = new Array<MapLayerIndex>();\n if (mapTreeId === this.backgroundMap.treeOwner.tileTree?.id) {\n for (let i = 0; i < this.backgroundMap.layerSettings.length; i++) {\n if (this.backgroundMap.getLayerImageryTreeRef(i)?.treeOwner.tileTree?.id === layerTreeId) {\n layers.push({ index: i, isOverlay: false });\n }\n }\n } else if (mapTreeId === this.overlayMap.treeOwner.tileTree?.id) {\n for (let i = 0; i < this.overlayMap.layerSettings.length; i++) {\n if (this.overlayMap.getLayerImageryTreeRef(i)?.treeOwner.tileTree?.id === layerTreeId) {\n layers.push({ index: i, isOverlay: true });\n }\n }\n }\n return layers;\n }\n\n /** @internal */\n public mapLayerFromIds(mapTreeId: Id64String, layerTreeId: Id64String): MapLayerInfoFromTileTree[] {\n const bgMapLayers = this.backgroundMap.layerFromTreeModelIds(mapTreeId, layerTreeId);\n const ovlMapLayers = this.overlayMap.layerFromTreeModelIds(mapTreeId, layerTreeId);\n return [...bgMapLayers, ...ovlMapLayers];\n }\n}\n\n"]}
|
|
1
|
+
{"version":3,"file":"MapTiledGraphicsProvider.js","sourceRoot":"","sources":["../../../../src/tile/map/MapTiledGraphicsProvider.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\n/** @packageDocumentation\n * @module Tiles\n */\n\nimport { Id64String } from \"@itwin/core-bentley\";\nimport { BaseMapLayerSettings, MapImagerySettings, MapLayerSettings } from \"@itwin/core-common\";\nimport { DisplayStyleState } from \"../../DisplayStyleState\";\nimport { ViewState } from \"../../ViewState\";\nimport { Viewport } from \"../../Viewport\";\nimport { DisclosedTileTreeSet, MapLayerImageryProvider, MapLayerInfoFromTileTree, MapTileTreeReference, TiledGraphicsProvider, TileTree, TileTreeOwner, TileTreeReference } from \"../internal\";\nimport { IModelApp } from \"../../IModelApp\";\n\n/** Position of a map-layer in the display style's map (i.e. background/overlay map)\n * @public\n */\nexport interface MapLayerIndex {\n /** True if map-layer is part of [[DisplayStyleState]]'s overlay map, otherwise map-layer is part of [[DisplayStyleState]]'s background map\n * @see [[DisplayStyleState.mapLayerAtIndex]].\n */\n isOverlay: boolean;\n\n /** Index of the map-layer in [[DisplayStyleState]]'s background/overlay map\n * @see [[DisplayStyleState.mapLayerAtIndex]].\n */\n index: number;\n}\n\n/** @internal */\nexport class MapTiledGraphicsProvider implements TiledGraphicsProvider {\n public readonly backgroundMap: MapTileTreeReference;\n public readonly overlayMap: MapTileTreeReference;\n public readonly backgroundDrapeMap: MapTileTreeReference;\n private readonly _detachFromDisplayStyle: VoidFunction[] = [];\n\n public * getReferences(viewport: Viewport): Iterable<TileTreeReference> {\n if (viewport.viewFlags.backgroundMap) {\n yield this.backgroundMap;\n yield this.overlayMap;\n }\n }\n\n public forEachTileTreeRef(viewport: Viewport, func: (ref: TileTreeReference) => void): void {\n if (viewport.viewFlags.backgroundMap) {\n func(this.backgroundMap);\n func(this.overlayMap);\n }\n }\n\n constructor(viewportId: number, displayStyle: DisplayStyleState) {\n const mapSettings = displayStyle.backgroundMapSettings;\n const mapImagery = displayStyle.settings.mapImagery;\n this.backgroundMap = new MapTileTreeReference(mapSettings, mapImagery.backgroundBase, mapImagery.backgroundLayers, displayStyle.iModel, viewportId, false, false, () => displayStyle.overrideTerrainDisplay());\n this.overlayMap = new MapTileTreeReference(mapSettings, undefined, mapImagery.overlayLayers, displayStyle.iModel, viewportId, true, false);\n this.backgroundDrapeMap = new MapTileTreeReference(mapSettings, mapImagery.backgroundBase, mapImagery.backgroundLayers, displayStyle.iModel, viewportId, false, true);\n\n const removals = this._detachFromDisplayStyle;\n removals.push(displayStyle.settings.onBackgroundMapChanged.addListener((settings) => {\n this.backgroundMap.settings = settings;\n this.overlayMap.settings = settings;\n this.backgroundDrapeMap.settings = settings;\n }));\n\n removals.push(displayStyle.settings.onMapImageryChanged.addListener((imagery: Readonly<MapImagerySettings>) => {\n this.backgroundMap.setBaseLayerSettings(imagery.backgroundBase);\n this.backgroundMap.setLayerSettings(imagery.backgroundLayers);\n this.backgroundDrapeMap.setBaseLayerSettings(mapImagery.backgroundBase);\n this.backgroundDrapeMap.setLayerSettings(mapImagery.backgroundLayers);\n this.overlayMap.setLayerSettings(imagery.overlayLayers);\n }));\n\n // We need to clear imagery tiles assigned to map tiles every time a new ImageryTileTree is loaded,\n // otherwise the imagery tiles won't refresh correctly.\n const clearMapLayers = (loadedTileTree: TileTree, mapTileTreeToClear: MapTileTreeReference) => {\n const trees = new DisclosedTileTreeSet();\n mapTileTreeToClear.discloseTileTrees(trees);\n if (trees.has(loadedTileTree)) {\n mapTileTreeToClear.clearLayers();\n }\n };\n removals.push(IModelApp.tileAdmin.onTileTreeLoad.addListener((tileTree: TileTreeOwner) => {\n if (tileTree.tileTree !== undefined) {\n clearMapLayers(tileTree.tileTree, this.backgroundMap);\n clearMapLayers(tileTree.tileTree, this.overlayMap);\n }\n }));\n }\n\n // This is used in inital view setup and when views are synchronized. If view is being synchronized\n // we need to clear the layers which purges tile graphics if the settings or layers are changed.\n public setView(newView: ViewState) {\n const layersMatch = ((layers1: MapLayerSettings[], layers2: MapLayerSettings[]): boolean => {\n if (layers1.length !== layers2.length)\n return false;\n\n for (let i = 0; i < layers1.length; i++)\n if (!layers1[i].displayMatches(layers2[i]))\n return false;\n\n return true;\n });\n const mapImagery = newView.displayStyle.settings.mapImagery;\n if (!newView.displayStyle.backgroundMapSettings.equals(this.backgroundMap.settings)\n || !layersMatch(mapImagery.backgroundLayers, this.backgroundMap.layerSettings)\n || (mapImagery.backgroundBase instanceof BaseMapLayerSettings && !layersMatch([mapImagery.backgroundBase], this.backgroundDrapeMap.layerSettings))) {\n this.backgroundMap.clearLayers();\n this.backgroundDrapeMap.clearLayers();\n }\n if (!layersMatch(mapImagery.overlayLayers, this.overlayMap.layerSettings))\n this.overlayMap.clearLayers();\n }\n\n public detachFromDisplayStyle(): void {\n this._detachFromDisplayStyle.forEach((f) => f());\n this._detachFromDisplayStyle.length = 0;\n }\n\n /** @internal */\n public getMapLayerImageryProvider(mapLayerIndex: MapLayerIndex): MapLayerImageryProvider | undefined {\n const imageryTreeRef = mapLayerIndex.isOverlay ? this.overlayMap.getLayerImageryTreeRef(mapLayerIndex.index) : this.backgroundMap.getLayerImageryTreeRef(mapLayerIndex.index);\n return imageryTreeRef?.imageryProvider;\n }\n\n public resetMapLayer(mapLayerIndex: MapLayerIndex) {\n const imageryTreeRef = mapLayerIndex.isOverlay ? this.overlayMap.getLayerImageryTreeRef(mapLayerIndex.index) : this.backgroundMap.getLayerImageryTreeRef(mapLayerIndex.index);\n imageryTreeRef?.resetTreeOwner();\n }\n\n /** Return a list of map-layers indexes matching a given MapTile tree Id and a layer imagery tree id.\n * @internal\n */\n public getMapLayerIndexesFromIds(mapTreeId: Id64String, layerTreeId: Id64String): MapLayerIndex[] {\n const layers = new Array<MapLayerIndex>();\n if (mapTreeId === this.backgroundMap.treeOwner.tileTree?.id) {\n for (let i = 0; i < this.backgroundMap.layerSettings.length; i++) {\n if (this.backgroundMap.getLayerImageryTreeRef(i)?.treeOwner.tileTree?.id === layerTreeId) {\n layers.push({ index: i, isOverlay: false });\n }\n }\n } else if (mapTreeId === this.overlayMap.treeOwner.tileTree?.id) {\n for (let i = 0; i < this.overlayMap.layerSettings.length; i++) {\n if (this.overlayMap.getLayerImageryTreeRef(i)?.treeOwner.tileTree?.id === layerTreeId) {\n layers.push({ index: i, isOverlay: true });\n }\n }\n }\n return layers;\n }\n\n /** @internal */\n public mapLayerFromIds(mapTreeId: Id64String, layerTreeId: Id64String): MapLayerInfoFromTileTree[] {\n const bgMapLayers = this.backgroundMap.layerFromTreeModelIds(mapTreeId, layerTreeId);\n const ovlMapLayers = this.overlayMap.layerFromTreeModelIds(mapTreeId, layerTreeId);\n return [...bgMapLayers, ...ovlMapLayers];\n }\n}\n\n"]}
|
|
@@ -20,6 +20,11 @@ export declare class AccuDrawViewportUI extends AccuDraw {
|
|
|
20
20
|
fixedLocation: boolean;
|
|
21
21
|
/** Layout controls in a single row horizontally instead of in columns vertically as an option when using fixed location. */
|
|
22
22
|
horizontalArrangement: boolean;
|
|
23
|
+
/** When controls follow the cursor, the X and Y offsets applied to the current point to position the top left (values in inches based on screen DPI) */
|
|
24
|
+
cursorOffset: {
|
|
25
|
+
x: number;
|
|
26
|
+
y: number;
|
|
27
|
+
};
|
|
23
28
|
/** Replace "^", ";", and ".." with "°" or ":" for easier input. */
|
|
24
29
|
simplifiedInput: boolean;
|
|
25
30
|
/** Enable simple math operations not supported by quantity parser. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AccuDrawViewportUI.d.ts","sourceRoot":"","sources":["../../../src/tools/AccuDrawViewportUI.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,QAAQ,EAAe,SAAS,EAAE,MAAM,aAAa,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAG9C,OAAO,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AACvC,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAS7C;;GAEG;AACH,qBAAa,kBAAmB,SAAQ,QAAQ;IAC9C,OAAO,CAAC,UAAU,CAAY;IAC9B,OAAO,CAAC,SAAS,CAAC,CAAmB;IACrC,OAAO,CAAC,kBAAkB,CAAC,CAAO;IAClC,OAAO,CAAC,WAAW,CAAC,CAAwC;IAE5D;;OAEG;IACH,OAAc,YAAY;QACxB,qGAAqG;;QAErG,+GAA+G;;QAE/G,4HAA4H;;QAE5H,mEAAmE;;QAEnE,sEAAsE;;QAEtE,iEAAiE;;QAEjE,iEAAiE;;QAEjE,kFAAkF;;QAElF,4DAA4D;;QAE5D,4EAA4E;;QAG5E,qEAAqE;;YAEnE,wEAAwE;;YAExE,sEAAsE;;YAEtE,uEAAuE;;YAEvE,oDAAoD;;;QAItD,yCAAyC;;YAEvC,0CAA0C;;YAE1C,gFAAgF;;YAEhF,+BAA+B;;YAE/B,2DAA2D;;;MAG7D;IAEF,oGAAoG;;IAMpG,gGAAgG;IACzF,uBAAuB;IAO9B,yFAAyF;IAClF,wBAAwB;IAO/B,kFAAkF;IAC3E,eAAe,IAAI,IAAI;IAc9B,OAAO,CAAC,eAAe;IAOvB,OAAO,CAAC,iBAAiB;IAQzB,OAAO,CAAC,qBAAqB;IAK7B,OAAO,CAAC,qBAAqB;IAY7B,OAAO,CAAC,eAAe;IAQvB,OAAO,CAAC,kBAAkB;IAe1B,OAAO,CAAC,eAAe;YA4CT,mBAAmB;YAmBnB,kBAAkB;IAehC,OAAO,CAAC,gBAAgB;IAOxB,OAAO,CAAC,WAAW;YAUL,kBAAkB;YAUlB,UAAU;YAUV,aAAa;IAS3B,OAAO,CAAC,UAAU;YAOJ,aAAa;IAO3B,OAAO,CAAC,qBAAqB;IAuB7B,OAAO,CAAC,kBAAkB;IA2B1B,OAAO,CAAC,oBAAoB;IAgB5B,OAAO,CAAC,sBAAsB;YA+EhB,YAAY;YAkBZ,eAAe;IA4C7B,OAAO,CAAC,cAAc;IAStB,OAAO,CAAC,gBAAgB;IAcxB,OAAO,CAAC,0BAA0B;IASlC,OAAO,CAAC,oBAAoB;IAM5B,OAAO,CAAC,mBAAmB;IAO3B,OAAO,CAAC,mBAAmB;IAe3B,OAAO,CAAC,eAAe;IAkBvB,OAAO,CAAC,mBAAmB;IAqC3B,yEAAyE;IACzE,SAAS,CAAC,iBAAiB,CAAC,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,cAAc,GAAG,IAAI;IAEvE,mFAAmF;IACnF,SAAS,CAAC,kBAAkB,CAAC,EAAE,EAAE,cAAc,GAAG,QAAQ,GAAG,SAAS;IAWtE,OAAO,CAAC,uBAAuB;IAuB/B,OAAO,CAAC,cAAc;
|
|
1
|
+
{"version":3,"file":"AccuDrawViewportUI.d.ts","sourceRoot":"","sources":["../../../src/tools/AccuDrawViewportUI.ts"],"names":[],"mappings":"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"}
|
|
@@ -25,6 +25,8 @@ export class AccuDrawViewportUI extends AccuDraw {
|
|
|
25
25
|
fixedLocation: false,
|
|
26
26
|
/** Layout controls in a single row horizontally instead of in columns vertically as an option when using fixed location. */
|
|
27
27
|
horizontalArrangement: false,
|
|
28
|
+
/** When controls follow the cursor, the X and Y offsets applied to the current point to position the top left (values in inches based on screen DPI) */
|
|
29
|
+
cursorOffset: { x: .4, y: .1 },
|
|
28
30
|
/** Replace "^", ";", and ".." with "°" or ":" for easier input. */
|
|
29
31
|
simplifiedInput: true,
|
|
30
32
|
/** Enable simple math operations not supported by quantity parser. */
|
|
@@ -539,11 +541,12 @@ export class AccuDrawViewportUI extends AccuDraw {
|
|
|
539
541
|
return;
|
|
540
542
|
if (undefined !== this._controls && this._controls.overlay.parentElement !== vp.vpDiv)
|
|
541
543
|
this.removeControls(); // Could be enhanced to save/restore partial input of currently focused item...
|
|
544
|
+
const props = AccuDrawViewportUI.controlProps;
|
|
542
545
|
if (undefined === this._controls) {
|
|
543
546
|
const overlay = vp.addNewDiv("accudraw-overlay", true, 35);
|
|
544
547
|
const div = this.createControlDiv();
|
|
545
548
|
const is3dLayout = vp.view.is3d();
|
|
546
|
-
const isHorizontalLayout =
|
|
549
|
+
const isHorizontalLayout = props.horizontalArrangement;
|
|
547
550
|
overlay.appendChild(div);
|
|
548
551
|
const createFieldAndLock = (item) => {
|
|
549
552
|
const itemField = itemFields[item] = this.createItemField(item);
|
|
@@ -551,7 +554,7 @@ export class AccuDrawViewportUI extends AccuDraw {
|
|
|
551
554
|
itemField.style.left = isHorizontalLayout ? `${columnOffset}px` : "0";
|
|
552
555
|
div.appendChild(itemField);
|
|
553
556
|
if (is3dLayout || ItemField.Z_Item !== item)
|
|
554
|
-
rowOffset += itemField.offsetHeight *
|
|
557
|
+
rowOffset += itemField.offsetHeight * props.rowSpacingFactor;
|
|
555
558
|
itemWidth = itemField.offsetWidth;
|
|
556
559
|
itemHeight = itemField.offsetHeight;
|
|
557
560
|
const itemLock = itemLocks[item] = this.createItemFieldLock(item);
|
|
@@ -561,7 +564,7 @@ export class AccuDrawViewportUI extends AccuDraw {
|
|
|
561
564
|
div.appendChild(itemLock);
|
|
562
565
|
lockWidth = itemLock.offsetWidth;
|
|
563
566
|
if (is3dLayout || ItemField.Z_Item !== item)
|
|
564
|
-
columnOffset += (itemWidth + lockWidth) *
|
|
567
|
+
columnOffset += (itemWidth + lockWidth) * props.columnSpacingFactor;
|
|
565
568
|
};
|
|
566
569
|
let rowOffset = 0;
|
|
567
570
|
let columnOffset = 0;
|
|
@@ -578,7 +581,7 @@ export class AccuDrawViewportUI extends AccuDraw {
|
|
|
578
581
|
createFieldAndLock(ItemField.Y_Item);
|
|
579
582
|
createFieldAndLock(ItemField.Z_Item); // Both polar and rectangular modes support Z in 3d views...
|
|
580
583
|
div.style.width = isHorizontalLayout ? `${columnOffset}px` : `${itemWidth + lockWidth + 5}px`;
|
|
581
|
-
div.style.height = isHorizontalLayout ? `${itemHeight *
|
|
584
|
+
div.style.height = isHorizontalLayout ? `${itemHeight * props.rowSpacingFactor}px` : `${rowOffset}px`;
|
|
582
585
|
this._controls = { overlay, div, itemFields, itemLocks };
|
|
583
586
|
this.updateControlVisibility(CompassMode.Polar === this.compassMode, vp.view.is3d());
|
|
584
587
|
this.setFocusItem(this._focusItem);
|
|
@@ -587,13 +590,13 @@ export class AccuDrawViewportUI extends AccuDraw {
|
|
|
587
590
|
}
|
|
588
591
|
const viewRect = vp.viewRect;
|
|
589
592
|
const position = vp.worldToView(ev.point);
|
|
590
|
-
if (
|
|
593
|
+
if (props.fixedLocation) {
|
|
591
594
|
position.x = (viewRect.left + ((viewRect.width - this._controls.div.offsetWidth) * 0.5));
|
|
592
595
|
position.y = (viewRect.bottom - this._controls.div.offsetHeight);
|
|
593
596
|
}
|
|
594
597
|
else {
|
|
595
|
-
position.x += Math.floor(vp.pixelsFromInches(
|
|
596
|
-
position.y += Math.floor(vp.pixelsFromInches(
|
|
598
|
+
position.x += Math.floor(vp.pixelsFromInches(props.cursorOffset.x)) + 0.5;
|
|
599
|
+
position.y += Math.floor(vp.pixelsFromInches(props.cursorOffset.y)) + 0.5;
|
|
597
600
|
}
|
|
598
601
|
const controlRect = new ViewRect(position.x, position.y, position.x + this._controls.div.offsetWidth, position.y + this._controls.div.offsetHeight);
|
|
599
602
|
this.modifyControlRect(controlRect, vp);
|