@vertexvis/viewer 0.19.0-canary.3 → 0.19.0

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.
Files changed (32) hide show
  1. package/dist/cjs/{model-02ca23aa.js → model-b0f39263.js} +3 -2
  2. package/dist/cjs/model-b0f39263.js.map +1 -0
  3. package/dist/cjs/vertex-viewer-teleport-tool.cjs.entry.js +1 -1
  4. package/dist/cjs/vertex-viewer-walk-mode-tool.cjs.entry.js +1 -1
  5. package/dist/cjs/vertex-viewer-walk-mode-tool.cjs.entry.js.map +1 -1
  6. package/dist/collection/components/viewer-walk-mode-tool/viewer-walk-mode-tool.js +1 -1
  7. package/dist/collection/components/viewer-walk-mode-tool/viewer-walk-mode-tool.js.map +1 -1
  8. package/dist/collection/lib/keyBinding.js +2 -1
  9. package/dist/collection/lib/keyBinding.js.map +1 -1
  10. package/dist/components/vertex-viewer-walk-mode-tool.js.map +1 -1
  11. package/dist/components/viewer-teleport-tool.js +2 -1
  12. package/dist/components/viewer-teleport-tool.js.map +1 -1
  13. package/dist/esm/{model-278b9023.js → model-155eb2f5.js} +3 -2
  14. package/dist/esm/model-155eb2f5.js.map +1 -0
  15. package/dist/esm/vertex-viewer-teleport-tool.entry.js +1 -1
  16. package/dist/esm/vertex-viewer-walk-mode-tool.entry.js +1 -1
  17. package/dist/esm/vertex-viewer-walk-mode-tool.entry.js.map +1 -1
  18. package/dist/types/components/viewer-walk-mode-tool/viewer-walk-mode-tool.d.ts +4 -0
  19. package/dist/types/components.d.ts +2 -2
  20. package/dist/viewer/{p-0341e1de.entry.js → p-b21c2231.entry.js} +2 -2
  21. package/dist/viewer/{p-3d2d8431.entry.js → p-e735e66c.entry.js} +2 -2
  22. package/dist/viewer/{p-3d2d8431.entry.js.map → p-e735e66c.entry.js.map} +1 -1
  23. package/dist/viewer/p-f174e347.js +5 -0
  24. package/dist/viewer/p-f174e347.js.map +1 -0
  25. package/dist/viewer/viewer.esm.js +1 -1
  26. package/package.json +7 -7
  27. package/readme.md +4 -4
  28. package/dist/cjs/model-02ca23aa.js.map +0 -1
  29. package/dist/esm/model-278b9023.js.map +0 -1
  30. package/dist/viewer/p-4717fc39.js +0 -5
  31. package/dist/viewer/p-4717fc39.js.map +0 -1
  32. /package/dist/viewer/{p-0341e1de.entry.js.map → p-b21c2231.entry.js.map} +0 -0
