@shopware-ag/dive 1.12.1 → 1.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (77) hide show
  1. package/build/dive.cjs +458 -405
  2. package/build/dive.cjs.map +1 -1
  3. package/build/dive.d.cts +314 -78
  4. package/build/dive.d.ts +314 -78
  5. package/build/dive.js +430 -377
  6. package/build/dive.js.map +1 -1
  7. package/package.json +1 -1
  8. package/src/__test__/DIVE.test.ts +33 -29
  9. package/src/axiscamera/AxisCamera.ts +1 -1
  10. package/src/axiscamera/__test__/AxisCamera.test.ts +1 -1
  11. package/src/com/Communication.ts +59 -14
  12. package/src/com/__test__/Communication.test.ts +111 -31
  13. package/src/com/actions/index.ts +2 -0
  14. package/src/com/actions/object/addobject.ts +1 -1
  15. package/src/com/actions/object/deleteobject.ts +1 -1
  16. package/src/com/actions/object/deselectobject.ts +1 -1
  17. package/src/com/actions/object/getallobjects.ts +1 -1
  18. package/src/com/actions/object/getobjects.ts +1 -1
  19. package/src/com/actions/object/selectobject.ts +1 -1
  20. package/src/com/actions/object/setparent.ts +9 -0
  21. package/src/com/actions/object/updateobject.ts +1 -1
  22. package/src/com/actions/scene/getallscenedata.ts +1 -1
  23. package/src/com/types/COMBaseEntity.ts +9 -0
  24. package/src/com/types/COMEntity.ts +7 -0
  25. package/src/com/types/COMEntityType.ts +1 -0
  26. package/src/com/types/COMGeometry.ts +6 -0
  27. package/src/com/types/COMGroup.ts +9 -0
  28. package/src/com/types/COMLight.ts +10 -0
  29. package/src/com/types/COMMaterial.ts +12 -0
  30. package/src/com/types/COMModel.ts +12 -0
  31. package/src/com/types/COMPov.ts +8 -0
  32. package/src/com/types/COMPrimitive.ts +12 -0
  33. package/src/com/types/index.ts +21 -0
  34. package/src/dive.ts +9 -16
  35. package/src/grid/Grid.ts +1 -1
  36. package/src/grid/__test__/Grid.test.ts +1 -1
  37. package/src/group/Group.ts +126 -0
  38. package/src/group/__test__/Group.test.ts +100 -0
  39. package/src/helper/findSceneRecursive/findSceneRecursive.ts +1 -1
  40. package/src/light/AmbientLight.ts +3 -0
  41. package/src/light/PointLight.ts +6 -3
  42. package/src/light/SceneLight.ts +2 -0
  43. package/src/light/__test__/PointLight.test.ts +8 -6
  44. package/src/light/__test__/SceneLight.test.ts +8 -6
  45. package/src/loadingmanager/LoadingManager.ts +1 -1
  46. package/src/loadingmanager/__test__/LoadingManager.test.ts +1 -1
  47. package/src/mediacreator/MediaCreator.ts +1 -1
  48. package/src/mediacreator/__test__/MediaCreator.test.ts +6 -4
  49. package/src/model/Model.ts +8 -7
  50. package/src/model/__test__/Model.test.ts +13 -10
  51. package/src/primitive/Primitive.ts +4 -3
  52. package/src/primitive/__test__/Primitive.test.ts +9 -7
  53. package/src/primitive/floor/Floor.ts +1 -1
  54. package/src/primitive/floor/__test__/Floor.test.ts +1 -1
  55. package/src/renderer/__test__/Renderer.test.ts +1 -1
  56. package/src/scene/Scene.ts +29 -9
  57. package/src/scene/__test__/Scene.test.ts +33 -19
  58. package/src/scene/root/Root.ts +239 -72
  59. package/src/scene/root/__test__/Root.test.ts +476 -114
  60. package/src/toolbox/BaseTool.ts +1 -1
  61. package/src/toolbox/Toolbox.ts +1 -1
  62. package/src/toolbox/__test__/BaseTool.test.ts +1 -1
  63. package/src/toolbox/__test__/Toolbox.test.ts +1 -1
  64. package/src/toolbox/select/SelectTool.ts +1 -1
  65. package/src/toolbox/select/__test__/SelectTool.test.ts +11 -9
  66. package/src/toolbox/transform/TransformTool.ts +1 -1
  67. package/src/toolbox/transform/__test__/TransformTool.test.ts +12 -10
  68. package/src/types/SceneObjects.ts +14 -0
  69. package/src/types/index.ts +5 -0
  70. package/src/com/index.ts +0 -3
  71. package/src/com/types.ts +0 -58
  72. package/src/scene/root/lightroot/LightRoot.ts +0 -99
  73. package/src/scene/root/lightroot/__test__/LightRoot.test.ts +0 -145
  74. package/src/scene/root/modelroot/ModelRoot.ts +0 -98
  75. package/src/scene/root/modelroot/__test__/ModelRoot.test.ts +0 -189
  76. package/src/scene/root/primitiveroot/PrimitiveRoot.ts +0 -88
  77. package/src/scene/root/primitiveroot/__test__/PrimitiveRoot.test.ts +0 -181
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/constant/VisibilityLayerMask.ts","../src/interface/Draggable.ts","../src/interface/Hoverable.ts","../src/toolbox/BaseTool.ts","../src/toolbox/transform/TransformTool.ts","../src/interface/Selectable.ts","../src/toolbox/select/SelectTool.ts","../src/camera/PerspectiveCamera.ts","../src/mediacreator/MediaCreator.ts","../src/dive.ts","../src/renderer/Renderer.ts","../src/scene/Scene.ts","../src/scene/root/Root.ts","../src/scene/root/lightroot/LightRoot.ts","../src/light/AmbientLight.ts","../src/light/PointLight.ts","../src/com/Communication.ts","../src/light/SceneLight.ts","../src/scene/root/modelroot/ModelRoot.ts","../src/model/Model.ts","../src/helper/findSceneRecursive/findSceneRecursive.ts","../src/loadingmanager/LoadingManager.ts","../src/scene/root/primitiveroot/PrimitiveRoot.ts","../src/primitive/Primitive.ts","../src/primitive/floor/Floor.ts","../src/constant/GridColors.ts","../src/grid/Grid.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/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","../src/info/Info.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","/**\n * Interface for objects that can be hovered in the scene.\n *\n * @module\n */\n\nimport { type Object3D } from \"three\";\nimport { type DraggableEvent } from \"../toolbox/BaseTool\";\n\nexport interface DIVEDraggable {\n isDraggable: true;\n onDragStart?: (e: DraggableEvent) => void;\n onDrag?: (e: DraggableEvent) => void;\n onDragEnd?: (e: DraggableEvent) => void;\n}\n\nexport const isDraggable = (object: Object3D): object is Object3D & DIVEDraggable => {\n return 'isDraggable' in object;\n};\n\nexport const findDraggableInterface = (child: Object3D): (Object3D & DIVEDraggable) | undefined => {\n if (child === undefined) return undefined;\n\n if (child.parent === null) {\n // in this case it is the scene itself\n return undefined;\n }\n\n if (isDraggable(child)) {\n return child as (Object3D & DIVEDraggable);\n }\n\n return findDraggableInterface(child.parent);\n}","/**\n * Interface for objects that can be hovered in the scene.\n *\n * @module\n */\n\nimport { type Object3D, type Intersection } from \"three\";\n\nexport interface DIVEHoverable {\n isHoverable: true;\n onPointerEnter?: (i: Intersection) => void;\n onPointerOver?: (i: Intersection) => void;\n onPointerLeave?: () => void;\n}\n\nexport const isHoverable = (object: Object3D): object is Object3D & DIVEHoverable => {\n return 'isHoverable' in object;\n};\n\nexport const findHoverableInterface = (child: Object3D): (Object3D & DIVEHoverable) | undefined => {\n if (child === undefined) return undefined;\n\n if (child.parent === null) {\n // in this case it is the scene itself\n return undefined;\n }\n\n if (isHoverable(child)) {\n return child as (Object3D & DIVEHoverable);\n }\n\n return findHoverableInterface(child.parent);\n}","import { Intersection, Object3D, Raycaster, Vector2, Vector3 } from \"three\";\nimport { PRODUCT_LAYER_MASK, UI_LAYER_MASK } from \"../constant/VisibilityLayerMask\";\nimport DIVEScene from \"../scene/Scene\";\nimport DIVEOrbitControls from \"../controls/OrbitControls\";\nimport { DIVEDraggable, findDraggableInterface } from \"../interface/Draggable\";\nimport { DIVEHoverable, findHoverableInterface } from \"../interface/Hoverable\";\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 this._pointerPrimaryDown\n || this._pointerMiddleDown\n || this._pointerSecondaryDown;\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 case 1:\n this._pointerMiddleDown = true;\n break;\n case 2:\n this._pointerSecondaryDown = true;\n break;\n }\n\n this._lastPointerDown.copy(this._pointer);\n\n this._draggable = findDraggableInterface(this._intersects[0]?.object) || 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(this._dragRaycastOnObjects, true);\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 = findHoverableInterface(this._intersects[0]?.object);\n if (this._intersects[0] && hoverable) {\n if (!this._hovered) {\n if (hoverable.onPointerEnter) 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) this._hovered.onPointerLeave();\n if (hoverable.onPointerEnter) hoverable.onPointerEnter(this._intersects[0]);\n this._hovered = hoverable;\n return;\n }\n\n if (hoverable.onPointerOver) hoverable.onPointerOver(this._intersects[0]);\n this._hovered = hoverable;\n\n } else {\n if (this._hovered) {\n if (this._hovered.onPointerLeave) 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(this._dragRaycastOnObjects, true);\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(this._dragCurrent.clone(), this._dragStart.clone());\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(this._dragCurrent.clone(), this._dragStart.clone());\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) return this._raycaster.intersectObjects(objects, true).filter(i => i.object.visible);\n return this._raycaster.intersectObjects(this._scene.children, true).filter(i => i.object.visible);\n }\n\n private pointerWasDragged(): boolean {\n return this._lastPointerDown.distanceTo(this._pointer) > this.POINTER_DRAG_THRESHOLD;\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 DIVEMoveable } from \"../../interface/Moveable.ts\";\n\nexport const isTransformTool = (tool: DIVEBaseTool): 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 DIVEMoveable to be moveable.\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(this._controller.object, this._controller.domElement);\n this._gizmo.mode = 'translate';\n\n this._gizmo.addEventListener('mouseDown', () => {\n controller.enabled = false;\n });\n\n this._gizmo.addEventListener('mouseUp', () => {\n controller.enabled = true;\n });\n\n this._gizmo.addEventListener('objectChange', () => {\n if (!this._gizmo.object) return;\n if (!('isMoveable' in this._gizmo.object)) return;\n if (!('onMove' in this._gizmo.object)) return;\n (this._gizmo.object as DIVEMoveable).onMove!();\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 * Interface for objects that can be selected in the scene.\n *\n * @module\n */\n\nimport { Object3D } from \"three\";\n\nexport interface DIVESelectable {\n isSelectable: true;\n onSelect?: () => void;\n onDeselect?: () => void;\n}\n\nexport function isSelectable(object: Object3D): object is Object3D & DIVESelectable {\n return 'isSelectable' in object;\n}\n\nexport function findSelectableInterface(child: Object3D): (Object3D & DIVESelectable) | undefined {\n if (child === undefined) return undefined;\n\n if (child.parent === null) {\n // in this case it is the scene itself\n return undefined;\n }\n\n if (isSelectable(child)) {\n // in this case it is the Selectable\n return child;\n }\n\n // search recursively in parent\n return findSelectableInterface(child.parent);\n}","import { type Object3D } from \"three\";\nimport DIVEScene from \"../../scene/Scene.ts\";\nimport DIVETransformTool from \"../transform/TransformTool.ts\";\nimport type DIVEOrbitControls from \"../../controls/OrbitControls.ts\";\nimport { type DIVESelectable, findSelectableInterface } from \"../../interface/Selectable.ts\";\nimport { type DIVEMoveable } from \"../../interface/Moveable.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 DIVEMoveable to be moveable.\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\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 ('isMoveable' in selectable) {\n const movable = selectable as (Object3D & DIVESelectable & DIVEMoveable);\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.intersectObjects(this._scene.Root.children, true).filter((intersect) => intersect.object.visible)[0];\n const selectable = findSelectableInterface(first?.object);\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\n // select clicked object\n this.Select(selectable);\n }\n}","import { PerspectiveCamera } from \"three\";\nimport { DEFAULT_LAYER_MASK, HELPER_LAYER_MASK, PRODUCT_LAYER_MASK, UI_LAYER_MASK } from \"../constant/VisibilityLayerMask.ts\";\n\nexport type DIVEPerspectiveCameraSettings = {\n fov: number;\n near: number;\n far: number;\n}\n\nexport const DIVEPerspectiveCameraDefaultSettings: DIVEPerspectiveCameraSettings = {\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 = DEFAULT_LAYER_MASK | UI_LAYER_MASK | HELPER_LAYER_MASK | PRODUCT_LAYER_MASK;\n public static readonly LIVE_VIEW_LAYER_MASK = PRODUCT_LAYER_MASK;\n\n public onSetCameraLayer: (mask: number) => void = () => { };\n\n constructor(settings: Partial<DIVEPerspectiveCameraSettings> = DIVEPerspectiveCameraDefaultSettings) {\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 = layer === 'LIVE' ? DIVEPerspectiveCamera.LIVE_VIEW_LAYER_MASK : 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(renderer: DIVERenderer, scene: DIVEScene, controller: DIVEOrbitControls) {\n this.renderer = renderer;\n this.scene = scene;\n this.controller = controller;\n }\n\n public GenerateMedia(position: Vector3Like, target: Vector3Like, width: number, height: number): 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\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 = DIVEPerspectiveCamera.LIVE_VIEW_LAYER_MASK;\n this.renderer.render(this.scene, this.controller.object);\n this.controller.object.layers.mask = 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 { DIVERenderer, DIVERendererDefaultSettings, DIVERendererSettings } from \"./renderer/Renderer.ts\";\nimport DIVEScene from \"./scene/Scene.ts\";\nimport DIVEPerspectiveCamera, { DIVEPerspectiveCameraDefaultSettings, DIVEPerspectiveCameraSettings } from \"./camera/PerspectiveCamera.ts\";\nimport DIVEOrbitControls, { DIVEOrbitControlsDefaultSettings, DIVEOrbitControlsSettings } 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 type { Actions } from './com/actions/index.ts';\nimport type { COMPov, COMLight, COMModel, COMEntity, COMPrimitive } from './com/types.ts';\nimport { DIVEMath } from './math/index.ts';\nimport { generateUUID } from \"three/src/math/MathUtils\";\nimport { DIVEInfo } from \"./info/Info.ts\";\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('COMPUTE_ENCOMPASSING_VIEW', {});\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) this.renderer = new DIVERenderer(this._settings.renderer);\n\n // apply perspective camera settings\n if (settingsDelta.perspectiveCamera) {\n if (settingsDelta.perspectiveCamera.fov !== undefined) this.perspectiveCamera.fov = settingsDelta.perspectiveCamera.fov;\n if (settingsDelta.perspectiveCamera.near !== undefined) this.perspectiveCamera.near = settingsDelta.perspectiveCamera.near;\n if (settingsDelta.perspectiveCamera.far !== undefined) this.perspectiveCamera.far = settingsDelta.perspectiveCamera.far;\n this.perspectiveCamera.OnResize(this.renderer.domElement.width, this.renderer.domElement.height);\n }\n // apply orbit controls settings\n if (settingsDelta.orbitControls) {\n if (settingsDelta.orbitControls.enableDamping !== undefined) this.orbitControls.enableDamping = settingsDelta.orbitControls.enableDamping;\n if (settingsDelta.orbitControls.dampingFactor !== undefined) this.orbitControls.dampingFactor = 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(this.renderer, this.scene, this.orbitControls);\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 = { ...DIVEDefaultSettings, ...(settings !== undefined ? settings : {}) };\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(this._settings.perspectiveCamera);\n\n // initialize animation system\n this.animationSystem = new DIVEAnimationSystem(this.renderer);\n\n this.orbitControls = new DIVEOrbitControls(this.perspectiveCamera, this.renderer, this.animationSystem, this._settings.orbitControls);\n this.toolbox = new DIVEToolbox(this.scene, this.orbitControls);\n this.communication = new DIVECommunication(this.renderer, this.scene, this.orbitControls, this.toolbox);\n\n\n // initialize axis camera\n if (this._settings.displayAxes) {\n this.axisCamera = new DIVEAxisCamera(this.renderer, this.scene, this.orbitControls);\n } else {\n this.axisCamera = null;\n }\n\n // add resize observer if autoResize is enabled\n if (this._settings.autoResize) {\n this.addResizeObserver();\n }\n\n // whene everything is done, start the renderer\n this.renderer.StartRenderer(this.scene, this.perspectiveCamera);\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (window as any).DIVE = {\n PrintScene: () => {\n console.log(this.scene);\n },\n }\n\n console.log('DIVE initialized');\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) 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 type {\n Actions,\n COMPov,\n COMLight,\n COMModel,\n COMPrimitive,\n COMEntity,\n};\n\nexport {\n DIVE,\n DIVECommunication,\n DIVEMath,\n}","import { Camera, MathUtils, NoToneMapping, PCFSoftShadowMap, Scene, ShadowMapType, ToneMapping, WebGLRenderer } 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<string, () => void>();\n private postRenderCallbacks: Map<string, () => void> = new Map<string, () => void>();\n\n constructor(rendererSettings: Partial<DIVERendererSettings> = DIVERendererDefaultSettings) {\n super({\n antialias: rendererSettings.antialias || 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 = rendererSettings.shadowMapEnabled || DIVERendererDefaultSettings.shadowMapEnabled;\n this.shadowMap.type = rendererSettings.shadowMapType || DIVERendererDefaultSettings.shadowMapType;\n\n this.toneMapping = rendererSettings.toneMapping || 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(() => { this.internal_render(scene, cam) });\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) => { callback(); });\n\n this.render(scene, cam);\n\n this.postRenderCallbacks.forEach((callback) => { callback(); });\n\n this.force = false;\n }\n}","import { Color, Scene, type Box3, type ColorRepresentation, type Object3D } from 'three';\nimport { type COMModel, type COMEntity } from '../com/types';\nimport DIVERoot from './root/Root';\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 default class DIVEScene extends Scene {\n private root: DIVERoot;\n public get Root(): DIVERoot {\n return this.root;\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\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(object: Partial<COMEntity>): Object3D | undefined {\n return this.Root.GetSceneObject(object);\n }\n\n public AddSceneObject(object: COMEntity): void {\n this.Root.UpdateSceneObject(object);\n }\n\n public UpdateSceneObject(object: Partial<COMEntity>): void {\n this.Root.UpdateSceneObject(object);\n }\n\n public DeleteSceneObject(object: Partial<COMEntity>): void {\n this.Root.DeleteSceneObject(object);\n }\n\n public PlaceOnFloor(object: Partial<COMModel>): void {\n this.Root.PlaceOnFloor(object);\n }\n}\n","import { Box3, Object3D } from \"three\";\nimport DIVELightRoot from \"./lightroot/LightRoot.ts\";\nimport DIVEModelRoot from \"./modelroot/ModelRoot.ts\";\nimport { DIVEPrimitiveRoot } from \"./primitiveroot/PrimitiveRoot.ts\";\nimport { type COMLight, type COMModel, type COMEntity, type COMPrimitive } from \"../../com/types.ts\";\nimport DIVEFloor from \"../../primitive/floor/Floor.ts\";\nimport DIVEGrid from \"../../grid/Grid.ts\";\n\n/**\n * A basic scene node to hold grid, floor and all lower level roots.\n *\n * @module\n */\n\nexport default class DIVERoot extends Object3D {\n private lightRoot: DIVELightRoot;\n private modelRoot: DIVEModelRoot;\n private primitiveRoot: DIVEPrimitiveRoot;\n private floor: DIVEFloor;\n private grid: DIVEGrid;\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 this.name = \"Root\";\n\n this.lightRoot = new DIVELightRoot();\n this.add(this.lightRoot);\n\n this.modelRoot = new DIVEModelRoot();\n this.add(this.modelRoot);\n\n this.primitiveRoot = new DIVEPrimitiveRoot();\n this.add(this.primitiveRoot);\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 ComputeSceneBB(): Box3 {\n const bb = new Box3();\n this.modelRoot.traverse((object: Object3D) => {\n if ('isObject3D' in object) {\n bb.expandByObject(object);\n }\n });\n this.primitiveRoot.traverse((object: Object3D) => {\n if ('isObject3D' in object) {\n bb.expandByObject(object);\n }\n });\n return bb;\n }\n\n public GetSceneObject(object: Partial<COMEntity>): Object3D | undefined {\n switch (object.entityType) {\n case \"pov\": {\n return undefined;\n }\n case \"light\": {\n return this.lightRoot.GetLight(object as COMLight);\n }\n case \"model\": {\n return this.modelRoot.GetModel(object as COMModel);\n }\n case \"primitive\": {\n return this.primitiveRoot.GetPrimitive(object as COMPrimitive);\n }\n }\n }\n\n public AddSceneObject(object: COMEntity): void {\n switch (object.entityType) {\n case \"pov\": {\n break;\n }\n case \"light\": {\n this.lightRoot.UpdateLight(object as COMLight);\n break;\n }\n case \"model\": {\n this.modelRoot.UpdateModel(object as COMModel);\n break;\n }\n case \"primitive\": {\n this.primitiveRoot.UpdatePrimitive(object as COMPrimitive);\n break;\n }\n }\n }\n\n public UpdateSceneObject(object: Partial<COMEntity>): void {\n switch (object.entityType) {\n case \"pov\": {\n break;\n }\n case \"light\": {\n this.lightRoot.UpdateLight(object as COMLight);\n break;\n }\n case \"model\": {\n this.modelRoot.UpdateModel(object as COMModel);\n break;\n }\n case \"primitive\": {\n this.primitiveRoot.UpdatePrimitive(object as COMPrimitive);\n break;\n }\n }\n }\n\n public DeleteSceneObject(object: Partial<COMEntity>): void {\n switch (object.entityType) {\n case \"pov\": {\n break;\n }\n case \"light\": {\n this.lightRoot.DeleteLight(object as COMLight);\n break;\n }\n case \"model\": {\n this.modelRoot.DeleteModel(object as COMModel);\n break;\n }\n case \"primitive\": {\n this.primitiveRoot.DeletePrimitive(object as COMPrimitive);\n break;\n }\n }\n }\n\n public PlaceOnFloor(object: Partial<COMEntity>): void {\n switch (object.entityType) {\n case \"pov\":\n case \"light\": {\n break;\n }\n case \"model\": {\n this.modelRoot.PlaceOnFloor(object as COMModel);\n break;\n }\n case \"primitive\": {\n this.primitiveRoot.PlaceOnFloor(object as COMPrimitive);\n break;\n }\n }\n }\n}\n","import { Color, Object3D } from \"three\";\nimport { type COMLight } from \"../../../com/types.ts\";\nimport DIVEAmbientLight from \"../../../light/AmbientLight.ts\";\nimport DIVEPointLight from \"../../../light/PointLight.ts\";\nimport DIVESceneLight from \"../../../light/SceneLight.ts\";\nimport { type TransformControls } from \"three/examples/jsm/Addons\";\nimport type DIVEScene from \"../../Scene.ts\";\n\n/**\n * A basic scene node to hold all lights.\n *\n * @module\n */\n\nexport default class DIVELightRoot extends Object3D {\n constructor() {\n super();\n this.name = \"LightRoot\";\n }\n\n public GetLight(object: Partial<COMLight>): Object3D | undefined {\n if (object.id === undefined) {\n console.warn('LightRoot.GetLight: object.id is undefined')\n return undefined;\n }\n return this.children.find(object3D => object3D.userData.id === object.id);\n }\n\n public UpdateLight(light: Partial<COMLight>): void {\n // update scene here for light\n if (light.id === undefined) {\n console.warn(`LightRoot.UpdateLight: light.id is undefined`)\n return;\n }\n\n let sceneObject = this.children.find(object3D => object3D.userData.id === light.id);\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(`LightRoot.UpdateLight: Unknown light type: ${light.type}`);\n return;\n }\n }\n sceneObject.userData.id = light.id;\n this.add(sceneObject);\n }\n\n if (light.name !== undefined && light.name !== null) sceneObject.name = light.name;\n if (light.position !== undefined && light.position !== null) sceneObject.position.set(light.position.x, light.position.y, light.position.z);\n if (light.intensity !== undefined && light.intensity !== null) (sceneObject as (DIVEAmbientLight | DIVEPointLight)).SetIntensity(light.intensity);\n if (light.enabled !== undefined && light.enabled !== null) (sceneObject as (DIVEAmbientLight | DIVEPointLight)).SetEnabled(light.enabled);\n if (light.color !== undefined && light.color !== null) (sceneObject as (DIVEAmbientLight | DIVEPointLight)).SetColor(new Color(light.color));\n if (light.visible !== undefined && light.visible !== null) (sceneObject as (DIVEAmbientLight | DIVEPointLight)).visible = light.visible;\n }\n\n public DeleteLight(light: Partial<COMLight>): void {\n if (light.id === undefined) {\n console.warn('LightRoot.DeleteLight: light.id is undefined')\n return;\n }\n\n const sceneObject = this.children.find(object3D => object3D.userData.id === light.id);\n if (!sceneObject) {\n console.warn(`LightRoot.DeleteLight: Light with id ${light.id} not found`);\n return;\n }\n\n // _______________________________________________________\n // this is only neccessary due to using the old TransformControls instead of the new DIVEGizmo\n const findScene = (object: Object3D): DIVEScene => {\n if (object.parent !== null) {\n return findScene(object.parent);\n };\n return object as DIVEScene;\n }\n\n const scene = findScene(sceneObject);\n scene.children.find((object) => {\n if ('isTransformControls' in object) {\n (object as TransformControls).detach();\n }\n });\n // _______________________________________________________\n\n this.remove(sceneObject);\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 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 { PointLight, Color, SphereGeometry, MeshBasicMaterial, Mesh, FrontSide, Object3D } from 'three';\nimport DIVECommunication from '../com/Communication';\nimport { PRODUCT_LAYER_MASK, UI_LAYER_MASK } from '../constant/VisibilityLayerMask';\nimport { DIVEMoveable } from '../interface/Moveable';\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 extends Object3D implements DIVESelectable, DIVEMoveable {\n public isMoveable: true = true;\n public isSelectable: true = true;\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(geoSize, geoSize * 320, geoSize * 320);\n\n const material = new MeshBasicMaterial({ color: this.light.color, transparent: true, opacity: 0.8, side: FrontSide });\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 = 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('UPDATE_OBJECT', { id: this.userData.id, position: this.position });\n }\n\n public onSelect(): void {\n DIVECommunication.get(this.userData.id)?.PerformAction('SELECT_OBJECT', { id: this.userData.id });\n }\n\n public onDeselect(): void {\n DIVECommunication.get(this.userData.id)?.PerformAction('DESELECT_OBJECT', { id: this.userData.id });\n }\n}\n","import { Actions } from \"./actions/index.ts\";\nimport { generateUUID } from 'three/src/math/MathUtils';\n\n// type imports\nimport { type Color, type MeshStandardMaterial } from \"three\";\nimport { type COMLight, type COMModel, type COMEntity, type COMPov } from \"./types.ts\";\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 { isSelectTool } from \"../toolbox/select/SelectTool.ts\";\n\ntype EventListener<Action extends keyof Actions> = (payload: Actions[Action]['PAYLOAD']) => 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 default class DIVECommunication {\n private static __instances: DIVECommunication[] = [];\n\n public static get(id: string): DIVECommunication | undefined {\n const fromComID = this.__instances.find((instance) => instance.id === id);\n if (fromComID) return fromComID;\n return this.__instances.find((instance) => Array.from(instance.registered.values()).find((object) => object.id === id));\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').DIVEMediaCreator as typeof import('../mediacreator/MediaCreator.ts').DIVEMediaCreator;\n this._mediaGenerator = new DIVEMediaCreator(this.renderer, this.scene, this.controller);\n }\n return this._mediaGenerator;\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>[]> = new Map();\n\n constructor(renderer: DIVERenderer, scene: DIVEScene, controls: DIVEOrbitControls, toolbox: DIVEToolbox) {\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\n DIVECommunication.__instances.push(this);\n }\n\n public DestroyInstance(): boolean {\n const existingIndex = DIVECommunication.__instances.findIndex((entry) => entry.id === this.id);\n if (existingIndex === -1) return false;\n DIVECommunication.__instances.splice(existingIndex, 1);\n return true;\n }\n\n public PerformAction<Action extends keyof Actions>(action: Action, payload: Actions[Action]['PAYLOAD']): Actions[Action]['RETURN'] {\n let returnValue: Actions[Action]['RETURN'] = false;\n\n switch (action) {\n case 'GET_ALL_SCENE_DATA': {\n returnValue = this.getAllSceneData(payload as Actions['GET_ALL_SCENE_DATA']['PAYLOAD']);\n break;\n }\n case 'GET_ALL_OBJECTS': {\n returnValue = this.getAllObjects(payload as Actions['GET_ALL_OBJECTS']['PAYLOAD']);\n break;\n }\n case 'GET_OBJECTS': {\n returnValue = this.getObjects(payload as Actions['GET_OBJECTS']['PAYLOAD']);\n break;\n }\n case 'ADD_OBJECT': {\n returnValue = this.addObject(payload as Actions['ADD_OBJECT']['PAYLOAD']);\n break;\n }\n case 'UPDATE_OBJECT': {\n returnValue = this.updateObject(payload as Actions['UPDATE_OBJECT']['PAYLOAD']);\n break;\n }\n case 'DELETE_OBJECT': {\n returnValue = this.deleteObject(payload as Actions['DELETE_OBJECT']['PAYLOAD']);\n break;\n }\n case 'SELECT_OBJECT': {\n returnValue = this.selectObject(payload as Actions['SELECT_OBJECT']['PAYLOAD']);\n break;\n }\n case 'DESELECT_OBJECT': {\n returnValue = this.deselectObject(payload as Actions['DESELECT_OBJECT']['PAYLOAD']);\n break;\n }\n case 'SET_BACKGROUND': {\n returnValue = this.setBackground(payload as Actions['SET_BACKGROUND']['PAYLOAD']);\n break;\n }\n case 'DROP_IT': {\n returnValue = this.dropIt(payload as Actions['DROP_IT']['PAYLOAD']);\n break;\n }\n case 'PLACE_ON_FLOOR': {\n returnValue = this.placeOnFloor(payload as Actions['PLACE_ON_FLOOR']['PAYLOAD']);\n break;\n }\n case 'SET_CAMERA_TRANSFORM': {\n returnValue = this.setCameraTransform(payload as Actions['SET_CAMERA_TRANSFORM']['PAYLOAD']);\n break;\n }\n case 'GET_CAMERA_TRANSFORM': {\n returnValue = this.getCameraTransform(payload as Actions['GET_CAMERA_TRANSFORM']['PAYLOAD']);\n break;\n }\n case 'MOVE_CAMERA': {\n returnValue = this.moveCamera(payload as Actions['MOVE_CAMERA']['PAYLOAD']);\n break;\n }\n case 'RESET_CAMERA': {\n returnValue = this.resetCamera(payload as Actions['RESET_CAMERA']['PAYLOAD']);\n break;\n }\n case 'COMPUTE_ENCOMPASSING_VIEW': {\n returnValue = this.computeEncompassingView(payload as Actions['COMPUTE_ENCOMPASSING_VIEW']['PAYLOAD']);\n break;\n }\n case 'SET_CAMERA_LAYER': {\n returnValue = this.setCameraLayer(payload as Actions['SET_CAMERA_LAYER']['PAYLOAD']);\n break;\n }\n case 'ZOOM_CAMERA': {\n returnValue = this.zoomCamera(payload as Actions['ZOOM_CAMERA']['PAYLOAD']);\n break;\n }\n case 'SET_GIZMO_MODE': {\n returnValue = this.setGizmoMode(payload as Actions['SET_GIZMO_MODE']['PAYLOAD']);\n break;\n }\n case 'SET_GIZMO_VISIBILITY': {\n returnValue = this.setGizmoVisibility(payload as Actions['SET_GIZMO_VISIBILITY']['PAYLOAD']);\n break;\n }\n case 'USE_TOOL': {\n returnValue = this.useTool(payload as Actions['USE_TOOL']['PAYLOAD']);\n break;\n }\n case 'MODEL_LOADED': {\n returnValue = this.modelLoaded(payload as Actions['MODEL_LOADED']['PAYLOAD']);\n break;\n }\n case 'UPDATE_SCENE': {\n returnValue = this.updateScene(payload as Actions['UPDATE_SCENE']['PAYLOAD']);\n break;\n }\n case 'GENERATE_MEDIA': {\n returnValue = this.generateMedia(payload as Actions['GENERATE_MEDIA']['PAYLOAD']);\n break;\n }\n }\n\n this.dispatch(action, payload);\n\n return returnValue;\n }\n\n public Subscribe<Action extends keyof Actions>(type: Action, listener: EventListener<Action>): 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.get(type)!.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((entry) => entry === listener);\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>(type: Action, payload: Actions[Action]['PAYLOAD']): void {\n const listenerArray = this.listeners.get(type);\n if (!listenerArray) return;\n\n listenerArray.forEach((listener) => listener(payload))\n }\n\n private getAllSceneData(payload: Actions['GET_ALL_SCENE_DATA']['PAYLOAD']): Actions['GET_ALL_SCENE_DATA']['RETURN'] {\n const sceneData = {\n name: this.scene.name,\n mediaItem: null,\n backgroundColor: '#' + (this.scene.background as Color).getHexString(),\n floorEnabled: this.scene.Root.Floor.visible,\n floorColor: '#' + (this.scene.Root.Floor.material as MeshStandardMaterial).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((object) => object.entityType === 'light') as COMLight[],\n objects: Array.from(this.registered.values()).filter((object) => object.entityType === 'model') as COMModel[],\n cameras: Array.from(this.registered.values()).filter((object) => object.entityType === 'pov') as COMPov[],\n };\n Object.assign(payload, sceneData);\n return sceneData;\n }\n\n private getAllObjects(payload: Actions['GET_ALL_OBJECTS']['PAYLOAD']): Actions['GET_ALL_OBJECTS']['RETURN'] {\n Object.assign(payload, this.registered);\n return this.registered;\n }\n\n private getObjects(payload: Actions['GET_OBJECTS']['PAYLOAD']): 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(payload: Actions['ADD_OBJECT']['PAYLOAD']): Actions['ADD_OBJECT']['RETURN'] {\n if (this.registered.get(payload.id)) return false;\n\n this.registered.set(payload.id, payload);\n\n this.scene.AddSceneObject(payload);\n\n return true;\n }\n\n private updateObject(payload: Actions['UPDATE_OBJECT']['PAYLOAD']): Actions['UPDATE_OBJECT']['RETURN'] {\n const objectToUpdate = this.registered.get(payload.id);\n if (!objectToUpdate) return false;\n\n this.registered.set(payload.id, { ...objectToUpdate, ...payload });\n\n const updatedObject = this.registered.get(payload.id)!;\n this.scene.UpdateSceneObject(updatedObject);\n\n Object.assign(payload, updatedObject);\n\n return true;\n }\n\n private deleteObject(payload: Actions['DELETE_OBJECT']['PAYLOAD']): 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(payload: Actions['SELECT_OBJECT']['PAYLOAD']): 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(payload: Actions['DESELECT_OBJECT']['PAYLOAD']): 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(payload: Actions['SET_BACKGROUND']['PAYLOAD']): Actions['SET_BACKGROUND']['RETURN'] {\n this.scene.SetBackground(payload.color);\n\n return true;\n }\n\n private dropIt(payload: Actions['DROP_IT']['PAYLOAD']): 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(payload: Actions['PLACE_ON_FLOOR']['PAYLOAD']): 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(payload: Actions['SET_CAMERA_TRANSFORM']['PAYLOAD']): 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(payload: Actions['GET_CAMERA_TRANSFORM']['PAYLOAD']): 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(payload: Actions['MOVE_CAMERA']['PAYLOAD']): 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(position, target, payload.duration, payload.locked);\n\n return true;\n }\n\n private setCameraLayer(payload: Actions['SET_CAMERA_LAYER']['PAYLOAD']): Actions['SET_CAMERA_LAYER']['RETURN'] {\n this.controller.object.SetCameraLayer(payload.layer);\n\n return true;\n }\n\n private resetCamera(payload: Actions['RESET_CAMERA']['PAYLOAD']): Actions['RESET_CAMERA']['RETURN'] {\n this.controller.RevertLast(payload.duration);\n\n return true;\n }\n\n private computeEncompassingView(payload: Actions['COMPUTE_ENCOMPASSING_VIEW']['PAYLOAD']): 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(payload: Actions['ZOOM_CAMERA']['PAYLOAD']): 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(payload: Actions['SET_GIZMO_MODE']['PAYLOAD']): Actions['SET_GIZMO_MODE']['RETURN'] {\n this.toolbox.SetGizmoMode(payload.mode);\n return true;\n }\n\n private setGizmoVisibility(payload: Actions['SET_GIZMO_VISIBILITY']['PAYLOAD']): Actions['SET_GIZMO_VISIBILITY']['RETURN'] {\n this.toolbox.SetGizmoVisibility(payload);\n return payload;\n }\n\n private useTool(payload: Actions['USE_TOOL']['PAYLOAD']): Actions['USE_TOOL']['RETURN'] {\n this.toolbox.UseTool(payload.tool);\n return true;\n }\n\n private modelLoaded(payload: Actions['MODEL_LOADED']['PAYLOAD']): Actions['MODEL_LOADED']['RETURN'] {\n (this.registered.get(payload.id) as COMModel).loaded = true;\n return true;\n }\n\n private updateScene(payload: Actions['UPDATE_SCENE']['PAYLOAD']): Actions['UPDATE_SCENE']['RETURN'] {\n if (payload.name !== undefined) this.scene.name = payload.name;\n if (payload.backgroundColor !== undefined) this.scene.SetBackground(payload.backgroundColor);\n\n if (payload.gridEnabled !== undefined) this.scene.Root.Grid.SetVisibility(payload.gridEnabled);\n\n if (payload.floorEnabled !== undefined) this.scene.Root.Floor.SetVisibility(payload.floorEnabled);\n if (payload.floorColor !== undefined) this.scene.Root.Floor.SetColor(payload.floorColor);\n\n\n // fill payload with current values\n // TODO optmize this\n payload.name = this.scene.name;\n payload.backgroundColor = '#' + (this.scene.background as Color).getHexString();\n payload.gridEnabled = this.scene.Root.Grid.visible;\n payload.floorEnabled = this.scene.Root.Floor.visible;\n payload.floorColor = '#' + (this.scene.Root.Floor.material as MeshStandardMaterial).color.getHexString();\n\n return true;\n }\n\n private generateMedia(payload: Actions['GENERATE_MEDIA']['PAYLOAD']): 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(position, target, payload.width, payload.height);\n\n return true;\n }\n}\n\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\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}","import { Object3D } from \"three\";\nimport { COMModel } from \"../../../com/types.ts\";\nimport Model from \"../../../model/Model.ts\";\nimport DIVELoadingManager from \"../../../loadingmanager/LoadingManager.ts\";\nimport DIVECommunication from \"../../../com/Communication.ts\";\nimport { type TransformControls } from \"three/examples/jsm/Addons\";\nimport type DIVEScene from \"../../Scene.ts\";\n\n/**\n * A basic scene node to hold all models.\n *\n * @module\n */\nexport default class DIVEModelRoot extends Object3D {\n private loadingManager: DIVELoadingManager;\n\n constructor() {\n super();\n this.name = \"ModelRoot\";\n\n this.loadingManager = new DIVELoadingManager();\n }\n\n public GetModel(object: Partial<COMModel>): Object3D | undefined {\n if (object.id === undefined) {\n console.warn('ModelRoot.GetModel: object.id is undefined')\n return undefined;\n }\n return this.children.find(object3D => object3D.userData.id === object.id);\n }\n\n public UpdateModel(object: Partial<COMModel>): void {\n if (object.id === undefined) {\n console.warn('ModelRoot.UpdateModel: object.id is undefined')\n return;\n }\n\n let sceneObject = this.children.find(object3D => object3D.userData.id === object.id);\n if (!sceneObject && object.uri !== undefined) {\n const model = new Model();\n sceneObject = model;\n sceneObject.userData.id = object.id;\n this.add(sceneObject);\n\n this.loadingManager.LoadGLTF(object.uri).then((gltf) => {\n model.SetModel(gltf);\n DIVECommunication.get(object.id!)?.PerformAction('MODEL_LOADED', { id: object.id! });\n });\n }\n\n if (object.position !== undefined) (sceneObject as Model).SetPosition(object.position);\n if (object.rotation !== undefined) (sceneObject as Model).SetRotation(object.rotation);\n if (object.scale !== undefined) (sceneObject as Model).SetScale(object.scale);\n if (object.visible !== undefined) (sceneObject as Model).SetVisibility(object.visible);\n if (object.material !== undefined) (sceneObject as Model).SetMaterial(object.material);\n }\n\n public DeleteModel(object: Partial<COMModel>): void {\n if (object.id === undefined) {\n console.warn(`ModelRoot.DeleteModel: object.id is undefined`)\n return;\n }\n\n const sceneObject = this.children.find(object3D => object3D.userData.id === object.id);\n if (!sceneObject) {\n console.warn(`ModelRoot.DeleteModel: Model with id ${object.id} not found`);\n return;\n }\n\n // _______________________________________________________\n // this is only neccessary due to using the old TransformControls instead of the new DIVEGizmo\n const findScene = (object: Object3D): DIVEScene => {\n if (object.parent !== null) {\n return findScene(object.parent);\n };\n return object as DIVEScene;\n }\n\n const scene = findScene(sceneObject);\n scene.children.find((object) => {\n if ('isTransformControls' in object) {\n (object as TransformControls).detach();\n }\n });\n // _______________________________________________________\n\n this.remove(sceneObject);\n }\n\n public PlaceOnFloor(object: Partial<COMModel>): void {\n if (object.id === undefined) console.warn('ModelRoot.PlaceOnFloor: object.id is undefined');\n\n const sceneObject = this.children.find(object3D => object3D.userData.id === object.id);\n if (!sceneObject) return;\n\n (sceneObject as Model).PlaceOnFloor();\n }\n}","import { Box3, Color, Mesh, MeshStandardMaterial, Object3D, Raycaster, Vector3, Vector3Like } from 'three';\nimport { DIVESelectable } from '../interface/Selectable';\nimport { PRODUCT_LAYER_MASK } from '../constant/VisibilityLayerMask';\nimport { DIVEMoveable } from '../interface/Moveable';\nimport DIVECommunication from '../com/Communication';\nimport type { GLTF, TransformControls } from 'three/examples/jsm/Addons.js';\nimport { findSceneRecursive } from '../helper/findSceneRecursive/findSceneRecursive';\nimport { 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 default class DIVEModel extends Object3D implements DIVESelectable, DIVEMoveable {\n public isSelectable: true = true;\n public isMoveable: true = true;\n public gizmo: TransformControls | null = null;\n\n private boundingBox: Box3;\n\n private _mesh: Mesh | null = null;\n private _material: MeshStandardMaterial | null = null;\n\n constructor() {\n super();\n\n this.layers.mask = PRODUCT_LAYER_MASK;\n\n this.boundingBox = new Box3();\n }\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).material as MeshStandardMaterial;\n }\n }\n });\n\n this.add(gltf.scene);\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.setFromVector3(new Vector3(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.traverse((child) => {\n child.visible = visible;\n });\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 = new Color(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 this._mesh.material.needsUpdate = true;\n }\n }\n\n public SetToWorldOrigin(): void {\n this.position.set(0, 0, 0);\n DIVECommunication.get(this.userData.id)?.PerformAction('UPDATE_OBJECT', { id: this.userData.id, position: this.position, rotation: this.rotation, scale: this.scale });\n }\n\n public PlaceOnFloor(): void {\n this.position.y = -this.boundingBox.min.y * this.scale.y;\n DIVECommunication.get(this.userData.id)?.PerformAction('UPDATE_OBJECT', { id: this.userData.id, position: this.position, rotation: this.rotation, scale: this.scale });\n }\n\n public DropIt(): void {\n if (!this.parent) {\n console.warn('DIVEModel: DropIt() called on a model that is not in the scene.', this);\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(this.boundingBox.getCenter(new Vector3()).multiply(this.scale));\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(findSceneRecursive(this).Root.children, true);\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.clone().setY(worldPos.y).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('UPDATE_OBJECT', { id: this.userData.id, position: this.position, rotation: this.rotation, scale: this.scale });\n }\n }\n\n public onMove(): void {\n DIVECommunication.get(this.userData.id)?.PerformAction('UPDATE_OBJECT', { id: this.userData.id, position: this.position, rotation: this.rotation, scale: this.scale });\n }\n\n public onSelect(): void {\n DIVECommunication.get(this.userData.id)?.PerformAction('SELECT_OBJECT', { id: this.userData.id });\n }\n\n public onDeselect(): void {\n DIVECommunication.get(this.userData.id)?.PerformAction('DESELECT_OBJECT', { id: this.userData.id });\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}","import { DRACOLoader, GLTF, GLTFLoader } from \"three/examples/jsm/Addons.js\";\n\n/**\n * A basic loading manager.\n *\n * @module\n */\n\nexport default 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('https://www.gstatic.com/draco/v1/decoders/');\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.loadAsync(uri, progEvent).then(resolve).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}","import { Object3D } from \"three\";\nimport { DIVEPrimitive } from \"../../../primitive/Primitive.ts\";\nimport type DIVEScene from \"../../Scene.ts\";\nimport { type COMPrimitive } from \"../../../com/types\";\nimport { type TransformControls } from \"three/examples/jsm/controls/TransformControls\";\n\n/**\n * A basic scene node to hold all primitives.\n *\n * @module\n */\nexport class DIVEPrimitiveRoot extends Object3D {\n constructor() {\n super();\n this.name = \"PrimitiveRoot\";\n }\n\n public GetPrimitive(object: Partial<COMPrimitive>): Object3D | undefined {\n if (object.id === undefined) {\n console.warn('PrimitiveRoot.GetPrimitive: object.id is undefined')\n return undefined;\n }\n return this.children.find(object3D => object3D.userData.id === object.id);\n }\n\n public UpdatePrimitive(object: Partial<COMPrimitive>): void {\n if (object.id === undefined) {\n console.warn('PrimitiveRoot.UpdatePrimitive: object.id is undefined')\n return;\n }\n\n let sceneObject = this.children.find(object3D => object3D.userData.id === object.id);\n if (!sceneObject && object.geometry !== undefined) {\n const primitive = new DIVEPrimitive();\n primitive.SetGeometry(object.geometry);\n sceneObject = primitive;\n sceneObject.userData.id = object.id;\n this.add(sceneObject);\n }\n\n if (object.position !== undefined) (sceneObject as DIVEPrimitive).SetPosition(object.position);\n if (object.rotation !== undefined) (sceneObject as DIVEPrimitive).SetRotation(object.rotation);\n if (object.scale !== undefined) (sceneObject as DIVEPrimitive).SetScale(object.scale);\n if (object.visible !== undefined) (sceneObject as DIVEPrimitive).SetVisibility(object.visible);\n if (object.material !== undefined) (sceneObject as DIVEPrimitive).SetMaterial(object.material);\n }\n\n public DeletePrimitive(object: Partial<COMPrimitive>): void {\n if (object.id === undefined) {\n console.warn(`PrimitiveRoot.DeletePrimitive: object.id is undefined`)\n return;\n }\n\n const sceneObject = this.children.find(object3D => object3D.userData.id === object.id);\n if (!sceneObject) {\n console.warn(`PrimitiveRoot.DeletePrimitive: Primitive with id ${object.id} not found`);\n return;\n }\n\n // _______________________________________________________\n // this is only neccessary due to using the old TransformControls instead of the new DIVEGizmo\n const findScene = (object: Object3D): DIVEScene => {\n if (object.parent !== null) {\n return findScene(object.parent);\n };\n return object as DIVEScene;\n }\n\n const scene = findScene(sceneObject);\n scene.children.find((object) => {\n if ('isTransformControls' in object) {\n (object as TransformControls).detach();\n }\n });\n // _______________________________________________________\n\n this.remove(sceneObject);\n }\n\n public PlaceOnFloor(object: Partial<COMPrimitive>): void {\n if (object.id === undefined) console.warn('PrimitiveRoot.PlaceOnFloor: object.id is undefined');\n\n const sceneObject = this.children.find(object3D => object3D.userData.id === object.id);\n if (!sceneObject) return;\n\n (sceneObject as DIVEPrimitive).PlaceOnFloor();\n }\n}","import { Box3, BoxGeometry, BufferGeometry, Color, ConeGeometry, CylinderGeometry, Mesh, MeshStandardMaterial, Object3D, Raycaster, SphereGeometry, Vector3, Vector3Like } from 'three';\nimport DIVECommunication from '../com/Communication';\nimport { PRODUCT_LAYER_MASK } from '../constant/VisibilityLayerMask';\nimport { findSceneRecursive } from '../helper/findSceneRecursive/findSceneRecursive';\nimport { type DIVESelectable } from '../interface/Selectable';\nimport { type DIVEMoveable } from '../interface/Moveable';\nimport { type TransformControls } from 'three/examples/jsm/controls/TransformControls';\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 Object3D implements DIVESelectable, DIVEMoveable {\n public isSelectable: true = true;\n public isMoveable: true = true;\n\n public gizmo: TransformControls | null = null;\n\n private _mesh: Mesh;\n private _boundingBox: Box3;\n\n constructor() {\n super();\n\n this.layers.mask = PRODUCT_LAYER_MASK;\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 this._boundingBox = new Box3();\n }\n\n public SetGeometry(geometry: COMGeometry): void {\n this._mesh.geometry = this.assembleGeometry(geometry);\n this._boundingBox.setFromObject(this._mesh);\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.setFromVector3(new Vector3(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.traverse((child) => {\n child.visible = visible;\n });\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 SetToWorldOrigin(): void {\n this.position.set(0, 0, 0);\n DIVECommunication.get(this.userData.id)?.PerformAction('UPDATE_OBJECT', { id: this.userData.id, position: this.position, rotation: this.rotation, scale: this.scale });\n }\n\n public PlaceOnFloor(): void {\n this.position.y = -this._boundingBox.min.y * this.scale.y;\n DIVECommunication.get(this.userData.id)?.PerformAction('UPDATE_OBJECT', { id: this.userData.id, position: this.position, rotation: this.rotation, scale: this.scale });\n }\n\n public DropIt(): void {\n if (!this.parent) {\n console.warn('DIVEModel: DropIt() called on a model that is not in the scene.', this);\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(this._boundingBox.getCenter(new Vector3()).multiply(this.scale));\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(findSceneRecursive(this).Root.children, true);\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.clone().setY(worldPos.y).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('UPDATE_OBJECT', { id: this.userData.id, position: this.position, rotation: this.rotation, scale: this.scale });\n }\n }\n\n public onMove(): void {\n DIVECommunication.get(this.userData.id)?.PerformAction('UPDATE_OBJECT', { id: this.userData.id, position: this.position, rotation: this.rotation, scale: this.scale });\n }\n\n public onSelect(): void {\n DIVECommunication.get(this.userData.id)?.PerformAction('SELECT_OBJECT', { id: this.userData.id });\n }\n\n public onDeselect(): void {\n DIVECommunication.get(this.userData.id)?.PerformAction('DESELECT_OBJECT', { id: this.userData.id });\n }\n\n private assembleGeometry(geometry: COMGeometry): BufferGeometry {\n switch (geometry.name) {\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 '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 return new BufferGeometry();\n }\n }\n\n private createCylinderGeometry(geometry: COMGeometry): BufferGeometry {\n const geo = new CylinderGeometry(geometry.width / 2, geometry.width / 2, geometry.height, 64);\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(geometry.width / 2, geometry.height, 4, 1, true);\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(geometry.width, geometry.height, geometry.depth);\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(geometry.width, geometry.height, geometry.depth || 0.05, 16);\n geo.translate(0, geometry.height / 2, 0);\n return geo;\n }\n\n private createPlaneGeometry(geometry: COMGeometry): BufferGeometry {\n const geo = new BoxGeometry(geometry.width, geometry.height, geometry.depth);\n geo.translate(0, geometry.height / 2, 0);\n return geo;\n }\n}\n","import { Color, ColorRepresentation, Mesh, MeshStandardMaterial, PlaneGeometry } 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 default class DIVEFloor extends Mesh {\n public isFloor: true = true;\n\n constructor() {\n super(new PlaneGeometry(10000, 10000), new MeshStandardMaterial({ color: new Color(150 / 255, 150 / 255, 150 / 255) }));\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","export const GRID_CENTER_LINE_COLOR = '#888888';\nexport const GRID_SIDE_LINE_COLOR = '#dddddd';","import { GRID_SIDE_LINE_COLOR, GRID_CENTER_LINE_COLOR } 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 default class DIVEGrid extends Object3D {\n constructor() {\n super();\n this.name = 'Grid';\n\n const grid = new GridHelper(100, 100, GRID_CENTER_LINE_COLOR, GRID_SIDE_LINE_COLOR);\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}","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(camera: DIVEPerspectiveCamera, renderer: DIVERenderer, animationSystem: DIVEAnimationSystem, settings: Partial<DIVEOrbitControlsSettings> = DIVEOrbitControlsDefaultSettings) {\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 = settings.enableDamping || DIVEOrbitControlsDefaultSettings.enableDamping;\n this.dampingFactor = settings.dampingFactor || 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): { position: Vector3Like, target: Vector3Like } {\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(this.getDistance() - zoomBy, minDistance + zoomBy, maxDistance - zoomBy);\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(this.getDistance() + zoomBy, minDistance + zoomBy, maxDistance - zoomBy);\n this.update();\n this.minDistance = minDistance;\n this.maxDistance = maxDistance;\n }\n\n public MoveTo(pos: Vector3Like | undefined, target: Vector3Like | undefined, duration: number, lock: boolean): 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) this.last = { pos: this.object.position.clone(), target: this.target.clone() };\n\n this.animating = duration > 0;\n this.locked = lock;\n this.enabled = false;\n\n const tweenPos = this._animationSystem.Animate(this.object.position)\n .to(toPosition, duration)\n .easing(Easing.Quadratic.Out)\n .start();\n\n const tweenQuat = this._animationSystem.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.Animate(this.object.position)\n .to(pos, duration)\n .easing(Easing.Quadratic.Out)\n .start();\n\n const tweenQuat = this._animationSystem.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}","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').DIVESelectTool as typeof import('./select/SelectTool.ts').DIVESelectTool;\n this._selectTool = new DIVESelectTool(this._scene, this._controller);\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 throw new Error(`ToolBox.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) => this.onPointerMove(e));\n this._controller.domElement.addEventListener('pointerdown', (e) => this.onPointerDown(e));\n this._controller.domElement.addEventListener('pointerup', (e) => this.onPointerUp(e));\n this._controller.domElement.addEventListener('wheel', (e) => this.onWheel(e));\n }\n\n private removeEventListeners(): void {\n this._controller.domElement.removeEventListener('pointermove', (e) => this.onPointerMove(e));\n this._controller.domElement.removeEventListener('pointerdown', (e) => this.onPointerDown(e));\n this._controller.domElement.removeEventListener('pointerup', (e) => this.onPointerUp(e));\n this._controller.domElement.removeEventListener('wheel', (e) => this.onWheel(e));\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}","import { AxesHelper, Color, Material, Matrix4, OrthographicCamera, Vector4 } from \"three\";\nimport SpriteText from \"three-spritetext\";\nimport { COORDINATE_LAYER_MASK } from \"../constant/VisibilityLayerMask.ts\";\nimport { AxesColorRed, AxesColorGreen, AxesColorBlue, AxesColorRedLetter, AxesColorGreenLetter, AxesColorBlueLetter } 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(renderer: DIVERenderer, scene: DIVEScene, controls: DIVEOrbitControls) {\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(new Matrix4().extractRotation(matrix).invert());\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 * Find the difference between two objects.\n */\n\nexport const getObjectDelta = <T extends object>(a: T, b: Partial<T>): Partial<T> => {\n\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\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\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(aArray[index], bArray[index]);\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\n return;\n }\n\n // assumption: b[key] is an object\n if (typeof b[key as keyof object] === 'object') {\n\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(a[key as keyof object], b[key as keyof object]);\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}","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}","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}","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}","import shift from \"../helper/shift.ts\";\n\nexport default function roundExponential(number: number, decimals: number = 0): number {\n if (number < 0) return -roundExponential(-number, decimals);\n const n = shift(number, +decimals);\n return shift(Math.round(n), -decimals);\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(vecA: Vector3, vecB: Vector3, planeNormal: Vector3): number {\n return Math.atan2(vecA.clone().cross(vecB).dot(planeNormal), vecB.clone().dot(vecA));\n}","import shift from \"../helper/shift.ts\";\n\nexport default function toFixedExp(number: number, decimals: number = 0): string {\n const n = shift(number, +decimals);\n return shift(Math.round(n), -decimals).toFixed(decimals);\n}","import shift from \"../helper/shift.ts\";\n\nexport default function truncateExp(number: number, decimals: number = 0): number {\n const n = shift(number, +decimals);\n return shift(Math.trunc(n), -decimals);\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}","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 = 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 = /iPad|iPhone|iPod/.test(userAgent) && !(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 = /^((?!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}"],"mappings":"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","names":["import_three","import_three","import_three","import_three","import_three","import_three","import_three","DIVEMediaCreator","import_three","import_three","import_three","import_Addons","object","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/interface/Draggable.ts","../src/interface/Hoverable.ts","../src/toolbox/BaseTool.ts","../src/toolbox/transform/TransformTool.ts","../src/interface/Selectable.ts","../src/toolbox/select/SelectTool.ts","../src/camera/PerspectiveCamera.ts","../src/mediacreator/MediaCreator.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/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","../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","/**\n * Interface for objects that can be hovered in the scene.\n *\n * @module\n */\n\nimport { type Object3D } from \"three\";\nimport { type DraggableEvent } from \"../toolbox/BaseTool\";\n\nexport interface DIVEDraggable {\n isDraggable: true;\n onDragStart?: (e: DraggableEvent) => void;\n onDrag?: (e: DraggableEvent) => void;\n onDragEnd?: (e: DraggableEvent) => void;\n}\n\nexport const isDraggable = (object: Object3D): object is Object3D & DIVEDraggable => {\n return 'isDraggable' in object;\n};\n\nexport const findDraggableInterface = (child: Object3D): (Object3D & DIVEDraggable) | undefined => {\n if (child === undefined) return undefined;\n\n if (child.parent === null) {\n // in this case it is the scene itself\n return undefined;\n }\n\n if (isDraggable(child)) {\n return child as (Object3D & DIVEDraggable);\n }\n\n return findDraggableInterface(child.parent);\n}","/**\n * Interface for objects that can be hovered in the scene.\n *\n * @module\n */\n\nimport { type Object3D, type Intersection } from \"three\";\n\nexport interface DIVEHoverable {\n isHoverable: true;\n onPointerEnter?: (i: Intersection) => void;\n onPointerOver?: (i: Intersection) => void;\n onPointerLeave?: () => void;\n}\n\nexport const isHoverable = (object: Object3D): object is Object3D & DIVEHoverable => {\n return 'isHoverable' in object;\n};\n\nexport const findHoverableInterface = (child: Object3D): (Object3D & DIVEHoverable) | undefined => {\n if (child === undefined) return undefined;\n\n if (child.parent === null) {\n // in this case it is the scene itself\n return undefined;\n }\n\n if (isHoverable(child)) {\n return child as (Object3D & DIVEHoverable);\n }\n\n return findHoverableInterface(child.parent);\n}","import { Intersection, Object3D, Raycaster, Vector2, Vector3 } from \"three\";\nimport { PRODUCT_LAYER_MASK, UI_LAYER_MASK } from \"../constant/VisibilityLayerMask\";\nimport { DIVEScene } from \"../scene/Scene\";\nimport DIVEOrbitControls from \"../controls/OrbitControls\";\nimport { DIVEDraggable, findDraggableInterface } from \"../interface/Draggable\";\nimport { DIVEHoverable, findHoverableInterface } from \"../interface/Hoverable\";\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 this._pointerPrimaryDown\n || this._pointerMiddleDown\n || this._pointerSecondaryDown;\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 case 1:\n this._pointerMiddleDown = true;\n break;\n case 2:\n this._pointerSecondaryDown = true;\n break;\n }\n\n this._lastPointerDown.copy(this._pointer);\n\n this._draggable = findDraggableInterface(this._intersects[0]?.object) || 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(this._dragRaycastOnObjects, true);\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 = findHoverableInterface(this._intersects[0]?.object);\n if (this._intersects[0] && hoverable) {\n if (!this._hovered) {\n if (hoverable.onPointerEnter) 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) this._hovered.onPointerLeave();\n if (hoverable.onPointerEnter) hoverable.onPointerEnter(this._intersects[0]);\n this._hovered = hoverable;\n return;\n }\n\n if (hoverable.onPointerOver) hoverable.onPointerOver(this._intersects[0]);\n this._hovered = hoverable;\n\n } else {\n if (this._hovered) {\n if (this._hovered.onPointerLeave) 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(this._dragRaycastOnObjects, true);\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(this._dragCurrent.clone(), this._dragStart.clone());\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(this._dragCurrent.clone(), this._dragStart.clone());\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) return this._raycaster.intersectObjects(objects, true).filter(i => i.object.visible);\n return this._raycaster.intersectObjects(this._scene.children, true).filter(i => i.object.visible);\n }\n\n private pointerWasDragged(): boolean {\n return this._lastPointerDown.distanceTo(this._pointer) > this.POINTER_DRAG_THRESHOLD;\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 DIVEMoveable } from \"../../interface/Moveable.ts\";\n\nexport const isTransformTool = (tool: DIVEBaseTool): 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 DIVEMoveable to be moveable.\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(this._controller.object, this._controller.domElement);\n this._gizmo.mode = 'translate';\n\n this._gizmo.addEventListener('mouseDown', () => {\n controller.enabled = false;\n });\n\n this._gizmo.addEventListener('mouseUp', () => {\n controller.enabled = true;\n });\n\n this._gizmo.addEventListener('objectChange', () => {\n if (!this._gizmo.object) return;\n if (!('isMoveable' in this._gizmo.object)) return;\n if (!('onMove' in this._gizmo.object)) return;\n (this._gizmo.object as DIVEMoveable).onMove!();\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 * Interface for objects that can be selected in the scene.\n *\n * @module\n */\n\nimport { Object3D } from \"three\";\n\nexport interface DIVESelectable {\n isSelectable: true;\n onSelect?: () => void;\n onDeselect?: () => void;\n}\n\nexport function isSelectable(object: Object3D): object is Object3D & DIVESelectable {\n return 'isSelectable' in object;\n}\n\nexport function findSelectableInterface(child: Object3D): (Object3D & DIVESelectable) | undefined {\n if (child === undefined) return undefined;\n\n if (child.parent === null) {\n // in this case it is the scene itself\n return undefined;\n }\n\n if (isSelectable(child)) {\n // in this case it is the Selectable\n return child;\n }\n\n // search recursively in parent\n return findSelectableInterface(child.parent);\n}","import { type Object3D } from \"three\";\nimport { DIVEScene } from \"../../scene/Scene.ts\";\nimport DIVETransformTool from \"../transform/TransformTool.ts\";\nimport type DIVEOrbitControls from \"../../controls/OrbitControls.ts\";\nimport { type DIVESelectable, findSelectableInterface } from \"../../interface/Selectable.ts\";\nimport { type DIVEMoveable } from \"../../interface/Moveable.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 DIVEMoveable to be moveable.\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\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 ('isMoveable' in selectable) {\n const movable = selectable as (Object3D & DIVESelectable & DIVEMoveable);\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.intersectObjects(this._scene.Root.children, true).filter((intersect) => intersect.object.visible)[0];\n const selectable = findSelectableInterface(first?.object);\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\n // select clicked object\n this.Select(selectable);\n }\n}","import { PerspectiveCamera } from \"three\";\nimport { DEFAULT_LAYER_MASK, HELPER_LAYER_MASK, PRODUCT_LAYER_MASK, UI_LAYER_MASK } from \"../constant/VisibilityLayerMask.ts\";\n\nexport type DIVEPerspectiveCameraSettings = {\n fov: number;\n near: number;\n far: number;\n}\n\nexport const DIVEPerspectiveCameraDefaultSettings: DIVEPerspectiveCameraSettings = {\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 = DEFAULT_LAYER_MASK | UI_LAYER_MASK | HELPER_LAYER_MASK | PRODUCT_LAYER_MASK;\n public static readonly LIVE_VIEW_LAYER_MASK = PRODUCT_LAYER_MASK;\n\n public onSetCameraLayer: (mask: number) => void = () => { };\n\n constructor(settings: Partial<DIVEPerspectiveCameraSettings> = DIVEPerspectiveCameraDefaultSettings) {\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 = layer === 'LIVE' ? DIVEPerspectiveCamera.LIVE_VIEW_LAYER_MASK : 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(renderer: DIVERenderer, scene: DIVEScene, controller: DIVEOrbitControls) {\n this.renderer = renderer;\n this.scene = scene;\n this.controller = controller;\n }\n\n public GenerateMedia(position: Vector3Like, target: Vector3Like, width: number, height: number): 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\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 = DIVEPerspectiveCamera.LIVE_VIEW_LAYER_MASK;\n this.renderer.render(this.scene, this.controller.object);\n this.controller.object.layers.mask = 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 { DIVERenderer, DIVERendererDefaultSettings, DIVERendererSettings } from \"./renderer/Renderer.ts\";\nimport { DIVEScene } from \"./scene/Scene.ts\";\nimport DIVEPerspectiveCamera, { DIVEPerspectiveCameraDefaultSettings, DIVEPerspectiveCameraSettings } from \"./camera/PerspectiveCamera.ts\";\nimport DIVEOrbitControls, { DIVEOrbitControlsDefaultSettings, DIVEOrbitControlsSettings } 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\";\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('COMPUTE_ENCOMPASSING_VIEW', {});\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) this.renderer = new DIVERenderer(this._settings.renderer);\n\n // apply perspective camera settings\n if (settingsDelta.perspectiveCamera) {\n if (settingsDelta.perspectiveCamera.fov !== undefined) this.perspectiveCamera.fov = settingsDelta.perspectiveCamera.fov;\n if (settingsDelta.perspectiveCamera.near !== undefined) this.perspectiveCamera.near = settingsDelta.perspectiveCamera.near;\n if (settingsDelta.perspectiveCamera.far !== undefined) this.perspectiveCamera.far = settingsDelta.perspectiveCamera.far;\n this.perspectiveCamera.OnResize(this.renderer.domElement.width, this.renderer.domElement.height);\n }\n // apply orbit controls settings\n if (settingsDelta.orbitControls) {\n if (settingsDelta.orbitControls.enableDamping !== undefined) this.orbitControls.enableDamping = settingsDelta.orbitControls.enableDamping;\n if (settingsDelta.orbitControls.dampingFactor !== undefined) this.orbitControls.dampingFactor = 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(this.renderer, this.scene, this.orbitControls);\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 = { ...DIVEDefaultSettings, ...(settings !== undefined ? settings : {}) };\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(this._settings.perspectiveCamera);\n\n // initialize animation system\n this.animationSystem = new DIVEAnimationSystem(this.renderer);\n\n this.orbitControls = new DIVEOrbitControls(this.perspectiveCamera, this.renderer, this.animationSystem, this._settings.orbitControls);\n this.toolbox = new DIVEToolbox(this.scene, this.orbitControls);\n this.communication = new DIVECommunication(this.renderer, this.scene, this.orbitControls, this.toolbox);\n\n\n // initialize axis camera\n if (this._settings.displayAxes) {\n this.axisCamera = new DIVEAxisCamera(this.renderer, this.scene, this.orbitControls);\n } else {\n this.axisCamera = null;\n }\n\n // add resize observer if autoResize is enabled\n if (this._settings.autoResize) {\n this.addResizeObserver();\n }\n\n // whene everything is done, start the renderer\n this.renderer.StartRenderer(this.scene, this.perspectiveCamera);\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (window as any).DIVE = {\n PrintScene: () => {\n console.log(this.scene);\n },\n }\n\n console.log('DIVE initialized');\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) 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 {\n DIVE,\n DIVECommunication,\n}\n\nexport * from './math/index.ts';\n\nexport type * from './com/actions/index.ts';\nexport type * from './com/types';\n\n","import { Camera, MathUtils, NoToneMapping, PCFSoftShadowMap, Scene, ShadowMapType, ToneMapping, WebGLRenderer } 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<string, () => void>();\n private postRenderCallbacks: Map<string, () => void> = new Map<string, () => void>();\n\n constructor(rendererSettings: Partial<DIVERendererSettings> = DIVERendererDefaultSettings) {\n super({\n antialias: rendererSettings.antialias || 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 = rendererSettings.shadowMapEnabled || DIVERendererDefaultSettings.shadowMapEnabled;\n this.shadowMap.type = rendererSettings.shadowMapType || DIVERendererDefaultSettings.shadowMapType;\n\n this.toneMapping = rendererSettings.toneMapping || 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(() => { this.internal_render(scene, cam) });\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) => { callback(); });\n\n this.render(scene, cam);\n\n this.postRenderCallbacks.forEach((callback) => { callback(); });\n\n this.force = false;\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>(object: Partial<COMEntity> & { id: string }): 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(object: Partial<COMEntity> & { id: string }): void {\n this.Root.UpdateSceneObject(object);\n }\n\n public DeleteSceneObject(object: Partial<COMEntity> & { id: string }): 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 { type COMLight, type COMModel, type COMEntity, type COMPrimitive, type COMGroup } 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>(object: Partial<COMEntity> & { id: string }): T | undefined {\n return this.children.find(object3D => object3D.userData.id === object.id) as T | undefined;\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 }\n }\n\n public UpdateSceneObject(object: Partial<COMEntity> & { id: string }): 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 }\n }\n\n public DeleteSceneObject(object: Partial<COMEntity> & { id: string }): 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 }\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 }\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(`Root.updateLight: Unknown light type: ${light.type}`);\n return;\n }\n }\n sceneObject.userData.id = light.id;\n this.add(sceneObject);\n }\n\n if (light.name !== undefined && light.name !== null) sceneObject.name = light.name;\n if (light.position !== undefined && light.position !== null) sceneObject.position.set(light.position.x, light.position.y, light.position.z);\n if (light.intensity !== undefined && light.intensity !== null) (sceneObject as (DIVEAmbientLight | DIVEPointLight)).SetIntensity(light.intensity);\n if (light.enabled !== undefined && light.enabled !== null) (sceneObject as (DIVEAmbientLight | DIVEPointLight)).SetEnabled(light.enabled);\n if (light.color !== undefined && light.color !== null) (sceneObject as (DIVEAmbientLight | DIVEPointLight)).SetColor(new Color(light.color));\n if (light.visible !== undefined && light.visible !== null) (sceneObject as (DIVEAmbientLight | DIVEPointLight)).visible = light.visible;\n if (light.parent !== undefined) this.setParent({ ...light, parent: light.parent });\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('MODEL_LOADED', { id: model.id! });\n });\n }\n\n if (model.name !== undefined) sceneObject.name = model.name;\n if (model.position !== undefined) (sceneObject as DIVEModel).SetPosition(model.position);\n if (model.rotation !== undefined) (sceneObject as DIVEModel).SetRotation(model.rotation);\n if (model.scale !== undefined) (sceneObject as DIVEModel).SetScale(model.scale);\n if (model.visible !== undefined) (sceneObject as DIVEModel).SetVisibility(model.visible);\n if (model.material !== undefined) (sceneObject as DIVEModel).SetMaterial(model.material);\n if (model.parent !== undefined) this.setParent({ ...model, parent: model.parent });\n }\n\n private updatePrimitive(primitive: Partial<COMPrimitive> & { id: string }): 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) (sceneObject as DIVEPrimitive).SetGeometry(primitive.geometry);\n if (primitive.position !== undefined) (sceneObject as DIVEPrimitive).SetPosition(primitive.position);\n if (primitive.rotation !== undefined) (sceneObject as DIVEPrimitive).SetRotation(primitive.rotation);\n if (primitive.scale !== undefined) (sceneObject as DIVEPrimitive).SetScale(primitive.scale);\n if (primitive.visible !== undefined) (sceneObject as DIVEPrimitive).SetVisibility(primitive.visible);\n if (primitive.material !== undefined) (sceneObject as DIVEPrimitive).SetMaterial(primitive.material);\n if (primitive.parent !== undefined) this.setParent({ ...primitive, parent: primitive.parent });\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) (sceneObject as DIVEPrimitive).SetPosition(group.position);\n if (group.rotation !== undefined) (sceneObject as DIVEPrimitive).SetRotation(group.rotation);\n if (group.scale !== undefined) (sceneObject as DIVEPrimitive).SetScale(group.scale);\n if (group.visible !== undefined) (sceneObject as DIVEPrimitive).SetVisibility(group.visible);\n if (group.bbVisible !== undefined) (sceneObject as DIVEGroup).SetBoundingBoxVisibility(group.bbVisible);\n if (group.parent !== undefined) this.setParent({ ...group, parent: group.parent });\n }\n\n private deleteLight(light: Partial<COMLight> & { id: string }): void {\n const sceneObject = this.GetSceneObject(light);\n if (!sceneObject) {\n console.warn(`Root.deleteLight: Light with id ${light.id} not found`);\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(`Root.deleteModel: Model with id ${model.id} not found`);\n return;\n }\n\n this.detachTransformControls(sceneObject);\n\n this.remove(sceneObject);\n }\n\n private deletePrimitive(primitive: Partial<COMPrimitive> & { id: string }): void {\n const sceneObject = this.GetSceneObject(primitive);\n if (!sceneObject) {\n console.warn(`Root.deletePrimitive: Primitive with id ${primitive.id} not found`);\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(`Root.deleteGroup: Group with id ${group.id} not found`);\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(object: Partial<COMEntity> & { id: string, parent: (Partial<COMEntity> & { id: string }) | null }): void {\n const sceneObject = this.GetSceneObject<DIVESceneObject>(object);\n if (!sceneObject) return;\n\n if (sceneObject.parent) {\n sceneObject.parent.remove(sceneObject);\n }\n\n if (object.parent !== null) {\n const parent = this.GetSceneObject<DIVESceneObject>(object.parent);\n if (!parent) return;\n\n // attach to new parent (if exists in scene)\n parent.attach(sceneObject);\n\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 { PointLight, Color, SphereGeometry, MeshBasicMaterial, Mesh, FrontSide, Object3D } from 'three';\nimport { DIVECommunication } from '../com/Communication';\nimport { PRODUCT_LAYER_MASK, UI_LAYER_MASK } from '../constant/VisibilityLayerMask';\nimport { DIVEMoveable } from '../interface/Moveable';\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 extends Object3D implements DIVESelectable, DIVEMoveable {\n readonly isDIVELight: true = true;\n readonly isDIVEPointLight: true = true;\n readonly isMoveable: 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(geoSize, geoSize * 320, geoSize * 320);\n\n const material = new MeshBasicMaterial({ color: this.light.color, transparent: true, opacity: 0.8, side: FrontSide });\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 = 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('UPDATE_OBJECT', { id: this.userData.id, position: this.position });\n }\n\n public onSelect(): void {\n DIVECommunication.get(this.userData.id)?.PerformAction('SELECT_OBJECT', { id: this.userData.id });\n }\n\n public onDeselect(): void {\n DIVECommunication.get(this.userData.id)?.PerformAction('DESELECT_OBJECT', { id: this.userData.id });\n }\n}\n","import { Actions } from \"./actions/index.ts\";\nimport { generateUUID } from 'three/src/math/MathUtils';\nimport { isSelectTool } from \"../toolbox/select/SelectTool.ts\";\n\n// type imports\nimport { type Color, type MeshStandardMaterial } from \"three\";\nimport { type COMLight, type COMModel, type COMEntity, type COMPov } 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\";\n\ntype EventListener<Action extends keyof Actions> = (payload: Actions[Action]['PAYLOAD']) => 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((instance) => instance.id === id);\n if (fromComID) return fromComID;\n return this.__instances.find((instance) => Array.from(instance.registered.values()).find((object) => object.id === id));\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').DIVEMediaCreator as typeof import('../mediacreator/MediaCreator.ts').DIVEMediaCreator;\n this._mediaGenerator = new DIVEMediaCreator(this.renderer, this.scene, this.controller);\n }\n return this._mediaGenerator;\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>[]> = new Map();\n\n constructor(renderer: DIVERenderer, scene: DIVEScene, controls: DIVEOrbitControls, toolbox: DIVEToolbox) {\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\n DIVECommunication.__instances.push(this);\n }\n\n public DestroyInstance(): boolean {\n const existingIndex = DIVECommunication.__instances.findIndex((entry) => entry.id === this.id);\n if (existingIndex === -1) return false;\n DIVECommunication.__instances.splice(existingIndex, 1);\n return true;\n }\n\n public PerformAction<Action extends keyof Actions>(action: Action, payload: Actions[Action]['PAYLOAD']): Actions[Action]['RETURN'] {\n let returnValue: Actions[Action]['RETURN'] = false;\n\n switch (action) {\n case 'GET_ALL_SCENE_DATA': {\n returnValue = this.getAllSceneData(payload as Actions['GET_ALL_SCENE_DATA']['PAYLOAD']);\n break;\n }\n case 'GET_ALL_OBJECTS': {\n returnValue = this.getAllObjects(payload as Actions['GET_ALL_OBJECTS']['PAYLOAD']);\n break;\n }\n case 'GET_OBJECTS': {\n returnValue = this.getObjects(payload as Actions['GET_OBJECTS']['PAYLOAD']);\n break;\n }\n case 'ADD_OBJECT': {\n returnValue = this.addObject(payload as Actions['ADD_OBJECT']['PAYLOAD']);\n break;\n }\n case 'UPDATE_OBJECT': {\n returnValue = this.updateObject(payload as Actions['UPDATE_OBJECT']['PAYLOAD']);\n break;\n }\n case 'DELETE_OBJECT': {\n returnValue = this.deleteObject(payload as Actions['DELETE_OBJECT']['PAYLOAD']);\n break;\n }\n case 'SELECT_OBJECT': {\n returnValue = this.selectObject(payload as Actions['SELECT_OBJECT']['PAYLOAD']);\n break;\n }\n case 'DESELECT_OBJECT': {\n returnValue = this.deselectObject(payload as Actions['DESELECT_OBJECT']['PAYLOAD']);\n break;\n }\n case 'SET_BACKGROUND': {\n returnValue = this.setBackground(payload as Actions['SET_BACKGROUND']['PAYLOAD']);\n break;\n }\n case 'DROP_IT': {\n returnValue = this.dropIt(payload as Actions['DROP_IT']['PAYLOAD']);\n break;\n }\n case 'PLACE_ON_FLOOR': {\n returnValue = this.placeOnFloor(payload as Actions['PLACE_ON_FLOOR']['PAYLOAD']);\n break;\n }\n case 'SET_CAMERA_TRANSFORM': {\n returnValue = this.setCameraTransform(payload as Actions['SET_CAMERA_TRANSFORM']['PAYLOAD']);\n break;\n }\n case 'GET_CAMERA_TRANSFORM': {\n returnValue = this.getCameraTransform(payload as Actions['GET_CAMERA_TRANSFORM']['PAYLOAD']);\n break;\n }\n case 'MOVE_CAMERA': {\n returnValue = this.moveCamera(payload as Actions['MOVE_CAMERA']['PAYLOAD']);\n break;\n }\n case 'RESET_CAMERA': {\n returnValue = this.resetCamera(payload as Actions['RESET_CAMERA']['PAYLOAD']);\n break;\n }\n case 'COMPUTE_ENCOMPASSING_VIEW': {\n returnValue = this.computeEncompassingView(payload as Actions['COMPUTE_ENCOMPASSING_VIEW']['PAYLOAD']);\n break;\n }\n case 'SET_CAMERA_LAYER': {\n returnValue = this.setCameraLayer(payload as Actions['SET_CAMERA_LAYER']['PAYLOAD']);\n break;\n }\n case 'ZOOM_CAMERA': {\n returnValue = this.zoomCamera(payload as Actions['ZOOM_CAMERA']['PAYLOAD']);\n break;\n }\n case 'SET_GIZMO_MODE': {\n returnValue = this.setGizmoMode(payload as Actions['SET_GIZMO_MODE']['PAYLOAD']);\n break;\n }\n case 'SET_GIZMO_VISIBILITY': {\n returnValue = this.setGizmoVisibility(payload as Actions['SET_GIZMO_VISIBILITY']['PAYLOAD']);\n break;\n }\n case 'USE_TOOL': {\n returnValue = this.useTool(payload as Actions['USE_TOOL']['PAYLOAD']);\n break;\n }\n case 'MODEL_LOADED': {\n returnValue = this.modelLoaded(payload as Actions['MODEL_LOADED']['PAYLOAD']);\n break;\n }\n case 'UPDATE_SCENE': {\n returnValue = this.updateScene(payload as Actions['UPDATE_SCENE']['PAYLOAD']);\n break;\n }\n case 'GENERATE_MEDIA': {\n returnValue = this.generateMedia(payload as Actions['GENERATE_MEDIA']['PAYLOAD']);\n break;\n }\n case 'SET_PARENT': {\n returnValue = this.setParent(payload as Actions['SET_PARENT']['PAYLOAD']);\n break;\n }\n }\n\n this.dispatch(action, payload);\n\n return returnValue;\n }\n\n public Subscribe<Action extends keyof Actions>(type: Action, listener: EventListener<Action>): 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.get(type)!.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((entry) => entry === listener);\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>(type: Action, payload: Actions[Action]['PAYLOAD']): void {\n const listenerArray = this.listeners.get(type);\n if (!listenerArray) return;\n\n listenerArray.forEach((listener) => listener(payload))\n }\n\n private getAllSceneData(payload: Actions['GET_ALL_SCENE_DATA']['PAYLOAD']): Actions['GET_ALL_SCENE_DATA']['RETURN'] {\n const sceneData = {\n name: this.scene.name,\n mediaItem: null,\n backgroundColor: '#' + (this.scene.background as Color).getHexString(),\n floorEnabled: this.scene.Floor.visible,\n floorColor: '#' + (this.scene.Floor.material as MeshStandardMaterial).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((object) => object.entityType === 'light') as COMLight[],\n objects: Array.from(this.registered.values()).filter((object) => object.entityType === 'model') as COMModel[],\n cameras: Array.from(this.registered.values()).filter((object) => object.entityType === 'pov') as COMPov[],\n };\n Object.assign(payload, sceneData);\n return sceneData;\n }\n\n private getAllObjects(payload: Actions['GET_ALL_OBJECTS']['PAYLOAD']): Actions['GET_ALL_OBJECTS']['RETURN'] {\n Object.assign(payload, this.registered);\n return this.registered;\n }\n\n private getObjects(payload: Actions['GET_OBJECTS']['PAYLOAD']): 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(payload: Actions['ADD_OBJECT']['PAYLOAD']): Actions['ADD_OBJECT']['RETURN'] {\n if (this.registered.get(payload.id)) return false;\n\n if (payload.parent === undefined) payload.parent = null;\n\n this.registered.set(payload.id, payload);\n\n this.scene.AddSceneObject(payload);\n\n return true;\n }\n\n private updateObject(payload: Actions['UPDATE_OBJECT']['PAYLOAD']): Actions['UPDATE_OBJECT']['RETURN'] {\n const objectToUpdate = this.registered.get(payload.id);\n if (!objectToUpdate) return false;\n\n this.registered.set(payload.id, { ...objectToUpdate, ...payload });\n\n const updatedObject = this.registered.get(payload.id)!;\n this.scene.UpdateSceneObject({ ...payload, id: updatedObject.id, entityType: updatedObject.entityType });\n\n Object.assign(payload, updatedObject);\n\n return true;\n }\n\n private deleteObject(payload: Actions['DELETE_OBJECT']['PAYLOAD']): 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(payload: Actions['SELECT_OBJECT']['PAYLOAD']): 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(payload: Actions['DESELECT_OBJECT']['PAYLOAD']): 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(payload: Actions['SET_BACKGROUND']['PAYLOAD']): Actions['SET_BACKGROUND']['RETURN'] {\n this.scene.SetBackground(payload.color);\n\n return true;\n }\n\n private dropIt(payload: Actions['DROP_IT']['PAYLOAD']): 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(payload: Actions['PLACE_ON_FLOOR']['PAYLOAD']): 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(payload: Actions['SET_CAMERA_TRANSFORM']['PAYLOAD']): 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(payload: Actions['GET_CAMERA_TRANSFORM']['PAYLOAD']): 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(payload: Actions['MOVE_CAMERA']['PAYLOAD']): 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(position, target, payload.duration, payload.locked);\n\n return true;\n }\n\n private setCameraLayer(payload: Actions['SET_CAMERA_LAYER']['PAYLOAD']): Actions['SET_CAMERA_LAYER']['RETURN'] {\n this.controller.object.SetCameraLayer(payload.layer);\n\n return true;\n }\n\n private resetCamera(payload: Actions['RESET_CAMERA']['PAYLOAD']): Actions['RESET_CAMERA']['RETURN'] {\n this.controller.RevertLast(payload.duration);\n\n return true;\n }\n\n private computeEncompassingView(payload: Actions['COMPUTE_ENCOMPASSING_VIEW']['PAYLOAD']): 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(payload: Actions['ZOOM_CAMERA']['PAYLOAD']): 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(payload: Actions['SET_GIZMO_MODE']['PAYLOAD']): Actions['SET_GIZMO_MODE']['RETURN'] {\n this.toolbox.SetGizmoMode(payload.mode);\n return true;\n }\n\n private setGizmoVisibility(payload: Actions['SET_GIZMO_VISIBILITY']['PAYLOAD']): Actions['SET_GIZMO_VISIBILITY']['RETURN'] {\n this.toolbox.SetGizmoVisibility(payload);\n return payload;\n }\n\n private useTool(payload: Actions['USE_TOOL']['PAYLOAD']): Actions['USE_TOOL']['RETURN'] {\n this.toolbox.UseTool(payload.tool);\n return true;\n }\n\n private modelLoaded(payload: Actions['MODEL_LOADED']['PAYLOAD']): Actions['MODEL_LOADED']['RETURN'] {\n (this.registered.get(payload.id) as COMModel).loaded = true;\n return true;\n }\n\n private updateScene(payload: Actions['UPDATE_SCENE']['PAYLOAD']): Actions['UPDATE_SCENE']['RETURN'] {\n if (payload.name !== undefined) this.scene.name = payload.name;\n if (payload.backgroundColor !== undefined) this.scene.SetBackground(payload.backgroundColor);\n\n if (payload.gridEnabled !== undefined) this.scene.Grid.SetVisibility(payload.gridEnabled);\n\n if (payload.floorEnabled !== undefined) this.scene.Floor.SetVisibility(payload.floorEnabled);\n if (payload.floorColor !== undefined) this.scene.Floor.SetColor(payload.floorColor);\n\n\n // fill payload with current values\n // TODO optmize this\n payload.name = this.scene.name;\n payload.backgroundColor = '#' + (this.scene.background as Color).getHexString();\n payload.gridEnabled = this.scene.Grid.visible;\n payload.floorEnabled = this.scene.Floor.visible;\n payload.floorColor = '#' + (this.scene.Floor.material as MeshStandardMaterial).color.getHexString();\n\n return true;\n }\n\n private generateMedia(payload: Actions['GENERATE_MEDIA']['PAYLOAD']): 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(position, target, payload.width, payload.height);\n\n return true;\n }\n\n private setParent(payload: Actions['SET_PARENT']['PAYLOAD']): 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\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}","import { Box3, Mesh, MeshStandardMaterial, Object3D, Raycaster, Vector3, Vector3Like } from 'three';\nimport { DIVESelectable } from '../interface/Selectable';\nimport { PRODUCT_LAYER_MASK } from '../constant/VisibilityLayerMask';\nimport { DIVEMoveable } from '../interface/Moveable';\nimport { DIVECommunication } from '../com/Communication';\nimport type { GLTF, TransformControls } from 'three/examples/jsm/Addons.js';\nimport { findSceneRecursive } from '../helper/findSceneRecursive/findSceneRecursive';\nimport { 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 DIVEModel extends Object3D implements DIVESelectable, DIVEMoveable {\n readonly isDIVEModel: true = true;\n readonly isSelectable: true = true;\n readonly isMoveable: true = true;\n\n public gizmo: TransformControls | null = null;\n\n private boundingBox: Box3;\n\n private _mesh: Mesh | null = null;\n private _material: MeshStandardMaterial | null = null;\n\n constructor() {\n super();\n\n this.layers.mask = PRODUCT_LAYER_MASK;\n\n this.boundingBox = new Box3();\n }\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).material as MeshStandardMaterial;\n }\n }\n });\n\n this.add(gltf.scene);\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.setFromVector3(new Vector3(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.traverse((child) => {\n child.visible = visible;\n });\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 SetToWorldOrigin(): void {\n this.position.set(0, 0, 0);\n DIVECommunication.get(this.userData.id)?.PerformAction('UPDATE_OBJECT', { id: this.userData.id, position: this.position, rotation: this.rotation, scale: this.scale });\n }\n\n public PlaceOnFloor(): void {\n this.position.y = -this.boundingBox.min.y * this.scale.y;\n DIVECommunication.get(this.userData.id)?.PerformAction('UPDATE_OBJECT', { id: this.userData.id, position: this.position, rotation: this.rotation, scale: this.scale });\n }\n\n public DropIt(): void {\n if (!this.parent) {\n console.warn('DIVEModel: DropIt() called on a model that is not in the scene.', this);\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(this.boundingBox.getCenter(new Vector3()).multiply(this.scale));\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(findSceneRecursive(this).Root.children, true);\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.clone().setY(worldPos.y).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('UPDATE_OBJECT', { id: this.userData.id, position: this.position, rotation: this.rotation, scale: this.scale });\n }\n }\n\n public onMove(): void {\n DIVECommunication.get(this.userData.id)?.PerformAction('UPDATE_OBJECT', { id: this.userData.id, position: this.position, rotation: this.rotation, scale: this.scale });\n }\n\n public onSelect(): void {\n DIVECommunication.get(this.userData.id)?.PerformAction('SELECT_OBJECT', { id: this.userData.id });\n }\n\n public onDeselect(): void {\n DIVECommunication.get(this.userData.id)?.PerformAction('DESELECT_OBJECT', { id: this.userData.id });\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}","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('https://www.gstatic.com/draco/v1/decoders/');\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.loadAsync(uri, progEvent).then(resolve).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}","import { Box3, BoxGeometry, BufferGeometry, Color, ConeGeometry, CylinderGeometry, Mesh, MeshStandardMaterial, Object3D, Raycaster, SphereGeometry, Vector3, Vector3Like } from 'three';\nimport { DIVECommunication } from '../com/Communication';\nimport { PRODUCT_LAYER_MASK } from '../constant/VisibilityLayerMask';\nimport { findSceneRecursive } from '../helper/findSceneRecursive/findSceneRecursive';\nimport { type DIVESelectable } from '../interface/Selectable';\nimport { type DIVEMoveable } from '../interface/Moveable';\nimport { type TransformControls } from 'three/examples/jsm/controls/TransformControls';\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 Object3D implements DIVESelectable, DIVEMoveable {\n readonly isDIVEPrimitive: true = true;\n readonly isSelectable: true = true;\n readonly isMoveable: true = true;\n\n public gizmo: TransformControls | null = null;\n\n private _mesh: Mesh;\n private _boundingBox: Box3;\n\n constructor() {\n super();\n\n this.layers.mask = PRODUCT_LAYER_MASK;\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 this._boundingBox = new Box3();\n }\n\n public SetGeometry(geometry: COMGeometry): void {\n this._mesh.geometry = this.assembleGeometry(geometry);\n this._boundingBox.setFromObject(this._mesh);\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.setFromVector3(new Vector3(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.traverse((child) => {\n child.visible = visible;\n });\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 SetToWorldOrigin(): void {\n this.position.set(0, 0, 0);\n DIVECommunication.get(this.userData.id)?.PerformAction('UPDATE_OBJECT', { id: this.userData.id, position: this.position, rotation: this.rotation, scale: this.scale });\n }\n\n public PlaceOnFloor(): void {\n this.position.y = -this._boundingBox.min.y * this.scale.y;\n DIVECommunication.get(this.userData.id)?.PerformAction('UPDATE_OBJECT', { id: this.userData.id, position: this.position, rotation: this.rotation, scale: this.scale });\n }\n\n public DropIt(): void {\n if (!this.parent) {\n console.warn('DIVEModel: DropIt() called on a model that is not in the scene.', this);\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(this._boundingBox.getCenter(new Vector3()).multiply(this.scale));\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(findSceneRecursive(this).Root.children, true);\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.clone().setY(worldPos.y).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('UPDATE_OBJECT', { id: this.userData.id, position: this.position, rotation: this.rotation, scale: this.scale });\n }\n }\n\n public onMove(): void {\n DIVECommunication.get(this.userData.id)?.PerformAction('UPDATE_OBJECT', { id: this.userData.id, position: this.position, rotation: this.rotation, scale: this.scale });\n }\n\n public onSelect(): void {\n DIVECommunication.get(this.userData.id)?.PerformAction('SELECT_OBJECT', { id: this.userData.id });\n }\n\n public onDeselect(): void {\n DIVECommunication.get(this.userData.id)?.PerformAction('DESELECT_OBJECT', { id: this.userData.id });\n }\n\n private assembleGeometry(geometry: COMGeometry): BufferGeometry {\n switch (geometry.name) {\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 '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 return new BufferGeometry();\n }\n }\n\n private createCylinderGeometry(geometry: COMGeometry): BufferGeometry {\n const geo = new CylinderGeometry(geometry.width / 2, geometry.width / 2, geometry.height, 64);\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(geometry.width / 2, geometry.height, 4, 1, true);\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(geometry.width, geometry.height, geometry.depth);\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(geometry.width, geometry.height, geometry.depth || 0.05, 16);\n geo.translate(0, geometry.height / 2, 0);\n return geo;\n }\n\n private createPlaneGeometry(geometry: COMGeometry): BufferGeometry {\n const geo = new BoxGeometry(geometry.width, geometry.height, geometry.depth);\n geo.translate(0, geometry.height / 2, 0);\n return geo;\n }\n}\n","import { Box3, BoxGeometry, Mesh, MeshBasicMaterial, Object3D, Vector3, type Vector3Like } from \"three\";\nimport { type DIVEMoveable } from \"../interface/Moveable\";\nimport { type DIVESelectable } from \"../interface/Selectable\";\nimport { type DIVESceneObject } from \"../types\";\nimport { DIVECommunication } from \"../com/Communication\";\n\nexport class DIVEGroup extends Object3D implements DIVESelectable, DIVEMoveable {\n readonly isDIVEGroup: true = true;\n readonly isSelectable: true = true;\n readonly isMoveable: true = true;\n\n private _bb: Box3;\n private _boxMesh: Mesh;\n\n constructor() {\n super();\n\n this.name = 'DIVEGroup';\n\n this._bb = new Box3();\n\n this._boxMesh = new Mesh(new BoxGeometry(0, 0, 0), new MeshBasicMaterial({ color: 0xff0000, wireframe: true }));\n this._boxMesh.visible = false;\n this.add(this._boxMesh);\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.setFromVector3(new Vector3(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.traverse((child) => {\n if (child.uuid === this._boxMesh.uuid) return;\n child.visible = visible;\n });\n }\n\n public SetBoundingBoxVisibility(visible: boolean): void {\n this._boxMesh.visible = visible;\n }\n\n public attach(object: DIVESceneObject): this {\n // attach (insted of add) object to keep it's world position\n super.attach(object);\n\n // set position to it's bb's center\n this.recalculatePosition();\n\n // update box mesh\n this.updateBoxMesh();\n\n return this;\n }\n\n public remove(object: DIVESceneObject): this {\n // removes object from group while keeping it's world position\n super.remove(object);\n\n // set position to it's bb's center\n this.recalculatePosition();\n\n // update box mesh\n this.updateBoxMesh();\n\n return this;\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._bb.makeEmpty();\n this.children.forEach((child) => {\n if (child.uuid === this._boxMesh.uuid) return;\n this._bb.expandByObject(child);\n });\n\n return this._bb.getCenter(new Vector3());\n }\n\n private updateBoxMesh(): void {\n this._boxMesh.geometry = new BoxGeometry(this._bb.max.x - this._bb.min.x, this._bb.max.y - this._bb.min.y, this._bb.max.z - this._bb.min.z);\n }\n\n public onMove(): void {\n DIVECommunication.get(this.userData.id)?.PerformAction('UPDATE_OBJECT', { id: this.userData.id, position: this.position, rotation: this.rotation, scale: this.scale });\n }\n\n public onSelect(): void {\n DIVECommunication.get(this.userData.id)?.PerformAction('SELECT_OBJECT', { id: this.userData.id });\n }\n\n public onDeselect(): void {\n DIVECommunication.get(this.userData.id)?.PerformAction('DESELECT_OBJECT', { id: this.userData.id });\n }\n}","export const GRID_CENTER_LINE_COLOR = '#888888';\nexport const GRID_SIDE_LINE_COLOR = '#dddddd';","import { GRID_SIDE_LINE_COLOR, GRID_CENTER_LINE_COLOR } 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(100, 100, GRID_CENTER_LINE_COLOR, GRID_SIDE_LINE_COLOR);\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}","import { Color, ColorRepresentation, Mesh, MeshStandardMaterial, PlaneGeometry } 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(new PlaneGeometry(10000, 10000), new MeshStandardMaterial({ color: new Color(150 / 255, 150 / 255, 150 / 255) }));\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(camera: DIVEPerspectiveCamera, renderer: DIVERenderer, animationSystem: DIVEAnimationSystem, settings: Partial<DIVEOrbitControlsSettings> = DIVEOrbitControlsDefaultSettings) {\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 = settings.enableDamping || DIVEOrbitControlsDefaultSettings.enableDamping;\n this.dampingFactor = settings.dampingFactor || 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): { position: Vector3Like, target: Vector3Like } {\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(this.getDistance() - zoomBy, minDistance + zoomBy, maxDistance - zoomBy);\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(this.getDistance() + zoomBy, minDistance + zoomBy, maxDistance - zoomBy);\n this.update();\n this.minDistance = minDistance;\n this.maxDistance = maxDistance;\n }\n\n public MoveTo(pos: Vector3Like | undefined, target: Vector3Like | undefined, duration: number, lock: boolean): 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) this.last = { pos: this.object.position.clone(), target: this.target.clone() };\n\n this.animating = duration > 0;\n this.locked = lock;\n this.enabled = false;\n\n const tweenPos = this._animationSystem.Animate(this.object.position)\n .to(toPosition, duration)\n .easing(Easing.Quadratic.Out)\n .start();\n\n const tweenQuat = this._animationSystem.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.Animate(this.object.position)\n .to(pos, duration)\n .easing(Easing.Quadratic.Out)\n .start();\n\n const tweenQuat = this._animationSystem.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}","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').DIVESelectTool as typeof import('./select/SelectTool.ts').DIVESelectTool;\n this._selectTool = new DIVESelectTool(this._scene, this._controller);\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 throw new Error(`ToolBox.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) => this.onPointerMove(e));\n this._controller.domElement.addEventListener('pointerdown', (e) => this.onPointerDown(e));\n this._controller.domElement.addEventListener('pointerup', (e) => this.onPointerUp(e));\n this._controller.domElement.addEventListener('wheel', (e) => this.onWheel(e));\n }\n\n private removeEventListeners(): void {\n this._controller.domElement.removeEventListener('pointermove', (e) => this.onPointerMove(e));\n this._controller.domElement.removeEventListener('pointerdown', (e) => this.onPointerDown(e));\n this._controller.domElement.removeEventListener('pointerup', (e) => this.onPointerUp(e));\n this._controller.domElement.removeEventListener('wheel', (e) => this.onWheel(e));\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}","import { AxesHelper, Color, Material, Matrix4, OrthographicCamera, Vector4 } from \"three\";\nimport SpriteText from \"three-spritetext\";\nimport { COORDINATE_LAYER_MASK } from \"../constant/VisibilityLayerMask.ts\";\nimport { AxesColorRed, AxesColorGreen, AxesColorBlue, AxesColorRedLetter, AxesColorGreenLetter, AxesColorBlueLetter } 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(renderer: DIVERenderer, scene: DIVEScene, controls: DIVEOrbitControls) {\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(new Matrix4().extractRotation(matrix).invert());\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 * Find the difference between two objects.\n */\n\nexport const getObjectDelta = <T extends object>(a: T, b: Partial<T>): Partial<T> => {\n\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\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\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(aArray[index], bArray[index]);\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\n return;\n }\n\n // assumption: b[key] is an object\n if (typeof b[key as keyof object] === 'object') {\n\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(a[key as keyof object], b[key as keyof object]);\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}","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 = 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 = /iPad|iPhone|iPod/.test(userAgent) && !(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 = /^((?!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}","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}","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}","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}","import shift from \"../helper/shift.ts\";\n\nexport default function roundExponential(number: number, decimals: number = 0): number {\n if (number < 0) return -roundExponential(-number, decimals);\n const n = shift(number, +decimals);\n return shift(Math.round(n), -decimals);\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(vecA: Vector3, vecB: Vector3, planeNormal: Vector3): number {\n return Math.atan2(vecA.clone().cross(vecB).dot(planeNormal), vecB.clone().dot(vecA));\n}","import shift from \"../helper/shift.ts\";\n\nexport default function toFixedExp(number: number, decimals: number = 0): string {\n const n = shift(number, +decimals);\n return shift(Math.round(n), -decimals).toFixed(decimals);\n}","import shift from \"../helper/shift.ts\";\n\nexport default function truncateExp(number: number, decimals: number = 0): number {\n const n = shift(number, +decimals);\n return shift(Math.trunc(n), -decimals);\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}"],"mappings":"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","names":["import_three","import_three","import_three","import_three","import_three","import_three","DIVEMediaCreator","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"]}