@roomle/web-sdk 2.107.0 → 2.108.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (137) hide show
  1. package/lib/ConfiguratorKernel.wasm +0 -0
  2. package/lib/{PointLightHelper-BkdQaOKc.js → PointLightHelper-B8VP_55Z.js} +2 -2
  3. package/lib/{PointLightHelper-BkdQaOKc.js.map → PointLightHelper-B8VP_55Z.js.map} +1 -1
  4. package/lib/{PointLightHelper-qhWtXw8x.mjs → PointLightHelper-DtoZq5ME.mjs} +2 -2
  5. package/lib/{PointLightHelper-qhWtXw8x.mjs.map → PointLightHelper-DtoZq5ME.mjs.map} +1 -1
  6. package/lib/RoomleCore.js +6 -6
  7. package/lib/RoomleCore.wasm +0 -0
  8. package/lib/RoomleToolsCore.wasm +0 -0
  9. package/lib/{banana-for-scale-XjIfe69B.js → banana-for-scale-BVlDK4jg.js} +2 -2
  10. package/lib/{banana-for-scale-XjIfe69B.js.map → banana-for-scale-BVlDK4jg.js.map} +1 -1
  11. package/lib/{banana-for-scale-CDGM3hdN.mjs → banana-for-scale-CKSlc9Tc.mjs} +2 -2
  12. package/lib/{banana-for-scale-CDGM3hdN.mjs.map → banana-for-scale-CKSlc9Tc.mjs.map} +1 -1
  13. package/lib/camera-behaviour-CzgZxW1D.js +50 -0
  14. package/lib/camera-behaviour-CzgZxW1D.js.map +1 -0
  15. package/lib/{camera-behaviour-BLMduSEn.mjs → camera-behaviour-DWkBHxkk.mjs} +79 -75
  16. package/lib/camera-behaviour-DWkBHxkk.mjs.map +1 -0
  17. package/lib/{component-dimensioning-Do75G-kI.js → component-dimensioning-CUoDDxfk.js} +2 -2
  18. package/lib/{component-dimensioning-Do75G-kI.js.map → component-dimensioning-CUoDDxfk.js.map} +1 -1
  19. package/lib/{component-dimensioning-DvCO0pEp.mjs → component-dimensioning-CgVIP7Nu.mjs} +2 -2
  20. package/lib/{component-dimensioning-DvCO0pEp.mjs.map → component-dimensioning-CgVIP7Nu.mjs.map} +1 -1
  21. package/lib/{component-raycast-helper-Dl-pzfg_.js → component-raycast-helper-DvNtWlR5.js} +2 -2
  22. package/lib/{component-raycast-helper-Dl-pzfg_.js.map → component-raycast-helper-DvNtWlR5.js.map} +1 -1
  23. package/lib/{component-raycast-helper-CuZdUtrH.mjs → component-raycast-helper-zAwc-AuF.mjs} +2 -2
  24. package/lib/{component-raycast-helper-CuZdUtrH.mjs.map → component-raycast-helper-zAwc-AuF.mjs.map} +1 -1
  25. package/lib/{configurator-CT_ghGbX.mjs → configurator-DDhzCgxy.mjs} +6 -6
  26. package/lib/{configurator-CT_ghGbX.mjs.map → configurator-DDhzCgxy.mjs.map} +1 -1
  27. package/lib/{configurator-B01iJTNa.js → configurator-DJnpG8CG.js} +2 -2
  28. package/lib/{configurator-B01iJTNa.js.map → configurator-DJnpG8CG.js.map} +1 -1
  29. package/lib/configurator-scene-manager-Bxdyg2zz.js +2 -0
  30. package/lib/configurator-scene-manager-Bxdyg2zz.js.map +1 -0
  31. package/lib/{configurator-scene-manager-DbsYS4rm.mjs → configurator-scene-manager-DnZvFw0N.mjs} +150 -162
  32. package/lib/configurator-scene-manager-DnZvFw0N.mjs.map +1 -0
  33. package/lib/configurator.js +1 -1
  34. package/lib/configurator.nomodule.js +1 -1
  35. package/lib/{continuous-drawing-helper-DdnnCOqZ.js → continuous-drawing-helper-C6qDGAxa.js} +2 -2
  36. package/lib/{continuous-drawing-helper-DdnnCOqZ.js.map → continuous-drawing-helper-C6qDGAxa.js.map} +1 -1
  37. package/lib/{continuous-drawing-helper-DrpQFppG.mjs → continuous-drawing-helper-DbTM7uCv.mjs} +2 -2
  38. package/lib/{continuous-drawing-helper-DrpQFppG.mjs.map → continuous-drawing-helper-DbTM7uCv.mjs.map} +1 -1
  39. package/lib/{default-light-setting-D0Ie_AEw.mjs → default-light-setting-BdD0jDeP.mjs} +3 -3
  40. package/lib/{default-light-setting-D0Ie_AEw.mjs.map → default-light-setting-BdD0jDeP.mjs.map} +1 -1
  41. package/lib/{default-light-setting-DQxt3v5x.js → default-light-setting-CYiFuxeI.js} +2 -2
  42. package/lib/{default-light-setting-DQxt3v5x.js.map → default-light-setting-CYiFuxeI.js.map} +1 -1
  43. package/lib/definitions/common-core/src/light/light-source.d.ts +2 -0
  44. package/lib/definitions/common-core/src/utils/threejs-utils.d.ts +2 -1
  45. package/lib/definitions/common-core/src/webgl/roomle-component-factory.d.ts +1 -0
  46. package/lib/definitions/common-core/src/webgl/scene-manager.d.ts +1 -1
  47. package/lib/definitions/planner-core/src/lights/ceiling-light.d.ts +1 -1
  48. package/lib/definitions/planner-core/src/lights/light-group.d.ts +1 -2
  49. package/lib/definitions/planner-core/src/roomle-planner.d.ts +12 -6
  50. package/lib/definitions/planner-core/src/services/planner-kernel-access.d.ts +1 -1
  51. package/lib/definitions/planner-core/src/view-model/plan-view-model.d.ts +1 -4
  52. package/lib/definitions/planner-core/src/webgl/planner-scene-manager.d.ts +5 -1
  53. package/lib/{glb-viewer-BEWU9zxC.mjs → glb-viewer-BoZgMSrk.mjs} +6 -6
  54. package/lib/{glb-viewer-BEWU9zxC.mjs.map → glb-viewer-BoZgMSrk.mjs.map} +1 -1
  55. package/lib/{glb-viewer-camera-behaviour-Cl2bS83k.js → glb-viewer-camera-behaviour-AEWNZ6mR.js} +2 -2
  56. package/lib/{glb-viewer-camera-behaviour-Cl2bS83k.js.map → glb-viewer-camera-behaviour-AEWNZ6mR.js.map} +1 -1
  57. package/lib/{glb-viewer-camera-behaviour-DQ2sVbku.mjs → glb-viewer-camera-behaviour-CRnnMrL2.mjs} +2 -2
  58. package/lib/{glb-viewer-camera-behaviour-DQ2sVbku.mjs.map → glb-viewer-camera-behaviour-CRnnMrL2.mjs.map} +1 -1
  59. package/lib/{glb-viewer-6_OVDzVH.js → glb-viewer-vvpjnYPw.js} +2 -2
  60. package/lib/{glb-viewer-6_OVDzVH.js.map → glb-viewer-vvpjnYPw.js.map} +1 -1
  61. package/lib/glb-viewer.js +1 -1
  62. package/lib/glb-viewer.nomodule.js +1 -1
  63. package/lib/{imos-ix-poc-export-helper-r0pv9sOT.js → imos-ix-poc-export-helper-7AWayvID.js} +2 -2
  64. package/lib/{imos-ix-poc-export-helper-r0pv9sOT.js.map → imos-ix-poc-export-helper-7AWayvID.js.map} +1 -1
  65. package/lib/{imos-ix-poc-export-helper-BrpY0OHi.mjs → imos-ix-poc-export-helper-gQb0lbdn.mjs} +2 -2
  66. package/lib/{imos-ix-poc-export-helper-BrpY0OHi.mjs.map → imos-ix-poc-export-helper-gQb0lbdn.mjs.map} +1 -1
  67. package/lib/{main-05wLxbDZ.js → main-DVWEbQdM.js} +340 -149
  68. package/lib/{main-05wLxbDZ.js.map → main-DVWEbQdM.js.map} +1 -1
  69. package/lib/{main-CMu7hOEO.mjs → main-RpgY_kch.mjs} +2202 -1999
  70. package/lib/{main-CMu7hOEO.mjs.map → main-RpgY_kch.mjs.map} +1 -1
  71. package/lib/{material-viewer-B0MevA_r.mjs → material-viewer-DQjAOrWL.mjs} +4 -4
  72. package/lib/{material-viewer-B0MevA_r.mjs.map → material-viewer-DQjAOrWL.mjs.map} +1 -1
  73. package/lib/{material-viewer-CLqZXFrn.js → material-viewer-_9Sb1UCw.js} +2 -2
  74. package/lib/{material-viewer-CLqZXFrn.js.map → material-viewer-_9Sb1UCw.js.map} +1 -1
  75. package/lib/material-viewer.js +1 -1
  76. package/lib/material-viewer.nomodule.js +1 -1
  77. package/lib/planner-BcHlq0n3.js +155 -0
  78. package/lib/planner-BcHlq0n3.js.map +1 -0
  79. package/lib/{planner-B3Bt-cWy.mjs → planner-BilNNFJ0.mjs} +143 -125
  80. package/lib/planner-BilNNFJ0.mjs.map +1 -0
  81. package/lib/planner.js +1 -1
  82. package/lib/planner.nomodule.js +1 -1
  83. package/lib/roomle-sdk.js +7 -7
  84. package/lib/roomle-sdk.nomodule.js +1 -1
  85. package/lib/{script-loader-CZjzwkk2.js → script-loader-BZOMZ1AI.js} +2 -2
  86. package/lib/{script-loader-CZjzwkk2.js.map → script-loader-BZOMZ1AI.js.map} +1 -1
  87. package/lib/{script-loader-BzwDLtbS.mjs → script-loader-CHolkWhE.mjs} +2 -2
  88. package/lib/{script-loader-BzwDLtbS.mjs.map → script-loader-CHolkWhE.mjs.map} +1 -1
  89. package/lib/static/roomle-core-hsc/ConfiguratorKernel.wasm +0 -0
  90. package/lib/static/roomle-core-hsc/RoomleCore.js +6 -6
  91. package/lib/static/roomle-core-hsc/RoomleCore.wasm +0 -0
  92. package/lib/static/roomle-core-hsc/RoomleServiceCore.js +6 -6
  93. package/lib/static/roomle-core-hsc/RoomleServiceCore.wasm +0 -0
  94. package/lib/static/roomle-core-hsc/RoomleToolsCore.wasm +0 -0
  95. package/lib/static/roomle-core-hsc/configuratorCoreInterface.d.ts +2 -0
  96. package/lib/static/roomle-core-hsc/embind/configuratorCoreInterface.d.ts +2 -0
  97. package/lib/static/roomle-core-hsc/embind/plannerCoreCallback.d.ts +2 -2
  98. package/lib/static/roomle-core-hsc/embind/plannerCoreCallback.js +1 -1
  99. package/lib/static/roomle-core-hsc/embind/plannerCoreCallback.js.map +1 -1
  100. package/lib/static/roomle-core-hsc/embind/plannerCoreInterface.d.ts +17 -2
  101. package/lib/static/roomle-core-hsc/embind/plannerCoreInterface.js.map +1 -1
  102. package/lib/static/roomle-core-hsc/package.json +1 -1
  103. package/lib/static/roomle-core-hsc/plannerCoreCallback.d.ts +2 -2
  104. package/lib/static/roomle-core-hsc/plannerCoreCallback.js +1 -1
  105. package/lib/static/roomle-core-hsc/plannerCoreCallback.js.map +1 -1
  106. package/lib/static/roomle-core-hsc/plannerCoreInterface.d.ts +17 -2
  107. package/lib/static/roomle-core-hsc/plannerCoreInterface.js.map +1 -1
  108. package/lib/static/roomle-core-hsc/src/embind/configuratorCoreInterface.d.ts +2 -0
  109. package/lib/static/roomle-core-hsc/src/embind/plannerCoreCallback.d.ts +2 -2
  110. package/lib/static/roomle-core-hsc/src/embind/plannerCoreCallback.js +1 -1
  111. package/lib/static/roomle-core-hsc/src/embind/plannerCoreCallback.js.map +1 -1
  112. package/lib/static/roomle-core-hsc/src/embind/plannerCoreInterface.d.ts +17 -2
  113. package/lib/static/roomle-core-hsc/src/embind/plannerCoreInterface.js.map +1 -1
  114. package/lib/static/roomle-core-hsc/wasm_modern/ConfiguratorKernel.wasm +0 -0
  115. package/lib/static/roomle-core-hsc/wasm_modern/RoomleCore.js +6 -6
  116. package/lib/static/roomle-core-hsc/wasm_modern/RoomleCore.wasm +0 -0
  117. package/lib/static/roomle-core-hsc/wasm_modern/RoomleServiceCore.js +6 -6
  118. package/lib/static/roomle-core-hsc/wasm_modern/RoomleServiceCore.wasm +0 -0
  119. package/lib/static/roomle-core-hsc/wasm_modern/RoomleToolsCore.wasm +0 -0
  120. package/lib/{stats-helper-BaTpWjzi.mjs → stats-helper-BFpxduid.mjs} +2 -2
  121. package/lib/{stats-helper-BaTpWjzi.mjs.map → stats-helper-BFpxduid.mjs.map} +1 -1
  122. package/lib/{stats-helper-DylhlHS_.js → stats-helper-D4z7zVEi.js} +2 -2
  123. package/lib/{stats-helper-DylhlHS_.js.map → stats-helper-D4z7zVEi.js.map} +1 -1
  124. package/lib/{tools-core-BF9kMznR.js → tools-core-BJbLUz5-.js} +2 -2
  125. package/lib/{tools-core-BF9kMznR.js.map → tools-core-BJbLUz5-.js.map} +1 -1
  126. package/lib/{tools-core-BbL-KMAf.mjs → tools-core-COGP-hBi.mjs} +3 -3
  127. package/lib/{tools-core-BbL-KMAf.mjs.map → tools-core-COGP-hBi.mjs.map} +1 -1
  128. package/package.json +1 -1
  129. package/lib/camera-behaviour-BLMduSEn.mjs.map +0 -1
  130. package/lib/camera-behaviour-DgLVg_pP.js +0 -50
  131. package/lib/camera-behaviour-DgLVg_pP.js.map +0 -1
  132. package/lib/configurator-scene-manager-CRSHxOfd.js +0 -2
  133. package/lib/configurator-scene-manager-CRSHxOfd.js.map +0 -1
  134. package/lib/configurator-scene-manager-DbsYS4rm.mjs.map +0 -1
  135. package/lib/planner-B3Bt-cWy.mjs.map +0 -1
  136. package/lib/planner-D7lLZxgW.js +0 -155
  137. package/lib/planner-D7lLZxgW.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"camera-behaviour-CzgZxW1D.js","sources":["../../packages/common-core/public/textures/env/default_1k.exr?no-inline?url","../../packages/common-core/public/textures/env/legacy_env.exr?no-inline?url","../../packages/common-core/src/cameracontrol/camera-control.ts","../../packages/common-core/src/cameracontrol/camera-control-3d.ts","../../packages/configurator-core/src/utils/animation/object-animations.ts","../../packages/common-core/src/webgl/roomle-component-factory.ts","../../packages/common-core/src/environment/environment.ts","../../packages/common-core/src/webgl/baked-shadow-plane.ts","../../packages/configurator-core/src/webgl/environment/floor-environment.ts","../../packages/planner-core/src/camera-control/camera-control-first-person.ts","../../packages/common-core/src/environment/background-environment.ts","../../packages/common-core/src/environment/dynamic-environment-setting-loader.ts","../../packages/common-core/src/lightsetting/light-setting.ts","../../packages/common-core/src/lightsetting/dynamic-light-setting.ts","../../../../node_modules/three/examples/jsm/objects/GroundedSkybox.js","../../packages/common-core/src/environment/ground-projected-environment.ts","../../packages/common-core/src/webgl/renderer/light-source-detection-debug.ts","../../packages/common-core/src/webgl/renderer/pmrem-environment.ts","../../packages/common-core/src/webgl/renderer/environment-definition.ts","../../packages/common-core/src/webgl/renderer/environment-scene.ts","../../packages/common-core/src/cameracontrol/camera-control-2d.ts","../../packages/common-core/src/webgl/scene-manager.ts","../../packages/common-core/src/cameracontrol/camera-behaviour.ts"],"sourcesContent":["export default \"__VITE_ASSET__Cp3ATg_t__\"","export default \"__VITE_ASSET__3DQ1EBX___\"","import type { Listener } from '../../../configurator-core/src/utils/event-dispatcher';\nimport EventDispatcher from '../../../configurator-core/src/utils/event-dispatcher';\nimport { position3VectorsAreEqual } from '../utils/threejs-utils';\nimport { toRadiant } from '../utils/math-helper';\nimport inject from '../di/inject';\nimport type DomHelper from '../utils/dom-helper';\nimport type { InputEvent } from '../input/input-manager';\nimport type InputManager from '../input/input-manager';\nimport { INPUT_EVENT_TYPE } from '../input/input-manager';\nimport type { Context } from '../di/context';\nimport { debounce } from '../utils/common-utils';\nimport type InitData from '../utils/init-data';\nimport type { Box3, Object3D, OrthographicCamera } from 'three';\nimport { PerspectiveCamera, Vector3 } from 'three';\nimport type GlobalInitData from '../utils/global-init-data';\nimport {Tween, Easing} from '@tweenjs/tween.js'\nimport type { Position2 } from '../common-interfaces';\n\nexport const enum CAMERA_EVENT {\n ORBIT_START,\n ORBIT_MOVE,\n ORBIT_END,\n ZOOM_IN,\n ZOOM_OUT,\n ZOOM_CHANGE,\n KEYBOARD_PRESSED,\n MOVING, // general event when camera moves\n IDLE, // general event when camera stopped moving\n}\n\nexport interface CameraParameter {\n /**\n * Yaw of the camera in radians\n */\n yaw?: number;\n /**\n * pitch of the camera in radians\n */\n pitch?: number;\n /**\n * Distance to the target position in meters\n */\n distance?: number;\n /**\n * X position where the camera should look at (in meters)\n * targetX: 0 -> is in the middle of the object\n */\n targetX?: number;\n /**\n * Y position where the camera should look at (in meters)\n * targetY: 0 -> is in on the bottom of the object (ground level)\n */\n targetY?: number;\n /**\n * Z position where the camera should look at (in meters)\n * targetZ: 0 -> is in the middle of the object\n */\n targetZ?: number;\n /**\n * Field of view of the camera (in degree)\n */\n fov?: number;\n /**\n * Near clipping plane of the camera\n */\n near?: number;\n /**\n * Far clipping plane of the camera\n */\n far?: number;\n /**\n * Should this camera movement block other camera movements?\n */\n blockOtherTweens?: boolean;\n}\n\nexport const INITIAL_YAW = -30;\nexport const INITIAL_PITCH = 10;\nexport const INITIAL_CAMERA_DISTANCE = -1;\nexport const DEBUG_CAMERA_POSITION = 'debug_camera_position';\n\ntype PerspectiveOrOrthographicCamera = PerspectiveCamera | OrthographicCamera;\n\nexport default abstract class CameraControl\n extends EventDispatcher<any>\n implements Context\n{\n public _creator_: string;\n\n @inject\n protected _domHelper: DomHelper;\n\n @inject\n protected _initData: InitData;\n\n @inject\n protected _globalInitData: GlobalInitData;\n\n protected _width: number;\n protected _height: number;\n\n protected _boundingBox: Box3;\n\n protected _cameraPosition: Vector3;\n protected _targetPosition: Vector3;\n\n protected _tweenEnd: CameraParameter = null;\n private _stateSaved: CameraParameter;\n private _cameraStandingStill: boolean = true;\n\n protected _pitch: number;\n protected _yaw: number;\n\n protected _distance = INITIAL_CAMERA_DISTANCE;\n protected _locked = false;\n\n private _inputManager: InputManager;\n protected _inputListeners: Array<Listener<InputEvent>> = [];\n\n protected _lerpEnabled: boolean = true;\n\n constructor(\n creator: string,\n inputManager: InputManager,\n initialCameraParameters?: CameraParameter\n ) {\n super();\n this._creator_ = creator;\n this._inputManager = inputManager;\n this._initInputListener();\n this._addInputListeners();\n this._cameraPosition = new Vector3();\n this._targetPosition = new Vector3();\n\n if (initialCameraParameters) {\n this.setCurrentCameraParameters(initialCameraParameters);\n } else {\n this._cameraPosition = new Vector3(0, 0.5, 3);\n\n this._pitch = toRadiant(\n this._initData.verticalCameraAngle ?? INITIAL_PITCH\n );\n this._yaw = toRadiant(\n this._initData.horizontalCameraAngle ?? INITIAL_YAW\n );\n }\n\n if (\n this._initData.debug &&\n this._getCamera() instanceof PerspectiveCamera\n ) {\n const debugCameraPosition = this.getDebugCameraPosition();\n if (debugCameraPosition) {\n this.setCurrentCameraParameters(debugCameraPosition);\n }\n }\n\n const clientDimensions = this._domHelper.getClientDimensions();\n this._width = clientDimensions.x;\n this._height = clientDimensions.y;\n\n this._dispatchCameraIdle = debounce(\n this._dispatchCameraIdle.bind(this),\n 32\n );\n }\n\n public getCamera(): PerspectiveOrOrthographicCamera {\n return this._getCamera();\n }\n\n protected abstract _getCamera(): PerspectiveOrOrthographicCamera;\n\n public abstract updateCamera(): void;\n\n protected abstract _initInputListener(): void;\n\n private _addInputListeners() {\n this._inputListeners.forEach((listener) => {\n this._inputManager.addEventListener(listener.key, listener.fun, this);\n });\n }\n\n private _removeInputListeners() {\n this._inputListeners.forEach((listener) => {\n this._inputManager.removeEventListener(listener.key, listener.fun);\n });\n }\n\n public setUp() {\n // check if listener is already added\n if (\n this._inputListeners.length &&\n this._inputManager.hasEventListener(\n this._inputListeners[0].key,\n this._inputListeners[0].fun,\n this\n )\n ) {\n return;\n }\n this._addInputListeners();\n }\n\n public cleanUp(): void {\n this._removeInputListeners();\n }\n\n public animateCamera(delta: number): boolean {\n const desiredPosition = this._cameraPosition;\n\n if (\n !desiredPosition ||\n position3VectorsAreEqual(desiredPosition, this.getCamera().position)\n ) {\n if (!this._cameraStandingStill) {\n this._cameraStandingStill = true;\n setTimeout(() => this._dispatchCameraIdle(), 16);\n if (this._initData.debug) {\n this.saveDebugCameraPosition();\n }\n }\n return false;\n }\n if (this._cameraStandingStill) {\n this.dispatchEvent(CAMERA_EVENT.MOVING, INPUT_EVENT_TYPE.AUTO);\n }\n this._cameraStandingStill = false;\n\n if (this._lerpEnabled && !this._tweenEnd && !this._globalInitData.e2e) {\n const newCameraPosition = this.getCamera().position.clone();\n const lerpFactor = Math.min(delta * 10, 1);\n newCameraPosition.lerp(desiredPosition, lerpFactor);\n this.getCamera().position.copy(newCameraPosition);\n } else {\n this.getCamera().position.copy(desiredPosition);\n }\n return true;\n }\n\n protected getDebugCameraPosition(): CameraParameter {\n return JSON.parse(localStorage.getItem(DEBUG_CAMERA_POSITION));\n }\n\n protected saveDebugCameraPosition() {\n localStorage.setItem(\n DEBUG_CAMERA_POSITION,\n JSON.stringify(this.getCurrentCameraParameters())\n );\n }\n\n protected _dispatchCameraIdle() {\n this.dispatchEvent(CAMERA_EVENT.IDLE, INPUT_EVENT_TYPE.AUTO);\n }\n\n protected _tweenCameraParameter(\n start: CameraParameter,\n end: CameraParameter,\n ignoreChecks: boolean = false\n ): Promise<void> {\n if (this._globalInitData.e2e || !this._initData.animateCamera) {\n this.dispatchEvent(CAMERA_EVENT.ORBIT_START, INPUT_EVENT_TYPE.AUTO);\n this.dispatchEvent(CAMERA_EVENT.ORBIT_MOVE, INPUT_EVENT_TYPE.AUTO);\n this._yaw = end.yaw;\n this._pitch = end.pitch;\n this._distance = end.distance;\n this._setCameraNear();\n this._update(\n new Vector3(end.targetX, end.targetY, end.targetZ),\n ignoreChecks\n );\n this.dispatchEvent(CAMERA_EVENT.ORBIT_MOVE, INPUT_EVENT_TYPE.AUTO);\n this.dispatchEvent(CAMERA_EVENT.ORBIT_END, INPUT_EVENT_TYPE.AUTO);\n this.dispatchEvent(CAMERA_EVENT.IDLE, INPUT_EVENT_TYPE.AUTO);\n return Promise.resolve();\n }\n\n return new Promise<void>((resolve) => {\n if (end.yaw - start.yaw <= -Math.PI) {\n start.yaw -= Math.PI * 2;\n } else if (end.yaw - start.yaw >= Math.PI) {\n start.yaw += Math.PI * 2;\n }\n if (this._tweenEnd !== null && this._tweenEnd.blockOtherTweens) {\n return;\n }\n this._tweenEnd = end;\n const tween = new Tween(start)\n .to(end, 400)\n .easing(Easing.Sinusoidal.In)\n .onUpdate(() => {\n this.dispatchEvent(CAMERA_EVENT.ORBIT_MOVE, INPUT_EVENT_TYPE.AUTO);\n this._yaw = start.yaw;\n this._pitch = start.pitch;\n this._distance = start.distance;\n this._setCameraNear();\n this._update(\n new Vector3(start.targetX, start.targetY, start.targetZ),\n ignoreChecks,\n true\n );\n })\n .onComplete(() => {\n this.dispatchEvent(CAMERA_EVENT.ORBIT_END, INPUT_EVENT_TYPE.AUTO);\n this._dispatchCameraIdle();\n this._tweenEnd = null;\n window.TWEEN?.remove(tween);\n resolve();\n }).start();\n window.TWEEN?.add(tween);\n this.dispatchEvent(CAMERA_EVENT.ORBIT_START, INPUT_EVENT_TYPE.AUTO);\n });\n }\n\n protected _setCameraNear() {\n const camera = this.getCamera();\n if (camera instanceof PerspectiveCamera) {\n const near = Math.max(0.1, this._distance / 6);\n camera.near = near;\n }\n }\n\n public getCurrentCameraParameters(): CameraParameter {\n const targetClone = this._targetPosition.clone();\n return {\n yaw: this._yaw,\n pitch: this._pitch,\n distance: this._distance,\n targetX: targetClone.x,\n targetY: targetClone.y,\n targetZ: targetClone.z,\n };\n }\n\n public setCurrentCameraParameters(cameraParameters: CameraParameter): void {\n this._yaw = cameraParameters.yaw ?? 0;\n this._pitch = cameraParameters.pitch ?? 0;\n this._distance = cameraParameters.distance ?? 0;\n this._targetPosition.copy(\n new Vector3(\n cameraParameters.targetX,\n cameraParameters.targetY,\n cameraParameters.targetZ\n )\n );\n this._update(null, true, true);\n }\n\n protected _rotateHorizontal(angle: number) {\n this._yaw -= angle;\n if (this._yaw < -Math.PI) {\n this._yaw += 2 * Math.PI;\n } else if (this._yaw > Math.PI) {\n this._yaw -= 2 * Math.PI;\n }\n }\n\n protected _rotateVertical(angle: number) {\n this._pitch += angle;\n if (this._pitch < -Math.PI) {\n this._pitch += 2 * Math.PI;\n } else if (this._pitch > Math.PI) {\n this._pitch -= 2 * Math.PI;\n }\n }\n\n public saveState(override: boolean): CameraParameter {\n if (override || !this._stateSaved) {\n const savedYaw = this._yaw;\n const savedPitch = this._pitch;\n const savedDistance = this._distance;\n const targetClone = this._targetPosition.clone();\n this._stateSaved = {\n yaw: savedYaw,\n pitch: savedPitch,\n distance: savedDistance,\n targetX: targetClone.x,\n targetY: targetClone.y,\n targetZ: targetClone.z,\n blockOtherTweens: true,\n };\n if ((this._getCamera() as any).fov) {\n const camera = this._getCamera() as PerspectiveCamera;\n this._stateSaved.fov = camera.fov;\n this._stateSaved.near = camera.near;\n this._stateSaved.far = camera.far;\n }\n return this._stateSaved;\n }\n return null;\n }\n\n public resetToState() {\n if (this._stateSaved) {\n this._stateSaved.blockOtherTweens = false;\n const targetClone = this._targetPosition.clone();\n this._tweenCameraParameter(\n {\n yaw: this._yaw,\n pitch: this._pitch,\n distance: this._distance,\n targetX: targetClone.x,\n targetY: targetClone.y,\n targetZ: targetClone.z,\n },\n this._stateSaved,\n true\n );\n }\n this._stateSaved = null;\n }\n\n public async setToState(start: CameraParameter, state: CameraParameter) {\n await this._tweenCameraParameter(start, state, true);\n }\n\n public hasSavedState(): boolean {\n return this._stateSaved != null;\n }\n\n public lock() {\n this._locked = true;\n }\n\n public unlock() {\n this._locked = false;\n }\n\n public isLocked() {\n return this._locked;\n }\n\n public getTargetPosition(): Vector3 {\n return this._targetPosition;\n }\n\n protected _saveYawAndPitch() {\n // save current yaw in camera userdata to reduce dependencies\n this._getCamera().userData.yaw = this._yaw;\n this._getCamera().userData.pitch = this._pitch;\n }\n\n public getInputPosition(position: Position2) {\n const { x, y } = this._domHelper.getClientDimensions();\n return new Vector3(\n (position.x / x) * 2 - 1,\n -(position.y / y) * 2 + 1,\n 0.5\n );\n }\n\n public addLightContainer(container: Object3D) {\n container.name = 'lights';\n const camera = this._getCamera();\n const currentContainer = camera.children.find(\n (child) => child.name === 'lights'\n );\n if (currentContainer) {\n camera.remove(currentContainer);\n }\n camera.add(container);\n }\n\n public checkNearFarDistance(point: Vector3) {\n if (!point) {\n return;\n }\n const distance = this._cameraPosition.distanceTo(point);\n const camera = this._getCamera();\n if (camera instanceof PerspectiveCamera && distance > camera.far) {\n camera.far = distance + 1;\n }\n }\n\n public setBounds(boundingBox: Box3) {\n this._boundingBox = boundingBox;\n }\n\n public get domHelper() {\n return this._domHelper;\n }\n\n protected abstract _update(\n overrideTarget?: Vector3,\n ignoreChecks?: boolean | undefined,\n keepVariables?: boolean | undefined\n ): void;\n\n public abstract getKernelZoomFactor(): number;\n}\n","import type { INPUT_EVENT_TYPE, InputEvent } from '../input/input-manager';\nimport type InputManager from '../input/input-manager';\nimport { INPUT_EVENT } from '../input/input-manager';\nimport type { CameraParameter } from './camera-control';\nimport CameraControl, {\n CAMERA_EVENT,\n INITIAL_CAMERA_DISTANCE,\n INITIAL_PITCH,\n INITIAL_YAW,\n} from './camera-control';\nimport { getIdealDistance, toDegrees, toRadiant } from '../utils/math-helper';\nimport {\n compareBox3Size,\n position2VectorsAreEqual,\n} from '../utils/threejs-utils';\nimport { LAYER } from '../webgl/layer';\nimport type { PerspectiveOffsetCamera } from '../webgl/roomle-component-factory';\nimport {\n areCameraParametersEqual,\n clamp,\n deepMerge,\n} from '../utils/common-utils';\nimport {\n type Box3,\n Euler,\n PerspectiveCamera,\n Quaternion,\n Sphere,\n Vector2,\n Vector3,\n} from 'three';\n\nexport class ZoomChangeEvent {\n public minZoom: boolean = false;\n public maxZoom: boolean = false;\n\n constructor(minZoom?: boolean, maxZoom?: boolean) {\n this.minZoom = minZoom;\n this.maxZoom = maxZoom;\n }\n}\n\nexport const enum STATE {\n NONE,\n ORBIT,\n MOVE,\n}\n\nexport const ROTATION_SPEED = 1;\nconst PAN_SPEED = 4;\nconst MIN_PAN_SPEED = 2;\nconst ZOOM_SPEED = 3;\nconst MAX_DISTANCE_MINIMAL = 2;\nconst SMALL_OBJECT_SIZE = 0.3;\nconst LARGE_OBJECT_SIZE = 3;\nexport const DISTANCE_FACTOR = 2.725;\nexport const MAX_POLAR_ANGLE = 85;\n\nexport default class CameraControl3D extends CameraControl {\n protected _camera: PerspectiveOffsetCamera;\n private _bounds: Vector3 = new Vector3();\n private _scale = 1;\n private _state: STATE = STATE.NONE;\n\n private _zoomSpeed: number = Math.pow(0.95, ZOOM_SPEED);\n\n public minDistance: number = 0;\n public maxDistance: number = 5;\n\n public minPolarAngle: number = toRadiant(0);\n public maxPolarAngle: number = toRadiant(MAX_POLAR_ANGLE);\n private _objectRotation: number = 0;\n private _lookAtSide: number = 0;\n\n public minAzimuthAngle: number = Number.NEGATIVE_INFINITY;\n public maxAzimuthAngle: number = Number.POSITIVE_INFINITY;\n\n private _zoomDistance: number = 0.1;\n private _orbitPosition: Vector2;\n private _userInteraction: boolean = false;\n\n private _currentZoomHash: string = '';\n\n private _maxZoomedIn: boolean = false;\n private _maxZoomedOut: boolean = false;\n\n private _panningEnabled: boolean = false;\n private _targetPositionIsPanned: boolean = false;\n\n constructor(\n creator: string,\n inputManager: InputManager,\n initialCameraParameters?: CameraParameter,\n camera?: PerspectiveOffsetCamera\n ) {\n super(creator, inputManager, initialCameraParameters);\n if (!camera) {\n this._initCamera();\n } else {\n this._camera = camera;\n }\n this._camera.fov = 30;\n if (!this._targetPosition) {\n this._targetPosition = new Vector3(0, 0, 0);\n this._targetPositionIsPanned = false;\n }\n const {\n cameraRestriction,\n zoomDistance,\n minVerticalCameraAngle,\n maxVerticalCameraAngle,\n minHorizontalCameraAngle,\n maxHorizontalCameraAngle,\n } = this._initData;\n if (zoomDistance) {\n this._zoomDistance = zoomDistance / 100;\n }\n if (minVerticalCameraAngle !== undefined) {\n this.minPolarAngle = toRadiant(\n minVerticalCameraAngle < 0\n ? minVerticalCameraAngle\n : minVerticalCameraAngle * -1\n );\n }\n if (maxVerticalCameraAngle !== undefined) {\n this.maxPolarAngle = toRadiant(maxVerticalCameraAngle);\n }\n if (minHorizontalCameraAngle !== undefined) {\n this.minAzimuthAngle = toRadiant(\n minHorizontalCameraAngle < 0\n ? minHorizontalCameraAngle\n : minHorizontalCameraAngle * -1\n );\n }\n if (maxHorizontalCameraAngle !== undefined) {\n this.maxAzimuthAngle = toRadiant(maxHorizontalCameraAngle);\n }\n if (cameraRestriction !== undefined) {\n let cameraRestrictionRadiant = Math.abs(toRadiant(cameraRestriction));\n this.minAzimuthAngle = -cameraRestrictionRadiant;\n this.maxAzimuthAngle = cameraRestrictionRadiant;\n this.maxPolarAngle = Math.min(\n cameraRestrictionRadiant,\n toRadiant(MAX_POLAR_ANGLE)\n );\n }\n this._update();\n }\n\n protected _getCamera(): PerspectiveCamera {\n if (this._camera) {\n return this._camera;\n }\n\n this._initCamera();\n\n return this._camera;\n }\n\n public getCamera(): PerspectiveOffsetCamera {\n return super.getCamera() as PerspectiveOffsetCamera;\n }\n\n private _initCamera() {\n this._camera =\n new PerspectiveCamera() as unknown as PerspectiveOffsetCamera;\n this._camera.fov = 30;\n this._camera.aspect = this._width / this._height;\n this._camera.near = 0.1;\n this._camera.far = 100;\n this._camera.updateProjectionMatrix();\n\n this._camera.layers.set(LAYER.OBJECT);\n this._camera.layers.enable(LAYER.LIGHTING);\n this._camera.layers.enable(LAYER.BACKGROUND);\n this._camera.layers.enable(LAYER.UI);\n this._camera.layers.enable(LAYER.PREVIEW);\n }\n\n public setObjectRotation(objectRotation: number, lookAtSide: number = 0) {\n this._objectRotation = objectRotation;\n this._lookAtSide = lookAtSide;\n }\n\n public getObjectRotation() {\n return this._objectRotation;\n }\n\n public updateCamera() {\n let { x, y } = this._domHelper.getClientDimensions();\n this._camera.aspect = x / y;\n this._camera.updateProjectionMatrix();\n }\n\n public animateCamera(delta: number): boolean {\n if (!super.animateCamera(delta)) {\n return false;\n }\n\n let target = this._targetPosition;\n if (!target) {\n return false;\n }\n this.getCamera().lookAt(target);\n return true;\n }\n\n protected _initInputListener() {\n this._inputListeners.push({\n key: INPUT_EVENT.DOWN,\n fun: (/*event: InputEvent*/) => {\n this._state = STATE.ORBIT;\n },\n });\n this._inputListeners.push({\n key: INPUT_EVENT.MOVE,\n fun: (event: InputEvent) => {\n if (this._state === STATE.ORBIT && !this._locked) {\n this._userInteraction = true;\n const shiftHeld =\n (event.event as any)?.shiftKey !== undefined &&\n (event.event as any)?.shiftKey;\n if (!shiftHeld && this._panningEnabled) {\n this.disablePanning();\n }\n this._move(\n new Vector2(event.position.x, event.position.y),\n event.type\n );\n }\n },\n });\n this._inputListeners.push({\n key: INPUT_EVENT.PAN,\n fun: (event: InputEvent) => {\n if (this._state !== STATE.ORBIT && !this._locked) {\n this._userInteraction = true;\n this._pan(\n new Vector2(event.position.x, event.position.y),\n event.type\n );\n }\n },\n });\n this._inputListeners.push({\n key: INPUT_EVENT.UP,\n fun: (event: InputEvent) => {\n if (this._state === STATE.ORBIT) {\n this.dispatchEvent(CAMERA_EVENT.ORBIT_END, event.type);\n }\n this._state = STATE.NONE;\n this._orbitPosition = null;\n this._lerpEnabled = true;\n },\n });\n this._inputListeners.push({\n key: INPUT_EVENT.ZOOM_IN,\n fun: ({ event }) => {\n if (!this._maxZoomedIn) {\n if (event) {\n event.preventDefault();\n event.stopPropagation();\n }\n this.zoomIn();\n }\n },\n });\n this._inputListeners.push({\n key: INPUT_EVENT.ZOOM_OUT,\n fun: ({ event }) => {\n if (!this._maxZoomedOut) {\n if (event) {\n event.preventDefault();\n event.stopPropagation();\n }\n this.zoomOut();\n }\n },\n });\n }\n\n private _panTargetPosition(position: Vector2) {\n const orbitDelta = position.clone().sub(this._orbitPosition);\n const element = this._domHelper.element;\n\n // get the point in the cameras coordinate system\n const cameraTargetPoint = this._targetPosition.project(this._camera);\n const panSpeed = Math.max(\n MIN_PAN_SPEED,\n (1 - this._distance / this.maxDistance) * PAN_SPEED\n );\n cameraTargetPoint.x =\n cameraTargetPoint.x - (orbitDelta.x / element.clientHeight) * panSpeed;\n cameraTargetPoint.y =\n cameraTargetPoint.y + (orbitDelta.y / element.clientHeight) * panSpeed;\n this._targetPositionIsPanned = true;\n // get the camera target point in the world coordinate system\n this._targetPosition.copy(cameraTargetPoint.unproject(this._camera));\n }\n\n private _pan(position: Vector2, type?: INPUT_EVENT_TYPE) {\n this._lerpEnabled = false;\n if (!this._orbitPosition) {\n this._orbitPosition = new Vector2(position.x, position.y);\n this.dispatchEvent(CAMERA_EVENT.ORBIT_START, type);\n }\n\n this._panTargetPosition(position);\n\n if (!position2VectorsAreEqual(this._orbitPosition, position)) {\n this.dispatchEvent(CAMERA_EVENT.ORBIT_MOVE, type);\n }\n\n this._orbitPosition.copy(position);\n this._update();\n }\n\n private _move(position: Vector2, type?: INPUT_EVENT_TYPE) {\n if (!this._orbitPosition) {\n this._orbitPosition = new Vector2(position.x, position.y);\n this.dispatchEvent(CAMERA_EVENT.ORBIT_START, type);\n }\n const orbitDelta = position.clone().sub(this._orbitPosition);\n\n const element = this._domHelper.element;\n if (this._panningEnabled) {\n this._panTargetPosition(position);\n } else {\n this._rotateHorizontal(\n ((2 * Math.PI * orbitDelta.x) / element.clientWidth) * ROTATION_SPEED\n );\n this._rotateVertical(\n ((2 * Math.PI * orbitDelta.y) / element.clientHeight) * ROTATION_SPEED\n );\n }\n\n if (!position2VectorsAreEqual(this._orbitPosition, position)) {\n this.dispatchEvent(CAMERA_EVENT.ORBIT_MOVE, type);\n }\n this._orbitPosition.copy(position);\n this._update();\n }\n\n public checkBoundsAndPlaceCamera(boundingBox: Box3, reset: boolean = true) {\n // should not zoom if box is smaller or equal, for example when bounds get smaller or user is zoomed in and moves and object\n if (\n this._boundingBox &&\n compareBox3Size(boundingBox, this._boundingBox) <= 0\n ) {\n this.setBounds(boundingBox);\n return;\n }\n this.zoomToFitBounds(boundingBox, reset);\n }\n\n public adjustToBoundsWithoutChangingDistance(boundingBox: Box3) {\n this.setBounds(boundingBox);\n const size = boundingBox.getSize(new Vector3());\n if (this._initData.debug || size.x + size.y + size.z === 0) {\n return;\n }\n const currentCameraParameter = this.getCurrentCameraParameters();\n const target = boundingBox.getCenter(new Vector3());\n this._setDistanceAndRangesBasedOnBounds(size, false);\n const endCameraParameter = {\n yaw: currentCameraParameter.yaw,\n pitch: currentCameraParameter.pitch,\n distance: this._distance,\n targetX: target.x,\n targetY: target.y,\n targetZ: target.z,\n };\n if (areCameraParametersEqual(currentCameraParameter, endCameraParameter)) {\n return;\n }\n this._tweenCameraParameter(\n currentCameraParameter,\n endCameraParameter,\n false\n );\n }\n\n public zoomToFitBounds(boundingBox: Box3, reset: boolean = true) {\n this.setBounds(boundingBox);\n const size = boundingBox.getSize(new Vector3());\n if (this._initData.debug || size.x + size.y + size.z === 0) {\n return;\n }\n const currentCameraParameter = this.getCurrentCameraParameters();\n const target = boundingBox.getCenter(new Vector3());\n const idealDistance = this._setDistanceAndRangesBasedOnBounds(size);\n this._checkZoomDistance(boundingBox, idealDistance);\n const endCameraParameter = {\n yaw: reset ? this._yaw : currentCameraParameter.yaw,\n pitch: reset ? this._pitch : currentCameraParameter.pitch,\n distance: idealDistance,\n targetX: target.x,\n targetY: target.y,\n targetZ: target.z,\n };\n if (areCameraParametersEqual(currentCameraParameter, endCameraParameter)) {\n return;\n }\n this._tweenCameraParameter(\n currentCameraParameter,\n endCameraParameter,\n false\n );\n }\n\n public updateToBounds(\n boundingBox: Box3,\n isPreview: boolean,\n changeCamera: boolean = true,\n target?: Vector3\n ) {\n this.setBounds(boundingBox);\n if (this._initData.debug) {\n return;\n }\n\n const position = boundingBox.getCenter(new Vector3());\n if (target) {\n this._targetPosition = target.clone();\n this._targetPositionIsPanned = false;\n } else if (!this._targetPositionIsPanned) {\n this._targetPosition = new Vector3(position.x, position.y, position.z);\n }\n\n const currentCameraParameter = this.getCurrentCameraParameters();\n const size = boundingBox.getSize(new Vector3());\n\n if (changeCamera) {\n const idealDistance = this._setDistanceAndRangesBasedOnBounds(size);\n this._distance = idealDistance;\n this._checkZoomDistance(boundingBox, idealDistance);\n if (!this._userInteraction) {\n this._update();\n } else {\n this._tweenCameraParameter(\n currentCameraParameter,\n {\n yaw: this._yaw,\n pitch: this._pitch,\n distance: this._distance,\n targetX: this._targetPosition.x,\n targetY: this._targetPosition.y,\n targetZ: this._targetPosition.z,\n },\n isPreview\n );\n }\n } else {\n this._setDistanceAndRangesBasedOnBounds(size, false);\n }\n\n this._update();\n }\n\n protected _checkZoomDistance(boundingBox: Box3, idealDistance: number) {\n const boundingSphere = boundingBox.getBoundingSphere(new Sphere());\n if (idealDistance - boundingSphere.radius < this._zoomDistance) {\n console.warn(\n 'the initial camera position is closer than the zoomDistance param, zoomDistance is set to initial camera position.'\n );\n this._zoomDistance = idealDistance - boundingSphere.radius;\n }\n }\n\n protected _setDistanceAndRangesBasedOnBounds(\n bounds: Vector3,\n updateDistance: boolean = true\n ): number {\n const { offsetWidth, offsetHeight } = this._getOffset();\n this._bounds.copy(bounds);\n const { cameraSpacing } = this._initData;\n bounds.addScalar(cameraSpacing / 100);\n this.minDistance = Math.sqrt(\n bounds.x * bounds.x + bounds.y * bounds.y + bounds.z * bounds.z\n );\n const maxBounds = Math.max(bounds.x, bounds.y);\n const { x, y } = this._getMargin(offsetWidth, offsetHeight);\n const idealDistance = getIdealDistance(\n bounds.x + x,\n bounds.y + y,\n bounds.z,\n this._camera.fov,\n offsetWidth,\n offsetHeight\n );\n if (this._distance < idealDistance && updateDistance) {\n this._distance = idealDistance;\n }\n this.maxDistance = idealDistance + maxBounds;\n if (this.maxDistance < MAX_DISTANCE_MINIMAL) {\n this.maxDistance = MAX_DISTANCE_MINIMAL;\n }\n this._camera.far = this.maxDistance * 5;\n this._setCameraNear();\n return idealDistance;\n }\n\n private _getIdealDistance() {\n const { offsetWidth, offsetHeight } = this._getOffset();\n const { x, y } = this._getMargin(offsetWidth, offsetHeight);\n return getIdealDistance(\n this._bounds.x + x,\n this._bounds.y + y,\n this._bounds.z,\n this._camera.fov,\n offsetWidth,\n offsetHeight\n );\n }\n\n private _getOffset() {\n const dimensions = this._domHelper.getClientDimensions();\n const windowWidth = dimensions.x;\n const windowHeight = dimensions.y;\n const offsetWidth = this._camera.offset\n ? windowWidth -\n windowWidth * this._camera.offset.left -\n windowWidth * (1 - this._camera.offset.right)\n : windowWidth;\n const offsetHeight = this._camera.offset\n ? windowHeight -\n windowHeight * this._camera.offset.bottom -\n windowHeight * (1 - this._camera.offset.top)\n : windowHeight;\n return { offsetWidth, offsetHeight };\n }\n\n // Calculates margin distances for camera positioning based on object size and screen dimensions.\n // Smaller objects get larger margins (moves camera further away), larger objects get smaller margins (camera closer relative to object).\n private _getMargin(width: number, height: number): { x: number; y: number } {\n // Determine the largest dimension of the object (x or y) in meters\n const largestDimension = Math.max(this._bounds.x, this._bounds.y);\n\n // For large objects (> LARGE_OBJECT_SIZE), no base margin\n // For smaller objects, use half of object dimensions as base margin\n let x = largestDimension > LARGE_OBJECT_SIZE ? 0 : this._bounds.x / 2;\n let y = largestDimension > LARGE_OBJECT_SIZE ? 0 : this._bounds.y / 2;\n\n // Adjust margins for screens wider than 1080px (typical mobile breakpoint)\n const breakingPoint = 1080;\n if (width > breakingPoint) {\n // Calculate additional margin based on screen width ratio\n const objectWidth =\n largestDimension > LARGE_OBJECT_SIZE ? 0 : this._bounds.x;\n\n // Add small fixed margin for very small objects\n x += largestDimension < SMALL_OBJECT_SIZE ? 0.1 : 0;\n // Scale margin proportionally with screen width\n x += objectWidth * (width / breakingPoint - 1);\n }\n\n // Similar adjustment for screen height\n if (height > breakingPoint) {\n const objectHeight =\n largestDimension > LARGE_OBJECT_SIZE ? 0 : this._bounds.y;\n\n x += largestDimension < SMALL_OBJECT_SIZE ? 0.1 : 0;\n y += objectHeight * (height / breakingPoint - 1);\n }\n\n return { x, y };\n }\n\n public reset(\n bounds: Box3,\n target?: Vector3,\n yaw?: number,\n pitch?: number,\n animate = true\n ) {\n const size = bounds.getSize(new Vector3());\n if (size) {\n if (!target) {\n const center = bounds.getCenter(new Vector3());\n this._targetPosition.copy(center);\n } else {\n this._targetPosition.copy(target);\n }\n const currentCameraParameters = this.getCurrentCameraParameters();\n\n if (!yaw) {\n yaw = this._initData.horizontalCameraAngle ?? INITIAL_YAW;\n }\n if (!pitch) {\n pitch = this._initData.verticalCameraAngle ?? INITIAL_PITCH;\n }\n yaw += toDegrees(this._objectRotation);\n\n if (this._initData.debug) {\n this._distance = this._setDistanceAndRangesBasedOnBounds(size);\n this._update(this._targetPosition);\n this._setDistanceAndRangesBasedOnBounds(size);\n return;\n }\n\n const idealDistance = this._setDistanceAndRangesBasedOnBounds(size);\n const newPitch = toRadiant(pitch);\n const newYaw = toRadiant(yaw);\n\n let targetClone = this._targetPosition.clone();\n if (animate) {\n this._tweenCameraParameter(\n currentCameraParameters,\n {\n yaw: newYaw,\n pitch: newPitch,\n distance: idealDistance,\n targetX: targetClone.x,\n targetY: targetClone.y,\n targetZ: targetClone.z,\n },\n true\n );\n } else {\n this._pitch = newPitch;\n this._yaw = newYaw;\n this._distance = idealDistance;\n this._update(this._targetPosition);\n }\n } else {\n console.warn('you cant reset without bounds!');\n }\n }\n\n public updateDistanceAndRangesBasedOnBounds(boundingBox: Box3) {\n if (!boundingBox) {\n return;\n }\n const bounds = boundingBox.getSize(new Vector3());\n const target = boundingBox.getCenter(new Vector3());\n\n this.setBounds(boundingBox);\n\n this._targetPosition.copy(target);\n this._setDistanceAndRangesBasedOnBounds(bounds, false);\n }\n\n public async updateAndReset(boundingBox: Box3, animate = true) {\n const bounds = boundingBox.getSize(new Vector3());\n const target = boundingBox.getCenter(new Vector3());\n\n this.setBounds(boundingBox);\n\n this._targetPosition.copy(target);\n if (this._distance === INITIAL_CAMERA_DISTANCE) {\n this._distance = this._setDistanceAndRangesBasedOnBounds(bounds);\n }\n\n const currentCameraParameters = this.getCurrentCameraParameters();\n\n this._camera.fov = 30;\n this._pitch = toRadiant(\n this._initData.verticalCameraAngle ?? INITIAL_PITCH\n );\n const defaultYaw = this._initData.horizontalCameraAngle ?? INITIAL_YAW;\n this._yaw = toRadiant(\n defaultYaw * (this._lookAtSide < 0 ? -1 : 1) +\n toDegrees(this._objectRotation)\n );\n this._setDistanceAndRangesBasedOnBounds(bounds);\n\n let targetClone = this._targetPosition.clone();\n if (animate) {\n await this._tweenCameraParameter(\n currentCameraParameters,\n {\n yaw: this._yaw,\n pitch: this._pitch,\n distance: this.maxDistance,\n targetX: targetClone.x,\n targetY: targetClone.y,\n targetZ: targetClone.z,\n },\n true\n );\n } else {\n this._update(this._targetPosition);\n }\n }\n\n protected _update(\n overrideTarget?: Vector3,\n ignoreChecks?: boolean,\n keepVariables?: boolean\n ) {\n if (!keepVariables) {\n this._yaw = clamp(this._yaw, this.minAzimuthAngle, this.maxAzimuthAngle);\n this._pitch = this._initData.debug\n ? clamp(this._pitch, toRadiant(-89), toRadiant(89))\n : clamp(this._pitch, this.minPolarAngle, this.maxPolarAngle);\n this._saveYawAndPitch();\n }\n\n const quaternion = new Quaternion().setFromEuler(\n new Euler(-this._pitch, this._yaw, 0, 'ZYX')\n );\n const direction = new Vector3(0, 0, -1).applyQuaternion(quaternion);\n\n if (!keepVariables) {\n this._distance *= this._scale;\n if (!this._initData.debug) {\n this._distance = Math.min(this.maxDistance, this._distance);\n }\n }\n\n if (overrideTarget) {\n this._targetPosition.copy(overrideTarget);\n }\n\n const position = this._targetPosition\n .clone()\n .sub(direction.multiplyScalar(this._distance));\n if (this._initData.debug) {\n this._cameraPosition.copy(position);\n this._zoomChanged(false, false);\n } else if (ignoreChecks) {\n this._cameraPosition.copy(position);\n } else {\n const cameraSphere = this._getCameraSphere(position);\n if (\n this._boundingBox != null &&\n this._boundingBox.intersectsSphere(cameraSphere) &&\n this._scale >= 1\n ) {\n //increase distance by sphere radius until it no longer collides\n this._distance += 0.1;\n } else if (\n this._boundingBox != null &&\n !this._boundingBox.intersectsSphere(cameraSphere)\n ) {\n //just set the new camera position, actual position of camera is calculated in scene helper\n this._cameraPosition.copy(position);\n //no min no max\n this._zoomChanged(this._distance === this.maxDistance, false);\n } else {\n //maxZoom = true\n this._zoomChanged(false, true);\n }\n }\n\n this._scale = 1;\n }\n\n private _zoomChanged(minZoom: boolean, maxZoom: boolean) {\n let hash = minZoom + '' + maxZoom;\n if (this._currentZoomHash?.length === 0 || this._currentZoomHash !== hash) {\n this.dispatchEvent(\n CAMERA_EVENT.ZOOM_CHANGE,\n new ZoomChangeEvent(minZoom, maxZoom)\n );\n this._currentZoomHash = hash;\n } else if (!minZoom && !maxZoom) {\n this.dispatchEvent(\n CAMERA_EVENT.ZOOM_CHANGE,\n new ZoomChangeEvent(minZoom, maxZoom)\n );\n }\n this._maxZoomedIn = maxZoom;\n this._maxZoomedOut = minZoom;\n }\n\n public zoomTo(cameraParameters: CameraParameter): Promise<void> {\n return this._tweenCameraParameter(\n this.getCurrentCameraParameters(),\n cameraParameters,\n true\n );\n }\n\n private _getCameraSphere(position: Vector3): Sphere {\n const maxBounds = Math.max(this._bounds.x, this._bounds.y);\n // set max zoom distance based on object size (factor 10)\n const radius = Math.max(maxBounds / 10, this._zoomDistance);\n return new Sphere(position, radius);\n }\n\n public zoomIn(value?: number) {\n this._lerpEnabled = true;\n this._scale *= value ? Math.pow(0.95, value) : this._zoomSpeed;\n this._setCameraNear();\n this._update();\n this.dispatchEvent(CAMERA_EVENT.ZOOM_IN);\n }\n\n public zoomOut(value?: number) {\n this._lerpEnabled = true;\n this._scale /= value ? Math.pow(0.95, value) : this._zoomSpeed;\n this._setCameraNear();\n this._update();\n this.dispatchEvent(CAMERA_EVENT.ZOOM_OUT);\n }\n\n public clear() {\n this._userInteraction = false;\n if (!this._initData.debug) {\n this._distance = INITIAL_CAMERA_DISTANCE;\n this._targetPosition = new Vector3(0, 0, 0);\n this._targetPositionIsPanned = false;\n }\n }\n\n /**\n * Move camera based on provided camera parameters\n * - Uses center when target is not set\n * - Uses ideal distance when no distance is provided\n * - For other properties it used current camera parameters if not provided\n * @param cameraParameter\n */\n public async moveCamera(cameraParameter: CameraParameter): Promise<void> {\n const { x, y, z } = this._boundingBox.getCenter(new Vector3());\n cameraParameter.targetX = cameraParameter.targetX || x;\n cameraParameter.targetY = cameraParameter.targetY || y;\n cameraParameter.targetZ = cameraParameter.targetZ || z;\n cameraParameter.distance =\n cameraParameter.distance || this._getIdealDistance();\n const currentCameraParams = this.getCurrentCameraParameters();\n const newCameraParams = deepMerge(\n JSON.parse(JSON.stringify(currentCameraParams)),\n cameraParameter\n );\n return this._tweenCameraParameter(\n currentCameraParams,\n newCameraParams,\n true\n );\n }\n\n public enablePanning() {\n this._lerpEnabled = false;\n this._panningEnabled = true;\n }\n\n public disablePanning() {\n this._lerpEnabled = false;\n this._panningEnabled = false;\n }\n\n public getKernelZoomFactor(): number {\n const minDistance = 2;\n const maxDistance = this.maxDistance;\n // get percentage of how far we are zoomed in 1 is max zoomed in\n const percent = 1 - this._distance / (maxDistance - minDistance);\n // transform to a scale of max zoom 1.2 and min zoom 0.2\n const zoomFactor = percent + 0.2;\n return zoomFactor;\n }\n}\n","import type { Object3D } from 'three';\nimport { Matrix4 } from 'three';\nimport type { KernelMeshAnimation } from '../../../../typings/kernel';\nimport type {\n AnimationTransition,\n RoomleComponent,\n} from '../../../../common-core/src/webgl/roomle-component-factory';\nimport { convertToThreeMatrix } from '../../../../common-core/src/utils/kernel-utils';\nimport {\n animateObjectMatrix,\n setObjectMatrix,\n} from '../../../../common-core/src/utils/threejs-utils';\n\nexport interface AnimationTransformation {\n matrix: Matrix4;\n visible: boolean;\n initial: boolean;\n}\n\nexport type AnimationTransformationMap = Map<string, AnimationTransformation>;\n\nexport class ObjectAnimations {\n private animationMap: AnimationTransformationMap = new Map();\n\n public static setObjectAnimations(\n object3d: Object3D,\n animations?: Record<string, KernelMeshAnimation>,\n component?: RoomleComponent\n ) {\n if (!animations || Object.keys(animations).length === 0) {\n object3d.userData.objectAnimations = undefined;\n return;\n }\n object3d.userData.objectAnimations = new ObjectAnimations();\n const animationMap: AnimationTransformationMap = new Map();\n for (const animationName in animations) {\n animationMap.set(animationName, {\n matrix: convertToThreeMatrix(animations[animationName].matrix),\n visible: animations[animationName].visibility,\n initial: animations[animationName].initial,\n });\n }\n this.addObjectAnimations(object3d, animationMap, component);\n }\n\n public static addObjectAnimations(\n object3d: Object3D,\n animations?: AnimationTransformationMap,\n component?: RoomleComponent\n ) {\n if (!animations || animations.size === 0) {\n return;\n }\n object3d.userData.objectAnimations ??= new ObjectAnimations();\n const objectAnimations = object3d.userData\n .objectAnimations as ObjectAnimations;\n animations.forEach((animation, animationName) => {\n objectAnimations.animationMap.set(animationName, animation);\n if (component?.animationValueMap?.hasKeyAndValue(animationName)) {\n if (object3d.userData.transform) {\n const finalMatrix = object3d.userData.transform\n .clone()\n .multiply(animation.matrix);\n setObjectMatrix(object3d, finalMatrix);\n }\n object3d.visible = animation.visible;\n }\n });\n }\n\n public static removeObjectAnimations(\n object3d: Object3D,\n animationName: string\n ) {\n if (!object3d.userData?.objectAnimations) {\n return;\n }\n const objectAnimations = object3d.userData\n .objectAnimations as ObjectAnimations;\n objectAnimations.animationMap.delete(animationName);\n if (objectAnimations.animationMap.size === 0) {\n object3d.userData.objectAnimations = undefined;\n }\n }\n\n public static animateObject(\n object3d: Object3D,\n animationName: string,\n animationTransition: AnimationTransition,\n animate: boolean = true,\n onProgressUpdate?: () => void\n ) {\n if (object3d.userData.objectAnimations instanceof ObjectAnimations) {\n return object3d.userData.objectAnimations._animate(\n object3d,\n animationName,\n animationTransition,\n animate,\n onProgressUpdate\n );\n }\n return null;\n }\n\n private _animate(\n object3d: Object3D,\n animationName: string,\n animationTransition: AnimationTransition,\n animate: boolean = true,\n onProgressUpdate?: () => void\n ) {\n let priorTransformation: Matrix4 = new Matrix4();\n let animationFrom = this.animationMap.get(\n `${animationName}:${animationTransition.from}`\n );\n let animationTo = this.animationMap.get(\n `${animationName}:${animationTransition.to}`\n );\n if (\n animationTransition.priorAnimations.length > 0 ||\n animationTransition.subsequentAnimations.length > 0\n ) {\n priorTransformation = this._calculateCombinedAnimationMatrix(\n animationTransition.priorAnimations\n );\n const subsequentTransformation = this._calculateCombinedAnimationMatrix(\n animationTransition.subsequentAnimations\n );\n animationFrom = this._calculateAnimationTransformation(\n animationFrom,\n subsequentTransformation\n );\n animationTo = this._calculateAnimationTransformation(\n animationTo,\n subsequentTransformation\n );\n }\n return this._animateMesh(\n object3d,\n priorTransformation,\n animationFrom,\n animationTo,\n animate,\n onProgressUpdate\n );\n }\n private _calculateCombinedAnimationMatrix(animations: string[]): Matrix4 {\n const combinedMatrix = new Matrix4();\n animations.forEach((animation) => {\n const animationData = this.animationMap.get(animation);\n if (animationData?.matrix) {\n combinedMatrix.multiply(animationData.matrix);\n }\n });\n return combinedMatrix;\n }\n\n private _calculateAnimationTransformation(\n animation: NonNullable<{ matrix: Matrix4; visible: boolean }>,\n subsequentTransformation: Matrix4\n ): NonNullable<{ matrix: Matrix4; visible: boolean; initial: boolean }> {\n const matrix = subsequentTransformation.clone();\n if (animation?.matrix) {\n matrix.multiply(animation.matrix);\n }\n return { matrix, visible: animation?.visible ?? true, initial: false };\n }\n\n private _animateMesh(\n object3d: Object3D,\n priorMatrix: Matrix4,\n from: NonNullable<{ matrix: Matrix4; visible: boolean }>,\n to: NonNullable<{ matrix: Matrix4; visible: boolean }>,\n animate: boolean = true,\n onProgressUpdate?: () => void\n ) {\n if (!object3d.userData || (!from && !to)) {\n return null;\n }\n object3d.userData.transform ??= object3d.matrix.clone();\n const subsequentTransform = object3d.userData.transform.clone();\n const toMatrix = to?.matrix.clone() ?? new Matrix4();\n if (animate) {\n const fromMatrix = from?.matrix.clone() ?? new Matrix4();\n return animateObjectMatrix(\n object3d,\n priorMatrix,\n fromMatrix,\n toMatrix,\n subsequentTransform,\n onProgressUpdate\n );\n }\n setObjectMatrix(\n object3d,\n subsequentTransform.clone().multiply(toMatrix).multiply(priorMatrix)\n );\n if (to?.visible !== undefined) {\n object3d.visible = to.visible;\n }\n if (onProgressUpdate) {\n onProgressUpdate();\n }\n return null;\n }\n}\n","import { LAYER } from './layer';\nimport { CURSOR_STYLE, setCursor } from '../utils/common-utils';\nimport type {\n RoomleEventedMesh,\n RoomleEventedObject3D,\n} from '../utils/threejs-utils';\nimport {\n disposeMesh,\n DOCK_PREVIEW_MATERIAL_METALNESS,\n DOCK_PREVIEW_MATERIAL_OPACITY,\n DOCK_PREVIEW_MATERIAL_OPACITY_HOVERED,\n DOCK_PREVIEW_MATERIAL_ROUGHNESS,\n kernelBoxToThreeBox,\n PREVIEW_LINE_MATERIAL_OPACITY,\n PREVIEW_MATERIAL_COLOR,\n PREVIEW_MATERIAL_OPACITY,\n} from '../utils/threejs-utils';\nimport type { CanvasOffset } from '../common-interfaces';\nimport type { KernelCube, KernelVector3 } from '../../../typings/kernel';\nimport {\n convertToKernel,\n convertToTHREE,\n convertToThreeMatrix,\n} from '../utils/kernel-utils';\nimport type InitData from '../utils/init-data';\nimport inject from '../di/inject';\nimport type { Context } from '../di/context';\nimport type { BufferAttribute, Euler, Material } from 'three';\nimport {\n Box3,\n BoxGeometry,\n BufferGeometry,\n Color,\n CylinderGeometry,\n EdgesGeometry,\n Line3,\n LineDashedMaterial,\n LineSegments,\n Matrix4,\n Mesh,\n MeshStandardMaterial,\n Object3D,\n OrthographicCamera,\n PerspectiveCamera,\n Quaternion,\n Vector2,\n Vector3,\n} from 'three';\nimport * as BufferGeometryUtils from 'three/examples/jsm/utils/BufferGeometryUtils.js';\nimport MaterialCreator from '../utils/material-creator';\nimport type { AnimationValueMap } from '../../../configurator-core/src/utils/animation/animation-value-map';\nimport { ObjectAnimations } from '../../../configurator-core/src/utils/animation/object-animations';\nimport type { RoomleLightSource } from '../light/light-source';\nimport type { DragInsertAnimation } from '../../../configurator-core/src/utils/animation/drag-insert-animation';\nimport {Tween, Easing} from '@tweenjs/tween.js'\n\nconst DEBUG_PREVIEW_LINE = false;\nconst DEBUG_BOUNDING_BOX = false;\n\nexport const PULSE_DURATION = 1500;\nexport const PULSE_LOOPS = 5;\n\nexport interface RoomleComponent extends RoomleEventedObject3D {\n runtimeId: number;\n parentObjectId: number;\n isRootComponent: boolean;\n isChildPlanObject: boolean;\n meshes: RoomleEventedMesh[];\n boundingBox: Box3;\n boundingBoxMesh: RoomleEventedMesh;\n loadingMesh: Mesh;\n roomlePosition: KernelVector3;\n roomleRotation: KernelVector3;\n hash: string;\n geometryChanged: boolean;\n animationValueMap?: AnimationValueMap;\n\n replaceMeshes(meshes: Mesh[]): void;\n\n addMesh(mesh: Mesh, transform?: Float32Array): void;\n\n removeMesh(mesh: Mesh): void;\n\n removeMeshById(meshId: number): void;\n\n getLightSourceById(lightSourceId: number): RoomleLightSource | null;\n\n removeLightSourceById(lightSourceId: number): void;\n\n addLightSource(lightSource: RoomleLightSource): void;\n\n getAllLightSources(): Map<number, RoomleLightSource>\n\n getMeshById(meshId: number): Mesh;\n\n removeAllMeshes(): void;\n\n select(): void;\n\n deselect(): void;\n\n hoverOn(): void;\n\n hoverOff(): void;\n\n loading(): void;\n\n loadingFinished(): void;\n\n computeBoundingBox(\n boxForMeasurements?: KernelCube,\n useMeshes?: boolean\n ): void;\n\n recursiveMeshes(): Mesh[];\n\n isChild(componentId: number): boolean;\n\n getKernelPosition(newParent: RoomleComponent): KernelVector3;\n\n animateMeshes(\n animationName: string,\n animationTransition: AnimationTransition,\n animate: boolean,\n onProgressUpdate?: () => void\n ): void;\n}\n\nexport interface StaticComponent extends RoomleComponent {\n glbUrl: string;\n}\n\nexport interface PreviewComponent extends RoomleComponent {\n parentId: number;\n parentDockId: number;\n childId: number;\n childDockId: number;\n stringId: string;\n receivedPointAssociation: boolean;\n dockInsertAnimation?: DragInsertAnimation;\n\n clonePreview(numberOfDuplication: number): PreviewComponent;\n\n preparePreview(): void;\n\n startPulsating(): void;\n}\n\nexport interface PreviewLineSegment {\n from: number;\n to: number;\n}\n\nexport interface PreviewLineComponent extends PreviewComponent {\n lineFrom: Vector3;\n lineTo: Vector3;\n lineSegments: PreviewLineSegment[];\n positionFrom: Vector3;\n positionTo: Vector3;\n\n roomleLineFrom: KernelVector3;\n roomleLineTo: KernelVector3;\n roomlePositionFrom: KernelVector3;\n roomlePositionTo: KernelVector3;\n docklineRotation: Euler;\n\n lineMesh: Mesh;\n boundingLineMesh: RoomleEventedMesh;\n\n clonePreviewLine(numberOfDuplication: number): PreviewLineComponent;\n\n getPositionForIntersectionPoint(intersectionPoint: Vector3): Vector3;\n\n updatePreviewPosition(intersectionPoint: Vector3): void;\n\n hideSelectionLine(): void;\n}\n\nexport interface OffsetCamera {\n offset: CanvasOffset;\n\n resetOffset(): void;\n}\n\nexport interface OrthographicOffsetCamera\n extends OrthographicCamera,\n OffsetCamera {}\n\nexport interface PerspectiveOffsetCamera\n extends PerspectiveCamera,\n OffsetCamera {}\n\nexport interface RoomleComponentFactory {\n create(\n id: number,\n position: KernelVector3,\n eulerAngles: KernelVector3,\n parentObjectId: number,\n isRootComponent: boolean\n ): RoomleComponent;\n\n createStatic(id: number, url: string): StaticComponent;\n\n createPreview(\n id: number,\n parentObjectId: number,\n creator: string\n ): PreviewComponent;\n\n createPreviewLine(\n previewComponent: PreviewComponent,\n creator: string\n ): PreviewLineComponent;\n\n isPreview(obj: RoomleComponent): boolean;\n\n isPreviewLine(obj: RoomleComponent): boolean;\n\n createOrthographicCamera(\n left: number,\n right: number,\n top: number,\n bottom: number,\n near?: number,\n far?: number,\n offset?: CanvasOffset\n ): OrthographicOffsetCamera;\n\n createPerspectiveCamera(\n fov: number,\n aspect: number,\n near: number,\n far: number,\n offset?: CanvasOffset\n ): PerspectiveOffsetCamera;\n}\n\nconst enum MeshType {\n ROOMLE_MESH,\n}\n\nexport interface AnimationTransition {\n from: string;\n to: string;\n priorAnimations: string[];\n subsequentAnimations: string[];\n}\n\nexport default function () {\n class HRoomleComponent extends Object3D {\n private _selected: boolean = false;\n\n protected _roomlePosition: KernelVector3;\n protected _roomleRotation: KernelVector3;\n\n protected _boundingBox: Box3;\n protected _boundingBoxMesh: RoomleEventedMesh;\n protected _dockline: LineSegments;\n\n public runtimeId: number;\n public parentObjectId: number;\n public isRootComponent: boolean;\n public isChildPlanObject: boolean = false;\n public hash: string;\n public geometryChanged: boolean = true;\n public meshes: RoomleEventedMesh[] = [];\n private _lightSources: Map<number, RoomleLightSource> = new Map();\n private _kernelBoundingBox: Box3;\n private _loadingMesh: Mesh;\n\n private static _generateOutline(\n geometryCube: BufferGeometry,\n translateBy: Vector3\n ): LineSegments {\n const line = new LineSegments(\n new EdgesGeometry(geometryCube),\n new LineDashedMaterial({\n color: '#000000',\n dashSize: 0.03,\n gapSize: 0.01,\n linewidth: 1,\n })\n );\n line.translateOnAxis(translateBy, 1);\n line.userData.ignoreComponentRaycast = true;\n return line;\n }\n\n public static cloneDockLine(\n line: LineSegments,\n boundingBox: Box3\n ): LineSegments {\n const clone = new LineSegments(line.geometry, line.material);\n clone.translateOnAxis(boundingBox.getCenter(new Vector3()), 1);\n clone.name = 'dockline';\n clone.layers.set(LAYER.PREVIEW);\n clone.userData.ignoreComponentRaycast = true;\n return clone;\n }\n\n protected _setValues(\n id: number,\n position: KernelVector3,\n eulerAngles: KernelVector3,\n parentObjectId: number,\n isRootComponent: boolean\n ) {\n if (id) {\n this.runtimeId = id;\n this.name = id.toString();\n }\n if (position) {\n this.roomlePosition = Object.assign({}, position);\n }\n if (eulerAngles) {\n this.roomleRotation = Object.assign({}, eulerAngles);\n }\n if (parentObjectId) {\n this.parentObjectId = parentObjectId;\n }\n if (isRootComponent) {\n this.isRootComponent = isRootComponent;\n }\n }\n\n constructor(\n id: number,\n position: KernelVector3,\n roomleRotation: KernelVector3,\n parentObjectId: number,\n isRootComponent: boolean\n ) {\n super();\n this.castShadow = false;\n this.receiveShadow = true;\n this._setValues(\n id,\n position,\n roomleRotation,\n parentObjectId,\n isRootComponent\n );\n }\n\n get loadingMesh(): Mesh {\n return this._loadingMesh;\n }\n\n get boundingBoxMesh(): RoomleEventedMesh {\n return this._boundingBoxMesh;\n }\n\n get boundingBox(): Box3 {\n return this._boundingBox;\n }\n\n set roomlePosition(position: KernelVector3) {\n this._roomlePosition = position;\n if (position) {\n this.position.set(\n position.x / 1000,\n position.z / 1000,\n position.y / -1000\n );\n }\n }\n\n get roomlePosition(): KernelVector3 {\n return this._roomlePosition;\n }\n\n set roomleRotation(rotation: KernelVector3) {\n this._roomleRotation = rotation;\n if (rotation) {\n this.rotation.set(rotation.x, rotation.z, -rotation.y);\n }\n }\n\n get roomleRotation(): KernelVector3 {\n return this._roomleRotation;\n }\n\n public replaceMeshes(meshes: Mesh[]) {\n // for (let i = this.meshes.length - 1; i >= 0; i--) {\n // this.removeMesh(this.meshes[i]);\n // }\n this.removeAllMeshes();\n meshes.forEach((mesh) => {\n this.addMesh(new Mesh(mesh.geometry, mesh.material));\n });\n }\n\n public addMesh(mesh: RoomleEventedMesh, transform?: Float32Array) {\n mesh.renderOrder = 2;\n mesh.userData.meshType = MeshType.ROOMLE_MESH;\n\n if (transform) {\n mesh.applyMatrix4(convertToThreeMatrix(transform));\n }\n\n this.add(mesh);\n this.meshes.push(mesh);\n }\n\n public getMeshById(meshId: number): RoomleEventedMesh {\n return this.meshes.find((m) => m.userData.meshId === meshId);\n }\n\n public removeMeshById(meshId: number) {\n const mesh = this.getMeshById(meshId);\n if (!mesh) {\n console.warn(\n 'Could not remove mesh with id ' + meshId,\n this.runtimeId,\n this.meshes\n );\n return;\n }\n this.removeMesh(mesh);\n }\n\n public removeMesh(mesh: RoomleEventedMesh) {\n const index = this.meshes.indexOf(mesh);\n this.remove(mesh);\n disposeMesh(mesh);\n if (index < 0) {\n return;\n }\n this.meshes.splice(index, 1);\n }\n\n public removeAllMeshes(dispose: boolean = true) {\n this.removeAllLightSources();\n this.meshes.forEach((mesh) => {\n this.remove(mesh);\n if (dispose) {\n disposeMesh(mesh);\n }\n });\n this.meshes = [];\n this._removeLoadingMesh();\n this.remove(this._boundingBoxMesh);\n disposeMesh(this._boundingBoxMesh);\n this._boundingBoxMesh = null;\n }\n\n public getLightSourceById(lightSourceId: number): RoomleLightSource | null {\n return this._lightSources.get(lightSourceId);\n }\n\n public removeLightSourceById(lightSourceId: number): void {\n const lightSource = this._lightSources.get(lightSourceId);\n if (lightSource) {\n lightSource.removeFromScene();\n this._lightSources.delete(lightSourceId);\n }\n }\n\n public removeAllLightSources(): void {\n this._lightSources.forEach((lightSource) => {\n lightSource.removeFromScene();\n });\n this._lightSources.clear();\n }\n\n public addLightSource(lightSource: RoomleLightSource): void {\n if (!this._lightSources.has(lightSource.lightSourceId)) {\n this._lightSources.set(lightSource.lightSourceId, lightSource);\n lightSource.addToScene(this);\n }\n }\n\n public getAllLightSources(): Map<number, RoomleLightSource> {\n return this._lightSources;\n }\n\n private _hideAllMeshes() {\n this.meshes.forEach((mesh) => (mesh.visible = false));\n }\n\n private _showAllMeshes() {\n this.meshes.forEach((mesh) => (mesh.visible = true));\n }\n\n public select() {\n this._selected = true;\n }\n\n public loading() {\n if (!this._kernelBoundingBox) {\n console.warn(\n 'Bounding box (box for measurements) for component ' +\n this.runtimeId +\n ' not set, can not show external mesh loading box!'\n );\n return;\n }\n this._removeLoadingMesh();\n this._hideAllMeshes();\n const { x, y, z } = this._kernelBoundingBox.getSize(new Vector3());\n const geometry = new BoxGeometry(x, y, z);\n this._loadingMesh = new Mesh(\n geometry,\n MaterialCreator.createMeshStandardMaterial({\n transparent: true,\n opacity: PREVIEW_MATERIAL_OPACITY,\n color: new Color(PREVIEW_MATERIAL_COLOR),\n })\n );\n\n this._loadingMesh.name = 'loading mesh';\n this._loadingMesh.receiveShadow = false;\n this._loadingMesh.castShadow = false;\n this._loadingMesh.layers.set(LAYER.PREVIEW);\n this._loadingMesh.translateOnAxis(\n this._kernelBoundingBox.getCenter(new Vector3()),\n 1\n );\n this._loadingMesh.renderOrder = 3;\n\n this.add(this._loadingMesh);\n }\n\n private _removeLoadingMesh() {\n if (this._loadingMesh) {\n this.remove(this._loadingMesh);\n disposeMesh(this._loadingMesh);\n this._loadingMesh = null;\n }\n }\n\n public loadingFinished() {\n this._removeLoadingMesh();\n this._showAllMeshes();\n }\n\n public deselect() {\n this._selected = false;\n }\n\n public hoverOn() {\n setCursor(CURSOR_STYLE.HOVER);\n }\n\n public hoverOff() {\n setCursor(CURSOR_STYLE.DEFAULT);\n }\n\n public computeBoundingBox(\n boxForMeasurements?: KernelCube,\n useMeshes: boolean = false\n ) {\n if (this._boundingBoxMesh) {\n this.remove(this._boundingBoxMesh);\n }\n\n if (\n !useMeshes &&\n boxForMeasurements &&\n boxForMeasurements.size.x === 0 &&\n boxForMeasurements.size.y === 0 &&\n boxForMeasurements.size.z === 0\n ) {\n return;\n }\n\n let geometry;\n if (!boxForMeasurements || useMeshes) {\n this._boundingBox = new Box3();\n const v1 = new Vector3();\n this.meshes.forEach((mesh) => {\n if (mesh.geometry instanceof BufferGeometry) {\n const attribute = mesh.geometry.attributes\n .position as BufferAttribute;\n\n if (attribute !== undefined) {\n for (let i = 0, l = attribute.count; i < l; i++) {\n v1.fromBufferAttribute(attribute, i).applyMatrix4(mesh.matrix);\n\n this._boundingBox.expandByPoint(v1);\n }\n }\n }\n });\n\n this._kernelBoundingBox = this._boundingBox.clone();\n\n const width: number = this._boundingBox.max.x - this._boundingBox.min.x;\n const height: number = this._boundingBox.max.y - this._boundingBox.min.y;\n const depth: number = this._boundingBox.max.z - this._boundingBox.min.z;\n\n geometry = new BoxGeometry(width, height, depth);\n } else {\n this._kernelBoundingBox = kernelBoxToThreeBox(boxForMeasurements);\n this._boundingBox = this._kernelBoundingBox.clone();\n\n const { x, y, z } = this._boundingBox.getSize(new Vector3());\n geometry = new BoxGeometry(x, y, z);\n }\n\n this._boundingBoxMesh = new Mesh(\n geometry,\n MaterialCreator.createMeshStandardMaterial({\n color: DEBUG_BOUNDING_BOX ? '#FF0000' : '#FFFFFF',\n transparent: true,\n opacity: DEBUG_BOUNDING_BOX ? 0.5 : 0.0,\n polygonOffset: true,\n polygonOffsetFactor: -1,\n visible: DEBUG_BOUNDING_BOX,\n })\n );\n this._boundingBoxMesh.name = 'bounding box mesh';\n // this.boundingBoxMesh.userData.ignoreComponentRaycast = true;\n\n const center = this._boundingBox.getCenter(new Vector3());\n this._boundingBoxMesh.position.add(center);\n this._boundingBoxMesh.layers.set(LAYER.PREVIEW);\n this._boundingBoxMesh.renderOrder = 3;\n this._boundingBoxMesh.castShadow = false;\n this._boundingBoxMesh.receiveShadow = false;\n this.add(this._boundingBoxMesh);\n\n this._dockline = HRoomleComponent._generateOutline(geometry, center);\n this._dockline.name = 'bounding box outline';\n this._dockline.layers.set(LAYER.PREVIEW);\n\n if (this._selected) {\n this.add(this._dockline);\n }\n }\n\n public recursiveMeshes(): RoomleEventedMesh[] {\n const recursiveMeshes = this.meshes.slice();\n this.children.forEach((children) => {\n if (children instanceof HRoomleComponent) {\n recursiveMeshes.push(...children.recursiveMeshes());\n }\n });\n return recursiveMeshes;\n }\n\n public isChild(componentId: number): boolean {\n let isChild = false;\n this.children.forEach((children) => {\n if (children instanceof HRoomleComponent && !isChild) {\n if (children.runtimeId === componentId) {\n isChild = true;\n } else {\n isChild = children.isChild(componentId);\n }\n }\n });\n return isChild;\n }\n\n public getKernelPosition(newParent: RoomleComponent): KernelVector3 {\n const posInGlobal = this.parent.localToWorld(this.position);\n return convertToKernel(newParent.worldToLocal(posInGlobal));\n }\n\n public animateMeshes(\n animationName: string,\n animationTransition: AnimationTransition,\n animate: boolean = true,\n onProgressUpdate?: () => void\n ): void {\n this.meshes.forEach((mesh) =>\n ObjectAnimations.animateObject(\n mesh,\n animationName,\n animationTransition,\n animate,\n onProgressUpdate\n )\n );\n }\n }\n\n class HStaticComponent extends HRoomleComponent {\n public glbUrl: string;\n\n constructor(id: number, glbUrl: string) {\n super(id, null, null, null, false);\n this.glbUrl = glbUrl;\n }\n }\n\n class HPreviewComponent extends HRoomleComponent implements Context {\n @inject\n private _initData: InitData;\n\n protected _stringId: string = null;\n\n public receivedPointAssociation = false;\n\n public _creator_: string;\n public parentId: number;\n public parentDockId: number;\n public childId: number;\n public childDockId: number;\n\n constructor(\n creator: string,\n id: number,\n position: KernelVector3,\n eulerAngles: KernelVector3,\n parentObjectId: number,\n isRootComponent: boolean\n ) {\n super(id, position, eulerAngles, parentObjectId, isRootComponent);\n this.castShadow = false;\n this.receiveShadow = false;\n this._creator_ = creator;\n }\n\n get stringId(): string {\n if (this._stringId) {\n return this._stringId;\n }\n return this.runtimeId.toString();\n }\n\n public addMesh(mesh: RoomleEventedMesh, transform?: Float32Array) {\n super.addMesh(mesh, transform);\n\n if (mesh.material instanceof MeshStandardMaterial) {\n mesh.material.opacity = DOCK_PREVIEW_MATERIAL_OPACITY;\n mesh.material.roughness = DOCK_PREVIEW_MATERIAL_ROUGHNESS;\n mesh.material.metalness = DOCK_PREVIEW_MATERIAL_METALNESS;\n mesh.material.color = new Color(\n this._initData.colors.PREVIEW_DOCKING_COLOR\n );\n }\n mesh.renderOrder = 1;\n mesh.castShadow = false;\n mesh.receiveShadow = false;\n }\n\n public startPulsating() {\n if (this._initData?.featureFlags?.pulsePreview) {\n for (const mesh of this.meshes) {\n const start = { opacity: DOCK_PREVIEW_MATERIAL_OPACITY };\n const end = { opacity: 0.3 };\n const tween = new Tween(start)\n .to(end, PULSE_DURATION)\n .easing(Easing.Sinusoidal.In)\n .onUpdate(() => {\n (mesh.material as Material).opacity = start.opacity;\n })\n .onStop(() => {\n window.TWEEN?.remove(tween);\n })\n .yoyo(true)\n .repeat(PULSE_LOOPS)\n .start();\n window.TWEEN?.add(tween);\n }\n }\n }\n\n public hoverOn() {\n this.remove(this._dockline);\n this.meshes.forEach(({ material }) => {\n (material as MeshStandardMaterial).opacity =\n DOCK_PREVIEW_MATERIAL_OPACITY_HOVERED;\n (material as MeshStandardMaterial).roughness =\n DOCK_PREVIEW_MATERIAL_ROUGHNESS;\n (material as MeshStandardMaterial).metalness =\n DOCK_PREVIEW_MATERIAL_METALNESS;\n (material as MeshStandardMaterial).color = new Color(\n this._initData.colors.PREVIEW_DOCKING_COLOR\n );\n });\n setCursor(CURSOR_STYLE.HOVER);\n }\n\n public hoverOff() {\n this.add(this._dockline);\n this.meshes.forEach(({ material }) => {\n (material as MeshStandardMaterial).opacity =\n DOCK_PREVIEW_MATERIAL_OPACITY;\n (material as MeshStandardMaterial).roughness =\n DOCK_PREVIEW_MATERIAL_ROUGHNESS;\n (material as MeshStandardMaterial).metalness =\n DOCK_PREVIEW_MATERIAL_METALNESS;\n (material as MeshStandardMaterial).color = new Color(\n this._initData.colors.PREVIEW_DOCKING_COLOR\n );\n });\n setCursor(CURSOR_STYLE.DEFAULT);\n }\n\n public clonePreview(numberOfDuplication: number): HPreviewComponent {\n const clone = new HPreviewComponent(\n this._creator_,\n this.runtimeId,\n this.roomlePosition,\n this.roomleRotation,\n this.parentObjectId,\n this.isRootComponent\n );\n clone._stringId = this.runtimeId + '_' + numberOfDuplication;\n this.children.forEach((child) => {\n if (\n child instanceof Mesh &&\n child.userData.meshType === MeshType.ROOMLE_MESH\n ) {\n clone.meshes.push(child.clone(true));\n }\n });\n clone.meshes.forEach((mesh) => {\n mesh.material = (mesh.material as MeshStandardMaterial).clone();\n mesh.geometry = mesh.geometry.clone();\n clone.add(mesh);\n });\n if (this._dockline) {\n // cannot use clone due to an issue: https://github.com/mrdoob/three.js/issues/15239\n // clone._dockline = this._dockline.clone(true);\n clone._dockline = HRoomleComponent.cloneDockLine(\n this._dockline,\n this._boundingBox\n );\n }\n if (this._boundingBoxMesh) {\n clone._boundingBoxMesh = this._boundingBoxMesh.clone(true);\n }\n if (this._boundingBox) {\n clone._boundingBox = this._boundingBox.clone();\n }\n return clone;\n }\n\n public preparePreview() {\n this.add(this._dockline);\n this.add(this._boundingBoxMesh);\n }\n }\n\n class HPreviewLineComponent extends HPreviewComponent {\n private _roomleLineFrom: KernelVector3;\n private _roomleLineTo: KernelVector3;\n private _roomlePositionFrom: KernelVector3;\n private _roomlePositionTo: KernelVector3;\n\n private _newPosition: Vector3;\n\n public lineMesh: Mesh;\n public boundingLineMesh: RoomleEventedMesh;\n public docklineRotation: Euler;\n public lineFrom: Vector3;\n public lineTo: Vector3;\n public lineSegments: PreviewLineSegment[] = [];\n public positionFrom: Vector3;\n public positionTo: Vector3;\n\n constructor(\n creator: string,\n id: number,\n position: KernelVector3,\n eulerAngles: KernelVector3,\n parentObjectId: number,\n receivedPointAssociation: boolean\n ) {\n super(creator, id, position, eulerAngles, parentObjectId, false);\n if (receivedPointAssociation) {\n this._stringId = this.runtimeId + '_has_additional_dock_point_copy';\n }\n }\n\n set roomleLineFrom(lineFrom: KernelVector3) {\n this._roomleLineFrom = lineFrom;\n this.lineFrom = convertToTHREE(lineFrom);\n }\n\n get roomleLineFrom(): KernelVector3 {\n return this._roomleLineFrom;\n }\n\n set roomleLineTo(lineTo: KernelVector3) {\n this._roomleLineTo = lineTo;\n const vector = convertToTHREE(lineTo);\n if (vector.equals(this.lineFrom)) {\n console.warn('lineFrom and lineTo are equal!');\n vector.add(new Vector3(0, 0.01, 0));\n }\n this.lineTo = vector;\n }\n\n get roomleLineTo(): KernelVector3 {\n return this._roomleLineTo;\n }\n\n set roomlePositionFrom(positionFrom: KernelVector3) {\n this._roomlePositionFrom = positionFrom;\n this.positionFrom = convertToTHREE(positionFrom);\n }\n\n get roomlePositionFrom(): KernelVector3 {\n return this._roomlePositionFrom;\n }\n\n set roomlePositionTo(positionTo: KernelVector3) {\n this._roomlePositionTo = positionTo;\n const vector = convertToTHREE(positionTo);\n if (vector.equals(this.positionFrom)) {\n console.warn('positionFrom and positionTo are equal!');\n vector.add(new Vector3(0, 0.01, 0));\n }\n this.positionTo = vector;\n }\n\n get roomlePositionTo(): KernelVector3 {\n return this._roomlePositionTo;\n }\n\n public addMesh(mesh: RoomleEventedMesh, transform?: Float32Array) {\n super.addMesh(mesh, transform);\n mesh.visible = false;\n mesh.renderOrder = 3;\n }\n\n public hoverOn() {\n this._dockline.visible = true;\n setCursor(CURSOR_STYLE.HOVER);\n }\n\n public hoverOff() {\n this._dockline.visible = false;\n setCursor(CURSOR_STYLE.DEFAULT);\n }\n\n public preparePreview() {\n super.preparePreview();\n this._dockline.visible = false;\n\n const to = this.lineTo.clone();\n const from = this.lineFrom.clone();\n\n const lengthVector = new Vector3().subVectors(to, from);\n const length = lengthVector.length();\n const direction = lengthVector.normalize();\n this._createLineMesh(0.01, length, this.lineSegments);\n\n const arrowRotation = new Quaternion().setFromUnitVectors(\n new Vector3(0, 1, 0), // the preview cylinder geometry is orientated along the\n direction\n );\n this.lineMesh.quaternion.multiply(arrowRotation);\n this.lineMesh.renderOrder = 1;\n const wantedLineMiddle = new Vector3()\n .addVectors(to, from)\n .multiplyScalar(0.5);\n this.lineMesh.position.copy(\n new Vector3().subVectors(wantedLineMiddle, this.position.clone())\n );\n this.add(this.lineMesh);\n\n const boundingCenter = this._boundingBox\n .getCenter(new Vector3())\n .applyEuler(this.docklineRotation);\n let offset: Vector3 = null;\n let radius = 0;\n const x = Math.abs(direction.x);\n const y = Math.abs(direction.y);\n const z = Math.abs(direction.z);\n if (x >= y && x >= z) {\n offset = new Vector3(boundingCenter.x, 0, 0);\n radius = Math.sqrt(\n boundingCenter.y * boundingCenter.y +\n boundingCenter.z * boundingCenter.z\n );\n } else if (y >= x && y >= z) {\n offset = new Vector3(0, boundingCenter.y, 0);\n radius = Math.sqrt(\n boundingCenter.x * boundingCenter.x +\n boundingCenter.z * boundingCenter.z\n );\n } else if (z >= y && z >= x) {\n offset = new Vector3(0, 0, boundingCenter.z);\n radius = Math.sqrt(\n boundingCenter.y * boundingCenter.y +\n boundingCenter.x * boundingCenter.x\n );\n }\n radius = radius > 0 ? radius : 0.01;\n const boundingLineLength =\n new Vector3()\n .subVectors(this.positionTo.clone(), this.positionFrom.clone())\n .length() + offset.length();\n this._createBoundingLineMesh(\n radius * 1.1,\n boundingLineLength,\n this.lineSegments\n );\n const positionTo = this.positionTo.clone();\n const positionFrom = this.positionFrom.clone();\n const positionDirection = new Vector3()\n .subVectors(positionTo, positionFrom)\n .normalize();\n\n const positionArrowRotation = new Quaternion().setFromUnitVectors(\n new Vector3(0, 1, 0), // the preview cylinder geometry is orientated along the\n positionDirection\n );\n this.boundingLineMesh.quaternion.multiply(positionArrowRotation);\n this.boundingLineMesh.renderOrder = 3;\n\n const wantedBoundingLineMiddle = new Vector3()\n .addVectors(this.positionTo.clone(), this.positionFrom.clone())\n .multiplyScalar(0.5)\n .add(boundingCenter);\n this.boundingLineMesh.position.copy(\n new Vector3().subVectors(\n wantedBoundingLineMiddle,\n this.position.clone()\n )\n );\n this.add(this.boundingLineMesh);\n }\n\n private _createLineMesh(\n radius: number,\n length: number,\n lineSegments: PreviewLineSegment[]\n ) {\n this.lineMesh = this._createPreviewMesh(\n radius,\n length,\n lineSegments,\n 16,\n MaterialCreator.createMeshStandardMaterial({\n color: DEBUG_PREVIEW_LINE ? '#00ff00' : PREVIEW_MATERIAL_COLOR,\n transparent: true,\n opacity: DEBUG_PREVIEW_LINE ? 1 : PREVIEW_LINE_MATERIAL_OPACITY,\n })\n );\n this.lineMesh.name = 'line mesh';\n }\n\n private _createBoundingLineMesh(\n radius: number,\n length: number,\n lineSegments: PreviewLineSegment[]\n ) {\n this.boundingLineMesh = this._createPreviewMesh(\n radius,\n length,\n lineSegments,\n 32,\n MaterialCreator.createMeshStandardMaterial({\n color: DEBUG_PREVIEW_LINE ? '#ff0000' : '#ffffff',\n transparent: true,\n opacity: DEBUG_PREVIEW_LINE ? 1 : 0,\n })\n );\n this.boundingLineMesh.name = 'bounding line mesh';\n this.boundingLineMesh.userData.ignoreComponentRaycast = true;\n this.boundingLineMesh.layers.set(LAYER.PREVIEW);\n }\n\n private _createPreviewMesh(\n radius: number,\n length: number,\n lineSegments: PreviewLineSegment[],\n radialSegments: number,\n material: MeshStandardMaterial\n ): RoomleEventedMesh {\n let previewGeometry: BufferGeometry;\n if (lineSegments.length === 0) {\n previewGeometry = new CylinderGeometry(\n radius,\n radius,\n length,\n radialSegments,\n 1\n );\n } else {\n const geometries: BufferGeometry[] = [];\n for (const segment of lineSegments) {\n const segmentLength = segment.to - segment.from;\n const centerY = (segment.from + segment.to) / 2;\n const segmentGeometry = new CylinderGeometry(\n radius,\n radius,\n segmentLength,\n radialSegments,\n 1\n );\n segmentGeometry.translate(0, centerY - length / 2, 0);\n geometries.push(segmentGeometry);\n }\n previewGeometry = BufferGeometryUtils.mergeGeometries(\n geometries,\n false\n );\n }\n return new Mesh(previewGeometry, material);\n }\n\n public clonePreviewLine(\n numberOfDuplication: number\n ): HPreviewLineComponent {\n const clone = new HPreviewLineComponent(\n this._creator_,\n this.runtimeId,\n this.roomlePosition,\n this.roomleRotation,\n this.parentObjectId,\n this.receivedPointAssociation\n );\n clone._stringId = this.runtimeId + '_' + numberOfDuplication;\n this.children.forEach((child) => {\n if (\n child instanceof Mesh &&\n child.userData.meshType === MeshType.ROOMLE_MESH\n ) {\n clone.meshes.push(child.clone(true));\n }\n });\n clone.meshes.forEach((mesh) => {\n mesh.material = (mesh.material as MeshStandardMaterial).clone();\n mesh.geometry = mesh.geometry.clone();\n clone.add(mesh);\n });\n if (this._dockline) {\n // cannot use clone due to an issue: https://github.com/mrdoob/three.js/issues/15239\n // clone._dockline = this._dockline.clone(true);\n clone._dockline = HRoomleComponent.cloneDockLine(\n this._dockline,\n this._boundingBox\n );\n }\n if (this._boundingBoxMesh) {\n clone._boundingBoxMesh = this._boundingBoxMesh.clone(true);\n }\n if (this._boundingBox) {\n clone._boundingBox = this._boundingBox.clone();\n }\n return clone;\n }\n\n public getPositionForIntersectionPoint(\n intersectionPoint: Vector3\n ): Vector3 {\n const boundingCenter = this._boundingBox\n .getCenter(new Vector3())\n .applyEuler(this.docklineRotation);\n const to = this.positionTo.clone().add(boundingCenter);\n const from = this.positionFrom.clone().add(boundingCenter);\n const line = new Line3(from, to);\n const closestPointToPoint = line.closestPointToPoint(\n intersectionPoint,\n true,\n new Vector3()\n );\n if (\n isNaN(closestPointToPoint.x) ||\n isNaN(closestPointToPoint.y) ||\n isNaN(closestPointToPoint.z)\n ) {\n closestPointToPoint.copy(intersectionPoint);\n }\n return closestPointToPoint.sub(boundingCenter);\n }\n\n public updatePreviewPosition(intersectionPoint: Vector3): void {\n const rootComponentPoint =\n this.getPositionForIntersectionPoint(intersectionPoint);\n const worldPoint = this.parent.localToWorld(rootComponentPoint);\n this._newPosition = this.worldToLocal(worldPoint);\n const boundingCenter = this._boundingBox\n .getCenter(new Vector3())\n .applyEuler(this.docklineRotation);\n this._dockline.position.copy(\n new Vector3().addVectors(this._newPosition, boundingCenter)\n );\n this._dockline.rotation.copy(this.docklineRotation);\n }\n\n public hideSelectionLine(): void {\n this._dockline.visible = false;\n }\n\n public getKernelPosition(newParent: RoomleComponent): KernelVector3 {\n if (this._newPosition) {\n const posInGlobal = this.localToWorld(this._newPosition);\n return convertToKernel(newParent.worldToLocal(posInGlobal));\n }\n return super.getKernelPosition(newParent);\n }\n }\n\n class HOrthographicOffsetCamera extends OrthographicCamera {\n private _offset: CanvasOffset;\n\n constructor(\n left: number,\n right: number,\n top: number,\n bottom: number,\n near?: number,\n far?: number,\n offset?: CanvasOffset\n ) {\n super(left, right, top, bottom, near, far);\n if (!offset) {\n offset = { left: 0, top: 1, right: 1, bottom: 0 };\n }\n this.offset = offset;\n }\n\n set offset(offset: CanvasOffset) {\n this._offset = offset;\n this.updateProjectionMatrix();\n }\n\n get offset(): CanvasOffset {\n return this._offset;\n }\n\n public resetOffset() {\n this._offset = { left: 0, top: 1, right: 1, bottom: 0 };\n }\n\n public updateProjectionMatrix() {\n if (this._offset) {\n this.projectionMatrix = this._calculateProjectionMatrix();\n this.projectionMatrixInverse.copy(this.projectionMatrix).invert();\n } else {\n super.updateProjectionMatrix();\n }\n }\n\n private _calculateProjectionMatrix(): Matrix4 {\n const planes2D = this._calculate2DPlanes();\n if (\n this._offset.left >= this._offset.right ||\n this._offset.bottom > this._offset.top\n ) {\n return new Matrix4().makeOrthographic(\n planes2D.left,\n planes2D.right,\n planes2D.top,\n planes2D.bottom,\n this.near,\n this.far\n );\n }\n\n const widthRange = this._scaleRange(\n planes2D.left,\n planes2D.right,\n this._offset.left,\n this._offset.right\n );\n let left: number = widthRange.from;\n let right: number = widthRange.to;\n const heightRange = this._scaleRange(\n planes2D.bottom,\n planes2D.top,\n this._offset.bottom,\n this._offset.top\n );\n let bottom: number = heightRange.from;\n let top: number = heightRange.to;\n\n const originalAspect: number =\n (planes2D.right - planes2D.left) / (planes2D.top - planes2D.bottom);\n const newAspect: number = (right - left) / (top - bottom);\n if (newAspect > originalAspect) {\n const center: number = (bottom + top) / 2;\n const size: number = ((top - bottom) * newAspect) / originalAspect;\n bottom = center - size / 2;\n top = center + size / 2;\n } else {\n const center: number = (left + right) / 2;\n const size: number = ((right - left) * originalAspect) / newAspect;\n left = center - size / 2;\n right = center + size / 2;\n }\n\n return new Matrix4().makeOrthographic(\n left,\n right,\n top,\n bottom,\n this.near,\n this.far\n );\n }\n\n private _scaleRange(\n from: number,\n to: number,\n offsetFrom: number,\n offsetTo: number\n ): { from: number; to: number } {\n const distance: number = to - from;\n const newDistance = distance / (offsetTo - offsetFrom);\n const scaledFrom: number = from - newDistance * offsetFrom;\n const scaledTo: number = to + newDistance * (1 - offsetTo);\n return { from: scaledFrom, to: scaledTo };\n }\n\n private _calculate2DPlanes(): {\n left: number;\n right: number;\n top: number;\n bottom: number;\n } {\n // this implementation is copied from OrthographicCamera.updateProjectionMatrix\n\n const dx = (this.right - this.left) / (2 * this.zoom);\n const dy = (this.top - this.bottom) / (2 * this.zoom);\n const cx = (this.right + this.left) / 2;\n const cy = (this.top + this.bottom) / 2;\n let left = cx - dx;\n let right = cx + dx;\n let top = cy + dy;\n let bottom = cy - dy;\n\n if (this.view !== null && this.view.enabled) {\n const scaleW =\n (this.right - this.left) / this.view.fullWidth / this.zoom;\n const scaleH =\n (this.top - this.bottom) / this.view.fullHeight / this.zoom;\n left += scaleW * this.view.offsetX;\n right = left + scaleW * this.view.width;\n top -= scaleH * this.view.offsetY;\n bottom = top - scaleH * this.view.height;\n }\n return { left, right, top, bottom };\n }\n }\n\n class HPerspectiveOffsetCamera extends PerspectiveCamera {\n private _offset: CanvasOffset;\n\n constructor(\n fov: number,\n aspect: number,\n near: number,\n far: number,\n offset?: CanvasOffset\n ) {\n super(fov, aspect, near, far);\n if (!offset) {\n offset = { left: 0, top: 1, right: 1, bottom: 0 };\n }\n this.offset = offset;\n }\n\n public copy(camera: this, recursive?: boolean): this {\n super.copy(camera, recursive);\n this._offset = (camera as HPerspectiveOffsetCamera)._offset;\n return this;\n }\n\n set offset(offset: CanvasOffset) {\n this._offset = offset;\n this.updateProjectionMatrix();\n }\n\n get offset(): CanvasOffset {\n return this._offset;\n }\n\n public resetOffset() {\n this._offset = { left: 0, top: 1, right: 1, bottom: 0 };\n }\n\n private _calculateProjectionMatrix(): Matrix4 {\n const fovVerticalOriginal = (this.fov * ((Math.PI * 2) / 360)) / 2;\n\n let leftAbs: number;\n let rightAbs: number;\n let topAbs: number;\n let bottomAbs: number;\n\n topAbs = Math.tan(fovVerticalOriginal);\n bottomAbs = -topAbs;\n\n const fovHorzontalOriginal = Math.atan(\n this.aspect * Math.tan(fovVerticalOriginal)\n );\n\n rightAbs = Math.tan(fovHorzontalOriginal);\n leftAbs = -rightAbs;\n\n const rLeft: number = this._offset.left;\n const rRight: number = this._offset.right;\n const rTop: number = this._offset.top;\n const rBottom: number = this._offset.bottom;\n\n const size = new Vector2(rRight - rLeft, rTop - rBottom);\n\n const center = new Vector2(rLeft + size.x / 2, rBottom + size.y / 2);\n\n if (size.x < size.y) {\n const factorR: number = (1 - center.x) / (size.x / 2);\n const factorL: number = center.x / (size.x / 2);\n\n rightAbs *= factorR;\n leftAbs *= factorL;\n\n const factorV: number = (factorR + factorL) / 2;\n\n topAbs *= factorV;\n bottomAbs *= factorV;\n } else {\n const factorT: number = (1 - center.y) / (size.y / 2);\n const factorB: number = center.y / (size.y / 2);\n\n topAbs *= factorT;\n bottomAbs *= factorB;\n\n const factorH: number = (factorB + factorT) / 2;\n\n leftAbs *= factorH;\n rightAbs *= factorH;\n }\n\n leftAbs *= this.near;\n rightAbs *= this.near;\n topAbs *= this.near;\n bottomAbs *= this.near;\n\n const top =\n (this.near * Math.tan((Math.PI / 180) * 0.5 * this.fov)) / this.zoom;\n const height = 2 * top;\n const width = this.aspect * height;\n\n if (this.view && (this.view as any).enabled) {\n leftAbs += (this.view.offsetX * width) / this.view.fullWidth;\n topAbs -= (this.view.offsetY * height) / this.view.fullHeight;\n rightAbs += (this.view.offsetX * width) / this.view.fullWidth;\n bottomAbs -= (this.view.offsetY * height) / this.view.fullHeight;\n }\n\n return new Matrix4().makePerspective(\n leftAbs,\n rightAbs,\n topAbs,\n bottomAbs,\n this.near,\n this.far\n );\n }\n\n public clearViewOffset() {\n if (this.view !== null) {\n (this.view as any).enabled = false;\n }\n\n this.updateProjectionMatrix();\n }\n\n public updateProjectionMatrix() {\n if (this._offset) {\n this.projectionMatrix = this._calculateProjectionMatrix();\n this.projectionMatrixInverse.copy(this.projectionMatrix).invert();\n } else {\n super.updateProjectionMatrix();\n }\n }\n }\n\n function create(\n id: number,\n position: KernelVector3,\n rotation: KernelVector3,\n parentObjectId: number,\n isRootComponent: boolean\n ): RoomleComponent {\n return new HRoomleComponent(\n id,\n position,\n rotation,\n parentObjectId,\n isRootComponent\n );\n }\n\n function createStatic(id: number, url: string): StaticComponent {\n return new HStaticComponent(id, url);\n }\n\n function createPreview(\n id: number,\n parentObjectId: number,\n creator: string\n ): PreviewComponent {\n return new HPreviewComponent(\n creator,\n id,\n { x: 0, y: 0, z: 0 },\n { x: 0, y: 0, z: 0 },\n parentObjectId,\n false\n );\n }\n\n function createPreviewLine(\n previewComponent: PreviewComponent,\n creator: string\n ): PreviewLineComponent {\n const previewLineComponent = new HPreviewLineComponent(\n creator,\n previewComponent.id,\n previewComponent.roomlePosition,\n previewComponent.roomleRotation,\n previewComponent.parentObjectId,\n previewComponent.receivedPointAssociation\n );\n previewComponent.meshes.forEach((mesh) => {\n const meshClone = mesh.clone();\n meshClone.material = (mesh.material as MeshStandardMaterial).clone();\n meshClone.geometry = mesh.geometry.clone();\n previewLineComponent.addMesh(meshClone);\n });\n previewLineComponent.computeBoundingBox();\n return previewLineComponent;\n }\n\n function createOrthographicCamera(\n left: number,\n right: number,\n top: number,\n bottom: number,\n near?: number,\n far?: number,\n offset?: CanvasOffset\n ): OrthographicOffsetCamera {\n return new HOrthographicOffsetCamera(\n left,\n right,\n top,\n bottom,\n near,\n far,\n offset\n ) as OrthographicOffsetCamera;\n }\n\n function createPerspectiveCamera(\n fov: number,\n aspect: number,\n near: number,\n far: number,\n offset?: CanvasOffset\n ): PerspectiveOffsetCamera {\n return new HPerspectiveOffsetCamera(fov, aspect, near, far, offset);\n }\n\n function isPreview(obj: RoomleComponent): boolean {\n return obj instanceof HPreviewComponent;\n }\n\n function isPreviewLine(obj: RoomleComponent): boolean {\n return obj instanceof HPreviewLineComponent;\n }\n\n return {\n create,\n createPreview,\n createStatic,\n createPreviewLine,\n isPreview,\n isPreviewLine,\n createPerspectiveCamera,\n createOrthographicCamera,\n };\n}\n","import type { PerspectiveCamera, Scene, Vector3 } from 'three';\n\nexport default abstract class Environment {\n protected _scene: Scene;\n protected _bounds: Vector3;\n\n constructor(scene: Scene, oldEnvironment?: Environment) {\n this._scene = scene;\n if (oldEnvironment) {\n oldEnvironment.removeFromScene();\n oldEnvironment.cleanUp();\n }\n }\n\n public abstract needsBounds(): boolean;\n\n public abstract needsCamera(): boolean;\n\n public updateCamera(_camera: PerspectiveCamera) {\n // Keep TSLint quite\n }\n\n public abstract addToScene(): void;\n\n public abstract removeFromScene(): void;\n\n public abstract showGUI(updateCallback: () => void): void;\n\n public reload() {\n this.removeFromScene();\n this.addToScene();\n }\n\n public updateBounds(bounds: Vector3, _force?: boolean) {\n this._bounds = bounds;\n }\n\n public cleanUp(): void {\n this._scene = null;\n }\n}\n","import { LAYER } from './layer';\nimport type { BufferAttribute } from 'three';\nimport { Mesh, Object3D, Path, Shape, ShapeGeometry } from 'three';\nimport MaterialCreator from '../utils/material-creator';\n\nexport default class BakedShadowPlane {\n private _innerPlaneMesh: Mesh;\n private _outerPlaneMesh: Mesh;\n private _plane: Object3D;\n private _innerSize: number = 1;\n private _outerSize: number = 100;\n\n constructor(size: number) {\n this._plane = new Object3D();\n this._plane.rotation.x = -Math.PI / 2;\n\n const material = MaterialCreator.createMeshStandardMaterial({});\n this._innerPlaneMesh = new Mesh();\n\n this._innerPlaneMesh.layers.set(LAYER.BACKGROUND);\n this._innerPlaneMesh.material = material;\n this._innerPlaneMesh.receiveShadow = true;\n\n this._outerPlaneMesh = new Mesh();\n this._outerPlaneMesh.layers.set(LAYER.BACKGROUND);\n this._outerPlaneMesh.material = material;\n this._outerPlaneMesh.receiveShadow = true;\n\n this._plane.add(this._innerPlaneMesh);\n this._plane.add(this._outerPlaneMesh);\n\n this._innerSize = 1;\n this._outerSize = size;\n\n this._updatePlane(this._innerSize, this._outerSize);\n }\n\n public getRootNode() {\n return this._plane;\n }\n\n public getInnerPlane() {\n return this._innerPlaneMesh;\n }\n\n public getOuterPlane() {\n return this._outerPlaneMesh;\n }\n\n public updateSize(innerSize: number) {\n this._innerSize = innerSize;\n this._updatePlane(this._innerSize, this._outerSize);\n }\n\n private _updatePlane(innerSize: number, outerSize: number) {\n const squareShape1 = new Shape();\n squareShape1.moveTo(-innerSize / 2, -innerSize / 2);\n squareShape1.lineTo(-innerSize / 2, innerSize / 2);\n squareShape1.lineTo(innerSize / 2, innerSize / 2);\n squareShape1.lineTo(innerSize / 2, -innerSize / 2);\n squareShape1.lineTo(-innerSize / 2, -innerSize / 2);\n\n const squareShape2 = new Shape();\n squareShape2.moveTo(-outerSize / 2, -outerSize / 2);\n squareShape2.lineTo(-outerSize / 2, outerSize / 2);\n squareShape2.lineTo(outerSize / 2, outerSize / 2);\n squareShape2.lineTo(outerSize / 2, -outerSize / 2);\n squareShape2.lineTo(-outerSize / 2, -outerSize / 2);\n\n const holePath = new Path();\n holePath.moveTo(-innerSize / 2, -innerSize / 2);\n holePath.lineTo(-innerSize / 2, innerSize / 2);\n holePath.lineTo(innerSize / 2, innerSize / 2);\n holePath.lineTo(innerSize / 2, -innerSize / 2);\n holePath.lineTo(-innerSize / 2, -innerSize / 2);\n squareShape2.holes.push(holePath);\n\n const geometry1 = new ShapeGeometry(squareShape1);\n if (this._innerPlaneMesh.geometry) {\n this._innerPlaneMesh.geometry.dispose();\n }\n this._innerPlaneMesh.geometry = geometry1;\n\n const geometry2 = new ShapeGeometry(squareShape2);\n if (this._outerPlaneMesh.geometry) {\n this._outerPlaneMesh.geometry.dispose();\n }\n this._outerPlaneMesh.geometry = geometry2;\n\n const uvs = (geometry1.attributes.uv as any).clone();\n geometry1.setAttribute('uv2', uvs);\n const uvs2 = (geometry1.attributes.uv2 as BufferAttribute).array as any;\n for (let i = 0; i < uvs2.length; ++i) {\n uvs2[i] += 0.5;\n }\n }\n}\n","import type RapiAccess from '../../../../common-core/src/rapi-access';\nimport inject from '../../../../common-core/src/di/inject';\nimport {\n addTexture,\n createMaterial,\n getGUI,\n} from '../../../../common-core/src/utils/threejs-utils';\nimport type DataSyncer from '../../../../common-core/src/services/data-syncer';\nimport Environment from '../../../../common-core/src/environment/environment';\nimport type { RapiMaterial, RapiTexture } from '../../../../typings/rapi-types';\nimport BakedShadowPlane from '../../../../common-core/src/webgl/baked-shadow-plane';\nimport type {\n Material,\n MeshPhysicalMaterial,\n PerspectiveCamera,\n Scene,\n Texture,\n} from 'three';\nimport {\n Color,\n DoubleSide,\n Fog,\n RepeatWrapping,\n TextureLoader,\n Vector3,\n} from 'three';\nimport MaterialCreator from '../../../../common-core/src/utils/material-creator';\n\nconst INITIAL_FLOOR_SIZE = 100;\nconst FOG_COLOR = 0xf6f6f6;\nexport default class FloorEnvironment extends Environment {\n @inject\n private _rapiAccess: RapiAccess;\n\n @inject\n private _dataSyncer: DataSyncer;\n\n private _bakedShadowPlane: BakedShadowPlane;\n private _textureLoader: TextureLoader;\n private _longestSide: number = 2;\n private _width: number;\n private _height: number;\n private _cameraDistance: number;\n private _repeatable: boolean;\n private _floorMaterial: Material;\n private _floorTexture: Texture;\n private _fog: boolean;\n\n private _floorPromise: Promise<void>;\n\n constructor(scene: Scene, oldEnvironment: Environment, fog?: boolean) {\n super(scene, oldEnvironment);\n this._bakedShadowPlane = new BakedShadowPlane(INITIAL_FLOOR_SIZE);\n this._fog = fog ? fog : false;\n\n this._textureLoader = new TextureLoader();\n this.addToScene();\n }\n\n public needsBounds(): boolean {\n return true;\n }\n\n public needsCamera(): boolean {\n return this._fog;\n }\n\n public needsRotation(): boolean {\n return false;\n }\n\n public updateBounds(bounds: Vector3): boolean {\n super.updateBounds(bounds);\n\n this._longestSide = Math.max(bounds.x, bounds.z);\n\n this._update();\n\n return true;\n }\n\n public updateCamera(camera: PerspectiveCamera) {\n this._cameraDistance = camera.position.distanceTo(new Vector3(0, 0, 0));\n this._update();\n }\n\n private _update() {\n if (this._fog) {\n this._updateFog();\n }\n }\n\n private _updateFog() {\n let distance = this._longestSide / 2;\n let distanceToObject = 3;\n this._scene.fog = new Fog(\n FOG_COLOR,\n this._cameraDistance + distance + distanceToObject,\n this._cameraDistance + distance + distanceToObject + 1\n );\n this._scene.background = new Color(FOG_COLOR);\n }\n\n private _updateFloor() {\n if (this._floorMaterial) {\n this._bakedShadowPlane.getOuterPlane().material = this._floorMaterial;\n this._bakedShadowPlane.getInnerPlane().material = this._floorMaterial;\n } else {\n let textureWidth = this._width / 1000;\n let textureHeight = this._height / 1000;\n if (this._repeatable) {\n this._floorTexture.wrapS = RepeatWrapping;\n this._floorTexture.wrapT = RepeatWrapping;\n this._floorTexture.repeat.set(\n INITIAL_FLOOR_SIZE / textureWidth,\n INITIAL_FLOOR_SIZE / textureHeight\n );\n }\n let material = MaterialCreator.createMeshStandardMaterial({\n map: this._floorTexture,\n side: DoubleSide,\n });\n this._bakedShadowPlane.getInnerPlane().material = material;\n this._bakedShadowPlane.getOuterPlane().material = material;\n }\n }\n\n public addToScene(): void {\n if (!this._scene) {\n return;\n }\n this._scene.add(this._bakedShadowPlane.getRootNode());\n }\n\n public removeFromScene(): void {\n this._scene.remove(this._bakedShadowPlane.getRootNode());\n }\n\n public setFloorMaterial(\n url: string,\n width: number,\n height: number,\n repeatable: boolean\n ): Promise<void> {\n this._width = width;\n this._height = height;\n this._repeatable = repeatable;\n this._floorPromise = new Promise((resolve, reject) => {\n this._textureLoader.load(\n url,\n (texture) => {\n this._floorTexture = texture;\n resolve();\n },\n /* no onProgress callback needed */ null,\n reject\n );\n });\n return new Promise((resolve, reject) => {\n this._floorPromise.then(() => {\n this._updateFloor();\n this._update();\n resolve();\n }, reject);\n });\n }\n\n public changeFloorMaterial(\n rapiMaterial: RapiMaterial,\n maxAnisotropy: number\n ): Promise<void> {\n this._floorPromise = new Promise((resolve, reject) => {\n this._floorMaterial = createMaterial(rapiMaterial);\n this._rapiAccess\n .getTexturesOf(rapiMaterial)\n .then((rapiTextures: RapiTexture[]) => {\n if (rapiTextures.length > 0) {\n let texturePromises: Array<Promise<void>> = [];\n rapiTextures.forEach((rapiTexture) => {\n texturePromises.push(\n addTexture(\n this._dataSyncer.requestAsset(\n rapiTexture.image,\n true /* use rapiTexture.image as fallback */\n ),\n rapiTexture,\n this._floorMaterial as MeshPhysicalMaterial,\n maxAnisotropy,\n 1,\n 1\n )\n );\n });\n Promise.all(texturePromises).then(() => {\n setTimeout(() => resolve(), 0);\n }, reject);\n } else {\n setTimeout(() => resolve(), 0);\n }\n });\n });\n\n let promises: Array<Promise<void>> = [this._floorPromise];\n\n return new Promise((resolve, reject) => {\n Promise.all(promises).then(() => {\n this._updateFloor();\n this._update();\n resolve();\n }, reject);\n });\n }\n\n public showGUI() {\n if (!this._floorMaterial) {\n if (this._floorPromise) {\n this._floorPromise.then(() => this._addGUI());\n }\n } else {\n this._addGUI();\n }\n }\n\n private _addGUI() {\n let gui = getGUI();\n if (!gui) {\n return;\n }\n let floor = gui.addFolder('Floor');\n floor.add<any>(this._floorMaterial, 'roughness').min(0).max(1).step(0.01);\n floor\n .add<any>(this._floorMaterial, 'reflectivity')\n .min(0)\n .max(1)\n .step(0.01);\n floor.add<any>(this._floorMaterial, 'clearCoat').min(0).max(1).step(0.01);\n floor\n .add<any>(this._floorMaterial, 'clearCoatRoughness')\n .min(0)\n .max(1)\n .step(0.01);\n floor.add<any>(this._floorMaterial, 'opacity').min(0).max(1).step(0.01);\n floor.add<any>(this._floorMaterial, 'metalness').min(0).max(1).step(0.01);\n floor.add<any>(this._floorMaterial, 'bumpScale').min(0).max(1).step(0.01);\n }\n}\n","import CameraControl, {\n CAMERA_EVENT,\n type CameraParameter,\n} from '../../../common-core/src/cameracontrol/camera-control';\nimport type { InputEvent } from '../../../common-core/src/input/input-manager';\nimport type InputManager from '../../../common-core/src/input/input-manager';\nimport {\n INPUT_EVENT,\n INPUT_EVENT_TYPE,\n MIN_MOVE_DISTANCE,\n} from '../../../common-core/src/input/input-manager';\nimport { STATE } from '../../../common-core/src/cameracontrol/camera-control-3d';\nimport {\n position2VectorsAreEqual,\n position3VectorsAreEqual,\n rotationQuaternionsAreEqual,\n} from '../../../common-core/src/utils/threejs-utils';\nimport { LAYER } from '../../../common-core/src/webgl/layer';\nimport type { Position2 } from '../../../common-core/src/common-interfaces';\nimport {\n getDelta,\n toRadiant,\n} from '../../../common-core/src/utils/math-helper';\nimport { Euler, PerspectiveCamera, Quaternion, Vector2, Vector3 } from 'three';\n\nconst KEYBOARD_ROTATION_ANGLE = Math.PI / 4;\nconst KEYBOARD_MOVING_DISTANCE = 1;\nconst ROTATION_SPEED = 1;\nconst ROTATION_SPEED_TOUCH = 0.1;\nconst RUN_SPEED = 1.5;\nconst CONTROLLER_AXIS_THRESHHOLD = 0.2;\nconst MIN_POLAR_ANGLE = -60;\nconst MAX_POLAR_ANGLE = 60;\n\nconst NATURAL_SCROLLING = true;\n\nexport default class CameraControlFirstPerson extends CameraControl {\n private _camera: PerspectiveCamera;\n private _orbitPosition: Vector2;\n private _state: STATE = STATE.NONE;\n private _cameraRotation: Quaternion = new Quaternion();\n private _position: Position2;\n private _downPosition: Position2;\n\n private _rotationSpeed: number = ROTATION_SPEED;\n private _keyMap: Map<number, boolean> = new Map();\n private _listenerLoopAnimationFrame: number;\n\n public minPolarAngle: number = toRadiant(MIN_POLAR_ANGLE);\n public maxPolarAngle: number = toRadiant(MAX_POLAR_ANGLE);\n\n constructor(\n creator: string,\n inputManager: InputManager,\n initialCameraParameters?: CameraParameter,\n camera?: PerspectiveCamera\n ) {\n super(creator, inputManager, initialCameraParameters);\n if (camera) {\n this._camera = camera;\n } else {\n this._camera = new PerspectiveCamera();\n }\n\n this._camera.fov = 75;\n this._camera.aspect = this._width / this._height;\n this._camera.near = 0.1;\n this._camera.far = 100;\n this._camera.updateProjectionMatrix();\n\n this._camera.layers.set(LAYER.OBJECT);\n this._camera.layers.enable(LAYER.LIGHTING);\n this._camera.layers.enable(LAYER.BACKGROUND);\n this._camera.layers.enable(LAYER.UI);\n this._camera.layers.enable(LAYER.PREVIEW);\n\n if (!initialCameraParameters) {\n this._camera.position.set(0, 1.5, 0);\n }\n this._cameraPosition = new Vector3();\n this._cameraPosition.copy(this._camera.position);\n this._pitch = 0;\n this._yaw = 0;\n let euler = new Euler(-this._pitch, this._yaw, 0, 'ZYX');\n this._cameraRotation.setFromEuler(euler);\n\n window.addEventListener(\n 'gamepadconnected',\n this._gamepadConnected.bind(this)\n );\n\n window.addEventListener(\n 'gamepaddisconnected',\n this._gamepadDisconnected.bind(this)\n );\n }\n\n setUp() {\n super.setUp();\n this._camera.fov = 75;\n this._initInputListener();\n }\n\n private _gamepadConnected(_e: GamepadEvent) {\n console.log('gamepad connected');\n this.startButtonPressListener();\n }\n\n private _gamepadDisconnected(_e: GamepadEvent) {\n console.log('gamepad disconnected');\n window.cancelAnimationFrame(this._listenerLoopAnimationFrame);\n }\n\n private startButtonPressListener(): void {\n this._listenerLoopAnimationFrame = window.requestAnimationFrame(() => {\n this.buttonPressListener();\n });\n }\n\n private buttonPressListener(): void {\n let gamepad = navigator.getGamepads()[0];\n\n this._checkRightStick(gamepad);\n this._checkLeftStick(gamepad);\n this._checkButtons(gamepad);\n\n this._processKeyMap(this._keyMap, 0.001);\n\n this.startButtonPressListener();\n }\n\n private _checkRightStick(gamepad: Gamepad) {\n let rightStickHorizontal = gamepad.axes[2]; //right 1, left -1\n let rightStickVertical = gamepad.axes[3]; //up -1, down 1\n\n if (Math.abs(rightStickHorizontal) > CONTROLLER_AXIS_THRESHHOLD) {\n this._rotateHorizontal(\n KEYBOARD_ROTATION_ANGLE * 0.01 * rightStickHorizontal\n );\n this._update();\n this.dispatchEvent(CAMERA_EVENT.ORBIT_MOVE);\n }\n\n if (Math.abs(rightStickVertical) > CONTROLLER_AXIS_THRESHHOLD) {\n this._rotateVertical(KEYBOARD_ROTATION_ANGLE * 0.01 * rightStickVertical);\n this._update();\n this.dispatchEvent(CAMERA_EVENT.ORBIT_MOVE);\n }\n }\n\n private _checkLeftStick(gamepad: Gamepad) {\n let leftStickHorizontal = gamepad.axes[0]; //left -1, right 1\n let leftStickVertical = gamepad.axes[1]; //up -1, down 1\n if (Math.abs(leftStickVertical) > CONTROLLER_AXIS_THRESHHOLD) {\n if (leftStickVertical < 0) {\n this._keyMap.set(87, true); //move forward\n } else {\n this._keyMap.set(83, true); //move backward\n }\n } else if (\n gamepad.buttons &&\n gamepad.buttons[12] &&\n gamepad.buttons[12].pressed\n ) {\n //move forward\n this._keyMap.set(87, true);\n } else if (\n gamepad.buttons &&\n gamepad.buttons[13] &&\n gamepad.buttons[13].pressed\n ) {\n //move backward\n this._keyMap.set(83, true);\n } else {\n this._keyMap.set(87, false);\n this._keyMap.set(83, false);\n }\n\n if (Math.abs(leftStickHorizontal) > CONTROLLER_AXIS_THRESHHOLD) {\n if (leftStickHorizontal < 0) {\n this._keyMap.set(65, true);\n } else {\n this._keyMap.set(68, true);\n }\n } else {\n this._keyMap.set(65, false);\n this._keyMap.set(68, false);\n }\n }\n\n private _checkButtons(gamepad: Gamepad) {\n //buttons 14/left, 15/right, 12/up, 13/down\n if (gamepad.buttons && gamepad.buttons[6] && gamepad.buttons[6].pressed) {\n //xbox controller left trigger\n this._keyMap.set(16, true);\n } else {\n this._keyMap.set(16, false);\n }\n\n if (gamepad.buttons && gamepad.buttons[14] && gamepad.buttons[14].pressed) {\n //turn right\n this._keyMap.set(37, true);\n this.dispatchEvent(CAMERA_EVENT.ORBIT_MOVE);\n } else {\n this._keyMap.set(37, false);\n }\n\n if (gamepad.buttons && gamepad.buttons[15] && gamepad.buttons[15].pressed) {\n //turn left\n this._keyMap.set(39, true);\n this.dispatchEvent(CAMERA_EVENT.ORBIT_MOVE);\n } else {\n this._keyMap.set(39, false);\n }\n }\n\n public animateCamera(delta: number) {\n let desiredPosition = this._cameraPosition;\n let desiredRotation = this._cameraRotation;\n let camera = this.getCamera();\n let positionsAreEqual = position3VectorsAreEqual(\n desiredPosition,\n camera.position\n );\n let rotationsAreEqual = rotationQuaternionsAreEqual(\n desiredRotation,\n camera.quaternion\n );\n if (!desiredPosition || (positionsAreEqual && rotationsAreEqual)) {\n return false;\n }\n\n let newCameraPosition = this.getCamera().position.clone();\n\n let lerpFactor = Math.min(delta * 10, 1);\n newCameraPosition.lerp(desiredPosition, lerpFactor);\n\n this.getCamera().position.copy(newCameraPosition);\n\n let newCameraRotation = this.getCamera().quaternion.clone();\n\n let slerpFactor = Math.min(delta * 5, 1);\n newCameraRotation.slerp(desiredRotation, slerpFactor);\n\n this.getCamera().setRotationFromQuaternion(newCameraRotation);\n\n let shouldProcess = false;\n this._keyMap.forEach((value) => {\n if (value) {\n shouldProcess = true;\n }\n });\n if (shouldProcess) {\n this._processKeyMap(this._keyMap, delta);\n }\n\n return true;\n }\n\n protected _getCamera(): PerspectiveCamera {\n return this._camera;\n }\n\n protected _initInputListener(): void {\n this._onKeyChanged = this._onKeyChanged.bind(this);\n\n // WASD = MOVE\n this._inputListeners.push({\n key: INPUT_EVENT.KEY_DOWN,\n fun: (event: InputEvent) => {\n this._onKeyChanged(event.event as KeyboardEvent);\n },\n });\n this._inputListeners.push({\n key: INPUT_EVENT.KEY_UP,\n fun: (event: InputEvent) => {\n this._onKeyChanged(event.event as KeyboardEvent);\n },\n });\n\n // MOVE = ORBIT\n this._inputListeners.push({\n key: INPUT_EVENT.DOWN,\n fun: (event: InputEvent) => {\n this._down(event);\n },\n });\n this._inputListeners.push({\n key: INPUT_EVENT.MOVE,\n fun: (event: InputEvent) => {\n this._move(event);\n },\n });\n this._inputListeners.push({\n key: INPUT_EVENT.UP,\n fun: (event: InputEvent) => {\n this._up(event);\n },\n });\n }\n\n protected _removeInputListener(): void {\n this._inputListeners = this._inputListeners.filter(\n (listener) =>\n listener.key !== INPUT_EVENT.KEY_UP &&\n listener.key !== INPUT_EVENT.KEY_DOWN\n );\n }\n\n private _down(event: InputEvent) {\n this._downPosition = event.position;\n this._position = event.position;\n this._state = STATE.ORBIT;\n\n if (event.type === INPUT_EVENT_TYPE.TOUCH) {\n window.setTimeout(this._onLongDown.bind(this), 350);\n }\n if (event.type === INPUT_EVENT_TYPE.TOUCH) {\n this._rotationSpeed = ROTATION_SPEED_TOUCH;\n } else {\n this._rotationSpeed = ROTATION_SPEED;\n }\n }\n\n private _move(event: InputEvent) {\n this._position = event.position;\n if (this._state === STATE.ORBIT && !this._locked) {\n this._orbit(new Vector2(event.position.x, event.position.y));\n }\n if (this._state === STATE.MOVE && !this._locked) {\n this._orbit(new Vector2(event.position.x, event.position.y));\n this._moveForward();\n }\n }\n\n private _up(_event: InputEvent) {\n if (this._state === STATE.ORBIT) {\n this.dispatchEvent(CAMERA_EVENT.ORBIT_END);\n }\n if (this._state === STATE.MOVE) {\n this._keyMap.set(87, false);\n }\n this._state = STATE.NONE;\n this._orbitPosition = null;\n }\n\n private _onLongDown() {\n let delta = getDelta(this._downPosition, this._position);\n if (delta < MIN_MOVE_DISTANCE && this._state === STATE.ORBIT) {\n this._state = STATE.MOVE;\n this._orbit(new Vector2(this._position.x, this._position.y));\n this._moveForward();\n }\n }\n\n protected _update(_overrideTarget?: Vector3) {\n let euler = new Euler(-this._pitch, this._yaw, 0, 'ZYX');\n\n //camera forward\n this._cameraRotation?.setFromEuler(euler);\n }\n\n public updateCamera(): void {\n let { x, y } = this._domHelper.getClientDimensions();\n this._camera.aspect = x / y;\n this._camera.updateProjectionMatrix();\n\n this._camera.near = 0.1;\n this._camera.far = 100;\n }\n\n private _onKeyChanged(event: KeyboardEvent) {\n this._keyMap.set(event.keyCode, event.type === 'keydown');\n this.dispatchEvent(CAMERA_EVENT.KEYBOARD_PRESSED);\n let boundKeybindPressed = this._processKeyMap(this._keyMap, 0.001);\n if (boundKeybindPressed) {\n event.preventDefault();\n }\n }\n\n private _processKeyMap(map: Map<number, boolean>, delta: number): boolean {\n /*\n move forward => w = 87 || up = 38\n move backward => s = 83 || down = 40\n move left => a = 65\n move right => d = 68\n turn left => left = 37\n turn right => right = 39\n sprint => shift = 16\n */\n delta = Math.min(delta, 0.1);\n let direction = new Vector3(0, 0, 0);\n let shouldRotate = false;\n this._processUpDown(map, direction, delta);\n if (map.get(65)) {\n direction.x = -KEYBOARD_MOVING_DISTANCE * RUN_SPEED * delta;\n }\n if (map.get(68)) {\n direction.x = KEYBOARD_MOVING_DISTANCE * RUN_SPEED * delta;\n }\n if (map.get(37)) {\n this._rotateHorizontal(\n -KEYBOARD_ROTATION_ANGLE * this._rotationSpeed * delta\n );\n shouldRotate = true;\n }\n if (map.get(39)) {\n this._rotateHorizontal(\n KEYBOARD_ROTATION_ANGLE * this._rotationSpeed * delta\n );\n shouldRotate = true;\n }\n if (map.get(16)) {\n direction.x *= 3;\n direction.z *= 3;\n }\n if (\n direction.x !== 0 ||\n direction.y !== 0 ||\n direction.z !== 0 ||\n shouldRotate\n ) {\n direction.applyQuaternion(this.getCamera().quaternion);\n this._cameraPosition.add(new Vector3(direction.x, 0, direction.z));\n this._update();\n return true;\n } else {\n return false;\n }\n }\n\n private _processUpDown(\n map: Map<number, boolean>,\n direction: Vector3,\n delta: number\n ) {\n /*\n move forward => w = 87 || up = 38\n move backward => s = 83 || down = 40\n */\n if (map.get(87) || map.get(38)) {\n //camera forward\n direction.z = -KEYBOARD_MOVING_DISTANCE * RUN_SPEED * delta;\n }\n if (map.get(83) || map.get(40)) {\n //camera backward\n direction.z = KEYBOARD_MOVING_DISTANCE * RUN_SPEED * delta;\n }\n }\n\n private _orbit(position: Vector2) {\n if (!this._orbitPosition) {\n this._orbitPosition = new Vector2(position.x, position.y);\n this.dispatchEvent(CAMERA_EVENT.ORBIT_START);\n }\n let orbitDelta = position.clone().sub(this._orbitPosition);\n\n let element =\n this._domHelper.element instanceof Document\n ? this._domHelper.element.body\n : this._domHelper.element;\n\n if (NATURAL_SCROLLING) {\n orbitDelta.multiplyScalar(-1);\n }\n\n this._rotateHorizontal(\n ((2 * Math.PI * orbitDelta.x) / element.clientWidth) * ROTATION_SPEED\n );\n this._rotateVertical(\n ((2 * Math.PI * orbitDelta.y) / element.clientHeight) * ROTATION_SPEED\n );\n\n if (!position2VectorsAreEqual(this._orbitPosition, position)) {\n this.dispatchEvent(CAMERA_EVENT.ORBIT_MOVE);\n }\n this._orbitPosition.copy(position);\n this._update();\n }\n\n private _moveForward() {\n this._keyMap.set(87, true);\n this._processKeyMap(this._keyMap, 0.001);\n }\n\n protected _rotateVertical(angle: number) {\n let newPitch = this._pitch + angle;\n if (newPitch > this.maxPolarAngle || newPitch < this.minPolarAngle) {\n return;\n }\n this._pitch = newPitch;\n if (this._pitch < -Math.PI) {\n this._pitch += 2 * Math.PI;\n } else if (this._pitch > Math.PI) {\n this._pitch -= 2 * Math.PI;\n }\n this._saveYawAndPitch();\n }\n\n getKernelZoomFactor(): number {\n return this._camera.zoom;\n }\n}\n","import Environment from './environment';\nimport type { Color, Scene } from 'three';\n\nconst BACKGROUND_CLASS_NAME = 'rml-scene-background';\nexport default class BackgroundEnvironment extends Environment {\n private readonly _oldBackground: any;\n private readonly _color: Color;\n private readonly _canvas: HTMLCanvasElement;\n private readonly _style: HTMLStyleElement;\n\n constructor(\n scene: Scene,\n oldEnvironment?: Environment,\n color?: Color,\n canvas?: HTMLCanvasElement,\n url?: string\n ) {\n super(scene, oldEnvironment);\n this._color = color;\n this._oldBackground = scene.background;\n if (canvas && url) {\n this._canvas = canvas;\n this._style = document.createElement('style');\n let inlineStyle =\n 'background-image: url(\"' + url + '\"); background-size: cover;';\n this._style.innerText =\n '.' + BACKGROUND_CLASS_NAME + ' {' + inlineStyle + '}';\n this._canvas.appendChild(this._style);\n }\n }\n\n public needsBounds(): boolean {\n return true;\n }\n\n public needsCamera(): boolean {\n return false;\n }\n\n public needsRotation(): boolean {\n return false;\n }\n\n public addToScene(): void {\n if (this._scene && this._color) {\n this._scene.background = this._color;\n }\n if (this._canvas && this._canvas.classList) {\n this._scene.background = null;\n this._canvas.classList.add(BACKGROUND_CLASS_NAME);\n }\n }\n\n public removeFromScene(): void {\n if (this._oldBackground) {\n this._scene.background = this._oldBackground;\n }\n if (this._canvas) {\n this._canvas.classList.remove(BACKGROUND_CLASS_NAME);\n }\n }\n\n showGUI(): void {\n // eslint be quite\n }\n}\n","import type Environment from './environment';\nimport type { SceneSettings } from '../scene-settings-loader';\nimport type RapiAccess from '../rapi-access';\nimport inject from '../di/inject';\nimport FloorEnvironment from '../../../configurator-core/src/webgl/environment/floor-environment';\nimport BackgroundEnvironment from './background-environment';\nimport type { ColorRepresentation, Scene } from 'three';\nimport { Color } from 'three';\n\nexport interface EnvironmentDetails {\n imageUrl: string;\n color: string;\n material: string;\n fog: boolean;\n}\n\n/**\n * Dynamic environment settings can be used to select which environment is used.\n\n Example\n\n ```\n {\n\"environment\": {\n \"type\": \"image\",\n \"details\": {\n \"imageUrl\": \"https://storage.googleapis.com/roomle-static/test/bg/bg_grey.jpg\"\n }\n }\n}\n ```\n\n Available environment types\n\n \"type\": \"floor\"/\"image\"/\"color\"/\"gltf\"\n\n Type floor\n\n ```\n \"details\": {\n \"material\": \"roomle_floor:DresdenEiche\"\n }\n ```\n\n Currently available floor materials, for others get in touch with us\n\n ```\n roomle_floor:DresdenEiche\n roomle_floor:Ibiza\n roomle_floor:Palma\n roomle_floor:Elba\n roomle_floor:Manacor\n roomle_floor:KernEiche\n roomle_floor:KieferScandic\n roomle_floor:EicheHabsburg\n roomle_floor:FuldaKiefer\n roomle_floor:Ashton\n roomle_floor:EicheLondon\n ```\n\n Type image\n\n ```\n \"details\": {\n \"imageUrl\": \"https://storage.googleapis.com/roomle-static/test/bg/bg_grey_shine.jpg\"\n}\n ```\n\n Type color\n\n ```\n \"details\": {\n \"color\": \"#ff0000\"\n}\n ```\n\n Type gltf\n\n Type gltf does not have any details yet\n */\nexport interface EnvironmentSetting {\n type: string;\n details: EnvironmentDetails;\n}\n\nconst enum ENVIRONMENT_TYPE {\n FLOOR_ENVIRONMENT = 'floor',\n IMAGE_ENVIRONMENT = 'image',\n COLOR_ENVIRONMENT = 'color',\n}\n\nexport default class DynamicEnvironmentSettingLoader {\n @inject\n private _rapiAccess: RapiAccess;\n\n public parse(\n scene: Scene,\n canvas: HTMLCanvasElement,\n oldEnvironment: Environment,\n json: string,\n maxAnisotropy: number\n ): Promise<Environment> {\n let jsonObject = JSON.parse(json);\n if (!jsonObject.environment) {\n return null;\n }\n\n return this.load(scene, canvas, oldEnvironment, jsonObject, maxAnisotropy);\n }\n\n public load(\n scene: Scene,\n canvas: HTMLCanvasElement,\n oldEnvironment: Environment,\n jsonObject: SceneSettings,\n maxAnisotropy: number\n ): Promise<Environment> {\n let environmentPromise: Promise<Environment>;\n let environmentObject = jsonObject.environment;\n if (!environmentObject) {\n console.warn('No environment set in scene settings');\n return Promise.resolve(null);\n }\n switch (environmentObject.type) {\n case ENVIRONMENT_TYPE.COLOR_ENVIRONMENT:\n environmentPromise = new Promise<Environment>((resolve) =>\n resolve(\n new BackgroundEnvironment(\n scene,\n oldEnvironment,\n new Color(environmentObject.details.color as ColorRepresentation)\n )\n )\n );\n break;\n case ENVIRONMENT_TYPE.IMAGE_ENVIRONMENT:\n environmentPromise = new Promise<Environment>((resolve) =>\n resolve(\n new BackgroundEnvironment(\n scene,\n oldEnvironment,\n null,\n canvas,\n environmentObject.details.imageUrl\n )\n )\n );\n break;\n case ENVIRONMENT_TYPE.FLOOR_ENVIRONMENT:\n environmentPromise = new Promise<Environment>((resolve) => {\n this._rapiAccess\n .getMaterial(environmentObject.details.material)\n .then((material) => {\n let fog =\n environmentObject.details.fog === undefined\n ? true\n : environmentObject.details.fog;\n let environment = new FloorEnvironment(\n scene,\n oldEnvironment,\n fog\n );\n environment\n .changeFloorMaterial(material, maxAnisotropy)\n .then(() => {\n resolve(environment);\n });\n });\n });\n break;\n default:\n console.warn('Could not load environment, return old environment');\n environmentPromise = new Promise<Environment>((resolve) =>\n resolve(oldEnvironment)\n );\n break;\n }\n\n return environmentPromise;\n }\n}\n","import type { Box3, Scene } from 'three';\nimport { Object3D } from 'three';\n\nexport default abstract class LightSetting {\n protected _scene: Scene;\n private _cameraContainer: Object3D;\n\n constructor(scene: Scene, oldLightSetting?: LightSetting) {\n this._scene = scene;\n if (oldLightSetting) {\n oldLightSetting.removeFromScene();\n }\n }\n\n public needsBounds(): boolean {\n return false;\n }\n\n public updateBounds(_bounds: Box3) {\n //override when needed\n }\n\n public abstract addToScene(): void;\n\n public abstract removeFromScene(): void;\n\n public abstract reload(): void;\n\n public abstract showGUI(): void;\n\n public getCameraContainer(): Object3D {\n if (!this._cameraContainer) {\n this._cameraContainer = new Object3D();\n }\n return this._cameraContainer;\n }\n}\n","import LightSetting from './light-setting';\nimport { getGUI } from '../utils/threejs-utils';\nimport type DynamicLightSettingLoader from './dynamic-light-setting-loader';\nimport inject from '../di/inject';\nimport { handleJsonResponse } from '../utils/common-utils';\nimport type { SceneSettings } from '../scene-settings-loader';\nimport type {\n Box3,\n ColorRepresentation,\n Light,\n PerspectiveCamera,\n Scene,\n} from 'three';\nimport {\n AmbientLight,\n Color,\n DirectionalLight,\n RectAreaLight,\n SpotLight,\n Vector3,\n} from 'three';\n\nexport default class DynamicLightSetting extends LightSetting {\n private _lights: Light[] = [];\n private _cameraLight: Light;\n private _boundingSize: number;\n\n @inject\n private _dynamicLightSettingLoader: DynamicLightSettingLoader;\n\n constructor(scene: Scene, oldLightSetting?: LightSetting) {\n super(scene, oldLightSetting);\n }\n\n public needsBounds(): boolean {\n return true;\n }\n\n public updateBounds(bounds: Box3) {\n if (this._cameraLight) {\n const punctualLight = this._cameraLight as any;\n const size = new Vector3();\n bounds.getSize(size);\n const maxSize = 1.5 * Math.max(Math.max(size.x, size.y), size.z);\n this._boundingSize = maxSize;\n punctualLight.shadow.camera.top = maxSize / 2;\n punctualLight.shadow.camera.bottom = -maxSize / 2;\n punctualLight.shadow.camera.left = -maxSize / 2;\n punctualLight.shadow.camera.right = maxSize / 2;\n punctualLight.shadow.camera.updateProjectionMatrix();\n }\n }\n\n public loadFromJSON(json: string): Promise<void> {\n return new Promise((resolve) => {\n this._lights = this._dynamicLightSettingLoader.parse(json);\n this.addToScene();\n resolve();\n });\n }\n\n public loadFromObject(sceneSettings: SceneSettings): Promise<void> {\n return new Promise((resolve) => {\n if (!sceneSettings?.lights) {\n resolve();\n }\n this._lights = this._dynamicLightSettingLoader.load(sceneSettings);\n this._lights.forEach((light, index) => {\n if (light.userData.movesWithCamera) {\n this._cameraLight = light;\n this._lights.splice(index, 1);\n }\n });\n this.addToScene();\n resolve();\n });\n }\n\n public loadFromURL(url: string): Promise<void> {\n return new Promise((resolve, reject) => {\n fetch(new Request(url, { method: 'GET' as RequestCache }))\n .then(handleJsonResponse)\n .then((jsonObject) =>\n this.loadFromObject(jsonObject).then(resolve, reject)\n );\n });\n }\n\n public addToScene(): void {\n this._lights.forEach((light) => {\n this._scene.add(light);\n });\n if (this._cameraLight) {\n this._scene.add(this._cameraLight);\n }\n }\n\n public update(camera: PerspectiveCamera, target: Vector3) {\n if (!this._cameraLight) {\n return;\n }\n\n let dir = new Vector3();\n camera.getWorldDirection(dir);\n dir.multiplyScalar(-this._boundingSize);\n let position = target.clone().add(dir);\n this._cameraLight.position.copy(position);\n }\n\n public removeFromScene(): void {\n this._lights.forEach((light) => {\n this._scene.remove(light);\n });\n if (this._cameraLight) {\n this._scene.remove(this._cameraLight);\n }\n }\n\n public reload(): void {\n this.removeFromScene();\n this.addToScene();\n }\n\n public showGUI(): void {\n let gui = getGUI();\n if (this._cameraLight) {\n this._addToGUI(gui, this._cameraLight);\n }\n this._lights.forEach((light) => {\n this._addToGUI(gui, light);\n });\n }\n\n // eslint-disable-next-line no-undef\n private _addToGUI(gui: dat.GUI, light: any) {\n if (!gui) {\n return;\n }\n if (light instanceof SpotLight) {\n this._addSpotLightToGUI(gui, light);\n }\n if (light instanceof AmbientLight) {\n this._addAmbientLightToGUI(gui, light);\n }\n if (light instanceof DirectionalLight) {\n this._addDirectionalLightToGUI(gui, light);\n }\n if (light instanceof RectAreaLight) {\n this._addRectAreaLightToGUI(gui, light);\n }\n }\n\n // eslint-disable-next-line no-undef\n private _addRectAreaLightToGUI(gui: dat.GUI, light: any) {\n let areaLight = gui.addFolder(light.name);\n\n let guiLightParam = {\n name: light.name,\n color: '#' + light.color.getHexString(),\n intensity: light.intensity * (light.width * light.height),\n };\n\n areaLight.add(light, 'visible');\n areaLight\n .add(guiLightParam, 'intensity')\n .min(10)\n .max(400)\n .step(10)\n .onChange((intensity: number) => {\n light.intensity = intensity / (light.width * light.height);\n });\n areaLight.add(light, 'castShadow');\n areaLight.addColor(guiLightParam, 'color').onChange((color: string) => {\n light.color = new Color(color as ColorRepresentation);\n });\n areaLight\n .add(light.position, 'x')\n .min(-10)\n .max(10)\n .step(0.1)\n .onChange(() => {\n light.lookAt(new Vector3(0, 0, 0));\n });\n areaLight\n .add(light.position, 'y')\n .min(-10)\n .max(10)\n .step(0.1)\n .onChange(() => {\n light.lookAt(new Vector3(0, 0, 0));\n });\n areaLight\n .add(light.position, 'z')\n .min(-10)\n .max(10)\n .step(0.1)\n .onChange(() => {\n light.lookAt(new Vector3(0, 0, 0));\n });\n }\n\n // eslint-disable-next-line no-undef\n private _addSpotLightToGUI(gui: dat.GUI, light: SpotLight) {\n let spot = gui.addFolder(light.name);\n\n let guiLightParam = {\n name: light.name,\n color: '#' + light.color.getHexString(),\n angle: (light.angle * 180) / Math.PI,\n };\n\n spot.add<any>(light, 'visible');\n spot.add<any>(light, 'intensity').min(0).max(5).step(0.1);\n spot.add<any>(light, 'penumbra').min(0).max(1).step(0.1);\n spot.addColor(guiLightParam, 'color').onChange((color: string) => {\n light.color = new Color(color as ColorRepresentation);\n });\n spot\n .add(guiLightParam, 'angle')\n .min(10)\n .max(180)\n .step(1)\n .onChange((angle: number) => {\n light.angle = (angle * Math.PI) / 180;\n });\n spot\n .add<any>(light.position, 'x')\n .min(-10)\n .max(10)\n .step(0.1)\n .onChange(() => {\n light.lookAt(new Vector3(0, 0, 0));\n });\n spot\n .add<any>(light.position, 'y')\n .min(-10)\n .max(10)\n .step(0.1)\n .onChange(() => {\n light.lookAt(new Vector3(0, 0, 0));\n });\n spot\n .add<any>(light.position, 'z')\n .min(-10)\n .max(10)\n .step(0.1)\n .onChange(() => {\n light.lookAt(new Vector3(0, 0, 0));\n });\n }\n // eslint-disable-next-line no-undef\n private _addAmbientLightToGUI(gui: dat.GUI, light: AmbientLight) {\n let guiLightParam = {\n name: light.name,\n color: '#' + light.color.getHexString(),\n };\n let ambiLight = gui.addFolder(light.name);\n ambiLight.add<any>(light, 'visible');\n ambiLight.add<any>(light, 'intensity').min(0).max(5).step(0.1);\n ambiLight.addColor(guiLightParam, 'color').onChange((color: string) => {\n light.color = new Color(color as ColorRepresentation);\n });\n }\n // eslint-disable-next-line no-undef\n private _addDirectionalLightToGUI(gui: dat.GUI, light: DirectionalLight) {\n let directional = gui.addFolder(light.name);\n\n let guiLightParam = {\n name: light.name,\n color: '#' + light.color.getHexString(),\n };\n\n directional.add<any>(light, 'visible');\n directional.add<any>(light, 'intensity').min(0).max(5).step(0.1);\n directional.addColor(guiLightParam, 'color').onChange((color: string) => {\n light.color = new Color(color as ColorRepresentation);\n });\n directional.add<any>(light, 'castShadow');\n directional\n .add<any>(light.position, 'x')\n .min(-10)\n .max(10)\n .step(0.1)\n .onChange(() => {\n light.lookAt(new Vector3(0, 0, 0));\n });\n directional\n .add<any>(light.position, 'y')\n .min(-10)\n .max(10)\n .step(0.1)\n .onChange(() => {\n light.lookAt(new Vector3(0, 0, 0));\n });\n directional\n .add<any>(light.position, 'z')\n .min(-10)\n .max(10)\n .step(0.1)\n .onChange(() => {\n light.lookAt(new Vector3(0, 0, 0));\n });\n }\n}\n","import { Mesh, MeshBasicMaterial, SphereGeometry, Vector3 } from 'three';\n\n/**\n * A ground-projected skybox. The height is how far the camera that took the photo was above the ground -\n * a larger value will magnify the downward part of the image. By default the object is centered at the camera,\n * so it is often helpful to set skybox.position.y = height to put the ground at the origin. Set the radius\n * large enough to ensure your user's camera stays inside.\n */\n\nclass GroundedSkybox extends Mesh {\n\n\tconstructor( map, height, radius, resolution = 128 ) {\n\n\t\tif ( height <= 0 || radius <= 0 || resolution <= 0 ) {\n\n\t\t\tthrow new Error( 'GroundedSkybox height, radius, and resolution must be positive.' );\n\n\t\t}\n\n\t\tconst geometry = new SphereGeometry( radius, 2 * resolution, resolution );\n\t\tgeometry.scale( 1, 1, - 1 );\n\n\t\tconst pos = geometry.getAttribute( 'position' );\n\t\tconst tmp = new Vector3();\n\n\t\tfor ( let i = 0; i < pos.count; ++ i ) {\n\n\t\t\ttmp.fromBufferAttribute( pos, i );\n\t\t\tif ( tmp.y < 0 ) {\n\n\t\t\t\t// Smooth out the transition from flat floor to sphere:\n\t\t\t\tconst y1 = - height * 3 / 2;\n\t\t\t\tconst f =\n\t\t\t\t\t\ttmp.y < y1 ? - height / tmp.y : ( 1 - tmp.y * tmp.y / ( 3 * y1 * y1 ) );\n\t\t\t\ttmp.multiplyScalar( f );\n\t\t\t\ttmp.toArray( pos.array, 3 * i );\n\n\t\t\t}\n\n\t\t}\n\n\t\tpos.needsUpdate = true;\n\n\t\tsuper( geometry, new MeshBasicMaterial( { map, depthWrite: false } ) );\n\n\t}\n\n}\n\nexport { GroundedSkybox };\n","import Environment from './environment';\nimport type { Mesh, Scene, Texture } from 'three';\n// @ts-ignore -- TS7016: Could not find declaration file\nimport { GroundedSkybox } from 'three/examples/jsm/objects/GroundedSkybox.js';\nimport { getGUI } from '../utils/threejs-utils';\n\nexport default class GroundProjectedEnvironment extends Environment {\n private _environmentTexture: Texture;\n private _skybox: Mesh;\n\n constructor(scene: Scene, oldEnvironment: Environment, texture: Texture) {\n super(scene, oldEnvironment);\n this.updateEnvironmentTexture(texture);\n }\n\n public updateEnvironmentTexture(texture: Texture) {\n if (texture) {\n this._environmentTexture = texture;\n\n this._skybox = new GroundedSkybox(\n this._environmentTexture,\n 15,\n 100\n ) as Mesh;\n this._skybox.name = 'Ground projected skybox';\n\n this._skybox.scale.setScalar(100);\n }\n this.reload();\n }\n\n public needsBounds(): boolean {\n return false;\n }\n\n public needsCamera(): boolean {\n return false;\n }\n\n public needsRotation(): boolean {\n return false;\n }\n\n public addToScene(): void {\n if (this._scene && this._skybox) {\n this._scene.add(this._skybox);\n }\n }\n\n public removeFromScene(): void {\n if (this._scene && this._skybox) {\n this._scene.remove(this._skybox);\n }\n }\n\n showGUI(updateCallback: () => void): void {\n let gui = getGUI();\n if (!gui) {\n return;\n }\n let groundProjectedEnvironment = gui.addFolder(\n 'Ground Projected Environment'\n );\n groundProjectedEnvironment\n .add<any>(this._skybox, 'height')\n .min(10)\n .max(100)\n .step(0.1)\n .onChange(updateCallback);\n\n groundProjectedEnvironment\n .add<any>(this._skybox, 'radius')\n .min(20)\n .max(200)\n .step(0.1)\n .onChange(updateCallback);\n }\n}\n","import type {\n LightGraph,\n LightSample,\n LightSource,\n LightSourceDetector,\n} from './light-source-detection';\nimport type { ColorRepresentation, Material, Scene } from 'three';\nimport {\n BufferGeometry,\n CircleGeometry,\n DoubleSide,\n LineBasicMaterial,\n LineSegments,\n Mesh,\n MeshBasicMaterial,\n PlaneGeometry,\n Vector2,\n Vector3,\n} from 'three';\n\nexport class LightSourceDetectorDebug {\n private _lightSourceDetector: LightSourceDetector;\n private _scene?: Scene;\n\n constructor(lightSourceDetector: LightSourceDetector) {\n this._lightSourceDetector = lightSourceDetector;\n }\n\n public static createPlane(scene: Scene, material?: Material): Mesh {\n const planeGeometry = new PlaneGeometry(2, 1);\n const planeMaterial =\n material ?? new MeshBasicMaterial({ color: 0xc0c0c0, side: DoubleSide });\n const planeMesh = new Mesh(planeGeometry, planeMaterial);\n planeMesh.position.z = -0.1;\n scene.add(planeMesh);\n return planeMesh;\n }\n\n public createDebugScene(scene: Scene, maxNoOfLightSources?: number): void {\n this._scene = scene;\n this._createLightGraphInMap(\n this._lightSourceDetector.sampleUVs,\n this._lightSourceDetector.lightSamples,\n this._lightSourceDetector.lightGraph,\n maxNoOfLightSources\n );\n }\n\n private _createLightGraphInMap(\n allLightSamplesUVs: Vector2[],\n lightSamples: LightSample[],\n lightGraph: LightGraph,\n maxNoOfLightSources?: number\n ) {\n const singleLightSamples: LightSample[] = [];\n const clusterLightSamples: LightSample[] = [];\n for (let i = 0; i < this._lightSourceDetector.lightGraph.noOfNodes; ++i) {\n if (lightGraph.adjacent[i].length === 0) {\n singleLightSamples.push(lightSamples[i]);\n } else {\n clusterLightSamples.push(lightSamples[i]);\n }\n }\n const singleLightSampleUVs = singleLightSamples.map((sample) => sample.uv);\n const clusterLightSampleUVs = clusterLightSamples.map(\n (sample) => sample.uv\n );\n const discardedSamples = allLightSamplesUVs.filter(\n (uv) =>\n !singleLightSampleUVs.includes(uv) &&\n !clusterLightSampleUVs.includes(uv)\n );\n this._createSamplePointsInMap(discardedSamples, 0.005, 0xff0000);\n this._createSamplePointsInMap(singleLightSampleUVs, 0.01, 0x0000ff);\n this._createSamplePointsInMap(clusterLightSampleUVs, 0.01, 0x00ff00);\n this._createClusterLinesInMap(\n this._lightSourceDetector.lightSamples,\n this._lightSourceDetector.lightGraph.edges,\n 0x000080\n );\n const lightSourceUVs = this._lightSourceDetector.lightSources.map(\n (lightSource) => lightSource.uv\n );\n this._createSamplePointsInMap(lightSourceUVs, 0.015, 0xffff00);\n let lightSources = this._lightSourceDetector.lightSources;\n if (\n maxNoOfLightSources !== undefined &&\n maxNoOfLightSources >= 0 &&\n maxNoOfLightSources < lightSources.length\n ) {\n lightSources = lightSources.slice(0, maxNoOfLightSources);\n }\n this._createCirclesInMap(lightSources, 0x808000);\n }\n\n private _createSamplePointsInMap(\n samplePoints: Vector2[],\n radius: number,\n color: ColorRepresentation\n ) {\n // TODO TREE.Points https://threejs.org/docs/#api/en/objects/Points\n const samplePointGeometry = new CircleGeometry(radius, 8, 4);\n const samplePointMaterial = new MeshBasicMaterial({ color });\n samplePoints.forEach((samplePoint: Vector2) => {\n const samplePointMesh = new Mesh(\n samplePointGeometry,\n samplePointMaterial\n );\n samplePointMesh.position.copy(this._uvToMapPosition(samplePoint));\n samplePointMesh.name = 'samplePoint';\n this._scene?.add(samplePointMesh);\n });\n }\n\n private _createCirclesInMap(\n lightSources: LightSource[],\n color: ColorRepresentation\n ) {\n const samplePointMaterial = new MeshBasicMaterial({\n color,\n transparent: true,\n opacity: 0.5,\n });\n lightSources.forEach((lightSource: LightSource) => {\n const samplePointGeometry = new CircleGeometry(lightSource.size, 8, 4);\n const samplePointMesh = new Mesh(\n samplePointGeometry,\n samplePointMaterial\n );\n samplePointMesh.position.copy(this._uvToMapPosition(lightSource.uv));\n samplePointMesh.name = 'samplePoint';\n this._scene?.add(samplePointMesh);\n });\n }\n\n private _createClusterLinesInMap(\n lightSamples: LightSample[],\n clusterSegments: number[][],\n color: ColorRepresentation\n ) {\n const lineMaterial = new LineBasicMaterial({ color });\n const points: Vector3[] = [];\n clusterSegments.forEach((cluster: number[]) => {\n for (let i = 1; i < cluster.length; i++) {\n const uv0 = lightSamples[cluster[0]].uv;\n const uv1 = lightSamples[cluster[i]].uv;\n points.push(this._uvToMapPosition(uv0));\n if (Math.abs(uv0.x - uv1.x) > 0.5) {\n const v = (uv0.y + uv1.y) / 2;\n const u = uv0.x < uv1.x ? 0 : 1;\n points.push(this._uvToMapPosition(new Vector2(u, v)));\n points.push(this._uvToMapPosition(new Vector2(1 - u, v)));\n }\n points.push(this._uvToMapPosition(uv1));\n }\n });\n const lineGeometry = new BufferGeometry().setFromPoints(points);\n const lineMesh = new LineSegments(lineGeometry, lineMaterial);\n lineMesh.name = 'clusterLine';\n this._scene?.add(lineMesh);\n }\n\n private _uvToMapPosition(uv: Vector2): Vector3 {\n return new Vector3(uv.x * 2 - 1, uv.y - 0.5, 0);\n }\n}\n","import type { Texture, WebGLRenderer, WebGLRenderTarget } from 'three';\nimport { Matrix3, NoBlending, PMREMGenerator, ShaderMaterial } from 'three';\n\ninterface WithEquirectMaterial {\n _equirectMaterial: ShaderMaterial | null;\n}\n\nexport class EnvironmentPmremGenertor extends PMREMGenerator {\n private _extendedEquirectMaterial: ShaderMaterial;\n\n constructor(renderer: WebGLRenderer) {\n super(renderer);\n this._extendedEquirectMaterial = this._createEquirectMaterial();\n }\n\n public fromEquirectangularTexture(\n equirectangularTexture: Texture,\n parameters?: { rotation?: number; intensity?: number }\n ): WebGLRenderTarget {\n const rotation = parameters?.rotation ?? 0;\n const intensity = parameters?.intensity ?? 1;\n this._extendedEquirectMaterial.uniforms.intensity.value = intensity;\n // prettier-ignore\n this._extendedEquirectMaterial.uniforms.rotationMatrix.value.set(\n Math.cos(rotation), 0, -Math.sin(rotation),\n 0, 1, 0,\n Math.sin(rotation), 0, Math.cos(rotation)\n );\n return super.fromEquirectangular(equirectangularTexture);\n }\n\n private _createEquirectMaterial(): ShaderMaterial {\n const material = new ShaderMaterial({\n name: 'EquirectangularToCubeUV',\n uniforms: {\n envMap: { value: null },\n intensity: { value: 1.0 },\n rotationMatrix: { value: new Matrix3() },\n },\n vertexShader: equilateralVertexShader,\n fragmentShader: equilateralFragmentShader,\n blending: NoBlending,\n depthTest: false,\n depthWrite: false,\n });\n (this as unknown as WithEquirectMaterial)._equirectMaterial = material;\n return material;\n }\n}\n\nconst equilateralVertexShader = `\nprecision mediump float;\nprecision mediump int;\nattribute float faceIndex;\nvarying vec3 vOutputDirection;\nuniform mat3 rotationMatrix;\n\n// RH coordinate system; PMREM face-indexing convention\nvec3 getDirection( vec2 uv, float face ) {\n uv = 2.0 * uv - 1.0;\n vec3 direction = vec3( uv, 1.0 );\n if ( face == 0.0 ) {\n direction = direction.zyx; // ( 1, v, u ) pos x\n } else if ( face == 1.0 ) {\n direction = direction.xzy;\n direction.xz *= -1.0; // ( -u, 1, -v ) pos y\n } else if ( face == 2.0 ) {\n direction.x *= -1.0; // ( -u, v, 1 ) pos z\n } else if ( face == 3.0 ) {\n direction = direction.zyx;\n direction.xz *= -1.0; // ( -1, v, -u ) neg x\n } else if ( face == 4.0 ) {\n direction = direction.xzy;\n direction.xy *= -1.0; // ( -u, -1, v ) neg y\n } else if ( face == 5.0 ) {\n direction.z *= -1.0; // ( u, v, -1 ) neg z\n }\n return direction;\n}\n\nvoid main() {\n vOutputDirection = rotationMatrix * getDirection(uv, faceIndex);\n gl_Position = vec4(position, 1.0);\n}\n`;\n\nconst equilateralFragmentShader = `\nprecision mediump float;\nprecision mediump int;\nvarying vec3 vOutputDirection;\nuniform sampler2D envMap;\nuniform float intensity;\n\n#include <common>\n\nvoid main() { \n vec3 outputDirection = normalize(vOutputDirection);\n vec2 uv = equirectUv(outputDirection);\n gl_FragColor = vec4(texture2D(envMap, uv).rgb * intensity, 1.0);\n}\n`;\n","import type { LightSource } from './light-source-detection';\nimport {\n EnvironmentMapDecodeMaterial,\n LightSourceDetector,\n} from './light-source-detection';\nimport { LightSourceDetectorDebug } from './light-source-detection-debug';\nimport { EnvironmentPmremGenertor } from './pmrem-environment';\nimport type { WebGLRenderer, WebGLRenderTarget } from 'three';\nimport { CubeTexture, Scene, Texture, Vector2 } from 'three';\n\nexport interface EnvironmentDefinitionTextureData {\n _width: number;\n _height: number;\n data: number[];\n}\n\ninterface EnvironmentDefinitionParameters {\n textureData?: EnvironmentDefinitionTextureData;\n rotation?: number;\n intensity?: number;\n maxNoOfLightSources?: number;\n}\n\nexport abstract class EnvironmentSceneGenerator {\n abstract generateScene(intensity: number, rotation: number): Scene;\n}\n\nexport class EnvironmentDefinition {\n public needsUpdate = true;\n public readonly environmentSceneGenerator?: EnvironmentSceneGenerator;\n public readonly equirectangularTexture?: Texture;\n public readonly cubeTexture?: CubeTexture;\n public readonly textureData?: EnvironmentDefinitionTextureData;\n private _rotation;\n private _intensity;\n private _maxNoOfLightSources?: number;\n private _lightSources: LightSource[] = [];\n private _debugScene?: Scene;\n private _parameters?: EnvironmentDefinitionParameters;\n private _environment: EnvironmentSceneGenerator | CubeTexture | Texture;\n\n get lightSources(): LightSource[] {\n return this._lightSources;\n }\n\n set rotation(rotation: number) {\n if (this._rotation !== rotation) {\n this._rotation = rotation;\n this.needsUpdate = true;\n }\n }\n\n set intensity(intensity: number) {\n if (this._intensity !== intensity) {\n this._intensity = intensity;\n this.needsUpdate = true;\n }\n }\n\n set maxNoOfLightSources(maxNoOfLightSources: number) {\n if (this._maxNoOfLightSources !== maxNoOfLightSources) {\n this._maxNoOfLightSources = maxNoOfLightSources;\n this.needsUpdate = true;\n }\n }\n\n get maxNoOfLightSources(): number | undefined {\n return this._maxNoOfLightSources;\n }\n\n constructor(\n environment: EnvironmentSceneGenerator | CubeTexture | Texture,\n parameters?: EnvironmentDefinitionParameters\n ) {\n if (environment instanceof EnvironmentSceneGenerator) {\n this.environmentSceneGenerator = environment;\n } else if (environment instanceof CubeTexture) {\n this.cubeTexture = environment;\n } else if (environment instanceof Texture) {\n this.equirectangularTexture = environment;\n }\n if (parameters?.textureData) {\n this.textureData = parameters?.textureData;\n }\n this._rotation = parameters?.rotation ?? 0;\n this._intensity = parameters?.intensity ?? 1;\n if (parameters?.maxNoOfLightSources !== undefined) {\n this._maxNoOfLightSources = parameters.maxNoOfLightSources;\n }\n this._parameters = parameters;\n this._environment = environment;\n }\n\n clone() {\n return new EnvironmentDefinition(this._environment, this._parameters);\n }\n\n public createNewEnvironment(renderer: WebGLRenderer): Texture | null {\n const pmremTextue = this._createPmremTexture(renderer);\n const lightSourceDetector = this._detectLightSources(renderer, pmremTextue);\n this._lightSources = lightSourceDetector.lightSources;\n return pmremTextue ?? null;\n }\n\n private _getTextureOffset(): Vector2 {\n const offestU = (this._rotation / (Math.PI * 2)) % 1;\n return new Vector2(offestU, 0);\n }\n\n private _createPmremTexture(renderer: WebGLRenderer): Texture | undefined {\n const pmremGenerator = new EnvironmentPmremGenertor(renderer);\n let pmremRenderTarget: WebGLRenderTarget | undefined;\n if (this.equirectangularTexture) {\n this.equirectangularTexture.offset.copy(this._getTextureOffset());\n pmremRenderTarget = pmremGenerator.fromEquirectangularTexture(\n this.equirectangularTexture,\n {\n rotation: this._rotation,\n intensity: this._intensity,\n }\n );\n } else if (this.cubeTexture) {\n pmremRenderTarget = pmremGenerator.fromCubemap(this.cubeTexture);\n } else if (this.environmentSceneGenerator) {\n const environmentScene = this.environmentSceneGenerator.generateScene(\n this._intensity,\n this._rotation\n );\n pmremRenderTarget = pmremGenerator.fromScene(environmentScene, 0.04);\n }\n this._debugScene = undefined;\n this.needsUpdate = false;\n return pmremRenderTarget?.texture;\n }\n\n private _detectLightSources(\n renderer: WebGLRenderer,\n pmremTexture?: Texture\n ): LightSourceDetector {\n const lightSourceDetector = new LightSourceDetector();\n if (this.equirectangularTexture && this.rotation === 0) {\n lightSourceDetector.detectLightSources(\n renderer,\n this.equirectangularTexture,\n this.textureData\n );\n } else if (pmremTexture) {\n lightSourceDetector.detectLightSources(renderer, pmremTexture);\n }\n return lightSourceDetector;\n }\n\n public createDebugScene(\n renderer: WebGLRenderer,\n scene: Scene,\n maxNoOfLightSources?: number\n ): Scene | null {\n const maxLightSources = maxNoOfLightSources ?? -1;\n if (\n this._debugScene &&\n maxLightSources === this._debugScene.userData.maximumNumberOfLightSources\n ) {\n return this._debugScene;\n }\n this._debugScene = new Scene();\n const planeMaterial = new EnvironmentMapDecodeMaterial(true, false);\n planeMaterial.setSourceTexture(scene.environment as Texture);\n LightSourceDetectorDebug.createPlane(this._debugScene, planeMaterial);\n const lightSourceDetector = this._detectLightSources(\n renderer,\n scene.environment as Texture\n );\n const lightSourceDetectorDebug = new LightSourceDetectorDebug(\n lightSourceDetector\n );\n lightSourceDetectorDebug.createDebugScene(\n this._debugScene,\n maxLightSources\n );\n this._debugScene.userData.maximumNumberOfLightSources = maxLightSources;\n return this._debugScene;\n }\n}\n","import { EnvironmentSceneGenerator } from './environment-definition';\nimport type { BufferGeometry, Material } from 'three';\nimport type { Enumify } from '../../types';\nimport {\n BoxGeometry,\n Color,\n CylinderGeometry,\n Mesh,\n MeshBasicMaterial,\n Scene,\n Vector2,\n} from 'three';\n\nexport const DEFAULT_ENVIRONMENT_SCENE_TYPES = {\n ALL_AROUND: 'all_around',\n FRONT: 'front',\n} as const;\n\nexport type DefaultEnvironmentSceneType = Enumify<\n typeof DEFAULT_ENVIRONMENT_SCENE_TYPES\n> | null;\n\nexport interface DefaultEnvironmentSceneParameters {\n type?: DefaultEnvironmentSceneType;\n lightIntensity?: number;\n topLightIntensity?: number;\n sidLightIntensity?: number;\n ambientLightIntensity?: number;\n colorVariation?: number;\n}\n\nexport class DefaultEnvironmentSceneGenerator extends EnvironmentSceneGenerator {\n private _parameters: DefaultEnvironmentSceneParameters = {};\n\n public constructor(parameters: DefaultEnvironmentSceneParameters = {}) {\n super();\n this._parameters = parameters;\n }\n\n public generateScene(intensity: number, rotation: number): Scene {\n const defaultEnvironmentScene = new DefaultEnvironmentScene({\n ...this._parameters,\n lightIntensity: intensity * (this._parameters.lightIntensity || 1.0),\n topLightIntensity:\n intensity * (this._parameters.topLightIntensity || 1.0),\n sidLightIntensity:\n intensity * (this._parameters.sidLightIntensity || 1.0),\n });\n defaultEnvironmentScene.rotation.y = rotation;\n return defaultEnvironmentScene;\n }\n}\n\nexport class DefaultEnvironmentScene extends Scene {\n private _type: DefaultEnvironmentSceneType;\n private _topLightIntensity: number;\n private _sideLightIntensity: number;\n private _sideReflectorIntensity: number;\n private _ambientLightIntensity: number;\n private _colorVariation: number;\n private _lightGeometry: BufferGeometry;\n private _reflectorLightGeometry: BufferGeometry;\n\n constructor(parameters: DefaultEnvironmentSceneParameters = {}) {\n super();\n this._type = parameters?.type ?? DEFAULT_ENVIRONMENT_SCENE_TYPES.ALL_AROUND;\n this._topLightIntensity =\n parameters?.topLightIntensity || parameters?.lightIntensity || 1.0;\n this._sideLightIntensity =\n parameters?.sidLightIntensity || parameters?.lightIntensity || 1.0;\n this._sideReflectorIntensity =\n parameters?.sidLightIntensity || parameters?.lightIntensity || 1.0;\n const defaultAmbientIntensity =\n this._type === DEFAULT_ENVIRONMENT_SCENE_TYPES.FRONT ? 0.3 : 0;\n this._ambientLightIntensity =\n parameters?.ambientLightIntensity || defaultAmbientIntensity;\n this._colorVariation = parameters?.colorVariation || 0.5;\n this._lightGeometry = new BoxGeometry();\n this._lightGeometry.deleteAttribute('uv');\n this._reflectorLightGeometry = new CylinderGeometry(0.7, 0.4, 2, 32);\n this._reflectorLightGeometry.deleteAttribute('uv');\n this.generateScene(this);\n }\n\n public generateScene(scene: Scene) {\n switch (this._type) {\n default:\n case DEFAULT_ENVIRONMENT_SCENE_TYPES.ALL_AROUND:\n this._createAllAroundSceneLight(scene);\n break;\n case DEFAULT_ENVIRONMENT_SCENE_TYPES.FRONT:\n this._createFrontSceneLight(scene);\n break;\n }\n }\n\n dispose() {\n const resources = new Set();\n this.traverse((object: any) => {\n if (object.isMesh) {\n resources.add(object.geometry);\n resources.add(object.material);\n }\n });\n for (const resource of resources) {\n (resource as BufferGeometry | Material).dispose();\n }\n }\n\n private _createAllAroundSceneLight(scene: Scene) {\n const ali = this._ambientLightIntensity;\n this.background = new Color(ali, ali, ali);\n this._createTopLight(scene, 6, 1);\n for (let i = 0; i < 6; i++) {\n const azimuthAngleInRad = (i * Math.PI * 2.0) / 6.0;\n const x = Math.sin(azimuthAngleInRad);\n const z = Math.cos(azimuthAngleInRad);\n if (i % 2 === 0) {\n this._createReflector(scene, new Vector2(x, z), 3, 1, 0.8, 0.2);\n } else {\n this._createSideLight(\n scene,\n new Vector2(x, z),\n (i - 1) / 2,\n 15,\n 1.1,\n 0.33,\n 1\n );\n }\n }\n }\n\n private _createFrontSceneLight(scene: Scene) {\n const ali = this._ambientLightIntensity;\n this.background = new Color(ali, ali, ali);\n this._createTopLight(scene, 6, 0.7);\n for (let i = 0; i < 6; i++) {\n const azimuthAngleInRad = (i * Math.PI * 2.0) / 6.0;\n const x = Math.sin(azimuthAngleInRad);\n const z = Math.cos(azimuthAngleInRad);\n if (i === 0) {\n this._createReflector(scene, new Vector2(x, z), 1.1, 0.6, 0.8, -0.4);\n for (let j = 0; j < 2; j++) {\n const tangentialAngleInRad =\n ((i - 0.3 + j * 0.6) * Math.PI * 2.0) / 6.0;\n const x0 = Math.sin(tangentialAngleInRad);\n const z0 = Math.cos(tangentialAngleInRad);\n this._createSideLight(\n scene,\n new Vector2(x0, z0),\n (i - 1) / 2,\n 50,\n 1.2,\n 0.7,\n 0.8\n );\n }\n } else {\n this._createReflector(scene, new Vector2(x, z), 1.1, 0.7, 1.4, 0);\n }\n }\n }\n\n private _createAreaLightMaterial(r: number, g?: number, b?: number) {\n const material = new MeshBasicMaterial();\n material.color.set(r, g ?? r, b ?? r);\n return material;\n }\n\n private _createTopLight(scene: Scene, intensity: number, scale: number) {\n const topLight = new Mesh(\n this._lightGeometry,\n this._createAreaLightMaterial(intensity * this._topLightIntensity)\n );\n topLight.position.set(0.0, 20.0, 0.0);\n topLight.scale.set(5 * scale, 0.1, 5 * scale);\n scene.add(topLight);\n }\n\n private _createSideLight(\n scene: Scene,\n direction: Vector2,\n index: number,\n intensity: number,\n scale: number,\n level: number,\n distance: number\n ) {\n for (let j = 0; j < 3; j++) {\n const li = intensity * this._sideLightIntensity;\n const light = new Mesh(\n this._lightGeometry,\n this._createAreaLightMaterial(\n (j + index) % 3 === 0 ? li : li * (1.0 - this._colorVariation),\n (j + index) % 3 === 1 ? li : li * (1.0 - this._colorVariation),\n (j + index) % 3 === 2 ? li : li * (1.0 - this._colorVariation)\n )\n );\n const xOffset =\n (j === 1 ? -direction.y : j === 2 ? direction.y : 0) / Math.sqrt(2);\n const yOffset = j === 0 ? 0 : 1;\n const zOffset =\n (j === 1 ? direction.x : j === 2 ? -direction.x : 0) / Math.sqrt(2);\n light.position.set(\n direction.x * distance * 15.0 + xOffset * 1.1 * scale,\n level * 15.0 + yOffset * 1.1 * scale,\n direction.y * distance * 15.0 + zOffset * 1.1 * scale\n );\n light.rotation.set(0, Math.atan2(direction.x, direction.y), 0);\n light.scale.setScalar(scale);\n scene.add(light);\n }\n }\n\n private _createReflector(\n scene: Scene,\n direction: Vector2,\n intensity: number,\n scale: number,\n scaleZ: number,\n level: number\n ) {\n const light = new Mesh(\n this._reflectorLightGeometry,\n this._createAreaLightMaterial(intensity * this._sideReflectorIntensity)\n );\n light.position.set(direction.x * 15.0, 10 * level, direction.y * 15.0);\n light.scale.set(10 * scale, 10 * scaleZ, 10 * scale);\n scene.add(light);\n }\n}\n","import type { InputEvent } from '../input/input-manager';\nimport type InputManager from '../input/input-manager';\nimport { INPUT_EVENT, INPUT_EVENT_TYPE } from '../input/input-manager';\nimport CameraControl, {\n CAMERA_EVENT,\n type CameraParameter,\n} from './camera-control';\nimport type { Position2 } from '../common-interfaces';\nimport { compareBox3Size } from '../utils/threejs-utils';\nimport type { OrthographicOffsetCamera } from '../webgl/roomle-component-factory';\nimport { ZoomChangeEvent } from './camera-control-3d';\nimport type { Box3 } from 'three';\nimport { MathUtils, OrthographicCamera, Vector2, Vector3 } from 'three';\n\nconst enum STATE {\n NONE,\n MOVE,\n}\n\nconst ZOOM_SPEED = 2;\nconst MAX_ZOOM = 5;\nconst MIN_ZOOM = 0.1;\nconst TOUCH_PANNING_SPEED = 1.1;\nexport default class CameraControl2D extends CameraControl {\n private _camera: OrthographicOffsetCamera;\n private _scale = 1;\n private _cameraZoom: number = 1;\n private _state: STATE = STATE.NONE;\n private _size: number = 5;\n\n private _lastPosition: Vector2 = new Vector2();\n private _zoomPosition: Vector3 = new Vector3();\n private _lastZoom: number = 0;\n private _wasZooming: boolean = false;\n\n private _zoomSpeed: number = Math.pow(0.95, ZOOM_SPEED);\n\n constructor(\n creator: string,\n inputManager: InputManager,\n initialCameraParameters?: CameraParameter,\n camera?: OrthographicOffsetCamera\n ) {\n super(creator, inputManager, initialCameraParameters);\n if (!camera) {\n this._initCamera(\n initialCameraParameters\n ? new Vector3(\n initialCameraParameters.targetX,\n 10,\n initialCameraParameters.targetZ\n )\n : new Vector3(0, 10, 0)\n );\n } else {\n this._camera = camera;\n this._cameraPosition = new Vector3().copy(this._camera.position);\n }\n this._lerpEnabled = false;\n }\n\n protected _getCamera(): OrthographicOffsetCamera {\n if (this._camera) {\n return this._camera;\n }\n\n this._initCamera(new Vector3(0, 10, 0));\n\n return this._camera;\n }\n\n private _initCamera(initialCameraPosition?: Vector3) {\n let { x, y } = this._domHelper.getClientDimensions();\n let aspectRatio = x / y || 1;\n let frustumWidth = aspectRatio * this._size;\n let frustumHeight = this._size;\n this._camera = new OrthographicCamera(\n frustumWidth / -2,\n frustumWidth / 2,\n frustumHeight / 2,\n frustumHeight / -2,\n 1,\n 1000\n ) as OrthographicOffsetCamera;\n this._camera.position.copy(initialCameraPosition);\n this._cameraPosition = initialCameraPosition;\n this._camera.lookAt(new Vector3(0, 0, 0));\n }\n\n public updateCamera(): void {\n let aspectRatio = this._domHelper.getAspectRatio();\n let frustumWidth = aspectRatio * this._size;\n let frustumHeight = this._size;\n\n this._camera.left = frustumWidth / -2;\n this._camera.right = frustumWidth / 2;\n this._camera.top = frustumHeight / 2;\n this._camera.bottom = frustumHeight / -2;\n this._camera.updateProjectionMatrix();\n }\n\n protected _initInputListener() {\n this._inputListeners.push({\n key: INPUT_EVENT.DOWN,\n fun: (event: InputEvent) => {\n if (this._locked) {\n return;\n }\n this._state = STATE.MOVE;\n this._lastPosition.set(\n event.positionRelative.x,\n event.positionRelative.y\n );\n this.dispatchEvent(CAMERA_EVENT.ORBIT_START);\n },\n });\n this._inputListeners.push({\n key: INPUT_EVENT.MOVE,\n fun: (event: InputEvent) => {\n if (\n this._lastPosition.x === event.positionRelative.x &&\n this._lastPosition.y === event.positionRelative.y\n ) {\n return;\n }\n if (this._state === STATE.MOVE && !this._locked) {\n this._move(\n new Vector2(event.positionRelative.x, event.positionRelative.y),\n event.type\n );\n\n this.dispatchEvent(CAMERA_EVENT.ORBIT_MOVE);\n }\n },\n });\n this._inputListeners.push({\n key: INPUT_EVENT.UP,\n fun: (_event: InputEvent) => {\n if (this._state === STATE.MOVE) {\n this.dispatchEvent(CAMERA_EVENT.ORBIT_END);\n }\n this._state = STATE.NONE;\n },\n });\n this._inputListeners.push({\n key: INPUT_EVENT.ZOOM_IN,\n fun: (event: InputEvent) => {\n if (event.event) {\n event.event.stopPropagation();\n event.event.preventDefault();\n }\n this.dispatchEvent(CAMERA_EVENT.ZOOM_IN);\n this._scale /= this._zoomSpeed;\n this._zoomTo(event.positionRelative);\n this._update();\n },\n });\n this._inputListeners.push({\n key: INPUT_EVENT.ZOOM_OUT,\n fun: (event: InputEvent) => {\n if (event.event) {\n event.event.stopPropagation();\n event.event.preventDefault();\n }\n this.dispatchEvent(CAMERA_EVENT.ZOOM_OUT);\n this._scale *= this._zoomSpeed;\n this._zoomTo(event.positionRelative);\n this._update();\n },\n });\n }\n\n private _zoomTo(position: Position2) {\n if (Date.now() - this._lastZoom > 200) {\n let zoomPos = new Vector3(position.x, position.y, 0);\n zoomPos.unproject(this._camera);\n this._zoomPosition.copy(zoomPos);\n }\n this._lastZoom = Date.now();\n }\n\n private _move(position: Vector2, type: INPUT_EVENT_TYPE) {\n // event.positionRelative is a coordinate in normalized device space [-1.0, 1.0]\n // unproject(this._camera) uses the OrthographicCamera to convert form normalized device space to world space\n let delta = new Vector3();\n let prevPos = new Vector3(this._lastPosition.x, this._lastPosition.y, 0);\n let newPos = new Vector3(position.x, position.y, 0);\n prevPos.unproject(this._camera);\n newPos.unproject(this._camera);\n delta.subVectors(newPos, prevPos);\n\n this._cameraPosition.x -=\n delta.x * (type === INPUT_EVENT_TYPE.TOUCH ? TOUCH_PANNING_SPEED : 1);\n this._cameraPosition.z -=\n delta.z * (type === INPUT_EVENT_TYPE.TOUCH ? TOUCH_PANNING_SPEED : 1);\n\n this._lastPosition.copy(position);\n }\n\n public zoomToFitBounds(\n bounds: Box3,\n zoomInAllowed: boolean,\n force?: boolean\n ) {\n if (compareBox3Size(bounds, this._boundingBox) < 0 && !force) {\n this.setBounds(bounds);\n return;\n }\n this.setBounds(bounds);\n const size = bounds.getSize(new Vector3());\n const center = bounds.getCenter(new Vector3());\n\n const widthRatio = size.x / -2 / this._camera.left;\n const heightRatio = size.z / -2 / this._camera.bottom;\n const ratio = Math.max(widthRatio, heightRatio);\n const newZoom = 1 / ratio;\n\n // only update camera when camera is not already zoomed out\n if (newZoom < this._cameraZoom || zoomInAllowed) {\n this._scale = newZoom;\n this._cameraZoom = newZoom;\n this._cameraPosition.x = center.x;\n this._cameraPosition.z = center.z;\n }\n }\n\n //override\n protected _update(\n _overrideTarget?: Vector3,\n _ignoreChecks?: boolean | undefined,\n _keepVariables?: boolean | undefined\n ) {\n this._scale = Math.min(this._scale, MAX_ZOOM);\n this._scale = Math.max(this._scale, MIN_ZOOM);\n\n // When zooming in on a point or zooming out on a point, the camera position must be moved\n // along the line defined by the camera position and the zoom position\n // The distance the camera position needs to be moved depends\n // on the distance between these points and the relative scale:\n // d = (ZP - CP) * (new_zoom - old_zoom) / new_zoom\n let deltaPosition = new Vector3()\n .subVectors(this._zoomPosition, this._cameraPosition)\n .multiplyScalar((this._scale - this._cameraZoom) / this._scale);\n this._cameraPosition.x += deltaPosition.x;\n this._cameraPosition.z += deltaPosition.z;\n\n if (this._cameraZoom !== this._scale) {\n this.dispatchEvent(\n CAMERA_EVENT.ZOOM_CHANGE,\n new ZoomChangeEvent(this._scale === MIN_ZOOM, this._scale === MAX_ZOOM)\n );\n }\n this._cameraZoom = this._scale;\n this._camera.updateProjectionMatrix();\n }\n\n public animateCamera(delta: number): boolean {\n const isZooming = Math.abs(this._cameraZoom - this._camera.zoom) > 0.01;\n this._lerpEnabled = isZooming;\n if (isZooming) {\n this._wasZooming = true;\n }\n\n if (this._wasZooming && !isZooming) {\n setTimeout(() => this._dispatchCameraIdle(), 16);\n this._wasZooming = false;\n }\n\n if (!super.animateCamera(delta) && !isZooming) {\n return false;\n }\n this._lerpEnabled = false;\n const lerpFactor = Math.min(delta * 10, 1);\n this._camera.zoom = MathUtils.lerp(\n this._camera.zoom,\n this._cameraZoom,\n lerpFactor\n );\n return true;\n }\n\n public getKernelZoomFactor(): number {\n const sceneSizeMM = (this._camera.right - this._camera.left) * 1000;\n const zoomFactor =\n (this._domHelper.element.clientWidth / sceneSizeMM) * this._camera.zoom;\n return zoomFactor;\n }\n}\n","import type { CanvasOffset } from '../common-interfaces';\nimport type DomHelper from '../utils/dom-helper';\nimport inject from '../di/inject';\nimport CameraControl3D from '../cameracontrol/camera-control-3d';\nimport type InputManager from '../input/input-manager';\nimport { INPUT_EVENT } from '../input/input-manager';\nimport type { GUI, GUIController } from 'dat.gui';\nimport { dispose, getGUI, patchLighting } from '../utils/threejs-utils';\nimport type ScriptLoader from '../script-loader';\nimport {\n CAMERA_EVENT,\n type CameraParameter,\n} from '../cameracontrol/camera-control';\nimport type LightSetting from '../lightsetting/light-setting';\nimport {\n type CAMERA_TYPE,\n sanitizedCameraMode,\n} from '../cameracontrol/camera-type';\nimport type StatsHelper from '../utils/stats-helper';\nimport type { Context } from '../di/context';\nimport type { default as StaticItemLoader } from './static-item-loader';\nimport { STATIC_ITEM_TYPE } from './static-item-loader';\nimport { WINDOW_EVENT } from '../utils/shims';\nimport CameraControlFirstPerson from '../../../planner-core/src/camera-control/camera-control-first-person';\nimport type { SceneSettings } from '../scene-settings-loader';\nimport DynamicEnvironmentSettingLoader from '../environment/dynamic-environment-setting-loader';\nimport DynamicLightSetting from '../lightsetting/dynamic-light-setting';\nimport type Environment from '../environment/environment';\nimport type { DynamicLightSettingSource } from '../lightsetting/dynamic-light-setting-loader';\nimport DynamicLightSettingLoader from '../lightsetting/dynamic-light-setting-loader';\nimport type InitData from '../utils/init-data';\nimport {\n DEFAULT_ENV_MAP_INTENSITY,\n DEFAULT_ENV_MAP_ROTATION,\n} from '../utils/init-data';\nimport type {\n OrthographicOffsetCamera,\n PerspectiveOffsetCamera,\n} from './roomle-component-factory';\nimport RoomleComponentFactoryInitializer from './roomle-component-factory';\nimport type PluginSystem from '../../../configurator-core/src/webgl/plugin-system';\nimport BackgroundEnvironment from '../environment/background-environment';\nimport type { Enumify } from '../types';\nimport { download } from '../utils/common-utils';\nimport type { ColorRepresentation, Object3D } from 'three';\nimport { ShaderChunk } from 'three';\nimport {\n type Box3,\n Clock,\n Color,\n MeshBasicMaterial,\n PCFSoftShadowMap,\n PerspectiveCamera,\n Scene,\n SRGBColorSpace,\n Vector3,\n WebGLRenderer,\n} from 'three';\nimport { lutImages, RoomleWebGLRenderer } from './roomle-webgl-renderer';\nimport { standaloneConfiguratorQualityLevels } from './roomle-webgl-renderer-quality-levels';\nimport GroundProjectedEnvironment from '../environment/ground-projected-environment';\nimport { EnvironmentDefinition } from './renderer/environment-definition';\nimport { DefaultEnvironmentSceneGenerator } from './renderer/environment-scene';\nimport {\n ENV_HDR_1K_FILE_NAME,\n ENV_HDR_256_FILE_NAME,\n ENV_LEGACY,\n} from '../static-files/environment-maps';\nimport type ImageRenderer from './image-renderer';\nimport type LifeCycleManager from '../life-cycle-manager';\nimport { type LifeCycleCallbacks } from '../life-cycle-manager';\nimport type HdrEnvironmentLoader from '../services/hdr-environment-loader';\nimport { type EnvironmentMapResult } from '../services/hdr-environment-loader';\nimport type IdbManager from '../services/idb-manager';\nimport type CameraBehaviourState from '../cameracontrol/camera-behaviour-state';\nimport type CameraBehaviour from '../cameracontrol/camera-behaviour';\nimport type { Nullable } from '../../../typings/helper';\nimport type GlobalInitData from '../utils/global-init-data';\nimport type { GlobalCallback } from '../services/global-callback';\nimport CameraControl2D from '../cameracontrol/camera-control-2d';\nimport { type QualityLevel } from './renderer/scene-renderer';\n\nconst STANDBY_AFTER = 3000;\nexport const INTERIOR_LIGHTS_ENV_MAP_INTENSITY = 0.35;\nexport const INTERIOR_LIGHTS_ENV_MAP_ROTATION = 1.16;\n\nexport default abstract class SceneManager\n implements Context, LifeCycleCallbacks, EventListenerObject\n{\n public _creator_: string;\n\n @inject\n protected _domHelper: DomHelper;\n\n @inject\n protected _scriptLoader: ScriptLoader;\n\n @inject\n private _lifeCycleManager: LifeCycleManager;\n\n @inject\n private _staticItemLoader: StaticItemLoader;\n\n @inject\n protected _hdrEnvironmentLoader: HdrEnvironmentLoader;\n\n @inject\n protected _initData: InitData;\n\n @inject\n protected _globalInitData: GlobalInitData;\n\n @inject\n protected _globalCallback: GlobalCallback;\n\n @inject\n protected _idbManager: IdbManager;\n\n @inject\n protected _pluginSystem: PluginSystem;\n\n @inject\n protected _imageRenderer: ImageRenderer;\n\n @inject\n protected _cameraBehaviourState: CameraBehaviourState;\n\n private _cameraControl3D: CameraControl3D;\n private _cameraControl2D: CameraControl2D;\n private _cameraControlFirstPerson: CameraControlFirstPerson;\n\n protected _scene: Scene;\n protected _uiScene: Scene;\n private _depthWriteMaterial: MeshBasicMaterial = new MeshBasicMaterial({\n colorWrite: false,\n });\n private _cameraBehaviour: CameraBehaviour;\n\n protected _lightSetting: LightSetting;\n protected _environment: Environment;\n protected _maxAnisotropy = 1;\n\n protected _renderer: WebGLRenderer;\n private _clock = new Clock();\n private _delta: number = 0;\n protected _renderLoopFunction: () => void;\n protected _renderListener: () => void = null;\n protected _stopRendering = false;\n protected _roomleRenderer: Nullable<RoomleWebGLRenderer> = null;\n\n private _forceRender: boolean = false;\n\n private _lastChange = Date.now();\n private _running = false;\n\n private _statsHelper: StatsHelper;\n private _canvasID: string;\n\n protected _isInteriorLightActive: boolean = false;\n\n protected _perspectiveOffsetCamera: PerspectiveOffsetCamera = null;\n protected _orthographicOffsetCamera: OrthographicOffsetCamera = null;\n\n protected abstract createCameraControl(\n mode: Enumify<typeof CAMERA_TYPE>,\n offset: CanvasOffset,\n ): void;\n\n protected abstract _getInputManager(): InputManager;\n\n protected get cameraBehaviour(): CameraBehaviour {\n return this._cameraBehaviour;\n }\n\n public abstract sceneChanged(): void;\n\n public abstract getBounds(): Box3;\n\n public abstract getGeometryBounds(): Box3;\n\n protected onBeforeRender(): void {\n // can be overridden by child classes\n }\n\n protected _onAfterRender: () => void = () => {\n //set when needed\n };\n\n protected constructor(\n creator: string,\n offset: CanvasOffset,\n canvasID: string,\n mode: Enumify<typeof CAMERA_TYPE>,\n ) {\n this._creator_ = creator;\n this._canvasID = canvasID;\n\n this._renderListener = () => {\n this._requestRender();\n };\n\n this.createCameraControl(sanitizedCameraMode(mode), offset);\n this._setupScene(offset, this._initData.transparentBackground);\n\n this._lifeCycleManager.addEventListener(this);\n }\n\n public addEventListener(_listener: LifeCycleCallbacks): void {\n throw new Error('Method not implemented.');\n }\n\n public removeEventListener(_listener: LifeCycleCallbacks): void {\n throw new Error('Method not implemented.');\n }\n\n protected _changeCameraBehaviour(cameraBehaviour: CameraBehaviour) {\n if (this._cameraBehaviour) {\n if (\n this.cameraBehaviour.cameraControl instanceof CameraControlFirstPerson\n ) {\n this._getInputManager().removeEventListener(\n INPUT_EVENT.ZOOM_IN,\n this._renderListener,\n );\n this._getInputManager().removeEventListener(\n INPUT_EVENT.ZOOM_OUT,\n this._renderListener,\n );\n }\n this._cameraBehaviour.cameraControl.cleanUp();\n }\n\n this._cameraBehaviour = cameraBehaviour;\n this._cameraBehaviour.cameraControl.setUp();\n this._cameraBehaviour.setCameraChangeListener(\n this.onCameraChanged.bind(this),\n );\n\n if (cameraBehaviour.cameraControl instanceof CameraControlFirstPerson) {\n this._getInputManager().addEventListener(\n INPUT_EVENT.ZOOM_IN,\n this._renderListener,\n this,\n );\n this._getInputManager().addEventListener(\n INPUT_EVENT.ZOOM_OUT,\n this._renderListener,\n this,\n );\n }\n this.cameraBehaviourChanged();\n }\n\n protected onCameraChanged() {\n // override me if needed\n }\n\n public cameraBehaviourChanged() {\n if (this.cameraBehaviour.cameraControl instanceof CameraControl3D) {\n this.cameraBehaviour.cameraControl.updateDistanceAndRangesBasedOnBounds(\n this.getBounds(),\n );\n }\n }\n\n protected _addCameraControlListener() {\n this.cameraBehaviour.cameraControl.addEventListener(\n CAMERA_EVENT.ORBIT_START,\n () => {\n this._roomleRenderer?.movingCameraStarts();\n this._requestRender();\n },\n this,\n );\n this.cameraBehaviour.cameraControl.addEventListener(\n CAMERA_EVENT.ORBIT_MOVE,\n this._requestRender,\n this,\n );\n this.cameraBehaviour.cameraControl.addEventListener(\n CAMERA_EVENT.ORBIT_END,\n () => {\n this._roomleRenderer?.movingCameraStops();\n this._requestRender();\n },\n this,\n );\n this.cameraBehaviour.cameraControl.addEventListener(\n CAMERA_EVENT.KEYBOARD_PRESSED,\n this._requestRender,\n this,\n );\n }\n\n /**\n * Start render loop and update everything (AA, AO, Shadows, etc)\n * @private\n */\n protected _renderEverything() {\n if (this._roomleRenderer) {\n this._forceRender = true;\n this._roomleRenderer.forceShadowUpdates(false);\n }\n this._requestRender();\n }\n\n /**\n * Start render loop and render the scene but keep shadows and AO, needed for material changes\n * @private\n */\n protected _renderWithoutShadowsAndAO() {\n if (this._roomleRenderer) {\n this._forceRender = true;\n }\n this._requestRender();\n }\n\n protected _requestRender() {\n if (!this._renderer || this._stopRendering) {\n return;\n }\n\n const render = () => {\n this._delta = this._clock.getDelta();\n this._animateCamera();\n this.cameraBehaviour.cameraControl.getCamera().layers.mask = 0xffff;\n\n if (this._renderLoopFunction) {\n this._renderLoopFunction();\n this._renderLoopFunction = null;\n }\n\n this.onBeforeRender();\n if (this._globalInitData.e2e && window.TWEEN) {\n const allTweens = window.TWEEN.getAll();\n for (const tween of allTweens) {\n tween.end();\n }\n }\n if (this._roomleRenderer) {\n this._statsHelper?.updateRenderInfo(this._roomleRenderer.renderer.info);\n this._roomleRenderer.render(\n this._scene,\n this.cameraBehaviour.cameraControl.getCamera(),\n );\n this._forceRender = false;\n\n if (this._shouldRenderUi()) {\n this._renderUi();\n }\n } else {\n this._statsHelper?.updateRenderInfo(this._renderer.info);\n const camera = this.cameraBehaviour.cameraControl.getCamera();\n // as discussed with Gernot we would need to update the matrix world and projection matrix\n // only when relevant properties change, but since we do not know this (e.g.: near, far etc\n // are changed constantly during load) we are on the safe side when we update it every frame\n camera.updateMatrixWorld();\n camera.updateProjectionMatrix();\n this._renderer.render(this._scene, camera);\n }\n\n this._onAfterRender();\n\n window.TWEEN?.update();\n\n if (\n this._lastChange + STANDBY_AFTER < Date.now() ||\n this._stopRendering\n ) {\n this._running = false;\n } else {\n this._running = true;\n requestAnimationFrame(render);\n }\n };\n\n this._lastChange = Date.now();\n if (!this._running && !this._stopRendering) {\n this._running = true;\n requestAnimationFrame(render);\n }\n }\n\n protected _shouldRenderUi() {\n return this._pluginSystem?.needsUiScene();\n }\n\n private _renderUi() {\n // Render scene depth for depth compare\n const background = this._scene.background\n ? this._scene.background.clone()\n : null;\n this._scene.overrideMaterial = this._depthWriteMaterial;\n this._scene.background = null;\n this._renderer.render(\n this._scene,\n this.cameraBehaviour.cameraControl.getCamera(),\n );\n this._scene.overrideMaterial = null;\n\n const oldAutoClear = this._renderer.autoClear;\n this._renderer.autoClear = false;\n\n this._renderer.clearDepth();\n\n this._renderer.render(\n this._uiScene,\n this.cameraBehaviour.cameraControl.getCamera(),\n );\n this._renderer.autoClear = oldAutoClear;\n this._scene.background = background;\n }\n\n private _animateCamera() {\n if (this.cameraBehaviour.cameraControl) {\n if (\n !(\n !this.cameraBehaviour.cameraControl.animateCamera(this._delta) &&\n this.shouldClearShadowsAndAO() &&\n !this._forceRender\n )\n ) {\n if (\n this._lightSetting instanceof DynamicLightSetting &&\n this.cameraBehaviour.cameraControl.getCamera() instanceof\n PerspectiveCamera\n ) {\n this._lightSetting.update(\n this.cameraBehaviour.cameraControl.getCamera() as PerspectiveCamera,\n this.cameraBehaviour.cameraControl.getTargetPosition(),\n );\n }\n }\n }\n\n //set background rotation based on camera rotation\n if (\n this._environment &&\n this._environment.needsCamera() &&\n this.cameraBehaviour.cameraControl instanceof CameraControl3D\n ) {\n this._environment.updateCamera(\n this.cameraBehaviour.cameraControl.getCamera() as PerspectiveCamera,\n );\n }\n }\n\n protected shouldClearShadowsAndAO() {\n return false;\n }\n\n protected _setupScene(_offset?: CanvasOffset, transparent?: boolean) {\n if (this._initData.featureFlags.interiorLights) {\n patchLighting(ShaderChunk);\n }\n const { x, y } = this._domHelper.getClientDimensions();\n this._scene = new Scene();\n this._uiScene = new Scene();\n transparent = transparent ? transparent : false;\n if (!transparent) {\n this._scene.background = this._initData.colors.DEFAULT_BACKGROUND;\n }\n\n this._renderer = new WebGLRenderer({\n antialias: !this._globalInitData.e2e,\n alpha: true,\n });\n if (this._initData?.debug !== true && this._renderer?.debug !== undefined) {\n this._renderer.debug.checkShaderErrors = false;\n }\n // lock max dpr to 1.5 (nearly no visual difference to 2) expect auto quality is turned off\n const dpr = this._initData.autoQuality\n ? Math.min(window.devicePixelRatio, 1.5)\n : window.devicePixelRatio;\n this._renderer.setPixelRatio(dpr);\n this._renderer.setSize(x, y);\n this._renderer.outputColorSpace = SRGBColorSpace;\n this._renderer.autoClear = false;\n this._renderer.shadowMap.enabled = true;\n this._renderer.shadowMap.type = PCFSoftShadowMap;\n\n this._maxAnisotropy = this._renderer.capabilities.getMaxAnisotropy();\n\n if (!this._globalInitData.e2e) {\n this._roomleRenderer = new RoomleWebGLRenderer(\n this._renderer,\n x,\n y,\n this._initData.linearAoFilter ?? false,\n );\n if (this._initData.debug) {\n this._roomleRenderer.sceneRenderer.loadLutImages(lutImages);\n }\n this._roomleRenderer.setQualityMap(standaloneConfiguratorQualityLevels);\n this._roomleRenderer.setAutoQuality(this._initData.autoQuality);\n this._roomleRenderer.setShadingType(this._initData.shading);\n this._roomleRenderer.setCustomShadingParameters(\n this._initData.customShading,\n this._initData.customShadingMoc,\n );\n this._roomleRenderer?.setSize(x, y);\n\n this._roomleRenderer.sceneRenderer.outlineRenderer.parameters.hiddenEdgeColor =\n this._initData.colors.SELECTION.getHex();\n this._roomleRenderer.sceneRenderer.outlineRenderer.parameters.visibleEdgeColor =\n this._initData.colors.SELECTION.getHex();\n this._roomleRenderer.sceneRenderer.outlineRenderer.applyParameters();\n }\n\n this._renderer.domElement.classList.add(this._canvasID);\n this._domHelper.element?.appendChild(this._renderer.domElement);\n this._getInputManager().addEvents(this._renderer.domElement);\n\n this._hdrEnvironmentLoader.registerEnvironmentChangedCallback((maps) => {\n this._setEnvMap(maps);\n });\n if (this._initData.legacyLight) {\n this.loadEnvMap(ENV_LEGACY);\n } else if (this._initData.sceneLight) {\n this._setDefaultEnvironmentScene();\n } else {\n this.loadEnvMap(this._initData.envMapUrl);\n }\n\n this._requestRender();\n\n window.addEventListener(WINDOW_EVENT.RESIZE, this, false);\n window.addEventListener(WINDOW_EVENT.KEY_DOWN, this, false);\n window.addEventListener(WINDOW_EVENT.KEY_UP, this, false);\n document.addEventListener(WINDOW_EVENT.VISIBILITY_CHANGE, this);\n\n this._pluginSystem.init(\n this._scene,\n this._uiScene,\n this.cameraBehaviour.cameraControl.getCamera().position,\n );\n\n this._addCameraControlListener();\n\n this.sceneChanged();\n }\n\n public async loadEnvMap(url: string) {\n await this._hdrEnvironmentLoader.loadUrl(this._renderer, url);\n }\n\n private _getEnvMapIntensityAndRotation() {\n let intensity = this._initData.envMapIntensity;\n let rotation = this._initData.envMapRotation;\n if (\n intensity === DEFAULT_ENV_MAP_INTENSITY &&\n this._isInteriorLightActive\n ) {\n intensity = INTERIOR_LIGHTS_ENV_MAP_INTENSITY;\n }\n\n if (rotation === DEFAULT_ENV_MAP_ROTATION && this._isInteriorLightActive) {\n rotation = INTERIOR_LIGHTS_ENV_MAP_ROTATION;\n }\n\n return { intensity, rotation };\n }\n\n protected _setDefaultEnvironmentScene() {\n const type = this._initData.sceneLight;\n const { intensity, rotation } = this._getEnvMapIntensityAndRotation();\n this._scene.userData.environmentDefinition = new EnvironmentDefinition(\n new DefaultEnvironmentSceneGenerator({ type }),\n {\n rotation,\n intensity,\n maxNoOfLightSources: this._initData.maxLightSources,\n },\n );\n this._scene.userData.shadowFromEnvironment = true;\n this._requestRender();\n }\n\n private _setEnvMap(maps: EnvironmentMapResult) {\n const { url, environmentMap } = maps;\n const { intensity, rotation } = this._getEnvMapIntensityAndRotation();\n\n this._scene.environment = environmentMap;\n this._scene.userData.environmentDefinition = new EnvironmentDefinition(\n environmentMap,\n {\n rotation,\n intensity: this._initData.legacyLight ? 0.9 : intensity,\n maxNoOfLightSources: this._initData.maxLightSources,\n },\n );\n this._scene.userData.shadowFromEnvironment = !this._initData.legacyLight;\n if (this._environment instanceof GroundProjectedEnvironment) {\n this._environment.updateEnvironmentTexture(environmentMap);\n }\n if (url === ENV_HDR_256_FILE_NAME && !this._globalInitData.e2e) {\n (window as any).requestIdleCallback(\n this.loadEnvMap.bind(this, ENV_HDR_1K_FILE_NAME),\n );\n }\n this._requestRender();\n }\n\n private _tabVisible() {\n this.updateCamera(false);\n }\n\n private _releaseKeystrokeStates() {\n const keysToRelease = ['Shift', 'Meta', 'Control', 'Escape'];\n for (const key of keysToRelease) {\n const event = new KeyboardEvent('keyup', { key });\n this._onKeyUp(event, true);\n }\n }\n\n public updateCamera(_changeCamera: boolean = true) {\n const { x, y } = this._domHelper.getClientDimensions();\n this._roomleRenderer?.setSize(x, y);\n this.cameraBehaviour.cameraControl.updateCamera();\n this._renderEverything();\n }\n\n private _onWindowResize() {\n const inputManager = this._getInputManager();\n if (inputManager) {\n inputManager.updateSize();\n }\n this.updateCamera();\n\n this._requestRender();\n }\n\n protected _isPartOfScene(object: Object3D): boolean {\n return (\n object.type === 'Object3D' ||\n object.type === 'Mesh' ||\n object.type === STATIC_ITEM_TYPE.GLB ||\n object.type === STATIC_ITEM_TYPE.GLTF ||\n object.type === 'Group'\n ); // && (object.name !== 'Sky' && object.name !== 'Sunsphere' && object.name !== 'Ground');\n }\n\n public cleanUp() {\n this._getInputManager().removeEventListener(\n INPUT_EVENT.ZOOM_IN,\n this._renderListener,\n );\n this._getInputManager().removeEventListener(\n INPUT_EVENT.ZOOM_OUT,\n this._renderListener,\n );\n if (this.cameraBehaviour.cameraControl) {\n this.cameraBehaviour.cameraControl.cleanUp();\n }\n this._stopRendering = true;\n }\n\n public clearScene() {\n let removals: any[] = [];\n this._scene.children.forEach((child) => {\n if (this._isPartOfScene(child)) {\n removals.push(child);\n }\n });\n removals.forEach((item) => {\n dispose(item);\n this._scene.remove(item);\n });\n this._renderer.renderLists.dispose();\n }\n\n public enableHD(source?: DynamicLightSettingSource) {\n if (this._renderer.capabilities.maxTextures > 8 && source) {\n this.loadDynamicLightSetting(source);\n }\n this._requestRender();\n }\n\n protected _loadGLTF(\n gltfJSON: string,\n position?: Vector3,\n rotation?: number,\n size?: Vector3,\n scale?: Vector3,\n color?: number,\n callback?: (percent: number) => void,\n ): Promise<Object3D> {\n return new Promise<Object3D>((resolve, reject) => {\n this._staticItemLoader\n .loadGLTF(\n gltfJSON,\n position,\n rotation,\n size,\n scale,\n color,\n null,\n callback,\n )\n .then((object) => {\n resolve(object.scene);\n }, reject);\n });\n }\n\n protected _loadGLB(\n url: string,\n position?: Vector3,\n rotation?: number,\n size?: Vector3,\n scale?: Vector3,\n color?: number,\n colorable?: boolean,\n callback?: (percent: number) => void,\n ): Promise<Object3D> {\n return new Promise<Object3D>((resolve, reject) => {\n this._staticItemLoader\n .loadGLB(\n url,\n position,\n rotation,\n size,\n scale,\n color,\n colorable,\n callback,\n )\n .then((object) => {\n resolve(object.scene);\n }, reject);\n });\n }\n\n public showGUI() {\n if (this._initData.disableDebugGUI) {\n return;\n }\n const guiStyle = document.createElement('style');\n guiStyle.innerText =\n '.dg.main{position:absolute;z-index:999;top:0;left:0;}';\n document.head.appendChild(guiStyle);\n let gui = getGUI(false);\n if (!gui) {\n return;\n }\n const element = this._domHelper.element;\n element.appendChild(gui.domElement);\n gui.domElement.style.zIndex = '999';\n gui.domElement.style.overflowY = 'auto';\n gui.domElement.style.maxHeight =\n this._domHelper.element.clientHeight + 'px';\n this._guiLoaded();\n }\n\n protected _guiLoaded() {\n let gui = getGUI();\n if (!gui) {\n return;\n }\n\n const sceneParams = gui.addFolder('Scene Parameter');\n const params = {\n intensity: this._initData.envMapIntensity,\n rotation: this._initData.envMapRotation,\n };\n sceneParams\n .add<any>(params, 'intensity', 0, 4, 0.01)\n .name('env map intensity')\n .onChange((value) => {\n this.changeEnvironmentMapIntensity(value);\n this._requestRender();\n });\n sceneParams\n .add<any>(params, 'rotation', 0, Math.PI * 2, 0.01)\n .name('env map rotation')\n .onChange((value) => {\n this._scene.userData.environmentDefinition.rotation = value;\n this._requestRender();\n });\n\n if (this._lightSetting) {\n this._lightSetting.showGUI();\n }\n if (this._roomleRenderer) {\n this._roomleRenderer.showGUI(() => this._requestRender());\n }\n if (this._environment) {\n this._environment.showGUI(() => this._requestRender());\n }\n this._addGUIListener(gui);\n }\n\n protected _addGUIListener(gui: GUI) {\n let folders: any = gui.__folders;\n Object.keys(folders).forEach((key1) => {\n let obj = folders[key1];\n if (obj.__folders) {\n Object.keys(obj.__folders).forEach((key2) => {\n let folder: GUI = obj.__folders[key2];\n this._addGUIListener(folder);\n });\n }\n if (obj.__controllers) {\n obj.__controllers.forEach((controller: GUIController) => {\n controller.onFinishChange(() => {\n this._guiParamChanged();\n });\n });\n }\n });\n }\n\n protected _guiParamChanged() {\n this._renderEverything();\n }\n\n public showStats() {\n import('../../../common-core/src/utils/stats-helper').then(\n (statsHelper) => {\n this._statsHelper = new statsHelper.default();\n this._roomleRenderer.setOnQualityLevelChangeCallback(\n (qualityLevel: QualityLevel) => {\n this._statsHelper?.updateQualityInfo(qualityLevel);\n },\n );\n },\n );\n }\n\n protected _onKeyDown(_event: KeyboardEvent) {\n //console.log('key down', event.key);\n }\n\n protected _onKeyUp(_event: KeyboardEvent, _cleanup: boolean = false) {\n //console.log('key up', event.key);\n }\n\n public pause() {\n this._getInputManager().removeEvents(this._renderer.domElement);\n\n window.removeEventListener(WINDOW_EVENT.RESIZE, this, false);\n window.removeEventListener(WINDOW_EVENT.KEY_DOWN, this, false);\n window.removeEventListener(WINDOW_EVENT.KEY_UP, this, false);\n document.removeEventListener(WINDOW_EVENT.VISIBILITY_CHANGE, this);\n }\n\n public resume() {\n this._renderer.domElement.classList.add(this._canvasID);\n this._domHelper.element.appendChild(this._renderer.domElement);\n this._getInputManager().addEvents(this._renderer.domElement);\n\n window.addEventListener(WINDOW_EVENT.RESIZE, this, false);\n window.addEventListener(WINDOW_EVENT.KEY_DOWN, this, false);\n window.addEventListener(WINDOW_EVENT.KEY_UP, this, false);\n document.addEventListener(WINDOW_EVENT.VISIBILITY_CHANGE, this);\n\n this.updateCamera();\n }\n\n public destroy() {\n this.pause();\n this.cleanUp();\n }\n\n public handleEvent(evt: Event): void {\n switch (evt.type) {\n case WINDOW_EVENT.RESIZE:\n this._onWindowResize();\n break;\n case WINDOW_EVENT.KEY_DOWN:\n if (\n evt.target &&\n (evt.target instanceof HTMLInputElement ||\n evt.target instanceof HTMLTextAreaElement)\n ) {\n break;\n }\n this._onKeyDown(evt as KeyboardEvent);\n break;\n case WINDOW_EVENT.KEY_UP:\n if (\n evt.target &&\n (evt.target instanceof HTMLInputElement ||\n evt.target instanceof HTMLTextAreaElement)\n ) {\n break;\n }\n this._onKeyUp(evt as KeyboardEvent);\n break;\n case WINDOW_EVENT.VISIBILITY_CHANGE:\n this._tabVisible();\n // things like multiselect are triggered\n // by keydown events if we don't release the keys\n // keyup will never follow and therefore never be released\n this._releaseKeystrokeStates();\n break;\n }\n }\n\n public async loadSceneSettings(sceneSetting: SceneSettings): Promise<void> {\n let environmentPromise: Promise<void>;\n if (sceneSetting.environment) {\n environmentPromise = new Promise<void>((resolve) => {\n let dynamicEnvironmentSettingLoader =\n new DynamicEnvironmentSettingLoader();\n dynamicEnvironmentSettingLoader\n .load(\n this._scene,\n this._renderer.domElement,\n this._environment,\n sceneSetting,\n this._maxAnisotropy,\n )\n .then((environment) => {\n this._setEnvironment(environment);\n resolve();\n });\n });\n } else {\n environmentPromise = Promise.resolve();\n }\n\n let lightPromise: Promise<void>;\n if (sceneSetting.lights) {\n this._lightSetting = new DynamicLightSetting(\n this._scene,\n this._lightSetting,\n );\n lightPromise = (this._lightSetting as DynamicLightSetting).loadFromObject(\n sceneSetting,\n );\n } else {\n lightPromise = Promise.resolve();\n }\n\n return new Promise((resolve, reject) => {\n Promise.all([environmentPromise, lightPromise]).then(() => {\n this._renderEverything();\n resolve();\n }, reject);\n });\n }\n\n public setBackgroundColor(hex: string) {\n this._setEnvironment(\n new BackgroundEnvironment(\n this._scene,\n this._environment,\n new Color(hex as ColorRepresentation),\n ),\n );\n }\n\n public setBackgroundImage(url: string) {\n this._setEnvironment(\n new BackgroundEnvironment(\n this._scene,\n this._environment,\n null,\n this._renderer.domElement,\n url,\n ),\n );\n }\n\n protected _setEnvironment(environment: Environment) {\n this._environment = environment;\n this._renderEverything();\n }\n\n public async loadDynamicLightSetting(\n source: DynamicLightSettingSource,\n ): Promise<void> {\n this._lightSetting = new DynamicLightSetting(\n this._scene,\n this._lightSetting,\n );\n let changedLight = false;\n if (source.url) {\n await (this._lightSetting as DynamicLightSetting).loadFromURL(source.url);\n changedLight = true;\n } else if (source.json) {\n await (this._lightSetting as DynamicLightSetting).loadFromJSON(\n source.json,\n );\n changedLight = true;\n } else if (source.object) {\n await (this._lightSetting as DynamicLightSetting).loadFromObject(\n source.object,\n );\n changedLight = true;\n } else if (source.ls) {\n const lightSetting =\n DynamicLightSettingLoader.createDynamicLightSettingSource(\n null,\n source.ls,\n );\n await (this._lightSetting as DynamicLightSetting).loadFromURL(\n lightSetting.url,\n );\n changedLight = true;\n }\n if (changedLight) {\n this._requestRender();\n } else {\n throw new Error('No dynamic light setting source set');\n }\n }\n\n public getScene(): Scene {\n return this._scene;\n }\n\n public updateScene() {\n this._updateBounds(this.getBounds(), this.getGeometryBounds());\n this._roomleRenderer?.forceShadowUpdates(true);\n this._renderEverything();\n }\n\n protected _updateBounds(\n bounds: Box3,\n geometryBounds?: Box3,\n geometryChanged = false,\n ) {\n if (!bounds) {\n return;\n }\n const renderBounds = geometryBounds ?? bounds;\n this.updateEnvironment(renderBounds, geometryChanged);\n if (this._lightSetting && this._lightSetting.needsBounds()) {\n this._lightSetting.updateBounds(bounds);\n }\n this._roomleRenderer?.updateBounds(renderBounds);\n this._requestRender();\n\n this._pluginSystem.updateBounds(bounds);\n }\n\n public setCameraOffset(offset: CanvasOffset) {\n const camera = this.cameraBehaviour.cameraControl.getCamera();\n const offsetCamera =\n (camera as OrthographicOffsetCamera) ||\n (camera as PerspectiveOffsetCamera);\n if (offsetCamera?.offset) {\n offsetCamera.offset = offset;\n this._renderEverything();\n } else {\n console.warn('Cannot set offset, current camera does not support it');\n }\n }\n\n public getCameraOffset(): CanvasOffset {\n const camera = this.cameraBehaviour?.cameraControl?.getCamera();\n const offsetCamera =\n (camera as OrthographicOffsetCamera) ||\n (camera as PerspectiveOffsetCamera);\n if (offsetCamera?.offset) {\n return JSON.parse(JSON.stringify(offsetCamera.offset));\n }\n return { left: 0, top: 0, right: 1, bottom: 1 };\n }\n\n public getOrthographicOffsetCamera(): OrthographicOffsetCamera {\n if (!this._orthographicOffsetCamera) {\n const currentOffset = this.getCameraOffset();\n const size = 5;\n let aspectRatio = this._domHelper.getAspectRatio();\n let frustumWidth = aspectRatio * size;\n let frustumHeight = size;\n const componentFactory = RoomleComponentFactoryInitializer();\n this._orthographicOffsetCamera =\n componentFactory.createOrthographicCamera(\n frustumWidth / -2,\n frustumWidth / 2,\n frustumHeight / 2,\n frustumHeight / -2,\n 1,\n 1000,\n currentOffset,\n ) as OrthographicOffsetCamera;\n this._orthographicOffsetCamera.position.set(0, 10, 0);\n this._orthographicOffsetCamera.lookAt(new Vector3(0, 0, 0));\n }\n return this._orthographicOffsetCamera;\n }\n\n protected getPerspectiveOffsetCamera(): PerspectiveOffsetCamera {\n if (!this._perspectiveOffsetCamera) {\n const currentOffset = this.getCameraOffset();\n const clientDimensions = this._domHelper.getClientDimensions();\n const width = clientDimensions.x;\n const height = clientDimensions.y;\n const componentFactory = RoomleComponentFactoryInitializer();\n this._perspectiveOffsetCamera = componentFactory.createPerspectiveCamera(\n 30,\n width / height,\n 0.1,\n 20,\n currentOffset,\n );\n }\n return this._perspectiveOffsetCamera;\n }\n\n protected updateEnvironment(bounds?: Box3, force = false) {\n if (bounds && this._environment && this._environment.needsBounds()) {\n const size = bounds.getSize(new Vector3());\n if (size.x + size.y + size.z !== 0 || force) {\n this._environment.updateBounds(bounds.getSize(new Vector3()), force);\n }\n }\n this._roomleRenderer?.updateBounds(bounds);\n }\n\n protected _onCameraIdle(): boolean {\n return true;\n }\n\n protected _onCameraMove(): boolean {\n return true;\n }\n\n protected _waitForAssets(): Promise<void> {\n // can be specialized in sub classes\n return Promise.resolve();\n }\n\n public async exportCanvasScreenshot(quality: number = 1): Promise<string> {\n await this._waitForAssets();\n return new Promise((resolve) => {\n this._onAfterRender = () => {\n const image = this._renderer.domElement.toDataURL(\n this._initData.transparentBackground ? 'image/png' : 'image/jpeg',\n quality,\n );\n resolve(image);\n\n this._onAfterRender = () => undefined;\n };\n this._requestRender();\n });\n }\n\n public async exportImageFromCamera(\n filename: string,\n shouldWaitForAssets: boolean = false,\n ): Promise<void> {\n if (shouldWaitForAssets) {\n await this._waitForAssets();\n }\n return new Promise((resolve, reject) => {\n this._onAfterRender = () => {\n this._onAfterRender = () => undefined;\n const image = this._renderer.domElement.toDataURL('image/jpeg', 1);\n const { left, right, top, bottom } = this.getCameraOffset();\n const percentX = right - left;\n const percentY = top - bottom;\n if (percentX === 1 && percentY === 1) {\n download(filename, image);\n resolve();\n return;\n }\n const img = new Image();\n img.src = image;\n img.onload = () => {\n const { naturalWidth, naturalHeight } = img;\n const canvas = document.createElement('canvas');\n canvas.width = naturalWidth * percentX;\n canvas.height = naturalHeight * percentY;\n const context = canvas.getContext('2d');\n const marginX = naturalWidth * left * -1;\n const marginY = naturalHeight * (1 - top) * -1;\n context.drawImage(img, marginX, marginY);\n context.save();\n\n download(filename, canvas.toDataURL('image/jpeg', 1));\n resolve();\n };\n img.onerror = reject;\n };\n this._requestRender();\n });\n }\n\n public changeEnvironmentMapIntensity(intensity: number) {\n this._scene.userData.environmentDefinition.intensity = intensity;\n }\n\n public lockCamera() {\n this.cameraBehaviour.cameraControl.lock();\n }\n\n public unlockCamera() {\n this.cameraBehaviour.cameraControl.unlock();\n }\n\n public setEnvironmentMap(\n url?: string,\n intensity?: number,\n rotation?: number,\n maxLightSources?: number,\n ): void {\n if (url !== undefined) {\n this._hdrEnvironmentLoader.loadUrl(this._renderer, url);\n }\n if (intensity !== undefined) {\n this._scene.userData.environmentDefinition.intensity = intensity;\n }\n if (rotation !== undefined) {\n this._scene.userData.environmentDefinition.rotation = rotation;\n }\n if (maxLightSources !== undefined) {\n this._scene.userData.environmentDefinition.maxNoOfLightSources =\n maxLightSources;\n this._roomleRenderer.forceShadowUpdates(false);\n }\n this._requestRender();\n }\n\n protected _getCameraControl3D(cameraParameters?: CameraParameter) {\n if (!this._cameraControl3D) {\n this._cameraControl3D = new CameraControl3D(\n this._creator_,\n this._getInputManager(),\n cameraParameters,\n this.getPerspectiveOffsetCamera(),\n );\n } else if (cameraParameters) {\n this._cameraControl3D.setCurrentCameraParameters(cameraParameters);\n }\n return this._cameraControl3D;\n }\n\n protected _getCameraControl2D() {\n if (!this._cameraControl2D) {\n this._cameraControl2D = new CameraControl2D(\n this._creator_,\n this._getInputManager(),\n null,\n this.getOrthographicOffsetCamera(),\n );\n }\n return this._cameraControl2D;\n }\n\n protected _getCameraControlFirstPerson() {\n if (!this._cameraControlFirstPerson) {\n this._cameraControlFirstPerson = new CameraControlFirstPerson(\n this._creator_,\n this._getInputManager(),\n null,\n this.getPerspectiveOffsetCamera(),\n );\n }\n return this._cameraControlFirstPerson;\n }\n}\n","import type CameraControl from './camera-control';\nimport { traceMethodCalls } from '../utils/common-utils';\nimport type CameraBehaviourState from './camera-behaviour-state';\n\nexport default abstract class CameraBehaviour {\n protected _cameraControl: CameraControl;\n private _state: CameraBehaviourState = null;\n private _cameraChangeListener: () => void = null;\n\n constructor(cameraControl: CameraControl, state: CameraBehaviourState) {\n this._cameraControl = cameraControl;\n this._state = state;\n\n if (window.__RML__DEBUG__?.camera) {\n return traceMethodCalls(this, 'CameraBehaviour');\n }\n return this;\n }\n\n public abstract get cameraControl(): CameraControl;\n\n protected get state() {\n return this._state;\n }\n\n public setCameraChangeListener(callback: () => void) {\n this._cameraChangeListener = callback;\n }\n\n public removeCameraChangeListener() {\n this._cameraChangeListener = null;\n }\n\n protected _onCameraChanged() {\n if (this._cameraChangeListener) {\n this._cameraChangeListener();\n }\n }\n}\n"],"names":["ENV_HDR_1K_FILE_NAME","ENV_LEGACY","CAMERA_EVENT","exports","INITIAL_YAW","INITIAL_PITCH","INITIAL_CAMERA_DISTANCE","DEBUG_CAMERA_POSITION","CameraControl","EventDispatcher","creator","inputManager","initialCameraParameters","Vector3","toRadiant","PerspectiveCamera","debugCameraPosition","clientDimensions","debounce","listener","delta","desiredPosition","position3VectorsAreEqual","INPUT_EVENT_TYPE","newCameraPosition","lerpFactor","start","end","ignoreChecks","resolve","tween","Tween","Easing","camera","near","targetClone","cameraParameters","angle","override","savedYaw","savedPitch","savedDistance","state","position","x","y","container","currentContainer","child","point","distance","boundingBox","__decorateClass","inject","ZoomChangeEvent","minZoom","maxZoom","STATE","ROTATION_SPEED","PAN_SPEED","MIN_PAN_SPEED","ZOOM_SPEED","MAX_DISTANCE_MINIMAL","SMALL_OBJECT_SIZE","LARGE_OBJECT_SIZE","DISTANCE_FACTOR","MAX_POLAR_ANGLE","CameraControl3D","cameraRestriction","zoomDistance","minVerticalCameraAngle","maxVerticalCameraAngle","minHorizontalCameraAngle","maxHorizontalCameraAngle","cameraRestrictionRadiant","LAYER","objectRotation","lookAtSide","target","INPUT_EVENT","event","Vector2","orbitDelta","element","cameraTargetPoint","panSpeed","type","position2VectorsAreEqual","reset","compareBox3Size","size","currentCameraParameter","endCameraParameter","areCameraParametersEqual","idealDistance","isPreview","changeCamera","boundingSphere","Sphere","bounds","updateDistance","offsetWidth","offsetHeight","cameraSpacing","maxBounds","getIdealDistance","dimensions","windowWidth","windowHeight","width","height","largestDimension","breakingPoint","objectWidth","objectHeight","yaw","pitch","animate","center","currentCameraParameters","toDegrees","newPitch","newYaw","defaultYaw","overrideTarget","keepVariables","clamp","quaternion","Quaternion","Euler","direction","cameraSphere","hash","radius","value","cameraParameter","z","currentCameraParams","newCameraParams","deepMerge","maxDistance","ObjectAnimations","object3d","animations","component","animationMap","animationName","convertToThreeMatrix","objectAnimations","animation","finalMatrix","setObjectMatrix","animationTransition","onProgressUpdate","priorTransformation","Matrix4","animationFrom","animationTo","subsequentTransformation","combinedMatrix","animationData","matrix","priorMatrix","from","to","subsequentTransform","toMatrix","fromMatrix","animateObjectMatrix","DEBUG_BOUNDING_BOX","PULSE_DURATION","PULSE_LOOPS","RoomleComponentFactoryInitializer","HRoomleComponent","Object3D","id","roomleRotation","parentObjectId","isRootComponent","geometryCube","translateBy","line","LineSegments","EdgesGeometry","LineDashedMaterial","clone","eulerAngles","rotation","meshes","mesh","Mesh","transform","meshId","m","index","disposeMesh","dispose","lightSourceId","lightSource","geometry","BoxGeometry","MaterialCreator","PREVIEW_MATERIAL_OPACITY","Color","PREVIEW_MATERIAL_COLOR","setCursor","CURSOR_STYLE","boxForMeasurements","useMeshes","Box3","v1","BufferGeometry","attribute","i","l","depth","kernelBoxToThreeBox","recursiveMeshes","children","componentId","isChild","newParent","posInGlobal","convertToKernel","HStaticComponent","glbUrl","_HPreviewComponent","MeshStandardMaterial","DOCK_PREVIEW_MATERIAL_OPACITY","DOCK_PREVIEW_MATERIAL_ROUGHNESS","DOCK_PREVIEW_MATERIAL_METALNESS","material","DOCK_PREVIEW_MATERIAL_OPACITY_HOVERED","numberOfDuplication","HPreviewComponent","HPreviewLineComponent","receivedPointAssociation","lineFrom","convertToTHREE","lineTo","vector","positionFrom","positionTo","lengthVector","length","arrowRotation","wantedLineMiddle","boundingCenter","offset","boundingLineLength","positionDirection","positionArrowRotation","wantedBoundingLineMiddle","lineSegments","PREVIEW_LINE_MATERIAL_OPACITY","radialSegments","previewGeometry","CylinderGeometry","geometries","segment","segmentLength","centerY","segmentGeometry","BufferGeometryUtils.mergeGeometries","intersectionPoint","closestPointToPoint","Line3","rootComponentPoint","worldPoint","HOrthographicOffsetCamera","OrthographicCamera","left","right","top","bottom","far","planes2D","widthRange","heightRange","originalAspect","newAspect","offsetFrom","offsetTo","newDistance","scaledFrom","scaledTo","dx","dy","cx","cy","scaleW","scaleH","HPerspectiveOffsetCamera","fov","aspect","recursive","fovVerticalOriginal","leftAbs","rightAbs","topAbs","bottomAbs","fovHorzontalOriginal","rLeft","rRight","rTop","rBottom","factorR","factorL","factorV","factorT","factorB","factorH","create","createStatic","url","createPreview","createPreviewLine","previewComponent","previewLineComponent","meshClone","createOrthographicCamera","createPerspectiveCamera","obj","isPreviewLine","Environment","scene","oldEnvironment","_camera","_force","BakedShadowPlane","innerSize","outerSize","squareShape1","Shape","squareShape2","holePath","Path","geometry1","ShapeGeometry","geometry2","uvs","uvs2","INITIAL_FLOOR_SIZE","FOG_COLOR","FloorEnvironment","fog","TextureLoader","distanceToObject","Fog","textureWidth","textureHeight","RepeatWrapping","DoubleSide","repeatable","reject","texture","rapiMaterial","maxAnisotropy","createMaterial","rapiTextures","texturePromises","rapiTexture","addTexture","promises","gui","getGUI","floor","KEYBOARD_ROTATION_ANGLE","KEYBOARD_MOVING_DISTANCE","ROTATION_SPEED_TOUCH","RUN_SPEED","CONTROLLER_AXIS_THRESHHOLD","MIN_POLAR_ANGLE","CameraControlFirstPerson","euler","_e","gamepad","rightStickHorizontal","rightStickVertical","leftStickHorizontal","leftStickVertical","desiredRotation","positionsAreEqual","rotationsAreEqual","rotationQuaternionsAreEqual","newCameraRotation","slerpFactor","shouldProcess","_event","getDelta","MIN_MOVE_DISTANCE","_overrideTarget","map","shouldRotate","BACKGROUND_CLASS_NAME","BackgroundEnvironment","color","canvas","inlineStyle","DynamicEnvironmentSettingLoader","json","jsonObject","environmentPromise","environmentObject","environment","LightSetting","oldLightSetting","_bounds","DynamicLightSetting","punctualLight","maxSize","sceneSettings","light","handleJsonResponse","dir","SpotLight","AmbientLight","DirectionalLight","RectAreaLight","areaLight","guiLightParam","intensity","spot","ambiLight","directional","GroundedSkybox","resolution","SphereGeometry","pos","tmp","y1","f","MeshBasicMaterial","GroundProjectedEnvironment","updateCallback","groundProjectedEnvironment","LightSourceDetectorDebug","lightSourceDetector","planeGeometry","PlaneGeometry","planeMaterial","planeMesh","maxNoOfLightSources","allLightSamplesUVs","lightSamples","lightGraph","singleLightSamples","clusterLightSamples","singleLightSampleUVs","sample","clusterLightSampleUVs","discardedSamples","uv","lightSourceUVs","lightSources","samplePoints","samplePointGeometry","CircleGeometry","samplePointMaterial","samplePoint","samplePointMesh","clusterSegments","lineMaterial","LineBasicMaterial","points","cluster","uv0","uv1","v","u","lineGeometry","lineMesh","EnvironmentPmremGenertor","PMREMGenerator","renderer","equirectangularTexture","parameters","ShaderMaterial","Matrix3","equilateralVertexShader","equilateralFragmentShader","NoBlending","EnvironmentSceneGenerator","EnvironmentDefinition","CubeTexture","Texture","pmremTextue","offestU","pmremGenerator","pmremRenderTarget","environmentScene","pmremTexture","LightSourceDetector","maxLightSources","Scene","EnvironmentMapDecodeMaterial","DEFAULT_ENVIRONMENT_SCENE_TYPES","DefaultEnvironmentSceneGenerator","defaultEnvironmentScene","DefaultEnvironmentScene","defaultAmbientIntensity","resources","object","resource","ali","azimuthAngleInRad","j","tangentialAngleInRad","x0","z0","r","g","b","scale","topLight","level","li","xOffset","yOffset","zOffset","scaleZ","MAX_ZOOM","MIN_ZOOM","TOUCH_PANNING_SPEED","CameraControl2D","initialCameraPosition","frustumWidth","frustumHeight","zoomPos","prevPos","newPos","zoomInAllowed","force","widthRatio","heightRatio","newZoom","_ignoreChecks","_keepVariables","deltaPosition","isZooming","MathUtils","sceneSizeMM","STANDBY_AFTER","INTERIOR_LIGHTS_ENV_MAP_INTENSITY","INTERIOR_LIGHTS_ENV_MAP_ROTATION","SceneManager","canvasID","mode","Clock","sanitizedCameraMode","_listener","cameraBehaviour","render","allTweens","background","oldAutoClear","_offset","transparent","patchLighting","ShaderChunk","WebGLRenderer","dpr","SRGBColorSpace","PCFSoftShadowMap","RoomleWebGLRenderer","lutImages","standaloneConfiguratorQualityLevels","maps","WINDOW_EVENT","DEFAULT_ENV_MAP_INTENSITY","DEFAULT_ENV_MAP_ROTATION","environmentMap","ENV_HDR_256_FILE_NAME","keysToRelease","key","_changeCamera","STATIC_ITEM_TYPE","removals","item","source","gltfJSON","callback","colorable","guiStyle","sceneParams","params","folders","key1","key2","folder","controller","module","statsHelper","qualityLevel","_cleanup","evt","sceneSetting","lightPromise","hex","changedLight","lightSetting","DynamicLightSettingLoader","geometryBounds","geometryChanged","renderBounds","offsetCamera","currentOffset","componentFactory","quality","image","filename","shouldWaitForAssets","percentX","percentY","download","img","naturalWidth","naturalHeight","context","marginX","marginY","CameraBehaviour","cameraControl","traceMethodCalls"],"mappings":"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","x_google_ignoreList":[14]}