@shopware-ag/dive 1.18.0 → 1.18.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/constant/VisibilityLayerMask.ts","../src/helper/isInterface/implementsInterface.ts","../src/helper/findInterface/findInterface.ts","../src/toolbox/BaseTool.ts","../src/toolbox/transform/TransformTool.ts","../src/toolbox/select/SelectTool.ts","../src/camera/PerspectiveCamera.ts","../src/mediacreator/MediaCreator.ts","../src/io/gltf/GLTFIO.ts","../src/io/IO.ts","../src/info/Info.ts","../src/exporters/usdz/USDZExporter.ts","../src/ar/arquicklook/ARQuickLook.ts","../src/ar/webxr/overlay/Overlay.ts","../src/ar/webxr/crosshair/WebXRCrosshair.ts","../src/ar/webxr/raycaster/ar/WebXRRaycasterAR.ts","../src/ar/webxr/raycaster/three/WebXRRaycasterTHREE.ts","../src/events/EventExecutor.ts","../src/ar/webxr/raycaster/WebXRRaycaster.ts","../src/ar/webxr/origin/WebXROrigin.ts","../src/ar/webxr/touchscreencontrols/WebXRTouchscreenControls.ts","../src/ar/webxr/controller/WebXRController.ts","../src/ar/webxr/WebXR.ts","../src/ar/sceneviewer/SceneViewer.ts","../src/ar/AR.ts","../src/dive.ts","../src/renderer/Renderer.ts","../src/scene/Scene.ts","../src/scene/root/Root.ts","../src/light/AmbientLight.ts","../src/light/PointLight.ts","../src/com/Communication.ts","../src/light/SceneLight.ts","../src/model/Model.ts","../src/helper/findSceneRecursive/findSceneRecursive.ts","../src/node/Node.ts","../src/loadingmanager/LoadingManager.ts","../src/primitive/Primitive.ts","../src/group/Group.ts","../src/constant/GridColors.ts","../src/grid/Grid.ts","../src/primitive/floor/Floor.ts","../src/scene/xrroot/XRRoot.ts","../src/scene/xrroot/xrlightroot/XRLightRoot.ts","../src/controls/OrbitControls.ts","../src/toolbox/Toolbox.ts","../src/animation/AnimationSystem.ts","../src/axiscamera/AxisCamera.ts","../src/constant/AxisHelperColors.ts","../src/helper/getObjectDelta/getObjectDelta.ts","../package.json","../src/math/helper/shift.ts","../src/math/ceil/ceilExp.ts","../src/math/floor/floorExp.ts","../src/math/round/roundExp.ts","../src/math/signedAngleTo/signedAngleTo.ts","../src/math/toFixed/toFixedExp.ts","../src/math/truncate/truncateExp.ts","../src/math/radToDeg/radToDeg.ts","../src/math/degToRad/degToRad.ts","../src/math/index.ts"],"sourcesContent":["export const DEFAULT_LAYER_MASK = 0b00000001; // 1\nexport const COORDINATE_LAYER_MASK = 0b00000010; // 2\nexport const UI_LAYER_MASK = 0b00000100; // 4\nexport const HELPER_LAYER_MASK = 0b00001000; // 8\nexport const PRODUCT_LAYER_MASK = 0b00010000; // 16\n","import { type Object3D } from 'three';\n\nexport function implementsInterface<T>(\n object: Object3D | null | undefined,\n discriminator: string,\n): object is Object3D & T {\n if (!object) return false;\n return discriminator in object;\n}\n","import { implementsInterface } from '../isInterface/implementsInterface';\nimport { type Object3D } from 'three';\n\nexport function findInterface<T>(\n object: Object3D | null | undefined,\n discriminator: string,\n): (Object3D & T) | undefined {\n if (!object) return undefined;\n\n if (implementsInterface<T>(object, discriminator)) return object;\n\n return findInterface<T>(object.parent, discriminator);\n}\n","import {\n type Intersection,\n type Object3D,\n Raycaster,\n Vector2,\n Vector3,\n} from 'three';\nimport {\n PRODUCT_LAYER_MASK,\n UI_LAYER_MASK,\n} from '../constant/VisibilityLayerMask';\nimport { type DIVEScene } from '../scene/Scene';\nimport type DIVEOrbitControls from '../controls/OrbitControls';\nimport { type DIVEDraggable } from '../interface/Draggable';\nimport { type DIVEHoverable } from '../interface/Hoverable';\nimport { findInterface } from '../helper/findInterface/findInterface';\n\nexport type DraggableEvent = {\n dragStart: Vector3;\n dragCurrent: Vector3;\n dragEnd: Vector3;\n dragDelta: Vector3;\n};\n\n/* eslint-disable @typescript-eslint/no-unused-vars */\nexport abstract class DIVEBaseTool {\n readonly POINTER_DRAG_THRESHOLD: number = 0.001;\n\n public name: string;\n\n protected _canvas: HTMLElement;\n protected _scene: DIVEScene;\n protected _controller: DIVEOrbitControls;\n\n // general pointer members\n protected _pointer: Vector2;\n\n protected get _pointerAnyDown(): boolean {\n return (\n this._pointerPrimaryDown ||\n this._pointerMiddleDown ||\n this._pointerSecondaryDown\n );\n }\n protected _pointerPrimaryDown: boolean;\n protected _pointerMiddleDown: boolean;\n protected _pointerSecondaryDown: boolean;\n protected _lastPointerDown: Vector2;\n protected _lastPointerUp: Vector2;\n\n // raycast members\n protected _raycaster: Raycaster;\n protected _intersects: Intersection[];\n\n // hovering members\n protected _hovered: (Object3D & DIVEHoverable) | null;\n\n // dragging members\n protected _dragging: boolean;\n protected _dragStart: Vector3;\n protected _dragCurrent: Vector3;\n protected _dragEnd: Vector3;\n protected _dragDelta: Vector3;\n protected _draggable: DIVEDraggable | null;\n protected _dragRaycastOnObjects: Object3D[] | null;\n\n protected constructor(scene: DIVEScene, controller: DIVEOrbitControls) {\n this.name = 'BaseTool';\n\n this._canvas = controller.domElement;\n this._scene = scene;\n this._controller = controller;\n\n this._pointer = new Vector2();\n\n this._pointerPrimaryDown = false;\n this._pointerMiddleDown = false;\n this._pointerSecondaryDown = false;\n\n this._lastPointerDown = new Vector2();\n this._lastPointerUp = new Vector2();\n\n this._raycaster = new Raycaster();\n this._raycaster.layers.mask = PRODUCT_LAYER_MASK | UI_LAYER_MASK;\n this._intersects = [];\n\n this._hovered = null;\n\n this._dragging = false;\n this._dragStart = new Vector3();\n this._dragCurrent = new Vector3();\n this._dragEnd = new Vector3();\n this._dragDelta = new Vector3();\n this._draggable = null;\n this._dragRaycastOnObjects = null;\n }\n\n public Activate(): void {}\n\n public Deactivate(): void {}\n\n public onPointerDown(e: PointerEvent): void {\n switch (e.button) {\n case 0: {\n this._pointerPrimaryDown = true;\n break;\n }\n case 1: {\n this._pointerMiddleDown = true;\n break;\n }\n case 2: {\n this._pointerSecondaryDown = true;\n break;\n }\n default: {\n console.warn(\n 'DIVEBaseTool.onPointerDown: Unknown button: ' + e.button,\n );\n }\n }\n\n this._lastPointerDown.copy(this._pointer);\n\n this._draggable =\n findInterface<DIVEDraggable>(\n this._intersects[0]?.object,\n 'isDraggable',\n ) || null;\n }\n\n public onDragStart(e: PointerEvent): void {\n if (!this._draggable) return;\n\n if (this._dragRaycastOnObjects !== null) {\n this._intersects = this._raycaster.intersectObjects(\n this._dragRaycastOnObjects,\n true,\n );\n }\n\n if (this._intersects.length === 0) return;\n\n this._dragStart.copy(this._intersects[0].point.clone());\n this._dragCurrent.copy(this._intersects[0].point.clone());\n this._dragEnd.copy(this._dragStart.clone());\n this._dragDelta.set(0, 0, 0);\n\n if (this._draggable && this._draggable.onDragStart) {\n this._draggable.onDragStart({\n dragStart: this._dragStart,\n dragCurrent: this._dragCurrent,\n dragEnd: this._dragEnd,\n dragDelta: this._dragDelta,\n });\n\n this._dragging = true;\n this._controller.enabled = false;\n }\n }\n\n public onPointerMove(e: PointerEvent): void {\n // update pointer\n this._pointer.x = (e.offsetX / this._canvas.clientWidth) * 2 - 1;\n this._pointer.y = -(e.offsetY / this._canvas.clientHeight) * 2 + 1;\n\n // set raycaster\n this._raycaster.setFromCamera(this._pointer, this._controller.object);\n\n // refresh intersects\n this._intersects = this.raycast(this._scene.children);\n\n // handle hover\n const hoverable = findInterface<DIVEHoverable>(\n this._intersects[0]?.object,\n 'isHoverable',\n );\n if (this._intersects[0] && hoverable) {\n if (!this._hovered) {\n if (hoverable.onPointerEnter)\n hoverable.onPointerEnter(this._intersects[0]);\n this._hovered = hoverable;\n return;\n }\n\n if (this._hovered.uuid !== hoverable.uuid) {\n if (this._hovered.onPointerLeave)\n this._hovered.onPointerLeave();\n if (hoverable.onPointerEnter)\n hoverable.onPointerEnter(this._intersects[0]);\n this._hovered = hoverable;\n return;\n }\n\n if (hoverable.onPointerOver)\n hoverable.onPointerOver(this._intersects[0]);\n this._hovered = hoverable;\n } else {\n if (this._hovered) {\n if (this._hovered.onPointerLeave)\n this._hovered.onPointerLeave();\n }\n\n this._hovered = null;\n }\n\n // handle drag\n if (this._pointerAnyDown) {\n if (!this._dragging) {\n this.onDragStart(e);\n }\n\n this.onDrag(e);\n }\n }\n\n public onDrag(e: PointerEvent): void {\n if (this._dragRaycastOnObjects !== null) {\n this._intersects = this._raycaster.intersectObjects(\n this._dragRaycastOnObjects,\n true,\n );\n }\n const intersect = this._intersects[0];\n if (!intersect) return;\n\n this._dragCurrent.copy(intersect.point.clone());\n this._dragEnd.copy(intersect.point.clone());\n this._dragDelta.subVectors(\n this._dragCurrent.clone(),\n this._dragStart.clone(),\n );\n\n if (this._draggable && this._draggable.onDrag) {\n this._draggable.onDrag({\n dragStart: this._dragStart,\n dragCurrent: this._dragCurrent,\n dragEnd: this._dragEnd,\n dragDelta: this._dragDelta,\n });\n }\n }\n\n public onPointerUp(e: PointerEvent): void {\n if (this.pointerWasDragged() || this._dragging) {\n if (this._draggable) {\n this.onDragEnd(e);\n }\n } else {\n this.onClick(e);\n }\n\n switch (e.button) {\n case 0:\n this._pointerPrimaryDown = false;\n break;\n case 1:\n this._pointerMiddleDown = false;\n break;\n case 2:\n this._pointerSecondaryDown = false;\n break;\n }\n\n this._lastPointerUp.copy(this._pointer);\n }\n\n public onClick(e: PointerEvent): void {}\n\n public onDragEnd(e: PointerEvent): void {\n const intersect = this._intersects[0];\n if (intersect) {\n this._dragEnd.copy(intersect.point.clone());\n this._dragCurrent.copy(intersect.point.clone());\n this._dragDelta.subVectors(\n this._dragCurrent.clone(),\n this._dragStart.clone(),\n );\n }\n\n if (this._draggable && this._draggable.onDragEnd) {\n this._draggable.onDragEnd({\n dragStart: this._dragStart,\n dragCurrent: this._dragCurrent,\n dragEnd: this._dragEnd,\n dragDelta: this._dragDelta,\n });\n }\n\n this._draggable = null;\n this._dragging = false;\n\n this._dragStart.set(0, 0, 0);\n this._dragCurrent.set(0, 0, 0);\n this._dragEnd.set(0, 0, 0);\n this._dragDelta.set(0, 0, 0);\n\n this._controller.enabled = true;\n }\n\n public onWheel(e: WheelEvent): void {}\n\n protected raycast(objects?: Object3D[]): Intersection[] {\n if (objects !== undefined)\n return this._raycaster\n .intersectObjects(objects, true)\n .filter((i) => i.object.visible);\n return this._raycaster\n .intersectObjects(this._scene.children, true)\n .filter((i) => i.object.visible);\n }\n\n private pointerWasDragged(): boolean {\n return (\n this._lastPointerDown.distanceTo(this._pointer) >\n this.POINTER_DRAG_THRESHOLD\n );\n }\n}\n","import { DIVEBaseTool } from '../BaseTool.ts';\nimport { type DIVEScene } from '../../scene/Scene.ts';\nimport type DIVEOrbitControls from '../../controls/OrbitControls.ts';\nimport { TransformControls } from 'three/examples/jsm/controls/TransformControls';\nimport { type DIVEMovable } from '../../interface/Movable.ts';\nimport { implementsInterface } from '../../helper/isInterface/implementsInterface.ts';\nimport { DIVEGizmo } from '../../gizmo/Gizmo.ts';\n\nexport const isTransformTool = (\n tool: DIVEBaseTool,\n): tool is DIVETransformTool => {\n return (tool as DIVETransformTool).isTransformTool !== undefined;\n};\n\nexport interface DIVEObjectEventMap {\n select: object;\n}\n\n/**\n * A Tool to select and move objects in the scene.\n *\n * Objects have to implement the DIVESelectable interface to be selectable and DIVEMovable to be movable.\n *\n * @module\n */\n\nexport default class DIVETransformTool extends DIVEBaseTool {\n readonly isTransformTool: boolean = true;\n\n protected _gizmo: TransformControls | DIVEGizmo;\n\n constructor(scene: DIVEScene, controller: DIVEOrbitControls) {\n super(scene, controller);\n this.name = 'DIVETransformTool';\n\n this._gizmo = this.initGizmo();\n\n this._scene.add(this._gizmo);\n }\n\n public Activate(): void {}\n\n public SetGizmoMode(mode: 'translate' | 'rotate' | 'scale'): void {\n this._gizmo.mode = mode;\n }\n\n public SetGizmoVisibility(active: boolean): void {\n const contains = this._scene.children.includes(this._gizmo);\n if (active && !contains) {\n this._scene.add(this._gizmo);\n if ('isTransformControls' in this._gizmo) {\n (this._gizmo as TransformControls)\n .getRaycaster()\n .layers.enableAll();\n }\n } else if (!active && contains) {\n this._scene.remove(this._gizmo);\n if ('isTransformControls' in this._gizmo) {\n (this._gizmo as TransformControls)\n .getRaycaster()\n .layers.disableAll();\n }\n }\n }\n\n // only used for optimizing pointer events with DIVEGizmo\n // public onPointerDown(e: PointerEvent): void {\n // super.onPointerDown(e);\n\n // if (this._hovered) {\n // this._dragRaycastOnObjects = (\n // this._gizmo as DIVEGizmo\n // ).gizmoPlane?.children;\n // }\n // }\n\n // only used for optimizing pointer events with DIVEGizmo\n // protected raycast(): Intersection[] {\n // return super.raycast((this._gizmo as DIVEGizmo).gizmoNode.children);\n // }\n\n private initGizmo(): TransformControls | DIVEGizmo {\n const g = new TransformControls(\n // this._controller,\n this._controller.object,\n this._controller.domElement,\n );\n // g.debug = true;\n g.mode = 'translate';\n\n // happens when pointerDown event is called on gizmo\n g.addEventListener('mouseDown', () => {\n this._controller.enabled = false;\n\n if (!implementsInterface<DIVEMovable>(g.object, 'isMovable'))\n return;\n if (!g.object.onMoveStart) return;\n g.object.onMoveStart();\n });\n\n // happens when pointerMove event is called on gizmo\n g.addEventListener('objectChange', () => {\n if (!implementsInterface<DIVEMovable>(g.object, 'isMovable'))\n return;\n if (!g.object.onMove) return;\n g.object.onMove();\n });\n\n // happens when pointerUp event is called on gizmo\n g.addEventListener('mouseUp', () => {\n this._controller.enabled = true;\n\n if (!implementsInterface<DIVEMovable>(g.object, 'isMovable'))\n return;\n if (!g.object.onMoveEnd) return;\n g.object.onMoveEnd();\n });\n\n return g;\n }\n}\n","import { type Object3D } from 'three';\nimport { type DIVEScene } from '../../scene/Scene.ts';\nimport DIVETransformTool from '../transform/TransformTool.ts';\nimport { findInterface } from '../../helper/findInterface/findInterface.ts';\nimport type DIVEOrbitControls from '../../controls/OrbitControls.ts';\nimport { type DIVESelectable } from '../../interface/Selectable.ts';\nimport { type DIVEMovable } from '../../interface/Movable.ts';\nimport { type DIVEBaseTool } from '../BaseTool.ts';\n\nexport const isSelectTool = (tool: DIVEBaseTool): tool is DIVESelectTool => {\n return (tool as DIVESelectTool).isSelectTool !== undefined;\n};\n\nexport interface DIVEObjectEventMap {\n select: object;\n}\n\n/**\n * A Tool to select and move objects in the scene.\n *\n * Objects have to implement the DIVESelectable interface to be selectable and DIVEMovable to be movable.\n *\n * @module\n */\n\nexport class DIVESelectTool extends DIVETransformTool {\n readonly isSelectTool: boolean = true;\n\n constructor(scene: DIVEScene, controller: DIVEOrbitControls) {\n super(scene, controller);\n this.name = 'SelectTool';\n }\n\n public Activate(): void {}\n\n public Select(selectable: DIVESelectable): void {\n this.AttachGizmo(selectable);\n\n if (selectable.onSelect) selectable.onSelect();\n }\n\n public Deselect(selectable: DIVESelectable): void {\n this.DetachGizmo();\n\n if (selectable.onDeselect) selectable.onDeselect();\n }\n\n public AttachGizmo(selectable: DIVESelectable): void {\n if ('isMovable' in selectable) {\n const movable = selectable as Object3D &\n DIVESelectable &\n DIVEMovable;\n this._gizmo.attach(movable);\n this.SetGizmoVisibility(movable.visible);\n }\n }\n\n public DetachGizmo(): void {\n this._gizmo.detach();\n }\n\n public onClick(e: PointerEvent): void {\n super.onClick(e);\n\n const first = this._raycaster\n .intersectObjects(this._scene.Root.children, true)\n .filter((intersect) => intersect.object.visible)[0];\n const selectable = findInterface<DIVESelectable>(\n first?.object,\n 'isSelectable',\n );\n\n // if nothing is hit\n if (!first || !selectable) {\n if (this._gizmo.object) {\n this.Deselect(this._gizmo.object as Object3D & DIVESelectable);\n }\n return;\n }\n\n if (this._gizmo.object) {\n // do not reselect if the same object was clicked\n if (this._gizmo.object.uuid === selectable.uuid) return;\n\n // deselect previous object\n this.Deselect(this._gizmo.object as Object3D & DIVESelectable);\n }\n\n // select clicked object\n this.Select(selectable);\n }\n}\n","import { PerspectiveCamera } from 'three';\nimport {\n DEFAULT_LAYER_MASK,\n HELPER_LAYER_MASK,\n PRODUCT_LAYER_MASK,\n UI_LAYER_MASK,\n} from '../constant/VisibilityLayerMask.ts';\n\nexport type DIVEPerspectiveCameraSettings = {\n fov: number;\n near: number;\n far: number;\n};\n\nexport const DIVEPerspectiveCameraDefaultSettings: DIVEPerspectiveCameraSettings =\n {\n fov: 80,\n near: 0.1,\n far: 1000,\n };\n\n/**\n * A Perspective camera. Can change the layer mask to show different objects.\n *\n * @module\n */\n\nexport default class DIVEPerspectiveCamera extends PerspectiveCamera {\n public static readonly EDITOR_VIEW_LAYER_MASK =\n DEFAULT_LAYER_MASK |\n UI_LAYER_MASK |\n HELPER_LAYER_MASK |\n PRODUCT_LAYER_MASK;\n public static readonly LIVE_VIEW_LAYER_MASK = PRODUCT_LAYER_MASK;\n\n public onSetCameraLayer: (mask: number) => void = () => {};\n\n constructor(\n settings: Partial<DIVEPerspectiveCameraSettings> = DIVEPerspectiveCameraDefaultSettings,\n ) {\n super(\n settings.fov || DIVEPerspectiveCameraDefaultSettings.fov,\n 1,\n settings.near || DIVEPerspectiveCameraDefaultSettings.near,\n settings.far || DIVEPerspectiveCameraDefaultSettings.far,\n );\n\n this.layers.mask = DIVEPerspectiveCamera.EDITOR_VIEW_LAYER_MASK;\n }\n\n public OnResize(width: number, height: number): void {\n this.aspect = width / height;\n this.updateProjectionMatrix();\n }\n\n public SetCameraLayer(layer: 'LIVE' | 'EDITOR'): void {\n this.layers.mask =\n layer === 'LIVE'\n ? DIVEPerspectiveCamera.LIVE_VIEW_LAYER_MASK\n : DIVEPerspectiveCamera.EDITOR_VIEW_LAYER_MASK;\n this.onSetCameraLayer(this.layers.mask);\n }\n}\n","import DIVEPerspectiveCamera from '../camera/PerspectiveCamera.ts';\nimport { type DIVEScene } from '../scene/Scene.ts';\nimport { type DIVERenderer } from '../renderer/Renderer.ts';\nimport type DIVEOrbitControls from '../controls/OrbitControls.ts';\nimport { type Vector3Like } from 'three';\n\n/**\n * Creates renderings of the current scene\n *\n * @module\n */\n\nexport class DIVEMediaCreator {\n private renderer: DIVERenderer;\n private scene: DIVEScene;\n private controller: DIVEOrbitControls;\n\n constructor(\n renderer: DIVERenderer,\n scene: DIVEScene,\n controller: DIVEOrbitControls,\n ) {\n this.renderer = renderer;\n this.scene = scene;\n this.controller = controller;\n }\n\n public GenerateMedia(\n position: Vector3Like,\n target: Vector3Like,\n width: number,\n height: number,\n ): string {\n const resetPosition = this.controller.object.position.clone();\n const resetRotation = this.controller.object.quaternion.clone();\n\n this.renderer.OnResize(width, height);\n this.controller.object.OnResize(width, height);\n\n this.controller.object.position.copy(position);\n this.controller.target.copy(target);\n this.controller.update();\n\n const dataUri = this.DrawCanvas().toDataURL();\n\n this.controller.object.position.copy(resetPosition);\n this.controller.object.quaternion.copy(resetRotation);\n\n return dataUri;\n }\n\n public DrawCanvas(canvasElement?: HTMLCanvasElement): HTMLCanvasElement {\n // save current canvas\n const restore = this.renderer.domElement;\n if (canvasElement) {\n this.renderer.domElement = canvasElement;\n }\n\n // draw canvas\n this.controller.object.layers.mask =\n DIVEPerspectiveCamera.LIVE_VIEW_LAYER_MASK;\n this.renderer.render(this.scene, this.controller.object);\n this.controller.object.layers.mask =\n DIVEPerspectiveCamera.EDITOR_VIEW_LAYER_MASK;\n\n const returnCanvas = this.renderer.domElement;\n\n // restore canvas\n if (canvasElement) {\n this.renderer.domElement = restore;\n }\n\n return returnCanvas;\n }\n}\n","import { GLTFLoader, type GLTF } from 'three/examples/jsm/loaders/GLTFLoader';\nimport { GLTFExporter } from 'three/examples/jsm/exporters/GLTFExporter';\nimport { Object3D } from 'three';\n\nexport class DIVEGLTFIO {\n private _importer: GLTFLoader;\n private _exporter: GLTFExporter;\n\n constructor() {\n this._importer = new GLTFLoader();\n this._exporter = new GLTFExporter();\n }\n\n public Import(\n url: string,\n onProgress?: (progress: number) => void,\n ): Promise<GLTF> {\n return this._importer.loadAsync(url, (progress) => {\n if (!onProgress) return;\n\n onProgress(progress.loaded / progress.total);\n });\n }\n\n public Export(\n object: Object3D,\n binary: true,\n onlyVisible: boolean,\n ): Promise<ArrayBuffer>;\n\n public Export(\n object: Object3D,\n binary: false,\n onlyVisible: boolean,\n ): Promise<{ [key: string]: unknown }>;\n\n public Export(\n object: Object3D,\n binary: boolean,\n onlyVisible: boolean,\n ): Promise<ArrayBuffer | { [key: string]: unknown }> {\n if (binary) {\n // export as binary ArrayBuffer\n return this._exporter.parseAsync(object, {\n binary,\n onlyVisible,\n }) as unknown as Promise<ArrayBuffer>;\n } else {\n // export as JSON object\n return this._exporter.parseAsync(object, {\n binary,\n onlyVisible,\n }) as unknown as Promise<{ [key: string]: unknown }>;\n }\n }\n}\n","import { DIVEGLTFIO } from './gltf/GLTFIO';\n\nimport { type DIVESceneFileType } from '../types';\nimport { type DIVEScene } from '../scene/Scene';\n\nexport class DIVEIO {\n private _scene: DIVEScene;\n\n private _gltfIO: DIVEGLTFIO;\n\n constructor(scene: DIVEScene) {\n this._scene = scene;\n\n this._gltfIO = new DIVEGLTFIO();\n }\n\n public Import<FileType extends keyof DIVESceneFileType>(\n type: FileType,\n url: string,\n ): Promise<DIVESceneFileType[FileType] | null> {\n switch (type) {\n case 'glb': {\n return this._gltfIO.Import(url).catch((error) => {\n console.error(error);\n return null;\n });\n }\n\n default: {\n console.error('DIVEIO.Import: Unsupported file type: ' + type);\n return Promise.reject();\n }\n }\n }\n\n public Export<FileType extends keyof DIVESceneFileType>(\n type: FileType,\n ): Promise<string | null> {\n switch (type) {\n case 'glb': {\n return this._gltfIO\n .Export(this._scene, true, true)\n .then((data) => {\n return this._createBlobURL(data);\n })\n .catch((error) => {\n console.error(error);\n return null;\n });\n }\n\n default: {\n console.error('DIVEIO.Export: Unsupported file type: ' + type);\n return Promise.reject();\n }\n }\n }\n\n private _createBlobURL(data: ArrayBuffer): string {\n return URL.createObjectURL(new Blob([data]));\n }\n}\n","export enum WebXRUnsupportedReason {\n 'UNKNWON_ERROR' = 0,\n 'NO_HTTPS' = 1,\n 'IMMERSIVE_AR_NOT_SUPPORTED_BY_DEVICE' = 2,\n 'AR_SESSION_NOT_ALLOWED' = 3,\n}\n\nexport class DIVEInfo {\n private static _supportsWebXR: boolean | null = null;\n private static _webXRUnsupportedReason: WebXRUnsupportedReason | null =\n null;\n\n /**\n *\n * @returns The system the user is using. Possible values are \"Android\", \"iOS\", \"Windows\", \"MacOS\", \"Linux\" or \"Unknown\".\n */\n public static GetSystem(): string {\n const platform = navigator.platform;\n if (/Android/.test(navigator.userAgent)) {\n return 'Android';\n } else if (/iPhone|iPad|iPod/.test(navigator.userAgent)) {\n return 'iOS';\n } else if (platform.startsWith('Win')) {\n return 'Windows';\n } else if (platform.startsWith('Mac')) {\n return 'MacOS';\n } else if (platform.startsWith('Linux')) {\n return 'Linux';\n } else {\n return 'Unknown';\n }\n }\n\n /**\n * @returns A promise that resolves to a boolean indicating whether the user's device supports WebXR.\n */\n public static async GetSupportsWebXR(): Promise<boolean> {\n if (this._supportsWebXR !== null) {\n return this._supportsWebXR;\n }\n\n // check if XRSystem is available && if https enabled\n if (!navigator.xr) {\n this._supportsWebXR = false;\n\n if (window.isSecureContext === false) {\n this._webXRUnsupportedReason = WebXRUnsupportedReason.NO_HTTPS;\n } else {\n this._webXRUnsupportedReason =\n WebXRUnsupportedReason.UNKNWON_ERROR;\n }\n\n return this._supportsWebXR;\n }\n\n // Check if immersive-vr session mode is supported\n try {\n const supported =\n await navigator.xr!.isSessionSupported('immersive-ar');\n if (!supported) {\n this._webXRUnsupportedReason =\n WebXRUnsupportedReason.IMMERSIVE_AR_NOT_SUPPORTED_BY_DEVICE;\n }\n this._supportsWebXR = supported;\n } catch (error) {\n this._supportsWebXR = false;\n this._webXRUnsupportedReason =\n WebXRUnsupportedReason.AR_SESSION_NOT_ALLOWED;\n }\n return this._supportsWebXR;\n }\n\n /**\n * @returns The reason why WebXR is not supported on the user's device. Returns null if WebXR is supported nor not has been checked yet.\n */\n public static GetWebXRUnsupportedReason(): WebXRUnsupportedReason | null {\n if (this._supportsWebXR === null) {\n console.log('WebXR support has not been checked yet.');\n return null;\n }\n return this._webXRUnsupportedReason;\n }\n\n /**\n * @returns A boolean indicating whether the user's device supports AR Quick Look.\n */\n public static GetSupportsARQuickLook(): boolean {\n const a = document.createElement('a');\n if (a.relList.supports('ar')) {\n return true;\n }\n\n // fallback check\n const userAgent = navigator.userAgent;\n\n // Check if the device is running iOS\n const isIOS =\n /iPad|iPhone|iPod/.test(userAgent) &&\n !(window as unknown as Window & { MSStream?: string }).MSStream;\n if (!isIOS) {\n return false;\n }\n\n // Extract iOS version\n const match = userAgent.match(/OS (\\d+)_/);\n if (!match || match.length < 2) {\n return false;\n }\n const iOSVersion = parseInt(match[1], 10);\n\n // Minimum iOS version for QuickLook support\n const minQuickLookVersion = 12;\n\n // Check if the iOS version is supported\n if (iOSVersion < minQuickLookVersion) {\n return false;\n }\n\n // Check for supported browser\n const isSupportedBrowser =\n /^((?!chrome|android).)*safari|CriOS|FxiOS/i.test(userAgent);\n if (isSupportedBrowser) {\n return true;\n }\n\n // Default to false if none of the conditions are met\n return false;\n }\n\n /**\n * @returns A boolean indicating whether the user's device is a mobile device.\n */\n public static get isMobile(): boolean {\n return this.GetSystem() === 'Android' || this.GetSystem() === 'iOS';\n }\n\n /**\n * @returns A boolean indicating whether the user's device is a desktop device.\n */\n public static get isDesktop(): boolean {\n return !this.isMobile;\n }\n\n /**\n * @returns A promise that resolves to a boolean indicating whether the user's device is capable of AR.\n */\n public static async GetIsARCapable(): Promise<boolean> {\n if (this.GetSupportsARQuickLook()) {\n return true;\n }\n\n return await this.GetSupportsWebXR();\n }\n}\n","import { Object3D } from 'three';\nimport {\n USDZExporter,\n USDZExporterOptions,\n} from 'three/examples/jsm/exporters/USDZExporter';\n\nexport type DIVEUSDZExporterOptions = USDZExporterOptions & {\n ar?: {\n anchoring: { type: 'plane' | 'image' | 'face' | 'none' }; // source: https://developer.apple.com/documentation/realitykit/preliminary-anchoring-type\n planeAnchoring: { alignment: 'horizontal' | 'vertical' | 'any' }; // source: https://developer.apple.com/documentation/realitykit/preliminary-planeanchoring-alignment\n };\n};\n\nexport class DIVEUSDZExporter extends USDZExporter {\n public parse(\n scene: Object3D,\n options?: DIVEUSDZExporterOptions,\n ): Promise<Uint8Array> {\n return super.parse(scene, options);\n }\n}\n","import { Object3D } from 'three';\nimport { DIVEUSDZExporter } from '../../exporters/usdz/USDZExporter';\nimport { type DIVEScene } from '../../scene/Scene';\nimport { type DIVEAROptions } from '../AR';\n\nexport class DIVEARQuickLook {\n private static _usdzExporter: DIVEUSDZExporter = new DIVEUSDZExporter();\n\n public static Launch(\n scene: DIVEScene,\n options?: DIVEAROptions,\n ): Promise<void> {\n // create node to build usdz from\n const quickLookScene = new Object3D();\n\n // extract models from scene\n quickLookScene.add(...this.extractModels(scene));\n\n // launch ARQuickLook\n return this.launchARFromNode(quickLookScene, options);\n }\n\n private static extractModels(scene: DIVEScene): Object3D[] {\n // extract models\n return scene.Root.children;\n }\n\n private static launchARFromNode(\n node: Object3D,\n options?: DIVEAROptions,\n ): Promise<void> {\n // bundle USDZ\n return this._usdzExporter\n .parse(node, {\n quickLookCompatible: true,\n ar: {\n anchoring: { type: 'plane' },\n planeAnchoring: {\n alignment:\n options?.arPlacement === 'vertical'\n ? 'vertical'\n : 'horizontal',\n },\n },\n })\n .then((usdz: Uint8Array) => {\n // create blob\n const blob = new Blob([usdz], { type: 'model/vnd.usdz+zip' });\n let url = URL.createObjectURL(blob);\n\n if (options?.arScale === 'fixed') {\n url = url.concat('#allowsContentScaling=0');\n }\n\n // launch ARQuickLook\n const a = document.createElement('a');\n a.innerHTML = '<picture></picture>'; // This is actually needed so the viewer opens instantly\n a.rel = 'ar';\n a.href = url;\n a.download = 'scene.usdz';\n a.click();\n });\n }\n}\n","export class Overlay {\n private _element: HTMLDivElement;\n public get Element(): HTMLDivElement {\n return this._element;\n }\n\n private _closeButton: SVGSVGElement;\n public get CloseButton(): SVGSVGElement {\n return this._closeButton;\n }\n\n constructor() {\n // create div\n this._element = document.createElement('div');\n\n // create and append close button to overlay\n this._closeButton = this.createCloseButton();\n this._element.appendChild(this._closeButton);\n\n // append overlay to body\n document.body.appendChild(this._element);\n }\n\n private createCloseButton(): SVGSVGElement {\n // create svg path\n const path = document.createElementNS(\n 'http://www.w3.org/2000/svg',\n 'path',\n );\n path.setAttribute('d', 'M 12,12 L 28,28 M 28,12 12,28');\n path.setAttribute('stroke', '#fff');\n path.setAttribute('stroke-width', '2');\n\n // create svg\n const svg = document.createElementNS(\n 'http://www.w3.org/2000/svg',\n 'svg',\n );\n svg.setAttribute('width', '38');\n svg.setAttribute('height', '38');\n svg.style.position = 'absolute';\n svg.style.right = '20px';\n svg.style.top = '20px';\n\n // append path to svg\n svg.appendChild(path);\n\n return svg;\n }\n}\n","import { Mesh, MeshBasicMaterial, Object3D, RingGeometry } from 'three';\n\nexport class DIVEWebXRCrosshair extends Object3D {\n public set mesh(mesh: Mesh | undefined) {\n this.clear();\n\n if (mesh) {\n this.add(mesh);\n }\n }\n\n constructor(mesh?: Mesh) {\n super();\n\n if (mesh) {\n this.mesh = mesh;\n } else {\n this.UseDefaultMesh();\n }\n\n this.matrixAutoUpdate = false;\n\n return this;\n }\n\n public UseDefaultMesh(): void {\n const geometry = new RingGeometry(0.08, 0.1, 32).rotateX(-Math.PI / 2);\n const material = new MeshBasicMaterial();\n this.mesh = new Mesh(geometry, material);\n }\n\n public UpdateFromPose(pose: XRPose): void {\n this.matrix.fromArray(pose.transform.matrix);\n }\n}\n","import { Matrix4, Vector3 } from 'three';\nimport { type DIVERenderer } from '../../../../renderer/Renderer';\nimport { type DIVEHitResult } from '../WebXRRaycaster';\n\nexport class DIVEWebXRRaycasterAR {\n private _session: XRSession;\n private _renderer: DIVERenderer;\n\n private _transientHitTestSource: XRTransientInputHitTestSource | undefined;\n private _referenceSpaceBuffer: XRReferenceSpace | null = null;\n\n private _requesting: boolean = false;\n private _initialized: boolean = false;\n\n private _hitMatrixBuffer: Matrix4;\n\n constructor(session: XRSession, renderer: DIVERenderer) {\n this._session = session;\n this._renderer = renderer;\n\n this._hitMatrixBuffer = new Matrix4();\n }\n\n public Dispose(): void {\n this._transientHitTestSource?.cancel();\n this._transientHitTestSource = undefined;\n\n this._initialized = false;\n }\n\n public async Init(): Promise<this> {\n if (!this._session) {\n console.error(\n 'DIVEWebXRRaycaster: No session set in Init()! Aborting initialization...',\n );\n return Promise.reject();\n }\n\n if (this._requesting) {\n console.error(\n 'DIVEWebXRRaycaster: Currently initializing! Aborting initialization...',\n );\n return Promise.reject();\n }\n\n if (this._initialized) {\n console.error(\n 'DIVEWebXRRaycaster: Already initialized! Aborting initialization...',\n );\n return Promise.reject();\n }\n\n this._requesting = true;\n this._transientHitTestSource = await this._session\n .requestHitTestSourceForTransientInput!({\n profile: 'generic-touchscreen',\n });\n this._referenceSpaceBuffer = this._renderer.xr.getReferenceSpace();\n this._requesting = false;\n\n if (!this._transientHitTestSource) {\n return Promise.reject();\n }\n\n this._initialized = true;\n\n console.log('DIVEWebXRRaycasterAR: Initialized');\n\n return Promise.resolve(this);\n }\n\n public GetIntersections(frame: XRFrame): DIVEHitResult[] {\n if (!this._transientHitTestSource) return [];\n\n const touches = frame.getHitTestResultsForTransientInput(\n this._transientHitTestSource,\n );\n if (touches.length === 0) return [];\n\n const hits = touches.map((touch: XRTransientInputHitTestResult) => {\n if (!this._referenceSpaceBuffer) return undefined;\n if (!touch.results[0]) return undefined;\n if (!touch.results[0].getPose) return undefined;\n\n const pose = touch.results[0].getPose(this._referenceSpaceBuffer);\n if (!pose) return undefined;\n\n this._hitMatrixBuffer.fromArray(pose.transform.matrix);\n const position = new Vector3().setFromMatrixPosition(\n this._hitMatrixBuffer,\n );\n\n return {\n point: position,\n matrix: this._hitMatrixBuffer,\n object: undefined,\n };\n });\n\n return hits.filter((hit) => hit !== undefined) as DIVEHitResult[];\n }\n}\n","import {\n type Intersection,\n type Mesh,\n Raycaster,\n type XRTargetRaySpace,\n} from 'three';\nimport { type DIVERenderer } from '../../../../renderer/Renderer';\nimport { type DIVEScene } from '../../../../scene/Scene';\nimport { type DIVEHitResult } from '../WebXRRaycaster';\n\nexport class DIVEWebXRRaycasterTHREE {\n private _renderer: DIVERenderer;\n private _scene: DIVEScene;\n\n private _controller: XRTargetRaySpace;\n\n // internal raycaster\n private _raycaster: Raycaster = new Raycaster();\n\n constructor(renderer: DIVERenderer, scene: DIVEScene) {\n this._renderer = renderer;\n this._scene = scene;\n\n this._controller = this._renderer.xr.getController(0);\n }\n\n public async Init(): Promise<this> {\n console.log('DIVEWebXRRaycasterTHREE: Initialized');\n return Promise.resolve(this);\n }\n\n public GetIntersections(): DIVEHitResult[] {\n this._controller.updateMatrixWorld();\n this._raycaster.setFromXRController(this._controller);\n const intersections = this._raycaster.intersectObjects(\n this._scene.XRRoot.XRModelRoot.children,\n );\n\n if (intersections.length === 0) return [];\n\n return intersections.map((intersection: Intersection) => {\n return {\n point: intersection.point,\n matrix: intersection.object.matrixWorld,\n object: intersection.object as Mesh,\n };\n });\n }\n}\n","export class DIVEEventExecutor<T> {\n private _listeners: Map<keyof T, ((payload: T[keyof T]) => void)[]> =\n new Map();\n\n public Subscribe<S extends keyof T>(\n type: S,\n listener: (payload: T[S]) => void,\n ): () => boolean {\n if (!this._listeners.get(type)) this._listeners.set(type, []);\n\n this._listeners\n .get(type)!\n .push(listener as (payload: T[keyof T]) => void);\n\n return () => {\n const listenerArray = this._listeners.get(type);\n if (!listenerArray) return false;\n\n const existingIndex = listenerArray.findIndex(\n (entry) => entry === listener,\n );\n if (existingIndex === -1) return false;\n\n listenerArray.splice(existingIndex, 1);\n return true;\n };\n }\n\n protected dispatch<S extends keyof T>(type: S, payload?: T[S]): void {\n const listenerArray = this._listeners.get(type);\n if (!listenerArray) return;\n\n listenerArray.forEach((listener) => listener(payload as T[S]));\n }\n}\n","import { Matrix4, Mesh, Vector3 } from 'three';\nimport { DIVERenderer } from '../../../renderer/Renderer';\nimport { DIVEWebXRRaycasterAR } from './ar/WebXRRaycasterAR';\nimport { DIVEWebXRRaycasterTHREE } from './three/WebXRRaycasterTHREE';\nimport { DIVEScene } from '../../../scene/Scene';\nimport { DIVEEventExecutor } from '../../../events/EventExecutor';\n\n/**\n * object is undefined when AR world is hit.\n */\nexport type DIVEHitResult = {\n point: Vector3;\n matrix: Matrix4;\n object?: Mesh;\n};\n\nexport type DIVEWebXRRaycasterEvents = {\n AR_HIT_FOUND: {\n hit: DIVEHitResult;\n };\n AR_HIT_LOST: undefined;\n SCENE_HIT_FOUND: {\n hit: DIVEHitResult;\n };\n SCENE_HIT_LOST: undefined;\n};\n\nexport class DIVEWebXRRaycaster extends DIVEEventExecutor<DIVEWebXRRaycasterEvents> {\n private _session: XRSession;\n\n private _initialized: boolean = false;\n\n private _threeRaycaster: DIVEWebXRRaycasterTHREE;\n private _arRaycaster: DIVEWebXRRaycasterAR;\n\n private _arHitResultBuffer: DIVEHitResult[] = [];\n private _sceneHitResultBuffer: DIVEHitResult[] = [];\n\n // buffers\n private _hasHit: boolean = false;\n\n constructor(session: XRSession, renderer: DIVERenderer, scene: DIVEScene) {\n super();\n\n this._session = session;\n\n this._threeRaycaster = new DIVEWebXRRaycasterTHREE(renderer, scene);\n this._arRaycaster = new DIVEWebXRRaycasterAR(session, renderer);\n }\n\n public Dispose(): void {\n // dispose code here\n this._initialized = false;\n }\n\n public async Init(): Promise<this> {\n if (!this._session) {\n console.error(\n 'DIVEWebXRRaycaster: No session set in Init()! Aborting initialization...',\n );\n return Promise.reject();\n }\n\n if (this._initialized) {\n console.error(\n 'DIVEWebXRRaycaster: Already initialized! Aborting initialization...',\n );\n return Promise.reject();\n }\n\n await this._threeRaycaster.Init();\n await this._arRaycaster.Init();\n\n console.log('DIVEWebXRRaycaster: Initialized');\n\n this._initialized = true;\n\n return Promise.resolve(this);\n }\n\n public GetARIntersections(frame: XRFrame): DIVEHitResult[] {\n // check for ar hits\n this._arHitResultBuffer = this._arRaycaster.GetIntersections(frame);\n if (this._arHitResultBuffer.length > 0) {\n // hit found\n this.onARHitFound(this._arHitResultBuffer[0]);\n } else {\n // hit nothing\n this.onARHitLost();\n }\n return this._arHitResultBuffer;\n }\n\n public GetSceneIntersections(): DIVEHitResult[] {\n // check for scene hits\n this._sceneHitResultBuffer = this._threeRaycaster.GetIntersections();\n if (this._sceneHitResultBuffer.length > 0) {\n // scene hit found\n this.onSceneHitFound(this._sceneHitResultBuffer[0]);\n // early return to prevent ar raycaster from overriding scene hit\n } else {\n // scene hit nothing\n this.onSceneHitLost();\n }\n return this._sceneHitResultBuffer;\n }\n\n private onARHitFound(hit: DIVEHitResult): void {\n this._hasHit = true;\n this.dispatch('AR_HIT_FOUND', { hit });\n }\n\n private onARHitLost(): void {\n if (!this._hasHit) return;\n\n this._hasHit = false;\n this.dispatch('AR_HIT_LOST');\n }\n\n private onSceneHitFound(hit: DIVEHitResult): void {\n this._hasHit = true;\n this.dispatch('SCENE_HIT_FOUND', { hit });\n }\n\n private onSceneHitLost(): void {\n if (!this._hasHit) return;\n\n this._hasHit = false;\n this.dispatch('SCENE_HIT_LOST');\n }\n}\n","import { Matrix4, Quaternion, Vector3 } from 'three';\nimport { DIVERenderer } from '../../../renderer/Renderer';\n\nexport class DIVEWebXROrigin {\n private _renderer: DIVERenderer;\n private _session: XRSession;\n\n private _requesting: boolean;\n private _initialized: boolean;\n\n private _referenceSpaceBuffer: XRReferenceSpace | null;\n private _hitTestSource: XRHitTestSource | null;\n\n private _entityTypes: XRHitTestTrackableType[];\n\n private _hitTestResultBuffer: XRHitTestResult[];\n private _raycastHitCounter: number = 0;\n\n private _originSet: Promise<void>;\n private _originSetResolve: (value: void) => void = () => {};\n public get originSet(): Promise<void> {\n return this._originSet;\n }\n\n private _matrix: Matrix4;\n public get matrix(): Matrix4 {\n return this._matrix;\n }\n private set matrix(value: Matrix4) {\n this._matrix = value;\n this._matrix.decompose(this._position, this._quaternion, this._scale);\n }\n\n private _position: Vector3;\n public get position(): Vector3 {\n return this._position;\n }\n\n private _quaternion: Quaternion;\n public get quaternion(): Quaternion {\n return this._quaternion;\n }\n\n private _scale: Vector3;\n public get scale(): Vector3 {\n return this._scale;\n }\n\n constructor(\n session: XRSession,\n renderer: DIVERenderer,\n entityTypes?: XRHitTestTrackableType[],\n ) {\n this._renderer = renderer;\n this._session = session;\n\n this._originSet = new Promise<void>((resolve) => {\n this._originSetResolve = resolve;\n });\n\n this._requesting = false;\n this._initialized = false;\n\n this._referenceSpaceBuffer = null;\n this._hitTestSource = null;\n\n this._entityTypes = entityTypes || ['plane'];\n\n this._hitTestResultBuffer = [];\n\n // set up promises and executors\n this._matrix = new Matrix4();\n this._position = new Vector3();\n this._quaternion = new Quaternion();\n this._scale = new Vector3();\n\n // when origin is set, decompose matrix into position, quaternion and scale\n this._originSet.then(() => {\n // decompose matrix into position, quaternion and scale\n this._matrix.decompose(\n this._position,\n this._quaternion,\n this._scale,\n );\n });\n }\n\n public async Init(): Promise<this> {\n if (this._initialized) {\n return Promise.resolve(this);\n }\n\n if (!this._session) {\n console.error(\n 'DIVEWebXROrigin: No session set in Init()! Aborting initialization...',\n );\n return Promise.reject();\n }\n\n if (this._requesting) {\n console.error(\n 'DIVEWebXROrigin: Currently initializing! Aborting initialization...',\n );\n return Promise.reject();\n }\n\n this._requesting = true;\n const referenceSpace =\n await this._session.requestReferenceSpace('viewer');\n this._hitTestSource =\n (await this._session.requestHitTestSource!({\n space: referenceSpace,\n entityTypes: this._entityTypes,\n })) || null;\n this._requesting = false;\n\n if (!this._hitTestSource) {\n return Promise.reject();\n }\n\n this._initialized = true;\n\n return Promise.resolve(this);\n }\n\n public Dispose(): void {\n this._initialized = false;\n this._requesting = false;\n\n this._hitTestSource?.cancel();\n\n this._hitTestSource = null;\n this._hitTestResultBuffer = [];\n\n this._matrix = new Matrix4();\n this._position = new Vector3();\n this._quaternion = new Quaternion();\n this._scale = new Vector3();\n }\n\n public Update(frame: XRFrame): void {\n if (!this._initialized) return;\n\n if (!this._hitTestSource) {\n throw new Error(\n 'DIVEWebXRRaycaster: Critical Error: HitTestSource not available but WebXROrigin is initialized!',\n );\n }\n\n // get hit test results\n this._hitTestResultBuffer = frame.getHitTestResults(\n this._hitTestSource,\n );\n if (this._hitTestResultBuffer.length > 0) {\n // hit found\n this._referenceSpaceBuffer = this._renderer.xr.getReferenceSpace();\n\n // if there is no reference space, hit will be counted as lost for this frame\n if (!this._referenceSpaceBuffer) {\n this.onHitLost();\n return;\n }\n\n const pose = this._hitTestResultBuffer[0].getPose(\n this._referenceSpaceBuffer,\n );\n if (!pose) {\n this.onHitLost();\n return;\n }\n\n this.onHitFound(pose);\n } else {\n this.onHitLost();\n }\n }\n\n private onHitFound(pose: XRPose): void {\n this._raycastHitCounter++;\n\n this.matrix.fromArray(pose.transform.matrix);\n\n // we have to wait for a certain amount of frames to make sure the origin is set\n if (this._raycastHitCounter > 50) {\n this._originSetResolve();\n }\n }\n\n private onHitLost(): void {\n this._raycastHitCounter = 0;\n }\n}\n","import { Vector2 } from 'three';\nimport { DIVEEventExecutor } from '../../../events/EventExecutor';\n\nexport type DIVETouchscreenEvents = {\n TOUCH_START: {\n touches: {\n current: Vector2;\n }[];\n touchCount: number;\n };\n TOUCH_MOVE: {\n touches: {\n current: Vector2;\n delta: Vector2;\n }[];\n touchCount: number;\n };\n TOUCH_END: {\n touches: {\n current: Vector2;\n }[];\n touchCount: number;\n };\n ROTATE_START: {\n current: number;\n };\n ROTATE_MOVE: {\n current: number;\n delta: number;\n };\n ROTATE_END: {\n current: number;\n };\n PINCH_START: {\n current: number;\n };\n PINCH_MOVE: {\n current: number;\n delta: number;\n };\n PINCH_END: {\n current: number;\n };\n};\n\ntype DIVETouch = {\n start: Vector2;\n current: Vector2;\n delta: Vector2;\n};\n\nexport class DIVEWebXRTouchscreenControls extends DIVEEventExecutor<DIVETouchscreenEvents> {\n // general members\n private _session: XRSession;\n\n // touch members\n private _touchCount: number = 0;\n private _touches: DIVETouch[] = [];\n\n // rotate members\n private _handleRotateStarted: boolean = false;\n private _handleRotateMoved: boolean = false;\n private _handleRotateEnded: boolean = false;\n\n private _startAngle: number = 0;\n private _lastAngle: number = 0;\n private _angleDelta: number = 0;\n\n // scale members\n private _handlePinchStarted: boolean = false;\n private _handlePinchMoved: boolean = false;\n private _handlePinchEnded: boolean = false;\n\n private _scaleDistanceStart: number = 0;\n private _currentDistance: number = 1;\n private _deltaDistance: number = 0;\n\n constructor(session: XRSession) {\n super();\n\n this._session = session;\n\n this._touches = [\n {\n start: new Vector2(),\n current: new Vector2(),\n delta: new Vector2(),\n },\n {\n start: new Vector2(),\n current: new Vector2(),\n delta: new Vector2(),\n },\n ];\n\n this._handleRotateStarted = false;\n\n window.addEventListener('touchstart', (e: TouchEvent) =>\n this.onTouchStart(e),\n );\n window.addEventListener('touchmove', (e: TouchEvent) =>\n this.onTouchMove(e),\n );\n window.addEventListener('touchend', (e: TouchEvent) =>\n this.onTouchEnd(e),\n );\n\n this._session.addEventListener('selectstart', () =>\n this.onSessionSelectStart(),\n );\n this._session.addEventListener('selectend', () =>\n this.onSessionSelectEnd(),\n );\n }\n\n public Dispose(): void {\n window.removeEventListener('touchstart', (e: TouchEvent) =>\n this.onTouchStart(e),\n );\n window.removeEventListener('touchmove', (e: TouchEvent) =>\n this.onTouchMove(e),\n );\n window.removeEventListener('touchend', (e: TouchEvent) =>\n this.onTouchEnd(e),\n );\n\n this._session.removeEventListener('selectstart', () =>\n this.onSessionSelectStart(),\n );\n this._session.removeEventListener('selectend', () =>\n this.onSessionSelectEnd(),\n );\n }\n\n private onTouchStart(event: TouchEvent): void {\n this._touchCount = event.touches.length;\n\n this._touches[0].start.set(\n event.touches[0].clientX,\n event.touches[0].clientY,\n );\n this._touches[0].current.set(\n event.touches[0].clientX,\n event.touches[0].clientY,\n );\n this._touches[0].delta.set(0, 0);\n\n if (this._touchCount > 1) {\n this._touches[1].start.set(\n event.touches[1].clientX,\n event.touches[1].clientY,\n );\n this._touches[1].current.set(\n event.touches[1].clientX,\n event.touches[1].clientY,\n );\n this._touches[1].delta.set(0, 0);\n }\n\n if (this._touchCount === 2) {\n this.handleRotateStart();\n this.handlePinchStart();\n }\n\n if (this._handleRotateStarted) {\n this.dispatch('ROTATE_START', {\n current: 0,\n });\n this._handleRotateStarted = false;\n }\n\n if (this._handlePinchStarted) {\n this.dispatch('PINCH_START', {\n current: 0,\n });\n this._handlePinchStarted = false;\n }\n }\n\n private onTouchMove(event: TouchEvent): void {\n this._touchCount = event.touches.length;\n\n this._touches[0].start.set(\n event.touches[0].clientX,\n event.touches[0].clientY,\n );\n this._touches[0].current.set(\n event.touches[0].clientX,\n event.touches[0].clientY,\n );\n this._touches[0].delta.copy(\n this._touches[0].current.clone().sub(this._touches[0].start),\n );\n\n if (this._touchCount > 1) {\n this._touches[1].start.set(\n event.touches[1].clientX,\n event.touches[1].clientY,\n );\n this._touches[1].current.set(\n event.touches[1].clientX,\n event.touches[1].clientY,\n );\n this._touches[1].delta.copy(\n this._touches[1].current.clone().sub(this._touches[1].start),\n );\n }\n\n if (this._touchCount === 2) {\n this.handleRotateMoved();\n this.handlePinchMoved();\n }\n\n if (this._touchCount === 1) {\n this.dispatch('TOUCH_MOVE', {\n touches: [\n {\n current: this._touches[0].current.clone(),\n delta: this._touches[0].delta.clone(),\n },\n {\n current: this._touches[1].current.clone(),\n delta: this._touches[1].delta.clone(),\n },\n ],\n touchCount: this._touchCount,\n });\n }\n\n if (this._touchCount === 2) {\n if (this._handleRotateMoved) {\n this.dispatch('ROTATE_MOVE', {\n current: this._lastAngle,\n delta: this._angleDelta,\n });\n this._handleRotateMoved = false;\n }\n\n if (this._handlePinchMoved) {\n this.dispatch('PINCH_MOVE', {\n current: this._currentDistance,\n delta: this._deltaDistance,\n });\n this._handlePinchMoved = false;\n }\n }\n }\n\n private onTouchEnd(event: TouchEvent): void {\n this._touchCount = event.touches.length;\n\n if (this._touchCount === 0) {\n this._touches[0].start.set(0, 0);\n this._touches[0].current.set(0, 0);\n this._touches[0].delta.set(0, 0);\n }\n\n if (this._touchCount === 1) {\n this.handleRotateEnded();\n this.handlePinchEnded();\n\n this._touches[1].start.set(0, 0);\n this._touches[1].current.set(0, 0);\n this._touches[1].delta.set(0, 0);\n }\n\n if (this._handleRotateEnded) {\n this.dispatch('ROTATE_END', {\n current: this._lastAngle,\n });\n this._handleRotateEnded = false;\n }\n\n if (this._handlePinchEnded) {\n this.dispatch('PINCH_END', {\n current: this._currentDistance,\n });\n this._handlePinchEnded = false;\n }\n }\n\n private onSessionSelectStart(): void {\n this.dispatch('TOUCH_START', {\n touches: [\n {\n current: this._touches[0].current.clone(),\n },\n {\n current: this._touches[1].current.clone(),\n },\n ],\n touchCount: this._touchCount,\n });\n }\n\n private onSessionSelectEnd(): void {\n this.dispatch('TOUCH_END', {\n touches: [\n {\n current: this._touches[0].current.clone(),\n },\n {\n current: this._touches[1].current.clone(),\n },\n ],\n touchCount: this._touchCount,\n });\n }\n\n // rotation handler\n private handleRotateStart(): void {\n this._handleRotateStarted = true;\n this._startAngle = this._touches[1].start\n .clone()\n .sub(this._touches[0].current)\n .angle();\n }\n\n private handleRotateMoved(): void {\n this._handleRotateMoved = true;\n const currentAngle = this._touches[1].current\n .clone()\n .sub(this._touches[0].current)\n .angle();\n this._angleDelta = currentAngle - this._startAngle;\n this._lastAngle = this._angleDelta * -1;\n }\n\n private handleRotateEnded(): void {\n this._handleRotateEnded = true;\n }\n\n // pinch handler\n private handlePinchStart(): void {\n this._handlePinchStarted = true;\n\n this._scaleDistanceStart = this._touches[1].start.distanceTo(\n this._touches[0].current,\n );\n }\n\n private handlePinchMoved(): void {\n this._handlePinchMoved = true;\n\n const beforeDistance = this._currentDistance;\n const distance = this._touches[1].current.distanceTo(\n this._touches[0].current,\n );\n this._currentDistance = distance / this._scaleDistanceStart;\n this._deltaDistance = this._currentDistance - beforeDistance;\n }\n\n private handlePinchEnded(): void {\n this._handlePinchEnded = true;\n }\n}\n","import {\n Matrix4,\n Mesh,\n Object3D,\n Quaternion,\n Vector3,\n WebXRArrayCamera,\n} from 'three';\nimport { DIVERenderer } from '../../../renderer/Renderer';\nimport { DIVEScene } from '../../../scene/Scene';\nimport { DIVEWebXRCrosshair } from '../crosshair/WebXRCrosshair';\nimport { DIVEWebXRRaycaster } from '../raycaster/WebXRRaycaster';\nimport { DIVEWebXROrigin } from '../origin/WebXROrigin';\nimport {\n DIVETouchscreenEvents,\n DIVEWebXRTouchscreenControls,\n} from '../touchscreencontrols/WebXRTouchscreenControls';\nimport { type DIVEMovable } from '../.././../interface/Movable';\nimport { findInterface } from '../../../helper/findInterface/findInterface';\n\nexport class DIVEWebXRController extends Object3D {\n // general members\n private _renderer: DIVERenderer;\n private _scene: DIVEScene;\n private _session: XRSession;\n\n private _frameBuffer: XRFrame | null = null;\n\n // raycaster members\n private _xrRaycaster: DIVEWebXRRaycaster;\n private _origin: DIVEWebXROrigin;\n\n // crosshair\n private _crosshair: DIVEWebXRCrosshair;\n\n // controller members\n private _touchscreenControls: DIVEWebXRTouchscreenControls;\n private _handNodeInitialPosition = new Vector3();\n private _xrCamera: WebXRArrayCamera;\n private _placed: boolean = false;\n\n // grabbing\n private _grabbedObject: Object3D | null = null;\n private _arHitPosition: Vector3 = new Vector3();\n private _arHitQuaternion: Quaternion = new Quaternion();\n private _arHitScale: Vector3 = new Vector3(1, 1, 1);\n\n // grabbing position\n private _initialObjectPosition: Vector3 | null = null;\n private _initialRaycastHit: Vector3 | null = null;\n private _deltaRaycastHit: Vector3 = new Vector3();\n\n // grabbing rotation\n private _touchQuaterion: Quaternion = new Quaternion();\n\n // grabbing scale\n private _touchScale: number = 1;\n private _scaleThreshold: number = 0.1;\n\n constructor(session: XRSession, renderer: DIVERenderer, scene: DIVEScene) {\n super();\n\n this._renderer = renderer;\n this._scene = scene;\n this._session = session;\n\n this._xrRaycaster = new DIVEWebXRRaycaster(session, renderer, scene);\n this._origin = new DIVEWebXROrigin(this._session, this._renderer, [\n 'plane',\n ]);\n\n this._crosshair = new DIVEWebXRCrosshair();\n this._crosshair.visible = false;\n\n this._xrCamera = this._renderer.xr.getCamera();\n\n this._scene.XRRoot.XRHandNode.position.set(0, -0.05, -0.25);\n this._handNodeInitialPosition =\n this._scene.XRRoot.XRHandNode.position.clone();\n\n this._touchscreenControls = new DIVEWebXRTouchscreenControls(\n this._session,\n );\n\n // translating\n this._touchscreenControls.Subscribe('TOUCH_START', () =>\n this.onTouchStart(),\n );\n this._touchscreenControls.Subscribe('TOUCH_MOVE', () =>\n this.onTouchMove(),\n );\n this._touchscreenControls.Subscribe('TOUCH_END', (p) =>\n this.onTouchEnd(p),\n );\n\n // rotating\n this._touchscreenControls.Subscribe('ROTATE_START', () =>\n this.onRotateStart(),\n );\n this._touchscreenControls.Subscribe('ROTATE_MOVE', (p) =>\n this.onRotateMove(p),\n );\n\n // scaling\n this._touchscreenControls.Subscribe('PINCH_START', () =>\n this.onPinchStart(),\n );\n this._touchscreenControls.Subscribe('PINCH_MOVE', (p) =>\n this.onPinchMove(p),\n );\n }\n\n public async Init(): Promise<this> {\n this.prepareScene();\n\n await this.initOrigin();\n await this.initRaycaster();\n\n return Promise.resolve(this);\n }\n\n public Dispose(): void {\n this.restoreScene();\n\n this._origin.Dispose();\n this._xrRaycaster.Dispose();\n\n // reset placement members\n this._placed = false;\n }\n\n public Update(frame: XRFrame): void {\n this._frameBuffer = frame;\n\n if (!this._placed) {\n this.updateHandNode();\n\n if (this._origin) {\n this._origin.Update(frame);\n }\n }\n }\n\n private updateHandNode(): void {\n this._xrCamera.updateMatrixWorld();\n this._scene.XRRoot.XRHandNode.position.copy(\n this._handNodeInitialPosition\n .clone()\n .applyMatrix4(this._xrCamera.matrixWorld),\n );\n this._scene.XRRoot.XRHandNode.quaternion.setFromRotationMatrix(\n this._xrCamera.matrixWorld,\n );\n }\n\n // placement\n private async initOrigin(): Promise<void> {\n // initialize origin\n this._origin = await this._origin.Init();\n\n // set resolve callback: place objects at origin when it is set\n this._origin.originSet.then(() => {\n this.placeObjects(this._origin.matrix);\n });\n }\n\n private placeObjects(matrix: Matrix4): void {\n this._scene.XRRoot.XRModelRoot.matrix.copy(matrix);\n\n // we are copying children to a new array to keep the original array intact\n [...this._scene.XRRoot.XRHandNode.children].forEach((child) => {\n this._scene.XRRoot.XRModelRoot.add(child);\n });\n this._placed = true;\n }\n\n // grabbing\n private updateObject(): void {\n if (!this._grabbedObject) return;\n\n this._grabbedObject.position.copy(this._arHitPosition);\n this._grabbedObject.quaternion.copy(\n this._arHitQuaternion.clone().multiply(this._touchQuaterion),\n );\n this._grabbedObject.scale.copy(\n new Vector3(\n this._touchScale,\n this._touchScale,\n this._touchScale,\n ).multiply(this._arHitScale),\n );\n }\n\n private onTouchStart(): void {\n const sceneHits = this._xrRaycaster.GetSceneIntersections();\n console.log('sceneHits', sceneHits);\n if (sceneHits.length === 0) return;\n if (!sceneHits[0].object) return;\n\n const moveable = findInterface<DIVEMovable>(\n sceneHits[0].object,\n 'isMovable',\n );\n if (!moveable) return;\n\n this._grabbedObject = moveable;\n }\n\n private onTouchMove(): void {\n // raycast ar\n if (!this._frameBuffer) return;\n if (!this._grabbedObject) return;\n\n const intersections = this._xrRaycaster.GetARIntersections(\n this._frameBuffer,\n );\n if (intersections.length === 0) {\n this._crosshair.visible = false;\n return;\n }\n\n const hit = intersections[0];\n\n this._crosshair.visible = true;\n this._crosshair.matrix.copy(hit.matrix);\n\n if (!this._grabbedObject) return;\n\n // if initial values have been reset by TOUCH_END event then set them again\n if (!this._initialObjectPosition || !this._initialRaycastHit) {\n this._initialObjectPosition = this._grabbedObject.position.clone();\n this._initialRaycastHit = hit.point.clone();\n }\n\n // decompose hit matrix to apply hit matrix to object\n hit.matrix.decompose(\n this._arHitPosition,\n this._arHitQuaternion,\n this._arHitScale,\n );\n\n // calculate raycast hit delta\n this._deltaRaycastHit.copy(\n hit.point.clone().sub(this._initialRaycastHit),\n );\n\n // apply moved raycast delta to actual object position\n this._arHitPosition.copy(\n this._initialObjectPosition.clone().add(this._deltaRaycastHit),\n );\n\n console.log('arHitPosition', this._arHitPosition);\n\n this.updateObject();\n }\n\n private onTouchEnd(payload: DIVETouchscreenEvents['TOUCH_END']): void {\n if (payload.touchCount === 0) {\n this._crosshair.visible = false;\n\n // reset grab\n this._initialObjectPosition = null;\n this._initialRaycastHit = null;\n this._grabbedObject = null;\n }\n }\n\n private _startTouchQuaternion: Quaternion = new Quaternion();\n private onRotateStart(): void {\n this._startTouchQuaternion = this._touchQuaterion.clone();\n }\n\n private onRotateMove(payload: DIVETouchscreenEvents['ROTATE_MOVE']): void {\n this._touchQuaterion.setFromAxisAngle(\n new Vector3(0, -1, 0),\n payload.delta * 3,\n );\n this._touchQuaterion.multiply(this._startTouchQuaternion);\n this.updateObject();\n }\n\n private _startTouchScale: number = 1;\n private onPinchStart(): void {\n this._startTouchScale = this._touchScale;\n }\n\n private onPinchMove(payload: DIVETouchscreenEvents['PINCH_MOVE']): void {\n this._touchScale = this._startTouchScale * payload.current;\n this.updateObject();\n }\n\n // prepare & cleanup scene\n private prepareScene(): void {\n this._scene.XRRoot.XRModelRoot.matrixAutoUpdate = false;\n\n // initialize crosshair\n this._scene.add(this._crosshair);\n\n // hang current scene children to hand node\n const children: Object3D[] = [];\n this._scene.Root.children.forEach((child) => {\n const clone = child.clone();\n clone.layers.enableAll();\n clone.traverse((obj) => {\n obj.layers.enableAll();\n if (obj instanceof Mesh) {\n obj.scale.set(0.1, 0.1, 0.1);\n }\n });\n clone.position.set(0, 0, 0);\n children.push(clone);\n });\n this._scene.XRRoot.XRHandNode.add(...children);\n }\n\n private restoreScene(): void {\n this._scene.remove(this._crosshair);\n\n // clear hand node and remove attached models\n this._scene.XRRoot.XRHandNode.clear();\n this._scene.XRRoot.XRModelRoot.clear();\n\n this._scene.XRRoot.XRModelRoot.matrixAutoUpdate = true;\n }\n\n // raycast\n private async initRaycaster(): Promise<void> {\n // initialize raycaster\n await this._xrRaycaster.Init();\n\n // check if successful\n if (!this._xrRaycaster) {\n console.error(\n 'Raycaster not initialized successfully. Aborting WebXR...',\n );\n this.Dispose();\n return Promise.reject();\n }\n }\n}\n","import { Vector3 } from 'three';\nimport DIVEOrbitControls from '../../controls/OrbitControls';\nimport { type DIVERenderer } from '../../renderer/Renderer';\nimport { type DIVEScene } from '../../scene/Scene';\nimport { Overlay } from './overlay/Overlay';\nimport { DIVEWebXRController } from './controller/WebXRController';\n\nexport class DIVEWebXR {\n // general members\n private static _renderer: DIVERenderer;\n private static _scene: DIVEScene;\n private static _controller: DIVEOrbitControls;\n\n // camera reset members\n private static _cameraPosition: Vector3;\n private static _cameraTarget: Vector3;\n\n // render loop members\n private static _renderCallbackId: string | null = null;\n\n // setup members\n private static _session: XRSession | null = null;\n private static _referenceSpaceType: XRReferenceSpaceType = 'local';\n private static _overlay: Overlay | null = null;\n private static _options = {\n requiredFeatures: [\n 'local',\n 'hit-test',\n ],\n optionalFeatures: [\n 'light-estimation',\n 'local-floor',\n 'dom-overlay',\n 'depth-sensing',\n ],\n depthSensing: {\n usagePreference: ['gpu-optimized'],\n dataFormatPreference: [],\n },\n domOverlay: { root: {} as HTMLElement },\n };\n\n private static _xrController: DIVEWebXRController | null = null;\n\n public static async Launch(\n renderer: DIVERenderer,\n scene: DIVEScene,\n controller: DIVEOrbitControls,\n ): Promise<void> {\n this._renderer = renderer;\n this._scene = scene;\n this._controller = controller;\n\n // setting camera reset values\n this._cameraPosition = this._controller.object.position.clone();\n this._cameraTarget = this._controller.target.clone();\n\n if (!navigator.xr) {\n console.error('WebXR not supported');\n return Promise.reject();\n }\n\n // setup current instance\n this._renderer.xr.enabled = true;\n this._scene.InitXR(renderer);\n\n // creating overlay\n if (!DIVEWebXR._overlay) {\n const overlay = new Overlay();\n DIVEWebXR._overlay = overlay;\n }\n DIVEWebXR._options.domOverlay = { root: DIVEWebXR._overlay.Element };\n\n // request session\n const session = await navigator.xr.requestSession(\n 'immersive-ar',\n this._options,\n );\n session.addEventListener('end', () => {\n this._onSessionEnded();\n });\n\n // build up session\n renderer.xr.setReferenceSpaceType(this._referenceSpaceType);\n await renderer.xr.setSession(session);\n DIVEWebXR._overlay.Element.style.display = '';\n this._session = session;\n\n // add end session event listener\n DIVEWebXR._overlay.CloseButton.addEventListener('click', () =>\n this.End(),\n );\n\n // start session\n await this._onSessionStarted();\n\n return Promise.resolve();\n }\n\n public static Update(_time: DOMHighResTimeStamp, frame: XRFrame): void {\n if (!this._session) return;\n\n if (this._xrController) {\n this._xrController.Update(frame);\n }\n }\n\n public static End(): void {\n if (!this._session) return;\n this._session.end();\n }\n\n private static async _onSessionStarted(): Promise<void> {\n if (!this._session) return;\n\n // add update callback to render loop\n this._renderCallbackId = this._renderer.AddPreRenderCallback(\n (time: DOMHighResTimeStamp, frame: XRFrame) => {\n this.Update(time, frame);\n },\n );\n\n this._xrController = new DIVEWebXRController(\n this._session,\n this._renderer,\n this._scene,\n );\n await this._xrController.Init().catch(() => {\n this.End();\n });\n\n return Promise.resolve();\n }\n\n private static _onSessionEnded(): void {\n if (!this._session) return;\n\n if (this._xrController) {\n this._xrController.Dispose();\n }\n\n // remove Update() callback\n if (this._renderCallbackId) {\n this._renderer.RemovePreRenderCallback(this._renderCallbackId);\n this._renderCallbackId = null;\n }\n\n // disable XR on renderer to restore canvas rendering\n this._renderer.xr.enabled = false;\n\n // resize renderer\n const canvasWrapper = this._renderer.domElement.parentElement;\n if (canvasWrapper) {\n const { clientWidth, clientHeight } = canvasWrapper;\n this._renderer.OnResize(clientWidth, clientHeight);\n\n // resize camera\n this._controller.object.OnResize(clientWidth, clientHeight);\n }\n\n // reset camera\n this._controller.object.position.copy(this._cameraPosition);\n this._controller.target.copy(this._cameraTarget);\n\n // reset camera values\n this._cameraPosition.set(0, 0, 0);\n this._cameraTarget.set(0, 0, 0);\n\n // dispose xr scene\n this._scene.DisposeXR();\n\n this._session.removeEventListener('end', this._onSessionEnded);\n DIVEWebXR._overlay!.Element.style.display = 'none';\n this._session = null;\n }\n}\n","import { type DIVEScene } from '../../scene/Scene';\nimport { type DIVEAROptions } from '../AR';\n\nexport class DIVESceneViewer {\n public static Launch(scene: DIVEScene, options?: DIVEAROptions): void {\n // find url in scene (first object found that has a set uri)\n const url = this.findSceneViewerSrc(scene);\n\n // launch SceneViewer\n this.launchSceneViewer(url, options);\n }\n\n private static launchSceneViewer(\n url: string,\n options?: DIVEAROptions,\n ): void {\n const anchor = document.createElement('a');\n const noArViewerSigil = '#model-viewer-no-ar-fallback';\n\n const location = self.location.toString();\n const locationUrl = new URL(location);\n const modelUrl = new URL(url, location);\n const params = new URLSearchParams(modelUrl.search);\n\n locationUrl.hash = noArViewerSigil;\n\n // modelUrl can contain title/link/sound etc.\n params.set('mode', 'ar_only');\n\n if (options?.arScale === 'fixed') {\n params.set('resizable', 'false');\n }\n\n if (options?.arPlacement === 'vertical') {\n params.set('enable_vertical_placement', 'true');\n }\n\n // will be added later if needed\n // if (params.has('sound')) {\n // const soundUrl = new URL(params.get('sound')!, location);\n // params.set('sound', soundUrl.toString());\n // }\n // if (params.has('link')) {\n // const linkUrl = new URL(params.get('link')!, location);\n // params.set('link', linkUrl.toString());\n // }\n\n const intent = `intent://arvr.google.com/scene-viewer/1.2?${\n params.toString() + '&file=' + modelUrl.toString()\n }#Intent;scheme=https;package=com.google.android.googlequicksearchbox;action=android.intent.action.VIEW;S.browser_fallback_url=${encodeURIComponent(\n locationUrl.toString(),\n )};end;`;\n\n anchor.setAttribute('href', intent);\n anchor.click();\n }\n\n private static findSceneViewerSrc(scene: DIVEScene): string {\n let uri: string | null = null;\n\n scene.traverse((object) => {\n if (uri) return;\n if (object.userData.uri) {\n uri = object.userData.uri;\n }\n });\n\n if (!uri) {\n throw new Error('No model found in scene');\n }\n\n return uri;\n }\n}\n","import { DIVEInfo, WebXRUnsupportedReason } from '../info/Info';\nimport { DIVEARQuickLook } from './arquicklook/ARQuickLook';\nimport { DIVEWebXR } from './webxr/WebXR';\nimport { type DIVEScene } from '../scene/Scene';\nimport { type DIVERenderer } from '../renderer/Renderer';\nimport DIVEOrbitControls from '../controls/OrbitControls';\nimport { DIVESceneViewer } from './sceneviewer/SceneViewer';\n\nexport type DIVEAROptions = {\n arPlacement: 'horizontal' | 'vertical';\n arScale: 'auto' | 'fixed';\n /**\n * experimental, currently deactivated\n */\n useWebXR: false;\n};\n\nexport class DIVEAR {\n private _renderer: DIVERenderer;\n private _scene: DIVEScene;\n private _controller: DIVEOrbitControls;\n\n constructor(\n renderer: DIVERenderer,\n scene: DIVEScene,\n controller: DIVEOrbitControls,\n ) {\n this._renderer = renderer;\n this._scene = scene;\n this._controller = controller;\n }\n\n public async Launch(options?: DIVEAROptions): Promise<void> {\n const system = DIVEInfo.GetSystem();\n\n if (system === 'iOS') {\n return this.tryARQuickLook();\n }\n\n if (system === 'Android') {\n if (options?.useWebXR) {\n console.warn('DIVE: WebXR is experimental on Android.');\n return this.tryWebXR();\n }\n\n return this.trySceneViewer();\n }\n\n console.log(\n 'DIVE: AR not supported. Not a mobile system. (System is ' +\n system +\n ')',\n );\n }\n\n private async tryARQuickLook(options?: DIVEAROptions): Promise<void> {\n const support = DIVEInfo.GetSupportsARQuickLook();\n if (!support) {\n console.log('ARQuickLook not supported');\n return Promise.reject();\n }\n\n console.log('DIVE: Launching AR with ARQuickLook ...');\n\n // Launch ARQuickLook\n await DIVEARQuickLook.Launch(this._scene, options);\n return Promise.resolve();\n }\n\n private async tryWebXR(): Promise<void> {\n const support = await DIVEInfo.GetSupportsWebXR();\n if (!support) {\n console.log(\n 'WebXR not supported. Reason: ' +\n WebXRUnsupportedReason[\n DIVEInfo.GetWebXRUnsupportedReason()!\n ],\n );\n return Promise.reject();\n }\n\n console.log('DIVE: Launching AR with WebXR ...');\n // Launch WebXR\n await DIVEWebXR.Launch(this._renderer, this._scene, this._controller);\n return Promise.resolve();\n }\n\n private async trySceneViewer(options?: DIVEAROptions): Promise<void> {\n // actually we don't have to try here, because SceneViewer is supported on all devices by now.\n // if there are no AR services (ARCore) installed on the device, SceneViewer will only show the model in 3D.\n // we also have no options to detect if SceneViewer is supported.\n\n console.log('DIVE: Launching AR with SceneViewer ...');\n\n DIVESceneViewer.Launch(this._scene, options);\n return Promise.resolve();\n }\n}\n","import {\n DIVERenderer,\n DIVERendererDefaultSettings,\n DIVERendererSettings,\n} from './renderer/Renderer.ts';\nimport { DIVEScene } from './scene/Scene.ts';\nimport DIVEPerspectiveCamera, {\n DIVEPerspectiveCameraDefaultSettings,\n DIVEPerspectiveCameraSettings,\n} from './camera/PerspectiveCamera.ts';\nimport DIVEOrbitControls, {\n DIVEOrbitControlsDefaultSettings,\n DIVEOrbitControlsSettings,\n} from './controls/OrbitControls.ts';\nimport DIVEToolbox from './toolbox/Toolbox.ts';\nimport { DIVECommunication } from './com/Communication.ts';\nimport { DIVEAnimationSystem } from './animation/AnimationSystem.ts';\nimport DIVEAxisCamera from './axiscamera/AxisCamera.ts';\nimport { getObjectDelta } from './helper/getObjectDelta/getObjectDelta.ts';\nimport { MathUtils } from 'three';\nimport { DIVEInfo } from './info/Info.ts';\nimport pkgjson from '../package.json';\n\nexport type DIVESettings = {\n autoResize: boolean;\n displayAxes: boolean;\n renderer: Partial<DIVERendererSettings>;\n perspectiveCamera: Partial<DIVEPerspectiveCameraSettings>;\n orbitControls: Partial<DIVEOrbitControlsSettings>;\n};\n\nexport const DIVEDefaultSettings: DIVESettings = {\n autoResize: true,\n displayAxes: false,\n renderer: DIVERendererDefaultSettings,\n perspectiveCamera: DIVEPerspectiveCameraDefaultSettings,\n orbitControls: DIVEOrbitControlsDefaultSettings,\n};\n\n/**\n * #### DIVE\n * is the main class of the DIVE framework.\n *\n * An instance of this class delivers a complete 3D environment with a perspective camera, orbit controls, a toolbox, and a communication system.\n * ```ts\n * import { DIVE } from \"@shopware-ag/dive\";\n *\n * const myWrapper = document.getElementById('myWrapper');\n *\n * const dive = new DIVE();\n *\n * myWrapper.appendChild(dive.Canvas);\n *\n * dive.Communication.Subscribe('GET_ALL_SCENE_DATA', () => {\n * // do something\n * }));\n *\n * dive.Communication.PerformAction('GET_ALL_SCENE_DATA', {});\n * ```\n * @module\n */\n\nexport default class DIVE {\n // static members\n public static QuickView(\n uri: string,\n settings?: Partial<DIVESettings>,\n ): DIVE {\n const dive = new DIVE(settings);\n\n dive.Communication.PerformAction('SET_CAMERA_TRANSFORM', {\n position: { x: 0, y: 2, z: 2 },\n target: { x: 0, y: 0.5, z: 0 },\n });\n\n // generate scene light id\n const lightid = MathUtils.generateUUID();\n\n // add scene light\n dive.Communication.PerformAction('ADD_OBJECT', {\n entityType: 'light',\n type: 'scene',\n name: 'light',\n id: lightid,\n enabled: true,\n visible: true,\n intensity: 1,\n color: 0xffffff,\n });\n\n // generate model id\n const modelid = MathUtils.generateUUID();\n\n // add loaded listener\n dive.Communication.Subscribe('MODEL_LOADED', (data) => {\n if (data.id !== modelid) return;\n\n const transform = dive.Communication.PerformAction(\n 'COMPUTE_ENCOMPASSING_VIEW',\n {},\n );\n\n dive.Communication.PerformAction('SET_CAMERA_TRANSFORM', {\n position: transform.position,\n target: transform.target,\n });\n });\n\n // instantiate model\n dive.Communication.PerformAction('ADD_OBJECT', {\n entityType: 'model',\n name: 'object',\n id: modelid,\n position: { x: 0, y: 0, z: 0 },\n rotation: { x: 0, y: 0, z: 0 },\n scale: { x: 1, y: 1, z: 1 },\n uri: uri,\n visible: true,\n loaded: false,\n });\n\n // set scene properties\n dive.Communication.PerformAction('UPDATE_SCENE', {\n backgroundColor: 0xffffff,\n gridEnabled: false,\n floorColor: 0xffffff,\n });\n\n return dive;\n }\n\n // descriptive members\n private _settings: DIVESettings;\n private _resizeObserverId: string;\n private _width: number;\n private _height: number;\n\n // functional components\n private renderer: DIVERenderer;\n private scene: DIVEScene;\n private perspectiveCamera: DIVEPerspectiveCamera;\n private orbitControls: DIVEOrbitControls;\n private toolbox: DIVEToolbox;\n private communication: DIVECommunication;\n\n // additional components\n private animationSystem: DIVEAnimationSystem;\n private axisCamera: DIVEAxisCamera | null;\n\n // getters\n public get Communication(): DIVECommunication {\n return this.communication;\n }\n\n public get Canvas(): HTMLCanvasElement {\n return this.renderer.domElement;\n }\n\n public get Info(): DIVEInfo {\n return DIVEInfo;\n }\n\n // setters\n public set Settings(settings: Partial<DIVESettings>) {\n const settingsDelta = getObjectDelta(this._settings, settings);\n\n // apply renderer settings (we have to rebuild the renderer to apply the settings)\n if (settingsDelta.renderer)\n this.renderer = new DIVERenderer(this._settings.renderer);\n\n // apply perspective camera settings\n if (settingsDelta.perspectiveCamera) {\n if (settingsDelta.perspectiveCamera.fov !== undefined)\n this.perspectiveCamera.fov =\n settingsDelta.perspectiveCamera.fov;\n if (settingsDelta.perspectiveCamera.near !== undefined)\n this.perspectiveCamera.near =\n settingsDelta.perspectiveCamera.near;\n if (settingsDelta.perspectiveCamera.far !== undefined)\n this.perspectiveCamera.far =\n settingsDelta.perspectiveCamera.far;\n this.perspectiveCamera.OnResize(\n this.renderer.domElement.width,\n this.renderer.domElement.height,\n );\n }\n // apply orbit controls settings\n if (settingsDelta.orbitControls) {\n if (settingsDelta.orbitControls.enableDamping !== undefined)\n this.orbitControls.enableDamping =\n settingsDelta.orbitControls.enableDamping;\n if (settingsDelta.orbitControls.dampingFactor !== undefined)\n this.orbitControls.dampingFactor =\n settingsDelta.orbitControls.dampingFactor;\n }\n\n if (settingsDelta.autoResize !== this._settings.autoResize) {\n if (settingsDelta.autoResize) {\n this.addResizeObserver();\n } else {\n this.removeResizeObserver();\n }\n }\n\n if (settingsDelta.displayAxes) {\n this.axisCamera = new DIVEAxisCamera(\n this.renderer,\n this.scene,\n this.orbitControls,\n );\n } else {\n this.axisCamera?.Dispose();\n this.axisCamera = null;\n }\n\n Object.assign(this._settings, settings);\n }\n\n constructor(settings?: Partial<DIVESettings>) {\n this._settings = {\n ...DIVEDefaultSettings,\n ...(settings !== undefined ? settings : {}),\n };\n\n this._resizeObserverId = '';\n this._width = 0;\n this._height = 0;\n\n // initialize functional components\n this.renderer = new DIVERenderer(this._settings.renderer);\n this.scene = new DIVEScene();\n this.perspectiveCamera = new DIVEPerspectiveCamera(\n this._settings.perspectiveCamera,\n );\n\n // initialize animation system\n this.animationSystem = new DIVEAnimationSystem(this.renderer);\n\n this.orbitControls = new DIVEOrbitControls(\n this.perspectiveCamera,\n this.renderer,\n this.animationSystem,\n this._settings.orbitControls,\n );\n this.toolbox = new DIVEToolbox(this.scene, this.orbitControls);\n this.communication = new DIVECommunication(\n this.renderer,\n this.scene,\n this.orbitControls,\n this.toolbox,\n );\n\n // initialize axis camera\n if (this._settings.displayAxes) {\n this.axisCamera = new DIVEAxisCamera(\n this.renderer,\n this.scene,\n this.orbitControls,\n );\n } else {\n this.axisCamera = null;\n }\n\n // add resize observer if autoResize is enabled\n if (this._settings.autoResize) {\n this.addResizeObserver();\n }\n\n // whene everything is done, start the renderer\n this.renderer.StartRenderer(this.scene, this.perspectiveCamera);\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (window as any).DIVE = {\n PrintScene: () => {\n console.log(this.scene);\n },\n };\n\n console.log(`DIVE ${pkgjson.version} initialized successfully!`);\n if (process.env.DIVE_NODE_ENV === 'development') {\n console.log('DIVE is running in development mode.');\n }\n console.log(`\n @@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@\n @@@@+-:::::::---------------------==------------------------------=#@@@@\n @@%=::::.......::---------------------------------------------------------+@@\n @@+:::...........::-----------------------------------------------------------#@@\n @@=:::.........::::::-------------------------------------------------------------%@\n @%:::.......:::::::-----------------------------------------------------------------#@\n @*:::.....:::::-----------------------------------------------------------------------*@\n @%::::::.::::---------------------------------------------------------------------------@@\n @@-:::::::::-----------------------------------------------------------------------------=@\n @%::::::::--------------------------------------------------------------------------------%@\n @+::::::::--------------------------------=@@@@@%-----------------------------------------%@\n @=:::::::--------------------------------*@@ @@+---------------------------------------#@\n @+:::::::-------------------------------*@ @*--------------------------------------%@\n @#::::::::-----------------------------=@@ @@=-------------------------------------%@\n @@-::::::::----------------------------@@ @@------------------------------------=@\n @%:::::::::--------------------------*@ @*-----------------------------------@@\n @*:::::::::-------------------------@@ @@----------------------------------%@\n @#::::::::::----------------------%@ @%--------------------------------%@\n @#:::::::::::-------------------=@@ @@=------------------------------%@\n @@-::::::::::::----------------%@ @%----------------------------=@@\n @@#::::::::::::::------------*@ @*--------------------------#@@\n @@+::::::::::::::::--------@@ @@------------------------+@@\n @@*:::::::::::::::::----@@ @@---------------------+@@\n @@@-:::::::::::::::--#@ @#-----------------=%@@\n @@%-::::::::::::-%@ @%-------------=%@@\n @@@@+:::::::#@@ @@*-------*@@@@\n @@@@@@@ @@@@@@\n\n `);\n }\n\n public Dispose(): void {\n this.removeResizeObserver();\n this.renderer.Dispose();\n this.orbitControls.Dispose();\n this.axisCamera?.Dispose();\n this.animationSystem.Dispose();\n this.toolbox.Dispose();\n this.communication.DestroyInstance();\n }\n\n // methods\n public OnResize(width: number, height: number): void {\n // resize renderer\n this.renderer.OnResize(width, height);\n\n // resize camera\n this.perspectiveCamera.OnResize(width, height);\n }\n\n private addResizeObserver(): void {\n this._resizeObserverId = this.renderer.AddPreRenderCallback(() => {\n // check if the canvas is mounted\n const canvasWrapper = this.renderer.domElement.parentElement;\n if (!canvasWrapper) return;\n\n const { clientWidth, clientHeight } = canvasWrapper;\n if (clientWidth === this._width && clientHeight === this._height)\n return;\n\n this.OnResize(clientWidth, clientHeight);\n\n this._width = clientWidth;\n this._height = clientHeight;\n });\n }\n\n private removeResizeObserver(): void {\n this.renderer.RemovePreRenderCallback(this._resizeObserverId);\n }\n}\n\nexport { DIVE, DIVECommunication };\n\nexport * from './math/index.ts';\n\nexport type * from './com/actions/index.ts';\nexport type * from './com/types';\nexport type * from './types';\n","import {\n Camera,\n MathUtils,\n NoToneMapping,\n PCFSoftShadowMap,\n Scene,\n ShadowMapType,\n ToneMapping,\n WebGLRenderer,\n} from 'three';\n\nexport type DIVERendererSettings = {\n antialias: boolean;\n alpha: boolean;\n stencil: boolean;\n shadowMapEnabled: boolean;\n shadowMapType: ShadowMapType;\n toneMapping: ToneMapping;\n canvas?: HTMLCanvasElement;\n};\n\nexport const DIVERendererDefaultSettings: DIVERendererSettings = {\n antialias: true,\n alpha: true,\n stencil: false,\n shadowMapEnabled: true,\n shadowMapType: PCFSoftShadowMap,\n toneMapping: NoToneMapping,\n canvas: undefined,\n};\n\nexport type DIVERenderCallback = (\n time: DOMHighResTimeStamp,\n frame: XRFrame,\n) => void;\n\n/**\n * A changed version of the WebGLRenderer.\n *\n * Has to be started manually by calling StartRenderer().\n *\n * @module\n */\n\nexport class DIVERenderer extends WebGLRenderer {\n // basic functionality members\n private paused: boolean = false;\n private running: boolean = false;\n private force: boolean = false;\n\n // pre- and post-render callbacks\n private preRenderCallbacks: Map<string, DIVERenderCallback> = new Map<\n string,\n DIVERenderCallback\n >();\n private postRenderCallbacks: Map<string, DIVERenderCallback> = new Map<\n string,\n DIVERenderCallback\n >();\n\n constructor(\n rendererSettings: Partial<DIVERendererSettings> = DIVERendererDefaultSettings,\n ) {\n super({\n antialias:\n rendererSettings.antialias ||\n DIVERendererDefaultSettings.antialias,\n alpha: rendererSettings.alpha || DIVERendererDefaultSettings.alpha,\n preserveDrawingBuffer: true,\n canvas: rendererSettings.canvas,\n });\n this.setPixelRatio(window.devicePixelRatio);\n\n this.shadowMap.enabled =\n rendererSettings.shadowMapEnabled ||\n DIVERendererDefaultSettings.shadowMapEnabled;\n this.shadowMap.type =\n rendererSettings.shadowMapType ||\n DIVERendererDefaultSettings.shadowMapType;\n\n this.toneMapping =\n rendererSettings.toneMapping ||\n DIVERendererDefaultSettings.toneMapping;\n\n this.debug.checkShaderErrors = false;\n }\n\n // Stops renderings and disposes the renderer.\n public Dispose(): void {\n this.StopRenderer();\n this.dispose();\n }\n\n // Starts the renderer with the given scene and camera.\n public StartRenderer(scene: Scene, cam: Camera): void {\n this.setAnimationLoop((time: DOMHighResTimeStamp, frame: XRFrame) => {\n this.internal_render(scene, cam, time, frame);\n });\n this.running = true;\n }\n\n // Pauses the renderer.\n public PauseRenderer(): void {\n this.paused = true;\n }\n\n // Resumes the renderer after pausing.\n public ResumeRenderer(): void {\n this.paused = false;\n }\n\n // Stops the renderer completely. Has to be started again with StartRenderer().\n public StopRenderer(): void {\n this.setAnimationLoop(null);\n this.running = false;\n }\n\n // Resizes the renderer to the given width and height.\n public OnResize(width: number, height: number): void {\n this.setSize(width, height);\n }\n\n /**\n * Adds a callback to the render loop before actual render call.\n * @param callback Executed before rendering.\n * @returns uuid to remove the callback.\n */\n public AddPreRenderCallback(callback: DIVERenderCallback): string {\n // add callback to renderloop\n const newUUID = MathUtils.generateUUID();\n this.preRenderCallbacks.set(newUUID, callback);\n\n return newUUID;\n }\n\n /**\n * Removes a callback from the render loop before actual render call.\n * @param uuid of callback to remove.\n * @returns if removing was successful.\n */\n public RemovePreRenderCallback(uuid: string): boolean {\n // check if callback exists\n if (!this.preRenderCallbacks.has(uuid)) return false;\n\n // remove callback from renderloop\n this.preRenderCallbacks.delete(uuid);\n\n return true;\n }\n\n /**\n * Adds a callback to the render loop after actual render call.\n * @param callback Executed after rendering.\n * @returns uuid to remove the callback.\n */\n public AddPostRenderCallback(callback: DIVERenderCallback): string {\n // add callback to renderloop\n const newUUID = MathUtils.generateUUID();\n this.postRenderCallbacks.set(newUUID, callback);\n\n return newUUID;\n }\n\n /**\n * Removes a callback from the render loop after actual render call.\n * @param uuid of callback to remove.\n * @returns if removing was successful.\n */\n public RemovePostRenderCallback(uuid: string): boolean {\n // check if callback exists\n if (!this.postRenderCallbacks.has(uuid)) return false;\n\n // remove callback from renderloop\n this.postRenderCallbacks.delete(uuid);\n\n return true;\n }\n\n /**\n * Forces the renderer to render the next frame.\n */\n public ForceRendering(): void {\n this.force = true;\n }\n\n /**\n * Internal render loop.\n *\n * To control renderloop you can add callbacks via AddPreRenderCallback() and AddPostRenderCallback().\n * @param scene Scene to render.\n * @param cam Camera to render with.\n */\n private internal_render(\n scene: Scene,\n cam: Camera,\n time: DOMHighResTimeStamp,\n frame: XRFrame,\n ): void {\n // execute background render loop callbacks\n if ((this.paused || !this.running) && !this.force) return;\n\n // execute render loop callbacks\n this.preRenderCallbacks.forEach((callback) => {\n callback(time, frame);\n });\n\n this.render(scene, cam);\n\n this.postRenderCallbacks.forEach((callback) => {\n callback(time, frame);\n });\n\n this.force = false;\n }\n}\n","import { Color, Scene, type Box3, type ColorRepresentation } from 'three';\nimport { type COMModel, type COMEntity } from '../com/types';\nimport { DIVERoot } from './root/Root';\nimport { DIVEGrid } from '../grid/Grid';\nimport { DIVEFloor } from '../primitive/floor/Floor';\nimport { type DIVESceneObject } from '../types';\nimport { DIVEXRRoot } from './xrroot/XRRoot';\nimport { type DIVERenderer } from '../renderer/Renderer';\n\n/**\n * A basic scene class.\n *\n * Comes with a root object that contains all the scene objects.\n *\n * @module\n */\n\nexport class DIVEScene extends Scene {\n private _root: DIVERoot;\n private _floor: DIVEFloor;\n private _grid: DIVEGrid;\n\n public get Root(): DIVERoot {\n return this._root;\n }\n\n private _xrRoot: DIVEXRRoot;\n public get XRRoot(): DIVEXRRoot {\n return this._xrRoot;\n }\n\n public get Floor(): DIVEFloor {\n return this._floor;\n }\n\n public get Grid(): DIVEGrid {\n return this._grid;\n }\n\n constructor() {\n super();\n\n this.background = new Color(0xffffff);\n\n this._root = new DIVERoot();\n this.add(this._root);\n\n this._floor = new DIVEFloor();\n this.add(this._floor);\n\n this._grid = new DIVEGrid();\n this.add(this._grid);\n\n this._xrRoot = new DIVEXRRoot(this);\n this._xrRoot.visible = false;\n this.add(this._xrRoot);\n }\n\n public InitXR(renderer: DIVERenderer): void {\n this._root.visible = false;\n this._xrRoot.visible = true;\n this._xrRoot.InitLightEstimation(renderer);\n }\n\n public DisposeXR(): void {\n this._root.visible = true;\n this._xrRoot.visible = false;\n this._xrRoot.DisposeLightEstimation();\n }\n\n public SetBackground(color: ColorRepresentation): void {\n this.background = new Color(color);\n }\n\n public ComputeSceneBB(): Box3 {\n return this.Root.ComputeSceneBB();\n }\n\n public GetSceneObject<T extends DIVESceneObject>(\n object: Partial<COMEntity> & { id: string },\n ): T | undefined {\n return this.Root.GetSceneObject<T>(object);\n }\n\n public AddSceneObject(object: COMEntity): void {\n this.Root.AddSceneObject(object);\n }\n\n public UpdateSceneObject(\n object: Partial<COMEntity> & { id: string; entityType: string },\n ): void {\n this.Root.UpdateSceneObject(object);\n }\n\n public DeleteSceneObject(\n object: Partial<COMEntity> & { id: string; entityType: string },\n ): void {\n this.Root.DeleteSceneObject(object);\n }\n\n public PlaceOnFloor(\n object: Partial<COMModel> & { id: string; entityType: string },\n ): void {\n this.Root.PlaceOnFloor(object);\n }\n}\n","import { Box3, Color, Object3D } from 'three';\nimport DIVEAmbientLight from '../../light/AmbientLight.ts';\nimport DIVEPointLight from '../../light/PointLight.ts';\nimport DIVESceneLight from '../../light/SceneLight.ts';\nimport { DIVEModel } from '../../model/Model.ts';\nimport { DIVELoadingManager } from '../../loadingmanager/LoadingManager.ts';\nimport { DIVECommunication } from '../../com/Communication.ts';\nimport { DIVEPrimitive } from '../../primitive/Primitive.ts';\n\nimport { type DIVEScene } from '../Scene.ts';\nimport { type TransformControls } from 'three/examples/jsm/controls/TransformControls';\nimport {\n type COMLight,\n type COMModel,\n type COMEntity,\n type COMPrimitive,\n type COMGroup,\n} from '../../com/types';\nimport { type DIVESceneObject } from '../../types';\nimport { DIVEGroup } from '../../group/Group.ts';\n\n/**\n * A basic scene node to hold grid, floor and all lower level roots.\n *\n * @module\n */\n\nexport class DIVERoot extends Object3D {\n readonly isDIVERoot: true = true;\n\n private loadingManager: DIVELoadingManager;\n\n constructor() {\n super();\n this.name = 'Root';\n\n this.loadingManager = new DIVELoadingManager();\n }\n\n public ComputeSceneBB(): Box3 {\n const bb = new Box3();\n this.traverse((object: Object3D) => {\n if ('isObject3D' in object) {\n bb.expandByObject(object);\n }\n });\n return bb;\n }\n\n public GetSceneObject<T extends DIVESceneObject>(\n object: Partial<COMEntity> & { id: string },\n ): T | undefined {\n let foundObject: T | undefined;\n this.traverse((object3D) => {\n if (foundObject) return;\n if (object3D.userData.id === object.id) {\n foundObject = object3D as T;\n }\n });\n return foundObject;\n }\n\n public AddSceneObject(object: COMEntity): void {\n switch (object.entityType) {\n case 'pov': {\n break;\n }\n case 'light': {\n this.updateLight(object as COMLight);\n break;\n }\n case 'model': {\n this.updateModel(object);\n break;\n }\n case 'primitive': {\n this.updatePrimitive(object);\n break;\n }\n case 'group': {\n this.updateGroup(object);\n break;\n }\n default: {\n console.warn(\n `DIVERoot.AddSceneObject: Unknown entity type: ${object.entityType}`,\n );\n }\n }\n }\n\n public UpdateSceneObject(\n object: Partial<COMEntity> & { id: string; entityType: string },\n ): void {\n switch (object.entityType) {\n case 'pov': {\n break;\n }\n case 'light': {\n this.updateLight(object as COMLight);\n break;\n }\n case 'model': {\n this.updateModel(object);\n break;\n }\n case 'primitive': {\n this.updatePrimitive(object);\n break;\n }\n case 'group': {\n this.updateGroup(object);\n break;\n }\n default: {\n console.warn(\n `DIVERoot.UpdateSceneObject: Unknown entity type: ${object.entityType}`,\n );\n }\n }\n }\n\n public DeleteSceneObject(\n object: Partial<COMEntity> & { id: string; entityType: string },\n ): void {\n switch (object.entityType) {\n case 'pov': {\n break;\n }\n case 'light': {\n this.deleteLight(object);\n break;\n }\n case 'model': {\n this.deleteModel(object);\n break;\n }\n case 'primitive': {\n this.deletePrimitive(object);\n break;\n }\n case 'group': {\n this.deleteGroup(object);\n break;\n }\n default: {\n console.warn(\n `DIVERoot.DeleteSceneObject: Unknown entity type: ${object.entityType}`,\n );\n }\n }\n }\n\n public PlaceOnFloor(\n object: Partial<COMEntity> & { id: string; entityType: string },\n ): void {\n switch (object.entityType) {\n case 'pov':\n case 'light': {\n break;\n }\n case 'model':\n case 'primitive': {\n this.placeOnFloor(object);\n break;\n }\n default: {\n console.warn(\n `DIVERoot.PlaceOnFloor: Unknown entity type: ${object.entityType}`,\n );\n }\n }\n }\n\n private updateLight(\n light: Partial<COMLight> & {\n id: string;\n entityType: string;\n type: string;\n },\n ): void {\n let sceneObject = this.GetSceneObject(light);\n if (!sceneObject) {\n switch (light.type) {\n case 'scene': {\n sceneObject = new DIVESceneLight();\n break;\n }\n case 'ambient': {\n sceneObject = new DIVEAmbientLight();\n break;\n }\n case 'point': {\n sceneObject = new DIVEPointLight();\n break;\n }\n default: {\n console.warn(\n `DIVERoot.updateLight: Unknown light type: ${light.type}`,\n );\n return;\n }\n }\n sceneObject.userData.id = light.id;\n this.add(sceneObject);\n }\n\n if (light.name !== undefined && light.name !== null)\n sceneObject.name = light.name;\n if (light.position !== undefined && light.position !== null)\n sceneObject.position.set(\n light.position.x,\n light.position.y,\n light.position.z,\n );\n if (light.intensity !== undefined && light.intensity !== null)\n (sceneObject as DIVEAmbientLight | DIVEPointLight).SetIntensity(\n light.intensity,\n );\n if (light.enabled !== undefined && light.enabled !== null)\n (sceneObject as DIVEAmbientLight | DIVEPointLight).SetEnabled(\n light.enabled,\n );\n if (light.color !== undefined && light.color !== null)\n (sceneObject as DIVEAmbientLight | DIVEPointLight).SetColor(\n new Color(light.color),\n );\n if (light.visible !== undefined && light.visible !== null)\n (sceneObject as DIVEAmbientLight | DIVEPointLight).visible =\n light.visible;\n if (light.parentId !== undefined)\n this.setParent({ ...light, parentId: light.parentId });\n }\n\n private updateModel(model: Partial<COMModel> & { id: string }): void {\n let sceneObject = this.GetSceneObject<DIVESceneObject>(model);\n if (!sceneObject) {\n const created = new DIVEModel();\n sceneObject = created;\n sceneObject.userData.id = model.id;\n sceneObject.userData.uri = model.uri;\n this.add(sceneObject);\n }\n\n if (model.uri !== undefined) {\n this.loadingManager.LoadGLTF(model.uri).then((gltf) => {\n (sceneObject as DIVEModel).SetModel(gltf);\n DIVECommunication.get(model.id!)?.PerformAction(\n 'MODEL_LOADED',\n { id: model.id! },\n );\n });\n }\n\n if (model.name !== undefined) sceneObject.name = model.name;\n if (model.position !== undefined)\n (sceneObject as DIVEModel).SetPosition(model.position);\n if (model.rotation !== undefined)\n (sceneObject as DIVEModel).SetRotation(model.rotation);\n if (model.scale !== undefined)\n (sceneObject as DIVEModel).SetScale(model.scale);\n if (model.visible !== undefined)\n (sceneObject as DIVEModel).SetVisibility(model.visible);\n if (model.material !== undefined)\n (sceneObject as DIVEModel).SetMaterial(model.material);\n if (model.parentId !== undefined)\n this.setParent({ ...model, parentId: model.parentId });\n }\n\n private updatePrimitive(\n primitive: Partial<COMPrimitive> & { id: string },\n ): void {\n let sceneObject = this.GetSceneObject<DIVESceneObject>(primitive);\n if (!sceneObject) {\n const created = new DIVEPrimitive();\n sceneObject = created;\n sceneObject.userData.id = primitive.id;\n this.add(sceneObject);\n }\n\n if (primitive.name !== undefined) sceneObject.name = primitive.name;\n if (primitive.geometry !== undefined)\n (sceneObject as DIVEPrimitive).SetGeometry(primitive.geometry);\n if (primitive.position !== undefined)\n (sceneObject as DIVEPrimitive).SetPosition(primitive.position);\n if (primitive.rotation !== undefined)\n (sceneObject as DIVEPrimitive).SetRotation(primitive.rotation);\n if (primitive.scale !== undefined)\n (sceneObject as DIVEPrimitive).SetScale(primitive.scale);\n if (primitive.visible !== undefined)\n (sceneObject as DIVEPrimitive).SetVisibility(primitive.visible);\n if (primitive.material !== undefined)\n (sceneObject as DIVEPrimitive).SetMaterial(primitive.material);\n if (primitive.parentId !== undefined)\n this.setParent({ ...primitive, parentId: primitive.parentId });\n }\n\n private updateGroup(group: Partial<COMGroup> & { id: string }): void {\n let sceneObject = this.GetSceneObject<DIVESceneObject>(group);\n if (!sceneObject) {\n const created = new DIVEGroup();\n sceneObject = created;\n sceneObject.userData.id = group.id;\n this.add(sceneObject);\n }\n\n if (group.name !== undefined) sceneObject.name = group.name;\n if (group.position !== undefined)\n (sceneObject as DIVEGroup).SetPosition(group.position);\n if (group.rotation !== undefined)\n (sceneObject as DIVEGroup).SetRotation(group.rotation);\n if (group.scale !== undefined)\n (sceneObject as DIVEGroup).SetScale(group.scale);\n if (group.visible !== undefined)\n (sceneObject as DIVEGroup).SetVisibility(group.visible);\n if (group.bbVisible !== undefined)\n (sceneObject as DIVEGroup).SetLinesVisibility(group.bbVisible);\n if (group.parentId !== undefined)\n this.setParent({ ...group, parentId: group.parentId });\n }\n\n private deleteLight(light: Partial<COMLight> & { id: string }): void {\n const sceneObject = this.GetSceneObject(light);\n if (!sceneObject) {\n console.warn(\n `DIVERoot.deleteLight: Light with id ${light.id} not found`,\n );\n return;\n }\n\n this.detachTransformControls(sceneObject);\n\n sceneObject.parent!.remove(sceneObject);\n }\n\n private deleteModel(model: Partial<COMModel> & { id: string }): void {\n const sceneObject = this.GetSceneObject(model);\n if (!sceneObject) {\n console.warn(\n `DIVERoot.deleteModel: Model with id ${model.id} not found`,\n );\n return;\n }\n\n this.detachTransformControls(sceneObject);\n\n sceneObject.parent!.remove(sceneObject);\n }\n\n private deletePrimitive(\n primitive: Partial<COMPrimitive> & { id: string },\n ): void {\n const sceneObject = this.GetSceneObject(primitive);\n if (!sceneObject) {\n console.warn(\n `DIVERoot.deletePrimitive: Primitive with id ${primitive.id} not found`,\n );\n return;\n }\n\n this.detachTransformControls(sceneObject);\n\n sceneObject.parent!.remove(sceneObject);\n }\n\n private deleteGroup(group: Partial<COMGroup> & { id: string }): void {\n const sceneObject = this.GetSceneObject<DIVEGroup>(group);\n if (!sceneObject) {\n console.warn(\n `DIVERoot.deleteGroup: Group with id ${group.id} not found`,\n );\n return;\n }\n\n this.detachTransformControls(sceneObject);\n\n for (let i = sceneObject.members.length - 1; i >= 0; i--) {\n this.attach(sceneObject.members[i]);\n }\n\n sceneObject.parent!.remove(sceneObject);\n }\n\n private placeOnFloor(object: Partial<COMEntity> & { id: string }): void {\n const sceneObject = this.GetSceneObject(object);\n if (!sceneObject) return;\n\n (sceneObject as DIVEModel | DIVEPrimitive).PlaceOnFloor();\n }\n\n private setParent(\n object: Partial<COMEntity> & { id: string; parentId: string | null },\n ): void {\n const sceneObject = this.GetSceneObject<DIVESceneObject>(object);\n if (!sceneObject) return;\n\n if (object.parentId !== null) {\n const parent = this.GetSceneObject<DIVESceneObject>({\n id: object.parentId,\n });\n if (!parent) return;\n\n // attach to new parent (if exists in scene)\n parent.attach(sceneObject);\n } else {\n // attach to root if no parent is found\n this.attach(sceneObject);\n }\n }\n\n private detachTransformControls(object: Object3D): void {\n // this is only neccessary due to using the old TransformControls instead of the new DIVEGizmo\n this.findScene(object).children.find((object) => {\n if ('isTransformControls' in object) {\n (object as TransformControls).detach();\n }\n });\n }\n\n private findScene(object: Object3D): DIVEScene {\n if (object.parent !== null) {\n return this.findScene(object.parent);\n }\n return object as DIVEScene;\n }\n}\n","import { AmbientLight, Color, Object3D } from 'three';\nimport { PRODUCT_LAYER_MASK } from '../constant/VisibilityLayerMask';\n\n/**\n * A basic ambient light.\n *\n * Can change the color, intensity, and visibility of the light.\n *\n * @module\n */\n\nexport default class DIVEAmbientLight extends Object3D {\n readonly isDIVELight: true = true;\n readonly isDIVEAmbientLight: true = true;\n\n private _light: AmbientLight;\n\n constructor() {\n super();\n\n this.name = 'DIVEAmbientLight';\n\n this._light = new AmbientLight(0xffffff, 1);\n this._light.layers.mask = PRODUCT_LAYER_MASK;\n this.add(this._light);\n }\n\n public SetColor(color: Color): void {\n this._light.color = color;\n }\n\n public SetIntensity(intensity: number): void {\n this._light.intensity = intensity;\n }\n\n public SetEnabled(enabled: boolean): void {\n this._light.visible = enabled;\n }\n}\n","import {\n PointLight,\n Color,\n SphereGeometry,\n MeshBasicMaterial,\n Mesh,\n FrontSide,\n Object3D,\n} from 'three';\nimport { DIVECommunication } from '../com/Communication';\nimport {\n PRODUCT_LAYER_MASK,\n UI_LAYER_MASK,\n} from '../constant/VisibilityLayerMask';\nimport { DIVEMovable } from '../interface/Movable';\nimport { DIVESelectable } from '../interface/Selectable';\nimport type { TransformControls } from 'three/examples/jsm/controls/TransformControls';\n\n/**\n * A basic point light.\n *\n * Can change the color, intensity, and visibility of the light.\n *\n * Can be moved and selected.\n *\n * @module\n */\n\nexport default class DIVEPointLight\n extends Object3D\n implements DIVESelectable, DIVEMovable\n{\n readonly isDIVELight: true = true;\n readonly isDIVEPointLight: true = true;\n readonly isMovable: true = true;\n readonly isSelectable: true = true;\n\n public gizmo: TransformControls | null = null;\n\n private light: PointLight;\n private mesh: Mesh;\n\n constructor() {\n super();\n\n this.name = 'DIVEPointLight';\n\n this.light = new PointLight(0xffffff, 1);\n\n this.light.layers.mask = PRODUCT_LAYER_MASK;\n\n this.light.castShadow = true;\n this.light.shadow.mapSize.width = 512;\n this.light.shadow.mapSize.height = 512;\n this.add(this.light);\n\n const geoSize = 0.1;\n\n const geometry = new SphereGeometry(\n geoSize,\n geoSize * 320,\n geoSize * 320,\n );\n\n const material = new MeshBasicMaterial({\n color: this.light.color,\n transparent: true,\n opacity: 0.8,\n side: FrontSide,\n });\n\n this.mesh = new Mesh(geometry, material);\n this.mesh.layers.mask = UI_LAYER_MASK;\n\n this.add(this.mesh);\n }\n\n public SetColor(color: Color): void {\n this.light.color = color;\n\n (this.mesh.material as MeshBasicMaterial).color = color;\n }\n\n public SetIntensity(intensity: number): void {\n this.light.intensity = intensity;\n\n (this.mesh.material as MeshBasicMaterial).opacity =\n intensity > 0.8 ? 0.8 : intensity * 0.8;\n }\n\n public SetEnabled(enabled: boolean): void {\n this.light.visible = enabled;\n }\n\n public onMove(): void {\n DIVECommunication.get(this.userData.id)?.PerformAction(\n 'UPDATE_OBJECT',\n { id: this.userData.id, position: this.position },\n );\n }\n\n public onSelect(): void {\n DIVECommunication.get(this.userData.id)?.PerformAction(\n 'SELECT_OBJECT',\n { id: this.userData.id },\n );\n }\n\n public onDeselect(): void {\n DIVECommunication.get(this.userData.id)?.PerformAction(\n 'DESELECT_OBJECT',\n { id: this.userData.id },\n );\n }\n}\n","import { Actions } from './actions/index.ts';\nimport { generateUUID } from 'three/src/math/MathUtils';\nimport { isSelectTool } from '../toolbox/select/SelectTool.ts';\nimport { merge } from 'lodash';\n\n// type imports\nimport { type Color, type MeshStandardMaterial } from 'three';\nimport {\n type COMLight,\n type COMModel,\n type COMEntity,\n type COMPov,\n type COMPrimitive,\n type COMGroup,\n} from './types';\nimport { type DIVEScene } from '../scene/Scene.ts';\nimport type DIVEToolbox from '../toolbox/Toolbox.ts';\nimport type DIVEOrbitControls from '../controls/OrbitControls.ts';\nimport { type DIVEModel } from '../model/Model.ts';\nimport { type DIVEMediaCreator } from '../mediacreator/MediaCreator.ts';\nimport { type DIVERenderer } from '../renderer/Renderer.ts';\nimport { type DIVESelectable } from '../interface/Selectable.ts';\nimport { type DIVEIO } from '../io/IO.ts';\nimport { type DIVEAR } from '../ar/AR.ts';\n\ntype EventListener<Action extends keyof Actions> = (\n payload: Actions[Action]['PAYLOAD'],\n) => void;\n\ntype Unsubscribe = () => boolean;\n\n/**\n * Main class for communicating with DIVE.\n *\n * You can subscribe to actions and perform them from outside and inside DIVE.\n *\n * ```ts\n * import { DIVE } from \"@shopware-ag/dive\";\n *\n * const dive = new DIVE();\n *\n * dive.Communication.Subscribe('GET_ALL_SCENE_DATA', () => {\n * // do something\n * }));\n *\n * dive.Communication.PerformAction('GET_ALL_SCENE_DATA', {});\n * ```\n *\n * @module\n */\n\nexport class DIVECommunication {\n private static __instances: DIVECommunication[] = [];\n\n public static get(id: string): DIVECommunication | undefined {\n const fromComID = this.__instances.find(\n (instance) => instance.id === id,\n );\n if (fromComID) return fromComID;\n return this.__instances.find((instance) =>\n Array.from(instance.registered.values()).find(\n (object) => object.id === id,\n ),\n );\n }\n\n private _id: string;\n public get id(): string {\n return this._id;\n }\n\n private renderer: DIVERenderer;\n private scene: DIVEScene;\n private controller: DIVEOrbitControls;\n private toolbox: DIVEToolbox;\n\n private _mediaGenerator: DIVEMediaCreator | null;\n private get mediaGenerator(): DIVEMediaCreator {\n if (!this._mediaGenerator) {\n const DIVEMediaCreator = require('../mediacreator/MediaCreator.ts')\n .DIVEMediaCreator as typeof import('../mediacreator/MediaCreator.ts').DIVEMediaCreator;\n this._mediaGenerator = new DIVEMediaCreator(\n this.renderer,\n this.scene,\n this.controller,\n );\n }\n return this._mediaGenerator;\n }\n\n private _io: DIVEIO | null;\n private get io(): DIVEIO {\n if (!this._io) {\n const DIVEIO = require('../io/IO.ts')\n .DIVEIO as typeof import('../io/IO.ts').DIVEIO;\n this._io = new DIVEIO(this.scene);\n }\n return this._io;\n }\n\n private _ar: DIVEAR | null;\n private get ar(): DIVEAR {\n if (!this._ar) {\n const DIVEAR = require('../ar/AR.ts')\n .DIVEAR as typeof import('../ar/AR.ts').DIVEAR;\n this._ar = new DIVEAR(this.renderer, this.scene, this.controller);\n }\n return this._ar;\n }\n\n private registered: Map<string, COMEntity> = new Map();\n\n // private listeners: { [key: string]: EventListener[] } = {};\n private listeners: Map<keyof Actions, EventListener<keyof Actions>[]> =\n new Map();\n\n constructor(\n renderer: DIVERenderer,\n scene: DIVEScene,\n controls: DIVEOrbitControls,\n toolbox: DIVEToolbox,\n ) {\n this._id = generateUUID();\n this.renderer = renderer;\n this.scene = scene;\n this.controller = controls;\n this.toolbox = toolbox;\n this._mediaGenerator = null;\n this._io = null;\n this._ar = null;\n\n DIVECommunication.__instances.push(this);\n }\n\n public DestroyInstance(): boolean {\n const existingIndex = DIVECommunication.__instances.findIndex(\n (entry) => entry.id === this.id,\n );\n if (existingIndex === -1) return false;\n DIVECommunication.__instances.splice(existingIndex, 1);\n return true;\n }\n\n public PerformAction<Action extends keyof Actions>(\n action: Action,\n payload: Actions[Action]['PAYLOAD'],\n ): Actions[Action]['RETURN'] {\n let returnValue: Actions[Action]['RETURN'] = false;\n\n switch (action) {\n case 'GET_ALL_SCENE_DATA': {\n returnValue = this.getAllSceneData(\n payload as Actions['GET_ALL_SCENE_DATA']['PAYLOAD'],\n );\n break;\n }\n case 'GET_ALL_OBJECTS': {\n returnValue = this.getAllObjects(\n payload as Actions['GET_ALL_OBJECTS']['PAYLOAD'],\n );\n break;\n }\n case 'GET_OBJECTS': {\n returnValue = this.getObjects(\n payload as Actions['GET_OBJECTS']['PAYLOAD'],\n );\n break;\n }\n case 'ADD_OBJECT': {\n returnValue = this.addObject(\n payload as Actions['ADD_OBJECT']['PAYLOAD'],\n );\n break;\n }\n case 'UPDATE_OBJECT': {\n returnValue = this.updateObject(\n payload as Actions['UPDATE_OBJECT']['PAYLOAD'],\n );\n break;\n }\n case 'DELETE_OBJECT': {\n returnValue = this.deleteObject(\n payload as Actions['DELETE_OBJECT']['PAYLOAD'],\n );\n break;\n }\n case 'SELECT_OBJECT': {\n returnValue = this.selectObject(\n payload as Actions['SELECT_OBJECT']['PAYLOAD'],\n );\n break;\n }\n case 'DESELECT_OBJECT': {\n returnValue = this.deselectObject(\n payload as Actions['DESELECT_OBJECT']['PAYLOAD'],\n );\n break;\n }\n case 'SET_BACKGROUND': {\n returnValue = this.setBackground(\n payload as Actions['SET_BACKGROUND']['PAYLOAD'],\n );\n break;\n }\n case 'DROP_IT': {\n returnValue = this.dropIt(\n payload as Actions['DROP_IT']['PAYLOAD'],\n );\n break;\n }\n case 'PLACE_ON_FLOOR': {\n returnValue = this.placeOnFloor(\n payload as Actions['PLACE_ON_FLOOR']['PAYLOAD'],\n );\n break;\n }\n case 'SET_CAMERA_TRANSFORM': {\n returnValue = this.setCameraTransform(\n payload as Actions['SET_CAMERA_TRANSFORM']['PAYLOAD'],\n );\n break;\n }\n case 'GET_CAMERA_TRANSFORM': {\n returnValue = this.getCameraTransform(\n payload as Actions['GET_CAMERA_TRANSFORM']['PAYLOAD'],\n );\n break;\n }\n case 'MOVE_CAMERA': {\n returnValue = this.moveCamera(\n payload as Actions['MOVE_CAMERA']['PAYLOAD'],\n );\n break;\n }\n case 'RESET_CAMERA': {\n returnValue = this.resetCamera(\n payload as Actions['RESET_CAMERA']['PAYLOAD'],\n );\n break;\n }\n case 'COMPUTE_ENCOMPASSING_VIEW': {\n returnValue = this.computeEncompassingView(\n payload as Actions['COMPUTE_ENCOMPASSING_VIEW']['PAYLOAD'],\n );\n break;\n }\n case 'SET_CAMERA_LAYER': {\n returnValue = this.setCameraLayer(\n payload as Actions['SET_CAMERA_LAYER']['PAYLOAD'],\n );\n break;\n }\n case 'ZOOM_CAMERA': {\n returnValue = this.zoomCamera(\n payload as Actions['ZOOM_CAMERA']['PAYLOAD'],\n );\n break;\n }\n case 'SET_GIZMO_MODE': {\n returnValue = this.setGizmoMode(\n payload as Actions['SET_GIZMO_MODE']['PAYLOAD'],\n );\n break;\n }\n case 'SET_GIZMO_VISIBILITY': {\n returnValue = this.setGizmoVisibility(\n payload as Actions['SET_GIZMO_VISIBILITY']['PAYLOAD'],\n );\n break;\n }\n case 'USE_TOOL': {\n returnValue = this.useTool(\n payload as Actions['USE_TOOL']['PAYLOAD'],\n );\n break;\n }\n case 'MODEL_LOADED': {\n returnValue = this.modelLoaded(\n payload as Actions['MODEL_LOADED']['PAYLOAD'],\n );\n break;\n }\n case 'UPDATE_SCENE': {\n returnValue = this.updateScene(\n payload as Actions['UPDATE_SCENE']['PAYLOAD'],\n );\n break;\n }\n case 'GENERATE_MEDIA': {\n returnValue = this.generateMedia(\n payload as Actions['GENERATE_MEDIA']['PAYLOAD'],\n );\n break;\n }\n case 'SET_PARENT': {\n returnValue = this.setParent(\n payload as Actions['SET_PARENT']['PAYLOAD'],\n );\n break;\n }\n case 'EXPORT_SCENE': {\n returnValue = this.exportScene(\n payload as Actions['EXPORT_SCENE']['PAYLOAD'],\n );\n break;\n }\n case 'LAUNCH_AR': {\n returnValue = this.ar.Launch(\n payload as Actions['LAUNCH_AR']['PAYLOAD'],\n );\n break;\n }\n default: {\n console.warn(\n `DIVECommunication.PerformAction: has been executed with unknown Action type ${action}`,\n );\n }\n }\n\n this.dispatch(action, payload);\n\n return returnValue;\n }\n\n public Subscribe<Action extends keyof Actions>(\n type: Action,\n listener: EventListener<Action>,\n ): Unsubscribe {\n if (!this.listeners.get(type)) this.listeners.set(type, []);\n\n // casting to any because of typescript not finding between Action and typeof Actions being equal in this case\n this.listeners\n .get(type)!\n .push(listener as EventListener<keyof Actions>);\n\n return () => {\n const listenerArray = this.listeners.get(type);\n if (!listenerArray) return false;\n\n const existingIndex = listenerArray.findIndex(\n (entry) => entry === listener,\n );\n if (existingIndex === -1) return false;\n\n listenerArray.splice(existingIndex, 1);\n return true;\n };\n }\n\n private dispatch<Action extends keyof Actions>(\n type: Action,\n payload: Actions[Action]['PAYLOAD'],\n ): void {\n const listenerArray = this.listeners.get(type);\n if (!listenerArray) return;\n\n listenerArray.forEach((listener) => listener(payload));\n }\n\n private getAllSceneData(\n payload: Actions['GET_ALL_SCENE_DATA']['PAYLOAD'],\n ): Actions['GET_ALL_SCENE_DATA']['RETURN'] {\n const sceneData = {\n name: this.scene.name,\n mediaItem: null,\n backgroundColor:\n '#' + (this.scene.background as Color).getHexString(),\n floorEnabled: this.scene.Floor.visible,\n floorColor:\n '#' +\n (\n this.scene.Floor.material as MeshStandardMaterial\n ).color.getHexString(),\n userCamera: {\n position: this.controller.object.position.clone(),\n target: this.controller.target.clone(),\n },\n spotmarks: [],\n lights: Array.from(this.registered.values()).filter(\n (object) => object.entityType === 'light',\n ) as COMLight[],\n objects: Array.from(this.registered.values()).filter(\n (object) => object.entityType === 'model',\n ) as COMModel[],\n cameras: Array.from(this.registered.values()).filter(\n (object) => object.entityType === 'pov',\n ) as COMPov[],\n primitives: Array.from(this.registered.values()).filter(\n (object) => object.entityType === 'primitive',\n ) as COMPrimitive[],\n groups: Array.from(this.registered.values()).filter(\n (object) => object.entityType === 'group',\n ) as COMGroup[],\n };\n Object.assign(payload, sceneData);\n return sceneData;\n }\n\n private getAllObjects(\n payload: Actions['GET_ALL_OBJECTS']['PAYLOAD'],\n ): Actions['GET_ALL_OBJECTS']['RETURN'] {\n Object.assign(payload, this.registered);\n return this.registered;\n }\n\n private getObjects(\n payload: Actions['GET_OBJECTS']['PAYLOAD'],\n ): Actions['GET_OBJECTS']['RETURN'] {\n if (payload.ids.length === 0) return [];\n\n const objects: COMEntity[] = [];\n this.registered.forEach((object) => {\n if (!payload.ids.includes(object.id)) return;\n objects.push(object);\n });\n\n return objects;\n }\n\n private addObject(\n payload: Actions['ADD_OBJECT']['PAYLOAD'],\n ): Actions['ADD_OBJECT']['RETURN'] {\n if (this.registered.get(payload.id)) return false;\n\n if (payload.parentId === undefined) payload.parentId = null;\n\n this.registered.set(payload.id, payload);\n\n this.scene.AddSceneObject(payload);\n\n return true;\n }\n\n private updateObject(\n payload: Actions['UPDATE_OBJECT']['PAYLOAD'],\n ): Actions['UPDATE_OBJECT']['RETURN'] {\n const objectToUpdate = this.registered.get(payload.id);\n if (!objectToUpdate) return false;\n\n this.registered.set(payload.id, merge(objectToUpdate, payload));\n\n const updatedObject = this.registered.get(payload.id)!;\n this.scene.UpdateSceneObject({\n ...payload,\n id: updatedObject.id,\n entityType: updatedObject.entityType,\n });\n\n Object.assign(payload, updatedObject);\n\n return true;\n }\n\n private deleteObject(\n payload: Actions['DELETE_OBJECT']['PAYLOAD'],\n ): Actions['DELETE_OBJECT']['RETURN'] {\n const deletedObject = this.registered.get(payload.id);\n if (!deletedObject) return false;\n\n // If the object has a parent, detach it first\n if (deletedObject.parentId) {\n // First detach from parent group\n this.setParent({\n object: { id: deletedObject.id },\n parent: null,\n });\n }\n\n // If deleting a group, update all children to have no parent\n if (deletedObject.entityType === 'group') {\n this.registered.forEach((object) => {\n if (object.parentId === deletedObject.id) {\n this.updateObject({\n id: object.id,\n parentId: null,\n });\n }\n });\n }\n\n // copy object to payload to use later\n Object.assign(payload, deletedObject);\n\n this.registered.delete(payload.id);\n\n // detach all children from parent if we delete a group\n Array.from(this.registered.values()).forEach((object) => {\n if (!object.parentId) return;\n if (object.parentId !== payload.id) return;\n object.parentId = null;\n });\n\n this.scene.DeleteSceneObject(deletedObject);\n\n return true;\n }\n\n private selectObject(\n payload: Actions['SELECT_OBJECT']['PAYLOAD'],\n ): Actions['SELECT_OBJECT']['RETURN'] {\n const object = this.registered.get(payload.id);\n if (!object) return false;\n\n const sceneObject = this.scene.GetSceneObject(object);\n if (!sceneObject) return false;\n\n if (!('isSelectable' in sceneObject)) return false;\n\n const activeTool = this.toolbox.GetActiveTool();\n if (activeTool && isSelectTool(activeTool)) {\n activeTool.AttachGizmo(sceneObject as DIVESelectable);\n }\n\n // copy object to payload to use later\n Object.assign(payload, object);\n\n return true;\n }\n\n private deselectObject(\n payload: Actions['DESELECT_OBJECT']['PAYLOAD'],\n ): Actions['DESELECT_OBJECT']['RETURN'] {\n const object = this.registered.get(payload.id);\n if (!object) return false;\n\n const sceneObject = this.scene.GetSceneObject(object);\n if (!sceneObject) return false;\n\n if (!('isSelectable' in sceneObject)) return false;\n\n const activeTool = this.toolbox.GetActiveTool();\n if (activeTool && isSelectTool(activeTool)) {\n activeTool.DetachGizmo();\n }\n\n // copy object to payload to use later\n Object.assign(payload, object);\n\n return true;\n }\n\n private setBackground(\n payload: Actions['SET_BACKGROUND']['PAYLOAD'],\n ): Actions['SET_BACKGROUND']['RETURN'] {\n this.scene.SetBackground(payload.color);\n\n return true;\n }\n\n private dropIt(\n payload: Actions['DROP_IT']['PAYLOAD'],\n ): Actions['DROP_IT']['RETURN'] {\n const object = this.registered.get(payload.id);\n if (!object) return false;\n\n const model = this.scene.GetSceneObject(object) as DIVEModel;\n model.DropIt();\n\n return true;\n }\n\n private placeOnFloor(\n payload: Actions['PLACE_ON_FLOOR']['PAYLOAD'],\n ): Actions['PLACE_ON_FLOOR']['RETURN'] {\n const object = this.registered.get(payload.id);\n if (!object) return false;\n\n this.scene.PlaceOnFloor(object);\n\n return true;\n }\n\n private setCameraTransform(\n payload: Actions['SET_CAMERA_TRANSFORM']['PAYLOAD'],\n ): Actions['SET_CAMERA_TRANSFORM']['RETURN'] {\n this.controller.object.position.copy(payload.position);\n this.controller.target.copy(payload.target);\n this.controller.update();\n\n return true;\n }\n\n private getCameraTransform(\n payload: Actions['GET_CAMERA_TRANSFORM']['PAYLOAD'],\n ): Actions['GET_CAMERA_TRANSFORM']['RETURN'] {\n const transform = {\n position: this.controller.object.position.clone(),\n target: this.controller.target.clone(),\n };\n Object.assign(payload, transform);\n\n return transform;\n }\n\n private moveCamera(\n payload: Actions['MOVE_CAMERA']['PAYLOAD'],\n ): Actions['MOVE_CAMERA']['RETURN'] {\n let position = { x: 0, y: 0, z: 0 };\n let target = { x: 0, y: 0, z: 0 };\n if ('id' in payload) {\n position = (this.registered.get(payload.id) as COMPov).position;\n target = (this.registered.get(payload.id) as COMPov).target;\n } else {\n position = payload.position;\n target = payload.target;\n }\n this.controller.MoveTo(\n position,\n target,\n payload.duration,\n payload.locked,\n );\n\n return true;\n }\n\n private setCameraLayer(\n payload: Actions['SET_CAMERA_LAYER']['PAYLOAD'],\n ): Actions['SET_CAMERA_LAYER']['RETURN'] {\n this.controller.object.SetCameraLayer(payload.layer);\n\n return true;\n }\n\n private resetCamera(\n payload: Actions['RESET_CAMERA']['PAYLOAD'],\n ): Actions['RESET_CAMERA']['RETURN'] {\n this.controller.RevertLast(payload.duration);\n\n return true;\n }\n\n private computeEncompassingView(\n payload: Actions['COMPUTE_ENCOMPASSING_VIEW']['PAYLOAD'],\n ): Actions['COMPUTE_ENCOMPASSING_VIEW']['RETURN'] {\n const sceneBB = this.scene.ComputeSceneBB();\n\n const transform = this.controller.ComputeEncompassingView(sceneBB);\n Object.assign(payload, transform);\n\n return transform;\n }\n\n private zoomCamera(\n payload: Actions['ZOOM_CAMERA']['PAYLOAD'],\n ): Actions['ZOOM_CAMERA']['RETURN'] {\n if (payload.direction === 'IN') this.controller.ZoomIn(payload.by);\n if (payload.direction === 'OUT') this.controller.ZoomOut(payload.by);\n\n return true;\n }\n\n private setGizmoMode(\n payload: Actions['SET_GIZMO_MODE']['PAYLOAD'],\n ): Actions['SET_GIZMO_MODE']['RETURN'] {\n this.toolbox.SetGizmoMode(payload.mode);\n return true;\n }\n\n private setGizmoVisibility(\n payload: Actions['SET_GIZMO_VISIBILITY']['PAYLOAD'],\n ): Actions['SET_GIZMO_VISIBILITY']['RETURN'] {\n this.toolbox.SetGizmoVisibility(payload);\n return payload;\n }\n\n private useTool(\n payload: Actions['USE_TOOL']['PAYLOAD'],\n ): Actions['USE_TOOL']['RETURN'] {\n this.toolbox.UseTool(payload.tool);\n return true;\n }\n\n private modelLoaded(\n payload: Actions['MODEL_LOADED']['PAYLOAD'],\n ): Actions['MODEL_LOADED']['RETURN'] {\n (this.registered.get(payload.id) as COMModel).loaded = true;\n return true;\n }\n\n private updateScene(\n payload: Actions['UPDATE_SCENE']['PAYLOAD'],\n ): Actions['UPDATE_SCENE']['RETURN'] {\n if (payload.name !== undefined) this.scene.name = payload.name;\n if (payload.backgroundColor !== undefined)\n this.scene.SetBackground(payload.backgroundColor);\n\n if (payload.gridEnabled !== undefined)\n this.scene.Grid.SetVisibility(payload.gridEnabled);\n\n if (payload.floorEnabled !== undefined)\n this.scene.Floor.SetVisibility(payload.floorEnabled);\n if (payload.floorColor !== undefined)\n this.scene.Floor.SetColor(payload.floorColor);\n\n // fill payload with current values\n // TODO optmize this\n payload.name = this.scene.name;\n payload.backgroundColor =\n '#' + (this.scene.background as Color).getHexString();\n payload.gridEnabled = this.scene.Grid.visible;\n payload.floorEnabled = this.scene.Floor.visible;\n payload.floorColor =\n '#' +\n (\n this.scene.Floor.material as MeshStandardMaterial\n ).color.getHexString();\n\n return true;\n }\n\n private generateMedia(\n payload: Actions['GENERATE_MEDIA']['PAYLOAD'],\n ): Actions['GENERATE_MEDIA']['RETURN'] {\n let position = { x: 0, y: 0, z: 0 };\n let target = { x: 0, y: 0, z: 0 };\n if ('id' in payload) {\n position = (this.registered.get(payload.id) as COMPov).position;\n target = (this.registered.get(payload.id) as COMPov).target;\n } else {\n position = payload.position;\n target = payload.target;\n }\n\n payload.dataUri = this.mediaGenerator.GenerateMedia(\n position,\n target,\n payload.width,\n payload.height,\n );\n\n return true;\n }\n\n private setParent(\n payload: Actions['SET_PARENT']['PAYLOAD'],\n ): Actions['SET_PARENT']['RETURN'] {\n const object = this.registered.get(payload.object.id);\n if (!object) return false;\n\n const sceneObject = this.scene.GetSceneObject(object);\n if (!sceneObject) return false;\n\n if (payload.parent === null) {\n // detach from current parent\n this.scene.Root.attach(sceneObject);\n // Update registration to reflect no parent\n this.updateObject({\n id: object.id,\n parentId: null,\n });\n return true;\n }\n\n if (payload.object.id === payload.parent.id) {\n // cannot attach object to itself\n return false;\n }\n\n const parent = this.registered.get(payload.parent.id);\n if (!parent) {\n // detach from current parent\n this.scene.Root.attach(sceneObject);\n // Update registration to reflect no parent\n this.updateObject({\n id: object.id,\n parentId: null,\n });\n return true;\n }\n\n // attach to new parent\n const parentObject = this.scene.GetSceneObject(parent);\n if (!parentObject) {\n // detach from current parent\n this.scene.Root.attach(sceneObject);\n // Update registration to reflect no parent\n this.updateObject({\n id: object.id,\n parentId: null,\n });\n return true;\n }\n\n // attach to new parent\n parentObject.attach(sceneObject);\n // Update registration to reflect new parent\n this.updateObject({\n id: object.id,\n parentId: parent.id,\n });\n return true;\n }\n\n private exportScene(\n payload: Actions['EXPORT_SCENE']['PAYLOAD'],\n ): Actions['EXPORT_SCENE']['RETURN'] {\n return this.io.Export(payload.type);\n }\n}\n\nexport type { Actions } from './actions/index.ts';\n","import { PRODUCT_LAYER_MASK } from '../constant/VisibilityLayerMask.ts';\nimport { Color, DirectionalLight, HemisphereLight, Object3D } from 'three';\n\n/**\n * A complex scene light.\n *\n * Can change the color, intensity, and visibility of the light.\n *\n * @module\n */\n\nexport default class DIVESceneLight extends Object3D {\n readonly isDIVELight: true = true;\n readonly isDIVESceneLight: true = true;\n\n private _hemiLight: HemisphereLight;\n private _dirLight: DirectionalLight;\n\n constructor() {\n super();\n\n this.name = 'DIVESceneLight';\n\n this._hemiLight = new HemisphereLight(0xffffff, 0xffffff, 2);\n this._hemiLight.layers.mask = PRODUCT_LAYER_MASK;\n this._hemiLight.position.set(0, 50, 0);\n this.add(this._hemiLight);\n\n this._dirLight = new DirectionalLight(0xffffff, 3);\n this._dirLight.layers.mask = PRODUCT_LAYER_MASK;\n this._dirLight.position.set(1, 1.75, 1);\n this._dirLight.position.multiplyScalar(30);\n this._dirLight.castShadow = true;\n\n this._dirLight.shadow.mapSize.width = 2048;\n this._dirLight.shadow.mapSize.height = 2048;\n\n const d = 5;\n\n this._dirLight.shadow.camera.left = -d;\n this._dirLight.shadow.camera.right = d;\n this._dirLight.shadow.camera.top = d;\n this._dirLight.shadow.camera.bottom = -d;\n\n this._dirLight.shadow.camera.far = 3500;\n this.add(this._dirLight);\n }\n\n public SetColor(color: Color): void {\n this._hemiLight.color = color;\n this._dirLight.color = color;\n }\n\n public SetIntensity(intensity: number): void {\n this._hemiLight.intensity = intensity * 2;\n this._dirLight.intensity = intensity * 3;\n }\n\n public SetEnabled(enabled: boolean): void {\n this._hemiLight.visible = enabled;\n this._dirLight.visible = enabled;\n }\n}\n","import { Mesh, MeshStandardMaterial, Raycaster, Vector3 } from 'three';\nimport { PRODUCT_LAYER_MASK } from '../constant/VisibilityLayerMask';\nimport type { GLTF } from 'three/examples/jsm/loaders/GLTFLoader';\nimport { findSceneRecursive } from '../helper/findSceneRecursive/findSceneRecursive';\nimport { type COMMaterial } from '../com/types';\nimport { DIVENode } from '../node/Node';\nimport { DIVECommunication } from '../com/Communication';\n\n/**\n * A basic model class.\n *\n * It does calculate it's own bounding box which is used for positioning on the floor.\n *\n * Can be moved and selected.\n *\n * @module\n */\n\nexport class DIVEModel extends DIVENode {\n readonly isDIVEModel: true = true;\n\n private _mesh: Mesh | null = null;\n private _material: MeshStandardMaterial | null = null;\n\n public SetModel(gltf: GLTF): void {\n this.clear();\n this._boundingBox.makeEmpty();\n\n gltf.scene.traverse((child) => {\n child.castShadow = true;\n child.receiveShadow = true;\n\n child.layers.mask = this.layers.mask;\n this._boundingBox.expandByObject(child);\n\n // only search for first mesh for now\n if (!this._mesh && 'isMesh' in child) {\n this._mesh = child as Mesh;\n\n // if the material is already set, use it, otherwise set it from the model's material\n if (this._material) {\n this._mesh.material = this._material;\n } else {\n this._material = (child as Mesh)\n .material as MeshStandardMaterial;\n }\n }\n });\n\n this.add(gltf.scene);\n }\n\n public SetMaterial(material: Partial<COMMaterial>): void {\n // if there is no material, create a new one\n if (!this._material) {\n this._material = new MeshStandardMaterial();\n }\n\n if (material.vertexColors !== undefined) {\n this._material.vertexColors = material.vertexColors;\n }\n\n // apply color if supplied\n if (material.color !== undefined) {\n this._material.color.set(material.color);\n }\n\n // apply albedo map if supplied\n if (material.map !== undefined) {\n this._material.map = material.map;\n }\n\n // apply normal map\n if (material.normalMap !== undefined) {\n this._material.normalMap = material.normalMap;\n }\n\n // set roughness value\n // if supplied, apply roughness map\n // if we applied a roughness map, set roughness to 1.0\n if (material.roughness !== undefined) {\n this._material.roughness = material.roughness;\n }\n\n if (material.roughnessMap !== undefined) {\n this._material.roughnessMap = material.roughnessMap;\n\n if (this._material.roughnessMap) {\n this._material.roughness = 1.0;\n }\n }\n\n // set metalness value\n // if supplied, apply metalness map\n // if we applied a metalness map, set metalness to 1.0\n if (material.metalness !== undefined) {\n this._material.metalness = material.metalness;\n }\n\n if (material.metalnessMap !== undefined) {\n this._material.metalnessMap = material.metalnessMap;\n\n if (this._material.metalnessMap) {\n this._material.metalness = 1.0;\n }\n }\n\n // if the mesh is already set, update the material\n if (this._mesh) {\n this._mesh.material = this._material;\n }\n }\n\n public PlaceOnFloor(): void {\n // calculate and temporary save world position\n const worldPos = this.getWorldPosition(this._positionWorldBuffer);\n const oldWorldPos = worldPos.clone();\n\n // compute the bounding box\n this._mesh?.geometry?.computeBoundingBox();\n const meshBB = this._mesh?.geometry?.boundingBox;\n\n // subtract the bounding box min y axis value from the world position y value\n if (!meshBB || !this._mesh) return;\n worldPos.y = worldPos.y - this._mesh.localToWorld(meshBB.min.clone()).y;\n\n // skip any action when the position did not change\n if (worldPos.y === oldWorldPos.y) return;\n\n DIVECommunication.get(this.userData.id)?.PerformAction(\n 'UPDATE_OBJECT',\n {\n id: this.userData.id,\n position: worldPos,\n rotation: this.rotation,\n scale: this.scale,\n },\n );\n }\n\n public DropIt(): void {\n if (!this.parent) {\n console.warn(\n 'DIVEModel: DropIt() called on a model that is not in the scene.',\n this,\n );\n return;\n }\n\n // calculate the bottom center of the bounding box\n const bottomY = this._boundingBox.min.y * this.scale.y;\n const bbBottomCenter = this.localToWorld(\n this._boundingBox.getCenter(new Vector3()).multiply(this.scale),\n );\n bbBottomCenter.y = bottomY + this.position.y;\n\n // set up raycaster and raycast all scene objects (product layer)\n const raycaster = new Raycaster(bbBottomCenter, new Vector3(0, -1, 0));\n raycaster.layers.mask = PRODUCT_LAYER_MASK;\n const intersections = raycaster.intersectObjects(\n findSceneRecursive(this).Root.children,\n true,\n );\n\n // if we hit something, move the model to the top on the hit object's bounding box\n if (intersections.length > 0) {\n const mesh = intersections[0].object as Mesh;\n mesh.geometry.computeBoundingBox();\n const meshBB = mesh.geometry.boundingBox!;\n const worldPos = mesh.localToWorld(meshBB.max.clone());\n\n const oldPos = this.position.clone();\n const newPos = this.position\n .clone()\n .setY(worldPos.y)\n .sub(new Vector3(0, bottomY, 0));\n this.position.copy(newPos);\n\n // if the position changed, update the object in communication\n if (this.position.y === oldPos.y) return;\n\n this.onMove();\n }\n }\n}\n","import { type Object3D } from 'three';\nimport { type DIVEScene } from '../../scene/Scene';\n\n/**\n * Find the scene object of an object.\n *\n * @param object - The object to find the scene of.\n * @returns The scene object.\n */\n\nexport const findSceneRecursive = (object: Object3D): DIVEScene => {\n if (object.parent) {\n return findSceneRecursive(object.parent);\n }\n return object as DIVEScene;\n};\n","import { Box3, Object3D, Vector3, type Vector3Like } from 'three';\nimport { PRODUCT_LAYER_MASK } from '../constant/VisibilityLayerMask';\nimport { DIVECommunication } from '../com/Communication';\n\nimport { type DIVEMovable } from '../interface/Movable';\nimport { type DIVESelectable } from '../interface/Selectable';\nimport { type TransformControls } from 'three/examples/jsm/controls/TransformControls';\nimport { type DIVEGroup } from '../group/Group';\n\nexport class DIVENode extends Object3D implements DIVESelectable, DIVEMovable {\n readonly isDIVENode: true = true;\n readonly isSelectable: true = true;\n readonly isMovable: true = true;\n\n public gizmo: TransformControls | null = null;\n\n protected _positionWorldBuffer: Vector3;\n protected _boundingBox: Box3;\n\n constructor() {\n super();\n\n this.layers.mask = PRODUCT_LAYER_MASK;\n\n this._positionWorldBuffer = new Vector3();\n this._boundingBox = new Box3();\n }\n\n public SetPosition(position: Vector3Like): void {\n // if there is no parent, the object will be attached later and keep it's world position\n if (!this.parent) {\n this.position.set(position.x, position.y, position.z);\n return;\n }\n\n // if we have a parent, we have to calculate the position in the parent's coordinate system to keep the world position\n const newPosition = new Vector3(position.x, position.y, position.z);\n this.position.copy(this.parent.worldToLocal(newPosition));\n\n if ('isDIVEGroup' in this.parent) {\n (this.parent as unknown as DIVEGroup).UpdateLineTo(this);\n }\n }\n\n public SetRotation(rotation: Vector3Like): void {\n this.rotation.set(rotation.x, rotation.y, rotation.z);\n }\n\n public SetScale(scale: Vector3Like): void {\n this.scale.set(scale.x, scale.y, scale.z);\n }\n\n public SetVisibility(visible: boolean): void {\n this.visible = visible;\n }\n\n public SetToWorldOrigin(): void {\n this.position.set(0, 0, 0);\n DIVECommunication.get(this.userData.id)?.PerformAction(\n 'UPDATE_OBJECT',\n {\n id: this.userData.id,\n position: this.getWorldPosition(this._positionWorldBuffer),\n rotation: this.rotation,\n scale: this.scale,\n },\n );\n }\n\n /**\n * Can be called when the object is moved from a foreign object (gizmo, parent, etc.) to update the object's position.\n */\n public onMove(): void {\n DIVECommunication.get(this.userData.id)?.PerformAction(\n 'UPDATE_OBJECT',\n {\n id: this.userData.id,\n position: this.getWorldPosition(this._positionWorldBuffer),\n rotation: this.rotation,\n scale: this.scale,\n },\n );\n }\n\n public onSelect(): void {\n DIVECommunication.get(this.userData.id)?.PerformAction(\n 'SELECT_OBJECT',\n { id: this.userData.id },\n );\n }\n\n public onDeselect(): void {\n DIVECommunication.get(this.userData.id)?.PerformAction(\n 'DESELECT_OBJECT',\n { id: this.userData.id },\n );\n }\n}\n","import { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader';\nimport { GLTF, GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader';\n\n/**\n * A basic loading manager.\n *\n * @module\n */\n\nexport class DIVELoadingManager {\n private gltfloader: GLTFLoader;\n private dracoloader: DRACOLoader;\n // ... maybe extend with other loaders later\n\n constructor() {\n this.gltfloader = new GLTFLoader();\n this.dracoloader = new DRACOLoader();\n this.dracoloader.setDecoderPath(\n 'https://www.gstatic.com/draco/v1/decoders/',\n );\n this.gltfloader.setDRACOLoader(this.dracoloader);\n }\n\n private progress: Map<string, number> = new Map<string, number>();\n\n public async LoadGLTF(uri: string): Promise<GLTF> {\n const progEvent = (p: ProgressEvent<EventTarget>): void => {\n this.progress.set(uri, p.loaded / p.total);\n };\n\n this.progress.set(uri, 0);\n\n return new Promise<GLTF>((resolve, reject) => {\n this.gltfloader\n .loadAsync(uri, progEvent)\n .then(resolve)\n .catch(reject);\n });\n }\n\n public PollProgress(): number {\n let total = 0;\n this.progress.forEach((progress: number) => {\n total += progress;\n });\n\n if (this.progress.size === 0) return 1;\n return total / this.progress.size;\n }\n}\n","import {\n BoxGeometry,\n BufferAttribute,\n BufferGeometry,\n Color,\n ConeGeometry,\n CylinderGeometry,\n Mesh,\n MeshStandardMaterial,\n Raycaster,\n SphereGeometry,\n Vector3,\n} from 'three';\nimport { PRODUCT_LAYER_MASK } from '../constant/VisibilityLayerMask';\nimport { findSceneRecursive } from '../helper/findSceneRecursive/findSceneRecursive';\nimport { DIVENode } from '../node/Node';\nimport { type COMGeometry, type COMMaterial } from '../com/types';\nimport { DIVECommunication } from '../com/Communication';\n\n/**\n * A basic model class.\n *\n * It does calculate it's own bounding box which is used for positioning on the floor.\n *\n * Can be moved and selected.\n *\n * @module\n */\nexport class DIVEPrimitive extends DIVENode {\n readonly isDIVEPrimitive: true = true;\n\n private _mesh: Mesh;\n\n constructor() {\n super();\n\n this._mesh = new Mesh();\n this._mesh.layers.mask = PRODUCT_LAYER_MASK;\n this._mesh.castShadow = true;\n this._mesh.receiveShadow = true;\n this._mesh.material = new MeshStandardMaterial();\n this.add(this._mesh);\n }\n\n public SetGeometry(geometry: COMGeometry): void {\n const geo = this.assembleGeometry(geometry);\n if (!geo) return;\n\n this._mesh.geometry = geo;\n this._boundingBox.setFromObject(this._mesh);\n }\n\n public SetMaterial(material: Partial<COMMaterial>): void {\n const primitiveMaterial = this._mesh.material as MeshStandardMaterial;\n\n if (material.vertexColors !== undefined) {\n primitiveMaterial.vertexColors = material.vertexColors;\n }\n\n // apply color if supplied\n if (material.color !== undefined) {\n primitiveMaterial.color = new Color(material.color);\n }\n\n // apply albedo map if supplied\n if (material.map !== undefined) {\n primitiveMaterial.map = material.map;\n }\n\n // apply normal map\n if (material.normalMap !== undefined) {\n primitiveMaterial.normalMap = material.normalMap;\n }\n\n // set roughness value\n // if supplied, apply roughness map\n // if we applied a roughness map, set roughness to 1.0\n if (material.roughness !== undefined) {\n primitiveMaterial.roughness = material.roughness;\n }\n\n if (material.roughnessMap !== undefined) {\n primitiveMaterial.roughnessMap = material.roughnessMap;\n\n if (primitiveMaterial.roughnessMap) {\n primitiveMaterial.roughness = 1.0;\n }\n }\n\n // set metalness value\n // if supplied, apply metalness map\n // if we applied a metalness map, set metalness to 1.0\n if (material.metalness !== undefined) {\n primitiveMaterial.metalness = material.metalness;\n }\n\n if (material.metalnessMap !== undefined) {\n primitiveMaterial.metalnessMap = material.metalnessMap;\n\n if (primitiveMaterial.metalnessMap) {\n primitiveMaterial.metalness = 0.0;\n }\n }\n\n // if the mesh is already set, update the material\n if (this._mesh) this._mesh.material = primitiveMaterial;\n }\n\n public PlaceOnFloor(): void {\n // calculate and temporary save world position\n const worldPos = this.getWorldPosition(this._positionWorldBuffer);\n const oldWorldPos = worldPos.clone();\n\n // compute the bounding box\n this._mesh?.geometry?.computeBoundingBox();\n const meshBB = this._mesh?.geometry?.boundingBox;\n\n // subtract the bounding box min y axis value from the world position y value\n if (!meshBB || !this._mesh) return;\n worldPos.y = worldPos.y - this._mesh.localToWorld(meshBB.min.clone()).y;\n\n // skip any action when the position did not change\n if (worldPos.y === oldWorldPos.y) return;\n\n DIVECommunication.get(this.userData.id)?.PerformAction(\n 'UPDATE_OBJECT',\n {\n id: this.userData.id,\n position: worldPos,\n rotation: this.rotation,\n scale: this.scale,\n },\n );\n }\n\n public DropIt(): void {\n if (!this.parent) {\n console.warn(\n 'DIVEPrimitive: DropIt() called on a model that is not in the scene.',\n this,\n );\n return;\n }\n\n // calculate the bottom center of the bounding box\n const bottomY = this._boundingBox.min.y * this.scale.y;\n const bbBottomCenter = this.localToWorld(\n this._boundingBox.getCenter(new Vector3()).multiply(this.scale),\n );\n bbBottomCenter.y = bottomY + this.position.y;\n\n // set up raycaster and raycast all scene objects (product layer)\n const raycaster = new Raycaster(bbBottomCenter, new Vector3(0, -1, 0));\n raycaster.layers.mask = PRODUCT_LAYER_MASK;\n const intersections = raycaster.intersectObjects(\n findSceneRecursive(this).Root.children,\n true,\n );\n\n // if we hit something, move the model to the top on the hit object's bounding box\n if (intersections.length > 0) {\n const mesh = intersections[0].object as Mesh;\n mesh.geometry.computeBoundingBox();\n const meshBB = mesh.geometry.boundingBox!;\n const worldPos = mesh.localToWorld(meshBB.max.clone());\n\n const oldPos = this.position.clone();\n const newPos = this.position\n .clone()\n .setY(worldPos.y)\n .sub(new Vector3(0, bottomY, 0));\n this.position.copy(newPos);\n\n // if the position changed, update the object in communication\n if (this.position.y === oldPos.y) return;\n\n this.onMove();\n }\n }\n\n private assembleGeometry(geometry: COMGeometry): BufferGeometry | null {\n // reset material to smooth shading\n (this._mesh.material as MeshStandardMaterial).flatShading = false;\n\n switch (geometry.name.toLowerCase()) {\n case 'cylinder':\n return this.createCylinderGeometry(geometry);\n case 'sphere':\n return this.createSphereGeometry(geometry);\n case 'pyramid':\n // set material to flat shading for pyramid\n (this._mesh.material as MeshStandardMaterial).flatShading =\n true;\n return this.createPyramidGeometry(geometry);\n case 'cube':\n case 'box':\n return this.createBoxGeometry(geometry);\n case 'cone':\n return this.createConeGeometry(geometry);\n case 'wall':\n return this.createWallGeometry(geometry);\n case 'plane':\n return this.createPlaneGeometry(geometry);\n default: {\n console.warn(\n 'DIVEPrimitive.assembleGeometry: Invalid geometry type:',\n geometry.name.toLowerCase(),\n );\n return null;\n }\n }\n }\n\n private createCylinderGeometry(geometry: COMGeometry): BufferGeometry {\n const geo = new CylinderGeometry(\n geometry.width / 2,\n geometry.width / 2,\n geometry.height,\n 64,\n );\n geo.translate(0, geometry.height / 2, 0);\n return geo;\n }\n\n private createSphereGeometry(geometry: COMGeometry): BufferGeometry {\n const geo = new SphereGeometry(geometry.width / 2, 256, 256);\n return geo;\n }\n\n private createPyramidGeometry(geometry: COMGeometry): BufferGeometry {\n // prettier-multiline-arrays-next-line-pattern: 3\n const vertices = new Float32Array([\n -geometry.width / 2, 0, -geometry.depth / 2, // 0\n geometry.width / 2, 0, -geometry.depth / 2, // 1\n geometry.width / 2, 0, geometry.depth / 2, // 2\n -geometry.width / 2, 0, geometry.depth / 2, // 3\n 0, geometry.height, 0,\n ]);\n\n // prettier-multiline-arrays-next-line-pattern: 3\n const indices = new Uint16Array([\n 0, 1, 2,\n 0, 2, 3,\n 0, 4, 1,\n 1, 4, 2,\n 2, 4, 3,\n 3, 4, 0,\n ]);\n\n const geometryBuffer = new BufferGeometry();\n geometryBuffer.setAttribute(\n 'position',\n new BufferAttribute(vertices, 3),\n );\n geometryBuffer.setIndex(new BufferAttribute(indices, 1));\n geometryBuffer.computeVertexNormals();\n\n geometryBuffer.computeBoundingBox();\n geometryBuffer.computeBoundingSphere();\n return geometryBuffer;\n }\n\n private createBoxGeometry(geometry: COMGeometry): BufferGeometry {\n const geo = new BoxGeometry(\n geometry.width,\n geometry.height,\n geometry.depth,\n );\n geo.translate(0, geometry.height / 2, 0);\n return geo;\n }\n\n private createConeGeometry(geometry: COMGeometry): BufferGeometry {\n const geo = new ConeGeometry(geometry.width / 2, geometry.height, 256);\n geo.translate(0, geometry.height / 2, 0);\n return geo;\n }\n\n private createWallGeometry(geometry: COMGeometry): BufferGeometry {\n const geo = new BoxGeometry(\n geometry.width,\n geometry.height,\n geometry.depth || 0.05,\n 16,\n );\n geo.translate(0, geometry.height / 2, 0);\n return geo;\n }\n\n private createPlaneGeometry(geometry: COMGeometry): BufferGeometry {\n const geo = new BoxGeometry(\n geometry.width,\n geometry.height,\n geometry.depth,\n );\n geo.translate(0, geometry.height / 2, 0);\n return geo;\n }\n}\n","import {\n BufferGeometry,\n Line,\n LineDashedMaterial,\n Vector3,\n Vector3Like,\n} from 'three';\nimport { DIVENode } from '../node/Node';\nimport { type Object3D } from 'three';\nimport { type DIVESceneObject } from '../types';\n\nexport class DIVEGroup extends DIVENode {\n readonly isDIVEGroup: true = true;\n\n private _members: Object3D[]; // children objects\n\n public get members(): Object3D[] {\n return this._members;\n }\n\n private _lines: Line[]; // lines to children\n\n constructor() {\n super();\n\n this.name = 'DIVEGroup';\n\n this._members = [];\n\n this._lines = [];\n }\n\n public SetPosition(position: Vector3Like): void {\n super.SetPosition(position);\n this._members.forEach((member) => {\n if ('isDIVENode' in member) {\n (member as DIVENode).onMove();\n }\n });\n }\n\n public SetLinesVisibility(visible: boolean, object?: Object3D): void {\n if (!object) {\n this._lines.forEach((line) => {\n line.visible = visible;\n });\n return;\n }\n\n const index = this._members.indexOf(object);\n if (index === -1) return;\n\n this._lines[index].visible = visible;\n }\n\n public attach(object: DIVESceneObject): this {\n // Check if the object is already a member\n if (this._members.includes(object)) {\n return this;\n }\n\n // create a line to the new object\n const line = this.createLine();\n this.add(line);\n this._lines.push(line);\n\n // attach (instead of add) object to keep its world position\n super.attach(object);\n this._members.push(object);\n\n // update line to object points\n this.updateLineTo(line, object);\n this.SetLinesVisibility(true, object);\n\n return this;\n }\n\n public remove(object: DIVESceneObject): this {\n // remove line first\n const index = this._members.indexOf(object);\n if (index === -1) return this;\n\n const line = this._lines[index];\n super.remove(line);\n this._lines.splice(index, 1);\n\n // removes object from group while keeping it's world position\n super.remove(object);\n this._members.splice(index, 1);\n\n return this;\n }\n\n public UpdateLineTo(object: Object3D): void {\n const index = this._members.indexOf(object);\n if (index === -1) return;\n\n this.updateLineTo(this._lines[index], object);\n }\n\n /**\n * Adds a line to this grouo as last child.\n */\n private createLine(): Line {\n const geo = new BufferGeometry();\n const mat = new LineDashedMaterial({\n color: 0x666666,\n dashSize: 0.05,\n gapSize: 0.025,\n });\n const line = new Line(geo, mat);\n line.visible = false;\n return line;\n }\n\n /**\n * Updates a line to the object.\n */\n private updateLineTo(line: Line, object: Object3D): void {\n line.geometry.setFromPoints([\n new Vector3(0, 0, 0),\n object.position.clone(),\n ]);\n line.computeLineDistances();\n }\n\n // public SetBoundingBoxVisibility(visible: boolean): void {\n // this._boxMesh.visible = visible;\n // }\n\n // /**\n // * Recalculates the position of the group based on it's bounding box.\n // * Children's world positions are kept.\n // */\n // private recalculatePosition(): void {\n // // store all children's world positions\n // const childrensWorldPositions: Vector3[] = this.children.map((child) => child.getWorldPosition(new Vector3()));\n\n // // calculate new center and set it as the group's position\n // const bbcenter = this.updateBB();\n // this.position.copy(bbcenter);\n\n // // set childrens's positions so their world positions are kept\n // this.children.forEach((child, i) => {\n // if (child.uuid === this._boxMesh.uuid) return;\n // child.position.copy(this.worldToLocal(childrensWorldPositions[i]));\n // });\n\n // DIVECommunication.get(this.userData.id)?.PerformAction('UPDATE_OBJECT', { id: this.userData.id, position: this.position });\n // }\n\n // /**\n // * Updates the bounding box of the group.\n // * @returns {Vector3} The new center of the bounding box.\n // */\n // private updateBB(): Vector3 {\n // this._boundingBox.makeEmpty();\n\n // if (this.children.length === 1) {\n // // because we always have the box mesh as 1 child\n // return this.position.clone();\n // }\n\n // this.children.forEach((child) => {\n // if (child.uuid === this._boxMesh.uuid) return;\n // this._boundingBox.expandByObject(child);\n // });\n\n // return this._boundingBox.getCenter(new Vector3());\n // }\n\n // private updateBoxMesh(): void {\n // if (this.children.length === 1) {\n // // because we always have the box mesh as 1 child\n // this._boxMesh.visible = false;\n // return;\n // }\n\n // this._boxMesh.quaternion.copy(this.quaternion.clone().invert());\n // this._boxMesh.scale.set(1 / this.scale.x, 1 / this.scale.y, 1 / this.scale.z);\n // this._boxMesh.geometry = new BoxGeometry(this._boundingBox.max.x - this._boundingBox.min.x, this._boundingBox.max.y - this._boundingBox.min.y, this._boundingBox.max.z - this._boundingBox.min.z);\n // this._boxMesh.visible = true;\n // }\n}\n","export const GRID_CENTER_LINE_COLOR = '#888888';\nexport const GRID_SIDE_LINE_COLOR = '#dddddd';\n","import {\n GRID_SIDE_LINE_COLOR,\n GRID_CENTER_LINE_COLOR,\n} from '../constant/GridColors.ts';\nimport { HELPER_LAYER_MASK } from '../constant/VisibilityLayerMask.ts';\nimport { GridHelper, Object3D } from 'three';\n\n/**\n * A basic grid for the scene.\n *\n * @module\n */\n\nexport class DIVEGrid extends Object3D {\n constructor() {\n super();\n this.name = 'Grid';\n\n const grid = new GridHelper(\n 100,\n 100,\n GRID_CENTER_LINE_COLOR,\n GRID_SIDE_LINE_COLOR,\n );\n grid.material.depthTest = false;\n grid.layers.mask = HELPER_LAYER_MASK;\n\n this.add(grid);\n }\n\n public SetVisibility(visible: boolean): void {\n this.visible = visible;\n }\n}\n","import {\n Color,\n ColorRepresentation,\n Mesh,\n MeshStandardMaterial,\n PlaneGeometry,\n} from 'three';\nimport { PRODUCT_LAYER_MASK } from '../../constant/VisibilityLayerMask.ts';\n\n/**\n * A basic floor geometry.\n *\n * Can change the color and visibility of the floor.\n *\n * @module\n */\n\nexport class DIVEFloor extends Mesh {\n public isFloor: true = true;\n\n constructor() {\n super(\n new PlaneGeometry(10000, 10000),\n new MeshStandardMaterial({\n color: new Color(150 / 255, 150 / 255, 150 / 255),\n }),\n );\n\n this.name = 'Floor';\n\n this.layers.mask = PRODUCT_LAYER_MASK;\n\n this.receiveShadow = true;\n\n this.rotateX(-Math.PI / 2);\n }\n\n public SetVisibility(visible: boolean): void {\n this.visible = visible;\n }\n\n public SetColor(color: ColorRepresentation): void {\n (this.material as MeshStandardMaterial).color = new Color(color);\n }\n}\n","import { Mesh, Object3D, PlaneGeometry, ShadowMaterial } from 'three';\nimport { DIVERoot } from '../root/Root';\nimport { type DIVERenderer } from '../../renderer/Renderer';\nimport { DIVEXRLightRoot } from './xrlightroot/XRLightRoot';\nimport { type DIVEScene } from '../Scene';\n\nexport class DIVEXRRoot extends Object3D {\n private _xrLightRoot: DIVEXRLightRoot;\n private _xrModelRoot: DIVERoot;\n private _xrHandNode: Object3D;\n\n public get XRModelRoot(): DIVERoot {\n return this._xrModelRoot;\n }\n\n public get XRLightRoot(): DIVEXRLightRoot {\n return this._xrLightRoot;\n }\n\n public get XRHandNode(): Object3D {\n return this._xrHandNode;\n }\n\n private _xrShadowPlane: Mesh;\n\n constructor(scene: DIVEScene) {\n super();\n this.name = 'XRRoot';\n\n this._xrModelRoot = new DIVERoot();\n this._xrModelRoot.name = 'XRModelRoot';\n this.add(this._xrModelRoot);\n\n this._xrShadowPlane = new Mesh(\n new PlaneGeometry(100, 100),\n new ShadowMaterial({ opacity: 1, transparent: true }),\n );\n this._xrModelRoot.add(this._xrShadowPlane);\n\n this._xrLightRoot = new DIVEXRLightRoot(scene);\n this._xrLightRoot.name = 'XRLightRoot';\n this.add(this._xrLightRoot);\n\n this._xrHandNode = new Object3D();\n this._xrHandNode.name = 'XRHandNode';\n this.add(this._xrHandNode);\n }\n\n public InitLightEstimation(renderer: DIVERenderer): void {\n this._xrLightRoot.InitLightEstimation(renderer);\n }\n\n public DisposeLightEstimation(): void {\n this._xrLightRoot.DisposeLightEstimation();\n }\n}\n","import { XREstimatedLight } from 'three/examples/jsm/webxr/XREstimatedLight';\nimport { type DIVERenderer } from '../../../renderer/Renderer';\nimport { Object3D } from 'three';\nimport { type DIVEScene } from '../../Scene';\nimport { PRODUCT_LAYER_MASK } from '../../../constant/VisibilityLayerMask';\nimport { DIVERoot } from '../../root/Root';\n\nexport class DIVEXRLightRoot extends Object3D {\n private _scene: DIVEScene;\n\n private _xrLight: XREstimatedLight | null;\n private _lightRoot: DIVERoot;\n\n constructor(scene: DIVEScene) {\n super();\n this.name = 'XRLightRoot';\n\n this._scene = scene;\n\n // placeholder for XR light\n this._xrLight = null;\n\n // add scene\n this._lightRoot = new DIVERoot();\n this._lightRoot.UpdateSceneObject({\n id: 'XRSceneLight',\n entityType: 'light',\n name: 'XRSceneLight',\n type: 'scene',\n color: 0xffffff,\n intensity: 1,\n enabled: true,\n visible: true,\n });\n this.add(this._lightRoot);\n }\n\n public InitLightEstimation(renderer: DIVERenderer): void {\n if (!this._xrLight) {\n this._xrLight = new XREstimatedLight(renderer, true);\n this._xrLight.layers.mask = PRODUCT_LAYER_MASK;\n this.add(this._xrLight);\n }\n\n this._xrLight.addEventListener('estimationstart', () => {\n this.onEstimationStart();\n });\n this._xrLight.addEventListener('estimationend', () => {\n this.onEstimationEnd();\n });\n }\n\n public DisposeLightEstimation(): void {\n if (!this._xrLight) return;\n\n this._xrLight.removeEventListener('estimationstart', () => {\n this.onEstimationStart();\n });\n this._xrLight.removeEventListener('estimationend', () => {\n this.onEstimationEnd();\n });\n }\n\n private onEstimationStart(): void {\n this._lightRoot.visible = false;\n\n if (!this._xrLight) return;\n\n if (this._xrLight.environment) {\n this._scene.environment = this._xrLight.environment;\n }\n }\n\n private onEstimationEnd(): void {\n this._lightRoot.visible = true;\n this._scene.environment = null;\n\n if (!this._xrLight) return;\n }\n}\n","import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls';\nimport DIVEPerspectiveCamera from '../camera/PerspectiveCamera.ts';\nimport { DIVERenderer } from '../renderer/Renderer.ts';\nimport { type Box3, MathUtils, Vector3, Vector3Like } from 'three';\nimport { Easing } from '@tweenjs/tween.js';\nimport { type DIVEAnimationSystem } from '../animation/AnimationSystem.ts';\n\nexport type DIVEOrbitControlsSettings = {\n enableDamping: boolean;\n dampingFactor: number;\n};\n\nexport const DIVEOrbitControlsDefaultSettings: DIVEOrbitControlsSettings = {\n enableDamping: true,\n dampingFactor: 0.04,\n};\n\n/**\n * Orbit Controls. Basic functionality to orbit around a given target point in the scene.\n *\n * @module\n */\n\nexport default class DIVEOrbitControls extends OrbitControls {\n public static readonly DEFAULT_ZOOM_FACTOR = 1;\n\n private _animationSystem: DIVEAnimationSystem;\n\n private last: { pos: Vector3Like; target: Vector3Like } | null = null;\n\n private animating: boolean = false;\n private locked: boolean = false;\n\n private stopMoveTo: () => void = () => {};\n private stopRevertLast: () => void = () => {};\n\n public object: DIVEPerspectiveCamera;\n public domElement: HTMLCanvasElement;\n\n private _removePreRenderCallback: () => void = () => {};\n\n constructor(\n camera: DIVEPerspectiveCamera,\n renderer: DIVERenderer,\n animationSystem: DIVEAnimationSystem,\n settings: Partial<DIVEOrbitControlsSettings> = DIVEOrbitControlsDefaultSettings,\n ) {\n super(camera, renderer.domElement);\n\n this._animationSystem = animationSystem;\n\n this.domElement = renderer.domElement;\n\n this.object = camera;\n\n const id = renderer.AddPreRenderCallback(() => {\n this.preRenderCallback();\n });\n\n this._removePreRenderCallback = () => {\n renderer.RemovePreRenderCallback(id);\n };\n\n this.enableDamping =\n settings.enableDamping ||\n DIVEOrbitControlsDefaultSettings.enableDamping;\n this.dampingFactor =\n settings.dampingFactor ||\n DIVEOrbitControlsDefaultSettings.dampingFactor;\n\n // initialize camera transformation\n this.object.position.set(0, 2, 2);\n this.target.copy({ x: 0, y: 0.5, z: 0 });\n this.update();\n }\n\n public Dispose(): void {\n this._removePreRenderCallback();\n this.dispose();\n }\n\n public ComputeEncompassingView(bb: Box3): {\n position: Vector3Like;\n target: Vector3Like;\n } {\n const center = bb.getCenter(new Vector3());\n const size = bb.getSize(new Vector3());\n const distance = Math.max(size.x, size.y, size.z) * 1.25;\n const direction = this.object.position.clone().normalize();\n\n return {\n position: direction.multiplyScalar(distance),\n target: center,\n };\n }\n\n public ZoomIn(by?: number): void {\n const zoomBy = by || DIVEOrbitControls.DEFAULT_ZOOM_FACTOR;\n const { minDistance, maxDistance } = this;\n this.minDistance = this.maxDistance = MathUtils.clamp(\n this.getDistance() - zoomBy,\n minDistance + zoomBy,\n maxDistance - zoomBy,\n );\n this.update();\n this.minDistance = minDistance;\n this.maxDistance = maxDistance;\n }\n\n public ZoomOut(by?: number): void {\n const zoomBy = by || DIVEOrbitControls.DEFAULT_ZOOM_FACTOR;\n const { minDistance, maxDistance } = this;\n this.minDistance = this.maxDistance = MathUtils.clamp(\n this.getDistance() + zoomBy,\n minDistance + zoomBy,\n maxDistance - zoomBy,\n );\n this.update();\n this.minDistance = minDistance;\n this.maxDistance = maxDistance;\n }\n\n public MoveTo(\n pos: Vector3Like | undefined,\n target: Vector3Like | undefined,\n duration: number,\n lock: boolean,\n ): void {\n if (this.animating) return;\n\n const toPosition = pos || this.object.position.clone();\n const toTarget = target || this.target.clone();\n\n this.stopRevertLast();\n\n if (!this.locked)\n this.last = {\n pos: this.object.position.clone(),\n target: this.target.clone(),\n };\n\n this.animating = duration > 0;\n this.locked = lock;\n this.enabled = false;\n\n const tweenPos = this._animationSystem\n .Animate(this.object.position)\n .to(toPosition, duration)\n .easing(Easing.Quadratic.Out)\n .start();\n\n const tweenQuat = this._animationSystem\n .Animate(this.target)\n .to(toTarget, duration)\n .easing(Easing.Quadratic.Out)\n .onUpdate(() => {\n this.object.lookAt(this.target);\n })\n .onComplete(() => {\n this.animating = false;\n this.enabled = !lock;\n })\n .start();\n\n this.stopMoveTo = () => {\n tweenPos.stop();\n tweenQuat.stop();\n };\n }\n\n public RevertLast(duration: number): void {\n if (this.animating || !this.locked) return;\n\n this.stopMoveTo();\n\n this.animating = duration > 0;\n this.enabled = false;\n\n const { pos, target } = this.last!;\n\n const tweenPos = this._animationSystem\n .Animate(this.object.position)\n .to(pos, duration)\n .easing(Easing.Quadratic.Out)\n .start();\n\n const tweenQuat = this._animationSystem\n .Animate(this.target)\n .to(target, duration)\n .easing(Easing.Quadratic.Out)\n .onUpdate(() => {\n this.object.lookAt(this.target);\n })\n .onComplete(() => {\n this.animating = false;\n this.locked = false;\n this.enabled = true;\n })\n .start();\n\n this.stopRevertLast = () => {\n tweenPos.stop();\n tweenQuat.stop();\n };\n }\n\n private preRenderCallback = (): void => {\n if (this.locked) return;\n this.update();\n };\n}\n","import type DIVEOrbitControls from '../controls/OrbitControls.ts';\nimport { type DIVEScene } from '../scene/Scene.ts';\nimport { type DIVEBaseTool } from './BaseTool.ts';\nimport { type DIVESelectTool } from './select/SelectTool.ts';\n\nexport type ToolType = 'select' | 'none';\n\n/**\n * A Toolbox to activate and deactivate tools to use with the pointer.\n *\n * @module\n */\n\nexport default class DIVEToolbox {\n public static readonly DefaultTool = 'select';\n\n private _scene: DIVEScene;\n private _controller: DIVEOrbitControls;\n\n private _activeTool: DIVEBaseTool | null;\n\n private _selectTool: DIVESelectTool | null;\n public get selectTool(): DIVESelectTool {\n if (!this._selectTool) {\n const DIVESelectTool = require('./select/SelectTool.ts')\n .DIVESelectTool as typeof import('./select/SelectTool.ts').DIVESelectTool;\n this._selectTool = new DIVESelectTool(\n this._scene,\n this._controller,\n );\n }\n return this._selectTool;\n }\n\n constructor(scene: DIVEScene, controller: DIVEOrbitControls) {\n this._scene = scene;\n this._controller = controller;\n\n // toolset\n this._selectTool = null;\n\n // default tool\n this._activeTool = null;\n }\n\n public Dispose(): void {\n this.removeEventListeners();\n }\n\n public GetActiveTool(): DIVEBaseTool | null {\n return this._activeTool;\n }\n\n public UseTool(tool: ToolType): void {\n this._activeTool?.Deactivate();\n switch (tool) {\n case 'select': {\n this.addEventListeners();\n this.selectTool.Activate();\n this._activeTool = this.selectTool;\n break;\n }\n case 'none': {\n this.removeEventListeners();\n this._activeTool = null;\n break;\n }\n default: {\n console.warn(`DIVEToolBox.UseTool: Unknown tool: ${tool}`);\n }\n }\n }\n\n public SetGizmoMode(mode: 'translate' | 'rotate' | 'scale'): void {\n this.selectTool.SetGizmoMode(mode);\n }\n\n public SetGizmoVisibility(active: boolean): void {\n this.selectTool.SetGizmoVisibility(active);\n }\n\n public onPointerMove(e: PointerEvent): void {\n this._activeTool?.onPointerMove(e);\n }\n\n public onPointerDown(e: PointerEvent): void {\n this._activeTool?.onPointerDown(e);\n }\n\n public onPointerUp(e: PointerEvent): void {\n this._activeTool?.onPointerUp(e);\n }\n\n public onWheel(e: WheelEvent): void {\n this._activeTool?.onWheel(e);\n }\n\n private addEventListeners(): void {\n this._controller.domElement.addEventListener('pointermove', (e) =>\n this.onPointerMove(e),\n );\n this._controller.domElement.addEventListener('pointerdown', (e) =>\n this.onPointerDown(e),\n );\n this._controller.domElement.addEventListener('pointerup', (e) =>\n this.onPointerUp(e),\n );\n this._controller.domElement.addEventListener('wheel', (e) =>\n this.onWheel(e),\n );\n }\n\n private removeEventListeners(): void {\n this._controller.domElement.removeEventListener('pointermove', (e) =>\n this.onPointerMove(e),\n );\n this._controller.domElement.removeEventListener('pointerdown', (e) =>\n this.onPointerDown(e),\n );\n this._controller.domElement.removeEventListener('pointerup', (e) =>\n this.onPointerUp(e),\n );\n this._controller.domElement.removeEventListener('wheel', (e) =>\n this.onWheel(e),\n );\n }\n}\n","import { Tween, update as updateTween } from '@tweenjs/tween.js';\nimport { DIVERenderer } from '../renderer/Renderer';\n\n/**\n * Updates all animations.\n * DIVE uses Tween.js to handle animations.\n *\n * @module\n */\n\nexport class DIVEAnimationSystem {\n private _renderer: DIVERenderer;\n private _rendererCallbackId: string;\n\n constructor(renderer: DIVERenderer) {\n this._renderer = renderer;\n\n this._rendererCallbackId = this._renderer.AddPreRenderCallback(() => {\n this.Update();\n });\n }\n\n public Dispose(): void {\n this._renderer.RemovePreRenderCallback(this._rendererCallbackId);\n }\n\n public Update(): void {\n updateTween();\n }\n\n public Animate<T extends object>(object: T): Tween<T> {\n return new Tween<T>(object);\n }\n}\n","import {\n AxesHelper,\n Color,\n type Material,\n Matrix4,\n OrthographicCamera,\n Vector4,\n} from 'three';\nimport SpriteText from 'three-spritetext';\nimport { COORDINATE_LAYER_MASK } from '../constant/VisibilityLayerMask.ts';\nimport {\n AxesColorRed,\n AxesColorGreen,\n AxesColorBlue,\n AxesColorRedLetter,\n AxesColorGreenLetter,\n AxesColorBlueLetter,\n} from '../constant/AxisHelperColors.ts';\nimport { type DIVERenderer } from '../renderer/Renderer.ts';\nimport { type DIVEScene } from '../scene/Scene.ts';\nimport type DIVEOrbitControls from '../controls/OrbitControls.ts';\n\n/**\n * Shows the scene axes in the bottom left corner of the screen.\n *\n * @module\n */\n\nexport default class DIVEAxisCamera extends OrthographicCamera {\n private axesHelper: AxesHelper;\n\n private _renderer: DIVERenderer;\n private _scene: DIVEScene;\n\n private _renderCallbackId: string;\n\n constructor(\n renderer: DIVERenderer,\n scene: DIVEScene,\n controls: DIVEOrbitControls,\n ) {\n super(-1, 1, 1, -1, 0.1, 100);\n\n this.layers.mask = COORDINATE_LAYER_MASK;\n\n this.axesHelper = new AxesHelper(0.5);\n this.axesHelper.layers.mask = COORDINATE_LAYER_MASK;\n (this.axesHelper.material as Material).depthTest = false; // always draw\n this.axesHelper.position.set(0, 0, -1);\n\n this.axesHelper.setColors(\n new Color(AxesColorRed),\n new Color(AxesColorGreen),\n new Color(AxesColorBlue),\n );\n\n const x = new SpriteText('X', 0.2, AxesColorRedLetter);\n const y = new SpriteText('Y', 0.2, AxesColorGreenLetter);\n const z = new SpriteText('Z', 0.2, AxesColorBlueLetter);\n x.layers.mask = COORDINATE_LAYER_MASK;\n y.layers.mask = COORDINATE_LAYER_MASK;\n z.layers.mask = COORDINATE_LAYER_MASK;\n x.position.set(0.7, 0, 0);\n y.position.set(0, 0.7, 0);\n z.position.set(0, 0, 0.7);\n this.axesHelper.add(x);\n this.axesHelper.add(y);\n this.axesHelper.add(z);\n\n this.add(this.axesHelper);\n\n // attach everything to current scene and render cycle\n this._renderer = renderer;\n this._scene = scene;\n this._scene.add(this);\n\n const restoreViewport = new Vector4();\n\n this._renderCallbackId = renderer.AddPostRenderCallback(() => {\n const restoreBackground = scene.background;\n scene.background = null;\n\n renderer.getViewport(restoreViewport);\n renderer.setViewport(0, 0, 150, 150);\n renderer.autoClear = false;\n\n this.SetFromCameraMatrix(controls.object.matrix);\n\n renderer.render(scene, this);\n\n renderer.setViewport(restoreViewport);\n renderer.autoClear = true;\n\n scene.background = restoreBackground;\n });\n }\n\n public Dispose(): void {\n this._renderer.RemovePostRenderCallback(this._renderCallbackId);\n this._scene.remove(this);\n }\n\n public SetFromCameraMatrix(matrix: Matrix4): void {\n this.axesHelper.rotation.setFromRotationMatrix(\n new Matrix4().extractRotation(matrix).invert(),\n );\n }\n}\n","export const AxesColorRedLetter = '#c20017';\nexport const AxesColorGreenLetter = '#00ab26';\nexport const AxesColorBlueLetter = '#0081d4';\n\nexport const AxesColorRed = AxesColorRedLetter;\nexport const AxesColorGreen = AxesColorGreenLetter;\nexport const AxesColorBlue = AxesColorBlueLetter;\n","/**\n * Find the difference between two objects.\n */\n\nexport const getObjectDelta = <T extends object>(\n a: T,\n b: Partial<T>,\n): Partial<T> => {\n // if a and b have no entries we have no delta\n if (Object.keys(a).length === 0 && Object.keys(b).length === 0) {\n return {};\n }\n\n // if a or b is not an object we have a delta\n if (typeof a !== 'object' || typeof b !== 'object') {\n return b;\n }\n\n let delta = {};\n\n Object.keys(b).forEach((key) => {\n // if key is not in a we have a delta\n if (!Object.keys(a).includes(key)) {\n delta = { ...delta, [key]: b[key as keyof object] };\n return;\n }\n\n // assumption: b[key] is an array\n if (Array.isArray(b[key as keyof object])) {\n // if a[key] is not an array we have a delta\n if (!Array.isArray(a[key as keyof object])) {\n delta = { ...delta, [key]: b[key as keyof object] };\n return;\n }\n\n // create arrays (for TS types to be correct)\n const aArray = a[key as keyof object] as [];\n const bArray = b[key as keyof object] as [];\n\n // if both arrays are empty we have no delta\n if (aArray.length === 0 && bArray.length === 0) {\n delta = { ...delta };\n return;\n }\n\n // if array length is different we have a delta\n if (aArray.length !== bArray.length) {\n delta = { ...delta, [key]: b[key as keyof object] };\n return;\n }\n\n // create array for deltas\n const arrayDeltas: [] = [];\n\n bArray.forEach((entry, index) => {\n // getObjectDelta in array\n const inArrayDelta = getObjectDelta(\n aArray[index],\n bArray[index],\n );\n\n // if inArrayDelta has more then 0 entries we have a delta\n if (Object.keys(inArrayDelta).length) {\n arrayDeltas.push(bArray[index]);\n }\n });\n\n // if arrayDeltas has more than 0 entries we have a delta\n if (Object.keys(arrayDeltas).length) {\n delta = { ...delta, [key]: arrayDeltas };\n return;\n }\n\n return;\n }\n\n // assumption: b[key] is an object\n if (typeof b[key as keyof object] === 'object') {\n // if a[key] is not an object we have a delta\n if (typeof a[key as keyof object] !== 'object') {\n delta = { ...delta, [key]: b[key as keyof object] };\n return;\n }\n\n // recursive: find objectDelta in a and b\n const objectDelta = getObjectDelta(\n a[key as keyof object],\n b[key as keyof object],\n );\n\n // if objectDelta has more than 0 entries we have a delta\n if (Object.keys(objectDelta).length) {\n delta = { ...delta, [key]: objectDelta };\n return;\n }\n }\n\n // if a[key] is not equal to b[key] we have a delta\n if (a[key as keyof object] !== b[key as keyof object]) {\n delta = { ...delta, [key]: b[key as keyof object] };\n }\n });\n\n return delta;\n};\n","{\n \"name\": \"@shopware-ag/dive\",\n \"version\": \"1.18.0\",\n \"description\": \"Shopware Spatial Framework\",\n \"type\": \"module\",\n \"main\": \"./build/dive.cjs\",\n \"module\": \"./build/dive.js\",\n \"types\": \"./build/dive.d.ts\",\n \"files\": [\n \"build\",\n \"LICENSE\",\n \"package.json\",\n \"README.md\",\n \"src\"\n ],\n \"keywords\": [\n \"dive\",\n \"shopware\",\n \"sw6\",\n \"three\",\n \"three.js\",\n \"3d\",\n \"typescript\"\n ],\n \"repository\": \"git@github.com:shopware/dive.git\",\n \"author\": \"ffrank <f.frank@shopware.com>\",\n \"license\": \"MIT\",\n \"browserslist\": [\n \"> 1%, not dead, not ie 11, not op_mini all\"\n ],\n \"dependencies\": {\n \"@tweenjs/tween.js\": \"^23.1.1\",\n \"lodash\": \"^4.17.21\",\n \"three\": \"^0.163.0\",\n \"three-spritetext\": \"^1.8.2\"\n },\n \"devDependencies\": {\n \"@eslint/js\": \"^9.1.1\",\n \"@types/jest\": \"^29.5.12\",\n \"@types/lodash\": \"^4.17.12\",\n \"@types/node\": \"^20.12.7\",\n \"@types/three\": \"^0.163.0\",\n \"eslint\": \"^9.1.1\",\n \"globals\": \"^15.0.0\",\n \"jest\": \"^29.7.0\",\n \"jest-environment-jsdom\": \"^29.7.0\",\n \"jest-junit\": \"^16.0.0\",\n \"jsdom\": \"^24.0.0\",\n \"prettier\": \"^3.3.3\",\n \"prettier-plugin-multiline-arrays\": \"^3.0.6\",\n \"ts-jest\": \"^29.1.2\",\n \"ts-node\": \"^10.9.2\",\n \"tsc\": \"^2.0.4\",\n \"tsup\": \"^8.0.2\",\n \"typescript\": \"^5.4.5\",\n \"typescript-eslint\": \"^7.7.1\"\n },\n \"scripts\": {\n \"build\": \"tsup --env.DIVE_NODE_ENV production\",\n \"dev\": \"tsup --watch --env.DIVE_NODE_ENV development\",\n \"lint\": \"eslint\",\n \"lint:actions\": \"yarn lint:actions:transpile && yarn lint:actions:check && yarn lint:actions:cleanup\",\n \"lint:actions:transpile\": \"yarn tsc --resolveJsonModule --esModuleInterop ci/lint/lint-actions.ts && mv ci/lint/lint-actions.js ci/lint/lint-actions.cjs\",\n \"lint:actions:check\": \"yarn node ci/lint/lint-actions.cjs\",\n \"lint:actions:cleanup\": \"node -e \\\"require('fs').unlinkSync('ci/lint/lint-actions.cjs')\\\"\",\n \"prettier:check\": \"prettier --check .\",\n \"prettier:fix\": \"prettier --write .\",\n \"unit\": \"jest\",\n \"coverage\": \"jest --coverage\",\n \"generate-readme\": \"yarn generate-readme:transpile && yarn generate-readme:write && yarn generate-readme:cleanup\",\n \"generate-readme:transpile\": \"yarn tsc --resolveJsonModule --esModuleInterop ci/readme/generate-readme.ts && mv ci/readme/generate-readme.js ci/readme/generate-readme.cjs\",\n \"generate-readme:write\": \"node ci/readme/generate-readme.cjs\",\n \"generate-readme:cleanup\": \"node -e \\\"require('fs').unlinkSync('ci/readme/generate-readme.cjs')\\\"\",\n \"ci\": \"yarn lint && yarn coverage && yarn prettier:check && yarn build && bash ci/lint/lint-actions.sh\"\n }\n}\n","export default function shift(value: number, exponent: number): number {\n const subvalues = (value + 'e').split('e');\n return +(subvalues[0] + 'e' + (+subvalues[1] + (exponent || 0)));\n}\n","import shift from '../helper/shift.ts';\n\nexport default function ceilExp(number: number, decimals: number = 0): number {\n const n = shift(number, +decimals);\n return shift(Math.ceil(n), -decimals);\n}\n","import shift from '../helper/shift.ts';\n\nexport default function floorExp(number: number, decimals: number = 0): number {\n const n = shift(number, +decimals);\n return shift(Math.floor(n), -decimals);\n}\n","import shift from '../helper/shift.ts';\n\nexport default function roundExponential(\n number: number,\n decimals: number = 0,\n): number {\n if (number < 0) return -roundExponential(-number, decimals);\n const n = shift(number, +decimals);\n return shift(Math.round(n), -decimals);\n}\n","import { Vector3 } from 'three';\n\n/**\n * Calculate the signed angle between two vectors. Only works when the vectors are on the same plane.\n * @param vecB Start Vector\n * @param vecA Target Vector\n * @param planeNormal The vector's plane normal\n * @returns Signed angle in radians\n */\n\nexport default function signedAngleTo(\n vecA: Vector3,\n vecB: Vector3,\n planeNormal: Vector3,\n): number {\n return Math.atan2(\n vecA.clone().cross(vecB).dot(planeNormal),\n vecB.clone().dot(vecA),\n );\n}\n","import shift from '../helper/shift.ts';\n\nexport default function toFixedExp(\n number: number,\n decimals: number = 0,\n): string {\n const n = shift(number, +decimals);\n return shift(Math.round(n), -decimals).toFixed(decimals);\n}\n","import shift from '../helper/shift.ts';\n\nexport default function truncateExp(\n number: number,\n decimals: number = 0,\n): number {\n const n = shift(number, +decimals);\n return shift(Math.trunc(n), -decimals);\n}\n","import { MathUtils } from 'three';\n\nexport default function radToDeg(radians: number): number {\n return (MathUtils.radToDeg(radians) + 360) % 360;\n}\n","import { MathUtils } from 'three';\n\nexport default function degToRad(degrees: number): number {\n return MathUtils.degToRad(degrees);\n}\n","import ceilExp from './ceil/ceilExp.ts';\nimport floorExp from './floor/floorExp.ts';\nimport roundExp from './round/roundExp.ts';\nimport signedAngleTo from './signedAngleTo/signedAngleTo.ts';\nimport toFixedExp from './toFixed/toFixedExp.ts';\nimport truncateExp from './truncate/truncateExp.ts';\nimport radToDeg from './radToDeg/radToDeg.ts';\nimport degToRad from './degToRad/degToRad.ts';\n\nexport const DIVEMath: {\n ceilExp: typeof ceilExp;\n floorExp: typeof floorExp;\n roundExp: typeof roundExp;\n toFixedExp: typeof toFixedExp;\n truncateExp: typeof truncateExp;\n signedAngleTo: typeof signedAngleTo;\n radToDeg: typeof radToDeg;\n degToRad: typeof degToRad;\n} = {\n ceilExp,\n floorExp,\n roundExp,\n toFixedExp,\n truncateExp,\n signedAngleTo,\n radToDeg,\n degToRad,\n};\n"],"mappings":"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","names":["import_three","import_three","WebXRUnsupportedReason","import_three","import_three","import_three","import_three","import_three","import_three","import_three","import_three","import_three","import_three","import_three","DIVEMediaCreator","DIVEIO","DIVEAR","import_three","import_three","import_three","import_GLTFLoader","import_three","import_three","object","import_three","import_three","import_three","import_three","import_three","DIVESelectTool","import_tween","updateTween","import_three","SpriteText","import_three","import_three","import_three"]}
1
+ {"version":3,"sources":["../src/constant/VisibilityLayerMask.ts","../src/helper/isInterface/implementsInterface.ts","../src/helper/findInterface/findInterface.ts","../src/toolbox/BaseTool.ts","../src/toolbox/transform/TransformTool.ts","../src/toolbox/select/SelectTool.ts","../src/camera/PerspectiveCamera.ts","../src/mediacreator/MediaCreator.ts","../src/io/gltf/GLTFIO.ts","../src/io/IO.ts","../src/info/Info.ts","../src/exporters/usdz/USDZExporter.ts","../src/ar/arquicklook/ARQuickLook.ts","../src/ar/webxr/overlay/Overlay.ts","../src/ar/webxr/crosshair/WebXRCrosshair.ts","../src/ar/webxr/raycaster/ar/WebXRRaycasterAR.ts","../src/ar/webxr/raycaster/three/WebXRRaycasterTHREE.ts","../src/events/EventExecutor.ts","../src/ar/webxr/raycaster/WebXRRaycaster.ts","../src/ar/webxr/origin/WebXROrigin.ts","../src/ar/webxr/touchscreencontrols/WebXRTouchscreenControls.ts","../src/ar/webxr/controller/WebXRController.ts","../src/ar/webxr/WebXR.ts","../src/ar/sceneviewer/SceneViewer.ts","../src/ar/AR.ts","../src/dive.ts","../src/renderer/Renderer.ts","../src/scene/Scene.ts","../src/scene/root/Root.ts","../src/light/AmbientLight.ts","../src/light/PointLight.ts","../src/com/Communication.ts","../src/light/SceneLight.ts","../src/model/Model.ts","../src/helper/findSceneRecursive/findSceneRecursive.ts","../src/node/Node.ts","../src/loadingmanager/LoadingManager.ts","../src/primitive/Primitive.ts","../src/group/Group.ts","../src/constant/GridColors.ts","../src/grid/Grid.ts","../src/primitive/floor/Floor.ts","../src/scene/xrroot/XRRoot.ts","../src/scene/xrroot/xrlightroot/XRLightRoot.ts","../src/controls/OrbitControls.ts","../src/toolbox/Toolbox.ts","../src/animation/AnimationSystem.ts","../src/axiscamera/AxisCamera.ts","../src/constant/AxisHelperColors.ts","../src/helper/getObjectDelta/getObjectDelta.ts","../package.json","../src/math/helper/shift.ts","../src/math/ceil/ceilExp.ts","../src/math/floor/floorExp.ts","../src/math/round/roundExp.ts","../src/math/signedAngleTo/signedAngleTo.ts","../src/math/toFixed/toFixedExp.ts","../src/math/truncate/truncateExp.ts","../src/math/radToDeg/radToDeg.ts","../src/math/degToRad/degToRad.ts","../src/math/index.ts"],"sourcesContent":["export const DEFAULT_LAYER_MASK = 0b00000001; // 1\nexport const COORDINATE_LAYER_MASK = 0b00000010; // 2\nexport const UI_LAYER_MASK = 0b00000100; // 4\nexport const HELPER_LAYER_MASK = 0b00001000; // 8\nexport const PRODUCT_LAYER_MASK = 0b00010000; // 16\n","import { type Object3D } from 'three';\n\nexport function implementsInterface<T>(\n object: Object3D | null | undefined,\n discriminator: string,\n): object is Object3D & T {\n if (!object) return false;\n return discriminator in object;\n}\n","import { implementsInterface } from '../isInterface/implementsInterface';\nimport { type Object3D } from 'three';\n\nexport function findInterface<T>(\n object: Object3D | null | undefined,\n discriminator: string,\n): (Object3D & T) | undefined {\n if (!object) return undefined;\n\n if (implementsInterface<T>(object, discriminator)) return object;\n\n return findInterface<T>(object.parent, discriminator);\n}\n","import {\n type Intersection,\n type Object3D,\n Raycaster,\n Vector2,\n Vector3,\n} from 'three';\nimport {\n PRODUCT_LAYER_MASK,\n UI_LAYER_MASK,\n} from '../constant/VisibilityLayerMask';\nimport { type DIVEScene } from '../scene/Scene';\nimport type DIVEOrbitControls from '../controls/OrbitControls';\nimport { type DIVEDraggable } from '../interface/Draggable';\nimport { type DIVEHoverable } from '../interface/Hoverable';\nimport { findInterface } from '../helper/findInterface/findInterface';\n\nexport type DraggableEvent = {\n dragStart: Vector3;\n dragCurrent: Vector3;\n dragEnd: Vector3;\n dragDelta: Vector3;\n};\n\n/* eslint-disable @typescript-eslint/no-unused-vars */\nexport abstract class DIVEBaseTool {\n readonly POINTER_DRAG_THRESHOLD: number = 0.001;\n\n public name: string;\n\n protected _canvas: HTMLElement;\n protected _scene: DIVEScene;\n protected _controller: DIVEOrbitControls;\n\n // general pointer members\n protected _pointer: Vector2;\n\n protected get _pointerAnyDown(): boolean {\n return (\n this._pointerPrimaryDown ||\n this._pointerMiddleDown ||\n this._pointerSecondaryDown\n );\n }\n protected _pointerPrimaryDown: boolean;\n protected _pointerMiddleDown: boolean;\n protected _pointerSecondaryDown: boolean;\n protected _lastPointerDown: Vector2;\n protected _lastPointerUp: Vector2;\n\n // raycast members\n protected _raycaster: Raycaster;\n protected _intersects: Intersection[];\n\n // hovering members\n protected _hovered: (Object3D & DIVEHoverable) | null;\n\n // dragging members\n protected _dragging: boolean;\n protected _dragStart: Vector3;\n protected _dragCurrent: Vector3;\n protected _dragEnd: Vector3;\n protected _dragDelta: Vector3;\n protected _draggable: DIVEDraggable | null;\n protected _dragRaycastOnObjects: Object3D[] | null;\n\n protected constructor(scene: DIVEScene, controller: DIVEOrbitControls) {\n this.name = 'BaseTool';\n\n this._canvas = controller.domElement;\n this._scene = scene;\n this._controller = controller;\n\n this._pointer = new Vector2();\n\n this._pointerPrimaryDown = false;\n this._pointerMiddleDown = false;\n this._pointerSecondaryDown = false;\n\n this._lastPointerDown = new Vector2();\n this._lastPointerUp = new Vector2();\n\n this._raycaster = new Raycaster();\n this._raycaster.layers.mask = PRODUCT_LAYER_MASK | UI_LAYER_MASK;\n this._intersects = [];\n\n this._hovered = null;\n\n this._dragging = false;\n this._dragStart = new Vector3();\n this._dragCurrent = new Vector3();\n this._dragEnd = new Vector3();\n this._dragDelta = new Vector3();\n this._draggable = null;\n this._dragRaycastOnObjects = null;\n }\n\n public Activate(): void {}\n\n public Deactivate(): void {}\n\n public onPointerDown(e: PointerEvent): void {\n switch (e.button) {\n case 0: {\n this._pointerPrimaryDown = true;\n break;\n }\n case 1: {\n this._pointerMiddleDown = true;\n break;\n }\n case 2: {\n this._pointerSecondaryDown = true;\n break;\n }\n default: {\n console.warn(\n 'DIVEBaseTool.onPointerDown: Unknown button: ' + e.button,\n );\n }\n }\n\n this._lastPointerDown.copy(this._pointer);\n\n this._draggable =\n findInterface<DIVEDraggable>(\n this._intersects[0]?.object,\n 'isDraggable',\n ) || null;\n }\n\n public onDragStart(e: PointerEvent): void {\n if (!this._draggable) return;\n\n if (this._dragRaycastOnObjects !== null) {\n this._intersects = this._raycaster.intersectObjects(\n this._dragRaycastOnObjects,\n true,\n );\n }\n\n if (this._intersects.length === 0) return;\n\n this._dragStart.copy(this._intersects[0].point.clone());\n this._dragCurrent.copy(this._intersects[0].point.clone());\n this._dragEnd.copy(this._dragStart.clone());\n this._dragDelta.set(0, 0, 0);\n\n if (this._draggable && this._draggable.onDragStart) {\n this._draggable.onDragStart({\n dragStart: this._dragStart,\n dragCurrent: this._dragCurrent,\n dragEnd: this._dragEnd,\n dragDelta: this._dragDelta,\n });\n\n this._dragging = true;\n this._controller.enabled = false;\n }\n }\n\n public onPointerMove(e: PointerEvent): void {\n // update pointer\n this._pointer.x = (e.offsetX / this._canvas.clientWidth) * 2 - 1;\n this._pointer.y = -(e.offsetY / this._canvas.clientHeight) * 2 + 1;\n\n // set raycaster\n this._raycaster.setFromCamera(this._pointer, this._controller.object);\n\n // refresh intersects\n this._intersects = this.raycast(this._scene.children);\n\n // handle hover\n const hoverable = findInterface<DIVEHoverable>(\n this._intersects[0]?.object,\n 'isHoverable',\n );\n if (this._intersects[0] && hoverable) {\n if (!this._hovered) {\n if (hoverable.onPointerEnter)\n hoverable.onPointerEnter(this._intersects[0]);\n this._hovered = hoverable;\n return;\n }\n\n if (this._hovered.uuid !== hoverable.uuid) {\n if (this._hovered.onPointerLeave)\n this._hovered.onPointerLeave();\n if (hoverable.onPointerEnter)\n hoverable.onPointerEnter(this._intersects[0]);\n this._hovered = hoverable;\n return;\n }\n\n if (hoverable.onPointerOver)\n hoverable.onPointerOver(this._intersects[0]);\n this._hovered = hoverable;\n } else {\n if (this._hovered) {\n if (this._hovered.onPointerLeave)\n this._hovered.onPointerLeave();\n }\n\n this._hovered = null;\n }\n\n // handle drag\n if (this._pointerAnyDown) {\n if (!this._dragging) {\n this.onDragStart(e);\n }\n\n this.onDrag(e);\n }\n }\n\n public onDrag(e: PointerEvent): void {\n if (this._dragRaycastOnObjects !== null) {\n this._intersects = this._raycaster.intersectObjects(\n this._dragRaycastOnObjects,\n true,\n );\n }\n const intersect = this._intersects[0];\n if (!intersect) return;\n\n this._dragCurrent.copy(intersect.point.clone());\n this._dragEnd.copy(intersect.point.clone());\n this._dragDelta.subVectors(\n this._dragCurrent.clone(),\n this._dragStart.clone(),\n );\n\n if (this._draggable && this._draggable.onDrag) {\n this._draggable.onDrag({\n dragStart: this._dragStart,\n dragCurrent: this._dragCurrent,\n dragEnd: this._dragEnd,\n dragDelta: this._dragDelta,\n });\n }\n }\n\n public onPointerUp(e: PointerEvent): void {\n if (this.pointerWasDragged() || this._dragging) {\n if (this._draggable) {\n this.onDragEnd(e);\n }\n } else {\n this.onClick(e);\n }\n\n switch (e.button) {\n case 0:\n this._pointerPrimaryDown = false;\n break;\n case 1:\n this._pointerMiddleDown = false;\n break;\n case 2:\n this._pointerSecondaryDown = false;\n break;\n }\n\n this._lastPointerUp.copy(this._pointer);\n }\n\n public onClick(e: PointerEvent): void {}\n\n public onDragEnd(e: PointerEvent): void {\n const intersect = this._intersects[0];\n if (intersect) {\n this._dragEnd.copy(intersect.point.clone());\n this._dragCurrent.copy(intersect.point.clone());\n this._dragDelta.subVectors(\n this._dragCurrent.clone(),\n this._dragStart.clone(),\n );\n }\n\n if (this._draggable && this._draggable.onDragEnd) {\n this._draggable.onDragEnd({\n dragStart: this._dragStart,\n dragCurrent: this._dragCurrent,\n dragEnd: this._dragEnd,\n dragDelta: this._dragDelta,\n });\n }\n\n this._draggable = null;\n this._dragging = false;\n\n this._dragStart.set(0, 0, 0);\n this._dragCurrent.set(0, 0, 0);\n this._dragEnd.set(0, 0, 0);\n this._dragDelta.set(0, 0, 0);\n\n this._controller.enabled = true;\n }\n\n public onWheel(e: WheelEvent): void {}\n\n protected raycast(objects?: Object3D[]): Intersection[] {\n if (objects !== undefined)\n return this._raycaster\n .intersectObjects(objects, true)\n .filter((i) => i.object.visible);\n return this._raycaster\n .intersectObjects(this._scene.children, true)\n .filter((i) => i.object.visible);\n }\n\n private pointerWasDragged(): boolean {\n return (\n this._lastPointerDown.distanceTo(this._pointer) >\n this.POINTER_DRAG_THRESHOLD\n );\n }\n}\n","import { DIVEBaseTool } from '../BaseTool.ts';\nimport { type DIVEScene } from '../../scene/Scene.ts';\nimport type DIVEOrbitControls from '../../controls/OrbitControls.ts';\nimport { TransformControls } from 'three/examples/jsm/controls/TransformControls';\nimport { type DIVEMovable } from '../../interface/Movable.ts';\nimport { implementsInterface } from '../../helper/isInterface/implementsInterface.ts';\nimport { DIVEGizmo } from '../../gizmo/Gizmo.ts';\n\nexport const isTransformTool = (\n tool: DIVEBaseTool,\n): tool is DIVETransformTool => {\n return (tool as DIVETransformTool).isTransformTool !== undefined;\n};\n\nexport interface DIVEObjectEventMap {\n select: object;\n}\n\n/**\n * A Tool to select and move objects in the scene.\n *\n * Objects have to implement the DIVESelectable interface to be selectable and DIVEMovable to be movable.\n *\n * @module\n */\n\nexport default class DIVETransformTool extends DIVEBaseTool {\n readonly isTransformTool: boolean = true;\n\n protected _gizmo: TransformControls | DIVEGizmo;\n\n constructor(scene: DIVEScene, controller: DIVEOrbitControls) {\n super(scene, controller);\n this.name = 'DIVETransformTool';\n\n this._gizmo = this.initGizmo();\n\n this._scene.add(this._gizmo);\n }\n\n public Activate(): void {}\n\n public SetGizmoMode(mode: 'translate' | 'rotate' | 'scale'): void {\n this._gizmo.mode = mode;\n }\n\n public SetGizmoVisibility(active: boolean): void {\n const contains = this._scene.children.includes(this._gizmo);\n if (active && !contains) {\n this._scene.add(this._gizmo);\n if ('isTransformControls' in this._gizmo) {\n (this._gizmo as TransformControls)\n .getRaycaster()\n .layers.enableAll();\n }\n } else if (!active && contains) {\n this._scene.remove(this._gizmo);\n if ('isTransformControls' in this._gizmo) {\n (this._gizmo as TransformControls)\n .getRaycaster()\n .layers.disableAll();\n }\n }\n }\n\n // only used for optimizing pointer events with DIVEGizmo\n // public onPointerDown(e: PointerEvent): void {\n // super.onPointerDown(e);\n\n // if (this._hovered) {\n // this._dragRaycastOnObjects = (\n // this._gizmo as DIVEGizmo\n // ).gizmoPlane?.children;\n // }\n // }\n\n // only used for optimizing pointer events with DIVEGizmo\n // protected raycast(): Intersection[] {\n // return super.raycast((this._gizmo as DIVEGizmo).gizmoNode.children);\n // }\n\n private initGizmo(): TransformControls | DIVEGizmo {\n const g = new TransformControls(\n // this._controller,\n this._controller.object,\n this._controller.domElement,\n );\n // g.debug = true;\n g.mode = 'translate';\n\n // happens when pointerDown event is called on gizmo\n g.addEventListener('mouseDown', () => {\n this._controller.enabled = false;\n\n if (!implementsInterface<DIVEMovable>(g.object, 'isMovable'))\n return;\n if (!g.object.onMoveStart) return;\n g.object.onMoveStart();\n });\n\n // happens when pointerMove event is called on gizmo\n g.addEventListener('objectChange', () => {\n if (!implementsInterface<DIVEMovable>(g.object, 'isMovable'))\n return;\n if (!g.object.onMove) return;\n g.object.onMove();\n });\n\n // happens when pointerUp event is called on gizmo\n g.addEventListener('mouseUp', () => {\n this._controller.enabled = true;\n\n if (!implementsInterface<DIVEMovable>(g.object, 'isMovable'))\n return;\n if (!g.object.onMoveEnd) return;\n g.object.onMoveEnd();\n });\n\n return g;\n }\n}\n","import { type Object3D } from 'three';\nimport { type DIVEScene } from '../../scene/Scene.ts';\nimport DIVETransformTool from '../transform/TransformTool.ts';\nimport { findInterface } from '../../helper/findInterface/findInterface.ts';\nimport type DIVEOrbitControls from '../../controls/OrbitControls.ts';\nimport { type DIVESelectable } from '../../interface/Selectable.ts';\nimport { type DIVEMovable } from '../../interface/Movable.ts';\nimport { type DIVEBaseTool } from '../BaseTool.ts';\n\nexport const isSelectTool = (tool: DIVEBaseTool): tool is DIVESelectTool => {\n return (tool as DIVESelectTool).isSelectTool !== undefined;\n};\n\nexport interface DIVEObjectEventMap {\n select: object;\n}\n\n/**\n * A Tool to select and move objects in the scene.\n *\n * Objects have to implement the DIVESelectable interface to be selectable and DIVEMovable to be movable.\n *\n * @module\n */\n\nexport class DIVESelectTool extends DIVETransformTool {\n readonly isSelectTool: boolean = true;\n\n constructor(scene: DIVEScene, controller: DIVEOrbitControls) {\n super(scene, controller);\n this.name = 'SelectTool';\n }\n\n public Activate(): void {}\n\n public Select(selectable: DIVESelectable): void {\n this.AttachGizmo(selectable);\n\n if (selectable.onSelect) selectable.onSelect();\n }\n\n public Deselect(selectable: DIVESelectable): void {\n this.DetachGizmo();\n\n if (selectable.onDeselect) selectable.onDeselect();\n }\n\n public AttachGizmo(selectable: DIVESelectable): void {\n if ('isMovable' in selectable) {\n const movable = selectable as Object3D &\n DIVESelectable &\n DIVEMovable;\n this._gizmo.attach(movable);\n this.SetGizmoVisibility(movable.visible);\n }\n }\n\n public DetachGizmo(): void {\n this._gizmo.detach();\n }\n\n public onClick(e: PointerEvent): void {\n super.onClick(e);\n\n const first = this._raycaster\n .intersectObjects(this._scene.Root.children, true)\n .filter((intersect) => intersect.object.visible)[0];\n const selectable = findInterface<DIVESelectable>(\n first?.object,\n 'isSelectable',\n );\n\n // if nothing is hit\n if (!first || !selectable) {\n if (this._gizmo.object) {\n this.Deselect(this._gizmo.object as Object3D & DIVESelectable);\n }\n return;\n }\n\n if (this._gizmo.object) {\n // do not reselect if the same object was clicked\n if (this._gizmo.object.uuid === selectable.uuid) return;\n\n // deselect previous object\n this.Deselect(this._gizmo.object as Object3D & DIVESelectable);\n }\n\n // select clicked object\n this.Select(selectable);\n }\n}\n","import { PerspectiveCamera } from 'three';\nimport {\n DEFAULT_LAYER_MASK,\n HELPER_LAYER_MASK,\n PRODUCT_LAYER_MASK,\n UI_LAYER_MASK,\n} from '../constant/VisibilityLayerMask.ts';\n\nexport type DIVEPerspectiveCameraSettings = {\n fov: number;\n near: number;\n far: number;\n};\n\nexport const DIVEPerspectiveCameraDefaultSettings: DIVEPerspectiveCameraSettings =\n {\n fov: 80,\n near: 0.1,\n far: 1000,\n };\n\n/**\n * A Perspective camera. Can change the layer mask to show different objects.\n *\n * @module\n */\n\nexport default class DIVEPerspectiveCamera extends PerspectiveCamera {\n public static readonly EDITOR_VIEW_LAYER_MASK =\n DEFAULT_LAYER_MASK |\n UI_LAYER_MASK |\n HELPER_LAYER_MASK |\n PRODUCT_LAYER_MASK;\n public static readonly LIVE_VIEW_LAYER_MASK = PRODUCT_LAYER_MASK;\n\n public onSetCameraLayer: (mask: number) => void = () => {};\n\n constructor(\n settings: Partial<DIVEPerspectiveCameraSettings> = DIVEPerspectiveCameraDefaultSettings,\n ) {\n super(\n settings.fov || DIVEPerspectiveCameraDefaultSettings.fov,\n 1,\n settings.near || DIVEPerspectiveCameraDefaultSettings.near,\n settings.far || DIVEPerspectiveCameraDefaultSettings.far,\n );\n\n this.layers.mask = DIVEPerspectiveCamera.EDITOR_VIEW_LAYER_MASK;\n }\n\n public OnResize(width: number, height: number): void {\n this.aspect = width / height;\n this.updateProjectionMatrix();\n }\n\n public SetCameraLayer(layer: 'LIVE' | 'EDITOR'): void {\n this.layers.mask =\n layer === 'LIVE'\n ? DIVEPerspectiveCamera.LIVE_VIEW_LAYER_MASK\n : DIVEPerspectiveCamera.EDITOR_VIEW_LAYER_MASK;\n this.onSetCameraLayer(this.layers.mask);\n }\n}\n","import DIVEPerspectiveCamera from '../camera/PerspectiveCamera.ts';\nimport { type DIVEScene } from '../scene/Scene.ts';\nimport { type DIVERenderer } from '../renderer/Renderer.ts';\nimport type DIVEOrbitControls from '../controls/OrbitControls.ts';\nimport { type Vector3Like } from 'three';\n\n/**\n * Creates renderings of the current scene\n *\n * @module\n */\n\nexport class DIVEMediaCreator {\n private renderer: DIVERenderer;\n private scene: DIVEScene;\n private controller: DIVEOrbitControls;\n\n constructor(\n renderer: DIVERenderer,\n scene: DIVEScene,\n controller: DIVEOrbitControls,\n ) {\n this.renderer = renderer;\n this.scene = scene;\n this.controller = controller;\n }\n\n public GenerateMedia(\n position: Vector3Like,\n target: Vector3Like,\n width: number,\n height: number,\n ): string {\n const resetPosition = this.controller.object.position.clone();\n const resetRotation = this.controller.object.quaternion.clone();\n\n this.renderer.OnResize(width, height);\n this.controller.object.OnResize(width, height);\n\n this.controller.object.position.copy(position);\n this.controller.target.copy(target);\n this.controller.update();\n\n const dataUri = this.DrawCanvas().toDataURL();\n\n this.controller.object.position.copy(resetPosition);\n this.controller.object.quaternion.copy(resetRotation);\n\n return dataUri;\n }\n\n public DrawCanvas(canvasElement?: HTMLCanvasElement): HTMLCanvasElement {\n // save current canvas\n const restore = this.renderer.domElement;\n if (canvasElement) {\n this.renderer.domElement = canvasElement;\n }\n\n // draw canvas\n this.controller.object.layers.mask =\n DIVEPerspectiveCamera.LIVE_VIEW_LAYER_MASK;\n this.renderer.render(this.scene, this.controller.object);\n this.controller.object.layers.mask =\n DIVEPerspectiveCamera.EDITOR_VIEW_LAYER_MASK;\n\n const returnCanvas = this.renderer.domElement;\n\n // restore canvas\n if (canvasElement) {\n this.renderer.domElement = restore;\n }\n\n return returnCanvas;\n }\n}\n","import { GLTFLoader, type GLTF } from 'three/examples/jsm/loaders/GLTFLoader';\nimport { GLTFExporter } from 'three/examples/jsm/exporters/GLTFExporter';\nimport { Object3D } from 'three';\n\nexport class DIVEGLTFIO {\n private _importer: GLTFLoader;\n private _exporter: GLTFExporter;\n\n constructor() {\n this._importer = new GLTFLoader();\n this._exporter = new GLTFExporter();\n }\n\n public Import(\n url: string,\n onProgress?: (progress: number) => void,\n ): Promise<GLTF> {\n return this._importer.loadAsync(url, (progress) => {\n if (!onProgress) return;\n\n onProgress(progress.loaded / progress.total);\n });\n }\n\n public Export(\n object: Object3D,\n binary: true,\n onlyVisible: boolean,\n ): Promise<ArrayBuffer>;\n\n public Export(\n object: Object3D,\n binary: false,\n onlyVisible: boolean,\n ): Promise<{ [key: string]: unknown }>;\n\n public Export(\n object: Object3D,\n binary: boolean,\n onlyVisible: boolean,\n ): Promise<ArrayBuffer | { [key: string]: unknown }> {\n if (binary) {\n // export as binary ArrayBuffer\n return this._exporter.parseAsync(object, {\n binary,\n onlyVisible,\n }) as unknown as Promise<ArrayBuffer>;\n } else {\n // export as JSON object\n return this._exporter.parseAsync(object, {\n binary,\n onlyVisible,\n }) as unknown as Promise<{ [key: string]: unknown }>;\n }\n }\n}\n","import { DIVEGLTFIO } from './gltf/GLTFIO';\n\nimport { type DIVESceneFileType } from '../types';\nimport { type DIVEScene } from '../scene/Scene';\n\nexport class DIVEIO {\n private _scene: DIVEScene;\n\n private _gltfIO: DIVEGLTFIO;\n\n constructor(scene: DIVEScene) {\n this._scene = scene;\n\n this._gltfIO = new DIVEGLTFIO();\n }\n\n public Import<FileType extends keyof DIVESceneFileType>(\n type: FileType,\n url: string,\n ): Promise<DIVESceneFileType[FileType] | null> {\n switch (type) {\n case 'glb': {\n return this._gltfIO.Import(url).catch((error) => {\n console.error(error);\n return null;\n });\n }\n\n default: {\n console.error('DIVEIO.Import: Unsupported file type: ' + type);\n return Promise.reject();\n }\n }\n }\n\n public Export<FileType extends keyof DIVESceneFileType>(\n type: FileType,\n ): Promise<string | null> {\n switch (type) {\n case 'glb': {\n return this._gltfIO\n .Export(this._scene, true, true)\n .then((data) => {\n return this._createBlobURL(data);\n })\n .catch((error) => {\n console.error(error);\n return null;\n });\n }\n\n default: {\n console.error('DIVEIO.Export: Unsupported file type: ' + type);\n return Promise.reject();\n }\n }\n }\n\n private _createBlobURL(data: ArrayBuffer): string {\n return URL.createObjectURL(new Blob([data]));\n }\n}\n","export enum WebXRUnsupportedReason {\n 'UNKNWON_ERROR' = 0,\n 'NO_HTTPS' = 1,\n 'IMMERSIVE_AR_NOT_SUPPORTED_BY_DEVICE' = 2,\n 'AR_SESSION_NOT_ALLOWED' = 3,\n}\n\nexport class DIVEInfo {\n private static _supportsWebXR: boolean | null = null;\n private static _webXRUnsupportedReason: WebXRUnsupportedReason | null =\n null;\n\n /**\n *\n * @returns The system the user is using. Possible values are \"Android\", \"iOS\", \"Windows\", \"MacOS\", \"Linux\" or \"Unknown\".\n */\n public static GetSystem(): string {\n const platform = navigator.platform;\n if (/Android/.test(navigator.userAgent)) {\n return 'Android';\n } else if (/iPhone|iPad|iPod/.test(navigator.userAgent)) {\n return 'iOS';\n } else if (platform.startsWith('Win')) {\n return 'Windows';\n } else if (platform.startsWith('Mac')) {\n return 'MacOS';\n } else if (platform.startsWith('Linux')) {\n return 'Linux';\n } else {\n return 'Unknown';\n }\n }\n\n /**\n * @returns A promise that resolves to a boolean indicating whether the user's device supports WebXR.\n */\n public static async GetSupportsWebXR(): Promise<boolean> {\n if (this._supportsWebXR !== null) {\n return this._supportsWebXR;\n }\n\n // check if XRSystem is available && if https enabled\n if (!navigator.xr) {\n this._supportsWebXR = false;\n\n if (window.isSecureContext === false) {\n this._webXRUnsupportedReason = WebXRUnsupportedReason.NO_HTTPS;\n } else {\n this._webXRUnsupportedReason =\n WebXRUnsupportedReason.UNKNWON_ERROR;\n }\n\n return this._supportsWebXR;\n }\n\n // Check if immersive-vr session mode is supported\n try {\n const supported =\n await navigator.xr!.isSessionSupported('immersive-ar');\n if (!supported) {\n this._webXRUnsupportedReason =\n WebXRUnsupportedReason.IMMERSIVE_AR_NOT_SUPPORTED_BY_DEVICE;\n }\n this._supportsWebXR = supported;\n } catch (error) {\n this._supportsWebXR = false;\n this._webXRUnsupportedReason =\n WebXRUnsupportedReason.AR_SESSION_NOT_ALLOWED;\n }\n return this._supportsWebXR;\n }\n\n /**\n * @returns The reason why WebXR is not supported on the user's device. Returns null if WebXR is supported nor not has been checked yet.\n */\n public static GetWebXRUnsupportedReason(): WebXRUnsupportedReason | null {\n if (this._supportsWebXR === null) {\n console.log('WebXR support has not been checked yet.');\n return null;\n }\n return this._webXRUnsupportedReason;\n }\n\n /**\n * @returns A boolean indicating whether the user's device supports AR Quick Look.\n */\n public static GetSupportsARQuickLook(): boolean {\n const a = document.createElement('a');\n if (a.relList.supports('ar')) {\n return true;\n }\n\n // fallback check\n const userAgent = navigator.userAgent;\n\n // Check if the device is running iOS\n const isIOS =\n /iPad|iPhone|iPod/.test(userAgent) &&\n !(window as unknown as Window & { MSStream?: string }).MSStream;\n if (!isIOS) {\n return false;\n }\n\n // Extract iOS version\n const match = userAgent.match(/OS (\\d+)_/);\n if (!match || match.length < 2) {\n return false;\n }\n const iOSVersion = parseInt(match[1], 10);\n\n // Minimum iOS version for QuickLook support\n const minQuickLookVersion = 12;\n\n // Check if the iOS version is supported\n if (iOSVersion < minQuickLookVersion) {\n return false;\n }\n\n // Check for supported browser\n const isSupportedBrowser =\n /^((?!chrome|android).)*safari|CriOS|FxiOS/i.test(userAgent);\n if (isSupportedBrowser) {\n return true;\n }\n\n // Default to false if none of the conditions are met\n return false;\n }\n\n /**\n * @returns A boolean indicating whether the user's device is a mobile device.\n */\n public static get isMobile(): boolean {\n return this.GetSystem() === 'Android' || this.GetSystem() === 'iOS';\n }\n\n /**\n * @returns A boolean indicating whether the user's device is a desktop device.\n */\n public static get isDesktop(): boolean {\n return !this.isMobile;\n }\n\n /**\n * @returns A promise that resolves to a boolean indicating whether the user's device is capable of AR.\n */\n public static async GetIsARCapable(): Promise<boolean> {\n if (this.GetSupportsARQuickLook()) {\n return true;\n }\n\n return await this.GetSupportsWebXR();\n }\n}\n","import { Object3D } from 'three';\nimport {\n USDZExporter,\n USDZExporterOptions,\n} from 'three/examples/jsm/exporters/USDZExporter';\n\nexport type DIVEUSDZExporterOptions = USDZExporterOptions & {\n ar?: {\n anchoring: { type: 'plane' | 'image' | 'face' | 'none' }; // source: https://developer.apple.com/documentation/realitykit/preliminary-anchoring-type\n planeAnchoring: { alignment: 'horizontal' | 'vertical' | 'any' }; // source: https://developer.apple.com/documentation/realitykit/preliminary-planeanchoring-alignment\n };\n};\n\nexport class DIVEUSDZExporter extends USDZExporter {\n public parse(\n scene: Object3D,\n options?: DIVEUSDZExporterOptions,\n ): Promise<Uint8Array> {\n return super.parse(scene, options);\n }\n}\n","import { Object3D } from 'three';\nimport { DIVEUSDZExporter } from '../../exporters/usdz/USDZExporter';\nimport { type DIVEScene } from '../../scene/Scene';\nimport { type DIVEAROptions } from '../AR';\n\nexport class DIVEARQuickLook {\n private static _usdzExporter: DIVEUSDZExporter = new DIVEUSDZExporter();\n\n public static Launch(\n scene: DIVEScene,\n options?: DIVEAROptions,\n ): Promise<void> {\n // create node to build usdz from\n const quickLookScene = new Object3D();\n\n // extract models from scene\n quickLookScene.add(...this.extractModels(scene));\n\n // launch ARQuickLook\n return this.launchARFromNode(quickLookScene, options);\n }\n\n private static extractModels(scene: DIVEScene): Object3D[] {\n // extract models\n return scene.Root.children;\n }\n\n private static launchARFromNode(\n node: Object3D,\n options?: DIVEAROptions,\n ): Promise<void> {\n // bundle USDZ\n return this._usdzExporter\n .parse(node, {\n quickLookCompatible: true,\n ar: {\n anchoring: { type: 'plane' },\n planeAnchoring: {\n alignment:\n options?.arPlacement === 'vertical'\n ? 'vertical'\n : 'horizontal',\n },\n },\n })\n .then((usdz: Uint8Array) => {\n // create blob\n const blob = new Blob([usdz], { type: 'model/vnd.usdz+zip' });\n let url = URL.createObjectURL(blob);\n\n if (options?.arScale === 'fixed') {\n url = url.concat('#allowsContentScaling=0');\n }\n\n // launch ARQuickLook\n const a = document.createElement('a');\n a.innerHTML = '<picture></picture>'; // This is actually needed so the viewer opens instantly\n a.rel = 'ar';\n a.href = url;\n a.download = 'scene.usdz';\n a.click();\n });\n }\n}\n","export class Overlay {\n private _element: HTMLDivElement;\n public get Element(): HTMLDivElement {\n return this._element;\n }\n\n private _closeButton: SVGSVGElement;\n public get CloseButton(): SVGSVGElement {\n return this._closeButton;\n }\n\n constructor() {\n // create div\n this._element = document.createElement('div');\n\n // create and append close button to overlay\n this._closeButton = this.createCloseButton();\n this._element.appendChild(this._closeButton);\n\n // append overlay to body\n document.body.appendChild(this._element);\n }\n\n private createCloseButton(): SVGSVGElement {\n // create svg path\n const path = document.createElementNS(\n 'http://www.w3.org/2000/svg',\n 'path',\n );\n path.setAttribute('d', 'M 12,12 L 28,28 M 28,12 12,28');\n path.setAttribute('stroke', '#fff');\n path.setAttribute('stroke-width', '2');\n\n // create svg\n const svg = document.createElementNS(\n 'http://www.w3.org/2000/svg',\n 'svg',\n );\n svg.setAttribute('width', '38');\n svg.setAttribute('height', '38');\n svg.style.position = 'absolute';\n svg.style.right = '20px';\n svg.style.top = '20px';\n\n // append path to svg\n svg.appendChild(path);\n\n return svg;\n }\n}\n","import { Mesh, MeshBasicMaterial, Object3D, RingGeometry } from 'three';\n\nexport class DIVEWebXRCrosshair extends Object3D {\n public set mesh(mesh: Mesh | undefined) {\n this.clear();\n\n if (mesh) {\n this.add(mesh);\n }\n }\n\n constructor(mesh?: Mesh) {\n super();\n\n if (mesh) {\n this.mesh = mesh;\n } else {\n this.UseDefaultMesh();\n }\n\n this.matrixAutoUpdate = false;\n\n return this;\n }\n\n public UseDefaultMesh(): void {\n const geometry = new RingGeometry(0.08, 0.1, 32).rotateX(-Math.PI / 2);\n const material = new MeshBasicMaterial();\n this.mesh = new Mesh(geometry, material);\n }\n\n public UpdateFromPose(pose: XRPose): void {\n this.matrix.fromArray(pose.transform.matrix);\n }\n}\n","import { Matrix4, Vector3 } from 'three';\nimport { type DIVERenderer } from '../../../../renderer/Renderer';\nimport { type DIVEHitResult } from '../WebXRRaycaster';\n\nexport class DIVEWebXRRaycasterAR {\n private _session: XRSession;\n private _renderer: DIVERenderer;\n\n private _transientHitTestSource: XRTransientInputHitTestSource | undefined;\n private _referenceSpaceBuffer: XRReferenceSpace | null = null;\n\n private _requesting: boolean = false;\n private _initialized: boolean = false;\n\n private _hitMatrixBuffer: Matrix4;\n\n constructor(session: XRSession, renderer: DIVERenderer) {\n this._session = session;\n this._renderer = renderer;\n\n this._hitMatrixBuffer = new Matrix4();\n }\n\n public Dispose(): void {\n this._transientHitTestSource?.cancel();\n this._transientHitTestSource = undefined;\n\n this._initialized = false;\n }\n\n public async Init(): Promise<this> {\n if (!this._session) {\n console.error(\n 'DIVEWebXRRaycaster: No session set in Init()! Aborting initialization...',\n );\n return Promise.reject();\n }\n\n if (this._requesting) {\n console.error(\n 'DIVEWebXRRaycaster: Currently initializing! Aborting initialization...',\n );\n return Promise.reject();\n }\n\n if (this._initialized) {\n console.error(\n 'DIVEWebXRRaycaster: Already initialized! Aborting initialization...',\n );\n return Promise.reject();\n }\n\n this._requesting = true;\n this._transientHitTestSource = await this._session\n .requestHitTestSourceForTransientInput!({\n profile: 'generic-touchscreen',\n });\n this._referenceSpaceBuffer = this._renderer.xr.getReferenceSpace();\n this._requesting = false;\n\n if (!this._transientHitTestSource) {\n return Promise.reject();\n }\n\n this._initialized = true;\n\n console.log('DIVEWebXRRaycasterAR: Initialized');\n\n return Promise.resolve(this);\n }\n\n public GetIntersections(frame: XRFrame): DIVEHitResult[] {\n if (!this._transientHitTestSource) return [];\n\n const touches = frame.getHitTestResultsForTransientInput(\n this._transientHitTestSource,\n );\n if (touches.length === 0) return [];\n\n const hits = touches.map((touch: XRTransientInputHitTestResult) => {\n if (!this._referenceSpaceBuffer) return undefined;\n if (!touch.results[0]) return undefined;\n if (!touch.results[0].getPose) return undefined;\n\n const pose = touch.results[0].getPose(this._referenceSpaceBuffer);\n if (!pose) return undefined;\n\n this._hitMatrixBuffer.fromArray(pose.transform.matrix);\n const position = new Vector3().setFromMatrixPosition(\n this._hitMatrixBuffer,\n );\n\n return {\n point: position,\n matrix: this._hitMatrixBuffer,\n object: undefined,\n };\n });\n\n return hits.filter((hit) => hit !== undefined) as DIVEHitResult[];\n }\n}\n","import {\n type Intersection,\n type Mesh,\n Raycaster,\n type XRTargetRaySpace,\n} from 'three';\nimport { type DIVERenderer } from '../../../../renderer/Renderer';\nimport { type DIVEScene } from '../../../../scene/Scene';\nimport { type DIVEHitResult } from '../WebXRRaycaster';\n\nexport class DIVEWebXRRaycasterTHREE {\n private _renderer: DIVERenderer;\n private _scene: DIVEScene;\n\n private _controller: XRTargetRaySpace;\n\n // internal raycaster\n private _raycaster: Raycaster = new Raycaster();\n\n constructor(renderer: DIVERenderer, scene: DIVEScene) {\n this._renderer = renderer;\n this._scene = scene;\n\n this._controller = this._renderer.xr.getController(0);\n }\n\n public async Init(): Promise<this> {\n console.log('DIVEWebXRRaycasterTHREE: Initialized');\n return Promise.resolve(this);\n }\n\n public GetIntersections(): DIVEHitResult[] {\n this._controller.updateMatrixWorld();\n this._raycaster.setFromXRController(this._controller);\n const intersections = this._raycaster.intersectObjects(\n this._scene.XRRoot.XRModelRoot.children,\n );\n\n if (intersections.length === 0) return [];\n\n return intersections.map((intersection: Intersection) => {\n return {\n point: intersection.point,\n matrix: intersection.object.matrixWorld,\n object: intersection.object as Mesh,\n };\n });\n }\n}\n","export class DIVEEventExecutor<T> {\n private _listeners: Map<keyof T, ((payload: T[keyof T]) => void)[]> =\n new Map();\n\n public Subscribe<S extends keyof T>(\n type: S,\n listener: (payload: T[S]) => void,\n ): () => boolean {\n if (!this._listeners.get(type)) this._listeners.set(type, []);\n\n this._listeners\n .get(type)!\n .push(listener as (payload: T[keyof T]) => void);\n\n return () => {\n const listenerArray = this._listeners.get(type);\n if (!listenerArray) return false;\n\n const existingIndex = listenerArray.findIndex(\n (entry) => entry === listener,\n );\n if (existingIndex === -1) return false;\n\n listenerArray.splice(existingIndex, 1);\n return true;\n };\n }\n\n protected dispatch<S extends keyof T>(type: S, payload?: T[S]): void {\n const listenerArray = this._listeners.get(type);\n if (!listenerArray) return;\n\n listenerArray.forEach((listener) => listener(payload as T[S]));\n }\n}\n","import { Matrix4, Mesh, Vector3 } from 'three';\nimport { DIVERenderer } from '../../../renderer/Renderer';\nimport { DIVEWebXRRaycasterAR } from './ar/WebXRRaycasterAR';\nimport { DIVEWebXRRaycasterTHREE } from './three/WebXRRaycasterTHREE';\nimport { DIVEScene } from '../../../scene/Scene';\nimport { DIVEEventExecutor } from '../../../events/EventExecutor';\n\n/**\n * object is undefined when AR world is hit.\n */\nexport type DIVEHitResult = {\n point: Vector3;\n matrix: Matrix4;\n object?: Mesh;\n};\n\nexport type DIVEWebXRRaycasterEvents = {\n AR_HIT_FOUND: {\n hit: DIVEHitResult;\n };\n AR_HIT_LOST: undefined;\n SCENE_HIT_FOUND: {\n hit: DIVEHitResult;\n };\n SCENE_HIT_LOST: undefined;\n};\n\nexport class DIVEWebXRRaycaster extends DIVEEventExecutor<DIVEWebXRRaycasterEvents> {\n private _session: XRSession;\n\n private _initialized: boolean = false;\n\n private _threeRaycaster: DIVEWebXRRaycasterTHREE;\n private _arRaycaster: DIVEWebXRRaycasterAR;\n\n private _arHitResultBuffer: DIVEHitResult[] = [];\n private _sceneHitResultBuffer: DIVEHitResult[] = [];\n\n // buffers\n private _hasHit: boolean = false;\n\n constructor(session: XRSession, renderer: DIVERenderer, scene: DIVEScene) {\n super();\n\n this._session = session;\n\n this._threeRaycaster = new DIVEWebXRRaycasterTHREE(renderer, scene);\n this._arRaycaster = new DIVEWebXRRaycasterAR(session, renderer);\n }\n\n public Dispose(): void {\n // dispose code here\n this._initialized = false;\n }\n\n public async Init(): Promise<this> {\n if (!this._session) {\n console.error(\n 'DIVEWebXRRaycaster: No session set in Init()! Aborting initialization...',\n );\n return Promise.reject();\n }\n\n if (this._initialized) {\n console.error(\n 'DIVEWebXRRaycaster: Already initialized! Aborting initialization...',\n );\n return Promise.reject();\n }\n\n await this._threeRaycaster.Init();\n await this._arRaycaster.Init();\n\n console.log('DIVEWebXRRaycaster: Initialized');\n\n this._initialized = true;\n\n return Promise.resolve(this);\n }\n\n public GetARIntersections(frame: XRFrame): DIVEHitResult[] {\n // check for ar hits\n this._arHitResultBuffer = this._arRaycaster.GetIntersections(frame);\n if (this._arHitResultBuffer.length > 0) {\n // hit found\n this.onARHitFound(this._arHitResultBuffer[0]);\n } else {\n // hit nothing\n this.onARHitLost();\n }\n return this._arHitResultBuffer;\n }\n\n public GetSceneIntersections(): DIVEHitResult[] {\n // check for scene hits\n this._sceneHitResultBuffer = this._threeRaycaster.GetIntersections();\n if (this._sceneHitResultBuffer.length > 0) {\n // scene hit found\n this.onSceneHitFound(this._sceneHitResultBuffer[0]);\n // early return to prevent ar raycaster from overriding scene hit\n } else {\n // scene hit nothing\n this.onSceneHitLost();\n }\n return this._sceneHitResultBuffer;\n }\n\n private onARHitFound(hit: DIVEHitResult): void {\n this._hasHit = true;\n this.dispatch('AR_HIT_FOUND', { hit });\n }\n\n private onARHitLost(): void {\n if (!this._hasHit) return;\n\n this._hasHit = false;\n this.dispatch('AR_HIT_LOST');\n }\n\n private onSceneHitFound(hit: DIVEHitResult): void {\n this._hasHit = true;\n this.dispatch('SCENE_HIT_FOUND', { hit });\n }\n\n private onSceneHitLost(): void {\n if (!this._hasHit) return;\n\n this._hasHit = false;\n this.dispatch('SCENE_HIT_LOST');\n }\n}\n","import { Matrix4, Quaternion, Vector3 } from 'three';\nimport { DIVERenderer } from '../../../renderer/Renderer';\n\nexport class DIVEWebXROrigin {\n private _renderer: DIVERenderer;\n private _session: XRSession;\n\n private _requesting: boolean;\n private _initialized: boolean;\n\n private _referenceSpaceBuffer: XRReferenceSpace | null;\n private _hitTestSource: XRHitTestSource | null;\n\n private _entityTypes: XRHitTestTrackableType[];\n\n private _hitTestResultBuffer: XRHitTestResult[];\n private _raycastHitCounter: number = 0;\n\n private _originSet: Promise<void>;\n private _originSetResolve: (value: void) => void = () => {};\n public get originSet(): Promise<void> {\n return this._originSet;\n }\n\n private _matrix: Matrix4;\n public get matrix(): Matrix4 {\n return this._matrix;\n }\n private set matrix(value: Matrix4) {\n this._matrix = value;\n this._matrix.decompose(this._position, this._quaternion, this._scale);\n }\n\n private _position: Vector3;\n public get position(): Vector3 {\n return this._position;\n }\n\n private _quaternion: Quaternion;\n public get quaternion(): Quaternion {\n return this._quaternion;\n }\n\n private _scale: Vector3;\n public get scale(): Vector3 {\n return this._scale;\n }\n\n constructor(\n session: XRSession,\n renderer: DIVERenderer,\n entityTypes?: XRHitTestTrackableType[],\n ) {\n this._renderer = renderer;\n this._session = session;\n\n this._originSet = new Promise<void>((resolve) => {\n this._originSetResolve = resolve;\n });\n\n this._requesting = false;\n this._initialized = false;\n\n this._referenceSpaceBuffer = null;\n this._hitTestSource = null;\n\n this._entityTypes = entityTypes || ['plane'];\n\n this._hitTestResultBuffer = [];\n\n // set up promises and executors\n this._matrix = new Matrix4();\n this._position = new Vector3();\n this._quaternion = new Quaternion();\n this._scale = new Vector3();\n\n // when origin is set, decompose matrix into position, quaternion and scale\n this._originSet.then(() => {\n // decompose matrix into position, quaternion and scale\n this._matrix.decompose(\n this._position,\n this._quaternion,\n this._scale,\n );\n });\n }\n\n public async Init(): Promise<this> {\n if (this._initialized) {\n return Promise.resolve(this);\n }\n\n if (!this._session) {\n console.error(\n 'DIVEWebXROrigin: No session set in Init()! Aborting initialization...',\n );\n return Promise.reject();\n }\n\n if (this._requesting) {\n console.error(\n 'DIVEWebXROrigin: Currently initializing! Aborting initialization...',\n );\n return Promise.reject();\n }\n\n this._requesting = true;\n const referenceSpace =\n await this._session.requestReferenceSpace('viewer');\n this._hitTestSource =\n (await this._session.requestHitTestSource!({\n space: referenceSpace,\n entityTypes: this._entityTypes,\n })) || null;\n this._requesting = false;\n\n if (!this._hitTestSource) {\n return Promise.reject();\n }\n\n this._initialized = true;\n\n return Promise.resolve(this);\n }\n\n public Dispose(): void {\n this._initialized = false;\n this._requesting = false;\n\n this._hitTestSource?.cancel();\n\n this._hitTestSource = null;\n this._hitTestResultBuffer = [];\n\n this._matrix = new Matrix4();\n this._position = new Vector3();\n this._quaternion = new Quaternion();\n this._scale = new Vector3();\n }\n\n public Update(frame: XRFrame): void {\n if (!this._initialized) return;\n\n if (!this._hitTestSource) {\n throw new Error(\n 'DIVEWebXRRaycaster: Critical Error: HitTestSource not available but WebXROrigin is initialized!',\n );\n }\n\n // get hit test results\n this._hitTestResultBuffer = frame.getHitTestResults(\n this._hitTestSource,\n );\n if (this._hitTestResultBuffer.length > 0) {\n // hit found\n this._referenceSpaceBuffer = this._renderer.xr.getReferenceSpace();\n\n // if there is no reference space, hit will be counted as lost for this frame\n if (!this._referenceSpaceBuffer) {\n this.onHitLost();\n return;\n }\n\n const pose = this._hitTestResultBuffer[0].getPose(\n this._referenceSpaceBuffer,\n );\n if (!pose) {\n this.onHitLost();\n return;\n }\n\n this.onHitFound(pose);\n } else {\n this.onHitLost();\n }\n }\n\n private onHitFound(pose: XRPose): void {\n this._raycastHitCounter++;\n\n this.matrix.fromArray(pose.transform.matrix);\n\n // we have to wait for a certain amount of frames to make sure the origin is set\n if (this._raycastHitCounter > 50) {\n this._originSetResolve();\n }\n }\n\n private onHitLost(): void {\n this._raycastHitCounter = 0;\n }\n}\n","import { Vector2 } from 'three';\nimport { DIVEEventExecutor } from '../../../events/EventExecutor';\n\nexport type DIVETouchscreenEvents = {\n TOUCH_START: {\n touches: {\n current: Vector2;\n }[];\n touchCount: number;\n };\n TOUCH_MOVE: {\n touches: {\n current: Vector2;\n delta: Vector2;\n }[];\n touchCount: number;\n };\n TOUCH_END: {\n touches: {\n current: Vector2;\n }[];\n touchCount: number;\n };\n ROTATE_START: {\n current: number;\n };\n ROTATE_MOVE: {\n current: number;\n delta: number;\n };\n ROTATE_END: {\n current: number;\n };\n PINCH_START: {\n current: number;\n };\n PINCH_MOVE: {\n current: number;\n delta: number;\n };\n PINCH_END: {\n current: number;\n };\n};\n\ntype DIVETouch = {\n start: Vector2;\n current: Vector2;\n delta: Vector2;\n};\n\nexport class DIVEWebXRTouchscreenControls extends DIVEEventExecutor<DIVETouchscreenEvents> {\n // general members\n private _session: XRSession;\n\n // touch members\n private _touchCount: number = 0;\n private _touches: DIVETouch[] = [];\n\n // rotate members\n private _handleRotateStarted: boolean = false;\n private _handleRotateMoved: boolean = false;\n private _handleRotateEnded: boolean = false;\n\n private _startAngle: number = 0;\n private _lastAngle: number = 0;\n private _angleDelta: number = 0;\n\n // scale members\n private _handlePinchStarted: boolean = false;\n private _handlePinchMoved: boolean = false;\n private _handlePinchEnded: boolean = false;\n\n private _scaleDistanceStart: number = 0;\n private _currentDistance: number = 1;\n private _deltaDistance: number = 0;\n\n constructor(session: XRSession) {\n super();\n\n this._session = session;\n\n this._touches = [\n {\n start: new Vector2(),\n current: new Vector2(),\n delta: new Vector2(),\n },\n {\n start: new Vector2(),\n current: new Vector2(),\n delta: new Vector2(),\n },\n ];\n\n this._handleRotateStarted = false;\n\n window.addEventListener('touchstart', (e: TouchEvent) =>\n this.onTouchStart(e),\n );\n window.addEventListener('touchmove', (e: TouchEvent) =>\n this.onTouchMove(e),\n );\n window.addEventListener('touchend', (e: TouchEvent) =>\n this.onTouchEnd(e),\n );\n\n this._session.addEventListener('selectstart', () =>\n this.onSessionSelectStart(),\n );\n this._session.addEventListener('selectend', () =>\n this.onSessionSelectEnd(),\n );\n }\n\n public Dispose(): void {\n window.removeEventListener('touchstart', (e: TouchEvent) =>\n this.onTouchStart(e),\n );\n window.removeEventListener('touchmove', (e: TouchEvent) =>\n this.onTouchMove(e),\n );\n window.removeEventListener('touchend', (e: TouchEvent) =>\n this.onTouchEnd(e),\n );\n\n this._session.removeEventListener('selectstart', () =>\n this.onSessionSelectStart(),\n );\n this._session.removeEventListener('selectend', () =>\n this.onSessionSelectEnd(),\n );\n }\n\n private onTouchStart(event: TouchEvent): void {\n this._touchCount = event.touches.length;\n\n this._touches[0].start.set(\n event.touches[0].clientX,\n event.touches[0].clientY,\n );\n this._touches[0].current.set(\n event.touches[0].clientX,\n event.touches[0].clientY,\n );\n this._touches[0].delta.set(0, 0);\n\n if (this._touchCount > 1) {\n this._touches[1].start.set(\n event.touches[1].clientX,\n event.touches[1].clientY,\n );\n this._touches[1].current.set(\n event.touches[1].clientX,\n event.touches[1].clientY,\n );\n this._touches[1].delta.set(0, 0);\n }\n\n if (this._touchCount === 2) {\n this.handleRotateStart();\n this.handlePinchStart();\n }\n\n if (this._handleRotateStarted) {\n this.dispatch('ROTATE_START', {\n current: 0,\n });\n this._handleRotateStarted = false;\n }\n\n if (this._handlePinchStarted) {\n this.dispatch('PINCH_START', {\n current: 0,\n });\n this._handlePinchStarted = false;\n }\n }\n\n private onTouchMove(event: TouchEvent): void {\n this._touchCount = event.touches.length;\n\n this._touches[0].start.set(\n event.touches[0].clientX,\n event.touches[0].clientY,\n );\n this._touches[0].current.set(\n event.touches[0].clientX,\n event.touches[0].clientY,\n );\n this._touches[0].delta.copy(\n this._touches[0].current.clone().sub(this._touches[0].start),\n );\n\n if (this._touchCount > 1) {\n this._touches[1].start.set(\n event.touches[1].clientX,\n event.touches[1].clientY,\n );\n this._touches[1].current.set(\n event.touches[1].clientX,\n event.touches[1].clientY,\n );\n this._touches[1].delta.copy(\n this._touches[1].current.clone().sub(this._touches[1].start),\n );\n }\n\n if (this._touchCount === 2) {\n this.handleRotateMoved();\n this.handlePinchMoved();\n }\n\n if (this._touchCount === 1) {\n this.dispatch('TOUCH_MOVE', {\n touches: [\n {\n current: this._touches[0].current.clone(),\n delta: this._touches[0].delta.clone(),\n },\n {\n current: this._touches[1].current.clone(),\n delta: this._touches[1].delta.clone(),\n },\n ],\n touchCount: this._touchCount,\n });\n }\n\n if (this._touchCount === 2) {\n if (this._handleRotateMoved) {\n this.dispatch('ROTATE_MOVE', {\n current: this._lastAngle,\n delta: this._angleDelta,\n });\n this._handleRotateMoved = false;\n }\n\n if (this._handlePinchMoved) {\n this.dispatch('PINCH_MOVE', {\n current: this._currentDistance,\n delta: this._deltaDistance,\n });\n this._handlePinchMoved = false;\n }\n }\n }\n\n private onTouchEnd(event: TouchEvent): void {\n this._touchCount = event.touches.length;\n\n if (this._touchCount === 0) {\n this._touches[0].start.set(0, 0);\n this._touches[0].current.set(0, 0);\n this._touches[0].delta.set(0, 0);\n }\n\n if (this._touchCount === 1) {\n this.handleRotateEnded();\n this.handlePinchEnded();\n\n this._touches[1].start.set(0, 0);\n this._touches[1].current.set(0, 0);\n this._touches[1].delta.set(0, 0);\n }\n\n if (this._handleRotateEnded) {\n this.dispatch('ROTATE_END', {\n current: this._lastAngle,\n });\n this._handleRotateEnded = false;\n }\n\n if (this._handlePinchEnded) {\n this.dispatch('PINCH_END', {\n current: this._currentDistance,\n });\n this._handlePinchEnded = false;\n }\n }\n\n private onSessionSelectStart(): void {\n this.dispatch('TOUCH_START', {\n touches: [\n {\n current: this._touches[0].current.clone(),\n },\n {\n current: this._touches[1].current.clone(),\n },\n ],\n touchCount: this._touchCount,\n });\n }\n\n private onSessionSelectEnd(): void {\n this.dispatch('TOUCH_END', {\n touches: [\n {\n current: this._touches[0].current.clone(),\n },\n {\n current: this._touches[1].current.clone(),\n },\n ],\n touchCount: this._touchCount,\n });\n }\n\n // rotation handler\n private handleRotateStart(): void {\n this._handleRotateStarted = true;\n this._startAngle = this._touches[1].start\n .clone()\n .sub(this._touches[0].current)\n .angle();\n }\n\n private handleRotateMoved(): void {\n this._handleRotateMoved = true;\n const currentAngle = this._touches[1].current\n .clone()\n .sub(this._touches[0].current)\n .angle();\n this._angleDelta = currentAngle - this._startAngle;\n this._lastAngle = this._angleDelta * -1;\n }\n\n private handleRotateEnded(): void {\n this._handleRotateEnded = true;\n }\n\n // pinch handler\n private handlePinchStart(): void {\n this._handlePinchStarted = true;\n\n this._scaleDistanceStart = this._touches[1].start.distanceTo(\n this._touches[0].current,\n );\n }\n\n private handlePinchMoved(): void {\n this._handlePinchMoved = true;\n\n const beforeDistance = this._currentDistance;\n const distance = this._touches[1].current.distanceTo(\n this._touches[0].current,\n );\n this._currentDistance = distance / this._scaleDistanceStart;\n this._deltaDistance = this._currentDistance - beforeDistance;\n }\n\n private handlePinchEnded(): void {\n this._handlePinchEnded = true;\n }\n}\n","import {\n Matrix4,\n Mesh,\n Object3D,\n Quaternion,\n Vector3,\n WebXRArrayCamera,\n} from 'three';\nimport { DIVERenderer } from '../../../renderer/Renderer';\nimport { DIVEScene } from '../../../scene/Scene';\nimport { DIVEWebXRCrosshair } from '../crosshair/WebXRCrosshair';\nimport { DIVEWebXRRaycaster } from '../raycaster/WebXRRaycaster';\nimport { DIVEWebXROrigin } from '../origin/WebXROrigin';\nimport {\n DIVETouchscreenEvents,\n DIVEWebXRTouchscreenControls,\n} from '../touchscreencontrols/WebXRTouchscreenControls';\nimport { type DIVEMovable } from '../.././../interface/Movable';\nimport { findInterface } from '../../../helper/findInterface/findInterface';\n\nexport class DIVEWebXRController extends Object3D {\n // general members\n private _renderer: DIVERenderer;\n private _scene: DIVEScene;\n private _session: XRSession;\n\n private _frameBuffer: XRFrame | null = null;\n\n // raycaster members\n private _xrRaycaster: DIVEWebXRRaycaster;\n private _origin: DIVEWebXROrigin;\n\n // crosshair\n private _crosshair: DIVEWebXRCrosshair;\n\n // controller members\n private _touchscreenControls: DIVEWebXRTouchscreenControls;\n private _handNodeInitialPosition = new Vector3();\n private _xrCamera: WebXRArrayCamera;\n private _placed: boolean = false;\n\n // grabbing\n private _grabbedObject: Object3D | null = null;\n private _arHitPosition: Vector3 = new Vector3();\n private _arHitQuaternion: Quaternion = new Quaternion();\n private _arHitScale: Vector3 = new Vector3(1, 1, 1);\n\n // grabbing position\n private _initialObjectPosition: Vector3 | null = null;\n private _initialRaycastHit: Vector3 | null = null;\n private _deltaRaycastHit: Vector3 = new Vector3();\n\n // grabbing rotation\n private _touchQuaterion: Quaternion = new Quaternion();\n\n // grabbing scale\n private _touchScale: number = 1;\n private _scaleThreshold: number = 0.1;\n\n constructor(session: XRSession, renderer: DIVERenderer, scene: DIVEScene) {\n super();\n\n this._renderer = renderer;\n this._scene = scene;\n this._session = session;\n\n this._xrRaycaster = new DIVEWebXRRaycaster(session, renderer, scene);\n this._origin = new DIVEWebXROrigin(this._session, this._renderer, [\n 'plane',\n ]);\n\n this._crosshair = new DIVEWebXRCrosshair();\n this._crosshair.visible = false;\n\n this._xrCamera = this._renderer.xr.getCamera();\n\n this._scene.XRRoot.XRHandNode.position.set(0, -0.05, -0.25);\n this._handNodeInitialPosition =\n this._scene.XRRoot.XRHandNode.position.clone();\n\n this._touchscreenControls = new DIVEWebXRTouchscreenControls(\n this._session,\n );\n\n // translating\n this._touchscreenControls.Subscribe('TOUCH_START', () =>\n this.onTouchStart(),\n );\n this._touchscreenControls.Subscribe('TOUCH_MOVE', () =>\n this.onTouchMove(),\n );\n this._touchscreenControls.Subscribe('TOUCH_END', (p) =>\n this.onTouchEnd(p),\n );\n\n // rotating\n this._touchscreenControls.Subscribe('ROTATE_START', () =>\n this.onRotateStart(),\n );\n this._touchscreenControls.Subscribe('ROTATE_MOVE', (p) =>\n this.onRotateMove(p),\n );\n\n // scaling\n this._touchscreenControls.Subscribe('PINCH_START', () =>\n this.onPinchStart(),\n );\n this._touchscreenControls.Subscribe('PINCH_MOVE', (p) =>\n this.onPinchMove(p),\n );\n }\n\n public async Init(): Promise<this> {\n this.prepareScene();\n\n await this.initOrigin();\n await this.initRaycaster();\n\n return Promise.resolve(this);\n }\n\n public Dispose(): void {\n this.restoreScene();\n\n this._origin.Dispose();\n this._xrRaycaster.Dispose();\n\n // reset placement members\n this._placed = false;\n }\n\n public Update(frame: XRFrame): void {\n this._frameBuffer = frame;\n\n if (!this._placed) {\n this.updateHandNode();\n\n if (this._origin) {\n this._origin.Update(frame);\n }\n }\n }\n\n private updateHandNode(): void {\n this._xrCamera.updateMatrixWorld();\n this._scene.XRRoot.XRHandNode.position.copy(\n this._handNodeInitialPosition\n .clone()\n .applyMatrix4(this._xrCamera.matrixWorld),\n );\n this._scene.XRRoot.XRHandNode.quaternion.setFromRotationMatrix(\n this._xrCamera.matrixWorld,\n );\n }\n\n // placement\n private async initOrigin(): Promise<void> {\n // initialize origin\n this._origin = await this._origin.Init();\n\n // set resolve callback: place objects at origin when it is set\n this._origin.originSet.then(() => {\n this.placeObjects(this._origin.matrix);\n });\n }\n\n private placeObjects(matrix: Matrix4): void {\n this._scene.XRRoot.XRModelRoot.matrix.copy(matrix);\n\n // we are copying children to a new array to keep the original array intact\n [...this._scene.XRRoot.XRHandNode.children].forEach((child) => {\n this._scene.XRRoot.XRModelRoot.add(child);\n });\n this._placed = true;\n }\n\n // grabbing\n private updateObject(): void {\n if (!this._grabbedObject) return;\n\n this._grabbedObject.position.copy(this._arHitPosition);\n this._grabbedObject.quaternion.copy(\n this._arHitQuaternion.clone().multiply(this._touchQuaterion),\n );\n this._grabbedObject.scale.copy(\n new Vector3(\n this._touchScale,\n this._touchScale,\n this._touchScale,\n ).multiply(this._arHitScale),\n );\n }\n\n private onTouchStart(): void {\n const sceneHits = this._xrRaycaster.GetSceneIntersections();\n console.log('sceneHits', sceneHits);\n if (sceneHits.length === 0) return;\n if (!sceneHits[0].object) return;\n\n const moveable = findInterface<DIVEMovable>(\n sceneHits[0].object,\n 'isMovable',\n );\n if (!moveable) return;\n\n this._grabbedObject = moveable;\n }\n\n private onTouchMove(): void {\n // raycast ar\n if (!this._frameBuffer) return;\n if (!this._grabbedObject) return;\n\n const intersections = this._xrRaycaster.GetARIntersections(\n this._frameBuffer,\n );\n if (intersections.length === 0) {\n this._crosshair.visible = false;\n return;\n }\n\n const hit = intersections[0];\n\n this._crosshair.visible = true;\n this._crosshair.matrix.copy(hit.matrix);\n\n if (!this._grabbedObject) return;\n\n // if initial values have been reset by TOUCH_END event then set them again\n if (!this._initialObjectPosition || !this._initialRaycastHit) {\n this._initialObjectPosition = this._grabbedObject.position.clone();\n this._initialRaycastHit = hit.point.clone();\n }\n\n // decompose hit matrix to apply hit matrix to object\n hit.matrix.decompose(\n this._arHitPosition,\n this._arHitQuaternion,\n this._arHitScale,\n );\n\n // calculate raycast hit delta\n this._deltaRaycastHit.copy(\n hit.point.clone().sub(this._initialRaycastHit),\n );\n\n // apply moved raycast delta to actual object position\n this._arHitPosition.copy(\n this._initialObjectPosition.clone().add(this._deltaRaycastHit),\n );\n\n console.log('arHitPosition', this._arHitPosition);\n\n this.updateObject();\n }\n\n private onTouchEnd(payload: DIVETouchscreenEvents['TOUCH_END']): void {\n if (payload.touchCount === 0) {\n this._crosshair.visible = false;\n\n // reset grab\n this._initialObjectPosition = null;\n this._initialRaycastHit = null;\n this._grabbedObject = null;\n }\n }\n\n private _startTouchQuaternion: Quaternion = new Quaternion();\n private onRotateStart(): void {\n this._startTouchQuaternion = this._touchQuaterion.clone();\n }\n\n private onRotateMove(payload: DIVETouchscreenEvents['ROTATE_MOVE']): void {\n this._touchQuaterion.setFromAxisAngle(\n new Vector3(0, -1, 0),\n payload.delta * 3,\n );\n this._touchQuaterion.multiply(this._startTouchQuaternion);\n this.updateObject();\n }\n\n private _startTouchScale: number = 1;\n private onPinchStart(): void {\n this._startTouchScale = this._touchScale;\n }\n\n private onPinchMove(payload: DIVETouchscreenEvents['PINCH_MOVE']): void {\n this._touchScale = this._startTouchScale * payload.current;\n this.updateObject();\n }\n\n // prepare & cleanup scene\n private prepareScene(): void {\n this._scene.XRRoot.XRModelRoot.matrixAutoUpdate = false;\n\n // initialize crosshair\n this._scene.add(this._crosshair);\n\n // hang current scene children to hand node\n const children: Object3D[] = [];\n this._scene.Root.children.forEach((child) => {\n const clone = child.clone();\n clone.layers.enableAll();\n clone.traverse((obj) => {\n obj.layers.enableAll();\n if (obj instanceof Mesh) {\n obj.scale.set(0.1, 0.1, 0.1);\n }\n });\n clone.position.set(0, 0, 0);\n children.push(clone);\n });\n this._scene.XRRoot.XRHandNode.add(...children);\n }\n\n private restoreScene(): void {\n this._scene.remove(this._crosshair);\n\n // clear hand node and remove attached models\n this._scene.XRRoot.XRHandNode.clear();\n this._scene.XRRoot.XRModelRoot.clear();\n\n this._scene.XRRoot.XRModelRoot.matrixAutoUpdate = true;\n }\n\n // raycast\n private async initRaycaster(): Promise<void> {\n // initialize raycaster\n await this._xrRaycaster.Init();\n\n // check if successful\n if (!this._xrRaycaster) {\n console.error(\n 'Raycaster not initialized successfully. Aborting WebXR...',\n );\n this.Dispose();\n return Promise.reject();\n }\n }\n}\n","import { Vector3 } from 'three';\nimport DIVEOrbitControls from '../../controls/OrbitControls';\nimport { type DIVERenderer } from '../../renderer/Renderer';\nimport { type DIVEScene } from '../../scene/Scene';\nimport { Overlay } from './overlay/Overlay';\nimport { DIVEWebXRController } from './controller/WebXRController';\n\nexport class DIVEWebXR {\n // general members\n private static _renderer: DIVERenderer;\n private static _scene: DIVEScene;\n private static _controller: DIVEOrbitControls;\n\n // camera reset members\n private static _cameraPosition: Vector3;\n private static _cameraTarget: Vector3;\n\n // render loop members\n private static _renderCallbackId: string | null = null;\n\n // setup members\n private static _session: XRSession | null = null;\n private static _referenceSpaceType: XRReferenceSpaceType = 'local';\n private static _overlay: Overlay | null = null;\n private static _options = {\n requiredFeatures: [\n 'local',\n 'hit-test',\n ],\n optionalFeatures: [\n 'light-estimation',\n 'local-floor',\n 'dom-overlay',\n 'depth-sensing',\n ],\n depthSensing: {\n usagePreference: ['gpu-optimized'],\n dataFormatPreference: [],\n },\n domOverlay: { root: {} as HTMLElement },\n };\n\n private static _xrController: DIVEWebXRController | null = null;\n\n public static async Launch(\n renderer: DIVERenderer,\n scene: DIVEScene,\n controller: DIVEOrbitControls,\n ): Promise<void> {\n this._renderer = renderer;\n this._scene = scene;\n this._controller = controller;\n\n // setting camera reset values\n this._cameraPosition = this._controller.object.position.clone();\n this._cameraTarget = this._controller.target.clone();\n\n if (!navigator.xr) {\n console.error('WebXR not supported');\n return Promise.reject();\n }\n\n // setup current instance\n this._renderer.xr.enabled = true;\n this._scene.InitXR(renderer);\n\n // creating overlay\n if (!DIVEWebXR._overlay) {\n const overlay = new Overlay();\n DIVEWebXR._overlay = overlay;\n }\n DIVEWebXR._options.domOverlay = { root: DIVEWebXR._overlay.Element };\n\n // request session\n const session = await navigator.xr.requestSession(\n 'immersive-ar',\n this._options,\n );\n session.addEventListener('end', () => {\n this._onSessionEnded();\n });\n\n // build up session\n renderer.xr.setReferenceSpaceType(this._referenceSpaceType);\n await renderer.xr.setSession(session);\n DIVEWebXR._overlay.Element.style.display = '';\n this._session = session;\n\n // add end session event listener\n DIVEWebXR._overlay.CloseButton.addEventListener('click', () =>\n this.End(),\n );\n\n // start session\n await this._onSessionStarted();\n\n return Promise.resolve();\n }\n\n public static Update(_time: DOMHighResTimeStamp, frame: XRFrame): void {\n if (!this._session) return;\n\n if (this._xrController) {\n this._xrController.Update(frame);\n }\n }\n\n public static End(): void {\n if (!this._session) return;\n this._session.end();\n }\n\n private static async _onSessionStarted(): Promise<void> {\n if (!this._session) return;\n\n // add update callback to render loop\n this._renderCallbackId = this._renderer.AddPreRenderCallback(\n (time: DOMHighResTimeStamp, frame: XRFrame) => {\n this.Update(time, frame);\n },\n );\n\n this._xrController = new DIVEWebXRController(\n this._session,\n this._renderer,\n this._scene,\n );\n await this._xrController.Init().catch(() => {\n this.End();\n });\n\n return Promise.resolve();\n }\n\n private static _onSessionEnded(): void {\n if (!this._session) return;\n\n if (this._xrController) {\n this._xrController.Dispose();\n }\n\n // remove Update() callback\n if (this._renderCallbackId) {\n this._renderer.RemovePreRenderCallback(this._renderCallbackId);\n this._renderCallbackId = null;\n }\n\n // disable XR on renderer to restore canvas rendering\n this._renderer.xr.enabled = false;\n\n // resize renderer\n const canvasWrapper = this._renderer.domElement.parentElement;\n if (canvasWrapper) {\n const { clientWidth, clientHeight } = canvasWrapper;\n this._renderer.OnResize(clientWidth, clientHeight);\n\n // resize camera\n this._controller.object.OnResize(clientWidth, clientHeight);\n }\n\n // reset camera\n this._controller.object.position.copy(this._cameraPosition);\n this._controller.target.copy(this._cameraTarget);\n\n // reset camera values\n this._cameraPosition.set(0, 0, 0);\n this._cameraTarget.set(0, 0, 0);\n\n // dispose xr scene\n this._scene.DisposeXR();\n\n this._session.removeEventListener('end', this._onSessionEnded);\n DIVEWebXR._overlay!.Element.style.display = 'none';\n this._session = null;\n }\n}\n","import { type DIVEScene } from '../../scene/Scene';\nimport { type DIVEAROptions } from '../AR';\n\nexport class DIVESceneViewer {\n public static Launch(scene: DIVEScene, options?: DIVEAROptions): void {\n // find url in scene (first object found that has a set uri)\n const url = this.findSceneViewerSrc(scene);\n\n // launch SceneViewer\n this.launchSceneViewer(url, options);\n }\n\n private static launchSceneViewer(\n url: string,\n options?: DIVEAROptions,\n ): void {\n const anchor = document.createElement('a');\n const noArViewerSigil = '#model-viewer-no-ar-fallback';\n\n const location = self.location.toString();\n const locationUrl = new URL(location);\n const modelUrl = new URL(url, location);\n const params = new URLSearchParams(modelUrl.search);\n\n locationUrl.hash = noArViewerSigil;\n\n // modelUrl can contain title/link/sound etc.\n params.set('mode', 'ar_only');\n\n if (options?.arScale === 'fixed') {\n params.set('resizable', 'false');\n }\n\n if (options?.arPlacement === 'vertical') {\n params.set('enable_vertical_placement', 'true');\n }\n\n // will be added later if needed\n // if (params.has('sound')) {\n // const soundUrl = new URL(params.get('sound')!, location);\n // params.set('sound', soundUrl.toString());\n // }\n // if (params.has('link')) {\n // const linkUrl = new URL(params.get('link')!, location);\n // params.set('link', linkUrl.toString());\n // }\n\n const intent = `intent://arvr.google.com/scene-viewer/1.2?${\n params.toString() + '&file=' + modelUrl.toString()\n }#Intent;scheme=https;package=com.google.android.googlequicksearchbox;action=android.intent.action.VIEW;S.browser_fallback_url=${encodeURIComponent(\n locationUrl.toString(),\n )};end;`;\n\n anchor.setAttribute('href', intent);\n anchor.click();\n }\n\n private static findSceneViewerSrc(scene: DIVEScene): string {\n let uri: string | null = null;\n\n scene.traverse((object) => {\n if (uri) return;\n if (object.userData.uri) {\n uri = object.userData.uri;\n }\n });\n\n if (!uri) {\n throw new Error('No model found in scene');\n }\n\n return uri;\n }\n}\n","import { DIVEInfo, WebXRUnsupportedReason } from '../info/Info';\nimport { DIVEARQuickLook } from './arquicklook/ARQuickLook';\nimport { DIVEWebXR } from './webxr/WebXR';\nimport { type DIVEScene } from '../scene/Scene';\nimport { type DIVERenderer } from '../renderer/Renderer';\nimport DIVEOrbitControls from '../controls/OrbitControls';\nimport { DIVESceneViewer } from './sceneviewer/SceneViewer';\n\nexport type DIVEAROptions = {\n arPlacement: 'horizontal' | 'vertical';\n arScale: 'auto' | 'fixed';\n /**\n * experimental, currently deactivated\n */\n useWebXR: false;\n};\n\nexport class DIVEAR {\n private _renderer: DIVERenderer;\n private _scene: DIVEScene;\n private _controller: DIVEOrbitControls;\n\n constructor(\n renderer: DIVERenderer,\n scene: DIVEScene,\n controller: DIVEOrbitControls,\n ) {\n this._renderer = renderer;\n this._scene = scene;\n this._controller = controller;\n }\n\n public async Launch(options?: DIVEAROptions): Promise<void> {\n const system = DIVEInfo.GetSystem();\n\n if (system === 'iOS') {\n return this.tryARQuickLook();\n }\n\n if (system === 'Android') {\n if (options?.useWebXR) {\n console.warn('DIVE: WebXR is experimental on Android.');\n return this.tryWebXR();\n }\n\n return this.trySceneViewer();\n }\n\n console.log(\n 'DIVE: AR not supported. Not a mobile system. (System is ' +\n system +\n ')',\n );\n }\n\n private async tryARQuickLook(options?: DIVEAROptions): Promise<void> {\n const support = DIVEInfo.GetSupportsARQuickLook();\n if (!support) {\n console.log('ARQuickLook not supported');\n return Promise.reject();\n }\n\n console.log('DIVE: Launching AR with ARQuickLook ...');\n\n // Launch ARQuickLook\n await DIVEARQuickLook.Launch(this._scene, options);\n return Promise.resolve();\n }\n\n private async tryWebXR(): Promise<void> {\n const support = await DIVEInfo.GetSupportsWebXR();\n if (!support) {\n console.log(\n 'WebXR not supported. Reason: ' +\n WebXRUnsupportedReason[\n DIVEInfo.GetWebXRUnsupportedReason()!\n ],\n );\n return Promise.reject();\n }\n\n console.log('DIVE: Launching AR with WebXR ...');\n // Launch WebXR\n await DIVEWebXR.Launch(this._renderer, this._scene, this._controller);\n return Promise.resolve();\n }\n\n private async trySceneViewer(options?: DIVEAROptions): Promise<void> {\n // actually we don't have to try here, because SceneViewer is supported on all devices by now.\n // if there are no AR services (ARCore) installed on the device, SceneViewer will only show the model in 3D.\n // we also have no options to detect if SceneViewer is supported.\n\n console.log('DIVE: Launching AR with SceneViewer ...');\n\n DIVESceneViewer.Launch(this._scene, options);\n return Promise.resolve();\n }\n}\n","import {\n DIVERenderer,\n DIVERendererDefaultSettings,\n DIVERendererSettings,\n} from './renderer/Renderer.ts';\nimport { DIVEScene } from './scene/Scene.ts';\nimport DIVEPerspectiveCamera, {\n DIVEPerspectiveCameraDefaultSettings,\n DIVEPerspectiveCameraSettings,\n} from './camera/PerspectiveCamera.ts';\nimport DIVEOrbitControls, {\n DIVEOrbitControlsDefaultSettings,\n DIVEOrbitControlsSettings,\n} from './controls/OrbitControls.ts';\nimport DIVEToolbox from './toolbox/Toolbox.ts';\nimport { DIVECommunication } from './com/Communication.ts';\nimport { DIVEAnimationSystem } from './animation/AnimationSystem.ts';\nimport DIVEAxisCamera from './axiscamera/AxisCamera.ts';\nimport { getObjectDelta } from './helper/getObjectDelta/getObjectDelta.ts';\nimport { MathUtils } from 'three';\nimport { DIVEInfo } from './info/Info.ts';\nimport pkgjson from '../package.json';\n\nexport type DIVESettings = {\n autoResize: boolean;\n displayAxes: boolean;\n renderer: Partial<DIVERendererSettings>;\n perspectiveCamera: Partial<DIVEPerspectiveCameraSettings>;\n orbitControls: Partial<DIVEOrbitControlsSettings>;\n};\n\nexport const DIVEDefaultSettings: DIVESettings = {\n autoResize: true,\n displayAxes: false,\n renderer: DIVERendererDefaultSettings,\n perspectiveCamera: DIVEPerspectiveCameraDefaultSettings,\n orbitControls: DIVEOrbitControlsDefaultSettings,\n};\n\n/**\n * #### DIVE\n * is the main class of the DIVE framework.\n *\n * An instance of this class delivers a complete 3D environment with a perspective camera, orbit controls, a toolbox, and a communication system.\n * ```ts\n * import { DIVE } from \"@shopware-ag/dive\";\n *\n * const myWrapper = document.getElementById('myWrapper');\n *\n * const dive = new DIVE();\n *\n * myWrapper.appendChild(dive.Canvas);\n *\n * dive.Communication.Subscribe('GET_ALL_SCENE_DATA', () => {\n * // do something\n * }));\n *\n * dive.Communication.PerformAction('GET_ALL_SCENE_DATA', {});\n * ```\n * @module\n */\n\nexport default class DIVE {\n // static members\n public static QuickView(\n uri: string,\n settings?: Partial<DIVESettings>,\n ): DIVE {\n const dive = new DIVE(settings);\n\n dive.Communication.PerformAction('SET_CAMERA_TRANSFORM', {\n position: { x: 0, y: 2, z: 2 },\n target: { x: 0, y: 0.5, z: 0 },\n });\n\n // generate scene light id\n const lightid = MathUtils.generateUUID();\n\n // add scene light\n dive.Communication.PerformAction('ADD_OBJECT', {\n entityType: 'light',\n type: 'scene',\n name: 'light',\n id: lightid,\n enabled: true,\n visible: true,\n intensity: 1,\n color: 0xffffff,\n });\n\n // generate model id\n const modelid = MathUtils.generateUUID();\n\n // add loaded listener\n dive.Communication.Subscribe('MODEL_LOADED', (data) => {\n if (data.id !== modelid) return;\n\n const transform = dive.Communication.PerformAction(\n 'COMPUTE_ENCOMPASSING_VIEW',\n {},\n );\n\n dive.Communication.PerformAction('SET_CAMERA_TRANSFORM', {\n position: transform.position,\n target: transform.target,\n });\n });\n\n // instantiate model\n dive.Communication.PerformAction('ADD_OBJECT', {\n entityType: 'model',\n name: 'object',\n id: modelid,\n position: { x: 0, y: 0, z: 0 },\n rotation: { x: 0, y: 0, z: 0 },\n scale: { x: 1, y: 1, z: 1 },\n uri: uri,\n visible: true,\n loaded: false,\n });\n\n // set scene properties\n dive.Communication.PerformAction('UPDATE_SCENE', {\n backgroundColor: 0xffffff,\n gridEnabled: false,\n floorColor: 0xffffff,\n });\n\n return dive;\n }\n\n // descriptive members\n private _settings: DIVESettings;\n private _resizeObserverId: string;\n private _width: number;\n private _height: number;\n\n // functional components\n private renderer: DIVERenderer;\n private scene: DIVEScene;\n private perspectiveCamera: DIVEPerspectiveCamera;\n private orbitControls: DIVEOrbitControls;\n private toolbox: DIVEToolbox;\n private communication: DIVECommunication;\n\n // additional components\n private animationSystem: DIVEAnimationSystem;\n private axisCamera: DIVEAxisCamera | null;\n\n // getters\n public get Communication(): DIVECommunication {\n return this.communication;\n }\n\n public get Canvas(): HTMLCanvasElement {\n return this.renderer.domElement;\n }\n\n public get Info(): DIVEInfo {\n return DIVEInfo;\n }\n\n // setters\n public set Settings(settings: Partial<DIVESettings>) {\n const settingsDelta = getObjectDelta(this._settings, settings);\n\n // apply renderer settings (we have to rebuild the renderer to apply the settings)\n if (settingsDelta.renderer)\n this.renderer = new DIVERenderer(this._settings.renderer);\n\n // apply perspective camera settings\n if (settingsDelta.perspectiveCamera) {\n if (settingsDelta.perspectiveCamera.fov !== undefined)\n this.perspectiveCamera.fov =\n settingsDelta.perspectiveCamera.fov;\n if (settingsDelta.perspectiveCamera.near !== undefined)\n this.perspectiveCamera.near =\n settingsDelta.perspectiveCamera.near;\n if (settingsDelta.perspectiveCamera.far !== undefined)\n this.perspectiveCamera.far =\n settingsDelta.perspectiveCamera.far;\n this.perspectiveCamera.OnResize(\n this.renderer.domElement.width,\n this.renderer.domElement.height,\n );\n }\n // apply orbit controls settings\n if (settingsDelta.orbitControls) {\n if (settingsDelta.orbitControls.enableDamping !== undefined)\n this.orbitControls.enableDamping =\n settingsDelta.orbitControls.enableDamping;\n if (settingsDelta.orbitControls.dampingFactor !== undefined)\n this.orbitControls.dampingFactor =\n settingsDelta.orbitControls.dampingFactor;\n }\n\n if (settingsDelta.autoResize !== this._settings.autoResize) {\n if (settingsDelta.autoResize) {\n this.addResizeObserver();\n } else {\n this.removeResizeObserver();\n }\n }\n\n if (settingsDelta.displayAxes) {\n this.axisCamera = new DIVEAxisCamera(\n this.renderer,\n this.scene,\n this.orbitControls,\n );\n } else {\n this.axisCamera?.Dispose();\n this.axisCamera = null;\n }\n\n Object.assign(this._settings, settings);\n }\n\n constructor(settings?: Partial<DIVESettings>) {\n this._settings = {\n ...DIVEDefaultSettings,\n ...(settings !== undefined ? settings : {}),\n };\n\n this._resizeObserverId = '';\n this._width = 0;\n this._height = 0;\n\n // initialize functional components\n this.renderer = new DIVERenderer(this._settings.renderer);\n this.scene = new DIVEScene();\n this.perspectiveCamera = new DIVEPerspectiveCamera(\n this._settings.perspectiveCamera,\n );\n\n // initialize animation system\n this.animationSystem = new DIVEAnimationSystem(this.renderer);\n\n this.orbitControls = new DIVEOrbitControls(\n this.perspectiveCamera,\n this.renderer,\n this.animationSystem,\n this._settings.orbitControls,\n );\n this.toolbox = new DIVEToolbox(this.scene, this.orbitControls);\n this.communication = new DIVECommunication(\n this.renderer,\n this.scene,\n this.orbitControls,\n this.toolbox,\n );\n\n // initialize axis camera\n if (this._settings.displayAxes) {\n this.axisCamera = new DIVEAxisCamera(\n this.renderer,\n this.scene,\n this.orbitControls,\n );\n } else {\n this.axisCamera = null;\n }\n\n // add resize observer if autoResize is enabled\n if (this._settings.autoResize) {\n this.addResizeObserver();\n }\n\n // whene everything is done, start the renderer\n this.renderer.StartRenderer(this.scene, this.perspectiveCamera);\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (window as any).DIVE = {\n PrintScene: () => {\n console.log(this.scene);\n },\n };\n\n console.log(`DIVE ${pkgjson.version} initialized successfully!`);\n if (process.env.DIVE_NODE_ENV === 'development') {\n console.log('DIVE is running in development mode.');\n }\n console.log(`\n @@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@@@@@@@@@@@\n @@@@+-:::::::---------------------==------------------------------=#@@@@\n @@%=::::.......::---------------------------------------------------------+@@\n @@+:::...........::-----------------------------------------------------------#@@\n @@=:::.........::::::-------------------------------------------------------------%@\n @%:::.......:::::::-----------------------------------------------------------------#@\n @*:::.....:::::-----------------------------------------------------------------------*@\n @%::::::.::::---------------------------------------------------------------------------@@\n @@-:::::::::-----------------------------------------------------------------------------=@\n @%::::::::--------------------------------------------------------------------------------%@\n @+::::::::--------------------------------=@@@@@%-----------------------------------------%@\n @=:::::::--------------------------------*@@ @@+---------------------------------------#@\n @+:::::::-------------------------------*@ @*--------------------------------------%@\n @#::::::::-----------------------------=@@ @@=-------------------------------------%@\n @@-::::::::----------------------------@@ @@------------------------------------=@\n @%:::::::::--------------------------*@ @*-----------------------------------@@\n @*:::::::::-------------------------@@ @@----------------------------------%@\n @#::::::::::----------------------%@ @%--------------------------------%@\n @#:::::::::::-------------------=@@ @@=------------------------------%@\n @@-::::::::::::----------------%@ @%----------------------------=@@\n @@#::::::::::::::------------*@ @*--------------------------#@@\n @@+::::::::::::::::--------@@ @@------------------------+@@\n @@*:::::::::::::::::----@@ @@---------------------+@@\n @@@-:::::::::::::::--#@ @#-----------------=%@@\n @@%-::::::::::::-%@ @%-------------=%@@\n @@@@+:::::::#@@ @@*-------*@@@@\n @@@@@@@ @@@@@@\n\n `);\n }\n\n public Dispose(): void {\n this.removeResizeObserver();\n this.renderer.Dispose();\n this.orbitControls.Dispose();\n this.axisCamera?.Dispose();\n this.animationSystem.Dispose();\n this.toolbox.Dispose();\n this.communication.DestroyInstance();\n }\n\n // methods\n public OnResize(width: number, height: number): void {\n // resize renderer\n this.renderer.OnResize(width, height);\n\n // resize camera\n this.perspectiveCamera.OnResize(width, height);\n }\n\n private addResizeObserver(): void {\n this._resizeObserverId = this.renderer.AddPreRenderCallback(() => {\n // check if the canvas is mounted\n const canvasWrapper = this.renderer.domElement.parentElement;\n if (!canvasWrapper) return;\n\n const { clientWidth, clientHeight } = canvasWrapper;\n if (clientWidth === this._width && clientHeight === this._height)\n return;\n\n this.OnResize(clientWidth, clientHeight);\n\n this._width = clientWidth;\n this._height = clientHeight;\n });\n }\n\n private removeResizeObserver(): void {\n this.renderer.RemovePreRenderCallback(this._resizeObserverId);\n }\n}\n\nexport { DIVE, DIVECommunication };\n\nexport * from './math/index.ts';\n\nexport type * from './com/actions/index.ts';\nexport type * from './com/types';\nexport type * from './types';\n","import {\n Camera,\n MathUtils,\n NoToneMapping,\n PCFSoftShadowMap,\n Scene,\n ShadowMapType,\n ToneMapping,\n WebGLRenderer,\n} from 'three';\n\nexport type DIVERendererSettings = {\n antialias: boolean;\n alpha: boolean;\n stencil: boolean;\n shadowMapEnabled: boolean;\n shadowMapType: ShadowMapType;\n toneMapping: ToneMapping;\n canvas?: HTMLCanvasElement;\n};\n\nexport const DIVERendererDefaultSettings: DIVERendererSettings = {\n antialias: true,\n alpha: true,\n stencil: false,\n shadowMapEnabled: true,\n shadowMapType: PCFSoftShadowMap,\n toneMapping: NoToneMapping,\n canvas: undefined,\n};\n\nexport type DIVERenderCallback = (\n time: DOMHighResTimeStamp,\n frame: XRFrame,\n) => void;\n\n/**\n * A changed version of the WebGLRenderer.\n *\n * Has to be started manually by calling StartRenderer().\n *\n * @module\n */\n\nexport class DIVERenderer extends WebGLRenderer {\n // basic functionality members\n private paused: boolean = false;\n private running: boolean = false;\n private force: boolean = false;\n\n // pre- and post-render callbacks\n private preRenderCallbacks: Map<string, DIVERenderCallback> = new Map<\n string,\n DIVERenderCallback\n >();\n private postRenderCallbacks: Map<string, DIVERenderCallback> = new Map<\n string,\n DIVERenderCallback\n >();\n\n constructor(\n rendererSettings: Partial<DIVERendererSettings> = DIVERendererDefaultSettings,\n ) {\n super({\n antialias:\n rendererSettings.antialias ||\n DIVERendererDefaultSettings.antialias,\n alpha: rendererSettings.alpha || DIVERendererDefaultSettings.alpha,\n preserveDrawingBuffer: true,\n canvas: rendererSettings.canvas,\n });\n this.setPixelRatio(window.devicePixelRatio);\n\n this.shadowMap.enabled =\n rendererSettings.shadowMapEnabled ||\n DIVERendererDefaultSettings.shadowMapEnabled;\n this.shadowMap.type =\n rendererSettings.shadowMapType ||\n DIVERendererDefaultSettings.shadowMapType;\n\n this.toneMapping =\n rendererSettings.toneMapping ||\n DIVERendererDefaultSettings.toneMapping;\n\n this.debug.checkShaderErrors = false;\n }\n\n // Stops renderings and disposes the renderer.\n public Dispose(): void {\n this.StopRenderer();\n this.dispose();\n }\n\n // Starts the renderer with the given scene and camera.\n public StartRenderer(scene: Scene, cam: Camera): void {\n this.setAnimationLoop((time: DOMHighResTimeStamp, frame: XRFrame) => {\n this.internal_render(scene, cam, time, frame);\n });\n this.running = true;\n }\n\n // Pauses the renderer.\n public PauseRenderer(): void {\n this.paused = true;\n }\n\n // Resumes the renderer after pausing.\n public ResumeRenderer(): void {\n this.paused = false;\n }\n\n // Stops the renderer completely. Has to be started again with StartRenderer().\n public StopRenderer(): void {\n this.setAnimationLoop(null);\n this.running = false;\n }\n\n // Resizes the renderer to the given width and height.\n public OnResize(width: number, height: number): void {\n this.setSize(width, height);\n }\n\n /**\n * Adds a callback to the render loop before actual render call.\n * @param callback Executed before rendering.\n * @returns uuid to remove the callback.\n */\n public AddPreRenderCallback(callback: DIVERenderCallback): string {\n // add callback to renderloop\n const newUUID = MathUtils.generateUUID();\n this.preRenderCallbacks.set(newUUID, callback);\n\n return newUUID;\n }\n\n /**\n * Removes a callback from the render loop before actual render call.\n * @param uuid of callback to remove.\n * @returns if removing was successful.\n */\n public RemovePreRenderCallback(uuid: string): boolean {\n // check if callback exists\n if (!this.preRenderCallbacks.has(uuid)) return false;\n\n // remove callback from renderloop\n this.preRenderCallbacks.delete(uuid);\n\n return true;\n }\n\n /**\n * Adds a callback to the render loop after actual render call.\n * @param callback Executed after rendering.\n * @returns uuid to remove the callback.\n */\n public AddPostRenderCallback(callback: DIVERenderCallback): string {\n // add callback to renderloop\n const newUUID = MathUtils.generateUUID();\n this.postRenderCallbacks.set(newUUID, callback);\n\n return newUUID;\n }\n\n /**\n * Removes a callback from the render loop after actual render call.\n * @param uuid of callback to remove.\n * @returns if removing was successful.\n */\n public RemovePostRenderCallback(uuid: string): boolean {\n // check if callback exists\n if (!this.postRenderCallbacks.has(uuid)) return false;\n\n // remove callback from renderloop\n this.postRenderCallbacks.delete(uuid);\n\n return true;\n }\n\n /**\n * Forces the renderer to render the next frame.\n */\n public ForceRendering(): void {\n this.force = true;\n }\n\n /**\n * Internal render loop.\n *\n * To control renderloop you can add callbacks via AddPreRenderCallback() and AddPostRenderCallback().\n * @param scene Scene to render.\n * @param cam Camera to render with.\n */\n private internal_render(\n scene: Scene,\n cam: Camera,\n time: DOMHighResTimeStamp,\n frame: XRFrame,\n ): void {\n // execute background render loop callbacks\n if ((this.paused || !this.running) && !this.force) return;\n\n // execute render loop callbacks\n this.preRenderCallbacks.forEach((callback) => {\n callback(time, frame);\n });\n\n this.render(scene, cam);\n\n this.postRenderCallbacks.forEach((callback) => {\n callback(time, frame);\n });\n\n this.force = false;\n }\n}\n","import { Color, Scene, type Box3, type ColorRepresentation } from 'three';\nimport { type COMModel, type COMEntity } from '../com/types';\nimport { DIVERoot } from './root/Root';\nimport { DIVEGrid } from '../grid/Grid';\nimport { DIVEFloor } from '../primitive/floor/Floor';\nimport { type DIVESceneObject } from '../types';\nimport { DIVEXRRoot } from './xrroot/XRRoot';\nimport { type DIVERenderer } from '../renderer/Renderer';\n\n/**\n * A basic scene class.\n *\n * Comes with a root object that contains all the scene objects.\n *\n * @module\n */\n\nexport class DIVEScene extends Scene {\n private _root: DIVERoot;\n private _floor: DIVEFloor;\n private _grid: DIVEGrid;\n\n public get Root(): DIVERoot {\n return this._root;\n }\n\n private _xrRoot: DIVEXRRoot;\n public get XRRoot(): DIVEXRRoot {\n return this._xrRoot;\n }\n\n public get Floor(): DIVEFloor {\n return this._floor;\n }\n\n public get Grid(): DIVEGrid {\n return this._grid;\n }\n\n constructor() {\n super();\n\n this.background = new Color(0xffffff);\n\n this._root = new DIVERoot();\n this.add(this._root);\n\n this._floor = new DIVEFloor();\n this.add(this._floor);\n\n this._grid = new DIVEGrid();\n this.add(this._grid);\n\n this._xrRoot = new DIVEXRRoot(this);\n this._xrRoot.visible = false;\n this.add(this._xrRoot);\n }\n\n public InitXR(renderer: DIVERenderer): void {\n this._root.visible = false;\n this._xrRoot.visible = true;\n this._xrRoot.InitLightEstimation(renderer);\n }\n\n public DisposeXR(): void {\n this._root.visible = true;\n this._xrRoot.visible = false;\n this._xrRoot.DisposeLightEstimation();\n }\n\n public SetBackground(color: ColorRepresentation): void {\n this.background = new Color(color);\n }\n\n public ComputeSceneBB(): Box3 {\n return this.Root.ComputeSceneBB();\n }\n\n public GetSceneObject<T extends DIVESceneObject>(\n object: Partial<COMEntity> & { id: string },\n ): T | undefined {\n return this.Root.GetSceneObject<T>(object);\n }\n\n public AddSceneObject(object: COMEntity): void {\n this.Root.AddSceneObject(object);\n }\n\n public UpdateSceneObject(\n object: Partial<COMEntity> & { id: string; entityType: string },\n ): void {\n this.Root.UpdateSceneObject(object);\n }\n\n public DeleteSceneObject(\n object: Partial<COMEntity> & { id: string; entityType: string },\n ): void {\n this.Root.DeleteSceneObject(object);\n }\n\n public PlaceOnFloor(\n object: Partial<COMModel> & { id: string; entityType: string },\n ): void {\n this.Root.PlaceOnFloor(object);\n }\n}\n","import { Box3, Color, Object3D } from 'three';\nimport DIVEAmbientLight from '../../light/AmbientLight.ts';\nimport DIVEPointLight from '../../light/PointLight.ts';\nimport DIVESceneLight from '../../light/SceneLight.ts';\nimport { DIVEModel } from '../../model/Model.ts';\nimport { DIVELoadingManager } from '../../loadingmanager/LoadingManager.ts';\nimport { DIVECommunication } from '../../com/Communication.ts';\nimport { DIVEPrimitive } from '../../primitive/Primitive.ts';\n\nimport { type DIVEScene } from '../Scene.ts';\nimport { type TransformControls } from 'three/examples/jsm/controls/TransformControls';\nimport {\n type COMLight,\n type COMModel,\n type COMEntity,\n type COMPrimitive,\n type COMGroup,\n} from '../../com/types';\nimport { type DIVESceneObject } from '../../types';\nimport { DIVEGroup } from '../../group/Group.ts';\n\n/**\n * A basic scene node to hold grid, floor and all lower level roots.\n *\n * @module\n */\n\nexport class DIVERoot extends Object3D {\n readonly isDIVERoot: true = true;\n\n private loadingManager: DIVELoadingManager;\n\n constructor() {\n super();\n this.name = 'Root';\n\n this.loadingManager = new DIVELoadingManager();\n }\n\n public ComputeSceneBB(): Box3 {\n const bb = new Box3();\n this.traverse((object: Object3D) => {\n if ('isObject3D' in object) {\n bb.expandByObject(object);\n }\n });\n return bb;\n }\n\n public GetSceneObject<T extends DIVESceneObject>(\n object: Partial<COMEntity> & { id: string },\n ): T | undefined {\n let foundObject: T | undefined;\n this.traverse((object3D) => {\n if (foundObject) return;\n if (object3D.userData.id === object.id) {\n foundObject = object3D as T;\n }\n });\n return foundObject;\n }\n\n public AddSceneObject(object: COMEntity): void {\n switch (object.entityType) {\n case 'pov': {\n break;\n }\n case 'light': {\n this.updateLight(object as COMLight);\n break;\n }\n case 'model': {\n this.updateModel(object);\n break;\n }\n case 'primitive': {\n this.updatePrimitive(object);\n break;\n }\n case 'group': {\n this.updateGroup(object);\n break;\n }\n default: {\n console.warn(\n `DIVERoot.AddSceneObject: Unknown entity type: ${object.entityType}`,\n );\n }\n }\n }\n\n public UpdateSceneObject(\n object: Partial<COMEntity> & { id: string; entityType: string },\n ): void {\n switch (object.entityType) {\n case 'pov': {\n break;\n }\n case 'light': {\n this.updateLight(object as COMLight);\n break;\n }\n case 'model': {\n this.updateModel(object);\n break;\n }\n case 'primitive': {\n this.updatePrimitive(object);\n break;\n }\n case 'group': {\n this.updateGroup(object);\n break;\n }\n default: {\n console.warn(\n `DIVERoot.UpdateSceneObject: Unknown entity type: ${object.entityType}`,\n );\n }\n }\n }\n\n public DeleteSceneObject(\n object: Partial<COMEntity> & { id: string; entityType: string },\n ): void {\n switch (object.entityType) {\n case 'pov': {\n break;\n }\n case 'light': {\n this.deleteLight(object);\n break;\n }\n case 'model': {\n this.deleteModel(object);\n break;\n }\n case 'primitive': {\n this.deletePrimitive(object);\n break;\n }\n case 'group': {\n this.deleteGroup(object);\n break;\n }\n default: {\n console.warn(\n `DIVERoot.DeleteSceneObject: Unknown entity type: ${object.entityType}`,\n );\n }\n }\n }\n\n public PlaceOnFloor(\n object: Partial<COMEntity> & { id: string; entityType: string },\n ): void {\n switch (object.entityType) {\n case 'pov':\n case 'light': {\n break;\n }\n case 'model':\n case 'primitive': {\n this.placeOnFloor(object);\n break;\n }\n default: {\n console.warn(\n `DIVERoot.PlaceOnFloor: Unknown entity type: ${object.entityType}`,\n );\n }\n }\n }\n\n private updateLight(\n light: Partial<COMLight> & {\n id: string;\n entityType: string;\n type: string;\n },\n ): void {\n let sceneObject = this.GetSceneObject(light);\n if (!sceneObject) {\n switch (light.type) {\n case 'scene': {\n sceneObject = new DIVESceneLight();\n break;\n }\n case 'ambient': {\n sceneObject = new DIVEAmbientLight();\n break;\n }\n case 'point': {\n sceneObject = new DIVEPointLight();\n break;\n }\n default: {\n console.warn(\n `DIVERoot.updateLight: Unknown light type: ${light.type}`,\n );\n return;\n }\n }\n sceneObject.userData.id = light.id;\n this.add(sceneObject);\n }\n\n if (light.name !== undefined && light.name !== null)\n sceneObject.name = light.name;\n if (light.position !== undefined && light.position !== null)\n sceneObject.position.set(\n light.position.x,\n light.position.y,\n light.position.z,\n );\n if (light.intensity !== undefined && light.intensity !== null)\n (sceneObject as DIVEAmbientLight | DIVEPointLight).SetIntensity(\n light.intensity,\n );\n if (light.enabled !== undefined && light.enabled !== null)\n (sceneObject as DIVEAmbientLight | DIVEPointLight).SetEnabled(\n light.enabled,\n );\n if (light.color !== undefined && light.color !== null)\n (sceneObject as DIVEAmbientLight | DIVEPointLight).SetColor(\n new Color(light.color),\n );\n if (light.visible !== undefined && light.visible !== null)\n (sceneObject as DIVEAmbientLight | DIVEPointLight).visible =\n light.visible;\n if (light.parentId !== undefined)\n this.setParent({ ...light, parentId: light.parentId });\n }\n\n private updateModel(model: Partial<COMModel> & { id: string }): void {\n let sceneObject = this.GetSceneObject<DIVESceneObject>(model);\n if (!sceneObject) {\n const created = new DIVEModel();\n sceneObject = created;\n sceneObject.userData.id = model.id;\n sceneObject.userData.uri = model.uri;\n this.add(sceneObject);\n }\n\n if (model.uri !== undefined) {\n this.loadingManager.LoadGLTF(model.uri).then((gltf) => {\n (sceneObject as DIVEModel).SetModel(gltf);\n DIVECommunication.get(model.id!)?.PerformAction(\n 'MODEL_LOADED',\n { id: model.id! },\n );\n });\n }\n\n if (model.name !== undefined) sceneObject.name = model.name;\n if (model.position !== undefined)\n (sceneObject as DIVEModel).SetPosition(model.position);\n if (model.rotation !== undefined)\n (sceneObject as DIVEModel).SetRotation(model.rotation);\n if (model.scale !== undefined)\n (sceneObject as DIVEModel).SetScale(model.scale);\n if (model.visible !== undefined)\n (sceneObject as DIVEModel).SetVisibility(model.visible);\n if (model.material !== undefined)\n (sceneObject as DIVEModel).SetMaterial(model.material);\n if (model.parentId !== undefined)\n this.setParent({ ...model, parentId: model.parentId });\n }\n\n private updatePrimitive(\n primitive: Partial<COMPrimitive> & { id: string },\n ): void {\n let sceneObject = this.GetSceneObject<DIVESceneObject>(primitive);\n if (!sceneObject) {\n const created = new DIVEPrimitive();\n sceneObject = created;\n sceneObject.userData.id = primitive.id;\n this.add(sceneObject);\n }\n\n if (primitive.name !== undefined) sceneObject.name = primitive.name;\n if (primitive.geometry !== undefined)\n (sceneObject as DIVEPrimitive).SetGeometry(primitive.geometry);\n if (primitive.position !== undefined)\n (sceneObject as DIVEPrimitive).SetPosition(primitive.position);\n if (primitive.rotation !== undefined)\n (sceneObject as DIVEPrimitive).SetRotation(primitive.rotation);\n if (primitive.scale !== undefined)\n (sceneObject as DIVEPrimitive).SetScale(primitive.scale);\n if (primitive.visible !== undefined)\n (sceneObject as DIVEPrimitive).SetVisibility(primitive.visible);\n if (primitive.material !== undefined)\n (sceneObject as DIVEPrimitive).SetMaterial(primitive.material);\n if (primitive.parentId !== undefined)\n this.setParent({ ...primitive, parentId: primitive.parentId });\n }\n\n private updateGroup(group: Partial<COMGroup> & { id: string }): void {\n let sceneObject = this.GetSceneObject<DIVESceneObject>(group);\n if (!sceneObject) {\n const created = new DIVEGroup();\n sceneObject = created;\n sceneObject.userData.id = group.id;\n this.add(sceneObject);\n }\n\n if (group.name !== undefined) sceneObject.name = group.name;\n if (group.position !== undefined)\n (sceneObject as DIVEGroup).SetPosition(group.position);\n if (group.rotation !== undefined)\n (sceneObject as DIVEGroup).SetRotation(group.rotation);\n if (group.scale !== undefined)\n (sceneObject as DIVEGroup).SetScale(group.scale);\n if (group.visible !== undefined)\n (sceneObject as DIVEGroup).SetVisibility(group.visible);\n if (group.bbVisible !== undefined)\n (sceneObject as DIVEGroup).SetLinesVisibility(group.bbVisible);\n if (group.parentId !== undefined)\n this.setParent({ ...group, parentId: group.parentId });\n }\n\n private deleteLight(light: Partial<COMLight> & { id: string }): void {\n const sceneObject = this.GetSceneObject(light);\n if (!sceneObject) {\n console.warn(\n `DIVERoot.deleteLight: Light with id ${light.id} not found`,\n );\n return;\n }\n\n this.detachTransformControls(sceneObject);\n\n sceneObject.parent!.remove(sceneObject);\n }\n\n private deleteModel(model: Partial<COMModel> & { id: string }): void {\n const sceneObject = this.GetSceneObject(model);\n if (!sceneObject) {\n console.warn(\n `DIVERoot.deleteModel: Model with id ${model.id} not found`,\n );\n return;\n }\n\n this.detachTransformControls(sceneObject);\n\n sceneObject.parent!.remove(sceneObject);\n }\n\n private deletePrimitive(\n primitive: Partial<COMPrimitive> & { id: string },\n ): void {\n const sceneObject = this.GetSceneObject(primitive);\n if (!sceneObject) {\n console.warn(\n `DIVERoot.deletePrimitive: Primitive with id ${primitive.id} not found`,\n );\n return;\n }\n\n this.detachTransformControls(sceneObject);\n\n sceneObject.parent!.remove(sceneObject);\n }\n\n private deleteGroup(group: Partial<COMGroup> & { id: string }): void {\n const sceneObject = this.GetSceneObject<DIVEGroup>(group);\n if (!sceneObject) {\n console.warn(\n `DIVERoot.deleteGroup: Group with id ${group.id} not found`,\n );\n return;\n }\n\n this.detachTransformControls(sceneObject);\n\n for (let i = sceneObject.members.length - 1; i >= 0; i--) {\n this.attach(sceneObject.members[i]);\n }\n\n sceneObject.parent!.remove(sceneObject);\n }\n\n private placeOnFloor(object: Partial<COMEntity> & { id: string }): void {\n const sceneObject = this.GetSceneObject(object);\n if (!sceneObject) return;\n\n (sceneObject as DIVEModel | DIVEPrimitive).PlaceOnFloor();\n }\n\n private setParent(\n object: Partial<COMEntity> & { id: string; parentId: string | null },\n ): void {\n const sceneObject = this.GetSceneObject<DIVESceneObject>(object);\n if (!sceneObject) return;\n\n if (object.parentId !== null) {\n const parent = this.GetSceneObject<DIVESceneObject>({\n id: object.parentId,\n });\n if (!parent) return;\n\n // attach to new parent (if exists in scene)\n parent.attach(sceneObject);\n } else {\n // attach to root if no parent is found\n this.attach(sceneObject);\n }\n }\n\n private detachTransformControls(object: Object3D): void {\n // this is only neccessary due to using the old TransformControls instead of the new DIVEGizmo\n this.findScene(object).children.find((object) => {\n if ('isTransformControls' in object) {\n (object as TransformControls).detach();\n }\n });\n }\n\n private findScene(object: Object3D): DIVEScene {\n if (object.parent !== null) {\n return this.findScene(object.parent);\n }\n return object as DIVEScene;\n }\n}\n","import { AmbientLight, Color, Object3D } from 'three';\nimport { PRODUCT_LAYER_MASK } from '../constant/VisibilityLayerMask';\n\n/**\n * A basic ambient light.\n *\n * Can change the color, intensity, and visibility of the light.\n *\n * @module\n */\n\nexport default class DIVEAmbientLight extends Object3D {\n readonly isDIVELight: true = true;\n readonly isDIVEAmbientLight: true = true;\n\n private _light: AmbientLight;\n\n constructor() {\n super();\n\n this.name = 'DIVEAmbientLight';\n\n this._light = new AmbientLight(0xffffff, 1);\n this._light.layers.mask = PRODUCT_LAYER_MASK;\n this.add(this._light);\n }\n\n public SetColor(color: Color): void {\n this._light.color = color;\n }\n\n public SetIntensity(intensity: number): void {\n this._light.intensity = intensity;\n }\n\n public SetEnabled(enabled: boolean): void {\n this._light.visible = enabled;\n }\n}\n","import {\n PointLight,\n Color,\n SphereGeometry,\n MeshBasicMaterial,\n Mesh,\n FrontSide,\n Object3D,\n} from 'three';\nimport { DIVECommunication } from '../com/Communication';\nimport {\n PRODUCT_LAYER_MASK,\n UI_LAYER_MASK,\n} from '../constant/VisibilityLayerMask';\nimport { DIVEMovable } from '../interface/Movable';\nimport { DIVESelectable } from '../interface/Selectable';\nimport type { TransformControls } from 'three/examples/jsm/controls/TransformControls';\n\n/**\n * A basic point light.\n *\n * Can change the color, intensity, and visibility of the light.\n *\n * Can be moved and selected.\n *\n * @module\n */\n\nexport default class DIVEPointLight\n extends Object3D\n implements DIVESelectable, DIVEMovable\n{\n readonly isDIVELight: true = true;\n readonly isDIVEPointLight: true = true;\n readonly isMovable: true = true;\n readonly isSelectable: true = true;\n\n public gizmo: TransformControls | null = null;\n\n private light: PointLight;\n private mesh: Mesh;\n\n constructor() {\n super();\n\n this.name = 'DIVEPointLight';\n\n this.light = new PointLight(0xffffff, 1);\n\n this.light.layers.mask = PRODUCT_LAYER_MASK;\n\n this.light.castShadow = true;\n this.light.shadow.mapSize.width = 512;\n this.light.shadow.mapSize.height = 512;\n this.add(this.light);\n\n const geoSize = 0.1;\n\n const geometry = new SphereGeometry(\n geoSize,\n geoSize * 320,\n geoSize * 320,\n );\n\n const material = new MeshBasicMaterial({\n color: this.light.color,\n transparent: true,\n opacity: 0.8,\n side: FrontSide,\n });\n\n this.mesh = new Mesh(geometry, material);\n this.mesh.layers.mask = UI_LAYER_MASK;\n\n this.add(this.mesh);\n }\n\n public SetColor(color: Color): void {\n this.light.color = color;\n\n (this.mesh.material as MeshBasicMaterial).color = color;\n }\n\n public SetIntensity(intensity: number): void {\n this.light.intensity = intensity;\n\n (this.mesh.material as MeshBasicMaterial).opacity =\n intensity > 0.8 ? 0.8 : intensity * 0.8;\n }\n\n public SetEnabled(enabled: boolean): void {\n this.light.visible = enabled;\n }\n\n public onMove(): void {\n DIVECommunication.get(this.userData.id)?.PerformAction(\n 'UPDATE_OBJECT',\n { id: this.userData.id, position: this.position },\n );\n }\n\n public onSelect(): void {\n DIVECommunication.get(this.userData.id)?.PerformAction(\n 'SELECT_OBJECT',\n { id: this.userData.id },\n );\n }\n\n public onDeselect(): void {\n DIVECommunication.get(this.userData.id)?.PerformAction(\n 'DESELECT_OBJECT',\n { id: this.userData.id },\n );\n }\n}\n","import { Actions } from './actions/index.ts';\nimport { generateUUID } from 'three/src/math/MathUtils';\nimport { isSelectTool } from '../toolbox/select/SelectTool.ts';\nimport { merge } from 'lodash';\n\n// type imports\nimport { type Color, type MeshStandardMaterial } from 'three';\nimport {\n type COMLight,\n type COMModel,\n type COMEntity,\n type COMPov,\n type COMPrimitive,\n type COMGroup,\n} from './types';\nimport { type DIVEScene } from '../scene/Scene.ts';\nimport type DIVEToolbox from '../toolbox/Toolbox.ts';\nimport type DIVEOrbitControls from '../controls/OrbitControls.ts';\nimport { type DIVEModel } from '../model/Model.ts';\nimport { type DIVEMediaCreator } from '../mediacreator/MediaCreator.ts';\nimport { type DIVERenderer } from '../renderer/Renderer.ts';\nimport { type DIVESelectable } from '../interface/Selectable.ts';\nimport { type DIVEIO } from '../io/IO.ts';\nimport { type DIVEAR } from '../ar/AR.ts';\n\ntype EventListener<Action extends keyof Actions> = (\n payload: Actions[Action]['PAYLOAD'],\n) => void;\n\ntype Unsubscribe = () => boolean;\n\n/**\n * Main class for communicating with DIVE.\n *\n * You can subscribe to actions and perform them from outside and inside DIVE.\n *\n * ```ts\n * import { DIVE } from \"@shopware-ag/dive\";\n *\n * const dive = new DIVE();\n *\n * dive.Communication.Subscribe('GET_ALL_SCENE_DATA', () => {\n * // do something\n * }));\n *\n * dive.Communication.PerformAction('GET_ALL_SCENE_DATA', {});\n * ```\n *\n * @module\n */\n\nexport class DIVECommunication {\n private static __instances: DIVECommunication[] = [];\n\n public static get(id: string): DIVECommunication | undefined {\n const fromComID = this.__instances.find(\n (instance) => instance.id === id,\n );\n if (fromComID) return fromComID;\n return this.__instances.find((instance) =>\n Array.from(instance.registered.values()).find(\n (object) => object.id === id,\n ),\n );\n }\n\n private _id: string;\n public get id(): string {\n return this._id;\n }\n\n private renderer: DIVERenderer;\n private scene: DIVEScene;\n private controller: DIVEOrbitControls;\n private toolbox: DIVEToolbox;\n\n private _mediaGenerator: DIVEMediaCreator | null;\n private get mediaGenerator(): DIVEMediaCreator {\n if (!this._mediaGenerator) {\n const DIVEMediaCreator = require('../mediacreator/MediaCreator.ts')\n .DIVEMediaCreator as typeof import('../mediacreator/MediaCreator.ts').DIVEMediaCreator;\n this._mediaGenerator = new DIVEMediaCreator(\n this.renderer,\n this.scene,\n this.controller,\n );\n }\n return this._mediaGenerator;\n }\n\n private _io: DIVEIO | null;\n private get io(): DIVEIO {\n if (!this._io) {\n const DIVEIO = require('../io/IO.ts')\n .DIVEIO as typeof import('../io/IO.ts').DIVEIO;\n this._io = new DIVEIO(this.scene);\n }\n return this._io;\n }\n\n private _ar: DIVEAR | null;\n private get ar(): DIVEAR {\n if (!this._ar) {\n const DIVEAR = require('../ar/AR.ts')\n .DIVEAR as typeof import('../ar/AR.ts').DIVEAR;\n this._ar = new DIVEAR(this.renderer, this.scene, this.controller);\n }\n return this._ar;\n }\n\n private registered: Map<string, COMEntity> = new Map();\n\n // private listeners: { [key: string]: EventListener[] } = {};\n private listeners: Map<keyof Actions, EventListener<keyof Actions>[]> =\n new Map();\n\n constructor(\n renderer: DIVERenderer,\n scene: DIVEScene,\n controls: DIVEOrbitControls,\n toolbox: DIVEToolbox,\n ) {\n this._id = generateUUID();\n this.renderer = renderer;\n this.scene = scene;\n this.controller = controls;\n this.toolbox = toolbox;\n this._mediaGenerator = null;\n this._io = null;\n this._ar = null;\n\n DIVECommunication.__instances.push(this);\n }\n\n public DestroyInstance(): boolean {\n const existingIndex = DIVECommunication.__instances.findIndex(\n (entry) => entry.id === this.id,\n );\n if (existingIndex === -1) return false;\n DIVECommunication.__instances.splice(existingIndex, 1);\n return true;\n }\n\n public PerformAction<Action extends keyof Actions>(\n action: Action,\n payload: Actions[Action]['PAYLOAD'],\n ): Actions[Action]['RETURN'] {\n let returnValue: Actions[Action]['RETURN'] = false;\n\n switch (action) {\n case 'GET_ALL_SCENE_DATA': {\n returnValue = this.getAllSceneData(\n payload as Actions['GET_ALL_SCENE_DATA']['PAYLOAD'],\n );\n break;\n }\n case 'GET_ALL_OBJECTS': {\n returnValue = this.getAllObjects(\n payload as Actions['GET_ALL_OBJECTS']['PAYLOAD'],\n );\n break;\n }\n case 'GET_OBJECTS': {\n returnValue = this.getObjects(\n payload as Actions['GET_OBJECTS']['PAYLOAD'],\n );\n break;\n }\n case 'ADD_OBJECT': {\n returnValue = this.addObject(\n payload as Actions['ADD_OBJECT']['PAYLOAD'],\n );\n break;\n }\n case 'UPDATE_OBJECT': {\n returnValue = this.updateObject(\n payload as Actions['UPDATE_OBJECT']['PAYLOAD'],\n );\n break;\n }\n case 'DELETE_OBJECT': {\n returnValue = this.deleteObject(\n payload as Actions['DELETE_OBJECT']['PAYLOAD'],\n );\n break;\n }\n case 'SELECT_OBJECT': {\n returnValue = this.selectObject(\n payload as Actions['SELECT_OBJECT']['PAYLOAD'],\n );\n break;\n }\n case 'DESELECT_OBJECT': {\n returnValue = this.deselectObject(\n payload as Actions['DESELECT_OBJECT']['PAYLOAD'],\n );\n break;\n }\n case 'SET_BACKGROUND': {\n returnValue = this.setBackground(\n payload as Actions['SET_BACKGROUND']['PAYLOAD'],\n );\n break;\n }\n case 'DROP_IT': {\n returnValue = this.dropIt(\n payload as Actions['DROP_IT']['PAYLOAD'],\n );\n break;\n }\n case 'PLACE_ON_FLOOR': {\n returnValue = this.placeOnFloor(\n payload as Actions['PLACE_ON_FLOOR']['PAYLOAD'],\n );\n break;\n }\n case 'SET_CAMERA_TRANSFORM': {\n returnValue = this.setCameraTransform(\n payload as Actions['SET_CAMERA_TRANSFORM']['PAYLOAD'],\n );\n break;\n }\n case 'GET_CAMERA_TRANSFORM': {\n returnValue = this.getCameraTransform(\n payload as Actions['GET_CAMERA_TRANSFORM']['PAYLOAD'],\n );\n break;\n }\n case 'MOVE_CAMERA': {\n returnValue = this.moveCamera(\n payload as Actions['MOVE_CAMERA']['PAYLOAD'],\n );\n break;\n }\n case 'RESET_CAMERA': {\n returnValue = this.resetCamera(\n payload as Actions['RESET_CAMERA']['PAYLOAD'],\n );\n break;\n }\n case 'COMPUTE_ENCOMPASSING_VIEW': {\n returnValue = this.computeEncompassingView(\n payload as Actions['COMPUTE_ENCOMPASSING_VIEW']['PAYLOAD'],\n );\n break;\n }\n case 'SET_CAMERA_LAYER': {\n returnValue = this.setCameraLayer(\n payload as Actions['SET_CAMERA_LAYER']['PAYLOAD'],\n );\n break;\n }\n case 'ZOOM_CAMERA': {\n returnValue = this.zoomCamera(\n payload as Actions['ZOOM_CAMERA']['PAYLOAD'],\n );\n break;\n }\n case 'SET_GIZMO_MODE': {\n returnValue = this.setGizmoMode(\n payload as Actions['SET_GIZMO_MODE']['PAYLOAD'],\n );\n break;\n }\n case 'SET_GIZMO_VISIBILITY': {\n returnValue = this.setGizmoVisibility(\n payload as Actions['SET_GIZMO_VISIBILITY']['PAYLOAD'],\n );\n break;\n }\n case 'USE_TOOL': {\n returnValue = this.useTool(\n payload as Actions['USE_TOOL']['PAYLOAD'],\n );\n break;\n }\n case 'MODEL_LOADED': {\n returnValue = this.modelLoaded(\n payload as Actions['MODEL_LOADED']['PAYLOAD'],\n );\n break;\n }\n case 'UPDATE_SCENE': {\n returnValue = this.updateScene(\n payload as Actions['UPDATE_SCENE']['PAYLOAD'],\n );\n break;\n }\n case 'GENERATE_MEDIA': {\n returnValue = this.generateMedia(\n payload as Actions['GENERATE_MEDIA']['PAYLOAD'],\n );\n break;\n }\n case 'SET_PARENT': {\n returnValue = this.setParent(\n payload as Actions['SET_PARENT']['PAYLOAD'],\n );\n break;\n }\n case 'EXPORT_SCENE': {\n returnValue = this.exportScene(\n payload as Actions['EXPORT_SCENE']['PAYLOAD'],\n );\n break;\n }\n case 'LAUNCH_AR': {\n returnValue = this.ar.Launch(\n payload as Actions['LAUNCH_AR']['PAYLOAD'],\n );\n break;\n }\n default: {\n console.warn(\n `DIVECommunication.PerformAction: has been executed with unknown Action type ${action}`,\n );\n }\n }\n\n this.dispatch(action, payload);\n\n return returnValue;\n }\n\n public Subscribe<Action extends keyof Actions>(\n type: Action,\n listener: EventListener<Action>,\n ): Unsubscribe {\n if (!this.listeners.get(type)) this.listeners.set(type, []);\n\n // casting to any because of typescript not finding between Action and typeof Actions being equal in this case\n this.listeners\n .get(type)!\n .push(listener as EventListener<keyof Actions>);\n\n return () => {\n const listenerArray = this.listeners.get(type);\n if (!listenerArray) return false;\n\n const existingIndex = listenerArray.findIndex(\n (entry) => entry === listener,\n );\n if (existingIndex === -1) return false;\n\n listenerArray.splice(existingIndex, 1);\n return true;\n };\n }\n\n private dispatch<Action extends keyof Actions>(\n type: Action,\n payload: Actions[Action]['PAYLOAD'],\n ): void {\n const listenerArray = this.listeners.get(type);\n if (!listenerArray) return;\n\n listenerArray.forEach((listener) => listener(payload));\n }\n\n private getAllSceneData(\n payload: Actions['GET_ALL_SCENE_DATA']['PAYLOAD'],\n ): Actions['GET_ALL_SCENE_DATA']['RETURN'] {\n const sceneData = {\n name: this.scene.name,\n mediaItem: null,\n backgroundColor:\n '#' + (this.scene.background as Color).getHexString(),\n floorEnabled: this.scene.Floor.visible,\n floorColor:\n '#' +\n (\n this.scene.Floor.material as MeshStandardMaterial\n ).color.getHexString(),\n userCamera: {\n position: this.controller.object.position.clone(),\n target: this.controller.target.clone(),\n },\n spotmarks: [],\n lights: Array.from(this.registered.values()).filter(\n (object) => object.entityType === 'light',\n ) as COMLight[],\n objects: Array.from(this.registered.values()).filter(\n (object) => object.entityType === 'model',\n ) as COMModel[],\n cameras: Array.from(this.registered.values()).filter(\n (object) => object.entityType === 'pov',\n ) as COMPov[],\n primitives: Array.from(this.registered.values()).filter(\n (object) => object.entityType === 'primitive',\n ) as COMPrimitive[],\n groups: Array.from(this.registered.values()).filter(\n (object) => object.entityType === 'group',\n ) as COMGroup[],\n };\n Object.assign(payload, sceneData);\n return sceneData;\n }\n\n private getAllObjects(\n payload: Actions['GET_ALL_OBJECTS']['PAYLOAD'],\n ): Actions['GET_ALL_OBJECTS']['RETURN'] {\n Object.assign(payload, this.registered);\n return this.registered;\n }\n\n private getObjects(\n payload: Actions['GET_OBJECTS']['PAYLOAD'],\n ): Actions['GET_OBJECTS']['RETURN'] {\n if (payload.ids.length === 0) return [];\n\n const objects: COMEntity[] = [];\n this.registered.forEach((object) => {\n if (!payload.ids.includes(object.id)) return;\n objects.push(object);\n });\n\n return objects;\n }\n\n private addObject(\n payload: Actions['ADD_OBJECT']['PAYLOAD'],\n ): Actions['ADD_OBJECT']['RETURN'] {\n if (this.registered.get(payload.id)) return false;\n\n if (payload.parentId === undefined) payload.parentId = null;\n\n this.registered.set(payload.id, payload);\n\n this.scene.AddSceneObject(payload);\n\n return true;\n }\n\n private updateObject(\n payload: Actions['UPDATE_OBJECT']['PAYLOAD'],\n ): Actions['UPDATE_OBJECT']['RETURN'] {\n const objectToUpdate = this.registered.get(payload.id);\n if (!objectToUpdate) return false;\n\n this.registered.set(payload.id, merge(objectToUpdate, payload));\n\n const updatedObject = this.registered.get(payload.id)!;\n this.scene.UpdateSceneObject({\n ...payload,\n id: updatedObject.id,\n entityType: updatedObject.entityType,\n });\n\n Object.assign(payload, updatedObject);\n\n return true;\n }\n\n private deleteObject(\n payload: Actions['DELETE_OBJECT']['PAYLOAD'],\n ): Actions['DELETE_OBJECT']['RETURN'] {\n const deletedObject = this.registered.get(payload.id);\n if (!deletedObject) return false;\n\n // If the object has a parent, detach it first\n if (deletedObject.parentId) {\n // First detach from parent group\n this.setParent({\n object: { id: deletedObject.id },\n parent: null,\n });\n }\n\n // If deleting a group, update all children to have no parent\n if (deletedObject.entityType === 'group') {\n this.registered.forEach((object) => {\n if (object.parentId === deletedObject.id) {\n this.updateObject({\n id: object.id,\n parentId: null,\n });\n }\n });\n }\n\n // copy object to payload to use later\n Object.assign(payload, deletedObject);\n\n this.registered.delete(payload.id);\n\n // detach all children from parent if we delete a group\n Array.from(this.registered.values()).forEach((object) => {\n if (!object.parentId) return;\n if (object.parentId !== payload.id) return;\n object.parentId = null;\n });\n\n this.scene.DeleteSceneObject(deletedObject);\n\n return true;\n }\n\n private selectObject(\n payload: Actions['SELECT_OBJECT']['PAYLOAD'],\n ): Actions['SELECT_OBJECT']['RETURN'] {\n const object = this.registered.get(payload.id);\n if (!object) return false;\n\n const sceneObject = this.scene.GetSceneObject(object);\n if (!sceneObject) return false;\n\n if (!('isSelectable' in sceneObject)) return false;\n\n const activeTool = this.toolbox.GetActiveTool();\n if (activeTool && isSelectTool(activeTool)) {\n activeTool.AttachGizmo(sceneObject as DIVESelectable);\n }\n\n // copy object to payload to use later\n Object.assign(payload, object);\n\n return true;\n }\n\n private deselectObject(\n payload: Actions['DESELECT_OBJECT']['PAYLOAD'],\n ): Actions['DESELECT_OBJECT']['RETURN'] {\n const object = this.registered.get(payload.id);\n if (!object) return false;\n\n const sceneObject = this.scene.GetSceneObject(object);\n if (!sceneObject) return false;\n\n if (!('isSelectable' in sceneObject)) return false;\n\n const activeTool = this.toolbox.GetActiveTool();\n if (activeTool && isSelectTool(activeTool)) {\n activeTool.DetachGizmo();\n }\n\n // copy object to payload to use later\n Object.assign(payload, object);\n\n return true;\n }\n\n private setBackground(\n payload: Actions['SET_BACKGROUND']['PAYLOAD'],\n ): Actions['SET_BACKGROUND']['RETURN'] {\n this.scene.SetBackground(payload.color);\n\n return true;\n }\n\n private dropIt(\n payload: Actions['DROP_IT']['PAYLOAD'],\n ): Actions['DROP_IT']['RETURN'] {\n const object = this.registered.get(payload.id);\n if (!object) return false;\n\n const model = this.scene.GetSceneObject(object) as DIVEModel;\n model.DropIt();\n\n return true;\n }\n\n private placeOnFloor(\n payload: Actions['PLACE_ON_FLOOR']['PAYLOAD'],\n ): Actions['PLACE_ON_FLOOR']['RETURN'] {\n const object = this.registered.get(payload.id);\n if (!object) return false;\n\n this.scene.PlaceOnFloor(object);\n\n return true;\n }\n\n private setCameraTransform(\n payload: Actions['SET_CAMERA_TRANSFORM']['PAYLOAD'],\n ): Actions['SET_CAMERA_TRANSFORM']['RETURN'] {\n this.controller.object.position.copy(payload.position);\n this.controller.target.copy(payload.target);\n this.controller.update();\n\n return true;\n }\n\n private getCameraTransform(\n payload: Actions['GET_CAMERA_TRANSFORM']['PAYLOAD'],\n ): Actions['GET_CAMERA_TRANSFORM']['RETURN'] {\n const transform = {\n position: this.controller.object.position.clone(),\n target: this.controller.target.clone(),\n };\n Object.assign(payload, transform);\n\n return transform;\n }\n\n private moveCamera(\n payload: Actions['MOVE_CAMERA']['PAYLOAD'],\n ): Actions['MOVE_CAMERA']['RETURN'] {\n let position = { x: 0, y: 0, z: 0 };\n let target = { x: 0, y: 0, z: 0 };\n if ('id' in payload) {\n position = (this.registered.get(payload.id) as COMPov).position;\n target = (this.registered.get(payload.id) as COMPov).target;\n } else {\n position = payload.position;\n target = payload.target;\n }\n this.controller.MoveTo(\n position,\n target,\n payload.duration,\n payload.locked,\n );\n\n return true;\n }\n\n private setCameraLayer(\n payload: Actions['SET_CAMERA_LAYER']['PAYLOAD'],\n ): Actions['SET_CAMERA_LAYER']['RETURN'] {\n this.controller.object.SetCameraLayer(payload.layer);\n\n return true;\n }\n\n private resetCamera(\n payload: Actions['RESET_CAMERA']['PAYLOAD'],\n ): Actions['RESET_CAMERA']['RETURN'] {\n this.controller.RevertLast(payload.duration);\n\n return true;\n }\n\n private computeEncompassingView(\n payload: Actions['COMPUTE_ENCOMPASSING_VIEW']['PAYLOAD'],\n ): Actions['COMPUTE_ENCOMPASSING_VIEW']['RETURN'] {\n const sceneBB = this.scene.ComputeSceneBB();\n\n const transform = this.controller.ComputeEncompassingView(sceneBB);\n Object.assign(payload, transform);\n\n return transform;\n }\n\n private zoomCamera(\n payload: Actions['ZOOM_CAMERA']['PAYLOAD'],\n ): Actions['ZOOM_CAMERA']['RETURN'] {\n if (payload.direction === 'IN') this.controller.ZoomIn(payload.by);\n if (payload.direction === 'OUT') this.controller.ZoomOut(payload.by);\n\n return true;\n }\n\n private setGizmoMode(\n payload: Actions['SET_GIZMO_MODE']['PAYLOAD'],\n ): Actions['SET_GIZMO_MODE']['RETURN'] {\n this.toolbox.SetGizmoMode(payload.mode);\n return true;\n }\n\n private setGizmoVisibility(\n payload: Actions['SET_GIZMO_VISIBILITY']['PAYLOAD'],\n ): Actions['SET_GIZMO_VISIBILITY']['RETURN'] {\n this.toolbox.SetGizmoVisibility(payload);\n return payload;\n }\n\n private useTool(\n payload: Actions['USE_TOOL']['PAYLOAD'],\n ): Actions['USE_TOOL']['RETURN'] {\n this.toolbox.UseTool(payload.tool);\n return true;\n }\n\n private modelLoaded(\n payload: Actions['MODEL_LOADED']['PAYLOAD'],\n ): Actions['MODEL_LOADED']['RETURN'] {\n (this.registered.get(payload.id) as COMModel).loaded = true;\n return true;\n }\n\n private updateScene(\n payload: Actions['UPDATE_SCENE']['PAYLOAD'],\n ): Actions['UPDATE_SCENE']['RETURN'] {\n if (payload.name !== undefined) this.scene.name = payload.name;\n if (payload.backgroundColor !== undefined)\n this.scene.SetBackground(payload.backgroundColor);\n\n if (payload.gridEnabled !== undefined)\n this.scene.Grid.SetVisibility(payload.gridEnabled);\n\n if (payload.floorEnabled !== undefined)\n this.scene.Floor.SetVisibility(payload.floorEnabled);\n if (payload.floorColor !== undefined)\n this.scene.Floor.SetColor(payload.floorColor);\n\n // fill payload with current values\n // TODO optmize this\n payload.name = this.scene.name;\n payload.backgroundColor =\n '#' + (this.scene.background as Color).getHexString();\n payload.gridEnabled = this.scene.Grid.visible;\n payload.floorEnabled = this.scene.Floor.visible;\n payload.floorColor =\n '#' +\n (\n this.scene.Floor.material as MeshStandardMaterial\n ).color.getHexString();\n\n return true;\n }\n\n private generateMedia(\n payload: Actions['GENERATE_MEDIA']['PAYLOAD'],\n ): Actions['GENERATE_MEDIA']['RETURN'] {\n let position = { x: 0, y: 0, z: 0 };\n let target = { x: 0, y: 0, z: 0 };\n if ('id' in payload) {\n position = (this.registered.get(payload.id) as COMPov).position;\n target = (this.registered.get(payload.id) as COMPov).target;\n } else {\n position = payload.position;\n target = payload.target;\n }\n\n payload.dataUri = this.mediaGenerator.GenerateMedia(\n position,\n target,\n payload.width,\n payload.height,\n );\n\n return true;\n }\n\n private setParent(\n payload: Actions['SET_PARENT']['PAYLOAD'],\n ): Actions['SET_PARENT']['RETURN'] {\n const object = this.registered.get(payload.object.id);\n if (!object) return false;\n\n const sceneObject = this.scene.GetSceneObject(object);\n if (!sceneObject) return false;\n\n if (payload.parent === null) {\n // detach from current parent\n this.scene.Root.attach(sceneObject);\n // Update registration to reflect no parent\n this.updateObject({\n id: object.id,\n parentId: null,\n });\n return true;\n }\n\n if (payload.object.id === payload.parent.id) {\n // cannot attach object to itself\n return false;\n }\n\n const parent = this.registered.get(payload.parent.id);\n if (!parent) {\n // detach from current parent\n this.scene.Root.attach(sceneObject);\n // Update registration to reflect no parent\n this.updateObject({\n id: object.id,\n parentId: null,\n });\n return true;\n }\n\n // attach to new parent\n const parentObject = this.scene.GetSceneObject(parent);\n if (!parentObject) {\n // detach from current parent\n this.scene.Root.attach(sceneObject);\n // Update registration to reflect no parent\n this.updateObject({\n id: object.id,\n parentId: null,\n });\n return true;\n }\n\n // attach to new parent\n parentObject.attach(sceneObject);\n // Update registration to reflect new parent\n this.updateObject({\n id: object.id,\n parentId: parent.id,\n });\n return true;\n }\n\n private exportScene(\n payload: Actions['EXPORT_SCENE']['PAYLOAD'],\n ): Actions['EXPORT_SCENE']['RETURN'] {\n return this.io.Export(payload.type);\n }\n}\n\nexport type { Actions } from './actions/index.ts';\n","import { PRODUCT_LAYER_MASK } from '../constant/VisibilityLayerMask.ts';\nimport { Color, DirectionalLight, HemisphereLight, Object3D } from 'three';\n\n/**\n * A complex scene light.\n *\n * Can change the color, intensity, and visibility of the light.\n *\n * @module\n */\n\nexport default class DIVESceneLight extends Object3D {\n readonly isDIVELight: true = true;\n readonly isDIVESceneLight: true = true;\n\n private _hemiLight: HemisphereLight;\n private _dirLight: DirectionalLight;\n\n constructor() {\n super();\n\n this.name = 'DIVESceneLight';\n\n this._hemiLight = new HemisphereLight(0xffffff, 0xffffff, 2);\n this._hemiLight.layers.mask = PRODUCT_LAYER_MASK;\n this._hemiLight.position.set(0, 50, 0);\n this.add(this._hemiLight);\n\n this._dirLight = new DirectionalLight(0xffffff, 3);\n this._dirLight.layers.mask = PRODUCT_LAYER_MASK;\n this._dirLight.position.set(1, 1.75, 1);\n this._dirLight.position.multiplyScalar(30);\n this._dirLight.castShadow = true;\n\n this._dirLight.shadow.mapSize.width = 2048;\n this._dirLight.shadow.mapSize.height = 2048;\n\n const d = 5;\n\n this._dirLight.shadow.camera.left = -d;\n this._dirLight.shadow.camera.right = d;\n this._dirLight.shadow.camera.top = d;\n this._dirLight.shadow.camera.bottom = -d;\n\n this._dirLight.shadow.camera.far = 3500;\n this.add(this._dirLight);\n }\n\n public SetColor(color: Color): void {\n this._hemiLight.color = color;\n this._dirLight.color = color;\n }\n\n public SetIntensity(intensity: number): void {\n this._hemiLight.intensity = intensity * 2;\n this._dirLight.intensity = intensity * 3;\n }\n\n public SetEnabled(enabled: boolean): void {\n this._hemiLight.visible = enabled;\n this._dirLight.visible = enabled;\n }\n}\n","import { Mesh, MeshStandardMaterial, Raycaster, Vector3 } from 'three';\nimport { PRODUCT_LAYER_MASK } from '../constant/VisibilityLayerMask';\nimport type { GLTF } from 'three/examples/jsm/loaders/GLTFLoader';\nimport { findSceneRecursive } from '../helper/findSceneRecursive/findSceneRecursive';\nimport { type COMMaterial } from '../com/types';\nimport { DIVENode } from '../node/Node';\nimport { DIVECommunication } from '../com/Communication';\n\n/**\n * A basic model class.\n *\n * It does calculate it's own bounding box which is used for positioning on the floor.\n *\n * Can be moved and selected.\n *\n * @module\n */\n\nexport class DIVEModel extends DIVENode {\n readonly isDIVEModel: true = true;\n\n private _mesh: Mesh | null = null;\n private _material: MeshStandardMaterial | null = null;\n\n public SetModel(gltf: GLTF): void {\n this.clear();\n this._boundingBox.makeEmpty();\n\n gltf.scene.traverse((child) => {\n child.castShadow = true;\n child.receiveShadow = true;\n\n child.layers.mask = this.layers.mask;\n this._boundingBox.expandByObject(child);\n\n // only search for first mesh for now\n if (!this._mesh && 'isMesh' in child) {\n this._mesh = child as Mesh;\n\n // if the material is already set, use it, otherwise set it from the model's material\n if (this._material) {\n this._mesh.material = this._material;\n } else {\n this._material = (child as Mesh)\n .material as MeshStandardMaterial;\n }\n }\n });\n\n this.add(gltf.scene);\n }\n\n public SetMaterial(material: Partial<COMMaterial>): void {\n // if there is no material, create a new one\n if (!this._material) {\n this._material = new MeshStandardMaterial();\n }\n\n if (material.vertexColors !== undefined) {\n this._material.vertexColors = material.vertexColors;\n }\n\n // apply color if supplied\n if (material.color !== undefined) {\n this._material.color.set(material.color);\n }\n\n // apply albedo map if supplied\n if (material.map !== undefined) {\n this._material.map = material.map;\n }\n\n // apply normal map\n if (material.normalMap !== undefined) {\n this._material.normalMap = material.normalMap;\n }\n\n // set roughness value\n // if supplied, apply roughness map\n // if we applied a roughness map, set roughness to 1.0\n if (material.roughness !== undefined) {\n this._material.roughness = material.roughness;\n }\n\n if (material.roughnessMap !== undefined) {\n this._material.roughnessMap = material.roughnessMap;\n\n if (this._material.roughnessMap) {\n this._material.roughness = 1.0;\n }\n }\n\n // set metalness value\n // if supplied, apply metalness map\n // if we applied a metalness map, set metalness to 1.0\n if (material.metalness !== undefined) {\n this._material.metalness = material.metalness;\n }\n\n if (material.metalnessMap !== undefined) {\n this._material.metalnessMap = material.metalnessMap;\n\n if (this._material.metalnessMap) {\n this._material.metalness = 1.0;\n }\n }\n\n // if the mesh is already set, update the material\n if (this._mesh) {\n this._mesh.material = this._material;\n }\n }\n\n public PlaceOnFloor(): void {\n // calculate and temporary save world position\n const worldPos = this.getWorldPosition(this._positionWorldBuffer);\n const oldWorldPos = worldPos.clone();\n\n // compute the bounding box\n this._mesh?.geometry?.computeBoundingBox();\n const meshBB = this._mesh?.geometry?.boundingBox;\n\n // subtract the bounding box min y axis value from the world position y value\n if (!meshBB || !this._mesh) return;\n worldPos.y = worldPos.y - this._mesh.localToWorld(meshBB.min.clone()).y;\n\n // skip any action when the position did not change\n if (worldPos.y === oldWorldPos.y) return;\n\n DIVECommunication.get(this.userData.id)?.PerformAction(\n 'UPDATE_OBJECT',\n {\n id: this.userData.id,\n position: worldPos,\n rotation: this.rotation,\n scale: this.scale,\n },\n );\n }\n\n public DropIt(): void {\n if (!this.parent) {\n console.warn(\n 'DIVEModel: DropIt() called on a model that is not in the scene.',\n this,\n );\n return;\n }\n\n // calculate the bottom center of the bounding box\n const bottomY = this._boundingBox.min.y * this.scale.y;\n const bbBottomCenter = this.localToWorld(\n this._boundingBox.getCenter(new Vector3()).multiply(this.scale),\n );\n bbBottomCenter.y = bottomY + this.position.y;\n\n // set up raycaster and raycast all scene objects (product layer)\n const raycaster = new Raycaster(bbBottomCenter, new Vector3(0, -1, 0));\n raycaster.layers.mask = PRODUCT_LAYER_MASK;\n const intersections = raycaster.intersectObjects(\n findSceneRecursive(this).Root.children,\n true,\n );\n\n // if we hit something, move the model to the top on the hit object's bounding box\n if (intersections.length > 0) {\n const mesh = intersections[0].object as Mesh;\n mesh.geometry.computeBoundingBox();\n const meshBB = mesh.geometry.boundingBox!;\n const worldPos = mesh.localToWorld(meshBB.max.clone());\n\n const oldPos = this.position.clone();\n const newPos = this.position\n .clone()\n .setY(worldPos.y)\n .sub(new Vector3(0, bottomY, 0));\n this.position.copy(newPos);\n\n // if the position changed, update the object in communication\n if (this.position.y === oldPos.y) return;\n\n this.onMove();\n }\n }\n}\n","import { type Object3D } from 'three';\nimport { type DIVEScene } from '../../scene/Scene';\n\n/**\n * Find the scene object of an object.\n *\n * @param object - The object to find the scene of.\n * @returns The scene object.\n */\n\nexport const findSceneRecursive = (object: Object3D): DIVEScene => {\n if (object.parent) {\n return findSceneRecursive(object.parent);\n }\n return object as DIVEScene;\n};\n","import { Box3, Object3D, Vector3, type Vector3Like } from 'three';\nimport { PRODUCT_LAYER_MASK } from '../constant/VisibilityLayerMask';\nimport { DIVECommunication } from '../com/Communication';\n\nimport { type DIVEMovable } from '../interface/Movable';\nimport { type DIVESelectable } from '../interface/Selectable';\nimport { type TransformControls } from 'three/examples/jsm/controls/TransformControls';\nimport { type DIVEGroup } from '../group/Group';\n\nexport class DIVENode extends Object3D implements DIVESelectable, DIVEMovable {\n readonly isDIVENode: true = true;\n readonly isSelectable: true = true;\n readonly isMovable: true = true;\n\n public gizmo: TransformControls | null = null;\n\n protected _positionWorldBuffer: Vector3;\n protected _boundingBox: Box3;\n\n constructor() {\n super();\n\n this.layers.mask = PRODUCT_LAYER_MASK;\n\n this._positionWorldBuffer = new Vector3();\n this._boundingBox = new Box3();\n }\n\n public SetPosition(position: Vector3Like): void {\n // if there is no parent, the object will be attached later and keep it's world position\n if (!this.parent) {\n this.position.set(position.x, position.y, position.z);\n return;\n }\n\n // if we have a parent, we have to calculate the position in the parent's coordinate system to keep the world position\n const newPosition = new Vector3(position.x, position.y, position.z);\n this.position.copy(this.parent.worldToLocal(newPosition));\n\n if ('isDIVEGroup' in this.parent) {\n (this.parent as unknown as DIVEGroup).UpdateLineTo(this);\n }\n }\n\n public SetRotation(rotation: Vector3Like): void {\n this.rotation.set(rotation.x, rotation.y, rotation.z);\n }\n\n public SetScale(scale: Vector3Like): void {\n this.scale.set(scale.x, scale.y, scale.z);\n }\n\n public SetVisibility(visible: boolean): void {\n this.visible = visible;\n }\n\n public SetToWorldOrigin(): void {\n this.position.set(0, 0, 0);\n DIVECommunication.get(this.userData.id)?.PerformAction(\n 'UPDATE_OBJECT',\n {\n id: this.userData.id,\n position: this.getWorldPosition(this._positionWorldBuffer),\n rotation: this.rotation,\n scale: this.scale,\n },\n );\n }\n\n /**\n * Can be called when the object is moved from a foreign object (gizmo, parent, etc.) to update the object's position.\n */\n public onMove(): void {\n DIVECommunication.get(this.userData.id)?.PerformAction(\n 'UPDATE_OBJECT',\n {\n id: this.userData.id,\n position: this.getWorldPosition(this._positionWorldBuffer),\n rotation: this.rotation,\n scale: this.scale,\n },\n );\n }\n\n public onSelect(): void {\n DIVECommunication.get(this.userData.id)?.PerformAction(\n 'SELECT_OBJECT',\n { id: this.userData.id },\n );\n }\n\n public onDeselect(): void {\n DIVECommunication.get(this.userData.id)?.PerformAction(\n 'DESELECT_OBJECT',\n { id: this.userData.id },\n );\n }\n}\n","import { DRACOLoader } from 'three/examples/jsm/loaders/DRACOLoader';\nimport { GLTF, GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader';\n\n/**\n * A basic loading manager.\n *\n * @module\n */\n\nexport class DIVELoadingManager {\n private gltfloader: GLTFLoader;\n private dracoloader: DRACOLoader;\n // ... maybe extend with other loaders later\n\n constructor() {\n this.gltfloader = new GLTFLoader();\n this.dracoloader = new DRACOLoader();\n this.dracoloader.setDecoderPath(\n 'https://www.gstatic.com/draco/v1/decoders/',\n );\n this.gltfloader.setDRACOLoader(this.dracoloader);\n }\n\n private progress: Map<string, number> = new Map<string, number>();\n\n public async LoadGLTF(uri: string): Promise<GLTF> {\n const progEvent = (p: ProgressEvent<EventTarget>): void => {\n this.progress.set(uri, p.loaded / p.total);\n };\n\n this.progress.set(uri, 0);\n\n return new Promise<GLTF>((resolve, reject) => {\n this.gltfloader\n .loadAsync(uri, progEvent)\n .then(resolve)\n .catch(reject);\n });\n }\n\n public PollProgress(): number {\n let total = 0;\n this.progress.forEach((progress: number) => {\n total += progress;\n });\n\n if (this.progress.size === 0) return 1;\n return total / this.progress.size;\n }\n}\n","import {\n BoxGeometry,\n BufferAttribute,\n BufferGeometry,\n Color,\n ConeGeometry,\n CylinderGeometry,\n Mesh,\n MeshStandardMaterial,\n Raycaster,\n SphereGeometry,\n Vector3,\n} from 'three';\nimport { PRODUCT_LAYER_MASK } from '../constant/VisibilityLayerMask';\nimport { findSceneRecursive } from '../helper/findSceneRecursive/findSceneRecursive';\nimport { DIVENode } from '../node/Node';\nimport { type COMGeometry, type COMMaterial } from '../com/types';\nimport { DIVECommunication } from '../com/Communication';\n\n/**\n * A basic model class.\n *\n * It does calculate it's own bounding box which is used for positioning on the floor.\n *\n * Can be moved and selected.\n *\n * @module\n */\nexport class DIVEPrimitive extends DIVENode {\n readonly isDIVEPrimitive: true = true;\n\n private _mesh: Mesh;\n\n constructor() {\n super();\n\n this._mesh = new Mesh();\n this._mesh.layers.mask = PRODUCT_LAYER_MASK;\n this._mesh.castShadow = true;\n this._mesh.receiveShadow = true;\n this._mesh.material = new MeshStandardMaterial();\n this.add(this._mesh);\n }\n\n public SetGeometry(geometry: COMGeometry): void {\n const geo = this.assembleGeometry(geometry);\n if (!geo) return;\n\n this._mesh.geometry = geo;\n this._boundingBox.setFromObject(this._mesh);\n }\n\n public SetMaterial(material: Partial<COMMaterial>): void {\n const primitiveMaterial = this._mesh.material as MeshStandardMaterial;\n\n if (material.vertexColors !== undefined) {\n primitiveMaterial.vertexColors = material.vertexColors;\n }\n\n // apply color if supplied\n if (material.color !== undefined) {\n primitiveMaterial.color = new Color(material.color);\n }\n\n // apply albedo map if supplied\n if (material.map !== undefined) {\n primitiveMaterial.map = material.map;\n }\n\n // apply normal map\n if (material.normalMap !== undefined) {\n primitiveMaterial.normalMap = material.normalMap;\n }\n\n // set roughness value\n // if supplied, apply roughness map\n // if we applied a roughness map, set roughness to 1.0\n if (material.roughness !== undefined) {\n primitiveMaterial.roughness = material.roughness;\n }\n\n if (material.roughnessMap !== undefined) {\n primitiveMaterial.roughnessMap = material.roughnessMap;\n\n if (primitiveMaterial.roughnessMap) {\n primitiveMaterial.roughness = 1.0;\n }\n }\n\n // set metalness value\n // if supplied, apply metalness map\n // if we applied a metalness map, set metalness to 1.0\n if (material.metalness !== undefined) {\n primitiveMaterial.metalness = material.metalness;\n }\n\n if (material.metalnessMap !== undefined) {\n primitiveMaterial.metalnessMap = material.metalnessMap;\n\n if (primitiveMaterial.metalnessMap) {\n primitiveMaterial.metalness = 0.0;\n }\n }\n\n // if the mesh is already set, update the material\n if (this._mesh) this._mesh.material = primitiveMaterial;\n }\n\n public PlaceOnFloor(): void {\n // calculate and temporary save world position\n const worldPos = this.getWorldPosition(this._positionWorldBuffer);\n const oldWorldPos = worldPos.clone();\n\n // compute the bounding box\n this._mesh?.geometry?.computeBoundingBox();\n const meshBB = this._mesh?.geometry?.boundingBox;\n\n // subtract the bounding box min y axis value from the world position y value\n if (!meshBB || !this._mesh) return;\n worldPos.y = worldPos.y - this._mesh.localToWorld(meshBB.min.clone()).y;\n\n // skip any action when the position did not change\n if (worldPos.y === oldWorldPos.y) return;\n\n DIVECommunication.get(this.userData.id)?.PerformAction(\n 'UPDATE_OBJECT',\n {\n id: this.userData.id,\n position: worldPos,\n rotation: this.rotation,\n scale: this.scale,\n },\n );\n }\n\n public DropIt(): void {\n if (!this.parent) {\n console.warn(\n 'DIVEPrimitive: DropIt() called on a model that is not in the scene.',\n this,\n );\n return;\n }\n\n // calculate the bottom center of the bounding box\n const bottomY = this._boundingBox.min.y * this.scale.y;\n const bbBottomCenter = this.localToWorld(\n this._boundingBox.getCenter(new Vector3()).multiply(this.scale),\n );\n bbBottomCenter.y = bottomY + this.position.y;\n\n // set up raycaster and raycast all scene objects (product layer)\n const raycaster = new Raycaster(bbBottomCenter, new Vector3(0, -1, 0));\n raycaster.layers.mask = PRODUCT_LAYER_MASK;\n const intersections = raycaster.intersectObjects(\n findSceneRecursive(this).Root.children,\n true,\n );\n\n // if we hit something, move the model to the top on the hit object's bounding box\n if (intersections.length > 0) {\n const mesh = intersections[0].object as Mesh;\n mesh.geometry.computeBoundingBox();\n const meshBB = mesh.geometry.boundingBox!;\n const worldPos = mesh.localToWorld(meshBB.max.clone());\n\n const oldPos = this.position.clone();\n const newPos = this.position\n .clone()\n .setY(worldPos.y)\n .sub(new Vector3(0, bottomY, 0));\n this.position.copy(newPos);\n\n // if the position changed, update the object in communication\n if (this.position.y === oldPos.y) return;\n\n this.onMove();\n }\n }\n\n private assembleGeometry(geometry: COMGeometry): BufferGeometry | null {\n // reset material to smooth shading\n (this._mesh.material as MeshStandardMaterial).flatShading = false;\n\n switch (geometry.name.toLowerCase()) {\n case 'cylinder':\n return this.createCylinderGeometry(geometry);\n case 'sphere':\n return this.createSphereGeometry(geometry);\n case 'pyramid':\n // set material to flat shading for pyramid\n (this._mesh.material as MeshStandardMaterial).flatShading =\n true;\n return this.createPyramidGeometry(geometry);\n case 'cube':\n case 'box':\n return this.createBoxGeometry(geometry);\n case 'cone':\n return this.createConeGeometry(geometry);\n case 'wall':\n return this.createWallGeometry(geometry);\n case 'plane':\n return this.createPlaneGeometry(geometry);\n default: {\n console.warn(\n 'DIVEPrimitive.assembleGeometry: Invalid geometry type:',\n geometry.name.toLowerCase(),\n );\n return null;\n }\n }\n }\n\n private createCylinderGeometry(geometry: COMGeometry): BufferGeometry {\n const geo = new CylinderGeometry(\n geometry.width / 2,\n geometry.width / 2,\n geometry.height,\n 64,\n );\n geo.translate(0, geometry.height / 2, 0);\n return geo;\n }\n\n private createSphereGeometry(geometry: COMGeometry): BufferGeometry {\n const geo = new SphereGeometry(geometry.width / 2, 256, 256);\n return geo;\n }\n\n private createPyramidGeometry(geometry: COMGeometry): BufferGeometry {\n // prettier-multiline-arrays-next-line-pattern: 3\n const vertices = new Float32Array([\n -geometry.width / 2, 0, -geometry.depth / 2, // 0\n geometry.width / 2, 0, -geometry.depth / 2, // 1\n geometry.width / 2, 0, geometry.depth / 2, // 2\n -geometry.width / 2, 0, geometry.depth / 2, // 3\n 0, geometry.height, 0,\n ]);\n\n // prettier-multiline-arrays-next-line-pattern: 3\n const indices = new Uint16Array([\n 0, 1, 2,\n 0, 2, 3,\n 0, 4, 1,\n 1, 4, 2,\n 2, 4, 3,\n 3, 4, 0,\n ]);\n\n const geometryBuffer = new BufferGeometry();\n geometryBuffer.setAttribute(\n 'position',\n new BufferAttribute(vertices, 3),\n );\n geometryBuffer.setIndex(new BufferAttribute(indices, 1));\n geometryBuffer.computeVertexNormals();\n\n geometryBuffer.computeBoundingBox();\n geometryBuffer.computeBoundingSphere();\n return geometryBuffer;\n }\n\n private createBoxGeometry(geometry: COMGeometry): BufferGeometry {\n const geo = new BoxGeometry(\n geometry.width,\n geometry.height,\n geometry.depth,\n );\n geo.translate(0, geometry.height / 2, 0);\n return geo;\n }\n\n private createConeGeometry(geometry: COMGeometry): BufferGeometry {\n const geo = new ConeGeometry(geometry.width / 2, geometry.height, 256);\n geo.translate(0, geometry.height / 2, 0);\n return geo;\n }\n\n private createWallGeometry(geometry: COMGeometry): BufferGeometry {\n const geo = new BoxGeometry(\n geometry.width,\n geometry.height,\n geometry.depth || 0.05,\n 16,\n );\n geo.translate(0, geometry.height / 2, 0);\n return geo;\n }\n\n private createPlaneGeometry(geometry: COMGeometry): BufferGeometry {\n const geo = new BoxGeometry(\n geometry.width,\n geometry.height,\n geometry.depth,\n );\n geo.translate(0, geometry.height / 2, 0);\n return geo;\n }\n}\n","import {\n BufferGeometry,\n Line,\n LineDashedMaterial,\n Vector3,\n Vector3Like,\n} from 'three';\nimport { DIVENode } from '../node/Node';\nimport { type Object3D } from 'three';\nimport { type DIVESceneObject } from '../types';\n\nexport class DIVEGroup extends DIVENode {\n readonly isDIVEGroup: true = true;\n\n private _members: Object3D[]; // children objects\n\n public get members(): Object3D[] {\n return this._members;\n }\n\n private _lines: Line[]; // lines to children\n\n constructor() {\n super();\n\n this.name = 'DIVEGroup';\n\n this._members = [];\n\n this._lines = [];\n }\n\n public SetPosition(position: Vector3Like): void {\n super.SetPosition(position);\n this._members.forEach((member) => {\n if ('isDIVENode' in member) {\n (member as DIVENode).onMove();\n }\n });\n }\n\n public SetLinesVisibility(visible: boolean, object?: Object3D): void {\n if (!object) {\n this._lines.forEach((line) => {\n line.visible = visible;\n });\n return;\n }\n\n const index = this._members.indexOf(object);\n if (index === -1) return;\n\n this._lines[index].visible = visible;\n }\n\n public attach(object: DIVESceneObject): this {\n // Check if the object is already a member\n if (this._members.includes(object)) {\n return this;\n }\n\n // create a line to the new object\n const line = this.createLine();\n this.add(line);\n this._lines.push(line);\n\n // attach (instead of add) object to keep its world position\n super.attach(object);\n this._members.push(object);\n\n // update line to object points\n this.updateLineTo(line, object);\n this.SetLinesVisibility(true, object);\n\n return this;\n }\n\n public remove(object: DIVESceneObject): this {\n // remove line first\n const index = this._members.indexOf(object);\n if (index === -1) return this;\n\n const line = this._lines[index];\n super.remove(line);\n this._lines.splice(index, 1);\n\n // removes object from group while keeping it's world position\n super.remove(object);\n this._members.splice(index, 1);\n\n return this;\n }\n\n public UpdateLineTo(object: Object3D): void {\n const index = this._members.indexOf(object);\n if (index === -1) return;\n\n this.updateLineTo(this._lines[index], object);\n }\n\n /**\n * Adds a line to this grouo as last child.\n */\n private createLine(): Line {\n const geo = new BufferGeometry();\n const mat = new LineDashedMaterial({\n color: 0x666666,\n dashSize: 0.05,\n gapSize: 0.025,\n });\n const line = new Line(geo, mat);\n line.visible = false;\n return line;\n }\n\n /**\n * Updates a line to the object.\n */\n private updateLineTo(line: Line, object: Object3D): void {\n line.geometry.setFromPoints([\n new Vector3(0, 0, 0),\n object.position.clone(),\n ]);\n line.computeLineDistances();\n }\n\n // public SetBoundingBoxVisibility(visible: boolean): void {\n // this._boxMesh.visible = visible;\n // }\n\n // /**\n // * Recalculates the position of the group based on it's bounding box.\n // * Children's world positions are kept.\n // */\n // private recalculatePosition(): void {\n // // store all children's world positions\n // const childrensWorldPositions: Vector3[] = this.children.map((child) => child.getWorldPosition(new Vector3()));\n\n // // calculate new center and set it as the group's position\n // const bbcenter = this.updateBB();\n // this.position.copy(bbcenter);\n\n // // set childrens's positions so their world positions are kept\n // this.children.forEach((child, i) => {\n // if (child.uuid === this._boxMesh.uuid) return;\n // child.position.copy(this.worldToLocal(childrensWorldPositions[i]));\n // });\n\n // DIVECommunication.get(this.userData.id)?.PerformAction('UPDATE_OBJECT', { id: this.userData.id, position: this.position });\n // }\n\n // /**\n // * Updates the bounding box of the group.\n // * @returns {Vector3} The new center of the bounding box.\n // */\n // private updateBB(): Vector3 {\n // this._boundingBox.makeEmpty();\n\n // if (this.children.length === 1) {\n // // because we always have the box mesh as 1 child\n // return this.position.clone();\n // }\n\n // this.children.forEach((child) => {\n // if (child.uuid === this._boxMesh.uuid) return;\n // this._boundingBox.expandByObject(child);\n // });\n\n // return this._boundingBox.getCenter(new Vector3());\n // }\n\n // private updateBoxMesh(): void {\n // if (this.children.length === 1) {\n // // because we always have the box mesh as 1 child\n // this._boxMesh.visible = false;\n // return;\n // }\n\n // this._boxMesh.quaternion.copy(this.quaternion.clone().invert());\n // this._boxMesh.scale.set(1 / this.scale.x, 1 / this.scale.y, 1 / this.scale.z);\n // this._boxMesh.geometry = new BoxGeometry(this._boundingBox.max.x - this._boundingBox.min.x, this._boundingBox.max.y - this._boundingBox.min.y, this._boundingBox.max.z - this._boundingBox.min.z);\n // this._boxMesh.visible = true;\n // }\n}\n","export const GRID_CENTER_LINE_COLOR = '#888888';\nexport const GRID_SIDE_LINE_COLOR = '#dddddd';\n","import {\n GRID_SIDE_LINE_COLOR,\n GRID_CENTER_LINE_COLOR,\n} from '../constant/GridColors.ts';\nimport { HELPER_LAYER_MASK } from '../constant/VisibilityLayerMask.ts';\nimport { GridHelper, Object3D } from 'three';\n\n/**\n * A basic grid for the scene.\n *\n * @module\n */\n\nexport class DIVEGrid extends Object3D {\n constructor() {\n super();\n this.name = 'Grid';\n\n const grid = new GridHelper(\n 100,\n 100,\n GRID_CENTER_LINE_COLOR,\n GRID_SIDE_LINE_COLOR,\n );\n grid.material.depthTest = false;\n grid.layers.mask = HELPER_LAYER_MASK;\n\n this.add(grid);\n }\n\n public SetVisibility(visible: boolean): void {\n this.visible = visible;\n }\n}\n","import {\n Color,\n ColorRepresentation,\n Mesh,\n MeshStandardMaterial,\n PlaneGeometry,\n} from 'three';\nimport { PRODUCT_LAYER_MASK } from '../../constant/VisibilityLayerMask.ts';\n\n/**\n * A basic floor geometry.\n *\n * Can change the color and visibility of the floor.\n *\n * @module\n */\n\nexport class DIVEFloor extends Mesh {\n public isFloor: true = true;\n\n constructor() {\n super(\n new PlaneGeometry(10000, 10000),\n new MeshStandardMaterial({\n color: new Color(150 / 255, 150 / 255, 150 / 255),\n }),\n );\n\n this.name = 'Floor';\n\n this.layers.mask = PRODUCT_LAYER_MASK;\n\n this.receiveShadow = true;\n\n this.rotateX(-Math.PI / 2);\n }\n\n public SetVisibility(visible: boolean): void {\n this.visible = visible;\n }\n\n public SetColor(color: ColorRepresentation): void {\n (this.material as MeshStandardMaterial).color = new Color(color);\n }\n}\n","import { Mesh, Object3D, PlaneGeometry, ShadowMaterial } from 'three';\nimport { DIVERoot } from '../root/Root';\nimport { type DIVERenderer } from '../../renderer/Renderer';\nimport { DIVEXRLightRoot } from './xrlightroot/XRLightRoot';\nimport { type DIVEScene } from '../Scene';\n\nexport class DIVEXRRoot extends Object3D {\n private _xrLightRoot: DIVEXRLightRoot;\n private _xrModelRoot: DIVERoot;\n private _xrHandNode: Object3D;\n\n public get XRModelRoot(): DIVERoot {\n return this._xrModelRoot;\n }\n\n public get XRLightRoot(): DIVEXRLightRoot {\n return this._xrLightRoot;\n }\n\n public get XRHandNode(): Object3D {\n return this._xrHandNode;\n }\n\n private _xrShadowPlane: Mesh;\n\n constructor(scene: DIVEScene) {\n super();\n this.name = 'XRRoot';\n\n this._xrModelRoot = new DIVERoot();\n this._xrModelRoot.name = 'XRModelRoot';\n this.add(this._xrModelRoot);\n\n this._xrShadowPlane = new Mesh(\n new PlaneGeometry(100, 100),\n new ShadowMaterial({ opacity: 1, transparent: true }),\n );\n this._xrModelRoot.add(this._xrShadowPlane);\n\n this._xrLightRoot = new DIVEXRLightRoot(scene);\n this._xrLightRoot.name = 'XRLightRoot';\n this.add(this._xrLightRoot);\n\n this._xrHandNode = new Object3D();\n this._xrHandNode.name = 'XRHandNode';\n this.add(this._xrHandNode);\n }\n\n public InitLightEstimation(renderer: DIVERenderer): void {\n this._xrLightRoot.InitLightEstimation(renderer);\n }\n\n public DisposeLightEstimation(): void {\n this._xrLightRoot.DisposeLightEstimation();\n }\n}\n","import { XREstimatedLight } from 'three/examples/jsm/webxr/XREstimatedLight';\nimport { type DIVERenderer } from '../../../renderer/Renderer';\nimport { Object3D } from 'three';\nimport { type DIVEScene } from '../../Scene';\nimport { PRODUCT_LAYER_MASK } from '../../../constant/VisibilityLayerMask';\nimport { DIVERoot } from '../../root/Root';\n\nexport class DIVEXRLightRoot extends Object3D {\n private _scene: DIVEScene;\n\n private _xrLight: XREstimatedLight | null;\n private _lightRoot: DIVERoot;\n\n constructor(scene: DIVEScene) {\n super();\n this.name = 'XRLightRoot';\n\n this._scene = scene;\n\n // placeholder for XR light\n this._xrLight = null;\n\n // add scene\n this._lightRoot = new DIVERoot();\n this._lightRoot.UpdateSceneObject({\n id: 'XRSceneLight',\n entityType: 'light',\n name: 'XRSceneLight',\n type: 'scene',\n color: 0xffffff,\n intensity: 1,\n enabled: true,\n visible: true,\n });\n this.add(this._lightRoot);\n }\n\n public InitLightEstimation(renderer: DIVERenderer): void {\n if (!this._xrLight) {\n this._xrLight = new XREstimatedLight(renderer, true);\n this._xrLight.layers.mask = PRODUCT_LAYER_MASK;\n this.add(this._xrLight);\n }\n\n this._xrLight.addEventListener('estimationstart', () => {\n this.onEstimationStart();\n });\n this._xrLight.addEventListener('estimationend', () => {\n this.onEstimationEnd();\n });\n }\n\n public DisposeLightEstimation(): void {\n if (!this._xrLight) return;\n\n this._xrLight.removeEventListener('estimationstart', () => {\n this.onEstimationStart();\n });\n this._xrLight.removeEventListener('estimationend', () => {\n this.onEstimationEnd();\n });\n }\n\n private onEstimationStart(): void {\n this._lightRoot.visible = false;\n\n if (!this._xrLight) return;\n\n if (this._xrLight.environment) {\n this._scene.environment = this._xrLight.environment;\n }\n }\n\n private onEstimationEnd(): void {\n this._lightRoot.visible = true;\n this._scene.environment = null;\n\n if (!this._xrLight) return;\n }\n}\n","import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls';\nimport DIVEPerspectiveCamera from '../camera/PerspectiveCamera.ts';\nimport { DIVERenderer } from '../renderer/Renderer.ts';\nimport { type Box3, MathUtils, Vector3, Vector3Like } from 'three';\nimport { Easing } from '@tweenjs/tween.js';\nimport { type DIVEAnimationSystem } from '../animation/AnimationSystem.ts';\n\nexport type DIVEOrbitControlsSettings = {\n enableDamping: boolean;\n dampingFactor: number;\n};\n\nexport const DIVEOrbitControlsDefaultSettings: DIVEOrbitControlsSettings = {\n enableDamping: true,\n dampingFactor: 0.04,\n};\n\n/**\n * Orbit Controls. Basic functionality to orbit around a given target point in the scene.\n *\n * @module\n */\n\nexport default class DIVEOrbitControls extends OrbitControls {\n public static readonly DEFAULT_ZOOM_FACTOR = 1;\n\n private _animationSystem: DIVEAnimationSystem;\n\n private last: { pos: Vector3Like; target: Vector3Like } | null = null;\n\n private animating: boolean = false;\n private locked: boolean = false;\n\n private stopMoveTo: () => void = () => {};\n private stopRevertLast: () => void = () => {};\n\n public object: DIVEPerspectiveCamera;\n public domElement: HTMLCanvasElement;\n\n private _removePreRenderCallback: () => void = () => {};\n\n constructor(\n camera: DIVEPerspectiveCamera,\n renderer: DIVERenderer,\n animationSystem: DIVEAnimationSystem,\n settings: Partial<DIVEOrbitControlsSettings> = DIVEOrbitControlsDefaultSettings,\n ) {\n super(camera, renderer.domElement);\n\n this._animationSystem = animationSystem;\n\n this.domElement = renderer.domElement;\n\n this.object = camera;\n\n const id = renderer.AddPreRenderCallback(() => {\n this.preRenderCallback();\n });\n\n this._removePreRenderCallback = () => {\n renderer.RemovePreRenderCallback(id);\n };\n\n this.enableDamping =\n settings.enableDamping ||\n DIVEOrbitControlsDefaultSettings.enableDamping;\n this.dampingFactor =\n settings.dampingFactor ||\n DIVEOrbitControlsDefaultSettings.dampingFactor;\n\n // initialize camera transformation\n this.object.position.set(0, 2, 2);\n this.target.copy({ x: 0, y: 0.5, z: 0 });\n this.update();\n }\n\n public Dispose(): void {\n this._removePreRenderCallback();\n this.dispose();\n }\n\n public ComputeEncompassingView(bb: Box3): {\n position: Vector3Like;\n target: Vector3Like;\n } {\n const center = bb.getCenter(new Vector3());\n const size = bb.getSize(new Vector3());\n const distance = Math.max(size.x, size.y, size.z) * 1.25;\n const direction = this.object.position.clone().normalize();\n\n return {\n position: direction.multiplyScalar(distance),\n target: center,\n };\n }\n\n public ZoomIn(by?: number): void {\n const zoomBy = by || DIVEOrbitControls.DEFAULT_ZOOM_FACTOR;\n const { minDistance, maxDistance } = this;\n this.minDistance = this.maxDistance = MathUtils.clamp(\n this.getDistance() - zoomBy,\n minDistance + zoomBy,\n maxDistance - zoomBy,\n );\n this.update();\n this.minDistance = minDistance;\n this.maxDistance = maxDistance;\n }\n\n public ZoomOut(by?: number): void {\n const zoomBy = by || DIVEOrbitControls.DEFAULT_ZOOM_FACTOR;\n const { minDistance, maxDistance } = this;\n this.minDistance = this.maxDistance = MathUtils.clamp(\n this.getDistance() + zoomBy,\n minDistance + zoomBy,\n maxDistance - zoomBy,\n );\n this.update();\n this.minDistance = minDistance;\n this.maxDistance = maxDistance;\n }\n\n public MoveTo(\n pos: Vector3Like | undefined,\n target: Vector3Like | undefined,\n duration: number,\n lock: boolean,\n ): void {\n if (this.animating) return;\n\n const toPosition = pos || this.object.position.clone();\n const toTarget = target || this.target.clone();\n\n this.stopRevertLast();\n\n if (!this.locked)\n this.last = {\n pos: this.object.position.clone(),\n target: this.target.clone(),\n };\n\n this.animating = duration > 0;\n this.locked = lock;\n this.enabled = false;\n\n const tweenPos = this._animationSystem\n .Animate(this.object.position)\n .to(toPosition, duration)\n .easing(Easing.Quadratic.Out)\n .start();\n\n const tweenQuat = this._animationSystem\n .Animate(this.target)\n .to(toTarget, duration)\n .easing(Easing.Quadratic.Out)\n .onUpdate(() => {\n this.object.lookAt(this.target);\n })\n .onComplete(() => {\n this.animating = false;\n this.enabled = !lock;\n })\n .start();\n\n this.stopMoveTo = () => {\n tweenPos.stop();\n tweenQuat.stop();\n };\n }\n\n public RevertLast(duration: number): void {\n if (this.animating || !this.locked) return;\n\n this.stopMoveTo();\n\n this.animating = duration > 0;\n this.enabled = false;\n\n const { pos, target } = this.last!;\n\n const tweenPos = this._animationSystem\n .Animate(this.object.position)\n .to(pos, duration)\n .easing(Easing.Quadratic.Out)\n .start();\n\n const tweenQuat = this._animationSystem\n .Animate(this.target)\n .to(target, duration)\n .easing(Easing.Quadratic.Out)\n .onUpdate(() => {\n this.object.lookAt(this.target);\n })\n .onComplete(() => {\n this.animating = false;\n this.locked = false;\n this.enabled = true;\n })\n .start();\n\n this.stopRevertLast = () => {\n tweenPos.stop();\n tweenQuat.stop();\n };\n }\n\n private preRenderCallback = (): void => {\n if (this.locked) return;\n this.update();\n };\n}\n","import type DIVEOrbitControls from '../controls/OrbitControls.ts';\nimport { type DIVEScene } from '../scene/Scene.ts';\nimport { type DIVEBaseTool } from './BaseTool.ts';\nimport { type DIVESelectTool } from './select/SelectTool.ts';\n\nexport type ToolType = 'select' | 'none';\n\n/**\n * A Toolbox to activate and deactivate tools to use with the pointer.\n *\n * @module\n */\n\nexport default class DIVEToolbox {\n public static readonly DefaultTool = 'select';\n\n private _scene: DIVEScene;\n private _controller: DIVEOrbitControls;\n\n private _activeTool: DIVEBaseTool | null;\n\n private _selectTool: DIVESelectTool | null;\n public get selectTool(): DIVESelectTool {\n if (!this._selectTool) {\n const DIVESelectTool = require('./select/SelectTool.ts')\n .DIVESelectTool as typeof import('./select/SelectTool.ts').DIVESelectTool;\n this._selectTool = new DIVESelectTool(\n this._scene,\n this._controller,\n );\n }\n return this._selectTool;\n }\n\n constructor(scene: DIVEScene, controller: DIVEOrbitControls) {\n this._scene = scene;\n this._controller = controller;\n\n // toolset\n this._selectTool = null;\n\n // default tool\n this._activeTool = null;\n }\n\n public Dispose(): void {\n this.removeEventListeners();\n }\n\n public GetActiveTool(): DIVEBaseTool | null {\n return this._activeTool;\n }\n\n public UseTool(tool: ToolType): void {\n this._activeTool?.Deactivate();\n switch (tool) {\n case 'select': {\n this.addEventListeners();\n this.selectTool.Activate();\n this._activeTool = this.selectTool;\n break;\n }\n case 'none': {\n this.removeEventListeners();\n this._activeTool = null;\n break;\n }\n default: {\n console.warn(`DIVEToolBox.UseTool: Unknown tool: ${tool}`);\n }\n }\n }\n\n public SetGizmoMode(mode: 'translate' | 'rotate' | 'scale'): void {\n this.selectTool.SetGizmoMode(mode);\n }\n\n public SetGizmoVisibility(active: boolean): void {\n this.selectTool.SetGizmoVisibility(active);\n }\n\n public onPointerMove(e: PointerEvent): void {\n this._activeTool?.onPointerMove(e);\n }\n\n public onPointerDown(e: PointerEvent): void {\n this._activeTool?.onPointerDown(e);\n }\n\n public onPointerUp(e: PointerEvent): void {\n this._activeTool?.onPointerUp(e);\n }\n\n public onWheel(e: WheelEvent): void {\n this._activeTool?.onWheel(e);\n }\n\n private addEventListeners(): void {\n this._controller.domElement.addEventListener('pointermove', (e) =>\n this.onPointerMove(e),\n );\n this._controller.domElement.addEventListener('pointerdown', (e) =>\n this.onPointerDown(e),\n );\n this._controller.domElement.addEventListener('pointerup', (e) =>\n this.onPointerUp(e),\n );\n this._controller.domElement.addEventListener('wheel', (e) =>\n this.onWheel(e),\n );\n }\n\n private removeEventListeners(): void {\n this._controller.domElement.removeEventListener('pointermove', (e) =>\n this.onPointerMove(e),\n );\n this._controller.domElement.removeEventListener('pointerdown', (e) =>\n this.onPointerDown(e),\n );\n this._controller.domElement.removeEventListener('pointerup', (e) =>\n this.onPointerUp(e),\n );\n this._controller.domElement.removeEventListener('wheel', (e) =>\n this.onWheel(e),\n );\n }\n}\n","import { Tween, update as updateTween } from '@tweenjs/tween.js';\nimport { DIVERenderer } from '../renderer/Renderer';\n\n/**\n * Updates all animations.\n * DIVE uses Tween.js to handle animations.\n *\n * @module\n */\n\nexport class DIVEAnimationSystem {\n private _renderer: DIVERenderer;\n private _rendererCallbackId: string;\n\n constructor(renderer: DIVERenderer) {\n this._renderer = renderer;\n\n this._rendererCallbackId = this._renderer.AddPreRenderCallback(() => {\n this.Update();\n });\n }\n\n public Dispose(): void {\n this._renderer.RemovePreRenderCallback(this._rendererCallbackId);\n }\n\n public Update(): void {\n updateTween();\n }\n\n public Animate<T extends object>(object: T): Tween<T> {\n return new Tween<T>(object);\n }\n}\n","import {\n AxesHelper,\n Color,\n type Material,\n Matrix4,\n OrthographicCamera,\n Vector4,\n} from 'three';\nimport SpriteText from 'three-spritetext';\nimport { COORDINATE_LAYER_MASK } from '../constant/VisibilityLayerMask.ts';\nimport {\n AxesColorRed,\n AxesColorGreen,\n AxesColorBlue,\n AxesColorRedLetter,\n AxesColorGreenLetter,\n AxesColorBlueLetter,\n} from '../constant/AxisHelperColors.ts';\nimport { type DIVERenderer } from '../renderer/Renderer.ts';\nimport { type DIVEScene } from '../scene/Scene.ts';\nimport type DIVEOrbitControls from '../controls/OrbitControls.ts';\n\n/**\n * Shows the scene axes in the bottom left corner of the screen.\n *\n * @module\n */\n\nexport default class DIVEAxisCamera extends OrthographicCamera {\n private axesHelper: AxesHelper;\n\n private _renderer: DIVERenderer;\n private _scene: DIVEScene;\n\n private _renderCallbackId: string;\n\n constructor(\n renderer: DIVERenderer,\n scene: DIVEScene,\n controls: DIVEOrbitControls,\n ) {\n super(-1, 1, 1, -1, 0.1, 100);\n\n this.layers.mask = COORDINATE_LAYER_MASK;\n\n this.axesHelper = new AxesHelper(0.5);\n this.axesHelper.layers.mask = COORDINATE_LAYER_MASK;\n (this.axesHelper.material as Material).depthTest = false; // always draw\n this.axesHelper.position.set(0, 0, -1);\n\n this.axesHelper.setColors(\n new Color(AxesColorRed),\n new Color(AxesColorGreen),\n new Color(AxesColorBlue),\n );\n\n const x = new SpriteText('X', 0.2, AxesColorRedLetter);\n const y = new SpriteText('Y', 0.2, AxesColorGreenLetter);\n const z = new SpriteText('Z', 0.2, AxesColorBlueLetter);\n x.layers.mask = COORDINATE_LAYER_MASK;\n y.layers.mask = COORDINATE_LAYER_MASK;\n z.layers.mask = COORDINATE_LAYER_MASK;\n x.position.set(0.7, 0, 0);\n y.position.set(0, 0.7, 0);\n z.position.set(0, 0, 0.7);\n this.axesHelper.add(x);\n this.axesHelper.add(y);\n this.axesHelper.add(z);\n\n this.add(this.axesHelper);\n\n // attach everything to current scene and render cycle\n this._renderer = renderer;\n this._scene = scene;\n this._scene.add(this);\n\n const restoreViewport = new Vector4();\n\n this._renderCallbackId = renderer.AddPostRenderCallback(() => {\n const restoreBackground = scene.background;\n scene.background = null;\n\n renderer.getViewport(restoreViewport);\n renderer.setViewport(0, 0, 150, 150);\n renderer.autoClear = false;\n\n this.SetFromCameraMatrix(controls.object.matrix);\n\n renderer.render(scene, this);\n\n renderer.setViewport(restoreViewport);\n renderer.autoClear = true;\n\n scene.background = restoreBackground;\n });\n }\n\n public Dispose(): void {\n this._renderer.RemovePostRenderCallback(this._renderCallbackId);\n this._scene.remove(this);\n }\n\n public SetFromCameraMatrix(matrix: Matrix4): void {\n this.axesHelper.rotation.setFromRotationMatrix(\n new Matrix4().extractRotation(matrix).invert(),\n );\n }\n}\n","export const AxesColorRedLetter = '#c20017';\nexport const AxesColorGreenLetter = '#00ab26';\nexport const AxesColorBlueLetter = '#0081d4';\n\nexport const AxesColorRed = AxesColorRedLetter;\nexport const AxesColorGreen = AxesColorGreenLetter;\nexport const AxesColorBlue = AxesColorBlueLetter;\n","/**\n * Find the difference between two objects.\n */\n\nexport const getObjectDelta = <T extends object>(\n a: T,\n b: Partial<T>,\n): Partial<T> => {\n // if a and b have no entries we have no delta\n if (Object.keys(a).length === 0 && Object.keys(b).length === 0) {\n return {};\n }\n\n // if a or b is not an object we have a delta\n if (typeof a !== 'object' || typeof b !== 'object') {\n return b;\n }\n\n let delta = {};\n\n Object.keys(b).forEach((key) => {\n // if key is not in a we have a delta\n if (!Object.keys(a).includes(key)) {\n delta = { ...delta, [key]: b[key as keyof object] };\n return;\n }\n\n // assumption: b[key] is an array\n if (Array.isArray(b[key as keyof object])) {\n // if a[key] is not an array we have a delta\n if (!Array.isArray(a[key as keyof object])) {\n delta = { ...delta, [key]: b[key as keyof object] };\n return;\n }\n\n // create arrays (for TS types to be correct)\n const aArray = a[key as keyof object] as [];\n const bArray = b[key as keyof object] as [];\n\n // if both arrays are empty we have no delta\n if (aArray.length === 0 && bArray.length === 0) {\n delta = { ...delta };\n return;\n }\n\n // if array length is different we have a delta\n if (aArray.length !== bArray.length) {\n delta = { ...delta, [key]: b[key as keyof object] };\n return;\n }\n\n // create array for deltas\n const arrayDeltas: [] = [];\n\n bArray.forEach((entry, index) => {\n // getObjectDelta in array\n const inArrayDelta = getObjectDelta(\n aArray[index],\n bArray[index],\n );\n\n // if inArrayDelta has more then 0 entries we have a delta\n if (Object.keys(inArrayDelta).length) {\n arrayDeltas.push(bArray[index]);\n }\n });\n\n // if arrayDeltas has more than 0 entries we have a delta\n if (Object.keys(arrayDeltas).length) {\n delta = { ...delta, [key]: arrayDeltas };\n return;\n }\n\n return;\n }\n\n // assumption: b[key] is an object\n if (typeof b[key as keyof object] === 'object') {\n // if a[key] is not an object we have a delta\n if (typeof a[key as keyof object] !== 'object') {\n delta = { ...delta, [key]: b[key as keyof object] };\n return;\n }\n\n // recursive: find objectDelta in a and b\n const objectDelta = getObjectDelta(\n a[key as keyof object],\n b[key as keyof object],\n );\n\n // if objectDelta has more than 0 entries we have a delta\n if (Object.keys(objectDelta).length) {\n delta = { ...delta, [key]: objectDelta };\n return;\n }\n }\n\n // if a[key] is not equal to b[key] we have a delta\n if (a[key as keyof object] !== b[key as keyof object]) {\n delta = { ...delta, [key]: b[key as keyof object] };\n }\n });\n\n return delta;\n};\n","{\n \"name\": \"@shopware-ag/dive\",\n \"version\": \"1.18.1\",\n \"description\": \"Shopware Spatial Framework\",\n \"type\": \"module\",\n \"main\": \"./build/dive.cjs\",\n \"module\": \"./build/dive.js\",\n \"types\": \"./build/dive.d.ts\",\n \"files\": [\n \"build\",\n \"LICENSE\",\n \"package.json\",\n \"README.md\",\n \"src\"\n ],\n \"keywords\": [\n \"dive\",\n \"shopware\",\n \"sw6\",\n \"three\",\n \"three.js\",\n \"3d\",\n \"typescript\"\n ],\n \"repository\": \"git@github.com:shopware/dive.git\",\n \"author\": \"ffrank <f.frank@shopware.com>\",\n \"license\": \"MIT\",\n \"browserslist\": [\n \"> 1%, not dead, not ie 11, not op_mini all\"\n ],\n \"dependencies\": {\n \"@tweenjs/tween.js\": \"^23.1.1\",\n \"lodash\": \"^4.17.21\",\n \"three\": \"^0.163.0\",\n \"three-spritetext\": \"^1.8.2\"\n },\n \"devDependencies\": {\n \"@eslint/js\": \"^9.1.1\",\n \"@types/jest\": \"^29.5.12\",\n \"@types/lodash\": \"^4.17.12\",\n \"@types/node\": \"^20.12.7\",\n \"@types/three\": \"^0.163.0\",\n \"eslint\": \"^9.1.1\",\n \"globals\": \"^15.0.0\",\n \"jest\": \"^29.7.0\",\n \"jest-environment-jsdom\": \"^29.7.0\",\n \"jest-junit\": \"^16.0.0\",\n \"jsdom\": \"^24.0.0\",\n \"prettier\": \"^3.3.3\",\n \"prettier-plugin-multiline-arrays\": \"^3.0.6\",\n \"ts-jest\": \"^29.1.2\",\n \"ts-node\": \"^10.9.2\",\n \"tsc\": \"^2.0.4\",\n \"tsup\": \"^8.0.2\",\n \"typescript\": \"^5.4.5\",\n \"typescript-eslint\": \"^7.7.1\"\n },\n \"scripts\": {\n \"build\": \"tsup --env.DIVE_NODE_ENV production\",\n \"dev\": \"tsup --watch --env.DIVE_NODE_ENV development\",\n \"lint\": \"eslint\",\n \"lint:actions\": \"yarn lint:actions:transpile && yarn lint:actions:check && yarn lint:actions:cleanup\",\n \"lint:actions:transpile\": \"yarn tsc --resolveJsonModule --esModuleInterop ci/lint/lint-actions.ts && mv ci/lint/lint-actions.js ci/lint/lint-actions.cjs\",\n \"lint:actions:check\": \"yarn node ci/lint/lint-actions.cjs\",\n \"lint:actions:cleanup\": \"node -e \\\"require('fs').unlinkSync('ci/lint/lint-actions.cjs')\\\"\",\n \"prettier:check\": \"prettier --check .\",\n \"prettier:fix\": \"prettier --write .\",\n \"unit\": \"jest\",\n \"coverage\": \"jest --coverage\",\n \"generate-readme\": \"yarn generate-readme:transpile && yarn generate-readme:write && yarn generate-readme:cleanup\",\n \"generate-readme:transpile\": \"yarn tsc --resolveJsonModule --esModuleInterop ci/readme/generate-readme.ts && mv ci/readme/generate-readme.js ci/readme/generate-readme.cjs\",\n \"generate-readme:write\": \"node ci/readme/generate-readme.cjs\",\n \"generate-readme:cleanup\": \"node -e \\\"require('fs').unlinkSync('ci/readme/generate-readme.cjs')\\\"\",\n \"ci\": \"yarn lint && yarn coverage && yarn prettier:check && yarn build && bash ci/lint/lint-actions.sh\"\n }\n}\n","export default function shift(value: number, exponent: number): number {\n const subvalues = (value + 'e').split('e');\n return +(subvalues[0] + 'e' + (+subvalues[1] + (exponent || 0)));\n}\n","import shift from '../helper/shift.ts';\n\nexport default function ceilExp(number: number, decimals: number = 0): number {\n const n = shift(number, +decimals);\n return shift(Math.ceil(n), -decimals);\n}\n","import shift from '../helper/shift.ts';\n\nexport default function floorExp(number: number, decimals: number = 0): number {\n const n = shift(number, +decimals);\n return shift(Math.floor(n), -decimals);\n}\n","import shift from '../helper/shift.ts';\n\nexport default function roundExponential(\n number: number,\n decimals: number = 0,\n): number {\n if (number < 0) return -roundExponential(-number, decimals);\n const n = shift(number, +decimals);\n return shift(Math.round(n), -decimals);\n}\n","import { Vector3 } from 'three';\n\n/**\n * Calculate the signed angle between two vectors. Only works when the vectors are on the same plane.\n * @param vecB Start Vector\n * @param vecA Target Vector\n * @param planeNormal The vector's plane normal\n * @returns Signed angle in radians\n */\n\nexport default function signedAngleTo(\n vecA: Vector3,\n vecB: Vector3,\n planeNormal: Vector3,\n): number {\n return Math.atan2(\n vecA.clone().cross(vecB).dot(planeNormal),\n vecB.clone().dot(vecA),\n );\n}\n","import shift from '../helper/shift.ts';\n\nexport default function toFixedExp(\n number: number,\n decimals: number = 0,\n): string {\n const n = shift(number, +decimals);\n return shift(Math.round(n), -decimals).toFixed(decimals);\n}\n","import shift from '../helper/shift.ts';\n\nexport default function truncateExp(\n number: number,\n decimals: number = 0,\n): number {\n const n = shift(number, +decimals);\n return shift(Math.trunc(n), -decimals);\n}\n","import { MathUtils } from 'three';\n\nexport default function radToDeg(radians: number): number {\n return (MathUtils.radToDeg(radians) + 360) % 360;\n}\n","import { MathUtils } from 'three';\n\nexport default function degToRad(degrees: number): number {\n return MathUtils.degToRad(degrees);\n}\n","import ceilExp from './ceil/ceilExp.ts';\nimport floorExp from './floor/floorExp.ts';\nimport roundExp from './round/roundExp.ts';\nimport signedAngleTo from './signedAngleTo/signedAngleTo.ts';\nimport toFixedExp from './toFixed/toFixedExp.ts';\nimport truncateExp from './truncate/truncateExp.ts';\nimport radToDeg from './radToDeg/radToDeg.ts';\nimport degToRad from './degToRad/degToRad.ts';\n\nexport const DIVEMath: {\n ceilExp: typeof ceilExp;\n floorExp: typeof floorExp;\n roundExp: typeof roundExp;\n toFixedExp: typeof toFixedExp;\n truncateExp: typeof truncateExp;\n signedAngleTo: typeof signedAngleTo;\n radToDeg: typeof radToDeg;\n degToRad: typeof degToRad;\n} = {\n ceilExp,\n floorExp,\n roundExp,\n toFixedExp,\n truncateExp,\n signedAngleTo,\n radToDeg,\n degToRad,\n};\n"],"mappings":"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","names":["import_three","import_three","WebXRUnsupportedReason","import_three","import_three","import_three","import_three","import_three","import_three","import_three","import_three","import_three","import_three","import_three","DIVEMediaCreator","DIVEIO","DIVEAR","import_three","import_three","import_three","import_GLTFLoader","import_three","import_three","object","import_three","import_three","import_three","import_three","import_three","DIVESelectTool","import_tween","updateTween","import_three","SpriteText","import_three","import_three","import_three"]}