@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.
- package/lib/ConfiguratorKernel.wasm +0 -0
- package/lib/{PointLightHelper-BkdQaOKc.js → PointLightHelper-B8VP_55Z.js} +2 -2
- package/lib/{PointLightHelper-BkdQaOKc.js.map → PointLightHelper-B8VP_55Z.js.map} +1 -1
- package/lib/{PointLightHelper-qhWtXw8x.mjs → PointLightHelper-DtoZq5ME.mjs} +2 -2
- package/lib/{PointLightHelper-qhWtXw8x.mjs.map → PointLightHelper-DtoZq5ME.mjs.map} +1 -1
- package/lib/RoomleCore.js +6 -6
- package/lib/RoomleCore.wasm +0 -0
- package/lib/RoomleToolsCore.wasm +0 -0
- package/lib/{banana-for-scale-XjIfe69B.js → banana-for-scale-BVlDK4jg.js} +2 -2
- package/lib/{banana-for-scale-XjIfe69B.js.map → banana-for-scale-BVlDK4jg.js.map} +1 -1
- package/lib/{banana-for-scale-CDGM3hdN.mjs → banana-for-scale-CKSlc9Tc.mjs} +2 -2
- package/lib/{banana-for-scale-CDGM3hdN.mjs.map → banana-for-scale-CKSlc9Tc.mjs.map} +1 -1
- package/lib/camera-behaviour-CzgZxW1D.js +50 -0
- package/lib/camera-behaviour-CzgZxW1D.js.map +1 -0
- package/lib/{camera-behaviour-BLMduSEn.mjs → camera-behaviour-DWkBHxkk.mjs} +79 -75
- package/lib/camera-behaviour-DWkBHxkk.mjs.map +1 -0
- package/lib/{component-dimensioning-Do75G-kI.js → component-dimensioning-CUoDDxfk.js} +2 -2
- package/lib/{component-dimensioning-Do75G-kI.js.map → component-dimensioning-CUoDDxfk.js.map} +1 -1
- package/lib/{component-dimensioning-DvCO0pEp.mjs → component-dimensioning-CgVIP7Nu.mjs} +2 -2
- package/lib/{component-dimensioning-DvCO0pEp.mjs.map → component-dimensioning-CgVIP7Nu.mjs.map} +1 -1
- package/lib/{component-raycast-helper-Dl-pzfg_.js → component-raycast-helper-DvNtWlR5.js} +2 -2
- package/lib/{component-raycast-helper-Dl-pzfg_.js.map → component-raycast-helper-DvNtWlR5.js.map} +1 -1
- package/lib/{component-raycast-helper-CuZdUtrH.mjs → component-raycast-helper-zAwc-AuF.mjs} +2 -2
- package/lib/{component-raycast-helper-CuZdUtrH.mjs.map → component-raycast-helper-zAwc-AuF.mjs.map} +1 -1
- package/lib/{configurator-CT_ghGbX.mjs → configurator-DDhzCgxy.mjs} +6 -6
- package/lib/{configurator-CT_ghGbX.mjs.map → configurator-DDhzCgxy.mjs.map} +1 -1
- package/lib/{configurator-B01iJTNa.js → configurator-DJnpG8CG.js} +2 -2
- package/lib/{configurator-B01iJTNa.js.map → configurator-DJnpG8CG.js.map} +1 -1
- package/lib/configurator-scene-manager-Bxdyg2zz.js +2 -0
- package/lib/configurator-scene-manager-Bxdyg2zz.js.map +1 -0
- package/lib/{configurator-scene-manager-DbsYS4rm.mjs → configurator-scene-manager-DnZvFw0N.mjs} +150 -162
- package/lib/configurator-scene-manager-DnZvFw0N.mjs.map +1 -0
- package/lib/configurator.js +1 -1
- package/lib/configurator.nomodule.js +1 -1
- package/lib/{continuous-drawing-helper-DdnnCOqZ.js → continuous-drawing-helper-C6qDGAxa.js} +2 -2
- package/lib/{continuous-drawing-helper-DdnnCOqZ.js.map → continuous-drawing-helper-C6qDGAxa.js.map} +1 -1
- package/lib/{continuous-drawing-helper-DrpQFppG.mjs → continuous-drawing-helper-DbTM7uCv.mjs} +2 -2
- package/lib/{continuous-drawing-helper-DrpQFppG.mjs.map → continuous-drawing-helper-DbTM7uCv.mjs.map} +1 -1
- package/lib/{default-light-setting-D0Ie_AEw.mjs → default-light-setting-BdD0jDeP.mjs} +3 -3
- package/lib/{default-light-setting-D0Ie_AEw.mjs.map → default-light-setting-BdD0jDeP.mjs.map} +1 -1
- package/lib/{default-light-setting-DQxt3v5x.js → default-light-setting-CYiFuxeI.js} +2 -2
- package/lib/{default-light-setting-DQxt3v5x.js.map → default-light-setting-CYiFuxeI.js.map} +1 -1
- package/lib/definitions/common-core/src/light/light-source.d.ts +2 -0
- package/lib/definitions/common-core/src/utils/threejs-utils.d.ts +2 -1
- package/lib/definitions/common-core/src/webgl/roomle-component-factory.d.ts +1 -0
- package/lib/definitions/common-core/src/webgl/scene-manager.d.ts +1 -1
- package/lib/definitions/planner-core/src/lights/ceiling-light.d.ts +1 -1
- package/lib/definitions/planner-core/src/lights/light-group.d.ts +1 -2
- package/lib/definitions/planner-core/src/roomle-planner.d.ts +12 -6
- package/lib/definitions/planner-core/src/services/planner-kernel-access.d.ts +1 -1
- package/lib/definitions/planner-core/src/view-model/plan-view-model.d.ts +1 -4
- package/lib/definitions/planner-core/src/webgl/planner-scene-manager.d.ts +5 -1
- package/lib/{glb-viewer-BEWU9zxC.mjs → glb-viewer-BoZgMSrk.mjs} +6 -6
- package/lib/{glb-viewer-BEWU9zxC.mjs.map → glb-viewer-BoZgMSrk.mjs.map} +1 -1
- package/lib/{glb-viewer-camera-behaviour-Cl2bS83k.js → glb-viewer-camera-behaviour-AEWNZ6mR.js} +2 -2
- package/lib/{glb-viewer-camera-behaviour-Cl2bS83k.js.map → glb-viewer-camera-behaviour-AEWNZ6mR.js.map} +1 -1
- package/lib/{glb-viewer-camera-behaviour-DQ2sVbku.mjs → glb-viewer-camera-behaviour-CRnnMrL2.mjs} +2 -2
- package/lib/{glb-viewer-camera-behaviour-DQ2sVbku.mjs.map → glb-viewer-camera-behaviour-CRnnMrL2.mjs.map} +1 -1
- package/lib/{glb-viewer-6_OVDzVH.js → glb-viewer-vvpjnYPw.js} +2 -2
- package/lib/{glb-viewer-6_OVDzVH.js.map → glb-viewer-vvpjnYPw.js.map} +1 -1
- package/lib/glb-viewer.js +1 -1
- package/lib/glb-viewer.nomodule.js +1 -1
- package/lib/{imos-ix-poc-export-helper-r0pv9sOT.js → imos-ix-poc-export-helper-7AWayvID.js} +2 -2
- package/lib/{imos-ix-poc-export-helper-r0pv9sOT.js.map → imos-ix-poc-export-helper-7AWayvID.js.map} +1 -1
- package/lib/{imos-ix-poc-export-helper-BrpY0OHi.mjs → imos-ix-poc-export-helper-gQb0lbdn.mjs} +2 -2
- package/lib/{imos-ix-poc-export-helper-BrpY0OHi.mjs.map → imos-ix-poc-export-helper-gQb0lbdn.mjs.map} +1 -1
- package/lib/{main-05wLxbDZ.js → main-DVWEbQdM.js} +340 -149
- package/lib/{main-05wLxbDZ.js.map → main-DVWEbQdM.js.map} +1 -1
- package/lib/{main-CMu7hOEO.mjs → main-RpgY_kch.mjs} +2202 -1999
- package/lib/{main-CMu7hOEO.mjs.map → main-RpgY_kch.mjs.map} +1 -1
- package/lib/{material-viewer-B0MevA_r.mjs → material-viewer-DQjAOrWL.mjs} +4 -4
- package/lib/{material-viewer-B0MevA_r.mjs.map → material-viewer-DQjAOrWL.mjs.map} +1 -1
- package/lib/{material-viewer-CLqZXFrn.js → material-viewer-_9Sb1UCw.js} +2 -2
- package/lib/{material-viewer-CLqZXFrn.js.map → material-viewer-_9Sb1UCw.js.map} +1 -1
- package/lib/material-viewer.js +1 -1
- package/lib/material-viewer.nomodule.js +1 -1
- package/lib/planner-BcHlq0n3.js +155 -0
- package/lib/planner-BcHlq0n3.js.map +1 -0
- package/lib/{planner-B3Bt-cWy.mjs → planner-BilNNFJ0.mjs} +143 -125
- package/lib/planner-BilNNFJ0.mjs.map +1 -0
- package/lib/planner.js +1 -1
- package/lib/planner.nomodule.js +1 -1
- package/lib/roomle-sdk.js +7 -7
- package/lib/roomle-sdk.nomodule.js +1 -1
- package/lib/{script-loader-CZjzwkk2.js → script-loader-BZOMZ1AI.js} +2 -2
- package/lib/{script-loader-CZjzwkk2.js.map → script-loader-BZOMZ1AI.js.map} +1 -1
- package/lib/{script-loader-BzwDLtbS.mjs → script-loader-CHolkWhE.mjs} +2 -2
- package/lib/{script-loader-BzwDLtbS.mjs.map → script-loader-CHolkWhE.mjs.map} +1 -1
- package/lib/static/roomle-core-hsc/ConfiguratorKernel.wasm +0 -0
- package/lib/static/roomle-core-hsc/RoomleCore.js +6 -6
- package/lib/static/roomle-core-hsc/RoomleCore.wasm +0 -0
- package/lib/static/roomle-core-hsc/RoomleServiceCore.js +6 -6
- package/lib/static/roomle-core-hsc/RoomleServiceCore.wasm +0 -0
- package/lib/static/roomle-core-hsc/RoomleToolsCore.wasm +0 -0
- package/lib/static/roomle-core-hsc/configuratorCoreInterface.d.ts +2 -0
- package/lib/static/roomle-core-hsc/embind/configuratorCoreInterface.d.ts +2 -0
- package/lib/static/roomle-core-hsc/embind/plannerCoreCallback.d.ts +2 -2
- package/lib/static/roomle-core-hsc/embind/plannerCoreCallback.js +1 -1
- package/lib/static/roomle-core-hsc/embind/plannerCoreCallback.js.map +1 -1
- package/lib/static/roomle-core-hsc/embind/plannerCoreInterface.d.ts +17 -2
- package/lib/static/roomle-core-hsc/embind/plannerCoreInterface.js.map +1 -1
- package/lib/static/roomle-core-hsc/package.json +1 -1
- package/lib/static/roomle-core-hsc/plannerCoreCallback.d.ts +2 -2
- package/lib/static/roomle-core-hsc/plannerCoreCallback.js +1 -1
- package/lib/static/roomle-core-hsc/plannerCoreCallback.js.map +1 -1
- package/lib/static/roomle-core-hsc/plannerCoreInterface.d.ts +17 -2
- package/lib/static/roomle-core-hsc/plannerCoreInterface.js.map +1 -1
- package/lib/static/roomle-core-hsc/src/embind/configuratorCoreInterface.d.ts +2 -0
- package/lib/static/roomle-core-hsc/src/embind/plannerCoreCallback.d.ts +2 -2
- package/lib/static/roomle-core-hsc/src/embind/plannerCoreCallback.js +1 -1
- package/lib/static/roomle-core-hsc/src/embind/plannerCoreCallback.js.map +1 -1
- package/lib/static/roomle-core-hsc/src/embind/plannerCoreInterface.d.ts +17 -2
- package/lib/static/roomle-core-hsc/src/embind/plannerCoreInterface.js.map +1 -1
- package/lib/static/roomle-core-hsc/wasm_modern/ConfiguratorKernel.wasm +0 -0
- package/lib/static/roomle-core-hsc/wasm_modern/RoomleCore.js +6 -6
- package/lib/static/roomle-core-hsc/wasm_modern/RoomleCore.wasm +0 -0
- package/lib/static/roomle-core-hsc/wasm_modern/RoomleServiceCore.js +6 -6
- package/lib/static/roomle-core-hsc/wasm_modern/RoomleServiceCore.wasm +0 -0
- package/lib/static/roomle-core-hsc/wasm_modern/RoomleToolsCore.wasm +0 -0
- package/lib/{stats-helper-BaTpWjzi.mjs → stats-helper-BFpxduid.mjs} +2 -2
- package/lib/{stats-helper-BaTpWjzi.mjs.map → stats-helper-BFpxduid.mjs.map} +1 -1
- package/lib/{stats-helper-DylhlHS_.js → stats-helper-D4z7zVEi.js} +2 -2
- package/lib/{stats-helper-DylhlHS_.js.map → stats-helper-D4z7zVEi.js.map} +1 -1
- package/lib/{tools-core-BF9kMznR.js → tools-core-BJbLUz5-.js} +2 -2
- package/lib/{tools-core-BF9kMznR.js.map → tools-core-BJbLUz5-.js.map} +1 -1
- package/lib/{tools-core-BbL-KMAf.mjs → tools-core-COGP-hBi.mjs} +3 -3
- package/lib/{tools-core-BbL-KMAf.mjs.map → tools-core-COGP-hBi.mjs.map} +1 -1
- package/package.json +1 -1
- package/lib/camera-behaviour-BLMduSEn.mjs.map +0 -1
- package/lib/camera-behaviour-DgLVg_pP.js +0 -50
- package/lib/camera-behaviour-DgLVg_pP.js.map +0 -1
- package/lib/configurator-scene-manager-CRSHxOfd.js +0 -2
- package/lib/configurator-scene-manager-CRSHxOfd.js.map +0 -1
- package/lib/configurator-scene-manager-DbsYS4rm.mjs.map +0 -1
- package/lib/planner-B3Bt-cWy.mjs.map +0 -1
- package/lib/planner-D7lLZxgW.js +0 -155
- package/lib/planner-D7lLZxgW.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"configurator-scene-manager-Bxdyg2zz.js","sources":["../../packages/configurator-core/src/utils/animation/animation-helper.ts","../../packages/planner-core/src/lights/rect-area-light.ts","../../packages/planner-core/src/lights/point-lamp-light.ts","../../packages/common-core/src/light/light-source.ts","../../packages/configurator-core/src/utils/animation/drag-insert-animation.ts","../../packages/common-core/src/view-model/configurator-view-model.ts","../../../../node_modules/three/src/math/Vector4.js","../../../../node_modules/three/src/math/Plane.js","../../../../node_modules/three/src/math/Frustum.js","../../../../node_modules/three/src/lights/LightShadow.js","../../../../node_modules/three/src/cameras/Camera.js","../../../../node_modules/three/src/cameras/PerspectiveCamera.js","../../../../node_modules/three/src/lights/PointLightShadow.js","../../packages/planner-core/src/lights/light-group.ts","../../packages/planner-core/src/view-model/plan-view-model.ts","../../packages/configurator-core/src/utils/raycast-helper.ts","../../packages/common-core/src/webgl/scene-event-handler.ts","../../packages/configurator-core/src/webgl/configurator-scene-event-handler.ts","../../packages/configurator-core/src/utils/ui-intersection-helper.ts","../../packages/common-core/src/cameracontrol/configurator-camera-behaviour.ts","../../packages/configurator-core/src/webgl/configurator-scene-manager.ts"],"sourcesContent":["import type { RoomleComponent } from '../../../../common-core/src/webgl/roomle-component-factory';\nimport type { KernelParameter } from '../../../../typings/kernel';\nimport { AnimationValueMap } from './animation-value-map';\n\nexport const updateComponentAnimationParameters = (\n components: RoomleComponent[],\n parameters: KernelParameter[]\n): void => {\n const animationParameters =\n AnimationValueMap.filterAnimationParameters(parameters);\n if (animationParameters.length === 0) {\n return;\n }\n for (const component of components) {\n component.animationValueMap ??= new AnimationValueMap();\n for (const parameter of animationParameters) {\n component.animationValueMap.updateParameterValue(parameter);\n }\n }\n};\n\nexport const changeComponentAnimationValueAndAnimate = (\n component: RoomleComponent,\n parameterKey: string,\n value: string,\n level: number,\n animate: boolean,\n invalidateRenderCallback: () => void\n): void => {\n component.animationValueMap ??= new AnimationValueMap();\n const animationName = AnimationValueMap.getAnimationName(parameterKey);\n const oldValue = component.animationValueMap.setValueAndGetOldValue(\n animationName,\n value,\n level\n );\n const priorAnimations = component.animationValueMap.getPriorAnimations(\n animationName,\n level\n );\n const subsequentAnimations = component.animationValueMap.getSequentAnimations(\n animationName,\n level\n );\n if (!component.animateMeshes) {\n return;\n }\n component.animateMeshes(\n animationName,\n {\n from: oldValue,\n to: value,\n priorAnimations,\n subsequentAnimations,\n },\n animate,\n invalidateRenderCallback\n );\n};\n","import type { Vector3 } from 'three';\nimport { Color, Euler, Matrix4, RectAreaLight } from 'three';\nimport { RectAreaLightHelper } from 'three/examples/jsm/helpers/RectAreaLightHelper.js';\nimport { getGUI } from '../../../common-core/src/utils/threejs-utils';\nimport type StaticPlanObjectViewModel from '../view-model/static-plan-object-view-model';\nimport type { KernelLightSourceAttributes } from '../../../typings/kernel';\nimport { convertToTHREE } from '../../../common-core/src/utils/kernel-utils';\n\nconst LAMP_LIGHT_COLOR = 0xff0000;\nconst LAMP_LIGHT_INTENSITY = 15; // RectAreaLight typically needs higher intensity\nconst LAMP_LIGHT_WIDTH = 4;\nconst LAMP_LIGHT_HEIGHT = 2;\n\nexport interface ReactLampLightAttributes {\n lightPos?: Vector3;\n targetPos?: Vector3;\n rotation?: Vector3;\n color?: number | string;\n intensity?: number;\n width?: number;\n height?: number;\n}\n\nexport default class RectLampLight extends RectAreaLight {\n private _helper: RectAreaLightHelper;\n\n static fromStaticObject(\n objectViewModel: StaticPlanObjectViewModel,\n debug = false\n ): RectLampLight {\n let lightAttributes: ReactLampLightAttributes = {};\n const data = objectViewModel.getObject().userData;\n if (data) {\n lightAttributes = {\n ...data,\n };\n if (data.dimensions) {\n lightAttributes.width = data.dimensions.width;\n lightAttributes.height = data.dimensions.height;\n }\n }\n return new RectLampLight(lightAttributes, debug);\n }\n\n static fromKernelAttributes(\n lightSourceAttributes: KernelLightSourceAttributes,\n debug = false\n ): RectLampLight {\n const lightPos = convertToTHREE(lightSourceAttributes.position);\n let targetPos: Vector3 | undefined = undefined;\n if (lightSourceAttributes.direction) {\n targetPos = convertToTHREE(lightSourceAttributes.direction)\n .multiplyScalar(1000)\n .add(lightPos);\n }\n const lightAttributes: ReactLampLightAttributes = {\n lightPos,\n targetPos,\n color: lightSourceAttributes.color ?? '#ffffff',\n intensity: lightSourceAttributes.intensity,\n };\n if (lightSourceAttributes.width) {\n lightAttributes.width = lightSourceAttributes.width / 1000;\n }\n if (lightSourceAttributes.height) {\n lightAttributes.height = lightSourceAttributes.height / 1000;\n }\n const lampLight = new RectLampLight(lightAttributes, debug);\n return lampLight;\n }\n\n constructor(\n rectLampLightAttributes: ReactLampLightAttributes,\n debug: boolean\n ) {\n super(\n LAMP_LIGHT_COLOR,\n LAMP_LIGHT_INTENSITY,\n LAMP_LIGHT_WIDTH,\n LAMP_LIGHT_HEIGHT\n );\n\n if (rectLampLightAttributes.intensity) {\n this.intensity = rectLampLightAttributes.intensity;\n }\n if (rectLampLightAttributes.color) {\n if (typeof rectLampLightAttributes.color === 'number') {\n this.color.setHex(rectLampLightAttributes.color);\n } else {\n this.color = new Color(rectLampLightAttributes.color);\n }\n }\n if (rectLampLightAttributes.width) {\n this.width = rectLampLightAttributes.width;\n }\n if (rectLampLightAttributes.height) {\n this.height = rectLampLightAttributes.height;\n }\n\n this._initLightSource(\n rectLampLightAttributes.lightPos,\n rectLampLightAttributes.targetPos,\n rectLampLightAttributes.rotation,\n debug\n );\n }\n\n private _initLightSource(\n lightPos?: Vector3,\n targetPos?: Vector3,\n rotation?: Vector3,\n debug = false\n ) {\n if (debug) {\n this._helper = new RectAreaLightHelper(this);\n this._helper.visible = true;\n this.add(this._helper);\n }\n\n if (lightPos) {\n this.position.set(lightPos.x, lightPos.y, lightPos.z);\n }\n\n if (rotation) {\n this.rotation.set(rotation.x, rotation.y, rotation.z);\n } else if (targetPos) {\n this.lookAt(targetPos);\n } else {\n // RectAreaLights need to be rotated to point downward by default\n this.rotation.x = 1.57;\n }\n\n if (debug) {\n this._addDebugUI();\n }\n }\n\n public updateAttributes(lightSourceAttributes: KernelLightSourceAttributes) {\n const position = convertToTHREE(lightSourceAttributes.position);\n this.position.copy(position);\n if (lightSourceAttributes.direction) {\n const targetPos = convertToTHREE(lightSourceAttributes.direction)\n .multiplyScalar(1000)\n .add(position);\n const lookAtMatrix = new Matrix4().lookAt(position, targetPos, this.up);\n const rotation = new Euler().setFromRotationMatrix(lookAtMatrix);\n this.rotation.set(rotation.x, rotation.y, rotation.z);\n }\n this.matrixWorldNeedsUpdate = true;\n if (lightSourceAttributes.intensity) {\n this.intensity = lightSourceAttributes.intensity;\n }\n if (lightSourceAttributes.color) {\n this.color = new Color(lightSourceAttributes.color);\n }\n if (lightSourceAttributes.width) {\n this.width = lightSourceAttributes.width / 1000;\n }\n if (lightSourceAttributes.height) {\n this.height = lightSourceAttributes.height / 1000;\n }\n }\n\n private _addDebugUI() {\n const gui = getGUI();\n if (!gui) {\n return;\n }\n const params = {\n color: this.color.getHex(),\n intensity: this.intensity,\n width: this.width,\n height: this.height,\n positionX: this.position.x,\n positionY: this.position.y,\n positionZ: this.position.z,\n rotationX: this.rotation.x,\n rotationY: this.rotation.y,\n rotationZ: this.rotation.z,\n };\n const folder = gui.addFolder('Rect Area Lamp ' + this.id);\n folder.addColor(params, 'color').onChange((val) => {\n this.color.setHex(val);\n });\n folder.add(params, 'intensity', 0, 100, 0.01).onChange((val) => {\n this.intensity = val;\n });\n folder.add(params, 'width', 0, 20, 0.01).onChange((val) => {\n this.width = val;\n });\n folder.add(params, 'height', 0, 20, 0.01).onChange((val) => {\n this.height = val;\n });\n folder.add(params, 'positionX', -10, 10, 0.001).onChange((val) => {\n this.position.x = val;\n });\n folder.add(params, 'positionY', -10, 10, 0.001).onChange((val) => {\n this.position.y = val;\n });\n folder.add(params, 'positionZ', -10, 10, 0.001).onChange((val) => {\n this.position.z = val;\n });\n folder\n .add(params, 'rotationX', -Math.PI, Math.PI, 0.001)\n .onChange((val) => {\n this.rotation.x = val;\n });\n folder\n .add(params, 'rotationY', -Math.PI, Math.PI, 0.001)\n .onChange((val) => {\n this.rotation.y = val;\n });\n folder\n .add(params, 'rotationZ', -Math.PI, Math.PI, 0.001)\n .onChange((val) => {\n this.rotation.z = val;\n });\n }\n}\n","import type { Vector3 } from 'three';\nimport { Color, PointLight, type PointLightHelper } from 'three';\nimport { getGUI } from '../../../common-core/src/utils/threejs-utils';\nimport type StaticPlanObjectViewModel from '../view-model/static-plan-object-view-model';\nimport {\n QUALITY_LEVELS,\n type QualityLevel,\n} from '../../../common-core/src/webgl/renderer/scene-renderer';\nimport type { KernelLightSourceAttributes } from '../../../typings/kernel';\nimport { convertToTHREE } from '../../../common-core/src/utils/kernel-utils';\n\nconst LAMP_LIGHT_COLOR = 0xffaa00;\nconst LAMP_LIGHT_INTENSITY = 0.9;\nconst LAMP_LIGHT_DISTANCE = 25;\nconst LAMP_LIGHT_POWER = 11;\nconst LAMP_LIGHT_SHADOW_INTENSITY = 0.6;\n\nexport interface PointLampLightAttributes {\n lightPos?: Vector3;\n color?: number | string;\n intensity?: number;\n distance?: number;\n decay?: number;\n}\n\nexport default class PointLampLight extends PointLight {\n private _helper?: PointLightHelper;\n\n static fromStaticObject(\n objectViewModel: StaticPlanObjectViewModel,\n debug = false\n ): PointLampLight {\n const lampLightAttributes: PointLampLightAttributes =\n objectViewModel.getObject().userData;\n return new PointLampLight(lampLightAttributes, debug);\n }\n\n static fromKernelAttributes(\n lightSourceAttributes: KernelLightSourceAttributes,\n debug = false\n ): PointLampLight {\n const lightPos = convertToTHREE(lightSourceAttributes.position);\n const lightAttributes: PointLampLightAttributes = {\n lightPos,\n color: lightSourceAttributes.color ?? '#ffffff',\n intensity: lightSourceAttributes.intensity,\n distance: lightSourceAttributes.distance,\n decay: lightSourceAttributes.decay,\n };\n const lampLight = new PointLampLight(lightAttributes, debug);\n lampLight.shadow.camera.near = 0.1;\n lampLight.shadow.camera.far = 20;\n lampLight.shadow.intensity = 1;\n return lampLight;\n }\n\n constructor(lampLightAttributes: PointLampLightAttributes, debug: boolean) {\n super(LAMP_LIGHT_COLOR, LAMP_LIGHT_INTENSITY, LAMP_LIGHT_DISTANCE);\n\n if (lampLightAttributes.intensity) {\n this.intensity = lampLightAttributes.intensity;\n } else {\n this.power = LAMP_LIGHT_POWER;\n }\n if (lampLightAttributes.color) {\n if (typeof lampLightAttributes.color === 'number') {\n this.color.setHex(lampLightAttributes.color);\n } else {\n this.color = new Color(lampLightAttributes.color);\n }\n }\n if (lampLightAttributes.distance) {\n this.distance = lampLightAttributes.distance;\n }\n if (lampLightAttributes.decay) {\n this.decay = lampLightAttributes.decay;\n }\n\n this._initLightSource(lampLightAttributes.lightPos, debug);\n }\n\n private _initLightSource(lightPos?: Vector3, debug = false) {\n if (debug) {\n import('three/src/helpers/PointLightHelper.js').then(\n ({ PointLightHelper }) => {\n this._helper = new PointLightHelper(this, 0x000000);\n this._helper.visible = false;\n this.add(this._helper);\n }\n );\n }\n\n this.castShadow = true;\n this.shadow.intensity = LAMP_LIGHT_SHADOW_INTENSITY;\n\n if (lightPos) {\n this.position.set(lightPos.x, lightPos.y, lightPos.z);\n }\n\n this.update();\n\n if (debug) {\n this._addDebugUI();\n }\n }\n\n update(qualityLevel: QualityLevel = QUALITY_LEVELS.HIGHEST) {\n this._helper?.update();\n if (\n qualityLevel === QUALITY_LEVELS.HIGH ||\n qualityLevel === QUALITY_LEVELS.HIGHEST\n ) {\n this.visible = true;\n this.castShadow = true;\n this.shadow.mapSize.x = 512;\n this.shadow.mapSize.y = 512;\n } else if (qualityLevel === QUALITY_LEVELS.MEDIUM) {\n this.visible = true;\n this.castShadow = false;\n this.shadow.mapSize.x = 0;\n this.shadow.mapSize.y = 0;\n } else {\n this.visible = false;\n this.castShadow = false;\n this.shadow.mapSize.x = 0;\n this.shadow.mapSize.y = 0;\n }\n }\n\n public updateAttributes(lightSourceAttributes: KernelLightSourceAttributes) {\n const position = convertToTHREE(lightSourceAttributes.position);\n this.position.copy(position);\n this.matrixWorldNeedsUpdate = true;\n if (lightSourceAttributes.intensity) {\n this.intensity = lightSourceAttributes.intensity;\n }\n if (lightSourceAttributes.color) {\n this.color = new Color(lightSourceAttributes.color);\n }\n if (lightSourceAttributes.distance) {\n this.distance = lightSourceAttributes.distance;\n }\n if (lightSourceAttributes.decay) {\n this.decay = lightSourceAttributes.decay;\n }\n }\n\n private _addDebugUI() {\n const gui = getGUI();\n if (!gui) {\n return;\n }\n const params = {\n color: this.color.getHex(),\n intensity: this.intensity,\n distance: this.distance,\n decay: this.decay,\n power: this.power,\n positionX: this.position.x,\n positionY: this.position.y,\n positionZ: this.position.z,\n shadows: true,\n };\n const folder = gui.addFolder('Lamp ' + this.id);\n folder.addColor(params, 'color').onChange((val) => {\n this.color.setHex(val);\n });\n folder.add(params, 'intensity', 0, 100, 0.01).onChange((val) => {\n this.intensity = val;\n this.update();\n });\n folder.add(params, 'distance', 0, 100, 0.01).onChange((val) => {\n this.distance = val;\n this.update();\n });\n folder.add(params, 'decay', 0, 2, 0.01).onChange((val) => {\n this.decay = val;\n this.update();\n });\n folder.add(params, 'power', 0, 100, 0.01).onChange((val) => {\n this.power = val;\n this.update();\n });\n folder.add(params, 'positionX', -10, 10, 0.01).onChange((val) => {\n this.position.x = val;\n this.update();\n });\n folder.add(params, 'positionY', -10, 10, 0.01).onChange((val) => {\n this.position.y = val;\n this.update();\n });\n folder.add(params, 'positionZ', -10, 10, 0.01).onChange((val) => {\n this.position.z = val;\n this.update();\n });\n folder.add(params, 'shadows').onChange((val) => {\n this.castShadow = val;\n this.update();\n });\n }\n}\n","import { type Light, type Object3D } from 'three';\nimport LampLight from '../../../planner-core/src/lights/lamp-light';\nimport type { KernelLightSourceAttributes } from '../../../typings/kernel';\nimport { LIGHT_SOURCE_TYPE } from '../../../typings/kernel';\nimport RectLampLight from '../../../planner-core/src/lights/rect-area-light';\nimport PointLampLight from '../../../planner-core/src/lights/point-lamp-light';\n\nexport const generateLightSource = (\n lightSourceAttributes: KernelLightSourceAttributes,\n): Light | null => {\n switch (lightSourceAttributes.type.value) {\n case LIGHT_SOURCE_TYPE.SPOT:\n return LampLight.fromKernelAttributes(lightSourceAttributes);\n case LIGHT_SOURCE_TYPE.POINT:\n return PointLampLight.fromKernelAttributes(lightSourceAttributes);\n case LIGHT_SOURCE_TYPE.AREA:\n return RectLampLight.fromKernelAttributes(lightSourceAttributes);\n }\n return null;\n};\n\nexport class RoomleLightSource {\n private _lightSourceId: number;\n private _light: Light;\n\n constructor(lightSourceId: number, lightSource: Light) {\n this._lightSourceId = lightSourceId;\n this._light = lightSource;\n this._light.castShadow = false;\n }\n\n public get lightSourceId(): number {\n return this._lightSourceId;\n }\n\n public get isLightOn(): boolean {\n return this._light.visible === true;\n }\n\n public addToScene(object3d: Object3D): void {\n object3d.add(this._light);\n }\n\n public removeFromScene(): void {\n this._light.removeFromParent();\n this._light.dispose();\n }\n\n public setLightOnOff(state: boolean): void {\n this._light.visible = state;\n this._light.matrixWorldNeedsUpdate = true;\n }\n\n public updateLightSource(lightSourceAttributes: any): void {\n if (this._light instanceof LampLight) {\n this._light.updateAttributes(lightSourceAttributes);\n } else if (this._light instanceof PointLampLight) {\n this._light.updateAttributes(lightSourceAttributes);\n } else if (this._light instanceof RectLampLight) {\n this._light.updateAttributes(lightSourceAttributes);\n }\n }\n}\n","import { type Matrix4 } from 'three';\nimport type {\n PreviewComponent,\n RoomleComponent,\n} from '../../../../common-core/src/webgl/roomle-component-factory';\nimport {\n ObjectAnimations,\n type AnimationTransformationMap,\n} from './object-animations';\nimport { AnimationValueMap } from './animation-value-map';\nimport { convertKernelMatrixToThreeMatrix } from '../../../../common-core/src/utils/kernel-utils';\nimport type { KernelDockPairToPoint } from '../../../../typings/kernel';\nimport type { Tween } from '@tweenjs/tween.js';\n\nexport class DragInsertAnimation {\n private _id: string;\n private _previewComponent: PreviewComponent;\n private _displacedComponent: RoomleComponent;\n private _displacementTransformation: Matrix4;\n private _invalidateRenderCallback: () => void;\n private _currentAnimation: Tween | null = null;\n\n public constructor(\n id: string,\n previewComponent: PreviewComponent,\n displacedComponents: RoomleComponent,\n dockPair: KernelDockPairToPoint,\n invalidateRenderCallback: () => void\n ) {\n this._id = id;\n this._previewComponent = previewComponent;\n this._displacedComponent = displacedComponents;\n this._displacementTransformation = convertKernelMatrixToThreeMatrix(\n dockPair.displacedChildTransform\n );\n this._addObjectAnimationTransformations();\n this._addObjectAnimationValue();\n this._invalidateRenderCallback = invalidateRenderCallback;\n }\n\n private _addObjectAnimationTransformations() {\n const animations: AnimationTransformationMap = new Map();\n animations.set(this._id + ':open', {\n matrix: this._displacementTransformation,\n visible: true,\n initial: false,\n });\n ObjectAnimations.addObjectAnimations(\n this._displacedComponent,\n animations,\n this._previewComponent\n );\n }\n\n private _addObjectAnimationValue() {\n this._previewComponent.animationValueMap ??= new AnimationValueMap();\n this._previewComponent.animationValueMap.setValue(this._id, 'close', 0);\n }\n\n public startInsert() {\n this.endInsert();\n this._changeAnimation('open', true);\n }\n\n public endInsert() {\n this._currentAnimation?.stop();\n this._changeAnimation('closed', false);\n if (this._displacedComponent.userData?.transform) {\n delete this._displacedComponent.userData.transform;\n }\n }\n\n public cleanUp() {\n this.endInsert();\n ObjectAnimations.removeObjectAnimations(\n this._displacedComponent,\n this._id + ':open'\n );\n }\n\n private _changeAnimation(value: string, animate: boolean) {\n if (!this._previewComponent.animationValueMap) {\n return;\n }\n const oldValue =\n this._previewComponent.animationValueMap.setValueAndGetOldValue(\n this._id,\n value,\n 0\n );\n if (oldValue === value) {\n return;\n } \n this._currentAnimation = ObjectAnimations.animateObject(\n this._displacedComponent,\n this._id,\n {\n from: oldValue,\n to: value,\n priorAnimations: [],\n subsequentAnimations: [],\n },\n animate,\n this._invalidateRenderCallback\n );\n }\n}\n","import inject from '../../../common-core/src/di/inject';\nimport type { RoomleComponent } from '../../../common-core/src/webgl/roomle-component-factory';\nimport type {\n PreviewComponent,\n PreviewLineComponent,\n RoomleComponentFactory,\n} from '../../../common-core/src/webgl/roomle-component-factory';\nimport RoomleComponentFactoryInitializer from '../../../common-core/src/webgl/roomle-component-factory';\nimport type { ConfiguratorKernelCallbackI } from '../configurator-kernel-access';\nimport type ConfiguratorMeshGenerator from '../../../configurator-core/src/webgl/configurator-mesh-generator';\nimport type {\n KernelComponent,\n KernelDockPairToLine,\n KernelDockPairToPoint,\n KernelEnum,\n KernelLightSourceAttributes,\n KernelMeshAnimation,\n KernelMeshAttributes,\n KernelMeshBuffer,\n KernelParameter,\n KernelVector3,\n PlanObject,\n} from '../../../typings/kernel';\nimport type { ConfigurationString } from '../../../typings/rapi-types';\nimport type { Context } from '../di/context';\nimport { LAYER } from '../webgl/layer';\nimport type ConfiguratorContext from '../webgl/configurator-context';\nimport AsyncHelper, {\n ASYNC_OPERATIONS,\n} from '../../../configurator-core/src/utils/async-helper';\nimport {\n convertToEuler,\n //convertToTHREE,\n convertToThreeMatrix,\n convertToThreeUVMatrix,\n} from '../utils/kernel-utils';\nimport Benchmark from '../utils/benchmark';\nimport RoomleDependencyInjection from '../di/roomle-dependency-injection';\nimport { USE_DELTA_COMPONENT_UPDATES } from '../services/common-kernel-access';\nimport type CacheHolder from '../services/cache-holder';\nimport AsyncGuard from '../async-guard';\nimport type { PromiseQueue } from '../utils/promise-queue';\nimport {\n isUVIdentityMatrix,\n kernelBoxToThreeBox,\n} from '../utils/threejs-utils';\nimport type InitData from '../utils/init-data';\nimport type MeshGenerator from '../webgl/mesh-generator';\nimport type PlannerKernelAccess from '../../../planner-core/src/services/planner-kernel-access';\nimport type { BufferAttribute, Material } from 'three';\nimport { type Matrix4 } from 'three';\nimport { Box3, BufferGeometry, Mesh, Object3D } from 'three';\nimport * as BufferGeometryUtils from 'three/examples/jsm/utils/BufferGeometryUtils.js';\nimport { DOCKING_CONVERSATION_ID } from './helpers/constants';\nimport {\n changeComponentAnimationValueAndAnimate,\n updateComponentAnimationParameters,\n} from '../../../configurator-core/src/utils/animation/animation-helper';\nimport { ObjectAnimations } from '../../../configurator-core/src/utils/animation/object-animations';\nimport { generateLightSource, RoomleLightSource } from '../light/light-source';\nimport { DragInsertAnimation } from '../../../configurator-core/src/utils/animation/drag-insert-animation';\nimport type { ExternalConfiguration } from '../../../typings/external-objects';\nimport type { ExternalConfigurations } from '../../../homag-intelligence/src/homag-intelligence';\n\nexport interface ConfiguratorViewModelCallbackI {\n componentUpdated(\n component: RoomleComponent,\n kernelComponent: KernelComponent,\n ): void;\n\n componentDeleted(component: RoomleComponent): void;\n\n planObjectUpdated(\n planObject: PlanObject,\n geometryChanged: boolean,\n pendingDocking: boolean,\n ): void;\n\n planObjectConstructionDone(planObject: PlanObject): void;\n\n previewConstructionDone(\n component: RoomleComponent,\n hasPreviews: boolean,\n ): void;\n\n configurationLoaded(component: RoomleComponent, isFreeFlying: boolean): void;\n\n clearScene(): void;\n\n display(component: RoomleComponent): void;\n\n //for SceneEventHandler\n addComponentHandlers(component: RoomleComponent): void;\n\n addPreviewLineHandlers(previewLineComponent: PreviewLineComponent): void;\n\n addPreviewHandlers(previewComponent: PreviewComponent): void;\n}\n\nexport default class ConfiguratorViewModel\n implements ConfiguratorKernelCallbackI, Context\n{\n public _creator_: string;\n\n @inject\n private _configuratorMeshGenerator: ConfiguratorMeshGenerator;\n\n @inject\n protected _configuratorContext: ConfiguratorContext;\n\n @inject\n private _cacheHolder: CacheHolder;\n\n @inject\n protected _initData: InitData;\n\n private _listener: ConfiguratorViewModelCallbackI;\n private _mergeThreshold: number = 3;\n\n private _componentsToMerge: OccurrenceMap = new OccurrenceMap();\n private _mergeInProgress: boolean = false;\n private _geometriesMerged: () => void;\n private _subPartObject: Object3D;\n private _subPartGuard: AsyncGuard<Mesh>;\n private _externalConfigurations: ExternalConfigurations = new Map();\n\n protected _components: Map<number, RoomleComponent> = new Map();\n private _previews: Map<string, PreviewComponent> = new Map();\n protected _componentNumberOfPossibleChildren: Map<number, number> = new Map();\n\n protected _componentFactory: RoomleComponentFactory;\n\n private _requestRenderCallback: () => void;\n private _requestRenderSceneUpdateCallback: () => void;\n private _invalidateRenderCallback: () => void;\n\n constructor(creator: string) {\n this._creator_ = creator;\n this._getKernelAccess().addConfiguratorListener(this);\n this._componentFactory = RoomleComponentFactoryInitializer();\n }\n\n get materialQueue(): PromiseQueue<void> {\n return this.getMeshGenerator().materialQueue;\n }\n\n protected _getKernelAccess(): PlannerKernelAccess {\n return RoomleDependencyInjection.lookup<PlannerKernelAccess>(\n 'planner-kernel-access',\n this._creator_,\n );\n }\n\n private _applyMeshTransform(\n runtimeComponentId: number,\n mesh: Mesh,\n userData: any,\n transform: Float32Array,\n uvTransform: Float32Array,\n animations?: Record<string, KernelMeshAnimation>,\n originalGeometry?: BufferGeometry,\n ) {\n if (transform) {\n const transformMatrix: Matrix4 = (mesh.userData.transform =\n convertToThreeMatrix(transform));\n if (userData) {\n mesh.userData.transform = transformMatrix;\n }\n mesh.applyMatrix4(transformMatrix);\n }\n this._applyMeshUVTransform(mesh, userData, uvTransform, originalGeometry);\n ObjectAnimations.setObjectAnimations(\n mesh,\n animations,\n this.getComponent(runtimeComponentId),\n );\n }\n\n private _applyMeshUVTransform(\n mesh: Mesh,\n userData: any,\n uvTransform: Float32Array,\n originalGeometry?: BufferGeometry,\n ) {\n if (uvTransform?.length === 6 && !isUVIdentityMatrix(uvTransform)) {\n // the new UV transformation is not the identity matrix\n const uvTransformMatrix = convertToThreeUVMatrix(uvTransform);\n if (userData) {\n userData.uvTransform = uvTransformMatrix;\n }\n const bufferGeometry =\n originalGeometry ?? (mesh.geometry as BufferGeometry);\n if (bufferGeometry && bufferGeometry.attributes.uv) {\n const newBufferGeometry: BufferGeometry = bufferGeometry.clone();\n const bufferAttribute = newBufferGeometry.attributes\n .uv as BufferAttribute;\n bufferAttribute.applyMatrix4(uvTransformMatrix);\n mesh.geometry = newBufferGeometry;\n }\n } else {\n if (userData) {\n userData.uvTransform = undefined;\n }\n if (originalGeometry) {\n mesh.geometry = originalGeometry;\n }\n }\n }\n\n public updateAnimationParameters(\n elementId: number | number[],\n parameters: KernelParameter[],\n ): void {\n const components = (Array.isArray(elementId) ? elementId : [elementId])\n .map((id) => this.getComponentFromElementId(id))\n .filter((component) => !!component);\n updateComponentAnimationParameters(components, parameters);\n }\n\n public changeAnimationValue(\n elementId: number,\n parameterKey: string,\n value: string,\n level: number,\n applyToChildren: boolean,\n animate: boolean,\n ): void {\n const component = this.getComponentFromElementId(elementId);\n if (!component) {\n return;\n }\n if (applyToChildren) {\n component.traverse((child) => {\n if (child.id) {\n changeComponentAnimationValueAndAnimate(\n child as RoomleComponent,\n parameterKey,\n value,\n level,\n animate,\n this._invalidateRenderCallback,\n );\n }\n });\n } else {\n changeComponentAnimationValueAndAnimate(\n component,\n parameterKey,\n value,\n level,\n animate,\n this._invalidateRenderCallback,\n );\n }\n }\n\n public saveExternalConfiguration(\n externalConfiguration: ExternalConfiguration,\n ) {\n this._externalConfigurations.set(\n externalConfiguration.id,\n externalConfiguration,\n );\n }\n\n public getExternalConfigurationById(id: string) {\n return this._externalConfigurations.get(id);\n }\n\n private getComponentFromElementId(elementId: number): RoomleComponent {\n let component = this.getComponent(elementId);\n if (!component) {\n const rootComponentId =\n this._getKernelAccess().kernelInstance.getRootPlanComponentIdFromObjectId(\n elementId,\n );\n component = this.getComponent(rootComponentId);\n }\n if (!component) {\n console.warn('component not found!', elementId);\n }\n return component;\n }\n\n private _addMeshToSubPart(\n runtimeComponentId: number,\n geometryId: string,\n materialId: string,\n transform: Float32Array,\n uvTransform: Float32Array,\n vertices: Float32Array,\n indices: Int32Array,\n uvCoords: Float32Array,\n normals: Float32Array,\n materialAttributes?: Record<string, string>,\n animations?: Record<string, KernelMeshAnimation>,\n ): void {\n const mesh = this._generateMesh(\n runtimeComponentId,\n geometryId,\n materialId,\n vertices,\n indices,\n uvCoords,\n normals,\n undefined,\n undefined,\n materialAttributes,\n );\n this._applyMeshTransform(\n runtimeComponentId,\n mesh,\n null,\n transform,\n uvTransform,\n animations,\n );\n this._subPartObject.add(mesh);\n }\n\n private _addMeshToComponent(\n runtimeComponentId: number,\n meshId: number,\n geometryId: string,\n materialId: string,\n transform: Float32Array,\n uvTransform: Float32Array,\n vertices: Float32Array,\n indices: Int32Array,\n uvCoords: Float32Array,\n normals: Float32Array,\n _environmentGeometry: boolean,\n materialAttributes: Record<string, string>,\n animations: Record<string, KernelMeshAnimation>,\n ): void {\n if (this._subPartGuard && this._subPartGuard.info === runtimeComponentId) {\n this._addMeshToSubPart(\n runtimeComponentId,\n null,\n materialId,\n null,\n null,\n vertices,\n indices,\n uvCoords,\n normals,\n materialAttributes,\n animations,\n );\n return;\n }\n const runtimeComponent = this.getComponent(runtimeComponentId);\n if (!runtimeComponent) {\n return;\n }\n\n const isPreview = this._componentFactory.isPreview(runtimeComponent);\n const mesh = this._generateMesh(\n runtimeComponentId,\n geometryId,\n isPreview ? null : materialId,\n vertices,\n indices,\n uvCoords,\n normals,\n undefined,\n undefined,\n materialAttributes,\n );\n mesh.userData.meshId = meshId;\n mesh.userData.geometryId = geometryId;\n mesh.userData.materialId = materialId;\n this._applyMeshTransform(\n runtimeComponentId,\n mesh,\n mesh.userData,\n transform,\n uvTransform,\n animations,\n );\n if (isPreview) {\n mesh.layers.set(LAYER.PREVIEW);\n }\n // three-refactor\n // LAYER.OBJECT would help to create the baked ground shadow in planner\n // however, this will break the selection\n //mesh.layers.set(isPreview ? LAYER.PREVIEW : LAYER.OBJECT);\n if (runtimeComponent) {\n runtimeComponent.addMesh(mesh);\n }\n\n if (runtimeComponent.meshes.length > this._mergeThreshold) {\n this._componentsToMerge.set(\n runtimeComponentId,\n runtimeComponent.meshes.length,\n );\n }\n }\n\n private _changeMeshOfComponent(\n runtimeComponentId: number,\n meshId: number,\n geometryId: string,\n materialId: string,\n transform: Float32Array,\n uvTransform: Float32Array,\n materialAttributes: Record<string, string>,\n animations: Record<string, KernelMeshAnimation>,\n ): void {\n const runtimeComponent = this.getComponent(runtimeComponentId);\n if (!runtimeComponent) {\n return;\n }\n const mesh = runtimeComponent.getMeshById(meshId);\n if (mesh) {\n if (mesh.userData.geometryId !== geometryId) {\n console.warn('Geometry of mesh has changed!');\n }\n // set the material id before we set the material\n // so we know if we are setting the right material after it's loaded from the network\n mesh.userData.materialId = materialId;\n mesh.userData.materialAttributes = materialAttributes;\n const oldMaterial = (mesh.material as Material).clone();\n this._configuratorMeshGenerator\n .setMaterial(mesh, materialId, undefined, materialAttributes)\n .then(() => {\n if (this._requestRenderSceneUpdateCallback) {\n this._requestRenderSceneUpdateCallback();\n }\n });\n if (\n oldMaterial.opacity !== (mesh.material as Material).opacity &&\n this._requestRenderCallback\n ) {\n this._requestRenderCallback();\n }\n if (transform) {\n //reset mesh before applying new transform matrix\n mesh.position.set(0, 0, 0);\n mesh.scale.set(1, 1, 1);\n mesh.rotation.set(0, 0, 0);\n }\n const originalGeometry =\n this._configuratorMeshGenerator.getGeometry(geometryId);\n this._applyMeshTransform(\n runtimeComponentId,\n mesh,\n mesh.userData,\n transform,\n uvTransform,\n animations,\n originalGeometry,\n );\n }\n }\n\n private _removeMeshFromComponent(\n runtimeComponentId: number,\n meshId: number,\n ): void {\n const runtimeComponent = this.getComponent(runtimeComponentId);\n\n if (runtimeComponent) {\n runtimeComponent.removeMeshById(meshId);\n }\n }\n\n private _removeLightSourceFromComponent(\n runtimeComponentId: number,\n lightSourceId: number,\n ): void {\n const runtimeComponent = this.getComponent(runtimeComponentId);\n if (runtimeComponent) {\n runtimeComponent.removeLightSourceById(lightSourceId);\n }\n }\n\n private _addLightSourceToComponent(\n runtimeComponentId: number,\n lightSourceId: number,\n lightSourceAttributes: KernelLightSourceAttributes,\n ): void {\n const runtimeComponent = this.getComponent(runtimeComponentId);\n if (!runtimeComponent) {\n return;\n }\n const isPreview = this._componentFactory.isPreview(runtimeComponent);\n if (isPreview) {\n return;\n }\n const lightSource = generateLightSource(lightSourceAttributes);\n if (!lightSource) {\n return;\n }\n const roomleLightSource = new RoomleLightSource(lightSourceId, lightSource);\n runtimeComponent.addLightSource(roomleLightSource);\n }\n\n private _changeLightSourceOfComponent(\n runtimeComponentId: number,\n lightSourceId: number,\n lightSourceAttributes: KernelLightSourceAttributes,\n ): void {\n const runtimeComponent = this.getComponent(runtimeComponentId);\n if (!runtimeComponent) {\n return;\n }\n const lightSource = runtimeComponent.getLightSourceById(lightSourceId);\n if (!lightSource) {\n this._addLightSourceToComponent(\n runtimeComponentId,\n lightSourceId,\n lightSourceAttributes,\n );\n return;\n }\n lightSource.updateLightSource(lightSourceAttributes);\n }\n\n public getComponent(componentId: number) {\n let runtimeComponent = this._components.get(componentId);\n if (!runtimeComponent) {\n runtimeComponent = this._previews.get(componentId.toString());\n if (!runtimeComponent) {\n return null;\n }\n }\n return runtimeComponent;\n }\n\n public getNumberOfPossibleChildrenForComponent(componentId: number) {\n if (this._componentNumberOfPossibleChildren.has(componentId)) {\n return this._componentNumberOfPossibleChildren.get(componentId);\n }\n const numberOfPossibleChildren =\n this._getKernelAccess().kernelInstance.getPlanComponentPossibleChildren(\n componentId,\n ).length;\n this._componentNumberOfPossibleChildren.set(\n componentId,\n numberOfPossibleChildren,\n );\n return numberOfPossibleChildren;\n }\n\n public tryToMergeComponents() {\n if (this._initData.moc) {\n return;\n }\n if (!this._mergeInProgress) {\n this._mergeInProgress = true;\n console.log('start merging geometries', this._componentsToMerge.size);\n this._requestMergeComponents();\n }\n }\n\n private _requestMergeComponents() {\n (window as any).requestIdleCallback(this._mergeNextComponent.bind(this));\n }\n\n private _mergeNextComponent() {\n if (this._componentsToMerge.size > 0) {\n const componentId = this._componentsToMerge.largestValue();\n this._componentsToMerge.delete(componentId);\n this._mergeComponent(componentId);\n this._requestMergeComponents();\n } else {\n this._mergeInProgress = false;\n if (this._geometriesMerged) {\n this._geometriesMerged();\n }\n console.log('finished merging geometries');\n this._components.forEach((component) => {\n if (component.loadingMesh) {\n console.warn('component still has loading mesh: ', component.hash);\n }\n });\n }\n }\n\n private _mergeComponent(componentId: number): void {\n const roomleComponent = this._components.get(componentId);\n //only merge meshes when more than <threshold> are present, this saves memory because geometries can be reused then\n if (\n !roomleComponent ||\n roomleComponent.meshes.length <= this._mergeThreshold\n ) {\n return;\n }\n if (this._cacheHolder.componentCache.has(roomleComponent.hash)) {\n const meshes = this._cacheHolder.componentCache.get(\n roomleComponent.hash,\n ).meshes;\n roomleComponent.replaceMeshes(meshes);\n } else {\n const uniqueMaterialMeshes = new Map<string, Mesh>();\n const meshesToAdd: Mesh[] = [];\n const meshesToRemove: Mesh[] = [];\n roomleComponent.meshes.forEach((mesh) => {\n const materialId = mesh.userData.materialId;\n if (!materialId) {\n console.warn('mesh has no material id set');\n return;\n }\n if (!uniqueMaterialMeshes.has(materialId)) {\n const newMesh = new Mesh(new BufferGeometry(), mesh.material);\n newMesh.userData.materialId = materialId;\n newMesh.receiveShadow = true;\n newMesh.castShadow = true;\n newMesh.layers.set(LAYER.OBJECT);\n this._setMaterial(newMesh, materialId);\n meshesToAdd.push(newMesh);\n uniqueMaterialMeshes.set(materialId, newMesh);\n }\n const uniqueMesh = uniqueMaterialMeshes.get(materialId);\n const existingGeometry = uniqueMesh.geometry as BufferGeometry;\n if (mesh.userData.transform) {\n mesh.geometry.applyMatrix4(mesh.userData.transform);\n }\n uniqueMesh.geometry = BufferGeometryUtils.mergeGeometries([\n existingGeometry,\n mesh.geometry,\n ]);\n meshesToRemove.push(mesh);\n });\n meshesToAdd.forEach((componentMesh) =>\n roomleComponent.addMesh(componentMesh),\n );\n meshesToRemove.forEach((componentMesh) =>\n roomleComponent.removeMesh(componentMesh),\n );\n this._cacheHolder.componentCache.set(\n roomleComponent.hash,\n roomleComponent,\n );\n }\n }\n\n protected _addComponent(component: RoomleComponent) {\n if (this._listener && component.isRootComponent) {\n this._listener.display(component);\n }\n }\n\n public removeDockingComponent() {\n this._getKernelAccess().requestDeleteComponent(\n this._configuratorContext.dockingRootComponentId,\n );\n this._configuratorContext.dockingRootComponentId = null;\n }\n\n protected dockComponent(\n componentId: number,\n isRootComponent: boolean,\n parentId: number,\n componentPosition: KernelVector3,\n componentRotation: KernelVector3,\n ) {\n const parentComponent = this._components.get(parentId);\n const runtimeComponent = this._components.get(componentId);\n\n if (!runtimeComponent) {\n return;\n }\n runtimeComponent.roomlePosition = componentPosition;\n runtimeComponent.roomleRotation = componentRotation;\n if (parentComponent) {\n parentComponent.add(runtimeComponent);\n }\n runtimeComponent.parentObjectId = parentId;\n runtimeComponent.isRootComponent = isRootComponent;\n this._addComponent(runtimeComponent);\n }\n\n public dockComponentWithPosition(\n previewComponent: PreviewLineComponent,\n component?: RoomleComponent,\n ) {\n const newParent = this._components.get(previewComponent.parentId);\n let position;\n if (component) {\n position = component.getKernelPosition(newParent);\n } else {\n position = previewComponent.getKernelPosition(newParent);\n }\n\n const markname = Benchmark.start(\n 'dock_component_with_position_' + previewComponent.childId,\n );\n this._getKernelAccess().dockComponentWithPosition(\n previewComponent.parentId,\n previewComponent.parentDockId,\n previewComponent.childId,\n previewComponent.childDockId,\n position,\n );\n this._configuratorContext.dockingRootComponentId = null; // Fix #126\n Benchmark.end(markname);\n }\n\n public removePreviews() {\n if (this._previews.size > 0) {\n this._previews.forEach((preview) => {\n preview.dockInsertAnimation?.cleanUp();\n preview.removeFromParent();\n preview.removeAllMeshes();\n });\n this._previews.clear();\n }\n }\n\n private _updatePlanObject(planObject: PlanObject, pendingDocking: boolean) {\n const roomleComponent = this._components.get(\n planObject.rootPlanComponentId,\n );\n let geometryChanged = true;\n if (roomleComponent) {\n geometryChanged = roomleComponent.geometryChanged;\n }\n if (this._listener) {\n this._listener.planObjectUpdated(\n planObject,\n geometryChanged,\n pendingDocking,\n );\n }\n }\n\n public Editor3dAddDockPreview(componentId: number, previewId: number): void {\n const previewComponent = this._componentFactory.createPreview(\n previewId,\n componentId,\n this._creator_,\n ); // TODO: don't know if componentId is correct as parentObjectId\n this._previews.set(previewId.toString(), previewComponent);\n }\n\n public Editor3dAddMesh(\n runtimeComponentId: number,\n meshId: number,\n geometryName: string,\n environmentGeometry: boolean,\n meshAttributes: KernelMeshAttributes,\n meshBuffer: KernelMeshBuffer,\n ): void {\n this._addMeshToComponent(\n runtimeComponentId,\n meshId,\n geometryName,\n meshAttributes.materialId,\n meshAttributes.transform,\n meshAttributes.uvTransform,\n meshBuffer.vertices,\n meshBuffer.indices,\n meshBuffer.uvCoords,\n meshBuffer.normals,\n environmentGeometry,\n meshAttributes.materialAttributes,\n meshAttributes.animations,\n );\n }\n\n Editor3ChangedMesh(\n runtimeComponentId: number,\n meshId: number,\n geometryName: string,\n meshAttributes: KernelMeshAttributes,\n ) {\n this._changeMeshOfComponent(\n runtimeComponentId,\n meshId,\n geometryName,\n meshAttributes.materialId,\n meshAttributes.transform,\n meshAttributes.uvTransform,\n meshAttributes.materialAttributes,\n meshAttributes.animations,\n );\n }\n\n Editor3dRemoveMesh(runtimeComponentId: number, meshId: number): void {\n this._removeMeshFromComponent(runtimeComponentId, meshId);\n }\n\n Editor3dRemoveLightSource(\n runtimeComponentId: number,\n lightSourceId: number,\n ): void {\n this._removeLightSourceFromComponent(runtimeComponentId, lightSourceId);\n }\n\n Editor3dAddLightSource(\n runtimeComponentId: number,\n lightSourceId: number,\n lightSourceAttributes: KernelLightSourceAttributes,\n ): void {\n if (!this._initData.featureFlags.interiorLights) {\n return;\n }\n this._addLightSourceToComponent(\n runtimeComponentId,\n lightSourceId,\n lightSourceAttributes,\n );\n }\n\n Editor3dChangedLightSource(\n runtimeComponentId: number,\n lightSourceId: number,\n lightSourceAttributes: KernelLightSourceAttributes,\n ): void {\n if (!this._initData.featureFlags.interiorLights) {\n return;\n }\n this._changeLightSourceOfComponent(\n runtimeComponentId,\n lightSourceId,\n lightSourceAttributes,\n );\n }\n\n public Editor3dBeginConstruction(\n componentId: number,\n isDeltaUpdate: boolean,\n ): void {\n if (!USE_DELTA_COMPONENT_UPDATES || !isDeltaUpdate) {\n const component = this._components.get(componentId);\n if (component) {\n component.removeAllMeshes();\n }\n }\n if (this._subPartGuard && componentId === this._subPartGuard.info) {\n this._subPartObject = new Object3D();\n }\n }\n\n public Editor3dComponentCreated(\n id: number,\n position: KernelVector3,\n eulerAngles: KernelVector3,\n isRootComponent: boolean,\n parentObjectRuntimeId: number,\n ): void {\n if (isRootComponent) {\n this._configuratorContext.rootComponentId = id;\n }\n\n let roomleComponent: RoomleComponent = null;\n if (this._components.has(id)) {\n roomleComponent = this._components.get(id);\n roomleComponent.removeAllMeshes();\n } else {\n roomleComponent = this._componentFactory.create(\n id,\n position,\n eulerAngles,\n parentObjectRuntimeId,\n isRootComponent,\n );\n roomleComponent.layers.set(LAYER.OBJECT);\n }\n this._components.set(id, roomleComponent);\n this._addComponent(roomleComponent);\n }\n\n public Editor3dComponentDocked(\n componentId: number,\n isRootComponent: boolean,\n parentId: number,\n componentPosition: KernelVector3,\n componentRotation: KernelVector3,\n ): void {\n this.dockComponent(\n componentId,\n isRootComponent,\n parentId,\n componentPosition,\n componentRotation,\n );\n }\n\n public Editor3dEndConstruction(id: number): void {\n if (this._subPartGuard && this._subPartGuard.info === id) {\n this._subPartGuard.resolve(this._subPartObject);\n return;\n }\n\n const kernelComponent =\n this._getKernelAccess().kernelInstance.getComponent(id);\n const component = this._components.get(id);\n if (component) {\n component.computeBoundingBox(kernelComponent.boxForMeasurement);\n if (component.boundingBoxMesh && this._listener) {\n this._listener.addComponentHandlers(component);\n }\n }\n const preview = this._previews.get(id.toString());\n if (preview) {\n preview.computeBoundingBox(kernelComponent.boxForMeasurement, true);\n }\n }\n\n public Editor3dGeometryReady(id: number): void {\n const component = this._components.get(id);\n if (component) {\n component.loadingFinished();\n }\n }\n\n public Editor3dGeometryNotReady(id: number): void {\n const component = this._components.get(id);\n if (component) {\n component.loading();\n }\n }\n\n public Editor3dPlanObjectConstructionDone(planObjectId: number): void {\n const planObject =\n this._getKernelAccess().kernelInstance.getPlanObject(planObjectId);\n const partList = this._getKernelAccess().kernelInstance.getFullPartList();\n const hash =\n this._getKernelAccess().kernelInstance.getHashOfConfiguration(\n planObjectId,\n );\n const rootComponentRapiId =\n this._getKernelAccess().kernelInstance.getComponentId(\n planObject.rootPlanComponentId,\n );\n const params = [planObject, partList, hash, rootComponentRapiId];\n AsyncHelper.finishOperation(\n ASYNC_OPERATIONS.KERNEL_PLAN_OBJECT_CONSTRUCTION_DONE,\n params,\n );\n\n this._updatePlanObject(planObject, false);\n if (this._listener) {\n this._listener.planObjectConstructionDone(planObject);\n }\n }\n\n public Editor3dPreviewConstructionDone(\n componentId: number,\n _objectId: number,\n ): void {\n let hasPreviews = false;\n\n this._previews.forEach((preview) => {\n if (preview.parent !== null) {\n if (this._listener) {\n if (this._componentFactory.isPreviewLine(preview)) {\n this._listener.addPreviewLineHandlers(\n preview as PreviewLineComponent,\n );\n } else {\n this._listener.addPreviewHandlers(preview);\n }\n }\n hasPreviews = true;\n }\n });\n\n if (this._listener) {\n this._listener.previewConstructionDone(\n this._components.get(componentId),\n hasPreviews,\n );\n }\n }\n\n public Editor3dSetPreviewLineAssociations(\n dockLines: KernelDockPairToLine[],\n previewId: number,\n ): void {\n const previewComponent = this._previews.get(previewId.toString());\n previewComponent.clear();\n if (!previewComponent) {\n return;\n }\n const previewLineComponent = this._componentFactory.createPreviewLine(\n previewComponent,\n this._creator_,\n );\n const rootComponent = this._components.get(\n this._configuratorContext.rootComponentId,\n );\n for (let i = 0; i < dockLines.length; i++) {\n let clonedComponent: PreviewLineComponent;\n if (i === 0) {\n clonedComponent = previewLineComponent;\n } else {\n clonedComponent = previewLineComponent.clonePreviewLine(i);\n }\n\n clonedComponent.name = 'Preview Line';\n clonedComponent.parentDockId = dockLines[i].parentDockId;\n clonedComponent.parentId = dockLines[i].parentId;\n clonedComponent.childDockId = dockLines[i].childDockId;\n clonedComponent.childId = dockLines[i].childId;\n clonedComponent.docklineRotation = convertToEuler(dockLines[i].rotation);\n clonedComponent.roomlePosition = dockLines[i].position;\n\n clonedComponent.roomleLineFrom = dockLines[i].lineFrom;\n clonedComponent.roomleLineTo = dockLines[i].lineTo;\n clonedComponent.lineSegments = [];\n for (const segment of dockLines[i].lineSegments) {\n clonedComponent.lineSegments.push({\n from: segment.from / 1000,\n to: segment.to / 1000,\n });\n }\n\n clonedComponent.roomlePositionFrom = dockLines[i].positionFrom;\n clonedComponent.roomlePositionTo = dockLines[i].positionTo;\n\n rootComponent.add(clonedComponent);\n clonedComponent.preparePreview();\n\n this._previews.set(clonedComponent.stringId, clonedComponent);\n }\n }\n\n public Editor3dSetPreviewPointAssociations(\n dockPairs: KernelDockPairToPoint[],\n previewId: number,\n ): void {\n const previewComponent = this._previews.get(previewId.toString());\n if (!previewComponent) {\n return;\n }\n const rootComponent = this._components.get(\n this._configuratorContext.rootComponentId,\n );\n for (let i = 0; i < dockPairs.length; i++) {\n let clonedComponent: PreviewComponent;\n if (i === 0) {\n clonedComponent = previewComponent;\n } else {\n clonedComponent = previewComponent.clonePreview(i);\n this._previews.set(clonedComponent.stringId, clonedComponent);\n }\n\n clonedComponent.name = 'Preview Point';\n clonedComponent.parentDockId = dockPairs[i].parentDockId;\n clonedComponent.parentId = dockPairs[i].parentId;\n clonedComponent.childDockId = dockPairs[i].childDockId;\n clonedComponent.childId = dockPairs[i].childId;\n clonedComponent.preparePreview();\n clonedComponent.receivedPointAssociation = true;\n clonedComponent.userData.ignoreComponentRaycast = true;\n this._addDockPreviewAnimation(\n clonedComponent,\n previewId.toString() + '_' + i,\n dockPairs[i],\n );\n\n rootComponent.add(clonedComponent);\n const previewPosition = dockPairs[i].position;\n clonedComponent.roomlePosition = previewPosition;\n clonedComponent.roomleRotation = dockPairs[i].rotation;\n clonedComponent.startPulsating();\n }\n }\n\n private _addDockPreviewAnimation(\n previewComponent: PreviewComponent,\n previewId: string,\n dockPair: KernelDockPairToPoint,\n ) {\n if (!this._initData.featureFlags?.advancedDocking) {\n return;\n }\n const displacedComponent = this._components.get(\n dockPair.displacedChildId as number,\n );\n if (!displacedComponent) {\n return;\n }\n previewComponent.dockInsertAnimation = new DragInsertAnimation(\n previewId,\n previewComponent,\n displacedComponent,\n dockPair,\n this._invalidateRenderCallback,\n );\n }\n\n public componentDeleted(componentId: number): void {\n const component = this._components.get(componentId);\n if (!component) {\n return;\n }\n\n if (this._listener) {\n this._listener.componentDeleted(component);\n }\n\n component.removeFromParent();\n component.removeAllMeshes();\n this._components.delete(componentId);\n }\n\n public componentMetaUpdated(kernelComponent: KernelComponent): void {\n const runtimeComponent = this._getRuntimeComponent(kernelComponent.id);\n if (!runtimeComponent) {\n return;\n }\n runtimeComponent.hash = kernelComponent.hash;\n runtimeComponent.roomlePosition = kernelComponent.position;\n runtimeComponent.roomleRotation = kernelComponent.rotation;\n if (kernelComponent.boxForMeasurement) {\n runtimeComponent.computeBoundingBox(kernelComponent.boxForMeasurement);\n }\n if (this._listener) {\n this._listener.componentUpdated(runtimeComponent, kernelComponent);\n }\n }\n\n public componentConfigurationUpdated(\n runtimeComponentId: number,\n geometryChanged: boolean,\n ): void {\n const runtimeComponent = this._getRuntimeComponent(runtimeComponentId);\n if (!runtimeComponent) {\n return;\n }\n runtimeComponent.geometryChanged = geometryChanged;\n }\n\n private _getRuntimeComponent(runtimeComponentId: number): RoomleComponent {\n let runtimeComponent = this._components.get(runtimeComponentId);\n if (!runtimeComponent) {\n runtimeComponent = this._previews.get(runtimeComponentId.toString());\n if (!runtimeComponent) {\n return null;\n }\n }\n return runtimeComponent;\n }\n\n public configurationLoaded(\n conversationId: number,\n objectId: number,\n componentId: number,\n _hash: string,\n _errors: any,\n ): void {\n if (conversationId === DOCKING_CONVERSATION_ID) {\n this._configuratorContext.dockingRootComponentId = componentId;\n }\n const isFreeFlying = objectId === 0;\n if (!isFreeFlying) {\n this._getKernelAccess().kernelInstance.requestPlanObjectConstruction(\n objectId,\n );\n } else {\n this._getKernelAccess().kernelInstance.requestPlanComponentConstructionRecursive(\n componentId,\n );\n }\n const kernelComponent =\n this._getKernelAccess().kernelInstance.getComponent(componentId);\n\n const component = this._components.get(componentId);\n if (component) {\n component.computeBoundingBox(kernelComponent.boxForMeasurement);\n component.hash = kernelComponent.hash;\n }\n if (this._listener) {\n this._listener.configurationLoaded(\n component,\n isFreeFlying && component.boundingBoxMesh !== undefined,\n );\n }\n }\n\n public finishParameterChange(resolve: () => void, _reject: () => void): void {\n this.materialQueue.registerCallback(resolve);\n }\n\n public planObjectConfigurationUpdated(\n planObjectId: number,\n _configuration: ConfigurationString,\n _hash: string,\n pendingDocking: boolean,\n ): void {\n const planObject =\n this._getKernelAccess().kernelInstance.getPlanObject(planObjectId);\n this._updatePlanObject(planObject, pendingDocking);\n }\n\n //planObjectId = runtimeConfigurationId\n public planObjectCreated(_conversationId: number, planObjectId: number): void {\n this._configuratorContext.planObjectId = planObjectId;\n\n if (this._listener) {\n this._listener.clearScene();\n }\n }\n\n public planObjectUpdated(\n planObject: PlanObject,\n pendingDocking: boolean,\n ): void {\n this._updatePlanObject(planObject, pendingDocking);\n }\n\n public sceneCleared(): void {\n this._components.forEach(function (component) {\n component.removeFromParent();\n component.removeAllMeshes();\n });\n this._components.clear();\n this._componentNumberOfPossibleChildren.clear();\n this._previews.forEach((preview) => {\n preview.removeFromParent();\n preview.removeAllMeshes();\n });\n this._previews.clear();\n }\n\n public setListener(listener: ConfiguratorViewModelCallbackI) {\n this._listener = listener;\n }\n\n public getBoundingBox(): Box3 {\n if (this._configuratorContext.planObjectId) {\n const planObject = this._getKernelAccess().kernelInstance.getPlanObject(\n this._configuratorContext.planObjectId,\n );\n if (planObject && planObject.boxForMeasurement) {\n return kernelBoxToThreeBox(planObject.boxForMeasurement);\n }\n } else if (this._configuratorContext.rootComponentId) {\n const component = this._components.get(\n this._configuratorContext.rootComponentId,\n );\n return new Box3().setFromObject(component);\n }\n return null;\n }\n\n public getBoundingBoxOfGeometry(): Box3 {\n if (this._configuratorContext.planObjectId) {\n const planObject = this._getKernelAccess().kernelInstance.getPlanObject(\n this._configuratorContext.planObjectId,\n );\n if (planObject && planObject.boxOfGeometry) {\n return kernelBoxToThreeBox(planObject.boxOfGeometry);\n }\n } else if (this._configuratorContext.rootComponentId) {\n const component = this._components.get(\n this._configuratorContext.rootComponentId,\n );\n return new Box3().setFromObject(component);\n }\n return null;\n }\n\n public getBoundingBoxWithPreviews(): Box3 {\n const component = this._components.get(\n this._configuratorContext.rootComponentId,\n );\n if (!component) {\n return null;\n }\n return new Box3().setFromObject(component);\n }\n\n public hasPreviews(): boolean {\n return this._previews.size > 0;\n }\n\n public clearRootComponent() {\n this._components.get(this._configuratorContext.rootComponentId)?.hoverOff();\n }\n\n public debugSceneGraph(id?: number) {\n if (id) {\n if (this._components.has(id)) {\n console.log(this._components.get(id));\n } else if (this._previews.has(id.toString())) {\n console.log(this._previews.get(id.toString()));\n }\n return;\n }\n console.log(this._configuratorContext);\n }\n\n public getComponentsForIds(ids: number[]): RoomleComponent[] {\n const components: RoomleComponent[] = [];\n ids.forEach((id) => {\n const component = this._components.get(id);\n if (component) {\n components.push(component);\n }\n });\n return components;\n }\n\n public getComponents(): RoomleComponent[] {\n return Array.from(this._components.values());\n }\n\n public getPreviews(): PreviewComponent[] {\n return Array.from(this._previews.values());\n }\n\n public hasPreviewLines(): boolean {\n for (const preview of this._previews.values()) {\n if (this._componentFactory.isPreviewLine(preview)) {\n return true;\n }\n }\n return false;\n }\n\n public isPreviewLine(obj: RoomleComponent) {\n return this._componentFactory.isPreviewLine(obj);\n }\n\n public isPreview(obj: RoomleComponent) {\n return this._componentFactory.isPreview(obj);\n }\n\n public setGeometriesMergedListener(fun: () => void) {\n this._geometriesMerged = fun;\n }\n\n public removeGeometriesMergedListener() {\n this._geometriesMerged = undefined;\n }\n\n public setMergeThreshold(threshold: number) {\n this._mergeThreshold = threshold;\n }\n\n protected _generateMesh(\n runtimeComponentId: number = 0,\n geometryId: string = null,\n materialId: string,\n vertices: Float32Array,\n indices: Int32Array,\n uvCoords: Float32Array,\n normals: Float32Array,\n _type?: KernelEnum,\n _newGeometryInstance?: boolean,\n materialAttributes?: Record<string, string>,\n ): Mesh {\n return this._configuratorMeshGenerator.generateMesh(\n runtimeComponentId,\n geometryId,\n materialId,\n vertices,\n indices,\n uvCoords,\n normals,\n false,\n materialAttributes,\n );\n }\n\n protected _setMaterial(mesh: Mesh, material: any, _type?: KernelEnum) {\n this._configuratorMeshGenerator.setMaterial(mesh, material);\n }\n\n public constructComponents(planObjectId: number) {\n // const componentId = this._getKernelAccess().kernelInstance.getRootPlanComponentIdFromObjectId(planObjectId);\n // this._constructComponentsRecursive(componentId);\n this._getKernelAccess().kernelInstance.requestPlanObjectConstruction(\n planObjectId,\n );\n }\n\n public requestSubPartConstruction(partId: number): Promise<Mesh> {\n this._subPartGuard = new AsyncGuard<Mesh>(partId);\n this._getKernelAccess().requestPlanComponentConstruction(partId, false);\n return this._subPartGuard.wait();\n }\n\n protected getMeshGenerator(): MeshGenerator {\n return this._configuratorMeshGenerator;\n }\n\n public setRequestRenderCallback(requestRenderCallback: () => void) {\n this._requestRenderCallback = requestRenderCallback;\n }\n\n public setRequestRenderSceneUpdateCallback(\n requestRenderSceneUpdateCallback: () => void,\n ) {\n this._requestRenderSceneUpdateCallback = requestRenderSceneUpdateCallback;\n }\n\n public setInvalidateRenderCallback(invalidateRenderCallback: () => void) {\n this._invalidateRenderCallback = invalidateRenderCallback;\n }\n}\n\nclass OccurrenceMap extends Map<number, number> {\n public largestValue(): number {\n let largestKey: number = this.entries().next().value[0];\n let largestValue = 0;\n this.forEach((v, k) => {\n if (v > largestValue) {\n largestKey = k;\n largestValue = v;\n }\n });\n return largestKey;\n }\n}\n","import { clamp } from './MathUtils.js';\n\nclass Vector4 {\n\n\tconstructor( x = 0, y = 0, z = 0, w = 1 ) {\n\n\t\tVector4.prototype.isVector4 = true;\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\t\tthis.w = w;\n\n\t}\n\n\tget width() {\n\n\t\treturn this.z;\n\n\t}\n\n\tset width( value ) {\n\n\t\tthis.z = value;\n\n\t}\n\n\tget height() {\n\n\t\treturn this.w;\n\n\t}\n\n\tset height( value ) {\n\n\t\tthis.w = value;\n\n\t}\n\n\tset( x, y, z, w ) {\n\n\t\tthis.x = x;\n\t\tthis.y = y;\n\t\tthis.z = z;\n\t\tthis.w = w;\n\n\t\treturn this;\n\n\t}\n\n\tsetScalar( scalar ) {\n\n\t\tthis.x = scalar;\n\t\tthis.y = scalar;\n\t\tthis.z = scalar;\n\t\tthis.w = scalar;\n\n\t\treturn this;\n\n\t}\n\n\tsetX( x ) {\n\n\t\tthis.x = x;\n\n\t\treturn this;\n\n\t}\n\n\tsetY( y ) {\n\n\t\tthis.y = y;\n\n\t\treturn this;\n\n\t}\n\n\tsetZ( z ) {\n\n\t\tthis.z = z;\n\n\t\treturn this;\n\n\t}\n\n\tsetW( w ) {\n\n\t\tthis.w = w;\n\n\t\treturn this;\n\n\t}\n\n\tsetComponent( index, value ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: this.x = value; break;\n\t\t\tcase 1: this.y = value; break;\n\t\t\tcase 2: this.z = value; break;\n\t\t\tcase 3: this.w = value; break;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tgetComponent( index ) {\n\n\t\tswitch ( index ) {\n\n\t\t\tcase 0: return this.x;\n\t\t\tcase 1: return this.y;\n\t\t\tcase 2: return this.z;\n\t\t\tcase 3: return this.w;\n\t\t\tdefault: throw new Error( 'index is out of range: ' + index );\n\n\t\t}\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor( this.x, this.y, this.z, this.w );\n\n\t}\n\n\tcopy( v ) {\n\n\t\tthis.x = v.x;\n\t\tthis.y = v.y;\n\t\tthis.z = v.z;\n\t\tthis.w = ( v.w !== undefined ) ? v.w : 1;\n\n\t\treturn this;\n\n\t}\n\n\tadd( v ) {\n\n\t\tthis.x += v.x;\n\t\tthis.y += v.y;\n\t\tthis.z += v.z;\n\t\tthis.w += v.w;\n\n\t\treturn this;\n\n\t}\n\n\taddScalar( s ) {\n\n\t\tthis.x += s;\n\t\tthis.y += s;\n\t\tthis.z += s;\n\t\tthis.w += s;\n\n\t\treturn this;\n\n\t}\n\n\taddVectors( a, b ) {\n\n\t\tthis.x = a.x + b.x;\n\t\tthis.y = a.y + b.y;\n\t\tthis.z = a.z + b.z;\n\t\tthis.w = a.w + b.w;\n\n\t\treturn this;\n\n\t}\n\n\taddScaledVector( v, s ) {\n\n\t\tthis.x += v.x * s;\n\t\tthis.y += v.y * s;\n\t\tthis.z += v.z * s;\n\t\tthis.w += v.w * s;\n\n\t\treturn this;\n\n\t}\n\n\tsub( v ) {\n\n\t\tthis.x -= v.x;\n\t\tthis.y -= v.y;\n\t\tthis.z -= v.z;\n\t\tthis.w -= v.w;\n\n\t\treturn this;\n\n\t}\n\n\tsubScalar( s ) {\n\n\t\tthis.x -= s;\n\t\tthis.y -= s;\n\t\tthis.z -= s;\n\t\tthis.w -= s;\n\n\t\treturn this;\n\n\t}\n\n\tsubVectors( a, b ) {\n\n\t\tthis.x = a.x - b.x;\n\t\tthis.y = a.y - b.y;\n\t\tthis.z = a.z - b.z;\n\t\tthis.w = a.w - b.w;\n\n\t\treturn this;\n\n\t}\n\n\tmultiply( v ) {\n\n\t\tthis.x *= v.x;\n\t\tthis.y *= v.y;\n\t\tthis.z *= v.z;\n\t\tthis.w *= v.w;\n\n\t\treturn this;\n\n\t}\n\n\tmultiplyScalar( scalar ) {\n\n\t\tthis.x *= scalar;\n\t\tthis.y *= scalar;\n\t\tthis.z *= scalar;\n\t\tthis.w *= scalar;\n\n\t\treturn this;\n\n\t}\n\n\tapplyMatrix4( m ) {\n\n\t\tconst x = this.x, y = this.y, z = this.z, w = this.w;\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 0 ] * x + e[ 4 ] * y + e[ 8 ] * z + e[ 12 ] * w;\n\t\tthis.y = e[ 1 ] * x + e[ 5 ] * y + e[ 9 ] * z + e[ 13 ] * w;\n\t\tthis.z = e[ 2 ] * x + e[ 6 ] * y + e[ 10 ] * z + e[ 14 ] * w;\n\t\tthis.w = e[ 3 ] * x + e[ 7 ] * y + e[ 11 ] * z + e[ 15 ] * w;\n\n\t\treturn this;\n\n\t}\n\n\tdivide( v ) {\n\n\t\tthis.x /= v.x;\n\t\tthis.y /= v.y;\n\t\tthis.z /= v.z;\n\t\tthis.w /= v.w;\n\n\t\treturn this;\n\n\t}\n\n\tdivideScalar( scalar ) {\n\n\t\treturn this.multiplyScalar( 1 / scalar );\n\n\t}\n\n\tsetAxisAngleFromQuaternion( q ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/quaternionToAngle/index.htm\n\n\t\t// q is assumed to be normalized\n\n\t\tthis.w = 2 * Math.acos( q.w );\n\n\t\tconst s = Math.sqrt( 1 - q.w * q.w );\n\n\t\tif ( s < 0.0001 ) {\n\n\t\t\tthis.x = 1;\n\t\t\tthis.y = 0;\n\t\t\tthis.z = 0;\n\n\t\t} else {\n\n\t\t\tthis.x = q.x / s;\n\t\t\tthis.y = q.y / s;\n\t\t\tthis.z = q.z / s;\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetAxisAngleFromRotationMatrix( m ) {\n\n\t\t// http://www.euclideanspace.com/maths/geometry/rotations/conversions/matrixToAngle/index.htm\n\n\t\t// assumes the upper 3x3 of m is a pure rotation matrix (i.e, unscaled)\n\n\t\tlet angle, x, y, z; // variables for result\n\t\tconst epsilon = 0.01,\t\t// margin to allow for rounding errors\n\t\t\tepsilon2 = 0.1,\t\t// margin to distinguish between 0 and 180 degrees\n\n\t\t\tte = m.elements,\n\n\t\t\tm11 = te[ 0 ], m12 = te[ 4 ], m13 = te[ 8 ],\n\t\t\tm21 = te[ 1 ], m22 = te[ 5 ], m23 = te[ 9 ],\n\t\t\tm31 = te[ 2 ], m32 = te[ 6 ], m33 = te[ 10 ];\n\n\t\tif ( ( Math.abs( m12 - m21 ) < epsilon ) &&\n\t\t ( Math.abs( m13 - m31 ) < epsilon ) &&\n\t\t ( Math.abs( m23 - m32 ) < epsilon ) ) {\n\n\t\t\t// singularity found\n\t\t\t// first check for identity matrix which must have +1 for all terms\n\t\t\t// in leading diagonal and zero in other terms\n\n\t\t\tif ( ( Math.abs( m12 + m21 ) < epsilon2 ) &&\n\t\t\t ( Math.abs( m13 + m31 ) < epsilon2 ) &&\n\t\t\t ( Math.abs( m23 + m32 ) < epsilon2 ) &&\n\t\t\t ( Math.abs( m11 + m22 + m33 - 3 ) < epsilon2 ) ) {\n\n\t\t\t\t// this singularity is identity matrix so angle = 0\n\n\t\t\t\tthis.set( 1, 0, 0, 0 );\n\n\t\t\t\treturn this; // zero angle, arbitrary axis\n\n\t\t\t}\n\n\t\t\t// otherwise this singularity is angle = 180\n\n\t\t\tangle = Math.PI;\n\n\t\t\tconst xx = ( m11 + 1 ) / 2;\n\t\t\tconst yy = ( m22 + 1 ) / 2;\n\t\t\tconst zz = ( m33 + 1 ) / 2;\n\t\t\tconst xy = ( m12 + m21 ) / 4;\n\t\t\tconst xz = ( m13 + m31 ) / 4;\n\t\t\tconst yz = ( m23 + m32 ) / 4;\n\n\t\t\tif ( ( xx > yy ) && ( xx > zz ) ) {\n\n\t\t\t\t// m11 is the largest diagonal term\n\n\t\t\t\tif ( xx < epsilon ) {\n\n\t\t\t\t\tx = 0;\n\t\t\t\t\ty = 0.707106781;\n\t\t\t\t\tz = 0.707106781;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tx = Math.sqrt( xx );\n\t\t\t\t\ty = xy / x;\n\t\t\t\t\tz = xz / x;\n\n\t\t\t\t}\n\n\t\t\t} else if ( yy > zz ) {\n\n\t\t\t\t// m22 is the largest diagonal term\n\n\t\t\t\tif ( yy < epsilon ) {\n\n\t\t\t\t\tx = 0.707106781;\n\t\t\t\t\ty = 0;\n\t\t\t\t\tz = 0.707106781;\n\n\t\t\t\t} else {\n\n\t\t\t\t\ty = Math.sqrt( yy );\n\t\t\t\t\tx = xy / y;\n\t\t\t\t\tz = yz / y;\n\n\t\t\t\t}\n\n\t\t\t} else {\n\n\t\t\t\t// m33 is the largest diagonal term so base result on this\n\n\t\t\t\tif ( zz < epsilon ) {\n\n\t\t\t\t\tx = 0.707106781;\n\t\t\t\t\ty = 0.707106781;\n\t\t\t\t\tz = 0;\n\n\t\t\t\t} else {\n\n\t\t\t\t\tz = Math.sqrt( zz );\n\t\t\t\t\tx = xz / z;\n\t\t\t\t\ty = yz / z;\n\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tthis.set( x, y, z, angle );\n\n\t\t\treturn this; // return 180 deg rotation\n\n\t\t}\n\n\t\t// as we have reached here there are no singularities so we can handle normally\n\n\t\tlet s = Math.sqrt( ( m32 - m23 ) * ( m32 - m23 ) +\n\t\t\t( m13 - m31 ) * ( m13 - m31 ) +\n\t\t\t( m21 - m12 ) * ( m21 - m12 ) ); // used to normalize\n\n\t\tif ( Math.abs( s ) < 0.001 ) s = 1;\n\n\t\t// prevent divide by zero, should not happen if matrix is orthogonal and should be\n\t\t// caught by singularity test above, but I've left it in just in case\n\n\t\tthis.x = ( m32 - m23 ) / s;\n\t\tthis.y = ( m13 - m31 ) / s;\n\t\tthis.z = ( m21 - m12 ) / s;\n\t\tthis.w = Math.acos( ( m11 + m22 + m33 - 1 ) / 2 );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromMatrixPosition( m ) {\n\n\t\tconst e = m.elements;\n\n\t\tthis.x = e[ 12 ];\n\t\tthis.y = e[ 13 ];\n\t\tthis.z = e[ 14 ];\n\t\tthis.w = e[ 15 ];\n\n\t\treturn this;\n\n\t}\n\n\tmin( v ) {\n\n\t\tthis.x = Math.min( this.x, v.x );\n\t\tthis.y = Math.min( this.y, v.y );\n\t\tthis.z = Math.min( this.z, v.z );\n\t\tthis.w = Math.min( this.w, v.w );\n\n\t\treturn this;\n\n\t}\n\n\tmax( v ) {\n\n\t\tthis.x = Math.max( this.x, v.x );\n\t\tthis.y = Math.max( this.y, v.y );\n\t\tthis.z = Math.max( this.z, v.z );\n\t\tthis.w = Math.max( this.w, v.w );\n\n\t\treturn this;\n\n\t}\n\n\tclamp( min, max ) {\n\n\t\t// assumes min < max, componentwise\n\n\t\tthis.x = clamp( this.x, min.x, max.x );\n\t\tthis.y = clamp( this.y, min.y, max.y );\n\t\tthis.z = clamp( this.z, min.z, max.z );\n\t\tthis.w = clamp( this.w, min.w, max.w );\n\n\t\treturn this;\n\n\t}\n\n\tclampScalar( minVal, maxVal ) {\n\n\t\tthis.x = clamp( this.x, minVal, maxVal );\n\t\tthis.y = clamp( this.y, minVal, maxVal );\n\t\tthis.z = clamp( this.z, minVal, maxVal );\n\t\tthis.w = clamp( this.w, minVal, maxVal );\n\n\t\treturn this;\n\n\t}\n\n\tclampLength( min, max ) {\n\n\t\tconst length = this.length();\n\n\t\treturn this.divideScalar( length || 1 ).multiplyScalar( clamp( length, min, max ) );\n\n\t}\n\n\tfloor() {\n\n\t\tthis.x = Math.floor( this.x );\n\t\tthis.y = Math.floor( this.y );\n\t\tthis.z = Math.floor( this.z );\n\t\tthis.w = Math.floor( this.w );\n\n\t\treturn this;\n\n\t}\n\n\tceil() {\n\n\t\tthis.x = Math.ceil( this.x );\n\t\tthis.y = Math.ceil( this.y );\n\t\tthis.z = Math.ceil( this.z );\n\t\tthis.w = Math.ceil( this.w );\n\n\t\treturn this;\n\n\t}\n\n\tround() {\n\n\t\tthis.x = Math.round( this.x );\n\t\tthis.y = Math.round( this.y );\n\t\tthis.z = Math.round( this.z );\n\t\tthis.w = Math.round( this.w );\n\n\t\treturn this;\n\n\t}\n\n\troundToZero() {\n\n\t\tthis.x = Math.trunc( this.x );\n\t\tthis.y = Math.trunc( this.y );\n\t\tthis.z = Math.trunc( this.z );\n\t\tthis.w = Math.trunc( this.w );\n\n\t\treturn this;\n\n\t}\n\n\tnegate() {\n\n\t\tthis.x = - this.x;\n\t\tthis.y = - this.y;\n\t\tthis.z = - this.z;\n\t\tthis.w = - this.w;\n\n\t\treturn this;\n\n\t}\n\n\tdot( v ) {\n\n\t\treturn this.x * v.x + this.y * v.y + this.z * v.z + this.w * v.w;\n\n\t}\n\n\tlengthSq() {\n\n\t\treturn this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w;\n\n\t}\n\n\tlength() {\n\n\t\treturn Math.sqrt( this.x * this.x + this.y * this.y + this.z * this.z + this.w * this.w );\n\n\t}\n\n\tmanhattanLength() {\n\n\t\treturn Math.abs( this.x ) + Math.abs( this.y ) + Math.abs( this.z ) + Math.abs( this.w );\n\n\t}\n\n\tnormalize() {\n\n\t\treturn this.divideScalar( this.length() || 1 );\n\n\t}\n\n\tsetLength( length ) {\n\n\t\treturn this.normalize().multiplyScalar( length );\n\n\t}\n\n\tlerp( v, alpha ) {\n\n\t\tthis.x += ( v.x - this.x ) * alpha;\n\t\tthis.y += ( v.y - this.y ) * alpha;\n\t\tthis.z += ( v.z - this.z ) * alpha;\n\t\tthis.w += ( v.w - this.w ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\tlerpVectors( v1, v2, alpha ) {\n\n\t\tthis.x = v1.x + ( v2.x - v1.x ) * alpha;\n\t\tthis.y = v1.y + ( v2.y - v1.y ) * alpha;\n\t\tthis.z = v1.z + ( v2.z - v1.z ) * alpha;\n\t\tthis.w = v1.w + ( v2.w - v1.w ) * alpha;\n\n\t\treturn this;\n\n\t}\n\n\tequals( v ) {\n\n\t\treturn ( ( v.x === this.x ) && ( v.y === this.y ) && ( v.z === this.z ) && ( v.w === this.w ) );\n\n\t}\n\n\tfromArray( array, offset = 0 ) {\n\n\t\tthis.x = array[ offset ];\n\t\tthis.y = array[ offset + 1 ];\n\t\tthis.z = array[ offset + 2 ];\n\t\tthis.w = array[ offset + 3 ];\n\n\t\treturn this;\n\n\t}\n\n\ttoArray( array = [], offset = 0 ) {\n\n\t\tarray[ offset ] = this.x;\n\t\tarray[ offset + 1 ] = this.y;\n\t\tarray[ offset + 2 ] = this.z;\n\t\tarray[ offset + 3 ] = this.w;\n\n\t\treturn array;\n\n\t}\n\n\tfromBufferAttribute( attribute, index ) {\n\n\t\tthis.x = attribute.getX( index );\n\t\tthis.y = attribute.getY( index );\n\t\tthis.z = attribute.getZ( index );\n\t\tthis.w = attribute.getW( index );\n\n\t\treturn this;\n\n\t}\n\n\trandom() {\n\n\t\tthis.x = Math.random();\n\t\tthis.y = Math.random();\n\t\tthis.z = Math.random();\n\t\tthis.w = Math.random();\n\n\t\treturn this;\n\n\t}\n\n\t*[ Symbol.iterator ]() {\n\n\t\tyield this.x;\n\t\tyield this.y;\n\t\tyield this.z;\n\t\tyield this.w;\n\n\t}\n\n}\n\nexport { Vector4 };\n","import { Matrix3 } from './Matrix3.js';\nimport { Vector3 } from './Vector3.js';\n\nconst _vector1 = /*@__PURE__*/ new Vector3();\nconst _vector2 = /*@__PURE__*/ new Vector3();\nconst _normalMatrix = /*@__PURE__*/ new Matrix3();\n\nclass Plane {\n\n\tconstructor( normal = new Vector3( 1, 0, 0 ), constant = 0 ) {\n\n\t\tthis.isPlane = true;\n\n\t\t// normal is assumed to be normalized\n\n\t\tthis.normal = normal;\n\t\tthis.constant = constant;\n\n\t}\n\n\tset( normal, constant ) {\n\n\t\tthis.normal.copy( normal );\n\t\tthis.constant = constant;\n\n\t\treturn this;\n\n\t}\n\n\tsetComponents( x, y, z, w ) {\n\n\t\tthis.normal.set( x, y, z );\n\t\tthis.constant = w;\n\n\t\treturn this;\n\n\t}\n\n\tsetFromNormalAndCoplanarPoint( normal, point ) {\n\n\t\tthis.normal.copy( normal );\n\t\tthis.constant = - point.dot( this.normal );\n\n\t\treturn this;\n\n\t}\n\n\tsetFromCoplanarPoints( a, b, c ) {\n\n\t\tconst normal = _vector1.subVectors( c, b ).cross( _vector2.subVectors( a, b ) ).normalize();\n\n\t\t// Q: should an error be thrown if normal is zero (e.g. degenerate plane)?\n\n\t\tthis.setFromNormalAndCoplanarPoint( normal, a );\n\n\t\treturn this;\n\n\t}\n\n\tcopy( plane ) {\n\n\t\tthis.normal.copy( plane.normal );\n\t\tthis.constant = plane.constant;\n\n\t\treturn this;\n\n\t}\n\n\tnormalize() {\n\n\t\t// Note: will lead to a divide by zero if the plane is invalid.\n\n\t\tconst inverseNormalLength = 1.0 / this.normal.length();\n\t\tthis.normal.multiplyScalar( inverseNormalLength );\n\t\tthis.constant *= inverseNormalLength;\n\n\t\treturn this;\n\n\t}\n\n\tnegate() {\n\n\t\tthis.constant *= - 1;\n\t\tthis.normal.negate();\n\n\t\treturn this;\n\n\t}\n\n\tdistanceToPoint( point ) {\n\n\t\treturn this.normal.dot( point ) + this.constant;\n\n\t}\n\n\tdistanceToSphere( sphere ) {\n\n\t\treturn this.distanceToPoint( sphere.center ) - sphere.radius;\n\n\t}\n\n\tprojectPoint( point, target ) {\n\n\t\treturn target.copy( point ).addScaledVector( this.normal, - this.distanceToPoint( point ) );\n\n\t}\n\n\tintersectLine( line, target ) {\n\n\t\tconst direction = line.delta( _vector1 );\n\n\t\tconst denominator = this.normal.dot( direction );\n\n\t\tif ( denominator === 0 ) {\n\n\t\t\t// line is coplanar, return origin\n\t\t\tif ( this.distanceToPoint( line.start ) === 0 ) {\n\n\t\t\t\treturn target.copy( line.start );\n\n\t\t\t}\n\n\t\t\t// Unsure if this is the correct method to handle this case.\n\t\t\treturn null;\n\n\t\t}\n\n\t\tconst t = - ( line.start.dot( this.normal ) + this.constant ) / denominator;\n\n\t\tif ( t < 0 || t > 1 ) {\n\n\t\t\treturn null;\n\n\t\t}\n\n\t\treturn target.copy( line.start ).addScaledVector( direction, t );\n\n\t}\n\n\tintersectsLine( line ) {\n\n\t\t// Note: this tests if a line intersects the plane, not whether it (or its end-points) are coplanar with it.\n\n\t\tconst startSign = this.distanceToPoint( line.start );\n\t\tconst endSign = this.distanceToPoint( line.end );\n\n\t\treturn ( startSign < 0 && endSign > 0 ) || ( endSign < 0 && startSign > 0 );\n\n\t}\n\n\tintersectsBox( box ) {\n\n\t\treturn box.intersectsPlane( this );\n\n\t}\n\n\tintersectsSphere( sphere ) {\n\n\t\treturn sphere.intersectsPlane( this );\n\n\t}\n\n\tcoplanarPoint( target ) {\n\n\t\treturn target.copy( this.normal ).multiplyScalar( - this.constant );\n\n\t}\n\n\tapplyMatrix4( matrix, optionalNormalMatrix ) {\n\n\t\tconst normalMatrix = optionalNormalMatrix || _normalMatrix.getNormalMatrix( matrix );\n\n\t\tconst referencePoint = this.coplanarPoint( _vector1 ).applyMatrix4( matrix );\n\n\t\tconst normal = this.normal.applyMatrix3( normalMatrix ).normalize();\n\n\t\tthis.constant = - referencePoint.dot( normal );\n\n\t\treturn this;\n\n\t}\n\n\ttranslate( offset ) {\n\n\t\tthis.constant -= offset.dot( this.normal );\n\n\t\treturn this;\n\n\t}\n\n\tequals( plane ) {\n\n\t\treturn plane.normal.equals( this.normal ) && ( plane.constant === this.constant );\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nexport { Plane };\n","import { WebGLCoordinateSystem, WebGPUCoordinateSystem } from '../constants.js';\nimport { Vector3 } from './Vector3.js';\nimport { Sphere } from './Sphere.js';\nimport { Plane } from './Plane.js';\n\nconst _sphere = /*@__PURE__*/ new Sphere();\nconst _vector = /*@__PURE__*/ new Vector3();\n\nclass Frustum {\n\n\tconstructor( p0 = new Plane(), p1 = new Plane(), p2 = new Plane(), p3 = new Plane(), p4 = new Plane(), p5 = new Plane() ) {\n\n\t\tthis.planes = [ p0, p1, p2, p3, p4, p5 ];\n\n\t}\n\n\tset( p0, p1, p2, p3, p4, p5 ) {\n\n\t\tconst planes = this.planes;\n\n\t\tplanes[ 0 ].copy( p0 );\n\t\tplanes[ 1 ].copy( p1 );\n\t\tplanes[ 2 ].copy( p2 );\n\t\tplanes[ 3 ].copy( p3 );\n\t\tplanes[ 4 ].copy( p4 );\n\t\tplanes[ 5 ].copy( p5 );\n\n\t\treturn this;\n\n\t}\n\n\tcopy( frustum ) {\n\n\t\tconst planes = this.planes;\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tplanes[ i ].copy( frustum.planes[ i ] );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tsetFromProjectionMatrix( m, coordinateSystem = WebGLCoordinateSystem ) {\n\n\t\tconst planes = this.planes;\n\t\tconst me = m.elements;\n\t\tconst me0 = me[ 0 ], me1 = me[ 1 ], me2 = me[ 2 ], me3 = me[ 3 ];\n\t\tconst me4 = me[ 4 ], me5 = me[ 5 ], me6 = me[ 6 ], me7 = me[ 7 ];\n\t\tconst me8 = me[ 8 ], me9 = me[ 9 ], me10 = me[ 10 ], me11 = me[ 11 ];\n\t\tconst me12 = me[ 12 ], me13 = me[ 13 ], me14 = me[ 14 ], me15 = me[ 15 ];\n\n\t\tplanes[ 0 ].setComponents( me3 - me0, me7 - me4, me11 - me8, me15 - me12 ).normalize();\n\t\tplanes[ 1 ].setComponents( me3 + me0, me7 + me4, me11 + me8, me15 + me12 ).normalize();\n\t\tplanes[ 2 ].setComponents( me3 + me1, me7 + me5, me11 + me9, me15 + me13 ).normalize();\n\t\tplanes[ 3 ].setComponents( me3 - me1, me7 - me5, me11 - me9, me15 - me13 ).normalize();\n\t\tplanes[ 4 ].setComponents( me3 - me2, me7 - me6, me11 - me10, me15 - me14 ).normalize();\n\n\t\tif ( coordinateSystem === WebGLCoordinateSystem ) {\n\n\t\t\tplanes[ 5 ].setComponents( me3 + me2, me7 + me6, me11 + me10, me15 + me14 ).normalize();\n\n\t\t} else if ( coordinateSystem === WebGPUCoordinateSystem ) {\n\n\t\t\tplanes[ 5 ].setComponents( me2, me6, me10, me14 ).normalize();\n\n\t\t} else {\n\n\t\t\tthrow new Error( 'THREE.Frustum.setFromProjectionMatrix(): Invalid coordinate system: ' + coordinateSystem );\n\n\t\t}\n\n\t\treturn this;\n\n\t}\n\n\tintersectsObject( object ) {\n\n\t\tif ( object.boundingSphere !== undefined ) {\n\n\t\t\tif ( object.boundingSphere === null ) object.computeBoundingSphere();\n\n\t\t\t_sphere.copy( object.boundingSphere ).applyMatrix4( object.matrixWorld );\n\n\t\t} else {\n\n\t\t\tconst geometry = object.geometry;\n\n\t\t\tif ( geometry.boundingSphere === null ) geometry.computeBoundingSphere();\n\n\t\t\t_sphere.copy( geometry.boundingSphere ).applyMatrix4( object.matrixWorld );\n\n\t\t}\n\n\t\treturn this.intersectsSphere( _sphere );\n\n\t}\n\n\tintersectsSprite( sprite ) {\n\n\t\t_sphere.center.set( 0, 0, 0 );\n\t\t_sphere.radius = 0.7071067811865476;\n\t\t_sphere.applyMatrix4( sprite.matrixWorld );\n\n\t\treturn this.intersectsSphere( _sphere );\n\n\t}\n\n\tintersectsSphere( sphere ) {\n\n\t\tconst planes = this.planes;\n\t\tconst center = sphere.center;\n\t\tconst negRadius = - sphere.radius;\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tconst distance = planes[ i ].distanceToPoint( center );\n\n\t\t\tif ( distance < negRadius ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\tintersectsBox( box ) {\n\n\t\tconst planes = this.planes;\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tconst plane = planes[ i ];\n\n\t\t\t// corner at max distance\n\n\t\t\t_vector.x = plane.normal.x > 0 ? box.max.x : box.min.x;\n\t\t\t_vector.y = plane.normal.y > 0 ? box.max.y : box.min.y;\n\t\t\t_vector.z = plane.normal.z > 0 ? box.max.z : box.min.z;\n\n\t\t\tif ( plane.distanceToPoint( _vector ) < 0 ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\tcontainsPoint( point ) {\n\n\t\tconst planes = this.planes;\n\n\t\tfor ( let i = 0; i < 6; i ++ ) {\n\n\t\t\tif ( planes[ i ].distanceToPoint( point ) < 0 ) {\n\n\t\t\t\treturn false;\n\n\t\t\t}\n\n\t\t}\n\n\t\treturn true;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\n\nexport { Frustum };\n","import { Matrix4 } from '../math/Matrix4.js';\nimport { Vector2 } from '../math/Vector2.js';\nimport { Vector3 } from '../math/Vector3.js';\nimport { Vector4 } from '../math/Vector4.js';\nimport { Frustum } from '../math/Frustum.js';\n\nconst _projScreenMatrix = /*@__PURE__*/ new Matrix4();\nconst _lightPositionWorld = /*@__PURE__*/ new Vector3();\nconst _lookTarget = /*@__PURE__*/ new Vector3();\n\nclass LightShadow {\n\n\tconstructor( camera ) {\n\n\t\tthis.camera = camera;\n\n\t\tthis.intensity = 1;\n\n\t\tthis.bias = 0;\n\t\tthis.normalBias = 0;\n\t\tthis.radius = 1;\n\t\tthis.blurSamples = 8;\n\n\t\tthis.mapSize = new Vector2( 512, 512 );\n\n\t\tthis.map = null;\n\t\tthis.mapPass = null;\n\t\tthis.matrix = new Matrix4();\n\n\t\tthis.autoUpdate = true;\n\t\tthis.needsUpdate = false;\n\n\t\tthis._frustum = new Frustum();\n\t\tthis._frameExtents = new Vector2( 1, 1 );\n\n\t\tthis._viewportCount = 1;\n\n\t\tthis._viewports = [\n\n\t\t\tnew Vector4( 0, 0, 1, 1 )\n\n\t\t];\n\n\t}\n\n\tgetViewportCount() {\n\n\t\treturn this._viewportCount;\n\n\t}\n\n\tgetFrustum() {\n\n\t\treturn this._frustum;\n\n\t}\n\n\tupdateMatrices( light ) {\n\n\t\tconst shadowCamera = this.camera;\n\t\tconst shadowMatrix = this.matrix;\n\n\t\t_lightPositionWorld.setFromMatrixPosition( light.matrixWorld );\n\t\tshadowCamera.position.copy( _lightPositionWorld );\n\n\t\t_lookTarget.setFromMatrixPosition( light.target.matrixWorld );\n\t\tshadowCamera.lookAt( _lookTarget );\n\t\tshadowCamera.updateMatrixWorld();\n\n\t\t_projScreenMatrix.multiplyMatrices( shadowCamera.projectionMatrix, shadowCamera.matrixWorldInverse );\n\t\tthis._frustum.setFromProjectionMatrix( _projScreenMatrix );\n\n\t\tshadowMatrix.set(\n\t\t\t0.5, 0.0, 0.0, 0.5,\n\t\t\t0.0, 0.5, 0.0, 0.5,\n\t\t\t0.0, 0.0, 0.5, 0.5,\n\t\t\t0.0, 0.0, 0.0, 1.0\n\t\t);\n\n\t\tshadowMatrix.multiply( _projScreenMatrix );\n\n\t}\n\n\tgetViewport( viewportIndex ) {\n\n\t\treturn this._viewports[ viewportIndex ];\n\n\t}\n\n\tgetFrameExtents() {\n\n\t\treturn this._frameExtents;\n\n\t}\n\n\tdispose() {\n\n\t\tif ( this.map ) {\n\n\t\t\tthis.map.dispose();\n\n\t\t}\n\n\t\tif ( this.mapPass ) {\n\n\t\t\tthis.mapPass.dispose();\n\n\t\t}\n\n\t}\n\n\tcopy( source ) {\n\n\t\tthis.camera = source.camera.clone();\n\n\t\tthis.intensity = source.intensity;\n\n\t\tthis.bias = source.bias;\n\t\tthis.radius = source.radius;\n\n\t\tthis.mapSize.copy( source.mapSize );\n\n\t\treturn this;\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n\ttoJSON() {\n\n\t\tconst object = {};\n\n\t\tif ( this.intensity !== 1 ) object.intensity = this.intensity;\n\t\tif ( this.bias !== 0 ) object.bias = this.bias;\n\t\tif ( this.normalBias !== 0 ) object.normalBias = this.normalBias;\n\t\tif ( this.radius !== 1 ) object.radius = this.radius;\n\t\tif ( this.mapSize.x !== 512 || this.mapSize.y !== 512 ) object.mapSize = this.mapSize.toArray();\n\n\t\tobject.camera = this.camera.toJSON( false ).object;\n\t\tdelete object.camera.matrix;\n\n\t\treturn object;\n\n\t}\n\n}\n\nexport { LightShadow };\n","import { WebGLCoordinateSystem } from '../constants.js';\nimport { Matrix4 } from '../math/Matrix4.js';\nimport { Object3D } from '../core/Object3D.js';\n\nclass Camera extends Object3D {\n\n\tconstructor() {\n\n\t\tsuper();\n\n\t\tthis.isCamera = true;\n\n\t\tthis.type = 'Camera';\n\n\t\tthis.matrixWorldInverse = new Matrix4();\n\n\t\tthis.projectionMatrix = new Matrix4();\n\t\tthis.projectionMatrixInverse = new Matrix4();\n\n\t\tthis.coordinateSystem = WebGLCoordinateSystem;\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.matrixWorldInverse.copy( source.matrixWorldInverse );\n\n\t\tthis.projectionMatrix.copy( source.projectionMatrix );\n\t\tthis.projectionMatrixInverse.copy( source.projectionMatrixInverse );\n\n\t\tthis.coordinateSystem = source.coordinateSystem;\n\n\t\treturn this;\n\n\t}\n\n\tgetWorldDirection( target ) {\n\n\t\treturn super.getWorldDirection( target ).negate();\n\n\t}\n\n\tupdateMatrixWorld( force ) {\n\n\t\tsuper.updateMatrixWorld( force );\n\n\t\tthis.matrixWorldInverse.copy( this.matrixWorld ).invert();\n\n\t}\n\n\tupdateWorldMatrix( updateParents, updateChildren ) {\n\n\t\tsuper.updateWorldMatrix( updateParents, updateChildren );\n\n\t\tthis.matrixWorldInverse.copy( this.matrixWorld ).invert();\n\n\t}\n\n\tclone() {\n\n\t\treturn new this.constructor().copy( this );\n\n\t}\n\n}\n\nexport { Camera };\n","import { Camera } from './Camera.js';\nimport { RAD2DEG, DEG2RAD } from '../math/MathUtils.js';\nimport { Vector2 } from '../math/Vector2.js';\nimport { Vector3 } from '../math/Vector3.js';\n\nconst _v3 = /*@__PURE__*/ new Vector3();\nconst _minTarget = /*@__PURE__*/ new Vector2();\nconst _maxTarget = /*@__PURE__*/ new Vector2();\n\n\nclass PerspectiveCamera extends Camera {\n\n\tconstructor( fov = 50, aspect = 1, near = 0.1, far = 2000 ) {\n\n\t\tsuper();\n\n\t\tthis.isPerspectiveCamera = true;\n\n\t\tthis.type = 'PerspectiveCamera';\n\n\t\tthis.fov = fov;\n\t\tthis.zoom = 1;\n\n\t\tthis.near = near;\n\t\tthis.far = far;\n\t\tthis.focus = 10;\n\n\t\tthis.aspect = aspect;\n\t\tthis.view = null;\n\n\t\tthis.filmGauge = 35;\t// width of the film (default in millimeters)\n\t\tthis.filmOffset = 0;\t// horizontal film offset (same unit as gauge)\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tcopy( source, recursive ) {\n\n\t\tsuper.copy( source, recursive );\n\n\t\tthis.fov = source.fov;\n\t\tthis.zoom = source.zoom;\n\n\t\tthis.near = source.near;\n\t\tthis.far = source.far;\n\t\tthis.focus = source.focus;\n\n\t\tthis.aspect = source.aspect;\n\t\tthis.view = source.view === null ? null : Object.assign( {}, source.view );\n\n\t\tthis.filmGauge = source.filmGauge;\n\t\tthis.filmOffset = source.filmOffset;\n\n\t\treturn this;\n\n\t}\n\n\t/**\n\t * Sets the FOV by focal length in respect to the current .filmGauge.\n\t *\n\t * The default film gauge is 35, so that the focal length can be specified for\n\t * a 35mm (full frame) camera.\n\t *\n\t * @param {number} focalLength - Values for focal length and film gauge must have the same unit.\n\t */\n\tsetFocalLength( focalLength ) {\n\n\t\t/** see {@link http://www.bobatkins.com/photography/technical/field_of_view.html} */\n\t\tconst vExtentSlope = 0.5 * this.getFilmHeight() / focalLength;\n\n\t\tthis.fov = RAD2DEG * 2 * Math.atan( vExtentSlope );\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\t/**\n\t * Calculates the focal length from the current .fov and .filmGauge.\n\t *\n\t * @returns {number}\n\t */\n\tgetFocalLength() {\n\n\t\tconst vExtentSlope = Math.tan( DEG2RAD * 0.5 * this.fov );\n\n\t\treturn 0.5 * this.getFilmHeight() / vExtentSlope;\n\n\t}\n\n\tgetEffectiveFOV() {\n\n\t\treturn RAD2DEG * 2 * Math.atan(\n\t\t\tMath.tan( DEG2RAD * 0.5 * this.fov ) / this.zoom );\n\n\t}\n\n\tgetFilmWidth() {\n\n\t\t// film not completely covered in portrait format (aspect < 1)\n\t\treturn this.filmGauge * Math.min( this.aspect, 1 );\n\n\t}\n\n\tgetFilmHeight() {\n\n\t\t// film not completely covered in landscape format (aspect > 1)\n\t\treturn this.filmGauge / Math.max( this.aspect, 1 );\n\n\t}\n\n\t/**\n\t * Computes the 2D bounds of the camera's viewable rectangle at a given distance along the viewing direction.\n\t * Sets minTarget and maxTarget to the coordinates of the lower-left and upper-right corners of the view rectangle.\n\t *\n\t * @param {number} distance\n\t * @param {Vector2} minTarget\n\t * @param {Vector2} maxTarget\n\t */\n\tgetViewBounds( distance, minTarget, maxTarget ) {\n\n\t\t_v3.set( - 1, - 1, 0.5 ).applyMatrix4( this.projectionMatrixInverse );\n\n\t\tminTarget.set( _v3.x, _v3.y ).multiplyScalar( - distance / _v3.z );\n\n\t\t_v3.set( 1, 1, 0.5 ).applyMatrix4( this.projectionMatrixInverse );\n\n\t\tmaxTarget.set( _v3.x, _v3.y ).multiplyScalar( - distance / _v3.z );\n\n\t}\n\n\t/**\n\t * Computes the width and height of the camera's viewable rectangle at a given distance along the viewing direction.\n\t *\n\t * @param {number} distance\n\t * @param {Vector2} target - Vector2 target used to store result where x is width and y is height.\n\t * @returns {Vector2}\n\t */\n\tgetViewSize( distance, target ) {\n\n\t\tthis.getViewBounds( distance, _minTarget, _maxTarget );\n\n\t\treturn target.subVectors( _maxTarget, _minTarget );\n\n\t}\n\n\t/**\n\t * Sets an offset in a larger frustum. This is useful for multi-window or\n\t * multi-monitor/multi-machine setups.\n\t *\n\t * For example, if you have 3x2 monitors and each monitor is 1920x1080 and\n\t * the monitors are in grid like this\n\t *\n\t * +---+---+---+\n\t * | A | B | C |\n\t * +---+---+---+\n\t * | D | E | F |\n\t * +---+---+---+\n\t *\n\t * then for each monitor you would call it like this\n\t *\n\t * const w = 1920;\n\t * const h = 1080;\n\t * const fullWidth = w * 3;\n\t * const fullHeight = h * 2;\n\t *\n\t * --A--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 0, h * 0, w, h );\n\t * --B--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 1, h * 0, w, h );\n\t * --C--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 2, h * 0, w, h );\n\t * --D--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 0, h * 1, w, h );\n\t * --E--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 1, h * 1, w, h );\n\t * --F--\n\t * camera.setViewOffset( fullWidth, fullHeight, w * 2, h * 1, w, h );\n\t *\n\t * Note there is no reason monitors have to be the same size or in a grid.\n\t *\n\t * @param {number} fullWidth\n\t * @param {number} fullHeight\n\t * @param {number} x\n\t * @param {number} y\n\t * @param {number} width\n\t * @param {number} height\n\t */\n\tsetViewOffset( fullWidth, fullHeight, x, y, width, height ) {\n\n\t\tthis.aspect = fullWidth / fullHeight;\n\n\t\tif ( this.view === null ) {\n\n\t\t\tthis.view = {\n\t\t\t\tenabled: true,\n\t\t\t\tfullWidth: 1,\n\t\t\t\tfullHeight: 1,\n\t\t\t\toffsetX: 0,\n\t\t\t\toffsetY: 0,\n\t\t\t\twidth: 1,\n\t\t\t\theight: 1\n\t\t\t};\n\n\t\t}\n\n\t\tthis.view.enabled = true;\n\t\tthis.view.fullWidth = fullWidth;\n\t\tthis.view.fullHeight = fullHeight;\n\t\tthis.view.offsetX = x;\n\t\tthis.view.offsetY = y;\n\t\tthis.view.width = width;\n\t\tthis.view.height = height;\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tclearViewOffset() {\n\n\t\tif ( this.view !== null ) {\n\n\t\t\tthis.view.enabled = false;\n\n\t\t}\n\n\t\tthis.updateProjectionMatrix();\n\n\t}\n\n\tupdateProjectionMatrix() {\n\n\t\tconst near = this.near;\n\t\tlet top = near * Math.tan( DEG2RAD * 0.5 * this.fov ) / this.zoom;\n\t\tlet height = 2 * top;\n\t\tlet width = this.aspect * height;\n\t\tlet left = - 0.5 * width;\n\t\tconst view = this.view;\n\n\t\tif ( this.view !== null && this.view.enabled ) {\n\n\t\t\tconst fullWidth = view.fullWidth,\n\t\t\t\tfullHeight = view.fullHeight;\n\n\t\t\tleft += view.offsetX * width / fullWidth;\n\t\t\ttop -= view.offsetY * height / fullHeight;\n\t\t\twidth *= view.width / fullWidth;\n\t\t\theight *= view.height / fullHeight;\n\n\t\t}\n\n\t\tconst skew = this.filmOffset;\n\t\tif ( skew !== 0 ) left += near * skew / this.getFilmWidth();\n\n\t\tthis.projectionMatrix.makePerspective( left, left + width, top, top - height, near, this.far, this.coordinateSystem );\n\n\t\tthis.projectionMatrixInverse.copy( this.projectionMatrix ).invert();\n\n\t}\n\n\ttoJSON( meta ) {\n\n\t\tconst data = super.toJSON( meta );\n\n\t\tdata.object.fov = this.fov;\n\t\tdata.object.zoom = this.zoom;\n\n\t\tdata.object.near = this.near;\n\t\tdata.object.far = this.far;\n\t\tdata.object.focus = this.focus;\n\n\t\tdata.object.aspect = this.aspect;\n\n\t\tif ( this.view !== null ) data.object.view = Object.assign( {}, this.view );\n\n\t\tdata.object.filmGauge = this.filmGauge;\n\t\tdata.object.filmOffset = this.filmOffset;\n\n\t\treturn data;\n\n\t}\n\n}\n\nexport { PerspectiveCamera };\n","import { LightShadow } from './LightShadow.js';\nimport { PerspectiveCamera } from '../cameras/PerspectiveCamera.js';\nimport { Matrix4 } from '../math/Matrix4.js';\nimport { Vector2 } from '../math/Vector2.js';\nimport { Vector3 } from '../math/Vector3.js';\nimport { Vector4 } from '../math/Vector4.js';\n\nconst _projScreenMatrix = /*@__PURE__*/ new Matrix4();\nconst _lightPositionWorld = /*@__PURE__*/ new Vector3();\nconst _lookTarget = /*@__PURE__*/ new Vector3();\n\nclass PointLightShadow extends LightShadow {\n\n\tconstructor() {\n\n\t\tsuper( new PerspectiveCamera( 90, 1, 0.5, 500 ) );\n\n\t\tthis.isPointLightShadow = true;\n\n\t\tthis._frameExtents = new Vector2( 4, 2 );\n\n\t\tthis._viewportCount = 6;\n\n\t\tthis._viewports = [\n\t\t\t// These viewports map a cube-map onto a 2D texture with the\n\t\t\t// following orientation:\n\t\t\t//\n\t\t\t// xzXZ\n\t\t\t// y Y\n\t\t\t//\n\t\t\t// X - Positive x direction\n\t\t\t// x - Negative x direction\n\t\t\t// Y - Positive y direction\n\t\t\t// y - Negative y direction\n\t\t\t// Z - Positive z direction\n\t\t\t// z - Negative z direction\n\n\t\t\t// positive X\n\t\t\tnew Vector4( 2, 1, 1, 1 ),\n\t\t\t// negative X\n\t\t\tnew Vector4( 0, 1, 1, 1 ),\n\t\t\t// positive Z\n\t\t\tnew Vector4( 3, 1, 1, 1 ),\n\t\t\t// negative Z\n\t\t\tnew Vector4( 1, 1, 1, 1 ),\n\t\t\t// positive Y\n\t\t\tnew Vector4( 3, 0, 1, 1 ),\n\t\t\t// negative Y\n\t\t\tnew Vector4( 1, 0, 1, 1 )\n\t\t];\n\n\t\tthis._cubeDirections = [\n\t\t\tnew Vector3( 1, 0, 0 ), new Vector3( - 1, 0, 0 ), new Vector3( 0, 0, 1 ),\n\t\t\tnew Vector3( 0, 0, - 1 ), new Vector3( 0, 1, 0 ), new Vector3( 0, - 1, 0 )\n\t\t];\n\n\t\tthis._cubeUps = [\n\t\t\tnew Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ), new Vector3( 0, 1, 0 ),\n\t\t\tnew Vector3( 0, 1, 0 ), new Vector3( 0, 0, 1 ),\tnew Vector3( 0, 0, - 1 )\n\t\t];\n\n\t}\n\n\tupdateMatrices( light, viewportIndex = 0 ) {\n\n\t\tconst camera = this.camera;\n\t\tconst shadowMatrix = this.matrix;\n\n\t\tconst far = light.distance || camera.far;\n\n\t\tif ( far !== camera.far ) {\n\n\t\t\tcamera.far = far;\n\t\t\tcamera.updateProjectionMatrix();\n\n\t\t}\n\n\t\t_lightPositionWorld.setFromMatrixPosition( light.matrixWorld );\n\t\tcamera.position.copy( _lightPositionWorld );\n\n\t\t_lookTarget.copy( camera.position );\n\t\t_lookTarget.add( this._cubeDirections[ viewportIndex ] );\n\t\tcamera.up.copy( this._cubeUps[ viewportIndex ] );\n\t\tcamera.lookAt( _lookTarget );\n\t\tcamera.updateMatrixWorld();\n\n\t\tshadowMatrix.makeTranslation( - _lightPositionWorld.x, - _lightPositionWorld.y, - _lightPositionWorld.z );\n\n\t\t_projScreenMatrix.multiplyMatrices( camera.projectionMatrix, camera.matrixWorldInverse );\n\t\tthis._frustum.setFromProjectionMatrix( _projScreenMatrix );\n\n\t}\n\n}\n\nexport { PointLightShadow };\n","import {\n Group,\n type Object3D,\n type Object3DEventMap,\n PerspectiveCamera,\n} from 'three';\nimport type CeilingLight from './ceiling-light';\nimport { CEILING_LIGHT_POWER } from './ceiling-light';\nimport { PointLightShadow } from 'three/src/lights/PointLightShadow';\n\nconst MAX_SHADOW_LIGHTS = 1;\n\nexport class LightGroup extends Group {\n public children: CeilingLight[] = [];\n private _availableShadowMaps: PointLightShadow[] = [];\n\n get lightsOn() {\n return this.children.every((light) => light.power > 0);\n }\n\n constructor() {\n super();\n // Share the same set of shadow maps for all lights to save memory\n for (let i = 0; i < MAX_SHADOW_LIGHTS; i++) {\n const shadowCamera = new PerspectiveCamera(90, 1, 0.5, 500);\n const shadowMap = new PointLightShadow(shadowCamera);\n shadowMap.mapSize.width = 512;\n shadowMap.mapSize.height = 512;\n this._availableShadowMaps.push(shadowMap);\n }\n }\n\n public add(...lights: Array<Object3D<Object3DEventMap>>): this {\n for (const light of lights as CeilingLight[]) {\n const amountOfLights = this.children.length;\n if (this._availableShadowMaps.length > 0) {\n const shadowMap =\n this._availableShadowMaps[amountOfLights % MAX_SHADOW_LIGHTS];\n light.shadow = shadowMap;\n light.castShadow = false;\n shadowMap.camera.position.copy(light.position);\n }\n }\n super.add(...lights);\n return this;\n }\n\n public toggleAllLights(on: boolean) {\n for (const light of this.children) {\n light.power = on ? CEILING_LIGHT_POWER : 0;\n }\n }\n}\n","import type PlanObjectViewModel from '../../../common-core/src/view-model/plan-object-view-model';\nimport type {\n KernelObject,\n Plan,\n PlanElement,\n PlanObject,\n} from '../../../typings/planner';\nimport type { PlannerKernelCallbackI } from '../services/planner-kernel-access';\nimport PlannerKernelAccess from '../services/planner-kernel-access';\nimport inject from '../../../common-core/src/di/inject';\nimport type { RoomleComponent } from '../../../common-core/src/webgl/roomle-component-factory';\nimport type PlannerMeshGenerator from '../webgl/planner-mesh-generator';\nimport type PlannerSceneEventHandler from '../webgl/planner-scene-event-handler';\nimport ConfiguratorPlanObjectViewModel from '../../../common-core/src/view-model/configurator-plan-object-view-model';\nimport StaticPlanObjectViewModel from './static-plan-object-view-model';\nimport ConfiguratorViewModel from '../../../common-core/src/view-model/configurator-view-model';\nimport type { KernelEnum, KernelVector3 } from '../../../typings/kernel';\nimport WallPlanElementViewModel from './wall-plan-element-view-model';\nimport type PlanElementViewModel from '../../../common-core/src/view-model/plan-element-view-model';\nimport FloorPlanElementViewModel from './floor-plan-element-view-model';\nimport CeilingPlanElementViewModel from './ceiling-plan-element-view-model';\nimport type MeshGenerator from '../../../common-core/src/webgl/mesh-generator';\nimport { BASE_CONTEXT } from '../../../common-core/src/main';\nimport { CAMERA_TYPE } from '../../../common-core/src/cameracontrol/camera-type';\nimport NodePlanElementViewModel from './node-plan-element-view-model';\nimport type { Enumify } from '../../../common-core/src/types';\nimport { kernelBoxToThreeBox } from '../../../common-core/src/utils/threejs-utils';\nimport type { Mesh } from 'three';\nimport { Box3, Group } from 'three';\nimport type RoomlePlannerUiCallback from '../roomle-planner-ui-callback';\nimport ConstructionPlanObjectViewModel from './construction-plan-object-view-model';\nimport MeasurementLinePlanElementViewModel from './measurement-line-plan-element-view-model';\nimport ConfigurableConstructionPlanObjectViewModel from '../../../common-core/src/view-model/configurable-construction-plan-object-view-model';\nimport CeilingLight from '../lights/ceiling-light';\nimport { convertToTHREE } from '../../../common-core/src/utils/kernel-utils';\nimport { LightGroup } from '../lights/light-group';\nimport { type QualityLevel } from '../../../common-core/src/webgl/renderer/scene-renderer';\nimport LampLight from '../lights/lamp-light';\nimport type { Point } from 'roomle-core-hsc/src/embind/configuratorCoreInterface';\nimport RectLampLight from '../lights/rect-area-light';\nimport WallAtticPlanElementViewModel from './wall-attic-plan-element-view-model';\n\nexport const GROUP_CONSTRUCTION = 'Construction';\nexport const GROUP_CEILING = 'Ceiling';\nexport const GROUP_FLOOR = 'Floor';\nexport const MAX_LIGHTS = 1;\nexport const GROUP_CEILING_LIGHTS = 'Ceiling Lights';\nexport const GROUP_MEASUREMENT_LINE = 'Measurement Line';\nexport const GROUP_WALL_ATTICS = 'Wall Attics';\n\nexport default class PlanViewModel\n extends ConfiguratorViewModel\n implements PlannerKernelCallbackI\n{\n @inject\n private _plannerMeshGenerator: PlannerMeshGenerator;\n\n @inject\n private _roomlePlannerUiCallback: RoomlePlannerUiCallback;\n\n private _coreReference: KernelObject;\n private _configurablePlanObjectViewModels: ConfiguratorPlanObjectViewModel[] =\n [];\n private _configurableConstructionPlanObjectViewModels: ConfigurableConstructionPlanObjectViewModel[] =\n [];\n private _staticPlanObjectViewModels: StaticPlanObjectViewModel[] = [];\n private _constructionPlanObjectViewModels: ConstructionPlanObjectViewModel[] =\n [];\n private _wallPlanObjectViewModels: WallPlanElementViewModel[] = [];\n private _measurementLinePlanObjectViewModels: MeasurementLinePlanElementViewModel[] =\n [];\n private _wallAtticsPlanObjectViewModels: WallAtticPlanElementViewModel[] = [];\n private _floorPlanObjectViewModels: FloorPlanElementViewModel[] = [];\n private _nodePlanObjectViewModels: NodePlanElementViewModel[] = [];\n private _constructionGroup: Group; //walls\n private _ceilingGroup: Group; //ceiling\n private _floorGroup: Group; //floors\n private _ceilingLightsGroup: LightGroup; //ceiling lights\n private _measurementLineGroup: Group;\n private _wallAtticsGroup: Group;\n private _plannerSceneEventHandler: PlannerSceneEventHandler;\n\n private _cameraType: Enumify<typeof CAMERA_TYPE>;\n private _nodeZoom: number;\n\n private _latestWallPlanObjectViewModel: WallPlanElementViewModel;\n private _latestNodePlanObjectViewModel: NodePlanElementViewModel;\n\n constructor(creator: string) {\n super(creator);\n\n this._constructionGroup = new Group();\n this._constructionGroup.name = GROUP_CONSTRUCTION;\n this._ceilingGroup = new Group();\n this._ceilingGroup.name = GROUP_CEILING;\n this._floorGroup = new Group();\n this._floorGroup.name = GROUP_FLOOR;\n this._ceilingLightsGroup = new LightGroup();\n this._ceilingLightsGroup.name = GROUP_CEILING_LIGHTS;\n this._measurementLineGroup = new Group();\n this._measurementLineGroup.name = GROUP_MEASUREMENT_LINE;\n this._wallAtticsGroup = new Group();\n this._wallAtticsGroup.name = GROUP_WALL_ATTICS;\n this._getKernelAccess().addPlannerListener(this);\n }\n\n public get latestWallPlanObjectViewModel(): WallPlanElementViewModel {\n return this._latestWallPlanObjectViewModel;\n }\n\n public get latestNodePlanObjectViewModel(): NodePlanElementViewModel {\n return this._latestNodePlanObjectViewModel;\n }\n\n public startedDrawing(): void {\n // unused\n }\n\n public stoppedDrawing(): void {\n // unused\n }\n\n public planBoundsChanged(): void {\n // unused\n }\n\n public setReference(plan: Plan): void {\n this._coreReference = plan.clone();\n }\n\n public clearReference(): void {\n this._coreReference.delete();\n this._coreReference = null;\n }\n\n public getCorePlan(): Plan {\n return this._coreReference as Plan;\n }\n\n public addPlanElementViewModel(planElementViewModel: PlanElementViewModel) {\n if (\n planElementViewModel instanceof\n ConfigurableConstructionPlanObjectViewModel\n ) {\n this._handleConfiguratorConstructionPlanObjectViewModel(\n planElementViewModel,\n );\n } else if (\n planElementViewModel instanceof ConfiguratorPlanObjectViewModel\n ) {\n this._handleConfiguratorPlanObjectViewModel(planElementViewModel);\n } else if (\n planElementViewModel instanceof ConstructionPlanObjectViewModel\n ) {\n this._handleConstructionPlanObjectViewModel(planElementViewModel);\n } else if (planElementViewModel instanceof StaticPlanObjectViewModel) {\n this._handleStaticPlanObjectViewModel(planElementViewModel);\n } else if (\n planElementViewModel instanceof MeasurementLinePlanElementViewModel\n ) {\n this._handleMeasurementLinePlanElementViewModel(planElementViewModel);\n } else if (planElementViewModel instanceof WallAtticPlanElementViewModel) {\n this._handleWallAtticPlanElementViewModel(planElementViewModel);\n } else if (planElementViewModel instanceof WallPlanElementViewModel) {\n this._handleWallPlanElementViewModel(planElementViewModel);\n } else if (planElementViewModel instanceof FloorPlanElementViewModel) {\n this._handleFloorPlanElementViewModel(planElementViewModel);\n } else if (planElementViewModel instanceof CeilingPlanElementViewModel) {\n this._handleCeilingPlanElementViewModel(planElementViewModel);\n } else if (planElementViewModel instanceof NodePlanElementViewModel) {\n this._handleNodePlanElementViewModel(planElementViewModel);\n }\n }\n\n private _handleConfiguratorPlanObjectViewModel(\n viewModel: ConfiguratorPlanObjectViewModel,\n ) {\n this._configurablePlanObjectViewModels.push(viewModel);\n this._linkPlanObjectViewModelAndComponent(viewModel);\n }\n\n private _linkPlanObjectViewModelAndComponent(\n viewModel: ConfiguratorPlanObjectViewModel,\n ) {\n const runtimeId = viewModel.getConfigurationRuntimeId();\n if (runtimeId > 0) {\n for (const component of this._components.values()) {\n if (\n component.parentObjectId === runtimeId ||\n component.runtimeId === runtimeId\n ) {\n this._addComponent(component);\n break;\n }\n }\n }\n }\n\n private _detachPlanObjectViewModelFromComponent(\n viewModel: ConfiguratorPlanObjectViewModel,\n ) {\n const runtimeId = viewModel.getConfigurationRuntimeId();\n if (runtimeId > 0) {\n for (const component of this._components.values()) {\n if (\n component.parentObjectId === runtimeId ||\n component.runtimeId === runtimeId\n ) {\n component.isChildPlanObject = false;\n break;\n }\n }\n }\n }\n\n private _handleConfiguratorConstructionPlanObjectViewModel(\n viewModel: ConfigurableConstructionPlanObjectViewModel,\n ) {\n viewModel.setTopView(this._cameraType === CAMERA_TYPE.CAMERA_2D);\n this._configurableConstructionPlanObjectViewModels.push(viewModel);\n }\n\n private _handleConstructionPlanObjectViewModel(\n viewModel: ConstructionPlanObjectViewModel,\n ) {\n if (this._initData.edit) {\n this._plannerSceneEventHandler.addConstructionPlanObjectHandlers(\n viewModel,\n );\n }\n viewModel.setTopView(this._cameraType === CAMERA_TYPE.CAMERA_2D);\n this._constructionPlanObjectViewModels.push(viewModel);\n }\n\n private _handleStaticPlanObjectViewModel(\n viewModel: StaticPlanObjectViewModel,\n ) {\n this._staticPlanObjectViewModels.push(viewModel);\n this.commonHandlerForEditableAndTopView(viewModel);\n }\n\n private _handleMeasurementLinePlanElementViewModel(\n viewModel: MeasurementLinePlanElementViewModel,\n ) {\n if (this._initData.edit) {\n this._plannerSceneEventHandler.addMeasurementLineHandlers(viewModel);\n }\n viewModel.setTopView(this._cameraType === CAMERA_TYPE.CAMERA_2D);\n viewModel.getPoint1Draggable().scale.setScalar(this._nodeZoom);\n viewModel.getPoint2Draggable().scale.setScalar(this._nodeZoom);\n this._measurementLinePlanObjectViewModels.push(viewModel);\n this._measurementLineGroup.add(viewModel.getContainer());\n }\n\n private _handleWallAtticPlanElementViewModel(\n viewModel: WallAtticPlanElementViewModel,\n ) {\n if (this._initData.edit) {\n this._plannerSceneEventHandler.addWallAtticHandlers(viewModel);\n }\n\n viewModel.setTopView(this._cameraType === CAMERA_TYPE.CAMERA_2D);\n\n this._wallAtticsPlanObjectViewModels.push(viewModel);\n this._wallAtticsGroup.add(viewModel.getContainer());\n }\n\n private _handleWallPlanElementViewModel(viewModel: WallPlanElementViewModel) {\n if (this._initData.edit) {\n this._plannerSceneEventHandler.addWallHandlers(viewModel);\n }\n viewModel.setTopView(this._cameraType === CAMERA_TYPE.CAMERA_2D);\n this._wallPlanObjectViewModels.push(viewModel);\n this._latestWallPlanObjectViewModel = viewModel;\n this._constructionGroup.add(viewModel.getContainer());\n }\n\n private _handleFloorPlanElementViewModel(\n viewModel: FloorPlanElementViewModel,\n ) {\n const floor = viewModel.getContainer();\n floor.name = 'Floor';\n if (this._initData.edit) {\n this._plannerSceneEventHandler.addFloorHandlers(viewModel);\n }\n this._floorPlanObjectViewModels.push(viewModel);\n this._floorGroup.add(floor);\n }\n\n private _handleCeilingPlanElementViewModel(\n viewModel: CeilingPlanElementViewModel,\n ) {\n this._ceilingGroup.add(viewModel.getContainer());\n }\n\n private _handleNodePlanElementViewModel(viewModel: NodePlanElementViewModel) {\n if (this._initData.edit) {\n this._plannerSceneEventHandler.addNodeHandlers(viewModel);\n }\n viewModel.setTopView(this._cameraType === CAMERA_TYPE.CAMERA_2D);\n viewModel.setZoom(this._nodeZoom);\n this._nodePlanObjectViewModels.push(viewModel);\n this._latestNodePlanObjectViewModel = viewModel;\n this._constructionGroup.add(viewModel.getContainer());\n }\n\n private _getCeilingLightsDistribution() {\n const plan = this._getKernelAccess().planInteractionHandler.getPlan();\n if (!plan) {\n return [];\n }\n const lightPositionArray =\n this._getKernelAccess().planModelViewHelper.calculateLightSourceDistribution(\n plan,\n {\n lightSourceAreaInSquareMeters: 90,\n minimumRoomSizeInSquareMeters: 7,\n maximumNumberOfLightSources: 8,\n },\n );\n\n const positionsArray = [];\n\n for (let i = 0; i < lightPositionArray.size(); i++) {\n const position = lightPositionArray.get(i);\n\n for (let j = 0; j < position.positionsInPlan.size(); j++) {\n positionsArray.push(convertToTHREE(position.positionsInPlan.get(j)));\n }\n }\n return positionsArray;\n }\n\n public handleInitialLights(_maxTextures: number, qualityLevel: QualityLevel) {\n const existingLights = this._ceilingLightsGroup.children as CeilingLight[];\n if (existingLights.length > 0) {\n return;\n }\n for (let i = 0; i < MAX_LIGHTS; i++) {\n const newLight = new CeilingLight(this._initData.debug, qualityLevel);\n newLight.position.set(0, 0, 0);\n newLight.intensity = 0;\n this._ceilingLightsGroup.add(newLight);\n }\n }\n\n public handleCeilingLights() {\n if (!this._ceilingLightsGroup.lightsOn) {\n return;\n }\n const existingLights = this._ceilingLightsGroup.children as CeilingLight[];\n const positions = this._getCeilingLightsDistribution();\n\n // Update positions and handle power\n let activeLightCount = 0;\n\n for (let i = 0; i < existingLights.length; i++) {\n existingLights[i].power = 0;\n if (i < positions.length) {\n existingLights[i].position.copy(positions[i]);\n existingLights[i].position.y -= 0.1;\n existingLights[i].power = 1; // Set non-zero power to mark as active\n activeLightCount++;\n }\n }\n\n // Recalculate power for active lights\n const lightsWithPower = existingLights.filter((light) => light.power > 0);\n for (const light of lightsWithPower) {\n light.recalculatePower(activeLightCount);\n }\n }\n\n public handleLampLight(\n lamp: StaticPlanObjectViewModel,\n options: {\n targetPos: Point;\n lightPos: Point;\n color?: number;\n decay?: number;\n intensity?: number;\n active?: boolean;\n },\n ) {\n const object = lamp.getObject();\n const { targetPos, lightPos, color, decay, intensity, active } = options;\n object.userData = {\n ...object.userData,\n targetPos,\n lightPos,\n color,\n decay,\n intensity,\n };\n const lampLight = LampLight.fromStaticObject(lamp, this._initData.debug);\n if (active === false) {\n lampLight.visible = false;\n }\n object.add(lampLight);\n }\n\n public handleRectLampLight(\n lamp: StaticPlanObjectViewModel,\n options: {\n dimensions: { width: number; height: number };\n lightPos: Point;\n color?: number;\n rotation?: Point;\n active?: boolean;\n },\n ) {\n const object = lamp.getObject();\n const { dimensions, lightPos, color, rotation, active } = options;\n object.userData = {\n ...object.userData,\n dimensions,\n lightPos,\n color,\n rotation,\n };\n const lampLight = RectLampLight.fromStaticObject(\n lamp,\n this._initData.debug,\n );\n if (active === false) {\n lampLight.visible = false;\n }\n object.add(lampLight);\n }\n\n public toggleCeilingLights(on: boolean) {\n this._ceilingLightsGroup.toggleAllLights(on);\n }\n\n private commonHandlerForEditableAndTopView(viewModel: PlanObjectViewModel) {\n if (this._initData.edit) {\n this._plannerSceneEventHandler.addPlanObjectHandlers(viewModel);\n }\n viewModel.setTopView(this._cameraType === CAMERA_TYPE.CAMERA_2D);\n }\n\n protected dockComponent(\n componentId: number,\n isRootComponent: boolean,\n parentId: number,\n componentPosition: KernelVector3,\n componentRotation: KernelVector3,\n ) {\n this._plannerSceneEventHandler?.cancelSelection('dock_component');\n super.dockComponent(\n componentId,\n isRootComponent,\n parentId,\n componentPosition,\n componentRotation,\n );\n }\n\n protected _addComponent(component: RoomleComponent) {\n const componentRuntimeId = component.isRootComponent\n ? component.parentObjectId\n : component.runtimeId;\n const planViewModel =\n this._getPlanObjectViewModelForRuntimeId(componentRuntimeId);\n if (\n planViewModel &&\n planViewModel instanceof ConfiguratorPlanObjectViewModel\n ) {\n if (component.isRootComponent) {\n planViewModel.addRootComponent(component);\n } else {\n planViewModel.addChildEntityComponent(component);\n }\n if (this._initData.edit) {\n if (\n planViewModel instanceof ConfigurableConstructionPlanObjectViewModel\n ) {\n this._plannerSceneEventHandler.addConstructionPlanObjectHandlers(\n planViewModel,\n );\n } else {\n this._plannerSceneEventHandler.addPlanObjectHandlers(planViewModel);\n }\n }\n planViewModel.hidePreviewBox();\n }\n }\n\n private _getPlanObjectViewModelForRuntimeId(\n runtimeId: number,\n ): PlanObjectViewModel {\n let result = null;\n [\n ...this._configurableConstructionPlanObjectViewModels,\n ...this._configurablePlanObjectViewModels,\n ].forEach((planObjectViewModel) => {\n if (runtimeId === planObjectViewModel.getConfigurationRuntimeId()) {\n result = planObjectViewModel;\n }\n });\n return result;\n }\n\n public getConfigurablePlanObjectForId(\n id: number,\n ): ConfiguratorPlanObjectViewModel {\n for (const planObjectViewModel of [\n ...this._configurableConstructionPlanObjectViewModels,\n ...this._configurablePlanObjectViewModels,\n ]) {\n if (id === planObjectViewModel.getId()) {\n return planObjectViewModel;\n }\n }\n return null;\n }\n\n public getStaticPlanObjectForId(id: number): StaticPlanObjectViewModel {\n for (const planObjectViewModel of this._staticPlanObjectViewModels) {\n if (id === planObjectViewModel.getId()) {\n return planObjectViewModel;\n }\n }\n return null;\n }\n\n public getConstructionObjectForId(\n id: number,\n ): ConstructionPlanObjectViewModel {\n for (const planObjectViewModel of this._constructionPlanObjectViewModels) {\n if (id === planObjectViewModel.getId()) {\n return planObjectViewModel;\n }\n }\n return null;\n }\n\n public getStaticPlanObjectViewModelForId(\n id: number,\n ): StaticPlanObjectViewModel {\n const staticObj = this.getStaticPlanObjectForId(id);\n if (staticObj) {\n return staticObj;\n }\n return this.getConstructionObjectForId(id);\n }\n\n public getPlanObjectForId(id: number): PlanElementViewModel {\n const configurablePlanObject = this.getConfigurablePlanObjectForId(id);\n if (configurablePlanObject) {\n return configurablePlanObject;\n }\n const staticPlanObject = this.getStaticPlanObjectForId(id);\n if (staticPlanObject) {\n return staticPlanObject;\n }\n for (const planObjectViewModel of this._nodePlanObjectViewModels) {\n if (id === planObjectViewModel.getId()) {\n return planObjectViewModel;\n }\n }\n for (const planObjectViewModel of this._wallPlanObjectViewModels) {\n if (id === planObjectViewModel.getId()) {\n return planObjectViewModel;\n }\n }\n for (const planObjectViewModel of this\n ._measurementLinePlanObjectViewModels) {\n if (id === planObjectViewModel.getId()) {\n return planObjectViewModel;\n }\n }\n for (const planObjectViewModel of this._floorPlanObjectViewModels) {\n if (id === planObjectViewModel.getId()) {\n return planObjectViewModel;\n }\n }\n for (const planObjectViewModel of this._constructionPlanObjectViewModels) {\n if (id === planObjectViewModel.getId()) {\n return planObjectViewModel;\n }\n }\n return null;\n }\n\n public getPlanObjectViewModelsFromRapiId() {\n return [\n ...this._configurablePlanObjectViewModels,\n ...this._configurableConstructionPlanObjectViewModels,\n ...this._staticPlanObjectViewModels,\n ];\n }\n\n public getPlanObjectCount() {\n return (\n this._configurablePlanObjectViewModels.length +\n this._configurableConstructionPlanObjectViewModels.length +\n this._staticPlanObjectViewModels.length\n );\n }\n\n public getConstructionGroup(): Group {\n return this._constructionGroup;\n }\n\n public getCeilingGroup(): Group {\n return this._ceilingGroup;\n }\n\n public getFloorGroup(): Group {\n return this._floorGroup;\n }\n\n public getMeasurementLineGroup(): Group {\n return this._measurementLineGroup;\n }\n\n public getCeilingLightsGroup(): LightGroup {\n return this._ceilingLightsGroup;\n }\n\n public getWallAtticsGroup(): Group {\n return this._wallAtticsGroup;\n }\n\n public getBoundingBox(): Box3 {\n if (this._configuratorContext.baseContext === BASE_CONTEXT.CONFIGURATOR) {\n const planObject = this.getPlanObjectForId(\n this._configuratorContext.planElementId,\n );\n if (planObject) {\n return planObject.getBounds();\n }\n }\n if (this._configuratorContext.baseContext === BASE_CONTEXT.GLB_VIEWER) {\n const ids = this._plannerSceneEventHandler.getSelectedIds();\n if (ids && ids.length === 1) {\n const planObject = this.getPlanObjectForId(ids[0]);\n if (planObject) {\n return planObject.getBounds();\n }\n }\n }\n const plan = this.getCorePlan();\n if (plan) {\n try {\n return kernelBoxToThreeBox(plan.getBounds());\n } catch (e) {\n console.error(e);\n }\n }\n const box = new Box3();\n box.expandByObject(this._constructionGroup);\n for (const planObject of this._staticPlanObjectViewModels) {\n box.expandByObject(planObject.getContainer());\n }\n for (const planObject of this._configurablePlanObjectViewModels) {\n box.expandByObject(planObject.getContainer());\n }\n for (const planObject of this\n ._configurableConstructionPlanObjectViewModels) {\n box.expandByObject(planObject.getContainer());\n }\n return box;\n }\n\n public getBoundingBoxOfGeometry(): Box3 {\n return this.getBoundingBox();\n }\n\n /**\n * Merges geometries on the fly when creating them\n *\n * @param runtimeComponentId\n * @param meshId\n * @param materialId\n * @param transform\n * @param vertices\n * @param indices\n * @param uvCoords\n * @param normals\n * @private\n */\n // private _addOrMergeMeshToComponent(runtimeComponentId: number, meshId: string, materialId: string, transform: Float32Array, vertices: Int32Array, indices: Int32Array, uvCoords: Float32Array, normals: Float32Array): void {\n // let existingMesh: Mesh;\n // const roomleComponent = this._components.get(runtimeComponentId);\n // roomleComponent.meshes.forEach((componentMesh) => {\n // if (componentMesh.userData.material === materialId) {\n // existingMesh = componentMesh;\n // }\n // });\n // if (existingMesh) {\n // const existingGeometry = existingMesh.geometry as Geometry;\n // const geometry = this._plannerMeshGenerator.generateGeometry(meshId, vertices, indices, uvCoords, normals);\n // existingGeometry.merge(geometry, convertToThreeMatrix(transform));\n // } else {\n // let mesh = this._plannerMeshGenerator.generateMesh(meshId, materialId, vertices, indices, uvCoords, normals, null, true);\n // if (transform) {\n // mesh.applyMatrix(convertToThreeMatrix(transform));\n // }\n // this._addMeshToComponentId(mesh, runtimeComponentId);\n // }\n // }\n\n public setPlannerSceneEventHandler(\n plannerSceneEventHandler: PlannerSceneEventHandler,\n ) {\n this._plannerSceneEventHandler = plannerSceneEventHandler;\n }\n\n public getStaticPlanObjectViewModels(): StaticPlanObjectViewModel[] {\n return this._staticPlanObjectViewModels;\n }\n\n public getConfigurablePlanObjectViewModels(): ConfiguratorPlanObjectViewModel[] {\n return this._configurablePlanObjectViewModels;\n }\n\n public getConfigurableConstructionPlanObjectViewModels(): ConfiguratorPlanObjectViewModel[] {\n return this._configurableConstructionPlanObjectViewModels;\n }\n\n public getConstructionPlanObjectViewModels(): ConstructionPlanObjectViewModel[] {\n return this._constructionPlanObjectViewModels;\n }\n\n public getWallPlanObjectViewModels(): WallPlanElementViewModel[] {\n return this._wallPlanObjectViewModels;\n }\n\n public getNodePlanObjectViewModels(): NodePlanElementViewModel[] {\n return this._nodePlanObjectViewModels;\n }\n\n public getFloorPlanObjectViewModels(): FloorPlanElementViewModel[] {\n return this._floorPlanObjectViewModels;\n }\n\n public getMeasurementLineObjectViewModels(): MeasurementLinePlanElementViewModel[] {\n return this._measurementLinePlanObjectViewModels;\n }\n\n public getWallAtticsObjectViewModels(): WallAtticPlanElementViewModel[] {\n return this._wallAtticsPlanObjectViewModels;\n }\n\n protected _generateMesh(\n runtimeComponentId: number = 0,\n geometryId: string = null,\n material: any,\n vertices: Float32Array,\n indices: Int32Array,\n uvCoords: Float32Array,\n normals: Float32Array,\n type?: KernelEnum,\n newGeometryInstance?: boolean,\n materialAttributes?: Record<string, string>,\n ): Mesh {\n return this._plannerMeshGenerator.generateMesh(\n runtimeComponentId,\n geometryId,\n material,\n vertices,\n indices,\n uvCoords,\n normals,\n type,\n newGeometryInstance,\n materialAttributes,\n );\n }\n\n protected _setMaterial(\n mesh: Mesh,\n material: any,\n _type?: KernelEnum,\n materialAttributes?: Record<string, string>,\n ) {\n this._plannerMeshGenerator.setMaterial(\n mesh,\n material,\n _type,\n materialAttributes,\n );\n }\n\n public Editor3dComponentCreated(\n id: number,\n position: KernelVector3,\n eulerAngles: KernelVector3,\n isRootComponent: boolean,\n parentObjectRuntimeId: number,\n ): void {\n super.Editor3dComponentCreated(\n id,\n position,\n eulerAngles,\n isRootComponent,\n parentObjectRuntimeId,\n );\n\n //FIXME Workaround because Editor3dComponentDocked gets not called in planner kernel access\n if (this._getKernelAccess() instanceof PlannerKernelAccess) {\n this.dockComponent(\n id,\n isRootComponent,\n parentObjectRuntimeId,\n position,\n eulerAngles,\n );\n }\n }\n\n public addPlanObjectToScene(_planViewModel: PlanElementViewModel): void {\n // unused\n }\n\n public handlerSwitchedPlans(_fromPlan: Plan, _toPlan: Plan): void {\n this._constructionGroup.clear();\n this._ceilingGroup.clear();\n this._floorGroup.clear();\n this._measurementLineGroup.clear();\n this._wallAtticsGroup.clear();\n }\n\n public planCompletelyLoaded(_plan: Plan): void {\n // unused\n }\n\n public beginPlanConstruction(_plan: Plan): void {\n // unused\n }\n\n public addPlanMesh(\n _plan: Plan,\n _material: any,\n _vertices: Float32Array,\n _indices: Int32Array,\n _uvCoords: Float32Array,\n _normals: Float32Array,\n _type: KernelEnum,\n ): void {\n // unused\n }\n\n public endPlanConstruction(_plan: Plan): void {\n // unused\n }\n\n public planElementChanged(\n _plan: Plan,\n _planObject: PlanElementViewModel,\n ): void {\n // unused\n }\n\n public planObjectConfigurationLoaded(\n _plan: Plan,\n planElement: PlanElement,\n success: boolean,\n ): void {\n const configuration = this.getConfigurablePlanObjectForId(\n planElement.getId(),\n );\n if (!configuration) {\n console.warn('planObjectConfigurationLoaded but no view model found');\n return;\n }\n if (success) {\n configuration.finishConstruction();\n } else {\n configuration.failConstruction();\n }\n const planElementViewModel = planElement.extRef\n .jsObject as PlanElementViewModel;\n if (planElementViewModel instanceof ConfiguratorPlanObjectViewModel) {\n this._linkPlanObjectViewModelAndComponent(planElementViewModel);\n }\n }\n\n public planObjectConfigurationChanged(\n _plan: Plan,\n _element: PlanElementViewModel,\n ): void {\n // unused\n }\n\n public addMesh(\n planElement: PlanElement,\n material: any,\n vertices: Float32Array,\n indices: Int32Array,\n uvCoords: Float32Array,\n normals: Float32Array,\n ) {\n const planElementViewModel = planElement.extRef\n .jsObject as PlanElementViewModel;\n let mesh = planElementViewModel.getMesh(material);\n if (mesh) {\n mesh.geometry = this._plannerMeshGenerator.generateGeometry(\n null,\n vertices,\n indices,\n uvCoords,\n normals,\n );\n } else {\n mesh = this._generateMesh(\n 0,\n null,\n material,\n vertices,\n indices,\n uvCoords,\n normals,\n planElement.getType(),\n );\n planElementViewModel.addMesh(mesh);\n }\n }\n\n public removePlanObjectFromScene(\n planElementViewModel: PlanElementViewModel,\n ): void {\n const type = planElementViewModel.getPlanElement().getType();\n if (this._isConstructionType(type)) {\n this._constructionGroup.remove(planElementViewModel.getContainer());\n } else if (\n type === this._getKernelAccess().kernelContainer.PlanElementType.FLOOR\n ) {\n this._floorGroup.remove(planElementViewModel.getContainer());\n } else if (\n type === this._getKernelAccess().kernelContainer.PlanElementType.CEILING\n ) {\n this._ceilingGroup.remove(planElementViewModel.getContainer());\n } else if (\n type === this._getKernelAccess().kernelContainer.PlanElementType.MEASURE\n ) {\n this._measurementLineGroup.remove(planElementViewModel.getContainer());\n } else if (\n type === this._getKernelAccess().kernelContainer.PlanElementType.ATTIC\n ) {\n this._wallAtticsGroup.remove(planElementViewModel.getContainer());\n }\n planElementViewModel.clear();\n }\n\n private _isConstructionType(type: any) {\n return (\n type === this._getKernelAccess().kernelContainer.PlanElementType.WALL ||\n type === this._getKernelAccess().kernelContainer.PlanElementType.NODE\n );\n }\n\n public planElementRemoved(element: PlanElement): void {\n const planObject = element as PlanObject;\n const planObjectViewModel = planObject.extRef?.jsObject;\n\n if (\n planObjectViewModel instanceof ConfigurableConstructionPlanObjectViewModel\n ) {\n this._removeObject(\n this._configurableConstructionPlanObjectViewModels,\n planObjectViewModel,\n );\n } else if (planObjectViewModel instanceof ConfiguratorPlanObjectViewModel) {\n this._detachPlanObjectViewModelFromComponent(planObjectViewModel);\n this._removeObject(\n this._configurablePlanObjectViewModels,\n planObjectViewModel,\n );\n } else if (planObjectViewModel instanceof ConstructionPlanObjectViewModel) {\n this._removeObject(\n this._constructionPlanObjectViewModels,\n planObjectViewModel,\n );\n } else if (planObjectViewModel instanceof StaticPlanObjectViewModel) {\n this._removeObject(this._staticPlanObjectViewModels, planObjectViewModel);\n } else if (planObjectViewModel instanceof FloorPlanElementViewModel) {\n this._removeObject(this._floorPlanObjectViewModels, planObjectViewModel);\n } else if (planObjectViewModel instanceof WallPlanElementViewModel) {\n this._removeObject(this._wallPlanObjectViewModels, planObjectViewModel);\n } else if (planObjectViewModel instanceof NodePlanElementViewModel) {\n this._removeObject(this._nodePlanObjectViewModels, planObjectViewModel);\n } else if (\n planObjectViewModel instanceof MeasurementLinePlanElementViewModel\n ) {\n this._removeObject(\n this._measurementLinePlanObjectViewModels,\n planObjectViewModel,\n );\n } else if (planObjectViewModel instanceof WallAtticPlanElementViewModel) {\n this._removeObject(\n this._wallAtticsPlanObjectViewModels,\n planObjectViewModel,\n );\n }\n }\n\n private _removeObject<T>(array: T[], planObjectViewModel: T) {\n const index = array.indexOf(planObjectViewModel);\n if (index > -1) {\n array.splice(index, 1);\n }\n }\n\n protected getMeshGenerator(): MeshGenerator {\n return this._plannerMeshGenerator;\n }\n\n public componentConfigurationUpdated(\n runtimeComponentId: number,\n geometryChanged: boolean,\n ) {\n super.componentConfigurationUpdated(runtimeComponentId, geometryChanged);\n }\n\n public getBoundingBoxFromRuntimeIds(runtimeIds: number[]) {\n const box = new Box3();\n this._staticPlanObjectViewModels.forEach((m) => {\n if (runtimeIds.includes(m.getPlanElement().getId())) {\n box.expandByObject(m.getContainer());\n }\n });\n this._configurablePlanObjectViewModels.forEach((m) => {\n if (runtimeIds.includes(m.getPlanElement().getId())) {\n box.expandByObject(m.getContainer());\n }\n });\n this._configurableConstructionPlanObjectViewModels.forEach((m) => {\n if (runtimeIds.includes(m.getPlanElement().getId())) {\n box.expandByObject(m.getContainer());\n }\n });\n this._constructionPlanObjectViewModels.forEach((m) => {\n if (runtimeIds.includes(m.getPlanElement().getId())) {\n box.expandByObject(m.getContainer());\n }\n });\n return box;\n }\n\n public hideAllExceptRuntimeIds(runtimeIds: number[]) {\n this._ceilingGroup.visible = false;\n this._floorGroup.visible = false;\n this._measurementLineGroup.visible = false;\n this._wallAtticsGroup.visible = false;\n this._constructionGroup.visible = false;\n\n this._staticPlanObjectViewModels.forEach((m) => {\n if (runtimeIds.includes(m.getPlanElement().getId())) {\n return;\n }\n m.getContainer().visible = false;\n });\n this._configurablePlanObjectViewModels.forEach((m) => {\n if (runtimeIds.includes(m.getPlanElement().getId())) {\n return;\n }\n m.getContainer().visible = false;\n });\n this._configurableConstructionPlanObjectViewModels.forEach((m) => {\n if (runtimeIds.includes(m.getPlanElement().getId())) {\n return;\n }\n m.getContainer().visible = false;\n });\n this._constructionPlanObjectViewModels.forEach((m) => {\n if (runtimeIds.includes(m.getPlanElement().getId())) {\n return;\n }\n m.getContainer().visible = false;\n });\n }\n\n public hideAllExcept(planObjectId: number) {\n this._ceilingGroup.visible = false;\n this._floorGroup.visible = false;\n this._measurementLineGroup.visible = false;\n this._wallAtticsGroup.visible = false;\n this._constructionGroup.visible = false;\n this._staticPlanObjectViewModels.forEach((m) => {\n if (m.getId() === planObjectId) {\n return;\n }\n m.getContainer().visible = false;\n });\n this._configurablePlanObjectViewModels.forEach((m) => {\n if (m.getId() === planObjectId) {\n return;\n }\n m.getContainer().visible = false;\n });\n this._configurableConstructionPlanObjectViewModels.forEach((m) => {\n if (m.getId() === planObjectId) {\n return;\n }\n m.getContainer().visible = false;\n });\n this._constructionPlanObjectViewModels.forEach((m) => {\n if (m.getId() === planObjectId) {\n return;\n }\n m.getContainer().visible = false;\n });\n }\n\n public showAll() {\n this._ceilingGroup.visible = this._cameraType === CAMERA_TYPE.CAMERA_FP;\n this._floorGroup.visible = true;\n this._measurementLineGroup.visible = true;\n this._wallAtticsGroup.visible = true;\n this._constructionGroup.visible = true;\n this._staticPlanObjectViewModels.forEach(\n (m) => (m.getContainer().visible = true),\n );\n this._configurablePlanObjectViewModels.forEach(\n (m) => (m.getContainer().visible = true),\n );\n this._configurableConstructionPlanObjectViewModels.forEach(\n (m) => (m.getContainer().visible = true),\n );\n this._constructionPlanObjectViewModels.forEach(\n (m) => (m.getContainer().visible = true),\n );\n }\n\n planHistoryStateChanged(): void {\n // unused\n }\n\n public setNodeVisibility(visible: boolean) {\n this._nodePlanObjectViewModels.forEach((nodePlanObject) =>\n nodePlanObject.setTopView(visible),\n );\n }\n\n public async setCameraType(cameraType: Enumify<typeof CAMERA_TYPE>) {\n this._cameraType = cameraType;\n\n const promises: Array<Promise<void>> = [];\n\n this._wallPlanObjectViewModels.forEach((wallPlanObject) =>\n wallPlanObject.setTopView(this._cameraType === CAMERA_TYPE.CAMERA_2D),\n );\n\n this._measurementLinePlanObjectViewModels.forEach((measurementPlanObject) =>\n measurementPlanObject.setTopView(\n this._cameraType === CAMERA_TYPE.CAMERA_2D,\n ),\n );\n\n this._wallAtticsPlanObjectViewModels.forEach((wallAtticPlanObject) =>\n wallAtticPlanObject.setTopView(\n this._cameraType === CAMERA_TYPE.CAMERA_2D,\n ),\n );\n\n this._nodePlanObjectViewModels.forEach((nodePlanObject) =>\n nodePlanObject.setTopView(this._cameraType === CAMERA_TYPE.CAMERA_2D),\n );\n\n this._configurablePlanObjectViewModels.forEach((configurablePlanObject) =>\n configurablePlanObject.setTopView(\n this._cameraType === CAMERA_TYPE.CAMERA_2D,\n ),\n );\n\n this._constructionPlanObjectViewModels.forEach((nodePlanObject) =>\n promises.push(\n nodePlanObject.setTopView(this._cameraType === CAMERA_TYPE.CAMERA_2D),\n ),\n );\n this._configurableConstructionPlanObjectViewModels.forEach(\n (configurablePlanObject) =>\n promises.push(\n configurablePlanObject.setTopView(\n this._cameraType === CAMERA_TYPE.CAMERA_2D,\n ),\n ),\n );\n\n await Promise.all(promises);\n }\n\n public get cameraType(): Enumify<typeof CAMERA_TYPE> {\n return this._cameraType;\n }\n\n public setNodeZoom(zoom: number) {\n zoom = Math.min(4, zoom);\n this._nodeZoom = zoom;\n for (const node of this._nodePlanObjectViewModels) {\n node.setZoom(zoom);\n }\n for (const node of this._measurementLinePlanObjectViewModels) {\n node.getPoint1Draggable().scale.setScalar(zoom);\n node.getPoint2Draggable().scale.setScalar(zoom);\n }\n }\n\n planCleared(): void {\n const viewModelGroups = [\n this._configurablePlanObjectViewModels,\n this._configurableConstructionPlanObjectViewModels,\n this._staticPlanObjectViewModels,\n this._wallPlanObjectViewModels,\n this._measurementLinePlanObjectViewModels,\n this._nodePlanObjectViewModels,\n this._floorPlanObjectViewModels,\n this._constructionPlanObjectViewModels,\n this._wallAtticsPlanObjectViewModels,\n ];\n\n viewModelGroups.forEach((group) => {\n group.forEach((viewModel) => viewModel.remove());\n group.length = 0;\n });\n }\n\n public requestCatalogItem(_catalogItemId: string): void {\n // Not implemented yet but needed for typescript interface since the class implement PlannerKernelCallbackI\n }\n}\n","import type InputManager from '../../../common-core/src/input/input-manager';\nimport {\n INPUT_EVENT,\n INPUT_EVENT_TYPE,\n type InputEvent,\n} from '../../../common-core/src/input/input-manager';\nimport type { SceneEventInfo } from '../webgl/configurator-scene-event-handler';\nimport EventDispatcher from './event-dispatcher';\nimport type { RoomleComponent } from '../../../common-core/src/webgl/roomle-component-factory';\nimport type { Position2 } from '../../../common-core/src/common-interfaces';\nimport { toRadiant } from '../../../common-core/src/utils/math-helper';\nimport {\n compareBox3Size,\n type RoomleEventedIntersection,\n type RoomleEventedMesh,\n type RoomleEventedObject3D,\n} from '../../../common-core/src/utils/threejs-utils';\nimport {\n disposeMesh,\n getActiveLayers,\n vectorIsZero,\n} from '../../../common-core/src/utils/threejs-utils';\nimport { convertToKernel } from '../../../common-core/src/utils/kernel-utils';\nimport {\n Box3,\n type Camera,\n type Layers,\n type Object3D,\n type Scene,\n} from 'three';\nimport { Mesh, Plane, Quaternion, Raycaster, Vector2, Vector3 } from 'three';\nimport { GROUP_CONSTRUCTION } from '../../../planner-core/src/view-model/plan-view-model';\nimport type { PlanObjectEventInfo } from '../../../planner-core/src/webgl/planner-scene-event-handler';\n\nexport const enum OBJECT_EVENT {\n CLICK = 'select',\n DOUBLE_CLICK = 'double_click',\n HOVER_ON = 'hover_on',\n HOVER_OFF = 'hover_off',\n HOVER_MOVE = 'hover_move',\n DRAG_START = 'drag_start',\n DRAG = 'drag',\n DRAG_END = 'drag_end',\n ROTATE = 'rotate',\n}\n\nexport const RAYCAST_PRIORITY = {\n RAYCASTER_FLOOR: 0.8, //used for recognizing clicks for wall drawing\n FLOOR: 0.9,\n WALL: 0.95,\n DEFAULT: 1,\n CONSTRUCTION: 1,\n COMPONENT: 2,\n PREVIEW: 3,\n PREVIEW_LINE: 4,\n} as const;\n\nexport const enum INTERSECTION_MODE {\n PLANNER,\n CONFIGURATOR,\n}\n\nexport const enum RAYCAST_EVENT {\n CLICK_OUTSIDE,\n}\n\nconst ROTATION_TO_DETECT_SIDE = toRadiant(30);\n\nconst DEBUG = false;\n\nexport default class RaycastHelper extends EventDispatcher<SceneEventInfo> {\n private _mode: INTERSECTION_MODE;\n\n private _object: Object3D;\n private _camera: Camera;\n private _inputManager: InputManager;\n private _raycaster: Raycaster;\n private _bounds: Vector3;\n private _rootComponentId: number;\n private _rootComponentPosition: Vector3;\n private _backgroundScene: Scene;\n\n private _currentHover: RoomleEventedObject3D;\n private _currentDrag: RoomleEventedObject3D | RoomleEventedMesh;\n private _currentRotate: RoomleEventedObject3D;\n\n private _offset: Vector3 = new Vector3(0, 0, 0);\n private _planeFront: Plane;\n private _planeBottom: Plane;\n private _planeSide: Plane;\n private _lastMoveCheck: number = 0;\n private _onWallSnapping: boolean = false;\n\n constructor(\n object: Object3D,\n camera: Camera,\n generalInput: InputManager,\n mode?: INTERSECTION_MODE\n ) {\n super();\n this._mode = mode === undefined ? INTERSECTION_MODE.CONFIGURATOR : mode;\n this._object = object;\n this._camera = camera;\n this._raycaster = new Raycaster();\n this._raycaster.layers.disableAll();\n this._inputManager = generalInput;\n this._addInputListeners(generalInput);\n\n this._planeBottom = new Plane(new Vector3(0, 1, 0));\n this._planeFront = new Plane(new Vector3(0, 0, 1));\n this._planeSide = new Plane(new Vector3(1, 0, 0));\n }\n\n public setLayers(layers: Layers) {\n this._raycaster.layers = layers;\n }\n\n public getLayers() {\n return this._raycaster.layers;\n }\n\n private _addInputListeners(inputManager: InputManager) {\n inputManager.addEventListener(\n INPUT_EVENT.DOWN,\n (event: InputEvent) => {\n this._findCandidate(event.positionRelative);\n },\n this\n );\n\n inputManager.addEventListener(\n INPUT_EVENT.CLICK,\n (event: InputEvent) => {\n this._findSelection(event.positionRelative);\n },\n this\n );\n\n inputManager.addEventListener(\n INPUT_EVENT.DOUBLE_CLICK,\n (event: InputEvent) => {\n this._findSelection(event.positionRelative, true, event.type);\n },\n this\n );\n\n inputManager.addEventListener(\n INPUT_EVENT.LONG_TOUCH,\n (event: InputEvent) => {\n // long touch is handles as double click\n this._findSelection(event.positionRelative, true, event.type);\n },\n this\n );\n\n inputManager.addEventListener(\n INPUT_EVENT.MOVE,\n (event: InputEvent) => {\n if (Date.now() - this._lastMoveCheck > 32) {\n this._findHover(event.positionRelative, event.type);\n this._lastMoveCheck = Date.now();\n }\n },\n this\n );\n\n inputManager.addEventListener(\n INPUT_EVENT.DRAG_START,\n (event: InputEvent) => {\n this._onDragStart(event.positionRelative);\n },\n this\n );\n\n inputManager.addEventListener(\n INPUT_EVENT.DRAG,\n (event: InputEvent) => {\n this._onDrag(event.positionRelative);\n },\n this\n );\n\n inputManager.addEventListener(\n INPUT_EVENT.DRAG_END,\n (event: InputEvent) => {\n this._onDragEnd(event.positionRelative);\n },\n this\n );\n\n inputManager.addEventListener(\n INPUT_EVENT.ROTATE,\n (event: InputEvent) => {\n this._onRotate(event.positionRelative, event.rotation);\n },\n this\n );\n\n inputManager.addEventListener(\n INPUT_EVENT.ROTATE_END,\n () => {\n this._currentRotate = null;\n },\n this\n );\n }\n\n private _findCandidate(position: Position2) {\n let intersection = this._intersection(position);\n // only report element hits (which improves dragging response) in planner\n // because this makes dragging previews to easy and results in unwanted behaviour\n if (\n intersection &&\n !intersection.object.userData.ignoreElementHit &&\n this._mode === INTERSECTION_MODE.PLANNER\n ) {\n this._inputManager.onElementHit();\n }\n }\n\n private _findSelection(\n position: Position2,\n doubleClick = false,\n inputType: INPUT_EVENT_TYPE = INPUT_EVENT_TYPE.UNKNOWN\n ) {\n let intersection = this._intersection(position);\n if (!intersection) {\n this.dispatchEvent(RAYCAST_EVENT.CLICK_OUTSIDE);\n } else if (intersection) {\n const type = doubleClick ? OBJECT_EVENT.DOUBLE_CLICK : OBJECT_EVENT.CLICK;\n intersection.object.dispatchEvent({\n type,\n attachment: { intersection, type: inputType },\n });\n }\n }\n\n private _findHover(position: Position2, type: INPUT_EVENT_TYPE) {\n const intersection = this._intersection(position);\n if (!intersection && this._currentHover) {\n this._currentHover.dispatchEvent({\n type: OBJECT_EVENT.HOVER_OFF,\n attachment: { type },\n });\n this._currentHover = null;\n } else if (intersection) {\n if (\n this._currentHover &&\n this._currentHover.id !== intersection.object.id\n ) {\n this._currentHover.dispatchEvent({\n type: OBJECT_EVENT.HOVER_OFF,\n attachment: { type },\n });\n this._currentHover = null;\n }\n if (!this._currentHover) {\n this._currentHover = intersection.object;\n this._currentHover.dispatchEvent({\n type: OBJECT_EVENT.HOVER_ON,\n attachment: { intersection, type },\n });\n } else {\n this._currentHover.dispatchEvent({\n type: OBJECT_EVENT.HOVER_MOVE,\n attachment: { intersection, type },\n });\n }\n }\n }\n\n private _intersection(position: Position2): RoomleEventedIntersection {\n // if both x and y are 0 the position is not set\n if (position.x === 0 && position.y === 0) {\n return null;\n }\n const intersections = this._intersect(position);\n if (window.__RML__DEBUG__?.raycaster) {\n const log = [];\n for (const i of intersections) {\n log.push({\n name: i.object.userData.planElementName,\n distance: i.distance,\n priority: i.object.userData.priority,\n });\n }\n if (log.length) {\n console.table(log);\n }\n }\n if (intersections.length <= 0) {\n return null;\n }\n let intersectionResult = intersections[0];\n //for docklines we always want to return the current hover if it is still within the intersections\n if (\n intersections.length > 1 &&\n this._currentHover &&\n this._currentDrag &&\n this._currentDrag.id !== this._currentHover.id\n ) {\n intersections.forEach((intersection) => {\n if (\n intersection.object.id === this._currentHover.id &&\n intersection.object.userData.priority ===\n this._currentHover.userData.priority &&\n intersectionResult.object.userData.priority <=\n intersection.object.userData.priority\n ) {\n intersectionResult = intersection;\n }\n });\n }\n if (DEBUG) {\n console.log(getActiveLayers(intersectionResult.object.layers));\n }\n return intersectionResult;\n }\n\n private _intersect(position: Position2): RoomleEventedIntersection[] {\n this._raycaster.setFromCamera(\n new Vector2(position.x, position.y),\n this._camera\n );\n const intersectionsWithHandler: RoomleEventedIntersection[] = [];\n const intersections =\n this._raycaster.intersectObjects<RoomleEventedObject3D>(\n this._object.children,\n true\n );\n intersections.forEach((intersection) => {\n const object = this._findObjectWithHandler(intersection.object);\n if (object) {\n intersection.object = object;\n intersectionsWithHandler.push(intersection);\n }\n });\n if (intersectionsWithHandler.length >= 0) {\n return intersectionsWithHandler.sort((a, b) => {\n if (a.object.userData.priority !== b.object.userData.priority) {\n return b.object.userData.priority - a.object.userData.priority;\n }\n if (\n compareBox3Size(\n new Box3().setFromObject(a.object),\n new Box3().setFromObject(b.object)\n ) < 0\n ) {\n return -1;\n }\n return a.distance - b.distance;\n });\n } else {\n return [];\n }\n }\n\n private _findObjectWithHandler(\n object: RoomleEventedObject3D\n ): RoomleEventedObject3D {\n if (object.userData.hasListener) {\n return object;\n } else if (object.parent) {\n return this._findObjectWithHandler(\n object.parent as RoomleEventedObject3D\n );\n }\n return null;\n }\n\n private _onDragStart(position: Position2) {\n let intersection = this._intersection(position);\n if (!intersection && !this._currentDrag) {\n return;\n }\n\n if (\n intersection &&\n intersection.object.userData.roomleId === this._rootComponentId\n ) {\n return;\n }\n\n if (!this._currentDrag && intersection) {\n this._currentDrag = intersection.object;\n this._currentDrag.dispatchEvent({ type: OBJECT_EVENT.DRAG_START });\n }\n\n let component: RoomleComponent = this._currentDrag\n .parent as RoomleComponent;\n if (component && component.computeBoundingBox) {\n component.computeBoundingBox();\n this._calculateOffset(component);\n }\n this._positionPlanes(component);\n }\n private _onDrag(positionRelative: Position2) {\n if (!this._currentDrag) {\n return;\n }\n\n this._raycaster.setFromCamera(\n new Vector2(positionRelative.x, positionRelative.y),\n this._camera\n );\n let intersectionBottom = new Vector3(0, 0, -5);\n\n this._raycaster.ray.intersectPlane(this._planeBottom, intersectionBottom);\n\n let position: Vector3;\n if (this._mode === INTERSECTION_MODE.PLANNER) {\n const constructionGroup = this._object.children.find(\n ({ type, name }) => type === 'Group' && name === GROUP_CONSTRUCTION\n );\n const snapToWall = (this._currentDrag.userData as PlanObjectEventInfo)\n .snapToWall;\n if (constructionGroup && (this._onWallSnapping || snapToWall)) {\n const intersections = this._raycaster.intersectObjects(\n constructionGroup.children,\n true\n );\n if (intersections.length) {\n const wallPosition = intersections[0].point.clone();\n this._currentDrag.dispatchEvent({\n type: OBJECT_EVENT.DRAG,\n attachment: { position: wallPosition },\n });\n return;\n }\n }\n\n position = intersectionBottom.clone();\n } else {\n position = this._getIntersectionPosition(intersectionBottom);\n position.sub(this._offset);\n }\n this._currentDrag.dispatchEvent({\n type: OBJECT_EVENT.DRAG,\n attachment: { position },\n });\n }\n\n private _getIntersectionPosition(intersectionBottom: Vector3) {\n let bottomDistance = this._getDistanceToCamera(intersectionBottom);\n\n let yaw = this._camera.userData.yaw;\n let intersectionFront = new Vector3(0, 0, 0);\n let intersectionSide = new Vector3(0, 0, 0);\n\n this._raycaster.ray.intersectPlane(this._planeFront, intersectionFront);\n this._raycaster.ray.intersectPlane(this._planeSide, intersectionSide);\n\n let sideDistance = this._getDistanceToCamera(intersectionSide);\n let frontDistance = this._getDistanceToCamera(intersectionFront);\n let position: Vector3;\n // if you are looking without any significant rotation to the plan object, we should use older plane detection with only front and bottom\n if (yaw >= -ROTATION_TO_DETECT_SIDE && yaw <= ROTATION_TO_DETECT_SIDE) {\n if (bottomDistance < frontDistance) {\n position = intersectionBottom.clone();\n } else {\n position = intersectionFront.clone();\n }\n } else {\n // else we use newer plane detection with 3 planes (front, bottom side)\n if (bottomDistance < frontDistance && bottomDistance < sideDistance) {\n position = intersectionBottom.clone();\n } else if (\n frontDistance < bottomDistance &&\n frontDistance < sideDistance\n ) {\n position = intersectionFront.clone();\n } else if (\n sideDistance < bottomDistance &&\n sideDistance < frontDistance\n ) {\n position = intersectionSide.clone();\n }\n }\n return position;\n }\n\n private _getDistanceToCamera(intersection: Vector3): number {\n let vector = intersection.clone().sub(this._camera.position);\n let vectorLength = vector.length();\n if (vectorIsZero(intersection)) {\n //no intersection found\n vectorLength = Number.POSITIVE_INFINITY;\n }\n return vectorLength;\n }\n\n private _onDragEnd(position: Position2) {\n if (!this._currentDrag) {\n return;\n }\n this._currentDrag.dispatchEvent({\n type: OBJECT_EVENT.DRAG_END,\n attachment: { position },\n });\n this._currentDrag = null;\n }\n\n private _onRotate(position: Position2, rotation: number) {\n if (!this._currentRotate) {\n let intersection = this._intersection(position);\n if (!intersection) {\n return;\n }\n this._currentRotate = intersection.object;\n }\n this._currentRotate.dispatchEvent({\n type: OBJECT_EVENT.ROTATE,\n attachment: { rotation },\n });\n }\n\n private _positionPlanes(component: RoomleComponent) {\n if (this._mode === INTERSECTION_MODE.PLANNER) {\n this._planeBottom.constant = 0;\n if (\n this._camera.userData &&\n this._camera.userData.pitch &&\n this._camera.userData.pitch < 0\n ) {\n this._planeBottom.constant = -3;\n }\n } else if (\n component &&\n component.boundingBox &&\n this._rootComponentPosition\n ) {\n this._planeBottom.constant =\n -component.boundingBox.getCenter(new Vector3()).y -\n this._rootComponentPosition.y;\n //set side plane to component bounding box\n this._planeSide.constant =\n -component.boundingBox.getSize(new Vector3()).x * 2 +\n component.boundingBox.getCenter(new Vector3()).x;\n let yaw = this._camera.userData.yaw;\n if (yaw > 0) {\n this._planeSide.constant *= -1;\n }\n if (this._bounds) {\n this._planeFront.constant =\n this._bounds.z / 2 + component.boundingBox.getCenter(new Vector3()).z;\n }\n }\n }\n\n private _calculateOffset(component: RoomleComponent) {\n if (component && component.boundingBox) {\n this._offset.copy(component.boundingBox.getCenter(new Vector3()));\n this._offset.applyQuaternion(\n component.getWorldQuaternion(new Quaternion())\n );\n }\n }\n\n public update(\n bounds: Vector3,\n rootComponentPosition: Vector3,\n backgroundScene: Scene\n ) {\n if (bounds) {\n this._bounds = bounds;\n }\n if (rootComponentPosition) {\n this._rootComponentPosition = rootComponentPosition;\n }\n if (backgroundScene) {\n this._backgroundScene = backgroundScene;\n let child = this._backgroundScene.children[0];\n if (child instanceof Mesh) {\n child.geometry.computeBoundingBox();\n }\n }\n }\n\n public clear() {\n if (this._currentDrag) {\n disposeMesh(this._currentDrag as Mesh);\n }\n if (this._currentHover) {\n disposeMesh(this._currentHover as Mesh);\n }\n }\n\n public enableDragIn(mesh: RoomleEventedMesh) {\n this._currentDrag = mesh;\n }\n\n public setRootComponentId(rootComponentId: number) {\n this._rootComponentId = rootComponentId;\n }\n\n public setCamera(camera: Camera) {\n this._camera = camera;\n }\n\n public setObject(object: Object3D) {\n this._object = object;\n }\n\n public setMode(mode: INTERSECTION_MODE) {\n this._mode = mode;\n }\n\n public intersectMouseOnScene(event: InputEvent) {\n const plane = new Plane();\n const planeNormal = new Vector3();\n planeNormal.copy(this._camera.position).normalize();\n plane.setFromNormalAndCoplanarPoint(planeNormal, this._object.position);\n this._raycaster.setFromCamera(\n new Vector2(event.positionRelative.x, event.positionRelative.y),\n this._camera\n );\n return convertToKernel(\n this._raycaster.ray.intersectPlane(plane, new Vector3())\n );\n }\n\n public enableOnWallSnapping() {\n this._onWallSnapping = true;\n }\n\n public disableOnWallSnapping() {\n this._onWallSnapping = false;\n }\n}\n","import EventDispatcher from '../../../configurator-core/src/utils/event-dispatcher';\nimport RaycastHelper from '../../../configurator-core/src/utils/raycast-helper';\nimport type { Context } from '../di/context';\nimport type InputManager from '../input/input-manager';\nimport type { Camera, Scene } from 'three';\n\nexport default abstract class SceneEventHandler<EventType>\n extends EventDispatcher<EventType>\n implements Context\n{\n _creator_: string;\n\n protected _inputManager: InputManager;\n protected _raycastHelper: RaycastHelper;\n\n protected _debug: boolean = false;\n protected _dragIn: boolean = false;\n\n constructor(\n creator: string,\n scene: Scene,\n camera: Camera,\n inputManager: InputManager\n ) {\n super();\n this._inputManager = inputManager;\n this._raycastHelper = new RaycastHelper(scene, camera, this._inputManager);\n this._creator_ = creator;\n }\n\n protected abstract _interaction(): void;\n\n public isDragIn() {\n return this._dragIn;\n }\n\n public setDragIn(dragIn: boolean, dragEvent?: DragEvent) {\n this._dragIn = dragIn;\n if (dragIn) {\n this._inputManager.enableDragIn(dragEvent);\n } else {\n this._raycastHelper.clear();\n }\n this._interaction();\n }\n}\n","import type {\n PreviewComponent,\n PreviewLineComponent,\n RoomleComponent,\n} from '../../../common-core/src/webgl/roomle-component-factory';\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} from '../../../common-core/src/input/input-manager';\nimport type SelectionHandler from '../utils/selection-handler';\nimport { SELECTION_EVENT, SELECTION_MODE } from '../utils/selection-handler';\nimport inject from '../../../common-core/src/di/inject';\nimport SceneEventHandler from '../../../common-core/src/webgl/scene-event-handler';\nimport {\n OBJECT_EVENT,\n RAYCAST_EVENT,\n RAYCAST_PRIORITY,\n} from '../utils/raycast-helper';\nimport { LAYER } from '../../../common-core/src/webgl/layer';\nimport { deepMerge } from '../../../common-core/src/utils/common-utils';\nimport type {\n BufferGeometry,\n Euler,\n Intersection,\n Material,\n NormalBufferAttributes,\n Object3D,\n PerspectiveCamera,\n Scene,\n} from 'three';\nimport { type Vector3 } from 'three';\nimport { type Camera, Layers, Mesh } from 'three';\nimport type ConfiguratorUiCallbacks from '../services/configurator-ui-callback';\nimport type { Object3DRoomleEventMap } from '../../../common-core/src/utils/threejs-utils';\nimport { type Enumify } from '../../../common-core/src/types';\nimport type { CancelSelectionReasons } from '../../../typings/planner';\n\nexport const enum SCENE_EVENT {\n INTERACTION,\n HOVER_ON,\n HOVER_OFF,\n CLICK_OUTSIDE,\n DRAG_START,\n DRAG_MOVE,\n DRAG_END,\n CLICK_PREVIEW,\n SELECT_COMPONENT,\n DESELECT_COMPONENT,\n}\n\nexport class SceneEventInfo {\n public component: RoomleComponent;\n public preview: PreviewComponent;\n public resetCamera: boolean;\n // is this the first click on the component or a consecutive click\n public consecutive: boolean;\n public type: INPUT_EVENT_TYPE;\n public forceRender: boolean;\n public reason: CancelSelectionReasons;\n constructor(data: {\n component?: RoomleComponent;\n preview?: PreviewComponent;\n resetCamera?: boolean;\n consecutive?: boolean;\n type?: INPUT_EVENT_TYPE;\n forceRender?: boolean;\n reason?: CancelSelectionReasons;\n }) {\n const {\n component,\n preview,\n resetCamera,\n consecutive,\n type,\n forceRender,\n reason,\n } = data;\n this.component = component;\n this.preview = preview;\n this.resetCamera = resetCamera === undefined ? true : resetCamera;\n this.consecutive = consecutive === undefined ? true : consecutive;\n this.type = type ? type : INPUT_EVENT_TYPE.UNKNOWN;\n this.forceRender = forceRender !== undefined ? forceRender : false;\n this.reason = reason;\n }\n}\n\nexport interface ComponentEventInfo {\n hasListener: boolean;\n priority: Enumify<typeof RAYCAST_PRIORITY>;\n roomleId: number;\n}\n\nexport default class ConfiguratorSceneEventHandler extends SceneEventHandler<SceneEventInfo> {\n declare public _creator_: string;\n\n @inject\n private _selectionHandler: SelectionHandler;\n\n @inject\n private _configuratorUiCallbacks: ConfiguratorUiCallbacks;\n\n private _cameraMoving: boolean = false;\n\n private _hoveredComponent: RoomleComponent;\n private _hoveredPreview: PreviewComponent;\n private _draggedComponent: RoomleComponent;\n private _previewLineIntersection: Vector3;\n private _dragStartPosition: Vector3;\n private _dragStartRotation: Euler;\n\n constructor(\n creator: string,\n scene: Scene,\n camera: PerspectiveCamera,\n inputManager: InputManager\n ) {\n super(creator, scene, camera, inputManager);\n\n this._raycastHelper.addEventListener(\n RAYCAST_EVENT.CLICK_OUTSIDE,\n () => {\n this._clickOutside();\n },\n this\n );\n\n this._selectionHandler.addEventListener(\n SELECTION_EVENT.SELECT_COMPONENT,\n ({ component, consecutive }) => {\n this.dispatchEvent(\n SCENE_EVENT.SELECT_COMPONENT,\n new SceneEventInfo({ component, consecutive })\n );\n this._inputManager.setDragEnabled(true);\n },\n this\n );\n this._selectionHandler.addEventListener(\n SELECTION_EVENT.DESELECT_COMPONENT,\n ({ component, resetCamera, reason }) => {\n if (!this._selectionHandler.hasSelection()) {\n this._inputManager.setDragEnabled(false);\n }\n this.dispatchEvent(\n SCENE_EVENT.DESELECT_COMPONENT,\n new SceneEventInfo({\n component,\n resetCamera,\n reason,\n })\n );\n },\n this\n );\n\n this._addInputListeners(this._inputManager);\n }\n\n public disable() {\n const layers = new Layers();\n layers.disableAll();\n this._raycastHelper.setLayers(layers);\n this._raycastHelper.disableEvents();\n }\n\n public enable() {\n const layers = new Layers();\n layers.disableAll();\n layers.enable(LAYER.COMPONENT);\n layers.enable(LAYER.PREVIEW);\n layers.enable(LAYER.GIZMO);\n layers.enable(LAYER.DIMENSIONS);\n this._raycastHelper.setLayers(layers);\n this._raycastHelper.enableEvents();\n }\n\n private _addInputListeners(inputManager: InputManager) {\n inputManager.addEventListener(\n INPUT_EVENT.ZOOM_IN,\n (_event: InputEvent) => this._interaction(),\n this\n );\n inputManager.addEventListener(\n INPUT_EVENT.ZOOM_OUT,\n (_event: InputEvent) => this._interaction(),\n this\n );\n }\n\n public addComponentHandlers(component: RoomleComponent) {\n this._addComponentHandlers(component, component.boundingBoxMesh, {\n hasListener: true,\n priority: RAYCAST_PRIORITY.DEFAULT,\n roomleId: component.runtimeId,\n } as ComponentEventInfo);\n\n component.meshes.forEach((mesh) => {\n this._addComponentHandlers(component, mesh, {\n hasListener: true,\n priority: RAYCAST_PRIORITY.COMPONENT,\n roomleId: component.runtimeId,\n } as ComponentEventInfo);\n });\n }\n\n public addComponentDragInHandler(component: RoomleComponent) {\n if (!this._dragIn) {\n return;\n }\n this._addComponentHandlers(component, component.boundingBoxMesh, {\n hasListener: true,\n priority: RAYCAST_PRIORITY.DEFAULT,\n roomleId: component.runtimeId,\n } as ComponentEventInfo);\n\n this._raycastHelper.enableDragIn(component.boundingBoxMesh);\n }\n\n private _addComponentHandlers(\n component: RoomleComponent,\n mesh: Mesh<\n BufferGeometry<NormalBufferAttributes>,\n Material | Material[],\n Object3DRoomleEventMap\n >,\n componentEventInfo: ComponentEventInfo\n ) {\n if (!mesh.userData.hasListener) {\n Object.assign(mesh.userData, componentEventInfo);\n mesh.addEventListener(OBJECT_EVENT.CLICK, () =>\n this.clickComponent(component)\n );\n mesh.addEventListener(OBJECT_EVENT.HOVER_ON, (event) =>\n this._hoverOn(component, event.attachment.type)\n );\n mesh.addEventListener(OBJECT_EVENT.HOVER_OFF, (event) =>\n this._hoverOff(component, event.attachment.type)\n );\n mesh.addEventListener(OBJECT_EVENT.DRAG_START, () =>\n this._dragStart(component)\n );\n mesh.addEventListener(OBJECT_EVENT.DRAG, (event) =>\n this._drag(component, event.attachment.position)\n );\n mesh.addEventListener(OBJECT_EVENT.DRAG_END, () =>\n this._dragEnd(component)\n );\n }\n }\n\n public addPreviewHandlers(component: PreviewComponent) {\n const boundingBox = component.boundingBoxMesh;\n if (!boundingBox.userData.hasListener) {\n boundingBox.userData = deepMerge(boundingBox.userData, {\n hasListener: true,\n priority: RAYCAST_PRIORITY.PREVIEW,\n roomleId: component.runtimeId,\n });\n boundingBox.addEventListener(OBJECT_EVENT.CLICK, () =>\n this._clickPreview(component)\n );\n boundingBox.addEventListener(OBJECT_EVENT.HOVER_ON, () =>\n this._hoverOnPreview(component)\n );\n boundingBox.addEventListener(OBJECT_EVENT.HOVER_OFF, () =>\n this._hoverOffPreview(component)\n );\n }\n }\n\n public addPreviewLineHandlers(component: PreviewLineComponent) {\n const boundingBox = component.boundingLineMesh;\n if (!boundingBox.userData.hasListener) {\n boundingBox.userData = deepMerge(boundingBox.userData, {\n hasListener: true,\n priority: RAYCAST_PRIORITY.PREVIEW_LINE,\n roomleId: component.runtimeId,\n });\n boundingBox.addEventListener(OBJECT_EVENT.CLICK, () =>\n this._clickPreviewLine(component)\n );\n boundingBox.addEventListener(OBJECT_EVENT.HOVER_ON, (event) =>\n this._hoverOnPreviewLine(component, event.attachment.intersection)\n );\n boundingBox.addEventListener(OBJECT_EVENT.HOVER_MOVE, (event) =>\n this._hoverMovePreviewLine(component, event.attachment.intersection)\n );\n boundingBox.addEventListener(OBJECT_EVENT.HOVER_OFF, () =>\n this._hoverOffPreviewLine(component)\n );\n }\n }\n\n private _clickPreview(preview: PreviewComponent) {\n if (this._dragStartPosition) {\n preview.position.copy(this._dragStartPosition);\n this._dragStartPosition = null;\n }\n this.dispatchEvent(\n SCENE_EVENT.CLICK_PREVIEW,\n new SceneEventInfo({ preview })\n );\n }\n\n private _clickPreviewLine(preview: PreviewLineComponent) {\n if (this._dragStartPosition) {\n preview.position.copy(this._dragStartPosition);\n this._dragStartPosition = null;\n }\n this.dispatchEvent(\n SCENE_EVENT.CLICK_PREVIEW,\n new SceneEventInfo({ preview })\n );\n }\n\n public clickComponent(\n component: RoomleComponent,\n triggerClickCallback = true\n ) {\n if (this._debug) {\n console.log('select: ' + component.runtimeId);\n }\n this._selectionHandler.check(component);\n if (triggerClickCallback) {\n this._configuratorUiCallbacks.onClickComponent(component);\n }\n }\n\n private _clickOutside() {\n this._selectionHandler.cancelSelection('click_outside');\n this.dispatchEvent(SCENE_EVENT.CLICK_OUTSIDE);\n this._interaction();\n }\n\n private _hoverOn(component: RoomleComponent, type: INPUT_EVENT_TYPE) {\n if (this._cameraMoving) {\n return;\n }\n if (this._debug) {\n console.log('hover_on: ' + component.runtimeId);\n }\n component.hoverOn();\n this._interaction();\n this.dispatchEvent(\n SCENE_EVENT.HOVER_ON,\n new SceneEventInfo({ component, type })\n );\n this._hoveredComponent = component;\n }\n\n private _hoverOff(component: RoomleComponent, type: INPUT_EVENT_TYPE) {\n if (this._cameraMoving) {\n return;\n }\n if (this._debug) {\n console.log('hover_off: ' + component.runtimeId);\n }\n component.hoverOff();\n this._interaction();\n this.dispatchEvent(\n SCENE_EVENT.HOVER_OFF,\n new SceneEventInfo({ component, type })\n );\n this._hoveredComponent = null;\n }\n\n private _hoverOnPreview(component: PreviewComponent) {\n component.hoverOn();\n this._interaction(true);\n this._hoveredPreview = component;\n this._hoveredPreview?.dockInsertAnimation?.startInsert();\n }\n\n private _hoverOffPreview(component: PreviewComponent) {\n this._hoveredPreview?.dockInsertAnimation?.endInsert();\n component.hoverOff();\n this._interaction(true);\n this._hoveredPreview = null;\n }\n\n private _hoverOnPreviewLine(\n component: PreviewLineComponent,\n intersection: Intersection\n ) {\n this._updatePositionForPreviewLine(component, intersection);\n if (!this._draggedComponent) {\n component.hoverOn();\n }\n this._interaction();\n this._hoveredPreview = component;\n }\n\n private _hoverMovePreviewLine(\n component: PreviewLineComponent,\n intersection: Intersection\n ) {\n this._updatePositionForPreviewLine(component, intersection);\n this._hoveredPreview = component;\n this._interaction(true);\n }\n\n private _updatePositionForPreviewLine(\n previewLineComponent: PreviewLineComponent,\n intersection: Intersection\n ) {\n const intersectionPoint = intersection.object.parent.parent.worldToLocal(\n intersection.point\n );\n this._previewLineIntersection = intersectionPoint;\n if (previewLineComponent) {\n if (!this._draggedComponent) {\n previewLineComponent.updatePreviewPosition(intersectionPoint);\n } else {\n this._draggedComponent.visible = true;\n }\n }\n }\n\n private _hoverOffPreviewLine(component: PreviewLineComponent) {\n if (!this._draggedComponent) {\n component.hoverOff();\n }\n this._interaction();\n this._hoveredPreview = null;\n this._previewLineIntersection = null;\n }\n\n private _setDragComponentShadow(enabled: boolean) {\n this._draggedComponent?.traverse((node) => {\n if (node instanceof Mesh) {\n const castedMesh = node as any;\n if (enabled && castedMesh.castShadowOld !== undefined) {\n castedMesh.receiveShadow = castedMesh.receiveShadowOld;\n castedMesh.castShadow = castedMesh.castShadowOld;\n } else {\n castedMesh.receiveShadowOld = node.receiveShadow;\n castedMesh.castShadowOld = node.castShadow;\n castedMesh.receiveShadow = false;\n castedMesh.castShadow = false;\n }\n }\n });\n }\n\n private _dragStart(component: RoomleComponent) {\n if (\n !component ||\n (!this._selectionHandler.isSelected(component) && !this.isDragIn())\n ) {\n return;\n }\n this._dragStartPosition = component.position.clone();\n this._dragStartRotation = component.rotation.clone();\n this._draggedComponent = component;\n this._setDragComponentShadow(false);\n this.dispatchEvent(\n SCENE_EVENT.DRAG_START,\n new SceneEventInfo({ component })\n );\n this._interaction();\n }\n\n private _drag(component: RoomleComponent, position: Vector3) {\n if (\n !component ||\n (!this._selectionHandler.isSelected(component) && !this.isDragIn())\n ) {\n return;\n }\n if (component && !this._draggedComponent) {\n this._draggedComponent = component;\n }\n if (this._previewLineIntersection) {\n const previewLineComponent = this._hoveredPreview as PreviewLineComponent;\n const positionLine = previewLineComponent.getPositionForIntersectionPoint(\n this._previewLineIntersection\n );\n const posInGlobal = previewLineComponent.parent.localToWorld(positionLine);\n this._draggedComponent.position.copy(\n this._draggedComponent.parent.worldToLocal(posInGlobal)\n );\n this._draggedComponent.rotation.copy(\n previewLineComponent.docklineRotation\n );\n previewLineComponent.hideSelectionLine();\n } else if (component.parent) {\n component.position.copy(component.parent.worldToLocal(position));\n } else {\n component.position.copy(position);\n }\n if (this._hoveredPreview) {\n component.visible = false;\n } else {\n component.visible = true;\n }\n this.dispatchEvent(\n SCENE_EVENT.DRAG_MOVE,\n new SceneEventInfo({ component })\n );\n this._interaction();\n }\n\n private _dragEnd(component: RoomleComponent) {\n if (\n !component ||\n (!this._selectionHandler.isSelected(component) && !this.isDragIn())\n ) {\n return;\n }\n if (this._hoveredPreview && this._previewLineIntersection) {\n const previewLineComponent = this._hoveredPreview as PreviewLineComponent;\n const positionLine = previewLineComponent.getPositionForIntersectionPoint(\n this._previewLineIntersection\n );\n const posInGlobal = previewLineComponent.parent.localToWorld(positionLine);\n component.position.copy(component.parent.worldToLocal(posInGlobal));\n component.rotation.copy(previewLineComponent.docklineRotation);\n } else if (this._dragStartPosition && this._dragStartRotation) {\n component.position.copy(this._dragStartPosition);\n component.rotation.copy(this._dragStartRotation);\n this._dragStartPosition = null;\n this._dragStartRotation = null;\n //listeners are somehow removed on drag\n this.addComponentHandlers(component);\n }\n component.visible = true;\n this._setDragComponentShadow(true);\n this._draggedComponent = null;\n this._previewLineIntersection = null;\n this.dispatchEvent(\n SCENE_EVENT.DRAG_END,\n new SceneEventInfo({ component, preview: this._hoveredPreview })\n );\n this._interaction();\n }\n\n protected _interaction(forceRender?: boolean) {\n this.dispatchEvent(\n SCENE_EVENT.INTERACTION,\n new SceneEventInfo({ forceRender })\n );\n }\n\n public hasSelection(): boolean {\n return this._selectionHandler.hasSelection();\n }\n\n public update(\n bounds: Vector3,\n rootComponentPosition: Vector3,\n backgroundScene: Scene\n ) {\n this._raycastHelper.update(bounds, rootComponentPosition, backgroundScene);\n }\n\n public isDragIn(): boolean {\n return this._dragIn;\n }\n\n public isDragging() {\n return this._draggedComponent != null;\n }\n\n public setRootComponentId(rootComponentId: number) {\n this._raycastHelper.setRootComponentId(rootComponentId);\n }\n\n public cancelSelection(\n reason: CancelSelectionReasons\n ): boolean /* isSomethingCancelled */ {\n this._selectionHandler.setSelectionMode(SELECTION_MODE.STANDARD);\n return this._selectionHandler.cancelSelection(reason);\n }\n\n public setSelectionMode(mode: SELECTION_MODE) {\n this._selectionHandler.setSelectionMode(mode);\n }\n\n public getSelectionMode(): SELECTION_MODE {\n return this._selectionHandler.getSelectionMode();\n }\n\n public getSelectedRuntimeComponentIds(): number[] {\n return this._selectionHandler.getSelectedRuntimeComponentIds();\n }\n\n public setCameraMoving(cameraMoving: boolean) {\n if (cameraMoving && this._hoveredComponent) {\n this._hoverOff(this._hoveredComponent, INPUT_EVENT_TYPE.UNKNOWN);\n }\n this._cameraMoving = cameraMoving;\n }\n\n public setCamera(camera: Camera) {\n this._raycastHelper.setCamera(camera);\n }\n\n public setObject(object: Object3D) {\n this._raycastHelper.setObject(object);\n }\n}\n","import EventDispatcher from './event-dispatcher';\nimport { getScreenXY } from '../../../common-core/src/utils/threejs-utils';\nimport type { CanvasOffset } from '../../../common-core/src/common-interfaces';\nimport type { PerspectiveCamera } from 'three';\nimport { Box3, Vector3 } from 'three';\n\nexport type UIIntersection = 'left' | 'top' | 'right' | 'bottom';\nexport type UIIntersections = UIIntersection[];\n\nexport const enum UI_INTERSECTION_EVENT {\n CHANGE,\n}\n\nexport default class UiIntersectionHelper extends EventDispatcher<UIIntersections> {\n private _uiIntersectionMask: number = 0;\n\n private _camera: PerspectiveCamera;\n private _boundingBox: Box3;\n private _clientWidth: number;\n private _clientHeight: number;\n private _boxVertices: Vector3[];\n private _offset: CanvasOffset;\n\n public floorEnvironment = false;\n\n constructor(camera: PerspectiveCamera) {\n super();\n this._camera = camera;\n }\n\n public updateToBounds(\n bounds: Vector3,\n clientWidth: number,\n clientHeight: number\n ) {\n let minVector: Vector3 = new Vector3(-bounds.x / 2, 0, -bounds.z / 2);\n let maxVector: Vector3 = new Vector3(bounds.x / 2, bounds.y, bounds.z / 2);\n\n this._boundingBox = new Box3(minVector, maxVector);\n this._clientWidth = clientWidth;\n this._clientHeight = clientHeight;\n\n //the intersection calculation could be improved by using all 8 vertices of the bounding box\n let size = this._boundingBox.getSize(new Vector3());\n this._boxVertices = [];\n this._boxVertices.push(this._boundingBox.min);\n this._boxVertices.push(\n this._boundingBox.min.clone().add(new Vector3(size.x, 0, 0))\n );\n this._boxVertices.push(this._boundingBox.max);\n this._boxVertices.push(\n this._boundingBox.max.clone().sub(new Vector3(size.x, 0, 0))\n );\n }\n\n set canvasOffset(offset: CanvasOffset) {\n this._offset = offset;\n this.calculateUIIntersection();\n }\n\n public calculateUIIntersection() {\n let result: UIIntersections = [];\n if (this._boundingBox == null || this._offset == null) {\n return;\n }\n\n let paddings = this._checkPaddings();\n\n paddings.bottom = this._clientHeight - paddings.bottom;\n paddings.right = this._clientWidth - paddings.right;\n\n let mask = 0;\n\n if (this.floorEnvironment) {\n result = ['left', 'right', 'bottom'];\n mask = 1 | 2 | 8;\n } else {\n if (\n this._offset.left > 0 &&\n paddings.left < this._offset.left * this._clientWidth\n ) {\n result.push('left');\n mask |= 8;\n }\n if (\n this._offset.right < 1 &&\n paddings.right < (1 - this._offset.right) * this._clientWidth\n ) {\n result.push('right');\n mask |= 2;\n }\n if (\n this._offset.bottom > 0 &&\n paddings.bottom < this._offset.bottom * this._clientHeight\n ) {\n result.push('bottom');\n mask |= 1;\n }\n }\n\n if (\n this._offset.top < 1 &&\n paddings.top < (1 - this._offset.top) * this._clientHeight\n ) {\n result.push('top');\n mask |= 4;\n }\n\n if (mask !== this._uiIntersectionMask) {\n this.dispatchEvent(UI_INTERSECTION_EVENT.CHANGE, result);\n this._uiIntersectionMask = mask;\n }\n }\n\n private _checkPaddings(): {\n left: number;\n top: number;\n right: number;\n bottom: number;\n } {\n let paddings = {\n left: this._clientWidth / 2,\n top: this._clientHeight / 2,\n right: this._clientWidth / 2,\n bottom: this._clientHeight / 2,\n };\n\n this._boxVertices.forEach((value) => {\n let pixelPosition = getScreenXY(\n value,\n this._camera,\n this._clientWidth,\n this._clientHeight\n );\n if (pixelPosition.x < paddings.left) {\n paddings.left = pixelPosition.x;\n }\n\n if (pixelPosition.x > paddings.right) {\n paddings.right = pixelPosition.x;\n }\n\n if (pixelPosition.y < paddings.top) {\n paddings.top = pixelPosition.y;\n }\n\n if (pixelPosition.y > paddings.bottom) {\n paddings.bottom = pixelPosition.y;\n }\n });\n\n return paddings;\n }\n}\n","import CameraBehaviour from './camera-behaviour';\nimport type CameraControl3D from './camera-control-3d';\nimport type { CameraParameter } from './camera-control';\nimport { type Box3 } from 'three';\n\nexport default class ConfiguratorCameraBehaviour extends CameraBehaviour {\n public get cameraControl(): CameraControl3D {\n return this._cameraControl as CameraControl3D;\n }\n\n public resetCameraOnSceneClear() {\n this.cameraControl.clear();\n }\n\n public async externalApiMoveCamera(\n cameraParameter: CameraParameter\n ): Promise<void> {\n await this.cameraControl.moveCamera(cameraParameter);\n this._onCameraChanged();\n }\n\n public externalApiZoomIn(value?: number) {\n this.cameraControl.zoomIn(value);\n this._onCameraChanged();\n }\n\n public externalApiZoomOut(value?: number) {\n this.cameraControl.zoomOut(value);\n this._onCameraChanged();\n }\n\n public externalApiResetCameraPosition(boundingBox: Box3) {\n this.cameraControl.updateAndReset(boundingBox, true);\n this._onCameraChanged();\n }\n\n public disablePanningOnShiftRelease() {\n this.cameraControl.disablePanning();\n }\n\n public enablePanningOnShiftClick() {\n this.cameraControl.enablePanning();\n }\n\n public resetCameraToStartOnConfigurationLoaded(boundingBox: Box3) {\n this.cameraControl.updateAndReset(boundingBox, false);\n }\n\n public updateBoundsOnPlanObjectUpdated(boundingBox: Box3) {\n this.cameraControl.updateToBounds(boundingBox, false, false);\n }\n\n public updateBoundsOnCancelDockings(boundingBox: Box3) {\n this.cameraControl.updateToBounds(boundingBox, false, false);\n }\n\n public async zoomToComponentOnConsecutiveClick(\n cameraParameters: CameraParameter\n ) {\n this.cameraControl.saveState(false);\n await this.cameraControl.zoomTo(cameraParameters);\n this._onCameraChanged();\n }\n\n public resetCameraToStateOnCancelSelection() {\n if (this.cameraControl.hasSavedState()) {\n this.cameraControl.resetToState();\n this._onCameraChanged();\n }\n }\n\n public zoomToFitBoundsAfterUserInitiatedPreviews(boundingBox: Box3) {\n this.cameraControl.zoomToFitBounds(boundingBox);\n this._onCameraChanged();\n }\n\n public async resetCameraOnStartConfiguring(\n boundingBox: Box3,\n cameraParameters: CameraParameter,\n rotation: number = 0,\n lookAtSide: number = 0\n ) {\n this.cameraControl.setCurrentCameraParameters(cameraParameters);\n this.cameraControl.setObjectRotation(rotation, lookAtSide);\n await this.cameraControl.updateAndReset(boundingBox, true);\n }\n}\n","import type {\n PreviewComponent,\n PreviewLineComponent,\n RoomleComponent,\n RoomleComponentFactory,\n} from '../../../common-core/src/webgl/roomle-component-factory';\nimport RoomleComponentFactoryInitializer, {\n PULSE_DURATION,\n PULSE_LOOPS,\n} from '../../../common-core/src/webgl/roomle-component-factory';\nimport { LAYER } from '../../../common-core/src/webgl/layer';\nimport Env from '../../../common-core/config/environment';\nimport type DimensioningHelper from '../utils/dimensioning-helper';\nimport CameraControl3D, {\n DISTANCE_FACTOR,\n} from '../../../common-core/src/cameracontrol/camera-control-3d';\nimport type ConfiguratorSceneEventHandler from './configurator-scene-event-handler';\nimport {\n default as SceneEventHandler,\n SCENE_EVENT,\n} from './configurator-scene-event-handler';\nimport type InputManager from '../../../common-core/src/input/input-manager';\nimport { INPUT_EVENT_TYPE } from '../../../common-core/src/input/input-manager';\nimport UiIntersectionHelper, {\n UI_INTERSECTION_EVENT,\n} from '../utils/ui-intersection-helper';\nimport {\n createEmptySceneFromCurrent,\n dispose,\n getScreenXY,\n getYRotationOfObject,\n kernelBoxToThreeBox,\n} from '../../../common-core/src/utils/threejs-utils';\nimport { SELECTION_MODE } from '../utils/selection-handler';\nimport inject from '../../../common-core/src/di/inject';\nimport { CANVAS_ID } from '../../../common-core/src/utils/dom-helper';\nimport type {\n Base64Image,\n CanvasOffset,\n} from '../../../common-core/src/common-interfaces';\nimport {\n getIdealDistance,\n toDegrees,\n toRadiant,\n} from '../../../common-core/src/utils/math-helper';\nimport type {\n KernelComponent,\n KernelPartList,\n PlanObject,\n UiPossibleChild,\n} from '../../../typings/kernel';\nimport FloorEnvironment from './environment/floor-environment';\nimport type { SceneSettings } from '../../../common-core/src/scene-settings-loader';\nimport type ConfiguratorInputManager from '../input/configurator-input-manager';\nimport type ConfiguratorMeshGenerator from './configurator-mesh-generator';\nimport type MemoryManager from '../../../common-core/src/services/memory-manager';\nimport type { RapiMaterial } from '../../../typings/rapi-types';\nimport type ConfiguratorUiCallbacks from '../services/configurator-ui-callback';\nimport type ConfiguratorContext from '../../../common-core/src/webgl/configurator-context';\nimport Benchmark from '../../../common-core/src/utils/benchmark';\nimport type ConfiguratorViewModel from '../../../common-core/src/view-model/configurator-view-model';\nimport { type ConfiguratorViewModelCallbackI } from '../../../common-core/src/view-model/configurator-view-model';\nimport type ComponentDimensioningHelper from '../utils/component-dimensioning-helper';\nimport type ComponentRaycastHelper from '../utils/component-raycast-helper';\nimport type { CameraParameter } from '../../../common-core/src/cameracontrol/camera-control';\nimport { CAMERA_EVENT } from '../../../common-core/src/cameracontrol/camera-control';\nimport type ConfiguratorHistory from '../utils/configurator-history';\nimport SceneManager from '../../../common-core/src/webgl/scene-manager';\nimport { type CAMERA_TYPE } from '../../../common-core/src/cameracontrol/camera-type';\nimport type PlannerKernelAccess from '../../../planner-core/src/services/planner-kernel-access';\nimport RoomleDependencyInjection from '../../../common-core/src/di/roomle-dependency-injection';\nimport {\n areCameraParametersEqual,\n callAgainAfter,\n ctrlOrCmd,\n debounce,\n getColor,\n nextTick,\n ROOMLE_HIGHLIGHTNG,\n} from '../../../common-core/src/utils/common-utils';\nimport type { Enumify } from '../../../common-core/src/types';\nimport { BASE_CONTEXT } from '../../../common-core/src/main';\nimport type { Mesh, MeshStandardMaterial, Object3D } from 'three';\nimport { Box3, Euler, Vector2, Vector3 } from 'three';\nimport BackgroundEnvironment from '../../../common-core/src/environment/background-environment';\nimport DynamicLightSettingLoader, {\n PREDEFINED_LIGHTSETTING,\n} from '../../../common-core/src/lightsetting/dynamic-light-setting-loader';\nimport DefaultLightSetting from './lightsetting/default-light-setting';\nimport type {\n CameraTarget,\n PrepareImageOptions,\n RenderOptions,\n} from '../../../common-core/src/webgl/image-renderer';\nimport ImageRenderer from '../../../common-core/src/webgl/image-renderer';\nimport ConfiguratorCameraBehaviour from '../../../common-core/src/cameracontrol/configurator-camera-behaviour';\nimport { getHostname } from '../../../common-core/src/utils/rapi-utils';\nimport type CameraBehaviour from '../../../common-core/src/cameracontrol/camera-behaviour';\nimport type CameraBehaviour3d from '../../../common-core/src/cameracontrol/camera-behaviour-3d';\nimport type GlobalInitData from '../../../common-core/src/utils/global-init-data';\nimport type { CancelSelectionReasons } from '../../../typings/planner';\nimport AsyncHelper, { ASYNC_OPERATIONS } from '../utils/async-helper';\nimport { ANIMATION_PARAMETER_PREFIX } from '../utils/animation/animation-value-map';\nimport type { ExternalConfiguration } from '../../../typings/external-objects';\nimport type UnitFormatter from '../services/unit-formatter';\nimport type { DimensionLabel } from '../../../planner-core/src/utils/measurements';\nimport { labelsCollide } from '../../../planner-core/src/utils/measurements';\n\nexport default class ConfiguratorSceneManager\n extends SceneManager\n implements ConfiguratorViewModelCallbackI\n{\n public declare _creator_: string;\n\n @inject\n private _configuratorInputManager: ConfiguratorInputManager;\n\n @inject\n private _configuratorMeshGenerator: ConfiguratorMeshGenerator;\n\n @inject\n private _memoryManager: MemoryManager;\n\n @inject\n protected _unitFormatter: UnitFormatter;\n\n @inject\n protected _configuratorContext: ConfiguratorContext;\n\n @inject\n private _componentDimensioningHelper: ComponentDimensioningHelper;\n\n @inject\n private _configuratorHistory: ConfiguratorHistory;\n\n @inject\n protected _configuratorUiCallbacks: ConfiguratorUiCallbacks;\n\n @inject\n protected _plannerKernelAccess: PlannerKernelAccess;\n\n @inject\n protected declare _globalInitData: GlobalInitData;\n\n protected _viewModel: ConfiguratorViewModel;\n\n private _componentFactory: RoomleComponentFactory;\n\n protected _componentRaycastHelper: ComponentRaycastHelper;\n\n private _dimensionHelper: DimensioningHelper;\n private _uiIntersectionHelper: UiIntersectionHelper;\n\n private _sceneEventHandler: ConfiguratorSceneEventHandler;\n private _currentComponent: RoomleComponent;\n private _isComponentDimensionsVisible: boolean;\n private _dimensionUpdateDebounced: (() => void) | null = null;\n\n constructor(\n creator: string,\n offset: CanvasOffset,\n mode: Enumify<typeof CAMERA_TYPE>\n ) {\n super(creator, offset, CANVAS_ID.HSC, mode);\n this._configuratorContext.baseContext = BASE_CONTEXT.CONFIGURATOR;\n this._getViewModel().setListener(this);\n\n this._sceneEventHandler = new SceneEventHandler(\n this._creator_,\n this._scene,\n this.cameraBehaviour3d.cameraControl.getCamera(),\n this._getInputManager()\n );\n this._sceneEventHandler.addEventListener(\n SCENE_EVENT.INTERACTION,\n ({ forceRender }) => {\n this._uiIntersectionHelper.calculateUIIntersection();\n if (forceRender) {\n this._renderEverything();\n }\n },\n this\n );\n this._sceneEventHandler.addEventListener(\n SCENE_EVENT.HOVER_ON,\n async ({ component, type }) => await this._onHoverOn(component, type),\n this\n );\n this._sceneEventHandler.addEventListener(\n SCENE_EVENT.HOVER_OFF,\n ({ component, type }) => this._onHoverOff(component, type),\n this\n );\n this._sceneEventHandler.addEventListener(\n SCENE_EVENT.CLICK_OUTSIDE,\n () => {\n this._configuratorUiCallbacks.onClickOutside();\n this.cameraBehaviour.cameraControl.unlock();\n this._cancelDockings(\n false,\n null,\n this._getViewModel().hasPreviews(),\n true,\n false\n );\n this.cancelComponentSelection(true, 'click_outside');\n if (this._componentRaycastHelper) {\n this._componentRaycastHelper.checkComponentVisibility(\n this._sceneEventHandler,\n this._getViewModel()\n );\n }\n this._requestRender();\n },\n this\n );\n this._sceneEventHandler.addEventListener(\n SCENE_EVENT.SELECT_COMPONENT,\n ({ component, consecutive }) => {\n if (this._getViewModel().hasPreviews()) {\n this._cancelDockings(\n false,\n null,\n this._getViewModel().hasPreviews(),\n true,\n false\n );\n }\n this._selectComponent(component, consecutive);\n this._requestRender();\n },\n this\n );\n this._sceneEventHandler.addEventListener(\n SCENE_EVENT.DESELECT_COMPONENT,\n ({ component, resetCamera, reason }) => {\n this._deselectComponent(component, resetCamera, reason);\n this._requestRender();\n },\n this\n );\n this._sceneEventHandler.addEventListener(\n SCENE_EVENT.DRAG_START,\n ({ component }) => {\n //fixes #142 start\n if (\n this._sceneEventHandler.getSelectionMode() ===\n SELECTION_MODE.MULTISELECT\n ) {\n this.cancelComponentSelection(false, 'dragIn');\n }\n // fixes #142 end\n this._requestDockingsPreviewWithDrag(component.runtimeId);\n this.cameraBehaviour.cameraControl.lock();\n this._roomleRenderer?.enableUiInteractionMode();\n this._requestRender();\n },\n this\n );\n this._sceneEventHandler.addEventListener(\n SCENE_EVENT.DRAG_MOVE,\n () => {\n this._renderEverything();\n },\n this\n );\n this._sceneEventHandler.addEventListener(\n SCENE_EVENT.DRAG_END,\n ({ component, preview }) => {\n if (preview) {\n const hoveredOver: RoomleComponent = preview as RoomleComponent;\n if (this._getViewModel().isPreviewLine(hoveredOver)) {\n this._getViewModel().dockComponentWithPosition(\n hoveredOver as PreviewLineComponent,\n component\n );\n } else if (this._getViewModel().isPreview(hoveredOver)) {\n this._dockComponent(hoveredOver as PreviewComponent);\n } else {\n this._getKernelAccess().cancelDocking(component.runtimeId);\n }\n this._cancelDockings(!preview, component, true, true);\n } else {\n this._getKernelAccess().cancelDocking(component.runtimeId);\n const componentToDelete = this._sceneEventHandler.isDragIn()\n ? component\n : null;\n this._cancelDockings(\n this._sceneEventHandler.isDragIn(),\n componentToDelete,\n false,\n true\n );\n\n const boundingBox = this._getViewModel().getBoundingBox();\n if (this._environment && this._environment.needsBounds()) {\n this._environment.updateBounds(boundingBox.getSize(new Vector3()));\n }\n }\n this.cameraBehaviour.cameraControl.unlock();\n this._roomleRenderer?.disableUiInteractionMode();\n this._renderEverything();\n },\n this\n );\n this._sceneEventHandler.addEventListener(\n SCENE_EVENT.CLICK_PREVIEW,\n ({ preview }) => {\n if (this._getViewModel().isPreview(preview)) {\n if (this._getViewModel().isPreviewLine(preview)) {\n this._getViewModel().dockComponentWithPosition(\n preview as PreviewLineComponent\n );\n } else {\n this._dockComponent(preview);\n }\n this._cancelDockings(\n false,\n null,\n !this._getViewModel().hasPreviews(),\n false,\n false\n );\n this.requestDockingsPreview(false);\n this._requestRender();\n }\n },\n this\n );\n\n if (!Env.isProduction) {\n window.__RML__DEBUG__.SceneManager = this as SceneManager;\n }\n\n this.enableConfiguratorEvents();\n this._initOptionalModules();\n\n this._offsetAnimationStart = callAgainAfter(\n this._offsetAnimationStart.bind(this),\n 250\n );\n this._offsetAnimationEnd = debounce(\n this._offsetAnimationEnd.bind(this),\n 32\n );\n }\n\n private async _initOptionalModules() {\n const { transparentHighlighting } = this._initData;\n if (transparentHighlighting) {\n const { default: ComponentRaycastHelperClass } = await import(\n './../utils/component-raycast-helper'\n );\n this._componentRaycastHelper = new ComponentRaycastHelperClass();\n this._componentRaycastHelper.init(\n this._scene,\n this.cameraBehaviour3d.cameraControl.getCamera()\n );\n }\n }\n\n protected _changeCameraBehaviour(cameraBehaviour: CameraBehaviour) {\n super._changeCameraBehaviour(cameraBehaviour);\n\n this._componentRaycastHelper?.setCamera(\n this.cameraBehaviour3d.cameraControl.getCamera()\n );\n }\n\n public disableEvents() {\n this.disableConfiguratorEvents();\n }\n\n public enableEvents() {\n if (this._configuratorContext.baseContext === BASE_CONTEXT.CONFIGURATOR) {\n this.enableConfiguratorEvents();\n }\n }\n\n public enableConfiguratorEvents() {\n this._sceneEventHandler.enable();\n }\n\n public disableConfiguratorEvents() {\n this._sceneEventHandler.disable();\n }\n\n public saveExternalConfiguration(\n externalConfiguration: ExternalConfiguration\n ) {\n this._viewModel.saveExternalConfiguration(externalConfiguration);\n }\n\n public getExternalConfigurationById(id: string) {\n return this._viewModel.getExternalConfigurationById(id);\n }\n\n protected _getViewModel(): ConfiguratorViewModel {\n if (!this._viewModel) {\n this._viewModel = RoomleDependencyInjection.lookup<ConfiguratorViewModel>(\n 'configurator-view-model',\n this._creator_\n );\n this._viewModel.setRequestRenderCallback(() => this._renderEverything());\n this._viewModel.setRequestRenderSceneUpdateCallback(() =>\n this._roomleRenderer?.clearCache()\n );\n this._viewModel.setInvalidateRenderCallback(() =>\n this._roomleRenderer?.forceShadowUpdates(true)\n );\n }\n return this._viewModel;\n }\n\n protected _getKernelAccess(): PlannerKernelAccess {\n return this._plannerKernelAccess;\n }\n\n private _showDockings() {\n this._roomleRenderer?.enableUiInteractionMode();\n if (this._initData?.featureFlags?.pulsePreview) {\n this._renderEverything();\n const interval = setInterval(() => this._renderEverything(), 16);\n setTimeout(\n () => clearInterval(interval),\n (PULSE_LOOPS + 1) * PULSE_DURATION\n );\n }\n }\n\n public cancelDockings() {\n this._cancelDockings(true, null, true, true, false);\n this._renderEverything();\n }\n\n private _cancelDockings(\n shouldHandleComponentDeletion: boolean,\n componentToDelete: RoomleComponent,\n arePreviewsExisting: boolean,\n notifyUi: boolean,\n updateCamera: boolean = true\n ) {\n this._roomleRenderer?.disableUiInteractionMode();\n if (shouldHandleComponentDeletion) {\n this._sceneEventHandler.setDragIn(false);\n this._getViewModel().removeDockingComponent();\n if (componentToDelete) {\n this._scene.remove(componentToDelete);\n }\n }\n this._getViewModel().removePreviews();\n if (arePreviewsExisting && updateCamera) {\n // wait for next run so that core has updated bounds correctly\n nextTick().then(() => {\n this.configuratorCameraBehaviour?.updateBoundsOnCancelDockings(\n this.getBounds()\n );\n });\n }\n if (notifyUi && arePreviewsExisting) {\n this._configuratorUiCallbacks.onDockingsPreviewRemoved();\n }\n if (this._componentRaycastHelper) {\n this._componentRaycastHelper.changeMaterialsOnSelect(\n this._scene,\n null,\n false,\n () => {\n // this fixes an issue where AO and shadows are not properly updated if components were transparent\n this._roomleRenderer?.forceShadowUpdates(true);\n if (this._initData.transparentHighlighting) {\n this._roomleRenderer?.clearCache();\n }\n this._renderEverything();\n }\n );\n }\n if (arePreviewsExisting) {\n this._roomleRenderer?.forceShadowUpdates(true);\n }\n }\n\n public updateAddons() {\n if (this._configuratorContext.selectionMode === SELECTION_MODE.STANDARD) {\n if (this._configuratorContext.selectedRuntimeComponentId) {\n this._getKernelAccess().selectedComponent(\n this._configuratorContext.selectedRuntimeComponentId\n );\n } else if (this._configuratorContext.planObjectId) {\n this._getKernelAccess().updatePlanObjectDependencies(\n this._configuratorContext.planObjectId\n );\n }\n }\n }\n\n private async _onHoverOn(component: RoomleComponent, type: INPUT_EVENT_TYPE) {\n if (type !== INPUT_EVENT_TYPE.TOUCH) {\n this._highlightComponent(component);\n }\n if (!this._isComponentDimensionsVisible) {\n const shown = await this._showCustomComponentDimensions(component);\n if (shown) {\n this._updateComponentDimensionLabels();\n }\n }\n }\n\n private _onHoverOff(component: RoomleComponent, type: INPUT_EVENT_TYPE) {\n if (type !== INPUT_EVENT_TYPE.TOUCH) {\n this._highlightComponent();\n }\n if (\n this._componentDimensioningHelper &&\n !this._isComponentDimensionsVisible &&\n this._componentDimensioningHelper.hasComponentDimensions()\n ) {\n this._removeCustomComponentDimensions(component);\n this._configuratorUiCallbacks.onDimensionLabelsUpdated(null);\n }\n this._requestRender();\n }\n\n private _highlightComponent(\n component: RoomleComponent = null,\n ids: number[] = []\n ) {\n if (!this._shouldHighlightComponent()) {\n return;\n }\n const selectedMeshes: Mesh[] = [];\n const useMesh = this._initData.meshSelection;\n if (component) {\n if (useMesh) {\n selectedMeshes.push(...component.meshes);\n } else if (component.boundingBoxMesh) {\n selectedMeshes.push(component.boundingBoxMesh);\n }\n } else if (!ids || !ids.length) {\n ids = this._sceneEventHandler.getSelectedRuntimeComponentIds();\n }\n this._getViewModel()\n .getComponentsForIds(ids)\n .forEach((selectedComponent) => {\n if (selectedComponent) {\n if (useMesh) {\n selectedMeshes.push(...selectedComponent.meshes);\n } else if (selectedComponent.boundingBoxMesh) {\n selectedMeshes.push(selectedComponent.boundingBoxMesh);\n }\n }\n });\n this._roomleRenderer?.highlightObjects(selectedMeshes);\n }\n\n protected shouldClearShadowsAndAO(): boolean {\n return (\n super.shouldClearShadowsAndAO() || !this._sceneEventHandler?.isDragging()\n );\n }\n\n public resume() {\n super.resume();\n this._getViewModel().materialQueue.registerCallback(() =>\n this._materialLoaded()\n );\n this._configuratorMeshGenerator.setMaterialLoadedListener(() => {\n this._renderWithoutShadowsAndAO();\n });\n }\n\n private _materialLoaded() {\n this._renderEverything();\n }\n\n public async waitForMaterialQueue() {\n await this._getViewModel().materialQueue.finished();\n }\n\n public pause() {\n super.pause();\n this._getViewModel().materialQueue.unregisterCallback();\n this._configuratorMeshGenerator.removeMaterialLoadedListener();\n }\n\n protected _setupScene(\n offset?: CanvasOffset,\n transparent?: boolean,\n skipLightSetup?: boolean\n ) {\n super._setupScene(offset, transparent);\n\n this._uiIntersectionHelper = new UiIntersectionHelper(\n this.cameraBehaviour3d.cameraControl.getCamera()\n );\n this._uiIntersectionHelper.canvasOffset = offset;\n this._uiIntersectionHelper.addEventListener(\n UI_INTERSECTION_EVENT.CHANGE,\n (result) => {\n this._configuratorUiCallbacks.onUiIntersectionChange(result);\n },\n this\n );\n\n this._configuratorMeshGenerator.maxAnisotropy = this._maxAnisotropy;\n this._configuratorMeshGenerator.maxTextures =\n this._renderer.capabilities.maxTextures;\n this._configuratorMeshGenerator.setMaterialLoadedListener(() => {\n this._renderWithoutShadowsAndAO();\n });\n this._domHelper.element?.appendChild(this._renderer.domElement);\n\n if (\n !skipLightSetup &&\n this._initData.legacyLight &&\n !this._initData.ls &&\n !this._initData.dls\n ) {\n if (this._renderer.capabilities.maxTextures > 8) {\n this.loadDynamicLightSetting(\n DynamicLightSettingLoader.createDynamicLightSettingSource(\n null,\n PREDEFINED_LIGHTSETTING.CAMERA\n )\n );\n } else {\n this._lightSetting = new DefaultLightSetting(\n this._scene,\n this._lightSetting\n );\n }\n }\n\n this._requestRender();\n\n if (!transparent) {\n this._setEnvironment(\n new BackgroundEnvironment(\n this._scene,\n this._environment,\n getColor(this._initData.colors.DEFAULT_BACKGROUND)\n )\n );\n }\n\n // this._setEnvironment(\n // new GroundProjectedEnvironment(\n // this._scene,\n // this._environment,\n // this._hdrEnvironmentLoader.getEnvironmentMap()\n // )\n // );\n\n this._getViewModel().materialQueue.registerCallback(() =>\n this._materialLoaded()\n );\n }\n\n public sceneCleared(shouldHardReset: boolean): void {\n this._internalClearScene(shouldHardReset);\n }\n\n public display(component: RoomleComponent) {\n this._scene.add(component);\n this.setRootComponentId(component.runtimeId);\n this._requestRender();\n }\n\n protected setRootComponentId(rootComponentId: number) {\n this._sceneEventHandler.setRootComponentId(rootComponentId);\n }\n\n public debugSceneGraph(id?: number) {\n this._getViewModel().debugSceneGraph(id);\n this._printObjectGraph(this._scene, '');\n }\n\n public debugScene() {\n return this._scene;\n }\n\n private _printObjectGraph(object: Object3D, prefix: string) {\n const opacity = (object as Mesh).material\n ? ((object as Mesh).material as MeshStandardMaterial).opacity\n : undefined;\n console.log(\n prefix +\n object.type +\n ' id:' +\n object.id +\n ' roomleId: ' +\n (object as RoomleComponent).runtimeId,\n opacity,\n object\n );\n if (object.children.length > 0) {\n object.children.forEach((child) => {\n const newPrefix = prefix + ' ';\n this._printObjectGraph(child, newPrefix);\n });\n }\n }\n\n public clearScene() {\n this.configuratorCameraBehaviour?.resetCameraOnSceneClear();\n this._internalClearScene(false);\n this._sceneEventHandler?.cancelSelection('reset_scene');\n this._pluginSystem.clearScene(this._scene, this._uiScene);\n }\n\n public planObjectConstructionDone(_planObject: PlanObject) {\n this._componentDimensioningHelper.reset();\n this._componentDimensioningHelper.setCamera(\n this.cameraBehaviour3d.cameraControl.getCamera()\n );\n }\n\n private _internalClearScene(shouldHardReset: boolean) {\n this._scene.children.forEach((child) => {\n if (\n child.type === 'Object3D' ||\n child.type === 'Mesh' ||\n child.type === 'Line'\n ) {\n this._scene.remove(child);\n }\n });\n this._uiScene.children.forEach((child) => {\n this._uiScene.remove(child);\n });\n this._getViewModel().sceneCleared();\n this._componentDimensioningHelper?.invalidateDimensioningsCache();\n if (shouldHardReset || this._memoryManager.shouldHardReset()) {\n this._configuratorMeshGenerator.clear();\n\n this._renderer.renderLists.dispose();\n // this executed call should only be done here and NOT within kernel access.\n // WHY? because we clear memory managers counts, then we won't hard reset our scene.\n // THIS IS IMPORTANT\n this._memoryManager.executedHardReset();\n }\n this._renderEverything();\n }\n\n protected async _waitForAssets(): Promise<void> {\n await super._waitForAssets();\n await this._externalMeshesAndMaterialsReady();\n }\n\n public async preparePerspectiveImage(\n options: PrepareImageOptions = {},\n _isolationMode?: boolean\n ): Promise<Base64Image> {\n await this._externalMeshesAndMaterialsReady();\n\n const { showDimensions = false } = options;\n this._cancelDockings(true, null, true, true);\n const camera = this.cameraBehaviour3d.cameraControl.getCamera().clone();\n camera.resetOffset();\n let cameraTarget = this._calculateBoundingBoxOfAllMeshes(0, showDimensions);\n this._lightSetting?.removeFromScene();\n const dimensionsEnabled = this._dimensionHelper\n ? this._dimensionHelper.areDimensionsEnabled()\n : false;\n if (dimensionsEnabled) {\n this._dimensionHelper.disableDimensions();\n }\n const objectRotation =\n this.cameraBehaviour3d.cameraControl.getObjectRotation();\n if (showDimensions) {\n await this._initDimensions();\n await this._dimensionHelper.isInitialized();\n const angleY = -30 + toDegrees(objectRotation);\n ImageRenderer.placeCameraForPerspectiveImage(\n camera,\n cameraTarget,\n -20,\n angleY\n );\n this._dimensionHelper.enableDimensions();\n this._dimensionHelper.moveCameraEnd(camera.position);\n // update camera target again when dimensions are initialized\n cameraTarget = this._calculateBoundingBoxOfAllMeshes(0, showDimensions);\n }\n if (\n this._componentDimensioningHelper &&\n this._componentDimensioningHelper.hasComponentDimensions()\n ) {\n await this._componentDimensioningHelper.reset();\n }\n\n const image = await this._imageRenderer.preparePerspectiveImage(\n this._scene,\n this._uiScene,\n camera,\n cameraTarget,\n options,\n objectRotation\n );\n\n if (dimensionsEnabled) {\n this._dimensionHelper.enableDimensions();\n this._dimensionHelper.moveCameraEnd(\n this.cameraBehaviour3d.cameraControl.getCamera().position\n );\n } else if (showDimensions) {\n this._dimensionHelper.disableDimensions();\n }\n this._lightSetting?.addToScene();\n this._renderEverything();\n\n return image;\n }\n\n public async renderImage(renderOptions: RenderOptions): Promise<Base64Image> {\n await this._externalMeshesAndMaterialsReady();\n\n if (this._getViewModel().getPreviews()) {\n this._cancelDockings(true, null, true, true);\n }\n let camera = this.cameraBehaviour3d.cameraControl.getCamera();\n let cameraTarget = null;\n if (!renderOptions.useCurrentPerspective) {\n camera = this.cameraBehaviour3d.cameraControl.getCamera().clone();\n camera.resetOffset();\n cameraTarget = this._calculateBoundingBoxOfAllMeshes();\n }\n const dimensionsEnabled = this._dimensionHelper\n ? this._dimensionHelper.areDimensionsEnabled()\n : false;\n if (dimensionsEnabled) {\n this._dimensionHelper.disableDimensions();\n }\n if (\n this._componentDimensioningHelper &&\n this._componentDimensioningHelper.hasComponentDimensions()\n ) {\n await this._componentDimensioningHelper.reset();\n }\n\n const image = await this._imageRenderer.renderPerspectiveImage(\n this._scene,\n camera,\n cameraTarget\n );\n\n if (dimensionsEnabled) {\n this._dimensionHelper.enableDimensions();\n this._dimensionHelper.moveCameraEnd(\n this.cameraBehaviour3d.cameraControl.getCamera().position\n );\n }\n\n this._renderEverything();\n\n return image;\n }\n\n public async preparePartImage(\n partId: number,\n options: PrepareImageOptions\n ): Promise<any> {\n return new Promise<Base64Image>((resolve, reject) => {\n this._getViewModel()\n .requestSubPartConstruction(partId)\n .then(async (mesh) => {\n if (!options.size) {\n options.size = 256;\n }\n const camera = this.cameraBehaviour3d.cameraControl\n .getCamera()\n .clone();\n camera.resetOffset();\n const cameraTarget = ImageRenderer.getCameraTargetForBBox(\n new Box3().setFromObject(mesh)\n );\n\n const scene = createEmptySceneFromCurrent(this._scene);\n scene.add(mesh);\n const image = await this._imageRenderer.preparePerspectiveImage(\n scene,\n null,\n camera,\n cameraTarget,\n options\n );\n\n dispose(scene);\n resolve(image);\n }, reject);\n });\n }\n\n protected _calculateBoundingBoxOfAllMeshes(\n spacing: number = 0,\n showDimensions?: boolean\n ): CameraTarget {\n let bbox = null;\n if (showDimensions && this._dimensionHelper) {\n bbox = this._dimensionHelper.getBoundingBox();\n } else {\n bbox = this._getViewModel().getBoundingBox();\n }\n return ImageRenderer.getCameraTargetForBBox(bbox, spacing);\n }\n\n private async _externalMeshesAndMaterialsReady(): Promise<void> {\n // wait for external meshes and then wait for materials\n // materials are loaded AFTER external meshes are loaded\n await this._getKernelAccess().externalMeshQueue.finished(true);\n await this._getViewModel().materialQueue.finished(true);\n }\n\n public async prepareTopImage(\n options: PrepareImageOptions = {},\n _isolationMode?: boolean\n ): Promise<Base64Image> {\n await this._externalMeshesAndMaterialsReady();\n const { showDimensions = false } = options;\n this._cancelDockings(true, null, true, true);\n if (showDimensions) {\n await this._initDimensions(true);\n await this._dimensionHelper.isInitialized();\n this._dimensionHelper.enableTopDimensions();\n }\n if (\n this._componentDimensioningHelper &&\n this._componentDimensioningHelper.hasComponentDimensions()\n ) {\n await this._componentDimensioningHelper.reset();\n }\n const cameraTarget = this._calculateBoundingBoxOfAllMeshes(\n 0.1,\n showDimensions\n );\n this._lightSetting?.removeFromScene();\n\n const image = await this._imageRenderer.prepareTopImage(\n this._scene,\n this._uiScene,\n cameraTarget,\n options\n );\n\n if (showDimensions) {\n this._dimensionHelper.disableTopDimensions();\n }\n\n this._lightSetting?.addToScene();\n\n this._renderEverything();\n return image;\n }\n\n public enableDragIn(dragEvent: DragEvent) {\n this._sceneEventHandler.setDragIn(true, dragEvent);\n this._requestRender();\n }\n\n private async _zoomToComponentOnConsecutiveClick(component: RoomleComponent) {\n const bounds = component.boundingBox.getSize(new Vector3());\n const wantedAngle = getYRotationOfObject(component);\n const rotation = new Euler(0, wantedAngle, 0);\n const target = component\n .getWorldPosition(new Vector3())\n .clone()\n .add(component.boundingBox.getCenter(new Vector3()).applyEuler(rotation));\n\n const size = new Vector2();\n this._renderer.getSize(size);\n const targetCameraParams = {\n yaw: rotation.y,\n pitch: toRadiant(15),\n distance:\n getIdealDistance(\n bounds.x,\n bounds.y,\n bounds.z,\n this.cameraBehaviour3d.cameraControl.getCamera().fov,\n size.width,\n size.height\n ) * DISTANCE_FACTOR,\n targetX: target.x,\n targetY: target.y,\n targetZ: target.z,\n blockOtherTweens: true,\n };\n // Don't zoom to component if we are already zoomed in.\n if (\n !areCameraParametersEqual(\n this.cameraBehaviour.cameraControl.getCurrentCameraParameters(),\n targetCameraParams\n )\n ) {\n this._configuratorUiCallbacks.onZoomToComponent();\n await this.configuratorCameraBehaviour?.zoomToComponentOnConsecutiveClick(\n targetCameraParams\n );\n }\n }\n\n public resetCameraPositionToStart() {\n this._requestRender();\n const boundingBox = this._getViewModel().getBoundingBox();\n this.configuratorCameraBehaviour.externalApiResetCameraPosition(\n boundingBox\n );\n }\n\n public resetPreviews() {\n this._getViewModel().removePreviews();\n this._requestRender();\n }\n\n public changeOffset(offset: CanvasOffset) {\n this.cameraBehaviour3d.cameraControl.getCamera().offset = offset;\n if (this._uiIntersectionHelper) {\n this._uiIntersectionHelper.canvasOffset = offset;\n }\n }\n\n public setCameraOffset(offset: CanvasOffset) {\n this._offsetAnimationStart();\n if (this.cameraBehaviour3d.cameraControl.getCamera().offset) {\n this.cameraBehaviour3d.cameraControl.getCamera().offset = offset;\n this._renderEverything();\n }\n this._offsetAnimationEnd();\n }\n\n /**\n * This function is modified with callAgainAfter, see constructor\n * @private\n */\n private _offsetAnimationStart() {\n this._onCameraMove();\n }\n\n /**\n * This function is modified with debounce, see constructor\n * @private\n */\n private _offsetAnimationEnd() {\n this._onCameraIdle();\n }\n\n public getCameraOffset(): CanvasOffset {\n if (!this.cameraBehaviour3d?.cameraControl?.getCamera()?.offset) {\n return { left: 0, top: 1, right: 1, bottom: 0 };\n }\n return JSON.parse(\n JSON.stringify(this.cameraBehaviour3d.cameraControl.getCamera().offset)\n );\n }\n\n protected _checkUndoRedo(event: KeyboardEvent) {\n // Redo (Ctrl+shift+z or Cmd+shift+z)\n if (ctrlOrCmd(event) && event.shiftKey && event.key === 'z') {\n this.redo();\n return;\n }\n\n // Undo (Ctrl+z or Cmd+z)\n if (ctrlOrCmd(event) && event.key === 'z') {\n this.undo();\n }\n }\n\n protected _onKeyDown(event: KeyboardEvent) {\n super._onKeyDown(event);\n\n // Undo (Ctrl+z or Cmd+z) and Paste (Ctrl+shift+z or Cmd+shift+z) events\n this._checkUndoRedo(event);\n\n if (event.key && (event.key === 'Escape' || event.key === 'Esc')) {\n if (!this._getViewModel().hasPreviews()) {\n this.cancelComponentSelection(false, 'click_outside');\n }\n event.preventDefault();\n }\n\n if (\n event.key &&\n event.key.includes('Shift') &&\n this.cameraBehaviour3d.cameraControl instanceof CameraControl3D\n ) {\n this.enablePanning();\n event.preventDefault();\n }\n\n if (\n this._sceneEventHandler &&\n this._sceneEventHandler.hasSelection() &&\n event.key &&\n (event.key === 'Backspace' || event.key === 'Delete')\n ) {\n this.requestDeleteSelectedComponent();\n event.preventDefault();\n }\n }\n\n protected _onKeyUp(event: KeyboardEvent, cleanup: boolean = false) {\n super._onKeyUp(event, cleanup);\n if (event.key && event.key.includes('Shift')) {\n if (!cleanup) {\n this.disablePanning();\n }\n event.preventDefault();\n }\n }\n\n protected enablePanning() {\n this.configuratorCameraBehaviour.enablePanningOnShiftClick();\n }\n\n protected disablePanning() {\n this.configuratorCameraBehaviour.disablePanningOnShiftRelease();\n }\n\n public cancelPreviousDockings() {\n this._cancelDockings(true, null, false, false);\n this._roomleRenderer?.forceShadowUpdates(true);\n this._renderEverything();\n }\n\n public cancelComponentSelection(\n resetCamera?: boolean,\n reason?: CancelSelectionReasons\n ) {\n if (\n !this._sceneEventHandler.hasSelection() &&\n this._sceneEventHandler.getSelectionMode() === SELECTION_MODE.STANDARD\n ) {\n return;\n }\n this._cancelSelection(resetCamera, reason);\n }\n\n protected notifyPlannerOnComponentSelectionCancel(\n _isExternalObject: boolean,\n _reason: CancelSelectionReasons\n ) {\n // needed in PlannerSceneManager\n }\n\n private _cancelSelection(\n resetCamera: boolean,\n reason: CancelSelectionReasons\n ) {\n this._sceneEventHandler.cancelSelection(reason);\n //set configurator context in webgl since scene event handler and webgl are not linked\n this._configuratorContext.selectionMode = SELECTION_MODE.STANDARD;\n this._configuratorContext.selectedRuntimeComponentIds = [];\n\n this._getViewModel().removePreviews();\n if (\n resetCamera &&\n !this._initData.debug &&\n this.configuratorCameraBehaviour\n ) {\n this.configuratorCameraBehaviour.resetCameraToStateOnCancelSelection();\n }\n const isExternalObject =\n this._getKernelAccess().kernelInstance.getPlanObject(\n this._configuratorContext.planObjectId\n )?.externalObject;\n this._getKernelAccess().updatePlanObjectDependencies(\n this._configuratorContext.planObjectId\n );\n this._configuratorUiCallbacks.onSelectionCancel(reason);\n this.notifyPlannerOnComponentSelectionCancel(isExternalObject, reason);\n }\n\n private _selectComponent(component: RoomleComponent, consecutive?: boolean) {\n this._configuratorContext.selectedRuntimeComponentIds =\n this._sceneEventHandler.getSelectedRuntimeComponentIds();\n if (!consecutive) {\n if (\n this._sceneEventHandler.getSelectionMode() === SELECTION_MODE.STANDARD\n ) {\n this._onSelectedRuntimeComponentChange(component);\n } else {\n this._onSelectedRuntimeComponentsChange(\n this._sceneEventHandler.getSelectedRuntimeComponentIds()\n );\n }\n }\n\n this._highlightComponent(component);\n if (!this._initData.debug && consecutive) {\n this._zoomToComponentOnConsecutiveClick(component);\n }\n }\n\n private _deselectComponent(\n _component: RoomleComponent,\n resetCamera?: boolean,\n reason?: CancelSelectionReasons\n ) {\n if (\n this._sceneEventHandler.getSelectionMode() === SELECTION_MODE.STANDARD\n ) {\n this._cancelSelection(resetCamera, reason);\n this._highlightComponent();\n }\n if (\n this._sceneEventHandler.getSelectionMode() === SELECTION_MODE.MULTISELECT\n ) {\n if (this._sceneEventHandler.hasSelection()) {\n this._configuratorContext.selectedRuntimeComponentIds =\n this._sceneEventHandler.getSelectedRuntimeComponentIds();\n } else {\n this._cancelSelection(resetCamera, reason);\n this._highlightComponent();\n }\n }\n if (this._componentRaycastHelper) {\n this._componentRaycastHelper.changeMaterialsOnSelect(this._scene, null);\n }\n }\n\n public getScreenXY(position: Vector3) {\n return getScreenXY(\n position,\n this.cameraBehaviour.cameraControl.getCamera(),\n this._domHelper.element.clientWidth,\n this._domHelper.element.clientHeight\n );\n }\n\n public setSelectionMode(mode: SELECTION_MODE) {\n this._sceneEventHandler.setSelectionMode(mode);\n }\n\n public changeFloorMaterial(material: RapiMaterial): Promise<void> {\n if (\n !this._environment ||\n !(this._environment instanceof FloorEnvironment)\n ) {\n this._environment = new FloorEnvironment(\n this._scene,\n this._environment,\n true\n );\n this._uiIntersectionHelper.floorEnvironment = true;\n }\n return new Promise((resolve, reject) => {\n (this._environment as FloorEnvironment)\n .changeFloorMaterial(material, this._maxAnisotropy)\n .then(() => {\n this._requestRender();\n resolve();\n }, reject);\n });\n }\n\n public zoomIn(value?: number) {\n this.configuratorCameraBehaviour.externalApiZoomIn(value);\n this._renderEverything();\n }\n\n public zoomOut(value?: number) {\n this.configuratorCameraBehaviour.externalApiZoomOut(value);\n this._renderEverything();\n }\n\n public async showDimensions() {\n const shown = await this._showCustomComponentDimensions(\n this._currentComponent\n );\n if (shown) {\n this._isComponentDimensionsVisible = true;\n this._updateComponentDimensionLabels();\n return;\n }\n\n await this._initDimensions();\n this._dimensionHelper.enableDimensions();\n this._dimensionHelper.onDimensionsVisibilityChanged((visible) => {\n if (visible) {\n this._renderEverything();\n }\n this._configuratorUiCallbacks.onDimensionsVisibilityChange(visible);\n });\n this._configuratorUiCallbacks.onDimensionsVisibilityChange(true);\n this._renderEverything();\n }\n\n private async _initDimensions(prepareFor2D: boolean = false) {\n if (!this._dimensionHelper) {\n await import('./../utils/dimensioning-helper').then(\n ({ default: DimensionHelper }) => {\n this._dimensionHelper = new DimensionHelper(this._creator_);\n }\n );\n }\n this._dimensionHelper.setUiScene(this._uiScene);\n this._dimensionHelper.setObject(\n this._getViewModel().getComponent(\n this._configuratorContext.rootComponentId\n ),\n this.cameraBehaviour3d.cameraControl.getObjectRotation()\n );\n\n const planObject = this._getKernelAccess().kernelInstance.getPlanObject(\n this._configuratorContext.planObjectId\n );\n if (planObject && planObject.boxForMeasurement) {\n this._dimensionHelper.updateSize(planObject.boxForMeasurement);\n }\n\n const cameraPosition =\n this.cameraBehaviour3d.cameraControl.getCamera().position;\n if (prepareFor2D) {\n const boundingBox = kernelBoxToThreeBox(planObject.boxForMeasurement);\n cameraPosition.copy(boundingBox.getCenter(new Vector3()));\n cameraPosition.y = boundingBox.getSize(new Vector3()).y + 1;\n }\n\n this._dimensionHelper.moveCameraEnd(cameraPosition);\n }\n\n public hideDimensions() {\n if (\n this._componentDimensioningHelper &&\n this._componentDimensioningHelper.hasComponentDimensions()\n ) {\n this._removeCustomComponentDimensions(this._currentComponent);\n this._isComponentDimensionsVisible = false;\n this._configuratorUiCallbacks.onDimensionLabelsUpdated(null);\n return;\n }\n if (this._dimensionHelper) {\n this._dimensionHelper.disableDimensions();\n }\n if (\n this._componentDimensioningHelper &&\n this._componentDimensioningHelper.hasComponentDimensions()\n ) {\n this._componentDimensioningHelper.reset();\n }\n this._renderEverything();\n }\n\n private _updateComponentDimensionLabels() {\n if (!this._componentDimensioningHelper || !this._currentComponent) {\n this._configuratorUiCallbacks.onDimensionLabelsUpdated(null);\n return;\n }\n\n // CRITICAL: Ensure dimension objects are fully ready before getting positions\n this._componentDimensioningHelper.ensureDimensionObjectsReady(\n this._currentComponent.runtimeId\n );\n\n this._componentDimensioningHelper.updateDimensionVisibility(\n this._currentComponent.runtimeId\n );\n\n const labels: DimensionLabel[] = [];\n const component = this._currentComponent;\n\n const dimensionData = this._componentDimensioningHelper.getDimensionData(\n component.runtimeId\n );\n const dimensionObjects =\n this._componentDimensioningHelper.getDimensionObjects(\n component.runtimeId\n );\n\n if (dimensionData && dimensionData.length > 0 && dimensionObjects) {\n const potentialLabels: Array<DimensionLabel & { priority: number }> = [];\n\n const labelPositions: Array<{\n id: string;\n worldPos: Vector3;\n index: number;\n }> = [];\n\n dimensionData.forEach((data, index) => {\n if (!dimensionObjects[index] || !dimensionObjects[index].visible) {\n return;\n }\n\n let labelWorldPos =\n this._componentDimensioningHelper.getDimensionLineCenter(\n component.runtimeId,\n index\n );\n\n if (!labelWorldPos) {\n dimensionObjects[index].getWorldPosition(\n (labelWorldPos = new Vector3())\n );\n }\n\n labelPositions.push({\n id: data.id,\n worldPos: labelWorldPos,\n index,\n });\n });\n\n let occludedLabelIds = new Set<string>();\n if (this._componentRaycastHelper && labelPositions.length > 0) {\n occludedLabelIds =\n this._componentRaycastHelper.checkMultipleLabelOcclusion(\n labelPositions.map(({ id, worldPos }) => ({ id, worldPos })),\n component\n );\n }\n\n labelPositions.forEach(({ id, worldPos, index }) => {\n if (occludedLabelIds.has(id)) {\n return;\n }\n\n const data = dimensionData[index];\n const screenPos = this.getScreenXY(worldPos);\n\n const priority = data.level === 0 ? 100 : 50 - data.level;\n const calculatedValue =\n data.value ||\n (data.dimensioning.to || 0) - (data.dimensioning.from || 0);\n const formattedValue =\n this._unitFormatter.formatMMValueToUnitString(calculatedValue);\n\n potentialLabels.push({\n id: data.id,\n value: calculatedValue,\n formattedValue: formattedValue,\n position: { x: screenPos.x, y: screenPos.y },\n angle: 0,\n level: data.level,\n maxLevel: data.maxLevel,\n axisKey: data.axis?.key || null,\n isVisible: true,\n direction: data.axis\n ? {\n x: data.axis.labelDirection.x,\n y: data.axis.labelDirection.y,\n z: data.axis.labelDirection.z,\n }\n : null,\n priority: priority,\n interactionKey: data.interactionKey || null,\n });\n });\n\n const finalLabels = this._resolveCollisions(potentialLabels);\n labels.push(...finalLabels);\n }\n\n if (labels.length > 0) {\n const payload = { labels, componentId: component.runtimeId };\n this._configuratorUiCallbacks.onDimensionLabelsUpdated(payload);\n } else {\n this._configuratorUiCallbacks.onDimensionLabelsUpdated(null);\n }\n }\n\n /**\n * Resolve label collisions by hiding lower priority overlapping labels\n */\n private _resolveCollisions(\n potentialLabels: Array<DimensionLabel & { priority: number }>\n ): DimensionLabel[] {\n const sortedLabels = [...potentialLabels].sort(\n (a, b) => b.priority - a.priority\n );\n const finalLabels: DimensionLabel[] = [];\n\n const LABEL_WIDTH = 68.4; // width in pixels\n const LABEL_HEIGHT = 34; // height in pixels\n const PADDING = 20; // Minimum padding between labels\n\n for (const label of sortedLabels) {\n let hasCollision = false;\n\n for (const acceptedLabel of finalLabels) {\n if (\n labelsCollide(\n label,\n acceptedLabel,\n LABEL_WIDTH,\n LABEL_HEIGHT,\n PADDING\n )\n ) {\n hasCollision = true;\n break;\n }\n }\n\n if (!hasCollision || (label.level === 0 && label.priority > 90)) {\n const { ...cleanLabel } = label;\n finalLabels.push(cleanLabel);\n }\n }\n\n return finalLabels;\n }\n\n public async loadSceneSettings(sceneSetting: SceneSettings) {\n await super.loadSceneSettings(sceneSetting);\n this._uiIntersectionHelper.floorEnvironment =\n this._environment instanceof FloorEnvironment;\n }\n\n protected onCameraChanged() {\n super.onCameraChanged();\n this._configuratorUiCallbacks.onCameraPositionChanges();\n this._updateComponentPosition();\n }\n\n public requestDockingsPreview(\n userInitiated: boolean,\n possibleChild?: UiPossibleChild,\n dragEvent?: DragEvent,\n dragIn?: boolean\n ) {\n if (!dragIn) {\n dragIn = false;\n }\n if (userInitiated) {\n this.cancelPreviousDockings();\n }\n this.cancelComponentSelection(false, 'dock_preview');\n if (dragIn) {\n this.enableDragIn(dragEvent);\n }\n if (possibleChild) {\n this._configuratorContext.lastPossibleChild = possibleChild;\n }\n this._configuratorContext.requestPreviewsIsUserInitiated = userInitiated;\n this.resetPreviews();\n this._getKernelAccess().webGlPreviewDockings(\n this._configuratorContext,\n dragIn\n );\n this._showDockings();\n }\n\n private _requestDockingsPreviewWithDrag(componentId: number) {\n this.cancelPreviousDockings();\n if (this._configuratorContext.rootComponentId !== componentId) {\n this.resetPreviews();\n this._getKernelAccess().previewDockingsWithDrag(\n componentId,\n this._configuratorContext.planObjectId\n );\n this._showDockings();\n }\n }\n\n private _dockComponent(previewComponent: PreviewComponent) {\n previewComponent.dockInsertAnimation?.endInsert();\n const isExternalObject =\n this._getKernelAccess().kernelInstance.isExternalPlanObject(\n previewComponent.parentId\n );\n if (isExternalObject) {\n this._dockExternalComponent(previewComponent);\n } else {\n this._dockKernelComponent(previewComponent);\n }\n }\n\n private _dockKernelComponent(previewComponent: PreviewComponent) {\n const markname = Benchmark.start(\n 'dock_component_' + previewComponent.childId\n );\n this._getKernelAccess().dockComponent(\n previewComponent.parentId,\n previewComponent.parentDockId,\n previewComponent.childId,\n previewComponent.childDockId\n );\n this._configuratorContext.dockingRootComponentId = null; // Fix #126\n const componentDefinition =\n this._getKernelAccess().kernelInstance.getComponent(\n previewComponent.childId\n );\n this._configuratorUiCallbacks.onElementDocked(\n JSON.parse(JSON.stringify(componentDefinition)),\n previewComponent.childId\n );\n Benchmark.end(markname);\n this.saveConfigToIdb();\n }\n\n private _dockExternalComponent(previewComponent: PreviewComponent) {\n this._getKernelAccess().dockExternalObjectComponent(\n previewComponent.parentId,\n previewComponent.parentDockId,\n previewComponent.childId,\n previewComponent.childDockId\n );\n }\n\n private _onSelectedRuntimeComponentsChange(\n selectedRuntimeComponentIds: number[]\n ) {\n this._getKernelAccess().multiSelectionChange(\n selectedRuntimeComponentIds,\n this._configuratorContext.rootComponentId\n );\n }\n\n private _onSelectedRuntimeComponentChange(component: RoomleComponent) {\n let isRoot = false;\n let componentId = null;\n if (component) {\n isRoot =\n component.runtimeId === this._configuratorContext.rootComponentId;\n componentId = component.runtimeId;\n }\n\n this._getKernelAccess().selectionChange(componentId, isRoot);\n\n if (component) {\n this._getKernelAccess().selectedComponent(component.runtimeId);\n }\n }\n\n public requestDeleteSelectedComponent() {\n const selection = this._configuratorContext.selectedRuntimeComponentIds;\n const rootComponentId = this._configuratorContext.rootComponentId;\n if (\n !this._getKernelAccess().isExternalObjectOrComponent(rootComponentId) &&\n (!Array.isArray(selection) ||\n selection.length === 0 ||\n !rootComponentId ||\n selection.indexOf(rootComponentId) !== -1)\n ) {\n return;\n }\n\n switch (this._configuratorContext.selectionMode) {\n case SELECTION_MODE.STANDARD:\n this._getKernelAccess().requestDeleteComponent(\n this._configuratorContext.selectedRuntimeComponentId\n );\n break;\n case SELECTION_MODE.MULTISELECT:\n this._getKernelAccess().requestDeleteComponents(\n this._configuratorContext.selectedRuntimeComponentIds\n );\n break;\n }\n this._configuratorContext.selectedRuntimeComponentIds = [];\n }\n\n public componentUpdated(\n component: RoomleComponent,\n _kernelComponent: KernelComponent\n ): void {\n this._currentComponent = component;\n if (component.runtimeId === this._configuratorContext.rootComponentId) {\n const rootComponentPosition = new Vector3(\n component.position.x / 1000,\n component.position.z / 1000,\n component.position.y / -1000\n );\n this._sceneEventHandler.update(null, rootComponentPosition, null);\n }\n const geometryChanged =\n component.geometryChanged !== undefined\n ? component.geometryChanged\n : true;\n if (geometryChanged) {\n this._renderEverything();\n } else {\n this._renderWithoutShadowsAndAO();\n }\n this._componentDimensioningHelper?.invalidateDimensioningsCache(\n component.runtimeId\n );\n\n const hadDimensions = this._isComponentDimensionsVisible;\n\n if (hadDimensions) {\n if (this._dimensionUpdateDebounced) {\n clearTimeout(this._dimensionUpdateDebounced as any);\n }\n this._configuratorUiCallbacks.onDimensionLabelsUpdated(null);\n\n this._dimensionUpdateDebounced = setTimeout(async () => {\n this._dimensionUpdateDebounced = null;\n\n this._componentDimensioningHelper\n .regenerateDimensions(this._currentComponent, () =>\n this._renderEverything()\n )\n .then(() => {\n this._updateComponentDimensionLabels();\n });\n }, 100) as any;\n }\n }\n\n public planObjectUpdated(\n planObject: PlanObject,\n geometryChanged: boolean,\n pendingDocking: boolean\n ): void {\n const configuration =\n this._getKernelAccess().kernelInstance.getSerializedConfiguration(\n this._configuratorContext.planObjectId\n );\n if (!pendingDocking) {\n this._configuratorHistory.push(configuration);\n }\n if (!planObject.bounds) {\n return;\n }\n if (\n this._configuratorContext.planObjectId === planObject.id &&\n this.cameraBehaviour3d instanceof ConfiguratorCameraBehaviour\n ) {\n const box = this._getViewModel().getBoundingBox();\n this.cameraBehaviour3d.updateBoundsOnPlanObjectUpdated(box);\n const geometryBox = this._getViewModel().getBoundingBoxOfGeometry();\n this._updateBounds(box, geometryBox, geometryChanged);\n }\n // Update highlights because some component meshes may have changed\n this._highlightComponent();\n this._requestRender();\n }\n\n public componentDeleted(component: RoomleComponent): void {\n if (\n this._sceneEventHandler\n .getSelectedRuntimeComponentIds()\n .indexOf(component.runtimeId) !== -1 ||\n this._sceneEventHandler.getSelectionMode() === SELECTION_MODE.MULTISELECT\n ) {\n this.cancelComponentSelection(false, 'delete_component');\n }\n this._renderEverything();\n }\n\n public previewConstructionDone(\n _component: RoomleComponent,\n hasPreviews: boolean\n ): void {\n const boundingBox = this._getViewModel().getBoundingBoxWithPreviews();\n if (!hasPreviews) {\n this._cancelDockings(true, null, false, false, false);\n if (this._configuratorContext.requestPreviewsIsUserInitiated) {\n this._configuratorUiCallbacks.onNoDockingsAvailable();\n }\n }\n let updateToBounds = true;\n if (this._componentRaycastHelper) {\n const areAllPreviewsVisible =\n this._componentRaycastHelper.areAllComponentsInFrustum(\n this._getViewModel().getPreviews()\n );\n updateToBounds = !areAllPreviewsVisible;\n }\n if (\n this._configuratorContext.requestPreviewsIsUserInitiated &&\n updateToBounds\n ) {\n this.configuratorCameraBehaviour.zoomToFitBoundsAfterUserInitiatedPreviews(\n boundingBox\n );\n }\n if (this._lightSetting && this._lightSetting.needsBounds()) {\n this._lightSetting.updateBounds(boundingBox);\n if (this._environment && this._environment.needsBounds()) {\n this._environment.updateBounds(boundingBox.getSize(new Vector3()));\n }\n }\n if (this._componentRaycastHelper) {\n this._componentRaycastHelper.checkPreviewVisibility(this._getViewModel());\n }\n }\n\n public configurationLoaded(\n component: RoomleComponent,\n isFreeFlying: boolean\n ): void {\n if (component && isFreeFlying && this._sceneEventHandler.isDragIn()) {\n component.position.copy(new Vector3(0, 100, 0));\n this._scene.add(component);\n this._sceneEventHandler.addComponentDragInHandler(component);\n this._requestRender();\n } else if (!isFreeFlying && !this._initData.debug && !this._initData.moc) {\n // reset camera initially\n this.configuratorCameraBehaviour.resetCameraToStartOnConfigurationLoaded(\n this.getBounds()\n );\n }\n\n if (this._environment) {\n this._environment.reload();\n }\n\n this._waitForAssets().then(() => {\n this._readyForRender();\n });\n }\n\n public addComponentHandlers(component: RoomleComponent): void {\n this._sceneEventHandler.addComponentHandlers(component);\n }\n\n public addPreviewHandlers(previewComponent: PreviewComponent): void {\n this._sceneEventHandler.addPreviewHandlers(previewComponent);\n }\n\n public addPreviewLineHandlers(\n previewLineComponent: PreviewLineComponent\n ): void {\n this._sceneEventHandler.addPreviewLineHandlers(previewLineComponent);\n }\n\n private _updateComponentPosition() {\n if (\n !this._configuratorUiCallbacks?.onComponentPositionsUpdated ||\n this._configuratorContext.baseContext !== BASE_CONTEXT.CONFIGURATOR\n ) {\n return;\n }\n const componentPositions: any[] = [];\n this._getViewModel()\n .getComponents()\n .forEach((component) => {\n if (!component.boundingBoxMesh) {\n return;\n }\n const box = new Box3().setFromObject(component.boundingBoxMesh);\n const kernelComponent =\n this._getKernelAccess().kernelInstance.getComponent(\n component.runtimeId\n );\n const editable =\n kernelComponent.parameters || kernelComponent.possibleChildren;\n const actions = editable ? ['edit'] : [];\n componentPositions.push({\n id: component.runtimeId,\n position: this.getScreenXY(box.getCenter(new Vector3())),\n type: 'component',\n actions,\n });\n });\n\n this._getViewModel()\n .getPreviews()\n .forEach((preview) => {\n const box = new Box3().setFromObject(preview);\n const actions = ['add'];\n componentPositions.push({\n id: preview.runtimeId,\n position: this.getScreenXY(box.getCenter(new Vector3())),\n type: 'preview',\n actions,\n });\n });\n\n this._configuratorUiCallbacks.onComponentPositionsUpdated(\n componentPositions\n );\n\n if (\n this._isComponentDimensionsVisible &&\n this._componentDimensioningHelper &&\n this._componentDimensioningHelper.hasComponentDimensions()\n ) {\n this._updateComponentDimensionLabels();\n }\n }\n\n protected _updateBounds(\n box: Box3,\n geometryBox?: Box3,\n geometryChanged = false\n ) {\n super._updateBounds(box, geometryBox, geometryChanged);\n if (!box) {\n return;\n }\n const size = box.getSize(new Vector3());\n const planObject = this._getKernelAccess().kernelInstance.getPlanObject(\n this._configuratorContext.planObjectId\n );\n if (planObject && planObject.boxForMeasurement) {\n this._dimensionHelper?.updateSize(planObject.boxForMeasurement);\n }\n this._sceneEventHandler.update(size, null, null);\n this._uiIntersectionHelper.updateToBounds(\n size,\n this._domHelper.element.clientWidth,\n this._domHelper.element.clientHeight\n );\n if (\n this._componentDimensioningHelper &&\n this._componentDimensioningHelper.hasComponentDimensions()\n ) {\n this._componentDimensioningHelper.reset();\n }\n this.cameraBehaviour3d.cameraControl.getCamera().updateProjectionMatrix();\n }\n\n public async moveCamera(cameraParameter: CameraParameter): Promise<void> {\n return this.configuratorCameraBehaviour.externalApiMoveCamera(\n cameraParameter\n );\n }\n\n public getSelectedRuntimeComponentIds(): number[] {\n return this._sceneEventHandler.getSelectedRuntimeComponentIds();\n }\n\n public selectComponent(runtimeId: number, triggerClickCallback = true): void {\n if (!runtimeId) {\n return;\n }\n const components = this._getViewModel().getComponents();\n const component = components.find((c) => c.runtimeId === runtimeId);\n if (!component) {\n console.warn(\n 'Can not select \"' + runtimeId + '\" because it was not found'\n );\n return;\n }\n this._sceneEventHandler.clickComponent(component, triggerClickCallback);\n }\n\n public highlightParts(ids: number[]) {\n this._highlightComponent(null, ids);\n this._requestRender();\n }\n\n private _shouldHighlightComponent(): boolean {\n if (this._configuratorContext.baseContext !== BASE_CONTEXT.CONFIGURATOR) {\n return false;\n }\n if (this._initData.highlighting === ROOMLE_HIGHLIGHTNG.ALWAYS) {\n return true;\n }\n if (this._initData.highlighting === ROOMLE_HIGHLIGHTNG.OFF) {\n return false;\n }\n const planComponent = this._getKernelAccess().kernelInstance.getComponent(\n this._configuratorContext.rootComponentId\n );\n if (planComponent.externalComponent) {\n return true;\n }\n const amount =\n this._plannerKernelAccess.kernelInstance.getChildrenOfPlanComponent(\n this._configuratorContext.rootComponentId,\n true,\n false\n );\n return (amount || []).length > 1;\n }\n\n public saveConfigToIdb() {\n let id: string;\n let configurationToSave: string;\n const { configuratorId } = this._globalInitData;\n const { lastLoadedPlanId, lastLoadedRapiId } = this._configuratorContext;\n\n if (this._initData.moc) {\n id = lastLoadedPlanId;\n configurationToSave = this._getKernelAccess()\n ?.planInteractionHandler.getPlan()\n ?.getPlanXML(false, 2);\n } else {\n id = lastLoadedRapiId;\n configurationToSave =\n this._getKernelAccess().kernelInstance.getSerializedConfiguration(\n this._configuratorContext.planObjectId\n );\n }\n\n const key = this._idbManager.getKey(getHostname(), configuratorId, id);\n this._idbManager.setValue(\n key,\n configurationToSave,\n this._idbManager.configStore\n );\n }\n\n protected _getInputManager(): InputManager {\n return this._configuratorInputManager;\n }\n\n // override\n protected createCameraControl(\n _mode: Enumify<typeof CAMERA_TYPE>,\n offset: CanvasOffset\n ): void {\n this._componentFactory = RoomleComponentFactoryInitializer();\n\n const clientDimensions = this._domHelper.getClientDimensions();\n const width = clientDimensions.x;\n const height = clientDimensions.y;\n const camera = this._componentFactory.createPerspectiveCamera(\n 30,\n width / height,\n 0.1,\n 20,\n offset\n );\n\n camera.layers.set(LAYER.OBJECT);\n camera.layers.enable(LAYER.LIGHTING);\n camera.layers.enable(LAYER.BACKGROUND);\n camera.layers.enable(LAYER.UI);\n camera.layers.enable(LAYER.PREVIEW);\n\n camera.position.copy(new Vector3(0, 0.5, 5));\n\n this._changeCameraBehaviour(\n new ConfiguratorCameraBehaviour(\n new CameraControl3D(\n this._creator_,\n this._getInputManager(),\n null,\n camera\n ),\n this._cameraBehaviourState\n )\n );\n }\n\n public getBounds(): Box3 {\n return this._getViewModel().getBoundingBox();\n }\n\n public getGeometryBounds(): Box3 {\n return this._getViewModel().getBoundingBoxOfGeometry();\n }\n\n public sceneChanged(): void {\n // TODO Implement\n }\n\n protected get configuratorCameraBehaviour(): ConfiguratorCameraBehaviour {\n if (!(this.cameraBehaviour instanceof ConfiguratorCameraBehaviour)) {\n return null;\n }\n return this.cameraBehaviour as ConfiguratorCameraBehaviour;\n }\n\n protected get cameraBehaviour3d(): CameraBehaviour3d {\n return this.cameraBehaviour as CameraBehaviour3d;\n }\n\n protected _onCameraIdle() {\n return super._onCameraIdle();\n }\n\n protected _onCameraMove() {\n return super._onCameraMove();\n }\n\n public getComponent(componentRuntimeId: number) {\n return this._plannerKernelAccess.kernelInstance.getComponent(\n componentRuntimeId\n );\n }\n\n public cameraBehaviourChanged() {\n super.cameraBehaviourChanged();\n this._sceneEventHandler?.setCamera(\n this.cameraBehaviour.cameraControl.getCamera()\n );\n this._setCameraControlListeners();\n }\n\n protected _setCameraControlListeners() {\n if (!this.cameraBehaviour3d) {\n return;\n }\n\n this.cameraBehaviour.cameraControl.addEventListener(\n CAMERA_EVENT.ORBIT_START,\n () => {\n this._configuratorUiCallbacks.onCameraPositionChanges();\n this._sceneEventHandler.setCameraMoving(true);\n this._requestRender();\n },\n this\n );\n\n this.cameraBehaviour.cameraControl.addEventListener(\n CAMERA_EVENT.ORBIT_MOVE,\n () => {\n if (this._componentRaycastHelper) {\n this._componentRaycastHelper.checkComponentAndPreviewVisibility(\n this._sceneEventHandler,\n this._getViewModel()\n );\n }\n\n if (\n this._componentDimensioningHelper &&\n this._componentDimensioningHelper.hasComponentDimensions() &&\n this._currentComponent\n ) {\n const needsRegeneration =\n this._componentDimensioningHelper.needsDimensionRegeneration(\n this.cameraBehaviour.cameraControl.getCamera()\n );\n\n if (needsRegeneration) {\n this._componentDimensioningHelper\n .regenerateDimensions(this._currentComponent, () =>\n this._renderEverything()\n )\n .then(() => {\n this._updateComponentDimensionLabels();\n });\n } else {\n this._componentDimensioningHelper.updateDimensionVisibility(\n this._currentComponent.runtimeId\n );\n this._updateComponentDimensionLabels();\n }\n }\n\n this._requestRender();\n },\n this\n );\n\n this.cameraBehaviour.cameraControl.addEventListener(\n CAMERA_EVENT.ORBIT_END,\n () => {\n this._sceneEventHandler.setCameraMoving(false);\n\n this._requestRender();\n },\n this\n );\n\n this.cameraBehaviour.cameraControl.addEventListener(\n CAMERA_EVENT.ZOOM_CHANGE,\n ({ minZoom, maxZoom }) => {\n this._configuratorUiCallbacks.onZoomChange(minZoom, maxZoom);\n },\n this\n );\n\n this.cameraBehaviour.cameraControl.addEventListener(\n CAMERA_EVENT.ZOOM_IN,\n () => {\n this._configuratorUiCallbacks.onCameraPositionChanges();\n\n this._configuratorUiCallbacks.onDimensionLabelsUpdated(null);\n\n this._requestRender();\n },\n this\n );\n\n this.cameraBehaviour.cameraControl.addEventListener(\n CAMERA_EVENT.ZOOM_OUT,\n () => {\n this._configuratorUiCallbacks.onCameraPositionChanges();\n\n this._configuratorUiCallbacks.onDimensionLabelsUpdated(null);\n\n this._requestRender();\n },\n this\n );\n\n this.cameraBehaviour.cameraControl.addEventListener(\n CAMERA_EVENT.MOVING,\n () => {\n this._pluginSystem.moveCameraStart(\n this.cameraBehaviour.cameraControl.getCamera().position\n );\n this._dimensionHelper?.moveCameraStart(\n this.cameraBehaviour.cameraControl.getCamera().position\n );\n },\n this\n );\n\n this.cameraBehaviour.cameraControl.addEventListener(\n CAMERA_EVENT.IDLE,\n () => {\n this._pluginSystem.moveCameraEnd(\n this.cameraBehaviour.cameraControl.getCamera().position\n );\n this._dimensionHelper?.moveCameraEnd(\n this.cameraBehaviour.cameraControl.getCamera().position\n );\n\n this._updateComponentPosition();\n\n if (\n this._componentDimensioningHelper &&\n this._componentDimensioningHelper.hasComponentDimensions() &&\n this._currentComponent\n ) {\n const needsRegeneration =\n this._componentDimensioningHelper.needsDimensionRegeneration(\n this.cameraBehaviour.cameraControl.getCamera()\n );\n\n if (needsRegeneration) {\n // Regenerate dimensions for new camera angle\n this._componentDimensioningHelper\n .regenerateDimensions(this._currentComponent, () =>\n this._renderEverything()\n )\n .then(() => {\n this._updateComponentDimensionLabels();\n });\n } else {\n // Just update visibility for small camera movements\n this._componentDimensioningHelper.updateDimensionVisibility(\n this._currentComponent.runtimeId\n );\n this._updateComponentDimensionLabels();\n }\n }\n },\n this\n );\n }\n\n protected _shouldRenderUi(): boolean {\n return (\n super._shouldRenderUi() || this._dimensionHelper?.areDimensionsEnabled()\n );\n }\n\n protected setEventHandlerObject(object: Object3D) {\n this._sceneEventHandler.setObject(object);\n }\n\n // info when scene is ready to render, used for testing\n protected _readyForRender() {\n if (this._configuratorContext.baseContext !== BASE_CONTEXT.CONFIGURATOR) {\n return;\n }\n console.log('ready_for_render');\n this._configuratorUiCallbacks.onReadyForRender();\n this._globalCallback.onReadyForRender();\n }\n\n public animateElement(\n elementId: number,\n parameterName: string,\n value: string,\n applyToChildren: boolean,\n animate: boolean\n ) {\n const parameterKey = ANIMATION_PARAMETER_PREFIX + parameterName;\n this._viewModel.changeAnimationValue(\n elementId,\n parameterKey,\n value,\n 0,\n applyToChildren,\n animate\n );\n }\n\n public undo(): Promise<void> {\n return new Promise((resolve, reject) => {\n const configurationString = this._configuratorHistory.undo();\n if (configurationString) {\n this._callOnPartListUpdate().then(resolve, reject);\n this._plannerKernelAccess.loadConfiguration(configurationString);\n }\n });\n }\n\n public redo(): Promise<void> {\n return new Promise((resolve, reject) => {\n const configurationString = this._configuratorHistory.redo();\n if (configurationString) {\n this._callOnPartListUpdate().then(resolve, reject);\n this._plannerKernelAccess.loadConfiguration(configurationString);\n }\n });\n }\n\n public clearHistory(): void {\n this._configuratorHistory.clearHistory();\n }\n\n private async _callOnPartListUpdate(): Promise<void> {\n const { hash } = await AsyncHelper.waitFor(\n ASYNC_OPERATIONS.CONFIGURATION_LOADED\n );\n const partListToUse =\n (await this._plannerKernelAccess.getPartList()) as KernelPartList;\n\n const hashToUse = await this._plannerKernelAccess.getConfigurationHash(\n this._configuratorContext\n );\n\n const enhancedPartList =\n await this._plannerKernelAccess.addUiDataAndPriceToPartList(\n partListToUse,\n hashToUse\n );\n\n this._configuratorUiCallbacks.onPartListUpdate(\n enhancedPartList,\n window.btoa(hash)\n );\n }\n\n private async _showCustomComponentDimensions(\n component?: RoomleComponent\n ): Promise<boolean> {\n const targetComponent = component || this._currentComponent;\n\n if (!targetComponent || !this._componentDimensioningHelper) {\n return false;\n }\n\n const added = await this._componentDimensioningHelper.add(\n targetComponent,\n () => {\n this._renderEverything();\n }\n );\n\n if (added) {\n this._renderEverything();\n this._updateComponentDimensionLabels();\n }\n\n return added;\n }\n\n private async _removeCustomComponentDimensions(\n component?: RoomleComponent\n ): Promise<void> {\n const targetComponent = component || this._currentComponent;\n\n if (!targetComponent || !this._componentDimensioningHelper) {\n return;\n }\n\n await this._componentDimensioningHelper.remove(targetComponent);\n this._renderEverything();\n }\n\n public clearHighlighting() {\n this._roomleRenderer?.highlightObjects([]);\n }\n}\n"],"names":["updateComponentAnimationParameters","components","parameters","animationParameters","AnimationValueMap","component","parameter","changeComponentAnimationValueAndAnimate","parameterKey","value","level","animate","invalidateRenderCallback","animationName","oldValue","priorAnimations","subsequentAnimations","RectLampLight","RectAreaLight","objectViewModel","debug","lightAttributes","data","lightSourceAttributes","lightPos","convertToTHREE","targetPos","rectLampLightAttributes","LAMP_LIGHT_COLOR","LAMP_LIGHT_INTENSITY","Color","rotation","RectAreaLightHelper","position","lookAtMatrix","Matrix4","Euler","gui","getGUI","params","folder","val","LAMP_LIGHT_DISTANCE","LAMP_LIGHT_POWER","LAMP_LIGHT_SHADOW_INTENSITY","PointLampLight","PointLight","lampLightAttributes","lampLight","module","PointLightHelper","qualityLevel","QUALITY_LEVELS","generateLightSource","LIGHT_SOURCE_TYPE","LampLight","RoomleLightSource","lightSourceId","lightSource","object3d","state","DragInsertAnimation","id","previewComponent","displacedComponents","dockPair","convertKernelMatrixToThreeMatrix","animations","ObjectAnimations","ConfiguratorViewModel","creator","OccurrenceMap","RoomleComponentFactoryInitializer","RoomleDependencyInjection","runtimeComponentId","mesh","userData","transform","uvTransform","originalGeometry","transformMatrix","convertToThreeMatrix","isUVIdentityMatrix","uvTransformMatrix","convertToThreeUVMatrix","bufferGeometry","newBufferGeometry","elementId","applyToChildren","child","externalConfiguration","rootComponentId","geometryId","materialId","vertices","indices","uvCoords","normals","materialAttributes","meshId","_environmentGeometry","runtimeComponent","isPreview","LAYER","oldMaterial","roomleLightSource","componentId","numberOfPossibleChildren","roomleComponent","meshes","uniqueMaterialMeshes","meshesToAdd","meshesToRemove","newMesh","Mesh","BufferGeometry","uniqueMesh","existingGeometry","BufferGeometryUtils.mergeGeometries","componentMesh","isRootComponent","parentId","componentPosition","componentRotation","parentComponent","newParent","Benchmark","preview","planObject","pendingDocking","geometryChanged","previewId","geometryName","environmentGeometry","meshAttributes","meshBuffer","isDeltaUpdate","Object3D","eulerAngles","parentObjectRuntimeId","kernelComponent","planObjectId","partList","hash","rootComponentRapiId","AsyncHelper","ASYNC_OPERATIONS","_objectId","hasPreviews","dockLines","previewLineComponent","rootComponent","i","clonedComponent","convertToEuler","segment","dockPairs","previewPosition","displacedComponent","conversationId","objectId","_hash","_errors","DOCKING_CONVERSATION_ID","isFreeFlying","resolve","_reject","_configuration","_conversationId","listener","kernelBoxToThreeBox","Box3","ids","obj","fun","threshold","_type","_newGeometryInstance","material","partId","AsyncGuard","requestRenderCallback","requestRenderSceneUpdateCallback","exports","__decorateClass","inject","largestKey","largestValue","v","k","Vector4","x","y","z","w","scalar","index","s","a","b","m","e","q","angle","te","m11","m12","m13","m21","m22","m23","m31","m32","m33","xx","yy","zz","xy","xz","yz","min","max","clamp","minVal","maxVal","length","alpha","v1","v2","array","offset","attribute","_vector1","Vector3","_vector2","_normalMatrix","Matrix3","Plane","normal","constant","point","c","plane","inverseNormalLength","sphere","target","line","direction","denominator","t","startSign","endSign","box","matrix","optionalNormalMatrix","normalMatrix","referencePoint","_sphere","Sphere","_vector","Frustum","p0","p1","p2","p3","p4","p5","planes","frustum","coordinateSystem","WebGLCoordinateSystem","me","me0","me1","me2","me3","me4","me5","me6","me7","me8","me9","me10","me11","me12","me13","me14","me15","WebGPUCoordinateSystem","object","geometry","sprite","center","negRadius","_projScreenMatrix","_lightPositionWorld","_lookTarget","LightShadow","camera","Vector2","light","shadowCamera","shadowMatrix","viewportIndex","source","Camera","recursive","force","updateParents","updateChildren","_v3","_minTarget","_maxTarget","PerspectiveCamera","fov","aspect","near","far","focalLength","vExtentSlope","RAD2DEG","DEG2RAD","distance","minTarget","maxTarget","fullWidth","fullHeight","width","height","top","left","view","skew","meta","PointLightShadow","MAX_SHADOW_LIGHTS","LightGroup","Group","shadowMap","lights","amountOfLights","on","CEILING_LIGHT_POWER","GROUP_CONSTRUCTION","GROUP_CEILING","GROUP_FLOOR","MAX_LIGHTS","GROUP_CEILING_LIGHTS","GROUP_MEASUREMENT_LINE","GROUP_WALL_ATTICS","PlanViewModel","plan","planElementViewModel","ConfigurableConstructionPlanObjectViewModel","ConfiguratorPlanObjectViewModel","ConstructionPlanObjectViewModel","StaticPlanObjectViewModel","MeasurementLinePlanElementViewModel","WallAtticPlanElementViewModel","WallPlanElementViewModel","FloorPlanElementViewModel","CeilingPlanElementViewModel","NodePlanElementViewModel","viewModel","runtimeId","CAMERA_TYPE","floor","lightPositionArray","positionsArray","j","_maxTextures","newLight","CeilingLight","existingLights","positions","activeLightCount","lightsWithPower","lamp","options","color","decay","intensity","active","dimensions","componentRuntimeId","planViewModel","result","planObjectViewModel","staticObj","configurablePlanObject","staticPlanObject","BASE_CONTEXT","plannerSceneEventHandler","type","newGeometryInstance","PlannerKernelAccess","_planViewModel","_fromPlan","_toPlan","_plan","_material","_vertices","_indices","_uvCoords","_normals","_planObject","planElement","success","configuration","_element","element","runtimeIds","visible","nodePlanObject","cameraType","promises","wallPlanObject","measurementPlanObject","wallAtticPlanObject","zoom","node","group","_catalogItemId","OBJECT_EVENT","RAYCAST_PRIORITY","INTERSECTION_MODE","RAYCAST_EVENT","ROTATION_TO_DETECT_SIDE","toRadiant","RaycastHelper","EventDispatcher","generalInput","mode","Raycaster","layers","inputManager","INPUT_EVENT","event","intersection","doubleClick","inputType","INPUT_EVENT_TYPE","intersections","log","intersectionResult","intersectionsWithHandler","compareBox3Size","positionRelative","intersectionBottom","constructionGroup","name","snapToWall","wallPosition","bottomDistance","yaw","intersectionFront","intersectionSide","sideDistance","frontDistance","vectorLength","vectorIsZero","Quaternion","bounds","rootComponentPosition","backgroundScene","disposeMesh","planeNormal","convertToKernel","SceneEventHandler","scene","dragIn","dragEvent","SCENE_EVENT","SceneEventInfo","resetCamera","consecutive","forceRender","reason","ConfiguratorSceneEventHandler","SELECTION_EVENT","Layers","_event","componentEventInfo","boundingBox","deepMerge","triggerClickCallback","intersectionPoint","enabled","castedMesh","positionLine","posInGlobal","SELECTION_MODE","cameraMoving","UI_INTERSECTION_EVENT","UiIntersectionHelper","clientWidth","clientHeight","minVector","maxVector","size","paddings","mask","pixelPosition","getScreenXY","ConfiguratorCameraBehaviour","CameraBehaviour","cameraParameter","cameraParameters","lookAtSide","ConfiguratorSceneManager","SceneManager","CANVAS_ID","hoveredOver","componentToDelete","Env","callAgainAfter","debounce","transparentHighlighting","ComponentRaycastHelperClass","cameraBehaviour","interval","PULSE_LOOPS","PULSE_DURATION","shouldHandleComponentDeletion","arePreviewsExisting","notifyUi","updateCamera","nextTick","selectedMeshes","useMesh","selectedComponent","transparent","skipLightSetup","DynamicLightSettingLoader","PREDEFINED_LIGHTSETTING","DefaultLightSetting","BackgroundEnvironment","getColor","shouldHardReset","prefix","opacity","newPrefix","_isolationMode","showDimensions","cameraTarget","dimensionsEnabled","objectRotation","angleY","toDegrees","ImageRenderer","image","renderOptions","reject","createEmptySceneFromCurrent","dispose","spacing","bbox","wantedAngle","getYRotationOfObject","targetCameraParams","getIdealDistance","DISTANCE_FACTOR","areCameraParametersEqual","ctrlOrCmd","CameraControl3D","cleanup","_isExternalObject","_reason","isExternalObject","_component","FloorEnvironment","prepareFor2D","DimensionHelper","cameraPosition","labels","dimensionData","dimensionObjects","potentialLabels","labelPositions","labelWorldPos","occludedLabelIds","worldPos","screenPos","priority","calculatedValue","formattedValue","finalLabels","payload","sortedLabels","LABEL_WIDTH","LABEL_HEIGHT","PADDING","label","hasCollision","acceptedLabel","labelsCollide","cleanLabel","sceneSetting","userInitiated","possibleChild","componentDefinition","selectedRuntimeComponentIds","isRoot","selection","_kernelComponent","geometryBox","updateToBounds","componentPositions","actions","ROOMLE_HIGHLIGHTNG","configurationToSave","configuratorId","lastLoadedPlanId","lastLoadedRapiId","key","getHostname","_mode","clientDimensions","CAMERA_EVENT","minZoom","maxZoom","parameterName","ANIMATION_PARAMETER_PREFIX","configurationString","partListToUse","hashToUse","enhancedPartList","targetComponent","added"],"mappings":"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","x_google_ignoreList":[6,7,8,9,10,11,12]}
|