@@ -1 +1 @@
1
- {"file":"viewer-teleport-tool.js","mappings":"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","names":["point","Point","boundingBox","Vector3","BoundingBox","Plane","Ray"],"sources":["./src/lib/teleportation/interactions.ts","./src/lib/keyBinding.ts","./src/lib/walk-mode/controller.ts","./src/lib/walk-mode/model.ts","./src/components/viewer-teleport-tool/viewer-teleport-tool.css?tag=vertex-viewer-teleport-tool&encapsulation=shadow","./src/components/viewer-teleport-tool/viewer-teleport-tool.tsx"],"sourcesContent":["import { BoundingBox, Plane, Point, Ray, Vector3 } from '@vertexvis/geometry';\nimport { Disposable } from '@vertexvis/utils';\n\nimport { getMouseClientPosition } from '../dom';\nimport { ElementRectObserver } from '../elementRectObserver';\nimport {\n CameraTransform,\n InteractionApi,\n InteractionHandler,\n} from '../interactions';\nimport { Camera, CameraRenderOptions } from '../scenes';\nimport { ViewerTeleportMode, WalkModeModel } from '../walk-mode/model';\n\nexport interface AnimationConfiguration {\n durationMs: number;\n}\n\nexport class TeleportInteractionHandler implements InteractionHandler {\n private api?: InteractionApi;\n private element?: HTMLElement;\n\n private rectObserver = new ElementRectObserver();\n\n private downPosition?: Point.Point;\n private downButtons?: number;\n\n private enabledChangeDisposable?: Disposable;\n private teleportModeChangeDisposable?: Disposable;\n private cursorDisposable?: Disposable;\n\n public constructor(\n private model: WalkModeModel,\n private animationConfiguration?: AnimationConfiguration\n ) {\n this.handlePointerDown = this.handlePointerDown.bind(this);\n this.handlePointerUp = this.handlePointerUp.bind(this);\n this.handleEnabledChange = this.handleEnabledChange.bind(this);\n this.handleTeleportModeChange = this.handleTeleportModeChange.bind(this);\n\n this.enabledChangeDisposable = this.model.onEnabledChange(\n this.handleEnabledChange\n );\n }\n\n public dispose(): void {\n this.disable();\n this.enabledChangeDisposable?.dispose();\n\n this.element = undefined;\n this.api = undefined;\n\n this.rectObserver.disconnect();\n }\n\n public initialize(element: HTMLElement, api: InteractionApi): void {\n this.element = element;\n this.api = api;\n\n this.rectObserver.observe(element);\n\n this.handleEnabledChange(this.model.getEnabled());\n }\n\n public setAnimations(config?: AnimationConfiguration): void {\n this.animationConfiguration = config;\n }\n\n public enable(): void {\n this.disable();\n\n this.teleportModeChangeDisposable = this.model.onTeleportModeChange(\n this.handleTeleportModeChange\n );\n this.element?.addEventListener('pointerdown', this.handlePointerDown);\n\n this.handleTeleportModeChange(this.model.getTeleportMode());\n }\n\n public disable(): void {\n this.teleportModeChangeDisposable?.dispose();\n this.cursorDisposable?.dispose();\n\n this.element?.removeEventListener('pointerdown', this.handlePointerDown);\n }\n\n private async handlePointerDown(event: PointerEvent): Promise<void> {\n this.downPosition = getMouseClientPosition(event, this.rectObserver.rect);\n this.downButtons = event.buttons;\n\n window.addEventListener('pointerup', this.handlePointerUp);\n }\n\n private async handlePointerUp(event: PointerEvent): Promise<void> {\n const mode = this.model.getTeleportMode();\n const threshold = this.api?.pixelThreshold() ?? 2;\n const point = getMouseClientPosition(event, this.rectObserver.rect);\n const isRightClick = this.downButtons === 2;\n const hasModifier =\n event.shiftKey || event.altKey || event.metaKey || event.ctrlKey;\n\n if (\n mode != null &&\n this.downPosition != null &&\n Point.distance(this.downPosition, point) <= threshold &&\n !isRightClick &&\n !hasModifier\n ) {\n switch (mode) {\n case 'teleport':\n return this.teleportToHit(point);\n case 'teleport-toward':\n return this.teleportTowardHit(point);\n case 'teleport-and-align':\n return this.teleportAndAlign(point);\n }\n }\n\n this.downPosition = undefined;\n\n window.removeEventListener('pointerup', this.handlePointerUp);\n }\n\n private async beginInteraction(): Promise<void> {\n if (!this.api?.isInteracting()) {\n await this.api?.beginInteraction();\n }\n }\n\n private async endInteraction(): Promise<void> {\n await this.api?.endInteraction();\n }\n\n private async teleportTowardHit(point: Point.Point): Promise<void> {\n const worldPoint = await this.api?.getWorldPointFromViewport(point);\n const mouseRay = this.api?.getRayFromPoint(point);\n\n if (mouseRay != null) {\n const { teleportDistancePercentage, teleportCollisionDistance } =\n this.model.getConfiguration();\n const teleportDistanceScalar = teleportDistancePercentage / 100;\n\n return this.performInteraction(({ camera, boundingBox }) => {\n const stepDistance =\n Math.max(...Vector3.toArray(BoundingBox.lengths(boundingBox))) *\n teleportDistanceScalar;\n\n const positionPlane = Plane.fromNormalAndCoplanarPoint(\n camera.up,\n camera.position\n );\n const projectedWorldPoint = Plane.projectPoint(\n positionPlane,\n worldPoint ?? camera.position\n );\n const distanceToWorldPoint = Vector3.distance(\n camera.position,\n projectedWorldPoint\n );\n\n if (\n distanceToWorldPoint < stepDistance &&\n distanceToWorldPoint > teleportCollisionDistance * 1.1\n ) {\n const mouseRayAtWorldPoint = Ray.create({\n ...mouseRay,\n origin: projectedWorldPoint,\n });\n const nextPosition = Plane.projectPoint(\n positionPlane,\n Ray.at(mouseRayAtWorldPoint, -teleportCollisionDistance)\n );\n\n return camera.update({\n position: nextPosition,\n lookAt: Vector3.add(\n camera.lookAt,\n Vector3.subtract(nextPosition, camera.position)\n ),\n });\n } else {\n const projectedNextStep = Plane.projectPoint(\n positionPlane,\n Ray.at(mouseRay, stepDistance)\n );\n\n return camera.update({\n position: projectedNextStep,\n lookAt: Vector3.add(\n camera.lookAt,\n Vector3.subtract(projectedNextStep, camera.position)\n ),\n });\n }\n });\n }\n }\n\n private async teleportToHit(point: Point.Point): Promise<void> {\n const worldPoint = await this.getWorldPointWithFallback(point);\n\n if (worldPoint != null) {\n return this.performInteraction(({ camera, boundingBox }) => {\n const shortestBoundingBoxLength = this.shortestLength(boundingBox);\n const heightScalar = this.model.getTeleportHeightPercentage() / 100;\n\n const cameraPlane = Plane.fromNormalAndCoplanarPoint(\n camera.up,\n camera.position\n );\n const projectedHitPosition = Plane.projectPoint(\n cameraPlane,\n worldPoint\n );\n\n const rayToHitPosition = Ray.create({\n origin: camera.position,\n direction: Vector3.normalize(\n Vector3.subtract(projectedHitPosition, camera.position)\n ),\n });\n const distanceToHitPosition = Vector3.distance(\n camera.position,\n projectedHitPosition\n );\n const distanceToLookAt = Vector3.distance(\n camera.position,\n camera.lookAt\n );\n\n const newPosition = Ray.at(\n rayToHitPosition,\n distanceToHitPosition - shortestBoundingBoxLength * heightScalar\n );\n const newPositionViewVectorRay = Ray.create({\n origin: newPosition,\n direction: Vector3.normalize(camera.viewVector),\n });\n\n return camera.update({\n position: newPosition,\n lookAt: Ray.at(newPositionViewVectorRay, distanceToLookAt),\n });\n });\n }\n }\n\n private async teleportAndAlign(point: Point.Point): Promise<void> {\n const hits = await this.api?.hitItems(point);\n const hit = hits != null ? hits[0] : undefined;\n\n if (hit?.hitNormal != null && hit?.hitPoint) {\n await this.performInteraction(({ camera, boundingBox }) => {\n const shortestBoundingBoxLength = this.shortestLength(boundingBox);\n const heightScalar = this.model.getTeleportHeightPercentage() / 100;\n\n const upRay = Ray.create({\n origin: hit.hitPoint as Vector3.Vector3,\n direction: hit.hitNormal as Vector3.Vector3,\n });\n\n return camera.alignTo(\n Ray.at(upRay, shortestBoundingBoxLength * heightScalar),\n hit.hitNormal as Vector3.Vector3\n );\n });\n }\n }\n\n private async performInteraction(fn: CameraTransform<Camera>): Promise<void> {\n await this.beginInteraction();\n await this.api?.transformCamera(fn, this.renderConfiguration());\n await this.endInteraction();\n }\n\n private async getWorldPointWithFallback(\n point: Point.Point\n ): Promise<Vector3.Vector3 | undefined> {\n const worldPoint = await this.api?.getWorldPointFromViewport(point);\n\n if (worldPoint == null) {\n const hits = await this.api?.hitItems(point);\n const hit = hits != null ? hits[0] : undefined;\n\n return hit?.hitPoint != null\n ? (hit.hitPoint as Vector3.Vector3)\n : worldPoint;\n }\n return worldPoint;\n }\n\n private handleEnabledChange(enabled: boolean): void {\n if (enabled) {\n this.enable();\n } else {\n this.disable();\n }\n }\n\n private handleTeleportModeChange(mode?: ViewerTeleportMode): void {\n this.cursorDisposable?.dispose();\n\n if (mode != null) {\n this.cursorDisposable = this.api?.addCursor('crosshair');\n }\n }\n\n private shortestLength(boundingBox: BoundingBox.BoundingBox): number {\n return Math.min(...Vector3.toArray(BoundingBox.lengths(boundingBox)));\n }\n\n private renderConfiguration(): CameraRenderOptions | undefined {\n return this.animationConfiguration != null\n ? { animation: { milliseconds: this.animationConfiguration.durationMs } }\n : undefined;\n }\n}\n","export class KeyBinding {\n private bindings: string[];\n\n public constructor(...bindings: string[]) {\n this.bindings = bindings.map((binding) => binding.toLowerCase());\n }\n\n public matches(keys: Record<string, boolean>): boolean {\n return this.bindings.every((binding) => this.bindingMatches(keys, binding));\n }\n\n private bindingMatches(\n keys: Record<string, boolean>,\n binding: string\n ): boolean {\n const negated = binding.includes('!');\n const key = binding.replace('!', '');\n\n return negated ? !keys[key] : keys[key];\n }\n}\n","import { Disposable } from '@vertexvis/utils';\n\nimport { KeyBinding } from '../keyBinding';\nimport {\n ViewerTeleportMode,\n ViewerWalkModeConfiguration,\n ViewerWalkModeOperation,\n WalkModeModel,\n} from './model';\n\nexport class WalkModeController {\n private excludeTagNames: Array<string> = [\n 'VERTEX-SCENE-TREE',\n 'VERTEX-SCENE-TREE-SEARCH',\n 'VERTEX-VIEWER-PIN-TOOL',\n 'INPUT',\n 'TEXTAREA',\n ];\n\n private excludePredicates: Array<(el: Element) => boolean> = [];\n\n public constructor(private model: WalkModeModel) {\n this.updateModelExclusions();\n }\n\n /**\n * @internal\n */\n public updateModel(model: WalkModeModel): void {\n this.model = model;\n }\n\n /**\n * Sets whether downstream walk mode interaction handlers are enabled.\n * Setting this value to `false` will remove all event listeners for\n * the interactions, and setting this value to `true` will add or\n * re-add the event listeners.\n */\n public setEnabled(enabled: boolean): void {\n this.model.setEnabled(enabled);\n }\n\n /**\n * Sets the `ViewerTeleportMode` to be used with a `<vertex-viewer-teleport-tool>`.\n */\n public setTeleportMode(mode?: ViewerTeleportMode): void {\n this.model.setTeleportMode(mode);\n }\n\n /**\n * Updates the configuration for downstream walk mode interaction handlers.\n *\n * `teleportHeightPercentage` - percentage used for fine-tuning the distance to offset\n * the camera from a surface when performing a `teleport-and-align`. This percentage is\n * used alongside the shortest side of the visible bounding box to determine how far to\n * place the camera from the surface that has been hit, with a larger percentage placing\n * the camera further from the surface and vice-versa. Defaults to 11.75%.\n *\n * `teleportDistancePercentage` - percentage used for fine-tuning the distance moved per\n * click with the `teleport-toward` mode. This percentage is used alongside the longest\n * side of the visible bounding box to determine how far to move the camera's position\n * with each click, with a larger percentage moving the camera further and vice-versa.\n * Defaults to 2%.\n *\n * `teleportCollisionDistance` - distance used alongside the `teleportCollisionPercentage`\n * to determine whether a click with the `teleport-toward` mode would cause a \"collision\",\n * or would pass through the point clicked. If such a collision would occur, the camera is\n * instead placed this distance back from the point clicked once, then allowed to pass\n * through the point on subsequent clicks. Note that this will not apply if clicks occur\n * in quick succession without setting the `depthBuffers` property on the `<vertex-viewer>`\n * to `all` frames. Defaults to `1000`.\n *\n * `keyboardWalkSpeed` - speed to move the camera when performing keyboard-based\n * walk interactions. A larger number here will result in a faster walk speed through\n * the model and vice-versa. Defaults to `5`.\n *\n * `keyboardPivotDegrees` - number of degrees to move the camera when performing\n * keyboard-based pivot interactions. Defaults to `1`.\n *\n * `keyboardRepeatIntervalMs` - number of milliseconds to repeat keyboard-based interactions.\n * this value is multiplicative with the `keyboardWalkSpeed` and `keyboardPivotDegrees`, and\n * lower numbers will result in faster movement and vice-versa. Defaults to `25`.\n *\n */\n public updateConfiguration(\n configuration: Partial<ViewerWalkModeConfiguration>\n ): void {\n const existing = this.model.getConfiguration();\n\n this.model.setConfiguration({\n ...existing,\n ...configuration,\n });\n }\n\n /**\n * Adds a custom keybinding for a specific walk operation. This will append to the\n * existing set of keybindings to allow for multiple keybindings for a specific\n * operation. To replace the defaults, see `replaceKeyBinding`.\n */\n public addKeyBinding(\n operation: ViewerWalkModeOperation,\n ...keys: string[]\n ): void {\n this.model.addKeyBinding(operation, new KeyBinding(...keys));\n }\n\n /**\n * Adds a custom keybinding for a specific walk operation. This will replace any\n * existing keybindings to allow for overriding the default behavior.\n *\n * @example\n * ```\n * const walkModeTool = document.querySelector('vertex-viewer-walk-mode-tool');\n *\n * // Remove keybinding for the `PIVOT_UP` operation\n * walkModeTool.controller.replaceKeyBinding('PIVOT_UP');\n *\n * // Replace keybinding for `WALK_FORWARD` with `ArrowUp` instead of `w`\n * walkModeTool.controller.replaceKeyBinding('WALK_FORWARD', 'ArrowUp');\n * ```\n */\n public replaceKeyBinding(\n operation: ViewerWalkModeOperation,\n ...keys: string[]\n ): void {\n this.model.replaceKeyBinding(operation, new KeyBinding(...keys));\n }\n\n /**\n * Adds an exclusion for specific elements when responding to keyboard\n * events. This is useful when there are other elements on screen that\n * require keyboard interaction and the walk mode handlers should not\n * respond to the keyboard events. Can be either a element's `tagName`\n * or a predicate. Returns a `Disposable` that can be used to remove the\n * exclusion.\n *\n * Default `tagName` exclusions:\n * 'VERTEX-SCENE-TREE'\n * 'VERTEX-SCENE-TREE-SEARCH'\n * 'VERTEX-VIEWER-PIN-TOOL'\n * 'INPUT'\n * 'TEXTAREA'\n */\n public excludeElement(predicate: (el: Element) => boolean): Disposable;\n public excludeElement(tagName: string): Disposable;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n public excludeElement(...args: any[]): Disposable {\n if (typeof args[0] === 'string') {\n this.excludeTagNames = [...this.excludeTagNames, args[0]];\n\n this.updateModelExclusions();\n\n return {\n dispose: () => {\n this.excludeTagNames = this.excludeTagNames.filter(\n (tn) => tn !== args[0]\n );\n },\n };\n } else {\n this.excludePredicates = [...this.excludePredicates, args[0]];\n\n this.updateModelExclusions();\n\n return {\n dispose: () => {\n this.excludePredicates = this.excludePredicates.filter(\n (tn) => tn !== args[0]\n );\n },\n };\n }\n }\n\n private updateModelExclusions(): void {\n this.model.setExcludedPredicate(\n (el) =>\n this.excludeTagNames.some((tn) => tn === el.tagName) ||\n this.excludePredicates.some((p) => p(el))\n );\n }\n}\n","import { Disposable, EventDispatcher, Listener } from '@vertexvis/utils';\n\nimport { KeyBinding } from '../keyBinding';\n\nexport interface ViewerWalkModeConfiguration {\n teleportHeightPercentage: number;\n teleportDistancePercentage: number;\n teleportCollisionDistance: number;\n keyboardWalkSpeed: number;\n keyboardPivotDegrees: number;\n keyboardRepeatIntervalMs: number;\n}\n\nexport type ViewerTeleportMode =\n | 'teleport'\n | 'teleport-and-align'\n | 'teleport-toward';\n\nexport enum ViewerWalkModeOperation {\n 'MOVE_DOWN' = 'MOVE_DOWN',\n 'MOVE_UP' = 'MOVE_UP',\n 'PIVOT_DOWN' = 'PIVOT_DOWN',\n 'PIVOT_LEFT' = 'PIVOT_LEFT',\n 'PIVOT_RIGHT' = 'PIVOT_RIGHT',\n 'PIVOT_UP' = 'PIVOT_UP',\n 'WALK_BACKWARD' = 'WALK_BACKWARD',\n 'WALK_FORWARD' = 'WALK_FORWARD',\n 'WALK_LEFT' = 'WALK_LEFT',\n 'WALK_RIGHT' = 'WALK_RIGHT',\n}\n\nexport type ViewerWalkModeKeyBindings = Record<\n ViewerWalkModeOperation,\n KeyBinding[]\n>;\n\nexport class WalkModeModel {\n private keyBindings: ViewerWalkModeKeyBindings = {\n [ViewerWalkModeOperation.MOVE_DOWN]: [\n new KeyBinding('PageDown', '!Shift', '!Alt'),\n ],\n [ViewerWalkModeOperation.MOVE_UP]: [\n new KeyBinding('PageUp', '!Shift', '!Alt'),\n ],\n [ViewerWalkModeOperation.PIVOT_DOWN]: [\n new KeyBinding('ArrowDown', '!Shift', '!Alt'),\n ],\n [ViewerWalkModeOperation.PIVOT_LEFT]: [\n new KeyBinding('ArrowLeft', '!Shift', '!Alt'),\n ],\n [ViewerWalkModeOperation.PIVOT_RIGHT]: [\n new KeyBinding('ArrowRight', '!Shift', '!Alt'),\n ],\n [ViewerWalkModeOperation.PIVOT_UP]: [\n new KeyBinding('ArrowUp', '!Shift', '!Alt'),\n ],\n [ViewerWalkModeOperation.WALK_BACKWARD]: [new KeyBinding('s')],\n [ViewerWalkModeOperation.WALK_FORWARD]: [new KeyBinding('w')],\n [ViewerWalkModeOperation.WALK_LEFT]: [new KeyBinding('a')],\n [ViewerWalkModeOperation.WALK_RIGHT]: [new KeyBinding('d')],\n };\n\n private configuration: ViewerWalkModeConfiguration = {\n teleportHeightPercentage: 11.75,\n teleportDistancePercentage: 2,\n teleportCollisionDistance: 1000,\n keyboardWalkSpeed: 5,\n keyboardPivotDegrees: 1,\n keyboardRepeatIntervalMs: 25,\n };\n\n private excludedPredicate?: (el: Element) => boolean;\n\n private enabled = true;\n private teleportMode?: ViewerTeleportMode;\n\n private enabledChanged: EventDispatcher<boolean> = new EventDispatcher();\n\n private teleportModeChanged: EventDispatcher<ViewerTeleportMode | undefined> =\n new EventDispatcher<ViewerTeleportMode | undefined>();\n\n private configurationChanged: EventDispatcher<ViewerWalkModeConfiguration> =\n new EventDispatcher<ViewerWalkModeConfiguration>();\n\n private keyBindingsChanged: EventDispatcher<ViewerWalkModeKeyBindings> =\n new EventDispatcher<ViewerWalkModeKeyBindings>();\n\n public setEnabled(enabled: boolean): void {\n this.enabled = enabled;\n this.enabledChanged.emit(enabled);\n }\n\n public setTeleportMode(mode?: ViewerTeleportMode): void {\n this.teleportMode = mode;\n this.teleportModeChanged.emit(mode);\n }\n\n public setConfiguration(configuration: ViewerWalkModeConfiguration): void {\n this.configuration = configuration;\n this.configurationChanged.emit(configuration);\n }\n\n public addKeyBinding(\n operation: ViewerWalkModeOperation,\n keyBinding: KeyBinding\n ): void {\n this.keyBindings[operation] = [...this.keyBindings[operation], keyBinding];\n this.keyBindingsChanged.emit(this.keyBindings);\n }\n\n public replaceKeyBinding(\n operation: ViewerWalkModeOperation,\n keyBinding: KeyBinding\n ): void {\n this.keyBindings[operation] = [keyBinding];\n this.keyBindingsChanged.emit(this.keyBindings);\n }\n\n public setExcludedPredicate(predicate: (el: Element) => boolean): void {\n this.excludedPredicate = predicate;\n }\n\n public getEnabled(): boolean {\n return this.enabled;\n }\n\n public getTeleportMode(): ViewerTeleportMode | undefined {\n return this.teleportMode;\n }\n\n public getTeleportHeightPercentage(): number {\n return this.configuration.teleportHeightPercentage;\n }\n\n public getKeyboardWalkSpeed(): number {\n return this.configuration.keyboardWalkSpeed;\n }\n\n public getKeyboardPivotDegrees(): number {\n return this.configuration.keyboardPivotDegrees;\n }\n\n public getKeyboardRepeatInterval(): number {\n return this.configuration.keyboardRepeatIntervalMs;\n }\n\n public getConfiguration(): ViewerWalkModeConfiguration {\n return this.configuration;\n }\n\n public getKeyBindings(): ViewerWalkModeKeyBindings {\n return this.keyBindings;\n }\n\n public operationMatches(\n operation: ViewerWalkModeOperation,\n state: Record<string, boolean>\n ): boolean {\n return this.keyBindings[operation].some((binding) =>\n binding.matches(state)\n );\n }\n\n public isElementExcluded(el: Element): boolean {\n return !!this.excludedPredicate?.(el);\n }\n\n public onEnabledChange(listener: Listener<boolean>): Disposable {\n return this.enabledChanged.on(listener);\n }\n\n public onTeleportModeChange(\n listener: Listener<ViewerTeleportMode | undefined>\n ): Disposable {\n return this.teleportModeChanged.on(listener);\n }\n\n public onConfigurationChange(\n listener: Listener<ViewerWalkModeConfiguration>\n ): Disposable {\n return this.configurationChanged.on(listener);\n }\n\n public onKeyBindingsChange(\n listener: Listener<ViewerWalkModeKeyBindings>\n ): Disposable {\n return this.keyBindingsChanged.on(listener);\n }\n}\n",":host {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n pointer-events: none;\n}\n","import {\n Component,\n Event,\n EventEmitter,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n h,\n Host,\n Prop,\n Watch,\n} from '@stencil/core';\nimport { Disposable } from '@vertexvis/utils';\n\nimport { TeleportInteractionHandler } from '../../lib/teleportation/interactions';\nimport { WalkModeController } from '../../lib/walk-mode/controller';\nimport { ViewerTeleportMode, WalkModeModel } from '../../lib/walk-mode/model';\n\ninterface StateMap {\n shouldClearDepthBuffers?: boolean;\n}\n\n/**\n * The `<vertex-viewer-teleport-tool>` allows for click-based \"teleportation\"\n * around a model, which is particularly useful for walking through a model.\n * This tool is automatically included as part of the <vertex-viewer-walk-mode-tool>.\n */\n@Component({\n tag: 'vertex-viewer-teleport-tool',\n styleUrl: 'viewer-teleport-tool.css',\n shadow: true,\n})\nexport class ViewerTeleportTool {\n /**\n * The viewer that this component is bound to. This is automatically assigned\n * if added to the light-dom of a parent viewer element.\n */\n @Prop()\n public viewer?: HTMLVertexViewerElement;\n\n /**\n * The type of teleportation to perform when clicking.\n *\n * `teleport` - the camera's `position` is moved to the location of the hit result\n * constrained by the plane represented by the camera's current `position` and `up`\n * vectors.\n *\n * `teleport-and-align` - the camera's `position`, `lookAt`, and `up` vectors are updated\n * to align to the plane represented by the hit result's position and normal.\n *\n * `teleport-toward` - the camera's `position` is moved a fixed distance toward the location of the\n * hit result constrained by the plane represented by the camera's current `position` and `up`\n * vectors.\n *\n * `undefined` - no teleportation will occur when clicking.\n *\n * Defaults to `undefined`.\n */\n @Prop({ mutable: true })\n public mode?: ViewerTeleportMode;\n\n /**\n * Indicates whether animations will be used when performing camera\n * operations. Defaults to `false`.\n */\n @Prop()\n public animationsDisabled = false;\n\n /**\n * The duration of animations, in milliseconds. Defaults to `500`.\n */\n @Prop()\n public animationMs?: number = 500;\n\n @Prop({ mutable: true })\n public controller?: WalkModeController;\n\n @Prop({ mutable: true })\n public model: WalkModeModel = new WalkModeModel();\n\n /**\n * Event emitted when the `WalkModeController` associated with this tool changes.\n */\n @Event()\n public controllerChanged!: EventEmitter<WalkModeController>;\n\n private interactionHandlerDisposable?: Disposable;\n private interactionHandler?: TeleportInteractionHandler;\n\n private stateMap: StateMap = {};\n\n /**\n * @ignore\n */\n protected componentWillLoad(): void {\n this.setupController();\n this.setupInteractionHandler();\n this.setDepthBuffers();\n }\n\n /**\n * @ignore\n */\n protected connectedCallback(): void {\n this.setupInteractionHandler();\n this.setDepthBuffers();\n }\n\n /**\n * @ignore\n */\n protected disconnectedCallback(): void {\n this.clearInteractionHandler();\n this.resetDepthBuffers();\n }\n\n /**\n * @ignore\n */\n @Watch('mode')\n protected handleModeChange(): void {\n this.controller?.setTeleportMode(this.mode);\n\n if (this.mode != null) {\n this.setDepthBuffers();\n } else {\n this.resetDepthBuffers();\n }\n }\n\n /**\n * @ignore\n */\n @Watch('viewer')\n protected handleViewerChanged(): void {\n this.clearInteractionHandler();\n this.setupInteractionHandler();\n this.setDepthBuffers();\n }\n\n /**\n * @ignore\n */\n @Watch('animationMs')\n protected handleAnimationMsChanged(): void {\n if (this.animationMs != null) {\n this.interactionHandler?.setAnimations({ durationMs: this.animationMs });\n }\n }\n\n /**\n * @ignore\n */\n @Watch('animationsDisabled')\n protected handleAnimationsDisabledChanged(): void {\n if (this.animationsDisabled) {\n this.interactionHandler?.setAnimations(undefined);\n } else if (this.animationMs != null) {\n this.interactionHandler?.setAnimations({ durationMs: this.animationMs });\n }\n }\n\n /**\n * @ignore\n */\n @Watch('controller')\n protected handleControllerChanged(): void {\n this.setupInteractionHandler();\n this.setupController();\n this.controllerChanged.emit(this.controller);\n }\n\n @Watch('model')\n protected handleModelChanged(): void {\n this.setupController();\n this.clearInteractionHandler();\n this.setupInteractionHandler();\n }\n\n protected render(): JSX.Element {\n return <Host></Host>;\n }\n\n private setupController(): void {\n if (this.controller == null) {\n this.controller = new WalkModeController(this.model);\n this.controller.setTeleportMode(this.mode);\n this.controllerChanged.emit(this.controller);\n } else {\n this.controller.setTeleportMode(this.mode);\n this.controller.updateModel(this.model);\n }\n }\n\n private setDepthBuffers(): void {\n if (\n this.mode != null &&\n this.viewer != null &&\n this.viewer.depthBuffers == null\n ) {\n this.stateMap.shouldClearDepthBuffers = true;\n this.viewer.depthBuffers = 'final';\n }\n }\n\n private resetDepthBuffers(): void {\n if (this.stateMap.shouldClearDepthBuffers && this.viewer != null) {\n this.viewer.depthBuffers = undefined;\n this.stateMap.shouldClearDepthBuffers = undefined;\n }\n }\n\n private clearInteractionHandler(): void {\n this.interactionHandlerDisposable?.dispose();\n this.interactionHandlerDisposable = undefined;\n this.interactionHandler?.dispose();\n this.interactionHandler = undefined;\n }\n\n private async setupInteractionHandler(): Promise<void> {\n if (this.interactionHandler == null) {\n this.interactionHandler = new TeleportInteractionHandler(\n this.model,\n !this.animationsDisabled && this.animationMs != null\n ? { durationMs: this.animationMs }\n : undefined\n );\n\n this.interactionHandlerDisposable =\n await this.viewer?.registerInteractionHandler(this.interactionHandler);\n }\n }\n}\n"],"version":3}
1
+ {"file":"viewer-teleport-tool.js","mappings":"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","names":["point","Point","boundingBox","Vector3","BoundingBox","Plane","Ray"],"sources":["./src/lib/teleportation/interactions.ts","./src/lib/keyBinding.ts","./src/lib/walk-mode/controller.ts","./src/lib/walk-mode/model.ts","./src/components/viewer-teleport-tool/viewer-teleport-tool.css?tag=vertex-viewer-teleport-tool&encapsulation=shadow","./src/components/viewer-teleport-tool/viewer-teleport-tool.tsx"],"sourcesContent":["import { BoundingBox, Plane, Point, Ray, Vector3 } from '@vertexvis/geometry';\nimport { Disposable } from '@vertexvis/utils';\n\nimport { getMouseClientPosition } from '../dom';\nimport { ElementRectObserver } from '../elementRectObserver';\nimport {\n CameraTransform,\n InteractionApi,\n InteractionHandler,\n} from '../interactions';\nimport { Camera, CameraRenderOptions } from '../scenes';\nimport { ViewerTeleportMode, WalkModeModel } from '../walk-mode/model';\n\nexport interface AnimationConfiguration {\n durationMs: number;\n}\n\nexport class TeleportInteractionHandler implements InteractionHandler {\n private api?: InteractionApi;\n private element?: HTMLElement;\n\n private rectObserver = new ElementRectObserver();\n\n private downPosition?: Point.Point;\n private downButtons?: number;\n\n private enabledChangeDisposable?: Disposable;\n private teleportModeChangeDisposable?: Disposable;\n private cursorDisposable?: Disposable;\n\n public constructor(\n private model: WalkModeModel,\n private animationConfiguration?: AnimationConfiguration\n ) {\n this.handlePointerDown = this.handlePointerDown.bind(this);\n this.handlePointerUp = this.handlePointerUp.bind(this);\n this.handleEnabledChange = this.handleEnabledChange.bind(this);\n this.handleTeleportModeChange = this.handleTeleportModeChange.bind(this);\n\n this.enabledChangeDisposable = this.model.onEnabledChange(\n this.handleEnabledChange\n );\n }\n\n public dispose(): void {\n this.disable();\n this.enabledChangeDisposable?.dispose();\n\n this.element = undefined;\n this.api = undefined;\n\n this.rectObserver.disconnect();\n }\n\n public initialize(element: HTMLElement, api: InteractionApi): void {\n this.element = element;\n this.api = api;\n\n this.rectObserver.observe(element);\n\n this.handleEnabledChange(this.model.getEnabled());\n }\n\n public setAnimations(config?: AnimationConfiguration): void {\n this.animationConfiguration = config;\n }\n\n public enable(): void {\n this.disable();\n\n this.teleportModeChangeDisposable = this.model.onTeleportModeChange(\n this.handleTeleportModeChange\n );\n this.element?.addEventListener('pointerdown', this.handlePointerDown);\n\n this.handleTeleportModeChange(this.model.getTeleportMode());\n }\n\n public disable(): void {\n this.teleportModeChangeDisposable?.dispose();\n this.cursorDisposable?.dispose();\n\n this.element?.removeEventListener('pointerdown', this.handlePointerDown);\n }\n\n private async handlePointerDown(event: PointerEvent): Promise<void> {\n this.downPosition = getMouseClientPosition(event, this.rectObserver.rect);\n this.downButtons = event.buttons;\n\n window.addEventListener('pointerup', this.handlePointerUp);\n }\n\n private async handlePointerUp(event: PointerEvent): Promise<void> {\n const mode = this.model.getTeleportMode();\n const threshold = this.api?.pixelThreshold() ?? 2;\n const point = getMouseClientPosition(event, this.rectObserver.rect);\n const isRightClick = this.downButtons === 2;\n const hasModifier =\n event.shiftKey || event.altKey || event.metaKey || event.ctrlKey;\n\n if (\n mode != null &&\n this.downPosition != null &&\n Point.distance(this.downPosition, point) <= threshold &&\n !isRightClick &&\n !hasModifier\n ) {\n switch (mode) {\n case 'teleport':\n return this.teleportToHit(point);\n case 'teleport-toward':\n return this.teleportTowardHit(point);\n case 'teleport-and-align':\n return this.teleportAndAlign(point);\n }\n }\n\n this.downPosition = undefined;\n\n window.removeEventListener('pointerup', this.handlePointerUp);\n }\n\n private async beginInteraction(): Promise<void> {\n if (!this.api?.isInteracting()) {\n await this.api?.beginInteraction();\n }\n }\n\n private async endInteraction(): Promise<void> {\n await this.api?.endInteraction();\n }\n\n private async teleportTowardHit(point: Point.Point): Promise<void> {\n const worldPoint = await this.api?.getWorldPointFromViewport(point);\n const mouseRay = this.api?.getRayFromPoint(point);\n\n if (mouseRay != null) {\n const { teleportDistancePercentage, teleportCollisionDistance } =\n this.model.getConfiguration();\n const teleportDistanceScalar = teleportDistancePercentage / 100;\n\n return this.performInteraction(({ camera, boundingBox }) => {\n const stepDistance =\n Math.max(...Vector3.toArray(BoundingBox.lengths(boundingBox))) *\n teleportDistanceScalar;\n\n const positionPlane = Plane.fromNormalAndCoplanarPoint(\n camera.up,\n camera.position\n );\n const projectedWorldPoint = Plane.projectPoint(\n positionPlane,\n worldPoint ?? camera.position\n );\n const distanceToWorldPoint = Vector3.distance(\n camera.position,\n projectedWorldPoint\n );\n\n if (\n distanceToWorldPoint < stepDistance &&\n distanceToWorldPoint > teleportCollisionDistance * 1.1\n ) {\n const mouseRayAtWorldPoint = Ray.create({\n ...mouseRay,\n origin: projectedWorldPoint,\n });\n const nextPosition = Plane.projectPoint(\n positionPlane,\n Ray.at(mouseRayAtWorldPoint, -teleportCollisionDistance)\n );\n\n return camera.update({\n position: nextPosition,\n lookAt: Vector3.add(\n camera.lookAt,\n Vector3.subtract(nextPosition, camera.position)\n ),\n });\n } else {\n const projectedNextStep = Plane.projectPoint(\n positionPlane,\n Ray.at(mouseRay, stepDistance)\n );\n\n return camera.update({\n position: projectedNextStep,\n lookAt: Vector3.add(\n camera.lookAt,\n Vector3.subtract(projectedNextStep, camera.position)\n ),\n });\n }\n });\n }\n }\n\n private async teleportToHit(point: Point.Point): Promise<void> {\n const worldPoint = await this.getWorldPointWithFallback(point);\n\n if (worldPoint != null) {\n return this.performInteraction(({ camera, boundingBox }) => {\n const shortestBoundingBoxLength = this.shortestLength(boundingBox);\n const heightScalar = this.model.getTeleportHeightPercentage() / 100;\n\n const cameraPlane = Plane.fromNormalAndCoplanarPoint(\n camera.up,\n camera.position\n );\n const projectedHitPosition = Plane.projectPoint(\n cameraPlane,\n worldPoint\n );\n\n const rayToHitPosition = Ray.create({\n origin: camera.position,\n direction: Vector3.normalize(\n Vector3.subtract(projectedHitPosition, camera.position)\n ),\n });\n const distanceToHitPosition = Vector3.distance(\n camera.position,\n projectedHitPosition\n );\n const distanceToLookAt = Vector3.distance(\n camera.position,\n camera.lookAt\n );\n\n const newPosition = Ray.at(\n rayToHitPosition,\n distanceToHitPosition - shortestBoundingBoxLength * heightScalar\n );\n const newPositionViewVectorRay = Ray.create({\n origin: newPosition,\n direction: Vector3.normalize(camera.viewVector),\n });\n\n return camera.update({\n position: newPosition,\n lookAt: Ray.at(newPositionViewVectorRay, distanceToLookAt),\n });\n });\n }\n }\n\n private async teleportAndAlign(point: Point.Point): Promise<void> {\n const hits = await this.api?.hitItems(point);\n const hit = hits != null ? hits[0] : undefined;\n\n if (hit?.hitNormal != null && hit?.hitPoint) {\n await this.performInteraction(({ camera, boundingBox }) => {\n const shortestBoundingBoxLength = this.shortestLength(boundingBox);\n const heightScalar = this.model.getTeleportHeightPercentage() / 100;\n\n const upRay = Ray.create({\n origin: hit.hitPoint as Vector3.Vector3,\n direction: hit.hitNormal as Vector3.Vector3,\n });\n\n return camera.alignTo(\n Ray.at(upRay, shortestBoundingBoxLength * heightScalar),\n hit.hitNormal as Vector3.Vector3\n );\n });\n }\n }\n\n private async performInteraction(fn: CameraTransform<Camera>): Promise<void> {\n await this.beginInteraction();\n await this.api?.transformCamera(fn, this.renderConfiguration());\n await this.endInteraction();\n }\n\n private async getWorldPointWithFallback(\n point: Point.Point\n ): Promise<Vector3.Vector3 | undefined> {\n const worldPoint = await this.api?.getWorldPointFromViewport(point);\n\n if (worldPoint == null) {\n const hits = await this.api?.hitItems(point);\n const hit = hits != null ? hits[0] : undefined;\n\n return hit?.hitPoint != null\n ? (hit.hitPoint as Vector3.Vector3)\n : worldPoint;\n }\n return worldPoint;\n }\n\n private handleEnabledChange(enabled: boolean): void {\n if (enabled) {\n this.enable();\n } else {\n this.disable();\n }\n }\n\n private handleTeleportModeChange(mode?: ViewerTeleportMode): void {\n this.cursorDisposable?.dispose();\n\n if (mode != null) {\n this.cursorDisposable = this.api?.addCursor('crosshair');\n }\n }\n\n private shortestLength(boundingBox: BoundingBox.BoundingBox): number {\n return Math.min(...Vector3.toArray(BoundingBox.lengths(boundingBox)));\n }\n\n private renderConfiguration(): CameraRenderOptions | undefined {\n return this.animationConfiguration != null\n ? { animation: { milliseconds: this.animationConfiguration.durationMs } }\n : undefined;\n }\n}\n","export class KeyBinding {\n private bindings: string[];\n\n public constructor(...bindings: string[]) {\n this.bindings = bindings.map((binding) => binding.toLowerCase());\n }\n\n public matches(keys: Record<string, boolean>): boolean {\n return (\n this.bindings.length > 0 &&\n this.bindings.every((binding) => this.bindingMatches(keys, binding))\n );\n }\n\n private bindingMatches(\n keys: Record<string, boolean>,\n binding: string\n ): boolean {\n const negated = binding.includes('!');\n const key = binding.replace('!', '');\n\n return negated ? !keys[key] : keys[key];\n }\n}\n","import { Disposable } from '@vertexvis/utils';\n\nimport { KeyBinding } from '../keyBinding';\nimport {\n ViewerTeleportMode,\n ViewerWalkModeConfiguration,\n ViewerWalkModeOperation,\n WalkModeModel,\n} from './model';\n\nexport class WalkModeController {\n private excludeTagNames: Array<string> = [\n 'VERTEX-SCENE-TREE',\n 'VERTEX-SCENE-TREE-SEARCH',\n 'VERTEX-VIEWER-PIN-TOOL',\n 'INPUT',\n 'TEXTAREA',\n ];\n\n private excludePredicates: Array<(el: Element) => boolean> = [];\n\n public constructor(private model: WalkModeModel) {\n this.updateModelExclusions();\n }\n\n /**\n * @internal\n */\n public updateModel(model: WalkModeModel): void {\n this.model = model;\n }\n\n /**\n * Sets whether downstream walk mode interaction handlers are enabled.\n * Setting this value to `false` will remove all event listeners for\n * the interactions, and setting this value to `true` will add or\n * re-add the event listeners.\n */\n public setEnabled(enabled: boolean): void {\n this.model.setEnabled(enabled);\n }\n\n /**\n * Sets the `ViewerTeleportMode` to be used with a `<vertex-viewer-teleport-tool>`.\n */\n public setTeleportMode(mode?: ViewerTeleportMode): void {\n this.model.setTeleportMode(mode);\n }\n\n /**\n * Updates the configuration for downstream walk mode interaction handlers.\n *\n * `teleportHeightPercentage` - percentage used for fine-tuning the distance to offset\n * the camera from a surface when performing a `teleport-and-align`. This percentage is\n * used alongside the shortest side of the visible bounding box to determine how far to\n * place the camera from the surface that has been hit, with a larger percentage placing\n * the camera further from the surface and vice-versa. Defaults to 11.75%.\n *\n * `teleportDistancePercentage` - percentage used for fine-tuning the distance moved per\n * click with the `teleport-toward` mode. This percentage is used alongside the longest\n * side of the visible bounding box to determine how far to move the camera's position\n * with each click, with a larger percentage moving the camera further and vice-versa.\n * Defaults to 2%.\n *\n * `teleportCollisionDistance` - distance used alongside the `teleportCollisionPercentage`\n * to determine whether a click with the `teleport-toward` mode would cause a \"collision\",\n * or would pass through the point clicked. If such a collision would occur, the camera is\n * instead placed this distance back from the point clicked once, then allowed to pass\n * through the point on subsequent clicks. Note that this will not apply if clicks occur\n * in quick succession without setting the `depthBuffers` property on the `<vertex-viewer>`\n * to `all` frames. Defaults to `1000`.\n *\n * `keyboardWalkSpeed` - speed to move the camera when performing keyboard-based\n * walk interactions. A larger number here will result in a faster walk speed through\n * the model and vice-versa. Defaults to `5`.\n *\n * `keyboardPivotDegrees` - number of degrees to move the camera when performing\n * keyboard-based pivot interactions. Defaults to `1`.\n *\n * `keyboardRepeatIntervalMs` - number of milliseconds to repeat keyboard-based interactions.\n * this value is multiplicative with the `keyboardWalkSpeed` and `keyboardPivotDegrees`, and\n * lower numbers will result in faster movement and vice-versa. Defaults to `25`.\n *\n */\n public updateConfiguration(\n configuration: Partial<ViewerWalkModeConfiguration>\n ): void {\n const existing = this.model.getConfiguration();\n\n this.model.setConfiguration({\n ...existing,\n ...configuration,\n });\n }\n\n /**\n * Adds a custom keybinding for a specific walk operation. This will append to the\n * existing set of keybindings to allow for multiple keybindings for a specific\n * operation. To replace the defaults, see `replaceKeyBinding`.\n */\n public addKeyBinding(\n operation: ViewerWalkModeOperation,\n ...keys: string[]\n ): void {\n this.model.addKeyBinding(operation, new KeyBinding(...keys));\n }\n\n /**\n * Adds a custom keybinding for a specific walk operation. This will replace any\n * existing keybindings to allow for overriding the default behavior.\n *\n * @example\n * ```\n * const walkModeTool = document.querySelector('vertex-viewer-walk-mode-tool');\n *\n * // Remove keybinding for the `PIVOT_UP` operation\n * walkModeTool.controller.replaceKeyBinding('PIVOT_UP');\n *\n * // Replace keybinding for `WALK_FORWARD` with `ArrowUp` instead of `w`\n * walkModeTool.controller.replaceKeyBinding('WALK_FORWARD', 'ArrowUp');\n * ```\n */\n public replaceKeyBinding(\n operation: ViewerWalkModeOperation,\n ...keys: string[]\n ): void {\n this.model.replaceKeyBinding(operation, new KeyBinding(...keys));\n }\n\n /**\n * Adds an exclusion for specific elements when responding to keyboard\n * events. This is useful when there are other elements on screen that\n * require keyboard interaction and the walk mode handlers should not\n * respond to the keyboard events. Can be either a element's `tagName`\n * or a predicate. Returns a `Disposable` that can be used to remove the\n * exclusion.\n *\n * Default `tagName` exclusions:\n * 'VERTEX-SCENE-TREE'\n * 'VERTEX-SCENE-TREE-SEARCH'\n * 'VERTEX-VIEWER-PIN-TOOL'\n * 'INPUT'\n * 'TEXTAREA'\n */\n public excludeElement(predicate: (el: Element) => boolean): Disposable;\n public excludeElement(tagName: string): Disposable;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n public excludeElement(...args: any[]): Disposable {\n if (typeof args[0] === 'string') {\n this.excludeTagNames = [...this.excludeTagNames, args[0]];\n\n this.updateModelExclusions();\n\n return {\n dispose: () => {\n this.excludeTagNames = this.excludeTagNames.filter(\n (tn) => tn !== args[0]\n );\n },\n };\n } else {\n this.excludePredicates = [...this.excludePredicates, args[0]];\n\n this.updateModelExclusions();\n\n return {\n dispose: () => {\n this.excludePredicates = this.excludePredicates.filter(\n (tn) => tn !== args[0]\n );\n },\n };\n }\n }\n\n private updateModelExclusions(): void {\n this.model.setExcludedPredicate(\n (el) =>\n this.excludeTagNames.some((tn) => tn === el.tagName) ||\n this.excludePredicates.some((p) => p(el))\n );\n }\n}\n","import { Disposable, EventDispatcher, Listener } from '@vertexvis/utils';\n\nimport { KeyBinding } from '../keyBinding';\n\nexport interface ViewerWalkModeConfiguration {\n teleportHeightPercentage: number;\n teleportDistancePercentage: number;\n teleportCollisionDistance: number;\n keyboardWalkSpeed: number;\n keyboardPivotDegrees: number;\n keyboardRepeatIntervalMs: number;\n}\n\nexport type ViewerTeleportMode =\n | 'teleport'\n | 'teleport-and-align'\n | 'teleport-toward';\n\nexport enum ViewerWalkModeOperation {\n 'MOVE_DOWN' = 'MOVE_DOWN',\n 'MOVE_UP' = 'MOVE_UP',\n 'PIVOT_DOWN' = 'PIVOT_DOWN',\n 'PIVOT_LEFT' = 'PIVOT_LEFT',\n 'PIVOT_RIGHT' = 'PIVOT_RIGHT',\n 'PIVOT_UP' = 'PIVOT_UP',\n 'WALK_BACKWARD' = 'WALK_BACKWARD',\n 'WALK_FORWARD' = 'WALK_FORWARD',\n 'WALK_LEFT' = 'WALK_LEFT',\n 'WALK_RIGHT' = 'WALK_RIGHT',\n}\n\nexport type ViewerWalkModeKeyBindings = Record<\n ViewerWalkModeOperation,\n KeyBinding[]\n>;\n\nexport class WalkModeModel {\n private keyBindings: ViewerWalkModeKeyBindings = {\n [ViewerWalkModeOperation.MOVE_DOWN]: [\n new KeyBinding('PageDown', '!Shift', '!Alt'),\n ],\n [ViewerWalkModeOperation.MOVE_UP]: [\n new KeyBinding('PageUp', '!Shift', '!Alt'),\n ],\n [ViewerWalkModeOperation.PIVOT_DOWN]: [\n new KeyBinding('ArrowDown', '!Shift', '!Alt'),\n ],\n [ViewerWalkModeOperation.PIVOT_LEFT]: [\n new KeyBinding('ArrowLeft', '!Shift', '!Alt'),\n ],\n [ViewerWalkModeOperation.PIVOT_RIGHT]: [\n new KeyBinding('ArrowRight', '!Shift', '!Alt'),\n ],\n [ViewerWalkModeOperation.PIVOT_UP]: [\n new KeyBinding('ArrowUp', '!Shift', '!Alt'),\n ],\n [ViewerWalkModeOperation.WALK_BACKWARD]: [new KeyBinding('s')],\n [ViewerWalkModeOperation.WALK_FORWARD]: [new KeyBinding('w')],\n [ViewerWalkModeOperation.WALK_LEFT]: [new KeyBinding('a')],\n [ViewerWalkModeOperation.WALK_RIGHT]: [new KeyBinding('d')],\n };\n\n private configuration: ViewerWalkModeConfiguration = {\n teleportHeightPercentage: 11.75,\n teleportDistancePercentage: 2,\n teleportCollisionDistance: 1000,\n keyboardWalkSpeed: 5,\n keyboardPivotDegrees: 1,\n keyboardRepeatIntervalMs: 25,\n };\n\n private excludedPredicate?: (el: Element) => boolean;\n\n private enabled = true;\n private teleportMode?: ViewerTeleportMode;\n\n private enabledChanged: EventDispatcher<boolean> = new EventDispatcher();\n\n private teleportModeChanged: EventDispatcher<ViewerTeleportMode | undefined> =\n new EventDispatcher<ViewerTeleportMode | undefined>();\n\n private configurationChanged: EventDispatcher<ViewerWalkModeConfiguration> =\n new EventDispatcher<ViewerWalkModeConfiguration>();\n\n private keyBindingsChanged: EventDispatcher<ViewerWalkModeKeyBindings> =\n new EventDispatcher<ViewerWalkModeKeyBindings>();\n\n public setEnabled(enabled: boolean): void {\n this.enabled = enabled;\n this.enabledChanged.emit(enabled);\n }\n\n public setTeleportMode(mode?: ViewerTeleportMode): void {\n this.teleportMode = mode;\n this.teleportModeChanged.emit(mode);\n }\n\n public setConfiguration(configuration: ViewerWalkModeConfiguration): void {\n this.configuration = configuration;\n this.configurationChanged.emit(configuration);\n }\n\n public addKeyBinding(\n operation: ViewerWalkModeOperation,\n keyBinding: KeyBinding\n ): void {\n this.keyBindings[operation] = [...this.keyBindings[operation], keyBinding];\n this.keyBindingsChanged.emit(this.keyBindings);\n }\n\n public replaceKeyBinding(\n operation: ViewerWalkModeOperation,\n keyBinding: KeyBinding\n ): void {\n this.keyBindings[operation] = [keyBinding];\n this.keyBindingsChanged.emit(this.keyBindings);\n }\n\n public setExcludedPredicate(predicate: (el: Element) => boolean): void {\n this.excludedPredicate = predicate;\n }\n\n public getEnabled(): boolean {\n return this.enabled;\n }\n\n public getTeleportMode(): ViewerTeleportMode | undefined {\n return this.teleportMode;\n }\n\n public getTeleportHeightPercentage(): number {\n return this.configuration.teleportHeightPercentage;\n }\n\n public getKeyboardWalkSpeed(): number {\n return this.configuration.keyboardWalkSpeed;\n }\n\n public getKeyboardPivotDegrees(): number {\n return this.configuration.keyboardPivotDegrees;\n }\n\n public getKeyboardRepeatInterval(): number {\n return this.configuration.keyboardRepeatIntervalMs;\n }\n\n public getConfiguration(): ViewerWalkModeConfiguration {\n return this.configuration;\n }\n\n public getKeyBindings(): ViewerWalkModeKeyBindings {\n return this.keyBindings;\n }\n\n public operationMatches(\n operation: ViewerWalkModeOperation,\n state: Record<string, boolean>\n ): boolean {\n return this.keyBindings[operation].some((binding) =>\n binding.matches(state)\n );\n }\n\n public isElementExcluded(el: Element): boolean {\n return !!this.excludedPredicate?.(el);\n }\n\n public onEnabledChange(listener: Listener<boolean>): Disposable {\n return this.enabledChanged.on(listener);\n }\n\n public onTeleportModeChange(\n listener: Listener<ViewerTeleportMode | undefined>\n ): Disposable {\n return this.teleportModeChanged.on(listener);\n }\n\n public onConfigurationChange(\n listener: Listener<ViewerWalkModeConfiguration>\n ): Disposable {\n return this.configurationChanged.on(listener);\n }\n\n public onKeyBindingsChange(\n listener: Listener<ViewerWalkModeKeyBindings>\n ): Disposable {\n return this.keyBindingsChanged.on(listener);\n }\n}\n",":host {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n pointer-events: none;\n}\n","import {\n Component,\n Event,\n EventEmitter,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n h,\n Host,\n Prop,\n Watch,\n} from '@stencil/core';\nimport { Disposable } from '@vertexvis/utils';\n\nimport { TeleportInteractionHandler } from '../../lib/teleportation/interactions';\nimport { WalkModeController } from '../../lib/walk-mode/controller';\nimport { ViewerTeleportMode, WalkModeModel } from '../../lib/walk-mode/model';\n\ninterface StateMap {\n shouldClearDepthBuffers?: boolean;\n}\n\n/**\n * The `<vertex-viewer-teleport-tool>` allows for click-based \"teleportation\"\n * around a model, which is particularly useful for walking through a model.\n * This tool is automatically included as part of the <vertex-viewer-walk-mode-tool>.\n */\n@Component({\n tag: 'vertex-viewer-teleport-tool',\n styleUrl: 'viewer-teleport-tool.css',\n shadow: true,\n})\nexport class ViewerTeleportTool {\n /**\n * The viewer that this component is bound to. This is automatically assigned\n * if added to the light-dom of a parent viewer element.\n */\n @Prop()\n public viewer?: HTMLVertexViewerElement;\n\n /**\n * The type of teleportation to perform when clicking.\n *\n * `teleport` - the camera's `position` is moved to the location of the hit result\n * constrained by the plane represented by the camera's current `position` and `up`\n * vectors.\n *\n * `teleport-and-align` - the camera's `position`, `lookAt`, and `up` vectors are updated\n * to align to the plane represented by the hit result's position and normal.\n *\n * `teleport-toward` - the camera's `position` is moved a fixed distance toward the location of the\n * hit result constrained by the plane represented by the camera's current `position` and `up`\n * vectors.\n *\n * `undefined` - no teleportation will occur when clicking.\n *\n * Defaults to `undefined`.\n */\n @Prop({ mutable: true })\n public mode?: ViewerTeleportMode;\n\n /**\n * Indicates whether animations will be used when performing camera\n * operations. Defaults to `false`.\n */\n @Prop()\n public animationsDisabled = false;\n\n /**\n * The duration of animations, in milliseconds. Defaults to `500`.\n */\n @Prop()\n public animationMs?: number = 500;\n\n @Prop({ mutable: true })\n public controller?: WalkModeController;\n\n @Prop({ mutable: true })\n public model: WalkModeModel = new WalkModeModel();\n\n /**\n * Event emitted when the `WalkModeController` associated with this tool changes.\n */\n @Event()\n public controllerChanged!: EventEmitter<WalkModeController>;\n\n private interactionHandlerDisposable?: Disposable;\n private interactionHandler?: TeleportInteractionHandler;\n\n private stateMap: StateMap = {};\n\n /**\n * @ignore\n */\n protected componentWillLoad(): void {\n this.setupController();\n this.setupInteractionHandler();\n this.setDepthBuffers();\n }\n\n /**\n * @ignore\n */\n protected connectedCallback(): void {\n this.setupInteractionHandler();\n this.setDepthBuffers();\n }\n\n /**\n * @ignore\n */\n protected disconnectedCallback(): void {\n this.clearInteractionHandler();\n this.resetDepthBuffers();\n }\n\n /**\n * @ignore\n */\n @Watch('mode')\n protected handleModeChange(): void {\n this.controller?.setTeleportMode(this.mode);\n\n if (this.mode != null) {\n this.setDepthBuffers();\n } else {\n this.resetDepthBuffers();\n }\n }\n\n /**\n * @ignore\n */\n @Watch('viewer')\n protected handleViewerChanged(): void {\n this.clearInteractionHandler();\n this.setupInteractionHandler();\n this.setDepthBuffers();\n }\n\n /**\n * @ignore\n */\n @Watch('animationMs')\n protected handleAnimationMsChanged(): void {\n if (this.animationMs != null) {\n this.interactionHandler?.setAnimations({ durationMs: this.animationMs });\n }\n }\n\n /**\n * @ignore\n */\n @Watch('animationsDisabled')\n protected handleAnimationsDisabledChanged(): void {\n if (this.animationsDisabled) {\n this.interactionHandler?.setAnimations(undefined);\n } else if (this.animationMs != null) {\n this.interactionHandler?.setAnimations({ durationMs: this.animationMs });\n }\n }\n\n /**\n * @ignore\n */\n @Watch('controller')\n protected handleControllerChanged(): void {\n this.setupInteractionHandler();\n this.setupController();\n this.controllerChanged.emit(this.controller);\n }\n\n @Watch('model')\n protected handleModelChanged(): void {\n this.setupController();\n this.clearInteractionHandler();\n this.setupInteractionHandler();\n }\n\n protected render(): JSX.Element {\n return <Host></Host>;\n }\n\n private setupController(): void {\n if (this.controller == null) {\n this.controller = new WalkModeController(this.model);\n this.controller.setTeleportMode(this.mode);\n this.controllerChanged.emit(this.controller);\n } else {\n this.controller.setTeleportMode(this.mode);\n this.controller.updateModel(this.model);\n }\n }\n\n private setDepthBuffers(): void {\n if (\n this.mode != null &&\n this.viewer != null &&\n this.viewer.depthBuffers == null\n ) {\n this.stateMap.shouldClearDepthBuffers = true;\n this.viewer.depthBuffers = 'final';\n }\n }\n\n private resetDepthBuffers(): void {\n if (this.stateMap.shouldClearDepthBuffers && this.viewer != null) {\n this.viewer.depthBuffers = undefined;\n this.stateMap.shouldClearDepthBuffers = undefined;\n }\n }\n\n private clearInteractionHandler(): void {\n this.interactionHandlerDisposable?.dispose();\n this.interactionHandlerDisposable = undefined;\n this.interactionHandler?.dispose();\n this.interactionHandler = undefined;\n }\n\n private async setupInteractionHandler(): Promise<void> {\n if (this.interactionHandler == null) {\n this.interactionHandler = new TeleportInteractionHandler(\n this.model,\n !this.animationsDisabled && this.animationMs != null\n ? { durationMs: this.animationMs }\n : undefined\n );\n\n this.interactionHandlerDisposable =\n await this.viewer?.registerInteractionHandler(this.interactionHandler);\n }\n }\n}\n"],"version":3}
@@ -8,7 +8,8 @@ class KeyBinding {
8
8
  this.bindings = bindings.map((binding) => binding.toLowerCase());
9
9
  }
