@shopware-ag/dive 1.16.5 → 1.16.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/dive.cjs +14 -45
- package/build/dive.cjs.map +1 -1
- package/build/dive.d.cts +6 -0
- package/build/dive.d.ts +6 -0
- package/build/dive.js +15 -46
- package/build/dive.js.map +1 -1
- package/package.json +1 -1
- package/src/__test__/DIVE.test.ts +8 -0
- package/src/com/Communication.ts +3 -2
- package/src/model/Model.ts +6 -19
- package/src/model/__test__/Model.test.ts +10 -4
- package/src/primitive/Primitive.ts +6 -19
- package/src/primitive/__test__/Primitive.test.ts +8 -4
- package/src/scene/Scene.ts +5 -3
- package/src/scene/root/Root.ts +14 -6
- package/src/scene/root/__test__/Root.test.ts +60 -6
- package/src/toolbox/select/SelectTool.ts +4 -4
package/build/dive.cjs.map
CHANGED
|
@@ -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/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/controls/OrbitControls.ts","../src/toolbox/Toolbox.ts","../src/animation/AnimationSystem.ts","../src/axiscamera/AxisCamera.ts","../src/constant/AxisHelperColors.ts","../src/helper/getObjectDelta/getObjectDelta.ts","../src/info/Info.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/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 { Intersection, Object3D, Raycaster, Vector2, Vector3 } from 'three';\nimport {\n PRODUCT_LAYER_MASK,\n UI_LAYER_MASK,\n} from '../constant/VisibilityLayerMask';\nimport { DIVEScene } from '../scene/Scene';\nimport 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 { DIVEScene } from '../../scene/Scene.ts';\nimport DIVEOrbitControls from '../../controls/OrbitControls.ts';\nimport { TransformControls } from 'three/examples/jsm/Addons';\nimport { type DIVEMovable } from '../../interface/Movable.ts';\nimport { implementsInterface } from '../../helper/isInterface/implementsInterface.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;\n\n constructor(scene: DIVEScene, controller: DIVEOrbitControls) {\n super(scene, controller);\n this.name = 'DIVETransformTool';\n\n this._gizmo = new TransformControls(\n this._controller.object,\n this._controller.domElement,\n );\n this._gizmo.mode = 'translate';\n\n // happens when pointerDown event is called on gizmo\n this._gizmo.addEventListener('mouseDown', () => {\n controller.enabled = false;\n\n if (\n !implementsInterface<DIVEMovable>(\n this._gizmo.object,\n 'isMovable',\n )\n )\n return;\n if (!this._gizmo.object.onMoveStart) return;\n this._gizmo.object.onMoveStart();\n });\n\n // happens when pointerMove event is called on gizmo\n this._gizmo.addEventListener('objectChange', () => {\n if (\n !implementsInterface<DIVEMovable>(\n this._gizmo.object,\n 'isMovable',\n )\n )\n return;\n if (!this._gizmo.object.onMove) return;\n this._gizmo.object.onMove();\n });\n\n // happens when pointerUp event is called on gizmo\n this._gizmo.addEventListener('mouseUp', () => {\n controller.enabled = true;\n\n if (\n !implementsInterface<DIVEMovable>(\n this._gizmo.object,\n 'isMovable',\n )\n )\n return;\n if (!this._gizmo.object.onMoveEnd) return;\n this._gizmo.object.onMoveEnd();\n });\n\n 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 } else if (!active && contains) {\n this._scene.remove(this._gizmo);\n }\n }\n\n // public onPointerDown(e: PointerEvent): void {\n // super.onPointerDown(e);\n\n // // if (this._hovered) {\n // // this._dragRaycastOnObjects = this._gizmo.gizmoPlane.children;\n // // }\n // }\n\n // protected raycast(): Intersection[] {\n // return super.raycast(this._gizmo.gizmoNode.children);\n // }\n}\n","import { type Object3D } from 'three';\nimport { 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 if (selectable.onSelect) selectable.onSelect();\n\n this.AttachGizmo(selectable);\n }\n\n public Deselect(selectable: DIVESelectable): void {\n if (selectable.onDeselect) selectable.onDeselect();\n\n this.DetachGizmo();\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 { DIVEScene } from '../scene/Scene.ts';\nimport { DIVERenderer } from '../renderer/Renderer.ts';\nimport DIVEOrbitControls from '../controls/OrbitControls.ts';\nimport { 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","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';\n\nimport { generateUUID } from 'three/src/math/MathUtils';\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(uri: string): DIVE {\n const dive = new DIVE();\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 = 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 = generateUUID();\n\n // add loaded listener\n dive.Communication.Subscribe('MODEL_LOADED', (data) => {\n if (data.id !== modelid) return;\n dive.Communication.PerformAction('PLACE_ON_FLOOR', {\n id: modelid,\n });\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(\n `DIVE ${pkgjson.version} initialized ${process.env.NODE_ENV === 'development' ? 'in development mode' : ''}`,\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';\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\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, () => void> = new Map<\n string,\n () => void\n >();\n private postRenderCallbacks: Map<string, () => void> = new Map<\n string,\n () => void\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(() => {\n this.internal_render(scene, cam);\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: () => void): 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: () => void): 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(scene: Scene, cam: Camera): 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();\n });\n\n this.render(scene, cam);\n\n this.postRenderCallbacks.forEach((callback) => {\n callback();\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';\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 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\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 },\n ): void {\n this.Root.UpdateSceneObject(object);\n }\n\n public DeleteSceneObject(\n object: Partial<COMEntity> & { id: string },\n ): void {\n this.Root.DeleteSceneObject(object);\n }\n\n public PlaceOnFloor(object: Partial<COMModel> & { id: string }): 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);\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 },\n ): void {\n switch (object.entityType) {\n case 'pov': {\n break;\n }\n case 'light': {\n this.updateLight(object);\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 },\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(object: Partial<COMEntity> & { id: string }): 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(light: Partial<COMLight> & { id: string }): 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 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 DIVEPrimitive).SetPosition(group.position);\n if (group.rotation !== undefined)\n (sceneObject as DIVEPrimitive).SetRotation(group.rotation);\n if (group.scale !== undefined)\n (sceneObject as DIVEPrimitive).SetScale(group.scale);\n if (group.visible !== undefined)\n (sceneObject as DIVEPrimitive).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 this.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 this.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 this.remove(sceneObject);\n }\n\n private deleteGroup(group: Partial<COMGroup> & { id: string }): void {\n const sceneObject = this.GetSceneObject(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.children.length - 1; i >= 0; i--) {\n this.attach(sceneObject.children[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/Addons.js';\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';\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 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\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 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 // copy object to payload to use later\n Object.assign(payload, deletedObject);\n\n this.registered.delete(payload.id);\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 if (!this.registered.get(payload.id)) return false;\n\n this.scene.PlaceOnFloor(payload);\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 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 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 return true;\n }\n\n // attach to new parent\n parentObject.attach(sceneObject);\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 { DIVECommunication } from '../com/Communication';\nimport type { GLTF } from 'three/examples/jsm/Addons.js';\nimport { findSceneRecursive } from '../helper/findSceneRecursive/findSceneRecursive';\nimport { type COMMaterial } from '../com/types';\nimport { DIVENode } from '../node/Node';\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\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 this.position.y = -this._boundingBox.min.y * this.scale.y;\n DIVECommunication.get(this.userData.id)?.PerformAction(\n 'UPDATE_OBJECT',\n {\n id: this.userData.id,\n position: this.position,\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 DIVECommunication.get(this.userData.id)?.PerformAction(\n 'UPDATE_OBJECT',\n {\n id: this.userData.id,\n position: this.position,\n rotation: this.rotation,\n scale: this.scale,\n },\n );\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, 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 _boundingBox: Box3;\n\n constructor() {\n super();\n\n this.layers.mask = PRODUCT_LAYER_MASK;\n\n this._boundingBox = new Box3();\n }\n\n public SetPosition(position: Vector3Like): void {\n this.position.set(position.x, position.y, position.z);\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.position,\n rotation: this.rotation,\n scale: this.scale,\n },\n );\n }\n\n public onMove(): void {\n DIVECommunication.get(this.userData.id)?.PerformAction(\n 'UPDATE_OBJECT',\n {\n id: this.userData.id,\n position: this.position,\n rotation: this.rotation,\n scale: this.scale,\n },\n );\n\n if (this.parent && 'isDIVEGroup' in this.parent) {\n (this.parent as unknown as DIVEGroup).UpdateLineTo(this);\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, GLTF, GLTFLoader } from 'three/examples/jsm/Addons.js';\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 BufferGeometry,\n Color,\n ConeGeometry,\n CylinderGeometry,\n Mesh,\n MeshStandardMaterial,\n Raycaster,\n SphereGeometry,\n Vector3,\n} from 'three';\nimport { DIVECommunication } from '../com/Communication';\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';\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 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 this.position.y = -this._boundingBox.min.y * this.scale.y;\n DIVECommunication.get(this.userData.id)?.PerformAction(\n 'UPDATE_OBJECT',\n {\n id: this.userData.id,\n position: this.position,\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 DIVECommunication.get(this.userData.id)?.PerformAction(\n 'UPDATE_OBJECT',\n {\n id: this.userData.id,\n position: this.position,\n rotation: this.rotation,\n scale: this.scale,\n },\n );\n }\n }\n\n private assembleGeometry(geometry: COMGeometry): BufferGeometry | null {\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 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 const geo = new ConeGeometry(\n geometry.width / 2,\n geometry.height,\n 4,\n 1,\n true,\n );\n geo.rotateY(Math.PI / 4);\n geo.translate(0, geometry.height / 2, 0);\n return geo;\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 { BufferGeometry, Line, LineDashedMaterial, Vector3 } 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[]; // lines to children\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 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 // create a line to the new object\n const line = this.createLine();\n this.add(line);\n this._lines.push(line);\n\n // attach (insted of add) object to keep it's 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 { 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 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 { DIVERenderer } from '../renderer/Renderer.ts';\nimport { DIVEScene } from '../scene/Scene.ts';\nimport 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","export class DIVEInfo {\n private static _supportsWebXR: boolean | null = 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 if (!navigator.xr) {\n this._supportsWebXR = false;\n return this._supportsWebXR;\n }\n // Check if immersive-vr session mode is supported\n try {\n const supported =\n await navigator.xr.isSessionSupported('immersive-ar');\n this._supportsWebXR = supported;\n } catch (error) {\n this._supportsWebXR = false;\n }\n return this._supportsWebXR;\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","{\n \"name\": \"@shopware-ag/dive\",\n \"version\": \"1.16.5\",\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 \"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\",\n \"dev\": \"tsup --watch\",\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 }\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 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';\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} = {\n ceilExp,\n floorExp,\n roundExp,\n toFixedExp,\n truncateExp,\n signedAngleTo,\n};\n"],"mappings":"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","names":["import_three","import_three","import_three","import_three","import_three","import_three","DIVEMediaCreator","DIVEIO","import_three","import_three","import_three","import_Addons","import_three","import_three","object","import_three","import_three","import_three","DIVESelectTool","import_tween","updateTween","import_three","SpriteText","import_MathUtils"]}
|
|
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/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/controls/OrbitControls.ts","../src/toolbox/Toolbox.ts","../src/animation/AnimationSystem.ts","../src/axiscamera/AxisCamera.ts","../src/constant/AxisHelperColors.ts","../src/helper/getObjectDelta/getObjectDelta.ts","../src/info/Info.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/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 { Intersection, Object3D, Raycaster, Vector2, Vector3 } from 'three';\nimport {\n PRODUCT_LAYER_MASK,\n UI_LAYER_MASK,\n} from '../constant/VisibilityLayerMask';\nimport { DIVEScene } from '../scene/Scene';\nimport 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 { DIVEScene } from '../../scene/Scene.ts';\nimport DIVEOrbitControls from '../../controls/OrbitControls.ts';\nimport { TransformControls } from 'three/examples/jsm/Addons';\nimport { type DIVEMovable } from '../../interface/Movable.ts';\nimport { implementsInterface } from '../../helper/isInterface/implementsInterface.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;\n\n constructor(scene: DIVEScene, controller: DIVEOrbitControls) {\n super(scene, controller);\n this.name = 'DIVETransformTool';\n\n this._gizmo = new TransformControls(\n this._controller.object,\n this._controller.domElement,\n );\n this._gizmo.mode = 'translate';\n\n // happens when pointerDown event is called on gizmo\n this._gizmo.addEventListener('mouseDown', () => {\n controller.enabled = false;\n\n if (\n !implementsInterface<DIVEMovable>(\n this._gizmo.object,\n 'isMovable',\n )\n )\n return;\n if (!this._gizmo.object.onMoveStart) return;\n this._gizmo.object.onMoveStart();\n });\n\n // happens when pointerMove event is called on gizmo\n this._gizmo.addEventListener('objectChange', () => {\n if (\n !implementsInterface<DIVEMovable>(\n this._gizmo.object,\n 'isMovable',\n )\n )\n return;\n if (!this._gizmo.object.onMove) return;\n this._gizmo.object.onMove();\n });\n\n // happens when pointerUp event is called on gizmo\n this._gizmo.addEventListener('mouseUp', () => {\n controller.enabled = true;\n\n if (\n !implementsInterface<DIVEMovable>(\n this._gizmo.object,\n 'isMovable',\n )\n )\n return;\n if (!this._gizmo.object.onMoveEnd) return;\n this._gizmo.object.onMoveEnd();\n });\n\n 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 } else if (!active && contains) {\n this._scene.remove(this._gizmo);\n }\n }\n\n // public onPointerDown(e: PointerEvent): void {\n // super.onPointerDown(e);\n\n // // if (this._hovered) {\n // // this._dragRaycastOnObjects = this._gizmo.gizmoPlane.children;\n // // }\n // }\n\n // protected raycast(): Intersection[] {\n // return super.raycast(this._gizmo.gizmoNode.children);\n // }\n}\n","import { type Object3D } from 'three';\nimport { 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 { DIVEScene } from '../scene/Scene.ts';\nimport { DIVERenderer } from '../renderer/Renderer.ts';\nimport DIVEOrbitControls from '../controls/OrbitControls.ts';\nimport { 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","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';\n\nimport { generateUUID } from 'three/src/math/MathUtils';\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(uri: string): DIVE {\n const dive = new DIVE();\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 = 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 = generateUUID();\n\n // add loaded listener\n dive.Communication.Subscribe('MODEL_LOADED', (data) => {\n if (data.id !== modelid) return;\n dive.Communication.PerformAction('PLACE_ON_FLOOR', {\n id: modelid,\n });\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(\n `DIVE ${pkgjson.version} initialized ${process.env.NODE_ENV === 'development' ? 'in development mode' : ''}`,\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';\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\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, () => void> = new Map<\n string,\n () => void\n >();\n private postRenderCallbacks: Map<string, () => void> = new Map<\n string,\n () => void\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(() => {\n this.internal_render(scene, cam);\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: () => void): 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: () => void): 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(scene: Scene, cam: Camera): 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();\n });\n\n this.render(scene, cam);\n\n this.postRenderCallbacks.forEach((callback) => {\n callback();\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';\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 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\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 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 DIVEPrimitive).SetPosition(group.position);\n if (group.rotation !== undefined)\n (sceneObject as DIVEPrimitive).SetRotation(group.rotation);\n if (group.scale !== undefined)\n (sceneObject as DIVEPrimitive).SetScale(group.scale);\n if (group.visible !== undefined)\n (sceneObject as DIVEPrimitive).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 this.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 this.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 this.remove(sceneObject);\n }\n\n private deleteGroup(group: Partial<COMGroup> & { id: string }): void {\n const sceneObject = this.GetSceneObject(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.children.length - 1; i >= 0; i--) {\n this.attach(sceneObject.children[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/Addons.js';\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';\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 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\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 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 // copy object to payload to use later\n Object.assign(payload, deletedObject);\n\n this.registered.delete(payload.id);\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 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 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 return true;\n }\n\n // attach to new parent\n parentObject.attach(sceneObject);\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/Addons.js';\nimport { findSceneRecursive } from '../helper/findSceneRecursive/findSceneRecursive';\nimport { type COMMaterial } from '../com/types';\nimport { DIVENode } from '../node/Node';\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\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 const oldPos = this.position.clone();\n this.position.y = -this._boundingBox.min.y * this.scale.y;\n if (this.position.y === oldPos.y) return;\n\n this.onMove();\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, 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 _boundingBox: Box3;\n\n constructor() {\n super();\n\n this.layers.mask = PRODUCT_LAYER_MASK;\n\n this._boundingBox = new Box3();\n }\n\n public SetPosition(position: Vector3Like): void {\n this.position.set(position.x, position.y, position.z);\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.position,\n rotation: this.rotation,\n scale: this.scale,\n },\n );\n }\n\n public onMove(): void {\n DIVECommunication.get(this.userData.id)?.PerformAction(\n 'UPDATE_OBJECT',\n {\n id: this.userData.id,\n position: this.position,\n rotation: this.rotation,\n scale: this.scale,\n },\n );\n\n if (this.parent && 'isDIVEGroup' in this.parent) {\n (this.parent as unknown as DIVEGroup).UpdateLineTo(this);\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, GLTF, GLTFLoader } from 'three/examples/jsm/Addons.js';\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 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';\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 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 const oldPos = this.position.clone();\n this.position.y = -this._boundingBox.min.y * this.scale.y;\n if (this.position.y === oldPos.y) return;\n\n this.onMove();\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 switch (geometry.name.toLowerCase()) {\n case 'cylinder':\n return this.createCylinderGeometry(geometry);\n case 'sphere':\n return this.createSphereGeometry(geometry);\n case 'pyramid':\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 const geo = new ConeGeometry(\n geometry.width / 2,\n geometry.height,\n 4,\n 1,\n true,\n );\n geo.rotateY(Math.PI / 4);\n geo.translate(0, geometry.height / 2, 0);\n return geo;\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 { BufferGeometry, Line, LineDashedMaterial, Vector3 } 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[]; // lines to children\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 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 // create a line to the new object\n const line = this.createLine();\n this.add(line);\n this._lines.push(line);\n\n // attach (insted of add) object to keep it's 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 { 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 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 { DIVERenderer } from '../renderer/Renderer.ts';\nimport { DIVEScene } from '../scene/Scene.ts';\nimport 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","export class DIVEInfo {\n private static _supportsWebXR: boolean | null = 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 if (!navigator.xr) {\n this._supportsWebXR = false;\n return this._supportsWebXR;\n }\n // Check if immersive-vr session mode is supported\n try {\n const supported =\n await navigator.xr.isSessionSupported('immersive-ar');\n this._supportsWebXR = supported;\n } catch (error) {\n this._supportsWebXR = false;\n }\n return this._supportsWebXR;\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","{\n \"name\": \"@shopware-ag/dive\",\n \"version\": \"1.16.7\",\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 \"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\",\n \"dev\": \"tsup --watch\",\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 }\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 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';\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} = {\n ceilExp,\n floorExp,\n roundExp,\n toFixedExp,\n truncateExp,\n signedAngleTo,\n};\n"],"mappings":"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","names":["import_three","import_three","import_three","import_three","import_three","import_three","DIVEMediaCreator","DIVEIO","import_three","import_three","import_three","import_Addons","import_three","import_three","object","import_three","import_three","import_three","DIVESelectTool","import_tween","updateTween","import_three","SpriteText","import_MathUtils"]}
|