@roomle/web-sdk 3.7.0-alpha.3 → 3.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (126) hide show
  1. package/lib/{BufferGeometry-C696z6r3.mjs → BufferGeometry-BzmfTBQt.mjs} +1 -1
  2. package/lib/{BufferGeometry-C696z6r3.mjs.map → BufferGeometry-BzmfTBQt.mjs.map} +1 -1
  3. package/lib/ConfiguratorKernel.wasm +0 -0
  4. package/lib/{GLTFExporter-AfQIvZAD.mjs → GLTFExporter-CyhgWPq0.mjs} +2 -2
  5. package/lib/{GLTFExporter-AfQIvZAD.mjs.map → GLTFExporter-CyhgWPq0.mjs.map} +1 -1
  6. package/lib/{PointLightHelper-wVSmrAnD.mjs → PointLightHelper-DwIXACyT.mjs} +2 -2
  7. package/lib/{PointLightHelper-wVSmrAnD.mjs.map → PointLightHelper-DwIXACyT.mjs.map} +1 -1
  8. package/lib/RoomleCore.js +2 -2
  9. package/lib/RoomleCore.wasm +0 -0
  10. package/lib/RoomleToolsCore.wasm +0 -0
  11. package/lib/{SpotLightHelper-C7J95t4f.mjs → SpotLightHelper-CfLHM7LU.mjs} +2 -2
  12. package/lib/{SpotLightHelper-C7J95t4f.mjs.map → SpotLightHelper-CfLHM7LU.mjs.map} +1 -1
  13. package/lib/{USDZExporter-BBk0APeK.mjs → USDZExporter-kmxcTvnQ.mjs} +2 -2
  14. package/lib/{USDZExporter-BBk0APeK.mjs.map → USDZExporter-kmxcTvnQ.mjs.map} +1 -1
  15. package/lib/{api-DgXsyN04.mjs → api-X1dDTDvL.mjs} +2 -2
  16. package/lib/{api-DgXsyN04.mjs.map → api-X1dDTDvL.mjs.map} +1 -1
  17. package/lib/asset-loader.worker-A7nEeQB4.mjs.map +1 -1
  18. package/lib/{banana-for-scale-D8t2dmc7.mjs → banana-for-scale-Bpf8RfLi.mjs} +4 -4
  19. package/lib/{banana-for-scale-D8t2dmc7.mjs.map → banana-for-scale-Bpf8RfLi.mjs.map} +1 -1
  20. package/lib/budgeteer.sw-CQWYbQSc.mjs.map +1 -1
  21. package/lib/budgeteer.sw.js +1 -1
  22. package/lib/{common-utils-qErzZAiR.mjs → common-utils-DMI8Yuhe.mjs} +5 -3
  23. package/lib/common-utils-DMI8Yuhe.mjs.map +1 -0
  24. package/lib/{component-dimensioning-DlB7-9Om.mjs → component-dimensioning-MtS9xiY-.mjs} +15 -15
  25. package/lib/{component-dimensioning-DlB7-9Om.mjs.map → component-dimensioning-MtS9xiY-.mjs.map} +1 -1
  26. package/lib/{component-raycast-helper-C6ptEb0K.mjs → component-raycast-helper-C1qWqpRH.mjs} +13 -9
  27. package/lib/component-raycast-helper-C1qWqpRH.mjs.map +1 -0
  28. package/lib/configurator-C5t3clCx.mjs +2 -0
  29. package/lib/{configurator-CmMBHkyd.mjs → configurator-Cg1a9XSL.mjs} +4 -4
  30. package/lib/{configurator-CmMBHkyd.mjs.map → configurator-Cg1a9XSL.mjs.map} +1 -1
  31. package/lib/{continuous-drawing-helper-BwulJHKj.mjs → continuous-drawing-helper-CQx5Sbns.mjs} +3 -3
  32. package/lib/{continuous-drawing-helper-BwulJHKj.mjs.map → continuous-drawing-helper-CQx5Sbns.mjs.map} +1 -1
  33. package/lib/{dat.gui.module-CZHqOVGq.mjs → dat.gui.module-CZ-DIWHM.mjs} +1 -1
  34. package/lib/{dat.gui.module-CZHqOVGq.mjs.map → dat.gui.module-CZ-DIWHM.mjs.map} +1 -1
  35. package/lib/{decorate-BAtqSPNS.mjs → decorate-Bck1_lG8.mjs} +1 -1
  36. package/lib/{decorate-BAtqSPNS.mjs.map → decorate-Bck1_lG8.mjs.map} +1 -1
  37. package/lib/dimensioning-helper-Bfe0fImX.mjs +2 -0
  38. package/lib/{dimensioning-helper--Y0Y-Wr1.mjs → dimensioning-helper-GPn7Z8GE.mjs} +7 -7
  39. package/lib/{dimensioning-helper--Y0Y-Wr1.mjs.map → dimensioning-helper-GPn7Z8GE.mjs.map} +1 -1
  40. package/lib/glb-viewer-DIEpkrvY.mjs +2 -0
  41. package/lib/{glb-viewer-Cs3i0yb8.mjs → glb-viewer-tgKOPCaI.mjs} +44 -45
  42. package/lib/glb-viewer-tgKOPCaI.mjs.map +1 -0
  43. package/lib/highlight-coordinator-DRHeEU-E.mjs +116 -0
  44. package/lib/highlight-coordinator-DRHeEU-E.mjs.map +1 -0
  45. package/lib/{homag-intelligence-CBZujG1I.mjs → homag-intelligence-D5mCTWgG.mjs} +19 -11
  46. package/lib/homag-intelligence-D5mCTWgG.mjs.map +1 -0
  47. package/lib/{imos-ix-poc-export-helper-CW7QZhhn.mjs → imos-ix-poc-export-helper-BKFs_Yhm.mjs} +5 -5
  48. package/lib/{imos-ix-poc-export-helper-CW7QZhhn.mjs.map → imos-ix-poc-export-helper-BKFs_Yhm.mjs.map} +1 -1
  49. package/lib/kernel-C7YDLxq8.mjs.map +1 -1
  50. package/lib/{kernel-utils-DCnHzW4n.mjs → kernel-utils-B80amC-l.mjs} +2 -2
  51. package/lib/{kernel-utils-DCnHzW4n.mjs.map → kernel-utils-B80amC-l.mjs.map} +1 -1
  52. package/lib/{layer-CFAr2mK_.mjs → layer-BfckfWZz.mjs} +1 -1
  53. package/lib/{layer-CFAr2mK_.mjs.map → layer-BfckfWZz.mjs.map} +1 -1
  54. package/lib/{main-_HtiLIhS.mjs → main-CJ5TNhBt.mjs} +2484 -2533
  55. package/lib/main-CJ5TNhBt.mjs.map +1 -0
  56. package/lib/{material-viewer-BCjg687R.mjs → material-viewer-DCqZzMZN.mjs} +40 -35
  57. package/lib/material-viewer-DCqZzMZN.mjs.map +1 -0
  58. package/lib/packages-DuOz6rk6.mjs +4 -0
  59. package/lib/{planner-OYwMFSWo.mjs → planner-CSboZram.mjs} +3 -3
  60. package/lib/{planner-OYwMFSWo.mjs.map → planner-CSboZram.mjs.map} +1 -1
  61. package/lib/planner-CWPqJktz.mjs +2 -0
  62. package/lib/{plugin-system-DInww4H_.mjs → plugin-system-DD0Z9Jvt.mjs} +3 -3
  63. package/lib/{plugin-system-DInww4H_.mjs.map → plugin-system-DD0Z9Jvt.mjs.map} +1 -1
  64. package/lib/{roomle-headless-setup-LoBO7UJe.mjs → roomle-headless-setup-nsoGENQV.mjs} +1 -1
  65. package/lib/{roomle-headless-setup-LoBO7UJe.mjs.map → roomle-headless-setup-nsoGENQV.mjs.map} +1 -1
  66. package/lib/roomle-headless.d.ts +185 -63
  67. package/lib/roomle-headless.js +9 -9
  68. package/lib/{roomle-renderer-DVlJsHYn.mjs → roomle-renderer-BEJNPCKx.mjs} +2 -2
  69. package/lib/roomle-renderer-BEJNPCKx.mjs.map +1 -0
  70. package/lib/roomle-sdk.d.ts +185 -63
  71. package/lib/roomle-sdk.js +6 -6
  72. package/lib/roomle-webgpu-renderer-D5flithq.mjs +1502 -0
  73. package/lib/roomle-webgpu-renderer-D5flithq.mjs.map +1 -0
  74. package/lib/{scene-renderer-BHZrQYAH.mjs → scene-renderer-Dm1kij1z.mjs} +26 -26
  75. package/lib/scene-renderer-Dm1kij1z.mjs.map +1 -0
  76. package/lib/{script-loader-X4I-gQl2.mjs → script-loader-DqaDm1FG.mjs} +3 -3
  77. package/lib/{script-loader-X4I-gQl2.mjs.map → script-loader-DqaDm1FG.mjs.map} +1 -1
  78. package/lib/static/packages/workers/generated/budgeteer.sw.js +1 -1
  79. package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/package.json +1 -1
  80. package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/src/embind/configuratorCallback.d.ts +2 -2
  81. package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/src/embind/configuratorCallback.js +1 -1
  82. package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/src/embind/configuratorCallback.js.map +1 -1
  83. package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/src/embind/configuratorCoreInterface.d.ts +18 -6
  84. package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/src/embind/configuratorUtils.js +15 -11
  85. package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/src/embind/configuratorUtils.js.map +1 -1
  86. package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/src/embind/plannerCoreCallback.d.ts +1 -1
  87. package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/src/embind/plannerCoreCallback.js +1 -1
  88. package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/src/embind/plannerCoreCallback.js.map +1 -1
  89. package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/src/embind/plannerCoreInterface.d.ts +21 -12
  90. package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/src/loader/planElementManager.js +1 -1
  91. package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/src/loader/planElementManager.js.map +1 -1
  92. package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/wasm_modern/ConfiguratorKernel.wasm +0 -0
  93. package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/wasm_modern/RoomleCore.js +2 -2
  94. package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/wasm_modern/RoomleCore.wasm +0 -0
  95. package/lib/static/roomle-core-hsc/node_modules/roomle-core-hsc/wasm_modern/RoomleToolsCore.wasm +0 -0
  96. package/lib/{stats-helper-Cv5SoEWT.mjs → stats-helper-D7a7oxnj.mjs} +3 -3
  97. package/lib/{stats-helper-Cv5SoEWT.mjs.map → stats-helper-D7a7oxnj.mjs.map} +1 -1
  98. package/lib/{three.core-mM-jZdgg.mjs → three.core-BmQnspOL.mjs} +819 -816
  99. package/lib/{three.core-mM-jZdgg.mjs.map → three.core-BmQnspOL.mjs.map} +1 -1
  100. package/lib/{three.module-Bmy3sVQ-.mjs → three.module-DkrZwaid.mjs} +455 -455
  101. package/lib/{three.module-Bmy3sVQ-.mjs.map → three.module-DkrZwaid.mjs.map} +1 -1
  102. package/lib/{three.webgpu-BbVYfCDp.mjs → three.webgpu-DLZjhIYv.mjs} +1517 -1517
  103. package/lib/{three.webgpu-BbVYfCDp.mjs.map → three.webgpu-DLZjhIYv.mjs.map} +1 -1
  104. package/lib/three.webgpu-RkQxSIwG.mjs +3 -0
  105. package/lib/{threejs-utils-Bq4pVWBA.mjs → threejs-utils-CrK_gp1x.mjs} +67 -63
  106. package/lib/{threejs-utils-Bq4pVWBA.mjs.map → threejs-utils-CrK_gp1x.mjs.map} +1 -1
  107. package/lib/{tools-core-BRzDdhLJ.mjs → tools-core-CZWgXTFV.mjs} +3 -3
  108. package/lib/{tools-core-BRzDdhLJ.mjs.map → tools-core-CZWgXTFV.mjs.map} +1 -1
  109. package/package.json +1 -1
  110. package/lib/common-utils-qErzZAiR.mjs.map +0 -1
  111. package/lib/component-raycast-helper-C6ptEb0K.mjs.map +0 -1
  112. package/lib/component-raycast-helper-LrhRpeDD.mjs +0 -2
  113. package/lib/configurator-DtvX4JqP.mjs +0 -2
  114. package/lib/dimensioning-helper-BpUreWo2.mjs +0 -2
  115. package/lib/glb-viewer-Cs3i0yb8.mjs.map +0 -1
  116. package/lib/glb-viewer-Dcllu_oG.mjs +0 -2
  117. package/lib/homag-intelligence-CBZujG1I.mjs.map +0 -1
  118. package/lib/main-_HtiLIhS.mjs.map +0 -1
  119. package/lib/material-viewer-BCjg687R.mjs.map +0 -1
  120. package/lib/packages-BhrPUb9k.mjs +0 -4
  121. package/lib/planner-CDJtTG3g.mjs +0 -2
  122. package/lib/roomle-renderer-DVlJsHYn.mjs.map +0 -1
  123. package/lib/roomle-webgpu-renderer-CVxBRv6o.mjs +0 -217
  124. package/lib/roomle-webgpu-renderer-CVxBRv6o.mjs.map +0 -1
  125. package/lib/scene-renderer-BHZrQYAH.mjs.map +0 -1
  126. package/lib/three.webgpu-Bnp8Whu8.mjs +0 -3