10
10
  matches(keys) {
11
- return this.bindings.every((binding) => this.bindingMatches(keys, binding));
11
+ return (this.bindings.length > 0 &&
12
+ this.bindings.every((binding) => this.bindingMatches(keys, binding)));
12
13
  }
13
14
  bindingMatches(keys, binding) {
14
15
  const negated = binding.includes('!');
@@ -266,4 +267,4 @@ class WalkModeModel {
266
267
 
267
268
  export { ViewerWalkModeOperation as V, WalkModeModel as W, WalkModeController as a };
268
269
 
269
- //# sourceMappingURL=model-278b9023.js.map
270
+ //# sourceMappingURL=model-155eb2f5.js.map
@@ -0,0 +1 @@
1
+ {"file":"model-155eb2f5.js","mappings":"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","names":[],"sources":["./src/lib/keyBinding.ts","./src/lib/walk-mode/controller.ts","./src/lib/walk-mode/model.ts"],"sourcesContent":["export class KeyBinding {\n private bindings: string[];\n\n public constructor(...bindings: string[]) {\n this.bindings = bindings.map((binding) => binding.toLowerCase());\n }\n\n public matches(keys: Record<string, boolean>): boolean {\n return (\n this.bindings.length > 0 &&\n this.bindings.every((binding) => this.bindingMatches(keys, binding))\n );\n }\n\n private bindingMatches(\n keys: Record<string, boolean>,\n binding: string\n ): boolean {\n const negated = binding.includes('!');\n const key = binding.replace('!', '');\n\n return negated ? !keys[key] : keys[key];\n }\n}\n","import { Disposable } from '@vertexvis/utils';\n\nimport { KeyBinding } from '../keyBinding';\nimport {\n ViewerTeleportMode,\n ViewerWalkModeConfiguration,\n ViewerWalkModeOperation,\n WalkModeModel,\n} from './model';\n\nexport class WalkModeController {\n private excludeTagNames: Array<string> = [\n 'VERTEX-SCENE-TREE',\n 'VERTEX-SCENE-TREE-SEARCH',\n 'VERTEX-VIEWER-PIN-TOOL',\n 'INPUT',\n 'TEXTAREA',\n ];\n\n private excludePredicates: Array<(el: Element) => boolean> = [];\n\n public constructor(private model: WalkModeModel) {\n this.updateModelExclusions();\n }\n\n /**\n * @internal\n */\n public updateModel(model: WalkModeModel): void {\n this.model = model;\n }\n\n /**\n * Sets whether downstream walk mode interaction handlers are enabled.\n * Setting this value to `false` will remove all event listeners for\n * the interactions, and setting this value to `true` will add or\n * re-add the event listeners.\n */\n public setEnabled(enabled: boolean): void {\n this.model.setEnabled(enabled);\n }\n\n /**\n * Sets the `ViewerTeleportMode` to be used with a `<vertex-viewer-teleport-tool>`.\n */\n public setTeleportMode(mode?: ViewerTeleportMode): void {\n this.model.setTeleportMode(mode);\n }\n\n /**\n * Updates the configuration for downstream walk mode interaction handlers.\n *\n * `teleportHeightPercentage` - percentage used for fine-tuning the distance to offset\n * the camera from a surface when performing a `teleport-and-align`. This percentage is\n * used alongside the shortest side of the visible bounding box to determine how far to\n * place the camera from the surface that has been hit, with a larger percentage placing\n * the camera further from the surface and vice-versa. Defaults to 11.75%.\n *\n * `teleportDistancePercentage` - percentage used for fine-tuning the distance moved per\n * click with the `teleport-toward` mode. This percentage is used alongside the longest\n * side of the visible bounding box to determine how far to move the camera's position\n * with each click, with a larger percentage moving the camera further and vice-versa.\n * Defaults to 2%.\n *\n * `teleportCollisionDistance` - distance used alongside the `teleportCollisionPercentage`\n * to determine whether a click with the `teleport-toward` mode would cause a \"collision\",\n * or would pass through the point clicked. If such a collision would occur, the camera is\n * instead placed this distance back from the point clicked once, then allowed to pass\n * through the point on subsequent clicks. Note that this will not apply if clicks occur\n * in quick succession without setting the `depthBuffers` property on the `<vertex-viewer>`\n * to `all` frames. Defaults to `1000`.\n *\n * `keyboardWalkSpeed` - speed to move the camera when performing keyboard-based\n * walk interactions. A larger number here will result in a faster walk speed through\n * the model and vice-versa. Defaults to `5`.\n *\n * `keyboardPivotDegrees` - number of degrees to move the camera when performing\n * keyboard-based pivot interactions. Defaults to `1`.\n *\n * `keyboardRepeatIntervalMs` - number of milliseconds to repeat keyboard-based interactions.\n * this value is multiplicative with the `keyboardWalkSpeed` and `keyboardPivotDegrees`, and\n * lower numbers will result in faster movement and vice-versa. Defaults to `25`.\n *\n */\n public updateConfiguration(\n configuration: Partial<ViewerWalkModeConfiguration>\n ): void {\n const existing = this.model.getConfiguration();\n\n this.model.setConfiguration({\n ...existing,\n ...configuration,\n });\n }\n\n /**\n * Adds a custom keybinding for a specific walk operation. This will append to the\n * existing set of keybindings to allow for multiple keybindings for a specific\n * operation. To replace the defaults, see `replaceKeyBinding`.\n */\n public addKeyBinding(\n operation: ViewerWalkModeOperation,\n ...keys: string[]\n ): void {\n this.model.addKeyBinding(operation, new KeyBinding(...keys));\n }\n\n /**\n * Adds a custom keybinding for a specific walk operation. This will replace any\n * existing keybindings to allow for overriding the default behavior.\n *\n * @example\n * ```\n * const walkModeTool = document.querySelector('vertex-viewer-walk-mode-tool');\n *\n * // Remove keybinding for the `PIVOT_UP` operation\n * walkModeTool.controller.replaceKeyBinding('PIVOT_UP');\n *\n * // Replace keybinding for `WALK_FORWARD` with `ArrowUp` instead of `w`\n * walkModeTool.controller.replaceKeyBinding('WALK_FORWARD', 'ArrowUp');\n * ```\n */\n public replaceKeyBinding(\n operation: ViewerWalkModeOperation,\n ...keys: string[]\n ): void {\n this.model.replaceKeyBinding(operation, new KeyBinding(...keys));\n }\n\n /**\n * Adds an exclusion for specific elements when responding to keyboard\n * events. This is useful when there are other elements on screen that\n * require keyboard interaction and the walk mode handlers should not\n * respond to the keyboard events. Can be either a element's `tagName`\n * or a predicate. Returns a `Disposable` that can be used to remove the\n * exclusion.\n *\n * Default `tagName` exclusions:\n * 'VERTEX-SCENE-TREE'\n * 'VERTEX-SCENE-TREE-SEARCH'\n * 'VERTEX-VIEWER-PIN-TOOL'\n * 'INPUT'\n * 'TEXTAREA'\n */\n public excludeElement(predicate: (el: Element) => boolean): Disposable;\n public excludeElement(tagName: string): Disposable;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n public excludeElement(...args: any[]): Disposable {\n if (typeof args[0] === 'string') {\n this.excludeTagNames = [...this.excludeTagNames, args[0]];\n\n this.updateModelExclusions();\n\n return {\n dispose: () => {\n this.excludeTagNames = this.excludeTagNames.filter(\n (tn) => tn !== args[0]\n );\n },\n };\n } else {\n this.excludePredicates = [...this.excludePredicates, args[0]];\n\n this.updateModelExclusions();\n\n return {\n dispose: () => {\n this.excludePredicates = this.excludePredicates.filter(\n (tn) => tn !== args[0]\n );\n },\n };\n }\n }\n\n private updateModelExclusions(): void {\n this.model.setExcludedPredicate(\n (el) =>\n this.excludeTagNames.some((tn) => tn === el.tagName) ||\n this.excludePredicates.some((p) => p(el))\n );\n }\n}\n","import { Disposable, EventDispatcher, Listener } from '@vertexvis/utils';\n\nimport { KeyBinding } from '../keyBinding';\n\nexport interface ViewerWalkModeConfiguration {\n teleportHeightPercentage: number;\n teleportDistancePercentage: number;\n teleportCollisionDistance: number;\n keyboardWalkSpeed: number;\n keyboardPivotDegrees: number;\n keyboardRepeatIntervalMs: number;\n}\n\nexport type ViewerTeleportMode =\n | 'teleport'\n | 'teleport-and-align'\n | 'teleport-toward';\n\nexport enum ViewerWalkModeOperation {\n 'MOVE_DOWN' = 'MOVE_DOWN',\n 'MOVE_UP' = 'MOVE_UP',\n 'PIVOT_DOWN' = 'PIVOT_DOWN',\n 'PIVOT_LEFT' = 'PIVOT_LEFT',\n 'PIVOT_RIGHT' = 'PIVOT_RIGHT',\n 'PIVOT_UP' = 'PIVOT_UP',\n 'WALK_BACKWARD' = 'WALK_BACKWARD',\n 'WALK_FORWARD' = 'WALK_FORWARD',\n 'WALK_LEFT' = 'WALK_LEFT',\n 'WALK_RIGHT' = 'WALK_RIGHT',\n}\n\nexport type ViewerWalkModeKeyBindings = Record<\n ViewerWalkModeOperation,\n KeyBinding[]\n>;\n\nexport class WalkModeModel {\n private keyBindings: ViewerWalkModeKeyBindings = {\n [ViewerWalkModeOperation.MOVE_DOWN]: [\n new KeyBinding('PageDown', '!Shift', '!Alt'),\n ],\n [ViewerWalkModeOperation.MOVE_UP]: [\n new KeyBinding('PageUp', '!Shift', '!Alt'),\n ],\n [ViewerWalkModeOperation.PIVOT_DOWN]: [\n new KeyBinding('ArrowDown', '!Shift', '!Alt'),\n ],\n [ViewerWalkModeOperation.PIVOT_LEFT]: [\n new KeyBinding('ArrowLeft', '!Shift', '!Alt'),\n ],\n [ViewerWalkModeOperation.PIVOT_RIGHT]: [\n new KeyBinding('ArrowRight', '!Shift', '!Alt'),\n ],\n [ViewerWalkModeOperation.PIVOT_UP]: [\n new KeyBinding('ArrowUp', '!Shift', '!Alt'),\n ],\n [ViewerWalkModeOperation.WALK_BACKWARD]: [new KeyBinding('s')],\n [ViewerWalkModeOperation.WALK_FORWARD]: [new KeyBinding('w')],\n [ViewerWalkModeOperation.WALK_LEFT]: [new KeyBinding('a')],\n [ViewerWalkModeOperation.WALK_RIGHT]: [new KeyBinding('d')],\n };\n\n private configuration: ViewerWalkModeConfiguration = {\n teleportHeightPercentage: 11.75,\n teleportDistancePercentage: 2,\n teleportCollisionDistance: 1000,\n keyboardWalkSpeed: 5,\n keyboardPivotDegrees: 1,\n keyboardRepeatIntervalMs: 25,\n };\n\n private excludedPredicate?: (el: Element) => boolean;\n\n private enabled = true;\n private teleportMode?: ViewerTeleportMode;\n\n private enabledChanged: EventDispatcher<boolean> = new EventDispatcher();\n\n private teleportModeChanged: EventDispatcher<ViewerTeleportMode | undefined> =\n new EventDispatcher<ViewerTeleportMode | undefined>();\n\n private configurationChanged: EventDispatcher<ViewerWalkModeConfiguration> =\n new EventDispatcher<ViewerWalkModeConfiguration>();\n\n private keyBindingsChanged: EventDispatcher<ViewerWalkModeKeyBindings> =\n new EventDispatcher<ViewerWalkModeKeyBindings>();\n\n public setEnabled(enabled: boolean): void {\n this.enabled = enabled;\n this.enabledChanged.emit(enabled);\n }\n\n public setTeleportMode(mode?: ViewerTeleportMode): void {\n this.teleportMode = mode;\n this.teleportModeChanged.emit(mode);\n }\n\n public setConfiguration(configuration: ViewerWalkModeConfiguration): void {\n this.configuration = configuration;\n this.configurationChanged.emit(configuration);\n }\n\n public addKeyBinding(\n operation: ViewerWalkModeOperation,\n keyBinding: KeyBinding\n ): void {\n this.keyBindings[operation] = [...this.keyBindings[operation], keyBinding];\n this.keyBindingsChanged.emit(this.keyBindings);\n }\n\n public replaceKeyBinding(\n operation: ViewerWalkModeOperation,\n keyBinding: KeyBinding\n ): void {\n this.keyBindings[operation] = [keyBinding];\n this.keyBindingsChanged.emit(this.keyBindings);\n }\n\n public setExcludedPredicate(predicate: (el: Element) => boolean): void {\n this.excludedPredicate = predicate;\n }\n\n public getEnabled(): boolean {\n return this.enabled;\n }\n\n public getTeleportMode(): ViewerTeleportMode | undefined {\n return this.teleportMode;\n }\n\n public getTeleportHeightPercentage(): number {\n return this.configuration.teleportHeightPercentage;\n }\n\n public getKeyboardWalkSpeed(): number {\n return this.configuration.keyboardWalkSpeed;\n }\n\n public getKeyboardPivotDegrees(): number {\n return this.configuration.keyboardPivotDegrees;\n }\n\n public getKeyboardRepeatInterval(): number {\n return this.configuration.keyboardRepeatIntervalMs;\n }\n\n public getConfiguration(): ViewerWalkModeConfiguration {\n return this.configuration;\n }\n\n public getKeyBindings(): ViewerWalkModeKeyBindings {\n return this.keyBindings;\n }\n\n public operationMatches(\n operation: ViewerWalkModeOperation,\n state: Record<string, boolean>\n ): boolean {\n return this.keyBindings[operation].some((binding) =>\n binding.matches(state)\n );\n }\n\n public isElementExcluded(el: Element): boolean {\n return !!this.excludedPredicate?.(el);\n }\n\n public onEnabledChange(listener: Listener<boolean>): Disposable {\n return this.enabledChanged.on(listener);\n }\n\n public onTeleportModeChange(\n listener: Listener<ViewerTeleportMode | undefined>\n ): Disposable {\n return this.teleportModeChanged.on(listener);\n }\n\n public onConfigurationChange(\n listener: Listener<ViewerWalkModeConfiguration>\n ): Disposable {\n return this.configurationChanged.on(listener);\n }\n\n public onKeyBindingsChange(\n listener: Listener<ViewerWalkModeKeyBindings>\n ): Disposable {\n return this.keyBindingsChanged.on(listener);\n }\n}\n"],"version":3}
@@ -5,7 +5,7 @@ import { r as registerInstance, c as createEvent, h, H as Host } from './index-f
5
5
  import { p as point, v as vector3, b as boundingBox, f as plane, r as ray } from './bundle.esm-a967514a.js';
6
6
  import { g as getMouseClientPosition } from './dom-93fd5d38.js';
7
7
  import { E as ElementRectObserver } from './elementRectObserver-18226f28.js';
8
- import { W as WalkModeModel, a as WalkModeController } from './model-278b9023.js';
8
+ import { W as WalkModeModel, a as WalkModeController } from './model-155eb2f5.js';
9
9
  import './browser.esm-83e1d5b2.js';
10
10
 
11
11
  class TeleportInteractionHandler {
@@ -2,7 +2,7 @@
2
2
  * Copyright (c) 2023 Vertex Software LLC. All rights reserved.
3
3
  */
4
4
  import { r as registerInstance, c as createEvent, h, H as Host, g as getElement } from './index-fd7d7b68.js';
5
- import { V as ViewerWalkModeOperation, W as WalkModeModel, a as WalkModeController } from './model-278b9023.js';
5
+ import { V as ViewerWalkModeOperation, W as WalkModeModel, a as WalkModeController } from './model-155eb2f5.js';
6
6
  import { v as vector3 } from './bundle.esm-a967514a.js';
7
7
  import './browser.esm-83e1d5b2.js';
8
8
 
@@ -1 +1 @@
1
- {"file":"vertex-viewer-walk-mode-tool.entry.js","mappings":"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","names":["Vector3"],"sources":["./src/lib/walk-mode/dom.ts","./src/lib/walk-mode/interactions.ts","./src/components/viewer-walk-mode-tool/viewer-walk-mode-tool.css?tag=vertex-viewer-walk-mode-tool&encapsulation=shadow","./src/components/viewer-walk-mode-tool/viewer-walk-mode-tool.tsx"],"sourcesContent":["export function targetIsElement(target: EventTarget | null): target is Element {\n return target instanceof Element;\n}\n","import { Vector3 } from '@vertexvis/geometry';\nimport { Disposable } from '@vertexvis/utils';\n\nimport { InteractionApiPerspective, InteractionHandler } from '../interactions';\nimport { targetIsElement } from './dom';\nimport { ViewerWalkModeOperation, WalkModeModel } from './model';\n\nexport class WalkInteractionHandler implements InteractionHandler {\n private api?: InteractionApiPerspective;\n\n private interval?: NodeJS.Timer;\n private pressed: Record<string, boolean> = {};\n private handlers: Record<ViewerWalkModeOperation, VoidFunction>;\n\n private enabledChangeDisposable?: Disposable;\n private keyBindingsChangeDisposable?: Disposable;\n private configurationChangeDisposable?: Disposable;\n\n public constructor(private model: WalkModeModel) {\n this.handleKeyDown = this.handleKeyDown.bind(this);\n this.handleKeyUp = this.handleKeyUp.bind(this);\n this.handleEnabledChange = this.handleEnabledChange.bind(this);\n this.restartInteraction = this.restartInteraction.bind(this);\n this.updateCamera = this.updateCamera.bind(this);\n\n this.handlers = {\n [ViewerWalkModeOperation.MOVE_DOWN]: this.moveDown.bind(this),\n [ViewerWalkModeOperation.MOVE_UP]: this.moveUp.bind(this),\n [ViewerWalkModeOperation.PIVOT_DOWN]: this.pivotDown.bind(this),\n [ViewerWalkModeOperation.PIVOT_LEFT]: this.pivotLeft.bind(this),\n [ViewerWalkModeOperation.PIVOT_RIGHT]: this.pivotRight.bind(this),\n [ViewerWalkModeOperation.PIVOT_UP]: this.pivotUp.bind(this),\n [ViewerWalkModeOperation.WALK_BACKWARD]: this.walkBackward.bind(this),\n [ViewerWalkModeOperation.WALK_FORWARD]: this.walkForward.bind(this),\n [ViewerWalkModeOperation.WALK_LEFT]: this.walkLeft.bind(this),\n [ViewerWalkModeOperation.WALK_RIGHT]: this.walkRight.bind(this),\n };\n\n this.enabledChangeDisposable = this.model.onEnabledChange(\n this.handleEnabledChange\n );\n this.keyBindingsChangeDisposable = this.model.onKeyBindingsChange(\n this.restartInteraction\n );\n this.configurationChangeDisposable = this.model.onConfigurationChange(\n this.restartInteraction\n );\n }\n\n public dispose(): void {\n this.disable();\n this.enabledChangeDisposable?.dispose();\n this.keyBindingsChangeDisposable?.dispose();\n this.configurationChangeDisposable?.dispose();\n\n window.removeEventListener('keydown', this.handleKeyDown);\n window.removeEventListener('keyup', this.handleKeyUp);\n }\n\n public initialize(_: HTMLElement, api: InteractionApiPerspective): void {\n this.api = api;\n\n this.handleEnabledChange(this.model.getEnabled());\n }\n\n public enable(): void {\n this.disable();\n\n window.addEventListener('keydown', this.handleKeyDown);\n window.addEventListener('keyup', this.handleKeyUp);\n }\n\n public disable(): void {\n window.removeEventListener('keydown', this.handleKeyDown);\n window.removeEventListener('keyup', this.handleKeyUp);\n }\n\n private handleKeyDown(event: KeyboardEvent): void {\n const key = event.key.toLowerCase();\n\n const exclude =\n targetIsElement(event.target) &&\n this.model.isElementExcluded(event.target);\n\n if (!event.repeat && !exclude) {\n this.pressed = { ...this.pressed, [key]: true };\n\n this.tryBeginInteraction();\n }\n }\n\n private handleKeyUp = async (event: KeyboardEvent): Promise<void> => {\n const key = event.key.toLocaleLowerCase();\n\n this.pressed = Object.keys(this.pressed)\n .filter((k) => k !== key)\n .reduce((pressed, k) => ({ ...pressed, [k]: true }), {});\n\n if (Object.keys(this.pressed).length === 0 && this.interval != null) {\n this.endInteraction();\n }\n };\n\n private handleEnabledChange(enabled: boolean): void {\n if (enabled) {\n this.enable();\n } else {\n this.disable();\n }\n }\n\n private restartInteraction(): void {\n this.clearInterval();\n this.tryBeginInteraction();\n }\n\n private tryBeginInteraction(): void {\n if (Object.keys(this.pressed).length > 0 && this.someOperationMatches()) {\n this.beginInteraction();\n }\n }\n\n private beginInteraction(): void {\n if (!this.api?.isInteracting()) {\n this.api?.beginInteraction();\n }\n\n if (this.interval == null) {\n this.interval = setInterval(\n this.updateCamera,\n this.model.getKeyboardRepeatInterval()\n );\n }\n }\n\n private endInteraction = async (): Promise<void> => {\n this.clearInterval();\n await this.api?.endInteraction();\n };\n\n private clearInterval(): void {\n if (this.interval != null) {\n clearInterval(this.interval);\n this.interval = undefined;\n }\n }\n\n private updateCamera(): void {\n Object.keys(this.handlers).forEach((key) => {\n const op = key as ViewerWalkModeOperation;\n\n if (this.model.operationMatches(op, this.pressed)) {\n this.handlers[op]();\n }\n });\n }\n\n private someOperationMatches(): boolean {\n return Object.keys(this.handlers).some((op) =>\n this.model.operationMatches(op as ViewerWalkModeOperation, this.pressed)\n );\n }\n\n private pivotLeft(): void {\n this.api?.pivotCamera(0, this.model.getKeyboardPivotDegrees());\n }\n\n private pivotRight(): void {\n this.api?.pivotCamera(0, -this.model.getKeyboardPivotDegrees());\n }\n\n private pivotUp(): void {\n this.api?.pivotCamera(-this.model.getKeyboardPivotDegrees(), 0);\n }\n\n private pivotDown(): void {\n this.api?.pivotCamera(this.model.getKeyboardPivotDegrees(), 0);\n }\n\n private walkForward(): void {\n this.api?.walk(Vector3.scale(this.relativeWalkSpeed(), Vector3.forward()));\n }\n\n private walkBackward(): void {\n this.api?.walk(Vector3.scale(this.relativeWalkSpeed(), Vector3.back()));\n }\n\n private walkLeft(): void {\n this.api?.walk(Vector3.scale(this.relativeWalkSpeed(), Vector3.left()));\n }\n\n private walkRight(): void {\n this.api?.walk(Vector3.scale(this.relativeWalkSpeed(), Vector3.right()));\n }\n\n private moveUp(): void {\n this.api?.walk(Vector3.scale(this.relativeWalkSpeed(), Vector3.down()));\n }\n\n private moveDown(): void {\n this.api?.walk(Vector3.scale(this.relativeWalkSpeed(), Vector3.up()));\n }\n\n private relativeWalkSpeed(): number {\n return this.model.getKeyboardWalkSpeed() / 500;\n }\n}\n",":host {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n pointer-events: none;\n}\n","import {\n Component,\n Element,\n Event,\n EventEmitter,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n h,\n Host,\n Prop,\n Watch,\n} from '@stencil/core';\nimport { Disposable } from '@vertexvis/utils';\n\nimport { InteractionType } from '../../lib/interactions/baseInteractionHandler';\nimport { WalkModeController } from '../../lib/walk-mode/controller';\nimport { WalkInteractionHandler } from '../../lib/walk-mode/interactions';\nimport { ViewerTeleportMode, WalkModeModel } from '../../lib/walk-mode/model';\n\ninterface StateMap {\n teleportTool?: HTMLVertexViewerTeleportToolElement;\n previousPrimaryInteractionType?: InteractionType;\n}\n\n/**\n * The `<vertex-viewer-walk-mode-tool>` allows for additional interactions\n * intended for walking through a model instead of orbiting a model.\n */\n@Component({\n tag: 'vertex-viewer-walk-mode-tool',\n styleUrl: 'viewer-walk-mode-tool.css',\n shadow: true,\n})\nexport class ViewerWalkModeTool {\n /**\n * The viewer that this component is bound to. This is automatically assigned\n * if added to the light-dom of a parent viewer element.\n */\n @Prop()\n public viewer?: HTMLVertexViewerElement;\n\n /**\n * The `WalkModeController` responsible for controlling `KeyBinding`s and excluded\n * elements, as well as updating the `WalkModeModel` with various configuration\n * settings.\n */\n @Prop({ mutable: true })\n public controller?: WalkModeController;\n\n /**\n * The `WalkModeModel` responsible for tracking configuration and emitting\n * events for interaction handlers to respond to.\n */\n @Prop({ mutable: true })\n public model: WalkModeModel = new WalkModeModel();\n\n /**\n * The type of teleportation to perform when clicking. This value is passed through\n * to a `<vertex-viewer-teleport-tool>`'s mode attribute.\n *\n * `teleport` - the camera's `position` is moved to the location of the hit result\n * constrained by the plane represented by the camera's current `position` and `up`\n * vectors.\n *\n * `teleport-and-align` - the camera's `position`, `lookAt`, and `up` vectors are updated\n * to align to the plane represented by the hit result's position and normal.\n *\n * `undefined` - no teleportation will occur when clicking.\n *\n * Defaults to `undefined`.\n */\n @Prop()\n public teleportMode?: ViewerTeleportMode;\n\n /**\n * Determines whether the interaction handlers for this tool should respond to events.\n * When set to `true`, the default viewer interaction mode will be overridden to use the\n * `pivot` camera interaction type, keyboard controls for movement will be added, and\n * setting the `teleportMode` will enable the tool.\n *\n * Defaults to `true`.\n */\n @Prop()\n public enabled = true;\n\n /**\n * Event emitted when the `WalkModeController` associated with this tool changes.\n */\n @Event()\n public controllerChanged!: EventEmitter<WalkModeController>;\n\n @Element()\n private hostEl?: HTMLElement;\n\n private interactionHandlerDisposable?: Disposable;\n private interactionHandler?: WalkInteractionHandler;\n\n private stateMap: StateMap = {};\n\n /**\n * @ignore\n */\n protected componentWillLoad(): void {\n this.setupController();\n this.setupInteractionHandler();\n }\n\n /**\n * @ignore\n */\n protected async componentDidLoad(): Promise<void> {\n await this.ensureTeleportToolConfigured();\n this.updateTeleportTool();\n await this.setPivotInteractionMode();\n }\n\n /**\n * @ignore\n */\n protected connectedCallback(): void {\n this.setupInteractionHandler();\n this.setPivotInteractionMode();\n }\n\n /**\n * @ignore\n */\n protected disconnectedCallback(): void {\n this.clearInteractionHandler();\n this.resetInteractionMode();\n }\n\n /**\n * @ignore\n */\n @Watch('enabled')\n protected handleEnabledChanged(): void {\n this.controller?.setEnabled(this.enabled);\n this.toggleInteractionMode();\n }\n\n /**\n * @ignore\n */\n @Watch('viewer')\n protected handleViewerChanged(): void {\n this.clearInteractionHandler();\n this.setupInteractionHandler();\n this.updateTeleportTool();\n this.toggleInteractionMode();\n }\n\n /**\n * @ignore\n */\n @Watch('teleportMode')\n protected handleTeleportModeChanged(): void {\n this.updateTeleportTool();\n }\n\n /**\n * @ignore\n */\n @Watch('controller')\n protected handleControllerChanged(): void {\n this.updateTeleportTool();\n this.controllerChanged.emit(this.controller);\n }\n\n /**\n * @ignore\n */\n @Watch('model')\n protected handleModelChanged(): void {\n this.setupController();\n this.clearInteractionHandler();\n this.setupInteractionHandler();\n }\n\n protected render(): JSX.Element {\n return (\n <Host>\n <slot\n name=\"teleport-tool\"\n onSlotchange={async () => {\n await this.ensureTeleportToolConfigured();\n this.updateTeleportTool();\n }}\n ></slot>\n </Host>\n );\n }\n\n private setupController(): void {\n if (this.controller == null) {\n this.controller = new WalkModeController(this.model);\n this.controllerChanged.emit(this.controller);\n } else {\n this.controller.updateModel(this.model);\n }\n }\n\n private clearInteractionHandler(): void {\n this.interactionHandlerDisposable?.dispose();\n this.interactionHandlerDisposable = undefined;\n this.interactionHandler?.dispose();\n this.interactionHandler = undefined;\n }\n\n private async setupInteractionHandler(): Promise<void> {\n if (this.interactionHandler == null) {\n this.interactionHandler = new WalkInteractionHandler(this.model);\n\n this.interactionHandlerDisposable =\n await this.viewer?.registerInteractionHandler(this.interactionHandler);\n }\n }\n\n private async ensureTeleportToolConfigured(): Promise<void> {\n if (this.hostEl != null) {\n const slotted: Element | undefined =\n this.hostEl?.querySelector(\n 'vertex-viewer-teleport-tool[slot=\"teleport-tool\"]'\n ) ?? undefined;\n const slottedTeleportTool =\n slotted?.tagName === 'VERTEX-VIEWER-TELEPORT-TOOL'\n ? (slotted as HTMLVertexViewerTeleportToolElement)\n : undefined;\n\n if (slottedTeleportTool != null) {\n this.stateMap.teleportTool = slottedTeleportTool;\n } else {\n const slot: HTMLSlotElement | undefined =\n this.hostEl?.shadowRoot?.querySelector(\n 'slot[name=\"teleport-tool\"]'\n ) ?? undefined;\n\n this.stateMap.teleportTool = document.createElement(\n 'vertex-viewer-teleport-tool'\n );\n slot?.appendChild(this.stateMap.teleportTool);\n }\n }\n }\n\n private updateTeleportTool(): void {\n if (this.stateMap.teleportTool != null) {\n this.stateMap.teleportTool.viewer = this.viewer;\n this.stateMap.teleportTool.controller = this.controller;\n this.stateMap.teleportTool.model = this.model;\n this.stateMap.teleportTool.mode = this.teleportMode;\n }\n }\n\n private toggleInteractionMode(): void {\n if (this.enabled) {\n this.setPivotInteractionMode();\n } else {\n this.resetInteractionMode();\n }\n }\n\n private async setPivotInteractionMode(): Promise<void> {\n const baseInteractionHandler =\n await this.viewer?.getBaseInteractionHandler();\n\n if (this.enabled && baseInteractionHandler != null) {\n const interactionType =\n baseInteractionHandler.getPrimaryInteractionType();\n this.stateMap.previousPrimaryInteractionType =\n interactionType === 'pivot'\n ? this.stateMap.previousPrimaryInteractionType\n : interactionType;\n baseInteractionHandler.setPrimaryInteractionType('pivot');\n }\n }\n\n private async resetInteractionMode(): Promise<void> {\n const baseInteractionHandler =\n await this.viewer?.getBaseInteractionHandler();\n\n if (\n baseInteractionHandler != null &&\n baseInteractionHandler.getPrimaryInteractionType() === 'pivot' &&\n this.stateMap.previousPrimaryInteractionType != null\n ) {\n baseInteractionHandler.setPrimaryInteractionType(\n this.stateMap.previousPrimaryInteractionType\n );\n this.stateMap.previousPrimaryInteractionType = undefined;\n }\n }\n}\n"],"version":3}
1
+ {"file":"vertex-viewer-walk-mode-tool.entry.js","mappings":"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","names":["Vector3"],"sources":["./src/lib/walk-mode/dom.ts","./src/lib/walk-mode/interactions.ts","./src/components/viewer-walk-mode-tool/viewer-walk-mode-tool.css?tag=vertex-viewer-walk-mode-tool&encapsulation=shadow","./src/components/viewer-walk-mode-tool/viewer-walk-mode-tool.tsx"],"sourcesContent":["export function targetIsElement(target: EventTarget | null): target is Element {\n return target instanceof Element;\n}\n","import { Vector3 } from '@vertexvis/geometry';\nimport { Disposable } from '@vertexvis/utils';\n\nimport { InteractionApiPerspective, InteractionHandler } from '../interactions';\nimport { targetIsElement } from './dom';\nimport { ViewerWalkModeOperation, WalkModeModel } from './model';\n\nexport class WalkInteractionHandler implements InteractionHandler {\n private api?: InteractionApiPerspective;\n\n private interval?: NodeJS.Timer;\n private pressed: Record<string, boolean> = {};\n private handlers: Record<ViewerWalkModeOperation, VoidFunction>;\n\n private enabledChangeDisposable?: Disposable;\n private keyBindingsChangeDisposable?: Disposable;\n private configurationChangeDisposable?: Disposable;\n\n public constructor(private model: WalkModeModel) {\n this.handleKeyDown = this.handleKeyDown.bind(this);\n this.handleKeyUp = this.handleKeyUp.bind(this);\n this.handleEnabledChange = this.handleEnabledChange.bind(this);\n this.restartInteraction = this.restartInteraction.bind(this);\n this.updateCamera = this.updateCamera.bind(this);\n\n this.handlers = {\n [ViewerWalkModeOperation.MOVE_DOWN]: this.moveDown.bind(this),\n [ViewerWalkModeOperation.MOVE_UP]: this.moveUp.bind(this),\n [ViewerWalkModeOperation.PIVOT_DOWN]: this.pivotDown.bind(this),\n [ViewerWalkModeOperation.PIVOT_LEFT]: this.pivotLeft.bind(this),\n [ViewerWalkModeOperation.PIVOT_RIGHT]: this.pivotRight.bind(this),\n [ViewerWalkModeOperation.PIVOT_UP]: this.pivotUp.bind(this),\n [ViewerWalkModeOperation.WALK_BACKWARD]: this.walkBackward.bind(this),\n [ViewerWalkModeOperation.WALK_FORWARD]: this.walkForward.bind(this),\n [ViewerWalkModeOperation.WALK_LEFT]: this.walkLeft.bind(this),\n [ViewerWalkModeOperation.WALK_RIGHT]: this.walkRight.bind(this),\n };\n\n this.enabledChangeDisposable = this.model.onEnabledChange(\n this.handleEnabledChange\n );\n this.keyBindingsChangeDisposable = this.model.onKeyBindingsChange(\n this.restartInteraction\n );\n this.configurationChangeDisposable = this.model.onConfigurationChange(\n this.restartInteraction\n );\n }\n\n public dispose(): void {\n this.disable();\n this.enabledChangeDisposable?.dispose();\n this.keyBindingsChangeDisposable?.dispose();\n this.configurationChangeDisposable?.dispose();\n\n window.removeEventListener('keydown', this.handleKeyDown);\n window.removeEventListener('keyup', this.handleKeyUp);\n }\n\n public initialize(_: HTMLElement, api: InteractionApiPerspective): void {\n this.api = api;\n\n this.handleEnabledChange(this.model.getEnabled());\n }\n\n public enable(): void {\n this.disable();\n\n window.addEventListener('keydown', this.handleKeyDown);\n window.addEventListener('keyup', this.handleKeyUp);\n }\n\n public disable(): void {\n window.removeEventListener('keydown', this.handleKeyDown);\n window.removeEventListener('keyup', this.handleKeyUp);\n }\n\n private handleKeyDown(event: KeyboardEvent): void {\n const key = event.key.toLowerCase();\n\n const exclude =\n targetIsElement(event.target) &&\n this.model.isElementExcluded(event.target);\n\n if (!event.repeat && !exclude) {\n this.pressed = { ...this.pressed, [key]: true };\n\n this.tryBeginInteraction();\n }\n }\n\n private handleKeyUp = async (event: KeyboardEvent): Promise<void> => {\n const key = event.key.toLocaleLowerCase();\n\n this.pressed = Object.keys(this.pressed)\n .filter((k) => k !== key)\n .reduce((pressed, k) => ({ ...pressed, [k]: true }), {});\n\n if (Object.keys(this.pressed).length === 0 && this.interval != null) {\n this.endInteraction();\n }\n };\n\n private handleEnabledChange(enabled: boolean): void {\n if (enabled) {\n this.enable();\n } else {\n this.disable();\n }\n }\n\n private restartInteraction(): void {\n this.clearInterval();\n this.tryBeginInteraction();\n }\n\n private tryBeginInteraction(): void {\n if (Object.keys(this.pressed).length > 0 && this.someOperationMatches()) {\n this.beginInteraction();\n }\n }\n\n private beginInteraction(): void {\n if (!this.api?.isInteracting()) {\n this.api?.beginInteraction();\n }\n\n if (this.interval == null) {\n this.interval = setInterval(\n this.updateCamera,\n this.model.getKeyboardRepeatInterval()\n );\n }\n }\n\n private endInteraction = async (): Promise<void> => {\n this.clearInterval();\n await this.api?.endInteraction();\n };\n\n private clearInterval(): void {\n if (this.interval != null) {\n clearInterval(this.interval);\n this.interval = undefined;\n }\n }\n\n private updateCamera(): void {\n Object.keys(this.handlers).forEach((key) => {\n const op = key as ViewerWalkModeOperation;\n\n if (this.model.operationMatches(op, this.pressed)) {\n this.handlers[op]();\n }\n });\n }\n\n private someOperationMatches(): boolean {\n return Object.keys(this.handlers).some((op) =>\n this.model.operationMatches(op as ViewerWalkModeOperation, this.pressed)\n );\n }\n\n private pivotLeft(): void {\n this.api?.pivotCamera(0, this.model.getKeyboardPivotDegrees());\n }\n\n private pivotRight(): void {\n this.api?.pivotCamera(0, -this.model.getKeyboardPivotDegrees());\n }\n\n private pivotUp(): void {\n this.api?.pivotCamera(-this.model.getKeyboardPivotDegrees(), 0);\n }\n\n private pivotDown(): void {\n this.api?.pivotCamera(this.model.getKeyboardPivotDegrees(), 0);\n }\n\n private walkForward(): void {\n this.api?.walk(Vector3.scale(this.relativeWalkSpeed(), Vector3.forward()));\n }\n\n private walkBackward(): void {\n this.api?.walk(Vector3.scale(this.relativeWalkSpeed(), Vector3.back()));\n }\n\n private walkLeft(): void {\n this.api?.walk(Vector3.scale(this.relativeWalkSpeed(), Vector3.left()));\n }\n\n private walkRight(): void {\n this.api?.walk(Vector3.scale(this.relativeWalkSpeed(), Vector3.right()));\n }\n\n private moveUp(): void {\n this.api?.walk(Vector3.scale(this.relativeWalkSpeed(), Vector3.down()));\n }\n\n private moveDown(): void {\n this.api?.walk(Vector3.scale(this.relativeWalkSpeed(), Vector3.up()));\n }\n\n private relativeWalkSpeed(): number {\n return this.model.getKeyboardWalkSpeed() / 500;\n }\n}\n",":host {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n pointer-events: none;\n}\n","import {\n Component,\n Element,\n Event,\n EventEmitter,\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n h,\n Host,\n Prop,\n Watch,\n} from '@stencil/core';\nimport { Disposable } from '@vertexvis/utils';\n\nimport { InteractionType } from '../../lib/interactions/baseInteractionHandler';\nimport { WalkModeController } from '../../lib/walk-mode/controller';\nimport { WalkInteractionHandler } from '../../lib/walk-mode/interactions';\nimport { ViewerTeleportMode, WalkModeModel } from '../../lib/walk-mode/model';\n\ninterface StateMap {\n teleportTool?: HTMLVertexViewerTeleportToolElement;\n previousPrimaryInteractionType?: InteractionType;\n}\n\n/**\n * The `<vertex-viewer-walk-mode-tool>` allows for additional interactions\n * intended for walking through a model instead of orbiting a model.\n */\n@Component({\n tag: 'vertex-viewer-walk-mode-tool',\n styleUrl: 'viewer-walk-mode-tool.css',\n shadow: true,\n})\nexport class ViewerWalkModeTool {\n /**\n * The viewer that this component is bound to. This is automatically assigned\n * if added to the light-dom of a parent viewer element.\n */\n @Prop()\n public viewer?: HTMLVertexViewerElement;\n\n /**\n * The `WalkModeController` responsible for controlling `KeyBinding`s and excluded\n * elements, as well as updating the `WalkModeModel` with various configuration\n * settings.\n */\n @Prop({ mutable: true })\n public controller?: WalkModeController;\n\n /**\n * The `WalkModeModel` responsible for tracking configuration and emitting\n * events for interaction handlers to respond to.\n */\n @Prop({ mutable: true })\n public model: WalkModeModel = new WalkModeModel();\n\n /**\n * The type of teleportation to perform when clicking. This value is passed through\n * to a `<vertex-viewer-teleport-tool>`'s mode attribute.\n *\n * `teleport` - the camera's `position` is moved to the location of the hit result\n * constrained by the plane represented by the camera's current `position` and `up`\n * vectors.\n *\n * `teleport-and-align` - the camera's `position`, `lookAt`, and `up` vectors are updated\n * to align to the plane represented by the hit result's position and normal.\n *\n * `teleport-toward` - the camera's `position` is moved a fixed distance toward the location of the\n * hit result constrained by the plane represented by the camera's current `position` and `up`\n * vectors.\n *\n * `undefined` - no teleportation will occur when clicking.\n *\n * Defaults to `undefined`.\n */\n @Prop()\n public teleportMode?: ViewerTeleportMode;\n\n /**\n * Determines whether the interaction handlers for this tool should respond to events.\n * When set to `true`, the default viewer interaction mode will be overridden to use the\n * `pivot` camera interaction type, keyboard controls for movement will be added, and\n * setting the `teleportMode` will enable the tool.\n *\n * Defaults to `true`.\n */\n @Prop()\n public enabled = true;\n\n /**\n * Event emitted when the `WalkModeController` associated with this tool changes.\n */\n @Event()\n public controllerChanged!: EventEmitter<WalkModeController>;\n\n @Element()\n private hostEl?: HTMLElement;\n\n private interactionHandlerDisposable?: Disposable;\n private interactionHandler?: WalkInteractionHandler;\n\n private stateMap: StateMap = {};\n\n /**\n * @ignore\n */\n protected componentWillLoad(): void {\n this.setupController();\n this.setupInteractionHandler();\n }\n\n /**\n * @ignore\n */\n protected async componentDidLoad(): Promise<void> {\n await this.ensureTeleportToolConfigured();\n this.updateTeleportTool();\n await this.setPivotInteractionMode();\n }\n\n /**\n * @ignore\n */\n protected connectedCallback(): void {\n this.setupInteractionHandler();\n this.setPivotInteractionMode();\n }\n\n /**\n * @ignore\n */\n protected disconnectedCallback(): void {\n this.clearInteractionHandler();\n this.resetInteractionMode();\n }\n\n /**\n * @ignore\n */\n @Watch('enabled')\n protected handleEnabledChanged(): void {\n this.controller?.setEnabled(this.enabled);\n this.toggleInteractionMode();\n }\n\n /**\n * @ignore\n */\n @Watch('viewer')\n protected handleViewerChanged(): void {\n this.clearInteractionHandler();\n this.setupInteractionHandler();\n this.updateTeleportTool();\n this.toggleInteractionMode();\n }\n\n /**\n * @ignore\n */\n @Watch('teleportMode')\n protected handleTeleportModeChanged(): void {\n this.updateTeleportTool();\n }\n\n /**\n * @ignore\n */\n @Watch('controller')\n protected handleControllerChanged(): void {\n this.updateTeleportTool();\n this.controllerChanged.emit(this.controller);\n }\n\n /**\n * @ignore\n */\n @Watch('model')\n protected handleModelChanged(): void {\n this.setupController();\n this.clearInteractionHandler();\n this.setupInteractionHandler();\n }\n\n protected render(): JSX.Element {\n return (\n <Host>\n <slot\n name=\"teleport-tool\"\n onSlotchange={async () => {\n await this.ensureTeleportToolConfigured();\n this.updateTeleportTool();\n }}\n ></slot>\n </Host>\n );\n }\n\n private setupController(): void {\n if (this.controller == null) {\n this.controller = new WalkModeController(this.model);\n this.controllerChanged.emit(this.controller);\n } else {\n this.controller.updateModel(this.model);\n }\n }\n\n private clearInteractionHandler(): void {\n this.interactionHandlerDisposable?.dispose();\n this.interactionHandlerDisposable = undefined;\n this.interactionHandler?.dispose();\n this.interactionHandler = undefined;\n }\n\n private async setupInteractionHandler(): Promise<void> {\n if (this.interactionHandler == null) {\n this.interactionHandler = new WalkInteractionHandler(this.model);\n\n this.interactionHandlerDisposable =\n await this.viewer?.registerInteractionHandler(this.interactionHandler);\n }\n }\n\n private async ensureTeleportToolConfigured(): Promise<void> {\n if (this.hostEl != null) {\n const slotted: Element | undefined =\n this.hostEl?.querySelector(\n 'vertex-viewer-teleport-tool[slot=\"teleport-tool\"]'\n ) ?? undefined;\n const slottedTeleportTool =\n slotted?.tagName === 'VERTEX-VIEWER-TELEPORT-TOOL'\n ? (slotted as HTMLVertexViewerTeleportToolElement)\n : undefined;\n\n if (slottedTeleportTool != null) {\n this.stateMap.teleportTool = slottedTeleportTool;\n } else {\n const slot: HTMLSlotElement | undefined =\n this.hostEl?.shadowRoot?.querySelector(\n 'slot[name=\"teleport-tool\"]'\n ) ?? undefined;\n\n this.stateMap.teleportTool = document.createElement(\n 'vertex-viewer-teleport-tool'\n );\n slot?.appendChild(this.stateMap.teleportTool);\n }\n }\n }\n\n private updateTeleportTool(): void {\n if (this.stateMap.teleportTool != null) {\n this.stateMap.teleportTool.viewer = this.viewer;\n this.stateMap.teleportTool.controller = this.controller;\n this.stateMap.teleportTool.model = this.model;\n this.stateMap.teleportTool.mode = this.teleportMode;\n }\n }\n\n private toggleInteractionMode(): void {\n if (this.enabled) {\n this.setPivotInteractionMode();\n } else {\n this.resetInteractionMode();\n }\n }\n\n private async setPivotInteractionMode(): Promise<void> {\n const baseInteractionHandler =\n await this.viewer?.getBaseInteractionHandler();\n\n if (this.enabled && baseInteractionHandler != null) {\n const interactionType =\n baseInteractionHandler.getPrimaryInteractionType();\n this.stateMap.previousPrimaryInteractionType =\n interactionType === 'pivot'\n ? this.stateMap.previousPrimaryInteractionType\n : interactionType;\n baseInteractionHandler.setPrimaryInteractionType('pivot');\n }\n }\n\n private async resetInteractionMode(): Promise<void> {\n const baseInteractionHandler =\n await this.viewer?.getBaseInteractionHandler();\n\n if (\n baseInteractionHandler != null &&\n baseInteractionHandler.getPrimaryInteractionType() === 'pivot' &&\n this.stateMap.previousPrimaryInteractionType != null\n ) {\n baseInteractionHandler.setPrimaryInteractionType(\n this.stateMap.previousPrimaryInteractionType\n );\n this.stateMap.previousPrimaryInteractionType = undefined;\n }\n }\n}\n"],"version":3}
@@ -34,6 +34,10 @@ export declare class ViewerWalkModeTool {
34
34
  * `teleport-and-align` - the camera's `position`, `lookAt`, and `up` vectors are updated
35
35
  * to align to the plane represented by the hit result's position and normal.
36
36
  *
37
+ * `teleport-toward` - the camera's `position` is moved a fixed distance toward the location of the
38
+ * hit result constrained by the plane represented by the camera's current `position` and `up`
39
+ * vectors.
40
+ *
37
41
  * `undefined` - no teleportation will occur when clicking.
38
42
  *
39
43
  * Defaults to `undefined`.
@@ -1220,7 +1220,7 @@ export namespace Components {
1220
1220
  */
1221
1221
  "model": WalkModeModel;
1222
1222
  /**
1223
- * The type of teleportation to perform when clicking. This value is passed through to a `<vertex-viewer-teleport-tool>`'s mode attribute. `teleport` - the camera's `position` is moved to the location of the hit result constrained by the plane represented by the camera's current `position` and `up` vectors. `teleport-and-align` - the camera's `position`, `lookAt`, and `up` vectors are updated to align to the plane represented by the hit result's position and normal. `undefined` - no teleportation will occur when clicking. Defaults to `undefined`.
1223
+ * The type of teleportation to perform when clicking. This value is passed through to a `<vertex-viewer-teleport-tool>`'s mode attribute. `teleport` - the camera's `position` is moved to the location of the hit result constrained by the plane represented by the camera's current `position` and `up` vectors. `teleport-and-align` - the camera's `position`, `lookAt`, and `up` vectors are updated to align to the plane represented by the hit result's position and normal. `teleport-toward` - the camera's `position` is moved a fixed distance toward the location of the hit result constrained by the plane represented by the camera's current `position` and `up` vectors. `undefined` - no teleportation will occur when clicking. Defaults to `undefined`.
1224
1224
  */
1225
1225
  "teleportMode"?: ViewerTeleportMode;
1226
1226
  /**
@@ -2693,7 +2693,7 @@ declare namespace LocalJSX {
2693
2693
  */
2694
2694
  "onControllerChanged"?: (event: VertexViewerWalkModeToolCustomEvent<WalkModeController>) => void;
2695
2695
  /**
2696
- * The type of teleportation to perform when clicking. This value is passed through to a `<vertex-viewer-teleport-tool>`'s mode attribute. `teleport` - the camera's `position` is moved to the location of the hit result constrained by the plane represented by the camera's current `position` and `up` vectors. `teleport-and-align` - the camera's `position`, `lookAt`, and `up` vectors are updated to align to the plane represented by the hit result's position and normal. `undefined` - no teleportation will occur when clicking. Defaults to `undefined`.
2696
+ * The type of teleportation to perform when clicking. This value is passed through to a `<vertex-viewer-teleport-tool>`'s mode attribute. `teleport` - the camera's `position` is moved to the location of the hit result constrained by the plane represented by the camera's current `position` and `up` vectors. `teleport-and-align` - the camera's `position`, `lookAt`, and `up` vectors are updated to align to the plane represented by the hit result's position and normal. `teleport-toward` - the camera's `position` is moved a fixed distance toward the location of the hit result constrained by the plane represented by the camera's current `position` and `up` vectors. `undefined` - no teleportation will occur when clicking. Defaults to `undefined`.
2697
2697
  */
2698
2698
  "teleportMode"?: ViewerTeleportMode;
2699
2699
  /**
@@ -1,5 +1,5 @@
1
1
  /*!
2
2
  * Copyright (c) 2023 Vertex Software LLC. All rights reserved.
3
3
  */
4
- import{r as i,c as t,h as s,H as n}from"./p-50533a46.js";import{p as o,v as e,b as h,f as l,r as a}from"./p-9fe7814b.js";import{g as d}from"./p-9d132ba7.js";import{E as r}from"./p-cbbe7fa1.js";import{W as u,a as c}from"./p-4717fc39.js";import"./p-05d09319.js";class v{constructor(i,t){this.model=i;this.animationConfiguration=t;this.rectObserver=new r;this.handlePointerDown=this.handlePointerDown.bind(this);this.handlePointerUp=this.handlePointerUp.bind(this);this.handleEnabledChange=this.handleEnabledChange.bind(this);this.handleTeleportModeChange=this.handleTeleportModeChange.bind(this);this.enabledChangeDisposable=this.model.onEnabledChange(this.handleEnabledChange)}dispose(){var i;this.disable();(i=this.enabledChangeDisposable)===null||i===void 0?void 0:i.dispose();this.element=undefined;this.api=undefined;this.rectObserver.disconnect()}initialize(i,t){this.element=i;this.api=t;this.rectObserver.observe(i);this.handleEnabledChange(this.model.getEnabled())}setAnimations(i){this.animationConfiguration=i}enable(){var i;this.disable();this.teleportModeChangeDisposable=this.model.onTeleportModeChange(this.handleTeleportModeChange);(i=this.element)===null||i===void 0?void 0:i.addEventListener("pointerdown",this.handlePointerDown);this.handleTeleportModeChange(this.model.getTeleportMode())}disable(){var i,t,s;(i=this.teleportModeChangeDisposable)===null||i===void 0?void 0:i.dispose();(t=this.cursorDisposable)===null||t===void 0?void 0:t.dispose();(s=this.element)===null||s===void 0?void 0:s.removeEventListener("pointerdown",this.handlePointerDown)}async handlePointerDown(i){this.downPosition=d(i,this.rectObserver.rect);this.downButtons=i.buttons;window.addEventListener("pointerup",this.handlePointerUp)}async handlePointerUp(i){var t,s;const n=this.model.getTeleportMode();const e=(s=(t=this.api)===null||t===void 0?void 0:t.pixelThreshold())!==null&&s!==void 0?s:2;const h=d(i,this.rectObserver.rect);const l=this.downButtons===2;const a=i.shiftKey||i.altKey||i.metaKey||i.ctrlKey;if(n!=null&&this.downPosition!=null&&o.distance(this.downPosition,h)<=e&&!l&&!a){switch(n){case"teleport":return this.teleportToHit(h);case"teleport-toward":return this.teleportTowardHit(h);case"teleport-and-align":return this.teleportAndAlign(h)}}this.downPosition=undefined;window.removeEventListener("pointerup",this.handlePointerUp)}async beginInteraction(){var i,t;if(!((i=this.api)===null||i===void 0?void 0:i.isInteracting())){await((t=this.api)===null||t===void 0?void 0:t.beginInteraction())}}async endInteraction(){var i;await((i=this.api)===null||i===void 0?void 0:i.endInteraction())}async teleportTowardHit(i){var t,s;const n=await((t=this.api)===null||t===void 0?void 0:t.getWorldPointFromViewport(i));const o=(s=this.api)===null||s===void 0?void 0:s.getRayFromPoint(i);if(o!=null){const{teleportDistancePercentage:i,teleportCollisionDistance:t}=this.model.getConfiguration();const s=i/100;return this.performInteraction((({camera:i,boundingBox:d})=>{const r=Math.max(...e.toArray(h.lengths(d)))*s;const u=l.fromNormalAndCoplanarPoint(i.up,i.position);const c=l.projectPoint(u,n!==null&&n!==void 0?n:i.position);const v=e.distance(i.position,c);if(v<r&&v>t*1.1){const s=a.create(Object.assign(Object.assign({},o),{origin:c}));const n=l.projectPoint(u,a.at(s,-t));return i.update({position:n,lookAt:e.add(i.lookAt,e.subtract(n,i.position))})}else{const t=l.projectPoint(u,a.at(o,r));return i.update({position:t,lookAt:e.add(i.lookAt,e.subtract(t,i.position))})}}))}}async teleportToHit(i){const t=await this.getWorldPointWithFallback(i);if(t!=null){return this.performInteraction((({camera:i,boundingBox:s})=>{const n=this.shortestLength(s);const o=this.model.getTeleportHeightPercentage()/100;const h=l.fromNormalAndCoplanarPoint(i.up,i.position);const d=l.projectPoint(h,t);const r=a.create({origin:i.position,direction:e.normalize(e.subtract(d,i.position))});const u=e.distance(i.position,d);const c=e.distance(i.position,i.lookAt);const v=a.at(r,u-n*o);const f=a.create({origin:v,direction:e.normalize(i.viewVector)});return i.update({position:v,lookAt:a.at(f,c)})}))}}async teleportAndAlign(i){var t;const s=await((t=this.api)===null||t===void 0?void 0:t.hitItems(i));const n=s!=null?s[0]:undefined;if((n===null||n===void 0?void 0:n.hitNormal)!=null&&(n===null||n===void 0?void 0:n.hitPoint)){await this.performInteraction((({camera:i,boundingBox:t})=>{const s=this.shortestLength(t);const o=this.model.getTeleportHeightPercentage()/100;const e=a.create({origin:n.hitPoint,direction:n.hitNormal});return i.alignTo(a.at(e,s*o),n.hitNormal)}))}}async performInteraction(i){var t;await this.beginInteraction();await((t=this.api)===null||t===void 0?void 0:t.transformCamera(i,this.renderConfiguration()));await this.endInteraction()}async getWorldPointWithFallback(i){var t,s;const n=await((t=this.api)===null||t===void 0?void 0:t.getWorldPointFromViewport(i));if(n==null){const t=await((s=this.api)===null||s===void 0?void 0:s.hitItems(i));const o=t!=null?t[0]:undefined;return(o===null||o===void 0?void 0:o.hitPoint)!=null?o.hitPoint:n}return n}handleEnabledChange(i){if(i){this.enable()}else{this.disable()}}handleTeleportModeChange(i){var t,s;(t=this.cursorDisposable)===null||t===void 0?void 0:t.dispose();if(i!=null){this.cursorDisposable=(s=this.api)===null||s===void 0?void 0:s.addCursor("crosshair")}}shortestLength(i){return Math.min(...e.toArray(h.lengths(i)))}renderConfiguration(){return this.animationConfiguration!=null?{animation:{milliseconds:this.animationConfiguration.durationMs}}:undefined}}const f=":host{position:absolute;top:0;bottom:0;left:0;right:0;pointer-events:none}";const p=class{constructor(s){i(this,s);this.controllerChanged=t(this,"controllerChanged",7);this.animationsDisabled=false;this.animationMs=500;this.model=new u;this.stateMap={}}componentWillLoad(){this.setupController();this.setupInteractionHandler();this.setDepthBuffers()}connectedCallback(){this.setupInteractionHandler();this.setDepthBuffers()}disconnectedCallback(){this.clearInteractionHandler();this.resetDepthBuffers()}handleModeChange(){var i;(i=this.controller)===null||i===void 0?void 0:i.setTeleportMode(this.mode);if(this.mode!=null){this.setDepthBuffers()}else{this.resetDepthBuffers()}}handleViewerChanged(){this.clearInteractionHandler();this.setupInteractionHandler();this.setDepthBuffers()}handleAnimationMsChanged(){var i;if(this.animationMs!=null){(i=this.interactionHandler)===null||i===void 0?void 0:i.setAnimations({durationMs:this.animationMs})}}handleAnimationsDisabledChanged(){var i,t;if(this.animationsDisabled){(i=this.interactionHandler)===null||i===void 0?void 0:i.setAnimations(undefined)}else if(this.animationMs!=null){(t=this.interactionHandler)===null||t===void 0?void 0:t.setAnimations({durationMs:this.animationMs})}}handleControllerChanged(){this.setupInteractionHandler();this.setupController();this.controllerChanged.emit(this.controller)}handleModelChanged(){this.setupController();this.clearInteractionHandler();this.setupInteractionHandler()}render(){return s(n,null)}setupController(){if(this.controller==null){this.controller=new c(this.model);this.controller.setTeleportMode(this.mode);this.controllerChanged.emit(this.controller)}else{this.controller.setTeleportMode(this.mode);this.controller.updateModel(this.model)}}setDepthBuffers(){if(this.mode!=null&&this.viewer!=null&&this.viewer.depthBuffers==null){this.stateMap.shouldClearDepthBuffers=true;this.viewer.depthBuffers="final"}}resetDepthBuffers(){if(this.stateMap.shouldClearDepthBuffers&&this.viewer!=null){this.viewer.depthBuffers=undefined;this.stateMap.shouldClearDepthBuffers=undefined}}clearInteractionHandler(){var i,t;(i=this.interactionHandlerDisposable)===null||i===void 0?void 0:i.dispose();this.interactionHandlerDisposable=undefined;(t=this.interactionHandler)===null||t===void 0?void 0:t.dispose();this.interactionHandler=undefined}async setupInteractionHandler(){var i;if(this.interactionHandler==null){this.interactionHandler=new v(this.model,!this.animationsDisabled&&this.animationMs!=null?{durationMs:this.animationMs}:undefined);this.interactionHandlerDisposable=await((i=this.viewer)===null||i===void 0?void 0:i.registerInteractionHandler(this.interactionHandler))}}static get watchers(){return{mode:["handleModeChange"],viewer:["handleViewerChanged"],animationMs:["handleAnimationMsChanged"],animationsDisabled:["handleAnimationsDisabledChanged"],controller:["handleControllerChanged"],model:["handleModelChanged"]}}};p.style=f;export{p as vertex_viewer_teleport_tool};
5
- //# sourceMappingURL=p-0341e1de.entry.js.map
4
+ import{r as i,c as t,h as s,H as n}from"./p-50533a46.js";import{p as o,v as e,b as h,f as l,r as a}from"./p-9fe7814b.js";import{g as d}from"./p-9d132ba7.js";import{E as r}from"./p-cbbe7fa1.js";import{W as u,a as c}from"./p-f174e347.js";import"./p-05d09319.js";class v{constructor(i,t){this.model=i;this.animationConfiguration=t;this.rectObserver=new r;this.handlePointerDown=this.handlePointerDown.bind(this);this.handlePointerUp=this.handlePointerUp.bind(this);this.handleEnabledChange=this.handleEnabledChange.bind(this);this.handleTeleportModeChange=this.handleTeleportModeChange.bind(this);this.enabledChangeDisposable=this.model.onEnabledChange(this.handleEnabledChange)}dispose(){var i;this.disable();(i=this.enabledChangeDisposable)===null||i===void 0?void 0:i.dispose();this.element=undefined;this.api=undefined;this.rectObserver.disconnect()}initialize(i,t){this.element=i;this.api=t;this.rectObserver.observe(i);this.handleEnabledChange(this.model.getEnabled())}setAnimations(i){this.animationConfiguration=i}enable(){var i;this.disable();this.teleportModeChangeDisposable=this.model.onTeleportModeChange(this.handleTeleportModeChange);(i=this.element)===null||i===void 0?void 0:i.addEventListener("pointerdown",this.handlePointerDown);this.handleTeleportModeChange(this.model.getTeleportMode())}disable(){var i,t,s;(i=this.teleportModeChangeDisposable)===null||i===void 0?void 0:i.dispose();(t=this.cursorDisposable)===null||t===void 0?void 0:t.dispose();(s=this.element)===null||s===void 0?void 0:s.removeEventListener("pointerdown",this.handlePointerDown)}async handlePointerDown(i){this.downPosition=d(i,this.rectObserver.rect);this.downButtons=i.buttons;window.addEventListener("pointerup",this.handlePointerUp)}async handlePointerUp(i){var t,s;const n=this.model.getTeleportMode();const e=(s=(t=this.api)===null||t===void 0?void 0:t.pixelThreshold())!==null&&s!==void 0?s:2;const h=d(i,this.rectObserver.rect);const l=this.downButtons===2;const a=i.shiftKey||i.altKey||i.metaKey||i.ctrlKey;if(n!=null&&this.downPosition!=null&&o.distance(this.downPosition,h)<=e&&!l&&!a){switch(n){case"teleport":return this.teleportToHit(h);case"teleport-toward":return this.teleportTowardHit(h);case"teleport-and-align":return this.teleportAndAlign(h)}}this.downPosition=undefined;window.removeEventListener("pointerup",this.handlePointerUp)}async beginInteraction(){var i,t;if(!((i=this.api)===null||i===void 0?void 0:i.isInteracting())){await((t=this.api)===null||t===void 0?void 0:t.beginInteraction())}}async endInteraction(){var i;await((i=this.api)===null||i===void 0?void 0:i.endInteraction())}async teleportTowardHit(i){var t,s;const n=await((t=this.api)===null||t===void 0?void 0:t.getWorldPointFromViewport(i));const o=(s=this.api)===null||s===void 0?void 0:s.getRayFromPoint(i);if(o!=null){const{teleportDistancePercentage:i,teleportCollisionDistance:t}=this.model.getConfiguration();const s=i/100;return this.performInteraction((({camera:i,boundingBox:d})=>{const r=Math.max(...e.toArray(h.lengths(d)))*s;const u=l.fromNormalAndCoplanarPoint(i.up,i.position);const c=l.projectPoint(u,n!==null&&n!==void 0?n:i.position);const v=e.distance(i.position,c);if(v<r&&v>t*1.1){const s=a.create(Object.assign(Object.assign({},o),{origin:c}));const n=l.projectPoint(u,a.at(s,-t));return i.update({position:n,lookAt:e.add(i.lookAt,e.subtract(n,i.position))})}else{const t=l.projectPoint(u,a.at(o,r));return i.update({position:t,lookAt:e.add(i.lookAt,e.subtract(t,i.position))})}}))}}async teleportToHit(i){const t=await this.getWorldPointWithFallback(i);if(t!=null){return this.performInteraction((({camera:i,boundingBox:s})=>{const n=this.shortestLength(s);const o=this.model.getTeleportHeightPercentage()/100;const h=l.fromNormalAndCoplanarPoint(i.up,i.position);const d=l.projectPoint(h,t);const r=a.create({origin:i.position,direction:e.normalize(e.subtract(d,i.position))});const u=e.distance(i.position,d);const c=e.distance(i.position,i.lookAt);const v=a.at(r,u-n*o);const f=a.create({origin:v,direction:e.normalize(i.viewVector)});return i.update({position:v,lookAt:a.at(f,c)})}))}}async teleportAndAlign(i){var t;const s=await((t=this.api)===null||t===void 0?void 0:t.hitItems(i));const n=s!=null?s[0]:undefined;if((n===null||n===void 0?void 0:n.hitNormal)!=null&&(n===null||n===void 0?void 0:n.hitPoint)){await this.performInteraction((({camera:i,boundingBox:t})=>{const s=this.shortestLength(t);const o=this.model.getTeleportHeightPercentage()/100;const e=a.create({origin:n.hitPoint,direction:n.hitNormal});return i.alignTo(a.at(e,s*o),n.hitNormal)}))}}async performInteraction(i){var t;await this.beginInteraction();await((t=this.api)===null||t===void 0?void 0:t.transformCamera(i,this.renderConfiguration()));await this.endInteraction()}async getWorldPointWithFallback(i){var t,s;const n=await((t=this.api)===null||t===void 0?void 0:t.getWorldPointFromViewport(i));if(n==null){const t=await((s=this.api)===null||s===void 0?void 0:s.hitItems(i));const o=t!=null?t[0]:undefined;return(o===null||o===void 0?void 0:o.hitPoint)!=null?o.hitPoint:n}return n}handleEnabledChange(i){if(i){this.enable()}else{this.disable()}}handleTeleportModeChange(i){var t,s;(t=this.cursorDisposable)===null||t===void 0?void 0:t.dispose();if(i!=null){this.cursorDisposable=(s=this.api)===null||s===void 0?void 0:s.addCursor("crosshair")}}shortestLength(i){return Math.min(...e.toArray(h.lengths(i)))}renderConfiguration(){return this.animationConfiguration!=null?{animation:{milliseconds:this.animationConfiguration.durationMs}}:undefined}}const f=":host{position:absolute;top:0;bottom:0;left:0;right:0;pointer-events:none}";const p=class{constructor(s){i(this,s);this.controllerChanged=t(this,"controllerChanged",7);this.animationsDisabled=false;this.animationMs=500;this.model=new u;this.stateMap={}}componentWillLoad(){this.setupController();this.setupInteractionHandler();this.setDepthBuffers()}connectedCallback(){this.setupInteractionHandler();this.setDepthBuffers()}disconnectedCallback(){this.clearInteractionHandler();this.resetDepthBuffers()}handleModeChange(){var i;(i=this.controller)===null||i===void 0?void 0:i.setTeleportMode(this.mode);if(this.mode!=null){this.setDepthBuffers()}else{this.resetDepthBuffers()}}handleViewerChanged(){this.clearInteractionHandler();this.setupInteractionHandler();this.setDepthBuffers()}handleAnimationMsChanged(){var i;if(this.animationMs!=null){(i=this.interactionHandler)===null||i===void 0?void 0:i.setAnimations({durationMs:this.animationMs})}}handleAnimationsDisabledChanged(){var i,t;if(this.animationsDisabled){(i=this.interactionHandler)===null||i===void 0?void 0:i.setAnimations(undefined)}else if(this.animationMs!=null){(t=this.interactionHandler)===null||t===void 0?void 0:t.setAnimations({durationMs:this.animationMs})}}handleControllerChanged(){this.setupInteractionHandler();this.setupController();this.controllerChanged.emit(this.controller)}handleModelChanged(){this.setupController();this.clearInteractionHandler();this.setupInteractionHandler()}render(){return s(n,null)}setupController(){if(this.controller==null){this.controller=new c(this.model);this.controller.setTeleportMode(this.mode);this.controllerChanged.emit(this.controller)}else{this.controller.setTeleportMode(this.mode);this.controller.updateModel(this.model)}}setDepthBuffers(){if(this.mode!=null&&this.viewer!=null&&this.viewer.depthBuffers==null){this.stateMap.shouldClearDepthBuffers=true;this.viewer.depthBuffers="final"}}resetDepthBuffers(){if(this.stateMap.shouldClearDepthBuffers&&this.viewer!=null){this.viewer.depthBuffers=undefined;this.stateMap.shouldClearDepthBuffers=undefined}}clearInteractionHandler(){var i,t;(i=this.interactionHandlerDisposable)===null||i===void 0?void 0:i.dispose();this.interactionHandlerDisposable=undefined;(t=this.interactionHandler)===null||t===void 0?void 0:t.dispose();this.interactionHandler=undefined}async setupInteractionHandler(){var i;if(this.interactionHandler==null){this.interactionHandler=new v(this.model,!this.animationsDisabled&&this.animationMs!=null?{durationMs:this.animationMs}:undefined);this.interactionHandlerDisposable=await((i=this.viewer)===null||i===void 0?void 0:i.registerInteractionHandler(this.interactionHandler))}}static get watchers(){return{mode:["handleModeChange"],viewer:["handleViewerChanged"],animationMs:["handleAnimationMsChanged"],animationsDisabled:["handleAnimationsDisabledChanged"],controller:["handleControllerChanged"],model:["handleModelChanged"]}}};p.style=f;export{p as vertex_viewer_teleport_tool};
5
+ //# sourceMappingURL=p-b21c2231.entry.js.map
@@ -1,5 +1,5 @@
1
1
  /*!
2
2
  * Copyright (c) 2023 Vertex Software LLC. All rights reserved.
3
3
  */
4
- import{r as t,c as i,h as s,H as h,g as e}from"./p-50533a46.js";import{V as o,W as n,a as l}from"./p-4717fc39.js";import{v as d}from"./p-9fe7814b.js";import"./p-05d09319.js";function a(t){return t instanceof Element}class r{constructor(t){this.model=t;this.pressed={};this.handleKeyUp=async t=>{const i=t.key.toLocaleLowerCase();this.pressed=Object.keys(this.pressed).filter((t=>t!==i)).reduce(((t,i)=>Object.assign(Object.assign({},t),{[i]:true})),{});if(Object.keys(this.pressed).length===0&&this.interval!=null){this.endInteraction()}};this.endInteraction=async()=>{var t;this.clearInterval();await((t=this.api)===null||t===void 0?void 0:t.endInteraction())};this.handleKeyDown=this.handleKeyDown.bind(this);this.handleKeyUp=this.handleKeyUp.bind(this);this.handleEnabledChange=this.handleEnabledChange.bind(this);this.restartInteraction=this.restartInteraction.bind(this);this.updateCamera=this.updateCamera.bind(this);this.handlers={[o.MOVE_DOWN]:this.moveDown.bind(this),[o.MOVE_UP]:this.moveUp.bind(this),[o.PIVOT_DOWN]:this.pivotDown.bind(this),[o.PIVOT_LEFT]:this.pivotLeft.bind(this),[o.PIVOT_RIGHT]:this.pivotRight.bind(this),[o.PIVOT_UP]:this.pivotUp.bind(this),[o.WALK_BACKWARD]:this.walkBackward.bind(this),[o.WALK_FORWARD]:this.walkForward.bind(this),[o.WALK_LEFT]:this.walkLeft.bind(this),[o.WALK_RIGHT]:this.walkRight.bind(this)};this.enabledChangeDisposable=this.model.onEnabledChange(this.handleEnabledChange);this.keyBindingsChangeDisposable=this.model.onKeyBindingsChange(this.restartInteraction);this.configurationChangeDisposable=this.model.onConfigurationChange(this.restartInteraction)}dispose(){var t,i,s;this.disable();(t=this.enabledChangeDisposable)===null||t===void 0?void 0:t.dispose();(i=this.keyBindingsChangeDisposable)===null||i===void 0?void 0:i.dispose();(s=this.configurationChangeDisposable)===null||s===void 0?void 0:s.dispose();window.removeEventListener("keydown",this.handleKeyDown);window.removeEventListener("keyup",this.handleKeyUp)}initialize(t,i){this.api=i;this.handleEnabledChange(this.model.getEnabled())}enable(){this.disable();window.addEventListener("keydown",this.handleKeyDown);window.addEventListener("keyup",this.handleKeyUp)}disable(){window.removeEventListener("keydown",this.handleKeyDown);window.removeEventListener("keyup",this.handleKeyUp)}handleKeyDown(t){const i=t.key.toLowerCase();const s=a(t.target)&&this.model.isElementExcluded(t.target);if(!t.repeat&&!s){this.pressed=Object.assign(Object.assign({},this.pressed),{[i]:true});this.tryBeginInteraction()}}handleEnabledChange(t){if(t){this.enable()}else{this.disable()}}restartInteraction(){this.clearInterval();this.tryBeginInteraction()}tryBeginInteraction(){if(Object.keys(this.pressed).length>0&&this.someOperationMatches()){this.beginInteraction()}}beginInteraction(){var t,i;if(!((t=this.api)===null||t===void 0?void 0:t.isInteracting())){(i=this.api)===null||i===void 0?void 0:i.beginInteraction()}if(this.interval==null){this.interval=setInterval(this.updateCamera,this.model.getKeyboardRepeatInterval())}}clearInterval(){if(this.interval!=null){clearInterval(this.interval);this.interval=undefined}}updateCamera(){Object.keys(this.handlers).forEach((t=>{const i=t;if(this.model.operationMatches(i,this.pressed)){this.handlers[i]()}}))}someOperationMatches(){return Object.keys(this.handlers).some((t=>this.model.operationMatches(t,this.pressed)))}pivotLeft(){var t;(t=this.api)===null||t===void 0?void 0:t.pivotCamera(0,this.model.getKeyboardPivotDegrees())}pivotRight(){var t;(t=this.api)===null||t===void 0?void 0:t.pivotCamera(0,-this.model.getKeyboardPivotDegrees())}pivotUp(){var t;(t=this.api)===null||t===void 0?void 0:t.pivotCamera(-this.model.getKeyboardPivotDegrees(),0)}pivotDown(){var t;(t=this.api)===null||t===void 0?void 0:t.pivotCamera(this.model.getKeyboardPivotDegrees(),0)}walkForward(){var t;(t=this.api)===null||t===void 0?void 0:t.walk(d.scale(this.relativeWalkSpeed(),d.forward()))}walkBackward(){var t;(t=this.api)===null||t===void 0?void 0:t.walk(d.scale(this.relativeWalkSpeed(),d.back()))}walkLeft(){var t;(t=this.api)===null||t===void 0?void 0:t.walk(d.scale(this.relativeWalkSpeed(),d.left()))}walkRight(){var t;(t=this.api)===null||t===void 0?void 0:t.walk(d.scale(this.relativeWalkSpeed(),d.right()))}moveUp(){var t;(t=this.api)===null||t===void 0?void 0:t.walk(d.scale(this.relativeWalkSpeed(),d.down()))}moveDown(){var t;(t=this.api)===null||t===void 0?void 0:t.walk(d.scale(this.relativeWalkSpeed(),d.up()))}relativeWalkSpeed(){return this.model.getKeyboardWalkSpeed()/500}}const v=":host{position:absolute;top:0;bottom:0;left:0;right:0;pointer-events:none}";const u=class{constructor(s){t(this,s);this.controllerChanged=i(this,"controllerChanged",7);this.model=new n;this.enabled=true;this.stateMap={}}componentWillLoad(){this.setupController();this.setupInteractionHandler()}async componentDidLoad(){await this.ensureTeleportToolConfigured();this.updateTeleportTool();await this.setPivotInteractionMode()}connectedCallback(){this.setupInteractionHandler();this.setPivotInteractionMode()}disconnectedCallback(){this.clearInteractionHandler();this.resetInteractionMode()}handleEnabledChanged(){var t;(t=this.controller)===null||t===void 0?void 0:t.setEnabled(this.enabled);this.toggleInteractionMode()}handleViewerChanged(){this.clearInteractionHandler();this.setupInteractionHandler();this.updateTeleportTool();this.toggleInteractionMode()}handleTeleportModeChanged(){this.updateTeleportTool()}handleControllerChanged(){this.updateTeleportTool();this.controllerChanged.emit(this.controller)}handleModelChanged(){this.setupController();this.clearInteractionHandler();this.setupInteractionHandler()}render(){return s(h,null,s("slot",{name:"teleport-tool",onSlotchange:async()=>{await this.ensureTeleportToolConfigured();this.updateTeleportTool()}}))}setupController(){if(this.controller==null){this.controller=new l(this.model);this.controllerChanged.emit(this.controller)}else{this.controller.updateModel(this.model)}}clearInteractionHandler(){var t,i;(t=this.interactionHandlerDisposable)===null||t===void 0?void 0:t.dispose();this.interactionHandlerDisposable=undefined;(i=this.interactionHandler)===null||i===void 0?void 0:i.dispose();this.interactionHandler=undefined}async setupInteractionHandler(){var t;if(this.interactionHandler==null){this.interactionHandler=new r(this.model);this.interactionHandlerDisposable=await((t=this.viewer)===null||t===void 0?void 0:t.registerInteractionHandler(this.interactionHandler))}}async ensureTeleportToolConfigured(){var t,i,s,h,e;if(this.hostEl!=null){const o=(i=(t=this.hostEl)===null||t===void 0?void 0:t.querySelector('vertex-viewer-teleport-tool[slot="teleport-tool"]'))!==null&&i!==void 0?i:undefined;const n=(o===null||o===void 0?void 0:o.tagName)==="VERTEX-VIEWER-TELEPORT-TOOL"?o:undefined;if(n!=null){this.stateMap.teleportTool=n}else{const t=(e=(h=(s=this.hostEl)===null||s===void 0?void 0:s.shadowRoot)===null||h===void 0?void 0:h.querySelector('slot[name="teleport-tool"]'))!==null&&e!==void 0?e:undefined;this.stateMap.teleportTool=document.createElement("vertex-viewer-teleport-tool");t===null||t===void 0?void 0:t.appendChild(this.stateMap.teleportTool)}}}updateTeleportTool(){if(this.stateMap.teleportTool!=null){this.stateMap.teleportTool.viewer=this.viewer;this.stateMap.teleportTool.controller=this.controller;this.stateMap.teleportTool.model=this.model;this.stateMap.teleportTool.mode=this.teleportMode}}toggleInteractionMode(){if(this.enabled){this.setPivotInteractionMode()}else{this.resetInteractionMode()}}async setPivotInteractionMode(){var t;const i=await((t=this.viewer)===null||t===void 0?void 0:t.getBaseInteractionHandler());if(this.enabled&&i!=null){const t=i.getPrimaryInteractionType();this.stateMap.previousPrimaryInteractionType=t==="pivot"?this.stateMap.previousPrimaryInteractionType:t;i.setPrimaryInteractionType("pivot")}}async resetInteractionMode(){var t;const i=await((t=this.viewer)===null||t===void 0?void 0:t.getBaseInteractionHandler());if(i!=null&&i.getPrimaryInteractionType()==="pivot"&&this.stateMap.previousPrimaryInteractionType!=null){i.setPrimaryInteractionType(this.stateMap.previousPrimaryInteractionType);this.stateMap.previousPrimaryInteractionType=undefined}}get hostEl(){return e(this)}static get watchers(){return{enabled:["handleEnabledChanged"],viewer:["handleViewerChanged"],teleportMode:["handleTeleportModeChanged"],controller:["handleControllerChanged"],model:["handleModelChanged"]}}};u.style=v;export{u as vertex_viewer_walk_mode_tool};
5
- //# sourceMappingURL=p-3d2d8431.entry.js.map
4
+ import{r as t,c as i,h as s,H as h,g as e}from"./p-50533a46.js";import{V as o,W as n,a as l}from"./p-f174e347.js";import{v as d}from"./p-9fe7814b.js";import"./p-05d09319.js";function a(t){return t instanceof Element}class r{constructor(t){this.model=t;this.pressed={};this.handleKeyUp=async t=>{const i=t.key.toLocaleLowerCase();this.pressed=Object.keys(this.pressed).filter((t=>t!==i)).reduce(((t,i)=>Object.assign(Object.assign({},t),{[i]:true})),{});if(Object.keys(this.pressed).length===0&&this.interval!=null){this.endInteraction()}};this.endInteraction=async()=>{var t;this.clearInterval();await((t=this.api)===null||t===void 0?void 0:t.endInteraction())};this.handleKeyDown=this.handleKeyDown.bind(this);this.handleKeyUp=this.handleKeyUp.bind(this);this.handleEnabledChange=this.handleEnabledChange.bind(this);this.restartInteraction=this.restartInteraction.bind(this);this.updateCamera=this.updateCamera.bind(this);this.handlers={[o.MOVE_DOWN]:this.moveDown.bind(this),[o.MOVE_UP]:this.moveUp.bind(this),[o.PIVOT_DOWN]:this.pivotDown.bind(this),[o.PIVOT_LEFT]:this.pivotLeft.bind(this),[o.PIVOT_RIGHT]:this.pivotRight.bind(this),[o.PIVOT_UP]:this.pivotUp.bind(this),[o.WALK_BACKWARD]:this.walkBackward.bind(this),[o.WALK_FORWARD]:this.walkForward.bind(this),[o.WALK_LEFT]:this.walkLeft.bind(this),[o.WALK_RIGHT]:this.walkRight.bind(this)};this.enabledChangeDisposable=this.model.onEnabledChange(this.handleEnabledChange);this.keyBindingsChangeDisposable=this.model.onKeyBindingsChange(this.restartInteraction);this.configurationChangeDisposable=this.model.onConfigurationChange(this.restartInteraction)}dispose(){var t,i,s;this.disable();(t=this.enabledChangeDisposable)===null||t===void 0?void 0:t.dispose();(i=this.keyBindingsChangeDisposable)===null||i===void 0?void 0:i.dispose();(s=this.configurationChangeDisposable)===null||s===void 0?void 0:s.dispose();window.removeEventListener("keydown",this.handleKeyDown);window.removeEventListener("keyup",this.handleKeyUp)}initialize(t,i){this.api=i;this.handleEnabledChange(this.model.getEnabled())}enable(){this.disable();window.addEventListener("keydown",this.handleKeyDown);window.addEventListener("keyup",this.handleKeyUp)}disable(){window.removeEventListener("keydown",this.handleKeyDown);window.removeEventListener("keyup",this.handleKeyUp)}handleKeyDown(t){const i=t.key.toLowerCase();const s=a(t.target)&&this.model.isElementExcluded(t.target);if(!t.repeat&&!s){this.pressed=Object.assign(Object.assign({},this.pressed),{[i]:true});this.tryBeginInteraction()}}handleEnabledChange(t){if(t){this.enable()}else{this.disable()}}restartInteraction(){this.clearInterval();this.tryBeginInteraction()}tryBeginInteraction(){if(Object.keys(this.pressed).length>0&&this.someOperationMatches()){this.beginInteraction()}}beginInteraction(){var t,i;if(!((t=this.api)===null||t===void 0?void 0:t.isInteracting())){(i=this.api)===null||i===void 0?void 0:i.beginInteraction()}if(this.interval==null){this.interval=setInterval(this.updateCamera,this.model.getKeyboardRepeatInterval())}}clearInterval(){if(this.interval!=null){clearInterval(this.interval);this.interval=undefined}}updateCamera(){Object.keys(this.handlers).forEach((t=>{const i=t;if(this.model.operationMatches(i,this.pressed)){this.handlers[i]()}}))}someOperationMatches(){return Object.keys(this.handlers).some((t=>this.model.operationMatches(t,this.pressed)))}pivotLeft(){var t;(t=this.api)===null||t===void 0?void 0:t.pivotCamera(0,this.model.getKeyboardPivotDegrees())}pivotRight(){var t;(t=this.api)===null||t===void 0?void 0:t.pivotCamera(0,-this.model.getKeyboardPivotDegrees())}pivotUp(){var t;(t=this.api)===null||t===void 0?void 0:t.pivotCamera(-this.model.getKeyboardPivotDegrees(),0)}pivotDown(){var t;(t=this.api)===null||t===void 0?void 0:t.pivotCamera(this.model.getKeyboardPivotDegrees(),0)}walkForward(){var t;(t=this.api)===null||t===void 0?void 0:t.walk(d.scale(this.relativeWalkSpeed(),d.forward()))}walkBackward(){var t;(t=this.api)===null||t===void 0?void 0:t.walk(d.scale(this.relativeWalkSpeed(),d.back()))}walkLeft(){var t;(t=this.api)===null||t===void 0?void 0:t.walk(d.scale(this.relativeWalkSpeed(),d.left()))}walkRight(){var t;(t=this.api)===null||t===void 0?void 0:t.walk(d.scale(this.relativeWalkSpeed(),d.right()))}moveUp(){var t;(t=this.api)===null||t===void 0?void 0:t.walk(d.scale(this.relativeWalkSpeed(),d.down()))}moveDown(){var t;(t=this.api)===null||t===void 0?void 0:t.walk(d.scale(this.relativeWalkSpeed(),d.up()))}relativeWalkSpeed(){return this.model.getKeyboardWalkSpeed()/500}}const v=":host{position:absolute;top:0;bottom:0;left:0;right:0;pointer-events:none}";const u=class{constructor(s){t(this,s);this.controllerChanged=i(this,"controllerChanged",7);this.model=new n;this.enabled=true;this.stateMap={}}componentWillLoad(){this.setupController();this.setupInteractionHandler()}async componentDidLoad(){await this.ensureTeleportToolConfigured();this.updateTeleportTool();await this.setPivotInteractionMode()}connectedCallback(){this.setupInteractionHandler();this.setPivotInteractionMode()}disconnectedCallback(){this.clearInteractionHandler();this.resetInteractionMode()}handleEnabledChanged(){var t;(t=this.controller)===null||t===void 0?void 0:t.setEnabled(this.enabled);this.toggleInteractionMode()}handleViewerChanged(){this.clearInteractionHandler();this.setupInteractionHandler();this.updateTeleportTool();this.toggleInteractionMode()}handleTeleportModeChanged(){this.updateTeleportTool()}handleControllerChanged(){this.updateTeleportTool();this.controllerChanged.emit(this.controller)}handleModelChanged(){this.setupController();this.clearInteractionHandler();this.setupInteractionHandler()}render(){return s(h,null,s("slot",{name:"teleport-tool",onSlotchange:async()=>{await this.ensureTeleportToolConfigured();this.updateTeleportTool()}}))}setupController(){if(this.controller==null){this.controller=new l(this.model);this.controllerChanged.emit(this.controller)}else{this.controller.updateModel(this.model)}}clearInteractionHandler(){var t,i;(t=this.interactionHandlerDisposable)===null||t===void 0?void 0:t.dispose();this.interactionHandlerDisposable=undefined;(i=this.interactionHandler)===null||i===void 0?void 0:i.dispose();this.interactionHandler=undefined}async setupInteractionHandler(){var t;if(this.interactionHandler==null){this.interactionHandler=new r(this.model);this.interactionHandlerDisposable=await((t=this.viewer)===null||t===void 0?void 0:t.registerInteractionHandler(this.interactionHandler))}}async ensureTeleportToolConfigured(){var t,i,s,h,e;if(this.hostEl!=null){const o=(i=(t=this.hostEl)===null||t===void 0?void 0:t.querySelector('vertex-viewer-teleport-tool[slot="teleport-tool"]'))!==null&&i!==void 0?i:undefined;const n=(o===null||o===void 0?void 0:o.tagName)==="VERTEX-VIEWER-TELEPORT-TOOL"?o:undefined;if(n!=null){this.stateMap.teleportTool=n}else{const t=(e=(h=(s=this.hostEl)===null||s===void 0?void 0:s.shadowRoot)===null||h===void 0?void 0:h.querySelector('slot[name="teleport-tool"]'))!==null&&e!==void 0?e:undefined;this.stateMap.teleportTool=document.createElement("vertex-viewer-teleport-tool");t===null||t===void 0?void 0:t.appendChild(this.stateMap.teleportTool)}}}updateTeleportTool(){if(this.stateMap.teleportTool!=null){this.stateMap.teleportTool.viewer=this.viewer;this.stateMap.teleportTool.controller=this.controller;this.stateMap.teleportTool.model=this.model;this.stateMap.teleportTool.mode=this.teleportMode}}toggleInteractionMode(){if(this.enabled){this.setPivotInteractionMode()}else{this.resetInteractionMode()}}async setPivotInteractionMode(){var t;const i=await((t=this.viewer)===null||t===void 0?void 0:t.getBaseInteractionHandler());if(this.enabled&&i!=null){const t=i.getPrimaryInteractionType();this.stateMap.previousPrimaryInteractionType=t==="pivot"?this.stateMap.previousPrimaryInteractionType:t;i.setPrimaryInteractionType("pivot")}}async resetInteractionMode(){var t;const i=await((t=this.viewer)===null||t===void 0?void 0:t.getBaseInteractionHandler());if(i!=null&&i.getPrimaryInteractionType()==="pivot"&&this.stateMap.previousPrimaryInteractionType!=null){i.setPrimaryInteractionType(this.stateMap.previousPrimaryInteractionType);this.stateMap.previousPrimaryInteractionType=undefined}}get hostEl(){return e(this)}static get watchers(){return{enabled:["handleEnabledChanged"],viewer:["handleViewerChanged"],teleportMode:["handleTeleportModeChanged"],controller:["handleControllerChanged"],model:["handleModelChanged"]}}};u.style=v;export{u as vertex_viewer_walk_mode_tool};
5
+ //# sourceMappingURL=p-e735e66c.entry.js.map