@vertexvis/viewer 0.17.5-testing.4 → 0.17.5

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 (71) hide show
  1. package/README.template.md +3 -3
  2. package/dist/cjs/{controller-4e9ef328.js → controller-c7c4f333.js} +6 -6
  3. package/dist/cjs/controller-c7c4f333.js.map +1 -0
  4. package/dist/cjs/index.cjs.js +2 -2
  5. package/dist/cjs/{scene-9762fef8.js → scene-4425281f.js} +6 -3
  6. package/dist/cjs/scene-4425281f.js.map +1 -0
  7. package/dist/cjs/vertex-scene-tree-search_3.cjs.entry.js +1 -3
  8. package/dist/cjs/vertex-scene-tree-search_3.cjs.entry.js.map +1 -1
  9. package/dist/cjs/vertex-scene-tree.cjs.entry.js +1 -1
  10. package/dist/cjs/vertex-viewer-pin-group.cjs.entry.js +1 -1
  11. package/dist/cjs/vertex-viewer.cjs.entry.js +13 -10
  12. package/dist/cjs/vertex-viewer.cjs.entry.js.map +1 -1
  13. package/dist/collection/components/scene-tree/lib/controller.js +5 -5
  14. package/dist/collection/components/scene-tree/lib/controller.js.map +1 -1
  15. package/dist/collection/components/scene-tree-table-layout/scene-tree-table-layout.js +1 -3
  16. package/dist/collection/components/scene-tree-table-layout/scene-tree-table-layout.js.map +1 -1
  17. package/dist/collection/components/viewer/viewer.js +3 -3
  18. package/dist/collection/components/viewer/viewer.js.map +1 -1
  19. package/dist/collection/lib/interactions/interactionApiOrthographic.js +5 -4
  20. package/dist/collection/lib/interactions/interactionApiOrthographic.js.map +1 -1
  21. package/dist/collection/lib/interactions/interactionApiPerspective.js +4 -3
  22. package/dist/collection/lib/interactions/interactionApiPerspective.js.map +1 -1
  23. package/dist/collection/lib/interactions/multiTouchInteractionHandler.js +3 -2
  24. package/dist/collection/lib/interactions/multiTouchInteractionHandler.js.map +1 -1
  25. package/dist/collection/lib/types/loadableResource.js +5 -2
  26. package/dist/collection/lib/types/loadableResource.js.map +1 -1
  27. package/dist/collection/testing/viewer.js +2 -2
  28. package/dist/collection/testing/viewer.js.map +1 -1
  29. package/dist/custom-elements/index.js +23 -19
  30. package/dist/custom-elements/index.js.map +1 -1
  31. package/dist/esm/{controller-53f803d9.js → controller-bbcc1700.js} +6 -6
  32. package/dist/esm/controller-bbcc1700.js.map +1 -0
  33. package/dist/esm/index.js +2 -2
  34. package/dist/esm/index.mjs +2 -2
  35. package/dist/esm/{scene-1bd307f3.js → scene-31d88655.js} +6 -3
  36. package/dist/esm/scene-31d88655.js.map +1 -0
  37. package/dist/esm/vertex-scene-tree-search_3.entry.js +1 -3
  38. package/dist/esm/vertex-scene-tree-search_3.entry.js.map +1 -1
  39. package/dist/esm/vertex-scene-tree.entry.js +1 -1
  40. package/dist/esm/vertex-viewer-pin-group.entry.js +1 -1
  41. package/dist/esm/vertex-viewer.entry.js +13 -10
  42. package/dist/esm/vertex-viewer.entry.js.map +1 -1
  43. package/dist/types/components/viewer/viewer.d.ts +2 -2
  44. package/dist/types/components.d.ts +3 -3
  45. package/dist/types/testing/viewer.d.ts +2 -2
  46. package/dist/viewer/index.esm.js +1 -1
  47. package/dist/viewer/{p-921ec41b.js → p-3d19b37e.js} +2 -2
  48. package/dist/viewer/p-3d19b37e.js.map +1 -0
  49. package/dist/viewer/p-43eb668e.js +5 -0
  50. package/dist/viewer/p-43eb668e.js.map +1 -0
  51. package/dist/viewer/{p-951a2e08.entry.js → p-5ce0269a.entry.js} +2 -2
  52. package/dist/viewer/p-5ce0269a.entry.js.map +1 -0
  53. package/dist/viewer/{p-1815d19b.entry.js → p-6114701c.entry.js} +2 -2
  54. package/dist/viewer/p-8f16e792.entry.js +5 -0
  55. package/dist/viewer/p-8f16e792.entry.js.map +1 -0
  56. package/dist/viewer/{p-9b8dae4a.entry.js → p-d256624d.entry.js} +2 -2
  57. package/dist/viewer/viewer.esm.js +1 -1
  58. package/package.json +7 -7
  59. package/readme.md +7 -7
  60. package/dist/cjs/controller-4e9ef328.js.map +0 -1
  61. package/dist/cjs/scene-9762fef8.js.map +0 -1
  62. package/dist/esm/controller-53f803d9.js.map +0 -1
  63. package/dist/esm/scene-1bd307f3.js.map +0 -1
  64. package/dist/viewer/p-27a5034e.entry.js +0 -5
  65. package/dist/viewer/p-27a5034e.entry.js.map +0 -1
  66. package/dist/viewer/p-921ec41b.js.map +0 -1
  67. package/dist/viewer/p-951a2e08.entry.js.map +0 -1
  68. package/dist/viewer/p-c3be5b4d.js +0 -5
  69. package/dist/viewer/p-c3be5b4d.js.map +0 -1
  70. /package/dist/viewer/{p-1815d19b.entry.js.map → p-6114701c.entry.js.map} +0 -0
  71. /package/dist/viewer/{p-9b8dae4a.entry.js.map → p-d256624d.entry.js.map} +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"viewer.js","sourceRoot":"","sources":["../../../src/components/viewer/viewer.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n Element,\n Event,\n EventEmitter,\n h,\n Host,\n Listen,\n Method,\n Prop,\n State,\n Watch,\n} from '@stencil/core';\nimport { Dimensions, Point } from '@vertexvis/geometry';\nimport { toProtoDuration, WebSocketClientImpl } from '@vertexvis/stream-api';\nimport { Color, Disposable, EventDispatcher, UUID } from '@vertexvis/utils';\nimport classnames from 'classnames';\n\nimport {\n FeatureHighlightOptions,\n FeatureLineOptions,\n FrameType,\n PhantomOptions,\n SelectionHighlightingOptions,\n StreamAttributes,\n} from '../../interfaces';\nimport { Config, parseConfig, PartialConfig } from '../../lib/config';\nimport { Cursor, CursorManager } from '../../lib/cursors';\nimport { cssCursor } from '../../lib/dom';\nimport { Environment } from '../../lib/environment';\nimport {\n ComponentInitializationError,\n InteractionHandlerError,\n ViewerInitializationError,\n} from '../../lib/errors';\nimport {\n InteractionApiOrthographic,\n InteractionApiPerspective,\n} from '../../lib/interactions';\nimport { BaseInteractionHandler } from '../../lib/interactions/baseInteractionHandler';\nimport { FlyToPartKeyInteraction } from '../../lib/interactions/flyToPartKeyInteraction';\nimport { FlyToPositionKeyInteraction } from '../../lib/interactions/flyToPositionKeyInteraction';\nimport { InteractionApi } from '../../lib/interactions/interactionApi';\nimport { InteractionHandler } from '../../lib/interactions/interactionHandler';\nimport { KeyInteraction } from '../../lib/interactions/keyInteraction';\nimport { MouseInteractionHandler } from '../../lib/interactions/mouseInteractionHandler';\nimport { MultiPointerInteractionHandler } from '../../lib/interactions/multiPointerInteractionHandler';\nimport { PointerInteractionHandler } from '../../lib/interactions/pointerInteractionHandler';\nimport { TapEventDetails } from '../../lib/interactions/tapEventDetails';\nimport { TapInteractionHandler } from '../../lib/interactions/tapInteractionHandler';\nimport { TouchInteractionHandler } from '../../lib/interactions/touchInteractionHandler';\nimport { fromPbFrameOrThrow } from '../../lib/mappers';\nimport { paintTime, Timing } from '../../lib/meters';\nimport {\n CanvasRenderer,\n createCanvasRenderer,\n measureCanvasRenderer,\n} from '../../lib/rendering';\nimport { Scene } from '../../lib/scenes/scene';\nimport {\n getStorageEntry,\n StorageKeys,\n upsertStorageEntry,\n} from '../../lib/storage';\nimport {\n Connected,\n Connecting,\n ConnectionFailed,\n Disconnected,\n ViewerStreamState,\n} from '../../lib/stream/state';\nimport { ViewerStream } from '../../lib/stream/stream';\nimport {\n FrameCamera,\n Orientation,\n SceneViewSummary,\n StencilBufferManager,\n Viewport,\n} from '../../lib/types';\nimport { Frame } from '../../lib/types/frame';\nimport { FrameCameraType } from '../../lib/types/frameCamera';\nimport {\n DEFAULT_VIEWER_SCENE_WAIT_MS,\n getElementBackgroundColor,\n getElementBoundingClientRect,\n} from './utils';\n\ninterface ConnectedStatus {\n jwt: string;\n status: 'connected';\n}\n\ninterface ConnectingStatus {\n status: 'connecting';\n}\n\ninterface DisconnectedStatus {\n status: 'disconnected';\n}\n\ninterface ConnectionFailedStatus {\n status: 'connection-failed';\n errorMessage: string;\n}\n\n/**\n * Internal state values for the component. Used to preserve values across live\n * reload refreshes.\n */\ninterface StateMap {\n streamWorldOrientation?: Orientation;\n cursorManager: CursorManager;\n interactionTarget?: HTMLElement;\n streamState: ViewerStreamState;\n streamListeners?: Disposable;\n}\n\n/** @internal */\nexport type ConnectionStatus =\n | ConnectingStatus\n | ConnectedStatus\n | DisconnectedStatus\n | ConnectionFailedStatus;\n\n@Component({\n tag: 'vertex-viewer',\n styleUrl: 'viewer.css',\n shadow: true,\n})\nexport class Viewer {\n @Element() private hostElement!: HTMLVertexViewerElement;\n\n /**\n * A URN of the scene resource to load when the component is mounted in the\n * DOM tree. The specified resource is a URN in the following format:\n *\n * * `urn:vertexvis:scene:<sceneid>`\n */\n @Prop() public src?: string;\n\n /**\n * The Client ID associated with your Vertex Application.\n */\n @Prop() public clientId?: string;\n\n /**\n * Property used for internals or testing.\n *\n * @private\n * @internal\n */\n @Prop({ mutable: true }) public deviceId?: string;\n\n /**\n * An object or JSON encoded string that defines configuration settings for\n * the viewer.\n */\n @Prop() public config?: PartialConfig | string;\n\n /**\n * Sets the default environment for the viewer. This setting is used for\n * auto-configuring network hosts.\n *\n * Use the `config` property for manually setting hosts.\n *\n * @see Viewer.config\n */\n @Prop() public configEnv: Environment = 'platprod';\n\n /**\n * @internal\n */\n @Prop({ mutable: true }) public resolvedConfig?: Config;\n\n /**\n * Enables or disables the default mouse and touch interactions provided by\n * the viewer. Enabled by default.\n */\n @Prop() public cameraControls = true;\n\n /**\n * The type of camera model to represent the scene with. Can be either\n * `perspective` or `orthographic`, and defaults to `perspective`.\n */\n @Prop({ mutable: true, reflect: true }) public cameraType: FrameCameraType =\n 'perspective';\n\n /**\n * Enables or disables the default keyboard shortcut interactions provided by\n * the viewer. Enabled by default, requires `cameraControls` being enabled.\n *\n */\n @Prop() public keyboardControls = true;\n\n /**\n * Enables or disables the default rotation interaction being changed to\n * rotate around the pointer down location.\n */\n @Prop() public rotateAroundTapPoint = true;\n\n /**\n * A token that can be used to make API calls to other Vertex services.\n *\n * @internal\n */\n @Prop({ mutable: true }) public token?: string;\n\n /**\n * Specifies when a depth buffer is requested from rendering. Possible values\n * are:\n *\n * * `undefined`: A depth buffer is never requested.\n * * `final`: A depth buffer is only requested on the final frame.\n * * `all`: A depth buffer is requested for every frame.\n *\n * Depth buffers can increase the amount of data that's sent to a client and\n * can impact rendering performance. Values of `undefined` or `final` should\n * be used when needing the highest rendering performance.\n */\n @Prop() public depthBuffers?: FrameType;\n\n /**\n * Specifies the opacity, between 0 and 100, for an experimental ghosting\n * feature. When the value is non-zero, any scene items that are hidden will\n * be appear translucent.\n *\n * **Note:** This feature is experimental, and may cause slower frame rates.\n */\n @Prop() public experimentalGhostingOpacity = 0;\n\n /**\n * Specifies how phantom parts should appear.\n * The opacity must be between 0 and 1, where 0 is completely hidden and 1 is completely visible.\n */\n @Prop({ attribute: null })\n public phantom?: PhantomOptions = { opacity: 0.1 };\n\n /**\n * Specifies whether to use the default lights for the scene. When false, default\n * lights are used. When true, no default lights are used, and the lights must\n * be specified separately.\n */\n @Prop() public noDefaultLights = false;\n\n /**\n * @private\n * @internal\n * Specifies experimental rendering options. For Vertex use only.\n */\n @Prop() public experimentalRenderingOptions = '';\n\n /**\n * Specifies if and how to render feature lines.\n */\n @Prop({ attribute: null }) public featureLines?: FeatureLineOptions;\n\n /**\n * Specifies the halo selection properties.\n * Parameter notes:\n * lineWidth values supported currently are 0-5. This width is currently the value x2. For example, 1 will have a pixel width of 2.\n * color is optional. This will be the color of the selected items in the viewer.\n * opacity is also optional. The opacity will be applied to everything selected besides the highlighted outer line.\n */\n @Prop({ attribute: null })\n public selectionHighlighting?: SelectionHighlightingOptions;\n\n /**\n * Specifies how selected features should be highlighted.\n */\n @Prop({ attribute: null })\n public featureHighlighting?: FeatureHighlightOptions;\n\n /**\n * Specifies when a feature map is returned from rendering. Feature maps\n * include information about the surfaces, edges and cross sections that are\n * in a frame.\n *\n * Possible values are:\n *\n * * `undefined`: A feature map is never requested.\n * * `final`: A feature map is only requested on the final frame.\n * * `all`: A feature map is requested for every frame.\n *\n * Feature maps can increase the amount of data that's sent to a client and\n * can impact rendering performance. Values of `undefined` or `final` should\n * be used when needing the highest rendering performance.\n */\n @Prop() public featureMaps?: FrameType;\n\n /**\n * An optional value that will debounce frame updates when resizing\n * this viewer element.\n */\n @Prop() public resizeDebounce = 100;\n\n /**\n * The last frame that was received, which can be used to inspect the scene\n * and camera information.\n *\n * @readonly\n */\n @Prop({ mutable: true }) public frame: Frame | undefined;\n\n /**\n * @internal\n */\n @Prop({ mutable: true }) public stream?: ViewerStream;\n\n /**\n * @internal\n */\n @Prop({ mutable: true })\n public stencilBuffer: StencilBufferManager = new StencilBufferManager(\n this.hostElement\n );\n\n /**\n * Represents the current viewport of the viewer. The viewport represents the\n * dimensions of the canvas where a frame is rendered. It contains methods for\n * translating between viewport coordinates, frame coordinates and world\n * coordinates.\n */\n @Prop({ mutable: true })\n public viewport: Viewport = Viewport.fromDimensions(Dimensions.create(0, 0));\n\n /**\n * Emits an event whenever the user taps or clicks a location in the viewer.\n * The event includes the location of the tap or click.\n */\n @Event() public tap!: EventEmitter<TapEventDetails>;\n\n /**\n * Emits an event whenever the user double taps or clicks a location in the viewer.\n * The event includes the location of the first tap or click.\n */\n @Event() public doubletap!: EventEmitter<TapEventDetails>;\n\n /**\n * Emits an event whenever the user taps or clicks a location in the viewer and the\n * configured amount of time passes without receiving a mouseup or touchend.\n * The event includes the location of the tap or click.\n */\n @Event() public longpress!: EventEmitter<TapEventDetails>;\n\n /**\n * Emits an event when a frame has been received by the viewer. The event\n * will include details about the drawn frame, such as the `Scene` information\n * related to the scene.\n */\n @Event() public frameReceived!: EventEmitter<Frame>;\n\n /**\n * Emits an event when a frame has been drawn to the viewer's canvas. The event\n * will include details about the drawn frame, such as the `Scene` information\n * related to the scene.\n */\n @Event() public frameDrawn!: EventEmitter<Frame>;\n\n /**\n * Emits an event when a provided oauth2 token is about to expire, or is about to expire,\n * causing issues with establishing a websocket connection, or performing API calls.\n */\n @Event() public tokenExpired!: EventEmitter<void>;\n\n /**\n * Emits an event when the connection status changes for the viewer\n */\n @Event() public connectionChange!: EventEmitter<ConnectionStatus>;\n\n /**\n * Emits an event when the scene is ready to be interacted with.\n */\n @Event() public sceneReady!: EventEmitter<void>;\n\n /**\n * Emits an event when a frame is received with a different scene attribute.\n */\n @Event() public sceneChanged!: EventEmitter<void>;\n\n /**\n * Emits an event when the user has started an interaction.\n */\n @Event() public interactionStarted!: EventEmitter<void>;\n\n /**\n * Emits an event when the user hs finished an interaction.\n */\n @Event() public interactionFinished!: EventEmitter<void>;\n\n /**\n * Emits an event when the camera type changes.\n */\n @Event() public cameraTypeChanged!: EventEmitter<FrameCameraType>;\n\n /**\n * Used for internals or testing.\n *\n * @private\n */\n @Event() public deviceIdChange!: EventEmitter<string>;\n\n @Event() public dimensionschange!: EventEmitter<Dimensions.Dimensions>;\n\n @State() private dimensions?: Dimensions.Dimensions;\n @State() private hostDimensions?: Dimensions.Dimensions;\n @State() private errorMessage?: string;\n\n @State() private cursor?: Cursor;\n\n /**\n * This stores internal state that you want to preserve across live-reloads,\n * but shouldn't trigger a refresh if the data changes. Marking this with\n * @State to allow to preserve state across live-reloads.\n */\n @State() private stateMap: StateMap = {\n cursorManager: new CursorManager(),\n streamState: { type: 'disconnected' },\n };\n\n private containerElement?: HTMLElement;\n private canvasElement?: HTMLCanvasElement;\n\n private canvasRenderer!: CanvasRenderer;\n\n private mutationObserver?: MutationObserver;\n private resizeObserver?: ResizeObserver;\n private isResizing?: boolean;\n private isResizeUpdate?: boolean;\n\n private resizeTimer?: NodeJS.Timeout;\n\n private interactionHandlers: InteractionHandler[] = [];\n private defaultInteractionHandlerDisposables: Array<Disposable> = [];\n private tapHandlerDisposable?: Disposable;\n private interactionApi!: InteractionApi;\n private tapKeyInteractions: KeyInteraction<TapEventDetails>[] = [];\n private defaultTapKeyInteractions: KeyInteraction<TapEventDetails>[] = [];\n private baseInteractionHandler?: BaseInteractionHandler;\n\n private internalFrameDrawnDispatcher = new EventDispatcher<Frame>();\n\n public constructor() {\n this.handleElementResize = this.handleElementResize.bind(this);\n }\n\n /**\n * @ignore\n */\n protected componentWillLoad(): void {\n this.updateResolvedConfig();\n this.calculateComponentDimensions();\n\n this.resizeObserver = new ResizeObserver(this.handleElementResize);\n this.registerSlotChangeListeners();\n\n this.stream =\n this.stream ??\n new ViewerStream(new WebSocketClientImpl(), {\n loggingEnabled: this.getResolvedConfig().flags.logWsMessages,\n });\n this.addStreamListeners();\n\n this.updateStreamAttributes();\n this.stateMap.cursorManager.onChanged.on(() => this.handleCursorChanged());\n }\n\n /**\n * @ignore\n */\n protected componentDidLoad(): void {\n this.interactionApi = this.createInteractionApi();\n\n if (this.containerElement != null) {\n this.resizeObserver?.observe(this.containerElement);\n }\n\n if (this.src != null) {\n this.load(this.src).catch((e) => {\n console.error('Error loading scene', e);\n });\n }\n\n this.initializeDefaultInteractionHandlers();\n this.injectViewerApi();\n }\n\n /**\n * @ignore\n */\n protected render(): h.JSX.IntrinsicElements {\n return (\n <Host>\n <div\n class=\"viewer-container\"\n style={{ cursor: cssCursor(this.cursor ?? '') }}\n onContextMenu={(event) => event.preventDefault()}\n >\n <div\n ref={(ref) => (this.containerElement = ref)}\n class={classnames('canvas-container', {\n 'enable-pointer-events ': window.PointerEvent != null,\n })}\n >\n <canvas\n ref={(ref) => {\n this.canvasElement = ref;\n this.stateMap.interactionTarget = ref;\n }}\n class=\"canvas\"\n ></canvas>\n {this.errorMessage != null ? (\n <div class=\"error-message\">{this.errorMessage}</div>\n ) : null}\n </div>\n <slot></slot>\n </div>\n </Host>\n );\n }\n\n /**\n * @internal\n */\n @Method()\n public async dispatchFrameDrawn(frame: Frame): Promise<void> {\n this.frame = frame;\n this.internalFrameDrawnDispatcher.emit(frame);\n this.frameDrawn.emit(frame);\n }\n\n /**\n * Registers and initializes an interaction handler with the viewer. Returns a\n * `Disposable` that should be used to deregister the interaction handler.\n *\n * `InteractionHandler`s are used to build custom mouse and touch interactions\n * for the viewer. Use `<vertex-viewer camera-controls=\"false\" />` to disable\n * the default camera controls provided by the viewer.\n *\n * @example\n * ```\n * class CustomInteractionHandler extends InteractionHandler {\n * private element: HTMLElement;\n * private api: InteractionApi;\n *\n * public dispose(): void {\n * this.element.removeEventListener('click', this.handleElementClick);\n * }\n *\n * public initialize(element: HTMLElement, api: InteractionApi): void {\n * this.api = api;\n * this.element = element;\n * this.element.addEventListener('click', this.handleElementClick);\n * }\n *\n * private handleElementClick = (event: MouseEvent) => {\n * api.tap({ x: event.clientX, y: event.clientY });\n * }\n * }\n *\n * const viewer = document.querySelector(\"vertex-viewer\");\n * viewer.registerInteractionHandler(new CustomInteractionHandler);\n * ```\n *\n * @param interactionHandler The interaction handler to register.\n * @returns {Promise<void>} A promise containing the disposable to use to\n * deregister the handler.\n */\n @Method()\n public async registerInteractionHandler(\n interactionHandler: InteractionHandler\n ): Promise<Disposable> {\n this.interactionHandlers.push(interactionHandler);\n this.initializeInteractionHandler(interactionHandler);\n return {\n dispose: () => {\n const index = this.interactionHandlers.indexOf(interactionHandler);\n if (index !== -1) {\n this.interactionHandlers[index].dispose();\n this.interactionHandlers.splice(index, 1);\n }\n },\n };\n }\n\n /**\n * Registers a key interaction to be invoked when a specific set of\n * keys are pressed during a `tap` event.\n *\n * `KeyInteraction`s are used to build custom keyboard shortcuts for the\n * viewer using the current state of they keyboard to determine whether\n * the `fn` should be invoked. Use `<vertex-viewer keyboard-controls=\"false\" />`\n * to disable the default keyboard shortcuts provided by the viewer.\n *\n * @example\n * ```\n * class CustomKeyboardInteraction extends KeyInteraction<TapEventDetails> {\n * constructor(private viewer: HTMLVertexViewerElement) {}\n *\n * public predicate(keyState: KeyState): boolean {\n * return keyState['Alt'];\n * }\n *\n * public async fn(event: TapEventDetails) {\n * const scene = await this.viewer.scene();\n * const result = await scene.raycaster().hitItems(event.position);\n *\n * if (result.hits.length > 0) {\n * await scene\n * .camera()\n * .fitTo(q => q.withItemId(result.hits[0].itemId))\n * .render();\n * }\n * }\n * }\n * ```\n *\n * @param keyInteraction - The `KeyInteraction` to register.\n */\n @Method()\n public async registerTapKeyInteraction(\n keyInteraction: KeyInteraction<TapEventDetails>\n ): Promise<void> {\n this.tapKeyInteractions = [...this.tapKeyInteractions, keyInteraction];\n }\n\n /**\n * The HTML element that will handle interaction events from the user. Used by\n * components to listen for interaction events from the same element as the\n * viewer. Note, this property maybe removed in the future when refactoring\n * our interaction handling.\n *\n * @internal\n * @deprecated Use `InteractionHandler`.\n */\n @Method()\n public async getInteractionTarget_DEPRECATED(): Promise<HTMLElement> {\n if (this.stateMap.interactionTarget != null) {\n return this.stateMap.interactionTarget;\n } else throw new Error('Interaction target is undefined.');\n }\n\n /**\n * Adds a cursor to the viewer, and displays it if the cursor has the highest\n * priority.\n *\n * Cursors are managed as a prioritized list. A cursor is displayed if it has\n * the highest priority or if the cursor is the most recently added cursor in\n * the set of cursors with the same priority.\n *\n * To remove a cursor, call `dispose()` on the returned disposable.\n *\n * @param cursor The cursor to add.\n * @param priority The priority of the cursor.\n * @returns A disposable that can be used to remove the cursor.\n * @see See {@link CursorManager} for constants to pass to `priority`.\n */\n @Method()\n public async addCursor(\n cursor: Cursor,\n priority?: number\n ): Promise<Disposable> {\n return this.stateMap.cursorManager.add(cursor, priority);\n }\n\n @Method()\n public async getInteractionHandlers(): Promise<InteractionHandler[]> {\n return this.interactionHandlers;\n }\n\n /**\n * @internal\n * @ignore\n */\n @Method()\n public async getKeyInteractions(): Promise<\n KeyInteraction<TapEventDetails>[]\n > {\n return this.tapKeyInteractions;\n }\n\n @Method()\n public async getBaseInteractionHandler(): Promise<\n BaseInteractionHandler | undefined\n > {\n return this.baseInteractionHandler;\n }\n\n /**\n * @deprecated Use `token`.\n */\n @Method()\n public async getJwt(): Promise<string | undefined> {\n return this.token;\n }\n\n @Watch('src')\n public handleSrcChanged(src: string | undefined): void {\n if (src != null) {\n this.load(src);\n } else {\n this.unload();\n }\n }\n\n /**\n * @ignore\n */\n @Watch('cameraControls')\n protected handleCameraControlsChanged(): void {\n this.initializeDefaultCameraInteractionHandlers();\n }\n\n /**\n * @ignore\n */\n @Watch('keyboardControls')\n protected handleKeyboardControlsChanged(): void {\n this.initializeDefaultKeyboardInteractionHandlers();\n }\n\n /**\n * @ignore\n */\n @Watch('rotateAroundTapPoint')\n protected handleRotateAboutTapPointChanged(): void {\n this.updateStreamAttributes();\n if (this.rotateAroundTapPoint) {\n this.baseInteractionHandler?.setPrimaryInteractionType('rotate-point');\n } else {\n this.baseInteractionHandler?.setPrimaryInteractionType('rotate');\n }\n }\n\n @Watch('cameraType')\n protected handleCameraTypeChanged(\n updatedCameraType: string,\n previousCameraType: string\n ): void {\n if (updatedCameraType !== previousCameraType) {\n this.updateCameraType();\n }\n }\n\n /**\n * @ignore\n */\n @Watch('depthBuffers')\n protected handleDepthBuffersChanged(): void {\n this.updateStreamAttributes();\n }\n\n /**\n * @ignore\n */\n @Watch('experimentalGhostingOpacity')\n protected handleExperimentalGhostingOpacityChanged(): void {\n this.updateStreamAttributes();\n }\n\n @Watch('phantom')\n protected handlePhantomChanged(): void {\n this.updateStreamAttributes();\n }\n\n @Watch('noDefaultLights')\n protected handleNoDefaultLightsChanged(): void {\n this.updateStreamAttributes();\n }\n\n /**\n * @ignore\n */\n @Watch('experimentalRenderingOptions')\n protected handleExperimentalRenderingOptionsChanged(): void {\n this.updateStreamAttributes();\n }\n\n /**\n * @ignore\n */\n @Watch('featureLines')\n protected handleFeatureLinesChanged(): void {\n this.updateStreamAttributes();\n }\n\n /**\n * @ignore\n */\n @Watch('selectionHighlighting')\n protected handleSelectionHighlightingChanged(): void {\n this.updateStreamAttributes();\n }\n\n /**\n * @ignore\n */\n @Watch('featureHighlighting')\n protected handleFeatureHighlightingChanged(): void {\n this.updateStreamAttributes();\n }\n\n /**\n * @ignore\n */\n @Watch('featureMaps')\n protected handleFeatureMapsChanged(): void {\n this.updateStreamAttributes();\n }\n\n /**\n * @ignore\n */\n @Watch('config')\n protected handleConfigChanged(): void {\n this.updateResolvedConfig();\n }\n\n /**\n * @ignore\n */\n @Watch('configEnv')\n protected handleConfigEnvChanged(): void {\n this.updateResolvedConfig();\n }\n\n /**\n * Loads the given scene into the viewer and return a `Promise` that\n * resolves when the scene has been loaded. The specified scene is\n * provided as a URN in the following format:\n *\n * * `urn:vertexvis:scene:<sceneid>`\n *\n * @param urn The URN of the resource to load.\n */\n @Method()\n public async load(urn: string): Promise<void> {\n if (this.stream != null && this.dimensions != null) {\n this.calculateComponentDimensions();\n\n this.stream.update({\n streamAttributes: this.getStreamAttributes(),\n config: parseConfig(this.configEnv, this.config),\n dimensions: this.dimensions,\n frameBgColor: this.getBackgroundColor(),\n });\n await this.stream?.load(\n urn,\n this.clientId,\n this.getDeviceId(),\n this.getResolvedConfig()\n );\n this.sceneReady.emit();\n } else {\n throw new ViewerInitializationError(\n 'Cannot load scene. Viewer has not been initialized.'\n );\n }\n }\n\n /**\n * Disconnects the websocket and removes any internal state associated with\n * the scene.\n */\n @Method()\n public async unload(): Promise<void> {\n if (this.stream != null) {\n this.stream.disconnect();\n this.frame = undefined;\n this.errorMessage = undefined;\n }\n\n if (this.canvasElement != null) {\n const context = this.canvasElement.getContext('2d');\n if (context != null) {\n context.clearRect(\n 0,\n 0,\n this.canvasElement.width,\n this.canvasElement.height\n );\n }\n }\n }\n\n /**\n * Returns an object that is used to perform operations on the `Scene` that's\n * currently being viewed. These operations include updating items,\n * positioning the camera and performing hit tests.\n */\n @Method()\n public async scene(): Promise<Scene> {\n return this.createScene();\n }\n\n /**\n * Returns `true` indicating that the scene is ready to be interacted with.\n */\n @Method()\n public async isSceneReady(): Promise<boolean> {\n return this.stateMap.streamState.type === 'connected';\n }\n\n @Listen('tap')\n private async handleTapEvent(\n event: CustomEvent<TapEventDetails>\n ): Promise<void> {\n this.tapKeyInteractions\n .filter((i) => i.predicate(event.detail))\n .forEach((i) => i.fn(event.detail));\n }\n\n private emitConnectionChange(status: ConnectionStatus): void {\n if (status.status === 'connected') {\n // NOTE: Uncomment once FSS is deployed.\n // if (status.jwt.length === 0) {\n // throw new MissingJWTError('JWT is empty');\n // }\n }\n this.connectionChange.emit(status);\n }\n\n private handleElementResize(entries: ResizeObserverEntry[]): void {\n const dimensionsHaveChanged =\n entries.length > 0 &&\n this.dimensions != null &&\n !Dimensions.isEqual(entries[0].contentRect, this.viewport);\n\n if (dimensionsHaveChanged) {\n if (this.resizeTimer != null) {\n clearTimeout(this.resizeTimer);\n this.resizeTimer = undefined;\n }\n\n if (!this.isResizing) {\n this.resizeTimer = setTimeout(() => {\n this.isResizing = true;\n this.isResizeUpdate = true;\n this.recalculateComponentDimensions();\n }, this.resizeDebounce);\n }\n }\n }\n\n private registerSlotChangeListeners(): void {\n this.mutationObserver = new MutationObserver((_) => this.injectViewerApi());\n this.mutationObserver.observe(this.hostElement, {\n childList: true,\n subtree: true,\n });\n }\n\n private injectViewerApi(): void {\n function queryChildren(el: Element): HTMLElement[] {\n return Array.from(el.querySelectorAll('*'));\n }\n\n const children = queryChildren(this.hostElement);\n\n children\n .filter((node) => node.nodeName.startsWith('VERTEX-'))\n .reduce(\n (elements, element) => [\n ...elements,\n element,\n ...queryChildren(element),\n ],\n [] as Element[]\n )\n .forEach((node) => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (node as any).viewer = this.hostElement;\n });\n }\n\n private calculateComponentDimensions(): void {\n const maxPixelCount = 2073600;\n const bounds = this.getBounds();\n if (bounds?.width != null && bounds?.height != null) {\n const measuredViewport = Dimensions.create(bounds.width, bounds.height);\n const trimmedViewport = Dimensions.scaleFit(\n maxPixelCount,\n measuredViewport\n );\n\n this.hostDimensions = measuredViewport;\n this.dimensions =\n trimmedViewport != null\n ? Dimensions.create(trimmedViewport.width, trimmedViewport.height)\n : undefined;\n this.viewport = Viewport.fromDimensions(\n this.getCanvasDimensions() ?? Dimensions.create(0, 0)\n );\n }\n }\n\n private recalculateComponentDimensions(): void {\n if (this.isResizing) {\n this.calculateComponentDimensions();\n this.isResizing = false;\n\n if (this.stream?.getState().type === 'connected') {\n this.updateDimensions(this.dimensions);\n }\n }\n }\n\n private reportPerformance(timings: Timing[]): void {\n if (this.stateMap.streamState.type === 'connected') {\n const payload = {\n timings: timings.map((t) => ({\n receiveToPaintDuration: toProtoDuration(t.duration),\n })),\n };\n this.getStream().recordPerformance(payload, false);\n }\n }\n\n private addStreamListeners(): void {\n this.stateMap.streamListeners = this.getStream().stateChanged.on((s) => {\n this.handleStreamStateChanged(this.stateMap.streamState, s);\n });\n }\n\n private handleStreamStateChanged(\n previous: ViewerStreamState,\n state: ViewerStreamState\n ): void {\n this.stateMap.streamState = state;\n\n if (state.type === 'connecting') {\n this.handleConnecting(previous, state);\n } else if (state.type === 'connected') {\n this.handleConnected(previous, state);\n } else if (state.type === 'connection-failed') {\n this.handleConnectionFailed(previous, state);\n } else if (state.type === 'disconnected') {\n this.handleDisconnected(previous, state);\n }\n }\n\n private handleConnecting(\n previous: ViewerStreamState,\n state: Connecting\n ): void {\n if (previous.type !== 'connecting') {\n this.token = undefined;\n this.errorMessage = undefined;\n this.emitConnectionChange({ status: 'connecting' });\n }\n }\n\n private handleConnected(previous: ViewerStreamState, state: Connected): void {\n this.token = state.token.token;\n\n if (previous.type !== 'connected') {\n this.errorMessage = undefined;\n this.canvasRenderer = measureCanvasRenderer(\n paintTime,\n createCanvasRenderer(),\n this.getResolvedConfig().flags.logFrameRate,\n (timings) => this.reportPerformance(timings)\n );\n this.emitConnectionChange({\n status: 'connected',\n jwt: state.token.token,\n });\n this.deviceIdChange.emit(state.deviceId);\n }\n\n if (this.frame?.getId() !== state.frame.getId()) {\n this.updateFrame(state.frame);\n }\n\n this.updateDimensions(this.dimensions);\n }\n\n private handleConnectionFailed(\n previous: ViewerStreamState,\n state: ConnectionFailed\n ): void {\n if (previous.type !== 'connection-failed') {\n this.token = undefined;\n this.errorMessage = state.message;\n this.emitConnectionChange({\n status: 'connection-failed',\n errorMessage: state.message,\n });\n }\n }\n\n private handleDisconnected(\n previous: ViewerStreamState,\n state: Disconnected\n ): void {\n if (previous.type !== 'disconnected') {\n this.token = undefined;\n this.errorMessage = undefined;\n this.emitConnectionChange({ status: 'disconnected' });\n }\n }\n\n private updateDimensions(dimensions?: Dimensions.Dimensions): void {\n this.stream?.update({ dimensions });\n this.dimensionschange.emit(dimensions);\n }\n\n private async updateFrame(frame: Frame): Promise<void> {\n const canvasDimensions = this.getCanvasDimensions();\n\n if (\n this.canvasElement != null &&\n canvasDimensions != null &&\n this.frame?.getId() !== frame.getId()\n ) {\n const canvas = this.canvasElement.getContext('2d');\n if (canvas != null) {\n const previousFrame = this.frame;\n this.frame = SceneViewSummary.copySummaryIfInvalid(\n frame,\n previousFrame\n );\n\n this.updateInteractionApi(previousFrame);\n\n const data = {\n canvas,\n canvasDimensions,\n dimensions: this.dimensions,\n frame: this.frame,\n viewport: this.viewport,\n beforeDraw: () => {\n this.updateCanvasDimensions(canvasDimensions);\n this.isResizeUpdate = false;\n },\n predicate: () => {\n if (this.isResizeUpdate) {\n return (\n this.dimensions == null ||\n Dimensions.isEqual(\n this.dimensions,\n data.frame.image.imageAttr.frameDimensions\n )\n );\n }\n return true;\n },\n };\n\n this.frameReceived.emit(this.frame);\n\n if (this.frame.scene.hasChanged) {\n this.sceneChanged.emit();\n }\n\n const drawnFrame = await this.canvasRenderer(data);\n\n if (drawnFrame != null) {\n this.dispatchFrameDrawn(drawnFrame);\n }\n }\n }\n }\n\n private async initializeDefaultInteractionHandlers(): Promise<void> {\n await this.initializeDefaultCameraInteractionHandlers();\n await this.initializeDefaultTapInteractionHandler();\n this.initializeDefaultKeyboardInteractionHandlers();\n\n if (this.rotateAroundTapPoint) {\n this.baseInteractionHandler?.setPrimaryInteractionType('rotate-point');\n }\n }\n\n private clearDefaultCameraInteractionHandlers(): void {\n this.defaultInteractionHandlerDisposables.forEach((disposable) =>\n disposable.dispose()\n );\n this.defaultInteractionHandlerDisposables = [];\n }\n\n private clearDefaultKeyboardInteractions(): void {\n this.defaultTapKeyInteractions.forEach((interaction) => {\n const index = this.tapKeyInteractions.indexOf(interaction);\n if (index !== -1) {\n this.tapKeyInteractions.splice(index, 1);\n }\n });\n this.tapKeyInteractions = [];\n }\n\n private async initializeDefaultCameraInteractionHandlers(): Promise<void> {\n this.clearDefaultCameraInteractionHandlers();\n\n if (this.cameraControls) {\n if (window.PointerEvent != null) {\n this.baseInteractionHandler =\n this.baseInteractionHandler ??\n new PointerInteractionHandler(() => this.getResolvedConfig());\n const baseDisposable = await this.registerInteractionHandler(\n this.baseInteractionHandler\n );\n const multiPointerDisposable = await this.registerInteractionHandler(\n new MultiPointerInteractionHandler()\n );\n\n this.defaultInteractionHandlerDisposables = [\n baseDisposable,\n multiPointerDisposable,\n ];\n } else {\n // fallback to touch events and mouse events as a default\n this.baseInteractionHandler =\n this.baseInteractionHandler ??\n new MouseInteractionHandler(() => this.getResolvedConfig());\n const baseDisposable = await this.registerInteractionHandler(\n this.baseInteractionHandler\n );\n const touchDisposable = await this.registerInteractionHandler(\n new TouchInteractionHandler()\n );\n\n this.defaultInteractionHandlerDisposables = [\n baseDisposable,\n touchDisposable,\n ];\n }\n }\n }\n\n private initializeDefaultKeyboardInteractionHandlers(): void {\n this.clearDefaultKeyboardInteractions();\n\n if (this.keyboardControls && this.stream != null) {\n this.baseInteractionHandler?.setDefaultKeyboardControls(\n this.keyboardControls\n );\n\n const flyToPart = new FlyToPartKeyInteraction(\n this.stream,\n () => this.getResolvedConfig(),\n () => this.getImageScale()\n );\n const flyToPosition = new FlyToPositionKeyInteraction(\n this.stream,\n () => this.getResolvedConfig(),\n () => this.getImageScale(),\n () => this.createScene()\n );\n\n this.registerTapKeyInteraction(flyToPart);\n this.registerTapKeyInteraction(flyToPosition);\n\n this.defaultTapKeyInteractions = [flyToPart, flyToPosition];\n }\n }\n\n private async initializeDefaultTapInteractionHandler(): Promise<void> {\n if (this.tapHandlerDisposable == null) {\n if (window.PointerEvent != null) {\n const tapInteractionHandler = new TapInteractionHandler(\n 'pointerdown',\n 'pointerup',\n 'pointermove',\n () => this.getResolvedConfig()\n );\n\n this.tapHandlerDisposable = await this.registerInteractionHandler(\n tapInteractionHandler\n );\n } else {\n const tapInteractionHandler = new TapInteractionHandler(\n 'mousedown',\n 'mouseup',\n 'mousemove',\n () => this.getResolvedConfig()\n );\n\n this.tapHandlerDisposable = await this.registerInteractionHandler(\n tapInteractionHandler\n );\n }\n }\n }\n\n private initializeInteractionHandler(handler: InteractionHandler): void {\n if (this.stateMap.interactionTarget == null) {\n throw new InteractionHandlerError(\n 'Cannot initialize interaction handler. Interaction target is undefined.'\n );\n }\n if (this.interactionApi == null) {\n throw new InteractionHandlerError(\n 'Cannot initialize interaction handler. Interaction APi is undefined.'\n );\n }\n handler.initialize(this.stateMap.interactionTarget, this.interactionApi);\n }\n\n private createInteractionApi(): InteractionApi {\n if (this.stream == null) {\n throw new ComponentInitializationError(\n 'Cannot create interaction API. Component has not been initialized.'\n );\n }\n\n return this.frame == null || this.frame.scene.camera.isPerspective()\n ? new InteractionApiPerspective(\n this.stream,\n this.stateMap.cursorManager,\n () => this.getResolvedConfig().interactions,\n () => this.createScene(),\n () => this.frame,\n () => this.viewport,\n this.tap,\n this.doubletap,\n this.longpress,\n this.interactionStarted,\n this.interactionFinished\n )\n : new InteractionApiOrthographic(\n this.stream,\n this.stateMap.cursorManager,\n () => this.getResolvedConfig().interactions,\n () => this.createScene(),\n () => this.frame,\n () => this.viewport,\n this.tap,\n this.doubletap,\n this.longpress,\n this.interactionStarted,\n this.interactionFinished\n );\n }\n\n private handleCursorChanged(): void {\n window.requestAnimationFrame(() => {\n this.cursor = this.stateMap.cursorManager.getActiveCursor();\n });\n }\n\n private async createScene(): Promise<Scene> {\n const state = await this.waitForConnectedState();\n\n const { frame, sceneId, sceneViewId, worldOrientation } = state;\n\n return new Scene(\n this.getStream(),\n frame,\n fromPbFrameOrThrow(worldOrientation),\n () => this.getImageScale(),\n this.viewport,\n sceneId,\n sceneViewId\n );\n }\n\n /**\n * This function is currently not in use, but will required\n * when we want to automatically configure the background color of\n * JPEG images.\n */\n private getBackgroundColor(): Color.Color | undefined {\n if (this.containerElement != null) {\n return getElementBackgroundColor(this.containerElement);\n }\n }\n\n private getBounds(): ClientRect | undefined {\n return getElementBoundingClientRect(this.hostElement);\n }\n\n private getCanvasDimensions(): Dimensions.Dimensions | undefined {\n return this.getResolvedConfig().flags.letterboxFrames\n ? this.dimensions\n : this.hostDimensions;\n }\n\n private getImageScale(): Point.Point | undefined {\n const canvasDimensions = this.getCanvasDimensions();\n if (this.dimensions != null && canvasDimensions != null) {\n return Point.create(\n this.dimensions.width / canvasDimensions.width,\n this.dimensions.height / canvasDimensions.height\n );\n }\n }\n\n private getStreamAttributes(): StreamAttributes {\n return {\n depthBuffers: this.getDepthBufferStreamAttributesValue(),\n experimentalGhosting: this.experimentalGhostingOpacity,\n phantom: this.phantom,\n noDefaultLights: this.noDefaultLights,\n featureLines: this.featureLines,\n featureHighlighting: this.featureHighlighting,\n featureMaps: this.featureMaps,\n experimentalRenderingOptions: this.experimentalRenderingOptions,\n selectionHighlighting: this.selectionHighlighting,\n };\n }\n\n private updateCanvasDimensions(dimensions: Dimensions.Dimensions): void {\n if (this.canvasElement != null) {\n this.canvasElement.width = dimensions.width;\n this.canvasElement.height = dimensions.height;\n }\n }\n\n private updateStreamAttributes(): void {\n this.stream?.update({ streamAttributes: this.getStreamAttributes() });\n }\n\n private updateInteractionApi(previousFrame?: Frame): void {\n if (this.frame != null) {\n const hasChangedFromPerspective =\n (previousFrame == null || previousFrame.scene.camera.isPerspective()) &&\n this.frame.scene.camera.isOrthographic();\n const hasChangedFromOrthographic =\n (previousFrame == null ||\n previousFrame.scene.camera.isOrthographic()) &&\n this.frame.scene.camera.isPerspective();\n\n if (hasChangedFromPerspective || hasChangedFromOrthographic) {\n this.interactionApi = this.createInteractionApi();\n this.cameraType = this.frame.scene.camera.isPerspective()\n ? 'perspective'\n : 'orthographic';\n this.cameraTypeChanged.emit(this.cameraType);\n\n this.interactionHandlers.forEach((handler) =>\n this.initializeInteractionHandler(handler)\n );\n }\n }\n }\n\n private updateCameraType(): void {\n if (this.frame != null) {\n if (\n this.cameraType === 'orthographic' &&\n this.frame.scene.camera.isPerspective()\n ) {\n this.stream?.replaceCamera({\n camera: FrameCamera.toProtobuf(\n FrameCamera.toOrthographic(\n this.frame.scene.camera,\n this.frame.scene.boundingBox\n )\n ),\n });\n } else if (\n this.cameraType === 'perspective' &&\n this.frame.scene.camera.isOrthographic()\n ) {\n this.stream?.replaceCamera({\n camera: FrameCamera.toProtobuf(\n FrameCamera.toPerspective(this.frame.scene.camera)\n ),\n });\n }\n }\n }\n\n private getDepthBufferStreamAttributesValue(): FrameType {\n const depthBuffer =\n this.depthBuffers ?? (this.rotateAroundTapPoint ? 'final' : undefined);\n return depthBuffer;\n }\n\n private updateResolvedConfig(): void {\n this.resolvedConfig = parseConfig(this.configEnv, this.config);\n }\n\n private getResolvedConfig(): Config {\n return getRequiredProp(\n 'Resolved config is undefined',\n () => this.resolvedConfig\n );\n }\n\n private getStream(): ViewerStream {\n return getRequiredProp('Stream is undefined', () => this.stream);\n }\n\n private getDeviceId(): string | undefined {\n if (this.deviceId == null) {\n try {\n this.deviceId = getStorageEntry(\n StorageKeys.DEVICE_ID,\n (entry) => entry['device-id']\n );\n } catch (e) {\n console.warn('Cannot read device ID. Local storage is not supported.');\n }\n\n if (this.deviceId == null) {\n this.deviceId = UUID.create();\n\n try {\n upsertStorageEntry(StorageKeys.DEVICE_ID, {\n ['device-id']: this.deviceId,\n });\n } catch (e) {\n console.warn(\n 'Cannot write device ID. Local storage is not supported.'\n );\n }\n }\n }\n return this.deviceId;\n }\n\n private async waitForConnectedState(): Promise<Connected> {\n if (this.stateMap.streamState.type !== 'connected') {\n console.debug(\n 'Stream was not in a connected state. Waiting for successful connection.'\n );\n return new Promise<Connected>((resolve, reject) => {\n const disposable = this.getStream().onStateChanged((state) => {\n if (state.type === 'connected') {\n resolve(state);\n }\n });\n\n setTimeout(() => {\n disposable.dispose();\n reject(new Error('Timed out waiting for connected state.'));\n }, DEFAULT_VIEWER_SCENE_WAIT_MS);\n });\n }\n\n return this.stateMap.streamState;\n }\n}\n\nfunction getRequiredProp<T>(errorMsg: string, getter: () => T | undefined): T {\n const value = getter();\n if (value != null) {\n return value;\n } else throw new Error(errorMsg);\n}\n"]}