@@ -1 +1 @@
1
- {"version":3,"file":"threejs-utils-Bq4pVWBA.mjs","names":[],"sources":["../../packages/common-core/src/utils/math-helper.ts","../../packages/typings/planner-kernel-container.ts","../../packages/typings/planner.ts","../../packages/common-core/src/utils/material-creator.ts","../../../../node_modules/@tweenjs/tween.js/dist/tween.esm.js","../../packages/common-core/src/utils/threejs-utils.ts"],"sourcesContent":["import type { Position2 } from '../common-interfaces';\n\nexport const toRadiant = function (degree: number): number {\n return degree * (Math.PI / 180);\n};\n\nexport const toDegrees = function (radians: number): number {\n return radians * (180 / Math.PI);\n};\n\nexport const moduloPlusMinus180 = function (angle: number): number {\n return angle >= 0\n ? -180 + ((angle + 180) % 360)\n : 180 - ((-angle + 180) % 360);\n};\n\nexport const getIdealDistance = function (\n width: number,\n height: number,\n depth: number,\n fov: number,\n screenWidth: number,\n screenHeight: number,\n): number {\n width = Math.sqrt(width * width + depth * depth);\n const aspectRatio = screenWidth / screenHeight || 1;\n const radianHorizontalFov =\n (2 * Math.atan(Math.tan((fov * Math.PI) / 180 / 2) * aspectRatio) * 180) /\n Math.PI;\n const radianFOV = toRadiant(fov);\n const fitHeightDistance = height / 2 / Math.tan(radianFOV / 2);\n const fitWidthDistance =\n width / (2 * Math.atan((Math.PI * radianHorizontalFov) / 360));\n return Math.max(fitHeightDistance, fitWidthDistance);\n};\n\nexport const round = function (x: number): number {\n return Math.round(x * 1000) / 1000;\n};\n\nexport const getDelta = function (v1: Position2, v2: Position2): number {\n // return Math.sqrt(Math.pow(this._downPosition.y - this._position.y, 2) + Math.pow(this._downPosition.x - this._position.x, 2));\n //this calculation is cheaper than pythagoras\n return Math.abs(v1.y - v2.y) + Math.abs(v1.x - v2.x);\n};\n\nexport const getAngle = function (v1: Position2, v2: Position2): number {\n return Math.atan2(v2.y - v1.y, v2.x - v1.x);\n};\n\nexport const to360Degrees = function (radians: number): number {\n let degrees = toDegrees(radians);\n //normalize to 360 degrees\n if (degrees < 0) {\n degrees = 180 + (180 + degrees);\n }\n return degrees;\n};\n\nexport const angleToKernelRotation = function (angle: number): number {\n let degrees = to360Degrees(angle);\n //shift by 90 degrees\n degrees = (degrees + 270) % 360;\n //return to -180 to +180\n if (degrees > 180) {\n degrees -= 360;\n }\n //invert\n degrees *= -1;\n return toRadiant(degrees);\n};\n","import type {\n ConfiguratorKernelClass,\n KernelAddOnSpot,\n KernelComponent,\n KernelConfiguration,\n KernelDockPairPreview,\n KernelEnum,\n KernelParameter,\n KernelParameterGroup,\n KernelParameterValue,\n KernelParamKeyValuePair,\n KernelPart,\n KernelPartListParameter,\n KernelPlanObject,\n KernelPossibleChild,\n KernelRange,\n KernelVariable,\n KernelVector2f,\n KernelVector3f,\n} from './kernel';\nimport type { PlanInteractionHandler, WallSide } from './planner';\nimport type { Enumify } from '#/common/src/utils/types';\n// eslint-disable-next-line no-unused-vars -- used in declare class extends\nimport type { EmsArray, EmsList, EmsSet } from './ems';\n\nexport declare class PlanObjectList extends EmsList<PlanObjectPtr> {}\n\nexport declare class KernelPlanObjectList extends EmsList<KernelPlanObject> {}\n\ndeclare class ConstructionObjectSet extends EmsSet<ConstructionObject> {}\n\ndeclare class PlanObjectObjectSet extends EmsSet<PlanObjectPtr> {}\n\ndeclare class ExternalReference {\n public getJsObject(): any;\n\n public setJsObject(jsObject: any): void;\n\n public getReference(): number;\n\n public setReference(reference: number): void;\n\n public setSelfPtr(ptr: any): void;\n\n public getSelfPtrRef(): any;\n\n public clearSelfRef(): void;\n}\n\ndeclare class EMSReference {\n public jsObject: any;\n\n public static ptrFromRaw(ptr: number): number;\n\n public getVoidReference(): number;\n\n public setVoidReference(reference: number): void;\n\n public getSelfPtrRef(): number;\n\n public setSelfPtr(ptr: number): void;\n\n public clearSelfReference(): void;\n}\n\nexport class EMSConstant {\n value: number;\n}\n\nabstract class AbstractModel {\n public extRef: number;\n\n public abstract getId(): number;\n}\n\nclass AbstractModelWrapper extends AbstractModel {\n public getId(): number {\n // only for typing\n return 0;\n }\n}\n\ndeclare abstract class PlanElement extends AbstractModelWrapper {\n public isLocked: boolean;\n public isValid: boolean;\n\n public getType(): PlanElementType;\n\n public getCenter(): KernelVector3f;\n}\n\ndeclare abstract class ObjectGroup extends PlanElement {\n public getObjects(): PlanObjectPtr;\n}\n\ndeclare abstract class PlanText extends PlanElement {\n public getText(): string;\n}\n\ndeclare abstract class PlanImage extends PlanElement {\n public url: string;\n public size: KernelVector2f;\n public rotation: KernelVector3f;\n public center: KernelVector3f;\n}\n\ndeclare abstract class PlanMeasure extends PlanElement {\n public getPoint1(): KernelVector3f;\n\n public getPoint2(): KernelVector3f;\n}\n\ndeclare abstract class Node extends PlanElement {\n public getNumberOfConnectedWalls(): number;\n\n public getMaxWallHeight(): number;\n}\n\ndeclare class CatalogItemPtrList extends EmsList<CatalogItem> {}\n\nexport declare class CatalogItem extends AbstractModelWrapper {\n public size: KernelVector3f;\n public layer: number;\n public type: string;\n public configuration: string;\n public orderable: boolean;\n public scaleable: boolean;\n public flipable: boolean;\n}\n\ndeclare class PlanObjectPtrList extends EmsList<PlanObjectPtr> {}\n\ndeclare class PlanObjectPtrVector extends EmsArray<PlanObjectPtr> {}\n\ndeclare abstract class PlanObjectPtr extends AbstractModelWrapper {\n public rotation: KernelVector3f;\n public rgbColor: number;\n public level: number;\n public flipX: boolean;\n public flipY: boolean;\n public fixedZ: boolean;\n public size: KernelVector3f;\n\n public getCatalogItemId(): string;\n\n public getConfigurationRuntimeId(): number;\n\n public getObjectType(): string;\n\n public hasConfiguration(): boolean;\n\n public isConfigurationLoaded(): boolean;\n}\n\ndeclare abstract class ConstructionObject extends PlanObjectPtr {\n public getAttachedWall(): Wall;\n}\n\ndeclare class Wall extends PlanObjectPtr {\n public readonly thickness: number;\n public readonly height: number;\n public readonly minimumHeight: number;\n public readonly maximumHeight: number;\n public readonly leftMaterial: WallMaterial;\n public readonly rightMaterial: WallMaterial;\n\n public getFrom(): Node;\n\n public getTo(): Node;\n\n public getCornerFromLeft(): KernelVector3f;\n\n public getCornerFromRight(): KernelVector3f;\n\n public getCornerToLeft(): KernelVector3f;\n\n public getCornerToRight(): KernelVector3f;\n\n public getAngle(): number;\n\n public getLength(): number;\n\n public getPreferredSide(): { value: Enumify<typeof WALL_SIDES> };\n\n public getAttachedObjects(): PlanObjectObjectSet;\n\n public getCenter(): KernelVector3f;\n\n public getHeightAt(aPoint: KernelVector3f): number;\n\n public getPointWithHeight(aHeight: number): KernelVector3f;\n}\n\ndeclare abstract class Floor extends PlanElement {\n public area: number;\n public material: FloorMaterial;\n\n public getCorners(): typeof EmsArray<KernelVector3f>;\n\n public getTriangulationIndices(): typeof EmsArray<number>;\n\n public getNumberOfTriangles(): number;\n\n public getRandomPointInside(): KernelVector3f;\n}\n\nexport declare abstract class BaseMaterial {\n public catalogItemId: string;\n public materialId: string;\n public rgbValue: number;\n public useCustomColor: boolean;\n\n public getCatalogItemId(): string;\n\n public getSourceType(): KernelEnum;\n}\n\ndeclare abstract class FloorMaterial extends BaseMaterial {\n public uvScale(): KernelVector3f;\n\n public rotation(): KernelVector3f;\n}\n\ndeclare abstract class WallMaterial extends BaseMaterial {\n // HAS NO SPECIAL PROPERTIES\n}\n\ninterface KernelCube {\n origin: KernelVector3f;\n size: KernelVector3f;\n}\n\ndeclare abstract class Plan extends AbstractModelWrapper {\n public defaultParapetHeight: number;\n public defaultWallColor: number;\n public defaultWallHeight: number;\n public defaultWallThickness: number;\n\n public increaseLockLevels(): void;\n\n public getPlanXML(): string;\n\n public getPlanXMLWithNormalizedLockLevels(): string;\n\n public getBounds(): KernelCube;\n\n public getPlanObjects(): PlanObjectPtrVector;\n\n public getWallCount(): number;\n\n public getImageCount(): number;\n\n public isEmpty(): boolean;\n\n public getTotalFloorArea(): number;\n\n public applySettings(aRoomHeight: number, aParapetHeight: number): void;\n\n public syncToView(): void;\n}\n\ndeclare abstract class PlanModelViewHelper {\n public static requestMesh3d(aPlanElement: PlanElement): void;\n\n public static requestPlanMesh3d(\n aPlanElement: PlanElement,\n includeCeiling: boolean,\n ): void;\n\n public static requestWallMesh2d(aWall: Wall): void;\n\n public static requestFloorMesh2d(aFloor: Floor): void;\n\n public static getCeilingHeight(aFloor: Floor): number;\n\n public static getMaxDistToBorderForPlanObject(\n aPlanObject: PlanObjectPtr,\n ): number;\n\n public static getDistToNextWallOnSide(\n anObject: PlanObjectPtr,\n aSide: PlanObjectSide,\n maxDist: number,\n ): number;\n\n public static getDistAlongWallOnSide(\n anObject: ConstructionObject,\n aSide: PlanObjectSide,\n aWallSide: WallSide,\n ): number;\n\n public static setDrawHiddenWallCaps(drawHiddenWallCaps: boolean): void;\n}\n\ndeclare class PointArray extends EmsArray<KernelVector3f> {}\n\ndeclare class SizeTArray extends EmsArray<number> {}\n\nexport const enum PlanElementType {\n NODE,\n WALL,\n OBJECT,\n FLOOR,\n TEXT,\n MEASURE,\n IMAGE,\n CEILING,\n}\n\nexport const enum PlanObjectSide {\n Back,\n Front,\n Left,\n Right,\n}\n\nexport const WALL_SIDES = {\n LEFT: 0,\n RIGHT: 1,\n MIDDLE: 2,\n} as const;\n\nexport interface WallExtensionType {\n ExtendBegin: EMSConstant;\n ExtendEnd: EMSConstant;\n ExtendBoth: EMSConstant;\n}\n\nexport const enum MaterialSourceType {\n None,\n CatalogItem, // eslint-disable-line\n Material,\n RgbValue,\n}\n\nexport const enum DrawingType {\n CONTINOUS,\n CLICK_PER_CLICK,\n}\n\nexport const enum SnapMode {\n OFF,\n ON_COLLISION,\n ON_COLLISION_ROTATE_WITHIN_DISTANCE,\n WITHIN_SNAP_DISTANCE,\n}\n\nexport const enum ResizingAnchor {\n Center,\n BackLeft,\n BackRight,\n FrontLeft,\n FrontRight,\n Back,\n Front,\n Left,\n Right,\n}\n\ndeclare class StringArray extends EmsArray<string> {}\n\ndeclare class Vector2fArray extends EmsArray<KernelVector2f> {}\n\ndeclare class LongArray extends EmsArray<number> {}\n\ndeclare class DockPairPreviewArray extends EmsArray<KernelDockPairPreview> {}\n\ndeclare class ComponentArray extends EmsArray<KernelComponent> {}\n\nconst enum Type {\n UNKNOWN,\n INTEGRAL,\n DECIMAL,\n STRING,\n MATERIAL,\n}\n\nconst enum UnitType {\n LENGTH,\n AREA,\n ANGLE,\n COUNT,\n}\n\ndeclare class VariableArray extends EmsArray<KernelVariable> {}\n\ndeclare class RangeArray extends EmsArray<KernelRange> {}\n\ndeclare class ParameterValueArray extends EmsArray<KernelParameterValue> {}\n\ndeclare class ParameterArray extends EmsArray<KernelParameter> {}\n\ndeclare class ParameterGroupArray extends EmsArray<KernelParameterGroup> {}\n\ndeclare class PartListParameterArray extends EmsArray<KernelPartListParameter> {}\n\ndeclare class ConfigurationArray extends EmsArray<KernelConfiguration> {}\n\ndeclare class PartArray extends EmsArray<KernelPart> {}\n\ndeclare class PossibleChildArray extends EmsArray<KernelPossibleChild> {}\n\ndeclare class AddOnSpotArray extends EmsArray<KernelAddOnSpot> {}\n\ndeclare class ParamKeyValuePairArray extends EmsArray<KernelParamKeyValuePair> {}\n\ndeclare class IntArray extends EmsArray<number> {}\n\nconst enum Unit {\n InchFeet,\n MM,\n CM,\n}\n\nconst enum UnitStringType {\n NoUnitString,\n LongUnitString,\n ShortUnitString,\n}\n\ndeclare class UnitMeasureFormatter {\n public init(\n mmLabel: string /* default 'mm' */,\n cmLabel: string /* default 'cm' */,\n ftShortLabel: string /* default ' */,\n ftLongLabel: string /* default 'ft' */,\n inchShortLabel: string /* default \" */,\n inchLongLabel: string /* default 'inch' */,\n sqMLabel: string /* default 'm²' */,\n sqftLabel: string /* default 'sqft' */,\n showExactValue: boolean /* default false */,\n maxPrecision: number /* default 6 */,\n showFractionalUnitString: boolean /* default true */,\n ): void;\n\n public showExactValues(shouldeI: boolean): void;\n\n public formatMMValueToUnitString(\n aValue: number,\n aUnit: Unit,\n aStringType: UnitStringType,\n ): string;\n\n public formatMMValueWithReqMaxLength(\n aValue: number,\n aUnit: Unit,\n reqMaxSize: number,\n ): string;\n\n public parseMMValueFromUnitString(aString: string, aUnit: Unit): number;\n\n public formatSquareMMValueToUnitString(aValue: number, aUnit: Unit): string;\n\n public parseSquareMMValueFromUnitString(aString: string, aUnit: Unit): number;\n\n public isParseableUnitString(aString: string, aUnit: Unit): boolean;\n\n public parseNumber(aString: string): number;\n\n public formatNumber(aValue: number, digit: number /* default 0 */): string;\n\n public isParseableNumber(aString: string): boolean;\n}\n\nexport interface PlannerKernelContainer {\n PointArray: PointArray;\n SizeTArray: SizeTArray;\n ConstructionObjectSet: ConstructionObjectSet;\n PlanObjectObjectSet: PlanObjectObjectSet;\n ExternalReference: ExternalReference;\n EMSReference: EMSReference;\n AbstractModel: AbstractModel;\n PlanElementType: PlanElementType;\n PlanElement: PlanElement;\n ObjectGroup: ObjectGroup;\n PlanText: PlanText;\n PlanImage: PlanImage;\n PlanMeasure: PlanMeasure;\n Node: Node;\n CatalogItemPtrList: CatalogItemPtrList;\n CatalogItem: CatalogItem;\n PlanObjectSide: PlanObjectSide;\n toPlanObjectSide: (a: number) => PlanObjectSide;\n PlanObjectPtrList: PlanObjectPtrList;\n PlanObjectPtrVector: PlanObjectPtrVector;\n PlanObject: PlanObjectPtr;\n ConstructionObject: ConstructionObject;\n ConstObjectPtr: ConstructionObject;\n WallSide: WallSide;\n toWallSide: (a: number) => WallSide;\n WallExtensionType: WallExtensionType;\n Wall: Wall;\n Floor: Floor;\n MaterialSourceType: MaterialSourceType;\n BaseMaterial: BaseMaterial;\n FloorMaterial: FloorMaterial;\n WallMaterial: WallMaterial;\n Plan: Plan;\n DrawingType: DrawingType;\n ResizingAnchor: ResizingAnchor;\n toResizingAnchor: (a: number) => ResizingAnchor;\n PlanInteractionHandler: PlanInteractionHandler;\n PlanModelViewHelper: PlanModelViewHelper;\n catalogItemLoaded: (aCatalogItem: CatalogItem) => void;\n registerPlannerCallback: (callbacksObject: any) => void;\n unregisterPlannerCallback: (callbacksObject: any) => void;\n StringArray: StringArray;\n Vector2fArray: Vector2fArray;\n LongArray: LongArray;\n DockPairPreviewArray: DockPairPreviewArray;\n ComponentArray: ComponentArray;\n Type: Type;\n UnitType: UnitType;\n VariableArray: VariableArray;\n RangeArray: RangeArray;\n ParameterValueArray: ParameterValueArray;\n ParameterArray: ParameterArray;\n ParameterGroupArray: ParameterGroupArray;\n PartListParameterArray: PartListParameterArray;\n ConfigurationArray: ConfigurationArray;\n PartArray: PartArray;\n PossibleChildArray: PossibleChildArray;\n AddOnSpotArray: AddOnSpotArray;\n PlanObjectList: PlanObjectList;\n ParamKeyValuePairArray: ParamKeyValuePairArray;\n IntArray: IntArray;\n Kernel: ConfiguratorKernelClass;\n Unit: Unit;\n UnitStringType: UnitStringType;\n toUnit: (enumIndex: number) => Unit;\n toUnitFormat: (enumIndex: number) => UnitStringType;\n UnitMeasureFormatter: UnitMeasureFormatter;\n}\n","import type {\n ConfigurationUniqueIdAndHash,\n ConfiguratorKernelClass,\n KernelCatalogItem,\n KernelCube,\n KernelEnum,\n KernelObjectPtrList,\n KernelPlanObject,\n KernelPlanObjectComponent,\n KernelVector3,\n KernelVector3f,\n ObjectGroupPtr,\n RuntimeId,\n} from './kernel';\nimport type {\n DrawingType,\n KernelPlanObjectList,\n PlanObjectList,\n ResizingAnchor,\n SnapMode,\n WALL_SIDES,\n EMSConstant,\n} from './planner-kernel-container';\nimport type { Position2 } from '../common-core/src/common-interfaces';\nimport type { Enumify } from '#/common/src/utils/types';\n// --experimental-modules does not have support for named exports yet\n// import * as ems from './ems';\nimport type { ConstructionObjectDoorArchArray } from 'roomle-core-hsc/src/embind/plannerCoreInterface';\nimport type { PosContour } from '../homag-intelligence/src/model/oc-scripts-domain.model';\n\n// eslint-disable-next-line no-unused-vars -- used in declare class extends\nimport type { EmsArray } from './ems';\n\nexport interface EMSReference {\n jsObject: any;\n\n delete(): any;\n}\n\n// KernelObject = AbstractModel in Core (Kernel)\nexport interface KernelObject {\n extRef: EMSReference | null;\n\n clone(): KernelObject;\n\n delete(): void;\n\n getId(): number;\n}\n\nexport const INITIAL_SNAP_DISTANCE = 50;\n\nexport interface Plan extends KernelObject {\n defaultParapetHeight: number;\n defaultWallHeight: number;\n defaultWallThickness: number;\n vectorWallThickness: number;\n\n getPlanObjects(): any;\n\n getBounds(): KernelCube;\n\n getTotalFloorArea(): number;\n\n getPlanXML(\n includeRuntimeId: boolean,\n xmlVersion: number /** current version is 2 */,\n ): string;\n\n createPlanXmlWithSingleObject(\n object: PlanObject,\n includeRuntimeId: boolean,\n version: number,\n ): string;\n\n createPlanXmlWithObjects(\n objectId: string | string[],\n includeRuntimeId: boolean,\n version: number,\n ): string;\n\n getRotationForFrontView(objectIds: number | number[]): number;\n\n getWallCount(): number;\n\n getId(): number;\n}\n\nexport interface PlanElement extends KernelObject {\n getType(): any;\n\n getCenter(): KernelVector3;\n\n getMeshCenter(): KernelVector3;\n\n getMeshOffsetRelativeToObject(): KernelVector3;\n\n getId(): number;\n\n getCustomDataJson(): string;\n\n readonly hidden: boolean;\n}\n\nexport interface RectangleReferencePoints {\n bottom: KernelVector3;\n bottomLeft: KernelVector3;\n bottomRight: KernelVector3;\n center: KernelVector3;\n left: KernelVector3;\n right: KernelVector3;\n top: KernelVector3;\n topLeft: KernelVector3;\n topRight: KernelVector3;\n}\n\nexport interface ObjectToWallLine {\n angle: number;\n endPoint: KernelVector3;\n length: number;\n startPoint: KernelVector3;\n}\n\ndeclare class PointArray extends EmsArray<KernelVector3f> {}\n\ndeclare class ObjectToWallLineArray extends EmsArray<ObjectToWallLine> {}\n\nexport interface Rectangle {\n angle: number;\n center: KernelVector3f;\n cornerPoints: PointArray;\n referencePoints: RectangleReferencePoints;\n size: KernelVector3f;\n}\n\nexport interface ObjectFrontRotation {\n lookAtSide: WallSide;\n rotation: number;\n rotationRoundTo90deg: number;\n}\n\nexport interface PlanObject extends PlanElement {\n size: KernelVector3;\n rotation: number;\n customLabel: string;\n rgbColor: number;\n useCustomColor?: boolean;\n flipX: boolean;\n flipY: boolean;\n fixedZ: boolean;\n boxForMeasurement: KernelCube;\n\n hasConfiguration(): boolean;\n\n isExternalObject(): boolean;\n\n retrieveConfigurationId(): ConfigurationUniqueIdAndHash;\n\n getConfiguration(): string;\n\n getCatalogItemId(): string;\n\n getConfigurationRuntimeId(): number;\n\n getObjectType(): string;\n\n getWallDistances(): ObjectToWallLineArray;\n\n getRectangle(): Rectangle;\n\n getRotationToPreferredFront(): ObjectFrontRotation;\n\n isRootComponentOfChildObject(componentRuntimeId: number): boolean;\n}\n\nexport interface WallSide {\n value: Enumify<typeof WALL_SIDES>;\n}\n\nexport interface LeftOrRightWallSide {\n value: Enumify<Pick<typeof WALL_SIDES, 'LEFT' | 'RIGHT'>>;\n}\n\nexport interface WallMeasurementsFactors {\n maxZoomedIn: number;\n maxZoomedOut: number;\n minPadding: number;\n maxPadding: number;\n}\n\nexport interface PlanMeasure extends PlanObject {\n getPoint1(): KernelVector3f;\n\n getPoint2(): KernelVector3f;\n}\n\nexport interface WallPlanObject extends PlanObject {\n getPreferredSide(): LeftOrRightWallSide;\n\n getCornerFromLeft(): KernelVector3;\n\n getCornerFromRight(): KernelVector3;\n\n getCornerToLeft(): KernelVector3;\n\n getCornerToRight(): KernelVector3;\n\n getCenter(): KernelVector3;\n\n getLength(preferredSide: WallSide): number;\n\n getFrom(): NodePlanObject;\n\n getTo(): NodePlanObject;\n\n getAttachedAttics(): KernelAtticArray;\n\n readonly thickness: number;\n readonly height: number;\n}\n\nexport interface ConstructionPlanObject extends PlanObject {\n getAttachedWall(): WallPlanObject;\n\n getPreferredSide(): LeftOrRightWallSide;\n\n getCornerFromLeft(): KernelVector3;\n\n getCornerFromRight(): KernelVector3;\n\n getCornerToLeft(): KernelVector3;\n\n getCornerToRight(): KernelVector3;\n\n getDoorArches(): ConstructionObjectDoorArchArray;\n}\n\nexport interface NodePlanObject extends PlanObject {\n getNumberOfConnectedWalls(): number;\n\n getMaxWallHeight(): number;\n}\n\nexport interface ContinuousDrawingManager {\n getStartPoint(): KernelVector3;\n\n getDrawingAngle(): number;\n\n getCircleRotation(): number;\n\n shouldShowCircle(): boolean;\n\n isCorridorValid(): boolean;\n\n getCorridor(): any;\n\n getDrawnPoints(): PointArray;\n\n CIRCLE_RADIUS: number;\n}\n\ninterface Anchor {\n value: ResizingAnchor;\n}\n\nexport const CORE_TYPE_OF_CORE_ID = {\n CONFIGURATOR: 0,\n PLANNER: 1,\n} as const;\n\nexport interface TypeOfCoreId {\n value: Enumify<typeof CORE_TYPE_OF_CORE_ID>;\n}\n\nexport interface ExternalObjectLoadingIdMap {\n originalModuleId: string;\n newModuleId: string;\n}\n\nexport interface ExternalObjectLoadConfiguration {\n applyGlobalChildMode: boolean;\n correctArrangement: boolean;\n findFreeSpaceInPlan: boolean;\n isVisible: boolean;\n respondWithPositionInPlan: boolean;\n lockCallbacks: boolean;\n tryToMergeNewGroups: boolean;\n moduleIdMap: ExternalObjectLoadingIdMap[];\n}\n\nexport interface ExternalValidContainerModule {\n containerModuleId: string;\n parentModuleId: string;\n rootId: string;\n}\n\nexport interface PlanInteractionHandler {\n init(\n reference: PlanInteractionHandler,\n zoomFactor: number,\n viewSnapDist: number,\n wallSnapMode: any,\n objectSnapMode: any,\n shouldSnap: boolean,\n drawingType: any,\n ): PlanInteractionHandler;\n\n getConfiguratorKernel(): ConfiguratorKernelClass;\n\n loadPlanXML(xml: string): Plan;\n\n createPlanWithObjectFromItem(\n object: KernelObject,\n position: KernelVector3,\n rotationInRad: number,\n ): Plan;\n\n getPlan(): Plan;\n\n moveElementTo(\n planObject: KernelObject,\n targetPosition: KernelVector3,\n cameraPosition?: KernelVector3,\n ): void;\n\n moveElementToIn2d(\n planObject: KernelObject,\n targetPosition: KernelVector3,\n dragging: boolean,\n ): void;\n\n moveElementBy(planObject: KernelObject, distance: KernelVector3): void;\n\n duplicatePlanObject(\n object: PlanObject,\n count: number,\n findFreeSpaceInPlan: boolean,\n ): PlanObject[];\n\n duplicatePlanObjects(\n objects: PlanObjectList,\n count: number,\n findFreeSpaceInPlan: boolean,\n ): PlanObject[];\n\n setElementVisibility(element: PlanElement, isVisible: boolean): void;\n\n moveObjectsBy(\n planObjects: KernelObjectPtrList,\n distance: KernelVector3,\n ): void;\n\n rotateObjectTo(planObject: KernelObject, angleInRad: number): void;\n\n setObjectRotation(planObject: KernelObject, angleInRad: number): void;\n\n addPlanObjects(\n list: KernelObjectPtrList,\n findFreeSpaceInPlan: boolean,\n ): PlanObject[];\n\n addPlanObjectFromItem(\n object: KernelObject,\n position: KernelVector3,\n type: number,\n findFreeSpaceInPlan: boolean,\n ): PlanObject;\n\n addOrUpdateExternalPlanObjects(\n serialzedConfiguration: string | string[],\n position: KernelVector3,\n rotationInRad: number,\n updateConfiguration: ExternalObjectLoadConfiguration,\n mergedGroupIds: string | string[],\n ): PlanObject[];\n\n createPreviewGeometryForAddOn(\n objectId: string,\n articleId: string,\n groupDefinitions: string,\n validContainerModules: ExternalValidContainerModule[],\n ): void;\n\n catalogItemLoaded(catalogItem: KernelCatalogItem): void;\n\n removeElement(planObject: KernelObject): void;\n\n removeObjectWithId(objectId: string): void;\n\n mergeObjects(objects: PlanObjectList): void;\n\n groupObjects(planObjectPtrList: PlanObjectList): ObjectGroupPtr;\n\n rotateObjectsBy(\n planObjectPtrList: PlanObjectList,\n anAngleInRad: number,\n aroundPoint: KernelVector3,\n ): void;\n\n rotateGroupBy(\n group: ObjectGroupPtr,\n anAngleInRad: number,\n aroundPoint: KernelVector3,\n ): void;\n\n deactivateAllSnappingActivity(): void;\n\n reactivateAllSnappingActivity(): void;\n\n isUndoPossible(): boolean;\n\n isRedoPossible(): boolean;\n\n clearHistory(): void;\n\n startInteraction(): void;\n\n resumeInteraction(): void;\n\n endInteraction(): void;\n\n undo(): void;\n\n redo(): void;\n\n isVectorPreviewModeEnabled(): boolean;\n\n sCreateUnclosedSpaceEnabled(): boolean;\n\n beginDrawing(\n point: { x: number; y: number; z: number },\n vectorPreviewMode: boolean,\n createUnclosedSpace: boolean,\n ): void;\n\n endDrawing(point: { x: number; y: number; z: number }): void;\n\n cancelDrawing(): void;\n\n addNode(point: { x: number; y: number; z: number }): PlanNode;\n\n addWall(from: PlanNode, to: PlanNode): KernelWall;\n\n setWallHeight(wall: KernelWall, height: number): void;\n\n setLengthOfWall(\n wall: KernelWall,\n length: number,\n preferredSide: WallSide,\n direction: EMSConstant,\n moveOrthogonalWalls: boolean,\n ): void;\n\n setWallThickness(wall: KernelWall, thickness: number): void;\n\n addAttic(\n wall: KernelWall,\n kneeHeight: number,\n width: number,\n side: WallSide | null | undefined,\n ): KernelAttic;\n\n setAtticSide(attic: KernelAttic, side: WallSide): void;\n\n setAtticKneeHeight(attic: KernelAttic, kneeHeight: number): void;\n\n setAtticWidth(attic: KernelAttic, width: number): void;\n\n currentDrawingPosition(point: { x: number; y: number; z: number }): void;\n\n forceNode(point: { x: number; y: number; z: number }): void;\n\n setDrawingType(aNewDrawingType: DrawingType): void;\n\n setZoomFactor(pxPerMM: number): void;\n\n setViewSnapDist(aDist: number): void;\n\n setRotationSnapAngle(angleInRadians: number): void;\n\n setDefaultWallThickness(wallThickness: number, applyToAll: boolean): void;\n\n setDefaultWallHeight(wallHeight: number, applyToAll: boolean): void;\n\n setDefaultParapetHeight(parapetHeight: number, applyToAll: boolean): void;\n\n setRoomParapetHeight(floor: KernelFloor, parapetHeight: number): void;\n\n getDefaultExteriorWallMaterial(): KernelWallMaterial;\n\n setDefaultExteriorWallMaterial(wallMaterial: KernelWallMaterial): void;\n\n getDefaultInteriorWallMaterial(): KernelWallMaterial;\n\n setDefaultInteriorWallMaterial(wallMaterial: KernelWallMaterial): void;\n\n getDefaultFloorMaterial(): KernelFloorMaterial;\n\n setDefaultFloorMaterial(floorMaterial: KernelFloorMaterial): void;\n\n setElementCustomDataJson(element: PlanElement, customDataJson: string): void;\n\n setWallLeftMaterial(wall: KernelWall, material: KernelWallMaterial): void;\n\n setWallRightMaterial(wall: KernelWall, material: KernelWallMaterial): void;\n\n setFloorMaterial(floor: KernelFloor, material: KernelFloorMaterial): void;\n\n setFloorLabelObject(floor: KernelFloor, serializedLabelObject: string): void;\n\n getContinuousDrawingManager(): ContinuousDrawingManager;\n\n setSnapFeedbackWhileDrawing(enabled: boolean): void;\n\n consistsOfMergedComponents(object: KernelObject): boolean;\n\n setObjectSize(\n anObject: KernelObject,\n aNewSize: KernelVector3,\n anAnchor: Anchor,\n ): void;\n\n setObjectFlipX(anObject: KernelObject, shouldFlipX: boolean): void;\n\n setObjectFlipY(anObject: KernelObject, shouldFlipY: boolean): void;\n\n setObjectCustomColor(\n object: PlanObject,\n rgbColor: number,\n useCustomColor: boolean,\n ): void;\n\n setObjectCustomLabel(object: PlanObject, label: string): void;\n\n setObjectFixedZ(anObject: KernelObject, shouldFlipZ: boolean): void;\n\n setMeasurePoint1(\n measure: PlanMeasure,\n point: KernelVector3f,\n snapToWalls: boolean,\n snapToObjects: boolean,\n ): void;\n\n setMeasurePoint2(\n measure: PlanMeasure,\n point: KernelVector3f,\n snapToWalls: boolean,\n snapToObjects: boolean,\n ): void;\n\n addMeasure(\n startPosition: KernelVector3f,\n endPosition: KernelVector3f,\n ): PlanMeasure;\n\n setDiscardExternalObjectsOnLoad(discard: boolean): void;\n\n isChildObjectModePossible(object: KernelObject): boolean;\n\n isEnabledChildObjectMode(object: KernelObject): boolean;\n\n enableChildObjects(\n object: KernelObject,\n switchChildModeOffForAllOtherObjects: boolean,\n ): KernelObject;\n\n disableChildObjects(object: KernelObject): KernelObject;\n\n enableChildObjectsOfExternalObject(\n objectId: string,\n switchChildModeOffForAllOtherObjects: boolean,\n ): KernelObject;\n\n disableChildObjectsOfExternalObject(objectId: string): KernelObject;\n\n disableChildObjectsOfAllPlanObjects(): void;\n\n unit: string;\n enableRaster: boolean;\n customRaster: number;\n enableSnap: boolean;\n enableDrawingSnap: boolean;\n objectToWallSnapMode: SnapMode;\n objectToObjectSnapMode: SnapMode;\n dockWhenSnap: boolean;\n unDockOnMove: boolean;\n}\n\nexport interface PlanOverview {\n area: number;\n bounds: KernelCube;\n objects: KernelPlanObjectList;\n outsideWalls: PlanElement[];\n rooms: PlanElement[];\n}\n\nexport interface KernelObjectConfiguration {\n runtimeId: number;\n serializedDefinition: string;\n uniqueId: string;\n}\n\nexport declare class KernelObjectConfigurationArray extends EmsArray<KernelObjectConfiguration> {}\n\nexport interface LightSourceConfiguration {\n lightSourceAreaInSquareMeters: number;\n minimumRoomSizeInSquareMeters: number;\n maximumNumberOfLightSources: number;\n}\n\nexport interface RoomLightSourceDistribution {\n ceilingId: number;\n floorId: number;\n positionsInPlan: PointArray;\n positionsRelativeToFloor: PointArray;\n}\n\ndeclare class RoomLightSourceDistributionArray extends EmsArray<RoomLightSourceDistribution> {}\n\ndeclare class RoomGeometryArray extends EmsArray<PosContour> {}\n\nexport interface RoomInformation {\n rooms: RoomGeometryArray;\n}\n\nexport const CORE_HELP_LINE_TYPE = {\n NONE: 0,\n WALL_SNAP_LEVEL: 1,\n WALL_SNAP_LEVEL_SNAPPED: 2,\n WALL_EDGE: 3,\n DOCKING_VECTOR: 4,\n OBJECT_CONTOUR: 5,\n} as const;\n\nexport interface HelpLineType {\n value: Enumify<typeof CORE_HELP_LINE_TYPE>;\n}\n\nexport interface GeometryHelpLine {\n end: KernelVector3f;\n start: KernelVector3f;\n type: HelpLineType;\n}\n\ndeclare class GeometryHelpLineArray extends EmsArray<GeometryHelpLine> {}\n\nexport const CORE_SNAP_STATE = {\n DEFAULT: 0,\n DOCKING: 1,\n COLLISION: 2,\n} as const;\n\nexport interface SnapState {\n value: Enumify<typeof CORE_SNAP_STATE>;\n}\n\nexport interface ObjectSnapInformation {\n geometryHelpLines: GeometryHelpLineArray;\n snapState: SnapState;\n}\n\nexport interface PlanModelViewHelper {\n getPlanOverview(planObject: KernelObject): PlanOverview;\n\n getPlanObject(plan: Plan, aRuntimeId: number): KernelPlanObject;\n\n isChildObjectRootComponent(plan: Plan, componentRuntimeId: number): boolean;\n\n isAnimationRootComponent(plan: Plan, componentRuntimeId: number): boolean;\n\n getRootPlanObjectId(plan: Plan, aRuntimeId: number): number;\n\n getObjectComponent(\n plan: Plan,\n typeOfId: TypeOfCoreId,\n anId: number,\n ): KernelPlanObjectComponent;\n\n getExternalObjectComponent(\n plan: Plan,\n groupId: string,\n moduleId: string,\n ): KernelPlanObjectComponent;\n\n requestMesh3d(element: PlanElement): void;\n\n getExternalObjectGroups(plan: Plan): KernelObjectConfigurationArray;\n\n getExternalRoomInformation(plan: Plan): RoomInformation;\n\n calculateLightSourceDistribution(\n plan: Plan,\n lightSourceConfiguration: LightSourceConfiguration,\n ): RoomLightSourceDistributionArray;\n\n getObjectSnapInformation(\n anObject: PlanObject,\n debugHelpLines: boolean,\n ): ObjectSnapInformation;\n}\n\nexport interface PlanNode extends KernelObject {\n getMaxWallHeight(): number;\n\n getNumberOfConnectedWalls(): number;\n}\n\nexport interface KernelWallMaterial extends KernelObject {\n catalogItemId: string;\n materialId: string;\n rgbValue: number;\n useCustomColor: boolean;\n}\n\nexport interface KernelFloorMaterial extends KernelObject {\n catalogItemId: string;\n materialId: string;\n rgbValue: number;\n rotation: number;\n useCustomColor: boolean;\n}\n\nexport const enum KernelWallType {\n StandAloneWall,\n OuterWallLeft, // has a floor on the right side but not on the left side\n OuterWallRight, // has a floor on the left side but not on the right side\n InnerWall,\n}\n\nexport interface KernelWall extends KernelObject {\n getFrom(): Node;\n getTo(): Node;\n getAttachedAttics(): KernelAtticArray;\n readonly thickness: number;\n readonly meshThickness: number;\n readonly isVectorWall: boolean;\n readonly height: number;\n readonly leftMaterial: KernelWallMaterial;\n readonly rightMaterial: KernelWallMaterial;\n readonly wallType: KernelEnum;\n readonly leftNormal: KernelVector3;\n readonly rightNormal: KernelVector3;\n getAngle: () => number;\n}\n\nexport interface KernelRoomWall {\n roomSide: WallSide;\n wall: KernelWall;\n}\n\ndeclare class KernelAtticArray extends EmsArray<KernelAttic> {}\n\nexport interface KernelAttic extends KernelObject {\n getFrom(): NodePlanObject;\n getTo(): NodePlanObject;\n getAssociatedWall(): KernelWall;\n get2dPolygon(): PointArray;\n getRidgePoints(): PointArray;\n getPointsWithHeight(height: number): PointArray;\n readonly side: WallSide;\n readonly kneeHeight: number;\n readonly width: number;\n}\n\nexport interface KernelFloor extends KernelObject {\n area: number;\n material: KernelFloorMaterial;\n readonly parapetHeight: number;\n getCenter: () => KernelVector3;\n getRandomPointInside: () => KernelVector3;\n getLabelPosition: () => KernelVector3;\n getWallsOfRoom: () => KernelRoomWall[];\n getLabelObject(): string;\n}\n\nexport interface PlanObjectPosition {\n runtimeIds: RuntimeId[];\n position2d: Position2;\n}\n\nexport type CancelSelectionReasons =\n | 'swap_object'\n | 'dragIn'\n | 'click_outside'\n | 'select_other'\n | 'double_click_wall'\n | 'unknown'\n | 'dock_component'\n | 'delete_object'\n | 'selection_mode_changed'\n | 'dock_preview'\n | 'reset_scene'\n | 'delete_component'\n | 'isolation_mode_cancelled'\n | 'isolation_mode_started'\n | 'duplicate'\n | 'undo'\n | 'redo';\n","import { MeshPhysicalMaterial, MeshStandardMaterial } from 'three';\n\nexport default class MaterialCreator {\n public static createMeshPhysicalMaterial(params: { [key: string]: any }) {\n return new MeshPhysicalMaterial(params);\n }\n\n public static createMeshStandardMaterial(params: { [key: string]: any }) {\n return new MeshStandardMaterial(params);\n }\n}\n","/**\n * The Ease class provides a collection of easing functions for use with tween.js.\n */\nvar Easing = Object.freeze({\n Linear: Object.freeze({\n None: function (amount) {\n return amount;\n },\n In: function (amount) {\n return amount;\n },\n Out: function (amount) {\n return amount;\n },\n InOut: function (amount) {\n return amount;\n },\n }),\n Quadratic: Object.freeze({\n In: function (amount) {\n return amount * amount;\n },\n Out: function (amount) {\n return amount * (2 - amount);\n },\n InOut: function (amount) {\n if ((amount *= 2) < 1) {\n return 0.5 * amount * amount;\n }\n return -0.5 * (--amount * (amount - 2) - 1);\n },\n }),\n Cubic: Object.freeze({\n In: function (amount) {\n return amount * amount * amount;\n },\n Out: function (amount) {\n return --amount * amount * amount + 1;\n },\n InOut: function (amount) {\n if ((amount *= 2) < 1) {\n return 0.5 * amount * amount * amount;\n }\n return 0.5 * ((amount -= 2) * amount * amount + 2);\n },\n }),\n Quartic: Object.freeze({\n In: function (amount) {\n return amount * amount * amount * amount;\n },\n Out: function (amount) {\n return 1 - --amount * amount * amount * amount;\n },\n InOut: function (amount) {\n if ((amount *= 2) < 1) {\n return 0.5 * amount * amount * amount * amount;\n }\n return -0.5 * ((amount -= 2) * amount * amount * amount - 2);\n },\n }),\n Quintic: Object.freeze({\n In: function (amount) {\n return amount * amount * amount * amount * amount;\n },\n Out: function (amount) {\n return --amount * amount * amount * amount * amount + 1;\n },\n InOut: function (amount) {\n if ((amount *= 2) < 1) {\n return 0.5 * amount * amount * amount * amount * amount;\n }\n return 0.5 * ((amount -= 2) * amount * amount * amount * amount + 2);\n },\n }),\n Sinusoidal: Object.freeze({\n In: function (amount) {\n return 1 - Math.sin(((1.0 - amount) * Math.PI) / 2);\n },\n Out: function (amount) {\n return Math.sin((amount * Math.PI) / 2);\n },\n InOut: function (amount) {\n return 0.5 * (1 - Math.sin(Math.PI * (0.5 - amount)));\n },\n }),\n Exponential: Object.freeze({\n In: function (amount) {\n return amount === 0 ? 0 : Math.pow(1024, amount - 1);\n },\n Out: function (amount) {\n return amount === 1 ? 1 : 1 - Math.pow(2, -10 * amount);\n },\n InOut: function (amount) {\n if (amount === 0) {\n return 0;\n }\n if (amount === 1) {\n return 1;\n }\n if ((amount *= 2) < 1) {\n return 0.5 * Math.pow(1024, amount - 1);\n }\n return 0.5 * (-Math.pow(2, -10 * (amount - 1)) + 2);\n },\n }),\n Circular: Object.freeze({\n In: function (amount) {\n return 1 - Math.sqrt(1 - amount * amount);\n },\n Out: function (amount) {\n return Math.sqrt(1 - --amount * amount);\n },\n InOut: function (amount) {\n if ((amount *= 2) < 1) {\n return -0.5 * (Math.sqrt(1 - amount * amount) - 1);\n }\n return 0.5 * (Math.sqrt(1 - (amount -= 2) * amount) + 1);\n },\n }),\n Elastic: Object.freeze({\n In: function (amount) {\n if (amount === 0) {\n return 0;\n }\n if (amount === 1) {\n return 1;\n }\n return -Math.pow(2, 10 * (amount - 1)) * Math.sin((amount - 1.1) * 5 * Math.PI);\n },\n Out: function (amount) {\n if (amount === 0) {\n return 0;\n }\n if (amount === 1) {\n return 1;\n }\n return Math.pow(2, -10 * amount) * Math.sin((amount - 0.1) * 5 * Math.PI) + 1;\n },\n InOut: function (amount) {\n if (amount === 0) {\n return 0;\n }\n if (amount === 1) {\n return 1;\n }\n amount *= 2;\n if (amount < 1) {\n return -0.5 * Math.pow(2, 10 * (amount - 1)) * Math.sin((amount - 1.1) * 5 * Math.PI);\n }\n return 0.5 * Math.pow(2, -10 * (amount - 1)) * Math.sin((amount - 1.1) * 5 * Math.PI) + 1;\n },\n }),\n Back: Object.freeze({\n In: function (amount) {\n var s = 1.70158;\n return amount === 1 ? 1 : amount * amount * ((s + 1) * amount - s);\n },\n Out: function (amount) {\n var s = 1.70158;\n return amount === 0 ? 0 : --amount * amount * ((s + 1) * amount + s) + 1;\n },\n InOut: function (amount) {\n var s = 1.70158 * 1.525;\n if ((amount *= 2) < 1) {\n return 0.5 * (amount * amount * ((s + 1) * amount - s));\n }\n return 0.5 * ((amount -= 2) * amount * ((s + 1) * amount + s) + 2);\n },\n }),\n Bounce: Object.freeze({\n In: function (amount) {\n return 1 - Easing.Bounce.Out(1 - amount);\n },\n Out: function (amount) {\n if (amount < 1 / 2.75) {\n return 7.5625 * amount * amount;\n }\n else if (amount < 2 / 2.75) {\n return 7.5625 * (amount -= 1.5 / 2.75) * amount + 0.75;\n }\n else if (amount < 2.5 / 2.75) {\n return 7.5625 * (amount -= 2.25 / 2.75) * amount + 0.9375;\n }\n else {\n return 7.5625 * (amount -= 2.625 / 2.75) * amount + 0.984375;\n }\n },\n InOut: function (amount) {\n if (amount < 0.5) {\n return Easing.Bounce.In(amount * 2) * 0.5;\n }\n return Easing.Bounce.Out(amount * 2 - 1) * 0.5 + 0.5;\n },\n }),\n generatePow: function (power) {\n if (power === void 0) { power = 4; }\n power = power < Number.EPSILON ? Number.EPSILON : power;\n power = power > 10000 ? 10000 : power;\n return {\n In: function (amount) {\n return Math.pow(amount, power);\n },\n Out: function (amount) {\n return 1 - Math.pow((1 - amount), power);\n },\n InOut: function (amount) {\n if (amount < 0.5) {\n return Math.pow((amount * 2), power) / 2;\n }\n return (1 - Math.pow((2 - amount * 2), power)) / 2 + 0.5;\n },\n };\n },\n});\n\nvar now = function () { return performance.now(); };\n\n/**\n * Controlling groups of tweens\n *\n * Using the TWEEN singleton to manage your tweens can cause issues in large apps with many components.\n * In these cases, you may want to create your own smaller groups of tween\n */\nvar Group = /** @class */ (function () {\n function Group() {\n var tweens = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n tweens[_i] = arguments[_i];\n }\n this._tweens = {};\n this._tweensAddedDuringUpdate = {};\n this.add.apply(this, tweens);\n }\n Group.prototype.getAll = function () {\n var _this = this;\n return Object.keys(this._tweens).map(function (tweenId) { return _this._tweens[tweenId]; });\n };\n Group.prototype.removeAll = function () {\n this._tweens = {};\n };\n Group.prototype.add = function () {\n var _a;\n var tweens = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n tweens[_i] = arguments[_i];\n }\n for (var _b = 0, tweens_1 = tweens; _b < tweens_1.length; _b++) {\n var tween = tweens_1[_b];\n // Remove from any other group first, a tween can only be in one group at a time.\n // @ts-expect-error library internal access\n (_a = tween._group) === null || _a === void 0 ? void 0 : _a.remove(tween);\n // @ts-expect-error library internal access\n tween._group = this;\n this._tweens[tween.getId()] = tween;\n this._tweensAddedDuringUpdate[tween.getId()] = tween;\n }\n };\n Group.prototype.remove = function () {\n var tweens = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n tweens[_i] = arguments[_i];\n }\n for (var _a = 0, tweens_2 = tweens; _a < tweens_2.length; _a++) {\n var tween = tweens_2[_a];\n // @ts-expect-error library internal access\n tween._group = undefined;\n delete this._tweens[tween.getId()];\n delete this._tweensAddedDuringUpdate[tween.getId()];\n }\n };\n /** Return true if all tweens in the group are not paused or playing. */\n Group.prototype.allStopped = function () {\n return this.getAll().every(function (tween) { return !tween.isPlaying(); });\n };\n Group.prototype.update = function (time, preserve) {\n if (time === void 0) { time = now(); }\n if (preserve === void 0) { preserve = true; }\n var tweenIds = Object.keys(this._tweens);\n if (tweenIds.length === 0)\n return;\n // Tweens are updated in \"batches\". If you add a new tween during an\n // update, then the new tween will be updated in the next batch.\n // If you remove a tween during an update, it may or may not be updated.\n // However, if the removed tween was added during the current batch,\n // then it will not be updated.\n while (tweenIds.length > 0) {\n this._tweensAddedDuringUpdate = {};\n for (var i = 0; i < tweenIds.length; i++) {\n var tween = this._tweens[tweenIds[i]];\n var autoStart = !preserve;\n if (tween && tween.update(time, autoStart) === false && !preserve)\n this.remove(tween);\n }\n tweenIds = Object.keys(this._tweensAddedDuringUpdate);\n }\n };\n return Group;\n}());\n\n/**\n *\n */\nvar Interpolation = {\n Linear: function (v, k) {\n var m = v.length - 1;\n var f = m * k;\n var i = Math.floor(f);\n var fn = Interpolation.Utils.Linear;\n if (k < 0) {\n return fn(v[0], v[1], f);\n }\n if (k > 1) {\n return fn(v[m], v[m - 1], m - f);\n }\n return fn(v[i], v[i + 1 > m ? m : i + 1], f - i);\n },\n Bezier: function (v, k) {\n var b = 0;\n var n = v.length - 1;\n var pw = Math.pow;\n var bn = Interpolation.Utils.Bernstein;\n for (var i = 0; i <= n; i++) {\n b += pw(1 - k, n - i) * pw(k, i) * v[i] * bn(n, i);\n }\n return b;\n },\n CatmullRom: function (v, k) {\n var m = v.length - 1;\n var f = m * k;\n var i = Math.floor(f);\n var fn = Interpolation.Utils.CatmullRom;\n if (v[0] === v[m]) {\n if (k < 0) {\n i = Math.floor((f = m * (1 + k)));\n }\n return fn(v[(i - 1 + m) % m], v[i], v[(i + 1) % m], v[(i + 2) % m], f - i);\n }\n else {\n if (k < 0) {\n return v[0] - (fn(v[0], v[0], v[1], v[1], -f) - v[0]);\n }\n if (k > 1) {\n return v[m] - (fn(v[m], v[m], v[m - 1], v[m - 1], f - m) - v[m]);\n }\n return fn(v[i ? i - 1 : 0], v[i], v[m < i + 1 ? m : i + 1], v[m < i + 2 ? m : i + 2], f - i);\n }\n },\n Utils: {\n Linear: function (p0, p1, t) {\n return (p1 - p0) * t + p0;\n },\n Bernstein: function (n, i) {\n var fc = Interpolation.Utils.Factorial;\n return fc(n) / fc(i) / fc(n - i);\n },\n Factorial: (function () {\n var a = [1];\n return function (n) {\n var s = 1;\n if (a[n]) {\n return a[n];\n }\n for (var i = n; i > 1; i--) {\n s *= i;\n }\n a[n] = s;\n return s;\n };\n })(),\n CatmullRom: function (p0, p1, p2, p3, t) {\n var v0 = (p2 - p0) * 0.5;\n var v1 = (p3 - p1) * 0.5;\n var t2 = t * t;\n var t3 = t * t2;\n return (2 * p1 - 2 * p2 + v0 + v1) * t3 + (-3 * p1 + 3 * p2 - 2 * v0 - v1) * t2 + v0 * t + p1;\n },\n },\n};\n\n/**\n * Utils\n */\nvar Sequence = /** @class */ (function () {\n function Sequence() {\n }\n Sequence.nextId = function () {\n return Sequence._nextId++;\n };\n Sequence._nextId = 0;\n return Sequence;\n}());\n\nvar mainGroup = new Group();\n\n/**\n * Tween.js - Licensed under the MIT license\n * https://github.com/tweenjs/tween.js\n * ----------------------------------------------\n *\n * See https://github.com/tweenjs/tween.js/graphs/contributors for the full list of contributors.\n * Thank you all, you're awesome!\n */\nvar Tween = /** @class */ (function () {\n function Tween(object, group) {\n this._isPaused = false;\n this._pauseStart = 0;\n this._valuesStart = {};\n this._valuesEnd = {};\n this._valuesStartRepeat = {};\n this._duration = 1000;\n this._isDynamic = false;\n this._initialRepeat = 0;\n this._repeat = 0;\n this._yoyo = false;\n this._isPlaying = false;\n this._reversed = false;\n this._delayTime = 0;\n this._startTime = 0;\n this._easingFunction = Easing.Linear.None;\n this._interpolationFunction = Interpolation.Linear;\n // eslint-disable-next-line\n this._chainedTweens = [];\n this._onStartCallbackFired = false;\n this._onEveryStartCallbackFired = false;\n this._id = Sequence.nextId();\n this._isChainStopped = false;\n this._propertiesAreSetUp = false;\n this._goToEnd = false;\n this._object = object;\n if (typeof group === 'object') {\n this._group = group;\n group.add(this);\n }\n // Use \"true\" to restore old behavior (will be removed in future release).\n else if (group === true) {\n this._group = mainGroup;\n mainGroup.add(this);\n }\n }\n Tween.prototype.getId = function () {\n return this._id;\n };\n Tween.prototype.isPlaying = function () {\n return this._isPlaying;\n };\n Tween.prototype.isPaused = function () {\n return this._isPaused;\n };\n Tween.prototype.getDuration = function () {\n return this._duration;\n };\n Tween.prototype.to = function (target, duration) {\n if (duration === void 0) { duration = 1000; }\n if (this._isPlaying)\n throw new Error('Can not call Tween.to() while Tween is already started or paused. Stop the Tween first.');\n this._valuesEnd = target;\n this._propertiesAreSetUp = false;\n this._duration = duration < 0 ? 0 : duration;\n return this;\n };\n Tween.prototype.duration = function (duration) {\n if (duration === void 0) { duration = 1000; }\n this._duration = duration < 0 ? 0 : duration;\n return this;\n };\n Tween.prototype.dynamic = function (dynamic) {\n if (dynamic === void 0) { dynamic = false; }\n this._isDynamic = dynamic;\n return this;\n };\n Tween.prototype.start = function (time, overrideStartingValues) {\n if (time === void 0) { time = now(); }\n if (overrideStartingValues === void 0) { overrideStartingValues = false; }\n if (this._isPlaying) {\n return this;\n }\n this._repeat = this._initialRepeat;\n if (this._reversed) {\n // If we were reversed (f.e. using the yoyo feature) then we need to\n // flip the tween direction back to forward.\n this._reversed = false;\n for (var property in this._valuesStartRepeat) {\n this._swapEndStartRepeatValues(property);\n this._valuesStart[property] = this._valuesStartRepeat[property];\n }\n }\n this._isPlaying = true;\n this._isPaused = false;\n this._onStartCallbackFired = false;\n this._onEveryStartCallbackFired = false;\n this._isChainStopped = false;\n this._startTime = time;\n this._startTime += this._delayTime;\n if (!this._propertiesAreSetUp || overrideStartingValues) {\n this._propertiesAreSetUp = true;\n // If dynamic is not enabled, clone the end values instead of using the passed-in end values.\n if (!this._isDynamic) {\n var tmp = {};\n for (var prop in this._valuesEnd)\n tmp[prop] = this._valuesEnd[prop];\n this._valuesEnd = tmp;\n }\n this._setupProperties(this._object, this._valuesStart, this._valuesEnd, this._valuesStartRepeat, overrideStartingValues);\n }\n return this;\n };\n Tween.prototype.startFromCurrentValues = function (time) {\n return this.start(time, true);\n };\n Tween.prototype._setupProperties = function (_object, _valuesStart, _valuesEnd, _valuesStartRepeat, overrideStartingValues) {\n for (var property in _valuesEnd) {\n var startValue = _object[property];\n var startValueIsArray = Array.isArray(startValue);\n var propType = startValueIsArray ? 'array' : typeof startValue;\n var isInterpolationList = !startValueIsArray && Array.isArray(_valuesEnd[property]);\n // If `to()` specifies a property that doesn't exist in the source object,\n // we should not set that property in the object\n if (propType === 'undefined' || propType === 'function') {\n continue;\n }\n // Check if an Array was provided as property value\n if (isInterpolationList) {\n var endValues = _valuesEnd[property];\n if (endValues.length === 0) {\n continue;\n }\n // Handle an array of relative values.\n // Creates a local copy of the Array with the start value at the front\n var temp = [startValue];\n for (var i = 0, l = endValues.length; i < l; i += 1) {\n var value = this._handleRelativeValue(startValue, endValues[i]);\n if (isNaN(value)) {\n isInterpolationList = false;\n console.warn('Found invalid interpolation list. Skipping.');\n break;\n }\n temp.push(value);\n }\n if (isInterpolationList) {\n // if (_valuesStart[property] === undefined) { // handle end values only the first time. NOT NEEDED? setupProperties is now guarded by _propertiesAreSetUp.\n _valuesEnd[property] = temp;\n // }\n }\n }\n // handle the deepness of the values\n if ((propType === 'object' || startValueIsArray) && startValue && !isInterpolationList) {\n _valuesStart[property] = startValueIsArray ? [] : {};\n var nestedObject = startValue;\n for (var prop in nestedObject) {\n _valuesStart[property][prop] = nestedObject[prop];\n }\n // TODO? repeat nested values? And yoyo? And array values?\n _valuesStartRepeat[property] = startValueIsArray ? [] : {};\n var endValues = _valuesEnd[property];\n // If dynamic is not enabled, clone the end values instead of using the passed-in end values.\n if (!this._isDynamic) {\n var tmp = {};\n for (var prop in endValues)\n tmp[prop] = endValues[prop];\n _valuesEnd[property] = endValues = tmp;\n }\n this._setupProperties(nestedObject, _valuesStart[property], endValues, _valuesStartRepeat[property], overrideStartingValues);\n }\n else {\n // Save the starting value, but only once unless override is requested.\n if (typeof _valuesStart[property] === 'undefined' || overrideStartingValues) {\n _valuesStart[property] = startValue;\n }\n if (!startValueIsArray) {\n // eslint-disable-next-line\n // @ts-ignore FIXME?\n _valuesStart[property] *= 1.0; // Ensures we're using numbers, not strings\n }\n if (isInterpolationList) {\n // eslint-disable-next-line\n // @ts-ignore FIXME?\n _valuesStartRepeat[property] = _valuesEnd[property].slice().reverse();\n }\n else {\n _valuesStartRepeat[property] = _valuesStart[property] || 0;\n }\n }\n }\n };\n Tween.prototype.stop = function () {\n if (!this._isChainStopped) {\n this._isChainStopped = true;\n this.stopChainedTweens();\n }\n if (!this._isPlaying) {\n return this;\n }\n this._isPlaying = false;\n this._isPaused = false;\n if (this._onStopCallback) {\n this._onStopCallback(this._object);\n }\n return this;\n };\n Tween.prototype.end = function () {\n this._goToEnd = true;\n this.update(this._startTime + this._duration);\n return this;\n };\n Tween.prototype.pause = function (time) {\n if (time === void 0) { time = now(); }\n if (this._isPaused || !this._isPlaying) {\n return this;\n }\n this._isPaused = true;\n this._pauseStart = time;\n return this;\n };\n Tween.prototype.resume = function (time) {\n if (time === void 0) { time = now(); }\n if (!this._isPaused || !this._isPlaying) {\n return this;\n }\n this._isPaused = false;\n this._startTime += time - this._pauseStart;\n this._pauseStart = 0;\n return this;\n };\n Tween.prototype.stopChainedTweens = function () {\n for (var i = 0, numChainedTweens = this._chainedTweens.length; i < numChainedTweens; i++) {\n this._chainedTweens[i].stop();\n }\n return this;\n };\n Tween.prototype.group = function (group) {\n if (!group) {\n console.warn('tween.group() without args has been removed, use group.add(tween) instead.');\n return this;\n }\n group.add(this);\n return this;\n };\n /**\n * Removes the tween from whichever group it is in.\n */\n Tween.prototype.remove = function () {\n var _a;\n (_a = this._group) === null || _a === void 0 ? void 0 : _a.remove(this);\n return this;\n };\n Tween.prototype.delay = function (amount) {\n if (amount === void 0) { amount = 0; }\n this._delayTime = amount;\n return this;\n };\n Tween.prototype.repeat = function (times) {\n if (times === void 0) { times = 0; }\n this._initialRepeat = times;\n this._repeat = times;\n return this;\n };\n Tween.prototype.repeatDelay = function (amount) {\n this._repeatDelayTime = amount;\n return this;\n };\n Tween.prototype.yoyo = function (yoyo) {\n if (yoyo === void 0) { yoyo = false; }\n this._yoyo = yoyo;\n return this;\n };\n Tween.prototype.easing = function (easingFunction) {\n if (easingFunction === void 0) { easingFunction = Easing.Linear.None; }\n this._easingFunction = easingFunction;\n return this;\n };\n Tween.prototype.interpolation = function (interpolationFunction) {\n if (interpolationFunction === void 0) { interpolationFunction = Interpolation.Linear; }\n this._interpolationFunction = interpolationFunction;\n return this;\n };\n // eslint-disable-next-line\n Tween.prototype.chain = function () {\n var tweens = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n tweens[_i] = arguments[_i];\n }\n this._chainedTweens = tweens;\n return this;\n };\n Tween.prototype.onStart = function (callback) {\n this._onStartCallback = callback;\n return this;\n };\n Tween.prototype.onEveryStart = function (callback) {\n this._onEveryStartCallback = callback;\n return this;\n };\n Tween.prototype.onUpdate = function (callback) {\n this._onUpdateCallback = callback;\n return this;\n };\n Tween.prototype.onRepeat = function (callback) {\n this._onRepeatCallback = callback;\n return this;\n };\n Tween.prototype.onComplete = function (callback) {\n this._onCompleteCallback = callback;\n return this;\n };\n Tween.prototype.onStop = function (callback) {\n this._onStopCallback = callback;\n return this;\n };\n /**\n * @returns true if the tween is still playing after the update, false\n * otherwise (calling update on a paused tween still returns true because\n * it is still playing, just paused).\n *\n * @param autoStart - When true, calling update will implicitly call start()\n * as well. Note, if you stop() or end() the tween, but are still calling\n * update(), it will start again!\n */\n Tween.prototype.update = function (time, autoStart) {\n var _this = this;\n var _a;\n if (time === void 0) { time = now(); }\n if (autoStart === void 0) { autoStart = Tween.autoStartOnUpdate; }\n if (this._isPaused)\n return true;\n var property;\n if (!this._goToEnd && !this._isPlaying) {\n if (autoStart)\n this.start(time, true);\n else\n return false;\n }\n this._goToEnd = false;\n if (time < this._startTime) {\n return true;\n }\n if (this._onStartCallbackFired === false) {\n if (this._onStartCallback) {\n this._onStartCallback(this._object);\n }\n this._onStartCallbackFired = true;\n }\n if (this._onEveryStartCallbackFired === false) {\n if (this._onEveryStartCallback) {\n this._onEveryStartCallback(this._object);\n }\n this._onEveryStartCallbackFired = true;\n }\n var elapsedTime = time - this._startTime;\n var durationAndDelay = this._duration + ((_a = this._repeatDelayTime) !== null && _a !== void 0 ? _a : this._delayTime);\n var totalTime = this._duration + this._repeat * durationAndDelay;\n var calculateElapsedPortion = function () {\n if (_this._duration === 0)\n return 1;\n if (elapsedTime > totalTime) {\n return 1;\n }\n var timesRepeated = Math.trunc(elapsedTime / durationAndDelay);\n var timeIntoCurrentRepeat = elapsedTime - timesRepeated * durationAndDelay;\n // TODO use %?\n // const timeIntoCurrentRepeat = elapsedTime % durationAndDelay\n var portion = Math.min(timeIntoCurrentRepeat / _this._duration, 1);\n if (portion === 0 && elapsedTime === _this._duration) {\n return 1;\n }\n return portion;\n };\n var elapsed = calculateElapsedPortion();\n var value = this._easingFunction(elapsed);\n // properties transformations\n this._updateProperties(this._object, this._valuesStart, this._valuesEnd, value);\n if (this._onUpdateCallback) {\n this._onUpdateCallback(this._object, elapsed);\n }\n if (this._duration === 0 || elapsedTime >= this._duration) {\n if (this._repeat > 0) {\n var completeCount = Math.min(Math.trunc((elapsedTime - this._duration) / durationAndDelay) + 1, this._repeat);\n if (isFinite(this._repeat)) {\n this._repeat -= completeCount;\n }\n // Reassign starting values, restart by making startTime = now\n for (property in this._valuesStartRepeat) {\n if (!this._yoyo && typeof this._valuesEnd[property] === 'string') {\n this._valuesStartRepeat[property] =\n // eslint-disable-next-line\n // @ts-ignore FIXME?\n this._valuesStartRepeat[property] + parseFloat(this._valuesEnd[property]);\n }\n if (this._yoyo) {\n this._swapEndStartRepeatValues(property);\n }\n this._valuesStart[property] = this._valuesStartRepeat[property];\n }\n if (this._yoyo) {\n this._reversed = !this._reversed;\n }\n this._startTime += durationAndDelay * completeCount;\n if (this._onRepeatCallback) {\n this._onRepeatCallback(this._object);\n }\n this._onEveryStartCallbackFired = false;\n return true;\n }\n else {\n if (this._onCompleteCallback) {\n this._onCompleteCallback(this._object);\n }\n for (var i = 0, numChainedTweens = this._chainedTweens.length; i < numChainedTweens; i++) {\n // Make the chained tweens start exactly at the time they should,\n // even if the `update()` method was called way past the duration of the tween\n this._chainedTweens[i].start(this._startTime + this._duration, false);\n }\n this._isPlaying = false;\n return false;\n }\n }\n return true;\n };\n Tween.prototype._updateProperties = function (_object, _valuesStart, _valuesEnd, value) {\n for (var property in _valuesEnd) {\n // Don't update properties that do not exist in the source object\n if (_valuesStart[property] === undefined) {\n continue;\n }\n var start = _valuesStart[property] || 0;\n var end = _valuesEnd[property];\n var startIsArray = Array.isArray(_object[property]);\n var endIsArray = Array.isArray(end);\n var isInterpolationList = !startIsArray && endIsArray;\n if (isInterpolationList) {\n _object[property] = this._interpolationFunction(end, value);\n }\n else if (typeof end === 'object' && end) {\n // eslint-disable-next-line\n // @ts-ignore FIXME?\n this._updateProperties(_object[property], start, end, value);\n }\n else {\n // Parses relative end values with start as base (e.g.: +10, -3)\n end = this._handleRelativeValue(start, end);\n // Protect against non numeric properties.\n if (typeof end === 'number') {\n // eslint-disable-next-line\n // @ts-ignore FIXME?\n _object[property] = start + (end - start) * value;\n }\n }\n }\n };\n Tween.prototype._handleRelativeValue = function (start, end) {\n if (typeof end !== 'string') {\n return end;\n }\n if (end.charAt(0) === '+' || end.charAt(0) === '-') {\n return start + parseFloat(end);\n }\n return parseFloat(end);\n };\n Tween.prototype._swapEndStartRepeatValues = function (property) {\n var tmp = this._valuesStartRepeat[property];\n var endValue = this._valuesEnd[property];\n if (typeof endValue === 'string') {\n this._valuesStartRepeat[property] = this._valuesStartRepeat[property] + parseFloat(endValue);\n }\n else {\n this._valuesStartRepeat[property] = this._valuesEnd[property];\n }\n this._valuesEnd[property] = tmp;\n };\n Tween.autoStartOnUpdate = false;\n return Tween;\n}());\n\nvar VERSION = '25.0.0';\n\n/**\n * Tween.js - Licensed under the MIT license\n * https://github.com/tweenjs/tween.js\n * ----------------------------------------------\n *\n * See https://github.com/tweenjs/tween.js/graphs/contributors for the full list of contributors.\n * Thank you all, you're awesome!\n */\nvar nextId = Sequence.nextId;\n/**\n * Controlling groups of tweens\n *\n * Using the TWEEN singleton to manage your tweens can cause issues in large apps with many components.\n * In these cases, you may want to create your own smaller groups of tweens.\n */\nvar TWEEN = mainGroup;\n// This is the best way to export things in a way that's compatible with both ES\n// Modules and CommonJS, without build hacks, and so as not to break the\n// existing API.\n// https://github.com/rollup/rollup/issues/1961#issuecomment-423037881\n/**\n * @deprecated The global TWEEN Group will be removed in a following major\n * release. To migrate, create a `new Group()` instead of using `TWEEN` as a\n * group.\n *\n * Old code:\n *\n * ```js\n * import * as TWEEN from '@tweenjs/tween.js'\n *\n * //...\n *\n * const tween = new TWEEN.Tween(obj)\n * const tween2 = new TWEEN.Tween(obj2)\n *\n * //...\n *\n * requestAnimationFrame(function loop(time) {\n * TWEEN.update(time)\n * requestAnimationFrame(loop)\n * })\n * ```\n *\n * New code:\n *\n * ```js\n * import {Tween, Group} from '@tweenjs/tween.js'\n *\n * //...\n *\n * const tween = new Tween(obj)\n * const tween2 = new TWEEN.Tween(obj2)\n *\n * //...\n *\n * const group = new Group()\n * group.add(tween)\n * group.add(tween2)\n *\n * //...\n *\n * requestAnimationFrame(function loop(time) {\n * group.update(time)\n * requestAnimationFrame(loop)\n * })\n * ```\n */\nvar getAll = TWEEN.getAll.bind(TWEEN);\n/**\n * @deprecated The global TWEEN Group will be removed in a following major\n * release. To migrate, create a `new Group()` instead of using `TWEEN` as a\n * group.\n *\n * Old code:\n *\n * ```js\n * import * as TWEEN from '@tweenjs/tween.js'\n *\n * //...\n *\n * const tween = new TWEEN.Tween(obj)\n * const tween2 = new TWEEN.Tween(obj2)\n *\n * //...\n *\n * requestAnimationFrame(function loop(time) {\n * TWEEN.update(time)\n * requestAnimationFrame(loop)\n * })\n * ```\n *\n * New code:\n *\n * ```js\n * import {Tween, Group} from '@tweenjs/tween.js'\n *\n * //...\n *\n * const tween = new Tween(obj)\n * const tween2 = new TWEEN.Tween(obj2)\n *\n * //...\n *\n * const group = new Group()\n * group.add(tween)\n * group.add(tween2)\n *\n * //...\n *\n * requestAnimationFrame(function loop(time) {\n * group.update(time)\n * requestAnimationFrame(loop)\n * })\n * ```\n */\nvar removeAll = TWEEN.removeAll.bind(TWEEN);\n/**\n * @deprecated The global TWEEN Group will be removed in a following major\n * release. To migrate, create a `new Group()` instead of using `TWEEN` as a\n * group.\n *\n * Old code:\n *\n * ```js\n * import * as TWEEN from '@tweenjs/tween.js'\n *\n * //...\n *\n * const tween = new TWEEN.Tween(obj)\n * const tween2 = new TWEEN.Tween(obj2)\n *\n * //...\n *\n * requestAnimationFrame(function loop(time) {\n * TWEEN.update(time)\n * requestAnimationFrame(loop)\n * })\n * ```\n *\n * New code:\n *\n * ```js\n * import {Tween, Group} from '@tweenjs/tween.js'\n *\n * //...\n *\n * const tween = new Tween(obj)\n * const tween2 = new TWEEN.Tween(obj2)\n *\n * //...\n *\n * const group = new Group()\n * group.add(tween)\n * group.add(tween2)\n *\n * //...\n *\n * requestAnimationFrame(function loop(time) {\n * group.update(time)\n * requestAnimationFrame(loop)\n * })\n * ```\n */\nvar add = TWEEN.add.bind(TWEEN);\n/**\n * @deprecated The global TWEEN Group will be removed in a following major\n * release. To migrate, create a `new Group()` instead of using `TWEEN` as a\n * group.\n *\n * Old code:\n *\n * ```js\n * import * as TWEEN from '@tweenjs/tween.js'\n *\n * //...\n *\n * const tween = new TWEEN.Tween(obj)\n * const tween2 = new TWEEN.Tween(obj2)\n *\n * //...\n *\n * requestAnimationFrame(function loop(time) {\n * TWEEN.update(time)\n * requestAnimationFrame(loop)\n * })\n * ```\n *\n * New code:\n *\n * ```js\n * import {Tween, Group} from '@tweenjs/tween.js'\n *\n * //...\n *\n * const tween = new Tween(obj)\n * const tween2 = new TWEEN.Tween(obj2)\n *\n * //...\n *\n * const group = new Group()\n * group.add(tween)\n * group.add(tween2)\n *\n * //...\n *\n * requestAnimationFrame(function loop(time) {\n * group.update(time)\n * requestAnimationFrame(loop)\n * })\n * ```\n */\nvar remove = TWEEN.remove.bind(TWEEN);\n/**\n * @deprecated The global TWEEN Group will be removed in a following major\n * release. To migrate, create a `new Group()` instead of using `TWEEN` as a\n * group.\n *\n * Old code:\n *\n * ```js\n * import * as TWEEN from '@tweenjs/tween.js'\n *\n * //...\n *\n * const tween = new TWEEN.Tween(obj)\n * const tween2 = new TWEEN.Tween(obj2)\n *\n * //...\n *\n * requestAnimationFrame(function loop(time) {\n * TWEEN.update(time)\n * requestAnimationFrame(loop)\n * })\n * ```\n *\n * New code:\n *\n * ```js\n * import {Tween, Group} from '@tweenjs/tween.js'\n *\n * //...\n *\n * const tween = new Tween(obj)\n * const tween2 = new TWEEN.Tween(obj2)\n *\n * //...\n *\n * const group = new Group()\n * group.add(tween)\n * group.add(tween2)\n *\n * //...\n *\n * requestAnimationFrame(function loop(time) {\n * group.update(time)\n * requestAnimationFrame(loop)\n * })\n * ```\n */\nvar update = TWEEN.update.bind(TWEEN);\nvar exports = {\n Easing: Easing,\n Group: Group,\n Interpolation: Interpolation,\n now: now,\n Sequence: Sequence,\n nextId: nextId,\n Tween: Tween,\n VERSION: VERSION,\n /**\n * @deprecated The global TWEEN Group will be removed in a following major\n * release. To migrate, create a `new Group()` instead of using `TWEEN` as a\n * group.\n *\n * Old code:\n *\n * ```js\n * import * as TWEEN from '@tweenjs/tween.js'\n *\n * //...\n *\n * const tween = new TWEEN.Tween(obj)\n * const tween2 = new TWEEN.Tween(obj2)\n *\n * //...\n *\n * requestAnimationFrame(function loop(time) {\n * TWEEN.update(time)\n * requestAnimationFrame(loop)\n * })\n * ```\n *\n * New code:\n *\n * ```js\n * import {Tween, Group} from '@tweenjs/tween.js'\n *\n * //...\n *\n * const tween = new Tween(obj)\n * const tween2 = new TWEEN.Tween(obj2)\n *\n * //...\n *\n * const group = new Group()\n * group.add(tween)\n * group.add(tween2)\n *\n * //...\n *\n * requestAnimationFrame(function loop(time) {\n * group.update(time)\n * requestAnimationFrame(loop)\n * })\n * ```\n */\n getAll: getAll,\n /**\n * @deprecated The global TWEEN Group will be removed in a following major\n * release. To migrate, create a `new Group()` instead of using `TWEEN` as a\n * group.\n *\n * Old code:\n *\n * ```js\n * import * as TWEEN from '@tweenjs/tween.js'\n *\n * //...\n *\n * const tween = new TWEEN.Tween(obj)\n * const tween2 = new TWEEN.Tween(obj2)\n *\n * //...\n *\n * requestAnimationFrame(function loop(time) {\n * TWEEN.update(time)\n * requestAnimationFrame(loop)\n * })\n * ```\n *\n * New code:\n *\n * ```js\n * import {Tween, Group} from '@tweenjs/tween.js'\n *\n * //...\n *\n * const tween = new Tween(obj)\n * const tween2 = new TWEEN.Tween(obj2)\n *\n * //...\n *\n * const group = new Group()\n * group.add(tween)\n * group.add(tween2)\n *\n * //...\n *\n * requestAnimationFrame(function loop(time) {\n * group.update(time)\n * requestAnimationFrame(loop)\n * })\n * ```\n */\n removeAll: removeAll,\n /**\n * @deprecated The global TWEEN Group will be removed in a following major\n * release. To migrate, create a `new Group()` instead of using `TWEEN` as a\n * group.\n *\n * Old code:\n *\n * ```js\n * import * as TWEEN from '@tweenjs/tween.js'\n *\n * //...\n *\n * const tween = new TWEEN.Tween(obj)\n * const tween2 = new TWEEN.Tween(obj2)\n *\n * //...\n *\n * requestAnimationFrame(function loop(time) {\n * TWEEN.update(time)\n * requestAnimationFrame(loop)\n * })\n * ```\n *\n * New code:\n *\n * ```js\n * import {Tween, Group} from '@tweenjs/tween.js'\n *\n * //...\n *\n * const tween = new Tween(obj)\n * const tween2 = new TWEEN.Tween(obj2)\n *\n * //...\n *\n * const group = new Group()\n * group.add(tween)\n * group.add(tween2)\n *\n * //...\n *\n * requestAnimationFrame(function loop(time) {\n * group.update(time)\n * requestAnimationFrame(loop)\n * })\n * ```\n */\n add: add,\n /**\n * @deprecated The global TWEEN Group will be removed in a following major\n * release. To migrate, create a `new Group()` instead of using `TWEEN` as a\n * group.\n *\n * Old code:\n *\n * ```js\n * import * as TWEEN from '@tweenjs/tween.js'\n *\n * //...\n *\n * const tween = new TWEEN.Tween(obj)\n * const tween2 = new TWEEN.Tween(obj2)\n *\n * //...\n *\n * requestAnimationFrame(function loop(time) {\n * TWEEN.update(time)\n * requestAnimationFrame(loop)\n * })\n * ```\n *\n * New code:\n *\n * ```js\n * import {Tween, Group} from '@tweenjs/tween.js'\n *\n * //...\n *\n * const tween = new Tween(obj)\n * const tween2 = new TWEEN.Tween(obj2)\n *\n * //...\n *\n * const group = new Group()\n * group.add(tween)\n * group.add(tween2)\n *\n * //...\n *\n * requestAnimationFrame(function loop(time) {\n * group.update(time)\n * requestAnimationFrame(loop)\n * })\n * ```\n */\n remove: remove,\n /**\n * @deprecated The global TWEEN Group will be removed in a following major\n * release. To migrate, create a `new Group()` instead of using `TWEEN` as a\n * group.\n *\n * Old code:\n *\n * ```js\n * import * as TWEEN from '@tweenjs/tween.js'\n *\n * //...\n *\n * const tween = new TWEEN.Tween(obj)\n * const tween2 = new TWEEN.Tween(obj2)\n *\n * //...\n *\n * requestAnimationFrame(function loop(time) {\n * TWEEN.update(time)\n * requestAnimationFrame(loop)\n * })\n * ```\n *\n * New code:\n *\n * ```js\n * import {Tween, Group} from '@tweenjs/tween.js'\n *\n * //...\n *\n * const tween = new Tween(obj)\n * const tween2 = new TWEEN.Tween(obj2)\n *\n * //...\n *\n * const group = new Group()\n * group.add(tween)\n * group.add(tween2)\n *\n * //...\n *\n * requestAnimationFrame(function loop(time) {\n * group.update(time)\n * requestAnimationFrame(loop)\n * })\n * ```\n */\n update: update,\n};\n\nexport { Easing, Group, Interpolation, Sequence, Tween, VERSION, add, exports as default, getAll, nextId, now, remove, removeAll, update };\n","import { round, toRadiant } from './math-helper';\nimport type {\n Dimensioning,\n KernelCube,\n KernelEnum,\n} from '../../../typings/kernel';\nimport type {\n AssetUrl,\n RapiBaseColor,\n RapiMaterial,\n RapiMaterialShading,\n RapiTexture,\n} from '../../../typings/rapi-types';\nimport { RAPI_TEXTURE_TYPE } from '../../../typings/rapi-types';\nimport { PlanElementType } from '../../../typings/planner-kernel-container';\nimport { getValue } from './common-utils';\nimport type { Position2, Position3 } from '../common-interfaces';\nimport { type WallPlanElementViewModel } from '../../../planner-core/src/view-model/wall-plan-element-view-model';\nimport { KernelWallType } from '../../../typings/planner';\nimport { convertToTHREE } from './kernel-utils';\nimport type { ShaderChunk, BufferGeometry } from 'three';\nimport {\n Box3,\n type Camera,\n Color,\n DataTexture,\n DoubleSide,\n FrontSide,\n Frustum,\n type Intersection,\n Layers,\n type Material,\n Matrix4,\n Mesh,\n MeshBasicMaterial,\n type MeshPhysicalMaterial,\n type MeshStandardMaterial,\n type NormalBufferAttributes,\n type Object3D,\n type Object3DEventMap,\n Quaternion,\n RepeatWrapping,\n RGBAFormat,\n Scene,\n SRGBColorSpace,\n type Texture,\n TextureLoader,\n type Vector2,\n Vector3,\n WebGLRenderer,\n} from 'three';\nimport type { WebGPURenderer } from 'three/webgpu';\nimport type { GUI } from 'dat.gui';\n\n// dat.gui has module-level window.requestAnimationFrame references that crash\n// in Node.js when evaluated before happy-dom registers window. Load it lazily\n// so dat.gui only runs after the DOM environment is available.\n// typeof window is 'undefined' at module-eval time in Node.js (before happy-dom),\n// so the import is safely skipped in headless environments.\nlet _guiClass:\n | (new (options?: { autoPlace?: boolean; width?: number }) => GUI)\n | null = null;\nif (typeof globalThis.window !== 'undefined') {\n import('dat.gui')\n .then((m) => {\n _guiClass = m.GUI as any;\n })\n .catch(() => {});\n}\nimport MaterialCreator from './material-creator';\nimport type { OBJECT_EVENT } from '../../../configurator-core/src/utils/raycast-helper';\nimport type { INPUT_EVENT_TYPE } from '../input/input-manager';\nimport { Easing, Tween } from '@tweenjs/tween.js';\n\n// Constants\nexport const DEFAULT_WEBGPU_MAX_TEXTURES = 16;\nexport const DEFAULT_WEBGPU_MAX_SAMPLES = 16;\nexport const DEFAULT_WEBGPU_MAX_ANISOTROPY = 16;\n\nexport const PREVIEW_LINE_MATERIAL_OPACITY = 0.4;\nexport const PREVIEW_MATERIAL_COLOR = '#DDDDDD';\nexport const PREVIEW_MATERIAL_ROUGHNESS = 1;\nexport const PREVIEW_MATERIAL_METALNESS = 0;\nexport const PREVIEW_MATERIAL_OPACITY = 1;\nexport const DOOR_WINDOW_MATERIAL_OPACITY = 1;\nexport const DOOR_ARCH_MATERIAL_OPACITY = 0.4;\nexport const DOOR_ARCH_MATERIAL_OUTLINE_COLOR = '#7B7B7B';\nexport const DOOR_WINDOW_MATERIAL_COLOR = '#B1B1B1';\n\nexport const DOCK_PREVIEW_MATERIAL_ROUGHNESS = 1;\nexport const DOCK_PREVIEW_MATERIAL_METALNESS = 0;\nexport const DOCK_PREVIEW_MATERIAL_OPACITY = 0.8;\nexport const DOCK_PREVIEW_MATERIAL_OPACITY_HOVERED = 0.9;\n\nexport const getMaxSamples = (\n renderer: WebGLRenderer | WebGPURenderer,\n): number => {\n if (renderer instanceof WebGLRenderer) {\n return renderer.capabilities.maxSamples;\n }\n return DEFAULT_WEBGPU_MAX_SAMPLES;\n};\n\nexport const getMaxTextures = (\n renderer: WebGLRenderer | WebGPURenderer,\n): number => {\n if (renderer instanceof WebGLRenderer) {\n return renderer.capabilities.maxTextures;\n }\n return DEFAULT_WEBGPU_MAX_TEXTURES;\n};\n\nexport const getMaxAnisotropy = (\n renderer: WebGLRenderer | WebGPURenderer,\n): number => {\n if (renderer instanceof WebGLRenderer) {\n return renderer.capabilities.getMaxAnisotropy();\n }\n return DEFAULT_WEBGPU_MAX_ANISOTROPY;\n};\n\nexport const getScreenXY = (\n obj: Vector3,\n camera: Camera,\n clientWidth: number,\n clientHeight: number,\n): Vector3 => {\n if (!obj || !camera || clientWidth === 0 || clientHeight === 0) {\n return new Vector3();\n }\n\n const vector = obj.clone();\n\n const widthHalf = clientWidth / 2;\n const heightHalf = clientHeight / 2;\n\n vector.project(camera);\n\n vector.x = Math.floor(vector.x * widthHalf + widthHalf);\n vector.y = Math.floor(-(vector.y * heightHalf) + heightHalf);\n vector.z = obj.distanceTo(camera.position);\n\n return vector;\n};\n\nexport const kernelBoxToThreeBox = (\n kernelCube: KernelCube,\n margin?: Vector3,\n): Box3 => {\n if (!margin) {\n margin = new Vector3(0, 0, 0);\n }\n const bounds = new Vector3(\n kernelCube.size.x / 1000,\n kernelCube.size.z / 1000,\n kernelCube.size.y / 1000,\n );\n const boxOrigin = new Vector3(\n kernelCube.origin.x / 1000,\n kernelCube.origin.z / 1000,\n kernelCube.origin.y / -1000,\n );\n\n const lineMinVector: Vector3 = new Vector3(0, 0, -bounds.z)\n .add(boxOrigin)\n .sub(margin);\n const lineMaxVector: Vector3 = new Vector3(bounds.x, bounds.y, 0)\n .add(boxOrigin)\n .add(margin);\n return new Box3(lineMinVector, lineMaxVector);\n};\n\nexport const kernelDimensioningToThree = (\n dimensions: Dimensioning,\n): Dimensioning => {\n dimensions.from = dimensions.from / 1000;\n dimensions.to = dimensions.to / 1000;\n return dimensions;\n};\n\nexport const setShadows = (\n object: Object3D,\n receiveShadow: boolean,\n castShadow: boolean,\n) => {\n object.castShadow = castShadow;\n object.receiveShadow = receiveShadow;\n object.children.forEach((child: Object3D) => {\n setShadows(child, receiveShadow, castShadow);\n });\n};\n\nexport const position3VectorsAreEqual = (a: Vector3, b: Vector3): boolean => {\n const aX = round(a.x);\n const aY = round(a.y);\n const aZ = round(a.z);\n\n const bX = round(b.x);\n const bY = round(b.y);\n const bZ = round(b.z);\n\n return aX === bX && aY === bY && aZ === bZ;\n};\n\nexport const rotationQuaternionsAreEqual = (\n a: Quaternion,\n b: Quaternion,\n): boolean => {\n const aW = round(a.w);\n const aX = round(a.x);\n const aY = round(a.y);\n const aZ = round(a.z);\n\n const bW = round(b.w);\n const bX = round(b.x);\n const bY = round(b.y);\n const bZ = round(b.z);\n\n return aW === bW && aX === bX && aY === bY && aZ === bZ;\n};\n\nexport const position2VectorsAreEqual = (a: Vector2, b: Vector2): boolean => {\n const aX = round(a.x);\n const aY = round(a.y);\n\n const bX = round(b.x);\n const bY = round(b.y);\n\n return aX === bX && aY === bY;\n};\n\nlet whiteTexture: any = null;\n\nconst getWhiteTexture = () => {\n if (whiteTexture) {\n return whiteTexture;\n }\n const width = 1;\n const height = 1;\n const size = width * height;\n const data = new Uint8Array(4 * size);\n\n for (let i = 0; i < size; i++) {\n const stride = i * 4;\n\n data[stride] = 255;\n data[stride + 1] = 255;\n data[stride + 2] = 255;\n data[stride + 3] = 255;\n }\n const texture = new DataTexture(data, width, height, RGBAFormat);\n texture.needsUpdate = true;\n return texture;\n};\n\nexport const createMaterial = (\n material: RapiMaterial,\n): MeshPhysicalMaterial => {\n return setMaterial(null, material);\n};\n\nexport const setMaterial = (\n meshPhysicalMaterial: MeshPhysicalMaterial | null,\n rapiMaterial: RapiMaterial,\n): MeshPhysicalMaterial => {\n if (!meshPhysicalMaterial) {\n meshPhysicalMaterial = createMeshPhysicalMaterial();\n }\n\n meshPhysicalMaterial.name = rapiMaterial.id ? rapiMaterial.id.toString() : '';\n\n const isV2Material =\n rapiMaterial.shading.version === '2' ||\n rapiMaterial.shading.version?.startsWith('2.');\n meshPhysicalMaterial = isV2Material\n ? _setMaterialV2Properties(meshPhysicalMaterial, rapiMaterial)\n : _setMaterialV1Properties(meshPhysicalMaterial, rapiMaterial);\n meshPhysicalMaterial.userData.materialVersion = isV2Material ? 2 : 1;\n\n if (!meshPhysicalMaterial.map) {\n if (!whiteTexture) {\n whiteTexture = getWhiteTexture();\n }\n // this is a workaround because materials are displayed wrong on some mobile devices (Pixel 3 for example)\n // when a material has only a color but no texture\n meshPhysicalMaterial.map = whiteTexture as Texture;\n }\n return meshPhysicalMaterial;\n};\n\nconst _setMaterialV1Properties = (\n meshPhysicalMaterial: MeshPhysicalMaterial,\n rapiMaterial: RapiMaterial,\n): MeshPhysicalMaterial => {\n if (rapiMaterial.shading.metallic !== undefined) {\n meshPhysicalMaterial.metalness =\n rapiMaterial.shading.metallic === 1 ? 1 : 0.5;\n meshPhysicalMaterial.reflectivity = getValue(\n rapiMaterial.shading.metallic,\n 0.5,\n ); //three.js default is 0.5\n }\n\n let forceDoubleSide = false; // for backwards compatibility\n if (\n rapiMaterial.shading.transmission &&\n rapiMaterial.shading.transmission > 0\n ) {\n // disabled transmission compatibility mode to improve performance and be compatible with pixotronics renderer\n // meshPhysicalMaterial.transmission = rapiMaterial.shading.transmission;\n meshPhysicalMaterial.opacity = 1 - rapiMaterial.shading.transmission;\n meshPhysicalMaterial.transparent = true;\n meshPhysicalMaterial.depthWrite = false;\n meshPhysicalMaterial.metalness = 0;\n forceDoubleSide = true;\n } else if (\n rapiMaterial.shading.alpha !== undefined &&\n rapiMaterial.shading.alpha < 1\n ) {\n meshPhysicalMaterial.transparent = rapiMaterial.shading.alpha < 1;\n meshPhysicalMaterial.opacity = rapiMaterial.shading.alpha;\n meshPhysicalMaterial.depthWrite = rapiMaterial.shading.alpha >= 1;\n // modulate metalness with alpha channel for backwards compatibility\n meshPhysicalMaterial.metalness =\n 0.5 * Math.max(0, rapiMaterial.shading.alpha);\n forceDoubleSide = true;\n }\n\n meshPhysicalMaterial.aoMapIntensity = getValue(\n rapiMaterial.shading.occlusion,\n 1,\n );\n meshPhysicalMaterial.roughness = getValue(\n rapiMaterial.shading.roughness,\n 0.5,\n ); //three.js default is 0.5\n meshPhysicalMaterial.alphaTest = getValue(\n rapiMaterial.shading.alphaCutoff,\n 0,\n );\n\n _setColor(meshPhysicalMaterial.color, rapiMaterial.shading.basecolor);\n if (forceDoubleSide || rapiMaterial.shading.doubleSided) {\n meshPhysicalMaterial.side = DoubleSide;\n } else {\n meshPhysicalMaterial.side = FrontSide;\n }\n return meshPhysicalMaterial;\n};\n\n// To fulfill the \"eslint\" complexity rule, we would have to split this function into at least 3 functions.\n// This is pointless, as this function does exactly one thing, namely map \"RapiMaterial\" to \"MeshPhysicalMaterial\".\n\nconst _setMaterialV2Properties = (\n meshPhysicalMaterial: MeshPhysicalMaterial,\n rapiMaterial: RapiMaterial,\n): MeshPhysicalMaterial => {\n let forceDoubleSide = false; // for backwards compatibility\n if (\n rapiMaterial.shading.alpha !== undefined &&\n rapiMaterial.shading.alpha < 1\n ) {\n meshPhysicalMaterial.transparent = true;\n meshPhysicalMaterial.opacity = rapiMaterial.shading.alpha;\n meshPhysicalMaterial.depthWrite = false;\n forceDoubleSide = true;\n } else {\n meshPhysicalMaterial.transparent = false;\n meshPhysicalMaterial.opacity = 1;\n meshPhysicalMaterial.depthWrite = true;\n }\n meshPhysicalMaterial.alphaTest = rapiMaterial.shading.alphaCutoff ?? 0;\n _setColor(meshPhysicalMaterial.color, rapiMaterial.shading.basecolor);\n meshPhysicalMaterial.transmission = rapiMaterial.shading.transmission ?? 0;\n meshPhysicalMaterial.ior = Math.max(\n 1.0,\n Math.min(2.33, rapiMaterial.shading.transmissionIOR ?? 1.5),\n );\n meshPhysicalMaterial.metalness = rapiMaterial.shading.metallic ?? 0;\n _setColor(\n meshPhysicalMaterial.specularColor,\n rapiMaterial.shading.specularColor,\n );\n meshPhysicalMaterial.specularIntensity =\n rapiMaterial.shading.specularity ?? 1;\n meshPhysicalMaterial.roughness = rapiMaterial.shading.roughness ?? 0;\n meshPhysicalMaterial.aoMapIntensity = rapiMaterial.shading.occlusion ?? 1;\n _setColor(meshPhysicalMaterial.emissive, rapiMaterial.shading.emissiveColor);\n meshPhysicalMaterial.emissiveIntensity =\n rapiMaterial.shading.emissiveIntensity ?? 1;\n meshPhysicalMaterial.clearcoat = rapiMaterial.shading.clearcoatIntensity ?? 0;\n meshPhysicalMaterial.clearcoatRoughness =\n rapiMaterial.shading.clearcoatRoughness ?? 0;\n meshPhysicalMaterial.clearcoatNormalScale.setScalar(\n rapiMaterial.shading.clearcoatNormalScale ?? 1,\n );\n _setColor(meshPhysicalMaterial.sheenColor, rapiMaterial.shading.sheenColor);\n meshPhysicalMaterial.sheen = rapiMaterial.shading.sheenIntensity ?? 1;\n meshPhysicalMaterial.sheenRoughness =\n rapiMaterial.shading.sheenRoughness ?? 1;\n meshPhysicalMaterial.thickness = rapiMaterial.shading.thicknessFactor ?? 0;\n _setColor(\n meshPhysicalMaterial.attenuationColor,\n rapiMaterial.shading.attenuationColor,\n );\n if (rapiMaterial.shading.attenuationDistance) {\n meshPhysicalMaterial.attenuationDistance =\n rapiMaterial.shading.attenuationDistance;\n }\n meshPhysicalMaterial.side =\n forceDoubleSide || rapiMaterial.shading.doubleSided\n ? DoubleSide\n : FrontSide;\n\n return meshPhysicalMaterial;\n};\n\nconst createMeshPhysicalMaterial = (): MeshPhysicalMaterial => {\n return MaterialCreator.createMeshPhysicalMaterial({});\n};\n\nexport const getMaterialShading = (\n material: MeshPhysicalMaterial,\n version: number = 1,\n): RapiMaterialShading => {\n return version === 2\n ? _getMaterialShadingV2(material)\n : _getMaterialShadingV1(material);\n};\n\nconst _getMaterialShadingV1 = (\n material: MeshPhysicalMaterial,\n): RapiMaterialShading => {\n const shading: RapiMaterialShading = {\n alpha: material.opacity,\n metallic: material.reflectivity,\n basecolor: _getColor(material.color),\n roughness: material.roughness,\n doubleSided: material.side === DoubleSide,\n alphaCutoff: material.alphaTest,\n transmission: material.transmission,\n };\n if (material.metalness === 1) {\n shading.metallic = 1;\n } else {\n shading.metallic = material.reflectivity;\n }\n return shading;\n};\n\nconst _getMaterialShadingV2 = (\n material: MeshPhysicalMaterial,\n): RapiMaterialShading => {\n return {\n version: '2.0.0',\n alpha: material.opacity,\n alphaCutoff: material.alphaTest,\n basecolor: _getColor(material.color),\n transmission: material.transmission,\n transmissionIOR: material.ior,\n metallic: material.metalness,\n doubleSided: material.side === DoubleSide,\n specularColor: _getColor(material.specularColor),\n specularity: material.specularIntensity,\n roughness: material.roughness,\n occlusion: material.aoMapIntensity,\n emissiveColor: _getColor(material.emissive),\n emissiveIntensity: material.emissiveIntensity,\n clearcoatIntensity: material.clearcoat,\n clearcoatRoughness: material.clearcoatRoughness,\n clearcoatNormalScale: material.clearcoatNormalScale.x,\n sheenColor: _getColor(material.sheenColor),\n sheenIntensity: material.sheen,\n sheenRoughness: material.sheenRoughness,\n thicknessFactor: material.thickness,\n attenuationColor: _getColor(material.attenuationColor),\n attenuationDistance: material.attenuationDistance,\n };\n};\n\nconst _setColor = (meshColor: Color, rapiColor?: RapiBaseColor) => {\n if (rapiColor !== undefined) {\n const color = new Color(rapiColor.r, rapiColor.g, rapiColor.b);\n meshColor.copy(color.convertSRGBToLinear());\n }\n};\n\nconst _getColor = (meshColor: Color): RapiBaseColor => {\n const color = meshColor.clone().convertLinearToSRGB();\n return {\n r: color.r,\n g: color.g,\n b: color.b,\n };\n};\n\nlet textureLoader: TextureLoader | null = null;\n\nexport const addTexture = (\n assetUrl: AssetUrl,\n rapiTexture: RapiTexture,\n material: MeshPhysicalMaterial,\n maxAnisotropy: number,\n repeatWidth: number,\n repeatHeight: number,\n maxTextures: number = 16,\n): Promise<void> => {\n if (!textureLoader) {\n textureLoader = new TextureLoader();\n textureLoader.crossOrigin = '';\n }\n // Capture in local const so TS narrows the type inside the closure below\n const loader = textureLoader;\n return new Promise<void>((resolve, reject) => {\n if (!assetUrl) {\n console.warn('trying to add a texture without image', rapiTexture);\n // we resolve here because otherwise Promise.all fails\n resolve();\n return;\n }\n loader.load(\n assetUrl,\n (texture) => {\n addExistingTexture(\n texture,\n rapiTexture,\n material,\n maxAnisotropy,\n repeatWidth,\n repeatHeight,\n maxTextures,\n );\n resolve();\n },\n (error) => {\n reject(error);\n },\n );\n });\n};\n\nexport const addExistingTexture = (\n texture: Texture,\n rapiTexture: RapiTexture,\n material: MeshPhysicalMaterial,\n maxAnisotropy: number,\n repeatWidth: number,\n repeatHeight: number,\n maxTextures: number = 16,\n) => {\n texture.anisotropy = maxAnisotropy;\n texture.wrapS = RepeatWrapping;\n texture.wrapT = RepeatWrapping;\n\n if (\n maxTextures <= 8 &&\n [\n RAPI_TEXTURE_TYPE.ORM,\n RAPI_TEXTURE_TYPE.EMRGB,\n RAPI_TEXTURE_TYPE.CCRG,\n RAPI_TEXTURE_TYPE.CCXYZ,\n RAPI_TEXTURE_TYPE.SHRGBA,\n RAPI_TEXTURE_TYPE.SPRGBA,\n RAPI_TEXTURE_TYPE.TTRG,\n ].includes(rapiTexture.mapping)\n ) {\n console.warn(\n 'ORM maps are not supported on devices with only ' +\n maxTextures +\n ' texture units',\n );\n return;\n }\n\n texture.repeat.set(repeatWidth, repeatHeight);\n _setMaterialMaps(texture, rapiTexture, material);\n\n if (rapiTexture.mapping === RAPI_TEXTURE_TYPE.RGBA) {\n material.transparent = true;\n\n if (material.userData.materialVersion === 1) {\n const isEmissive = material.name.includes('glow');\n if (isEmissive) {\n material.emissiveIntensity = 0.5;\n material.emissive = new Color(0xffffff);\n material.emissiveMap = material.map;\n }\n }\n }\n\n material.needsUpdate = true;\n};\n\nconst _setMaterialMaps = (\n texture: Texture,\n rapiTexture: RapiTexture,\n material: MeshPhysicalMaterial,\n) => {\n if (rapiTexture.mapping === RAPI_TEXTURE_TYPE.XYZ) {\n material.normalMap = texture;\n if (material.map === getWhiteTexture()) {\n material.map = null;\n }\n } else if (rapiTexture.mapping === RAPI_TEXTURE_TYPE.ORM) {\n material.aoMap = texture;\n material.roughnessMap = texture;\n material.metalnessMap = texture;\n } else if (rapiTexture.mapping === RAPI_TEXTURE_TYPE.EMRGB) {\n material.emissiveMap = texture;\n } else if (rapiTexture.mapping === RAPI_TEXTURE_TYPE.CCRG) {\n material.clearcoatMap = texture;\n material.clearcoatRoughnessMap = texture;\n } else if (rapiTexture.mapping === RAPI_TEXTURE_TYPE.CCXYZ) {\n material.clearcoatNormalMap = texture;\n } else if (rapiTexture.mapping === RAPI_TEXTURE_TYPE.SHRGBA) {\n material.sheenColorMap = texture;\n material.sheenRoughnessMap = texture;\n } else if (rapiTexture.mapping === RAPI_TEXTURE_TYPE.SPRGBA) {\n material.specularColorMap = texture;\n material.specularIntensityMap = texture;\n } else if (rapiTexture.mapping === RAPI_TEXTURE_TYPE.TTRG) {\n material.transmissionMap = texture;\n material.thicknessMap = texture;\n } else {\n texture.colorSpace = SRGBColorSpace;\n material.map = texture;\n }\n};\n\nexport const getGUI = (autoplace: boolean = true): GUI | null => {\n if (!window.__RML_GUI__) {\n if (!_guiClass) {\n return null;\n }\n try {\n window.__RML_GUI__ = new _guiClass({ autoPlace: autoplace });\n } catch {\n return null;\n }\n }\n return window.__RML_GUI__ ?? null;\n};\n\nexport const hideWallsBasedOnCamera = (\n camera: Camera,\n wallPlanElementViewModels: WallPlanElementViewModel[],\n): boolean => {\n let anyVisibilityChanged = false;\n for (const wallPlanElementViewModel of wallPlanElementViewModels) {\n const kernelWall = wallPlanElementViewModel.getKernelObject();\n let wallNormal;\n if (kernelWall.wallType.value === KernelWallType.OuterWallRight) {\n wallNormal = convertToTHREE(kernelWall.rightNormal);\n }\n if (kernelWall.wallType.value === KernelWallType.OuterWallLeft) {\n wallNormal = convertToTHREE(kernelWall.leftNormal);\n }\n let visible = true;\n if (wallNormal) {\n let wallCenter = convertToTHREE(\n wallPlanElementViewModel.getPlanElement().getCenter(),\n );\n wallCenter = wallCenter.applyMatrix4(camera.matrixWorldInverse);\n\n wallNormal = wallNormal.transformDirection(camera.matrixWorldInverse);\n const cameraDirection = wallCenter;\n const dotProduct = cameraDirection.dot(wallNormal);\n visible = dotProduct >= 0;\n }\n if (visible !== wallPlanElementViewModel.getContainer().visible) {\n anyVisibilityChanged = true;\n }\n if (visible) {\n wallPlanElementViewModel.setContainerVisibility(true);\n } else {\n if (!wallPlanElementViewModel.isSelected) {\n wallPlanElementViewModel.setContainerVisibility(false);\n }\n }\n }\n return anyVisibilityChanged;\n};\n\nexport const setWallTransparency = (\n material: Material,\n transparent: boolean,\n animate = true,\n) => {\n if (material.userData.tween) {\n return;\n }\n if (transparent) {\n material.transparent = true;\n if (!animate) {\n material.opacity = 0.2;\n } else {\n const params = { opacity: 1 };\n material.userData.tween = true;\n const tween = new Tween(params)\n .to({ opacity: 0.2 }, 400)\n .easing(Easing.Sinusoidal.In)\n .onUpdate(() => {\n material.opacity = params.opacity;\n })\n .onComplete(() => {\n material.userData.tween = false;\n window.TWEEN?.remove(tween);\n })\n .start();\n window.TWEEN?.add(tween);\n }\n } else {\n if (!animate) {\n material.opacity = 1;\n material.transparent = false;\n } else {\n const params = { opacity: 0.2 };\n material.userData.tween = true;\n const tween = new Tween(params)\n .to({ opacity: 1 }, 400)\n .easing(Easing.Sinusoidal.In)\n .onUpdate(() => {\n material.opacity = params.opacity;\n })\n .onComplete(() => {\n material.transparent = false;\n material.userData.tween = false;\n window.TWEEN?.remove(tween);\n })\n .start();\n window.TWEEN?.add(tween);\n }\n }\n};\n\nexport const animateObjectMatrix = (\n object3d: Object3D,\n priorMatrix: Matrix4,\n fromMatrix: Matrix4,\n toMatrix: Matrix4,\n subsequentTransform: Matrix4,\n onProgressUpdate?: () => void,\n): Tween => {\n const baseMatrix = calculateBaseMatrix(fromMatrix, toMatrix);\n const finalMatrix = subsequentTransform\n .clone()\n .multiply(toMatrix)\n .multiply(priorMatrix);\n const inverseBaseMatrix = baseMatrix.clone().invert();\n const fromAddOnMatrix = inverseBaseMatrix.clone().multiply(fromMatrix);\n const toAddOnMatrix = inverseBaseMatrix.clone().multiply(toMatrix);\n const params = { t: 0 };\n const tween = new Tween(params)\n .to({ t: 1 }, 400)\n .easing(Easing.Quadratic.InOut)\n .onUpdate(() => {\n const interpolatedMatrix = circularInterpolateMatrix(\n fromAddOnMatrix,\n toAddOnMatrix,\n params.t,\n );\n const finalInterpolatedMatrix = subsequentTransform\n .clone()\n .multiply(baseMatrix)\n .multiply(interpolatedMatrix)\n .multiply(priorMatrix);\n setObjectMatrix(object3d, finalInterpolatedMatrix);\n if (onProgressUpdate) {\n onProgressUpdate();\n }\n })\n .onComplete(() => {\n setObjectMatrix(object3d, finalMatrix);\n if (onProgressUpdate) {\n onProgressUpdate();\n }\n window.TWEEN?.remove(tween);\n })\n .onStop(() => {\n window.TWEEN?.remove(tween);\n })\n .start();\n window.TWEEN?.add(tween);\n return tween;\n};\n\nexport const calculateBaseMatrix = (matrixFrom: Matrix4, matrixTo: Matrix4) => {\n const inverseFromMatrix = matrixFrom.clone().invert();\n const deltaMatrix = inverseFromMatrix.clone().multiply(matrixTo);\n const deltaPosition = new Vector3();\n const deltaQuaternion = new Quaternion();\n deltaMatrix.decompose(deltaPosition, deltaQuaternion, new Vector3());\n const delta = getAxisAndAngleFromQuaternion(deltaQuaternion);\n const yAxis = delta.axis;\n if (\n deltaPosition.length() < 0.001 ||\n Math.abs(delta.angleRad) < 0.001 ||\n yAxis.length() < 0.001\n ) {\n return new Matrix4().identity();\n }\n const fromPosition = new Vector3().setFromMatrixPosition(matrixFrom);\n const toPosition = new Vector3().setFromMatrixPosition(matrixTo);\n let zAxis = fromPosition.clone().sub(toPosition);\n const fromToDistance = zAxis.length();\n const xAxis = new Vector3().crossVectors(yAxis, zAxis).normalize();\n zAxis = new Vector3().crossVectors(xAxis, yAxis).normalize();\n let origin = fromPosition.clone().add(toPosition).multiplyScalar(0.5);\n origin = origin.sub(\n xAxis\n .clone()\n .multiplyScalar((fromToDistance * 0.5) / Math.tan(delta.angleRad * 0.5)),\n );\n return new Matrix4().makeBasis(xAxis, yAxis, zAxis).setPosition(origin);\n};\n\nexport const getAxisAndAngleFromQuaternion = (\n quaternion: Quaternion,\n): { axis: Vector3; angleRad: number } => {\n const s = Math.sqrt(1 - quaternion.w * quaternion.w);\n const axis = new Vector3(\n quaternion.x,\n quaternion.y,\n quaternion.z,\n ).multiplyScalar(s === 0 ? 1 : 1 / s);\n const angleRad = 2 * Math.acos(quaternion.w);\n return { axis, angleRad };\n};\n\nexport const setObjectMatrix = (object3d: Object3D, matrix: Matrix4) => {\n object3d.updateMatrix();\n matrix.multiply(object3d.matrix.clone().invert());\n object3d.applyMatrix4(matrix);\n object3d.updateMatrix();\n};\n\nexport const circularInterpolateMatrix = (\n matrixFrom: Matrix4,\n matrixTo: Matrix4,\n t: number,\n): Matrix4 => {\n const fromPosition = new Vector3();\n const fromQuaternion = new Quaternion();\n const fromScale = new Vector3();\n matrixFrom.decompose(fromPosition, fromQuaternion, fromScale);\n const toPosition = new Vector3();\n const toQuaternion = new Quaternion();\n const toScale = new Vector3();\n matrixTo.decompose(toPosition, toQuaternion, toScale);\n let position = new Vector3().lerpVectors(fromPosition, toPosition, t);\n const quaternion = new Quaternion().slerpQuaternions(\n fromQuaternion,\n toQuaternion,\n t,\n );\n const deltaQuaternion = fromQuaternion\n .clone()\n .conjugate()\n .multiply(toQuaternion);\n const deltaRotation = getAxisAndAngleFromQuaternion(deltaQuaternion);\n if (deltaRotation.angleRad > Math.PI) {\n deltaRotation.angleRad -= 2 * Math.PI;\n }\n if (\n Math.abs(deltaRotation.angleRad) > toRadiant(1) &&\n fromPosition.length() > 0.001 &&\n toPosition.length() > 0.001\n ) {\n const dotFromTo = fromPosition\n .clone()\n .normalize()\n .dot(toPosition.clone().normalize());\n if (Math.abs(dotFromTo) < 0.999) {\n const axis = new Vector3().crossVectors(fromPosition, toPosition);\n const positionRotation = new Quaternion().setFromAxisAngle(\n axis.normalize(),\n Math.acos(dotFromTo) * t,\n );\n const originDistance =\n fromPosition.length() * t + toPosition.length() * (1 - t);\n position = fromPosition\n .applyQuaternion(positionRotation)\n .normalize()\n .multiplyScalar(originDistance);\n }\n }\n const scale = new Vector3().lerpVectors(fromScale, toScale, t);\n const matrix = new Matrix4();\n matrix.compose(position, quaternion, scale);\n return matrix;\n};\n\nexport const getColorFromInt = (combinedColor: number): Color => {\n const color = new Color();\n color.setRGB(\n (combinedColor >> 16) / 255,\n ((combinedColor >> 8) & 0xff) / 255,\n ((combinedColor >> 0) & 0xff) / 255,\n );\n return color;\n};\nconst applyFinalMaterialState = (\n material: Material,\n toMaterial: { opacity: number; transparent: boolean },\n) => {\n if (!toMaterial.transparent) {\n material.transparent = toMaterial.transparent;\n delete material.userData.postProcessingMaterialPlugin;\n }\n material.opacity = toMaterial.opacity;\n material.needsUpdate = true;\n};\n\nexport const TRANSPARENCY_ANIMATION_DURATION = 250;\nexport const transitionTransparencyOfMaterial = (\n object: Object3D,\n toMaterial: { opacity: number; transparent: boolean },\n): Promise<void> => {\n return new Promise((resolve) => {\n object.traverse((mesh) => {\n if (mesh instanceof Mesh) {\n const currentMaterial = mesh.material as Material;\n if (mesh.userData.tween) {\n mesh.userData.tween.stop();\n }\n const from = { opacity: currentMaterial.opacity };\n if (toMaterial.transparent) {\n currentMaterial.transparent = toMaterial.transparent;\n }\n const tween = new Tween(from);\n // Override toJSON to prevent the tween from being serialized\n // This can happen if we want to generate a perspective image\n // during a tween is going on. Because for perspective images\n // we copy the objects and therefore three.js serializes them.\n // for more details see:\n // * https://github.com/roomle-dev/web-sdk/pull/876\n // * https://roomle.atlassian.net/browse/RML-11691\n (tween as any).toJSON = (): any => undefined;\n mesh.userData.tween = tween;\n window.TWEEN?.add(\n tween\n .to(toMaterial, TRANSPARENCY_ANIMATION_DURATION)\n .easing(Easing.Linear.None)\n .onUpdate(() => {\n currentMaterial.opacity = from.opacity;\n })\n .onStop(() => {\n applyFinalMaterialState(currentMaterial, toMaterial);\n mesh.userData.tween = undefined;\n })\n .onComplete(() => {\n applyFinalMaterialState(currentMaterial, toMaterial);\n mesh.userData.tween = undefined;\n window.TWEEN?.remove(tween);\n resolve();\n })\n .start(),\n );\n }\n });\n });\n};\n\nexport const fadeIn = (object: Object3D) => {\n object.traverse((mesh) => {\n if (mesh instanceof Mesh) {\n const material = mesh.material as Material;\n if (material.opacity === 0) {\n return;\n }\n const from = { opacity: 0, transparent: true };\n const to = {\n opacity: material.opacity,\n transparent: material.transparent,\n };\n material.transparent = from.transparent;\n material.opacity = from.opacity;\n const tween = new Tween(from)\n .to(to, 500)\n .easing(Easing.Linear.None)\n .onUpdate(() => {\n material.opacity = from.opacity;\n })\n .onComplete(() => {\n material.transparent = to.transparent;\n window.TWEEN?.remove(tween);\n })\n .start();\n window.TWEEN?.add(tween);\n }\n });\n};\n\nexport const checkGLB = (glb: Object3D, url: string): boolean => {\n const boundingBox = new Box3().setFromObject(glb);\n const size = boundingBox.getSize(new Vector3());\n const minSize = Math.min(size.x, size.y, size.z);\n let noError = true;\n if (minSize > 5) {\n console.warn('GLB seems to be too big (' + minSize + ')', url);\n noError = false;\n }\n if (boundingBox.min.y < -0.01) {\n console.warn(\n 'GLB seems to be under the floor (' + boundingBox.min.y + '): ',\n url,\n );\n noError = false;\n }\n return noError;\n};\n\nexport const dispose = (object: Object3D): void => {\n if (object.type === 'Mesh') {\n disposeMesh(object as Mesh);\n } else {\n disposeObject(object);\n }\n};\n\nexport const disposeObject = (object: Object3D): void => {\n if (!object || !object.children || object.children.length === 0) {\n return;\n }\n object.children.forEach((child) => {\n disposeMesh(child as Mesh);\n });\n};\n\nexport const disposeMesh = (mesh: Mesh): void => {\n if (!mesh) {\n return;\n }\n if (mesh.material) {\n disposeMaterial(mesh.material as MeshStandardMaterial);\n }\n if (mesh.geometry) {\n disposeGeometry(mesh.geometry as BufferGeometry);\n }\n if (mesh.children && mesh.children.length > 0) {\n disposeObject(mesh);\n }\n};\n\nexport const disposeGeometry = (geometry: BufferGeometry): void => {\n if (geometry) {\n geometry.dispose();\n }\n};\n\nexport const disposeMaterial = (material: MeshStandardMaterial): void => {\n if (material) {\n // if we add more different maps we have to dispose them separately\n if (material.map) {\n material.map.dispose();\n }\n if (material.normalMap) {\n material.normalMap.dispose();\n }\n material.dispose();\n }\n};\n\nlet boundingBoxMaterial: MeshBasicMaterial;\nexport const getBoundingBoxMaterial = (): MeshBasicMaterial => {\n if (!boundingBoxMaterial) {\n boundingBoxMaterial = new MeshBasicMaterial();\n boundingBoxMaterial.visible = false;\n }\n return boundingBoxMaterial;\n};\n\nlet debugBoundingBoxMaterial: MeshStandardMaterial;\nexport const getDebugBoundingBoxMaterial = (\n colorString?: string,\n): MeshStandardMaterial => {\n if (!debugBoundingBoxMaterial) {\n debugBoundingBoxMaterial = MaterialCreator.createMeshStandardMaterial({\n color: colorString ? colorString : '#FF0000',\n transparent: true,\n opacity: 0.5,\n visible: true,\n polygonOffset: true,\n polygonOffsetFactor: -1,\n });\n }\n return debugBoundingBoxMaterial;\n};\n\nexport const vectorIsZero = (vector: Vector3): boolean => {\n return vector.x === 0 && vector.y === 0 && vector.z === 0;\n};\n\nexport const getMaterialId = (\n material: any,\n type?: KernelEnum,\n): string | null => {\n let materialId = '';\n if (!material && material !== '') {\n return null;\n } else if (material.materialId && material.materialId !== '') {\n materialId = material.materialId;\n } else if (material.catalogItemId && material.catalogItemId !== '') {\n materialId = material.catalogItemId;\n } else if (material.rgbValue > 0) {\n materialId = 'rgb' + JSON.stringify(material.rgbValue);\n } else if ((material as string).length > 0) {\n materialId = material as string;\n } else if (type && type.value === PlanElementType.WALL) {\n materialId = 'default_wall_material_' + material.getSourceType().value;\n } else if (type && type.value === PlanElementType.CEILING) {\n materialId = 'default_ceiling_material_' + material.getSourceType().value;\n }\n return materialId;\n};\n\nexport const vectorIsEqual = (\n vector1: Vector3,\n vector2: Vector3,\n tolerance: number = 0.01,\n): boolean => {\n if (!vector1 || !vector2) {\n return false;\n }\n return (\n Math.abs(vector1.x - vector2.x) <= tolerance &&\n Math.abs(vector1.y - vector2.y) <= tolerance &&\n Math.abs(vector1.z - vector2.z) <= tolerance\n );\n};\n\nexport const getYRotationOfObject = (object: Object3D): number => {\n let objectDirection = object.getWorldDirection(new Vector3()).clone();\n objectDirection.y = 0;\n if (objectDirection.lengthSq() < 0.01) {\n objectDirection = new Vector3(0, 1, 0);\n objectDirection.applyQuaternion(object.quaternion);\n objectDirection.y = 0;\n }\n objectDirection.normalize();\n let angle = Math.asin(objectDirection.x);\n if (objectDirection.z < 0) {\n angle = Math.PI - angle;\n }\n // clamp to a value between 0 and 2 PI\n if (angle < 0) {\n angle += Math.PI * 2;\n }\n return angle;\n};\n\n/**\n * comparator function to compare two bounding boxes if they are within the other\n * @param box1\n * @param box2\n */\nexport const compareBox3Size = (box1: Box3, box2: Box3): number => {\n if (!box1 || !box2) {\n return 0;\n }\n\n const box1ContainsBox2 = box1.clone().expandByScalar(0.001).containsBox(box2);\n const box2ContainsBox1 = box2.clone().expandByScalar(0.001).containsBox(box1);\n if (\n (box2ContainsBox1 && box1ContainsBox2) ||\n (!box2ContainsBox1 && !box1ContainsBox2)\n ) {\n return 0;\n }\n return box1ContainsBox2 === true ? 1 : -1;\n};\n\n/**\n * Comparator function for three-dimensional bounding boxes.\n * Returns 1 if box1 contains box2, -1 if box2 contains box1, and for non-containing boxes, returns -1 if overlap exceeds 50% of box1's volume, otherwise 1.\n * Used for raycaster selection\n * @param box1\n * @param box2\n */\nexport const getBoxSelectionOrder = (box1: Box3, box2: Box3): number => {\n if (!box1 || !box2) {\n return 0;\n }\n\n const box1ContainsBox2 = box1.clone().expandByScalar(0.001).containsBox(box2);\n const box2ContainsBox1 = box2.clone().expandByScalar(0.001).containsBox(box1);\n if (box2ContainsBox1 && box1ContainsBox2) {\n return 0;\n } else if (!box2ContainsBox1 && !box1ContainsBox2) {\n const percentage = getOverlapPercentage(box1, box2);\n if (percentage === 0.5) {\n return 0;\n }\n return percentage > 0.5 ? -1 : 1;\n }\n return box1ContainsBox2 === true ? 1 : -1;\n};\n\nconst getOverlapPercentage = (box1: Box3, box2: Box3): number => {\n const intersection = new Box3();\n intersection.copy(box1).intersect(box2);\n\n if (intersection.isEmpty()) {\n return 0;\n }\n\n const getVolume = (b: Box3) => {\n const size = new Vector3();\n b.getSize(size);\n return size.x * size.y * size.z;\n };\n\n const boxVolume = getVolume(box1);\n const intersectionVolume = getVolume(intersection);\n\n if (boxVolume === 0) {\n return 0;\n }\n\n // Return the ratio (0.0 to 1.0)\n return intersectionVolume / boxVolume;\n};\n\nexport const isUVIdentityMatrix = (uvTransform: Float32Array): boolean => {\n return (\n uvTransform[0] === 1 &&\n uvTransform[1] === 0 &&\n uvTransform[2] === 0 &&\n uvTransform[3] === 1 &&\n uvTransform[4] === 0 &&\n uvTransform[5] === 0\n );\n};\n\nexport const getDrawingMinBounds = (\n planBounds: Box3,\n width: number,\n height: number,\n marginMultiplier: number = 1,\n): Box3 => {\n const landscape = width > height;\n\n const x = landscape ? 15 : 0;\n const z = landscape ? 0 : 10;\n\n const currentSize = planBounds.getSize(new Vector3());\n const currentCenter = planBounds.getCenter(new Vector3());\n\n let newX = currentSize.x > 2 * x ? currentSize.x / 2 : x;\n let newZ = currentSize.z > 2 * z ? currentSize.z / 2 : z;\n\n // add a margin of 10%\n newX *= marginMultiplier;\n newZ *= marginMultiplier;\n\n return new Box3(\n new Vector3(\n currentCenter.x - newX,\n currentCenter.y,\n currentCenter.z - newZ,\n ),\n new Vector3(\n currentCenter.x + newX,\n currentCenter.y,\n currentCenter.z + newZ,\n ),\n );\n};\n\nexport const threeVectorToTransferableXY = (\n vec: Vector2 | Vector3,\n): Position2 => {\n const { x, y } = vec;\n return { x, y };\n};\n\nexport const threeVectorToTransferableXYZ = (vec: Vector3): Position3 => {\n const { x, y, z } = vec;\n return { x, y, z };\n};\n\nexport const getActiveLayers = (layers: Layers) => {\n const names = [\n 'DEFAULT',\n 'LIGHTING',\n 'BACKGROUND',\n 'OBJECT',\n 'COMPONENT',\n 'PREVIEW',\n 'UI',\n 'GIZMO',\n 'DIMENSIONS',\n 'CONSTRUCTION',\n ];\n const active: string[] = [];\n for (let i = 0, length = names.length; i < length; i++) {\n const layer = new Layers();\n layer.disableAll();\n layer.enable(i);\n if (layers.test(layer)) {\n active.push(names[i]);\n }\n }\n return active;\n};\n\nexport const viewSpacePositionFromUV = (\n distance: number,\n u: number,\n v: number,\n): Vector3 => {\n return new Vector3().setFromSphericalCoords(\n distance,\n Math.PI * (1 - v),\n Math.PI * 2 * (1 - u),\n );\n};\n\nexport const createEmptySceneFromCurrent = (currentScene: Scene) => {\n const scene = new Scene();\n if (currentScene.environment) {\n scene.environment = currentScene.environment.clone();\n }\n if (currentScene.userData.environmentDefinition) {\n scene.userData.environmentDefinition =\n currentScene.userData.environmentDefinition.clone();\n }\n scene.userData.shadowFromEnvironment =\n currentScene.userData.shadowFromEnvironment;\n return scene;\n};\n\nexport const isBox3InFrustum = (camera: Camera, box3: Box3): boolean => {\n const frustum = new Frustum();\n const matrix = new Matrix4().multiplyMatrices(\n camera.projectionMatrix,\n camera.matrixWorldInverse,\n );\n frustum.setFromProjectionMatrix(matrix);\n const position = box3.getCenter(new Vector3());\n return frustum.containsPoint(position);\n};\n\nexport type RoomleEventedMesh = Mesh<\n // not so nice that I have to specify the first to generics\n // but TS supports it only this way, for more details see:\n // https://github.com/microsoft/TypeScript/issues/26242\n BufferGeometry<NormalBufferAttributes>,\n Material | Material[],\n Object3DRoomleEventMap\n>;\n\nexport type RoomleEventedObject3D = Object3D<Object3DRoomleEventMap>;\n\nexport interface RoomleEventedObject3DSubComponent\n extends RoomleEventedObject3D {\n parentComponent?: RoomleEventedObject3D;\n}\n\nexport type RoomleEventedIntersection = Intersection<RoomleEventedObject3D>;\n\ninterface InputEventAttatchment {\n intersection: RoomleEventedIntersection;\n type: INPUT_EVENT_TYPE;\n}\nexport interface Object3DRoomleEventMap extends Object3DEventMap {\n [OBJECT_EVENT.CLICK]: {\n attachment: InputEventAttatchment;\n };\n [OBJECT_EVENT.DOUBLE_CLICK]: { attachment: InputEventAttatchment };\n [OBJECT_EVENT.DRAG]: { attachment: { position: Vector3 } };\n [OBJECT_EVENT.DRAG_END]: { attachment: { position: Position2 } };\n [OBJECT_EVENT.DRAG_START]: object;\n [OBJECT_EVENT.HOVER_MOVE]: { attachment: InputEventAttatchment };\n [OBJECT_EVENT.HOVER_OFF]: { attachment: { type: INPUT_EVENT_TYPE } };\n [OBJECT_EVENT.HOVER_ON]: { attachment: InputEventAttatchment };\n [OBJECT_EVENT.ROTATE]: { attachment: { rotation: number } };\n}\n\n/**\n * normalize the angle between -PI and PI\n */\nexport const normalizeRotation = (angleInRad: number): number => {\n return Math.atan2(Math.sin(angleInRad), Math.cos(angleInRad));\n};\n\nexport const patchLighting = (shaderChunk: typeof ShaderChunk) => {\n // Based on https://github.com/DolphinIQ/threejs-point-lights-optimization/blob/main/files/js/Main.js#L118\n\n shaderChunk.lights_fragment_begin = `\n vec3 geometryPosition = - vViewPosition;\n vec3 geometryNormal = normal;\n vec3 geometryViewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );\n vec3 geometryClearcoatNormal = vec3( 0.0 );\n #ifdef USE_CLEARCOAT\n geometryClearcoatNormal = clearcoatNormal;\n #endif\n\n // OPTIMIZATION: Early exit for transparent/invisible materials\n #ifdef USE_ALPHATEST\n if ( diffuseColor.a < alphaTest ) discard;\n #endif\n\n // OPTIMIZATION: Cache expensive calculations\n float NdotV = saturate( dot( geometryNormal, geometryViewDir ) );\n\n #ifdef USE_IRIDESCENCE\n float dotNVi = NdotV; // Reuse calculated value\n if ( material.iridescenceThickness == 0.0 ) {\n material.iridescence = 0.0;\n } else {\n material.iridescence = saturate( material.iridescence );\n }\n // OPTIMIZATION: Skip iridescence calculations if effect is minimal\n if ( material.iridescence > 0.01 ) {\n material.iridescenceFresnel = evalIridescence( 1.0, material.iridescenceIOR, dotNVi, material.iridescenceThickness, material.specularColor );\n material.iridescenceF0 = Schlick_to_F0( material.iridescenceFresnel, 1.0, dotNVi );\n }\n #endif\n\n IncidentLight directLight;\n\n // OPTIMIZATION: Early exit if material has no metalness or roughness variation\n #ifdef USE_ROUGHNESSMAP\n bool hasRoughnessVariation = true;\n #else\n bool hasRoughnessVariation = false;\n #endif\n\n #ifdef USE_METALNESSMAP\n bool hasMetalnessVariation = true;\n #else\n bool hasMetalnessVariation = false;\n #endif\n\n #if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n PointLight pointLight;\n #if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0\n PointLightShadow pointLightShadow;\n #endif\n #pragma unroll_loop_start\n for ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n pointLight = pointLights[ i ];\n getPointLightInfo( pointLight, geometryPosition, directLight );\n\n // OPTIMIZATION: Enhanced visibility and distance checks\n #if defined( RE_Direct )\n if ( directLight.visible ) {\n // OPTIMIZATION: Skip lights with negligible contribution based on color intensity\n float lightIntensity = dot( directLight.color, vec3( 0.299, 0.587, 0.114 ) );\n if ( lightIntensity > 0.001 ) {\n #if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS )\n pointLightShadow = pointLightShadows[ i ];\n directLight.color *= ( directLight.visible && receiveShadow ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowIntensity, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0;\n #endif\n RE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n }\n }\n #endif\n }\n #pragma unroll_loop_end\n #endif\n\n #if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n SpotLight spotLight;\n vec4 spotColor;\n vec3 spotLightCoord;\n bool inSpotLightMap;\n #if defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_SHADOWS > 0\n SpotLightShadow spotLightShadow;\n #endif\n #pragma unroll_loop_start\n for ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n spotLight = spotLights[ i ];\n getSpotLightInfo( spotLight, geometryPosition, directLight );\n\n // OPTIMIZATION: Enhanced visibility checks for spot lights\n #if defined( RE_Direct )\n if ( directLight.visible ) {\n // OPTIMIZATION: Skip spot light map calculation if light contribution is minimal\n float lightIntensity = dot( directLight.color, vec3( 0.299, 0.587, 0.114 ) );\n if ( lightIntensity > 0.001 ) {\n #if ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\n #define SPOT_LIGHT_MAP_INDEX UNROLLED_LOOP_INDEX\n #elif ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n #define SPOT_LIGHT_MAP_INDEX NUM_SPOT_LIGHT_MAPS\n #else\n #define SPOT_LIGHT_MAP_INDEX ( UNROLLED_LOOP_INDEX - NUM_SPOT_LIGHT_SHADOWS + NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\n #endif\n #if ( SPOT_LIGHT_MAP_INDEX < NUM_SPOT_LIGHT_MAPS )\n spotLightCoord = vSpotLightCoord[ i ].xyz / vSpotLightCoord[ i ].w;\n inSpotLightMap = all( lessThan( abs( spotLightCoord * 2. - 1. ), vec3( 1.0 ) ) );\n if ( inSpotLightMap ) {\n spotColor = texture2D( spotLightMap[ SPOT_LIGHT_MAP_INDEX ], spotLightCoord.xy );\n directLight.color = directLight.color * spotColor.rgb;\n }\n #endif\n #undef SPOT_LIGHT_MAP_INDEX\n #if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n spotLightShadow = spotLightShadows[ i ];\n directLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( spotShadowMap[ i ], spotLightShadow.shadowMapSize, spotLightShadow.shadowIntensity, spotLightShadow.shadowBias, spotLightShadow.shadowRadius, vSpotLightCoord[ i ] ) : 1.0;\n #endif\n RE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n }\n }\n #endif\n }\n #pragma unroll_loop_end\n #endif\n\n #if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n DirectionalLight directionalLight;\n #if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\n DirectionalLightShadow directionalLightShadow;\n #endif\n #pragma unroll_loop_start\n for ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n directionalLight = directionalLights[ i ];\n getDirectionalLightInfo( directionalLight, directLight );\n\n // OPTIMIZATION: Skip very dim directional lights\n #if defined( RE_Direct )\n float lightIntensity = dot( directLight.color, vec3( 0.299, 0.587, 0.114 ) );\n if ( directLight.visible && lightIntensity > 0.001 ) {\n #if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\n directionalLightShadow = directionalLightShadows[ i ];\n directLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowIntensity, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n #endif\n RE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n }\n #endif\n }\n #pragma unroll_loop_end\n #endif\n\n #if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n RectAreaLight rectAreaLight;\n #pragma unroll_loop_start\n for ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\n rectAreaLight = rectAreaLights[ i ];\n // OPTIMIZATION: Simple rect area light processing - Three.js handles distance internally\n RE_Direct_RectArea( rectAreaLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n }\n #pragma unroll_loop_end\n #endif\n\n // OPTIMIZATION: Streamlined indirect lighting with early exits\n #if defined( RE_IndirectDiffuse )\n vec3 iblIrradiance = vec3( 0.0 );\n vec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\n // OPTIMIZATION: Skip light probe calculation if ambient is sufficient\n float ambientIntensity = dot( irradiance, vec3( 0.299, 0.587, 0.114 ) );\n\n #if defined( USE_LIGHT_PROBES )\n if ( ambientIntensity < 0.9 ) {\n irradiance += getLightProbeIrradiance( lightProbe, geometryNormal );\n }\n #endif\n\n #if ( NUM_HEMI_LIGHTS > 0 )\n if ( ambientIntensity < 0.9 ) {\n #pragma unroll_loop_start\n for ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n vec3 hemiContribution = getHemisphereLightIrradiance( hemisphereLights[ i ], geometryNormal );\n // OPTIMIZATION: Skip negligible hemisphere light contributions\n if ( dot( hemiContribution, vec3( 0.299, 0.587, 0.114 ) ) > 0.001 ) {\n irradiance += hemiContribution;\n }\n }\n #pragma unroll_loop_end\n }\n #endif\n #endif\n\n #if defined( RE_IndirectSpecular )\n vec3 radiance = vec3( 0.0 );\n vec3 clearcoatRadiance = vec3( 0.0 );\n #endif`;\n\n shaderChunk.lights_pars_begin = shaderChunk.lights_pars_begin.replace(\n `light.color = pointLight.color;`,\n `\n\t\tlight.color = pointLight.color * step( lightDistance, pointLight.distance );\n\t\t`,\n );\n};\n"],"x_google_ignoreList":[4],"mappings":"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"}
1
+ {"version":3,"file":"threejs-utils-CrK_gp1x.mjs","names":[],"sources":["../../packages/common-core/src/utils/math-helper.ts","../../packages/typings/planner-kernel-container.ts","../../packages/typings/planner.ts","../../packages/common-core/src/utils/material-creator.ts","../../../../node_modules/@tweenjs/tween.js/dist/tween.esm.js","../../packages/common-core/src/utils/threejs-utils.ts"],"sourcesContent":["import type { Position2 } from '../common-interfaces';\n\nexport const toRadiant = function (degree: number): number {\n return degree * (Math.PI / 180);\n};\n\nexport const toDegrees = function (radians: number): number {\n return radians * (180 / Math.PI);\n};\n\nexport const moduloPlusMinus180 = function (angle: number): number {\n return angle >= 0\n ? -180 + ((angle + 180) % 360)\n : 180 - ((-angle + 180) % 360);\n};\n\nexport const getIdealDistance = function (\n width: number,\n height: number,\n depth: number,\n fov: number,\n screenWidth: number,\n screenHeight: number,\n): number {\n width = Math.sqrt(width * width + depth * depth);\n const aspectRatio = screenWidth / screenHeight || 1;\n const radianHorizontalFov =\n (2 * Math.atan(Math.tan((fov * Math.PI) / 180 / 2) * aspectRatio) * 180) /\n Math.PI;\n const radianFOV = toRadiant(fov);\n const fitHeightDistance = height / 2 / Math.tan(radianFOV / 2);\n const fitWidthDistance =\n width / (2 * Math.atan((Math.PI * radianHorizontalFov) / 360));\n return Math.max(fitHeightDistance, fitWidthDistance);\n};\n\nexport const round = function (x: number): number {\n return Math.round(x * 1000) / 1000;\n};\n\nexport const getDelta = function (v1: Position2, v2: Position2): number {\n // return Math.sqrt(Math.pow(this._downPosition.y - this._position.y, 2) + Math.pow(this._downPosition.x - this._position.x, 2));\n //this calculation is cheaper than pythagoras\n return Math.abs(v1.y - v2.y) + Math.abs(v1.x - v2.x);\n};\n\nexport const getAngle = function (v1: Position2, v2: Position2): number {\n return Math.atan2(v2.y - v1.y, v2.x - v1.x);\n};\n\nexport const to360Degrees = function (radians: number): number {\n let degrees = toDegrees(radians);\n //normalize to 360 degrees\n if (degrees < 0) {\n degrees = 180 + (180 + degrees);\n }\n return degrees;\n};\n\nexport const angleToKernelRotation = function (angle: number): number {\n let degrees = to360Degrees(angle);\n //shift by 90 degrees\n degrees = (degrees + 270) % 360;\n //return to -180 to +180\n if (degrees > 180) {\n degrees -= 360;\n }\n //invert\n degrees *= -1;\n return toRadiant(degrees);\n};\n","import type {\n ConfiguratorKernelClass,\n KernelAddOnSpot,\n KernelComponent,\n KernelConfiguration,\n KernelDockPairPreview,\n KernelEnum,\n KernelParameter,\n KernelParameterGroup,\n KernelParameterValue,\n KernelParamKeyValuePair,\n KernelPart,\n KernelPartListParameter,\n KernelPlanObject,\n KernelPossibleChild,\n KernelRange,\n KernelVariable,\n KernelVector2f,\n KernelVector3f,\n} from './kernel';\nimport type { PlanInteractionHandler, WallSide } from './planner';\nimport type { Enumify } from '#/common/src/utils/types';\n// eslint-disable-next-line no-unused-vars -- used in declare class extends\nimport type { EmsArray, EmsList, EmsSet } from './ems';\n\nexport declare class PlanObjectList extends EmsList<PlanObjectPtr> {}\n\nexport declare class KernelPlanObjectList extends EmsList<KernelPlanObject> {}\n\ndeclare class ConstructionObjectSet extends EmsSet<ConstructionObject> {}\n\ndeclare class PlanObjectObjectSet extends EmsSet<PlanObjectPtr> {}\n\ndeclare class ExternalReference {\n public getJsObject(): any;\n\n public setJsObject(jsObject: any): void;\n\n public getReference(): number;\n\n public setReference(reference: number): void;\n\n public setSelfPtr(ptr: any): void;\n\n public getSelfPtrRef(): any;\n\n public clearSelfRef(): void;\n}\n\ndeclare class EMSReference {\n public jsObject: any;\n\n public static ptrFromRaw(ptr: number): number;\n\n public getVoidReference(): number;\n\n public setVoidReference(reference: number): void;\n\n public getSelfPtrRef(): number;\n\n public setSelfPtr(ptr: number): void;\n\n public clearSelfReference(): void;\n}\n\nexport class EMSConstant {\n value: number;\n}\n\nabstract class AbstractModel {\n public extRef: number;\n\n public abstract getId(): number;\n}\n\nclass AbstractModelWrapper extends AbstractModel {\n public getId(): number {\n // only for typing\n return 0;\n }\n}\n\ndeclare abstract class PlanElement extends AbstractModelWrapper {\n public isLocked: boolean;\n public isValid: boolean;\n\n public getType(): PlanElementType;\n\n public getCenter(): KernelVector3f;\n}\n\ndeclare abstract class ObjectGroup extends PlanElement {\n public getObjects(): PlanObjectPtr;\n}\n\ndeclare abstract class PlanText extends PlanElement {\n public getText(): string;\n}\n\ndeclare abstract class PlanImage extends PlanElement {\n public url: string;\n public size: KernelVector2f;\n public rotation: KernelVector3f;\n public center: KernelVector3f;\n}\n\ndeclare abstract class PlanMeasure extends PlanElement {\n public getPoint1(): KernelVector3f;\n\n public getPoint2(): KernelVector3f;\n}\n\ndeclare abstract class Node extends PlanElement {\n public getNumberOfConnectedWalls(): number;\n\n public getMaxWallHeight(): number;\n}\n\ndeclare class CatalogItemPtrList extends EmsList<CatalogItem> {}\n\nexport declare class CatalogItem extends AbstractModelWrapper {\n public size: KernelVector3f;\n public layer: number;\n public type: string;\n public configuration: string;\n public orderable: boolean;\n public scaleable: boolean;\n public flipable: boolean;\n}\n\ndeclare class PlanObjectPtrList extends EmsList<PlanObjectPtr> {}\n\ndeclare class PlanObjectPtrVector extends EmsArray<PlanObjectPtr> {}\n\ndeclare abstract class PlanObjectPtr extends AbstractModelWrapper {\n public rotation: KernelVector3f;\n public rgbColor: number;\n public level: number;\n public flipX: boolean;\n public flipY: boolean;\n public fixedZ: boolean;\n public size: KernelVector3f;\n\n public getCatalogItemId(): string;\n\n public getConfigurationRuntimeId(): number;\n\n public getObjectType(): string;\n\n public hasConfiguration(): boolean;\n\n public isConfigurationLoaded(): boolean;\n}\n\ndeclare abstract class ConstructionObject extends PlanObjectPtr {\n public getAttachedWall(): Wall;\n}\n\ndeclare class Wall extends PlanObjectPtr {\n public readonly thickness: number;\n public readonly height: number;\n public readonly minimumHeight: number;\n public readonly maximumHeight: number;\n public readonly leftMaterial: WallMaterial;\n public readonly rightMaterial: WallMaterial;\n\n public getFrom(): Node;\n\n public getTo(): Node;\n\n public getCornerFromLeft(): KernelVector3f;\n\n public getCornerFromRight(): KernelVector3f;\n\n public getCornerToLeft(): KernelVector3f;\n\n public getCornerToRight(): KernelVector3f;\n\n public getAngle(): number;\n\n public getLength(): number;\n\n public getPreferredSide(): { value: Enumify<typeof WALL_SIDES> };\n\n public getAttachedObjects(): PlanObjectObjectSet;\n\n public getCenter(): KernelVector3f;\n\n public getHeightAt(aPoint: KernelVector3f): number;\n\n public getPointWithHeight(aHeight: number): KernelVector3f;\n}\n\ndeclare abstract class Floor extends PlanElement {\n public area: number;\n public material: FloorMaterial;\n\n public getCorners(): typeof EmsArray<KernelVector3f>;\n\n public getTriangulationIndices(): typeof EmsArray<number>;\n\n public getNumberOfTriangles(): number;\n\n public getRandomPointInside(): KernelVector3f;\n}\n\nexport declare abstract class BaseMaterial {\n public catalogItemId: string;\n public materialId: string;\n public rgbValue: number;\n public useCustomColor: boolean;\n\n public getCatalogItemId(): string;\n\n public getSourceType(): KernelEnum;\n}\n\ndeclare abstract class FloorMaterial extends BaseMaterial {\n public uvScale(): KernelVector3f;\n\n public rotation(): KernelVector3f;\n}\n\ndeclare abstract class WallMaterial extends BaseMaterial {\n // HAS NO SPECIAL PROPERTIES\n}\n\ninterface KernelCube {\n origin: KernelVector3f;\n size: KernelVector3f;\n}\n\ndeclare abstract class Plan extends AbstractModelWrapper {\n public defaultParapetHeight: number;\n public defaultWallColor: number;\n public defaultWallHeight: number;\n public defaultWallThickness: number;\n\n public increaseLockLevels(): void;\n\n public getPlanXML(): string;\n\n public getPlanXMLWithNormalizedLockLevels(): string;\n\n public getBounds(): KernelCube;\n\n public getPlanObjects(): PlanObjectPtrVector;\n\n public getWallCount(): number;\n\n public getImageCount(): number;\n\n public isEmpty(): boolean;\n\n public getTotalFloorArea(): number;\n\n public applySettings(aRoomHeight: number, aParapetHeight: number): void;\n\n public syncToView(): void;\n}\n\ndeclare abstract class PlanModelViewHelper {\n public static requestMesh3d(aPlanElement: PlanElement): void;\n\n public static requestPlanMesh3d(\n aPlanElement: PlanElement,\n includeCeiling: boolean,\n ): void;\n\n public static requestWallMesh2d(aWall: Wall): void;\n\n public static requestFloorMesh2d(aFloor: Floor): void;\n\n public static getCeilingHeight(aFloor: Floor): number;\n\n public static getMaxDistToBorderForPlanObject(\n aPlanObject: PlanObjectPtr,\n ): number;\n\n public static getDistToNextWallOnSide(\n anObject: PlanObjectPtr,\n aSide: PlanObjectSide,\n maxDist: number,\n ): number;\n\n public static getDistAlongWallOnSide(\n anObject: ConstructionObject,\n aSide: PlanObjectSide,\n aWallSide: WallSide,\n ): number;\n\n public static setDrawHiddenWallCaps(drawHiddenWallCaps: boolean): void;\n}\n\ndeclare class PointArray extends EmsArray<KernelVector3f> {}\n\ndeclare class SizeTArray extends EmsArray<number> {}\n\nexport const enum PlanElementType {\n NODE,\n WALL,\n OBJECT,\n FLOOR,\n TEXT,\n MEASURE,\n IMAGE,\n CEILING,\n}\n\nexport const enum PlanObjectSide {\n Back,\n Front,\n Left,\n Right,\n}\n\nexport const WALL_SIDES = {\n LEFT: 0,\n RIGHT: 1,\n MIDDLE: 2,\n} as const;\n\nexport interface WallExtensionType {\n ExtendBegin: EMSConstant;\n ExtendEnd: EMSConstant;\n ExtendBoth: EMSConstant;\n}\n\nexport const enum MaterialSourceType {\n None,\n CatalogItem, // eslint-disable-line\n Material,\n RgbValue,\n}\n\nexport const enum DrawingType {\n CONTINOUS,\n CLICK_PER_CLICK,\n}\n\nexport const enum SnapMode {\n OFF,\n ON_COLLISION,\n ON_COLLISION_ROTATE_WITHIN_DISTANCE,\n WITHIN_SNAP_DISTANCE,\n}\n\nexport const enum ResizingAnchor {\n Center,\n BackLeft,\n BackRight,\n FrontLeft,\n FrontRight,\n Back,\n Front,\n Left,\n Right,\n}\n\ndeclare class StringArray extends EmsArray<string> {}\n\ndeclare class Vector2fArray extends EmsArray<KernelVector2f> {}\n\ndeclare class LongArray extends EmsArray<number> {}\n\ndeclare class DockPairPreviewArray extends EmsArray<KernelDockPairPreview> {}\n\ndeclare class ComponentArray extends EmsArray<KernelComponent> {}\n\nconst enum Type {\n UNKNOWN,\n INTEGRAL,\n DECIMAL,\n STRING,\n MATERIAL,\n}\n\nconst enum UnitType {\n LENGTH,\n AREA,\n ANGLE,\n COUNT,\n}\n\ndeclare class VariableArray extends EmsArray<KernelVariable> {}\n\ndeclare class RangeArray extends EmsArray<KernelRange> {}\n\ndeclare class ParameterValueArray extends EmsArray<KernelParameterValue> {}\n\ndeclare class ParameterArray extends EmsArray<KernelParameter> {}\n\ndeclare class ParameterGroupArray extends EmsArray<KernelParameterGroup> {}\n\ndeclare class PartListParameterArray extends EmsArray<KernelPartListParameter> {}\n\ndeclare class ConfigurationArray extends EmsArray<KernelConfiguration> {}\n\ndeclare class PartArray extends EmsArray<KernelPart> {}\n\ndeclare class PossibleChildArray extends EmsArray<KernelPossibleChild> {}\n\ndeclare class AddOnSpotArray extends EmsArray<KernelAddOnSpot> {}\n\ndeclare class ParamKeyValuePairArray extends EmsArray<KernelParamKeyValuePair> {}\n\ndeclare class IntArray extends EmsArray<number> {}\n\nconst enum Unit {\n InchFeet,\n MM,\n CM,\n}\n\nconst enum UnitStringType {\n NoUnitString,\n LongUnitString,\n ShortUnitString,\n}\n\ndeclare class UnitMeasureFormatter {\n public init(\n mmLabel: string /* default 'mm' */,\n cmLabel: string /* default 'cm' */,\n ftShortLabel: string /* default ' */,\n ftLongLabel: string /* default 'ft' */,\n inchShortLabel: string /* default \" */,\n inchLongLabel: string /* default 'inch' */,\n sqMLabel: string /* default 'm²' */,\n sqftLabel: string /* default 'sqft' */,\n showExactValue: boolean /* default false */,\n maxPrecision: number /* default 6 */,\n showFractionalUnitString: boolean /* default true */,\n ): void;\n\n public showExactValues(shouldeI: boolean): void;\n\n public formatMMValueToUnitString(\n aValue: number,\n aUnit: Unit,\n aStringType: UnitStringType,\n ): string;\n\n public formatMMValueWithReqMaxLength(\n aValue: number,\n aUnit: Unit,\n reqMaxSize: number,\n ): string;\n\n public parseMMValueFromUnitString(aString: string, aUnit: Unit): number;\n\n public formatSquareMMValueToUnitString(aValue: number, aUnit: Unit): string;\n\n public parseSquareMMValueFromUnitString(aString: string, aUnit: Unit): number;\n\n public isParseableUnitString(aString: string, aUnit: Unit): boolean;\n\n public parseNumber(aString: string): number;\n\n public formatNumber(aValue: number, digit: number /* default 0 */): string;\n\n public isParseableNumber(aString: string): boolean;\n}\n\nexport interface PlannerKernelContainer {\n PointArray: PointArray;\n SizeTArray: SizeTArray;\n ConstructionObjectSet: ConstructionObjectSet;\n PlanObjectObjectSet: PlanObjectObjectSet;\n ExternalReference: ExternalReference;\n EMSReference: EMSReference;\n AbstractModel: AbstractModel;\n PlanElementType: PlanElementType;\n PlanElement: PlanElement;\n ObjectGroup: ObjectGroup;\n PlanText: PlanText;\n PlanImage: PlanImage;\n PlanMeasure: PlanMeasure;\n Node: Node;\n CatalogItemPtrList: CatalogItemPtrList;\n CatalogItem: CatalogItem;\n PlanObjectSide: PlanObjectSide;\n toPlanObjectSide: (a: number) => PlanObjectSide;\n PlanObjectPtrList: PlanObjectPtrList;\n PlanObjectPtrVector: PlanObjectPtrVector;\n PlanObject: PlanObjectPtr;\n ConstructionObject: ConstructionObject;\n ConstObjectPtr: ConstructionObject;\n WallSide: WallSide;\n toWallSide: (a: number) => WallSide;\n WallExtensionType: WallExtensionType;\n Wall: Wall;\n Floor: Floor;\n MaterialSourceType: MaterialSourceType;\n BaseMaterial: BaseMaterial;\n FloorMaterial: FloorMaterial;\n WallMaterial: WallMaterial;\n Plan: Plan;\n DrawingType: DrawingType;\n ResizingAnchor: ResizingAnchor;\n toResizingAnchor: (a: number) => ResizingAnchor;\n PlanInteractionHandler: PlanInteractionHandler;\n PlanModelViewHelper: PlanModelViewHelper;\n catalogItemLoaded: (aCatalogItem: CatalogItem) => void;\n registerPlannerCallback: (callbacksObject: any) => void;\n unregisterPlannerCallback: (callbacksObject: any) => void;\n StringArray: StringArray;\n Vector2fArray: Vector2fArray;\n LongArray: LongArray;\n DockPairPreviewArray: DockPairPreviewArray;\n ComponentArray: ComponentArray;\n Type: Type;\n UnitType: UnitType;\n VariableArray: VariableArray;\n RangeArray: RangeArray;\n ParameterValueArray: ParameterValueArray;\n ParameterArray: ParameterArray;\n ParameterGroupArray: ParameterGroupArray;\n PartListParameterArray: PartListParameterArray;\n ConfigurationArray: ConfigurationArray;\n PartArray: PartArray;\n PossibleChildArray: PossibleChildArray;\n AddOnSpotArray: AddOnSpotArray;\n PlanObjectList: PlanObjectList;\n ParamKeyValuePairArray: ParamKeyValuePairArray;\n IntArray: IntArray;\n Kernel: ConfiguratorKernelClass;\n Unit: Unit;\n UnitStringType: UnitStringType;\n toUnit: (enumIndex: number) => Unit;\n toUnitFormat: (enumIndex: number) => UnitStringType;\n UnitMeasureFormatter: UnitMeasureFormatter;\n}\n","import type {\n ConfigurationUniqueIdAndHash,\n ConfiguratorKernelClass,\n KernelCatalogItem,\n KernelCube,\n KernelEnum,\n KernelObjectPtrList,\n KernelPlanObject,\n KernelPlanObjectComponent,\n KernelVector3,\n KernelVector3f,\n ObjectGroupPtr,\n RuntimeId,\n} from './kernel';\nimport type {\n DrawingType,\n KernelPlanObjectList,\n PlanObjectList,\n ResizingAnchor,\n SnapMode,\n WALL_SIDES,\n EMSConstant,\n} from './planner-kernel-container';\nimport type { Position2 } from '../common-core/src/common-interfaces';\nimport type { Enumify } from '#/common/src/utils/types';\n// --experimental-modules does not have support for named exports yet\n// import * as ems from './ems';\nimport type { ConstructionObjectDoorArchArray } from 'roomle-core-hsc/src/embind/plannerCoreInterface';\nimport type { PosContour } from '../homag-intelligence/src/model/oc-scripts-domain.model';\n\n// eslint-disable-next-line no-unused-vars -- used in declare class extends\nimport type { EmsArray } from './ems';\n\nexport interface EMSReference {\n jsObject: any;\n\n delete(): any;\n}\n\n// KernelObject = AbstractModel in Core (Kernel)\nexport interface KernelObject {\n extRef: EMSReference | null;\n\n clone(): KernelObject;\n\n delete(): void;\n\n getId(): number;\n}\n\nexport const INITIAL_SNAP_DISTANCE = 50;\n\nexport interface Plan extends KernelObject {\n defaultParapetHeight: number;\n defaultWallHeight: number;\n defaultWallThickness: number;\n vectorWallThickness: number;\n\n getPlanObjects(): any;\n\n getBounds(): KernelCube;\n\n getTotalFloorArea(): number;\n\n getPlanXML(\n includeRuntimeId: boolean,\n xmlVersion: number /** current version is 2 */,\n ): string;\n\n createPlanXmlWithSingleObject(\n object: PlanObject,\n includeRuntimeId: boolean,\n version: number,\n ): string;\n\n createPlanXmlWithObjects(\n objectId: string | string[],\n includeRuntimeId: boolean,\n version: number,\n ): string;\n\n getRotationForFrontView(objectIds: number | number[]): number;\n\n getWallCount(): number;\n\n getId(): number;\n}\n\nexport interface PlanElement extends KernelObject {\n getType(): any;\n\n getCenter(): KernelVector3;\n\n getMeshCenter(): KernelVector3;\n\n getMeshOffsetRelativeToObject(): KernelVector3;\n\n getId(): number;\n\n getCustomDataJson(): string;\n\n readonly hidden: boolean;\n}\n\nexport interface RectangleReferencePoints {\n bottom: KernelVector3;\n bottomLeft: KernelVector3;\n bottomRight: KernelVector3;\n center: KernelVector3;\n left: KernelVector3;\n right: KernelVector3;\n top: KernelVector3;\n topLeft: KernelVector3;\n topRight: KernelVector3;\n}\n\nexport interface ObjectToWallLine {\n angle: number;\n endPoint: KernelVector3;\n length: number;\n startPoint: KernelVector3;\n}\n\ndeclare class PointArray extends EmsArray<KernelVector3f> {}\n\ndeclare class ObjectToWallLineArray extends EmsArray<ObjectToWallLine> {}\n\nexport interface Rectangle {\n angle: number;\n center: KernelVector3f;\n cornerPoints: PointArray;\n referencePoints: RectangleReferencePoints;\n size: KernelVector3f;\n}\n\nexport interface ObjectFrontRotation {\n lookAtSide: WallSide;\n rotation: number;\n rotationRoundTo90deg: number;\n}\n\nexport interface PlanObject extends PlanElement {\n size: KernelVector3;\n rotation: number;\n customLabel: string;\n rgbColor: number;\n useCustomColor?: boolean;\n flipX: boolean;\n flipY: boolean;\n fixedZ: boolean;\n boxForMeasurement: KernelCube;\n\n hasConfiguration(): boolean;\n\n isExternalObject(): boolean;\n\n retrieveConfigurationId(): ConfigurationUniqueIdAndHash;\n\n getConfiguration(): string;\n\n getCatalogItemId(): string;\n\n getConfigurationRuntimeId(): number;\n\n getObjectType(): string;\n\n getWallDistances(): ObjectToWallLineArray;\n\n getRectangle(): Rectangle;\n\n getRotationToPreferredFront(): ObjectFrontRotation;\n\n isRootComponentOfChildObject(componentRuntimeId: number): boolean;\n}\n\nexport interface WallSide {\n value: Enumify<typeof WALL_SIDES>;\n}\n\nexport interface LeftOrRightWallSide {\n value: Enumify<Pick<typeof WALL_SIDES, 'LEFT' | 'RIGHT'>>;\n}\n\nexport interface WallMeasurementsFactors {\n maxZoomedIn: number;\n maxZoomedOut: number;\n minPadding: number;\n maxPadding: number;\n}\n\nexport interface PlanMeasure extends PlanObject {\n getPoint1(): KernelVector3f;\n\n getPoint2(): KernelVector3f;\n}\n\nexport interface WallPlanObject extends PlanObject {\n getPreferredSide(): LeftOrRightWallSide;\n\n getCornerFromLeft(): KernelVector3;\n\n getCornerFromRight(): KernelVector3;\n\n getCornerToLeft(): KernelVector3;\n\n getCornerToRight(): KernelVector3;\n\n getCenter(): KernelVector3;\n\n getLength(preferredSide: WallSide): number;\n\n getFrom(): NodePlanObject;\n\n getTo(): NodePlanObject;\n\n getAttachedAttics(): KernelAtticArray;\n\n readonly thickness: number;\n readonly height: number;\n}\n\nexport interface ConstructionPlanObject extends PlanObject {\n getAttachedWall(): WallPlanObject;\n\n getPreferredSide(): LeftOrRightWallSide;\n\n getCornerFromLeft(): KernelVector3;\n\n getCornerFromRight(): KernelVector3;\n\n getCornerToLeft(): KernelVector3;\n\n getCornerToRight(): KernelVector3;\n\n getDoorArches(): ConstructionObjectDoorArchArray;\n}\n\nexport interface NodePlanObject extends PlanObject {\n getNumberOfConnectedWalls(): number;\n\n getMaxWallHeight(): number;\n}\n\nexport interface ContinuousDrawingManager {\n getStartPoint(): KernelVector3;\n\n getDrawingAngle(): number;\n\n getCircleRotation(): number;\n\n shouldShowCircle(): boolean;\n\n isCorridorValid(): boolean;\n\n getCorridor(): any;\n\n getDrawnPoints(): PointArray;\n\n CIRCLE_RADIUS: number;\n}\n\ninterface Anchor {\n value: ResizingAnchor;\n}\n\nexport const CORE_TYPE_OF_CORE_ID = {\n CONFIGURATOR: 0,\n PLANNER: 1,\n} as const;\n\nexport interface TypeOfCoreId {\n value: Enumify<typeof CORE_TYPE_OF_CORE_ID>;\n}\n\nexport interface ExternalObjectLoadingIdMap {\n originalModuleId: string;\n newModuleId: string;\n}\n\nexport interface ExternalObjectLoadConfiguration {\n applyGlobalChildMode: boolean;\n correctArrangement: boolean;\n findFreeSpaceInPlan: boolean;\n isVisible: boolean;\n respondWithPositionInPlan: boolean;\n lockCallbacks: boolean;\n tryToMergeNewGroups: boolean;\n moduleIdMap: ExternalObjectLoadingIdMap[];\n}\n\nexport interface ExternalValidContainerModule {\n containerModuleId: string;\n parentModuleId: string;\n rootId: string;\n}\n\nexport interface PlanInteractionHandler {\n init(\n reference: PlanInteractionHandler,\n zoomFactor: number,\n viewSnapDist: number,\n wallSnapMode: any,\n objectSnapMode: any,\n shouldSnap: boolean,\n drawingType: any,\n ): PlanInteractionHandler;\n\n getConfiguratorKernel(): ConfiguratorKernelClass;\n\n loadPlanXML(xml: string): Plan;\n\n createPlanWithObjectFromItem(\n object: KernelObject,\n position: KernelVector3,\n rotationInRad: number,\n ): Plan;\n\n getPlan(): Plan;\n\n moveElementTo(\n planObject: KernelObject,\n targetPosition: KernelVector3,\n cameraPosition?: KernelVector3,\n ): void;\n\n moveElementToIn2d(\n planObject: KernelObject,\n targetPosition: KernelVector3,\n dragging: boolean,\n ): void;\n\n moveElementBy(planObject: KernelObject, distance: KernelVector3): void;\n\n duplicatePlanObject(\n object: PlanObject,\n count: number,\n findFreeSpaceInPlan: boolean,\n ): PlanObject[];\n\n duplicatePlanObjects(\n objects: PlanObjectList,\n count: number,\n findFreeSpaceInPlan: boolean,\n ): PlanObject[];\n\n setElementVisibility(element: PlanElement, isVisible: boolean): void;\n\n moveObjectsBy(\n planObjects: KernelObjectPtrList,\n distance: KernelVector3,\n ): void;\n\n rotateObjectTo(planObject: KernelObject, angleInRad: number): void;\n\n setObjectRotation(planObject: KernelObject, angleInRad: number): void;\n\n addPlanObjects(\n list: KernelObjectPtrList,\n findFreeSpaceInPlan: boolean,\n ): PlanObject[];\n\n addPlanObjectFromItem(\n object: KernelObject,\n position: KernelVector3,\n type: number,\n findFreeSpaceInPlan: boolean,\n ): PlanObject;\n\n addOrUpdateExternalPlanObjects(\n serialzedConfiguration: string | string[],\n position: KernelVector3,\n rotationInRad: number,\n updateConfiguration: ExternalObjectLoadConfiguration,\n mergedGroupIds: string | string[],\n ): PlanObject[];\n\n createPreviewGeometryForAddOn(\n objectId: string,\n articleId: string,\n groupDefinitions: string,\n validContainerModules: ExternalValidContainerModule[],\n ): void;\n\n catalogItemLoaded(catalogItem: KernelCatalogItem): void;\n\n removeElement(planObject: KernelObject): void;\n\n removeObjectWithId(objectId: string): void;\n\n mergeObjects(objects: PlanObjectList): void;\n\n groupObjects(planObjectPtrList: PlanObjectList): ObjectGroupPtr;\n\n rotateObjectsBy(\n planObjectPtrList: PlanObjectList,\n anAngleInRad: number,\n aroundPoint: KernelVector3,\n ): void;\n\n rotateGroupBy(\n group: ObjectGroupPtr,\n anAngleInRad: number,\n aroundPoint: KernelVector3,\n ): void;\n\n deactivateAllSnappingActivity(): void;\n\n reactivateAllSnappingActivity(): void;\n\n isUndoPossible(): boolean;\n\n isRedoPossible(): boolean;\n\n clearHistory(): void;\n\n startInteraction(): void;\n\n resumeInteraction(): void;\n\n endInteraction(): void;\n\n undo(): void;\n\n redo(): void;\n\n isVectorPreviewModeEnabled(): boolean;\n\n sCreateUnclosedSpaceEnabled(): boolean;\n\n beginDrawing(\n point: { x: number; y: number; z: number },\n vectorPreviewMode: boolean,\n createUnclosedSpace: boolean,\n ): void;\n\n endDrawing(point: { x: number; y: number; z: number }): void;\n\n cancelDrawing(): void;\n\n addNode(point: { x: number; y: number; z: number }): PlanNode;\n\n addWall(from: PlanNode, to: PlanNode): KernelWall;\n\n setWallHeight(wall: KernelWall, height: number): void;\n\n setLengthOfWall(\n wall: KernelWall,\n length: number,\n preferredSide: WallSide,\n direction: EMSConstant,\n moveOrthogonalWalls: boolean,\n ): void;\n\n setWallThickness(wall: KernelWall, thickness: number): void;\n\n addAttic(\n wall: KernelWall,\n kneeHeight: number,\n width: number,\n side: WallSide | null | undefined,\n ): KernelAttic;\n\n setAtticSide(attic: KernelAttic, side: WallSide): void;\n\n setAtticKneeHeight(attic: KernelAttic, kneeHeight: number): void;\n\n setAtticWidth(attic: KernelAttic, width: number): void;\n\n currentDrawingPosition(point: { x: number; y: number; z: number }): void;\n\n forceNode(point: { x: number; y: number; z: number }): void;\n\n setDrawingType(aNewDrawingType: DrawingType): void;\n\n setZoomFactor(pxPerMM: number): void;\n\n setViewSnapDist(aDist: number): void;\n\n setRotationSnapAngle(angleInRadians: number): void;\n\n setDefaultWallThickness(wallThickness: number, applyToAll: boolean): void;\n\n setDefaultWallHeight(wallHeight: number, applyToAll: boolean): void;\n\n setDefaultParapetHeight(parapetHeight: number, applyToAll: boolean): void;\n\n setRoomParapetHeight(floor: KernelFloor, parapetHeight: number): void;\n\n getDefaultExteriorWallMaterial(): KernelWallMaterial;\n\n setDefaultExteriorWallMaterial(wallMaterial: KernelWallMaterial): void;\n\n getDefaultInteriorWallMaterial(): KernelWallMaterial;\n\n setDefaultInteriorWallMaterial(wallMaterial: KernelWallMaterial): void;\n\n getDefaultFloorMaterial(): KernelFloorMaterial;\n\n setDefaultFloorMaterial(floorMaterial: KernelFloorMaterial): void;\n\n setElementCustomDataJson(element: PlanElement, customDataJson: string): void;\n\n setWallLeftMaterial(wall: KernelWall, material: KernelWallMaterial): void;\n\n setWallRightMaterial(wall: KernelWall, material: KernelWallMaterial): void;\n\n setFloorMaterial(floor: KernelFloor, material: KernelFloorMaterial): void;\n\n setFloorLabelObject(floor: KernelFloor, serializedLabelObject: string): void;\n\n getContinuousDrawingManager(): ContinuousDrawingManager;\n\n setSnapFeedbackWhileDrawing(enabled: boolean): void;\n\n consistsOfMergedComponents(object: KernelObject): boolean;\n\n setObjectSize(\n anObject: KernelObject,\n aNewSize: KernelVector3,\n anAnchor: Anchor,\n ): void;\n\n setObjectFlipX(anObject: KernelObject, shouldFlipX: boolean): void;\n\n setObjectFlipY(anObject: KernelObject, shouldFlipY: boolean): void;\n\n setObjectCustomColor(\n object: PlanObject,\n rgbColor: number,\n useCustomColor: boolean,\n ): void;\n\n setObjectCustomLabel(object: PlanObject, label: string): void;\n\n setObjectFixedZ(anObject: KernelObject, shouldFlipZ: boolean): void;\n\n setMeasurePoint1(\n measure: PlanMeasure,\n point: KernelVector3f,\n snapToWalls: boolean,\n snapToObjects: boolean,\n ): void;\n\n setMeasurePoint2(\n measure: PlanMeasure,\n point: KernelVector3f,\n snapToWalls: boolean,\n snapToObjects: boolean,\n ): void;\n\n addMeasure(\n startPosition: KernelVector3f,\n endPosition: KernelVector3f,\n ): PlanMeasure;\n\n setDiscardExternalObjectsOnLoad(discard: boolean): void;\n\n isChildObjectModePossible(object: KernelObject): boolean;\n\n isEnabledChildObjectMode(object: KernelObject): boolean;\n\n enableChildObjects(\n object: KernelObject,\n switchChildModeOffForAllOtherObjects: boolean,\n ): KernelObject;\n\n disableChildObjects(object: KernelObject): KernelObject;\n\n enableChildObjectsOfExternalObject(\n objectId: string,\n switchChildModeOffForAllOtherObjects: boolean,\n ): KernelObject;\n\n disableChildObjectsOfExternalObject(objectId: string): KernelObject;\n\n disableChildObjectsOfAllPlanObjects(): void;\n\n unit: string;\n enableRaster: boolean;\n customRaster: number;\n enableSnap: boolean;\n enableDrawingSnap: boolean;\n objectToWallSnapMode: SnapMode;\n objectToObjectSnapMode: SnapMode;\n dockWhenSnap: boolean;\n unDockOnMove: boolean;\n}\n\nexport interface PlanOverview {\n area: number;\n bounds: KernelCube;\n objects: KernelPlanObjectList;\n outsideWalls: PlanElement[];\n rooms: PlanElement[];\n}\n\nexport interface KernelObjectConfiguration {\n runtimeId: number;\n serializedDefinition: string;\n uniqueId: string;\n}\n\nexport declare class KernelObjectConfigurationArray extends EmsArray<KernelObjectConfiguration> {}\n\nexport interface LightSourceConfiguration {\n lightSourceAreaInSquareMeters: number;\n minimumRoomSizeInSquareMeters: number;\n maximumNumberOfLightSources: number;\n}\n\nexport interface RoomLightSourceDistribution {\n ceilingId: number;\n floorId: number;\n positionsInPlan: PointArray;\n positionsRelativeToFloor: PointArray;\n}\n\ndeclare class RoomLightSourceDistributionArray extends EmsArray<RoomLightSourceDistribution> {}\n\ndeclare class RoomGeometryArray extends EmsArray<PosContour> {}\n\nexport interface RoomInformation {\n rooms: RoomGeometryArray;\n}\n\nexport const CORE_HELP_LINE_TYPE = {\n NONE: 0,\n WALL_SNAP_LEVEL: 1,\n WALL_SNAP_LEVEL_SNAPPED: 2,\n WALL_EDGE: 3,\n DOCKING_VECTOR: 4,\n OBJECT_CONTOUR: 5,\n} as const;\n\nexport interface HelpLineType {\n value: Enumify<typeof CORE_HELP_LINE_TYPE>;\n}\n\nexport interface GeometryHelpLine {\n end: KernelVector3f;\n start: KernelVector3f;\n type: HelpLineType;\n}\n\ndeclare class GeometryHelpLineArray extends EmsArray<GeometryHelpLine> {}\n\nexport const CORE_SNAP_STATE = {\n DEFAULT: 0,\n DOCKING: 1,\n COLLISION: 2,\n} as const;\n\nexport interface SnapState {\n value: Enumify<typeof CORE_SNAP_STATE>;\n}\n\nexport interface ObjectSnapInformation {\n geometryHelpLines: GeometryHelpLineArray;\n snapState: SnapState;\n}\n\nexport interface PlanModelViewHelper {\n getPlanOverview(planObject: KernelObject): PlanOverview;\n\n getPlanObject(plan: Plan, aRuntimeId: number): KernelPlanObject;\n\n isChildObjectRootComponent(plan: Plan, componentRuntimeId: number): boolean;\n\n isAnimationRootComponent(plan: Plan, componentRuntimeId: number): boolean;\n\n getRootPlanObjectId(plan: Plan, aRuntimeId: number): number;\n\n getObjectComponent(\n plan: Plan,\n typeOfId: TypeOfCoreId,\n anId: number,\n ): KernelPlanObjectComponent;\n\n getExternalObjectComponent(\n plan: Plan,\n groupId: string,\n moduleId: string,\n ): KernelPlanObjectComponent;\n\n requestMesh3d(element: PlanElement): void;\n\n getExternalObjectGroups(plan: Plan): KernelObjectConfigurationArray;\n\n getExternalRoomInformation(plan: Plan): RoomInformation;\n\n calculateLightSourceDistribution(\n plan: Plan,\n lightSourceConfiguration: LightSourceConfiguration,\n ): RoomLightSourceDistributionArray;\n\n getObjectSnapInformation(\n anObject: PlanObject,\n debugHelpLines: boolean,\n ): ObjectSnapInformation;\n}\n\nexport interface PlanNode extends KernelObject {\n getMaxWallHeight(): number;\n\n getNumberOfConnectedWalls(): number;\n}\n\nexport interface KernelWallMaterial extends KernelObject {\n catalogItemId: string;\n materialId: string;\n rgbValue: number;\n useCustomColor: boolean;\n}\n\nexport interface KernelFloorMaterial extends KernelObject {\n catalogItemId: string;\n materialId: string;\n rgbValue: number;\n rotation: number;\n useCustomColor: boolean;\n}\n\nexport const enum KernelWallType {\n StandAloneWall,\n OuterWallLeft, // has a floor on the right side but not on the left side\n OuterWallRight, // has a floor on the left side but not on the right side\n InnerWall,\n}\n\nexport interface KernelWall extends KernelObject {\n getFrom(): Node;\n getTo(): Node;\n getAttachedAttics(): KernelAtticArray;\n readonly thickness: number;\n readonly meshThickness: number;\n readonly isVectorWall: boolean;\n readonly height: number;\n readonly leftMaterial: KernelWallMaterial;\n readonly rightMaterial: KernelWallMaterial;\n readonly wallType: KernelEnum;\n readonly leftNormal: KernelVector3;\n readonly rightNormal: KernelVector3;\n getAngle: () => number;\n}\n\nexport interface KernelRoomWall {\n roomSide: WallSide;\n wall: KernelWall;\n}\n\ndeclare class KernelAtticArray extends EmsArray<KernelAttic> {}\n\nexport interface KernelAttic extends KernelObject {\n getFrom(): NodePlanObject;\n getTo(): NodePlanObject;\n getAssociatedWall(): KernelWall;\n get2dPolygon(): PointArray;\n getRidgePoints(): PointArray;\n getPointsWithHeight(height: number): PointArray;\n readonly side: WallSide;\n readonly kneeHeight: number;\n readonly width: number;\n}\n\nexport interface KernelFloor extends KernelObject {\n area: number;\n material: KernelFloorMaterial;\n readonly parapetHeight: number;\n getCenter: () => KernelVector3;\n getRandomPointInside: () => KernelVector3;\n getLabelPosition: () => KernelVector3;\n getWallsOfRoom: () => KernelRoomWall[];\n getLabelObject(): string;\n}\n\nexport interface PlanObjectPosition {\n runtimeIds: RuntimeId[];\n position2d: Position2;\n}\n\nexport type CancelSelectionReasons =\n | 'swap_object'\n | 'dragIn'\n | 'click_outside'\n | 'select_other'\n | 'double_click_wall'\n | 'unknown'\n | 'dock_component'\n | 'delete_object'\n | 'selection_mode_changed'\n | 'dock_preview'\n | 'reset_scene'\n | 'delete_component'\n | 'isolation_mode_cancelled'\n | 'isolation_mode_started'\n | 'duplicate'\n | 'undo'\n | 'redo';\n","import { MeshPhysicalMaterial, MeshStandardMaterial } from 'three';\n\nexport default class MaterialCreator {\n public static createMeshPhysicalMaterial(params: { [key: string]: any }) {\n return new MeshPhysicalMaterial(params);\n }\n\n public static createMeshStandardMaterial(params: { [key: string]: any }) {\n return new MeshStandardMaterial(params);\n }\n}\n","/**\n * The Ease class provides a collection of easing functions for use with tween.js.\n */\nvar Easing = Object.freeze({\n Linear: Object.freeze({\n None: function (amount) {\n return amount;\n },\n In: function (amount) {\n return amount;\n },\n Out: function (amount) {\n return amount;\n },\n InOut: function (amount) {\n return amount;\n },\n }),\n Quadratic: Object.freeze({\n In: function (amount) {\n return amount * amount;\n },\n Out: function (amount) {\n return amount * (2 - amount);\n },\n InOut: function (amount) {\n if ((amount *= 2) < 1) {\n return 0.5 * amount * amount;\n }\n return -0.5 * (--amount * (amount - 2) - 1);\n },\n }),\n Cubic: Object.freeze({\n In: function (amount) {\n return amount * amount * amount;\n },\n Out: function (amount) {\n return --amount * amount * amount + 1;\n },\n InOut: function (amount) {\n if ((amount *= 2) < 1) {\n return 0.5 * amount * amount * amount;\n }\n return 0.5 * ((amount -= 2) * amount * amount + 2);\n },\n }),\n Quartic: Object.freeze({\n In: function (amount) {\n return amount * amount * amount * amount;\n },\n Out: function (amount) {\n return 1 - --amount * amount * amount * amount;\n },\n InOut: function (amount) {\n if ((amount *= 2) < 1) {\n return 0.5 * amount * amount * amount * amount;\n }\n return -0.5 * ((amount -= 2) * amount * amount * amount - 2);\n },\n }),\n Quintic: Object.freeze({\n In: function (amount) {\n return amount * amount * amount * amount * amount;\n },\n Out: function (amount) {\n return --amount * amount * amount * amount * amount + 1;\n },\n InOut: function (amount) {\n if ((amount *= 2) < 1) {\n return 0.5 * amount * amount * amount * amount * amount;\n }\n return 0.5 * ((amount -= 2) * amount * amount * amount * amount + 2);\n },\n }),\n Sinusoidal: Object.freeze({\n In: function (amount) {\n return 1 - Math.sin(((1.0 - amount) * Math.PI) / 2);\n },\n Out: function (amount) {\n return Math.sin((amount * Math.PI) / 2);\n },\n InOut: function (amount) {\n return 0.5 * (1 - Math.sin(Math.PI * (0.5 - amount)));\n },\n }),\n Exponential: Object.freeze({\n In: function (amount) {\n return amount === 0 ? 0 : Math.pow(1024, amount - 1);\n },\n Out: function (amount) {\n return amount === 1 ? 1 : 1 - Math.pow(2, -10 * amount);\n },\n InOut: function (amount) {\n if (amount === 0) {\n return 0;\n }\n if (amount === 1) {\n return 1;\n }\n if ((amount *= 2) < 1) {\n return 0.5 * Math.pow(1024, amount - 1);\n }\n return 0.5 * (-Math.pow(2, -10 * (amount - 1)) + 2);\n },\n }),\n Circular: Object.freeze({\n In: function (amount) {\n return 1 - Math.sqrt(1 - amount * amount);\n },\n Out: function (amount) {\n return Math.sqrt(1 - --amount * amount);\n },\n InOut: function (amount) {\n if ((amount *= 2) < 1) {\n return -0.5 * (Math.sqrt(1 - amount * amount) - 1);\n }\n return 0.5 * (Math.sqrt(1 - (amount -= 2) * amount) + 1);\n },\n }),\n Elastic: Object.freeze({\n In: function (amount) {\n if (amount === 0) {\n return 0;\n }\n if (amount === 1) {\n return 1;\n }\n return -Math.pow(2, 10 * (amount - 1)) * Math.sin((amount - 1.1) * 5 * Math.PI);\n },\n Out: function (amount) {\n if (amount === 0) {\n return 0;\n }\n if (amount === 1) {\n return 1;\n }\n return Math.pow(2, -10 * amount) * Math.sin((amount - 0.1) * 5 * Math.PI) + 1;\n },\n InOut: function (amount) {\n if (amount === 0) {\n return 0;\n }\n if (amount === 1) {\n return 1;\n }\n amount *= 2;\n if (amount < 1) {\n return -0.5 * Math.pow(2, 10 * (amount - 1)) * Math.sin((amount - 1.1) * 5 * Math.PI);\n }\n return 0.5 * Math.pow(2, -10 * (amount - 1)) * Math.sin((amount - 1.1) * 5 * Math.PI) + 1;\n },\n }),\n Back: Object.freeze({\n In: function (amount) {\n var s = 1.70158;\n return amount === 1 ? 1 : amount * amount * ((s + 1) * amount - s);\n },\n Out: function (amount) {\n var s = 1.70158;\n return amount === 0 ? 0 : --amount * amount * ((s + 1) * amount + s) + 1;\n },\n InOut: function (amount) {\n var s = 1.70158 * 1.525;\n if ((amount *= 2) < 1) {\n return 0.5 * (amount * amount * ((s + 1) * amount - s));\n }\n return 0.5 * ((amount -= 2) * amount * ((s + 1) * amount + s) + 2);\n },\n }),\n Bounce: Object.freeze({\n In: function (amount) {\n return 1 - Easing.Bounce.Out(1 - amount);\n },\n Out: function (amount) {\n if (amount < 1 / 2.75) {\n return 7.5625 * amount * amount;\n }\n else if (amount < 2 / 2.75) {\n return 7.5625 * (amount -= 1.5 / 2.75) * amount + 0.75;\n }\n else if (amount < 2.5 / 2.75) {\n return 7.5625 * (amount -= 2.25 / 2.75) * amount + 0.9375;\n }\n else {\n return 7.5625 * (amount -= 2.625 / 2.75) * amount + 0.984375;\n }\n },\n InOut: function (amount) {\n if (amount < 0.5) {\n return Easing.Bounce.In(amount * 2) * 0.5;\n }\n return Easing.Bounce.Out(amount * 2 - 1) * 0.5 + 0.5;\n },\n }),\n generatePow: function (power) {\n if (power === void 0) { power = 4; }\n power = power < Number.EPSILON ? Number.EPSILON : power;\n power = power > 10000 ? 10000 : power;\n return {\n In: function (amount) {\n return Math.pow(amount, power);\n },\n Out: function (amount) {\n return 1 - Math.pow((1 - amount), power);\n },\n InOut: function (amount) {\n if (amount < 0.5) {\n return Math.pow((amount * 2), power) / 2;\n }\n return (1 - Math.pow((2 - amount * 2), power)) / 2 + 0.5;\n },\n };\n },\n});\n\nvar now = function () { return performance.now(); };\n\n/**\n * Controlling groups of tweens\n *\n * Using the TWEEN singleton to manage your tweens can cause issues in large apps with many components.\n * In these cases, you may want to create your own smaller groups of tween\n */\nvar Group = /** @class */ (function () {\n function Group() {\n var tweens = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n tweens[_i] = arguments[_i];\n }\n this._tweens = {};\n this._tweensAddedDuringUpdate = {};\n this.add.apply(this, tweens);\n }\n Group.prototype.getAll = function () {\n var _this = this;\n return Object.keys(this._tweens).map(function (tweenId) { return _this._tweens[tweenId]; });\n };\n Group.prototype.removeAll = function () {\n this._tweens = {};\n };\n Group.prototype.add = function () {\n var _a;\n var tweens = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n tweens[_i] = arguments[_i];\n }\n for (var _b = 0, tweens_1 = tweens; _b < tweens_1.length; _b++) {\n var tween = tweens_1[_b];\n // Remove from any other group first, a tween can only be in one group at a time.\n // @ts-expect-error library internal access\n (_a = tween._group) === null || _a === void 0 ? void 0 : _a.remove(tween);\n // @ts-expect-error library internal access\n tween._group = this;\n this._tweens[tween.getId()] = tween;\n this._tweensAddedDuringUpdate[tween.getId()] = tween;\n }\n };\n Group.prototype.remove = function () {\n var tweens = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n tweens[_i] = arguments[_i];\n }\n for (var _a = 0, tweens_2 = tweens; _a < tweens_2.length; _a++) {\n var tween = tweens_2[_a];\n // @ts-expect-error library internal access\n tween._group = undefined;\n delete this._tweens[tween.getId()];\n delete this._tweensAddedDuringUpdate[tween.getId()];\n }\n };\n /** Return true if all tweens in the group are not paused or playing. */\n Group.prototype.allStopped = function () {\n return this.getAll().every(function (tween) { return !tween.isPlaying(); });\n };\n Group.prototype.update = function (time, preserve) {\n if (time === void 0) { time = now(); }\n if (preserve === void 0) { preserve = true; }\n var tweenIds = Object.keys(this._tweens);\n if (tweenIds.length === 0)\n return;\n // Tweens are updated in \"batches\". If you add a new tween during an\n // update, then the new tween will be updated in the next batch.\n // If you remove a tween during an update, it may or may not be updated.\n // However, if the removed tween was added during the current batch,\n // then it will not be updated.\n while (tweenIds.length > 0) {\n this._tweensAddedDuringUpdate = {};\n for (var i = 0; i < tweenIds.length; i++) {\n var tween = this._tweens[tweenIds[i]];\n var autoStart = !preserve;\n if (tween && tween.update(time, autoStart) === false && !preserve)\n this.remove(tween);\n }\n tweenIds = Object.keys(this._tweensAddedDuringUpdate);\n }\n };\n return Group;\n}());\n\n/**\n *\n */\nvar Interpolation = {\n Linear: function (v, k) {\n var m = v.length - 1;\n var f = m * k;\n var i = Math.floor(f);\n var fn = Interpolation.Utils.Linear;\n if (k < 0) {\n return fn(v[0], v[1], f);\n }\n if (k > 1) {\n return fn(v[m], v[m - 1], m - f);\n }\n return fn(v[i], v[i + 1 > m ? m : i + 1], f - i);\n },\n Bezier: function (v, k) {\n var b = 0;\n var n = v.length - 1;\n var pw = Math.pow;\n var bn = Interpolation.Utils.Bernstein;\n for (var i = 0; i <= n; i++) {\n b += pw(1 - k, n - i) * pw(k, i) * v[i] * bn(n, i);\n }\n return b;\n },\n CatmullRom: function (v, k) {\n var m = v.length - 1;\n var f = m * k;\n var i = Math.floor(f);\n var fn = Interpolation.Utils.CatmullRom;\n if (v[0] === v[m]) {\n if (k < 0) {\n i = Math.floor((f = m * (1 + k)));\n }\n return fn(v[(i - 1 + m) % m], v[i], v[(i + 1) % m], v[(i + 2) % m], f - i);\n }\n else {\n if (k < 0) {\n return v[0] - (fn(v[0], v[0], v[1], v[1], -f) - v[0]);\n }\n if (k > 1) {\n return v[m] - (fn(v[m], v[m], v[m - 1], v[m - 1], f - m) - v[m]);\n }\n return fn(v[i ? i - 1 : 0], v[i], v[m < i + 1 ? m : i + 1], v[m < i + 2 ? m : i + 2], f - i);\n }\n },\n Utils: {\n Linear: function (p0, p1, t) {\n return (p1 - p0) * t + p0;\n },\n Bernstein: function (n, i) {\n var fc = Interpolation.Utils.Factorial;\n return fc(n) / fc(i) / fc(n - i);\n },\n Factorial: (function () {\n var a = [1];\n return function (n) {\n var s = 1;\n if (a[n]) {\n return a[n];\n }\n for (var i = n; i > 1; i--) {\n s *= i;\n }\n a[n] = s;\n return s;\n };\n })(),\n CatmullRom: function (p0, p1, p2, p3, t) {\n var v0 = (p2 - p0) * 0.5;\n var v1 = (p3 - p1) * 0.5;\n var t2 = t * t;\n var t3 = t * t2;\n return (2 * p1 - 2 * p2 + v0 + v1) * t3 + (-3 * p1 + 3 * p2 - 2 * v0 - v1) * t2 + v0 * t + p1;\n },\n },\n};\n\n/**\n * Utils\n */\nvar Sequence = /** @class */ (function () {\n function Sequence() {\n }\n Sequence.nextId = function () {\n return Sequence._nextId++;\n };\n Sequence._nextId = 0;\n return Sequence;\n}());\n\nvar mainGroup = new Group();\n\n/**\n * Tween.js - Licensed under the MIT license\n * https://github.com/tweenjs/tween.js\n * ----------------------------------------------\n *\n * See https://github.com/tweenjs/tween.js/graphs/contributors for the full list of contributors.\n * Thank you all, you're awesome!\n */\nvar Tween = /** @class */ (function () {\n function Tween(object, group) {\n this._isPaused = false;\n this._pauseStart = 0;\n this._valuesStart = {};\n this._valuesEnd = {};\n this._valuesStartRepeat = {};\n this._duration = 1000;\n this._isDynamic = false;\n this._initialRepeat = 0;\n this._repeat = 0;\n this._yoyo = false;\n this._isPlaying = false;\n this._reversed = false;\n this._delayTime = 0;\n this._startTime = 0;\n this._easingFunction = Easing.Linear.None;\n this._interpolationFunction = Interpolation.Linear;\n // eslint-disable-next-line\n this._chainedTweens = [];\n this._onStartCallbackFired = false;\n this._onEveryStartCallbackFired = false;\n this._id = Sequence.nextId();\n this._isChainStopped = false;\n this._propertiesAreSetUp = false;\n this._goToEnd = false;\n this._object = object;\n if (typeof group === 'object') {\n this._group = group;\n group.add(this);\n }\n // Use \"true\" to restore old behavior (will be removed in future release).\n else if (group === true) {\n this._group = mainGroup;\n mainGroup.add(this);\n }\n }\n Tween.prototype.getId = function () {\n return this._id;\n };\n Tween.prototype.isPlaying = function () {\n return this._isPlaying;\n };\n Tween.prototype.isPaused = function () {\n return this._isPaused;\n };\n Tween.prototype.getDuration = function () {\n return this._duration;\n };\n Tween.prototype.to = function (target, duration) {\n if (duration === void 0) { duration = 1000; }\n if (this._isPlaying)\n throw new Error('Can not call Tween.to() while Tween is already started or paused. Stop the Tween first.');\n this._valuesEnd = target;\n this._propertiesAreSetUp = false;\n this._duration = duration < 0 ? 0 : duration;\n return this;\n };\n Tween.prototype.duration = function (duration) {\n if (duration === void 0) { duration = 1000; }\n this._duration = duration < 0 ? 0 : duration;\n return this;\n };\n Tween.prototype.dynamic = function (dynamic) {\n if (dynamic === void 0) { dynamic = false; }\n this._isDynamic = dynamic;\n return this;\n };\n Tween.prototype.start = function (time, overrideStartingValues) {\n if (time === void 0) { time = now(); }\n if (overrideStartingValues === void 0) { overrideStartingValues = false; }\n if (this._isPlaying) {\n return this;\n }\n this._repeat = this._initialRepeat;\n if (this._reversed) {\n // If we were reversed (f.e. using the yoyo feature) then we need to\n // flip the tween direction back to forward.\n this._reversed = false;\n for (var property in this._valuesStartRepeat) {\n this._swapEndStartRepeatValues(property);\n this._valuesStart[property] = this._valuesStartRepeat[property];\n }\n }\n this._isPlaying = true;\n this._isPaused = false;\n this._onStartCallbackFired = false;\n this._onEveryStartCallbackFired = false;\n this._isChainStopped = false;\n this._startTime = time;\n this._startTime += this._delayTime;\n if (!this._propertiesAreSetUp || overrideStartingValues) {\n this._propertiesAreSetUp = true;\n // If dynamic is not enabled, clone the end values instead of using the passed-in end values.\n if (!this._isDynamic) {\n var tmp = {};\n for (var prop in this._valuesEnd)\n tmp[prop] = this._valuesEnd[prop];\n this._valuesEnd = tmp;\n }\n this._setupProperties(this._object, this._valuesStart, this._valuesEnd, this._valuesStartRepeat, overrideStartingValues);\n }\n return this;\n };\n Tween.prototype.startFromCurrentValues = function (time) {\n return this.start(time, true);\n };\n Tween.prototype._setupProperties = function (_object, _valuesStart, _valuesEnd, _valuesStartRepeat, overrideStartingValues) {\n for (var property in _valuesEnd) {\n var startValue = _object[property];\n var startValueIsArray = Array.isArray(startValue);\n var propType = startValueIsArray ? 'array' : typeof startValue;\n var isInterpolationList = !startValueIsArray && Array.isArray(_valuesEnd[property]);\n // If `to()` specifies a property that doesn't exist in the source object,\n // we should not set that property in the object\n if (propType === 'undefined' || propType === 'function') {\n continue;\n }\n // Check if an Array was provided as property value\n if (isInterpolationList) {\n var endValues = _valuesEnd[property];\n if (endValues.length === 0) {\n continue;\n }\n // Handle an array of relative values.\n // Creates a local copy of the Array with the start value at the front\n var temp = [startValue];\n for (var i = 0, l = endValues.length; i < l; i += 1) {\n var value = this._handleRelativeValue(startValue, endValues[i]);\n if (isNaN(value)) {\n isInterpolationList = false;\n console.warn('Found invalid interpolation list. Skipping.');\n break;\n }\n temp.push(value);\n }\n if (isInterpolationList) {\n // if (_valuesStart[property] === undefined) { // handle end values only the first time. NOT NEEDED? setupProperties is now guarded by _propertiesAreSetUp.\n _valuesEnd[property] = temp;\n // }\n }\n }\n // handle the deepness of the values\n if ((propType === 'object' || startValueIsArray) && startValue && !isInterpolationList) {\n _valuesStart[property] = startValueIsArray ? [] : {};\n var nestedObject = startValue;\n for (var prop in nestedObject) {\n _valuesStart[property][prop] = nestedObject[prop];\n }\n // TODO? repeat nested values? And yoyo? And array values?\n _valuesStartRepeat[property] = startValueIsArray ? [] : {};\n var endValues = _valuesEnd[property];\n // If dynamic is not enabled, clone the end values instead of using the passed-in end values.\n if (!this._isDynamic) {\n var tmp = {};\n for (var prop in endValues)\n tmp[prop] = endValues[prop];\n _valuesEnd[property] = endValues = tmp;\n }\n this._setupProperties(nestedObject, _valuesStart[property], endValues, _valuesStartRepeat[property], overrideStartingValues);\n }\n else {\n // Save the starting value, but only once unless override is requested.\n if (typeof _valuesStart[property] === 'undefined' || overrideStartingValues) {\n _valuesStart[property] = startValue;\n }\n if (!startValueIsArray) {\n // eslint-disable-next-line\n // @ts-ignore FIXME?\n _valuesStart[property] *= 1.0; // Ensures we're using numbers, not strings\n }\n if (isInterpolationList) {\n // eslint-disable-next-line\n // @ts-ignore FIXME?\n _valuesStartRepeat[property] = _valuesEnd[property].slice().reverse();\n }\n else {\n _valuesStartRepeat[property] = _valuesStart[property] || 0;\n }\n }\n }\n };\n Tween.prototype.stop = function () {\n if (!this._isChainStopped) {\n this._isChainStopped = true;\n this.stopChainedTweens();\n }\n if (!this._isPlaying) {\n return this;\n }\n this._isPlaying = false;\n this._isPaused = false;\n if (this._onStopCallback) {\n this._onStopCallback(this._object);\n }\n return this;\n };\n Tween.prototype.end = function () {\n this._goToEnd = true;\n this.update(this._startTime + this._duration);\n return this;\n };\n Tween.prototype.pause = function (time) {\n if (time === void 0) { time = now(); }\n if (this._isPaused || !this._isPlaying) {\n return this;\n }\n this._isPaused = true;\n this._pauseStart = time;\n return this;\n };\n Tween.prototype.resume = function (time) {\n if (time === void 0) { time = now(); }\n if (!this._isPaused || !this._isPlaying) {\n return this;\n }\n this._isPaused = false;\n this._startTime += time - this._pauseStart;\n this._pauseStart = 0;\n return this;\n };\n Tween.prototype.stopChainedTweens = function () {\n for (var i = 0, numChainedTweens = this._chainedTweens.length; i < numChainedTweens; i++) {\n this._chainedTweens[i].stop();\n }\n return this;\n };\n Tween.prototype.group = function (group) {\n if (!group) {\n console.warn('tween.group() without args has been removed, use group.add(tween) instead.');\n return this;\n }\n group.add(this);\n return this;\n };\n /**\n * Removes the tween from whichever group it is in.\n */\n Tween.prototype.remove = function () {\n var _a;\n (_a = this._group) === null || _a === void 0 ? void 0 : _a.remove(this);\n return this;\n };\n Tween.prototype.delay = function (amount) {\n if (amount === void 0) { amount = 0; }\n this._delayTime = amount;\n return this;\n };\n Tween.prototype.repeat = function (times) {\n if (times === void 0) { times = 0; }\n this._initialRepeat = times;\n this._repeat = times;\n return this;\n };\n Tween.prototype.repeatDelay = function (amount) {\n this._repeatDelayTime = amount;\n return this;\n };\n Tween.prototype.yoyo = function (yoyo) {\n if (yoyo === void 0) { yoyo = false; }\n this._yoyo = yoyo;\n return this;\n };\n Tween.prototype.easing = function (easingFunction) {\n if (easingFunction === void 0) { easingFunction = Easing.Linear.None; }\n this._easingFunction = easingFunction;\n return this;\n };\n Tween.prototype.interpolation = function (interpolationFunction) {\n if (interpolationFunction === void 0) { interpolationFunction = Interpolation.Linear; }\n this._interpolationFunction = interpolationFunction;\n return this;\n };\n // eslint-disable-next-line\n Tween.prototype.chain = function () {\n var tweens = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n tweens[_i] = arguments[_i];\n }\n this._chainedTweens = tweens;\n return this;\n };\n Tween.prototype.onStart = function (callback) {\n this._onStartCallback = callback;\n return this;\n };\n Tween.prototype.onEveryStart = function (callback) {\n this._onEveryStartCallback = callback;\n return this;\n };\n Tween.prototype.onUpdate = function (callback) {\n this._onUpdateCallback = callback;\n return this;\n };\n Tween.prototype.onRepeat = function (callback) {\n this._onRepeatCallback = callback;\n return this;\n };\n Tween.prototype.onComplete = function (callback) {\n this._onCompleteCallback = callback;\n return this;\n };\n Tween.prototype.onStop = function (callback) {\n this._onStopCallback = callback;\n return this;\n };\n /**\n * @returns true if the tween is still playing after the update, false\n * otherwise (calling update on a paused tween still returns true because\n * it is still playing, just paused).\n *\n * @param autoStart - When true, calling update will implicitly call start()\n * as well. Note, if you stop() or end() the tween, but are still calling\n * update(), it will start again!\n */\n Tween.prototype.update = function (time, autoStart) {\n var _this = this;\n var _a;\n if (time === void 0) { time = now(); }\n if (autoStart === void 0) { autoStart = Tween.autoStartOnUpdate; }\n if (this._isPaused)\n return true;\n var property;\n if (!this._goToEnd && !this._isPlaying) {\n if (autoStart)\n this.start(time, true);\n else\n return false;\n }\n this._goToEnd = false;\n if (time < this._startTime) {\n return true;\n }\n if (this._onStartCallbackFired === false) {\n if (this._onStartCallback) {\n this._onStartCallback(this._object);\n }\n this._onStartCallbackFired = true;\n }\n if (this._onEveryStartCallbackFired === false) {\n if (this._onEveryStartCallback) {\n this._onEveryStartCallback(this._object);\n }\n this._onEveryStartCallbackFired = true;\n }\n var elapsedTime = time - this._startTime;\n var durationAndDelay = this._duration + ((_a = this._repeatDelayTime) !== null && _a !== void 0 ? _a : this._delayTime);\n var totalTime = this._duration + this._repeat * durationAndDelay;\n var calculateElapsedPortion = function () {\n if (_this._duration === 0)\n return 1;\n if (elapsedTime > totalTime) {\n return 1;\n }\n var timesRepeated = Math.trunc(elapsedTime / durationAndDelay);\n var timeIntoCurrentRepeat = elapsedTime - timesRepeated * durationAndDelay;\n // TODO use %?\n // const timeIntoCurrentRepeat = elapsedTime % durationAndDelay\n var portion = Math.min(timeIntoCurrentRepeat / _this._duration, 1);\n if (portion === 0 && elapsedTime === _this._duration) {\n return 1;\n }\n return portion;\n };\n var elapsed = calculateElapsedPortion();\n var value = this._easingFunction(elapsed);\n // properties transformations\n this._updateProperties(this._object, this._valuesStart, this._valuesEnd, value);\n if (this._onUpdateCallback) {\n this._onUpdateCallback(this._object, elapsed);\n }\n if (this._duration === 0 || elapsedTime >= this._duration) {\n if (this._repeat > 0) {\n var completeCount = Math.min(Math.trunc((elapsedTime - this._duration) / durationAndDelay) + 1, this._repeat);\n if (isFinite(this._repeat)) {\n this._repeat -= completeCount;\n }\n // Reassign starting values, restart by making startTime = now\n for (property in this._valuesStartRepeat) {\n if (!this._yoyo && typeof this._valuesEnd[property] === 'string') {\n this._valuesStartRepeat[property] =\n // eslint-disable-next-line\n // @ts-ignore FIXME?\n this._valuesStartRepeat[property] + parseFloat(this._valuesEnd[property]);\n }\n if (this._yoyo) {\n this._swapEndStartRepeatValues(property);\n }\n this._valuesStart[property] = this._valuesStartRepeat[property];\n }\n if (this._yoyo) {\n this._reversed = !this._reversed;\n }\n this._startTime += durationAndDelay * completeCount;\n if (this._onRepeatCallback) {\n this._onRepeatCallback(this._object);\n }\n this._onEveryStartCallbackFired = false;\n return true;\n }\n else {\n if (this._onCompleteCallback) {\n this._onCompleteCallback(this._object);\n }\n for (var i = 0, numChainedTweens = this._chainedTweens.length; i < numChainedTweens; i++) {\n // Make the chained tweens start exactly at the time they should,\n // even if the `update()` method was called way past the duration of the tween\n this._chainedTweens[i].start(this._startTime + this._duration, false);\n }\n this._isPlaying = false;\n return false;\n }\n }\n return true;\n };\n Tween.prototype._updateProperties = function (_object, _valuesStart, _valuesEnd, value) {\n for (var property in _valuesEnd) {\n // Don't update properties that do not exist in the source object\n if (_valuesStart[property] === undefined) {\n continue;\n }\n var start = _valuesStart[property] || 0;\n var end = _valuesEnd[property];\n var startIsArray = Array.isArray(_object[property]);\n var endIsArray = Array.isArray(end);\n var isInterpolationList = !startIsArray && endIsArray;\n if (isInterpolationList) {\n _object[property] = this._interpolationFunction(end, value);\n }\n else if (typeof end === 'object' && end) {\n // eslint-disable-next-line\n // @ts-ignore FIXME?\n this._updateProperties(_object[property], start, end, value);\n }\n else {\n // Parses relative end values with start as base (e.g.: +10, -3)\n end = this._handleRelativeValue(start, end);\n // Protect against non numeric properties.\n if (typeof end === 'number') {\n // eslint-disable-next-line\n // @ts-ignore FIXME?\n _object[property] = start + (end - start) * value;\n }\n }\n }\n };\n Tween.prototype._handleRelativeValue = function (start, end) {\n if (typeof end !== 'string') {\n return end;\n }\n if (end.charAt(0) === '+' || end.charAt(0) === '-') {\n return start + parseFloat(end);\n }\n return parseFloat(end);\n };\n Tween.prototype._swapEndStartRepeatValues = function (property) {\n var tmp = this._valuesStartRepeat[property];\n var endValue = this._valuesEnd[property];\n if (typeof endValue === 'string') {\n this._valuesStartRepeat[property] = this._valuesStartRepeat[property] + parseFloat(endValue);\n }\n else {\n this._valuesStartRepeat[property] = this._valuesEnd[property];\n }\n this._valuesEnd[property] = tmp;\n };\n Tween.autoStartOnUpdate = false;\n return Tween;\n}());\n\nvar VERSION = '25.0.0';\n\n/**\n * Tween.js - Licensed under the MIT license\n * https://github.com/tweenjs/tween.js\n * ----------------------------------------------\n *\n * See https://github.com/tweenjs/tween.js/graphs/contributors for the full list of contributors.\n * Thank you all, you're awesome!\n */\nvar nextId = Sequence.nextId;\n/**\n * Controlling groups of tweens\n *\n * Using the TWEEN singleton to manage your tweens can cause issues in large apps with many components.\n * In these cases, you may want to create your own smaller groups of tweens.\n */\nvar TWEEN = mainGroup;\n// This is the best way to export things in a way that's compatible with both ES\n// Modules and CommonJS, without build hacks, and so as not to break the\n// existing API.\n// https://github.com/rollup/rollup/issues/1961#issuecomment-423037881\n/**\n * @deprecated The global TWEEN Group will be removed in a following major\n * release. To migrate, create a `new Group()` instead of using `TWEEN` as a\n * group.\n *\n * Old code:\n *\n * ```js\n * import * as TWEEN from '@tweenjs/tween.js'\n *\n * //...\n *\n * const tween = new TWEEN.Tween(obj)\n * const tween2 = new TWEEN.Tween(obj2)\n *\n * //...\n *\n * requestAnimationFrame(function loop(time) {\n * TWEEN.update(time)\n * requestAnimationFrame(loop)\n * })\n * ```\n *\n * New code:\n *\n * ```js\n * import {Tween, Group} from '@tweenjs/tween.js'\n *\n * //...\n *\n * const tween = new Tween(obj)\n * const tween2 = new TWEEN.Tween(obj2)\n *\n * //...\n *\n * const group = new Group()\n * group.add(tween)\n * group.add(tween2)\n *\n * //...\n *\n * requestAnimationFrame(function loop(time) {\n * group.update(time)\n * requestAnimationFrame(loop)\n * })\n * ```\n */\nvar getAll = TWEEN.getAll.bind(TWEEN);\n/**\n * @deprecated The global TWEEN Group will be removed in a following major\n * release. To migrate, create a `new Group()` instead of using `TWEEN` as a\n * group.\n *\n * Old code:\n *\n * ```js\n * import * as TWEEN from '@tweenjs/tween.js'\n *\n * //...\n *\n * const tween = new TWEEN.Tween(obj)\n * const tween2 = new TWEEN.Tween(obj2)\n *\n * //...\n *\n * requestAnimationFrame(function loop(time) {\n * TWEEN.update(time)\n * requestAnimationFrame(loop)\n * })\n * ```\n *\n * New code:\n *\n * ```js\n * import {Tween, Group} from '@tweenjs/tween.js'\n *\n * //...\n *\n * const tween = new Tween(obj)\n * const tween2 = new TWEEN.Tween(obj2)\n *\n * //...\n *\n * const group = new Group()\n * group.add(tween)\n * group.add(tween2)\n *\n * //...\n *\n * requestAnimationFrame(function loop(time) {\n * group.update(time)\n * requestAnimationFrame(loop)\n * })\n * ```\n */\nvar removeAll = TWEEN.removeAll.bind(TWEEN);\n/**\n * @deprecated The global TWEEN Group will be removed in a following major\n * release. To migrate, create a `new Group()` instead of using `TWEEN` as a\n * group.\n *\n * Old code:\n *\n * ```js\n * import * as TWEEN from '@tweenjs/tween.js'\n *\n * //...\n *\n * const tween = new TWEEN.Tween(obj)\n * const tween2 = new TWEEN.Tween(obj2)\n *\n * //...\n *\n * requestAnimationFrame(function loop(time) {\n * TWEEN.update(time)\n * requestAnimationFrame(loop)\n * })\n * ```\n *\n * New code:\n *\n * ```js\n * import {Tween, Group} from '@tweenjs/tween.js'\n *\n * //...\n *\n * const tween = new Tween(obj)\n * const tween2 = new TWEEN.Tween(obj2)\n *\n * //...\n *\n * const group = new Group()\n * group.add(tween)\n * group.add(tween2)\n *\n * //...\n *\n * requestAnimationFrame(function loop(time) {\n * group.update(time)\n * requestAnimationFrame(loop)\n * })\n * ```\n */\nvar add = TWEEN.add.bind(TWEEN);\n/**\n * @deprecated The global TWEEN Group will be removed in a following major\n * release. To migrate, create a `new Group()` instead of using `TWEEN` as a\n * group.\n *\n * Old code:\n *\n * ```js\n * import * as TWEEN from '@tweenjs/tween.js'\n *\n * //...\n *\n * const tween = new TWEEN.Tween(obj)\n * const tween2 = new TWEEN.Tween(obj2)\n *\n * //...\n *\n * requestAnimationFrame(function loop(time) {\n * TWEEN.update(time)\n * requestAnimationFrame(loop)\n * })\n * ```\n *\n * New code:\n *\n * ```js\n * import {Tween, Group} from '@tweenjs/tween.js'\n *\n * //...\n *\n * const tween = new Tween(obj)\n * const tween2 = new TWEEN.Tween(obj2)\n *\n * //...\n *\n * const group = new Group()\n * group.add(tween)\n * group.add(tween2)\n *\n * //...\n *\n * requestAnimationFrame(function loop(time) {\n * group.update(time)\n * requestAnimationFrame(loop)\n * })\n * ```\n */\nvar remove = TWEEN.remove.bind(TWEEN);\n/**\n * @deprecated The global TWEEN Group will be removed in a following major\n * release. To migrate, create a `new Group()` instead of using `TWEEN` as a\n * group.\n *\n * Old code:\n *\n * ```js\n * import * as TWEEN from '@tweenjs/tween.js'\n *\n * //...\n *\n * const tween = new TWEEN.Tween(obj)\n * const tween2 = new TWEEN.Tween(obj2)\n *\n * //...\n *\n * requestAnimationFrame(function loop(time) {\n * TWEEN.update(time)\n * requestAnimationFrame(loop)\n * })\n * ```\n *\n * New code:\n *\n * ```js\n * import {Tween, Group} from '@tweenjs/tween.js'\n *\n * //...\n *\n * const tween = new Tween(obj)\n * const tween2 = new TWEEN.Tween(obj2)\n *\n * //...\n *\n * const group = new Group()\n * group.add(tween)\n * group.add(tween2)\n *\n * //...\n *\n * requestAnimationFrame(function loop(time) {\n * group.update(time)\n * requestAnimationFrame(loop)\n * })\n * ```\n */\nvar update = TWEEN.update.bind(TWEEN);\nvar exports = {\n Easing: Easing,\n Group: Group,\n Interpolation: Interpolation,\n now: now,\n Sequence: Sequence,\n nextId: nextId,\n Tween: Tween,\n VERSION: VERSION,\n /**\n * @deprecated The global TWEEN Group will be removed in a following major\n * release. To migrate, create a `new Group()` instead of using `TWEEN` as a\n * group.\n *\n * Old code:\n *\n * ```js\n * import * as TWEEN from '@tweenjs/tween.js'\n *\n * //...\n *\n * const tween = new TWEEN.Tween(obj)\n * const tween2 = new TWEEN.Tween(obj2)\n *\n * //...\n *\n * requestAnimationFrame(function loop(time) {\n * TWEEN.update(time)\n * requestAnimationFrame(loop)\n * })\n * ```\n *\n * New code:\n *\n * ```js\n * import {Tween, Group} from '@tweenjs/tween.js'\n *\n * //...\n *\n * const tween = new Tween(obj)\n * const tween2 = new TWEEN.Tween(obj2)\n *\n * //...\n *\n * const group = new Group()\n * group.add(tween)\n * group.add(tween2)\n *\n * //...\n *\n * requestAnimationFrame(function loop(time) {\n * group.update(time)\n * requestAnimationFrame(loop)\n * })\n * ```\n */\n getAll: getAll,\n /**\n * @deprecated The global TWEEN Group will be removed in a following major\n * release. To migrate, create a `new Group()` instead of using `TWEEN` as a\n * group.\n *\n * Old code:\n *\n * ```js\n * import * as TWEEN from '@tweenjs/tween.js'\n *\n * //...\n *\n * const tween = new TWEEN.Tween(obj)\n * const tween2 = new TWEEN.Tween(obj2)\n *\n * //...\n *\n * requestAnimationFrame(function loop(time) {\n * TWEEN.update(time)\n * requestAnimationFrame(loop)\n * })\n * ```\n *\n * New code:\n *\n * ```js\n * import {Tween, Group} from '@tweenjs/tween.js'\n *\n * //...\n *\n * const tween = new Tween(obj)\n * const tween2 = new TWEEN.Tween(obj2)\n *\n * //...\n *\n * const group = new Group()\n * group.add(tween)\n * group.add(tween2)\n *\n * //...\n *\n * requestAnimationFrame(function loop(time) {\n * group.update(time)\n * requestAnimationFrame(loop)\n * })\n * ```\n */\n removeAll: removeAll,\n /**\n * @deprecated The global TWEEN Group will be removed in a following major\n * release. To migrate, create a `new Group()` instead of using `TWEEN` as a\n * group.\n *\n * Old code:\n *\n * ```js\n * import * as TWEEN from '@tweenjs/tween.js'\n *\n * //...\n *\n * const tween = new TWEEN.Tween(obj)\n * const tween2 = new TWEEN.Tween(obj2)\n *\n * //...\n *\n * requestAnimationFrame(function loop(time) {\n * TWEEN.update(time)\n * requestAnimationFrame(loop)\n * })\n * ```\n *\n * New code:\n *\n * ```js\n * import {Tween, Group} from '@tweenjs/tween.js'\n *\n * //...\n *\n * const tween = new Tween(obj)\n * const tween2 = new TWEEN.Tween(obj2)\n *\n * //...\n *\n * const group = new Group()\n * group.add(tween)\n * group.add(tween2)\n *\n * //...\n *\n * requestAnimationFrame(function loop(time) {\n * group.update(time)\n * requestAnimationFrame(loop)\n * })\n * ```\n */\n add: add,\n /**\n * @deprecated The global TWEEN Group will be removed in a following major\n * release. To migrate, create a `new Group()` instead of using `TWEEN` as a\n * group.\n *\n * Old code:\n *\n * ```js\n * import * as TWEEN from '@tweenjs/tween.js'\n *\n * //...\n *\n * const tween = new TWEEN.Tween(obj)\n * const tween2 = new TWEEN.Tween(obj2)\n *\n * //...\n *\n * requestAnimationFrame(function loop(time) {\n * TWEEN.update(time)\n * requestAnimationFrame(loop)\n * })\n * ```\n *\n * New code:\n *\n * ```js\n * import {Tween, Group} from '@tweenjs/tween.js'\n *\n * //...\n *\n * const tween = new Tween(obj)\n * const tween2 = new TWEEN.Tween(obj2)\n *\n * //...\n *\n * const group = new Group()\n * group.add(tween)\n * group.add(tween2)\n *\n * //...\n *\n * requestAnimationFrame(function loop(time) {\n * group.update(time)\n * requestAnimationFrame(loop)\n * })\n * ```\n */\n remove: remove,\n /**\n * @deprecated The global TWEEN Group will be removed in a following major\n * release. To migrate, create a `new Group()` instead of using `TWEEN` as a\n * group.\n *\n * Old code:\n *\n * ```js\n * import * as TWEEN from '@tweenjs/tween.js'\n *\n * //...\n *\n * const tween = new TWEEN.Tween(obj)\n * const tween2 = new TWEEN.Tween(obj2)\n *\n * //...\n *\n * requestAnimationFrame(function loop(time) {\n * TWEEN.update(time)\n * requestAnimationFrame(loop)\n * })\n * ```\n *\n * New code:\n *\n * ```js\n * import {Tween, Group} from '@tweenjs/tween.js'\n *\n * //...\n *\n * const tween = new Tween(obj)\n * const tween2 = new TWEEN.Tween(obj2)\n *\n * //...\n *\n * const group = new Group()\n * group.add(tween)\n * group.add(tween2)\n *\n * //...\n *\n * requestAnimationFrame(function loop(time) {\n * group.update(time)\n * requestAnimationFrame(loop)\n * })\n * ```\n */\n update: update,\n};\n\nexport { Easing, Group, Interpolation, Sequence, Tween, VERSION, add, exports as default, getAll, nextId, now, remove, removeAll, update };\n","import { round, toRadiant } from './math-helper';\nimport type {\n Dimensioning,\n KernelCube,\n KernelEnum,\n} from '../../../typings/kernel';\nimport type {\n AssetUrl,\n RapiBaseColor,\n RapiMaterial,\n RapiMaterialShading,\n RapiTexture,\n} from '../../../typings/rapi-types';\nimport { RAPI_TEXTURE_TYPE } from '../../../typings/rapi-types';\nimport { PlanElementType } from '../../../typings/planner-kernel-container';\nimport { getValue } from './common-utils';\nimport type { Position2, Position3 } from '../common-interfaces';\nimport { type WallPlanElementViewModel } from '../../../planner-core/src/view-model/wall-plan-element-view-model';\nimport { KernelWallType } from '../../../typings/planner';\nimport { convertToTHREE } from './kernel-utils';\nimport type { ShaderChunk, BufferGeometry } from 'three';\nimport {\n Box3,\n type Camera,\n Color,\n DataTexture,\n DoubleSide,\n FrontSide,\n Frustum,\n type Intersection,\n Layers,\n type Material,\n Matrix4,\n Mesh,\n MeshBasicMaterial,\n type MeshPhysicalMaterial,\n type MeshStandardMaterial,\n type NormalBufferAttributes,\n type Object3D,\n type Object3DEventMap,\n Quaternion,\n RepeatWrapping,\n RGBAFormat,\n Scene,\n SRGBColorSpace,\n type Texture,\n TextureLoader,\n type Vector2,\n Vector3,\n WebGLRenderer,\n} from 'three';\nimport type { WebGPURenderer } from 'three/webgpu';\nimport type { GUI } from 'dat.gui';\n\n// dat.gui has module-level window.requestAnimationFrame references that crash\n// in Node.js when evaluated before happy-dom registers window. Load it lazily\n// so dat.gui only runs after the DOM environment is available.\n// typeof window is 'undefined' at module-eval time in Node.js (before happy-dom),\n// so the import is safely skipped in headless environments.\nlet _guiClass:\n | (new (options?: { autoPlace?: boolean; width?: number }) => GUI)\n | null = null;\nif (typeof globalThis.window !== 'undefined') {\n import('dat.gui')\n .then((m) => {\n _guiClass = m.GUI as any;\n })\n .catch(() => {});\n}\nimport MaterialCreator from './material-creator';\nimport type { OBJECT_EVENT } from '../../../configurator-core/src/utils/raycast-helper';\nimport type { INPUT_EVENT_TYPE } from '../input/input-manager';\nimport { Easing, Tween } from '@tweenjs/tween.js';\n\n// Constants\nexport const DEFAULT_WEBGPU_MAX_TEXTURES = 16;\nexport const DEFAULT_WEBGPU_MAX_SAMPLES = 16;\nexport const DEFAULT_WEBGPU_MAX_ANISOTROPY = 16;\n\nexport const PREVIEW_LINE_MATERIAL_OPACITY = 0.4;\nexport const PREVIEW_MATERIAL_COLOR = '#DDDDDD';\nexport const PREVIEW_MATERIAL_ROUGHNESS = 1;\nexport const PREVIEW_MATERIAL_METALNESS = 0;\nexport const PREVIEW_MATERIAL_OPACITY = 1;\nexport const DOOR_WINDOW_MATERIAL_OPACITY = 1;\nexport const DOOR_ARCH_MATERIAL_OPACITY = 0.4;\nexport const DOOR_ARCH_MATERIAL_OUTLINE_COLOR = '#7B7B7B';\nexport const DOOR_WINDOW_MATERIAL_COLOR = '#B1B1B1';\n\nexport const DOCK_PREVIEW_MATERIAL_ROUGHNESS = 1;\nexport const DOCK_PREVIEW_MATERIAL_METALNESS = 0;\nexport const DOCK_PREVIEW_MATERIAL_OPACITY = 0.8;\nexport const DOCK_PREVIEW_MATERIAL_OPACITY_HOVERED = 0.9;\n\nexport const getMaxSamples = (\n renderer: WebGLRenderer | WebGPURenderer,\n): number => {\n if (renderer instanceof WebGLRenderer) {\n return renderer.capabilities.maxSamples;\n }\n return DEFAULT_WEBGPU_MAX_SAMPLES;\n};\n\nexport const getMaxTextures = (\n renderer: WebGLRenderer | WebGPURenderer,\n): number => {\n if (renderer instanceof WebGLRenderer) {\n return renderer.capabilities.maxTextures;\n }\n return DEFAULT_WEBGPU_MAX_TEXTURES;\n};\n\nexport const getMaxAnisotropy = (\n renderer: WebGLRenderer | WebGPURenderer,\n): number => {\n if (renderer instanceof WebGLRenderer) {\n return renderer.capabilities.getMaxAnisotropy();\n }\n return DEFAULT_WEBGPU_MAX_ANISOTROPY;\n};\n\nexport const getScreenXY = (\n obj: Vector3,\n camera: Camera,\n clientWidth: number,\n clientHeight: number,\n): Vector3 => {\n if (!obj || !camera || clientWidth === 0 || clientHeight === 0) {\n return new Vector3();\n }\n\n const vector = obj.clone();\n\n const widthHalf = clientWidth / 2;\n const heightHalf = clientHeight / 2;\n\n vector.project(camera);\n\n vector.x = Math.floor(vector.x * widthHalf + widthHalf);\n vector.y = Math.floor(-(vector.y * heightHalf) + heightHalf);\n vector.z = obj.distanceTo(camera.position);\n\n return vector;\n};\n\nexport const kernelBoxToThreeBox = (\n kernelCube: KernelCube,\n margin?: Vector3,\n): Box3 => {\n if (!margin) {\n margin = new Vector3(0, 0, 0);\n }\n const bounds = new Vector3(\n kernelCube.size.x / 1000,\n kernelCube.size.z / 1000,\n kernelCube.size.y / 1000,\n );\n const boxOrigin = new Vector3(\n kernelCube.origin.x / 1000,\n kernelCube.origin.z / 1000,\n kernelCube.origin.y / -1000,\n );\n\n const lineMinVector: Vector3 = new Vector3(0, 0, -bounds.z)\n .add(boxOrigin)\n .sub(margin);\n const lineMaxVector: Vector3 = new Vector3(bounds.x, bounds.y, 0)\n .add(boxOrigin)\n .add(margin);\n return new Box3(lineMinVector, lineMaxVector);\n};\n\nexport const kernelDimensioningToThree = (\n dimensions: Dimensioning,\n): Dimensioning => {\n dimensions.from = dimensions.from / 1000;\n dimensions.to = dimensions.to / 1000;\n return dimensions;\n};\n\nexport const setShadows = (\n object: Object3D,\n receiveShadow: boolean,\n castShadow: boolean,\n) => {\n object.castShadow = castShadow;\n object.receiveShadow = receiveShadow;\n object.children.forEach((child: Object3D) => {\n setShadows(child, receiveShadow, castShadow);\n });\n};\n\nexport const position3VectorsAreEqual = (a: Vector3, b: Vector3): boolean => {\n const aX = round(a.x);\n const aY = round(a.y);\n const aZ = round(a.z);\n\n const bX = round(b.x);\n const bY = round(b.y);\n const bZ = round(b.z);\n\n return aX === bX && aY === bY && aZ === bZ;\n};\n\nexport const rotationQuaternionsAreEqual = (\n a: Quaternion,\n b: Quaternion,\n): boolean => {\n const aW = round(a.w);\n const aX = round(a.x);\n const aY = round(a.y);\n const aZ = round(a.z);\n\n const bW = round(b.w);\n const bX = round(b.x);\n const bY = round(b.y);\n const bZ = round(b.z);\n\n return aW === bW && aX === bX && aY === bY && aZ === bZ;\n};\n\nexport const position2VectorsAreEqual = (a: Vector2, b: Vector2): boolean => {\n const aX = round(a.x);\n const aY = round(a.y);\n\n const bX = round(b.x);\n const bY = round(b.y);\n\n return aX === bX && aY === bY;\n};\n\nlet whiteTexture: any = null;\n\nconst getWhiteTexture = () => {\n if (whiteTexture) {\n return whiteTexture;\n }\n const width = 1;\n const height = 1;\n const size = width * height;\n const data = new Uint8Array(4 * size);\n\n for (let i = 0; i < size; i++) {\n const stride = i * 4;\n\n data[stride] = 255;\n data[stride + 1] = 255;\n data[stride + 2] = 255;\n data[stride + 3] = 255;\n }\n const texture = new DataTexture(data, width, height, RGBAFormat);\n texture.needsUpdate = true;\n return texture;\n};\n\nexport const createMaterial = (\n material: RapiMaterial,\n): MeshPhysicalMaterial => {\n return setMaterial(null, material);\n};\n\nexport const setMaterial = (\n meshPhysicalMaterial: MeshPhysicalMaterial | null,\n rapiMaterial: RapiMaterial,\n): MeshPhysicalMaterial => {\n if (!meshPhysicalMaterial) {\n meshPhysicalMaterial = createMeshPhysicalMaterial();\n }\n\n meshPhysicalMaterial.name = rapiMaterial.id ? rapiMaterial.id.toString() : '';\n\n const isV2Material =\n rapiMaterial.shading.version === '2' ||\n rapiMaterial.shading.version?.startsWith('2.');\n meshPhysicalMaterial = isV2Material\n ? _setMaterialV2Properties(meshPhysicalMaterial, rapiMaterial)\n : _setMaterialV1Properties(meshPhysicalMaterial, rapiMaterial);\n meshPhysicalMaterial.userData.materialVersion = isV2Material ? 2 : 1;\n\n if (!meshPhysicalMaterial.map) {\n if (!whiteTexture) {\n whiteTexture = getWhiteTexture();\n }\n // this is a workaround because materials are displayed wrong on some mobile devices (Pixel 3 for example)\n // when a material has only a color but no texture\n meshPhysicalMaterial.map = whiteTexture as Texture;\n }\n return meshPhysicalMaterial;\n};\n\nconst _setMaterialV1Properties = (\n meshPhysicalMaterial: MeshPhysicalMaterial,\n rapiMaterial: RapiMaterial,\n): MeshPhysicalMaterial => {\n if (rapiMaterial.shading.metallic !== undefined) {\n meshPhysicalMaterial.metalness =\n rapiMaterial.shading.metallic === 1 ? 1 : 0.5;\n meshPhysicalMaterial.reflectivity = getValue(\n rapiMaterial.shading.metallic,\n 0.5,\n ); //three.js default is 0.5\n }\n\n let forceDoubleSide = false; // for backwards compatibility\n if (\n rapiMaterial.shading.transmission &&\n rapiMaterial.shading.transmission > 0\n ) {\n // disabled transmission compatibility mode to improve performance and be compatible with pixotronics renderer\n // meshPhysicalMaterial.transmission = rapiMaterial.shading.transmission;\n meshPhysicalMaterial.opacity = 1 - rapiMaterial.shading.transmission;\n meshPhysicalMaterial.transparent = true;\n meshPhysicalMaterial.depthWrite = false;\n meshPhysicalMaterial.metalness = 0;\n forceDoubleSide = true;\n } else if (\n rapiMaterial.shading.alpha !== undefined &&\n rapiMaterial.shading.alpha < 1\n ) {\n meshPhysicalMaterial.transparent = rapiMaterial.shading.alpha < 1;\n meshPhysicalMaterial.opacity = rapiMaterial.shading.alpha;\n meshPhysicalMaterial.depthWrite = rapiMaterial.shading.alpha >= 1;\n // modulate metalness with alpha channel for backwards compatibility\n meshPhysicalMaterial.metalness =\n 0.5 * Math.max(0, rapiMaterial.shading.alpha);\n forceDoubleSide = true;\n }\n\n meshPhysicalMaterial.aoMapIntensity = getValue(\n rapiMaterial.shading.occlusion,\n 1,\n );\n meshPhysicalMaterial.roughness = getValue(\n rapiMaterial.shading.roughness,\n 0.5,\n ); //three.js default is 0.5\n meshPhysicalMaterial.alphaTest = getValue(\n rapiMaterial.shading.alphaCutoff,\n 0,\n );\n\n _setColor(meshPhysicalMaterial.color, rapiMaterial.shading.basecolor);\n if (forceDoubleSide || rapiMaterial.shading.doubleSided) {\n meshPhysicalMaterial.side = DoubleSide;\n } else {\n meshPhysicalMaterial.side = FrontSide;\n }\n return meshPhysicalMaterial;\n};\n\n// To fulfill the \"eslint\" complexity rule, we would have to split this function into at least 3 functions.\n// This is pointless, as this function does exactly one thing, namely map \"RapiMaterial\" to \"MeshPhysicalMaterial\".\n\nconst _setMaterialV2Properties = (\n meshPhysicalMaterial: MeshPhysicalMaterial,\n rapiMaterial: RapiMaterial,\n): MeshPhysicalMaterial => {\n let forceDoubleSide = false; // for backwards compatibility\n if (\n rapiMaterial.shading.alpha !== undefined &&\n rapiMaterial.shading.alpha < 1\n ) {\n meshPhysicalMaterial.transparent = true;\n meshPhysicalMaterial.opacity = rapiMaterial.shading.alpha;\n meshPhysicalMaterial.depthWrite = false;\n forceDoubleSide = true;\n } else {\n meshPhysicalMaterial.transparent = false;\n meshPhysicalMaterial.opacity = 1;\n meshPhysicalMaterial.depthWrite = true;\n }\n meshPhysicalMaterial.alphaTest = rapiMaterial.shading.alphaCutoff ?? 0;\n _setColor(meshPhysicalMaterial.color, rapiMaterial.shading.basecolor);\n meshPhysicalMaterial.transmission = rapiMaterial.shading.transmission ?? 0;\n meshPhysicalMaterial.ior = Math.max(\n 1.0,\n Math.min(2.33, rapiMaterial.shading.transmissionIOR ?? 1.5),\n );\n meshPhysicalMaterial.metalness = rapiMaterial.shading.metallic ?? 0;\n _setColor(\n meshPhysicalMaterial.specularColor,\n rapiMaterial.shading.specularColor,\n );\n meshPhysicalMaterial.specularIntensity =\n rapiMaterial.shading.specularity ?? 1;\n meshPhysicalMaterial.roughness = rapiMaterial.shading.roughness ?? 0;\n meshPhysicalMaterial.aoMapIntensity = rapiMaterial.shading.occlusion ?? 1;\n _setColor(meshPhysicalMaterial.emissive, rapiMaterial.shading.emissiveColor);\n meshPhysicalMaterial.emissiveIntensity =\n rapiMaterial.shading.emissiveIntensity ?? 1;\n meshPhysicalMaterial.clearcoat = rapiMaterial.shading.clearcoatIntensity ?? 0;\n meshPhysicalMaterial.clearcoatRoughness =\n rapiMaterial.shading.clearcoatRoughness ?? 0;\n meshPhysicalMaterial.clearcoatNormalScale.setScalar(\n rapiMaterial.shading.clearcoatNormalScale ?? 1,\n );\n _setColor(meshPhysicalMaterial.sheenColor, rapiMaterial.shading.sheenColor);\n meshPhysicalMaterial.sheen = rapiMaterial.shading.sheenIntensity ?? 1;\n meshPhysicalMaterial.sheenRoughness =\n rapiMaterial.shading.sheenRoughness ?? 1;\n meshPhysicalMaterial.thickness = rapiMaterial.shading.thicknessFactor ?? 0;\n _setColor(\n meshPhysicalMaterial.attenuationColor,\n rapiMaterial.shading.attenuationColor,\n );\n if (rapiMaterial.shading.attenuationDistance) {\n meshPhysicalMaterial.attenuationDistance =\n rapiMaterial.shading.attenuationDistance;\n }\n meshPhysicalMaterial.side =\n forceDoubleSide || rapiMaterial.shading.doubleSided\n ? DoubleSide\n : FrontSide;\n\n return meshPhysicalMaterial;\n};\n\nconst createMeshPhysicalMaterial = (): MeshPhysicalMaterial => {\n return MaterialCreator.createMeshPhysicalMaterial({});\n};\n\nexport const getMaterialShading = (\n material: MeshPhysicalMaterial,\n version: number = 1,\n): RapiMaterialShading => {\n return version === 2\n ? _getMaterialShadingV2(material)\n : _getMaterialShadingV1(material);\n};\n\nconst _getMaterialShadingV1 = (\n material: MeshPhysicalMaterial,\n): RapiMaterialShading => {\n const shading: RapiMaterialShading = {\n alpha: material.opacity,\n metallic: material.reflectivity,\n basecolor: _getColor(material.color),\n roughness: material.roughness,\n doubleSided: material.side === DoubleSide,\n alphaCutoff: material.alphaTest,\n transmission: material.transmission,\n };\n if (material.metalness === 1) {\n shading.metallic = 1;\n } else {\n shading.metallic = material.reflectivity;\n }\n return shading;\n};\n\nconst _getMaterialShadingV2 = (\n material: MeshPhysicalMaterial,\n): RapiMaterialShading => {\n return {\n version: '2.0.0',\n alpha: material.opacity,\n alphaCutoff: material.alphaTest,\n basecolor: _getColor(material.color),\n transmission: material.transmission,\n transmissionIOR: material.ior,\n metallic: material.metalness,\n doubleSided: material.side === DoubleSide,\n specularColor: _getColor(material.specularColor),\n specularity: material.specularIntensity,\n roughness: material.roughness,\n occlusion: material.aoMapIntensity,\n emissiveColor: _getColor(material.emissive),\n emissiveIntensity: material.emissiveIntensity,\n clearcoatIntensity: material.clearcoat,\n clearcoatRoughness: material.clearcoatRoughness,\n clearcoatNormalScale: material.clearcoatNormalScale.x,\n sheenColor: _getColor(material.sheenColor),\n sheenIntensity: material.sheen,\n sheenRoughness: material.sheenRoughness,\n thicknessFactor: material.thickness,\n attenuationColor: _getColor(material.attenuationColor),\n attenuationDistance: material.attenuationDistance,\n };\n};\n\nconst _setColor = (meshColor: Color, rapiColor?: RapiBaseColor) => {\n if (rapiColor !== undefined) {\n const color = new Color(rapiColor.r, rapiColor.g, rapiColor.b);\n meshColor.copy(color.convertSRGBToLinear());\n }\n};\n\nconst _getColor = (meshColor: Color): RapiBaseColor => {\n const color = meshColor.clone().convertLinearToSRGB();\n return {\n r: color.r,\n g: color.g,\n b: color.b,\n };\n};\n\nlet textureLoader: TextureLoader | null = null;\n\nexport const addTexture = (\n assetUrl: AssetUrl,\n rapiTexture: RapiTexture,\n material: MeshPhysicalMaterial,\n maxAnisotropy: number,\n repeatWidth: number,\n repeatHeight: number,\n maxTextures: number = 16,\n): Promise<void> => {\n if (!textureLoader) {\n textureLoader = new TextureLoader();\n textureLoader.crossOrigin = '';\n }\n // Capture in local const so TS narrows the type inside the closure below\n const loader = textureLoader;\n return new Promise<void>((resolve, reject) => {\n if (!assetUrl) {\n console.warn('trying to add a texture without image', rapiTexture);\n // we resolve here because otherwise Promise.all fails\n resolve();\n return;\n }\n loader.load(\n assetUrl,\n (texture) => {\n addExistingTexture(\n texture,\n rapiTexture,\n material,\n maxAnisotropy,\n repeatWidth,\n repeatHeight,\n maxTextures,\n );\n resolve();\n },\n (error) => {\n reject(error);\n },\n );\n });\n};\n\nexport const addExistingTexture = (\n texture: Texture,\n rapiTexture: RapiTexture,\n material: MeshPhysicalMaterial,\n maxAnisotropy: number,\n repeatWidth: number,\n repeatHeight: number,\n maxTextures: number = 16,\n) => {\n texture.anisotropy = maxAnisotropy;\n texture.wrapS = RepeatWrapping;\n texture.wrapT = RepeatWrapping;\n\n if (\n maxTextures <= 8 &&\n [\n RAPI_TEXTURE_TYPE.ORM,\n RAPI_TEXTURE_TYPE.EMRGB,\n RAPI_TEXTURE_TYPE.CCRG,\n RAPI_TEXTURE_TYPE.CCXYZ,\n RAPI_TEXTURE_TYPE.SHRGBA,\n RAPI_TEXTURE_TYPE.SPRGBA,\n RAPI_TEXTURE_TYPE.TTRG,\n ].includes(rapiTexture.mapping)\n ) {\n console.warn(\n 'ORM maps are not supported on devices with only ' +\n maxTextures +\n ' texture units',\n );\n return;\n }\n\n texture.repeat.set(repeatWidth, repeatHeight);\n _setMaterialMaps(texture, rapiTexture, material);\n\n if (rapiTexture.mapping === RAPI_TEXTURE_TYPE.RGBA) {\n material.transparent = true;\n\n if (material.userData.materialVersion === 1) {\n const isEmissive = material.name.includes('glow');\n if (isEmissive) {\n material.emissiveIntensity = 0.5;\n material.emissive = new Color(0xffffff);\n material.emissiveMap = material.map;\n }\n }\n }\n\n material.needsUpdate = true;\n};\n\nconst _setMaterialMaps = (\n texture: Texture,\n rapiTexture: RapiTexture,\n material: MeshPhysicalMaterial,\n) => {\n if (rapiTexture.mapping === RAPI_TEXTURE_TYPE.XYZ) {\n material.normalMap = texture;\n if (material.map === getWhiteTexture()) {\n material.map = null;\n }\n } else if (rapiTexture.mapping === RAPI_TEXTURE_TYPE.ORM) {\n material.aoMap = texture;\n material.roughnessMap = texture;\n material.metalnessMap = texture;\n } else if (rapiTexture.mapping === RAPI_TEXTURE_TYPE.EMRGB) {\n material.emissiveMap = texture;\n } else if (rapiTexture.mapping === RAPI_TEXTURE_TYPE.CCRG) {\n material.clearcoatMap = texture;\n material.clearcoatRoughnessMap = texture;\n } else if (rapiTexture.mapping === RAPI_TEXTURE_TYPE.CCXYZ) {\n material.clearcoatNormalMap = texture;\n } else if (rapiTexture.mapping === RAPI_TEXTURE_TYPE.SHRGBA) {\n material.sheenColorMap = texture;\n material.sheenRoughnessMap = texture;\n } else if (rapiTexture.mapping === RAPI_TEXTURE_TYPE.SPRGBA) {\n material.specularColorMap = texture;\n material.specularIntensityMap = texture;\n } else if (rapiTexture.mapping === RAPI_TEXTURE_TYPE.TTRG) {\n material.transmissionMap = texture;\n material.thicknessMap = texture;\n } else {\n texture.colorSpace = SRGBColorSpace;\n material.map = texture;\n }\n};\n\nexport const getWebGLGUI = (autoPlace: boolean = true): GUI | null => {\n if (!window.__RML_WEBGL_GUI__) {\n if (!_guiClass) {\n return null;\n }\n try {\n window.__RML_WEBGL_GUI__ = new _guiClass({ autoPlace });\n } catch {\n return null;\n }\n }\n return window.__RML_WEBGL_GUI__ ?? null;\n};\n\nexport const hideWallsBasedOnCamera = (\n camera: Camera,\n wallPlanElementViewModels: WallPlanElementViewModel[],\n): boolean => {\n let anyVisibilityChanged = false;\n for (const wallPlanElementViewModel of wallPlanElementViewModels) {\n const kernelWall = wallPlanElementViewModel.getKernelObject();\n let wallNormal;\n if (kernelWall.wallType.value === KernelWallType.OuterWallRight) {\n wallNormal = convertToTHREE(kernelWall.rightNormal);\n }\n if (kernelWall.wallType.value === KernelWallType.OuterWallLeft) {\n wallNormal = convertToTHREE(kernelWall.leftNormal);\n }\n let visible = true;\n if (wallNormal) {\n let wallCenter = convertToTHREE(\n wallPlanElementViewModel.getPlanElement().getCenter(),\n );\n wallCenter = wallCenter.applyMatrix4(camera.matrixWorldInverse);\n\n wallNormal = wallNormal.transformDirection(camera.matrixWorldInverse);\n const cameraDirection = wallCenter;\n const dotProduct = cameraDirection.dot(wallNormal);\n visible = dotProduct >= 0;\n }\n if (visible !== wallPlanElementViewModel.getContainer().visible) {\n anyVisibilityChanged = true;\n }\n if (visible) {\n wallPlanElementViewModel.setContainerVisibility(true);\n } else {\n if (!wallPlanElementViewModel.isSelected) {\n wallPlanElementViewModel.setContainerVisibility(false);\n }\n }\n }\n return anyVisibilityChanged;\n};\n\nexport const setWallTransparency = (\n material: Material,\n transparent: boolean,\n animate = true,\n) => {\n if (material.userData.tween) {\n return;\n }\n if (transparent) {\n material.transparent = true;\n if (!animate) {\n material.opacity = 0.2;\n } else {\n const params = { opacity: 1 };\n material.userData.tween = true;\n const tween = new Tween(params)\n .to({ opacity: 0.2 }, 400)\n .easing(Easing.Sinusoidal.In)\n .onUpdate(() => {\n material.opacity = params.opacity;\n })\n .onComplete(() => {\n material.userData.tween = false;\n window.TWEEN?.remove(tween);\n })\n .start();\n window.TWEEN?.add(tween);\n }\n } else {\n if (!animate) {\n material.opacity = 1;\n material.transparent = false;\n } else {\n const params = { opacity: 0.2 };\n material.userData.tween = true;\n const tween = new Tween(params)\n .to({ opacity: 1 }, 400)\n .easing(Easing.Sinusoidal.In)\n .onUpdate(() => {\n material.opacity = params.opacity;\n })\n .onComplete(() => {\n material.transparent = false;\n material.userData.tween = false;\n window.TWEEN?.remove(tween);\n })\n .start();\n window.TWEEN?.add(tween);\n }\n }\n};\n\nexport const animateObjectMatrix = (\n object3d: Object3D,\n priorMatrix: Matrix4,\n fromMatrix: Matrix4,\n toMatrix: Matrix4,\n subsequentTransform: Matrix4,\n onProgressUpdate?: () => void,\n): Tween => {\n const baseMatrix = calculateBaseMatrix(fromMatrix, toMatrix);\n const finalMatrix = subsequentTransform\n .clone()\n .multiply(toMatrix)\n .multiply(priorMatrix);\n const inverseBaseMatrix = baseMatrix.clone().invert();\n const fromAddOnMatrix = inverseBaseMatrix.clone().multiply(fromMatrix);\n const toAddOnMatrix = inverseBaseMatrix.clone().multiply(toMatrix);\n const params = { t: 0 };\n const tween = new Tween(params)\n .to({ t: 1 }, 400)\n .easing(Easing.Quadratic.InOut)\n .onUpdate(() => {\n const interpolatedMatrix = circularInterpolateMatrix(\n fromAddOnMatrix,\n toAddOnMatrix,\n params.t,\n );\n const finalInterpolatedMatrix = subsequentTransform\n .clone()\n .multiply(baseMatrix)\n .multiply(interpolatedMatrix)\n .multiply(priorMatrix);\n setObjectMatrix(object3d, finalInterpolatedMatrix);\n if (onProgressUpdate) {\n onProgressUpdate();\n }\n })\n .onComplete(() => {\n setObjectMatrix(object3d, finalMatrix);\n if (onProgressUpdate) {\n onProgressUpdate();\n }\n window.TWEEN?.remove(tween);\n })\n .onStop(() => {\n window.TWEEN?.remove(tween);\n })\n .start();\n window.TWEEN?.add(tween);\n return tween;\n};\n\nexport const calculateBaseMatrix = (matrixFrom: Matrix4, matrixTo: Matrix4) => {\n const inverseFromMatrix = matrixFrom.clone().invert();\n const deltaMatrix = inverseFromMatrix.clone().multiply(matrixTo);\n const deltaPosition = new Vector3();\n const deltaQuaternion = new Quaternion();\n deltaMatrix.decompose(deltaPosition, deltaQuaternion, new Vector3());\n const delta = getAxisAndAngleFromQuaternion(deltaQuaternion);\n const yAxis = delta.axis;\n if (\n deltaPosition.length() < 0.001 ||\n Math.abs(delta.angleRad) < 0.001 ||\n yAxis.length() < 0.001\n ) {\n return new Matrix4().identity();\n }\n const fromPosition = new Vector3().setFromMatrixPosition(matrixFrom);\n const toPosition = new Vector3().setFromMatrixPosition(matrixTo);\n let zAxis = fromPosition.clone().sub(toPosition);\n const fromToDistance = zAxis.length();\n const xAxis = new Vector3().crossVectors(yAxis, zAxis).normalize();\n zAxis = new Vector3().crossVectors(xAxis, yAxis).normalize();\n let origin = fromPosition.clone().add(toPosition).multiplyScalar(0.5);\n origin = origin.sub(\n xAxis\n .clone()\n .multiplyScalar((fromToDistance * 0.5) / Math.tan(delta.angleRad * 0.5)),\n );\n return new Matrix4().makeBasis(xAxis, yAxis, zAxis).setPosition(origin);\n};\n\nexport const getAxisAndAngleFromQuaternion = (\n quaternion: Quaternion,\n): { axis: Vector3; angleRad: number } => {\n const s = Math.sqrt(1 - quaternion.w * quaternion.w);\n const axis = new Vector3(\n quaternion.x,\n quaternion.y,\n quaternion.z,\n ).multiplyScalar(s === 0 ? 1 : 1 / s);\n const angleRad = 2 * Math.acos(quaternion.w);\n return { axis, angleRad };\n};\n\nexport const setObjectMatrix = (object3d: Object3D, matrix: Matrix4) => {\n object3d.updateMatrix();\n matrix.multiply(object3d.matrix.clone().invert());\n object3d.applyMatrix4(matrix);\n object3d.updateMatrix();\n};\n\nexport const circularInterpolateMatrix = (\n matrixFrom: Matrix4,\n matrixTo: Matrix4,\n t: number,\n): Matrix4 => {\n const fromPosition = new Vector3();\n const fromQuaternion = new Quaternion();\n const fromScale = new Vector3();\n matrixFrom.decompose(fromPosition, fromQuaternion, fromScale);\n const toPosition = new Vector3();\n const toQuaternion = new Quaternion();\n const toScale = new Vector3();\n matrixTo.decompose(toPosition, toQuaternion, toScale);\n let position = new Vector3().lerpVectors(fromPosition, toPosition, t);\n const quaternion = new Quaternion().slerpQuaternions(\n fromQuaternion,\n toQuaternion,\n t,\n );\n const deltaQuaternion = fromQuaternion\n .clone()\n .conjugate()\n .multiply(toQuaternion);\n const deltaRotation = getAxisAndAngleFromQuaternion(deltaQuaternion);\n if (deltaRotation.angleRad > Math.PI) {\n deltaRotation.angleRad -= 2 * Math.PI;\n }\n if (\n Math.abs(deltaRotation.angleRad) > toRadiant(1) &&\n fromPosition.length() > 0.001 &&\n toPosition.length() > 0.001\n ) {\n const dotFromTo = fromPosition\n .clone()\n .normalize()\n .dot(toPosition.clone().normalize());\n if (Math.abs(dotFromTo) < 0.999) {\n const axis = new Vector3().crossVectors(fromPosition, toPosition);\n const positionRotation = new Quaternion().setFromAxisAngle(\n axis.normalize(),\n Math.acos(dotFromTo) * t,\n );\n const originDistance =\n fromPosition.length() * t + toPosition.length() * (1 - t);\n position = fromPosition\n .applyQuaternion(positionRotation)\n .normalize()\n .multiplyScalar(originDistance);\n }\n }\n const scale = new Vector3().lerpVectors(fromScale, toScale, t);\n const matrix = new Matrix4();\n matrix.compose(position, quaternion, scale);\n return matrix;\n};\n\nexport const getColorFromInt = (combinedColor: number): Color => {\n const color = new Color();\n color.setRGB(\n (combinedColor >> 16) / 255,\n ((combinedColor >> 8) & 0xff) / 255,\n ((combinedColor >> 0) & 0xff) / 255,\n );\n return color;\n};\nconst applyFinalMaterialState = (\n material: Material,\n toMaterial: { opacity: number; transparent: boolean },\n) => {\n if (!toMaterial.transparent) {\n material.transparent = toMaterial.transparent;\n delete material.userData.postProcessingMaterialPlugin;\n }\n material.opacity = toMaterial.opacity;\n material.needsUpdate = true;\n};\n\nexport const TRANSPARENCY_ANIMATION_DURATION = 250;\nexport const transitionTransparencyOfMaterial = (\n object: Object3D,\n toMaterial: { opacity: number; transparent: boolean },\n): Promise<void> => {\n return new Promise((resolve) => {\n object.traverse((mesh) => {\n if (mesh instanceof Mesh) {\n const currentMaterial = mesh.material as Material;\n if (mesh.userData.tween) {\n mesh.userData.tween.stop();\n }\n const from = { opacity: currentMaterial.opacity };\n if (toMaterial.transparent) {\n currentMaterial.transparent = toMaterial.transparent;\n }\n const tween = new Tween(from);\n // Override toJSON to prevent the tween from being serialized\n // This can happen if we want to generate a perspective image\n // during a tween is going on. Because for perspective images\n // we copy the objects and therefore three.js serializes them.\n // for more details see:\n // * https://github.com/roomle-dev/web-sdk/pull/876\n // * https://roomle.atlassian.net/browse/RML-11691\n (tween as any).toJSON = (): any => undefined;\n mesh.userData.tween = tween;\n window.TWEEN?.add(\n tween\n .to(toMaterial, TRANSPARENCY_ANIMATION_DURATION)\n .easing(Easing.Linear.None)\n .onUpdate(() => {\n currentMaterial.opacity = from.opacity;\n })\n .onStop(() => {\n applyFinalMaterialState(currentMaterial, toMaterial);\n mesh.userData.tween = undefined;\n })\n .onComplete(() => {\n applyFinalMaterialState(currentMaterial, toMaterial);\n mesh.userData.tween = undefined;\n window.TWEEN?.remove(tween);\n resolve();\n })\n .start(),\n );\n }\n });\n });\n};\n\nexport const fadeIn = (object: Object3D) => {\n object.traverse((mesh) => {\n if (mesh instanceof Mesh) {\n const material = mesh.material as Material;\n if (material.opacity === 0) {\n return;\n }\n const from = { opacity: 0, transparent: true };\n const to = {\n opacity: material.opacity,\n transparent: material.transparent,\n };\n material.transparent = from.transparent;\n material.opacity = from.opacity;\n const tween = new Tween(from)\n .to(to, 500)\n .easing(Easing.Linear.None)\n .onUpdate(() => {\n material.opacity = from.opacity;\n })\n .onComplete(() => {\n material.transparent = to.transparent;\n window.TWEEN?.remove(tween);\n })\n .start();\n window.TWEEN?.add(tween);\n }\n });\n};\n\nexport const checkGLB = (glb: Object3D, url: string): boolean => {\n const boundingBox = new Box3().setFromObject(glb);\n const size = boundingBox.getSize(new Vector3());\n const minSize = Math.min(size.x, size.y, size.z);\n let noError = true;\n if (minSize > 5) {\n console.warn('GLB seems to be too big (' + minSize + ')', url);\n noError = false;\n }\n if (boundingBox.min.y < -0.01) {\n console.warn(\n 'GLB seems to be under the floor (' + boundingBox.min.y + '): ',\n url,\n );\n noError = false;\n }\n return noError;\n};\n\nexport const dispose = (object: Object3D): void => {\n if (object.type === 'Mesh') {\n disposeMesh(object as Mesh);\n } else {\n disposeObject(object);\n }\n};\n\nexport const disposeObject = (object: Object3D): void => {\n if (!object || !object.children || object.children.length === 0) {\n return;\n }\n object.children.forEach((child) => {\n disposeMesh(child as Mesh);\n });\n};\n\nexport const disposeMesh = (mesh: Mesh): void => {\n if (!mesh) {\n return;\n }\n if (mesh.material) {\n disposeMaterial(mesh.material as MeshStandardMaterial);\n }\n if (mesh.geometry) {\n disposeGeometry(mesh.geometry as BufferGeometry);\n }\n if (mesh.children && mesh.children.length > 0) {\n disposeObject(mesh);\n }\n};\n\nexport const disposeGeometry = (geometry: BufferGeometry): void => {\n if (geometry) {\n geometry.dispose();\n }\n};\n\nexport const disposeMaterial = (material: MeshStandardMaterial): void => {\n if (material) {\n // if we add more different maps we have to dispose them separately\n if (material.map) {\n material.map.dispose();\n }\n if (material.normalMap) {\n material.normalMap.dispose();\n }\n material.dispose();\n }\n};\n\nlet boundingBoxMaterial: MeshBasicMaterial;\nexport const getBoundingBoxMaterial = (): MeshBasicMaterial => {\n if (!boundingBoxMaterial) {\n boundingBoxMaterial = new MeshBasicMaterial();\n boundingBoxMaterial.visible = false;\n }\n return boundingBoxMaterial;\n};\n\nlet debugBoundingBoxMaterial: MeshStandardMaterial;\nexport const getDebugBoundingBoxMaterial = (\n colorString?: string,\n): MeshStandardMaterial => {\n if (!debugBoundingBoxMaterial) {\n debugBoundingBoxMaterial = MaterialCreator.createMeshStandardMaterial({\n color: colorString ? colorString : '#FF0000',\n transparent: true,\n opacity: 0.5,\n visible: true,\n polygonOffset: true,\n polygonOffsetFactor: -1,\n });\n }\n return debugBoundingBoxMaterial;\n};\n\nexport const vectorIsZero = (vector: Vector3): boolean => {\n return vector.x === 0 && vector.y === 0 && vector.z === 0;\n};\n\nexport const getMaterialId = (\n material: any,\n type?: KernelEnum,\n): string | null => {\n let materialId = '';\n if (!material && material !== '') {\n return null;\n } else if (material.materialId && material.materialId !== '') {\n materialId = material.materialId;\n } else if (material.catalogItemId && material.catalogItemId !== '') {\n materialId = material.catalogItemId;\n } else if (material.rgbValue > 0) {\n materialId = 'rgb' + JSON.stringify(material.rgbValue);\n } else if ((material as string).length > 0) {\n materialId = material as string;\n } else if (type && type.value === PlanElementType.WALL) {\n materialId = 'default_wall_material_' + material.getSourceType().value;\n } else if (type && type.value === PlanElementType.CEILING) {\n materialId = 'default_ceiling_material_' + material.getSourceType().value;\n }\n return materialId;\n};\n\nexport const vectorIsEqual = (\n vector1: Vector3,\n vector2: Vector3,\n tolerance: number = 0.01,\n): boolean => {\n if (!vector1 || !vector2) {\n return false;\n }\n return (\n Math.abs(vector1.x - vector2.x) <= tolerance &&\n Math.abs(vector1.y - vector2.y) <= tolerance &&\n Math.abs(vector1.z - vector2.z) <= tolerance\n );\n};\n\nexport const getYRotationOfObject = (object: Object3D): number => {\n let objectDirection = object.getWorldDirection(new Vector3()).clone();\n objectDirection.y = 0;\n if (objectDirection.lengthSq() < 0.01) {\n objectDirection = new Vector3(0, 1, 0);\n objectDirection.applyQuaternion(object.quaternion);\n objectDirection.y = 0;\n }\n objectDirection.normalize();\n let angle = Math.asin(objectDirection.x);\n if (objectDirection.z < 0) {\n angle = Math.PI - angle;\n }\n // clamp to a value between 0 and 2 PI\n if (angle < 0) {\n angle += Math.PI * 2;\n }\n return angle;\n};\n\n/**\n * comparator function to compare two bounding boxes if they are within the other\n * @param box1\n * @param box2\n */\nexport const compareBox3Size = (box1: Box3, box2: Box3): number => {\n if (!box1 || !box2) {\n return 0;\n }\n\n const box1ContainsBox2 = box1.clone().expandByScalar(0.001).containsBox(box2);\n const box2ContainsBox1 = box2.clone().expandByScalar(0.001).containsBox(box1);\n if (\n (box2ContainsBox1 && box1ContainsBox2) ||\n (!box2ContainsBox1 && !box1ContainsBox2)\n ) {\n return 0;\n }\n return box1ContainsBox2 === true ? 1 : -1;\n};\n\n/**\n * Comparator function for three-dimensional bounding boxes.\n * Returns 1 if box1 contains box2, -1 if box2 contains box1, and for non-containing boxes, returns -1 if overlap exceeds 50% of box1's volume, otherwise 1.\n * Used for raycaster selection\n * @param box1\n * @param box2\n */\nexport const getBoxSelectionOrder = (box1: Box3, box2: Box3): number => {\n if (!box1 || !box2) {\n return 0;\n }\n\n const box1ContainsBox2 = box1.clone().expandByScalar(0.001).containsBox(box2);\n const box2ContainsBox1 = box2.clone().expandByScalar(0.001).containsBox(box1);\n if (box2ContainsBox1 && box1ContainsBox2) {\n return 0;\n } else if (!box2ContainsBox1 && !box1ContainsBox2) {\n const percentage = getOverlapPercentage(box1, box2);\n if (percentage === 0.5) {\n return 0;\n }\n return percentage > 0.5 ? -1 : 1;\n }\n return box1ContainsBox2 === true ? 1 : -1;\n};\n\nconst getOverlapPercentage = (box1: Box3, box2: Box3): number => {\n const intersection = new Box3();\n intersection.copy(box1).intersect(box2);\n\n if (intersection.isEmpty()) {\n return 0;\n }\n\n const getVolume = (b: Box3) => {\n const size = new Vector3();\n b.getSize(size);\n return size.x * size.y * size.z;\n };\n\n const boxVolume = getVolume(box1);\n const intersectionVolume = getVolume(intersection);\n\n if (boxVolume === 0) {\n return 0;\n }\n\n // Return the ratio (0.0 to 1.0)\n return intersectionVolume / boxVolume;\n};\n\nexport const isUVIdentityMatrix = (uvTransform: Float32Array): boolean => {\n return (\n uvTransform[0] === 1 &&\n uvTransform[1] === 0 &&\n uvTransform[2] === 0 &&\n uvTransform[3] === 1 &&\n uvTransform[4] === 0 &&\n uvTransform[5] === 0\n );\n};\n\nexport const getDrawingMinBounds = (\n planBounds: Box3,\n width: number,\n height: number,\n marginMultiplier: number = 1,\n): Box3 => {\n const landscape = width > height;\n\n const x = landscape ? 15 : 0;\n const z = landscape ? 0 : 10;\n\n const currentSize = planBounds.getSize(new Vector3());\n const currentCenter = planBounds.getCenter(new Vector3());\n\n let newX = currentSize.x > 2 * x ? currentSize.x / 2 : x;\n let newZ = currentSize.z > 2 * z ? currentSize.z / 2 : z;\n\n // add a margin of 10%\n newX *= marginMultiplier;\n newZ *= marginMultiplier;\n\n return new Box3(\n new Vector3(\n currentCenter.x - newX,\n currentCenter.y,\n currentCenter.z - newZ,\n ),\n new Vector3(\n currentCenter.x + newX,\n currentCenter.y,\n currentCenter.z + newZ,\n ),\n );\n};\n\nexport const threeVectorToTransferableXY = (\n vec: Vector2 | Vector3,\n): Position2 => {\n const { x, y } = vec;\n return { x, y };\n};\n\nexport const threeVectorToTransferableXYZ = (vec: Vector3): Position3 => {\n const { x, y, z } = vec;\n return { x, y, z };\n};\n\nexport const getActiveLayers = (layers: Layers) => {\n const names = [\n 'DEFAULT',\n 'LIGHTING',\n 'BACKGROUND',\n 'OBJECT',\n 'COMPONENT',\n 'PREVIEW',\n 'UI',\n 'GIZMO',\n 'DIMENSIONS',\n 'CONSTRUCTION',\n ];\n const active: string[] = [];\n for (let i = 0, length = names.length; i < length; i++) {\n const layer = new Layers();\n layer.disableAll();\n layer.enable(i);\n if (layers.test(layer)) {\n active.push(names[i]);\n }\n }\n return active;\n};\n\nexport const viewSpacePositionFromUV = (\n distance: number,\n u: number,\n v: number,\n): Vector3 => {\n return new Vector3().setFromSphericalCoords(\n distance,\n Math.PI * (1 - v),\n Math.PI * 2 * (1 - u),\n );\n};\n\nexport const createEmptySceneFromCurrent = (currentScene: Scene) => {\n const scene = new Scene();\n if (currentScene.environment) {\n scene.environment = currentScene.environment.clone();\n }\n if (currentScene.userData.environmentDefinition) {\n scene.userData.environmentDefinition =\n currentScene.userData.environmentDefinition.clone();\n }\n scene.userData.shadowFromEnvironment =\n currentScene.userData.shadowFromEnvironment;\n return scene;\n};\n\nexport const isBox3InFrustum = (camera: Camera, box3: Box3): boolean => {\n const frustum = new Frustum();\n const matrix = new Matrix4().multiplyMatrices(\n camera.projectionMatrix,\n camera.matrixWorldInverse,\n );\n frustum.setFromProjectionMatrix(matrix);\n const position = box3.getCenter(new Vector3());\n return frustum.containsPoint(position);\n};\n\nexport type RoomleEventedMesh = Mesh<\n // not so nice that I have to specify the first to generics\n // but TS supports it only this way, for more details see:\n // https://github.com/microsoft/TypeScript/issues/26242\n BufferGeometry<NormalBufferAttributes>,\n Material | Material[],\n Object3DRoomleEventMap\n>;\n\nexport type RoomleEventedObject3D = Object3D<Object3DRoomleEventMap>;\n\nexport interface RoomleEventedObject3DSubComponent\n extends RoomleEventedObject3D {\n parentComponent?: RoomleEventedObject3D;\n}\n\nexport type RoomleEventedIntersection = Intersection<RoomleEventedObject3D>;\n\ninterface InputEventAttatchment {\n intersection: RoomleEventedIntersection;\n type: INPUT_EVENT_TYPE;\n}\nexport interface Object3DRoomleEventMap extends Object3DEventMap {\n [OBJECT_EVENT.CLICK]: {\n attachment: InputEventAttatchment;\n };\n [OBJECT_EVENT.DOUBLE_CLICK]: { attachment: InputEventAttatchment };\n [OBJECT_EVENT.DRAG]: { attachment: { position: Vector3 } };\n [OBJECT_EVENT.DRAG_END]: { attachment: { position: Position2 } };\n [OBJECT_EVENT.DRAG_START]: object;\n [OBJECT_EVENT.HOVER_MOVE]: { attachment: InputEventAttatchment };\n [OBJECT_EVENT.HOVER_OFF]: { attachment: { type: INPUT_EVENT_TYPE } };\n [OBJECT_EVENT.HOVER_ON]: { attachment: InputEventAttatchment };\n [OBJECT_EVENT.ROTATE]: { attachment: { rotation: number } };\n}\n\n/**\n * normalize the angle between -PI and PI\n */\nexport const normalizeRotation = (angleInRad: number): number => {\n return Math.atan2(Math.sin(angleInRad), Math.cos(angleInRad));\n};\n\nexport const patchLighting = (shaderChunk: typeof ShaderChunk) => {\n // Based on https://github.com/DolphinIQ/threejs-point-lights-optimization/blob/main/files/js/Main.js#L118\n\n shaderChunk.lights_fragment_begin = `\n vec3 geometryPosition = - vViewPosition;\n vec3 geometryNormal = normal;\n vec3 geometryViewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );\n vec3 geometryClearcoatNormal = vec3( 0.0 );\n #ifdef USE_CLEARCOAT\n geometryClearcoatNormal = clearcoatNormal;\n #endif\n\n // OPTIMIZATION: Early exit for transparent/invisible materials\n #ifdef USE_ALPHATEST\n if ( diffuseColor.a < alphaTest ) discard;\n #endif\n\n // OPTIMIZATION: Cache expensive calculations\n float NdotV = saturate( dot( geometryNormal, geometryViewDir ) );\n\n #ifdef USE_IRIDESCENCE\n float dotNVi = NdotV; // Reuse calculated value\n if ( material.iridescenceThickness == 0.0 ) {\n material.iridescence = 0.0;\n } else {\n material.iridescence = saturate( material.iridescence );\n }\n // OPTIMIZATION: Skip iridescence calculations if effect is minimal\n if ( material.iridescence > 0.01 ) {\n material.iridescenceFresnel = evalIridescence( 1.0, material.iridescenceIOR, dotNVi, material.iridescenceThickness, material.specularColor );\n material.iridescenceF0 = Schlick_to_F0( material.iridescenceFresnel, 1.0, dotNVi );\n }\n #endif\n\n IncidentLight directLight;\n\n // OPTIMIZATION: Early exit if material has no metalness or roughness variation\n #ifdef USE_ROUGHNESSMAP\n bool hasRoughnessVariation = true;\n #else\n bool hasRoughnessVariation = false;\n #endif\n\n #ifdef USE_METALNESSMAP\n bool hasMetalnessVariation = true;\n #else\n bool hasMetalnessVariation = false;\n #endif\n\n #if ( NUM_POINT_LIGHTS > 0 ) && defined( RE_Direct )\n PointLight pointLight;\n #if defined( USE_SHADOWMAP ) && NUM_POINT_LIGHT_SHADOWS > 0\n PointLightShadow pointLightShadow;\n #endif\n #pragma unroll_loop_start\n for ( int i = 0; i < NUM_POINT_LIGHTS; i ++ ) {\n pointLight = pointLights[ i ];\n getPointLightInfo( pointLight, geometryPosition, directLight );\n\n // OPTIMIZATION: Enhanced visibility and distance checks\n #if defined( RE_Direct )\n if ( directLight.visible ) {\n // OPTIMIZATION: Skip lights with negligible contribution based on color intensity\n float lightIntensity = dot( directLight.color, vec3( 0.299, 0.587, 0.114 ) );\n if ( lightIntensity > 0.001 ) {\n #if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_POINT_LIGHT_SHADOWS )\n pointLightShadow = pointLightShadows[ i ];\n directLight.color *= ( directLight.visible && receiveShadow ) ? getPointShadow( pointShadowMap[ i ], pointLightShadow.shadowMapSize, pointLightShadow.shadowIntensity, pointLightShadow.shadowBias, pointLightShadow.shadowRadius, vPointShadowCoord[ i ], pointLightShadow.shadowCameraNear, pointLightShadow.shadowCameraFar ) : 1.0;\n #endif\n RE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n }\n }\n #endif\n }\n #pragma unroll_loop_end\n #endif\n\n #if ( NUM_SPOT_LIGHTS > 0 ) && defined( RE_Direct )\n SpotLight spotLight;\n vec4 spotColor;\n vec3 spotLightCoord;\n bool inSpotLightMap;\n #if defined( USE_SHADOWMAP ) && NUM_SPOT_LIGHT_SHADOWS > 0\n SpotLightShadow spotLightShadow;\n #endif\n #pragma unroll_loop_start\n for ( int i = 0; i < NUM_SPOT_LIGHTS; i ++ ) {\n spotLight = spotLights[ i ];\n getSpotLightInfo( spotLight, geometryPosition, directLight );\n\n // OPTIMIZATION: Enhanced visibility checks for spot lights\n #if defined( RE_Direct )\n if ( directLight.visible ) {\n // OPTIMIZATION: Skip spot light map calculation if light contribution is minimal\n float lightIntensity = dot( directLight.color, vec3( 0.299, 0.587, 0.114 ) );\n if ( lightIntensity > 0.001 ) {\n #if ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\n #define SPOT_LIGHT_MAP_INDEX UNROLLED_LOOP_INDEX\n #elif ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n #define SPOT_LIGHT_MAP_INDEX NUM_SPOT_LIGHT_MAPS\n #else\n #define SPOT_LIGHT_MAP_INDEX ( UNROLLED_LOOP_INDEX - NUM_SPOT_LIGHT_SHADOWS + NUM_SPOT_LIGHT_SHADOWS_WITH_MAPS )\n #endif\n #if ( SPOT_LIGHT_MAP_INDEX < NUM_SPOT_LIGHT_MAPS )\n spotLightCoord = vSpotLightCoord[ i ].xyz / vSpotLightCoord[ i ].w;\n inSpotLightMap = all( lessThan( abs( spotLightCoord * 2. - 1. ), vec3( 1.0 ) ) );\n if ( inSpotLightMap ) {\n spotColor = texture2D( spotLightMap[ SPOT_LIGHT_MAP_INDEX ], spotLightCoord.xy );\n directLight.color = directLight.color * spotColor.rgb;\n }\n #endif\n #undef SPOT_LIGHT_MAP_INDEX\n #if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_SPOT_LIGHT_SHADOWS )\n spotLightShadow = spotLightShadows[ i ];\n directLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( spotShadowMap[ i ], spotLightShadow.shadowMapSize, spotLightShadow.shadowIntensity, spotLightShadow.shadowBias, spotLightShadow.shadowRadius, vSpotLightCoord[ i ] ) : 1.0;\n #endif\n RE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n }\n }\n #endif\n }\n #pragma unroll_loop_end\n #endif\n\n #if ( NUM_DIR_LIGHTS > 0 ) && defined( RE_Direct )\n DirectionalLight directionalLight;\n #if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\n DirectionalLightShadow directionalLightShadow;\n #endif\n #pragma unroll_loop_start\n for ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n directionalLight = directionalLights[ i ];\n getDirectionalLightInfo( directionalLight, directLight );\n\n // OPTIMIZATION: Skip very dim directional lights\n #if defined( RE_Direct )\n float lightIntensity = dot( directLight.color, vec3( 0.299, 0.587, 0.114 ) );\n if ( directLight.visible && lightIntensity > 0.001 ) {\n #if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\n directionalLightShadow = directionalLightShadows[ i ];\n directLight.color *= ( directLight.visible && receiveShadow ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowIntensity, directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n #endif\n RE_Direct( directLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n }\n #endif\n }\n #pragma unroll_loop_end\n #endif\n\n #if ( NUM_RECT_AREA_LIGHTS > 0 ) && defined( RE_Direct_RectArea )\n RectAreaLight rectAreaLight;\n #pragma unroll_loop_start\n for ( int i = 0; i < NUM_RECT_AREA_LIGHTS; i ++ ) {\n rectAreaLight = rectAreaLights[ i ];\n // OPTIMIZATION: Simple rect area light processing - Three.js handles distance internally\n RE_Direct_RectArea( rectAreaLight, geometryPosition, geometryNormal, geometryViewDir, geometryClearcoatNormal, material, reflectedLight );\n }\n #pragma unroll_loop_end\n #endif\n\n // OPTIMIZATION: Streamlined indirect lighting with early exits\n #if defined( RE_IndirectDiffuse )\n vec3 iblIrradiance = vec3( 0.0 );\n vec3 irradiance = getAmbientLightIrradiance( ambientLightColor );\n\n // OPTIMIZATION: Skip light probe calculation if ambient is sufficient\n float ambientIntensity = dot( irradiance, vec3( 0.299, 0.587, 0.114 ) );\n\n #if defined( USE_LIGHT_PROBES )\n if ( ambientIntensity < 0.9 ) {\n irradiance += getLightProbeIrradiance( lightProbe, geometryNormal );\n }\n #endif\n\n #if ( NUM_HEMI_LIGHTS > 0 )\n if ( ambientIntensity < 0.9 ) {\n #pragma unroll_loop_start\n for ( int i = 0; i < NUM_HEMI_LIGHTS; i ++ ) {\n vec3 hemiContribution = getHemisphereLightIrradiance( hemisphereLights[ i ], geometryNormal );\n // OPTIMIZATION: Skip negligible hemisphere light contributions\n if ( dot( hemiContribution, vec3( 0.299, 0.587, 0.114 ) ) > 0.001 ) {\n irradiance += hemiContribution;\n }\n }\n #pragma unroll_loop_end\n }\n #endif\n #endif\n\n #if defined( RE_IndirectSpecular )\n vec3 radiance = vec3( 0.0 );\n vec3 clearcoatRadiance = vec3( 0.0 );\n #endif`;\n\n shaderChunk.lights_pars_begin = shaderChunk.lights_pars_begin.replace(\n `light.color = pointLight.color;`,\n `\n\t\tlight.color = pointLight.color * step( lightDistance, pointLight.distance );\n\t\t`,\n );\n};\n"],"x_google_ignoreList":[4],"mappings":"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"}