1
+ {"version":3,"file":"viewer.js","sourceRoot":"","sources":["../../../src/components/viewer/viewer.tsx"],"names":[],"mappings":"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","sourcesContent":["import {\n Component,\n Element,\n Event,\n EventEmitter,\n h,\n Host,\n Listen,\n Method,\n Prop,\n State,\n Watch,\n} from '@stencil/core';\nimport { Dimensions, Point } from '@vertexvis/geometry';\nimport { toProtoDuration, WebSocketClientImpl } from '@vertexvis/stream-api';\nimport { Color, Disposable, EventDispatcher, UUID } from '@vertexvis/utils';\nimport classnames from 'classnames';\n\nimport {\n FeatureHighlightOptions,\n FeatureLineOptions,\n FrameType,\n PhantomOptions,\n SelectionHighlightingOptions,\n StreamAttributes,\n} from '../../interfaces';\nimport { Config, parseConfig, PartialConfig } from '../../lib/config';\nimport { Cursor, CursorManager } from '../../lib/cursors';\nimport { cssCursor } from '../../lib/dom';\nimport { Environment } from '../../lib/environment';\nimport {\n ComponentInitializationError,\n InteractionHandlerError,\n ViewerInitializationError,\n} from '../../lib/errors';\nimport {\n InteractionApiOrthographic,\n InteractionApiPerspective,\n} from '../../lib/interactions';\nimport { BaseInteractionHandler } from '../../lib/interactions/baseInteractionHandler';\nimport { FlyToPartKeyInteraction } from '../../lib/interactions/flyToPartKeyInteraction';\nimport { FlyToPositionKeyInteraction } from '../../lib/interactions/flyToPositionKeyInteraction';\nimport { InteractionApi } from '../../lib/interactions/interactionApi';\nimport { InteractionHandler } from '../../lib/interactions/interactionHandler';\nimport { KeyInteraction } from '../../lib/interactions/keyInteraction';\nimport { MouseInteractionHandler } from '../../lib/interactions/mouseInteractionHandler';\nimport { MultiPointerInteractionHandler } from '../../lib/interactions/multiPointerInteractionHandler';\nimport { PointerInteractionHandler } from '../../lib/interactions/pointerInteractionHandler';\nimport { TapEventDetails } from '../../lib/interactions/tapEventDetails';\nimport { TapInteractionHandler } from '../../lib/interactions/tapInteractionHandler';\nimport { TouchInteractionHandler } from '../../lib/interactions/touchInteractionHandler';\nimport { fromPbFrameOrThrow } from '../../lib/mappers';\nimport { paintTime, Timing } from '../../lib/meters';\nimport {\n CanvasRenderer,\n createCanvasRenderer,\n measureCanvasRenderer,\n} from '../../lib/rendering';\nimport { Scene } from '../../lib/scenes/scene';\nimport {\n getStorageEntry,\n StorageKeys,\n upsertStorageEntry,\n} from '../../lib/storage';\nimport {\n Connected,\n Connecting,\n ConnectionFailed,\n Disconnected,\n ViewerStreamState,\n} from '../../lib/stream/state';\nimport { ViewerStream } from '../../lib/stream/stream';\nimport {\n FrameCamera,\n Orientation,\n SceneViewSummary,\n StencilBufferManager,\n Viewport,\n} from '../../lib/types';\nimport { Frame } from '../../lib/types/frame';\nimport { FrameCameraType } from '../../lib/types/frameCamera';\nimport {\n DEFAULT_VIEWER_SCENE_WAIT_MS,\n getElementBackgroundColor,\n getElementBoundingClientRect,\n} from './utils';\n\ninterface ConnectedStatus {\n jwt: string;\n status: 'connected';\n}\n\ninterface ConnectingStatus {\n status: 'connecting';\n}\n\ninterface DisconnectedStatus {\n status: 'disconnected';\n}\n\ninterface ConnectionFailedStatus {\n status: 'connection-failed';\n errorMessage: string;\n}\n\n/**\n * Internal state values for the component. Used to preserve values across live\n * reload refreshes.\n */\ninterface StateMap {\n streamWorldOrientation?: Orientation;\n cursorManager: CursorManager;\n interactionTarget?: HTMLElement;\n streamState: ViewerStreamState;\n streamListeners?: Disposable;\n}\n\n/** @internal */\nexport type ConnectionStatus =\n | ConnectingStatus\n | ConnectedStatus\n | DisconnectedStatus\n | ConnectionFailedStatus;\n\n@Component({\n tag: 'vertex-viewer',\n styleUrl: 'viewer.css',\n shadow: true,\n})\nexport class Viewer {\n @Element() private hostElement!: HTMLVertexViewerElement;\n\n /**\n * A URN of the scene resource to load when the component is mounted in the\n * DOM tree. The specified resource is a URN in the following format:\n *\n * * `urn:vertex:scene:<sceneid>`\n */\n @Prop() public src?: string;\n\n /**\n * The Client ID associated with your Vertex Application.\n */\n @Prop() public clientId?: string;\n\n /**\n * Property used for internals or testing.\n *\n * @private\n * @internal\n */\n @Prop({ mutable: true }) public deviceId?: string;\n\n /**\n * An object or JSON encoded string that defines configuration settings for\n * the viewer.\n */\n @Prop() public config?: PartialConfig | string;\n\n /**\n * Sets the default environment for the viewer. This setting is used for\n * auto-configuring network hosts.\n *\n * Use the `config` property for manually setting hosts.\n *\n * @see Viewer.config\n */\n @Prop() public configEnv: Environment = 'platprod';\n\n /**\n * @internal\n */\n @Prop({ mutable: true }) public resolvedConfig?: Config;\n\n /**\n * Enables or disables the default mouse and touch interactions provided by\n * the viewer. Enabled by default.\n */\n @Prop() public cameraControls = true;\n\n /**\n * The type of camera model to represent the scene with. Can be either\n * `perspective` or `orthographic`, and defaults to `perspective`.\n */\n @Prop({ mutable: true, reflect: true }) public cameraType: FrameCameraType =\n 'perspective';\n\n /**\n * Enables or disables the default keyboard shortcut interactions provided by\n * the viewer. Enabled by default, requires `cameraControls` being enabled.\n *\n */\n @Prop() public keyboardControls = true;\n\n /**\n * Enables or disables the default rotation interaction being changed to\n * rotate around the pointer down location.\n */\n @Prop() public rotateAroundTapPoint = true;\n\n /**\n * A token that can be used to make API calls to other Vertex services.\n *\n * @internal\n */\n @Prop({ mutable: true }) public token?: string;\n\n /**\n * Specifies when a depth buffer is requested from rendering. Possible values\n * are:\n *\n * * `undefined`: A depth buffer is never requested.\n * * `final`: A depth buffer is only requested on the final frame.\n * * `all`: A depth buffer is requested for every frame.\n *\n * Depth buffers can increase the amount of data that's sent to a client and\n * can impact rendering performance. Values of `undefined` or `final` should\n * be used when needing the highest rendering performance.\n */\n @Prop() public depthBuffers?: FrameType;\n\n /**\n * Specifies the opacity, between 0 and 100, for an experimental ghosting\n * feature. When the value is non-zero, any scene items that are hidden will\n * be appear translucent.\n *\n * **Note:** This feature is experimental, and may cause slower frame rates.\n */\n @Prop() public experimentalGhostingOpacity = 0;\n\n /**\n * Specifies how phantom parts should appear.\n * The opacity must be between 0 and 1, where 0 is completely hidden and 1 is completely visible.\n */\n @Prop({ attribute: null })\n public phantom?: PhantomOptions = { opacity: 0.1 };\n\n /**\n * Specifies whether to use the default lights for the scene. When false, default\n * lights are used. When true, no default lights are used, and the lights must\n * be specified separately.\n */\n @Prop() public noDefaultLights = false;\n\n /**\n * @private\n * @internal\n * Specifies experimental rendering options. For Vertex use only.\n */\n @Prop() public experimentalRenderingOptions = '';\n\n /**\n * Specifies if and how to render feature lines.\n */\n @Prop({ attribute: null }) public featureLines?: FeatureLineOptions;\n\n /**\n * Specifies the halo selection properties.\n * Parameter notes:\n * lineWidth values supported currently are 0-5. This width is currently the value x2. For example, 1 will have a pixel width of 2.\n * color is optional. This will be the color of the selected items in the viewer.\n * opacity is also optional. The opacity will be applied to everything selected besides the highlighted outer line.\n */\n @Prop({ attribute: null })\n public selectionHighlighting?: SelectionHighlightingOptions;\n\n /**\n * Specifies how selected features should be highlighted.\n */\n @Prop({ attribute: null })\n public featureHighlighting?: FeatureHighlightOptions;\n\n /**\n * Specifies when a feature map is returned from rendering. Feature maps\n * include information about the surfaces, edges and cross sections that are\n * in a frame.\n *\n * Possible values are:\n *\n * * `undefined`: A feature map is never requested.\n * * `final`: A feature map is only requested on the final frame.\n * * `all`: A feature map is requested for every frame.\n *\n * Feature maps can increase the amount of data that's sent to a client and\n * can impact rendering performance. Values of `undefined` or `final` should\n * be used when needing the highest rendering performance.\n */\n @Prop() public featureMaps?: FrameType;\n\n /**\n * An optional value that will debounce frame updates when resizing\n * this viewer element.\n */\n @Prop() public resizeDebounce = 100;\n\n /**\n * The last frame that was received, which can be used to inspect the scene\n * and camera information.\n *\n * @readonly\n */\n @Prop({ mutable: true }) public frame: Frame | undefined;\n\n /**\n * @internal\n */\n @Prop({ mutable: true }) public stream?: ViewerStream;\n\n /**\n * @internal\n */\n @Prop({ mutable: true })\n public stencilBuffer: StencilBufferManager = new StencilBufferManager(\n this.hostElement\n );\n\n /**\n * Represents the current viewport of the viewer. The viewport represents the\n * dimensions of the canvas where a frame is rendered. It contains methods for\n * translating between viewport coordinates, frame coordinates and world\n * coordinates.\n */\n @Prop({ mutable: true })\n public viewport: Viewport = Viewport.fromDimensions(Dimensions.create(0, 0));\n\n /**\n * Emits an event whenever the user taps or clicks a location in the viewer.\n * The event includes the location of the tap or click.\n */\n @Event() public tap!: EventEmitter<TapEventDetails>;\n\n /**\n * Emits an event whenever the user double taps or clicks a location in the viewer.\n * The event includes the location of the first tap or click.\n */\n @Event() public doubletap!: EventEmitter<TapEventDetails>;\n\n /**\n * Emits an event whenever the user taps or clicks a location in the viewer and the\n * configured amount of time passes without receiving a mouseup or touchend.\n * The event includes the location of the tap or click.\n */\n @Event() public longpress!: EventEmitter<TapEventDetails>;\n\n /**\n * Emits an event when a frame has been received by the viewer. The event\n * will include details about the drawn frame, such as the `Scene` information\n * related to the scene.\n */\n @Event() public frameReceived!: EventEmitter<Frame>;\n\n /**\n * Emits an event when a frame has been drawn to the viewer's canvas. The event\n * will include details about the drawn frame, such as the `Scene` information\n * related to the scene.\n */\n @Event() public frameDrawn!: EventEmitter<Frame>;\n\n /**\n * Emits an event when a provided oauth2 token is about to expire, or is about to expire,\n * causing issues with establishing a websocket connection, or performing API calls.\n */\n @Event() public tokenExpired!: EventEmitter<void>;\n\n /**\n * Emits an event when the connection status changes for the viewer\n */\n @Event() public connectionChange!: EventEmitter<ConnectionStatus>;\n\n /**\n * Emits an event when the scene is ready to be interacted with.\n */\n @Event() public sceneReady!: EventEmitter<void>;\n\n /**\n * Emits an event when a frame is received with a different scene attribute.\n */\n @Event() public sceneChanged!: EventEmitter<void>;\n\n /**\n * Emits an event when the user has started an interaction.\n */\n @Event() public interactionStarted!: EventEmitter<void>;\n\n /**\n * Emits an event when the user hs finished an interaction.\n */\n @Event() public interactionFinished!: EventEmitter<void>;\n\n /**\n * Emits an event when the camera type changes.\n */\n @Event() public cameraTypeChanged!: EventEmitter<FrameCameraType>;\n\n /**\n * Used for internals or testing.\n *\n * @private\n */\n @Event() public deviceIdChange!: EventEmitter<string>;\n\n @Event() public dimensionschange!: EventEmitter<Dimensions.Dimensions>;\n\n @State() private dimensions?: Dimensions.Dimensions;\n @State() private hostDimensions?: Dimensions.Dimensions;\n @State() private errorMessage?: string;\n\n @State() private cursor?: Cursor;\n\n /**\n * This stores internal state that you want to preserve across live-reloads,\n * but shouldn't trigger a refresh if the data changes. Marking this with\n * @State to allow to preserve state across live-reloads.\n */\n @State() private stateMap: StateMap = {\n cursorManager: new CursorManager(),\n streamState: { type: 'disconnected' },\n };\n\n private containerElement?: HTMLElement;\n private canvasElement?: HTMLCanvasElement;\n\n private canvasRenderer!: CanvasRenderer;\n\n private mutationObserver?: MutationObserver;\n private resizeObserver?: ResizeObserver;\n private isResizing?: boolean;\n private isResizeUpdate?: boolean;\n\n private resizeTimer?: NodeJS.Timeout;\n\n private interactionHandlers: InteractionHandler[] = [];\n private defaultInteractionHandlerDisposables: Array<Disposable> = [];\n private tapHandlerDisposable?: Disposable;\n private interactionApi!: InteractionApi;\n private tapKeyInteractions: KeyInteraction<TapEventDetails>[] = [];\n private defaultTapKeyInteractions: KeyInteraction<TapEventDetails>[] = [];\n private baseInteractionHandler?: BaseInteractionHandler;\n\n private internalFrameDrawnDispatcher = new EventDispatcher<Frame>();\n\n public constructor() {\n this.handleElementResize = this.handleElementResize.bind(this);\n }\n\n /**\n * @ignore\n */\n protected componentWillLoad(): void {\n this.updateResolvedConfig();\n this.calculateComponentDimensions();\n\n this.resizeObserver = new ResizeObserver(this.handleElementResize);\n this.registerSlotChangeListeners();\n\n this.stream =\n this.stream ??\n new ViewerStream(new WebSocketClientImpl(), {\n loggingEnabled: this.getResolvedConfig().flags.logWsMessages,\n });\n this.addStreamListeners();\n\n this.updateStreamAttributes();\n this.stateMap.cursorManager.onChanged.on(() => this.handleCursorChanged());\n }\n\n /**\n * @ignore\n */\n protected componentDidLoad(): void {\n this.interactionApi = this.createInteractionApi();\n\n if (this.containerElement != null) {\n this.resizeObserver?.observe(this.containerElement);\n }\n\n if (this.src != null) {\n this.load(this.src).catch((e) => {\n console.error('Error loading scene', e);\n });\n }\n\n this.initializeDefaultInteractionHandlers();\n this.injectViewerApi();\n }\n\n /**\n * @ignore\n */\n protected render(): h.JSX.IntrinsicElements {\n return (\n <Host>\n <div\n class=\"viewer-container\"\n style={{ cursor: cssCursor(this.cursor ?? '') }}\n onContextMenu={(event) => event.preventDefault()}\n >\n <div\n ref={(ref) => (this.containerElement = ref)}\n class={classnames('canvas-container', {\n 'enable-pointer-events ': window.PointerEvent != null,\n })}\n >\n <canvas\n ref={(ref) => {\n this.canvasElement = ref;\n this.stateMap.interactionTarget = ref;\n }}\n class=\"canvas\"\n ></canvas>\n {this.errorMessage != null ? (\n <div class=\"error-message\">{this.errorMessage}</div>\n ) : null}\n </div>\n <slot></slot>\n </div>\n </Host>\n );\n }\n\n /**\n * @internal\n */\n @Method()\n public async dispatchFrameDrawn(frame: Frame): Promise<void> {\n this.frame = frame;\n this.internalFrameDrawnDispatcher.emit(frame);\n this.frameDrawn.emit(frame);\n }\n\n /**\n * Registers and initializes an interaction handler with the viewer. Returns a\n * `Disposable` that should be used to deregister the interaction handler.\n *\n * `InteractionHandler`s are used to build custom mouse and touch interactions\n * for the viewer. Use `<vertex-viewer camera-controls=\"false\" />` to disable\n * the default camera controls provided by the viewer.\n *\n * @example\n * ```\n * class CustomInteractionHandler extends InteractionHandler {\n * private element: HTMLElement;\n * private api: InteractionApi;\n *\n * public dispose(): void {\n * this.element.removeEventListener('click', this.handleElementClick);\n * }\n *\n * public initialize(element: HTMLElement, api: InteractionApi): void {\n * this.api = api;\n * this.element = element;\n * this.element.addEventListener('click', this.handleElementClick);\n * }\n *\n * private handleElementClick = (event: MouseEvent) => {\n * api.tap({ x: event.clientX, y: event.clientY });\n * }\n * }\n *\n * const viewer = document.querySelector(\"vertex-viewer\");\n * viewer.registerInteractionHandler(new CustomInteractionHandler);\n * ```\n *\n * @param interactionHandler The interaction handler to register.\n * @returns {Promise<void>} A promise containing the disposable to use to\n * deregister the handler.\n */\n @Method()\n public async registerInteractionHandler(\n interactionHandler: InteractionHandler\n ): Promise<Disposable> {\n this.interactionHandlers.push(interactionHandler);\n this.initializeInteractionHandler(interactionHandler);\n return {\n dispose: () => {\n const index = this.interactionHandlers.indexOf(interactionHandler);\n if (index !== -1) {\n this.interactionHandlers[index].dispose();\n this.interactionHandlers.splice(index, 1);\n }\n },\n };\n }\n\n /**\n * Registers a key interaction to be invoked when a specific set of\n * keys are pressed during a `tap` event.\n *\n * `KeyInteraction`s are used to build custom keyboard shortcuts for the\n * viewer using the current state of they keyboard to determine whether\n * the `fn` should be invoked. Use `<vertex-viewer keyboard-controls=\"false\" />`\n * to disable the default keyboard shortcuts provided by the viewer.\n *\n * @example\n * ```\n * class CustomKeyboardInteraction extends KeyInteraction<TapEventDetails> {\n * constructor(private viewer: HTMLVertexViewerElement) {}\n *\n * public predicate(keyState: KeyState): boolean {\n * return keyState['Alt'];\n * }\n *\n * public async fn(event: TapEventDetails) {\n * const scene = await this.viewer.scene();\n * const result = await scene.raycaster().hitItems(event.position);\n *\n * if (result.hits.length > 0) {\n * await scene\n * .camera()\n * .fitTo(q => q.withItemId(result.hits[0].itemId))\n * .render();\n * }\n * }\n * }\n * ```\n *\n * @param keyInteraction - The `KeyInteraction` to register.\n */\n @Method()\n public async registerTapKeyInteraction(\n keyInteraction: KeyInteraction<TapEventDetails>\n ): Promise<void> {\n this.tapKeyInteractions = [...this.tapKeyInteractions, keyInteraction];\n }\n\n /**\n * The HTML element that will handle interaction events from the user. Used by\n * components to listen for interaction events from the same element as the\n * viewer. Note, this property maybe removed in the future when refactoring\n * our interaction handling.\n *\n * @internal\n * @deprecated Use `InteractionHandler`.\n */\n @Method()\n public async getInteractionTarget_DEPRECATED(): Promise<HTMLElement> {\n if (this.stateMap.interactionTarget != null) {\n return this.stateMap.interactionTarget;\n } else throw new Error('Interaction target is undefined.');\n }\n\n /**\n * Adds a cursor to the viewer, and displays it if the cursor has the highest\n * priority.\n *\n * Cursors are managed as a prioritized list. A cursor is displayed if it has\n * the highest priority or if the cursor is the most recently added cursor in\n * the set of cursors with the same priority.\n *\n * To remove a cursor, call `dispose()` on the returned disposable.\n *\n * @param cursor The cursor to add.\n * @param priority The priority of the cursor.\n * @returns A disposable that can be used to remove the cursor.\n * @see See {@link CursorManager} for constants to pass to `priority`.\n */\n @Method()\n public async addCursor(\n cursor: Cursor,\n priority?: number\n ): Promise<Disposable> {\n return this.stateMap.cursorManager.add(cursor, priority);\n }\n\n @Method()\n public async getInteractionHandlers(): Promise<InteractionHandler[]> {\n return this.interactionHandlers;\n }\n\n /**\n * @internal\n * @ignore\n */\n @Method()\n public async getKeyInteractions(): Promise<\n KeyInteraction<TapEventDetails>[]\n > {\n return this.tapKeyInteractions;\n }\n\n @Method()\n public async getBaseInteractionHandler(): Promise<\n BaseInteractionHandler | undefined\n > {\n return this.baseInteractionHandler;\n }\n\n /**\n * @deprecated Use `token`.\n */\n @Method()\n public async getJwt(): Promise<string | undefined> {\n return this.token;\n }\n\n @Watch('src')\n public handleSrcChanged(src: string | undefined): void {\n if (src != null) {\n this.load(src);\n } else {\n this.unload();\n }\n }\n\n /**\n * @ignore\n */\n @Watch('cameraControls')\n protected handleCameraControlsChanged(): void {\n this.initializeDefaultCameraInteractionHandlers();\n }\n\n /**\n * @ignore\n */\n @Watch('keyboardControls')\n protected handleKeyboardControlsChanged(): void {\n this.initializeDefaultKeyboardInteractionHandlers();\n }\n\n /**\n * @ignore\n */\n @Watch('rotateAroundTapPoint')\n protected handleRotateAboutTapPointChanged(): void {\n this.updateStreamAttributes();\n if (this.rotateAroundTapPoint) {\n this.baseInteractionHandler?.setPrimaryInteractionType('rotate-point');\n } else {\n this.baseInteractionHandler?.setPrimaryInteractionType('rotate');\n }\n }\n\n @Watch('cameraType')\n protected handleCameraTypeChanged(\n updatedCameraType: string,\n previousCameraType: string\n ): void {\n if (updatedCameraType !== previousCameraType) {\n this.updateCameraType();\n }\n }\n\n /**\n * @ignore\n */\n @Watch('depthBuffers')\n protected handleDepthBuffersChanged(): void {\n this.updateStreamAttributes();\n }\n\n /**\n * @ignore\n */\n @Watch('experimentalGhostingOpacity')\n protected handleExperimentalGhostingOpacityChanged(): void {\n this.updateStreamAttributes();\n }\n\n @Watch('phantom')\n protected handlePhantomChanged(): void {\n this.updateStreamAttributes();\n }\n\n @Watch('noDefaultLights')\n protected handleNoDefaultLightsChanged(): void {\n this.updateStreamAttributes();\n }\n\n /**\n * @ignore\n */\n @Watch('experimentalRenderingOptions')\n protected handleExperimentalRenderingOptionsChanged(): void {\n this.updateStreamAttributes();\n }\n\n /**\n * @ignore\n */\n @Watch('featureLines')\n protected handleFeatureLinesChanged(): void {\n this.updateStreamAttributes();\n }\n\n /**\n * @ignore\n */\n @Watch('selectionHighlighting')\n protected handleSelectionHighlightingChanged(): void {\n this.updateStreamAttributes();\n }\n\n /**\n * @ignore\n */\n @Watch('featureHighlighting')\n protected handleFeatureHighlightingChanged(): void {\n this.updateStreamAttributes();\n }\n\n /**\n * @ignore\n */\n @Watch('featureMaps')\n protected handleFeatureMapsChanged(): void {\n this.updateStreamAttributes();\n }\n\n /**\n * @ignore\n */\n @Watch('config')\n protected handleConfigChanged(): void {\n this.updateResolvedConfig();\n }\n\n /**\n * @ignore\n */\n @Watch('configEnv')\n protected handleConfigEnvChanged(): void {\n this.updateResolvedConfig();\n }\n\n /**\n * Loads the given scene into the viewer and return a `Promise` that\n * resolves when the scene has been loaded. The specified scene is\n * provided as a URN in the following format:\n *\n * * `urn:vertex:scene:<sceneid>`\n *\n * @param urn The URN of the resource to load.\n */\n @Method()\n public async load(urn: string): Promise<void> {\n if (this.stream != null && this.dimensions != null) {\n this.calculateComponentDimensions();\n\n this.stream.update({\n streamAttributes: this.getStreamAttributes(),\n config: parseConfig(this.configEnv, this.config),\n dimensions: this.dimensions,\n frameBgColor: this.getBackgroundColor(),\n });\n await this.stream?.load(\n urn,\n this.clientId,\n this.getDeviceId(),\n this.getResolvedConfig()\n );\n this.sceneReady.emit();\n } else {\n throw new ViewerInitializationError(\n 'Cannot load scene. Viewer has not been initialized.'\n );\n }\n }\n\n /**\n * Disconnects the websocket and removes any internal state associated with\n * the scene.\n */\n @Method()\n public async unload(): Promise<void> {\n if (this.stream != null) {\n this.stream.disconnect();\n this.frame = undefined;\n this.errorMessage = undefined;\n }\n\n if (this.canvasElement != null) {\n const context = this.canvasElement.getContext('2d');\n if (context != null) {\n context.clearRect(\n 0,\n 0,\n this.canvasElement.width,\n this.canvasElement.height\n );\n }\n }\n }\n\n /**\n * Returns an object that is used to perform operations on the `Scene` that's\n * currently being viewed. These operations include updating items,\n * positioning the camera and performing hit tests.\n */\n @Method()\n public async scene(): Promise<Scene> {\n return this.createScene();\n }\n\n /**\n * Returns `true` indicating that the scene is ready to be interacted with.\n */\n @Method()\n public async isSceneReady(): Promise<boolean> {\n return this.stateMap.streamState.type === 'connected';\n }\n\n @Listen('tap')\n private async handleTapEvent(\n event: CustomEvent<TapEventDetails>\n ): Promise<void> {\n this.tapKeyInteractions\n .filter((i) => i.predicate(event.detail))\n .forEach((i) => i.fn(event.detail));\n }\n\n private emitConnectionChange(status: ConnectionStatus): void {\n if (status.status === 'connected') {\n // NOTE: Uncomment once FSS is deployed.\n // if (status.jwt.length === 0) {\n // throw new MissingJWTError('JWT is empty');\n // }\n }\n this.connectionChange.emit(status);\n }\n\n private handleElementResize(entries: ResizeObserverEntry[]): void {\n const dimensionsHaveChanged =\n entries.length > 0 &&\n this.dimensions != null &&\n !Dimensions.isEqual(entries[0].contentRect, this.viewport);\n\n if (dimensionsHaveChanged) {\n if (this.resizeTimer != null) {\n clearTimeout(this.resizeTimer);\n this.resizeTimer = undefined;\n }\n\n if (!this.isResizing) {\n this.resizeTimer = setTimeout(() => {\n this.isResizing = true;\n this.isResizeUpdate = true;\n this.recalculateComponentDimensions();\n }, this.resizeDebounce);\n }\n }\n }\n\n private registerSlotChangeListeners(): void {\n this.mutationObserver = new MutationObserver((_) => this.injectViewerApi());\n this.mutationObserver.observe(this.hostElement, {\n childList: true,\n subtree: true,\n });\n }\n\n private injectViewerApi(): void {\n function queryChildren(el: Element): HTMLElement[] {\n return Array.from(el.querySelectorAll('*'));\n }\n\n const children = queryChildren(this.hostElement);\n\n children\n .filter((node) => node.nodeName.startsWith('VERTEX-'))\n .reduce(\n (elements, element) => [\n ...elements,\n element,\n ...queryChildren(element),\n ],\n [] as Element[]\n )\n .forEach((node) => {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (node as any).viewer = this.hostElement;\n });\n }\n\n private calculateComponentDimensions(): void {\n const maxPixelCount = 2073600;\n const bounds = this.getBounds();\n if (bounds?.width != null && bounds?.height != null) {\n const measuredViewport = Dimensions.create(bounds.width, bounds.height);\n const trimmedViewport = Dimensions.scaleFit(\n maxPixelCount,\n measuredViewport\n );\n\n this.hostDimensions = measuredViewport;\n this.dimensions =\n trimmedViewport != null\n ? Dimensions.create(trimmedViewport.width, trimmedViewport.height)\n : undefined;\n this.viewport = Viewport.fromDimensions(\n this.getCanvasDimensions() ?? Dimensions.create(0, 0)\n );\n }\n }\n\n private recalculateComponentDimensions(): void {\n if (this.isResizing) {\n this.calculateComponentDimensions();\n this.isResizing = false;\n\n if (this.stream?.getState().type === 'connected') {\n this.updateDimensions(this.dimensions);\n }\n }\n }\n\n private reportPerformance(timings: Timing[]): void {\n if (this.stateMap.streamState.type === 'connected') {\n const payload = {\n timings: timings.map((t) => ({\n receiveToPaintDuration: toProtoDuration(t.duration),\n })),\n };\n this.getStream().recordPerformance(payload, false);\n }\n }\n\n private addStreamListeners(): void {\n this.stateMap.streamListeners = this.getStream().stateChanged.on((s) => {\n this.handleStreamStateChanged(this.stateMap.streamState, s);\n });\n }\n\n private handleStreamStateChanged(\n previous: ViewerStreamState,\n state: ViewerStreamState\n ): void {\n this.stateMap.streamState = state;\n\n if (state.type === 'connecting') {\n this.handleConnecting(previous, state);\n } else if (state.type === 'connected') {\n this.handleConnected(previous, state);\n } else if (state.type === 'connection-failed') {\n this.handleConnectionFailed(previous, state);\n } else if (state.type === 'disconnected') {\n this.handleDisconnected(previous, state);\n }\n }\n\n private handleConnecting(\n previous: ViewerStreamState,\n state: Connecting\n ): void {\n if (previous.type !== 'connecting') {\n this.token = undefined;\n this.errorMessage = undefined;\n this.emitConnectionChange({ status: 'connecting' });\n }\n }\n\n private handleConnected(previous: ViewerStreamState, state: Connected): void {\n this.token = state.token.token;\n\n if (previous.type !== 'connected') {\n this.errorMessage = undefined;\n this.canvasRenderer = measureCanvasRenderer(\n paintTime,\n createCanvasRenderer(),\n this.getResolvedConfig().flags.logFrameRate,\n (timings) => this.reportPerformance(timings)\n );\n this.emitConnectionChange({\n status: 'connected',\n jwt: state.token.token,\n });\n this.deviceIdChange.emit(state.deviceId);\n }\n\n if (this.frame?.getId() !== state.frame.getId()) {\n this.updateFrame(state.frame);\n }\n\n this.updateDimensions(this.dimensions);\n }\n\n private handleConnectionFailed(\n previous: ViewerStreamState,\n state: ConnectionFailed\n ): void {\n if (previous.type !== 'connection-failed') {\n this.token = undefined;\n this.errorMessage = state.message;\n this.emitConnectionChange({\n status: 'connection-failed',\n errorMessage: state.message,\n });\n }\n }\n\n private handleDisconnected(\n previous: ViewerStreamState,\n state: Disconnected\n ): void {\n if (previous.type !== 'disconnected') {\n this.token = undefined;\n this.errorMessage = undefined;\n this.emitConnectionChange({ status: 'disconnected' });\n }\n }\n\n private updateDimensions(dimensions?: Dimensions.Dimensions): void {\n this.stream?.update({ dimensions });\n this.dimensionschange.emit(dimensions);\n }\n\n private async updateFrame(frame: Frame): Promise<void> {\n const canvasDimensions = this.getCanvasDimensions();\n\n if (\n this.canvasElement != null &&\n canvasDimensions != null &&\n this.frame?.getId() !== frame.getId()\n ) {\n const canvas = this.canvasElement.getContext('2d');\n if (canvas != null) {\n const previousFrame = this.frame;\n this.frame = SceneViewSummary.copySummaryIfInvalid(\n frame,\n previousFrame\n );\n\n this.updateInteractionApi(previousFrame);\n\n const data = {\n canvas,\n canvasDimensions,\n dimensions: this.dimensions,\n frame: this.frame,\n viewport: this.viewport,\n beforeDraw: () => {\n this.updateCanvasDimensions(canvasDimensions);\n this.isResizeUpdate = false;\n },\n predicate: () => {\n if (this.isResizeUpdate) {\n return (\n this.dimensions == null ||\n Dimensions.isEqual(\n this.dimensions,\n data.frame.image.imageAttr.frameDimensions\n )\n );\n }\n return true;\n },\n };\n\n this.frameReceived.emit(this.frame);\n\n if (this.frame.scene.hasChanged) {\n this.sceneChanged.emit();\n }\n\n const drawnFrame = await this.canvasRenderer(data);\n\n if (drawnFrame != null) {\n this.dispatchFrameDrawn(drawnFrame);\n }\n }\n }\n }\n\n private async initializeDefaultInteractionHandlers(): Promise<void> {\n await this.initializeDefaultCameraInteractionHandlers();\n await this.initializeDefaultTapInteractionHandler();\n this.initializeDefaultKeyboardInteractionHandlers();\n\n if (this.rotateAroundTapPoint) {\n this.baseInteractionHandler?.setPrimaryInteractionType('rotate-point');\n }\n }\n\n private clearDefaultCameraInteractionHandlers(): void {\n this.defaultInteractionHandlerDisposables.forEach((disposable) =>\n disposable.dispose()\n );\n this.defaultInteractionHandlerDisposables = [];\n }\n\n private clearDefaultKeyboardInteractions(): void {\n this.defaultTapKeyInteractions.forEach((interaction) => {\n const index = this.tapKeyInteractions.indexOf(interaction);\n if (index !== -1) {\n this.tapKeyInteractions.splice(index, 1);\n }\n });\n this.tapKeyInteractions = [];\n }\n\n private async initializeDefaultCameraInteractionHandlers(): Promise<void> {\n this.clearDefaultCameraInteractionHandlers();\n\n if (this.cameraControls) {\n if (window.PointerEvent != null) {\n this.baseInteractionHandler =\n this.baseInteractionHandler ??\n new PointerInteractionHandler(() => this.getResolvedConfig());\n const baseDisposable = await this.registerInteractionHandler(\n this.baseInteractionHandler\n );\n const multiPointerDisposable = await this.registerInteractionHandler(\n new MultiPointerInteractionHandler()\n );\n\n this.defaultInteractionHandlerDisposables = [\n baseDisposable,\n multiPointerDisposable,\n ];\n } else {\n // fallback to touch events and mouse events as a default\n this.baseInteractionHandler =\n this.baseInteractionHandler ??\n new MouseInteractionHandler(() => this.getResolvedConfig());\n const baseDisposable = await this.registerInteractionHandler(\n this.baseInteractionHandler\n );\n const touchDisposable = await this.registerInteractionHandler(\n new TouchInteractionHandler()\n );\n\n this.defaultInteractionHandlerDisposables = [\n baseDisposable,\n touchDisposable,\n ];\n }\n }\n }\n\n private initializeDefaultKeyboardInteractionHandlers(): void {\n this.clearDefaultKeyboardInteractions();\n\n if (this.keyboardControls && this.stream != null) {\n this.baseInteractionHandler?.setDefaultKeyboardControls(\n this.keyboardControls\n );\n\n const flyToPart = new FlyToPartKeyInteraction(\n this.stream,\n () => this.getResolvedConfig(),\n () => this.getImageScale()\n );\n const flyToPosition = new FlyToPositionKeyInteraction(\n this.stream,\n () => this.getResolvedConfig(),\n () => this.getImageScale(),\n () => this.createScene()\n );\n\n this.registerTapKeyInteraction(flyToPart);\n this.registerTapKeyInteraction(flyToPosition);\n\n this.defaultTapKeyInteractions = [flyToPart, flyToPosition];\n }\n }\n\n private async initializeDefaultTapInteractionHandler(): Promise<void> {\n if (this.tapHandlerDisposable == null) {\n if (window.PointerEvent != null) {\n const tapInteractionHandler = new TapInteractionHandler(\n 'pointerdown',\n 'pointerup',\n 'pointermove',\n () => this.getResolvedConfig()\n );\n\n this.tapHandlerDisposable = await this.registerInteractionHandler(\n tapInteractionHandler\n );\n } else {\n const tapInteractionHandler = new TapInteractionHandler(\n 'mousedown',\n 'mouseup',\n 'mousemove',\n () => this.getResolvedConfig()\n );\n\n this.tapHandlerDisposable = await this.registerInteractionHandler(\n tapInteractionHandler\n );\n }\n }\n }\n\n private initializeInteractionHandler(handler: InteractionHandler): void {\n if (this.stateMap.interactionTarget == null) {\n throw new InteractionHandlerError(\n 'Cannot initialize interaction handler. Interaction target is undefined.'\n );\n }\n if (this.interactionApi == null) {\n throw new InteractionHandlerError(\n 'Cannot initialize interaction handler. Interaction APi is undefined.'\n );\n }\n handler.initialize(this.stateMap.interactionTarget, this.interactionApi);\n }\n\n private createInteractionApi(): InteractionApi {\n if (this.stream == null) {\n throw new ComponentInitializationError(\n 'Cannot create interaction API. Component has not been initialized.'\n );\n }\n\n return this.frame == null || this.frame.scene.camera.isPerspective()\n ? new InteractionApiPerspective(\n this.stream,\n this.stateMap.cursorManager,\n () => this.getResolvedConfig().interactions,\n () => this.createScene(),\n () => this.frame,\n () => this.viewport,\n this.tap,\n this.doubletap,\n this.longpress,\n this.interactionStarted,\n this.interactionFinished\n )\n : new InteractionApiOrthographic(\n this.stream,\n this.stateMap.cursorManager,\n () => this.getResolvedConfig().interactions,\n () => this.createScene(),\n () => this.frame,\n () => this.viewport,\n this.tap,\n this.doubletap,\n this.longpress,\n this.interactionStarted,\n this.interactionFinished\n );\n }\n\n private handleCursorChanged(): void {\n window.requestAnimationFrame(() => {\n this.cursor = this.stateMap.cursorManager.getActiveCursor();\n });\n }\n\n private async createScene(): Promise<Scene> {\n const state = await this.waitForConnectedState();\n\n const { frame, sceneId, sceneViewId, worldOrientation } = state;\n\n return new Scene(\n this.getStream(),\n frame,\n fromPbFrameOrThrow(worldOrientation),\n () => this.getImageScale(),\n this.viewport,\n sceneId,\n sceneViewId\n );\n }\n\n /**\n * This function is currently not in use, but will required\n * when we want to automatically configure the background color of\n * JPEG images.\n */\n private getBackgroundColor(): Color.Color | undefined {\n if (this.containerElement != null) {\n return getElementBackgroundColor(this.containerElement);\n }\n }\n\n private getBounds(): ClientRect | undefined {\n return getElementBoundingClientRect(this.hostElement);\n }\n\n private getCanvasDimensions(): Dimensions.Dimensions | undefined {\n return this.getResolvedConfig().flags.letterboxFrames\n ? this.dimensions\n : this.hostDimensions;\n }\n\n private getImageScale(): Point.Point | undefined {\n const canvasDimensions = this.getCanvasDimensions();\n if (this.dimensions != null && canvasDimensions != null) {\n return Point.create(\n this.dimensions.width / canvasDimensions.width,\n this.dimensions.height / canvasDimensions.height\n );\n }\n }\n\n private getStreamAttributes(): StreamAttributes {\n return {\n depthBuffers: this.getDepthBufferStreamAttributesValue(),\n experimentalGhosting: this.experimentalGhostingOpacity,\n phantom: this.phantom,\n noDefaultLights: this.noDefaultLights,\n featureLines: this.featureLines,\n featureHighlighting: this.featureHighlighting,\n featureMaps: this.featureMaps,\n experimentalRenderingOptions: this.experimentalRenderingOptions,\n selectionHighlighting: this.selectionHighlighting,\n };\n }\n\n private updateCanvasDimensions(dimensions: Dimensions.Dimensions): void {\n if (this.canvasElement != null) {\n this.canvasElement.width = dimensions.width;\n this.canvasElement.height = dimensions.height;\n }\n }\n\n private updateStreamAttributes(): void {\n this.stream?.update({ streamAttributes: this.getStreamAttributes() });\n }\n\n private updateInteractionApi(previousFrame?: Frame): void {\n if (this.frame != null) {\n const hasChangedFromPerspective =\n (previousFrame == null || previousFrame.scene.camera.isPerspective()) &&\n this.frame.scene.camera.isOrthographic();\n const hasChangedFromOrthographic =\n (previousFrame == null ||\n previousFrame.scene.camera.isOrthographic()) &&\n this.frame.scene.camera.isPerspective();\n\n if (hasChangedFromPerspective || hasChangedFromOrthographic) {\n this.interactionApi = this.createInteractionApi();\n this.cameraType = this.frame.scene.camera.isPerspective()\n ? 'perspective'\n : 'orthographic';\n this.cameraTypeChanged.emit(this.cameraType);\n\n this.interactionHandlers.forEach((handler) =>\n this.initializeInteractionHandler(handler)\n );\n }\n }\n }\n\n private updateCameraType(): void {\n if (this.frame != null) {\n if (\n this.cameraType === 'orthographic' &&\n this.frame.scene.camera.isPerspective()\n ) {\n this.stream?.replaceCamera({\n camera: FrameCamera.toProtobuf(\n FrameCamera.toOrthographic(\n this.frame.scene.camera,\n this.frame.scene.boundingBox\n )\n ),\n });\n } else if (\n this.cameraType === 'perspective' &&\n this.frame.scene.camera.isOrthographic()\n ) {\n this.stream?.replaceCamera({\n camera: FrameCamera.toProtobuf(\n FrameCamera.toPerspective(this.frame.scene.camera)\n ),\n });\n }\n }\n }\n\n private getDepthBufferStreamAttributesValue(): FrameType {\n const depthBuffer =\n this.depthBuffers ?? (this.rotateAroundTapPoint ? 'final' : undefined);\n return depthBuffer;\n }\n\n private updateResolvedConfig(): void {\n this.resolvedConfig = parseConfig(this.configEnv, this.config);\n }\n\n private getResolvedConfig(): Config {\n return getRequiredProp(\n 'Resolved config is undefined',\n () => this.resolvedConfig\n );\n }\n\n private getStream(): ViewerStream {\n return getRequiredProp('Stream is undefined', () => this.stream);\n }\n\n private getDeviceId(): string | undefined {\n if (this.deviceId == null) {\n try {\n this.deviceId = getStorageEntry(\n StorageKeys.DEVICE_ID,\n (entry) => entry['device-id']\n );\n } catch (e) {\n console.warn('Cannot read device ID. Local storage is not supported.');\n }\n\n if (this.deviceId == null) {\n this.deviceId = UUID.create();\n\n try {\n upsertStorageEntry(StorageKeys.DEVICE_ID, {\n ['device-id']: this.deviceId,\n });\n } catch (e) {\n console.warn(\n 'Cannot write device ID. Local storage is not supported.'\n );\n }\n }\n }\n return this.deviceId;\n }\n\n private async waitForConnectedState(): Promise<Connected> {\n if (this.stateMap.streamState.type !== 'connected') {\n console.debug(\n 'Stream was not in a connected state. Waiting for successful connection.'\n );\n return new Promise<Connected>((resolve, reject) => {\n const disposable = this.getStream().onStateChanged((state) => {\n if (state.type === 'connected') {\n resolve(state);\n }\n });\n\n setTimeout(() => {\n disposable.dispose();\n reject(new Error('Timed out waiting for connected state.'));\n }, DEFAULT_VIEWER_SCENE_WAIT_MS);\n });\n }\n\n return this.stateMap.streamState;\n }\n}\n\nfunction getRequiredProp<T>(errorMsg: string, getter: () => T | undefined): T {\n const value = getter();\n if (value != null) {\n return value;\n } else throw new Error(errorMsg);\n}\n"]}
@@ -36,9 +36,10 @@ export class InteractionApiOrthographic extends InteractionApi {
36
36
  const viewVector = camera.viewVector;
37
37
  const normalizedUpVector = Vector3.normalize(camera.up);
38
38
  const normalizedViewVector = Vector3.normalize(viewVector);
39
- const d = Vector3.magnitude(viewVector) * Math.tan(camera.fovHeight);
40
- const epsilonX = (delta.x * d) / viewport.width;
41
- const epsilonY = (delta.y / viewport.width) * d;
39
+ const throttledDelta = Point.scale(delta, 0.5, 0.5);
40
+ const d = Vector3.magnitude(viewVector);
41
+ const epsilonX = (throttledDelta.x * d) / viewport.width;
42
+ const epsilonY = (throttledDelta.y / viewport.width) * d;
42
43
  const xvec = Vector3.cross(normalizedUpVector, normalizedViewVector);
43
44
  const yvec = Vector3.cross(normalizedViewVector, xvec);
44
45
  const offset = Vector3.add(Vector3.scale(epsilonX, xvec), Vector3.scale(epsilonY, yvec));
@@ -111,7 +112,7 @@ export class InteractionApiOrthographic extends InteractionApi {
111
112
  }
112
113
  if (this.orthographicZoomData != null) {
113
114
  const { hitPt, hitPlane } = this.orthographicZoomData;
114
- const relativeDelta = 2 * (camera.fovHeight / viewport.height) * delta;
115
+ const relativeDelta = 2 * (camera.fovHeight / viewport.height) * delta * 2;
115
116
  const fovHeight = Math.max(1, camera.fovHeight - relativeDelta);
116
117
  const projectedLookAt = Plane.projectPoint(hitPlane, camera.lookAt);
117
118
  const diff = Vector3.scale((camera.fovHeight - fovHeight) / camera.fovHeight, Vector3.subtract(hitPt, projectedLookAt));
@@ -1 +1 @@
1
- {"version":3,"file":"interactionApiOrthographic.js","sourceRoot":"","sources":["../../../src/lib/interactions/interactionApiOrthographic.ts"],"names":[],"mappings":"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","sourcesContent":["import { EventEmitter } from '@stencil/core';\nimport { Plane, Point, Ray, Vector3 } from '@vertexvis/geometry';\nimport { StreamApi } from '@vertexvis/stream-api';\n\nimport { ReceivedFrame } from '../..';\nimport { CursorManager } from '../cursors';\nimport { OrthographicCamera } from '../scenes';\nimport { DepthBuffer, Viewport } from '../types';\nimport { ZoomData } from './interactionApi';\nimport {\n CameraTransform,\n InteractionApi,\n InteractionConfigProvider,\n SceneProvider,\n} from './interactionApi';\nimport { TapEventDetails } from './tapEventDetails';\n\ninterface OrthographicZoomData extends ZoomData {\n startingScreenPt: Point.Point;\n}\n\nexport class InteractionApiOrthographic extends InteractionApi {\n private orthographicZoomData?: OrthographicZoomData;\n\n public constructor(\n stream: StreamApi,\n cursors: CursorManager,\n getConfig: InteractionConfigProvider,\n getScene: SceneProvider,\n getFrame: () => ReceivedFrame | undefined,\n getViewport: () => Viewport,\n tapEmitter: EventEmitter<TapEventDetails>,\n doubleTapEmitter: EventEmitter<TapEventDetails>,\n longPressEmitter: EventEmitter<TapEventDetails>,\n interactionStartedEmitter: EventEmitter<void>,\n interactionFinishedEmitter: EventEmitter<void>\n ) {\n super(\n stream,\n cursors,\n getConfig,\n getScene,\n getFrame,\n getViewport,\n tapEmitter,\n doubleTapEmitter,\n longPressEmitter,\n interactionStartedEmitter,\n interactionFinishedEmitter\n );\n }\n\n /**\n * Returns a 3D point in world space for the given 2D point in viewport space.\n *\n * @param point A point in 2D viewport space to transform.\n * @returns A 3D point in world space.\n */\n public async getWorldPointFromViewport(\n point: Point.Point\n ): Promise<Vector3.Vector3 | undefined> {\n const viewport = this.getViewport();\n const frame = this.getFrame();\n\n if (frame == null) {\n throw new Error('Cannot get world point. Frame is undefined.');\n }\n\n const depthBuffer = await frame.depthBuffer();\n return depthBuffer != null\n ? viewport.transformPointToOrthographicWorldSpace(point, depthBuffer, 0.5)\n : undefined;\n }\n\n /**\n * Performs a pan operation of the scene's camera, and requests a new image\n * for the updated scene.\n *\n * @param delta A position delta `{x, y}` in the 2D coordinate space of the\n * viewer.\n */\n public async panCameraByDelta(delta: Point.Point): Promise<void> {\n return this.transformCamera(({ camera, viewport }) => {\n const viewVector = camera.viewVector;\n const normalizedUpVector = Vector3.normalize(camera.up);\n const normalizedViewVector = Vector3.normalize(viewVector);\n\n const d = Vector3.magnitude(viewVector) * Math.tan(camera.fovHeight);\n const epsilonX = (delta.x * d) / viewport.width;\n const epsilonY = (delta.y / viewport.width) * d;\n\n const xvec = Vector3.cross(normalizedUpVector, normalizedViewVector);\n const yvec = Vector3.cross(normalizedViewVector, xvec);\n const offset = Vector3.add(\n Vector3.scale(epsilonX, xvec),\n Vector3.scale(epsilonY, yvec)\n );\n\n return camera.moveBy(offset);\n });\n }\n\n /**\n * Moves the camera's position and look at to the given screen coordinate.\n *\n * If the screen coordinate intersects with an object, the camera will track\n * the hit point so the mouse position is always under the mouse.\n *\n * If the screen coordinate doesn't intersect with an object, then ???.\n *\n * @param screenPt A point in screen coordinates.\n */\n public async panCameraToScreenPoint(screenPt: Point.Point): Promise<void> {\n return this.transformCamera(({ camera, frame, viewport }) => {\n // Capture the starting state of the pan.\n if (this.panData == null) {\n const startingCamera = camera.toFrameCamera();\n const direction = startingCamera.direction;\n\n const ray = viewport.transformPointToOrthographicRay(\n screenPt,\n frame.image,\n startingCamera\n );\n const hitPlane = Plane.fromNormalAndCoplanarPoint(\n direction,\n camera.lookAt\n );\n const hitPt = Ray.intersectPlane(ray, hitPlane);\n if (hitPt == null) {\n console.warn(\n 'Cannot determine fallback for pan. Ray does not intersect plane.'\n );\n return camera;\n }\n\n this.panData = { hitPt, hitPlane, startingCamera };\n }\n\n if (this.panData != null) {\n const { hitPt, hitPlane, startingCamera } = this.panData;\n\n // Use a ray that originates at the screen and intersects with the hit\n // plane to determine the move distance.\n const ray = viewport.transformPointToOrthographicRay(\n screenPt,\n frame.image,\n startingCamera\n );\n const movePt = Ray.intersectPlane(ray, hitPlane);\n\n if (movePt != null) {\n const delta = Vector3.subtract(hitPt, movePt);\n return camera.update({\n lookAt: Vector3.add(startingCamera.lookAt, delta),\n });\n }\n }\n return camera;\n });\n }\n\n public async zoomCameraToPoint(\n point: Point.Point,\n delta: number\n ): Promise<void> {\n return this.transformCamera(({ camera, viewport, frame, depthBuffer }) => {\n if (\n this.orthographicZoomData == null ||\n Point.distance(point, this.orthographicZoomData.startingScreenPt) > 2\n ) {\n const frameCam = camera.toFrameCamera();\n const dir = frameCam.direction;\n const ray = viewport.transformPointToOrthographicRay(\n point,\n frame.image,\n frameCam\n );\n\n const fallbackPlane = Plane.fromNormalAndCoplanarPoint(\n dir,\n frameCam.lookAt\n );\n const fallbackPt = Ray.intersectPlane(ray, fallbackPlane);\n if (fallbackPt == null) {\n console.warn(\n 'Cannot determine fallback point for zoom. Ray does not intersect plane.'\n );\n return camera;\n }\n\n const hitPt =\n depthBuffer != null\n ? this.getWorldPoint(point, depthBuffer, fallbackPt)\n : fallbackPt;\n const hitPlane = Plane.fromNormalAndCoplanarPoint(dir, hitPt);\n this.orthographicZoomData = {\n hitPt,\n hitPlane,\n startingScreenPt: point,\n };\n }\n\n if (this.orthographicZoomData != null) {\n const { hitPt, hitPlane } = this.orthographicZoomData;\n\n const relativeDelta = 2 * (camera.fovHeight / viewport.height) * delta;\n const fovHeight = Math.max(1, camera.fovHeight - relativeDelta);\n const projectedLookAt = Plane.projectPoint(hitPlane, camera.lookAt);\n const diff = Vector3.scale(\n (camera.fovHeight - fovHeight) / camera.fovHeight,\n Vector3.subtract(hitPt, projectedLookAt)\n );\n\n return camera.update({\n lookAt: Vector3.add(camera.lookAt, diff),\n fovHeight: Math.max(1, camera.fovHeight - relativeDelta),\n });\n }\n return camera;\n });\n }\n\n protected getWorldPoint(\n point: Point.Point,\n depthBuffer: DepthBuffer,\n fallbackPoint: Vector3.Vector3\n ): Vector3.Vector3 {\n const viewport = this.getViewport();\n const framePt = viewport.transformPointToFrame(point, depthBuffer);\n const hasDepth = depthBuffer.hitTest(framePt);\n return hasDepth\n ? viewport.transformPointToOrthographicWorldSpace(point, depthBuffer)\n : fallbackPoint;\n }\n\n public async transformCamera(\n t: CameraTransform<OrthographicCamera>\n ): Promise<void> {\n if (this.isInteracting()) {\n const scene = await this.getScene();\n const viewport = this.getViewport();\n const frame = this.getFrame();\n const depthBuffer = await frame?.depthBuffer();\n\n this.currentCamera =\n this.currentCamera != null && viewport != null && frame != null\n ? t({\n camera: this.currentCamera as OrthographicCamera,\n viewport,\n scale: scene.scale(),\n boundingBox: scene.boundingBox(),\n frame,\n depthBuffer,\n })\n : undefined;\n\n await this.currentCamera?.render();\n }\n }\n}\n"]}
1
+ {"version":3,"file":"interactionApiOrthographic.js","sourceRoot":"","sources":["../../../src/lib/interactions/interactionApiOrthographic.ts"],"names":[],"mappings":"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","sourcesContent":["import { EventEmitter } from '@stencil/core';\nimport { Plane, Point, Ray, Vector3 } from '@vertexvis/geometry';\nimport { StreamApi } from '@vertexvis/stream-api';\n\nimport { ReceivedFrame } from '../..';\nimport { CursorManager } from '../cursors';\nimport { OrthographicCamera } from '../scenes';\nimport { DepthBuffer, Viewport } from '../types';\nimport { ZoomData } from './interactionApi';\nimport {\n CameraTransform,\n InteractionApi,\n InteractionConfigProvider,\n SceneProvider,\n} from './interactionApi';\nimport { TapEventDetails } from './tapEventDetails';\n\ninterface OrthographicZoomData extends ZoomData {\n startingScreenPt: Point.Point;\n}\n\nexport class InteractionApiOrthographic extends InteractionApi {\n private orthographicZoomData?: OrthographicZoomData;\n\n public constructor(\n stream: StreamApi,\n cursors: CursorManager,\n getConfig: InteractionConfigProvider,\n getScene: SceneProvider,\n getFrame: () => ReceivedFrame | undefined,\n getViewport: () => Viewport,\n tapEmitter: EventEmitter<TapEventDetails>,\n doubleTapEmitter: EventEmitter<TapEventDetails>,\n longPressEmitter: EventEmitter<TapEventDetails>,\n interactionStartedEmitter: EventEmitter<void>,\n interactionFinishedEmitter: EventEmitter<void>\n ) {\n super(\n stream,\n cursors,\n getConfig,\n getScene,\n getFrame,\n getViewport,\n tapEmitter,\n doubleTapEmitter,\n longPressEmitter,\n interactionStartedEmitter,\n interactionFinishedEmitter\n );\n }\n\n /**\n * Returns a 3D point in world space for the given 2D point in viewport space.\n *\n * @param point A point in 2D viewport space to transform.\n * @returns A 3D point in world space.\n */\n public async getWorldPointFromViewport(\n point: Point.Point\n ): Promise<Vector3.Vector3 | undefined> {\n const viewport = this.getViewport();\n const frame = this.getFrame();\n\n if (frame == null) {\n throw new Error('Cannot get world point. Frame is undefined.');\n }\n\n const depthBuffer = await frame.depthBuffer();\n return depthBuffer != null\n ? viewport.transformPointToOrthographicWorldSpace(point, depthBuffer, 0.5)\n : undefined;\n }\n\n /**\n * Performs a pan operation of the scene's camera, and requests a new image\n * for the updated scene.\n *\n * @param delta A position delta `{x, y}` in the 2D coordinate space of the\n * viewer.\n */\n public async panCameraByDelta(delta: Point.Point): Promise<void> {\n return this.transformCamera(({ camera, viewport }) => {\n const viewVector = camera.viewVector;\n const normalizedUpVector = Vector3.normalize(camera.up);\n const normalizedViewVector = Vector3.normalize(viewVector);\n\n const throttledDelta = Point.scale(delta, 0.5, 0.5);\n const d = Vector3.magnitude(viewVector);\n const epsilonX = (throttledDelta.x * d) / viewport.width;\n const epsilonY = (throttledDelta.y / viewport.width) * d;\n\n const xvec = Vector3.cross(normalizedUpVector, normalizedViewVector);\n const yvec = Vector3.cross(normalizedViewVector, xvec);\n const offset = Vector3.add(\n Vector3.scale(epsilonX, xvec),\n Vector3.scale(epsilonY, yvec)\n );\n\n return camera.moveBy(offset);\n });\n }\n\n /**\n * Moves the camera's position and look at to the given screen coordinate.\n *\n * If the screen coordinate intersects with an object, the camera will track\n * the hit point so the mouse position is always under the mouse.\n *\n * If the screen coordinate doesn't intersect with an object, then ???.\n *\n * @param screenPt A point in screen coordinates.\n */\n public async panCameraToScreenPoint(screenPt: Point.Point): Promise<void> {\n return this.transformCamera(({ camera, frame, viewport }) => {\n // Capture the starting state of the pan.\n if (this.panData == null) {\n const startingCamera = camera.toFrameCamera();\n const direction = startingCamera.direction;\n\n const ray = viewport.transformPointToOrthographicRay(\n screenPt,\n frame.image,\n startingCamera\n );\n const hitPlane = Plane.fromNormalAndCoplanarPoint(\n direction,\n camera.lookAt\n );\n const hitPt = Ray.intersectPlane(ray, hitPlane);\n if (hitPt == null) {\n console.warn(\n 'Cannot determine fallback for pan. Ray does not intersect plane.'\n );\n return camera;\n }\n\n this.panData = { hitPt, hitPlane, startingCamera };\n }\n\n if (this.panData != null) {\n const { hitPt, hitPlane, startingCamera } = this.panData;\n\n // Use a ray that originates at the screen and intersects with the hit\n // plane to determine the move distance.\n const ray = viewport.transformPointToOrthographicRay(\n screenPt,\n frame.image,\n startingCamera\n );\n const movePt = Ray.intersectPlane(ray, hitPlane);\n\n if (movePt != null) {\n const delta = Vector3.subtract(hitPt, movePt);\n return camera.update({\n lookAt: Vector3.add(startingCamera.lookAt, delta),\n });\n }\n }\n return camera;\n });\n }\n\n public async zoomCameraToPoint(\n point: Point.Point,\n delta: number\n ): Promise<void> {\n return this.transformCamera(({ camera, viewport, frame, depthBuffer }) => {\n if (\n this.orthographicZoomData == null ||\n Point.distance(point, this.orthographicZoomData.startingScreenPt) > 2\n ) {\n const frameCam = camera.toFrameCamera();\n const dir = frameCam.direction;\n const ray = viewport.transformPointToOrthographicRay(\n point,\n frame.image,\n frameCam\n );\n\n const fallbackPlane = Plane.fromNormalAndCoplanarPoint(\n dir,\n frameCam.lookAt\n );\n const fallbackPt = Ray.intersectPlane(ray, fallbackPlane);\n if (fallbackPt == null) {\n console.warn(\n 'Cannot determine fallback point for zoom. Ray does not intersect plane.'\n );\n return camera;\n }\n\n const hitPt =\n depthBuffer != null\n ? this.getWorldPoint(point, depthBuffer, fallbackPt)\n : fallbackPt;\n const hitPlane = Plane.fromNormalAndCoplanarPoint(dir, hitPt);\n this.orthographicZoomData = {\n hitPt,\n hitPlane,\n startingScreenPt: point,\n };\n }\n\n if (this.orthographicZoomData != null) {\n const { hitPt, hitPlane } = this.orthographicZoomData;\n\n const relativeDelta =\n 2 * (camera.fovHeight / viewport.height) * delta * 2;\n const fovHeight = Math.max(1, camera.fovHeight - relativeDelta);\n const projectedLookAt = Plane.projectPoint(hitPlane, camera.lookAt);\n const diff = Vector3.scale(\n (camera.fovHeight - fovHeight) / camera.fovHeight,\n Vector3.subtract(hitPt, projectedLookAt)\n );\n\n return camera.update({\n lookAt: Vector3.add(camera.lookAt, diff),\n fovHeight: Math.max(1, camera.fovHeight - relativeDelta),\n });\n }\n return camera;\n });\n }\n\n protected getWorldPoint(\n point: Point.Point,\n depthBuffer: DepthBuffer,\n fallbackPoint: Vector3.Vector3\n ): Vector3.Vector3 {\n const viewport = this.getViewport();\n const framePt = viewport.transformPointToFrame(point, depthBuffer);\n const hasDepth = depthBuffer.hitTest(framePt);\n return hasDepth\n ? viewport.transformPointToOrthographicWorldSpace(point, depthBuffer)\n : fallbackPoint;\n }\n\n public async transformCamera(\n t: CameraTransform<OrthographicCamera>\n ): Promise<void> {\n if (this.isInteracting()) {\n const scene = await this.getScene();\n const viewport = this.getViewport();\n const frame = this.getFrame();\n const depthBuffer = await frame?.depthBuffer();\n\n this.currentCamera =\n this.currentCamera != null && viewport != null && frame != null\n ? t({\n camera: this.currentCamera as OrthographicCamera,\n viewport,\n scale: scene.scale(),\n boundingBox: scene.boundingBox(),\n frame,\n depthBuffer,\n })\n : undefined;\n\n await this.currentCamera?.render();\n }\n }\n}\n"]}
@@ -1,7 +1,7 @@
1
1
  /*!
2
2
  * Copyright (c) 2023 Vertex Software LLC. All rights reserved.
3
3
  */
4
- import { Vector3 } from '@vertexvis/geometry';
4
+ import { Point, Vector3 } from '@vertexvis/geometry';
5
5
  import { InteractionApi, } from './interactionApi';
6
6
  export class InteractionApiPerspective extends InteractionApi {
7
7
  constructor(stream, cursors, getConfig, getScene, getFrame, getViewport, tapEmitter, doubleTapEmitter, longPressEmitter, interactionStartedEmitter, interactionFinishedEmitter) {
@@ -20,9 +20,10 @@ export class InteractionApiPerspective extends InteractionApi {
20
20
  const vv = camera.viewVector;
21
21
  const u = Vector3.normalize(camera.up);
22
22
  const v = Vector3.normalize(vv);
23
+ const throttledDelta = Point.scale(delta, 0.25, 0.25);
23
24
  const d = Vector3.magnitude(vv) * Math.tan((_a = camera.fovY) !== null && _a !== void 0 ? _a : 45);
24
- const epsilonX = (delta.x * d) / viewport.width;
25
- const epsilonY = (delta.y / viewport.width) * d;
25
+ const epsilonX = (throttledDelta.x * d) / viewport.width;
26
+ const epsilonY = (throttledDelta.y / viewport.width) * d;
26
27
  const xvec = Vector3.cross(u, v);
27
28
  const yvec = Vector3.cross(v, xvec);
28
29
  const offset = Vector3.add(Vector3.scale(epsilonX, xvec), Vector3.scale(epsilonY, yvec));
@@ -1 +1 @@
1
- {"version":3,"file":"interactionApiPerspective.js","sourceRoot":"","sources":["../../../src/lib/interactions/interactionApiPerspective.ts"],"names":[],"mappings":"AACA,OAAO,EAAS,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAOrD,OAAO,EAEL,cAAc,GAGf,MAAM,kBAAkB,CAAC;AAG1B,MAAM,OAAO,yBAA0B,SAAQ,cAAc;EAC3D,YACE,MAAiB,EACjB,OAAsB,EACtB,SAAoC,EACpC,QAAuB,EACvB,QAAyC,EACzC,WAA2B,EAC3B,UAAyC,EACzC,gBAA+C,EAC/C,gBAA+C,EAC/C,yBAA6C,EAC7C,0BAA8C;IAE9C,KAAK,CACH,MAAM,EACN,OAAO,EACP,SAAS,EACT,QAAQ,EACR,QAAQ,EACR,WAAW,EACX,UAAU,EACV,gBAAgB,EAChB,gBAAgB,EAChB,yBAAyB,EACzB,0BAA0B,CAC3B,CAAC;EACJ,CAAC;EAED;;;;;;KAMG;EACI,KAAK,CAAC,gBAAgB,CAAC,KAAkB;IAC9C,OAAO,IAAI,CAAC,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE;;MACnD,MAAM,EAAE,GAAG,MAAM,CAAC,UAAU,CAAC;MAE7B,MAAM,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;MACvC,MAAM,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;MAEhC,MAAM,CAAC,GAAG,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,MAAA,MAAM,CAAC,IAAI,mCAAI,EAAE,CAAC,CAAC;MAC9D,MAAM,QAAQ,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC;MAChD,MAAM,QAAQ,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;MAEhD,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;MACjC,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;MAEpC,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CACxB,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,EAC7B,OAAO,CAAC,KAAK,CAAC,QAAQ,EAAE,IAAI,CAAC,CAC9B,CAAC;MAEF,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;EACL,CAAC;EAEM,KAAK,CAAC,eAAe,CAC1B,CAAqC;;IAErC,IAAI,IAAI,CAAC,aAAa,EAAE,EAAE;MACxB,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;MACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;MACpC,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;MAC9B,MAAM,WAAW,GAAG,MAAM,CAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,WAAW,EAAE,CAAA,CAAC;MAE/C,IAAI,CAAC,aAAa;QAChB,IAAI,CAAC,aAAa,IAAI,IAAI,IAAI,QAAQ,IAAI,IAAI,IAAI,KAAK,IAAI,IAAI;UAC7D,CAAC,CAAC,CAAC,CAAC;YACA,MAAM,EAAE,IAAI,CAAC,aAAkC;YAC/C,QAAQ;YACR,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE;YACpB,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE;YAChC,KAAK;YACL,WAAW;WACZ,CAAC;UACJ,CAAC,CAAC,SAAS,CAAC;MAEhB,MAAM,CAAA,MAAA,IAAI,CAAC,aAAa,0CAAE,MAAM,EAAE,CAAA,CAAC;KACpC;EACH,CAAC;CACF","sourcesContent":["import { EventEmitter } from '@stencil/core';\nimport { Point, Vector3 } from '@vertexvis/geometry';\nimport { StreamApi } from '@vertexvis/stream-api';\n\nimport { ReceivedFrame } from '../..';\nimport { CursorManager } from '../cursors';\nimport { PerspectiveCamera } from '../scenes';\nimport { Viewport } from '../types';\nimport {\n CameraTransform,\n InteractionApi,\n InteractionConfigProvider,\n SceneProvider,\n} from './interactionApi';\nimport { TapEventDetails } from './tapEventDetails';\n\nexport class InteractionApiPerspective extends InteractionApi {\n public constructor(\n stream: StreamApi,\n cursors: CursorManager,\n getConfig: InteractionConfigProvider,\n getScene: SceneProvider,\n getFrame: () => ReceivedFrame | undefined,\n getViewport: () => Viewport,\n tapEmitter: EventEmitter<TapEventDetails>,\n doubleTapEmitter: EventEmitter<TapEventDetails>,\n longPressEmitter: EventEmitter<TapEventDetails>,\n interactionStartedEmitter: EventEmitter<void>,\n interactionFinishedEmitter: EventEmitter<void>\n ) {\n super(\n stream,\n cursors,\n getConfig,\n getScene,\n getFrame,\n getViewport,\n tapEmitter,\n doubleTapEmitter,\n longPressEmitter,\n interactionStartedEmitter,\n interactionFinishedEmitter\n );\n }\n\n /**\n * Performs a pan operation of the scene's camera, and requests a new image\n * for the updated scene.\n *\n * @param delta A position delta `{x, y}` in the 2D coordinate space of the\n * viewer.\n */\n public async panCameraByDelta(delta: Point.Point): Promise<void> {\n return this.transformCamera(({ camera, viewport }) => {\n const vv = camera.viewVector;\n\n const u = Vector3.normalize(camera.up);\n const v = Vector3.normalize(vv);\n\n const d = Vector3.magnitude(vv) * Math.tan(camera.fovY ?? 45);\n const epsilonX = (delta.x * d) / viewport.width;\n const epsilonY = (delta.y / viewport.width) * d;\n\n const xvec = Vector3.cross(u, v);\n const yvec = Vector3.cross(v, xvec);\n\n const offset = Vector3.add(\n Vector3.scale(epsilonX, xvec),\n Vector3.scale(epsilonY, yvec)\n );\n\n return camera.moveBy(offset);\n });\n }\n\n public async transformCamera(\n t: CameraTransform<PerspectiveCamera>\n ): Promise<void> {\n if (this.isInteracting()) {\n const scene = await this.getScene();\n const viewport = this.getViewport();\n const frame = this.getFrame();\n const depthBuffer = await frame?.depthBuffer();\n\n this.currentCamera =\n this.currentCamera != null && viewport != null && frame != null\n ? t({\n camera: this.currentCamera as PerspectiveCamera,\n viewport,\n scale: scene.scale(),\n boundingBox: scene.boundingBox(),\n frame,\n depthBuffer,\n })\n : undefined;\n\n await this.currentCamera?.render();\n }\n }\n}\n"]}
1
+ {"version":3,"file":"interactionApiPerspective.js","sourceRoot":"","sources":["../../../src/lib/interactions/interactionApiPerspective.ts"],"names":[],"mappings":"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","sourcesContent":["import { EventEmitter } from '@stencil/core';\nimport { Point, Vector3 } from '@vertexvis/geometry';\nimport { StreamApi } from '@vertexvis/stream-api';\n\nimport { ReceivedFrame } from '../..';\nimport { CursorManager } from '../cursors';\nimport { PerspectiveCamera } from '../scenes';\nimport { Viewport } from '../types';\nimport {\n CameraTransform,\n InteractionApi,\n InteractionConfigProvider,\n SceneProvider,\n} from './interactionApi';\nimport { TapEventDetails } from './tapEventDetails';\n\nexport class InteractionApiPerspective extends InteractionApi {\n public constructor(\n stream: StreamApi,\n cursors: CursorManager,\n getConfig: InteractionConfigProvider,\n getScene: SceneProvider,\n getFrame: () => ReceivedFrame | undefined,\n getViewport: () => Viewport,\n tapEmitter: EventEmitter<TapEventDetails>,\n doubleTapEmitter: EventEmitter<TapEventDetails>,\n longPressEmitter: EventEmitter<TapEventDetails>,\n interactionStartedEmitter: EventEmitter<void>,\n interactionFinishedEmitter: EventEmitter<void>\n ) {\n super(\n stream,\n cursors,\n getConfig,\n getScene,\n getFrame,\n getViewport,\n tapEmitter,\n doubleTapEmitter,\n longPressEmitter,\n interactionStartedEmitter,\n interactionFinishedEmitter\n );\n }\n\n /**\n * Performs a pan operation of the scene's camera, and requests a new image\n * for the updated scene.\n *\n * @param delta A position delta `{x, y}` in the 2D coordinate space of the\n * viewer.\n */\n public async panCameraByDelta(delta: Point.Point): Promise<void> {\n return this.transformCamera(({ camera, viewport }) => {\n const vv = camera.viewVector;\n\n const u = Vector3.normalize(camera.up);\n const v = Vector3.normalize(vv);\n\n const throttledDelta = Point.scale(delta, 0.25, 0.25);\n const d = Vector3.magnitude(vv) * Math.tan(camera.fovY ?? 45);\n const epsilonX = (throttledDelta.x * d) / viewport.width;\n const epsilonY = (throttledDelta.y / viewport.width) * d;\n\n const xvec = Vector3.cross(u, v);\n const yvec = Vector3.cross(v, xvec);\n\n const offset = Vector3.add(\n Vector3.scale(epsilonX, xvec),\n Vector3.scale(epsilonY, yvec)\n );\n\n return camera.moveBy(offset);\n });\n }\n\n public async transformCamera(\n t: CameraTransform<PerspectiveCamera>\n ): Promise<void> {\n if (this.isInteracting()) {\n const scene = await this.getScene();\n const viewport = this.getViewport();\n const frame = this.getFrame();\n const depthBuffer = await frame?.depthBuffer();\n\n this.currentCamera =\n this.currentCamera != null && viewport != null && frame != null\n ? t({\n camera: this.currentCamera as PerspectiveCamera,\n viewport,\n scale: scene.scale(),\n boundingBox: scene.boundingBox(),\n frame,\n depthBuffer,\n })\n : undefined;\n\n await this.currentCamera?.render();\n }\n }\n}\n"]}
@@ -13,14 +13,15 @@ export class MultiTouchInteractionHandler {
13
13
  handleTwoPointTouchMove(point1, point2) {
14
14
  var _a, _b, _c, _d;
15
15
  if (this.currentPosition1 != null && this.currentPosition2 != null) {
16
- const delta = Point.scale(Point.add(Point.subtract(point1, this.currentPosition1), Point.subtract(point2, this.currentPosition2)), 0.25, 0.25);
16
+ const delta = Point.add(Point.subtract(point1, this.currentPosition1), Point.subtract(point2, this.currentPosition2));
17
17
  const distance = Point.distance(point1, point2) -
18
18
  Point.distance(this.currentPosition1, this.currentPosition2);
19
19
  const zoom = distance * 0.5;
20
20
  const previousToCurrent = Matrix2.create(Point.subtract(this.currentPosition1, this.currentPosition2), Point.subtract(point1, point2));
21
21
  const angle = Angle.toDegrees(Math.atan2(Matrix2.determinant(previousToCurrent), Matrix2.dot(previousToCurrent)));
22
+ const center = Point.create((point1.x + point2.x) / 2, (point1.y + point2.y) / 2);
22
23
  (_a = this.interactionApi) === null || _a === void 0 ? void 0 : _a.beginInteraction();
23
- (_b = this.interactionApi) === null || _b === void 0 ? void 0 : _b.zoomCamera(zoom);
24
+ (_b = this.interactionApi) === null || _b === void 0 ? void 0 : _b.zoomCameraToPoint(center, zoom);
24
25
  (_c = this.interactionApi) === null || _c === void 0 ? void 0 : _c.panCameraByDelta(delta);
25
26
  // Setting a minimum angle to prevent wobbling
26
27
  if (Math.abs(angle) > 0.5) {
@@ -1 +1 @@
1
- {"version":3,"file":"multiTouchInteractionHandler.js","sourceRoot":"","sources":["../../../src/lib/interactions/multiTouchInteractionHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAK5D,MAAM,OAAgB,4BAA4B;EAQzC,UAAU,CAAC,OAAoB,EAAE,GAAmB;IACzD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACvB,IAAI,CAAC,cAAc,GAAG,GAAG,CAAC;EAC5B,CAAC;EAEM,OAAO;IACZ,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;EAC3B,CAAC;EAES,uBAAuB,CAC/B,MAAmB,EACnB,MAAmB;;IAEnB,IAAI,IAAI,CAAC,gBAAgB,IAAI,IAAI,IAAI,IAAI,CAAC,gBAAgB,IAAI,IAAI,EAAE;MAClE,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CACvB,KAAK,CAAC,GAAG,CACP,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,gBAAgB,CAAC,EAC7C,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAC9C,EACD,IAAI,EACJ,IAAI,CACL,CAAC;MAEF,MAAM,QAAQ,GACZ,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QAC9B,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;MAC/D,MAAM,IAAI,GAAG,QAAQ,GAAG,GAAG,CAAC;MAC5B,MAAM,iBAAiB,GAAG,OAAO,CAAC,MAAM,CACtC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,CAAC,EAC5D,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAC/B,CAAC;MACF,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,CAC3B,IAAI,CAAC,KAAK,CACR,OAAO,CAAC,WAAW,CAAC,iBAAiB,CAAC,EACtC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAC/B,CACF,CAAC;MACF,MAAA,IAAI,CAAC,cAAc,0CAAE,gBAAgB,EAAE,CAAC;MACxC,MAAA,IAAI,CAAC,cAAc,0CAAE,UAAU,CAAC,IAAI,CAAC,CAAC;MACtC,MAAA,IAAI,CAAC,cAAc,0CAAE,gBAAgB,CAAC,KAAK,CAAC,CAAC;MAE7C,8CAA8C;MAC9C,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,EAAE;QACzB,MAAA,IAAI,CAAC,cAAc,0CAAE,WAAW,CAAC,KAAK,CAAC,CAAC;OACzC;KACF;IAED,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC;IAC/B,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC;EACjC,CAAC;CACF","sourcesContent":["import { Angle, Matrix2, Point } from '@vertexvis/geometry';\n\nimport { InteractionApi } from './interactionApi';\nimport { InteractionHandler } from './interactionHandler';\n\nexport abstract class MultiTouchInteractionHandler\n implements InteractionHandler\n{\n protected element?: HTMLElement;\n protected interactionApi?: InteractionApi;\n protected currentPosition1?: Point.Point;\n protected currentPosition2?: Point.Point;\n\n public initialize(element: HTMLElement, api: InteractionApi): void {\n this.element = element;\n this.interactionApi = api;\n }\n\n public dispose(): void {\n this.element = undefined;\n }\n\n protected handleTwoPointTouchMove(\n point1: Point.Point,\n point2: Point.Point\n ): void {\n if (this.currentPosition1 != null && this.currentPosition2 != null) {\n const delta = Point.scale(\n Point.add(\n Point.subtract(point1, this.currentPosition1),\n Point.subtract(point2, this.currentPosition2)\n ),\n 0.25,\n 0.25\n );\n\n const distance =\n Point.distance(point1, point2) -\n Point.distance(this.currentPosition1, this.currentPosition2);\n const zoom = distance * 0.5;\n const previousToCurrent = Matrix2.create(\n Point.subtract(this.currentPosition1, this.currentPosition2),\n Point.subtract(point1, point2)\n );\n const angle = Angle.toDegrees(\n Math.atan2(\n Matrix2.determinant(previousToCurrent),\n Matrix2.dot(previousToCurrent)\n )\n );\n this.interactionApi?.beginInteraction();\n this.interactionApi?.zoomCamera(zoom);\n this.interactionApi?.panCameraByDelta(delta);\n\n // Setting a minimum angle to prevent wobbling\n if (Math.abs(angle) > 0.5) {\n this.interactionApi?.twistCamera(angle);\n }\n }\n\n this.currentPosition1 = point1;\n this.currentPosition2 = point2;\n }\n}\n"]}
1
+ {"version":3,"file":"multiTouchInteractionHandler.js","sourceRoot":"","sources":["../../../src/lib/interactions/multiTouchInteractionHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAK5D,MAAM,OAAgB,4BAA4B;EAQzC,UAAU,CAAC,OAAoB,EAAE,GAAmB;IACzD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACvB,IAAI,CAAC,cAAc,GAAG,GAAG,CAAC;EAC5B,CAAC;EAEM,OAAO;IACZ,IAAI,CAAC,OAAO,GAAG,SAAS,CAAC;EAC3B,CAAC;EAES,uBAAuB,CAC/B,MAAmB,EACnB,MAAmB;;IAEnB,IAAI,IAAI,CAAC,gBAAgB,IAAI,IAAI,IAAI,IAAI,CAAC,gBAAgB,IAAI,IAAI,EAAE;MAClE,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CACrB,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,gBAAgB,CAAC,EAC7C,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAC9C,CAAC;MAEF,MAAM,QAAQ,GACZ,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QAC9B,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC;MAC/D,MAAM,IAAI,GAAG,QAAQ,GAAG,GAAG,CAAC;MAC5B,MAAM,iBAAiB,GAAG,OAAO,CAAC,MAAM,CACtC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,CAAC,EAC5D,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,CAC/B,CAAC;MACF,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,CAC3B,IAAI,CAAC,KAAK,CACR,OAAO,CAAC,WAAW,CAAC,iBAAiB,CAAC,EACtC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAC/B,CACF,CAAC;MACF,MAAM,MAAM,GAAG,KAAK,CAAC,MAAM,CACzB,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EACzB,CAAC,MAAM,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAC1B,CAAC;MAEF,MAAA,IAAI,CAAC,cAAc,0CAAE,gBAAgB,EAAE,CAAC;MACxC,MAAA,IAAI,CAAC,cAAc,0CAAE,iBAAiB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;MACrD,MAAA,IAAI,CAAC,cAAc,0CAAE,gBAAgB,CAAC,KAAK,CAAC,CAAC;MAE7C,8CAA8C;MAC9C,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,EAAE;QACzB,MAAA,IAAI,CAAC,cAAc,0CAAE,WAAW,CAAC,KAAK,CAAC,CAAC;OACzC;KACF;IAED,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC;IAC/B,IAAI,CAAC,gBAAgB,GAAG,MAAM,CAAC;EACjC,CAAC;CACF","sourcesContent":["import { Angle, Matrix2, Point } from '@vertexvis/geometry';\n\nimport { InteractionApi } from './interactionApi';\nimport { InteractionHandler } from './interactionHandler';\n\nexport abstract class MultiTouchInteractionHandler\n implements InteractionHandler\n{\n protected element?: HTMLElement;\n protected interactionApi?: InteractionApi;\n protected currentPosition1?: Point.Point;\n protected currentPosition2?: Point.Point;\n\n public initialize(element: HTMLElement, api: InteractionApi): void {\n this.element = element;\n this.interactionApi = api;\n }\n\n public dispose(): void {\n this.element = undefined;\n }\n\n protected handleTwoPointTouchMove(\n point1: Point.Point,\n point2: Point.Point\n ): void {\n if (this.currentPosition1 != null && this.currentPosition2 != null) {\n const delta = Point.add(\n Point.subtract(point1, this.currentPosition1),\n Point.subtract(point2, this.currentPosition2)\n );\n\n const distance =\n Point.distance(point1, point2) -\n Point.distance(this.currentPosition1, this.currentPosition2);\n const zoom = distance * 0.5;\n const previousToCurrent = Matrix2.create(\n Point.subtract(this.currentPosition1, this.currentPosition2),\n Point.subtract(point1, point2)\n );\n const angle = Angle.toDegrees(\n Math.atan2(\n Matrix2.determinant(previousToCurrent),\n Matrix2.dot(previousToCurrent)\n )\n );\n const center = Point.create(\n (point1.x + point2.x) / 2,\n (point1.y + point2.y) / 2\n );\n\n this.interactionApi?.beginInteraction();\n this.interactionApi?.zoomCameraToPoint(center, zoom);\n this.interactionApi?.panCameraByDelta(delta);\n\n // Setting a minimum angle to prevent wobbling\n if (Math.abs(angle) > 0.5) {\n this.interactionApi?.twistCamera(angle);\n }\n }\n\n this.currentPosition1 = point1;\n this.currentPosition2 = point2;\n }\n}\n"]}
@@ -10,8 +10,11 @@ export function fromUrn(urn) {
10
10
  throw new Error('Invalid URN. Expected URN scheme.');
11
11
  }
12
12
  const [nid, resourceType, resourceId, ...subResourcePath] = uri.path.split(/[:/]/);
13
- if (nid !== 'vertexvis') {
14
- throw new Error('Invalid URN. Expected URN to be vertexvis namespace');
13
+ if (nid !== 'vertexvis' && nid !== 'vertex') {
14
+ throw new Error('Invalid URN. Expected URN to be vertex namespace');
15
+ }
16
+ if (nid === 'vertexvis') {
17
+ console.warn("vertexvis namespace is deprecated. Use 'vertex' for the namespace urn instead");
15
18
  }
16
19
  switch (resourceType) {
17
20
  case 'stream-key':
@@ -1 +1 @@
1
- {"version":3,"file":"loadableResource.js","sourceRoot":"","sources":["../../../src/lib/types/loadableResource.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AAEvC,OAAO,EAAE,uBAAuB,EAAE,MAAM,WAAW,CAAC;AAepD,MAAM,UAAU,OAAO,CAAC,GAAW;;EACjC,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;EAE3B,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,IAAI,GAAG,CAAC,IAAI,IAAI,IAAI,EAAE;IAC5C,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;GACtD;EAED,MAAM,CAAC,GAAG,EAAE,YAAY,EAAE,UAAU,EAAE,GAAG,eAAe,CAAC,GACvD,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;EAEzB,IAAI,GAAG,KAAK,WAAW,EAAE;IACvB,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;GACxE;EAED,QAAQ,YAAY,EAAE;IACpB,KAAK,YAAY;MACf,MAAM,OAAO,GAAG,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;MACrC,MAAM,WAAW,GACf,MAAA,mBAAmB,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,mCAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,kBAAkB,CAEpC,CAAC;MAEjB,OAAO;QACL,QAAQ,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,UAAU,EAAE;QAChD,WAAW;QACX,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,kBAAkB,CAAC;OAC9D,CAAC;IACJ;MACE,MAAM,IAAI,uBAAuB,CAC/B,sCAAsC,YAAY,EAAE,CACrD,CAAC;GACL;AACH,CAAC;AASD,SAAS,mBAAmB,CAAC,IAAa;EACxC,IAAI,IAAI,IAAI,IAAI,EAAE;IAChB,MAAM,CAAC,eAAe,EAAE,aAAa,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAEzD,QAAQ,eAAe,EAAE;MACvB,KAAK,mBAAmB;QACtB,OAAO;UACL,IAAI,EAAE,kBAAkB;UACxB,EAAE,EAAE,aAAa;SAClB,CAAC;MACJ;QACE,OAAO,SAAS,CAAC;KACpB;GACF;AACH,CAAC;AASD,SAAS,SAAS,CAAC,KAAc;EAC/B,IAAI,KAAK,IAAI,IAAI,EAAE;IACjB,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,aAAa,EAAE,EAAE;MAC5C,MAAM,CAAC,YAAY,EAAE,UAAU,CAAC,GAAG,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;MAE5D,QAAQ,YAAY,EAAE;QACpB,KAAK,aAAa;UAChB,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC;QACjD,KAAK,kBAAkB;UACrB,OAAO,EAAE,IAAI,EAAE,kBAAkB,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC;QACtD;UACE,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;OAC5D;IACH,CAAC,CAAC,CAAC;GACJ;OAAM;IACL,OAAO,EAAE,CAAC;GACX;AACH,CAAC","sourcesContent":["import { Uri } from '@vertexvis/utils';\n\nimport { InvalidResourceUrnError } from '../errors';\n\ninterface StreamKeyResource {\n type: 'stream-key';\n id: string;\n}\n\nexport type LoadableResource = StreamKeyResource;\n\nexport interface Resource {\n resource: LoadableResource;\n subResource?: PathResource;\n queries: QueryValue[];\n}\n\nexport function fromUrn(urn: string): Resource {\n const uri = Uri.parse(urn);\n\n if (uri.scheme !== 'urn' || uri.path == null) {\n throw new Error('Invalid URN. Expected URN scheme.');\n }\n\n const [nid, resourceType, resourceId, ...subResourcePath] =\n uri.path.split(/[:/]/);\n\n if (nid !== 'vertexvis') {\n throw new Error('Invalid URN. Expected URN to be vertexvis namespace');\n }\n\n switch (resourceType) {\n case 'stream-key':\n const queries = fromQuery(uri.query);\n const subResource =\n fromSubResourcePath(subResourcePath.join('/')) ??\n (queries.find((q) => q.type === 'scene-view-state') as\n | SceneViewStateResource\n | undefined);\n\n return {\n resource: { type: 'stream-key', id: resourceId },\n subResource,\n queries: queries.filter((q) => q.type !== 'scene-view-state'),\n };\n default:\n throw new InvalidResourceUrnError(\n `Invalid URN. Unknown resource type ${resourceType}`\n );\n }\n}\n\nexport interface SceneViewStateResource {\n type: 'scene-view-state';\n id?: string;\n}\n\nexport type PathResource = SceneViewStateResource;\n\nfunction fromSubResourcePath(path?: string): PathResource | undefined {\n if (path != null) {\n const [subResourceType, subResourceId] = path.split('/');\n\n switch (subResourceType) {\n case 'scene-view-states':\n return {\n type: 'scene-view-state',\n id: subResourceId,\n };\n default:\n return undefined;\n }\n }\n}\n\nexport interface SuppliedIdQueryValue {\n type: 'supplied-id';\n id: string;\n}\n\nexport type QueryValue = SceneViewStateResource | SuppliedIdQueryValue;\n\nfunction fromQuery(query?: string): QueryValue[] {\n if (query != null) {\n return query.split('&').map((queryFragment) => {\n const [resourceType, resourceId] = queryFragment.split('=');\n\n switch (resourceType) {\n case 'supplied-id':\n return { type: 'supplied-id', id: resourceId };\n case 'scene-view-state':\n return { type: 'scene-view-state', id: resourceId };\n default:\n throw new Error('Invalid URN. Unknown query value type');\n }\n });\n } else {\n return [];\n }\n}\n"]}
1
+ {"version":3,"file":"loadableResource.js","sourceRoot":"","sources":["../../../src/lib/types/loadableResource.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,kBAAkB,CAAC;AAEvC,OAAO,EAAE,uBAAuB,EAAE,MAAM,WAAW,CAAC;AAepD,MAAM,UAAU,OAAO,CAAC,GAAW;;EACjC,MAAM,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;EAE3B,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,IAAI,GAAG,CAAC,IAAI,IAAI,IAAI,EAAE;IAC5C,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;GACtD;EAED,MAAM,CAAC,GAAG,EAAE,YAAY,EAAE,UAAU,EAAE,GAAG,eAAe,CAAC,GACvD,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;EAEzB,IAAI,GAAG,KAAK,WAAW,IAAI,GAAG,KAAK,QAAQ,EAAE;IAC3C,MAAM,IAAI,KAAK,CAAC,kDAAkD,CAAC,CAAC;GACrE;EAED,IAAI,GAAG,KAAK,WAAW,EAAE;IACvB,OAAO,CAAC,IAAI,CACV,+EAA+E,CAChF,CAAC;GACH;EAED,QAAQ,YAAY,EAAE;IACpB,KAAK,YAAY;MACf,MAAM,OAAO,GAAG,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;MACrC,MAAM,WAAW,GACf,MAAA,mBAAmB,CAAC,eAAe,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,mCAC7C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,kBAAkB,CAEpC,CAAC;MAEjB,OAAO;QACL,QAAQ,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,UAAU,EAAE;QAChD,WAAW;QACX,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,kBAAkB,CAAC;OAC9D,CAAC;IACJ;MACE,MAAM,IAAI,uBAAuB,CAC/B,sCAAsC,YAAY,EAAE,CACrD,CAAC;GACL;AACH,CAAC;AASD,SAAS,mBAAmB,CAAC,IAAa;EACxC,IAAI,IAAI,IAAI,IAAI,EAAE;IAChB,MAAM,CAAC,eAAe,EAAE,aAAa,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAEzD,QAAQ,eAAe,EAAE;MACvB,KAAK,mBAAmB;QACtB,OAAO;UACL,IAAI,EAAE,kBAAkB;UACxB,EAAE,EAAE,aAAa;SAClB,CAAC;MACJ;QACE,OAAO,SAAS,CAAC;KACpB;GACF;AACH,CAAC;AASD,SAAS,SAAS,CAAC,KAAc;EAC/B,IAAI,KAAK,IAAI,IAAI,EAAE;IACjB,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,aAAa,EAAE,EAAE;MAC5C,MAAM,CAAC,YAAY,EAAE,UAAU,CAAC,GAAG,aAAa,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;MAE5D,QAAQ,YAAY,EAAE;QACpB,KAAK,aAAa;UAChB,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC;QACjD,KAAK,kBAAkB;UACrB,OAAO,EAAE,IAAI,EAAE,kBAAkB,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC;QACtD;UACE,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;OAC5D;IACH,CAAC,CAAC,CAAC;GACJ;OAAM;IACL,OAAO,EAAE,CAAC;GACX;AACH,CAAC","sourcesContent":["import { Uri } from '@vertexvis/utils';\n\nimport { InvalidResourceUrnError } from '../errors';\n\ninterface StreamKeyResource {\n type: 'stream-key';\n id: string;\n}\n\nexport type LoadableResource = StreamKeyResource;\n\nexport interface Resource {\n resource: LoadableResource;\n subResource?: PathResource;\n queries: QueryValue[];\n}\n\nexport function fromUrn(urn: string): Resource {\n const uri = Uri.parse(urn);\n\n if (uri.scheme !== 'urn' || uri.path == null) {\n throw new Error('Invalid URN. Expected URN scheme.');\n }\n\n const [nid, resourceType, resourceId, ...subResourcePath] =\n uri.path.split(/[:/]/);\n\n if (nid !== 'vertexvis' && nid !== 'vertex') {\n throw new Error('Invalid URN. Expected URN to be vertex namespace');\n }\n\n if (nid === 'vertexvis') {\n console.warn(\n \"vertexvis namespace is deprecated. Use 'vertex' for the namespace urn instead\"\n );\n }\n\n switch (resourceType) {\n case 'stream-key':\n const queries = fromQuery(uri.query);\n const subResource =\n fromSubResourcePath(subResourcePath.join('/')) ??\n (queries.find((q) => q.type === 'scene-view-state') as\n | SceneViewStateResource\n | undefined);\n\n return {\n resource: { type: 'stream-key', id: resourceId },\n subResource,\n queries: queries.filter((q) => q.type !== 'scene-view-state'),\n };\n default:\n throw new InvalidResourceUrnError(\n `Invalid URN. Unknown resource type ${resourceType}`\n );\n }\n}\n\nexport interface SceneViewStateResource {\n type: 'scene-view-state';\n id?: string;\n}\n\nexport type PathResource = SceneViewStateResource;\n\nfunction fromSubResourcePath(path?: string): PathResource | undefined {\n if (path != null) {\n const [subResourceType, subResourceId] = path.split('/');\n\n switch (subResourceType) {\n case 'scene-view-states':\n return {\n type: 'scene-view-state',\n id: subResourceId,\n };\n default:\n return undefined;\n }\n }\n}\n\nexport interface SuppliedIdQueryValue {\n type: 'supplied-id';\n id: string;\n}\n\nexport type QueryValue = SceneViewStateResource | SuppliedIdQueryValue;\n\nfunction fromQuery(query?: string): QueryValue[] {\n if (query != null) {\n return query.split('&').map((queryFragment) => {\n const [resourceType, resourceId] = queryFragment.split('=');\n\n switch (resourceType) {\n case 'supplied-id':\n return { type: 'supplied-id', id: resourceId };\n case 'scene-view-state':\n return { type: 'scene-view-state', id: resourceId };\n default:\n throw new Error('Invalid URN. Unknown query value type');\n }\n });\n } else {\n return [];\n }\n}\n"]}
@@ -6,8 +6,8 @@ import { Async } from '@vertexvis/utils';
6
6
  import { ViewerStream } from '../lib/stream/stream';
7
7
  import * as Fixtures from './fixtures';
8
8
  import { random } from './random';
9
- export const key1 = 'urn:vertexvis:stream-key:123';
10
- export const key2 = 'urn:vertexvis:stream-key:234';
9
+ export const key1 = 'urn:vertex:stream-key:123';
10
+ export const key2 = 'urn:vertex:stream-key:234';
11
11
  export function makeViewerStream() {
12
12
  const ws = new WebSocketClientMock();
13
13
  const stream = new ViewerStream(ws);