@roomle/web-sdk 2.62.0-alpha.3 → 2.62.0-alpha.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/{banana-for-scale-ae26de56.js → banana-for-scale-c4a33098.js} +2 -2
- package/lib/{banana-for-scale-ae26de56.js.map → banana-for-scale-c4a33098.js.map} +1 -1
- package/lib/{banana-for-scale-0dce6d9d.nomodule.js → banana-for-scale-d2707d3a.nomodule.js} +2 -2
- package/lib/{banana-for-scale-0dce6d9d.nomodule.js.map → banana-for-scale-d2707d3a.nomodule.js.map} +1 -1
- package/lib/{component-dimensioning-2cec6820.nomodule.js → component-dimensioning-1319be8f.nomodule.js} +2 -2
- package/lib/component-dimensioning-1319be8f.nomodule.js.map +1 -0
- package/lib/{component-dimensioning-3648c91c.js → component-dimensioning-389dc894.js} +2 -2
- package/lib/component-dimensioning-389dc894.js.map +1 -0
- package/lib/{component-raycast-helper-3f912814.nomodule.js → component-raycast-helper-4a0456c1.nomodule.js} +2 -2
- package/lib/component-raycast-helper-4a0456c1.nomodule.js.map +1 -0
- package/lib/{component-raycast-helper-daa3e64c.js → component-raycast-helper-e2956b00.js} +2 -2
- package/lib/component-raycast-helper-e2956b00.js.map +1 -0
- package/lib/{configurator-4abfb5d9.js → configurator-a432160a.js} +2 -2
- package/lib/configurator-a432160a.js.map +1 -0
- package/lib/{configurator-b056dc92.nomodule.js → configurator-f6c18b4f.nomodule.js} +2 -2
- package/lib/configurator-f6c18b4f.nomodule.js.map +1 -0
- package/lib/configurator-main-7d317938.js +2 -0
- package/lib/configurator-main-7d317938.js.map +1 -0
- package/lib/configurator-main.nomodule.js +1 -1
- package/lib/{continuous-drawing-helper-5e5cdf1d.nomodule.js → continuous-drawing-helper-07739909.nomodule.js} +2 -2
- package/lib/continuous-drawing-helper-07739909.nomodule.js.map +1 -0
- package/lib/{continuous-drawing-helper-f0d67a67.js → continuous-drawing-helper-2dc3cb40.js} +2 -2
- package/lib/continuous-drawing-helper-2dc3cb40.js.map +1 -0
- package/lib/{default-light-setting-1bc01b3d.js → default-light-setting-0e777c93.js} +2 -2
- package/lib/default-light-setting-0e777c93.js.map +1 -0
- package/lib/{default-light-setting-af06b285.nomodule.js → default-light-setting-e6f7b96c.nomodule.js} +2 -2
- package/lib/default-light-setting-e6f7b96c.nomodule.js.map +1 -0
- package/lib/definitions/common-core/src/utils/init-data.d.ts +1 -0
- package/lib/definitions/common-core/src/utils/shims.d.ts +4 -0
- package/lib/definitions/common-core/src/webgl/image-renderer.d.ts +1 -1
- package/lib/definitions/configurator-core/src/webgl/configurator-scene-event-handler.d.ts +2 -0
- package/lib/definitions/configurator-core/src/webgl/configurator-scene-manager.d.ts +1 -0
- package/lib/{dimensioning-helper-2e4afa2a.js → dimensioning-helper-9b64c1d3.js} +2 -2
- package/lib/{dimensioning-helper-2e4afa2a.js.map → dimensioning-helper-9b64c1d3.js.map} +1 -1
- package/lib/{dimensioning-helper-c5a31177.nomodule.js → dimensioning-helper-fe23dfaf.nomodule.js} +2 -2
- package/lib/{dimensioning-helper-c5a31177.nomodule.js.map → dimensioning-helper-fe23dfaf.nomodule.js.map} +1 -1
- package/lib/{glb-viewer-55584b69.js → glb-viewer-9a11a5b0.js} +2 -2
- package/lib/{glb-viewer-55584b69.js.map → glb-viewer-9a11a5b0.js.map} +1 -1
- package/lib/{glb-viewer-c7a1793b.nomodule.js → glb-viewer-cec299f7.nomodule.js} +2 -2
- package/lib/{glb-viewer-c7a1793b.nomodule.js.map → glb-viewer-cec299f7.nomodule.js.map} +1 -1
- package/lib/glb-viewer-main-235aab0c.js +2 -0
- package/lib/glb-viewer-main-235aab0c.js.map +1 -0
- package/lib/glb-viewer-main.nomodule.js +1 -1
- package/lib/legacy/{banana-for-scale-14d3a6f4.legacy.js → banana-for-scale-88d8581a.legacy.js} +2 -2
- package/lib/legacy/{banana-for-scale-14d3a6f4.legacy.js.map → banana-for-scale-88d8581a.legacy.js.map} +1 -1
- package/lib/legacy/{component-dimensioning-18554c9d.legacy.js → component-dimensioning-a79959a0.legacy.js} +2 -2
- package/lib/legacy/component-dimensioning-a79959a0.legacy.js.map +1 -0
- package/lib/legacy/{component-raycast-helper-3586c5bc.legacy.js → component-raycast-helper-26dd569c.legacy.js} +2 -2
- package/lib/legacy/component-raycast-helper-26dd569c.legacy.js.map +1 -0
- package/lib/legacy/{configurator-3d44a51b.legacy.js → configurator-ae13408f.legacy.js} +2 -2
- package/lib/legacy/configurator-ae13408f.legacy.js.map +1 -0
- package/lib/legacy/configurator-main.legacy.js +1 -1
- package/lib/legacy/{continuous-drawing-helper-06edaa11.legacy.js → continuous-drawing-helper-c7da1629.legacy.js} +2 -2
- package/lib/legacy/continuous-drawing-helper-c7da1629.legacy.js.map +1 -0
- package/lib/legacy/{default-light-setting-8133dce8.legacy.js → default-light-setting-6d0f5156.legacy.js} +2 -2
- package/lib/legacy/default-light-setting-6d0f5156.legacy.js.map +1 -0
- package/lib/legacy/{dimensioning-helper-a2c975ec.legacy.js → dimensioning-helper-de3fe813.legacy.js} +2 -2
- package/lib/legacy/{dimensioning-helper-a2c975ec.legacy.js.map → dimensioning-helper-de3fe813.legacy.js.map} +1 -1
- package/lib/legacy/{glb-viewer-84ab52d9.legacy.js → glb-viewer-5f648a61.legacy.js} +2 -2
- package/lib/legacy/{glb-viewer-84ab52d9.legacy.js.map → glb-viewer-5f648a61.legacy.js.map} +1 -1
- package/lib/legacy/glb-viewer-main.legacy.js +1 -1
- package/lib/legacy/{material-viewer-8b33658e.legacy.js → material-viewer-15308efe.legacy.js} +2 -2
- package/lib/legacy/material-viewer-15308efe.legacy.js.map +1 -0
- package/lib/legacy/material-viewer-main.legacy.js +1 -1
- package/lib/legacy/{planner-6bd1d973.legacy.js → planner-fcae1334.legacy.js} +2 -2
- package/lib/legacy/{planner-6bd1d973.legacy.js.map → planner-fcae1334.legacy.js.map} +1 -1
- package/lib/legacy/planner-main.legacy.js +1 -1
- package/lib/legacy/roomle-configurator-788f21c9.legacy.js +2 -0
- package/lib/legacy/roomle-configurator-788f21c9.legacy.js.map +1 -0
- package/lib/legacy/{roomle-dependency-injection-288cb79b.legacy.js → roomle-dependency-injection-5ba725ab.legacy.js} +3 -3
- package/lib/legacy/{roomle-dependency-injection-288cb79b.legacy.js.map → roomle-dependency-injection-5ba725ab.legacy.js.map} +1 -1
- package/lib/legacy/roomle-sdk.legacy.js +1 -1
- package/lib/legacy/{scene-manager-1c3e399b.legacy.js → scene-manager-867bbd63.legacy.js} +2 -2
- package/lib/legacy/{scene-manager-1c3e399b.legacy.js.map → scene-manager-867bbd63.legacy.js.map} +1 -1
- package/lib/legacy/{script-loader-6f8ede0e.legacy.js → script-loader-1137a1f3.legacy.js} +2 -2
- package/lib/legacy/script-loader-1137a1f3.legacy.js.map +1 -0
- package/lib/legacy/{stats-helper-53c97cd7.legacy.js → stats-helper-c7d64341.legacy.js} +2 -2
- package/lib/legacy/stats-helper-c7d64341.legacy.js.map +1 -0
- package/lib/legacy/{tools-core-e0004184.legacy.js → tools-core-12dafc66.legacy.js} +2 -2
- package/lib/legacy/tools-core-12dafc66.legacy.js.map +1 -0
- package/lib/{material-viewer-cbdd689a.js → material-viewer-34d3e0e5.js} +2 -2
- package/lib/material-viewer-34d3e0e5.js.map +1 -0
- package/lib/{material-viewer-02425270.nomodule.js → material-viewer-72f2d5db.nomodule.js} +2 -2
- package/lib/material-viewer-72f2d5db.nomodule.js.map +1 -0
- package/lib/material-viewer-main-98214c56.js +2 -0
- package/lib/material-viewer-main-98214c56.js.map +1 -0
- package/lib/material-viewer-main.nomodule.js +1 -1
- package/lib/{planner-1493b954.js → planner-d0144c2d.js} +2 -2
- package/lib/{planner-1493b954.js.map → planner-d0144c2d.js.map} +1 -1
- package/lib/{planner-13087ddc.nomodule.js → planner-e9de8f30.nomodule.js} +2 -2
- package/lib/{planner-13087ddc.nomodule.js.map → planner-e9de8f30.nomodule.js.map} +1 -1
- package/lib/planner-main-da9a2058.js +2 -0
- package/lib/planner-main-da9a2058.js.map +1 -0
- package/lib/planner-main.nomodule.js +1 -1
- package/lib/roomle-configurator-2fe2645f.nomodule.js +2 -0
- package/lib/roomle-configurator-2fe2645f.nomodule.js.map +1 -0
- package/lib/roomle-configurator-e440c1ed.js +2 -0
- package/lib/roomle-configurator-e440c1ed.js.map +1 -0
- package/lib/{roomle-dependency-injection-b38984ab.js → roomle-dependency-injection-a6b6e5b9.js} +3 -3
- package/lib/{roomle-dependency-injection-b38984ab.js.map → roomle-dependency-injection-a6b6e5b9.js.map} +1 -1
- package/lib/{roomle-dependency-injection-fd98553c.nomodule.js → roomle-dependency-injection-e730f5db.nomodule.js} +3 -3
- package/lib/{roomle-dependency-injection-fd98553c.nomodule.js.map → roomle-dependency-injection-e730f5db.nomodule.js.map} +1 -1
- package/lib/{roomle-sdk-affd2371.js → roomle-sdk-745bb5ed.js} +2 -2
- package/lib/roomle-sdk-745bb5ed.js.map +1 -0
- package/lib/roomle-sdk.nomodule.js +1 -1
- package/lib/{scene-manager-eca85c5f.nomodule.js → scene-manager-8263aabe.nomodule.js} +2 -2
- package/lib/{scene-manager-eca85c5f.nomodule.js.map → scene-manager-8263aabe.nomodule.js.map} +1 -1
- package/lib/{scene-manager-d05d913f.js → scene-manager-d62ae8cb.js} +2 -2
- package/lib/{scene-manager-d05d913f.js.map → scene-manager-d62ae8cb.js.map} +1 -1
- package/lib/{script-loader-c9998e7d.js → script-loader-91c2a731.js} +2 -2
- package/lib/script-loader-91c2a731.js.map +1 -0
- package/lib/{script-loader-c2540074.nomodule.js → script-loader-d6f3f6fd.nomodule.js} +2 -2
- package/lib/script-loader-d6f3f6fd.nomodule.js.map +1 -0
- package/lib/{stats-helper-e3861bb5.nomodule.js → stats-helper-517ef448.nomodule.js} +2 -2
- package/lib/stats-helper-517ef448.nomodule.js.map +1 -0
- package/lib/{stats-helper-527570de.js → stats-helper-f6f1b022.js} +2 -2
- package/lib/stats-helper-f6f1b022.js.map +1 -0
- package/lib/{tools-core-cca96eac.nomodule.js → tools-core-53ba3292.nomodule.js} +2 -2
- package/lib/tools-core-53ba3292.nomodule.js.map +1 -0
- package/lib/{tools-core-9270b413.js → tools-core-c87dbec3.js} +2 -2
- package/lib/tools-core-c87dbec3.js.map +1 -0
- package/package.json +2 -2
- package/lib/component-dimensioning-2cec6820.nomodule.js.map +0 -1
- package/lib/component-dimensioning-3648c91c.js.map +0 -1
- package/lib/component-raycast-helper-3f912814.nomodule.js.map +0 -1
- package/lib/component-raycast-helper-daa3e64c.js.map +0 -1
- package/lib/configurator-4abfb5d9.js.map +0 -1
- package/lib/configurator-b056dc92.nomodule.js.map +0 -1
- package/lib/configurator-main-e8f20868.js +0 -2
- package/lib/configurator-main-e8f20868.js.map +0 -1
- package/lib/continuous-drawing-helper-5e5cdf1d.nomodule.js.map +0 -1
- package/lib/continuous-drawing-helper-f0d67a67.js.map +0 -1
- package/lib/default-light-setting-1bc01b3d.js.map +0 -1
- package/lib/default-light-setting-af06b285.nomodule.js.map +0 -1
- package/lib/glb-viewer-main-68f332ce.js +0 -2
- package/lib/glb-viewer-main-68f332ce.js.map +0 -1
- package/lib/legacy/component-dimensioning-18554c9d.legacy.js.map +0 -1
- package/lib/legacy/component-raycast-helper-3586c5bc.legacy.js.map +0 -1
- package/lib/legacy/configurator-3d44a51b.legacy.js.map +0 -1
- package/lib/legacy/continuous-drawing-helper-06edaa11.legacy.js.map +0 -1
- package/lib/legacy/default-light-setting-8133dce8.legacy.js.map +0 -1
- package/lib/legacy/material-viewer-8b33658e.legacy.js.map +0 -1
- package/lib/legacy/roomle-configurator-60cdb883.legacy.js +0 -2
- package/lib/legacy/roomle-configurator-60cdb883.legacy.js.map +0 -1
- package/lib/legacy/script-loader-6f8ede0e.legacy.js.map +0 -1
- package/lib/legacy/stats-helper-53c97cd7.legacy.js.map +0 -1
- package/lib/legacy/tools-core-e0004184.legacy.js.map +0 -1
- package/lib/material-viewer-02425270.nomodule.js.map +0 -1
- package/lib/material-viewer-cbdd689a.js.map +0 -1
- package/lib/material-viewer-main-0c143e81.js +0 -2
- package/lib/material-viewer-main-0c143e81.js.map +0 -1
- package/lib/planner-main-3a373dc9.js +0 -2
- package/lib/planner-main-3a373dc9.js.map +0 -1
- package/lib/roomle-configurator-178b14f1.nomodule.js +0 -2
- package/lib/roomle-configurator-178b14f1.nomodule.js.map +0 -1
- package/lib/roomle-configurator-8ab35a0a.js +0 -2
- package/lib/roomle-configurator-8ab35a0a.js.map +0 -1
- package/lib/roomle-sdk-affd2371.js.map +0 -1
- package/lib/script-loader-c2540074.nomodule.js.map +0 -1
- package/lib/script-loader-c9998e7d.js.map +0 -1
- package/lib/stats-helper-527570de.js.map +0 -1
- package/lib/stats-helper-e3861bb5.nomodule.js.map +0 -1
- package/lib/tools-core-9270b413.js.map +0 -1
- package/lib/tools-core-cca96eac.nomodule.js.map +0 -1
package/lib/{roomle-dependency-injection-b38984ab.js → roomle-dependency-injection-a6b6e5b9.js}
RENAMED
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
import{g as getAssetPath,A as AmbientLight,D as DirectionalLight,V as Vector2,a as Vector3,R as RectAreaLight,S as SpotLight,C as Color$1,M as MainThreadToWorker,B as BufferGeometry,b as BufferAttribute,T as TrianglesDrawMode,c as TriangleFanDrawMode,d as TriangleStripDrawMode,L as Loader,e as LoaderUtils,F as FileLoader,P as PointLight,f as MeshBasicMaterial,h as SRGBColorSpace,i as MeshPhysicalMaterial,j as Matrix4,Q as Quaternion,I as InstancedMesh,O as Object3D,k as TextureLoader,l as ImageBitmapLoader,m as InterleavedBuffer,n as LinearFilter,o as LinearMipmapLinearFilter,p as RepeatWrapping,q as PointsMaterial,r as Material,s as LineBasicMaterial,t as MeshStandardMaterial,u as DoubleSide,v as PropertyBinding,w as SkinnedMesh,x as Mesh,y as LineSegments,z as Line,E as LineLoop,G as Points,H as Group,J as PerspectiveCamera,K as MathUtils,N as OrthographicCamera,U as Skeleton,W as AnimationClip,X as Bone,Y as InterpolateLinear,Z as NearestFilter,_ as NearestMipmapNearestFilter,$ as LinearMipmapNearestFilter,a0 as NearestMipmapLinearFilter,a1 as ClampToEdgeWrapping,a2 as MirroredRepeatWrapping,a3 as InterpolateDiscrete,a4 as FrontSide,a5 as InterleavedBufferAttribute,a6 as Texture,a7 as VectorKeyframeTrack,a8 as NumberKeyframeTrack,a9 as QuaternionKeyframeTrack,aa as Box3,ab as Sphere,ac as Interpolant,ad as LinearSRGBColorSpace,ae as Euler,af as CubeTexture,ag as RGBAFormat,ah as DataTexture,ai as getValue,aj as ROOMLE_COLORS,ak as ROOMLE_HIGHLIGHTNG,al as deepMerge,am as setWriteable,an as setDescriptor,ao as Uint32BufferAttribute,ap as Float32BufferAttribute,aq as createBenchmarkMaterial,ar as createBenchmarkTexture,as as ShapePath,at as removeItem,au as BoxGeometry,av as getGlbUrl,aw as transformRange,ax as wait,ay as objectArrayToMap,az as roundWithPrecision,aA as uuid,aB as handleJsonResponse,aC as setCursor,aD as EdgesGeometry,aE as LineDashedMaterial,aF as ArrowHelper,aG as CylinderGeometry,aH as Line3,aI as SphereGeometry,aJ as RingGeometry,aK as isString,aL as DataTextureLoader,aM as HalfFloatType,aN as FloatType,aO as RedFormat,aP as NoColorSpace,aQ as DataUtils,aR as EquirectangularReflectionMapping,aS as Vector4,aT as Matrix3,aU as ShaderMaterial,aV as DstColorFactor,aW as ZeroFactor,aX as AddEquation,aY as DstAlphaFactor,aZ as UniformsUtils,a_ as NoBlending,a$ as Scene,b0 as MeshNormalMaterial,b1 as WebGLRenderTarget,b2 as DepthTexture,b3 as DepthStencilFormat,b4 as UnsignedInt248Type,b5 as PlaneGeometry,b6 as CameraHelper,b7 as MeshDepthMaterial,b8 as RGBADepthPacking,b9 as AdditiveBlending,ba as BackSide,bb as PCFShadowMap,bc as BasicShadowMap,bd as PCFSoftShadowMap,be as VSMShadowMap,bf as ShadowMaterial,bg as MeshPhongMaterial,bh as MeshLambertMaterial,bi as BasicDepthPacking,bj as Camera,bk as CustomBlending,bl as MinEquation,bm as OneFactor,bn as RGFormat,bo as NoToneMapping,bp as LinearToneMapping,bq as ReinhardToneMapping,br as CineonToneMapping,bs as ACESFilmicToneMapping,bt as Layers,bu as WebGLRenderer}from"./main-thread-to-worker-d5d5841d.js";class Container{constructor(){this._context=new Map,this._lookups=new Map,this._singletons=new Map}getContext(e){if(this._context.has(e)){const t=this._context.get(e);return this._context.set(e,t+1),e+t}return this._context.set(e,1),e+0}addDependencyInjectionAssignments(e){e.forEach(e=>{this._lookups.set(e.className,e)})}lookup(e,t){if(!this._lookups.has(e))return null;const n=this._lookups.get(e);if(1===n.type&&void 0===t){const t="Dependency "+e+" has definition context but no context was defined!";return console.trace(t),console.error(t),null}let r=t&&1===n.type?t:"global";if(r+="_"+e,2===n.type)return new n.classDefinition;if(this._singletons.has(r))return this._singletons.get(r);const a=new n.classDefinition(t);return this._singletons.set(r,a),a}cleanUp(e){if(e){let t=[];this._singletons.forEach((n,r)=>{r.startsWith(e)&&t.push(r)}),t.forEach(e=>{this._singletons.delete(e)})}else this._singletons.clear(),this._singletons=new Map}}class DependencyInjectionAssignment{constructor(e,t,n){this.className=e,this.classDefinition=t,this.type=void 0===n?0:n}}const IMAGE_FORMATS={JPG:".jpg",JPEG:".jpeg",PNG:".png",GIF:".gif"};class FormDataUtil{_base64toBlob(e,t){t=t||"";const n=atob(e),r=n.length,a=Math.ceil(r/1024),i=new Array(a);for(let e=0;e<a;++e){let t=1024*e,a=Math.min(t+1024,r);const s=new Array(a-t);for(let e=t,r=0;e<a;++r,++e)s[r]=n[e].charCodeAt(0);i[e]=new Uint8Array(s)}return new Blob(i,{type:t})}_createFormData(e,t,n,r){const a=new FormData;-1!==e.indexOf(",")&&(e=e.substr(e.indexOf(",")+1));const i=-1===Object.keys(IMAGE_FORMATS).map(e=>IMAGE_FORMATS[e]).indexOf(n)?"application":"image",s=this._base64toBlob(e,i+"/"+n.substr(1));return a.append(r,s,t+n),a}create(e,t,n,r){return this._createFormData(e,t,n,r)}}const PREDEFINED_LIGHTSETTING={SOFA:"sofa",SHELF:"shelf",SHELF_FRONT:"shelf_front",BAKED:"baked",CAMERA:"camera",EQUAL:"equal"};class DynamicLightSettingLoader{static createDynamicLightSettingSource(e,t){let n={};if(e)n.url=e;else if(t)switch(t){case PREDEFINED_LIGHTSETTING.SHELF:n.url=getAssetPath()+"static/shelf-2975dd3f2fa9c763.json";break;case PREDEFINED_LIGHTSETTING.SHELF_FRONT:n.url=getAssetPath()+"static/shelf_front-8c9566a4512f0de8.json";break;case PREDEFINED_LIGHTSETTING.SOFA:n.url=getAssetPath()+"static/sofa-997b116bc5f2e92e.json";break;case PREDEFINED_LIGHTSETTING.BAKED:n.url=getAssetPath()+"static/baked-6485a2b1daeb69e8.json";break;case PREDEFINED_LIGHTSETTING.CAMERA:n.url=getAssetPath()+"static/camera-05824b47cdb951e4.json";break;case PREDEFINED_LIGHTSETTING.EQUAL:n.url=getAssetPath()+"static/equal-319f6b83c827913f.json";break;default:n.url=getAssetPath()+"static/camera-05824b47cdb951e4.json"}else n=null;return n}parse(e){let t=JSON.parse(e);return t.lights?this.load(t):[]}load(e){let t=[];return e.lights?(e.lights.forEach(e=>{let n;switch(e.type){case"ambient":n=this._parseAmbientLight(e);break;case"rectarea":n=this._parseRectAreaLight(e);break;case"spot":n=this._parseSpotLight(e);break;case"directional":n=this._parseDirectionalLight(e)}n&&t.push(n)}),t):[]}_parseAmbientLight(e){let t=new AmbientLight;return this._parseCommon(t,e),t}_parseRectAreaLight(e){let{intensity:t,castShadow:n,target:r,width:a,height:i}=e,s=null;if(n&&DynamicLightSettingLoader.rectAreaLightReplacement){const n=new DirectionalLight;this._parseCommon(n,e),s=n,n.castShadow=!0,n.shadow.camera.near=.1,n.shadow.camera.far=100,n.shadow.mapSize=new Vector2(1024,1024),n.shadow.bias=-5e-5,n.shadow.normalBias=.01,n.intensity=t?t/100:1,n.lookAt(r?new Vector3(r.x,r.y,r.z):new Vector3(0,0,0))}else{const n=new RectAreaLight;this._parseCommon(n,e),s=n,n.width=a||.8,n.height=i||.8,n.castShadow=!1,n.matrixAutoUpdate=!0,n.intensity=(t||240)/((a||.8)*(i||.8)),n.lookAt(r?new Vector3(r.x,r.y,r.z):new Vector3(0,0,0)),DynamicLightSettingLoader.rectAreaLightLoadingListener&&DynamicLightSettingLoader.rectAreaLightLoadingListener(n)}return s}_parseSpotLight(e){let t=new SpotLight;this._parseCommon(t,e);let{angle:n,penumbra:r,target:a,castShadow:i}=e;return t.angle=(n||100)*Math.PI/180,t.penumbra=r||.5,t.lookAt(a?new Vector3(a.x,a.y,a.z):new Vector3(0,0,0)),t.shadow.camera.near=.1,t.shadow.camera.far=10,t.shadow.mapSize=new Vector2(1024,1024),t.castShadow=i||!1,t}_parseDirectionalLight(e){let t=new DirectionalLight;this._parseCommon(t,e);let{target:n,castShadow:r}=e;return t.castShadow=r||!1,t.shadow.camera.near=.1,t.shadow.camera.far=100,t.shadow.mapSize=new Vector2(1024,1024),t.shadow.bias=-5e-5,t.lookAt(n?new Vector3(n.x,n.y,n.z):new Vector3(0,0,0)),t}_parseCommon(e,t){let{name:n,intensity:r,color:a,position:i,movesWithCamera:s}=t;e.name=n||"",e.intensity=r||1,e.color=new Color$1(a||"#ffffff"),e.position.copy(i?new Vector3(i.x,i.y,i.z):new Vector3(0,0,0)),e.visible=!0,e.layers.set(1),e.userData.movesWithCamera=s}}DynamicLightSettingLoader.rectAreaLightReplacement=!0;const NAMES_FOR_LOCALHOST=["127.0.0.1","localhost","0.0.0.0"],isIdItemId=function(e){return!(!e||"string"!=typeof e||e.split(":").length>2)},getCatalogIdFromItemOrConfigurationId=e=>{if(!e||"string"!=typeof e)return null;const t=e.split(":");return t.length<2?null:t[0]},kernelPartToPriceId=({articleNr:e,componentId:t})=>e&&""!==e?t.split(":")[0]+":"+e:null,wasRequestSuccess=(e,t)=>null!=e?"string"==typeof e?"true"===e:!0===e:("string"==typeof t&&(t=parseInt(t,10)),t>=200&&t<300);class NetworkLayer{constructor(){this._queue=[],this._pendingRequests=0}_nextSlot(){if(this._pendingRequests-=1,!this._queue.length)return;const{request:e,resolve:t,reject:n}=this._queue.shift();this._fetch(e).then(t,n)}_fetch(e,t={},n={}){return this._pendingRequests+=1,new Promise((r,a)=>{self.fetch(e,t).then(async function(e){this._nextSlot();const t=!n.checkResponse||!1!==await n.checkResponse(e);if(wasRequestSuccess(e.ok,e.status)&&t)r(...arguments);else{const t=(null==e?void 0:e.url)||"URL unknown";a(new Error(e.statusText||'Http error "'+(e&&e.status?e.status:"unknown")+'", for "'+t+'"'))}}.bind(this),e=>{this._nextSlot(),a(e)})})}fetch(e,t={},n={}){return this._pendingRequests>=40?new Promise((t,n)=>this._queue.push({request:e,resolve:t,reject:n})):this._fetch(e,t,n)}}function __decorate(e,t,n,r){var a,i=arguments.length,s=i<3?t:null===r?r=Object.getOwnPropertyDescriptor(t,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(e,t,n,r);else for(var o=e.length-1;o>=0;o--)(a=e[o])&&(s=(i<3?a(s):i>3?a(t,n,s):a(t,n))||s);return i>3&&s&&Object.defineProperty(t,n,s),s}"function"==typeof SuppressedError&&SuppressedError;const dashCase=function(e){return e.startsWith("_")&&(e=e.substr(1)),e.replace(/[A-Z](?:(?=[^A-Z])|[A-Z]*(?=[A-Z][^A-Z]|$))/g,(function(e,t){return(t>0?"-":"")+e.toLowerCase()}))};function inject(e,t){const n=Symbol("property-cache");Object.defineProperty(e,t,{get(){if(!this[n]){const e=window.__RML__DI__.lookup(dashCase(t),this._creator_);e?this[n]=e:console.error("Dependency "+dashCase(t)+" not found! Add dependency to /utils/injectables.ts")}return this[n]}})}class Logger{info(...e){console}log(...e){console}warn(...e){console.warn.apply(console,e)}error(...e){console.warn.apply(console,e)}}class KernelIo extends Logger{constructor(e){super(),this._creator_=e}setMeta(e){this._meta=e}get meta(){return this._meta?this._meta:{}}throw(e){const t="[Kernel Exception]: "+e;this._globalCallback.onKernelMsg("exception",e,this.meta),this.error(t)}error(e){this._globalCallback.onKernelMsg("error",e,this.meta),super.error(e)}warn(e){this._globalCallback.onKernelMsg("warning",e,this.meta),super.warn(e)}}__decorate([inject],KernelIo.prototype,"_globalCallback",void 0);const ASSET_CACHE=new Map,SYNCED_CATALOGS=new Map,SYNCED_FLOORS_TAGS=new Map,SYNCED_TYPE_CHANGE_TAGS=new Map;class DataSyncer{constructor(e){this._bootCallbacks=[],this._isStarted=!1,this._isStarting=!1,this._alwaysUseCache=!1,this._creator_=e}start(e){return this._configuratorUiCallbacks.onSyncStarted(),this._startWorker().then(()=>this._handleCatalog(e)).then(()=>{const{typeChangeTag:e,floorMaterialsTag:t}=this._initData;Promise.all([this._syncFloorTag(t),this._syncTypeChangeTag(e)]).then(()=>{SYNCED_TYPE_CHANGE_TAGS.set(e,!0),this._configuratorUiCallbacks.onSyncDone()})})}syncCatalog(e){return this._startWorker().then(()=>this._handleCatalog(e))}syncFloorTag(e){return this._startWorker().then(()=>this._syncFloorTag(e))}syncTypeChangeTag(e){return this._startWorker().then(()=>this._syncTypeChangeTag(e))}_syncFloorTag(e){const t=[];return e&&!SYNCED_FLOORS_TAGS.get(e)?(t.push(this._handleTags([e])),this._rapiAccess.getTag(e).then(e=>{t.push(this._handleMaterialsAndTextures(e))}),this._singlePromiseFactory.create(1,e,n=>{Promise.all(t).then(()=>{SYNCED_FLOORS_TAGS.set(e,!0),n()},e=>this._softReject(n,'_syncFloorTag error: "'+e+'"'))})):Promise.resolve()}_syncTypeChangeTag(e){const t=[];return e&&!SYNCED_TYPE_CHANGE_TAGS.get(e)?(t.push(this._handleTags([e])),this._rapiAccess.getTag(e).then(e=>{this._rapiAccess.getItems(e.items).then(e=>{e.forEach(e=>{this.getIsCatalogSynced(e.catalog)&&t.push(this._handleCatalog(e.catalog))})})}),this._singlePromiseFactory.create(2,e,n=>{Promise.all(t).then(()=>{SYNCED_FLOORS_TAGS.set(e,!0),n()},e=>this._softReject(n,'_syncTypeChangeTag error: "'+e+'"'))})):Promise.resolve()}getIsCatalogSynced(e){return!!SYNCED_CATALOGS.get(e)}_startWorker(){return new Promise((e,t)=>{if(this._isStarted)return e();this._bootCallbacks.push({resolve:e,reject:t}),this._isStarting||(this._worker=new Worker(getAssetPath()+"static/asset-loader.worker-1735a5fb1e401244.js"),this._mainThreadToWorker=new MainThreadToWorker(this,this._worker),this._isStarting=!0,this._mainThreadToWorker.sendToWorker(1))})}onCommand(e,t,n){switch(e){case 4:this._isStarted=!0,this._bootCallbacks.forEach(({resolve:e})=>e());break;case 3:this._mainThreadToWorker.resolvePromises(t,n)}}_handleCatalog(e){return this._singlePromiseFactory.create(0,e,t=>this.getIsCatalogSynced(e)?t():this._rapiAccess.getCatalog(e).then(e=>Promise.all([this._handleContentWithAssets(this._rapiAccess.getComponentsOf(e),["perspectiveImage"]),this._handleItemsAndAdditionalContents(e),this._handleMaterialsAndTextures(e),this._handleExternalMeshes(e),this._handleTags(e.tags)])).then(()=>{SYNCED_CATALOGS.set(e,!0),t()},e=>this._softReject(t,'Catalog sync error: "'+e+'"')))}_handleTags(e){return this._handleContentWithAssets(this._rapiAccess.getTags(e),["pngIcon","svgIcon"])}_handleExternalMeshes(e){return new Promise(t=>{this._rapiAccess.getMeshesOfCatalog(e.id).then(e=>{const n=[];e.forEach(e=>{n.push(this._handleContentWithAssets(Promise.all([this._rapiAccess.getMesh(e.id)]),["url"]))}),Promise.all(n).then(t,e=>this._softReject(t,'Sync crt files error: "'+e+'"'))},e=>this._softReject(t,'getMeshesOfCatalog error: "'+e+'"'))})}_handleItemsAndAdditionalContents(e){return new Promise(t=>{this._rapiAccess.getItemsOf(e).then(e=>{const n=[];n.push(this._handleContentWithAssets(Promise.resolve(e),["perspectiveImage"])),this._rapiAccess.getAdditionalContentsOfItems(e).then(e=>{const t=e.filter(e=>-1!==[5,6,4].indexOf(e.type));n.push(this._handleContentWithAssets(Promise.resolve(t),["content"]))},e=>this._softReject(t,'getAdditionalContentsOfItems error: "'+e+'"')),Promise.all(n).then(t,e=>this._softReject(t,'AdditionalContent image sync error:"'+e+'"'))})})}_handleMaterialsAndTextures(e){return new Promise(t=>{this._rapiAccess.getMaterialsOf(e).then(e=>{const n=[];n.push(this._handleContentWithAssets(Promise.resolve(e),["thumbnail"])),e.forEach(e=>{n.push(this._handleContentWithAssets(this._rapiAccess.getTexturesOf(e),["image"]))}),Promise.all(n).then(t,e=>this._softReject(t,'getTexturesOf error: "'+e+'"'))},e=>this._softReject(t,'getMaterialsOf error: "'+e+'"'))})}_handleContentWithAssets(e,t){return new Promise(n=>e.then(e=>this._fetchAssets(e,t).then(n,e=>this._softReject(n,'_handleContentWithAssets error: "'+e+'"')),e=>this._softReject(n,'_handleContentWithAssets promise error: "'+e+'"')))}_fetchAssets(e,t){const n=[];e||(e=[]);for(let r=0,a=e.length;r<a;r++){const a=e[r];t.forEach(e=>{const t=a[e];t&&n.push(this._preCacheAsset(t))})}return Promise.all(n)}_preCacheAsset(e){return new Promise(t=>{if(ASSET_CACHE.get(e))return t();this._assetUrlToBase64(e).then(n=>{ASSET_CACHE.set(e,n),t()},e=>this._softReject(t,'_preCacheAsset error: "'+e+'"'))})}_assetUrlToBase64(e){return new Promise(t=>{this._mainThreadToWorker.sendToWorker(5,e,t,e=>this._softReject(t,'_assetUrlToBase64 error: "'+e+'"'))})}_softReject(e,t){this._errorHandler.softReject(e,t,2)}requestAsset(e,t=!1){return navigator.onLine&&!this._alwaysUseCache?e:ASSET_CACHE.get(e)||(t?e:null)}setAlwaysUseCache(e){this._alwaysUseCache=e}preFillAssetCache(e,t){ASSET_CACHE.set(e,t)}}__decorate([inject],DataSyncer.prototype,"_rapiAccess",void 0),__decorate([inject],DataSyncer.prototype,"_singlePromiseFactory",void 0),__decorate([inject],DataSyncer.prototype,"_errorHandler",void 0),__decorate([inject],DataSyncer.prototype,"_configuratorUiCallbacks",void 0),__decorate([inject],DataSyncer.prototype,"_initData",void 0);class AsyncGuard{constructor(e){this.info=e,this._init()}_init(){this._promise=new Promise((e,t)=>{this._resolve=e,this._reject=t})}resolve(e){e&&this._resolve(e),this._resolve()}reject(e){this._reject(e)}wait(){return this._promise}reset(){this._init()}}function mergeAttributes(e){let t,n,r,a=-1,i=0;for(let s=0;s<e.length;++s){const o=e[s];if(o.isInterleavedBufferAttribute)return console.error("THREE.BufferGeometryUtils: .mergeAttributes() failed. InterleavedBufferAttributes are not supported."),null;if(void 0===t&&(t=o.array.constructor),t!==o.array.constructor)return console.error("THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.array must be of consistent array types across matching attributes."),null;if(void 0===n&&(n=o.itemSize),n!==o.itemSize)return console.error("THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.itemSize must be consistent across matching attributes."),null;if(void 0===r&&(r=o.normalized),r!==o.normalized)return console.error("THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.normalized must be consistent across matching attributes."),null;if(-1===a&&(a=o.gpuType),a!==o.gpuType)return console.error("THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.gpuType must be consistent across matching attributes."),null;i+=o.array.length}const s=new t(i);let o=0;for(let t=0;t<e.length;++t)s.set(e[t].array,o),o+=e[t].array.length;const l=new BufferAttribute(s,n,r);return void 0!==a&&(l.gpuType=a),l}function toTrianglesDrawMode(e,t){if(t===TrianglesDrawMode)return console.warn("THREE.BufferGeometryUtils.toTrianglesDrawMode(): Geometry already defined as triangles."),e;if(t===TriangleFanDrawMode||t===TriangleStripDrawMode){let n=e.getIndex();if(null===n){const t=[],r=e.getAttribute("position");if(void 0===r)return console.error("THREE.BufferGeometryUtils.toTrianglesDrawMode(): Undefined position attribute. Processing not possible."),e;for(let e=0;e<r.count;e++)t.push(e);e.setIndex(t),n=e.getIndex()}const r=n.count-2,a=[];if(t===TriangleFanDrawMode)for(let e=1;e<=r;e++)a.push(n.getX(0)),a.push(n.getX(e)),a.push(n.getX(e+1));else for(let e=0;e<r;e++)e%2==0?(a.push(n.getX(e)),a.push(n.getX(e+1)),a.push(n.getX(e+2))):(a.push(n.getX(e+2)),a.push(n.getX(e+1)),a.push(n.getX(e)));a.length/3!==r&&console.error("THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unable to generate correct amount of triangles.");const i=e.clone();return i.setIndex(a),i.clearGroups(),i}return console.error("THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unknown draw mode:",t),e}class GLTFLoader extends Loader{constructor(e){super(e),this.dracoLoader=null,this.ktx2Loader=null,this.meshoptDecoder=null,this.pluginCallbacks=[],this.register((function(e){return new GLTFMaterialsClearcoatExtension(e)})),this.register((function(e){return new GLTFTextureBasisUExtension(e)})),this.register((function(e){return new GLTFTextureWebPExtension(e)})),this.register((function(e){return new GLTFTextureAVIFExtension(e)})),this.register((function(e){return new GLTFMaterialsSheenExtension(e)})),this.register((function(e){return new GLTFMaterialsTransmissionExtension(e)})),this.register((function(e){return new GLTFMaterialsVolumeExtension(e)})),this.register((function(e){return new GLTFMaterialsIorExtension(e)})),this.register((function(e){return new GLTFMaterialsEmissiveStrengthExtension(e)})),this.register((function(e){return new GLTFMaterialsSpecularExtension(e)})),this.register((function(e){return new GLTFMaterialsIridescenceExtension(e)})),this.register((function(e){return new GLTFMaterialsAnisotropyExtension(e)})),this.register((function(e){return new GLTFLightsExtension(e)})),this.register((function(e){return new GLTFMeshoptCompression(e)})),this.register((function(e){return new GLTFMeshGpuInstancing(e)}))}load(e,t,n,r){const a=this;let i;i=""!==this.resourcePath?this.resourcePath:""!==this.path?this.path:LoaderUtils.extractUrlBase(e),this.manager.itemStart(e);const s=function(t){r?r(t):console.error(t),a.manager.itemError(e),a.manager.itemEnd(e)},o=new FileLoader(this.manager);o.setPath(this.path),o.setResponseType("arraybuffer"),o.setRequestHeader(this.requestHeader),o.setWithCredentials(this.withCredentials),o.load(e,(function(n){try{a.parse(n,i,(function(n){t(n),a.manager.itemEnd(e)}),s)}catch(e){s(e)}}),n,s)}setDRACOLoader(e){return this.dracoLoader=e,this}setDDSLoader(){throw new Error('THREE.GLTFLoader: "MSFT_texture_dds" no longer supported. Please update to "KHR_texture_basisu".')}setKTX2Loader(e){return this.ktx2Loader=e,this}setMeshoptDecoder(e){return this.meshoptDecoder=e,this}register(e){return-1===this.pluginCallbacks.indexOf(e)&&this.pluginCallbacks.push(e),this}unregister(e){return-1!==this.pluginCallbacks.indexOf(e)&&this.pluginCallbacks.splice(this.pluginCallbacks.indexOf(e),1),this}parse(e,t,n,r){let a;const i={},s={},o=new TextDecoder;if("string"==typeof e)a=JSON.parse(e);else if(e instanceof ArrayBuffer)if(o.decode(new Uint8Array(e,0,4))===BINARY_EXTENSION_HEADER_MAGIC){try{i[EXTENSIONS.KHR_BINARY_GLTF]=new GLTFBinaryExtension(e)}catch(e){return void(r&&r(e))}a=JSON.parse(i[EXTENSIONS.KHR_BINARY_GLTF].content)}else a=JSON.parse(o.decode(e));else a=e;if(void 0===a.asset||a.asset.version[0]<2)return void(r&&r(new Error("THREE.GLTFLoader: Unsupported asset. glTF versions >=2.0 are supported.")));const l=new GLTFParser(a,{path:t||this.resourcePath||"",crossOrigin:this.crossOrigin,requestHeader:this.requestHeader,manager:this.manager,ktx2Loader:this.ktx2Loader,meshoptDecoder:this.meshoptDecoder});l.fileLoader.setRequestHeader(this.requestHeader);for(let e=0;e<this.pluginCallbacks.length;e++){const t=this.pluginCallbacks[e](l);s[t.name]=t,i[t.name]=!0}if(a.extensionsUsed)for(let e=0;e<a.extensionsUsed.length;++e){const t=a.extensionsUsed[e],n=a.extensionsRequired||[];switch(t){case EXTENSIONS.KHR_MATERIALS_UNLIT:i[t]=new GLTFMaterialsUnlitExtension;break;case EXTENSIONS.KHR_DRACO_MESH_COMPRESSION:i[t]=new GLTFDracoMeshCompressionExtension(a,this.dracoLoader);break;case EXTENSIONS.KHR_TEXTURE_TRANSFORM:i[t]=new GLTFTextureTransformExtension;break;case EXTENSIONS.KHR_MESH_QUANTIZATION:i[t]=new GLTFMeshQuantizationExtension;break;default:n.indexOf(t)>=0&&void 0===s[t]&&console.warn('THREE.GLTFLoader: Unknown extension "'+t+'".')}}l.setExtensions(i),l.setPlugins(s),l.parse(n,r)}parseAsync(e,t){const n=this;return new Promise((function(r,a){n.parse(e,t,r,a)}))}}function GLTFRegistry(){let e={};return{get:function(t){return e[t]},add:function(t,n){e[t]=n},remove:function(t){delete e[t]},removeAll:function(){e={}}}}const EXTENSIONS={KHR_BINARY_GLTF:"KHR_binary_glTF",KHR_DRACO_MESH_COMPRESSION:"KHR_draco_mesh_compression",KHR_LIGHTS_PUNCTUAL:"KHR_lights_punctual",KHR_MATERIALS_CLEARCOAT:"KHR_materials_clearcoat",KHR_MATERIALS_IOR:"KHR_materials_ior",KHR_MATERIALS_SHEEN:"KHR_materials_sheen",KHR_MATERIALS_SPECULAR:"KHR_materials_specular",KHR_MATERIALS_TRANSMISSION:"KHR_materials_transmission",KHR_MATERIALS_IRIDESCENCE:"KHR_materials_iridescence",KHR_MATERIALS_ANISOTROPY:"KHR_materials_anisotropy",KHR_MATERIALS_UNLIT:"KHR_materials_unlit",KHR_MATERIALS_VOLUME:"KHR_materials_volume",KHR_TEXTURE_BASISU:"KHR_texture_basisu",KHR_TEXTURE_TRANSFORM:"KHR_texture_transform",KHR_MESH_QUANTIZATION:"KHR_mesh_quantization",KHR_MATERIALS_EMISSIVE_STRENGTH:"KHR_materials_emissive_strength",EXT_TEXTURE_WEBP:"EXT_texture_webp",EXT_TEXTURE_AVIF:"EXT_texture_avif",EXT_MESHOPT_COMPRESSION:"EXT_meshopt_compression",EXT_MESH_GPU_INSTANCING:"EXT_mesh_gpu_instancing"};class GLTFLightsExtension{constructor(e){this.parser=e,this.name=EXTENSIONS.KHR_LIGHTS_PUNCTUAL,this.cache={refs:{},uses:{}}}_markDefs(){const e=this.parser,t=this.parser.json.nodes||[];for(let n=0,r=t.length;n<r;n++){const r=t[n];r.extensions&&r.extensions[this.name]&&void 0!==r.extensions[this.name].light&&e._addNodeRef(this.cache,r.extensions[this.name].light)}}_loadLight(e){const t=this.parser,n="light:"+e;let r=t.cache.get(n);if(r)return r;const a=t.json,i=((a.extensions&&a.extensions[this.name]||{}).lights||[])[e];let s;const o=new Color$1(16777215);void 0!==i.color&&o.fromArray(i.color);const l=void 0!==i.range?i.range:0;switch(i.type){case"directional":s=new DirectionalLight(o),s.target.position.set(0,0,-1),s.add(s.target);break;case"point":s=new PointLight(o),s.distance=l;break;case"spot":s=new SpotLight(o),s.distance=l,i.spot=i.spot||{},i.spot.innerConeAngle=void 0!==i.spot.innerConeAngle?i.spot.innerConeAngle:0,i.spot.outerConeAngle=void 0!==i.spot.outerConeAngle?i.spot.outerConeAngle:Math.PI/4,s.angle=i.spot.outerConeAngle,s.penumbra=1-i.spot.innerConeAngle/i.spot.outerConeAngle,s.target.position.set(0,0,-1),s.add(s.target);break;default:throw new Error("THREE.GLTFLoader: Unexpected light type: "+i.type)}return s.position.set(0,0,0),s.decay=2,assignExtrasToUserData(s,i),void 0!==i.intensity&&(s.intensity=i.intensity),s.name=t.createUniqueName(i.name||"light_"+e),r=Promise.resolve(s),t.cache.add(n,r),r}getDependency(e,t){if("light"===e)return this._loadLight(t)}createNodeAttachment(e){const t=this,n=this.parser,r=n.json.nodes[e],a=(r.extensions&&r.extensions[this.name]||{}).light;return void 0===a?null:this._loadLight(a).then((function(e){return n._getNodeRef(t.cache,a,e)}))}}class GLTFMaterialsUnlitExtension{constructor(){this.name=EXTENSIONS.KHR_MATERIALS_UNLIT}getMaterialType(){return MeshBasicMaterial}extendParams(e,t,n){const r=[];e.color=new Color$1(1,1,1),e.opacity=1;const a=t.pbrMetallicRoughness;if(a){if(Array.isArray(a.baseColorFactor)){const t=a.baseColorFactor;e.color.fromArray(t),e.opacity=t[3]}void 0!==a.baseColorTexture&&r.push(n.assignTexture(e,"map",a.baseColorTexture,SRGBColorSpace))}return Promise.all(r)}}class GLTFMaterialsEmissiveStrengthExtension{constructor(e){this.parser=e,this.name=EXTENSIONS.KHR_MATERIALS_EMISSIVE_STRENGTH}extendMaterialParams(e,t){const n=this.parser.json.materials[e];if(!n.extensions||!n.extensions[this.name])return Promise.resolve();const r=n.extensions[this.name].emissiveStrength;return void 0!==r&&(t.emissiveIntensity=r),Promise.resolve()}}class GLTFMaterialsClearcoatExtension{constructor(e){this.parser=e,this.name=EXTENSIONS.KHR_MATERIALS_CLEARCOAT}getMaterialType(e){const t=this.parser.json.materials[e];return t.extensions&&t.extensions[this.name]?MeshPhysicalMaterial:null}extendMaterialParams(e,t){const n=this.parser,r=n.json.materials[e];if(!r.extensions||!r.extensions[this.name])return Promise.resolve();const a=[],i=r.extensions[this.name];if(void 0!==i.clearcoatFactor&&(t.clearcoat=i.clearcoatFactor),void 0!==i.clearcoatTexture&&a.push(n.assignTexture(t,"clearcoatMap",i.clearcoatTexture)),void 0!==i.clearcoatRoughnessFactor&&(t.clearcoatRoughness=i.clearcoatRoughnessFactor),void 0!==i.clearcoatRoughnessTexture&&a.push(n.assignTexture(t,"clearcoatRoughnessMap",i.clearcoatRoughnessTexture)),void 0!==i.clearcoatNormalTexture&&(a.push(n.assignTexture(t,"clearcoatNormalMap",i.clearcoatNormalTexture)),void 0!==i.clearcoatNormalTexture.scale)){const e=i.clearcoatNormalTexture.scale;t.clearcoatNormalScale=new Vector2(e,e)}return Promise.all(a)}}class GLTFMaterialsIridescenceExtension{constructor(e){this.parser=e,this.name=EXTENSIONS.KHR_MATERIALS_IRIDESCENCE}getMaterialType(e){const t=this.parser.json.materials[e];return t.extensions&&t.extensions[this.name]?MeshPhysicalMaterial:null}extendMaterialParams(e,t){const n=this.parser,r=n.json.materials[e];if(!r.extensions||!r.extensions[this.name])return Promise.resolve();const a=[],i=r.extensions[this.name];return void 0!==i.iridescenceFactor&&(t.iridescence=i.iridescenceFactor),void 0!==i.iridescenceTexture&&a.push(n.assignTexture(t,"iridescenceMap",i.iridescenceTexture)),void 0!==i.iridescenceIor&&(t.iridescenceIOR=i.iridescenceIor),void 0===t.iridescenceThicknessRange&&(t.iridescenceThicknessRange=[100,400]),void 0!==i.iridescenceThicknessMinimum&&(t.iridescenceThicknessRange[0]=i.iridescenceThicknessMinimum),void 0!==i.iridescenceThicknessMaximum&&(t.iridescenceThicknessRange[1]=i.iridescenceThicknessMaximum),void 0!==i.iridescenceThicknessTexture&&a.push(n.assignTexture(t,"iridescenceThicknessMap",i.iridescenceThicknessTexture)),Promise.all(a)}}class GLTFMaterialsSheenExtension{constructor(e){this.parser=e,this.name=EXTENSIONS.KHR_MATERIALS_SHEEN}getMaterialType(e){const t=this.parser.json.materials[e];return t.extensions&&t.extensions[this.name]?MeshPhysicalMaterial:null}extendMaterialParams(e,t){const n=this.parser,r=n.json.materials[e];if(!r.extensions||!r.extensions[this.name])return Promise.resolve();const a=[];t.sheenColor=new Color$1(0,0,0),t.sheenRoughness=0,t.sheen=1;const i=r.extensions[this.name];return void 0!==i.sheenColorFactor&&t.sheenColor.fromArray(i.sheenColorFactor),void 0!==i.sheenRoughnessFactor&&(t.sheenRoughness=i.sheenRoughnessFactor),void 0!==i.sheenColorTexture&&a.push(n.assignTexture(t,"sheenColorMap",i.sheenColorTexture,SRGBColorSpace)),void 0!==i.sheenRoughnessTexture&&a.push(n.assignTexture(t,"sheenRoughnessMap",i.sheenRoughnessTexture)),Promise.all(a)}}class GLTFMaterialsTransmissionExtension{constructor(e){this.parser=e,this.name=EXTENSIONS.KHR_MATERIALS_TRANSMISSION}getMaterialType(e){const t=this.parser.json.materials[e];return t.extensions&&t.extensions[this.name]?MeshPhysicalMaterial:null}extendMaterialParams(e,t){const n=this.parser,r=n.json.materials[e];if(!r.extensions||!r.extensions[this.name])return Promise.resolve();const a=[],i=r.extensions[this.name];return void 0!==i.transmissionFactor&&(t.transmission=i.transmissionFactor),void 0!==i.transmissionTexture&&a.push(n.assignTexture(t,"transmissionMap",i.transmissionTexture)),Promise.all(a)}}class GLTFMaterialsVolumeExtension{constructor(e){this.parser=e,this.name=EXTENSIONS.KHR_MATERIALS_VOLUME}getMaterialType(e){const t=this.parser.json.materials[e];return t.extensions&&t.extensions[this.name]?MeshPhysicalMaterial:null}extendMaterialParams(e,t){const n=this.parser,r=n.json.materials[e];if(!r.extensions||!r.extensions[this.name])return Promise.resolve();const a=[],i=r.extensions[this.name];t.thickness=void 0!==i.thicknessFactor?i.thicknessFactor:0,void 0!==i.thicknessTexture&&a.push(n.assignTexture(t,"thicknessMap",i.thicknessTexture)),t.attenuationDistance=i.attenuationDistance||1/0;const s=i.attenuationColor||[1,1,1];return t.attenuationColor=new Color$1(s[0],s[1],s[2]),Promise.all(a)}}class GLTFMaterialsIorExtension{constructor(e){this.parser=e,this.name=EXTENSIONS.KHR_MATERIALS_IOR}getMaterialType(e){const t=this.parser.json.materials[e];return t.extensions&&t.extensions[this.name]?MeshPhysicalMaterial:null}extendMaterialParams(e,t){const n=this.parser.json.materials[e];if(!n.extensions||!n.extensions[this.name])return Promise.resolve();const r=n.extensions[this.name];return t.ior=void 0!==r.ior?r.ior:1.5,Promise.resolve()}}class GLTFMaterialsSpecularExtension{constructor(e){this.parser=e,this.name=EXTENSIONS.KHR_MATERIALS_SPECULAR}getMaterialType(e){const t=this.parser.json.materials[e];return t.extensions&&t.extensions[this.name]?MeshPhysicalMaterial:null}extendMaterialParams(e,t){const n=this.parser,r=n.json.materials[e];if(!r.extensions||!r.extensions[this.name])return Promise.resolve();const a=[],i=r.extensions[this.name];t.specularIntensity=void 0!==i.specularFactor?i.specularFactor:1,void 0!==i.specularTexture&&a.push(n.assignTexture(t,"specularIntensityMap",i.specularTexture));const s=i.specularColorFactor||[1,1,1];return t.specularColor=new Color$1(s[0],s[1],s[2]),void 0!==i.specularColorTexture&&a.push(n.assignTexture(t,"specularColorMap",i.specularColorTexture,SRGBColorSpace)),Promise.all(a)}}class GLTFMaterialsAnisotropyExtension{constructor(e){this.parser=e,this.name=EXTENSIONS.KHR_MATERIALS_ANISOTROPY}getMaterialType(e){const t=this.parser.json.materials[e];return t.extensions&&t.extensions[this.name]?MeshPhysicalMaterial:null}extendMaterialParams(e,t){const n=this.parser,r=n.json.materials[e];if(!r.extensions||!r.extensions[this.name])return Promise.resolve();const a=[],i=r.extensions[this.name];return void 0!==i.anisotropyStrength&&(t.anisotropy=i.anisotropyStrength),void 0!==i.anisotropyRotation&&(t.anisotropyRotation=i.anisotropyRotation),void 0!==i.anisotropyTexture&&a.push(n.assignTexture(t,"anisotropyMap",i.anisotropyTexture)),Promise.all(a)}}class GLTFTextureBasisUExtension{constructor(e){this.parser=e,this.name=EXTENSIONS.KHR_TEXTURE_BASISU}loadTexture(e){const t=this.parser,n=t.json,r=n.textures[e];if(!r.extensions||!r.extensions[this.name])return null;const a=r.extensions[this.name],i=t.options.ktx2Loader;if(!i){if(n.extensionsRequired&&n.extensionsRequired.indexOf(this.name)>=0)throw new Error("THREE.GLTFLoader: setKTX2Loader must be called before loading KTX2 textures");return null}return t.loadTextureImage(e,a.source,i)}}class GLTFTextureWebPExtension{constructor(e){this.parser=e,this.name=EXTENSIONS.EXT_TEXTURE_WEBP,this.isSupported=null}loadTexture(e){const t=this.name,n=this.parser,r=n.json,a=r.textures[e];if(!a.extensions||!a.extensions[t])return null;const i=a.extensions[t],s=r.images[i.source];let o=n.textureLoader;if(s.uri){const e=n.options.manager.getHandler(s.uri);null!==e&&(o=e)}return this.detectSupport().then((function(a){if(a)return n.loadTextureImage(e,i.source,o);if(r.extensionsRequired&&r.extensionsRequired.indexOf(t)>=0)throw new Error("THREE.GLTFLoader: WebP required by asset but unsupported.");return n.loadTexture(e)}))}detectSupport(){return this.isSupported||(this.isSupported=new Promise((function(e){const t=new Image;t.src="data:image/webp;base64,UklGRiIAAABXRUJQVlA4IBYAAAAwAQCdASoBAAEADsD+JaQAA3AAAAAA",t.onload=t.onerror=function(){e(1===t.height)}}))),this.isSupported}}class GLTFTextureAVIFExtension{constructor(e){this.parser=e,this.name=EXTENSIONS.EXT_TEXTURE_AVIF,this.isSupported=null}loadTexture(e){const t=this.name,n=this.parser,r=n.json,a=r.textures[e];if(!a.extensions||!a.extensions[t])return null;const i=a.extensions[t],s=r.images[i.source];let o=n.textureLoader;if(s.uri){const e=n.options.manager.getHandler(s.uri);null!==e&&(o=e)}return this.detectSupport().then((function(a){if(a)return n.loadTextureImage(e,i.source,o);if(r.extensionsRequired&&r.extensionsRequired.indexOf(t)>=0)throw new Error("THREE.GLTFLoader: AVIF required by asset but unsupported.");return n.loadTexture(e)}))}detectSupport(){return this.isSupported||(this.isSupported=new Promise((function(e){const t=new Image;t.src="data:image/avif;base64,AAAAIGZ0eXBhdmlmAAAAAGF2aWZtaWYxbWlhZk1BMUIAAADybWV0YQAAAAAAAAAoaGRscgAAAAAAAAAAcGljdAAAAAAAAAAAAAAAAGxpYmF2aWYAAAAADnBpdG0AAAAAAAEAAAAeaWxvYwAAAABEAAABAAEAAAABAAABGgAAABcAAAAoaWluZgAAAAAAAQAAABppbmZlAgAAAAABAABhdjAxQ29sb3IAAAAAamlwcnAAAABLaXBjbwAAABRpc3BlAAAAAAAAAAEAAAABAAAAEHBpeGkAAAAAAwgICAAAAAxhdjFDgQAMAAAAABNjb2xybmNseAACAAIABoAAAAAXaXBtYQAAAAAAAAABAAEEAQKDBAAAAB9tZGF0EgAKCBgABogQEDQgMgkQAAAAB8dSLfI=",t.onload=t.onerror=function(){e(1===t.height)}}))),this.isSupported}}class GLTFMeshoptCompression{constructor(e){this.name=EXTENSIONS.EXT_MESHOPT_COMPRESSION,this.parser=e}loadBufferView(e){const t=this.parser.json,n=t.bufferViews[e];if(n.extensions&&n.extensions[this.name]){const e=n.extensions[this.name],r=this.parser.getDependency("buffer",e.buffer),a=this.parser.options.meshoptDecoder;if(!a||!a.supported){if(t.extensionsRequired&&t.extensionsRequired.indexOf(this.name)>=0)throw new Error("THREE.GLTFLoader: setMeshoptDecoder must be called before loading compressed files");return null}return r.then((function(t){const n=e.byteOffset||0,r=e.byteLength||0,i=e.count,s=e.byteStride,o=new Uint8Array(t,n,r);return a.decodeGltfBufferAsync?a.decodeGltfBufferAsync(i,s,o,e.mode,e.filter).then((function(e){return e.buffer})):a.ready.then((function(){const t=new ArrayBuffer(i*s);return a.decodeGltfBuffer(new Uint8Array(t),i,s,o,e.mode,e.filter),t}))}))}return null}}class GLTFMeshGpuInstancing{constructor(e){this.name=EXTENSIONS.EXT_MESH_GPU_INSTANCING,this.parser=e}createNodeMesh(e){const t=this.parser.json,n=t.nodes[e];if(!n.extensions||!n.extensions[this.name]||void 0===n.mesh)return null;const r=t.meshes[n.mesh];for(const e of r.primitives)if(e.mode!==WEBGL_CONSTANTS.TRIANGLES&&e.mode!==WEBGL_CONSTANTS.TRIANGLE_STRIP&&e.mode!==WEBGL_CONSTANTS.TRIANGLE_FAN&&void 0!==e.mode)return null;const a=n.extensions[this.name].attributes,i=[],s={};for(const e in a)i.push(this.parser.getDependency("accessor",a[e]).then(t=>(s[e]=t,s[e])));return i.length<1?null:(i.push(this.parser.createNodeMesh(e)),Promise.all(i).then(e=>{const t=e.pop(),n=t.isGroup?t.children:[t],r=e[0].count,a=[];for(const e of n){const t=new Matrix4,n=new Vector3,i=new Quaternion,o=new Vector3(1,1,1),l=new InstancedMesh(e.geometry,e.material,r);for(let e=0;e<r;e++)s.TRANSLATION&&n.fromBufferAttribute(s.TRANSLATION,e),s.ROTATION&&i.fromBufferAttribute(s.ROTATION,e),s.SCALE&&o.fromBufferAttribute(s.SCALE,e),l.setMatrixAt(e,t.compose(n,i,o));for(const t in s)"TRANSLATION"!==t&&"ROTATION"!==t&&"SCALE"!==t&&e.geometry.setAttribute(t,s[t]);Object3D.prototype.copy.call(l,e),this.parser.assignFinalMaterial(l),a.push(l)}return t.isGroup?(t.clear(),t.add(...a),t):a[0]}))}}const BINARY_EXTENSION_HEADER_MAGIC="glTF";class GLTFBinaryExtension{constructor(e){this.name=EXTENSIONS.KHR_BINARY_GLTF,this.content=null,this.body=null;const t=new DataView(e,0,12),n=new TextDecoder;if(this.header={magic:n.decode(new Uint8Array(e.slice(0,4))),version:t.getUint32(4,!0),length:t.getUint32(8,!0)},this.header.magic!==BINARY_EXTENSION_HEADER_MAGIC)throw new Error("THREE.GLTFLoader: Unsupported glTF-Binary header.");if(this.header.version<2)throw new Error("THREE.GLTFLoader: Legacy binary file detected.");const r=this.header.length-12,a=new DataView(e,12);let i=0;for(;i<r;){const t=a.getUint32(i,!0);i+=4;const r=a.getUint32(i,!0);if(i+=4,1313821514===r){const r=new Uint8Array(e,12+i,t);this.content=n.decode(r)}else if(5130562===r){const n=12+i;this.body=e.slice(n,n+t)}i+=t}if(null===this.content)throw new Error("THREE.GLTFLoader: JSON content not found.")}}class GLTFDracoMeshCompressionExtension{constructor(e,t){if(!t)throw new Error("THREE.GLTFLoader: No DRACOLoader instance provided.");this.name=EXTENSIONS.KHR_DRACO_MESH_COMPRESSION,this.json=e,this.dracoLoader=t,this.dracoLoader.preload()}decodePrimitive(e,t){const n=this.json,r=this.dracoLoader,a=e.extensions[this.name].bufferView,i=e.extensions[this.name].attributes,s={},o={},l={};for(const e in i){const t=ATTRIBUTES[e]||e.toLowerCase();s[t]=i[e]}for(const t in e.attributes){const r=ATTRIBUTES[t]||t.toLowerCase();if(void 0!==i[t]){const a=n.accessors[e.attributes[t]],i=WEBGL_COMPONENT_TYPES[a.componentType];l[r]=i.name,o[r]=!0===a.normalized}}return t.getDependency("bufferView",a).then((function(e){return new Promise((function(t){r.decodeDracoFile(e,(function(e){for(const t in e.attributes){const n=e.attributes[t],r=o[t];void 0!==r&&(n.normalized=r)}t(e)}),s,l)}))}))}}class GLTFTextureTransformExtension{constructor(){this.name=EXTENSIONS.KHR_TEXTURE_TRANSFORM}extendTexture(e,t){return void 0!==t.texCoord&&t.texCoord!==e.channel||void 0!==t.offset||void 0!==t.rotation||void 0!==t.scale?(e=e.clone(),void 0!==t.texCoord&&(e.channel=t.texCoord),void 0!==t.offset&&e.offset.fromArray(t.offset),void 0!==t.rotation&&(e.rotation=t.rotation),void 0!==t.scale&&e.repeat.fromArray(t.scale),e.needsUpdate=!0,e):e}}class GLTFMeshQuantizationExtension{constructor(){this.name=EXTENSIONS.KHR_MESH_QUANTIZATION}}class GLTFCubicSplineInterpolant extends Interpolant{constructor(e,t,n,r){super(e,t,n,r)}copySampleValue_(e){const t=this.resultBuffer,n=this.sampleValues,r=this.valueSize,a=e*r*3+r;for(let e=0;e!==r;e++)t[e]=n[a+e];return t}interpolate_(e,t,n,r){const a=this.resultBuffer,i=this.sampleValues,s=this.valueSize,o=2*s,l=3*s,d=r-t,h=(n-t)/d,c=h*h,u=c*h,p=e*l,m=p-l,g=-2*u+3*c,f=u-c,_=1-g,v=f-c+h;for(let e=0;e!==s;e++){const t=i[m+e+s],n=i[m+e+o]*d,r=i[p+e+s],l=i[p+e]*d;a[e]=_*t+v*n+g*r+f*l}return a}}const _q=new Quaternion;class GLTFCubicSplineQuaternionInterpolant extends GLTFCubicSplineInterpolant{interpolate_(e,t,n,r){const a=super.interpolate_(e,t,n,r);return _q.fromArray(a).normalize().toArray(a),a}}const WEBGL_CONSTANTS={FLOAT:5126,FLOAT_MAT3:35675,FLOAT_MAT4:35676,FLOAT_VEC2:35664,FLOAT_VEC3:35665,FLOAT_VEC4:35666,LINEAR:9729,REPEAT:10497,SAMPLER_2D:35678,POINTS:0,LINES:1,LINE_LOOP:2,LINE_STRIP:3,TRIANGLES:4,TRIANGLE_STRIP:5,TRIANGLE_FAN:6,UNSIGNED_BYTE:5121,UNSIGNED_SHORT:5123},WEBGL_COMPONENT_TYPES={5120:Int8Array,5121:Uint8Array,5122:Int16Array,5123:Uint16Array,5125:Uint32Array,5126:Float32Array},WEBGL_FILTERS={9728:NearestFilter,9729:LinearFilter,9984:NearestMipmapNearestFilter,9985:LinearMipmapNearestFilter,9986:NearestMipmapLinearFilter,9987:LinearMipmapLinearFilter},WEBGL_WRAPPINGS={33071:ClampToEdgeWrapping,33648:MirroredRepeatWrapping,10497:RepeatWrapping},WEBGL_TYPE_SIZES={SCALAR:1,VEC2:2,VEC3:3,VEC4:4,MAT2:4,MAT3:9,MAT4:16},ATTRIBUTES={POSITION:"position",NORMAL:"normal",TANGENT:"tangent",TEXCOORD_0:"uv",TEXCOORD_1:"uv1",TEXCOORD_2:"uv2",TEXCOORD_3:"uv3",COLOR_0:"color",WEIGHTS_0:"skinWeight",JOINTS_0:"skinIndex"},PATH_PROPERTIES={scale:"scale",translation:"position",rotation:"quaternion",weights:"morphTargetInfluences"},INTERPOLATION={CUBICSPLINE:void 0,LINEAR:InterpolateLinear,STEP:InterpolateDiscrete};function addUnknownExtensionsToUserData(e,t,n){for(const r in n.extensions)void 0===e[r]&&(t.userData.gltfExtensions=t.userData.gltfExtensions||{},t.userData.gltfExtensions[r]=n.extensions[r])}function assignExtrasToUserData(e,t){void 0!==t.extras&&("object"==typeof t.extras?Object.assign(e.userData,t.extras):console.warn("THREE.GLTFLoader: Ignoring primitive type .extras, "+t.extras))}function updateMorphTargets(e,t){if(e.updateMorphTargets(),void 0!==t.weights)for(let n=0,r=t.weights.length;n<r;n++)e.morphTargetInfluences[n]=t.weights[n];if(t.extras&&Array.isArray(t.extras.targetNames)){const n=t.extras.targetNames;if(e.morphTargetInfluences.length===n.length){e.morphTargetDictionary={};for(let t=0,r=n.length;t<r;t++)e.morphTargetDictionary[n[t]]=t}else console.warn("THREE.GLTFLoader: Invalid extras.targetNames length. Ignoring names.")}}function createPrimitiveKey(e){let t;const n=e.extensions&&e.extensions[EXTENSIONS.KHR_DRACO_MESH_COMPRESSION];if(t=n?"draco:"+n.bufferView+":"+n.indices+":"+createAttributesKey(n.attributes):e.indices+":"+createAttributesKey(e.attributes)+":"+e.mode,void 0!==e.targets)for(let n=0,r=e.targets.length;n<r;n++)t+=":"+createAttributesKey(e.targets[n]);return t}function createAttributesKey(e){let t="";const n=Object.keys(e).sort();for(let r=0,a=n.length;r<a;r++)t+=n[r]+":"+e[n[r]]+";";return t}function getNormalizedComponentScale(e){switch(e){case Int8Array:return 1/127;case Uint8Array:return 1/255;case Int16Array:return 1/32767;case Uint16Array:return 1/65535;default:throw new Error("THREE.GLTFLoader: Unsupported normalized accessor component type.")}}const _identityMatrix=new Matrix4;class GLTFParser{constructor(e={},t={}){this.json=e,this.extensions={},this.plugins={},this.options=t,this.cache=new GLTFRegistry,this.associations=new Map,this.primitiveCache={},this.nodeCache={},this.meshCache={refs:{},uses:{}},this.cameraCache={refs:{},uses:{}},this.lightCache={refs:{},uses:{}},this.sourceCache={},this.textureCache={},this.nodeNamesUsed={};let n=!1,r=!1,a=-1;"undefined"!=typeof navigator&&(n=!0===/^((?!chrome|android).)*safari/i.test(navigator.userAgent),r=navigator.userAgent.indexOf("Firefox")>-1,a=r?navigator.userAgent.match(/Firefox\/([0-9]+)\./)[1]:-1),"undefined"==typeof createImageBitmap||n||r&&a<98?this.textureLoader=new TextureLoader(this.options.manager):this.textureLoader=new ImageBitmapLoader(this.options.manager),this.textureLoader.setCrossOrigin(this.options.crossOrigin),this.textureLoader.setRequestHeader(this.options.requestHeader),this.fileLoader=new FileLoader(this.options.manager),this.fileLoader.setResponseType("arraybuffer"),"use-credentials"===this.options.crossOrigin&&this.fileLoader.setWithCredentials(!0)}setExtensions(e){this.extensions=e}setPlugins(e){this.plugins=e}parse(e,t){const n=this,r=this.json,a=this.extensions;this.cache.removeAll(),this.nodeCache={},this._invokeAll((function(e){return e._markDefs&&e._markDefs()})),Promise.all(this._invokeAll((function(e){return e.beforeRoot&&e.beforeRoot()}))).then((function(){return Promise.all([n.getDependencies("scene"),n.getDependencies("animation"),n.getDependencies("camera")])})).then((function(t){const i={scene:t[0][r.scene||0],scenes:t[0],animations:t[1],cameras:t[2],asset:r.asset,parser:n,userData:{}};addUnknownExtensionsToUserData(a,i,r),assignExtrasToUserData(i,r),Promise.all(n._invokeAll((function(e){return e.afterRoot&&e.afterRoot(i)}))).then((function(){e(i)}))})).catch(t)}_markDefs(){const e=this.json.nodes||[],t=this.json.skins||[],n=this.json.meshes||[];for(let n=0,r=t.length;n<r;n++){const r=t[n].joints;for(let t=0,n=r.length;t<n;t++)e[r[t]].isBone=!0}for(let t=0,r=e.length;t<r;t++){const r=e[t];void 0!==r.mesh&&(this._addNodeRef(this.meshCache,r.mesh),void 0!==r.skin&&(n[r.mesh].isSkinnedMesh=!0)),void 0!==r.camera&&this._addNodeRef(this.cameraCache,r.camera)}}_addNodeRef(e,t){void 0!==t&&(void 0===e.refs[t]&&(e.refs[t]=e.uses[t]=0),e.refs[t]++)}_getNodeRef(e,t,n){if(e.refs[t]<=1)return n;const r=n.clone(),a=(e,t)=>{const n=this.associations.get(e);null!=n&&this.associations.set(t,n);for(const[n,r]of e.children.entries())a(r,t.children[n])};return a(n,r),r.name+="_instance_"+e.uses[t]++,r}_invokeOne(e){const t=Object.values(this.plugins);t.push(this);for(let n=0;n<t.length;n++){const r=e(t[n]);if(r)return r}return null}_invokeAll(e){const t=Object.values(this.plugins);t.unshift(this);const n=[];for(let r=0;r<t.length;r++){const a=e(t[r]);a&&n.push(a)}return n}getDependency(e,t){const n=e+":"+t;let r=this.cache.get(n);if(!r){switch(e){case"scene":r=this.loadScene(t);break;case"node":r=this._invokeOne((function(e){return e.loadNode&&e.loadNode(t)}));break;case"mesh":r=this._invokeOne((function(e){return e.loadMesh&&e.loadMesh(t)}));break;case"accessor":r=this.loadAccessor(t);break;case"bufferView":r=this._invokeOne((function(e){return e.loadBufferView&&e.loadBufferView(t)}));break;case"buffer":r=this.loadBuffer(t);break;case"material":r=this._invokeOne((function(e){return e.loadMaterial&&e.loadMaterial(t)}));break;case"texture":r=this._invokeOne((function(e){return e.loadTexture&&e.loadTexture(t)}));break;case"skin":r=this.loadSkin(t);break;case"animation":r=this._invokeOne((function(e){return e.loadAnimation&&e.loadAnimation(t)}));break;case"camera":r=this.loadCamera(t);break;default:if(r=this._invokeOne((function(n){return n!=this&&n.getDependency&&n.getDependency(e,t)})),!r)throw new Error("Unknown type: "+e)}this.cache.add(n,r)}return r}getDependencies(e){let t=this.cache.get(e);if(!t){const n=this,r=this.json[e+("mesh"===e?"es":"s")]||[];t=Promise.all(r.map((function(t,r){return n.getDependency(e,r)}))),this.cache.add(e,t)}return t}loadBuffer(e){const t=this.json.buffers[e],n=this.fileLoader;if(t.type&&"arraybuffer"!==t.type)throw new Error("THREE.GLTFLoader: "+t.type+" buffer type is not supported.");if(void 0===t.uri&&0===e)return Promise.resolve(this.extensions[EXTENSIONS.KHR_BINARY_GLTF].body);const r=this.options;return new Promise((function(e,a){n.load(LoaderUtils.resolveURL(t.uri,r.path),e,void 0,(function(){a(new Error('THREE.GLTFLoader: Failed to load buffer "'+t.uri+'".'))}))}))}loadBufferView(e){const t=this.json.bufferViews[e];return this.getDependency("buffer",t.buffer).then((function(e){const n=t.byteLength||0,r=t.byteOffset||0;return e.slice(r,r+n)}))}loadAccessor(e){const t=this,n=this.json,r=this.json.accessors[e];if(void 0===r.bufferView&&void 0===r.sparse){const e=WEBGL_TYPE_SIZES[r.type],t=WEBGL_COMPONENT_TYPES[r.componentType],n=!0===r.normalized,a=new t(r.count*e);return Promise.resolve(new BufferAttribute(a,e,n))}const a=[];return void 0!==r.bufferView?a.push(this.getDependency("bufferView",r.bufferView)):a.push(null),void 0!==r.sparse&&(a.push(this.getDependency("bufferView",r.sparse.indices.bufferView)),a.push(this.getDependency("bufferView",r.sparse.values.bufferView))),Promise.all(a).then((function(e){const a=e[0],i=WEBGL_TYPE_SIZES[r.type],s=WEBGL_COMPONENT_TYPES[r.componentType],o=s.BYTES_PER_ELEMENT,l=o*i,d=r.byteOffset||0,h=void 0!==r.bufferView?n.bufferViews[r.bufferView].byteStride:void 0,c=!0===r.normalized;let u,p;if(h&&h!==l){const e=Math.floor(d/h),n="InterleavedBuffer:"+r.bufferView+":"+r.componentType+":"+e+":"+r.count;let l=t.cache.get(n);l||(u=new s(a,e*h,r.count*h/o),l=new InterleavedBuffer(u,h/o),t.cache.add(n,l)),p=new InterleavedBufferAttribute(l,i,d%h/o,c)}else u=null===a?new s(r.count*i):new s(a,d,r.count*i),p=new BufferAttribute(u,i,c);if(void 0!==r.sparse){const t=WEBGL_TYPE_SIZES.SCALAR,n=WEBGL_COMPONENT_TYPES[r.sparse.indices.componentType],o=r.sparse.indices.byteOffset||0,l=r.sparse.values.byteOffset||0,d=new n(e[1],o,r.sparse.count*t),h=new s(e[2],l,r.sparse.count*i);null!==a&&(p=new BufferAttribute(p.array.slice(),p.itemSize,p.normalized));for(let e=0,t=d.length;e<t;e++){const t=d[e];if(p.setX(t,h[e*i]),i>=2&&p.setY(t,h[e*i+1]),i>=3&&p.setZ(t,h[e*i+2]),i>=4&&p.setW(t,h[e*i+3]),i>=5)throw new Error("THREE.GLTFLoader: Unsupported itemSize in sparse BufferAttribute.")}}return p}))}loadTexture(e){const t=this.json,n=this.options,r=t.textures[e].source,a=t.images[r];let i=this.textureLoader;if(a.uri){const e=n.manager.getHandler(a.uri);null!==e&&(i=e)}return this.loadTextureImage(e,r,i)}loadTextureImage(e,t,n){const r=this,a=this.json,i=a.textures[e],s=a.images[t],o=(s.uri||s.bufferView)+":"+i.sampler;if(this.textureCache[o])return this.textureCache[o];const l=this.loadImageSource(t,n).then((function(t){t.flipY=!1,t.name=i.name||s.name||"",""===t.name&&"string"==typeof s.uri&&!1===s.uri.startsWith("data:image/")&&(t.name=s.uri);const n=(a.samplers||{})[i.sampler]||{};return t.magFilter=WEBGL_FILTERS[n.magFilter]||LinearFilter,t.minFilter=WEBGL_FILTERS[n.minFilter]||LinearMipmapLinearFilter,t.wrapS=WEBGL_WRAPPINGS[n.wrapS]||RepeatWrapping,t.wrapT=WEBGL_WRAPPINGS[n.wrapT]||RepeatWrapping,r.associations.set(t,{textures:e}),t})).catch((function(){return null}));return this.textureCache[o]=l,l}loadImageSource(e,t){const n=this.json,r=this.options;if(void 0!==this.sourceCache[e])return this.sourceCache[e].then(e=>e.clone());const a=n.images[e],i=self.URL||self.webkitURL;let s=a.uri||"",o=!1;if(void 0!==a.bufferView)s=this.getDependency("bufferView",a.bufferView).then((function(e){o=!0;const t=new Blob([e],{type:a.mimeType});return s=i.createObjectURL(t),s}));else if(void 0===a.uri)throw new Error("THREE.GLTFLoader: Image "+e+" is missing URI and bufferView");const l=Promise.resolve(s).then((function(e){return new Promise((function(n,a){let i=n;!0===t.isImageBitmapLoader&&(i=function(e){const t=new Texture(e);t.needsUpdate=!0,n(t)}),t.load(LoaderUtils.resolveURL(e,r.path),i,void 0,a)}))})).then((function(e){var t;return!0===o&&i.revokeObjectURL(s),e.userData.mimeType=a.mimeType||((t=a.uri).search(/\.jpe?g($|\?)/i)>0||0===t.search(/^data\:image\/jpeg/)?"image/jpeg":t.search(/\.webp($|\?)/i)>0||0===t.search(/^data\:image\/webp/)?"image/webp":"image/png"),e})).catch((function(e){throw console.error("THREE.GLTFLoader: Couldn't load texture",s),e}));return this.sourceCache[e]=l,l}assignTexture(e,t,n,r){const a=this;return this.getDependency("texture",n.index).then((function(i){if(!i)return null;if(void 0!==n.texCoord&&n.texCoord>0&&((i=i.clone()).channel=n.texCoord),a.extensions[EXTENSIONS.KHR_TEXTURE_TRANSFORM]){const e=void 0!==n.extensions?n.extensions[EXTENSIONS.KHR_TEXTURE_TRANSFORM]:void 0;if(e){const t=a.associations.get(i);i=a.extensions[EXTENSIONS.KHR_TEXTURE_TRANSFORM].extendTexture(i,e),a.associations.set(i,t)}}return void 0!==r&&(i.colorSpace=r),e[t]=i,i}))}assignFinalMaterial(e){const t=e.geometry;let n=e.material;const r=void 0===t.attributes.tangent,a=void 0!==t.attributes.color,i=void 0===t.attributes.normal;if(e.isPoints){const e="PointsMaterial:"+n.uuid;let t=this.cache.get(e);t||(t=new PointsMaterial,Material.prototype.copy.call(t,n),t.color.copy(n.color),t.map=n.map,t.sizeAttenuation=!1,this.cache.add(e,t)),n=t}else if(e.isLine){const e="LineBasicMaterial:"+n.uuid;let t=this.cache.get(e);t||(t=new LineBasicMaterial,Material.prototype.copy.call(t,n),t.color.copy(n.color),t.map=n.map,this.cache.add(e,t)),n=t}if(r||a||i){let e="ClonedMaterial:"+n.uuid+":";r&&(e+="derivative-tangents:"),a&&(e+="vertex-colors:"),i&&(e+="flat-shading:");let t=this.cache.get(e);t||(t=n.clone(),a&&(t.vertexColors=!0),i&&(t.flatShading=!0),r&&(t.normalScale&&(t.normalScale.y*=-1),t.clearcoatNormalScale&&(t.clearcoatNormalScale.y*=-1)),this.cache.add(e,t),this.associations.set(t,this.associations.get(n))),n=t}e.material=n}getMaterialType(){return MeshStandardMaterial}loadMaterial(e){const t=this,n=this.json,r=this.extensions,a=n.materials[e];let i;const s={},o=[];if((a.extensions||{})[EXTENSIONS.KHR_MATERIALS_UNLIT]){const e=r[EXTENSIONS.KHR_MATERIALS_UNLIT];i=e.getMaterialType(),o.push(e.extendParams(s,a,t))}else{const n=a.pbrMetallicRoughness||{};if(s.color=new Color$1(1,1,1),s.opacity=1,Array.isArray(n.baseColorFactor)){const e=n.baseColorFactor;s.color.fromArray(e),s.opacity=e[3]}void 0!==n.baseColorTexture&&o.push(t.assignTexture(s,"map",n.baseColorTexture,SRGBColorSpace)),s.metalness=void 0!==n.metallicFactor?n.metallicFactor:1,s.roughness=void 0!==n.roughnessFactor?n.roughnessFactor:1,void 0!==n.metallicRoughnessTexture&&(o.push(t.assignTexture(s,"metalnessMap",n.metallicRoughnessTexture)),o.push(t.assignTexture(s,"roughnessMap",n.metallicRoughnessTexture))),i=this._invokeOne((function(t){return t.getMaterialType&&t.getMaterialType(e)})),o.push(Promise.all(this._invokeAll((function(t){return t.extendMaterialParams&&t.extendMaterialParams(e,s)}))))}!0===a.doubleSided&&(s.side=DoubleSide);const l=a.alphaMode||"OPAQUE";if("BLEND"===l?(s.transparent=!0,s.depthWrite=!1):(s.transparent=!1,"MASK"===l&&(s.alphaTest=void 0!==a.alphaCutoff?a.alphaCutoff:.5)),void 0!==a.normalTexture&&i!==MeshBasicMaterial&&(o.push(t.assignTexture(s,"normalMap",a.normalTexture)),s.normalScale=new Vector2(1,1),void 0!==a.normalTexture.scale)){const e=a.normalTexture.scale;s.normalScale.set(e,e)}return void 0!==a.occlusionTexture&&i!==MeshBasicMaterial&&(o.push(t.assignTexture(s,"aoMap",a.occlusionTexture)),void 0!==a.occlusionTexture.strength&&(s.aoMapIntensity=a.occlusionTexture.strength)),void 0!==a.emissiveFactor&&i!==MeshBasicMaterial&&(s.emissive=(new Color$1).fromArray(a.emissiveFactor)),void 0!==a.emissiveTexture&&i!==MeshBasicMaterial&&o.push(t.assignTexture(s,"emissiveMap",a.emissiveTexture,SRGBColorSpace)),Promise.all(o).then((function(){const n=new i(s);return a.name&&(n.name=a.name),assignExtrasToUserData(n,a),t.associations.set(n,{materials:e}),a.extensions&&addUnknownExtensionsToUserData(r,n,a),n}))}createUniqueName(e){const t=PropertyBinding.sanitizeNodeName(e||"");return t in this.nodeNamesUsed?t+"_"+ ++this.nodeNamesUsed[t]:(this.nodeNamesUsed[t]=0,t)}loadGeometries(e){const t=this,n=this.extensions,r=this.primitiveCache;function a(e){return n[EXTENSIONS.KHR_DRACO_MESH_COMPRESSION].decodePrimitive(e,t).then((function(n){return addPrimitiveAttributes(n,e,t)}))}const i=[];for(let n=0,s=e.length;n<s;n++){const s=e[n],o=createPrimitiveKey(s),l=r[o];if(l)i.push(l.promise);else{let e;e=s.extensions&&s.extensions[EXTENSIONS.KHR_DRACO_MESH_COMPRESSION]?a(s):addPrimitiveAttributes(new BufferGeometry,s,t),r[o]={primitive:s,promise:e},i.push(e)}}return Promise.all(i)}loadMesh(e){const t=this,n=this.json,r=this.extensions,a=n.meshes[e],i=a.primitives,s=[];for(let e=0,t=i.length;e<t;e++){const t=void 0===i[e].material?(void 0===(o=this.cache).DefaultMaterial&&(o.DefaultMaterial=new MeshStandardMaterial({color:16777215,emissive:0,metalness:1,roughness:1,transparent:!1,depthTest:!0,side:FrontSide})),o.DefaultMaterial):this.getDependency("material",i[e].material);s.push(t)}var o;return s.push(t.loadGeometries(i)),Promise.all(s).then((function(n){const s=n.slice(0,n.length-1),o=n[n.length-1],l=[];for(let n=0,d=o.length;n<d;n++){const d=o[n],h=i[n];let c;const u=s[n];if(h.mode===WEBGL_CONSTANTS.TRIANGLES||h.mode===WEBGL_CONSTANTS.TRIANGLE_STRIP||h.mode===WEBGL_CONSTANTS.TRIANGLE_FAN||void 0===h.mode)c=!0===a.isSkinnedMesh?new SkinnedMesh(d,u):new Mesh(d,u),!0===c.isSkinnedMesh&&c.normalizeSkinWeights(),h.mode===WEBGL_CONSTANTS.TRIANGLE_STRIP?c.geometry=toTrianglesDrawMode(c.geometry,TriangleStripDrawMode):h.mode===WEBGL_CONSTANTS.TRIANGLE_FAN&&(c.geometry=toTrianglesDrawMode(c.geometry,TriangleFanDrawMode));else if(h.mode===WEBGL_CONSTANTS.LINES)c=new LineSegments(d,u);else if(h.mode===WEBGL_CONSTANTS.LINE_STRIP)c=new Line(d,u);else if(h.mode===WEBGL_CONSTANTS.LINE_LOOP)c=new LineLoop(d,u);else{if(h.mode!==WEBGL_CONSTANTS.POINTS)throw new Error("THREE.GLTFLoader: Primitive mode unsupported: "+h.mode);c=new Points(d,u)}Object.keys(c.geometry.morphAttributes).length>0&&updateMorphTargets(c,a),c.name=t.createUniqueName(a.name||"mesh_"+e),assignExtrasToUserData(c,a),h.extensions&&addUnknownExtensionsToUserData(r,c,h),t.assignFinalMaterial(c),l.push(c)}for(let n=0,r=l.length;n<r;n++)t.associations.set(l[n],{meshes:e,primitives:n});if(1===l.length)return a.extensions&&addUnknownExtensionsToUserData(r,l[0],a),l[0];const d=new Group;a.extensions&&addUnknownExtensionsToUserData(r,d,a),t.associations.set(d,{meshes:e});for(let e=0,t=l.length;e<t;e++)d.add(l[e]);return d}))}loadCamera(e){let t;const n=this.json.cameras[e],r=n[n.type];if(r)return"perspective"===n.type?t=new PerspectiveCamera(MathUtils.radToDeg(r.yfov),r.aspectRatio||1,r.znear||1,r.zfar||2e6):"orthographic"===n.type&&(t=new OrthographicCamera(-r.xmag,r.xmag,r.ymag,-r.ymag,r.znear,r.zfar)),n.name&&(t.name=this.createUniqueName(n.name)),assignExtrasToUserData(t,n),Promise.resolve(t);console.warn("THREE.GLTFLoader: Missing camera parameters.")}loadSkin(e){const t=this.json.skins[e],n=[];for(let e=0,r=t.joints.length;e<r;e++)n.push(this._loadNodeShallow(t.joints[e]));return void 0!==t.inverseBindMatrices?n.push(this.getDependency("accessor",t.inverseBindMatrices)):n.push(null),Promise.all(n).then((function(e){const n=e.pop(),r=e,a=[],i=[];for(let e=0,s=r.length;e<s;e++){const s=r[e];if(s){a.push(s);const t=new Matrix4;null!==n&&t.fromArray(n.array,16*e),i.push(t)}else console.warn('THREE.GLTFLoader: Joint "%s" could not be found.',t.joints[e])}return new Skeleton(a,i)}))}loadAnimation(e){const t=this.json,n=this,r=t.animations[e],a=r.name?r.name:"animation_"+e,i=[],s=[],o=[],l=[],d=[];for(let e=0,t=r.channels.length;e<t;e++){const t=r.channels[e],n=r.samplers[t.sampler],a=t.target,h=a.node,c=void 0!==r.parameters?r.parameters[n.input]:n.input,u=void 0!==r.parameters?r.parameters[n.output]:n.output;void 0!==a.node&&(i.push(this.getDependency("node",h)),s.push(this.getDependency("accessor",c)),o.push(this.getDependency("accessor",u)),l.push(n),d.push(a))}return Promise.all([Promise.all(i),Promise.all(s),Promise.all(o),Promise.all(l),Promise.all(d)]).then((function(e){const t=e[0],r=e[1],i=e[2],s=e[3],o=e[4],l=[];for(let e=0,a=t.length;e<a;e++){const a=t[e],d=r[e],h=i[e],c=s[e],u=o[e];if(void 0===a)continue;a.updateMatrix&&a.updateMatrix();const p=n._createAnimationTracks(a,d,h,c,u);if(p)for(let e=0;e<p.length;e++)l.push(p[e])}return new AnimationClip(a,void 0,l)}))}createNodeMesh(e){const t=this.json,n=this,r=t.nodes[e];return void 0===r.mesh?null:n.getDependency("mesh",r.mesh).then((function(e){const t=n._getNodeRef(n.meshCache,r.mesh,e);return void 0!==r.weights&&t.traverse((function(e){if(e.isMesh)for(let t=0,n=r.weights.length;t<n;t++)e.morphTargetInfluences[t]=r.weights[t]})),t}))}loadNode(e){const t=this,n=this.json.nodes[e],r=t._loadNodeShallow(e),a=[],i=n.children||[];for(let e=0,n=i.length;e<n;e++)a.push(t.getDependency("node",i[e]));const s=void 0===n.skin?Promise.resolve(null):t.getDependency("skin",n.skin);return Promise.all([r,Promise.all(a),s]).then((function(e){const t=e[0],n=e[1],r=e[2];null!==r&&t.traverse((function(e){e.isSkinnedMesh&&e.bind(r,_identityMatrix)}));for(let e=0,r=n.length;e<r;e++)t.add(n[e]);return t}))}_loadNodeShallow(e){const t=this.json,n=this.extensions,r=this;if(void 0!==this.nodeCache[e])return this.nodeCache[e];const a=t.nodes[e],i=a.name?r.createUniqueName(a.name):"",s=[],o=r._invokeOne((function(t){return t.createNodeMesh&&t.createNodeMesh(e)}));return o&&s.push(o),void 0!==a.camera&&s.push(r.getDependency("camera",a.camera).then((function(e){return r._getNodeRef(r.cameraCache,a.camera,e)}))),r._invokeAll((function(t){return t.createNodeAttachment&&t.createNodeAttachment(e)})).forEach((function(e){s.push(e)})),this.nodeCache[e]=Promise.all(s).then((function(t){let s;if(s=!0===a.isBone?new Bone:t.length>1?new Group:1===t.length?t[0]:new Object3D,s!==t[0])for(let e=0,n=t.length;e<n;e++)s.add(t[e]);if(a.name&&(s.userData.name=a.name,s.name=i),assignExtrasToUserData(s,a),a.extensions&&addUnknownExtensionsToUserData(n,s,a),void 0!==a.matrix){const e=new Matrix4;e.fromArray(a.matrix),s.applyMatrix4(e)}else void 0!==a.translation&&s.position.fromArray(a.translation),void 0!==a.rotation&&s.quaternion.fromArray(a.rotation),void 0!==a.scale&&s.scale.fromArray(a.scale);return r.associations.has(s)||r.associations.set(s,{}),r.associations.get(s).nodes=e,s})),this.nodeCache[e]}loadScene(e){const t=this.extensions,n=this.json.scenes[e],r=this,a=new Group;n.name&&(a.name=r.createUniqueName(n.name)),assignExtrasToUserData(a,n),n.extensions&&addUnknownExtensionsToUserData(t,a,n);const i=n.nodes||[],s=[];for(let e=0,t=i.length;e<t;e++)s.push(r.getDependency("node",i[e]));return Promise.all(s).then((function(e){for(let t=0,n=e.length;t<n;t++)a.add(e[t]);return r.associations=(e=>{const t=new Map;for(const[e,n]of r.associations)(e instanceof Material||e instanceof Texture)&&t.set(e,n);return e.traverse(e=>{const n=r.associations.get(e);null!=n&&t.set(e,n)}),t})(a),a}))}_createAnimationTracks(e,t,n,r,a){const i=[],s=e.name?e.name:e.uuid,o=[];let l;switch(PATH_PROPERTIES[a.path]===PATH_PROPERTIES.weights?e.traverse((function(e){e.morphTargetInfluences&&o.push(e.name?e.name:e.uuid)})):o.push(s),PATH_PROPERTIES[a.path]){case PATH_PROPERTIES.weights:l=NumberKeyframeTrack;break;case PATH_PROPERTIES.rotation:l=QuaternionKeyframeTrack;break;case PATH_PROPERTIES.position:case PATH_PROPERTIES.scale:l=VectorKeyframeTrack;break;default:switch(n.itemSize){case 1:l=NumberKeyframeTrack;break;case 2:case 3:default:l=VectorKeyframeTrack}}const d=void 0!==r.interpolation?INTERPOLATION[r.interpolation]:InterpolateLinear,h=this._getArrayFromAccessor(n);for(let e=0,n=o.length;e<n;e++){const n=new l(o[e]+"."+PATH_PROPERTIES[a.path],t.array,h,d);"CUBICSPLINE"===r.interpolation&&this._createCubicSplineTrackInterpolant(n),i.push(n)}return i}_getArrayFromAccessor(e){let t=e.array;if(e.normalized){const e=getNormalizedComponentScale(t.constructor),n=new Float32Array(t.length);for(let r=0,a=t.length;r<a;r++)n[r]=t[r]*e;t=n}return t}_createCubicSplineTrackInterpolant(e){e.createInterpolant=function(e){return new(this instanceof QuaternionKeyframeTrack?GLTFCubicSplineQuaternionInterpolant:GLTFCubicSplineInterpolant)(this.times,this.values,this.getValueSize()/3,e)},e.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline=!0}}function addPrimitiveAttributes(e,t,n){const r=t.attributes,a=[];function i(t,r){return n.getDependency("accessor",t).then((function(t){e.setAttribute(r,t)}))}for(const t in r){const n=ATTRIBUTES[t]||t.toLowerCase();n in e.attributes||a.push(i(r[t],n))}if(void 0!==t.indices&&!e.index){const r=n.getDependency("accessor",t.indices).then((function(t){e.setIndex(t)}));a.push(r)}return assignExtrasToUserData(e,t),function(e,t,n){const r=t.attributes,a=new Box3;if(void 0===r.POSITION)return;{const e=n.json.accessors[r.POSITION],t=e.min,i=e.max;if(void 0===t||void 0===i)return void console.warn("THREE.GLTFLoader: Missing min/max properties for accessor POSITION.");if(a.set(new Vector3(t[0],t[1],t[2]),new Vector3(i[0],i[1],i[2])),e.normalized){const t=getNormalizedComponentScale(WEBGL_COMPONENT_TYPES[e.componentType]);a.min.multiplyScalar(t),a.max.multiplyScalar(t)}}const i=t.targets;if(void 0!==i){const e=new Vector3,t=new Vector3;for(let r=0,a=i.length;r<a;r++){const a=i[r];if(void 0!==a.POSITION){const r=n.json.accessors[a.POSITION],i=r.min,s=r.max;if(void 0!==i&&void 0!==s){if(t.setX(Math.max(Math.abs(i[0]),Math.abs(s[0]))),t.setY(Math.max(Math.abs(i[1]),Math.abs(s[1]))),t.setZ(Math.max(Math.abs(i[2]),Math.abs(s[2]))),r.normalized){const e=getNormalizedComponentScale(WEBGL_COMPONENT_TYPES[r.componentType]);t.multiplyScalar(e)}e.max(t)}else console.warn("THREE.GLTFLoader: Missing min/max properties for accessor POSITION.")}}a.expandByVector(e)}e.boundingBox=a;const s=new Sphere;a.getCenter(s.center),s.radius=a.min.distanceTo(a.max)/2,e.boundingSphere=s}(e,t,n),Promise.all(a).then((function(){return void 0!==t.targets?function(e,t,n){let r=!1,a=!1,i=!1;for(let e=0,n=t.length;e<n;e++){const n=t[e];if(void 0!==n.POSITION&&(r=!0),void 0!==n.NORMAL&&(a=!0),void 0!==n.COLOR_0&&(i=!0),r&&a&&i)break}if(!r&&!a&&!i)return Promise.resolve(e);const s=[],o=[],l=[];for(let d=0,h=t.length;d<h;d++){const h=t[d];if(r){const t=void 0!==h.POSITION?n.getDependency("accessor",h.POSITION):e.attributes.position;s.push(t)}if(a){const t=void 0!==h.NORMAL?n.getDependency("accessor",h.NORMAL):e.attributes.normal;o.push(t)}if(i){const t=void 0!==h.COLOR_0?n.getDependency("accessor",h.COLOR_0):e.attributes.color;l.push(t)}}return Promise.all([Promise.all(s),Promise.all(o),Promise.all(l)]).then((function(t){const n=t[0],s=t[1],o=t[2];return r&&(e.morphAttributes.position=n),a&&(e.morphAttributes.normal=s),i&&(e.morphAttributes.color=o),e.morphTargetsRelative=!0,e}))}(e,t.targets,n):e}))}const _taskCache=new WeakMap;class DRACOLoader extends Loader{constructor(e){super(e),this.decoderPath="",this.decoderConfig={},this.decoderBinary=null,this.decoderPending=null,this.workerLimit=4,this.workerPool=[],this.workerNextTaskID=1,this.workerSourceURL="",this.defaultAttributeIDs={position:"POSITION",normal:"NORMAL",color:"COLOR",uv:"TEX_COORD"},this.defaultAttributeTypes={position:"Float32Array",normal:"Float32Array",color:"Float32Array",uv:"Float32Array"}}setDecoderPath(e){return this.decoderPath=e,this}setDecoderConfig(e){return this.decoderConfig=e,this}setWorkerLimit(e){return this.workerLimit=e,this}load(e,t,n,r){const a=new FileLoader(this.manager);a.setPath(this.path),a.setResponseType("arraybuffer"),a.setRequestHeader(this.requestHeader),a.setWithCredentials(this.withCredentials),a.load(e,e=>{this.parse(e,t,r)},n,r)}parse(e,t,n){this.decodeDracoFile(e,t,null,null,SRGBColorSpace).catch(n)}decodeDracoFile(e,t,n,r,a=LinearSRGBColorSpace){const i={attributeIDs:n||this.defaultAttributeIDs,attributeTypes:r||this.defaultAttributeTypes,useUniqueIDs:!!n,vertexColorSpace:a};return this.decodeGeometry(e,i).then(t)}decodeGeometry(e,t){const n=JSON.stringify(t);if(_taskCache.has(e)){const t=_taskCache.get(e);if(t.key===n)return t.promise;if(0===e.byteLength)throw new Error("THREE.DRACOLoader: Unable to re-decode a buffer with different settings. Buffer has already been transferred.")}let r;const a=this.workerNextTaskID++,i=e.byteLength,s=this._getWorker(a,i).then(n=>(r=n,new Promise((n,i)=>{r._callbacks[a]={resolve:n,reject:i},r.postMessage({type:"decode",id:a,taskConfig:t,buffer:e},[e])}))).then(e=>this._createGeometry(e.geometry));return s.catch(()=>!0).then(()=>{r&&a&&this._releaseTask(r,a)}),_taskCache.set(e,{key:n,promise:s}),s}_createGeometry(e){const t=new BufferGeometry;e.index&&t.setIndex(new BufferAttribute(e.index.array,1));for(let n=0;n<e.attributes.length;n++){const r=e.attributes[n],a=r.name,i=r.array,s=r.itemSize,o=new BufferAttribute(i,s);"color"===a&&(this._assignVertexColorSpace(o,r.vertexColorSpace),o.normalized=i instanceof Float32Array==0),t.setAttribute(a,o)}return t}_assignVertexColorSpace(e,t){if(t!==SRGBColorSpace)return;const n=new Color$1;for(let t=0,r=e.count;t<r;t++)n.fromBufferAttribute(e,t).convertSRGBToLinear(),e.setXYZ(t,n.r,n.g,n.b)}_loadLibrary(e,t){const n=new FileLoader(this.manager);return n.setPath(this.decoderPath),n.setResponseType(t),n.setWithCredentials(this.withCredentials),new Promise((t,r)=>{n.load(e,t,void 0,r)})}preload(){return this._initDecoder(),this}_initDecoder(){if(this.decoderPending)return this.decoderPending;const e="object"!=typeof WebAssembly||"js"===this.decoderConfig.type,t=[];return e?t.push(this._loadLibrary("draco_decoder.js","text")):(t.push(this._loadLibrary("draco_wasm_wrapper.js","text")),t.push(this._loadLibrary("draco_decoder.wasm","arraybuffer"))),this.decoderPending=Promise.all(t).then(t=>{const n=t[0];e||(this.decoderConfig.wasmBinary=t[1]);const r=DRACOWorker.toString(),a=["/* draco decoder */",n,"","/* worker */",r.substring(r.indexOf("{")+1,r.lastIndexOf("}"))].join("\n");this.workerSourceURL=URL.createObjectURL(new Blob([a]))}),this.decoderPending}_getWorker(e,t){return this._initDecoder().then(()=>{if(this.workerPool.length<this.workerLimit){const e=new Worker(this.workerSourceURL);e._callbacks={},e._taskCosts={},e._taskLoad=0,e.postMessage({type:"init",decoderConfig:this.decoderConfig}),e.onmessage=function(t){const n=t.data;switch(n.type){case"decode":e._callbacks[n.id].resolve(n);break;case"error":e._callbacks[n.id].reject(n);break;default:console.error('THREE.DRACOLoader: Unexpected message, "'+n.type+'"')}},this.workerPool.push(e)}else this.workerPool.sort((function(e,t){return e._taskLoad>t._taskLoad?-1:1}));const n=this.workerPool[this.workerPool.length-1];return n._taskCosts[e]=t,n._taskLoad+=t,n})}_releaseTask(e,t){e._taskLoad-=e._taskCosts[t],delete e._callbacks[t],delete e._taskCosts[t]}debug(){this.workerPool.map(e=>e._taskLoad)}dispose(){for(let e=0;e<this.workerPool.length;++e)this.workerPool[e].terminate();return this.workerPool.length=0,""!==this.workerSourceURL&&URL.revokeObjectURL(this.workerSourceURL),this}}function DRACOWorker(){let e,t;function n(e,t,n,r,a,i){const s=i.num_components(),o=n.num_points()*s,l=o*a.BYTES_PER_ELEMENT,d=function(e,t){switch(t){case Float32Array:return e.DT_FLOAT32;case Int8Array:return e.DT_INT8;case Int16Array:return e.DT_INT16;case Int32Array:return e.DT_INT32;case Uint8Array:return e.DT_UINT8;case Uint16Array:return e.DT_UINT16;case Uint32Array:return e.DT_UINT32}}(e,a),h=e._malloc(l);t.GetAttributeDataArrayForAllPoints(n,i,d,l,h);const c=new a(e.HEAPF32.buffer,h,o).slice();return e._free(h),{name:r,array:c,itemSize:s}}onmessage=function(r){const a=r.data;switch(a.type){case"init":e=a.decoderConfig,t=new Promise((function(t){e.onModuleLoaded=function(e){t({draco:e})},DracoDecoderModule(e)}));break;case"decode":const r=a.buffer,i=a.taskConfig;t.then(e=>{const t=e.draco,s=new t.Decoder;try{const e=function(e,t,r,a){const i=a.attributeIDs,s=a.attributeTypes;let o,l;const d=t.GetEncodedGeometryType(r);if(d===e.TRIANGULAR_MESH)o=new e.Mesh,l=t.DecodeArrayToMesh(r,r.byteLength,o);else{if(d!==e.POINT_CLOUD)throw new Error("THREE.DRACOLoader: Unexpected geometry type.");o=new e.PointCloud,l=t.DecodeArrayToPointCloud(r,r.byteLength,o)}if(!l.ok()||0===o.ptr)throw new Error("THREE.DRACOLoader: Decoding failed: "+l.error_msg());const h={index:null,attributes:[]};for(const r in i){const l=self[s[r]];let d,c;if(a.useUniqueIDs)c=i[r],d=t.GetAttributeByUniqueId(o,c);else{if(c=t.GetAttributeId(o,e[i[r]]),-1===c)continue;d=t.GetAttribute(o,c)}const u=n(e,t,o,r,l,d);"color"===r&&(u.vertexColorSpace=a.vertexColorSpace),h.attributes.push(u)}return d===e.TRIANGULAR_MESH&&(h.index=function(e,t,n){const r=3*n.num_faces(),a=4*r,i=e._malloc(a);t.GetTrianglesUInt32Array(n,a,i);const s=new Uint32Array(e.HEAPF32.buffer,i,r).slice();return e._free(i),{array:s,itemSize:1}}(e,t,o)),e.destroy(o),h}(t,s,new Int8Array(r),i),o=e.attributes.map(e=>e.array.buffer);e.index&&o.push(e.index.array.buffer),self.postMessage({type:"decode",id:a.id,geometry:e},o)}catch(e){console.error(e),self.postMessage({type:"error",id:a.id,error:e.message})}finally{t.destroy(s)}})}}}const DRACO_LIB_FILES={"draco_wasm_wrapper.js":"static/draco_wasm_wrapper-6263f3a4b71cdf3b.js","draco_decoder.wasm":"static/draco_decoder-b048235474cbf09e.wasm","draco_decoder.js":"static/draco_decoder-dc7f397e2a2ebac4.js"};class LocalStorageHelper{constructor(e){this._context_=e}getStore(e="rml_default"){return this._localStorage.getItem(e)||{entries:[]}}saveStore(e,t){this._localStorage.setItem(e,t)}addItem(e,t,n="rml_default",r=5){const a=this.getStore(n),i=a.entries.find(t=>t.id===e);if(i?(i.payload=t,i.date=Date.now()):a.entries.push({id:e,date:Date.now(),payload:t}),a.entries.length>r)for(a.entries.sort((e,t)=>t.date-e.date);a.entries.length>r;)a.entries.pop();this.saveStore(n,a)}getItem(e,t="rml_default"){const n=this.getStore(t).entries.find(t=>t.id===e);return n?n.payload:null}}__decorate([inject],LocalStorageHelper.prototype,"_localStorage",void 0);const toRadiant=function(e){return e*(Math.PI/180)},toDegrees=function(e){return e*(180/Math.PI)},getIdealDistance=function(e,t,n,r,a,i){e=Math.sqrt(e*e+n*n);const s=a/i,o=2*Math.atan(Math.tan(r*Math.PI/180/2)*s)*180/Math.PI,l=toRadiant(r),d=t/2/Math.tan(l/2),h=e/(2*Math.atan(Math.PI*o/360));return Math.max(d,h)},round=function(e){return Math.round(1e3*e)/1e3},getDelta=function(e,t){return Math.abs(e.y-t.y)+Math.abs(e.x-t.x)},convertToTHREE=e=>new Vector3(e.x/1e3,e.z/1e3,e.y/-1e3),convertToThreeDimensions=e=>new Vector3(e.x/1e3,e.z/1e3,e.y/1e3),convertToKernel=e=>({x:Math.round(1e3*e.x),y:Math.round(-1e3*e.z),z:Math.round(1e3*e.y)}),utilityStringToUTF16=e=>decodeURIComponent(encodeURIComponent(e)),convertCObject=e=>{if(!e){const t=typeof e;return"number"===t||"boolean"===t?e:null}if(!e.hasOwnProperty("size")&&e.size&&"function"==typeof e.size){let t=utilityToArray(e);for(let e=0;e<t.length;e++)t[e]=convertCObject(t[e]);return"string"==typeof t?utilityStringToUTF16(t):t}if("object"==typeof e)for(let t in e)e.hasOwnProperty(t)&&(e[t]=convertCObject(e[t]));return"string"==typeof e?utilityStringToUTF16(e):e},utilityToArray=e=>{let t=[];if(e){let n=e.size();for(let r=0;r<n;r++)t.push(e.get(r))}return t},convertToThreeMatrix=e=>{let t=new Matrix4,n=convertCObject(e);return t.fromArray(n),t.transpose(),(e=>{let t=new Matrix4;t.set(1,0,0,0,0,0,1,0,0,-1,0,0,0,0,0,1),t.scale(new Vector3(.001,.001,.001));let n=new Matrix4;return n.set(1,0,0,0,0,0,-1,0,0,1,0,0,0,0,0,1),n.scale(new Vector3(1e3,1e3,1e3)),t.multiply(e).multiply(n)})(t)};function colorToString(e,t){var n=e.__state.conversionName.toString(),r=Math.round(e.r),a=Math.round(e.g),i=Math.round(e.b),s=e.a,o=Math.round(e.h),l=e.s.toFixed(1),d=e.v.toFixed(1);if(t||"THREE_CHAR_HEX"===n||"SIX_CHAR_HEX"===n){for(var h=e.hex.toString(16);h.length<6;)h="0"+h;return"#"+h}return"CSS_RGB"===n?"rgb("+r+","+a+","+i+")":"CSS_RGBA"===n?"rgba("+r+","+a+","+i+","+s+")":"HEX"===n?"0x"+e.hex.toString(16):"RGB_ARRAY"===n?"["+r+","+a+","+i+"]":"RGBA_ARRAY"===n?"["+r+","+a+","+i+","+s+"]":"RGB_OBJ"===n?"{r:"+r+",g:"+a+",b:"+i+"}":"RGBA_OBJ"===n?"{r:"+r+",g:"+a+",b:"+i+",a:"+s+"}":"HSV_OBJ"===n?"{h:"+o+",s:"+l+",v:"+d+"}":"HSVA_OBJ"===n?"{h:"+o+",s:"+l+",v:"+d+",a:"+s+"}":"unknown format"}var ARR_EACH=Array.prototype.forEach,ARR_SLICE=Array.prototype.slice,Common={BREAK:{},extend:function(e){return this.each(ARR_SLICE.call(arguments,1),(function(t){(this.isObject(t)?Object.keys(t):[]).forEach(function(n){this.isUndefined(t[n])||(e[n]=t[n])}.bind(this))}),this),e},defaults:function(e){return this.each(ARR_SLICE.call(arguments,1),(function(t){(this.isObject(t)?Object.keys(t):[]).forEach(function(n){this.isUndefined(e[n])&&(e[n]=t[n])}.bind(this))}),this),e},compose:function(){var e=ARR_SLICE.call(arguments);return function(){for(var t=ARR_SLICE.call(arguments),n=e.length-1;n>=0;n--)t=[e[n].apply(this,t)];return t[0]}},each:function(e,t,n){if(e)if(ARR_EACH&&e.forEach&&e.forEach===ARR_EACH)e.forEach(t,n);else if(e.length===e.length+0){var r,a=void 0;for(a=0,r=e.length;a<r;a++)if(a in e&&t.call(n,e[a],a)===this.BREAK)return}else for(var i in e)if(t.call(n,e[i],i)===this.BREAK)return},defer:function(e){setTimeout(e,0)},debounce:function(e,t,n){var r=void 0;return function(){var a=this,i=arguments;function s(){r=null,n||e.apply(a,i)}var o=n||!r;clearTimeout(r),r=setTimeout(s,t),o&&e.apply(a,i)}},toArray:function(e){return e.toArray?e.toArray():ARR_SLICE.call(e)},isUndefined:function(e){return void 0===e},isNull:function(e){return null===e},isNaN:function(e){function t(t){return e.apply(this,arguments)}return t.toString=function(){return e.toString()},t}((function(e){return isNaN(e)})),isArray:Array.isArray||function(e){return e.constructor===Array},isObject:function(e){return e===Object(e)},isNumber:function(e){return e===e+0},isString:function(e){return e===e+""},isBoolean:function(e){return!1===e||!0===e},isFunction:function(e){return e instanceof Function}},INTERPRETATIONS=[{litmus:Common.isString,conversions:{THREE_CHAR_HEX:{read:function(e){var t=e.match(/^#([A-F0-9])([A-F0-9])([A-F0-9])$/i);return null!==t&&{space:"HEX",hex:parseInt("0x"+t[1].toString()+t[1].toString()+t[2].toString()+t[2].toString()+t[3].toString()+t[3].toString(),0)}},write:colorToString},SIX_CHAR_HEX:{read:function(e){var t=e.match(/^#([A-F0-9]{6})$/i);return null!==t&&{space:"HEX",hex:parseInt("0x"+t[1].toString(),0)}},write:colorToString},CSS_RGB:{read:function(e){var t=e.match(/^rgb\(\s*(\S+)\s*,\s*(\S+)\s*,\s*(\S+)\s*\)/);return null!==t&&{space:"RGB",r:parseFloat(t[1]),g:parseFloat(t[2]),b:parseFloat(t[3])}},write:colorToString},CSS_RGBA:{read:function(e){var t=e.match(/^rgba\(\s*(\S+)\s*,\s*(\S+)\s*,\s*(\S+)\s*,\s*(\S+)\s*\)/);return null!==t&&{space:"RGB",r:parseFloat(t[1]),g:parseFloat(t[2]),b:parseFloat(t[3]),a:parseFloat(t[4])}},write:colorToString}}},{litmus:Common.isNumber,conversions:{HEX:{read:function(e){return{space:"HEX",hex:e,conversionName:"HEX"}},write:function(e){return e.hex}}}},{litmus:Common.isArray,conversions:{RGB_ARRAY:{read:function(e){return 3===e.length&&{space:"RGB",r:e[0],g:e[1],b:e[2]}},write:function(e){return[e.r,e.g,e.b]}},RGBA_ARRAY:{read:function(e){return 4===e.length&&{space:"RGB",r:e[0],g:e[1],b:e[2],a:e[3]}},write:function(e){return[e.r,e.g,e.b,e.a]}}}},{litmus:Common.isObject,conversions:{RGBA_OBJ:{read:function(e){return!!(Common.isNumber(e.r)&&Common.isNumber(e.g)&&Common.isNumber(e.b)&&Common.isNumber(e.a))&&{space:"RGB",r:e.r,g:e.g,b:e.b,a:e.a}},write:function(e){return{r:e.r,g:e.g,b:e.b,a:e.a}}},RGB_OBJ:{read:function(e){return!!(Common.isNumber(e.r)&&Common.isNumber(e.g)&&Common.isNumber(e.b))&&{space:"RGB",r:e.r,g:e.g,b:e.b}},write:function(e){return{r:e.r,g:e.g,b:e.b}}},HSVA_OBJ:{read:function(e){return!!(Common.isNumber(e.h)&&Common.isNumber(e.s)&&Common.isNumber(e.v)&&Common.isNumber(e.a))&&{space:"HSV",h:e.h,s:e.s,v:e.v,a:e.a}},write:function(e){return{h:e.h,s:e.s,v:e.v,a:e.a}}},HSV_OBJ:{read:function(e){return!!(Common.isNumber(e.h)&&Common.isNumber(e.s)&&Common.isNumber(e.v))&&{space:"HSV",h:e.h,s:e.s,v:e.v}},write:function(e){return{h:e.h,s:e.s,v:e.v}}}}}],result=void 0,toReturn=void 0,interpret=function(){toReturn=!1;var e=arguments.length>1?Common.toArray(arguments):arguments[0];return Common.each(INTERPRETATIONS,(function(t){if(t.litmus(e))return Common.each(t.conversions,(function(t,n){if(result=t.read(e),!1===toReturn&&!1!==result)return toReturn=result,result.conversionName=n,result.conversion=t,Common.BREAK})),Common.BREAK})),toReturn},tmpComponent=void 0,ColorMath={hsv_to_rgb:function(e,t,n){var r=Math.floor(e/60)%6,a=e/60-Math.floor(e/60),i=n*(1-t),s=n*(1-a*t),o=n*(1-(1-a)*t),l=[[n,o,i],[s,n,i],[i,n,o],[i,s,n],[o,i,n],[n,i,s]][r];return{r:255*l[0],g:255*l[1],b:255*l[2]}},rgb_to_hsv:function(e,t,n){var r=Math.min(e,t,n),a=Math.max(e,t,n),i=a-r,s=void 0;return 0===a?{h:NaN,s:0,v:0}:(s=e===a?(t-n)/i:t===a?2+(n-e)/i:4+(e-t)/i,(s/=6)<0&&(s+=1),{h:360*s,s:i/a,v:a/255})},rgb_to_hex:function(e,t,n){var r=this.hex_with_component(0,2,e);return r=this.hex_with_component(r,1,t),this.hex_with_component(r,0,n)},component_from_hex:function(e,t){return e>>8*t&255},hex_with_component:function(e,t,n){return n<<(tmpComponent=8*t)|e&~(255<<tmpComponent)}},_typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},classCallCheck=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")},createClass=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),get=function e(t,n,r){null===t&&(t=Function.prototype);var a=Object.getOwnPropertyDescriptor(t,n);if(void 0===a){var i=Object.getPrototypeOf(t);return null===i?void 0:e(i,n,r)}if("value"in a)return a.value;var s=a.get;return void 0!==s?s.call(r):void 0},inherits=function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)},possibleConstructorReturn=function(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t},Color=function(){function e(){if(classCallCheck(this,e),this.__state=interpret.apply(this,arguments),!1===this.__state)throw new Error("Failed to interpret color arguments");this.__state.a=this.__state.a||1}return createClass(e,[{key:"toString",value:function(){return colorToString(this)}},{key:"toHexString",value:function(){return colorToString(this,!0)}},{key:"toOriginal",value:function(){return this.__state.conversion.write(this)}}]),e}();function defineRGBComponent(e,t,n){Object.defineProperty(e,t,{get:function(){return"RGB"===this.__state.space||Color.recalculateRGB(this,t,n),this.__state[t]},set:function(e){"RGB"!==this.__state.space&&(Color.recalculateRGB(this,t,n),this.__state.space="RGB"),this.__state[t]=e}})}function defineHSVComponent(e,t){Object.defineProperty(e,t,{get:function(){return"HSV"===this.__state.space||Color.recalculateHSV(this),this.__state[t]},set:function(e){"HSV"!==this.__state.space&&(Color.recalculateHSV(this),this.__state.space="HSV"),this.__state[t]=e}})}Color.recalculateRGB=function(e,t,n){if("HEX"===e.__state.space)e.__state[t]=ColorMath.component_from_hex(e.__state.hex,n);else{if("HSV"!==e.__state.space)throw new Error("Corrupted color state");Common.extend(e.__state,ColorMath.hsv_to_rgb(e.__state.h,e.__state.s,e.__state.v))}},Color.recalculateHSV=function(e){var t=ColorMath.rgb_to_hsv(e.r,e.g,e.b);Common.extend(e.__state,{s:t.s,v:t.v}),Common.isNaN(t.h)?Common.isUndefined(e.__state.h)&&(e.__state.h=0):e.__state.h=t.h},Color.COMPONENTS=["r","g","b","h","s","v","hex","a"],defineRGBComponent(Color.prototype,"r",2),defineRGBComponent(Color.prototype,"g",1),defineRGBComponent(Color.prototype,"b",0),defineHSVComponent(Color.prototype,"h"),defineHSVComponent(Color.prototype,"s"),defineHSVComponent(Color.prototype,"v"),Object.defineProperty(Color.prototype,"a",{get:function(){return this.__state.a},set:function(e){this.__state.a=e}}),Object.defineProperty(Color.prototype,"hex",{get:function(){return"HEX"!==this.__state.space&&(this.__state.hex=ColorMath.rgb_to_hex(this.r,this.g,this.b),this.__state.space="HEX"),this.__state.hex},set:function(e){this.__state.space="HEX",this.__state.hex=e}});var Controller=function(){function e(t,n){classCallCheck(this,e),this.initialValue=t[n],this.domElement=document.createElement("div"),this.object=t,this.property=n,this.__onChange=void 0,this.__onFinishChange=void 0}return createClass(e,[{key:"onChange",value:function(e){return this.__onChange=e,this}},{key:"onFinishChange",value:function(e){return this.__onFinishChange=e,this}},{key:"setValue",value:function(e){return this.object[this.property]=e,this.__onChange&&this.__onChange.call(this,e),this.updateDisplay(),this}},{key:"getValue",value:function(){return this.object[this.property]}},{key:"updateDisplay",value:function(){return this}},{key:"isModified",value:function(){return this.initialValue!==this.getValue()}}]),e}(),EVENT_MAP_INV={};Common.each({HTMLEvents:["change"],MouseEvents:["click","mousemove","mousedown","mouseup","mouseover"],KeyboardEvents:["keydown"]},(function(e,t){Common.each(e,(function(e){EVENT_MAP_INV[e]=t}))}));var CSS_VALUE_PIXELS=/(\d+(\.\d+)?)px/;function cssValueToPixels(e){if("0"===e||Common.isUndefined(e))return 0;var t=e.match(CSS_VALUE_PIXELS);return Common.isNull(t)?0:parseFloat(t[1])}var dom={makeSelectable:function(e,t){void 0!==e&&void 0!==e.style&&(e.onselectstart=t?function(){return!1}:function(){},e.style.MozUserSelect=t?"auto":"none",e.style.KhtmlUserSelect=t?"auto":"none",e.unselectable=t?"on":"off")},makeFullscreen:function(e,t,n){var r=n,a=t;Common.isUndefined(a)&&(a=!0),Common.isUndefined(r)&&(r=!0),e.style.position="absolute",a&&(e.style.left=0,e.style.right=0),r&&(e.style.top=0,e.style.bottom=0)},fakeEvent:function(e,t,n,r){var a=n||{},i=EVENT_MAP_INV[t];if(!i)throw new Error("Event type "+t+" not supported.");var s=document.createEvent(i);switch(i){case"MouseEvents":var o=a.x||a.clientX||0,l=a.y||a.clientY||0;s.initMouseEvent(t,a.bubbles||!1,a.cancelable||!0,window,a.clickCount||1,0,0,o,l,!1,!1,!1,!1,0,null);break;case"KeyboardEvents":var d=s.initKeyboardEvent||s.initKeyEvent;Common.defaults(a,{cancelable:!0,ctrlKey:!1,altKey:!1,shiftKey:!1,metaKey:!1,keyCode:void 0,charCode:void 0}),d(t,a.bubbles||!1,a.cancelable,window,a.ctrlKey,a.altKey,a.shiftKey,a.metaKey,a.keyCode,a.charCode);break;default:s.initEvent(t,a.bubbles||!1,a.cancelable||!0)}Common.defaults(s,r),e.dispatchEvent(s)},bind:function(e,t,n,r){var a=r||!1;return e.addEventListener?e.addEventListener(t,n,a):e.attachEvent&&e.attachEvent("on"+t,n),dom},unbind:function(e,t,n,r){var a=r||!1;return e.removeEventListener?e.removeEventListener(t,n,a):e.detachEvent&&e.detachEvent("on"+t,n),dom},addClass:function(e,t){if(void 0===e.className)e.className=t;else if(e.className!==t){var n=e.className.split(/ +/);-1===n.indexOf(t)&&(n.push(t),e.className=n.join(" ").replace(/^\s+/,"").replace(/\s+$/,""))}return dom},removeClass:function(e,t){if(t)if(e.className===t)e.removeAttribute("class");else{var n=e.className.split(/ +/),r=n.indexOf(t);-1!==r&&(n.splice(r,1),e.className=n.join(" "))}else e.className=void 0;return dom},hasClass:function(e,t){return new RegExp("(?:^|\\s+)"+t+"(?:\\s+|$)").test(e.className)||!1},getWidth:function(e){var t=getComputedStyle(e);return cssValueToPixels(t["border-left-width"])+cssValueToPixels(t["border-right-width"])+cssValueToPixels(t["padding-left"])+cssValueToPixels(t["padding-right"])+cssValueToPixels(t.width)},getHeight:function(e){var t=getComputedStyle(e);return cssValueToPixels(t["border-top-width"])+cssValueToPixels(t["border-bottom-width"])+cssValueToPixels(t["padding-top"])+cssValueToPixels(t["padding-bottom"])+cssValueToPixels(t.height)},getOffset:function(e){var t=e,n={left:0,top:0};if(t.offsetParent)do{n.left+=t.offsetLeft,n.top+=t.offsetTop,t=t.offsetParent}while(t);return n},isActive:function(e){return e===document.activeElement&&(e.type||e.href)}},BooleanController=function(e){function t(e,n){classCallCheck(this,t);var r=possibleConstructorReturn(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e,n)),a=r;return r.__prev=r.getValue(),r.__checkbox=document.createElement("input"),r.__checkbox.setAttribute("type","checkbox"),dom.bind(r.__checkbox,"change",(function(){a.setValue(!a.__prev)}),!1),r.domElement.appendChild(r.__checkbox),r.updateDisplay(),r}return inherits(t,Controller),createClass(t,[{key:"setValue",value:function(e){var n=get(t.prototype.__proto__||Object.getPrototypeOf(t.prototype),"setValue",this).call(this,e);return this.__onFinishChange&&this.__onFinishChange.call(this,this.getValue()),this.__prev=this.getValue(),n}},{key:"updateDisplay",value:function(){return!0===this.getValue()?(this.__checkbox.setAttribute("checked","checked"),this.__checkbox.checked=!0,this.__prev=!0):(this.__checkbox.checked=!1,this.__prev=!1),get(t.prototype.__proto__||Object.getPrototypeOf(t.prototype),"updateDisplay",this).call(this)}}]),t}(),OptionController=function(e){function t(e,n,r){classCallCheck(this,t);var a=possibleConstructorReturn(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e,n)),i=r,s=a;if(a.__select=document.createElement("select"),Common.isArray(i)){var o={};Common.each(i,(function(e){o[e]=e})),i=o}return Common.each(i,(function(e,t){var n=document.createElement("option");n.innerHTML=t,n.setAttribute("value",e),s.__select.appendChild(n)})),a.updateDisplay(),dom.bind(a.__select,"change",(function(){var e=this.options[this.selectedIndex].value;s.setValue(e)})),a.domElement.appendChild(a.__select),a}return inherits(t,Controller),createClass(t,[{key:"setValue",value:function(e){var n=get(t.prototype.__proto__||Object.getPrototypeOf(t.prototype),"setValue",this).call(this,e);return this.__onFinishChange&&this.__onFinishChange.call(this,this.getValue()),n}},{key:"updateDisplay",value:function(){return dom.isActive(this.__select)?this:(this.__select.value=this.getValue(),get(t.prototype.__proto__||Object.getPrototypeOf(t.prototype),"updateDisplay",this).call(this))}}]),t}(),StringController=function(e){function t(e,n){classCallCheck(this,t);var r=possibleConstructorReturn(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e,n)),a=r;function i(){a.setValue(a.__input.value)}return r.__input=document.createElement("input"),r.__input.setAttribute("type","text"),dom.bind(r.__input,"keyup",i),dom.bind(r.__input,"change",i),dom.bind(r.__input,"blur",(function(){a.__onFinishChange&&a.__onFinishChange.call(a,a.getValue())})),dom.bind(r.__input,"keydown",(function(e){13===e.keyCode&&this.blur()})),r.updateDisplay(),r.domElement.appendChild(r.__input),r}return inherits(t,Controller),createClass(t,[{key:"updateDisplay",value:function(){return dom.isActive(this.__input)||(this.__input.value=this.getValue()),get(t.prototype.__proto__||Object.getPrototypeOf(t.prototype),"updateDisplay",this).call(this)}}]),t}();function numDecimals(e){var t=e.toString();return t.indexOf(".")>-1?t.length-t.indexOf(".")-1:0}var NumberController=function(e){function t(e,n,r){classCallCheck(this,t);var a=possibleConstructorReturn(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e,n)),i=r||{};return a.__min=i.min,a.__max=i.max,a.__step=i.step,Common.isUndefined(a.__step)?0===a.initialValue?a.__impliedStep=1:a.__impliedStep=Math.pow(10,Math.floor(Math.log(Math.abs(a.initialValue))/Math.LN10))/10:a.__impliedStep=a.__step,a.__precision=numDecimals(a.__impliedStep),a}return inherits(t,Controller),createClass(t,[{key:"setValue",value:function(e){var n=e;return void 0!==this.__min&&n<this.__min?n=this.__min:void 0!==this.__max&&n>this.__max&&(n=this.__max),void 0!==this.__step&&n%this.__step!=0&&(n=Math.round(n/this.__step)*this.__step),get(t.prototype.__proto__||Object.getPrototypeOf(t.prototype),"setValue",this).call(this,n)}},{key:"min",value:function(e){return this.__min=e,this}},{key:"max",value:function(e){return this.__max=e,this}},{key:"step",value:function(e){return this.__step=e,this.__impliedStep=e,this.__precision=numDecimals(e),this}}]),t}(),NumberControllerBox=function(e){function t(e,n,r){classCallCheck(this,t);var a=possibleConstructorReturn(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e,n,r));a.__truncationSuspended=!1;var i=a,s=void 0;function o(){i.__onFinishChange&&i.__onFinishChange.call(i,i.getValue())}function l(e){var t=s-e.clientY;i.setValue(i.getValue()+t*i.__impliedStep),s=e.clientY}function d(){dom.unbind(window,"mousemove",l),dom.unbind(window,"mouseup",d),o()}return a.__input=document.createElement("input"),a.__input.setAttribute("type","text"),dom.bind(a.__input,"change",(function(){var e=parseFloat(i.__input.value);Common.isNaN(e)||i.setValue(e)})),dom.bind(a.__input,"blur",(function(){o()})),dom.bind(a.__input,"mousedown",(function(e){dom.bind(window,"mousemove",l),dom.bind(window,"mouseup",d),s=e.clientY})),dom.bind(a.__input,"keydown",(function(e){13===e.keyCode&&(i.__truncationSuspended=!0,this.blur(),i.__truncationSuspended=!1,o())})),a.updateDisplay(),a.domElement.appendChild(a.__input),a}return inherits(t,NumberController),createClass(t,[{key:"updateDisplay",value:function(){var e,n,r;return this.__input.value=this.__truncationSuspended?this.getValue():(e=this.getValue(),n=this.__precision,r=Math.pow(10,n),Math.round(e*r)/r),get(t.prototype.__proto__||Object.getPrototypeOf(t.prototype),"updateDisplay",this).call(this)}}]),t}();function map(e,t,n,r,a){return r+(e-t)/(n-t)*(a-r)}var NumberControllerSlider=function(e){function t(e,n,r,a,i){classCallCheck(this,t);var s=possibleConstructorReturn(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e,n,{min:r,max:a,step:i})),o=s;function l(e){e.preventDefault();var t=o.__background.getBoundingClientRect();return o.setValue(map(e.clientX,t.left,t.right,o.__min,o.__max)),!1}function d(){dom.unbind(window,"mousemove",l),dom.unbind(window,"mouseup",d),o.__onFinishChange&&o.__onFinishChange.call(o,o.getValue())}function h(e){var t=e.touches[0].clientX,n=o.__background.getBoundingClientRect();o.setValue(map(t,n.left,n.right,o.__min,o.__max))}function c(){dom.unbind(window,"touchmove",h),dom.unbind(window,"touchend",c),o.__onFinishChange&&o.__onFinishChange.call(o,o.getValue())}return s.__background=document.createElement("div"),s.__foreground=document.createElement("div"),dom.bind(s.__background,"mousedown",(function(e){document.activeElement.blur(),dom.bind(window,"mousemove",l),dom.bind(window,"mouseup",d),l(e)})),dom.bind(s.__background,"touchstart",(function(e){1===e.touches.length&&(dom.bind(window,"touchmove",h),dom.bind(window,"touchend",c),h(e))})),dom.addClass(s.__background,"slider"),dom.addClass(s.__foreground,"slider-fg"),s.updateDisplay(),s.__background.appendChild(s.__foreground),s.domElement.appendChild(s.__background),s}return inherits(t,NumberController),createClass(t,[{key:"updateDisplay",value:function(){var e=(this.getValue()-this.__min)/(this.__max-this.__min);return this.__foreground.style.width=100*e+"%",get(t.prototype.__proto__||Object.getPrototypeOf(t.prototype),"updateDisplay",this).call(this)}}]),t}(),FunctionController=function(e){function t(e,n,r){classCallCheck(this,t);var a=possibleConstructorReturn(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e,n)),i=a;return a.__button=document.createElement("div"),a.__button.innerHTML=void 0===r?"Fire":r,dom.bind(a.__button,"click",(function(e){return e.preventDefault(),i.fire(),!1})),dom.addClass(a.__button,"button"),a.domElement.appendChild(a.__button),a}return inherits(t,Controller),createClass(t,[{key:"fire",value:function(){this.__onChange&&this.__onChange.call(this),this.getValue().call(this.object),this.__onFinishChange&&this.__onFinishChange.call(this,this.getValue())}}]),t}(),ColorController=function(e){function t(e,n){classCallCheck(this,t);var r=possibleConstructorReturn(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e,n));r.__color=new Color(r.getValue()),r.__temp=new Color(0);var a=r;r.domElement=document.createElement("div"),dom.makeSelectable(r.domElement,!1),r.__selector=document.createElement("div"),r.__selector.className="selector",r.__saturation_field=document.createElement("div"),r.__saturation_field.className="saturation-field",r.__field_knob=document.createElement("div"),r.__field_knob.className="field-knob",r.__field_knob_border="2px solid ",r.__hue_knob=document.createElement("div"),r.__hue_knob.className="hue-knob",r.__hue_field=document.createElement("div"),r.__hue_field.className="hue-field",r.__input=document.createElement("input"),r.__input.type="text",r.__input_textShadow="0 1px 1px ",dom.bind(r.__input,"keydown",(function(e){13===e.keyCode&&c.call(this)})),dom.bind(r.__input,"blur",c),dom.bind(r.__selector,"mousedown",(function(){dom.addClass(this,"drag").bind(window,"mouseup",(function(){dom.removeClass(a.__selector,"drag")}))})),dom.bind(r.__selector,"touchstart",(function(){dom.addClass(this,"drag").bind(window,"touchend",(function(){dom.removeClass(a.__selector,"drag")}))}));var i,s=document.createElement("div");function o(e){p(e),dom.bind(window,"mousemove",p),dom.bind(window,"touchmove",p),dom.bind(window,"mouseup",d),dom.bind(window,"touchend",d)}function l(e){m(e),dom.bind(window,"mousemove",m),dom.bind(window,"touchmove",m),dom.bind(window,"mouseup",h),dom.bind(window,"touchend",h)}function d(){dom.unbind(window,"mousemove",p),dom.unbind(window,"touchmove",p),dom.unbind(window,"mouseup",d),dom.unbind(window,"touchend",d),u()}function h(){dom.unbind(window,"mousemove",m),dom.unbind(window,"touchmove",m),dom.unbind(window,"mouseup",h),dom.unbind(window,"touchend",h),u()}function c(){var e=interpret(this.value);!1!==e?(a.__color.__state=e,a.setValue(a.__color.toOriginal())):this.value=a.__color.toString()}function u(){a.__onFinishChange&&a.__onFinishChange.call(a,a.__color.toOriginal())}function p(e){-1===e.type.indexOf("touch")&&e.preventDefault();var t=a.__saturation_field.getBoundingClientRect(),n=e.touches&&e.touches[0]||e,r=n.clientX,i=n.clientY,s=(r-t.left)/(t.right-t.left),o=1-(i-t.top)/(t.bottom-t.top);return o>1?o=1:o<0&&(o=0),s>1?s=1:s<0&&(s=0),a.__color.v=o,a.__color.s=s,a.setValue(a.__color.toOriginal()),!1}function m(e){-1===e.type.indexOf("touch")&&e.preventDefault();var t=a.__hue_field.getBoundingClientRect(),n=1-((e.touches&&e.touches[0]||e).clientY-t.top)/(t.bottom-t.top);return n>1?n=1:n<0&&(n=0),a.__color.h=360*n,a.setValue(a.__color.toOriginal()),!1}return Common.extend(r.__selector.style,{width:"122px",height:"102px",padding:"3px",backgroundColor:"#222",boxShadow:"0px 1px 3px rgba(0,0,0,0.3)"}),Common.extend(r.__field_knob.style,{position:"absolute",width:"12px",height:"12px",border:r.__field_knob_border+(r.__color.v<.5?"#fff":"#000"),boxShadow:"0px 1px 3px rgba(0,0,0,0.5)",borderRadius:"12px",zIndex:1}),Common.extend(r.__hue_knob.style,{position:"absolute",width:"15px",height:"2px",borderRight:"4px solid #fff",zIndex:1}),Common.extend(r.__saturation_field.style,{width:"100px",height:"100px",border:"1px solid #555",marginRight:"3px",display:"inline-block",cursor:"pointer"}),Common.extend(s.style,{width:"100%",height:"100%",background:"none"}),linearGradient(s,"top","rgba(0,0,0,0)","#000"),Common.extend(r.__hue_field.style,{width:"15px",height:"100px",border:"1px solid #555",cursor:"ns-resize",position:"absolute",top:"3px",right:"3px"}),(i=r.__hue_field).style.background="",i.style.cssText+="background: -moz-linear-gradient(top, #ff0000 0%, #ff00ff 17%, #0000ff 34%, #00ffff 50%, #00ff00 67%, #ffff00 84%, #ff0000 100%);",i.style.cssText+="background: -webkit-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);",i.style.cssText+="background: -o-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);",i.style.cssText+="background: -ms-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);",i.style.cssText+="background: linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);",Common.extend(r.__input.style,{outline:"none",textAlign:"center",color:"#fff",border:0,fontWeight:"bold",textShadow:r.__input_textShadow+"rgba(0,0,0,0.7)"}),dom.bind(r.__saturation_field,"mousedown",o),dom.bind(r.__saturation_field,"touchstart",o),dom.bind(r.__field_knob,"mousedown",o),dom.bind(r.__field_knob,"touchstart",o),dom.bind(r.__hue_field,"mousedown",l),dom.bind(r.__hue_field,"touchstart",l),r.__saturation_field.appendChild(s),r.__selector.appendChild(r.__field_knob),r.__selector.appendChild(r.__saturation_field),r.__selector.appendChild(r.__hue_field),r.__hue_field.appendChild(r.__hue_knob),r.domElement.appendChild(r.__input),r.domElement.appendChild(r.__selector),r.updateDisplay(),r}return inherits(t,Controller),createClass(t,[{key:"updateDisplay",value:function(){var e=interpret(this.getValue());if(!1!==e){var t=!1;Common.each(Color.COMPONENTS,(function(n){if(!Common.isUndefined(e[n])&&!Common.isUndefined(this.__color.__state[n])&&e[n]!==this.__color.__state[n])return t=!0,{}}),this),t&&Common.extend(this.__color.__state,e)}Common.extend(this.__temp.__state,this.__color.__state),this.__temp.a=1;var n=this.__color.v<.5||this.__color.s>.5?255:0,r=255-n;Common.extend(this.__field_knob.style,{marginLeft:100*this.__color.s-7+"px",marginTop:100*(1-this.__color.v)-7+"px",backgroundColor:this.__temp.toHexString(),border:this.__field_knob_border+"rgb("+n+","+n+","+n+")"}),this.__hue_knob.style.marginTop=100*(1-this.__color.h/360)+"px",this.__temp.s=1,this.__temp.v=1,linearGradient(this.__saturation_field,"left","#fff",this.__temp.toHexString()),this.__input.value=this.__color.toString(),Common.extend(this.__input.style,{backgroundColor:this.__color.toHexString(),color:"rgb("+n+","+n+","+n+")",textShadow:this.__input_textShadow+"rgba("+r+","+r+","+r+",.7)"})}}]),t}(),vendors=["-moz-","-o-","-webkit-","-ms-",""];function linearGradient(e,t,n,r){e.style.background="",Common.each(vendors,(function(a){e.style.cssText+="background: "+a+"linear-gradient("+t+", "+n+" 0%, "+r+" 100%); "}))}var saveDialogContents='<div id="dg-save" class="dg dialogue">\n\n Here\'s the new load parameter for your <code>GUI</code>\'s constructor:\n\n <textarea id="dg-new-constructor"></textarea>\n\n <div id="dg-save-locally">\n\n <input id="dg-local-storage" type="checkbox"/> Automatically save\n values to <code>localStorage</code> on exit.\n\n <div id="dg-local-explain">The values saved to <code>localStorage</code> will\n override those passed to <code>dat.GUI</code>\'s constructor. This makes it\n easier to work incrementally, but <code>localStorage</code> is fragile,\n and your friends may not see the same values you do.\n\n </div>\n\n </div>\n\n</div>',ControllerFactory=function(e,t){var n=e[t];return Common.isArray(arguments[2])||Common.isObject(arguments[2])?new OptionController(e,t,arguments[2]):Common.isNumber(n)?Common.isNumber(arguments[2])&&Common.isNumber(arguments[3])?Common.isNumber(arguments[4])?new NumberControllerSlider(e,t,arguments[2],arguments[3],arguments[4]):new NumberControllerSlider(e,t,arguments[2],arguments[3]):Common.isNumber(arguments[4])?new NumberControllerBox(e,t,{min:arguments[2],max:arguments[3],step:arguments[4]}):new NumberControllerBox(e,t,{min:arguments[2],max:arguments[3]}):Common.isString(n)?new StringController(e,t):Common.isFunction(n)?new FunctionController(e,t,""):Common.isBoolean(n)?new BooleanController(e,t):null},requestAnimationFrame$1=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(e){setTimeout(e,1e3/60)},CenteredDiv=function(){function e(){classCallCheck(this,e),this.backgroundElement=document.createElement("div"),Common.extend(this.backgroundElement.style,{backgroundColor:"rgba(0,0,0,0.8)",top:0,left:0,display:"none",zIndex:"1000",opacity:0,WebkitTransition:"opacity 0.2s linear",transition:"opacity 0.2s linear"}),dom.makeFullscreen(this.backgroundElement),this.backgroundElement.style.position="fixed",this.domElement=document.createElement("div"),Common.extend(this.domElement.style,{position:"fixed",display:"none",zIndex:"1001",opacity:0,WebkitTransition:"-webkit-transform 0.2s ease-out, opacity 0.2s linear",transition:"transform 0.2s ease-out, opacity 0.2s linear"}),document.body.appendChild(this.backgroundElement),document.body.appendChild(this.domElement);var t=this;dom.bind(this.backgroundElement,"click",(function(){t.hide()}))}return createClass(e,[{key:"show",value:function(){var e=this;this.backgroundElement.style.display="block",this.domElement.style.display="block",this.domElement.style.opacity=0,this.domElement.style.webkitTransform="scale(1.1)",this.layout(),Common.defer((function(){e.backgroundElement.style.opacity=1,e.domElement.style.opacity=1,e.domElement.style.webkitTransform="scale(1)"}))}},{key:"hide",value:function(){var e=this,t=function t(){e.domElement.style.display="none",e.backgroundElement.style.display="none",dom.unbind(e.domElement,"webkitTransitionEnd",t),dom.unbind(e.domElement,"transitionend",t),dom.unbind(e.domElement,"oTransitionEnd",t)};dom.bind(this.domElement,"webkitTransitionEnd",t),dom.bind(this.domElement,"transitionend",t),dom.bind(this.domElement,"oTransitionEnd",t),this.backgroundElement.style.opacity=0,this.domElement.style.opacity=0,this.domElement.style.webkitTransform="scale(1.1)"}},{key:"layout",value:function(){this.domElement.style.left=window.innerWidth/2-dom.getWidth(this.domElement)/2+"px",this.domElement.style.top=window.innerHeight/2-dom.getHeight(this.domElement)/2+"px"}}]),e}();!function(e,t){var n=document,r=document.createElement("style");r.type="text/css",r.innerHTML=e;var a=n.getElementsByTagName("head")[0];try{a.appendChild(r)}catch(e){}}(function(e){if("undefined"!=typeof window){var t=document.createElement("style");return t.setAttribute("type","text/css"),t.innerHTML=e,document.head.appendChild(t),e}}(".dg ul{list-style:none;margin:0;padding:0;width:100%;clear:both}.dg.ac{position:fixed;top:0;left:0;right:0;height:0;z-index:0}.dg:not(.ac) .main{overflow:hidden}.dg.main{-webkit-transition:opacity .1s linear;-o-transition:opacity .1s linear;-moz-transition:opacity .1s linear;transition:opacity .1s linear}.dg.main.taller-than-window{overflow-y:auto}.dg.main.taller-than-window .close-button{opacity:1;margin-top:-1px;border-top:1px solid #2c2c2c}.dg.main ul.closed .close-button{opacity:1 !important}.dg.main:hover .close-button,.dg.main .close-button.drag{opacity:1}.dg.main .close-button{-webkit-transition:opacity .1s linear;-o-transition:opacity .1s linear;-moz-transition:opacity .1s linear;transition:opacity .1s linear;border:0;line-height:19px;height:20px;cursor:pointer;text-align:center;background-color:#000}.dg.main .close-button.close-top{position:relative}.dg.main .close-button.close-bottom{position:absolute}.dg.main .close-button:hover{background-color:#111}.dg.a{float:right;margin-right:15px;overflow-y:visible}.dg.a.has-save>ul.close-top{margin-top:0}.dg.a.has-save>ul.close-bottom{margin-top:27px}.dg.a.has-save>ul.closed{margin-top:0}.dg.a .save-row{top:0;z-index:1002}.dg.a .save-row.close-top{position:relative}.dg.a .save-row.close-bottom{position:fixed}.dg li{-webkit-transition:height .1s ease-out;-o-transition:height .1s ease-out;-moz-transition:height .1s ease-out;transition:height .1s ease-out;-webkit-transition:overflow .1s linear;-o-transition:overflow .1s linear;-moz-transition:overflow .1s linear;transition:overflow .1s linear}.dg li:not(.folder){cursor:auto;height:27px;line-height:27px;padding:0 4px 0 5px}.dg li.folder{padding:0;border-left:4px solid rgba(0,0,0,0)}.dg li.title{cursor:pointer;margin-left:-4px}.dg .closed li:not(.title),.dg .closed ul li,.dg .closed ul li>*{height:0;overflow:hidden;border:0}.dg .cr{clear:both;padding-left:3px;height:27px;overflow:hidden}.dg .property-name{cursor:default;float:left;clear:left;width:40%;overflow:hidden;text-overflow:ellipsis}.dg .cr.function .property-name{width:100%}.dg .c{float:left;width:60%;position:relative}.dg .c input[type=text]{border:0;margin-top:4px;padding:3px;width:100%;float:right}.dg .has-slider input[type=text]{width:30%;margin-left:0}.dg .slider{float:left;width:66%;margin-left:-5px;margin-right:0;height:19px;margin-top:4px}.dg .slider-fg{height:100%}.dg .c input[type=checkbox]{margin-top:7px}.dg .c select{margin-top:5px}.dg .cr.function,.dg .cr.function .property-name,.dg .cr.function *,.dg .cr.boolean,.dg .cr.boolean *{cursor:pointer}.dg .cr.color{overflow:visible}.dg .selector{display:none;position:absolute;margin-left:-9px;margin-top:23px;z-index:10}.dg .c:hover .selector,.dg .selector.drag{display:block}.dg li.save-row{padding:0}.dg li.save-row .button{display:inline-block;padding:0px 6px}.dg.dialogue{background-color:#222;width:460px;padding:15px;font-size:13px;line-height:15px}#dg-new-constructor{padding:10px;color:#222;font-family:Monaco, monospace;font-size:10px;border:0;resize:none;box-shadow:inset 1px 1px 1px #888;word-wrap:break-word;margin:12px 0;display:block;width:440px;overflow-y:scroll;height:100px;position:relative}#dg-local-explain{display:none;font-size:11px;line-height:17px;border-radius:3px;background-color:#333;padding:8px;margin-top:10px}#dg-local-explain code{font-size:10px}#dat-gui-save-locally{display:none}.dg{color:#eee;font:11px 'Lucida Grande', sans-serif;text-shadow:0 -1px 0 #111}.dg.main::-webkit-scrollbar{width:5px;background:#1a1a1a}.dg.main::-webkit-scrollbar-corner{height:0;display:none}.dg.main::-webkit-scrollbar-thumb{border-radius:5px;background:#676767}.dg li:not(.folder){background:#1a1a1a;border-bottom:1px solid #2c2c2c}.dg li.save-row{line-height:25px;background:#dad5cb;border:0}.dg li.save-row select{margin-left:5px;width:108px}.dg li.save-row .button{margin-left:5px;margin-top:1px;border-radius:2px;font-size:9px;line-height:7px;padding:4px 4px 5px 4px;background:#c5bdad;color:#fff;text-shadow:0 1px 0 #b0a58f;box-shadow:0 -1px 0 #b0a58f;cursor:pointer}.dg li.save-row .button.gears{background:#c5bdad url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAANCAYAAAB/9ZQ7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQJJREFUeNpiYKAU/P//PwGIC/ApCABiBSAW+I8AClAcgKxQ4T9hoMAEUrxx2QSGN6+egDX+/vWT4e7N82AMYoPAx/evwWoYoSYbACX2s7KxCxzcsezDh3evFoDEBYTEEqycggWAzA9AuUSQQgeYPa9fPv6/YWm/Acx5IPb7ty/fw+QZblw67vDs8R0YHyQhgObx+yAJkBqmG5dPPDh1aPOGR/eugW0G4vlIoTIfyFcA+QekhhHJhPdQxbiAIguMBTQZrPD7108M6roWYDFQiIAAv6Aow/1bFwXgis+f2LUAynwoIaNcz8XNx3Dl7MEJUDGQpx9gtQ8YCueB+D26OECAAQDadt7e46D42QAAAABJRU5ErkJggg==) 2px 1px no-repeat;height:7px;width:8px}.dg li.save-row .button:hover{background-color:#bab19e;box-shadow:0 -1px 0 #b0a58f}.dg li.folder{border-bottom:0}.dg li.title{padding-left:16px;background:#000 url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlI+hKgFxoCgAOw==) 6px 10px no-repeat;cursor:pointer;border-bottom:1px solid rgba(255,255,255,0.2)}.dg .closed li.title{background-image:url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlGIWqMCbWAEAOw==)}.dg .cr.boolean{border-left:3px solid #806787}.dg .cr.color{border-left:3px solid}.dg .cr.function{border-left:3px solid #e61d5f}.dg .cr.number{border-left:3px solid #2FA1D6}.dg .cr.number input[type=text]{color:#2FA1D6}.dg .cr.string{border-left:3px solid #1ed36f}.dg .cr.string input[type=text]{color:#1ed36f}.dg .cr.function:hover,.dg .cr.boolean:hover{background:#111}.dg .c input[type=text]{background:#303030;outline:none}.dg .c input[type=text]:hover{background:#3c3c3c}.dg .c input[type=text]:focus{background:#494949;color:#fff}.dg .c .slider{background:#303030;cursor:ew-resize}.dg .c .slider-fg{background:#2FA1D6;max-width:100%}.dg .c .slider:hover{background:#3c3c3c}.dg .c .slider:hover .slider-fg{background:#44abda}\n"));var SUPPORTS_LOCAL_STORAGE=function(){try{return!!window.localStorage}catch(e){return!1}}(),SAVE_DIALOGUE=void 0,autoPlaceVirgin=!0,autoPlaceContainer=void 0,hide=!1,hideableGuis=[],GUI=function e(t){var n=this,r=t||{};this.domElement=document.createElement("div"),this.__ul=document.createElement("ul"),this.domElement.appendChild(this.__ul),dom.addClass(this.domElement,"dg"),this.__folders={},this.__controllers=[],this.__rememberedObjects=[],this.__rememberedObjectIndecesToControllers=[],this.__listening=[],r=Common.defaults(r,{closeOnTop:!1,autoPlace:!0,width:e.DEFAULT_WIDTH}),r=Common.defaults(r,{resizable:r.autoPlace,hideable:r.autoPlace}),Common.isUndefined(r.load)?r.load={preset:"Default"}:r.preset&&(r.load.preset=r.preset),Common.isUndefined(r.parent)&&r.hideable&&hideableGuis.push(this),r.resizable=Common.isUndefined(r.parent)&&r.resizable,r.autoPlace&&Common.isUndefined(r.scrollable)&&(r.scrollable=!0);var a,i=SUPPORTS_LOCAL_STORAGE&&"true"===localStorage.getItem(getLocalStorageHash(0,"isLocal")),s=void 0,o=void 0;if(Object.defineProperties(this,{parent:{get:function(){return r.parent}},scrollable:{get:function(){return r.scrollable}},autoPlace:{get:function(){return r.autoPlace}},closeOnTop:{get:function(){return r.closeOnTop}},preset:{get:function(){return n.parent?n.getRoot().preset:r.load.preset},set:function(e){n.parent?n.getRoot().preset=e:r.load.preset=e,function(e){for(var t=0;t<e.__preset_select.length;t++)e.__preset_select[t].value===e.preset&&(e.__preset_select.selectedIndex=t)}(this),n.revert()}},width:{get:function(){return r.width},set:function(e){r.width=e,setWidth(n,e)}},name:{get:function(){return r.name},set:function(e){r.name=e,o&&(o.innerHTML=r.name)}},closed:{get:function(){return r.closed},set:function(t){r.closed=t,r.closed?dom.addClass(n.__ul,e.CLASS_CLOSED):dom.removeClass(n.__ul,e.CLASS_CLOSED),this.onResize(),n.__closeButton&&(n.__closeButton.innerHTML=t?e.TEXT_OPEN:e.TEXT_CLOSED)}},load:{get:function(){return r.load}},useLocalStorage:{get:function(){return i},set:function(e){SUPPORTS_LOCAL_STORAGE&&(i=e,e?dom.bind(window,"unload",s):dom.unbind(window,"unload",s),localStorage.setItem(getLocalStorageHash(0,"isLocal"),e))}}}),Common.isUndefined(r.parent)){if(this.closed=r.closed||!1,dom.addClass(this.domElement,e.CLASS_MAIN),dom.makeSelectable(this.domElement,!1),SUPPORTS_LOCAL_STORAGE&&i){n.useLocalStorage=!0;var l=localStorage.getItem(getLocalStorageHash(0,"gui"));l&&(r.load=JSON.parse(l))}this.__closeButton=document.createElement("div"),this.__closeButton.innerHTML=e.TEXT_CLOSED,dom.addClass(this.__closeButton,e.CLASS_CLOSE_BUTTON),r.closeOnTop?(dom.addClass(this.__closeButton,e.CLASS_CLOSE_TOP),this.domElement.insertBefore(this.__closeButton,this.domElement.childNodes[0])):(dom.addClass(this.__closeButton,e.CLASS_CLOSE_BOTTOM),this.domElement.appendChild(this.__closeButton)),dom.bind(this.__closeButton,"click",(function(){n.closed=!n.closed}))}else{void 0===r.closed&&(r.closed=!0);var d=document.createTextNode(r.name);dom.addClass(d,"controller-name"),o=addRow(n,d),dom.addClass(this.__ul,e.CLASS_CLOSED),dom.addClass(o,"title"),dom.bind(o,"click",(function(e){return e.preventDefault(),n.closed=!n.closed,!1})),r.closed||(this.closed=!1)}r.autoPlace&&(Common.isUndefined(r.parent)&&(autoPlaceVirgin&&(autoPlaceContainer=document.createElement("div"),dom.addClass(autoPlaceContainer,"dg"),dom.addClass(autoPlaceContainer,e.CLASS_AUTO_PLACE_CONTAINER),document.body.appendChild(autoPlaceContainer),autoPlaceVirgin=!1),autoPlaceContainer.appendChild(this.domElement),dom.addClass(this.domElement,e.CLASS_AUTO_PLACE)),this.parent||setWidth(n,r.width)),this.__resizeHandler=function(){n.onResizeDebounced()},dom.bind(window,"resize",this.__resizeHandler),dom.bind(this.__ul,"webkitTransitionEnd",this.__resizeHandler),dom.bind(this.__ul,"transitionend",this.__resizeHandler),dom.bind(this.__ul,"oTransitionEnd",this.__resizeHandler),this.onResize(),r.resizable&&addResizeHandle(this),s=function(){SUPPORTS_LOCAL_STORAGE&&"true"===localStorage.getItem(getLocalStorageHash(0,"isLocal"))&&localStorage.setItem(getLocalStorageHash(0,"gui"),JSON.stringify(n.getSaveObject()))},this.saveToLocalStorageIfPossible=s,r.parent||((a=n.getRoot()).width+=1,Common.defer((function(){a.width-=1})))};function addRow(e,t,n){var r=document.createElement("li");return t&&r.appendChild(t),n?e.__ul.insertBefore(r,n):e.__ul.appendChild(r),e.onResize(),r}function removeListeners(e){dom.unbind(window,"resize",e.__resizeHandler),e.saveToLocalStorageIfPossible&&dom.unbind(window,"unload",e.saveToLocalStorageIfPossible)}function markPresetModified(e,t){var n=e.__preset_select[e.__preset_select.selectedIndex];n.innerHTML=t?n.value+"*":n.value}function recallSavedValue(e,t){var n=e.getRoot(),r=n.__rememberedObjects.indexOf(t.object);if(-1!==r){var a=n.__rememberedObjectIndecesToControllers[r];if(void 0===a&&(a={},n.__rememberedObjectIndecesToControllers[r]=a),a[t.property]=t,n.load&&n.load.remembered){var i=n.load.remembered,s=void 0;if(i[e.preset])s=i[e.preset];else{if(!i.Default)return;s=i.Default}if(s[r]&&void 0!==s[r][t.property]){var o=s[r][t.property];t.initialValue=o,t.setValue(o)}}}}function _add(e,t,n,r){if(void 0===t[n])throw new Error('Object "'+t+'" has no property "'+n+'"');var a=void 0;if(r.color)a=new ColorController(t,n);else{var i=[t,n].concat(r.factoryArgs);a=ControllerFactory.apply(e,i)}r.before instanceof Controller&&(r.before=r.before.__li),recallSavedValue(e,a),dom.addClass(a.domElement,"c");var s=document.createElement("span");dom.addClass(s,"property-name"),s.innerHTML=a.property;var o=document.createElement("div");o.appendChild(s),o.appendChild(a.domElement);var l=addRow(e,o,r.before);return dom.addClass(l,GUI.CLASS_CONTROLLER_ROW),a instanceof ColorController?dom.addClass(l,"color"):dom.addClass(l,_typeof(a.getValue())),function(e,t,n){if(n.__li=t,n.__gui=e,Common.extend(n,{options:function(t){if(arguments.length>1){var r=n.__li.nextElementSibling;return n.remove(),_add(e,n.object,n.property,{before:r,factoryArgs:[Common.toArray(arguments)]})}if(Common.isArray(t)||Common.isObject(t)){var a=n.__li.nextElementSibling;return n.remove(),_add(e,n.object,n.property,{before:a,factoryArgs:[t]})}},name:function(e){return n.__li.firstElementChild.firstElementChild.innerHTML=e,n},listen:function(){return n.__gui.listen(n),n},remove:function(){return n.__gui.remove(n),n}}),n instanceof NumberControllerSlider){var r=new NumberControllerBox(n.object,n.property,{min:n.__min,max:n.__max,step:n.__step});Common.each(["updateDisplay","onChange","onFinishChange","step","min","max"],(function(e){var t=n[e],a=r[e];n[e]=r[e]=function(){var e=Array.prototype.slice.call(arguments);return a.apply(r,e),t.apply(n,e)}})),dom.addClass(t,"has-slider"),n.domElement.insertBefore(r.domElement,n.domElement.firstElementChild)}else if(n instanceof NumberControllerBox){var a=function(t){if(Common.isNumber(n.__min)&&Common.isNumber(n.__max)){var r=n.__li.firstElementChild.firstElementChild.innerHTML,a=n.__gui.__listening.indexOf(n)>-1;n.remove();var i=_add(e,n.object,n.property,{before:n.__li.nextElementSibling,factoryArgs:[n.__min,n.__max,n.__step]});return i.name(r),a&&i.listen(),i}return t};n.min=Common.compose(a,n.min),n.max=Common.compose(a,n.max)}else n instanceof BooleanController?(dom.bind(t,"click",(function(){dom.fakeEvent(n.__checkbox,"click")})),dom.bind(n.__checkbox,"click",(function(e){e.stopPropagation()}))):n instanceof FunctionController?(dom.bind(t,"click",(function(){dom.fakeEvent(n.__button,"click")})),dom.bind(t,"mouseover",(function(){dom.addClass(n.__button,"hover")})),dom.bind(t,"mouseout",(function(){dom.removeClass(n.__button,"hover")}))):n instanceof ColorController&&(dom.addClass(t,"color"),n.updateDisplay=Common.compose((function(e){return t.style.borderLeftColor=n.__color.toString(),e}),n.updateDisplay),n.updateDisplay());n.setValue=Common.compose((function(t){return e.getRoot().__preset_select&&n.isModified()&&markPresetModified(e.getRoot(),!0),t}),n.setValue)}(e,l,a),e.__controllers.push(a),a}function getLocalStorageHash(e,t){return document.location.href+"."+t}function addPresetOption(e,t,n){var r=document.createElement("option");r.innerHTML=t,r.value=t,e.__preset_select.appendChild(r),n&&(e.__preset_select.selectedIndex=e.__preset_select.length-1)}function showHideExplain(e,t){t.style.display=e.useLocalStorage?"block":"none"}function addSaveMenu(e){var t=e.__save_row=document.createElement("li");dom.addClass(e.domElement,"has-save"),e.__ul.insertBefore(t,e.__ul.firstChild),dom.addClass(t,"save-row");var n=document.createElement("span");n.innerHTML=" ",dom.addClass(n,"button gears");var r=document.createElement("span");r.innerHTML="Save",dom.addClass(r,"button"),dom.addClass(r,"save");var a=document.createElement("span");a.innerHTML="New",dom.addClass(a,"button"),dom.addClass(a,"save-as");var i=document.createElement("span");i.innerHTML="Revert",dom.addClass(i,"button"),dom.addClass(i,"revert");var s=e.__preset_select=document.createElement("select");if(e.load&&e.load.remembered?Common.each(e.load.remembered,(function(t,n){addPresetOption(e,n,n===e.preset)})):addPresetOption(e,"Default",!1),dom.bind(s,"change",(function(){for(var t=0;t<e.__preset_select.length;t++)e.__preset_select[t].innerHTML=e.__preset_select[t].value;e.preset=this.value})),t.appendChild(s),t.appendChild(n),t.appendChild(r),t.appendChild(a),t.appendChild(i),SUPPORTS_LOCAL_STORAGE){var o=document.getElementById("dg-local-explain"),l=document.getElementById("dg-local-storage");document.getElementById("dg-save-locally").style.display="block","true"===localStorage.getItem(getLocalStorageHash(0,"isLocal"))&&l.setAttribute("checked","checked"),showHideExplain(e,o),dom.bind(l,"change",(function(){e.useLocalStorage=!e.useLocalStorage,showHideExplain(e,o)}))}var d=document.getElementById("dg-new-constructor");dom.bind(d,"keydown",(function(e){!e.metaKey||67!==e.which&&67!==e.keyCode||SAVE_DIALOGUE.hide()})),dom.bind(n,"click",(function(){d.innerHTML=JSON.stringify(e.getSaveObject(),void 0,2),SAVE_DIALOGUE.show(),d.focus(),d.select()})),dom.bind(r,"click",(function(){e.save()})),dom.bind(a,"click",(function(){var t=prompt("Enter a new preset name.");t&&e.saveAs(t)})),dom.bind(i,"click",(function(){e.revert()}))}function addResizeHandle(e){var t=void 0;function n(n){return n.preventDefault(),e.width+=t-n.clientX,e.onResize(),t=n.clientX,!1}function r(){dom.removeClass(e.__closeButton,GUI.CLASS_DRAG),dom.unbind(window,"mousemove",n),dom.unbind(window,"mouseup",r)}function a(a){return a.preventDefault(),t=a.clientX,dom.addClass(e.__closeButton,GUI.CLASS_DRAG),dom.bind(window,"mousemove",n),dom.bind(window,"mouseup",r),!1}e.__resize_handle=document.createElement("div"),Common.extend(e.__resize_handle.style,{width:"6px",marginLeft:"-3px",height:"200px",cursor:"ew-resize",position:"absolute"}),dom.bind(e.__resize_handle,"mousedown",a),dom.bind(e.__closeButton,"mousedown",a),e.domElement.insertBefore(e.__resize_handle,e.domElement.firstElementChild)}function setWidth(e,t){e.domElement.style.width=t+"px",e.__save_row&&e.autoPlace&&(e.__save_row.style.width=t+"px"),e.__closeButton&&(e.__closeButton.style.width=t+"px")}function getCurrentPreset(e,t){var n={};return Common.each(e.__rememberedObjects,(function(r,a){var i={},s=e.__rememberedObjectIndecesToControllers[a];Common.each(s,(function(e,n){i[n]=t?e.initialValue:e.getValue()})),n[a]=i})),n}GUI.toggleHide=function(){hide=!hide,Common.each(hideableGuis,(function(e){e.domElement.style.display=hide?"none":""}))},GUI.CLASS_AUTO_PLACE="a",GUI.CLASS_AUTO_PLACE_CONTAINER="ac",GUI.CLASS_MAIN="main",GUI.CLASS_CONTROLLER_ROW="cr",GUI.CLASS_TOO_TALL="taller-than-window",GUI.CLASS_CLOSED="closed",GUI.CLASS_CLOSE_BUTTON="close-button",GUI.CLASS_CLOSE_TOP="close-top",GUI.CLASS_CLOSE_BOTTOM="close-bottom",GUI.CLASS_DRAG="drag",GUI.DEFAULT_WIDTH=245,GUI.TEXT_CLOSED="Close Controls",GUI.TEXT_OPEN="Open Controls",GUI._keydownHandler=function(e){"text"===document.activeElement.type||72!==e.which&&72!==e.keyCode||GUI.toggleHide()},dom.bind(window,"keydown",GUI._keydownHandler,!1),Common.extend(GUI.prototype,{add:function(e,t){return _add(this,e,t,{factoryArgs:Array.prototype.slice.call(arguments,2)})},addColor:function(e,t){return _add(this,e,t,{color:!0})},remove:function(e){this.__ul.removeChild(e.__li),this.__controllers.splice(this.__controllers.indexOf(e),1);var t=this;Common.defer((function(){t.onResize()}))},destroy:function(){if(this.parent)throw new Error("Only the root GUI should be removed with .destroy(). For subfolders, use gui.removeFolder(folder) instead.");this.autoPlace&&autoPlaceContainer.removeChild(this.domElement);var e=this;Common.each(this.__folders,(function(t){e.removeFolder(t)})),dom.unbind(window,"keydown",GUI._keydownHandler,!1),removeListeners(this)},addFolder:function(e){if(void 0!==this.__folders[e])throw new Error('You already have a folder in this GUI by the name "'+e+'"');var t={name:e,parent:this};t.autoPlace=this.autoPlace,this.load&&this.load.folders&&this.load.folders[e]&&(t.closed=this.load.folders[e].closed,t.load=this.load.folders[e]);var n=new GUI(t);this.__folders[e]=n;var r=addRow(this,n.domElement);return dom.addClass(r,"folder"),n},removeFolder:function(e){this.__ul.removeChild(e.domElement.parentElement),delete this.__folders[e.name],this.load&&this.load.folders&&this.load.folders[e.name]&&delete this.load.folders[e.name],removeListeners(e);var t=this;Common.each(e.__folders,(function(t){e.removeFolder(t)})),Common.defer((function(){t.onResize()}))},open:function(){this.closed=!1},close:function(){this.closed=!0},hide:function(){this.domElement.style.display="none"},show:function(){this.domElement.style.display=""},onResize:function(){var e=this.getRoot();if(e.scrollable){var t=dom.getOffset(e.__ul).top,n=0;Common.each(e.__ul.childNodes,(function(t){e.autoPlace&&t===e.__save_row||(n+=dom.getHeight(t))})),window.innerHeight-t-20<n?(dom.addClass(e.domElement,GUI.CLASS_TOO_TALL),e.__ul.style.height=window.innerHeight-t-20+"px"):(dom.removeClass(e.domElement,GUI.CLASS_TOO_TALL),e.__ul.style.height="auto")}e.__resize_handle&&Common.defer((function(){e.__resize_handle.style.height=e.__ul.offsetHeight+"px"})),e.__closeButton&&(e.__closeButton.style.width=e.width+"px")},onResizeDebounced:Common.debounce((function(){this.onResize()}),50),remember:function(){if(Common.isUndefined(SAVE_DIALOGUE)&&((SAVE_DIALOGUE=new CenteredDiv).domElement.innerHTML=saveDialogContents),this.parent)throw new Error("You can only call remember on a top level GUI.");var e=this;Common.each(Array.prototype.slice.call(arguments),(function(t){0===e.__rememberedObjects.length&&addSaveMenu(e),-1===e.__rememberedObjects.indexOf(t)&&e.__rememberedObjects.push(t)})),this.autoPlace&&setWidth(this,this.width)},getRoot:function(){for(var e=this;e.parent;)e=e.parent;return e},getSaveObject:function(){var e=this.load;return e.closed=this.closed,this.__rememberedObjects.length>0&&(e.preset=this.preset,e.remembered||(e.remembered={}),e.remembered[this.preset]=getCurrentPreset(this)),e.folders={},Common.each(this.__folders,(function(t,n){e.folders[n]=t.getSaveObject()})),e},save:function(){this.load.remembered||(this.load.remembered={}),this.load.remembered[this.preset]=getCurrentPreset(this),markPresetModified(this,!1),this.saveToLocalStorageIfPossible()},saveAs:function(e){this.load.remembered||(this.load.remembered={},this.load.remembered.Default=getCurrentPreset(this,!0)),this.load.remembered[e]=getCurrentPreset(this),this.preset=e,addPresetOption(this,e,!0),this.saveToLocalStorageIfPossible()},revert:function(e){Common.each(this.__controllers,(function(t){this.getRoot().load.remembered?recallSavedValue(e||this.getRoot(),t):t.setValue(t.initialValue),t.__onFinishChange&&t.__onFinishChange.call(t,t.getValue())}),this),Common.each(this.__folders,(function(e){e.revert(e)})),e||markPresetModified(this.getRoot(),!1)},listen:function(e){var t=0===this.__listening.length;this.__listening.push(e),t&&function e(t){0!==t.length&&requestAnimationFrame$1.call(window,(function(){e(t)})),Common.each(t,(function(e){e.updateDisplay()}))}(this.__listening)},updateDisplay:function(){Common.each(this.__controllers,(function(e){e.updateDisplay()})),Common.each(this.__folders,(function(e){e.updateDisplay()}))}});var GUI$1=GUI;class MaterialCreator{static createMeshPhysicalMaterial(e){return new MeshPhysicalMaterial(e)}static createMeshStandardMaterial(e){return new MeshStandardMaterial(e)}}const getScreenXY=(e,t,n,r)=>{if(!e||!t||0===n||0===r)return new Vector3;let a=e.clone(),i=n/2,s=r/2;return a.project(t),a.x=Math.floor(a.x*i+i),a.y=Math.floor(-a.y*s+s),a.z=e.distanceTo(t.position),a},kernelBoxToThreeBox=(e,t)=>{t||(t=new Vector3(0,0,0));let n=new Vector3(e.size.x/1e3,e.size.z/1e3,e.size.y/1e3),r=new Vector3(e.origin.x/1e3,e.origin.z/1e3,e.origin.y/-1e3),a=new Vector3(0,0,-n.z).add(r).sub(t),i=new Vector3(n.x,n.y,0).add(r).add(t);return new Box3(a,i)},position3VectorsAreEqual=(e,t)=>{let n=round(e.x),r=round(e.y),a=round(e.z),i=round(t.x),s=round(t.y),o=round(t.z);return n===i&&r===s&&a===o},rotationQuaternionsAreEqual=(e,t)=>{let n=round(e.w),r=round(e.x),a=round(e.y),i=round(e.z),s=round(t.w),o=round(t.x),l=round(t.y),d=round(t.z);return n===s&&r===o&&a===l&&i===d},position2VectorsAreEqual=(e,t)=>{let n=round(e.x),r=round(e.y),a=round(t.x),i=round(t.y);return n===a&&r===i};let whiteTexture=null;const getWhiteTexture=()=>{if(whiteTexture)return whiteTexture;const e=new Uint8Array(4);for(let t=0;t<1;t++){const n=4*t;e[n]=255,e[n+1]=255,e[n+2]=255,e[n+3]=255}const t=new DataTexture(e,1,1,RGBAFormat);return t.needsUpdate=!0,t},createColorTexture=(e,t,n,r)=>{const a=new Uint8Array(4),i=Math.floor(255*e),s=Math.floor(255*t),o=Math.floor(255*n),l=Math.floor(255*r);for(let e=0;e<4;e++){const t=4*e;a[t]=i,a[t+1]=s,a[t+2]=o,a[t+3]=l}const d=new DataTexture(a,1,1,RGBAFormat);return d.needsUpdate=!0,d},createMaterial=e=>setMaterial(null,e),setMaterial=(e,t)=>{e||(e=createMeshPhysicalMaterial()),e.name=t.id?t.id.toString():"",void 0!==t.shading.metallic&&(e.metalness=1===t.shading.metallic?1:.5,e.reflectivity=getValue(t.shading.metallic,.5));let n=!1;if(t.shading.transmission&&t.shading.transmission>0?(e.opacity=1-t.shading.transmission,e.transparent=!0,e.depthWrite=!1,e.metalness=0,n=!0):void 0!==t.shading.alpha&&t.shading.alpha<1&&(e.transparent=t.shading.alpha<1,e.opacity=t.shading.alpha,e.depthWrite=t.shading.alpha>=1,e.metalness=.5*Math.max(0,t.shading.alpha),n=!0),e.aoMapIntensity=getValue(t.shading.occlusion,1),e.roughness=getValue(t.shading.roughness,.5),e.alphaTest=getValue(t.shading.alphaCutoff,0),void 0!==t.shading.basecolor){const n=new Color$1(t.shading.basecolor.r,t.shading.basecolor.g,t.shading.basecolor.b);e.color.copy(n.convertSRGBToLinear())}return n||t.shading.doubleSided?e.side=DoubleSide:e.side=FrontSide,e.map||(whiteTexture||(whiteTexture=getWhiteTexture()),e.map=whiteTexture),e},createMeshPhysicalMaterial=()=>MaterialCreator.createMeshPhysicalMaterial({}),getMaterialShading=e=>{let t=e.color.clone().convertLinearToSRGB(),n={alpha:e.opacity,metallic:e.reflectivity,basecolor:{r:t.r,g:t.g,b:t.b},roughness:e.roughness,doubleSided:e.side===DoubleSide,alphaCutoff:e.alphaTest,transmission:e.transmission};return 1===e.metalness?n.metallic=1:n.metallic=e.reflectivity,n};let textureLoader=null;const addTexture=(e,t,n,r,a,i,s=16)=>(textureLoader||(textureLoader=new TextureLoader,textureLoader.crossOrigin=""),new Promise((o,l)=>{if(!e)return console.warn("trying to add a texture without image",t),void o();textureLoader.load(e,e=>{addExistingTexture(e,t,n,r,a,i,s),o()},l)})),addExistingTexture=(e,t,n,r,a,i,s=16)=>{e.anisotropy=r,e.wrapS=RepeatWrapping,e.wrapT=RepeatWrapping,"ORM"===t.mapping&&s<=8?console.warn("ORM maps are not supported on devices with only "+s+" texture units"):(e.repeat.set(a,i),"XYZ"===t.mapping?(n.normalMap=e,n.map===getWhiteTexture()&&(n.map=null)):"ORM"===t.mapping?(n.aoMap=e,n.roughnessMap=e,n.metalnessMap=e):(e.colorSpace=SRGBColorSpace,n.map=e),"RGBA"===t.mapping&&(n.transparent=!0,n.name.includes("glow")&&(n.emissiveIntensity=.5,n.emissive=new Color$1(16777215),n.emissiveMap=n.map)),n.needsUpdate=!0)},getGUI=(e=!0)=>(window.__RML_GUI__||(window.__RML_GUI__=new GUI$1({autoPlace:e})),window.__RML_GUI__),hideWallsBasedOnCamera=(e,t)=>{let n=!1;for(const r of t){const t=r.getKernelObject();let a;if(2===t.wallType.value&&(a=convertToTHREE(t.rightNormal)),1===t.wallType.value&&(a=convertToTHREE(t.leftNormal)),!a)continue;let i=convertToTHREE(r.getPlanElement().getCenter());i=i.applyMatrix4(e.matrixWorldInverse),a=a.transformDirection(e.matrixWorldInverse);const s=i.dot(a)>=0;s!==r.getContainer().visible&&(n=!0),s?r.show():r.isSelected||r.hide()}return n},setWallTransparency=(e,t,n=!0)=>{if(!e.userData.tween)if(t)if(e.transparent=!0,n){let t={opacity:1};e.userData.tween=!0,new TWEEN.Tween(t).to({opacity:.2},400).easing(TWEEN.Easing.Sinusoidal.In).onUpdate(()=>{e.opacity=t.opacity}).onComplete(()=>{e.userData.tween=!1}).start()}else e.opacity=.2;else if(n){let t={opacity:.2};e.userData.tween=!0,new TWEEN.Tween(t).to({opacity:1},400).easing(TWEEN.Easing.Sinusoidal.In).onUpdate(()=>{e.opacity=t.opacity}).onComplete(()=>{e.transparent=!1,e.userData.tween=!1}).start()}else e.opacity=1,e.transparent=!1},transitionTransparencyOfMaterial=(e,t)=>{e.traverse(e=>{if(e instanceof Mesh&&TWEEN){const n=e.material;e.userData.tween&&e.userData.tween.stop();const r={opacity:n.opacity};t.transparent&&(n.transparent=t.transparent),e.userData.tween=new TWEEN.Tween(r).to(t,250).easing(TWEEN.Easing.Linear.None).onUpdate(()=>{n.opacity=r.opacity}).onStop(()=>{t.transparent||(n.transparent=t.transparent),n.opacity=t.opacity,n.needsUpdate=!0,e.userData.tween=void 0}).onComplete(()=>{t.transparent||(n.transparent=t.transparent),n.needsUpdate=!0,e.userData.tween=void 0}).start()}})},fadeIn=e=>{e.traverse(e=>{if(e instanceof Mesh&&TWEEN){let t=e.material;if(0===t.opacity)return;let n={opacity:0,transparent:!0},r={opacity:t.opacity,transparent:t.transparent};t.transparent=n.transparent,t.opacity=n.opacity,new TWEEN.Tween(n).to(r,500).easing(TWEEN.Easing.Linear.None).onUpdate(()=>{t.opacity=n.opacity}).onComplete(()=>{t.transparent=r.transparent}).start()}})},dispose=e=>{"Mesh"===e.type?disposeMesh(e):disposeObject(e)},disposeObject=e=>{e&&e.children&&0!==e.children.length&&e.children.forEach(e=>{disposeMesh(e)})},disposeMesh=e=>{e&&(e.material&&disposeMaterial(e.material),e.geometry&&disposeGeometry(e.geometry),e.children&&e.children.length>0&&disposeObject(e))},disposeGeometry=e=>{e&&e.dispose()},disposeMaterial=e=>{e&&(e.map&&e.map.dispose(),e.normalMap&&e.normalMap.dispose(),e.dispose())};let boundingBoxMaterial;const vectorIsZero=e=>0===e.x&&0===e.y&&0===e.z,getMaterialId=(e,t)=>{let n="";return e||""===e?(e.materialId&&""!==e.materialId?n=e.materialId:e.catalogItemId&&""!==e.catalogItemId?n=e.catalogItemId:e.rgbValue>0?n="rgb"+JSON.stringify(e.rgbValue):e.length>0?n=e:t&&1===t.value?n="default_wall_material_"+e.getSourceType().value:t&&7===t.value&&(n="default_ceiling_material_"+e.getSourceType().value),n):null},getYRotationOfObject=e=>{let t=e.getWorldDirection(new Vector3).clone();t.y=0,t.lengthSq()<.01&&(t=new Vector3(0,1,0),t.applyQuaternion(e.quaternion),t.y=0),t.normalize();let n=Math.asin(t.x);return t.z<0&&(n=Math.PI-n),n<0&&(n+=2*Math.PI),n},compareBox3Size=(e,t)=>{if(!e||!t)return 0;const n=e.clone().expandByScalar(.001).containsBox(t),r=t.clone().expandByScalar(.001).containsBox(e);return r&&n||!r&&!n?0:!0===n?1:-1},getDrawingMinBounds=(e,t,n,r=1)=>{const a=t>n,i=a?15:0,s=a?0:10,o=e.getSize(new Vector3),l=e.getCenter(new Vector3);let d=o.x>2*i?o.x/2:i,h=o.z>2*s?o.z/2:s;return d*=r,h*=r,new Box3(new Vector3(l.x-d,l.y,l.z-h),new Vector3(l.x+d,l.y,l.z+h))},threeVectorToTransferableXY=e=>{const{x:t,y:n}=e;return{x:t,y:n}},threeVectorToTransferableXYZ=e=>{const{x:t,y:n,z:r}=e;return{x:t,y:n,z:r}},viewSpacePositionFromUV=(e,t,n)=>(new Vector3).setFromSphericalCoords(e,Math.PI*(1-n),2*Math.PI*(1-t)),CAMERA_TYPE={CAMERA_2D:"2D",CAMERA_3D:"3D",CAMERA_FP:"FP"},sanitizedCameraMode=e=>{if(!e)return CAMERA_TYPE.CAMERA_3D;let t=e.toUpperCase();return-1===Object.values(CAMERA_TYPE).indexOf(t)&&(t=CAMERA_TYPE.CAMERA_3D),t};var ENV_HDR_256_FILE_NAME="static/default_256-f1c66a2764f88cc0.exr";class InitData{constructor(e){this.autoQuality=!1,this.colors=ROOMLE_COLORS,this.unit=null,this.unitStringType=null,this.meshSelection=!0,this.stats=!1,this._measureTraffic=!1,this.disableDebugGUI=!1,this.disableEnvMap=!1,this.envMapUrl="static/default_256-f1c66a2764f88cc0.exr",this.envMapIntensity=1.5,this.envMapRotation=0,this.maxLightSources=-1,this.legacyLight=!1,this.restrictionLevel=0,this.highlighting=ROOMLE_HIGHLIGHTNG.SMART,this.dls=null,this.ls=null,this.cameraSpacing=0,this.transparentHighlighting=!0,this.featureFlags={pulsePreview:!1,reDock:!1},this.mode=CAMERA_TYPE.CAMERA_3D,this.edit=!1,this.moc=!1,this.callbacksOnlyIfGeometryIsReady=!0,this._creator_=e}setOverrides(e){deepMerge(this,e)}}const BROWSER_LANGUAGE_PROPERTY_KEYS_KNOWN=["language","browserLanguage","userLanguage","systemLanguage"],isSafari=/^((?!chrome|android).)*safari/i.test(navigator.userAgent);class GlobalInitData{constructor(e){this.locale=((e=null)=>{const t=window.navigator;if(e)return e.substr(0,2);if(Array.isArray(t.languages)&&t.languages.length>0)return t.languages[0].substr(0,2);for(let e=0,n=BROWSER_LANGUAGE_PROPERTY_KEYS_KNOWN.length;e<n;e++){const n=t[BROWSER_LANGUAGE_PROPERTY_KEYS_KNOWN[e]];if(n)return n.substr(0,2)}return"en"})()||"en",this.overrideCountry=null,this._creator_=e}setOverrides(e){deepMerge(this,e)}}class UiCallback{_setMute(e){setWriteable(this,"_isMute",!0),this._isMute=e,setWriteable(this,"_isMute",!1)}mute(){this._setMute(!0)}unmute(){this._setMute(!1)}constructor(e){return this._isMute=!1,this.cameraStartsMoving=()=>{},this._creator_=e,setDescriptor(this,"_isMute",{enumerable:!1,writable:!1}),setDescriptor(UiCallback.prototype,"_setMute",{enumerable:!1,writable:!1}),setDescriptor(UiCallback.prototype,"mute",{enumerable:!1,writable:!1}),setDescriptor(UiCallback.prototype,"unmute",{enumerable:!1,writable:!1}),new Proxy(this,this)}get(e,t){return this._isMute&&"function"==typeof this[t]&&"on"===t.substr(0,2)?()=>{}:this[t]}}class GlobalCallback extends UiCallback{constructor(){super(...arguments),this.onNetworkRequest=(e,t,n)=>{},this.onKernelMsg=(e,t,n={})=>{},this.onCheckExternalCache=async(e,t)=>Promise.resolve(null),this.onValidateNetworkResponse=(e,t)=>Promise.resolve(!0)}}const CANVAS_ID={HSC:"rml-configurator",HSP:"rml-hsp",GLB:"rml-glb",RMV:"rml-mv"};class DomHelper{get element(){return this._container}constructor(e){this._creator_=e,this._lifeCycleManager.addEventListener(this)}setDomElement(e){if(!this._container){this._container=document.createElement("div"),this._container.classList.add("rml-threejs-canvas-container"),this._container.setAttribute("ondragover","return false"),this._container.style.position="relative",this._container.style.width="100%",this._container.style.height="100%";const t=document.createElement("style");t.innerText=".rml-threejs-canvas-container canvas{position:absolute;top:0;left:0;right:0;bottom:0;z-index:100; opacity:1;}",this._container.appendChild(t),e.appendChild(this._container)}this._element=e}getClientDimensions(){return new Vector2(this._element.clientWidth,this._element.clientHeight)}_removeDomElement(e){if(!e)return;const t=e.parentElement;t&&t.removeChild(e)}reset(){this._element=null,this._removeDomElement(this._container),this._container=null}pause(){this.reset()}resume(){}destroy(){}}__decorate([inject],DomHelper.prototype,"_lifeCycleManager",void 0);class ScenePluginDefaultImplementation{constructor(e){this._creator_=e}setScene(e){}setUiScene(e){}updateBounds(e){}clearScene(e,t){}moveCameraEnd(e){}moveCameraStart(e){}needsUiScene(){return!1}}class PluginSystem{constructor(e){this._plugins=[],this._creator_=e}async init(e,t,n){this._scene=e,this._uiScene=t,this._cameraPosition=n;const{bananaForScale:r}=this._initData;r&&await import("./banana-for-scale-ae26de56.js").then(({default:e})=>this._plugins.push(new e(this._creator_))),this._plugins.forEach(e=>e.setScene(this._scene)),this._plugins.forEach(e=>e.setUiScene(this._uiScene)),this._plugins.forEach(e=>e.updateBounds(this._bounds)),this._plugins.forEach(e=>e.moveCameraEnd(this._cameraPosition))}addPlugin(e){this._plugins.push(e),e.setScene(this._scene),e.setUiScene(this._uiScene),e.updateBounds(this._bounds),e.moveCameraEnd(this._cameraPosition)}updateBounds(e){this._bounds=e,this._plugins.forEach(t=>t.updateBounds(e))}clearScene(e,t){this._plugins.forEach(n=>n.clearScene(e,t))}getActivePlugins(){return this._plugins}getPlugin(e){for(let t of this._plugins)if(t instanceof e)return t;return null}moveCameraEnd(e){this._cameraPosition=e,this._plugins.forEach(t=>t.moveCameraEnd(e))}moveCameraStart(e){this._cameraPosition=e,this._plugins.forEach(t=>t.moveCameraStart(e))}needsUiScene(){return this._plugins.map(e=>e.needsUiScene()).reduce((e,t)=>e||t,!1)}}__decorate([inject],PluginSystem.prototype,"_initData",void 0);class PromiseQueue{constructor(e,t){this._waitingPromises=[],this._finishPromiseExecutor=[],this._errorCallback=()=>{},Promise.allSettled=Promise.allSettled||(e=>Promise.all(e.map(e=>e.then(e=>({status:"fulfilled",value:e})).catch(e=>({status:"rejected",reason:e}))))),e&&this.registerCallback(e),t&&(this._errorCallback=t)}push(e){this._waitingPromises.push(e),Promise.all(this._waitingPromises).then(e=>{e.length===this._waitingPromises.length&&(this._callback&&this._callback(e),this._waitingPromises=[])},this._errorCallback)}finished(e=!1){return new Promise((t,n)=>{this._finishPromiseExecutor.push({resolve:t,reject:n});const r=e?"allSettled":"all";Promise[r](this._waitingPromises).then(e=>{if("allSettled"===r){const t=[];e.forEach(({value:e,status:n})=>{"fulfilled"===n&&t.push(e)}),this._resolveAllExecutors(t)}else this._resolveAllExecutors(e)},e=>{this._rejectAllExecutors(e)})})}registerCallback(e){this._callback=e}unregisterCallback(){this._callback=null}_resolveAllExecutors(e){this._finishPromiseExecutor.forEach(({resolve:t})=>t(e)),this._finishPromiseExecutor=[]}_rejectAllExecutors(e){this._finishPromiseExecutor.forEach(({reject:t})=>t(e)),this._finishPromiseExecutor=[]}clear(){const e=this._waitingPromises.length>0;this._waitingPromises=[],e?this._rejectAllExecutors(new Error("Promise queue has been cleared")):this._resolveAllExecutors([])}get length(){return this._waitingPromises.length}}class MeshGenerator{constructor(e){this.materialQueue=new PromiseQueue,this._geometryComponentMaterialCache=new Map,this._maxAnisotropy=1,this._maxTextures=16,this._textureLoader=new TextureLoader,this._configuratorPreviewMaterial=MaterialCreator.createMeshStandardMaterial({color:"#DDDDDD",transparent:!0,opacity:1,roughness:1,envMap:null,polygonOffset:!0,polygonOffsetFactor:-1}),this._creator_=e,this._previewMaterial=MaterialCreator.createMeshStandardMaterial({color:"#DDDDDD",roughness:1,metalness:0})}getGeometry(e){return e&&this._cacheHolder.geometryCache.has(e)?this._cacheHolder.geometryCache.get(e):null}_generateGeometry(e,t,n,r,a){let i;return e&&this._cacheHolder.geometryCache.has(e)?i=this._cacheHolder.geometryCache.get(e):(i=new BufferGeometry,i.setIndex(new Uint32BufferAttribute(n,1)),i.setAttribute("position",new Float32BufferAttribute(t,3)),i.setAttribute("normal",new Float32BufferAttribute(a,3)),i.setAttribute("uv",new Float32BufferAttribute(r,2)),i.scale(.001,.001,.001),i.rotateX(-Math.PI/2),e&&this._cacheHolder.geometryCache.set(e,i)),i}changeMaterialOfMesh(e,t,n){e&&t?(e.material=t,e.material.transparent||0===e.material.opacity||e.material.transmission>0?(e.castShadow=!1,e.receiveShadow=!1):(e.castShadow=!0,e.receiveShadow=!0),e.material.needsUpdate=!0,this._materialLoaded&&this._materialLoaded(t),this._updateMaterialProperties(e,n)):console.warn("could not assign material to mesh",{mesh:e},{material:t})}_updateMaterialProperties(e,t){var n;if(t&&Object.keys(t).length>0&&e.material instanceof MeshStandardMaterial){const r=e.material.clone();r.userData.materialAttributes=t,t.color&&(r.color=new Color$1(t.color)),t.alpha&&(r.opacity=parseFloat(t.alpha)),t.roughness&&(r.roughness=parseFloat(t.roughness)),t.metallic&&(r.metalness=parseFloat(t.metallic)),r instanceof MeshPhysicalMaterial&&t.transmission&&(r.transmission=parseFloat(t.transmission)),r.transparent=r.opacity<1;const a=e.material;e.material=r,(null===(n=a.userData)||void 0===n?void 0:n.materialAttributes)&&a.dispose()}}_createMaterial(e,t,n,r,a){if(this._cacheHolder.materialCache.has(e))t();else if(e.startsWith("benchmarkMaterial")){let i=createBenchmarkMaterial(e),s=createMaterial(i);this._loadBenchmarkTextures(i,s,r,a).then(t,n)}else this._rapiAccess.getMaterial(e).then(e=>{let i=createMaterial(e);this._loadTextures(e,i,r,a).then(t,n)},n)}_loadBenchmarkTextures(e,t,n=1,r=1){return new Promise((a,i)=>{const s=createBenchmarkTexture(e.id);addTexture(this._dataSyncer.requestAsset(s.image,!0),s,t,this._maxAnisotropy,n/(0===s.mmWidth?1:s.mmWidth),r/(0===s.mmHeight?1:s.mmHeight),this._maxTextures).then(()=>{this._cacheHolder.materialCache.set(e.id,t),a()},i)})}_loadTextures(e,t,n=1,r=1){return new Promise((a,i)=>{if(!e.textures||e.textures&&0===e.textures.length)return this._cacheHolder.materialCache.set(e.id,t),a();this._rapiAccess.getTexturesOf(e).then(s=>{let o=[];s.forEach(e=>{o.push(addTexture(this._dataSyncer.requestAsset(e.image,!0),e,t,this._maxAnisotropy,n/(0===e.mmWidth?1:e.mmWidth),r/(0===e.mmHeight?1:e.mmHeight),this._maxTextures))}),Promise.all(o).then(()=>{this._cacheHolder.materialCache.set(e.id,t),a()},i)})})}_loadMaterial(e,t,n){return new Promise((r,a)=>{this._singlePromiseFactory.create(6,e,(r,a)=>this._createMaterial(e,r,a,t,n)).then(()=>{setTimeout(()=>r(this._cacheHolder.materialCache.get(e)),0)},a)})}_assignMaterial(e,t,n){return this._cacheHolder.materialCache.has(t)?(this.changeMaterialOfMesh(e,this._cacheHolder.materialCache.get(t),n),Promise.resolve()):new Promise((r,a)=>{this._loadMaterial(t).then(a=>{e.userData.materialId===t&&this.changeMaterialOfMesh(e,a,n),r()},a)})}get maxAnisotropy(){return this._maxAnisotropy}set maxAnisotropy(e){this._maxAnisotropy=e}get maxTextures(){return this._maxTextures}set maxTextures(e){this._maxTextures=e}clear(){this._cacheHolder.clear()}_assignRGB(e,t){return new Promise(n=>{let r,a="rgb"+JSON.stringify(t);this._cacheHolder.materialCache.has(a)?r=this._cacheHolder.materialCache.get(a):(r=MaterialCreator.createMeshPhysicalMaterial({color:t}),this._cacheHolder.materialCache.set(a,r)),this.changeMaterialOfMesh(e,r),setTimeout(()=>n(),0)})}_assignItem(e,t){return new Promise((n,r)=>{if(this._cacheHolder.materialCache.has(t))return this.changeMaterialOfMesh(e,this._cacheHolder.materialCache.get(t)),void n();this._rapiAccess.getItem(t).then(a=>{if(a.topImage)this._textureLoader.load(a.topImage,r=>{r.anisotropy=this._maxAnisotropy,r.wrapS=RepeatWrapping,r.wrapT=RepeatWrapping;let i=new Vector2(1,1);a.width>0&&(i.x=1/a.width),a.depth>0&&(i.y=1/a.depth),r.repeat.set(i.x,i.y);const s=MaterialCreator.createMeshPhysicalMaterial({map:r,roughness:.5,metalness:.1});this._cacheHolder.materialCache.set(t,s),this.changeMaterialOfMesh(e,s),setTimeout(()=>n(),0)});else{const e="can not set material, catalog item top image is not set";console.warn(e),r(e)}},r)})}setMaterialLoadedListener(e){this._materialLoaded=e}removeMaterialLoadedListener(){this._materialLoaded=void 0}_createMesh(e,t,n){if(e&&t){const r=this._getComponentMeshId(e,t);if(this._geometryComponentMaterialCache.has(r)){const e=this._geometryComponentMaterialCache.get(r);if(this._cacheHolder.materialCache.has(e)){const t=this._cacheHolder.materialCache.get(e);return new Mesh(n,t)}}}return new Mesh(n,this._configuratorPreviewMaterial.clone())}_getComponentMeshId(e,t){return e+"_"+t}}__decorate([inject],MeshGenerator.prototype,"_initData",void 0),__decorate([inject],MeshGenerator.prototype,"_rapiAccess",void 0),__decorate([inject],MeshGenerator.prototype,"_dataSyncer",void 0),__decorate([inject],MeshGenerator.prototype,"_singlePromiseFactory",void 0),__decorate([inject],MeshGenerator.prototype,"_cacheHolder",void 0),__decorate([inject],MeshGenerator.prototype,"_plannerMeshGenerator",void 0);class ConfiguratorMeshGenerator extends MeshGenerator{constructor(e){super(e)}generateMesh(e=0,t=null,n,r,a,i,s,o=!1,l){let d;d=o?this._generateGeometry(t,r,a,i,s).clone():this._generateGeometry(t,r,a,i,s);const h=this._createMesh(e,t,d);return h.userData.materialId=n,h.layers.set(4),n&&this.materialQueue.push(this._assignMaterial(h,n,l).then(()=>{e&&t&&this._geometryComponentMaterialCache.set(this._getComponentMeshId(e,t),n)})),h}setMaterial(e,t,n,r){return this._assignMaterial(e,t,r)}loadMaterial(e,t,n){return super._loadMaterial(e,t,n)}loadTextures(e,t,n,r){return super._loadTextures(e,t,n,r)}}class EventDispatcher{constructor(){this._listeners={},this._disabled=!1}_addEventListener(e,t,n){this._listeners[e]||(this._listeners[e]=[]),this._listeners[e].push({callback:t,scope:n})}addEventListener(e,t,n){this._addEventListener(e,t,n)}dispatchEvent(e,t){if(!this._listeners[e]||this._disabled)return;const n=this._listeners[e];let r=n.length;for(let e=0;e<r;e++){const r=n[e];t?r.callback.apply(r.scope,[t]):r.callback.call(r.scope)}}removeEventListener(e,t){const n=this._listeners[e];if(n)for(let e=0,r=n.length;e<r;e++)if(n[e].callback===t)return void n.splice(e,1)}enableEvents(){this._disabled=!1}disableEvents(){this._disabled=!0}}const BROWSER_EVENTS={SCROLL:"scroll",MOUSE_MOVE:"mousemove",MOUSE_DOWN:"mousedown",MOUSE_UP:"mouseup",MOUSE_LEAVE:"mouseleave",MOUSE_ENTER:"mouseenter",MOUSE_WHEEL:"wheel",TOUCH_MOVE:"touchmove",TOUCH_START:"touchstart",TOUCH_END:"touchend",CONTEXT_MENU:"contextmenu",DOUBLE_CLICK:"dblclick"},INPUT_DELAY_TYPE={DRAG:50};class InputEvent{constructor(e,t,n,r,a){this.position=e,this.positionRelative=t,this.type=n,this.rotation=r,this.event=a}}const MIN_MOVE_DISTANCE=5*window.devicePixelRatio,MIN_DOLLY_DISTANCE=3*window.devicePixelRatio;class InputManager extends EventDispatcher{constructor(e){super(),this._elementHit=!1,this._delta=-1,this._state=0,this._pinchDistance=-1,this._rotationAngle=-1,this._lastMouseWheelEvent=null,this._lastTouchEvent=null,this._events=Object.keys(BROWSER_EVENTS).map(e=>BROWSER_EVENTS[e]),this._boundingClientRectInvalid=!0,this._creator_=e,this._downPosition={x:0,y:0},this._downPositionRelative={x:0,y:0},this._boundingClientRect=this._getBoundingClientRect()}enableDragIn(e){this._setState(1),this._dragEnabled=!0,e&&(this._dragMV=this._dragM.bind(this),this._dragEV=this._dragE.bind(this),this._dragTarget=e.currentTarget||e.target,this._delta=-1,this._dragMVName="drag",this._dragEVName="dragend",window.TouchEvent&&e instanceof TouchEvent?(this._dragMVName="touchmove",this._dragEVName="touchend"):e.dataTransfer&&e.dataTransfer.setData&&e.dataTransfer.setData("text/plain"," "),this._firefoxDragPosition={x:0,y:0},document.ondragover=e=>{e=e||window.event,this._firefoxDragPosition.x=e.pageX,this._firefoxDragPosition.y=e.pageY},this._dragTarget.addEventListener(this._dragMVName,this._dragMV,!1),this._dragTarget.addEventListener(this._dragEVName,this._dragEV,!1))}isMouseUp(){return 0===this._state}_dragM(e){let t=e,n=null,r=null;window.TouchEvent&&e instanceof TouchEvent?(n=this._getTouchPosition(t),r=this._getTouchPositionRelative(t)):(n=this._getMousePosition(t),r=this._getMousePositionRelative(t)),n.x>0&&n.y>0&&this._move(n,r)}_dragE(e){let t=e;document.ondragover=null,this._firefoxDragPosition=null,this._dragTarget.removeEventListener(this._dragMVName,this._dragMV),this._dragTarget.removeEventListener(this._dragEVName,this._dragEV),window.TouchEvent&&e instanceof TouchEvent?this._onUp(this._getTouchPosition(t),this._getTouchPositionRelative(t),2):this._onUp(this._getMousePosition(t),this._getMousePositionRelative(t),1)}addEvents(e){this._events.forEach(t=>e.addEventListener(t,this,!1)),null===window||void 0===window||window.addEventListener("scroll",this,!1)}removeEvents(e){this._events.forEach(t=>e.removeEventListener(t,this)),null===window||void 0===window||window.removeEventListener("scroll",this)}_move2(e){if(this._lastTouchEvent&&e.timeStamp-this._lastTouchEvent.timeStamp<16)return;const t=e.touches[0],n=e.touches[1],r=t.pageX-n.pageX,a=t.pageY-n.pageY,i=Math.abs(r)+Math.abs(a);this._pinchDistance>-1&&(i>this._pinchDistance+MIN_DOLLY_DISTANCE?(this._setState(3),this.dispatchEvent(7,new InputEvent(this._getTouchPosition(e),this._getTouchPositionRelative(e)))):i<this._pinchDistance-MIN_DOLLY_DISTANCE?(this._setState(3),this.dispatchEvent(8,new InputEvent(this._getTouchPosition(e),this._getTouchPositionRelative(e)))):i<=this._pinchDistance+MIN_DOLLY_DISTANCE&&i>=this._pinchDistance-MIN_DOLLY_DISTANCE&&(this._setState(5),this.dispatchEvent(11,new InputEvent(this._getTouchPosition(e),this._getTouchPositionRelative(e))))),this._pinchDistance=i,this._lastTouchEvent=e}_setState(e){this._state=e}_move(e,t,n,r){void 0===n&&(n=0),void 0===this._dragEnabled&&(this._dragEnabled=!1),1===this._state&&this._canDrag(n)&&(this._delta=this._getDelta(e),(this._delta>MIN_MOVE_DISTANCE||this._elementHit)&&(this._setState(2),this._longClickTimer&&clearTimeout(this._longClickTimer),this.dispatchEvent(0,new InputEvent(this._downPosition,this._downPositionRelative)))),2===this._state&&this.dispatchEvent(1,new InputEvent(e,t)),this.dispatchEvent(6,new InputEvent(e,t,n,null,r))}_longClick(e){2!==e&&(this._setState(2),this._longClickTimer&&clearTimeout(this._longClickTimer),this.dispatchEvent(0,new InputEvent(this._downPosition,this._downPositionRelative)),this.dispatchEvent(1,new InputEvent(this._downPosition,this._downPositionRelative))),this.dispatchEvent(14,new InputEvent(this._downPosition,this._downPositionRelative,2))}_onUp(e,t,n){this.dispatchEvent(4,new InputEvent(e,t,n)),this._getDelta(e)<=MIN_MOVE_DISTANCE&&this.dispatchEvent(5,new InputEvent(e,t)),2===this._state&&this.dispatchEvent(2,new InputEvent(e,t)),4===this._state&&(this.dispatchEvent(10,new InputEvent(e,t)),this._rotationAngle=-1),3===this._state&&(this._pinchDistance=-1),this._lastTouchEvent=null,this._setState(0),this._dragTarget=null,this._elementHit=!1,this._longClickTimer&&clearTimeout(this._longClickTimer)}_getTouchPosition(e){if(e.touches.length){let{clientX:t,clientY:n}=e.touches[0];if(e.touches.length>1){const r=e.touches[1],a=r.clientX,i=r.clientY;t=(t+a)/2,n=(n+i)/2}return{x:t,y:n}}const t=e.changedTouches[0];return{x:t.clientX,y:t.clientY}}_getTouchPositionRelative(e){const t=this._getBoundingClientRect(),{clientWidth:n,clientHeight:r}=this._domHelper.element;if(e.touches.length){const{clientX:a,clientY:i}=e.touches[0];return{x:(a-t.left)/n*2-1,y:-(i-t.top)/r*2+1}}const a=e.changedTouches[0];return{x:(a.clientX-t.left)/n*2-1,y:-(a.clientY-t.top)/r*2+1}}_getMousePosition(e){if(0!==e.clientX&&0!==e.clientY)return{x:e.clientX,y:e.clientY};{let{x:t,y:n}=this._getFireFoxMousePosition(e);return{x:t,y:n}}}_getFireFoxMousePosition(e){let{x:t,y:n}=this._domHelper.getClientDimensions();return{x:t-(t+e.offsetX),y:n-(n+e.offsetY)}}_getMousePositionRelative(e){const t=this._getBoundingClientRect();return 0!==e.clientX&&0!==e.clientY?{x:(e.clientX-t.left)/this._domHelper.element.clientWidth*2-1,y:-(e.clientY-t.top)/this._domHelper.element.clientHeight*2+1}:this._firefoxDragPosition&&0!==this._firefoxDragPosition.x&&0!==this._firefoxDragPosition.y?{x:(this._firefoxDragPosition.x-t.left)/this._domHelper.element.clientWidth*2-1,y:-(this._firefoxDragPosition.y-t.top)/this._domHelper.element.clientHeight*2+1}:{x:0,y:0}}_getDelta(e){return Math.abs(this._downPosition.y-e.y)+Math.abs(this._downPosition.x-e.x)}setDragEnabled(e){this._dragEnabled=e}handleEvent(e){switch(e.type){case BROWSER_EVENTS.SCROLL:this._boundingClientRectInvalid=!0;break;case BROWSER_EVENTS.MOUSE_MOVE:this._onMouseMove(e);break;case BROWSER_EVENTS.DOUBLE_CLICK:this._onDoubleClick(e);break;case BROWSER_EVENTS.MOUSE_DOWN:this._onMouseDown(e);break;case BROWSER_EVENTS.MOUSE_UP:this._onMouseUp(e);break;case BROWSER_EVENTS.MOUSE_LEAVE:this._onMouseLeave(e);break;case BROWSER_EVENTS.MOUSE_ENTER:this._onMouseEnter(e);break;case BROWSER_EVENTS.MOUSE_WHEEL:this._onMouseWheel(e);break;case BROWSER_EVENTS.TOUCH_MOVE:this._onTouchMove(e);break;case BROWSER_EVENTS.TOUCH_START:this._onTouchStart(e);break;case BROWSER_EVENTS.TOUCH_END:this._onTouchEnd(e);break;case BROWSER_EVENTS.CONTEXT_MENU:this._onContextMenu(e)}}_onMouseDown(e){if(e.preventDefault(),2===e.detail)return;let{x:t,y:n}=this._getMousePosition(e);this._downPosition={x:t,y:n},this._downPositionRelative=this._getMousePositionRelative(e),this.dispatchEvent(3,new InputEvent({x:t,y:n},this._downPositionRelative,1)),this._setState(1)}_onMouseUp(e){e.preventDefault(),2!==e.detail&&this._onUp(this._getMousePosition(e),this._getMousePositionRelative(e),1)}_onMouseMove(e){e.preventDefault(),this._move(this._getMousePosition(e),this._getMousePositionRelative(e),1,e)}_onDoubleClick(e){e.preventDefault(),this.dispatchEvent(12,new InputEvent(this._getMousePosition(e),this._getMousePositionRelative(e),1))}_onMouseLeave(e){var t;this._delta=-1,(null===(t=e.relatedTarget)||void 0===t?void 0:t.closest('[data-rml-sdk="ignore-mouse-leave"]'))||this._onMouseUp(e)}_onMouseEnter(e){e.preventDefault()}_onMouseWheel(e){if(this._lastMouseWheelEvent&&e.timeStamp-this._lastMouseWheelEvent.timeStamp<40)return e.preventDefault(),void e.stopPropagation();e.deltaY<0?this.dispatchEvent(7,new InputEvent(this._getMousePosition(e),this._getMousePositionRelative(e),1,0,e)):this.dispatchEvent(8,new InputEvent(this._getMousePosition(e),this._getMousePositionRelative(e),1,0,e)),this._lastMouseWheelEvent=e}_onTouchMove(e){if(e.preventDefault(),!this._dragTarget)if(1===e.touches.length)this._move(this._getTouchPosition(e),this._getTouchPositionRelative(e),2);else if(2===e.touches.length)if(this._elementHit||4===this._state){const r=e.touches[0],a=e.touches[1],i=function(e){let t=toDegrees(e);return t<0&&(t=180+(180+t)),t}((t={x:r.pageX,y:r.pageY},n={x:a.pageX,y:a.pageY},Math.atan2(n.y-t.y,n.x-t.x)));this._rotationAngle<0&&(this._rotationAngle=i);const s=i-this._rotationAngle;this._rotationAngle=i,this.dispatchEvent(9,new InputEvent(this._getTouchPosition(e),this._getTouchPositionRelative(e),2,toRadiant(s))),this._setState(4)}else this._move2(e);var t,n}_onTouchStart(e){if(e.preventDefault(),1===e.touches.length){let{x:t,y:n}=this._getTouchPosition(e);this._downPosition={x:t,y:n},this._downPositionRelative=this._getTouchPositionRelative(e),this.dispatchEvent(3,new InputEvent({x:t,y:n},this._downPositionRelative,2)),this._setState(1),this._longClickTimer=window.setTimeout(this._longClick.bind(this,2),350)}else 2===e.touches.length&&(1!==this._state&&2!==this._state||this._onUp(this._getTouchPosition(e),this._getTouchPositionRelative(e),2),this._setState(3))}_onTouchEnd(e){e.preventDefault(),e.touches.length>1&&5===this._state||3===this._state||(this.dispatchEvent(13,new InputEvent(this._getTouchPosition(e),this._getTouchPositionRelative(e),2)),this._onUp(this._getTouchPosition(e),this._getTouchPositionRelative(e),2))}_onContextMenu(e){e.preventDefault()}_canDrag(e){return this._dragEnabled}onElementHit(){this._elementHit=!0}_getBoundingClientRect(){return this._boundingClientRectInvalid&&(this._boundingClientRect=this._domHelper.element.getBoundingClientRect(),this._boundingClientRectInvalid=!1),this._boundingClientRect}updateSize(){this._boundingClientRectInvalid=!0}}__decorate([inject],InputManager.prototype,"_domHelper",void 0);class SelectionHandlerEvent{constructor(e){const{component:t,resetCamera:n,consecutive:r}=e;this.component=t,this.resetCamera=void 0===n||n,this.consecutive=void 0===r||r}}class FontLoader extends Loader{constructor(e){super(e)}load(e,t,n,r){const a=this,i=new FileLoader(this.manager);i.setPath(this.path),i.setRequestHeader(this.requestHeader),i.setWithCredentials(this.withCredentials),i.load(e,(function(e){const n=a.parse(JSON.parse(e));t&&t(n)}),n,r)}parse(e){return new Font(e)}}class Font{constructor(e){this.isFont=!0,this.type="Font",this.data=e}generateShapes(e,t=100){const n=[],r=function(e,t,n){const r=Array.from(e),a=t/n.resolution,i=(n.boundingBox.yMax-n.boundingBox.yMin+n.underlineThickness)*a,s=[];let o=0,l=0;for(let e=0;e<r.length;e++){const t=r[e];if("\n"===t)o=0,l-=i;else{const e=createPath(t,a,o,l,n);o+=e.offsetX,s.push(e.path)}}return s}(e,t,this.data);for(let e=0,t=r.length;e<t;e++)n.push(...r[e].toShapes());return n}}function createPath(e,t,n,r,a){const i=a.glyphs[e]||a.glyphs["?"];if(!i)return void console.error('THREE.Font: character "'+e+'" does not exists in font family '+a.familyName+".");const s=new ShapePath;let o,l,d,h,c,u,p,m;if(i.o){const e=i._cachedOutline||(i._cachedOutline=i.o.split(" "));for(let a=0,i=e.length;a<i;)switch(e[a++]){case"m":o=e[a++]*t+n,l=e[a++]*t+r,s.moveTo(o,l);break;case"l":o=e[a++]*t+n,l=e[a++]*t+r,s.lineTo(o,l);break;case"q":d=e[a++]*t+n,h=e[a++]*t+r,c=e[a++]*t+n,u=e[a++]*t+r,s.quadraticCurveTo(c,u,d,h);break;case"b":d=e[a++]*t+n,h=e[a++]*t+r,c=e[a++]*t+n,u=e[a++]*t+r,p=e[a++]*t+n,m=e[a++]*t+r,s.bezierCurveTo(c,u,p,m,d,h)}}return{offsetX:i.ha*t,path:s}}const PROMISE_CALLBACKS=new Map,RESOURCES=new Map;class AsyncDependencyLoader{static loadFont(e){if(RESOURCES.has(e))return new Promise(t=>{t(RESOURCES.get(e))});if(PROMISE_CALLBACKS.has(e))return new Promise((t,n)=>{PROMISE_CALLBACKS.get(e).push({resolve:t,reject:n})});let t=new FontLoader;return new Promise((n,r)=>{PROMISE_CALLBACKS.set(e,[{resolve:n,reject:r}]),t.load(getAssetPath()+e,t=>{RESOURCES.set(e,t),AsyncDependencyLoader._resolveAll(e,t)})})}static _resolveAll(e,t){PROMISE_CALLBACKS.has(e)&&PROMISE_CALLBACKS.get(e).forEach(e=>e.resolve(t)),PROMISE_CALLBACKS.delete(e)}}class ComponentDimensioningHelper{constructor(e){this._activeComponents=[],this._componentDimensioningsExist=new Map,this._creator_=e}setCamera(e){this._camera=e}add(e){if(this._componentDimensioningsExist.has(e.runtimeId)&&!this._componentDimensioningsExist.get(e.runtimeId))return!1;const t=this._plannerKernelAccess.kernelInstance.getComponent(e.runtimeId),n=t.dimensionings;if(this._componentDimensioningsExist.set(e.runtimeId,n.length>0),!n||0===n.length||this._camera.position.z<0)return!1;const r=kernelBoxToThreeBox(t.boxForMeasurement),a={x:this._camera.position.x,y:this._camera.position.z};return import("./component-dimensioning-3648c91c.js").then(t=>{AsyncDependencyLoader.loadFont("static/rubik_regular-bc008a7de2daee79.json").then(i=>{n.forEach(n=>{var s;e.add(new t.default(((s=n).from=s.from/1e3,s.to=s.to/1e3,1===s.type.value?(s.type={value:2},s.from*=-1,s.to*=-1):2===s.type.value&&(s.type={value:1}),s),r,i,a))})})}),this._activeComponents.push(e),!0}remove(e,t=!0){return new Promise(n=>{import("./component-dimensioning-3648c91c.js").then(r=>{let a=[];e.children.forEach(e=>{e instanceof r.default&&a.push(e)}),a.forEach(t=>{e.remove(t),dispose(t)}),t&&removeItem(this._activeComponents,e),n()})})}hasComponentDimensions(){return this._activeComponents.length>0}async reset(){for(const e of this._activeComponents)await this.remove(e);this._activeComponents=[]}invalidateDimensioningsCache(e){e?this._componentDimensioningsExist.delete(e):this._componentDimensioningsExist.clear()}}__decorate([inject],ComponentDimensioningHelper.prototype,"_plannerKernelAccess",void 0);class Waiter{constructor(){this._promiseExecutors=[]}create(){return new Promise((e,t)=>{this._promiseExecutors.push({resolve:e,reject:t})})}resolve(e){return new Promise(t=>{this._promiseExecutors.forEach(t=>t.resolve(e)),this._promiseExecutors=[],t(e)})}reject(e){return new Promise((t,n)=>{this._promiseExecutors.forEach(t=>t.reject(e)),this._promiseExecutors=[],n(e)})}}class PlanElementViewModel extends class{constructor(e){this._coreReference=e.clone()}clearReference(){this._coreReference.delete(),this._coreReference=null}getKernelObject(){return this._coreReference}}{constructor(e){super(e),this._objectWaiter=new Waiter,this._topView=!1;const t=convertToTHREE(e.getCenter());this._container=new Object3D,this._container.position.copy(t),this._boundingBox=this._generateBoundingBox(),fadeIn(this._boundingBox),this._container.add(this._boundingBox),2!==this.getPlanElement().getType().value&&(this._object=new Object3D,this._container.add(this._object))}getSize(){return this._object?(new Box3).setFromObject(this._object).getSize(new Vector3):new Vector3}update(){this._container.position.copy(convertToTHREE(this.getPlanElement().getMeshCenter())),this._boundingBox&&this._updateBoundingBox()}_updateBoundingBox(){const e=this.getSize();this._boundingBox.geometry=new BoxGeometry(e.x,e.y,e.z),this._boundingBox.position.y=e.y/2}getPosition(){return this._container.position}getRotation(){return this._container.rotation.y}getBounds(){let e;return this.getPlanElement().boxForMeasurement?(e=kernelBoxToThreeBox(this.getPlanElement().boxForMeasurement),e.applyMatrix4(this.getContainer().matrix)):(e=new Box3,e.setFromObject(this._container)),e}getBoundingBox(){return this._boundingBox}getPlanElement(){return this._coreReference}setObject(e){this._object=e,this._objectWaiter.resolve(e)}getObject(){return this._object}async getObjectAsync(){return this._object?Promise.resolve(this._object):this._objectWaiter.create()}addMesh(e){this._object.add(e),this.hidePreviewBox()}getMesh(e){if(!this._object||0===this._object.children.length)return null;const t=getMaterialId(e,this.getPlanElement().getType());return this._object.children.find(e=>e.userData.material===t)}getContainer(){return this._container}getId(){return this.getPlanElement().getId()}clear(){dispose(this._container),this._selectionMesh&&dispose(this._selectionMesh)}remove(){var e;null===(e=this._container.parent)||void 0===e||e.remove(this._container),this.clear()}hidePreviewBox(){this._container&&this._boundingBox&&(this._boundingBox.material=(boundingBoxMaterial||(boundingBoxMaterial=new MeshBasicMaterial,boundingBoxMaterial.visible=!1),boundingBoxMaterial))}_generateBoundingBox(){const e=this.getSize(),t=new BoxGeometry(e.x,e.y,e.z);let n=new Color$1("#DDDDDD");const r=this.getPlanElement().customColor;r>0&&(n=(e=>{let t=new Color$1;return t.setRGB((e>>16)/255,(e>>8&255)/255,(e>>0&255)/255),t})(r));let a=MaterialCreator.createMeshStandardMaterial({color:n,opacity:1,transparent:!0}),i=new Mesh(t,a);return i.name="bounding box",i.position.y=e.y/2,i.castShadow=!1,i.receiveShadow=!1,i.layers.set(6),i}select(){this._isSelected=!0,this._selectionMesh&&this._container.add(this._selectionMesh)}deselect(){this._isSelected=!1,this._selectionMesh&&this._container.remove(this._selectionMesh)}hoverOn(){}hoverOff(){}setTopView(e){this._topView=e}}class PlanObjectViewModel extends PlanElementViewModel{constructor(e){super(e),this._initDone=!1,this._initFailed=null,this._initWaiter=new Waiter,this._container.rotation.y=e.rotation}finishInit(){return this._initDone=!0,this._initFailed=null,this._initWaiter.resolve()}failInit(e){return this._initFailed=e,this._initDone=!1,this._initWaiter.reject(this._initFailed)}isInitDone(){return this._initDone?Promise.resolve():this._initFailed?Promise.reject(this._initFailed):this._initWaiter.create()}getPlanObject(){return this.getPlanElement()}getSize(){return convertToThreeDimensions(this.getPlanObject().size)}update(){super.update(),this._container.rotation.y=this.getPlanObject().rotation}}class ConfiguratorPlanObjectViewModel extends PlanObjectViewModel{constructor(e){super(e),this._container.name="Configurable "+this._container.name}addRootComponent(e){this.setObject(e),this._rootComponentId=e.id,this._rootComponentRuntimeId=e.runtimeId,this._container.add(this.getObject())}getConfigurationRuntimeId(){return this.getPlanObject().getConfigurationRuntimeId()}getRootComponentId(){return this._rootComponentId}getRootComponentRuntimeId(){return this._rootComponentRuntimeId}finishConstruction(){return this.finishInit()}failConstruction(){return this.failInit(new Error("Construction of configuration failed"))}}let settings=JSON.parse(JSON.stringify({isProduction:!0,isUnitTesting:!1,environment:"production",detailEnvironment:"development",features:{},APP:{RAPI:{server:"/api/v2",localReverseProxy:"https://www.roomle.com/api/v2",liveServer:"https://www.roomle.com/api/v2",testServer:"https://www.test.roomle.com/api/v2",headers:{apiKey:"roomle_portal_v2",currentTenant:9,locale:"en",language:"en",device:1,token:"anonymous",platform:"web"},itemHeaders:{assetRevision:"glb",assetFileFormat:"glb"}},SHORTENER_URL:"http://rml.co/"},environments:{PRODUCTION:"production",DEVELOPMENT:"development",TEST:"test",TEST_SERVER:"test_server",ALPHA:"alpha"}}));settings.isUnitTesting=!1,"undefined"!=typeof module&&module.exports||(window.IS_DEBUG=!0);var Env=(function(e=!1){if(e){let e=JSON.parse(JSON.stringify(settings));e.APP,e.features}}(),JSON.parse(JSON.stringify(settings)));class StaticPlanObjectViewModel extends PlanObjectViewModel{constructor(e){super(e),this._originalSize=new Vector3,this._container.name="Static "+this._container.name}setRapiItem(e){return this._rapiItem?Promise.resolve():this._addStaticItem(e)}async _addStaticItem(e){this._rapiItem=e;let t=this.getPlanObject();if(this._glbUrl=getGlbUrl(e),!this._glbUrl)return Promise.reject("No glb url found");let n=e.scaleable?convertToThreeDimensions(t.size):void 0,r=new Vector3(1,1,1);t.flipX&&(r.x*=-1),t.flipY&&(r.z*=-1);try{const a=await this._staticItemLoader.loadGLB(this._glbUrl,void 0,void 0,n,r,t.customColor,e.colorable);this._originalSize.copy(a.boundingBox.getSize(new Vector3)),a.scene.name=e.label,this.setObject(a.scene),((e,t)=>{let n=(new Box3).setFromObject(e),r=n.getSize(new Vector3),a=Math.min(r.x,r.y,r.z),i=!0;a>5&&(console.warn("GLB seems to be too big ("+a+")",t),i=!1),n.min.y<-.01&&(console.warn("GLB seems to be under the floor ("+n.min.y+"): ",t),i=!1)})(a.scene,this._glbUrl),fadeIn(a.scene),this._container.add(this.getObject()),this.hidePreviewBox(),await this.finishInit()}catch(e){await this.failInit(e)}}getRapiItem(){return this._rapiItem}needsRapiItem(){return!this._glbUrl}getGLBUrl(){return this._glbUrl}update(){const e=convertToThreeDimensions(this.getPlanElement().size),t=this.getObject();if(!t)return;if(e){const{x:n,y:r,z:a}=this._originalSize;let i=new Vector3(e.x/n,e.y/r,e.z/a);t.scale.copy(i)}this.getPlanElement().flipX&&(t.scale.x*=-1),this.getPlanElement().flipY&&(t.scale.z*=-1);const n=this.getPlanElement().customColor;t.traverse(e=>{if(e instanceof Mesh&&e.material instanceof MeshStandardMaterial){const t=e.material;if(this._rapiItem.colorable&&n&&n>0){let e=new Color$1(n);t.color=e.copySRGBToLinear(e)}t.needsUpdate=!0}}),super.update()}}__decorate([inject],StaticPlanObjectViewModel.prototype,"_staticItemLoader",void 0);const wallDimensionToTransferable=e=>{const{id:t,textRotation:n,length:r,lengthFormatted:a}=e;return{id:t,fromWithoutPadding:threeVectorToTransferableXYZ(e.fromWithoutPadding),toWithoutPadding:threeVectorToTransferableXYZ(e.toWithoutPadding),fromPosition3d:threeVectorToTransferableXYZ(e.fromPosition3d),toPosition3d:threeVectorToTransferableXYZ(e.toPosition3d),textPosition3d:threeVectorToTransferableXYZ(e.textPosition3d),fromPosition2d:threeVectorToTransferableXY(e.fromPosition2d),toPosition2d:threeVectorToTransferableXY(e.toPosition2d),textPosition2d:threeVectorToTransferableXY(e.textPosition2d),textDirection:threeVectorToTransferableXYZ(e.textDirection),textRotation:n,length:r,lengthFormatted:a}};let WALL_TOP_VIEW_MATERIAL;const getTopViewMaterial=()=>(WALL_TOP_VIEW_MATERIAL||(WALL_TOP_VIEW_MATERIAL=MaterialCreator.createMeshPhysicalMaterial({color:0})),WALL_TOP_VIEW_MATERIAL);class WallPlanElementViewModel extends PlanElementViewModel{constructor(e){super(e),this._container.name="Wall Plan Element"}get isSelected(){return this._isSelected}getWallDimension(e){const t=this.getPlanElement(),n=convertToTHREE(t.getCenter()),r=t.getPreferredSide();let a,i;0===r.value?(a=convertToTHREE(t.getCornerFromLeft()),i=convertToTHREE(t.getCornerToLeft())):1===r.value&&(a=convertToTHREE(t.getCornerFromRight()),i=convertToTHREE(t.getCornerToRight()));const s=a.clone().add(i).divideScalar(2),o=a.clone().sub(i),l=o.clone().cross(new Vector3(0,1,0)).normalize();l.clone().dot(s.clone().sub(n))<0&&l.multiplyScalar(-1);const d={maxZoomedIn:Math.max(.7,e),maxZoomedOut:.01,minPadding:.05,maxPadding:.25},h=transformRange(e,d.maxZoomedIn,d.maxZoomedOut,d.minPadding,d.maxPadding),c=l.clone().multiplyScalar(h/2),u=a.clone().add(c),p=i.clone().add(c),m=l.multiplyScalar(h),g=a.add(m),f=i.add(m),_=o.clone();o.dot(new Vector3(1,0,0))<0&&_.multiplyScalar(-1);const v=Math.atan2(_.z,_.x),w=g.clone().add(f).divideScalar(2);return{id:t.getId(),fromPosition3d:g,toPosition3d:f,textPosition3d:w,textDirection:_,textRotation:v,length:t.getLength(r.value),fromWithoutPadding:u,toWithoutPadding:p}}addMesh(e){e.traverse(e=>{this._setMaterial(e)}),e.layers.set(9),super.addMesh(e);const t=(new Box3).setFromObject(this.getObject()).getSize(new Vector3);this._boundingBox.geometry=new BoxGeometry(t.x,t.y,t.z),this._boundingBox.position.y=t.y/2}show(){var e,t;this.getContainer().visible=!0,null===(e=this.getObject())||void 0===e||e.traverse(e=>{e.layers.set(9)}),null===(t=this.getBoundingBox())||void 0===t||t.layers.set(6)}hide(){var e,t;this.getContainer().visible=!1,null===(e=this.getObject())||void 0===e||e.traverse(e=>{e.layers.disableAll()}),null===(t=this.getBoundingBox())||void 0===t||t.layers.disableAll()}_enableTopView(){this._container.traverse(e=>{this._setTopMaterial(e)})}_setTopMaterial(e){e instanceof Mesh&&!e.userData.originalMaterial&&e.material&&e!==this._boundingBox&&(e.userData.originalMaterial=e.material,e.material=getTopViewMaterial())}_disableTopView(){this._container.traverse(e=>{e instanceof Mesh&&e.userData.originalMaterial&&(e.material=e.userData.originalMaterial,delete e.userData.originalMaterial)})}setTopView(e){super.setTopView(e),e?this._enableTopView():this._disableTopView()}getKernelObject(){return super.getKernelObject()}_setMaterial(e){e instanceof Mesh&&e.material&&e!==this._boundingBox&&(e.userData.originalMaterial||(e.userData.originalMaterial=e.material),this._topView&&this._isSelected?e.material=new MeshBasicMaterial({color:10526880,side:DoubleSide}):this._topView&&!this._isSelected?e.material=getTopViewMaterial():(e.material=e.userData.originalMaterial,delete e.userData.originalMaterial))}select(){super.select(),this._container.traverse(e=>{this._setMaterial(e)})}deselect(){super.deselect(),this._container.traverse(e=>{this._setMaterial(e)})}}class FloorPlanElementViewModel extends PlanElementViewModel{constructor(e){super(e),this._container.name="Floor Plan Element"}addMesh(e){this.getObject().clear(),super.addMesh(e),e.layers.set(9),e.castShadow=!1,e.position.y=-.001}}class CeilingPlanElementViewModel extends PlanElementViewModel{constructor(e){super(e),this._container.name="Ceiling Plan Element"}addMesh(e){super.addMesh(e),e.castShadow=!1;const t=(new Box3).setFromObject(this.getObject()).getSize(new Vector3);this._boundingBox.geometry=new BoxGeometry(t.x,.01,t.z)}}const META_INFO=new Map;class Benchmark{static start(e){if(!window.performance||!window.performance.getEntriesByName)return"";let t=window.performance.getEntriesByName(e).length++,n="";t<100&&(n="0"),t<10&&(n="0"+n);const r=t>0?e+"_"+n+t:e,a=r+"_start";return window.performance.mark(a),r}static addMeta(e,t){const n=Benchmark.getMeta(e);META_INFO.set(e,Object.assign(n,t))}static getMeta(e){return META_INFO.get(e)||{}}static end(e){}static getMeasure(e){return[]}static showBenchmarks(e){const t=window.performance.getEntriesByType("measure");t.sort((function(e,t){return e.startTime-t.startTime}));const n=[];for(let r=0,a=t.length;r<a;r++){const a=t[r];e&&-1===a.name.indexOf(e)||n.push({Start:parseFloat(a.startTime.toFixed(2)),Name:a.name,Duration:parseFloat(a.duration.toFixed(2))})}console.table(n)}}class AppContext{static init(e={}){const{kernelInstance:t,kernelContainer:n,planObjectId:r}=e;AppContext.kernelInstance=t,AppContext.kernelContainer=n,AppContext.planObjectId=r}static cleanUp(){AppContext.useHDGeometry=!1,AppContext.kernelInstance=null,AppContext.kernelContainer=null,AppContext.planObjectId=null}}AppContext.useHDGeometry=!1,AppContext.kernelInstance=null,AppContext.kernelContainer=null,AppContext.planObjectId=null;const WAITERS=new Map,_endOperation=function(e,t,n){let r=WAITERS.get(e);if(r){const a=n?[n]:void 0;r.forEach(({resolve:e,reject:n})=>t?e.apply(e,a):n.apply(n,a)),WAITERS.delete(e)}};class AsyncHelper{static finishOperation(e,t){_endOperation(e,!0,t)}static failOperation(e,t){_endOperation(e,!1,t)}static waitFor(e,t){return new Promise((n,r)=>{let a=WAITERS.get(e);a||(WAITERS.set(e,[]),a=WAITERS.get(e)),a.push({resolve:n,reject:r}),"function"==typeof t&&t.apply(t)})}}const isRange=function(e){return e.validRange&&"string"==typeof e.validRange.type},isOptions=function(e){return e.validValues&&e.validValues.length>0},isMaterial=function(e){return"Material"===e.type};let MEM_URL,WASM_URL,WASM_LOADER,ASM_LOADER,CACHE_COMPILATION;const KERNEL_PATHS={WASM:{CONFIGURATOR:{URL:"static/ConfiguratorKernel-9a599eeb4293df18.wasm",LOADER:"static/ConfiguratorKernel-4cae014a679bd075.js"},PLANNER:{URL:"static/RoomleCore-02c32bc54042f811.wasm",LOADER:"static/RoomleCore-c8f6b8cd39eb2b33.js"}},WASM_MODERN:{CONFIGURATOR:{URL:"static/ConfiguratorKernel-9457a9c787a94211.wasm",LOADER:"static/ConfiguratorKernel-5c4fcff0d630e61b.js"},PLANNER:{URL:"static/RoomleCore-0fd00939f2ec4d85.wasm",LOADER:"static/RoomleCore-c9e8fbc848d32a0e.js"}},ASM:{CONFIGURATOR:{MEM_URL:"static/ConfiguratorKernelJs-27242c64dc21b819.mem",LOADER:"static/ConfiguratorKernelJs-9abaf09525b8e7fb.js"},PLANNER:{MEM_URL:"static/RoomleCoreJs-7305a65c8029e4fe.mem",LOADER:"static/RoomleCoreJs-0bfad314ad4cc1a1.js"}}},USE_WASM=!!window.WebAssembly;class CommonKernelAccess{_utilityToLongArray(e){const t=new this._kernelContainer.LongArray;return e.forEach(e=>t.push_back(e)),t}constructor(e){this._requestedItemIds=[],this._requestedMaterialIds=[],this._configuratorKernelCallbackListener=new Set,this._cachedGroupIds=[],this._waitingForGroups=!1,this._subComponentsWaiters=new Map,this._shouldWait=!0,this._creator_=e,window.KernelCallback={isReady:this.isReady.bind(this)},this._lifeCycleManager.addEventListener(this)}init(e){this._kernelType=e,this._setupKernelPaths(e),this._setupEmsModule(e),this._useWASM=USE_WASM,this._kernelPath=USE_WASM?WASM_LOADER:ASM_LOADER}_initKernel(){const{restrictionLevel:e}=this._initData,t=!1!==this._initData.callbacksOnlyIfGeometryIsReady;this._kernelInstance.setUpdateCallbacksOnlyIfGeometryIsReady(t),this._kernelInstance.setLevel(e),this._unitFormatter.init(this._kernelContainer),this._kernelInstance.setEnvironmentVariable("unit",this._unitFormatter._actualUnitString||"cm"),this._kernelInstance.setEnvironmentVariable("unitString","short"),this._kernelInstance.useEnvironmentGeometry(1===this._kernelType);const{overrideCountry:n,locale:r}=this._globalInitData;n&&(this._kernelInstance.resetPriceListIds(),this._kernelInstance.addPriceList(n)),this._kernelInstance.setEnvironmentVariable("language",r)}get kernelContainer(){return this._kernelContainer}get kernelInstance(){return this._kernelInstance}get configurationExporter(){return this._configurationExporter||(this._configurationExporter=this._kernelContainer.newConfigurationExporter()),this._configurationExporter}_setupKernelPaths(e){const t=0===e?"PLANNER":"CONFIGURATOR";MEM_URL=KERNEL_PATHS.ASM[t].MEM_URL,ASM_LOADER=KERNEL_PATHS.ASM[t].LOADER,WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,10,8,1,6,0,6,64,25,11,11]))?(WASM_URL=KERNEL_PATHS.WASM_MODERN[t].URL,WASM_LOADER=KERNEL_PATHS.WASM_MODERN[t].LOADER):(WASM_URL=KERNEL_PATHS.WASM[t].URL,WASM_LOADER=KERNEL_PATHS.WASM[t].LOADER),CACHE_COMPILATION=!0}_setupEmsModule(e){const t=this;this._kernelContainer={locateFile(t){const n=0===e?/RoomleCoreJs[\-a-z0-9]*\.js\.mem/:/ConfiguratorKernelJs[\-a-z0-9]*\.js\.mem/;return t.match(n)?getAssetPath()+MEM_URL:t},wasmBinaryFile:getAssetPath()+WASM_URL,preRun:[],postRun:[],setStatus:null,print(e){t._kernelIo.log(e)},printErr(e){t._kernelIo.error(e)},quit(e){0!==e&&t._kernelIo.throw(e&&e.toString?e.toString():"Unknown error while C/C++ main executes")}},CACHE_COMPILATION&&USE_WASM&&(this._kernelContainer.instantiateWasm=function(e,t){return((e,t,n)=>{const r="function"==typeof WebAssembly.instantiateStreaming;Benchmark.addMeta("kernel_is_ready",{cachedInIndexedDB:!1});let a=null;r?(Benchmark.start("kernel_stream_compile"),a=WebAssembly.instantiateStreaming(fetch(getAssetPath()+e),t)):(Benchmark.start("kernel_legacy_compile"),a=fetch(getAssetPath()+e).then(e=>e.arrayBuffer()).then(e=>WebAssembly.instantiate(e,t))),Benchmark.addMeta("kernel_is_ready",{instantiateStreaming:r}),a.then(e=>{n(e.instance)},e=>console.error(e))})(WASM_URL,e,t),{}})}_passSubComponentsToKernel(e,t){const n=e.id,r=t.get(n);if(r)for(let t=0,a=r.length;t<a;t++){const{parentId:a,partId:i}=r[t];this._kernelIo.setMeta({componentId:n}),this._kernelInstance.loadedSubComponent(a,i,n,e.configuration)}}_fetchSubComponents(e){let t=[...e.keys()];t.length&&this._rapiAccess.getComponents(t).then(t=>{for(let n=0,r=t.length;n<r;n++)this._passSubComponentsToKernel(t[n],e);this._flushSubComponentsWaiters()})}_flushSubComponentsWaiters(){this._fetchSubComponents(this._subComponentsWaiters),this._subComponentsWaiters=new Map,this._shouldWait=!1}isReady(){this._kernelContainer.setExternalHelpers(this._kernelIo,{convertCObject}),Env.isProduction||Env.isUnitTesting||this.addDebugInfo(),window.KernelCallback&&(window.KernelCallback=null,delete window.KernelCallback)}addDebugInfo(){const e=function(t,n=[]){const r=Object.getPrototypeOf(t),a=r?Object.getOwnPropertyNames(r):[],i=t?Object.getOwnPropertyNames(t):[];return r?e(r,[...n,...i,...a]):[...i,...a,...n]},t=e(this),n=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toString","valueOf"];[...new Set(t)].forEach(e=>{if(!e.startsWith("_")&&"function"==typeof this[e]&&-1===n.indexOf(e))try{const t=this[e].bind(this);this[e]=function(...n){return this._kernelIo.log("[ KernelCommunication ]: "+e),t(...n)}}catch(e){}})}getConfigurationData(e){return new Promise(t=>{var n;const r=this.kernelInstance.getPlanObject(e),a=(new Date).toISOString(),i=this.kernelInstance.getComponentId(e),s=getCatalogIdFromItemOrConfigurationId(i),o=(null===(n=r.boxForMeasurement)||void 0===n?void 0:n.size)||r.bounds;t({created:a,lastAccess:a,configuration:this.kernelInstance.getSerializedConfiguration(e),configurationHash:this.kernelInstance.getHashOfConfiguration(e),parts:JSON.stringify(this.kernelInstance.getPartList(e)),rootComponentId:i,width:o.x,height:o.z,depth:o.y,catalog:s,orderable:!1,requestable:!1})})}loadComponent(e,t,n){this._rapiAccess.getComponent(t.componentId).then(r=>{var a;let i=r.configuration;i||(i="error",null===(a=this._configuratorUiCallbacks)||void 0===a||a.onContentProblem({rapiPath:"components",ids:[t.componentId],message:t.componentId+" has no configuration"})),this._kernelIo.setMeta({componentId:t.componentId}),this._kernelInstance.loadComponent(e,i,t,n),this._flushSubComponentsWaiters()},r=>{var a;this._kernelInstance.loadComponent(e,"error",t,n),this.onLoadComponentError(r,t.componentId),null===(a=this._configuratorUiCallbacks)||void 0===a||a.onError(new Error(`Component with id "${t.componentId}" can not be loaded. "${r}"`)),this._flushSubComponentsWaiters()})}loadSubComponent(e,t,n){if(this._shouldWait){let r=this._subComponentsWaiters.get(n);r||this._subComponentsWaiters.set(n,[]),r=this._subComponentsWaiters.get(n),r.push({parentId:e,partId:t}),this._subComponentsWaiters.set(n,r)}else this._rapiAccess.getComponent(n).then(r=>{var a;let i=r.configuration;i||(i="error",null===(a=this._configuratorUiCallbacks)||void 0===a||a.onContentProblem({rapiPath:"components",ids:[n],message:"SubComponent "+n+" has no configuration"})),this._kernelIo.setMeta({componentId:n,parentId:e}),this._kernelInstance.loadedSubComponent(e,t,n,i)})}async loadItemConfigurations(e,t){let n=Array.isArray(t)?t:[t];if(this._requestedItemIds.push(...n),await wait(0),!this._requestedItemIds.length)return;const r=[...this._requestedItemIds];this._requestedItemIds=[],(await this._rapiAccess.getItems(r)).forEach(t=>{this._kernelInstance.loadedItemConfiguration(e,t.id,t.configuration)})}requestDeleteComponent(e){var t,n;e&&((null===(n=null===(t=this._initData)||void 0===t?void 0:t.featureFlags)||void 0===n?void 0:n.reDock)?this._kernelInstance.deletePlanComponent(e):this._kernelInstance.deleteComponent(e))}dockComponentWithPosition(e,t,n,r,a){var i;this._kernelInstance.dockComponentWithPosition(n,r,e,t,a);const s=this._kernelInstance.getComponentId(n),o=this._kernelInstance.getComponentId(e);null===(i=this._configuratorUiCallbacks)||void 0===i||i.onUserInitiatedDockDone(s,r,o,t,a)}Editor3dAddBakedMesh(e,t,n,r,a,i,s,o){this._configuratorKernelCallbackListener.forEach(l=>l.Editor3dAddBakedMesh(e,t,n,r,a,i,s,o))}Editor3dAddNamedMesh(e,t,n,r,a,i,s,o,l,d,h,c){this._configuratorKernelCallbackListener.forEach(u=>u.Editor3dAddNamedMesh(e,t,n,r,a,i,s,o,l,d,h,c))}Editor3ChangedNamedMesh(e,t,n,r,a,i,s){this._configuratorKernelCallbackListener.forEach(o=>o.Editor3ChangedNamedMesh(e,t,n,r,a,i,s))}Editor3dRemoveNamedMesh(e,t){this._configuratorKernelCallbackListener.forEach(n=>n.Editor3dRemoveNamedMesh(e,t))}Editor3dBeginConstruction(e,t){this._configuratorKernelCallbackListener.forEach(n=>n.Editor3dBeginConstruction(e,t))}Editor3dEndConstruction(e){this._configuratorKernelCallbackListener.forEach(t=>t.Editor3dEndConstruction(e))}Editor3dComponentCreated(e,t,n,r){this._configuratorKernelCallbackListener.forEach(a=>a.Editor3dComponentCreated(e,t,n,r,!1))}Editor3dComponentDocked(e,t,n,r){this._configuratorKernelCallbackListener.forEach(a=>a.Editor3dComponentDocked(e,t,n,r))}Editor3dGeometryReady(e){this._configuratorKernelCallbackListener.forEach(t=>t.Editor3dGeometryReady(e)),this.requestPlanComponentConstruction(e),this._configuratorUiCallbacks.onGeometryReady(e)}Editor3dGeometryNotReady(e){this._configuratorKernelCallbackListener.forEach(t=>t.Editor3dGeometryNotReady(e)),this._configuratorUiCallbacks.onGeometryNotReady(e)}componentDeleted(e){this._configuratorKernelCallbackListener.forEach(t=>t.componentDeleted(e))}componentMetaUpdated(e){let t=this._kernelInstance.getComponent(e);this._configuratorKernelCallbackListener.forEach(e=>e.componentMetaUpdated(t))}sceneCleared(){this._configuratorKernelCallbackListener.forEach(e=>e.sceneCleared())}requestMaterialsInGroup(e){(Array.isArray(e)?e:[e]).forEach(e=>{-1===this._cachedGroupIds.indexOf(e)&&this._cachedGroupIds.push(e)}),this._waitingForGroups||(this._waitingForGroups=!0,AsyncHelper.waitFor(4).then(()=>{this._rapiAccess.getMaterialsByGroup(this._cachedGroupIds).then(e=>{let t=[];e.forEach(e=>{const n=[];e.materials.forEach(e=>n.push(e.id));const r=e.legacyId||e.id;e.legacyId||console.warn("Material group has no legacy id, please check content why this is the case"),t.push({group:r,materials:n})}),t.length&&this._kernelInstance.setMaterialsInGroup(t),this._cachedGroupIds=[]},e=>{var t;console.error(e),null===(t=this._configuratorUiCallbacks)||void 0===t||t.onError(new Error(`Material group with ids "${this._cachedGroupIds.join(",")}" can not be loaded. "${e}"`)),this._cachedGroupIds=[]})}))}requestPlanComponentConstruction(e,t=!0){t?this._kernelInstance.requestDeltaPlanComponentConstruction(e):this._kernelInstance.requestPlanComponentConstruction(e)}addConfiguratorListener(e){this._configuratorKernelCallbackListener.add(e)}removeConfiguratorListener(e){this._configuratorKernelCallbackListener.delete(e)}cleanUpCallbacks(){"function"==typeof this._kernelContainer.unregisterConfiguratorCallback&&this._kernelContainer.unregisterConfiguratorCallback(this)}async requestMaterialProperties(e){let t=Array.isArray(e)?e:[e];if(this._requestedMaterialIds.push(...t),await wait(0),!this._requestedMaterialIds.length)return;const n=[...this._requestedMaterialIds];this._requestedMaterialIds=[];const r=await this._rapiAccess.getMaterials(n);let a=[];r.forEach(e=>{const t=new this._kernelContainer.StringStringMap,n=e.properties||{};for(let e in n)n.hasOwnProperty(e)&&t.set(e,n[e]);t.size()&&a.push({id:e.id,properties:t})}),a.length&&this._kernelInstance.setMaterialProperties(a)}registerCallbacks(){this._kernelContainer.registerConfiguratorCallback(this)}pause(){this.cleanUpCallbacks()}resume(){this.cleanUpCallbacks(),this.registerCallbacks()}destroy(){}_handleCortoMesh(e,t,n){var r;try{this._kernelInstance.addMeshCorto(t,n,new Uint8Array(e))}catch(e){console.error(e),null===(r=this._configuratorUiCallbacks)||void 0===r||r.onMemoryCorruption()}}_handleInvalidMesh(e){try{this._kernelInstance.setExternalMeshInvalid(e)}catch(e){console.error(e)}}calcPartsPriceSum(e){return this._calcPrice(e)}_calcPrice(e){const t=new Map;e||(e=this._kernelInstance.getFullPartList());const n=!!e&&!!e.fullList&&!!e.fullList.length;if(this._initData.useRoomlePrice&&n){const n=e.fullList[0].currencySymbol,r=e.fullList.reduce((e,t)=>e+(t.count?t.count:0)*(t.price?t.price:0),0),a=roundWithPrecision(r,2);return this._configuratorUiCallbacks.onUpdatePrice(n,a),Promise.resolve({totalSum:a,partMap:t})}if(this._initData.usePriceService&&n){const n=e.fullList.reduce((e,n)=>{const r=kernelPartToPriceId(n);return r&&(t.set(r,n),e.push(r)),e},[]);return new Promise((r,a)=>{this._rapiAccess.getPrices(n).then(n=>{if(!n.length)return a(new Error("prices are empty"));let i=0;const s=objectArrayToMap(n,"priceId");for(const t of e.fullList){const e=kernelPartToPriceId(t);if(!s.has(e)){console.warn("PriceId: "+e+" has no corresponding kernel-part");continue}const{price:n,currencySymbol:r}=s.get(e);t.price=n,t.currencySymbol=r,i+=n*t.count}return i=roundWithPrecision(i,2),this._configuratorUiCallbacks.onUpdatePrice(n[0].currencySymbol,i),r({totalSum:i,partMap:t})},e=>{console.error(e),a(e)})})}return Promise.resolve({totalSum:0,partMap:t})}async addUiDataAndPriceToPartList(e,t){const{fullList:n,originPart:r}=e,a=e.perMainComponent;let i;this.addUiDataToPartList(n,t);try{const t=await this._calcPrice(e);i=t.partMap}catch(e){console.error(e),i=new Map}const s=this._initData.usePriceService||this._initData.useRoomlePrice,o=e=>{s||(e.price=null,e.currencySymbol=null);const t=kernelPartToPriceId(e);if(!t)return;if(!i.has(t))return;const{price:n,currencySymbol:r}=i.get(t);"number"==typeof n&&(e.price=n,e.currencySymbol=r)};return n.forEach(o),a.forEach(({fullList:e,perMainComponent:n})=>{n.length>0&&console.error("Not implemented! perMainComponent is deeper than one level"),this.addUiDataToPartList(e,t),e.forEach(o)}),{fullList:n,perMainComponent:a,originPart:r}}addUiDataToPartList(e,t){const n=[];return e.forEach(e=>{const t=this._rapiAccess.peekComponent(e.componentId);!t||e.labelIsCalculated&&e.label||(e.label=t.label),e.parameters.forEach(e=>{if(this._unitFormatter.formatPartListParameter(e),isMaterial(e)){const t=this._rapiAccess.peekMaterial(e.value);t?e.valueLabel=t.label||t.name||e.value:-1===n.indexOf(e.value)&&n.push(e.value)}})}),n.length&&this._rapiAccess.getMaterials(n).then(e=>{const n=this._lastPartListHash!==t;Array.isArray(e)&&e.length&&n&&(this._lastPartListHash=t,this.requestPartListAndUpdatePricesOfParts())}),e}async requestPartListAndUpdatePricesOfParts(e,t){let n=this._kernelInstance.getFullPartList();e||(e=this._kernelInstance.getHashOfConfiguration(this._configuratorContext.planObjectId));const r=await this.addUiDataAndPriceToPartList(n,e);this._configuratorUiCallbacks.onPartListUpdate(r,btoa(e))}}__decorate([inject],CommonKernelAccess.prototype,"_rapiAccess",void 0),__decorate([inject],CommonKernelAccess.prototype,"_scriptLoader",void 0),__decorate([inject],CommonKernelAccess.prototype,"_kernelIo",void 0),__decorate([inject],CommonKernelAccess.prototype,"_dataSyncer",void 0),__decorate([inject],CommonKernelAccess.prototype,"_lifeCycleManager",void 0),__decorate([inject],CommonKernelAccess.prototype,"_configuratorUiCallbacks",void 0),__decorate([inject],CommonKernelAccess.prototype,"_globalCallback",void 0),__decorate([inject],CommonKernelAccess.prototype,"_initData",void 0),__decorate([inject],CommonKernelAccess.prototype,"_unitFormatter",void 0),__decorate([inject],CommonKernelAccess.prototype,"_configuratorContext",void 0),__decorate([inject],CommonKernelAccess.prototype,"_globalInitData",void 0);const{APP}=Env,{RAPI}=APP,headers=RAPI.headers,itemHeaders=RAPI.itemHeaders,TOKEN_IDENTIFIER=headers.token,isPlanSnapshotId=e=>e.startsWith("ps_"),LEGACY_GROUP_INDICATOR=uuid();let RAPI_MATERIAL_GROUP_CACHE=new Map,ITEM_ADDITIONAL_CONTENT_CACHE=new Map,RAPI_RELATIONS_CACHE=new Map,RAPI_CACHE=new Map,MESHES_TO_CATALOG_CACHE=new Map,RAPI_PACKAGE_CACHE=new Map,RAPI_PRELOAD_CACHE=new Map,WAITERS_FOR_URL=new Map,RAPI_ERROR_CACHE=new Map;const getCachedMaterialGroup=e=>RAPI_MATERIAL_GROUP_CACHE.get(e)||RAPI_MATERIAL_GROUP_CACHE.get(LEGACY_GROUP_INDICATOR+e),hasMaterialTags=e=>e&&e.tags&&e.tags.length,materialHasNoTagsButGroup=e=>!hasMaterialTags(e)&&e.group;class RapiAccess{constructor(e){this._itemLoaded=!1,this._currentToken=null,this._creator_=e,window.addEventListener("online",this._flushOfflineQueue.bind(this))}getPreloadForItem(e){return this._getPreload(e,!0)}getPreloadForConfiguration(e){return this._getPreload(e,!1)}_getPreload(e,t){return new Promise((n,r)=>{if(!navigator.onLine)return n();if(this._dataSyncer.getIsCatalogSynced(getCatalogIdFromItemOrConfigurationId(e)))return n();if(RAPI_PRELOAD_CACHE.get(e))return n();const a=t?"?itemId=":"?configurationId=";this._get("/preloads/components/"+a+e,"preloads/components").then(t=>{if(RAPI_PRELOAD_CACHE.get(e))return n();t.forEach(e=>{this._prepareData(e,"components")}),RAPI_PRELOAD_CACHE.set(e,!0),n()},r)})}changeUseOfHDGeometry(){const e=RAPI_CACHE.get("components");RAPI_PRELOAD_CACHE.clear(),RAPI_PACKAGE_CACHE.clear(),e&&RAPI_CACHE.delete("components")}getHSCPackage(e){return new Promise((t,n)=>{if(RAPI_PACKAGE_CACHE.get(e))return t();this._get("/catalogs/"+e+"/package","package").then(n=>{if(RAPI_PACKAGE_CACHE.get(e))return t(n);n.components.forEach(e=>{this._prepareData(e,"components")}),n.materials.forEach(e=>{this._prepareData(e,"materials"),this._prepareGroups(e)}),n.textures.forEach(e=>{this._prepareData(e,"textures")}),RAPI_PACKAGE_CACHE.set(e,!0),t(n)},n)})}getComponent(e){return this._getById(e,"components")}getConfiguration(e){return this._getById(e,"configurations")}getConfigurations(e){return this._getByIds(e,"configurations")}getItem(e){return this._getById(e,"items",{additionalHeaders:itemHeaders})}getComponents(e){return this._getByIds(e,"components")}getItems(e){return this._getByIds(e,"items",{additionalHeaders:itemHeaders})}getTag(e){return this._getById(e,"tags")}getTags(e){return this._getByIds(e,"tags")}getTexture(e){return this._getById(e,"textures")}getCatalog(e){return this._getById(e,"catalogs")}getMesh(e,t="crt",n=50){return this._getById(e,"meshes",{pathSuffix:"/data?format="+t+"&targetQuality="+n.toString()})}getMeshesOfCatalog(e){return new Promise((t,n)=>{const r=MESHES_TO_CATALOG_CACHE.get(e);r?t(r):this._get("/meshes?catalog="+e,"catalogMeshes").then(n=>{MESHES_TO_CATALOG_CACHE.set(e,n),t(n)},n)})}getTexturesOf(e){return this._getRelationData(e,{rapiPath:"textures"})}getItemsOf(e){return this._getRelationData(e,{rapiPath:"items"})}async getMaterialsOf(e){return(await this._getRelationData(e,{rapiPath:"materials"},{embed:["textures"]})).filter(e=>e.active)}getComponentsOf(e){return this._getRelationData(e,{rapiPath:"components"})}getAdditionalContentsOfItems(e){const t=[],n=[];return e.forEach(e=>{const r=ITEM_ADDITIONAL_CONTENT_CACHE.get(e.id.toString());r?n.push(...r):t.push(e.id.toString())}),new Promise((e,r)=>{0!==t.length?this._getByIdsPackets(t,"itemAdditionalContents",{filterKey:"itemIds"}).then(t=>{t.forEach(e=>{let t=ITEM_ADDITIONAL_CONTENT_CACHE.get(e.itemId);t||(t=[]);for(let n=0,r=t.length;n<r;n++)if(t[n].id===e.id)return;t.push(e),ITEM_ADDITIONAL_CONTENT_CACHE.set(e.itemId,t)}),e([...t,...n])},r):e(n)})}getMaterial(e){return this._getById(e,"materials",{embed:["textures"]})}peekMaterial(e){return this._peekData(e,"materials")}peekComponent(e){return this._peekData(e,"components")}peekItem(e){return this._peekData(e,"items")}peekConfiguration(e){return this._peekData(e,"configurations")}async getMaterials(e){return(await this._getByIds(e,"materials",{embed:["textures"]})).filter(e=>e.active)}getPlan(e){return this._getById(e,"plans")}getPlanSnapshot(e){return this._getById(e,"planSnapshots")}static clearCaches(){RAPI_MATERIAL_GROUP_CACHE=new Map,RAPI_RELATIONS_CACHE=new Map,RAPI_CACHE=new Map,RAPI_PACKAGE_CACHE=new Map,RAPI_PRELOAD_CACHE=new Map,WAITERS_FOR_URL=new Map,ITEM_ADDITIONAL_CONTENT_CACHE=new Map}cleanUp(){RapiAccess.clearCaches()}getMaterialsByGroup(e){const t=e.slice(),n=[];let r=t.length;for(let e=0;e<r;e++){const a=getCachedMaterialGroup(t[e]);if(a){const i=a.length;for(let e=0;e<i;e++){const t=this._getCache("materials").get(a[e]);n.push(t)}t.splice(e,1),r--,e--}}return new Promise((e,r)=>{0!==t.length&&navigator.onLine?this._getByIdsPackets(t,"materials",{filterKey:"groups",embed:["textures"]}).then(t=>{e(this.combineMaterialsToGroups([...t,...n]))},r):e(this.combineMaterialsToGroups(n))})}_flushOfflineQueue(){return new Promise((e,t)=>{const n=this._localStorage.getItem("hsc_configurations_offline_queue_v1"),r=[];for(let e in n)if(n.hasOwnProperty(e)){const t=n[e];r.push(new Promise((e,n)=>{this.saveConfiguration(t.data).then(r=>{const a=[];t.perspectiveImage&&!r.perspectiveImage&&a.push(this.savePerspectiveImage(r,t.perspectiveImage)),t.topImage&&!r.topImage&&a.push(this.savePerspectiveImage(r,t.topImage)),Promise.all(a).then(e,n)},n)}))}Promise.all(r).then(()=>{this._localStorage.setItem("hsc_configurations_offline_queue_v1",{}),e()},t)})}_setQueuedConfiguration(e,t={}){const n=e.configurationHash,{perspectiveImage:r,topImage:a}=t;let i=this._localStorage.getItem("hsc_configurations_offline_queue_v1")||{},s=i[n]||{};s.data=e,s.perspectiveImage=r,s.topImage=a,i[n]=s,this._localStorage.setItem("hsc_configurations_offline_queue_v1",i)}async saveConfiguration(e){return navigator.onLine?await this._save("/configurations",{configuration:e},"configurations",{accept:"application/json",contentType:"application/json; charset=UTF-8"}):(e.perspectiveImage=null,e.topImage=null,this._setQueuedConfiguration(e),this._markConfigurationAsLocally(e),Promise.resolve(e))}saveTopImage(e,t){return this._saveConfigurationImage(e,t,"topImage")}savePerspectiveImage(e,t){return this._saveConfigurationImage(e,t,"perspectiveImage")}savePlanSnapshotTopImage(e,t){return this._savePlanSnapshotImage(e,t,"topImage")}savePlanSnapshotPerspectiveImage(e,t){return this._savePlanSnapshotImage(e,t,"perspectiveImage")}getShortUrl(e,t){return new Promise((n,r)=>this._fetchJson("/shortIds","shortIds",{method:"POST",resolve:n,reject:r,data:JSON.stringify({shortId:{type:t,referencedId:e}}),accept:"application/json",contentType:"application/json; charset=UTF-8"}))}_peekData(e,t){const n=RAPI_CACHE.get(t);return n&&n.get(e)||null}_saveConfigurationImage(e,t,n){if(!navigator.onLine){const r={};return r[n]=t,this._setQueuedConfiguration(e,r),this._markConfigurationAsLocally(e),e[n]=t.image,Promise.resolve(e)}const r=this._formDataUtil.create(t.image,e.configurationHash,IMAGE_FORMATS.PNG,n);return this._save("/configurations/"+e.id+"/"+n,r,"configurations",{accept:"application/json"})}_savePlanSnapshotImage(e,t,n){const r=this._formDataUtil.create(t.image,e.id,IMAGE_FORMATS.PNG,"file");return r.append("type",n),this._save("/planSnapshots/"+e.id,r,"planSnapshots",{accept:"application/json",method:"PUT"})}_markConfigurationAsLocally(e){e.isLocally=!0,e.id=e.configurationHash}_save(e,t,n,r={}){const a=t instanceof FormData?t:JSON.stringify(t);return new Promise((t,i)=>{const s={method:r.method||"POST",data:a,resolve:t,reject:i};r.contentType&&(s.contentType=r.contentType),r.accept&&(s.accept=r.accept),this._fetchJson(e,n,s)})}combineMaterialsToGroups(e){return new Promise((t,n)=>{const r=new Map,a={id:null,label:null,materials:[]},i=[];for(let t=0,n=e.length;t<n;t++){const n=e[t],s=n.tags&&n.tags.length?n.tags.map(e=>({isTag:!0,id:e})):[];n.group&&s.push({isTag:!1,id:LEGACY_GROUP_INDICATOR+n.group,legacyId:n.group}),s.length||s.push({isTag:!1,id:null}),n.tags&&n.tags.length&&n.tags.forEach(e=>-1===i.indexOf(e)?i.push(e):null),s.forEach(({isTag:e,id:t,legacyId:i})=>{const s=n.id;let o=t?getCachedMaterialGroup(t):[];o||(RAPI_MATERIAL_GROUP_CACHE.set(t,[]),o=getCachedMaterialGroup(t)),-1===o.indexOf(s.toString())&&o.push(s.toString());const l=hasMaterialTags(n),d=l&&e,h=materialHasNoTagsButGroup(n);if(d||h&&!e||!l&&!h&&!t){let e=t?r.get(t):a;e||(r.set(t,{id:t,label:n.groupLabel,legacyId:i,materials:[]}),e=r.get(t)),e.materials.push(n)}})}const s=a.materials.length?[a]:[];this.getTags(i).then(e=>{const n=e.reduce((e,t)=>(e[t.id]=t,e),{});return r.forEach((e,t)=>{s.push({id:t,label:n[t]?n[t].label:e.label,materials:e.materials,legacyId:e.legacyId,sort:n[t]?n[t].sort:void 0})}),t(s)},n)})}_getByIds(e,t,n={}){const r=this._getCache(t),a=this._getErrorCache(t),i=[],s=[...new Set(e)];let o=s.length;if(r&&r.size){const e=(new Date).getTime();for(let t=0;t<o;t++){const n=s[t],l=r.get(n),d=a.get(n);let h=!1;null!=l?(i.push(l),h=!0):h=void 0!==d&&(e-d.timestamp<6e4||!1===navigator.onLine),h&&(s.splice(t,1),o--,t--)}}return new Promise((e,r)=>{0!==s.length&&navigator.onLine?this._getByIdsPackets(s,t,n).then(t=>{e([...t,...i])},r):e(i)})}_getByIdsPackets(e,t,n={}){const r=n.filterKey||"ids";let a,i="/"+t+"/",s="?",o=[];const l=e.length;if(!l)return new Promise(e=>e([]));let d=!0,h=[];for(a=0;a<l;a++){d=!1;const n=e[a],l=s+r+"[]="+n,c=l.length+i.length;h.push(n),s="&",c<=1500?i+=l:(c>1500&&(h.pop(),a--),o.push({url:i,ids:h}),d=!0,i="/"+t+"/",s="?",h=[])}d||o.push({url:i,ids:h});const c=[];return o.forEach(e=>c.push(this._getByIdsSingle(e.ids,e.url,t,n))),new Promise((e,t)=>{Promise.all(c).then(t=>{const n=[];t.length&&t.forEach(e=>n.push(...e)),e(n)},t)})}_getByIdsSingle(e,t,n,r={}){return new Promise((a,i)=>{this._get(t,n,r).then(t=>{for(let n=0,a=t.length;n<a;n++){const a=r&&r.cacheKey?t[n][r.cacheKey]:t[n].id,i=e.indexOf(a.toString());-1!==i&&e.splice(i,1)}const i=e.length;if(i){const t=this._getCache(n),r=this._getErrorCache(n),a=(new Date).getTime();for(let n=0;n<i;n++)r.set(e[n],{code:0,timestamp:a}),t.delete(e[n]);this._errorHandler.dispatch(2,[n,e.map(e=>'"'+e+'"').join(",")])}a(t)},i)})}_getById(e,t,n={}){if(!e||""===e||"string"!=typeof e)return console.error("no id passed to _getById"),Promise.reject(new Error("no id passed to _getById"));const r=this._getCache(t).get(e);if(r)return new Promise(e=>e(r));if(!navigator.onLine)return Promise.reject("Nothing cached but tried to fetch in offline mode");const a={...n,id:e},i=n.pathSuffix||"";return this._get("/"+t+"/"+e+i,t,a)}_get(e,t,n={}){const r=AppContext.useHDGeometry?"includeGeometryHD=true":"";let a=-1===e.indexOf("?")?"?":"&";return""!==r&&(e+=a+r),n.embed&&Array.isArray(n.embed)&&n.embed.forEach(t=>{e+=a+"embed"+(t[0].toUpperCase()+t.substr(1))+"=true",a="&"}),new Promise((r,a)=>{const i=WAITERS_FOR_URL.get(e);Array.isArray(i)&&i.length>0?i.push({resolve:r,reject:a}):(WAITERS_FOR_URL.set(e,[{resolve:r,reject:a}]),this._fetchJson(e,t,n))})}_fetchJson(e,t,n={}){this._fetch(e,n).then(handleJsonResponse.bind(this)).then(this._handleJson(e,t,n).bind(this)).catch(this._handleError(e,n).bind(this))}async _fetch(e,t){const n={method:t.method?t.method:"GET",headers:this._createHeaders(t),mode:"cors",cache:"default"};t.data&&(n.body=t.data);let r=RAPI.server;const a=this._globalInitData.overrideRapi;a&&(r="live"===a?RAPI.liveServer:RAPI.testServer),(this._globalInitData.customApiUrl||""===this._globalInitData.customApiUrl)&&(r=this._globalInitData.customApiUrl);const i=new Request(r+e,n);this._globalCallback.onNetworkRequest(e,n,t);const s=await this._globalCallback.onCheckExternalCache(e,n);return s?{headers:{get:()=>"application/json"},json:()=>Promise.resolve(s)}:this._networkLayer.fetch(i,{},{checkResponse:e=>this._globalCallback.onValidateNetworkResponse("rapi-access",e)})}_createHeaders(e={}){const t={...headers};this._globalInitData.overrideTenant&&(t.currentTenant=this._globalInitData.overrideTenant),this._globalInitData.overrideCountry&&(t.country=this._globalInitData.overrideCountry);const n=this._globalInitData.locale||"en";t.language=n,t.locale=n;const{contentType:r,accept:a,additionalHeaders:i,data:s}=e;if(r&&(t["content-type"]=e.contentType),a&&(t.accept=e.accept),i)for(let e in i)i.hasOwnProperty(e)&&(t[e]=i[e]);this._globalInitData.configuratorId&&(t.configurator=this._globalInitData.configuratorId);const o=this._currentToken||TOKEN_IDENTIFIER;t.token="03-"+window.btoa((new Date).toISOString()+";"+o+";"+headers.apiKey);const l=new Headers(t);return s instanceof FormData&&l.delete("content-type"),l}_handleJson(e,t,n={}){return r=>{let a=null,i=null;"number"==typeof r&&(a=r);for(let e in r)"meta"!==e&&r.hasOwnProperty(e)&&(a=r[e],i=e);if("error"===i)return this._handleError(e,n)(new Error(JSON.stringify(a)));if(!a)throw new TypeError("RAPI returned empty JSON");if(Array.isArray(a))for(let e=0,r=a.length;e<r;e++)this._prepareData(a[e],t,n),this._prepareEmbeddedData(a[e],t,n);else this._prepareData(a,t,n),this._prepareEmbeddedData(a,t,n);n.resolve?n.resolve(a):this._notifyWaiters(e,null,a)}}_prepareEmbeddedData(e,t,n={}){n.embed&&Array.isArray(n.embed)&&n.embed.forEach(r=>{const a=e[r.slice(0,-1)+"Objects"];if(Array.isArray(a)){for(let e=0,t=a.length;e<t;e++)this._prepareData(a[e],r,n);this._prepareRelationalData(t,r,e.id,a)}else a&&(this._prepareData(a,r,n),this._prepareRelationalData(t,r,e.id,[a]))})}_getCache(e){return this._getCacheFrom(e,RAPI_CACHE)}_getErrorCache(e){return this._getCacheFrom(e,RAPI_ERROR_CACHE)}_getCacheFrom(e,t){let n=t.get(e);return n||(t.set(e,new Map),n=t.get(e)),n}_setCache(e,t,n){n.set(e.toString(),t)}_prepareData(e,t,n=null){let r=this._getCache(t);const a=n&&n.cacheKey?e[n.cacheKey]:e.id;if(a||n&&n.id||"tenants/me"===t)if("tenants/me"!==t){{const t=a||n.id;this._setCache(t,e,r)}e.__rapi_path__=t}else this._setCache("0",e,r);else"shortIds"!==t&&console.error("Can not cache because there is no ID!")}_getRelationsCacheFor(e,t,n){let r=RAPI_RELATIONS_CACHE.get(t);if(!r){const a=new Map,i=new Map;i.set(n,void 0),a.set(e,i),RAPI_RELATIONS_CACHE.set(t,a),r=RAPI_RELATIONS_CACHE.get(t)}let a=r.get(e);if(!a){const t=new Map;t.set(n,void 0),r.set(e,t),a=r.get(e)}return a.get(n)}_prepareGroups(e){const t=e.group,n=e.id;let r=getCachedMaterialGroup(t);r||(RAPI_MATERIAL_GROUP_CACHE.set(t,[]),r=getCachedMaterialGroup(t)),-1===r.indexOf(n.toString())&&r.push(n.toString())}_handleError(e,t={}){return n=>{navigator.onLine?(n.rmlErrorCode=1,n.message='Failed to load "'+e+'" because of "'+n.message+'"',this._errorHandler.dispatch(1,[n])):(n.rmlErrorCode=0,n.message='Failed to load "'+e+'" because of "'+n.message+'"',this._errorHandler.dispatch(0,[n])),t.reject?t.reject(n):this._notifyWaiters(e,n,null)}}_getRelationData(e,t,n={}){const r=e.id;if(!r)return Promise.resolve([]);const a=e.__rapi_path__,i=t.rapiPath;let s=this._getCache(i),o=this._getRelationsCacheFor(r.toString(),a,i),l=[];return o?(o.forEach(e=>l.push(s.get(e))),new Promise(e=>e(l))):navigator.onLine?new Promise((e,t)=>{this._get("/"+a+"/"+r+"/"+i,i,n).then(t=>{this._prepareRelationalData(a,i,r,t),e(t)},t)}):Promise.resolve([])}_prepareRelationalData(e,t,n,r){RAPI_RELATIONS_CACHE.has(e)||RAPI_RELATIONS_CACHE.set(e,new Map);let a=RAPI_RELATIONS_CACHE.get(e);const i=n.toString();a.has(i)||a.set(i,new Map);let s=a.get(i),o=this._getCache(t),l=[];for(let e=0,t=r.length;e<t;e++){const t=r[e],n=t.id.toString();l.push(n),o.set(n,t)}s.set(t,l)}_notifyWaiters(e,t,n){const r=WAITERS_FOR_URL.get(e);if(r&&r.length){for(let e=0,a=r.length;e<a;e++)t?r[e].reject(t):r[e].resolve(n);WAITERS_FOR_URL.delete(e)}}_tenantMe(){return new Promise((e,t)=>{const n=this._getCache("tenants/me"),r=this._globalInitData.overrideTenant?this._globalInitData.overrideTenant:n.get("0");if(r)return e(r);this._fetchJson("/tenants/me","tenants/me",{resolve:t=>e(t),reject:t})})}async getTenant(e){return e||(e=await this._tenantMe()),this._getById(e.toString(),"tenants")}getCurrentSkin(){return this._tenantMe().then(e=>this._getById(e.toString(),"tenants").then(e=>this._getById(e.skin.toString(),"skins")))}getPrices(e){return this._getByIds(e,"prices",{filterKey:"priceIds",cacheKey:"priceId"})}async getConfiguratorSettings(e){const t=await this._getById(e,"configurators");return t.allowedHosts||(t.allowedHosts=[]),t.allowedHosts&&!Array.isArray(t.allowedHosts)&&(t.allowedHosts=t.allowedHosts.split(" ")),t}sendUserAction(e){return this._save("/userActions",{userAction:e},"userActions",{accept:"application/json",contentType:"application/json; charset=UTF-8"})}_share(e,t,n,r){const a="/"+r+"/"+e+"/shares",i=new FormData;return i.append("email",t),i.append("type",n.toString()),new Promise((e,t)=>{const n={method:"POST",data:i,resolve:e,reject:t,accept:"application/json",contentType:"application/json; charset=UTF-8"};this._fetch(a,n).then(n.resolve,n.reject)})}shareConfiguration(e,t,n){return this._share(e,t,n,"configurations")}sharePlanSnapshot(e,t,n){return this._share(e,t,n,"planSnapshots")}export3D(e,t,n,r={}){const a="/"+(isPlanSnapshotId(e)?"planSnapshots":"configurations")+"/"+e+"/3d-exports",i={formats:[{file_format:n,pack_external_data:!0,...r}]},s=JSON.stringify(i),o=new FormData;return o.append("email",t),o.append("settings",s),new Promise((e,t)=>{const n={method:"POST",data:o,resolve:e,reject:t};this._fetch(a,n).then(n.resolve,n.reject)})}async trackView(e){if(this._itemLoaded||(t=(()=>{var e;const t=(()=>{if(window.__RML__ENV__&&window.__RML__ENV__.skipIframeCheck)return!1;try{return window.self!==window.top}catch(e){return!0}})();let n=null===(e=null===window||void 0===window?void 0:window.location)||void 0===e?void 0:e.href;if(!n)return null;if(t){if(!document.referrer)return null;n=document.referrer}const{hostname:r}=new URL(n);return r})())&&(NAMES_FOR_LOCALHOST.includes(t)||t.endsWith("gitlab.io")||t.endsWith("gitlab.com")||t.endsWith("codesandbox.io")||t.endsWith("stackblitz.com")||/^(admin.*.roomle.com)$/.test(t)))return;var t;const{configuratorId:n}=this._globalInitData,r={module:3,action:1,actionId:e,actionLabel:n};await this.sendUserAction(r),this._itemLoaded=!0}signinUser(e,t){return new Promise((n,r)=>{const a={method:"POST",accept:"application/json",contentType:"application/json; charset=UTF-8",data:JSON.stringify({identification:e,passwordMD5:t}),cacheKey:"token",resolve:n,reject:r};this._fetchJson("/auth/signin","auth",a)})}async signoutUser(e){const t=this._currentToken;t!==e&&this.setCurrentToken(e),await this._fetch("/auth/signout",{}),t&&t!==e?this.setCurrentToken(t):this.removeCurrentToken()}async savePlan(e){const t=e.id?"/plans/"+e.id:"/plans";return this._save(t,{plan:e},"plans",{method:e.id?"PUT":"POST",accept:"application/json",contentType:"application/json; charset=UTF-8"})}async savePlanSnapshot(e){return this._save("/planSnapshots",{planSnapshot:e},"planSnapshots",{accept:"application/json",contentType:"application/json; charset=UTF-8"})}setCurrentToken(e){this._currentToken=e}removeCurrentToken(){this._currentToken=null}createNewPlan(){return{name:"",description:"",changeDate:(new Date).toISOString(),created:(new Date).toISOString(),draftId:null,thumbnail:"data:image/png;base64,missing",planObjects:null,active:!0,open:0,planDirectory:0,changed:0,version:2,floorLevel:0,visibility:9,user:null,tenant:null,assets:[],parent:null,setting:null}}}__decorate([inject],RapiAccess.prototype,"_formDataUtil",void 0),__decorate([inject],RapiAccess.prototype,"_errorHandler",void 0),__decorate([inject],RapiAccess.prototype,"_dataSyncer",void 0),__decorate([inject],RapiAccess.prototype,"_networkLayer",void 0),__decorate([inject],RapiAccess.prototype,"_localStorage",void 0),__decorate([inject],RapiAccess.prototype,"_globalInitData",void 0),__decorate([inject],RapiAccess.prototype,"_globalCallback",void 0);const PULSE_DURATION=1500,PULSE_LOOPS=5;function RoomleComponentFactoryInitializer(){class e extends Object3D{static _generateOutline(e,t){let n=new LineSegments(new EdgesGeometry(e),new LineDashedMaterial({color:"#000000",dashSize:.03,gapSize:.01,linewidth:1}));return n.translateOnAxis(t,1),n.userData.ignoreComponentRaycast=!0,n}static cloneDockLine(e,t){let n=new LineSegments(e.geometry,e.material);return n.translateOnAxis(t.getCenter(new Vector3),1),n.name="dockline",n.layers.set(5),n.userData.ignoreComponentRaycast=!0,n}_setValues(e,t,n,r){e&&(this.runtimeId=e,this.name=e.toString()),t&&(this.roomlePosition=Object.assign({},t)),n&&(this.roomleRotation=Object.assign({},n)),r&&(this.parentObjectId=r)}constructor(e,t,n,r){super(),this._selected=!1,this.geometryChanged=!0,this.meshes=[],this.castShadow=!1,this.receiveShadow=!0,this._setValues(e,t,n,r)}get loadingMesh(){return this._loadingMesh}get boundingBoxMesh(){return this._boundingBoxMesh}get boundingBox(){return this._boundingBox}set roomlePosition(e){this._roomlePosition=e,e&&this.position.set(e.x/1e3,e.z/1e3,e.y/-1e3)}get roomlePosition(){return this._roomlePosition}set roomleRotation(e){this._roomleRotation=e,e&&this.rotation.set(e.x,e.z,-e.y)}get roomleRotation(){return this._roomleRotation}replaceMeshes(e){this.removeAllMeshes(),e.forEach(e=>{this.addMesh(new Mesh(e.geometry,e.material))})}addMesh(e,t){e.renderOrder=2,e.userData.meshType=0,t&&e.applyMatrix4(convertToThreeMatrix(t)),this.add(e),this.meshes.push(e)}getMeshById(e){return this.meshes.find(t=>t.userData.meshId===e)}removeMeshById(e){const t=this.getMeshById(e);t?this.removeMesh(t):console.warn("Could not remove mesh with id "+e,this.runtimeId,this.meshes)}removeMesh(e){const t=this.meshes.indexOf(e);this.remove(e),disposeMesh(e),t<0||this.meshes.splice(t,1)}removeAllMeshes(e=!0){this.meshes.forEach(t=>{this.remove(t),e&&disposeMesh(t)}),this.meshes=[],this._removeLoadingMesh(),this.remove(this._boundingBoxMesh),disposeMesh(this._boundingBoxMesh),this._boundingBoxMesh=null}_hideAllMeshes(){this.meshes.forEach(e=>e.visible=!1)}_showAllMeshes(){this.meshes.forEach(e=>e.visible=!0)}select(){this._selected=!0}loading(){if(!this._kernelBoundingBox)return void console.warn("Bounding box (box for measurements) for component "+this.runtimeId+" not set, can not show external mesh loading box!");this._removeLoadingMesh(),this._hideAllMeshes();const{x:e,y:t,z:n}=this._kernelBoundingBox.getSize(new Vector3);let r=new BoxGeometry(e,t,n);this._loadingMesh=new Mesh(r,MaterialCreator.createMeshStandardMaterial({transparent:!0,opacity:1,color:new Color$1("#DDDDDD")})),this._loadingMesh.name="loading mesh",this._loadingMesh.receiveShadow=!1,this._loadingMesh.castShadow=!1,this._loadingMesh.layers.set(5),this._loadingMesh.translateOnAxis(this._kernelBoundingBox.getCenter(new Vector3),1),this._loadingMesh.renderOrder=3,this.add(this._loadingMesh)}_removeLoadingMesh(){this._loadingMesh&&(this.remove(this._loadingMesh),disposeMesh(this._loadingMesh),this._loadingMesh=null)}loadingFinished(){this._removeLoadingMesh(),this._showAllMeshes()}deselect(){this._selected=!1}hoverOn(){setCursor("pointer")}hoverOff(){setCursor("default")}removeFromParent(){return this.parent&&(this.parent.remove(this),this.removeAllMeshes()),this}computeBoundingBox(t,n=!1){if(this._boundingBoxMesh&&this.remove(this._boundingBoxMesh),!n&&t&&0===t.size.x&&0===t.size.y&&0===t.size.z)return;let r;if(!t||n){this._boundingBox=new Box3;let e=new Vector3;this.meshes.forEach(t=>{if(t.geometry instanceof BufferGeometry){let n=t.geometry.attributes.position;if(void 0!==n)for(let r=0,a=n.count;r<a;r++)e.fromBufferAttribute(n,r).applyMatrix4(t.matrix),this._boundingBox.expandByPoint(e)}}),this._kernelBoundingBox=this._boundingBox.clone();let t=this._boundingBox.max.x-this._boundingBox.min.x,n=this._boundingBox.max.y-this._boundingBox.min.y,a=this._boundingBox.max.z-this._boundingBox.min.z;r=new BoxGeometry(t,n,a)}else{this._kernelBoundingBox=kernelBoxToThreeBox(t),this._boundingBox=this._kernelBoundingBox.clone();let{x:e,y:n,z:a}=this._boundingBox.getSize(new Vector3);r=new BoxGeometry(e,n,a)}this._boundingBoxMesh=new Mesh(r,MaterialCreator.createMeshStandardMaterial({color:"#FFFFFF",transparent:!0,opacity:0,polygonOffset:!0,polygonOffsetFactor:-1,visible:!1})),this._boundingBoxMesh.name="bounding box mesh";let a=this._boundingBox.getCenter(new Vector3);this._boundingBoxMesh.position.add(a),this._boundingBoxMesh.layers.set(5),this._boundingBoxMesh.renderOrder=3,this._boundingBoxMesh.castShadow=!1,this._boundingBoxMesh.receiveShadow=!1,this.add(this._boundingBoxMesh),this._dockline=e._generateOutline(r,a),this._dockline.name="bounding box outline",this._dockline.layers.set(5),this._selected&&this.add(this._dockline)}recursiveMeshes(){let t=this.meshes.slice();return this.children.forEach(n=>{n instanceof e&&t.push(...n.recursiveMeshes())}),t}isChild(t){let n=!1;return this.children.forEach(r=>{r instanceof e&&!n&&(n=r.runtimeId===t||r.isChild(t))}),n}getKernelPosition(e){let t=this.parent.localToWorld(this.position);return convertToKernel(e.worldToLocal(t))}}class t extends e{constructor(e,t){super(e,null,null,null),this.glbUrl=t}}class n extends e{constructor(e,t,n,r,a){super(t,n,r,a),this._stringId=null,this.receivedPointAssociation=!1,this.castShadow=!1,this.receiveShadow=!1,this._creator_=e}get stringId(){return this._stringId?this._stringId:this.runtimeId.toString()}addMesh(e,t){super.addMesh(e,t),e.material instanceof MeshStandardMaterial&&(e.material.opacity=.8,e.material.roughness=1,e.material.metalness=0,e.material.color=new Color$1(this._initData.colors.PREVIEW_DOCKING_COLOR)),e.renderOrder=1,e.castShadow=!1,e.receiveShadow=!1}startPulsating(){var e,t;if(null===(t=null===(e=this._initData)||void 0===e?void 0:e.featureFlags)||void 0===t?void 0:t.pulsePreview)for(const e of this.meshes){const t={opacity:.8},n={opacity:.3};new TWEEN.Tween(t).to(n,1500).easing(TWEEN.Easing.Sinusoidal.In).onUpdate(()=>{e.material.opacity=t.opacity}).yoyo(!0).repeat(5).start()}}hoverOn(){this.remove(this._dockline),this.meshes.forEach(({material:e})=>{e.opacity=.9,e.roughness=1,e.metalness=0,e.color=new Color$1(this._initData.colors.PREVIEW_DOCKING_COLOR)}),setCursor("pointer")}hoverOff(){this.add(this._dockline),this.meshes.forEach(({material:e})=>{e.opacity=.8,e.roughness=1,e.metalness=0,e.color=new Color$1(this._initData.colors.PREVIEW_DOCKING_COLOR)}),setCursor("default")}clonePreview(t){const r=new n(this._creator_,this.runtimeId,this.roomlePosition,this.roomleRotation,this.parentObjectId);return r._stringId=this.runtimeId+"_"+t,this.children.forEach(e=>{e instanceof Mesh&&0===e.userData.meshType&&r.meshes.push(e.clone(!0))}),r.meshes.forEach(e=>{e.material=e.material.clone(),e.geometry=e.geometry.clone(),r.add(e)}),this._dockline&&(r._dockline=e.cloneDockLine(this._dockline,this._boundingBox)),this._boundingBoxMesh&&(r._boundingBoxMesh=this._boundingBoxMesh.clone(!0)),this._boundingBox&&(r._boundingBox=this._boundingBox.clone()),r}preparePreview(){this.add(this._dockline),this.add(this._boundingBoxMesh)}}__decorate([inject],n.prototype,"_initData",void 0);class r extends n{constructor(e,t,n,r,a,i){super(e,t,n,r,a),i&&(this._stringId=this.runtimeId+"_has_additional_dock_point_copy")}set roomleLineFrom(e){this._roomleLineFrom=e,this.lineFrom=convertToTHREE(e)}get roomleLineFrom(){return this._roomleLineFrom}set roomleLineTo(e){this._roomleLineTo=e;let t=convertToTHREE(e);t.equals(this.lineFrom)&&(console.warn("lineFrom and lineTo are equal!"),t.add(new Vector3(0,.01,0))),this.lineTo=t}get roomleLineTo(){return this._roomleLineTo}set roomlePositionFrom(e){this._roomlePositionFrom=e,this.positionFrom=convertToTHREE(e)}get roomlePositionFrom(){return this._roomlePositionFrom}set roomlePositionTo(e){this._roomlePositionTo=e;let t=convertToTHREE(e);t.equals(this.positionFrom)&&(console.warn("positionFrom and positionTo are equal!"),t.add(new Vector3(0,.01,0))),this.positionTo=t}get roomlePositionTo(){return this._roomlePositionTo}addMesh(e,t){super.addMesh(e,t),e.visible=!1,e.renderOrder=3}hoverOn(){this._dockline.visible=!0,setCursor("pointer")}hoverOff(){this._dockline.visible=!1,setCursor("default")}preparePreview(){super.preparePreview(),this._dockline.visible=!1;let e=this.lineTo.clone(),t=this.lineFrom.clone();const n=(new Vector3).subVectors(e,t);let r=n.length(),a=n.normalize(),i=new ArrowHelper(a,t),s=new CylinderGeometry(.01,.01,r,16,1);this.lineMesh=new Mesh(s,MaterialCreator.createMeshStandardMaterial({color:"#DDDDDD",transparent:!0,opacity:.4})),this.lineMesh.name="line mesh";const o=(new Quaternion).setFromEuler(i.rotation);this.lineMesh.quaternion.multiply(o),this.lineMesh.renderOrder=1;let l=(new Vector3).addVectors(e,t).multiplyScalar(.5);this.lineMesh.position.copy((new Vector3).subVectors(l,this.position.clone())),this.add(this.lineMesh);let d=this._boundingBox.getCenter(new Vector3).applyEuler(this.docklineRotation),h=null,c=0,u=Math.abs(a.x),p=Math.abs(a.y),m=Math.abs(a.z);u>=p&&u>=m?(h=new Vector3(d.x,0,0),c=Math.sqrt(d.y*d.y+d.z*d.z)):p>=u&&p>=m?(h=new Vector3(0,d.y,0),c=Math.sqrt(d.x*d.x+d.z*d.z)):m>=p&&m>=u&&(h=new Vector3(0,0,d.z),c=Math.sqrt(d.y*d.y+d.x*d.x)),c=c>0?c:.01;let g=(new Vector3).subVectors(this.positionTo.clone(),this.positionFrom.clone()).length()+h.length(),f=new CylinderGeometry(1.1*c,1.1*c,g,32,1);this.boundingLineMesh=new Mesh(f,MaterialCreator.createMeshStandardMaterial({color:"#ffffff",transparent:!0,opacity:0})),this.boundingLineMesh.name="bounding line mesh",this.boundingLineMesh.userData.ignoreComponentRaycast=!0,this.boundingLineMesh.layers.set(5);let _=this.positionTo.clone(),v=this.positionFrom.clone(),w=(new Vector3).subVectors(_,v).normalize(),b=new ArrowHelper(w,v);const S=(new Quaternion).setFromEuler(b.rotation);this.boundingLineMesh.quaternion.multiply(S),this.boundingLineMesh.renderOrder=3;let y=(new Vector3).addVectors(this.positionTo.clone(),this.positionFrom.clone()).multiplyScalar(.5).add(d);this.boundingLineMesh.position.copy((new Vector3).subVectors(y,this.position.clone())),this.add(this.boundingLineMesh)}clonePreviewLine(t){let n=new r(this._creator_,this.runtimeId,this.roomlePosition,this.roomleRotation,this.parentObjectId,this.receivedPointAssociation);return n._stringId=this.runtimeId+"_"+t,this.children.forEach(e=>{e instanceof Mesh&&0===e.userData.meshType&&n.meshes.push(e.clone(!0))}),n.meshes.forEach(e=>{e.material=e.material.clone(),e.geometry=e.geometry.clone(),n.add(e)}),this._dockline&&(n._dockline=e.cloneDockLine(this._dockline,this._boundingBox)),this._boundingBoxMesh&&(n._boundingBoxMesh=this._boundingBoxMesh.clone(!0)),this._boundingBox&&(n._boundingBox=this._boundingBox.clone()),n}getPositionForIntersectionPoint(e){let t=this._boundingBox.getCenter(new Vector3).applyEuler(this.docklineRotation),n=this.positionTo.clone().add(t),r=this.positionFrom.clone().add(t),a=new Line3(r,n).closestPointToPoint(e,!0,new Vector3);return(isNaN(a.x)||isNaN(a.y)||isNaN(a.z))&&a.copy(e),a.sub(t)}updatePreviewPosition(e){let t=this.getPositionForIntersectionPoint(e),n=this.parent.localToWorld(t);this._newPosition=this.worldToLocal(n);let r=this._boundingBox.getCenter(new Vector3).applyEuler(this.docklineRotation);this._dockline.position.copy((new Vector3).addVectors(this._newPosition,r)),this._dockline.rotation.copy(this.docklineRotation)}hideSelectionLine(){this._dockline.visible=!1}getKernelPosition(e){if(this._newPosition){let t=this.localToWorld(this._newPosition);return convertToKernel(e.worldToLocal(t))}return super.getKernelPosition(e)}}class a extends OrthographicCamera{constructor(e,t,n,r,a,i,s){super(e,t,n,r,a,i),s||(s={left:0,top:1,right:1,bottom:0}),this.offset=s}set offset(e){this._offset=e,this.updateProjectionMatrix()}get offset(){return this._offset}resetOffset(){this._offset={left:0,top:1,right:1,bottom:0}}updateProjectionMatrix(){this._offset?(this.projectionMatrix=this._calculateProjectionMatrix(),this.projectionMatrixInverse.copy(this.projectionMatrix).invert()):super.updateProjectionMatrix()}_calculateProjectionMatrix(){const e=this._calculate2DPlanes();if(this._offset.left>=this._offset.right||this._offset.bottom>this._offset.top)return(new Matrix4).makeOrthographic(e.left,e.right,e.top,e.bottom,this.near,this.far);const t=this._scaleRange(e.left,e.right,this._offset.left,this._offset.right);let n=t.from,r=t.to;const a=this._scaleRange(e.bottom,e.top,this._offset.bottom,this._offset.top);let i=a.from,s=a.to;const o=(e.right-e.left)/(e.top-e.bottom),l=(r-n)/(s-i);if(l>o){const e=(i+s)/2,t=(s-i)*l/o;i=e-t/2,s=e+t/2}else{const e=(n+r)/2,t=(r-n)*o/l;n=e-t/2,r=e+t/2}return(new Matrix4).makeOrthographic(n,r,s,i,this.near,this.far)}_scaleRange(e,t,n,r){const a=(t-e)/(r-n);return{from:e-a*n,to:t+a*(1-r)}}_calculate2DPlanes(){const e=(this.right-this.left)/(2*this.zoom),t=(this.top-this.bottom)/(2*this.zoom),n=(this.right+this.left)/2,r=(this.top+this.bottom)/2;let a=n-e,i=n+e,s=r+t,o=r-t;if(null!==this.view&&this.view.enabled){const e=(this.right-this.left)/this.view.fullWidth/this.zoom,t=(this.top-this.bottom)/this.view.fullHeight/this.zoom;a+=e*this.view.offsetX,i=a+e*this.view.width,s-=t*this.view.offsetY,o=s-t*this.view.height}return{left:a,right:i,top:s,bottom:o}}}class i extends PerspectiveCamera{constructor(e,t,n,r,a){super(e,t,n,r),a||(a={left:0,top:1,right:1,bottom:0}),this.offset=a}copy(e,t){return super.copy(e,t),this._offset=e._offset,this}set offset(e){this._offset=e,this.updateProjectionMatrix()}get offset(){return this._offset}resetOffset(){this._offset={left:0,top:1,right:1,bottom:0}}_calculateProjectionMatrix(){let e,t,n,r,a=this.fov*(2*Math.PI/360)/2;n=Math.tan(a),r=-n;let i=Math.atan(this.aspect*Math.tan(a));t=Math.tan(i),e=-t;let s=this._offset.left,o=this._offset.right,l=this._offset.top,d=this._offset.bottom,h=new Vector2(o-s,l-d),c=new Vector2(s+h.x/2,d+h.y/2);if(h.x<h.y){let a=(1-c.x)/(h.x/2),i=c.x/(h.x/2);t*=a,e*=i;let s=(a+i)/2;n*=s,r*=s}else{let a=(1-c.y)/(h.y/2),i=c.y/(h.y/2);n*=a,r*=i;let s=(i+a)/2;e*=s,t*=s}e*=this.near,t*=this.near,n*=this.near,r*=this.near;let u=this.near*Math.tan(Math.PI/180*.5*this.fov)/this.zoom*2,p=this.aspect*u;return this.view&&this.view.enabled&&(e+=this.view.offsetX*p/this.view.fullWidth,n-=this.view.offsetY*u/this.view.fullHeight,t+=this.view.offsetX*p/this.view.fullWidth,r-=this.view.offsetY*u/this.view.fullHeight),(new Matrix4).makePerspective(e,t,n,r,this.near,this.far)}clearViewOffset(){null!==this.view&&(this.view.enabled=!1),this.updateProjectionMatrix()}updateProjectionMatrix(){this._offset?(this.projectionMatrix=this._calculateProjectionMatrix(),this.projectionMatrixInverse.copy(this.projectionMatrix).invert()):super.updateProjectionMatrix()}}return{create:function(t,n,r,a){return new e(t,n,r,a)},createPreview:function(e,t,r){return new n(r,e,{x:0,y:0,z:0},{x:0,y:0,z:0},t)},createStatic:function(e,n){return new t(e,n)},createPreviewLine:function(e,t){let n=new r(t,e.id,e.roomlePosition,e.roomleRotation,e.parentObjectId,e.receivedPointAssociation);return e.meshes.forEach(e=>{let t=e.clone();t.material=e.material.clone(),t.geometry=e.geometry.clone(),n.addMesh(t)}),n.computeBoundingBox(),n},isPreview:function(e){return e instanceof n},isPreviewLine:function(e){return e instanceof r},createPerspectiveCamera:function(e,t,n,r,a){return new i(e,t,n,r,a)},createOrthographicCamera:function(e,t,n,r,i,s,o){return new a(e,t,n,r,i,s,o)}}}const DEFAULT_CONVERSATION_ID=9;class ConfiguratorViewModel{constructor(e){this._mergeThreshold=3,this._componentsToMerge=new OccurrenceMap,this._mergeInProgress=!1,this._components=new Map,this._previews=new Map,this._componentNumberOfPossibleChildren=new Map,this._creator_=e,this._getKernelAccess().addConfiguratorListener(this),this._componentFactory=RoomleComponentFactoryInitializer()}get materialQueue(){return this.getMeshGenerator().materialQueue}_getKernelAccess(){return RoomleDependencyInjection.lookup("planner-kernel-access",this._creator_)}_applyMeshTransform(e,t,n,r,a){if(n){const r=e.userData.transform=convertToThreeMatrix(n);t&&(e.userData.transform=r),e.applyMatrix4(r)}this._applyMeshUVTransform(e,t,r,a)}_applyMeshUVTransform(e,t,n,r){if(6!==(null==n?void 0:n.length)||(e=>1===e[0]&&0===e[1]&&0===e[2]&&1===e[3]&&0===e[4]&&0===e[5])(n))t&&(t.uvTransform=void 0),r&&(e.geometry=r);else{const a=(e=>{const t=new Matrix4;return t.set(e[0],e[2],0,e[4],e[1],e[3],0,e[5],0,0,1,0,0,0,0,1),t})(n);t&&(t.uvTransform=a);const i=null!=r?r:e.geometry;if(i&&i.attributes.uv){const t=i.clone();t.attributes.uv.applyMatrix4(a),e.geometry=t}}}_addMeshToSubPart(e,t,n,r,a,i,s,o,l,d){const h=this._generateMesh(e,t,n,i,s,o,l,void 0,void 0,d);this._applyMeshTransform(h,null,r,a),this._subPartObject.add(h)}_addMeshToComponent(e,t,n,r,a,i,s,o,l,d,h,c){if(this._subPartGuard&&this._subPartGuard.info===e)return void this._addMeshToSubPart(e,null,r,null,null,s,o,l,d,c);const u=this.getComponent(e);if(!u)return;const p=this._componentFactory.isPreview(u),m=this._generateMesh(e,n,p?null:r,s,o,l,d,void 0,void 0,c);m.userData.meshId=t,m.userData.geometryId=n,m.userData.materialId=r,this._applyMeshTransform(m,m.userData,a,i),p&&m.layers.set(5),u&&u.addMesh(m),u.meshes.length>this._mergeThreshold&&this._componentsToMerge.set(e,u.meshes.length)}_changeMeshOfComponent(e,t,n,r,a,i,s){const o=this.getComponent(e);if(!o)return;const l=o.getMeshById(t);if(l){l.userData.geometryId!==n&&console.warn("Geometry of mesh has changed!"),l.userData.materialId=r,l.userData.materialAttributes=s;const e=l.material.clone();this._configuratorMeshGenerator.setMaterial(l,r,void 0,s),e.opacity!==l.material.opacity&&this._requestRenderCallback&&this._requestRenderCallback(),a&&(l.position.set(0,0,0),l.scale.set(1,1,1),l.rotation.set(0,0,0));const t=this._configuratorMeshGenerator.getGeometry(n);this._applyMeshTransform(l,l.userData,a,i,t)}}_removeMeshFromComponent(e,t){const n=this.getComponent(e);n&&n.removeMeshById(t)}getComponent(e){let t=this._components.get(e);return t||(t=this._previews.get(e.toString()),t)?t:(console.warn("component not found!",e),null)}getNumberOfPossibleChildrenForComponent(e){if(this._componentNumberOfPossibleChildren.has(e))return this._componentNumberOfPossibleChildren.get(e);const t=this._getKernelAccess().kernelInstance.getPlanComponentPossibleChildren(e).length;return this._componentNumberOfPossibleChildren.set(e,t),t}tryToMergeComponents(){this._initData.moc||this._mergeInProgress||(this._mergeInProgress=!0,this._componentsToMerge.size,this._requestMergeComponents())}_requestMergeComponents(){window.requestIdleCallback(this._mergeNextComponent.bind(this))}_mergeNextComponent(){if(this._componentsToMerge.size>0){const e=this._componentsToMerge.largestValue();this._componentsToMerge.delete(e),this._mergeComponent(e),this._requestMergeComponents()}else this._mergeInProgress=!1,this._geometriesMerged&&this._geometriesMerged(),this._components.forEach(e=>{e.loadingMesh&&console.warn("component still has loading mesh: ",e.hash)})}_mergeComponent(e){const t=this._components.get(e);if(t&&!(t.meshes.length<=this._mergeThreshold))if(this._cacheHolder.componentCache.has(t.hash)){const e=this._cacheHolder.componentCache.get(t.hash).meshes;t.replaceMeshes(e)}else{const e=new Map,n=[],r=[];t.meshes.forEach(t=>{const a=t.userData.materialId;if(!a)return void console.warn("mesh has no material id set");if(!e.has(a)){const r=new Mesh(new BufferGeometry,t.material);r.userData.materialId=a,r.receiveShadow=!0,r.castShadow=!0,r.layers.set(3),this._setMaterial(r,a),n.push(r),e.set(a,r)}const i=e.get(a),s=i.geometry;t.userData.transform&&t.geometry.applyMatrix4(t.userData.transform),i.geometry=function(e,t=!1){const n=null!==e[0].index,r=new Set(Object.keys(e[0].attributes)),a=new Set(Object.keys(e[0].morphAttributes)),i={},s={},o=e[0].morphTargetsRelative,l=new BufferGeometry;let d=0;for(let h=0;h<e.length;++h){const c=e[h];let u=0;if(n!==(null!==c.index))return console.error("THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index "+h+". All geometries must have compatible attributes; make sure index attribute exists among all geometries, or in none of them."),null;for(const e in c.attributes){if(!r.has(e))return console.error("THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index "+h+'. All geometries must have compatible attributes; make sure "'+e+'" attribute exists among all geometries, or in none of them.'),null;void 0===i[e]&&(i[e]=[]),i[e].push(c.attributes[e]),u++}if(u!==r.size)return console.error("THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index "+h+". Make sure all geometries have the same number of attributes."),null;if(o!==c.morphTargetsRelative)return console.error("THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index "+h+". .morphTargetsRelative must be consistent throughout all geometries."),null;for(const e in c.morphAttributes){if(!a.has(e))return console.error("THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index "+h+". .morphAttributes must be consistent throughout all geometries."),null;void 0===s[e]&&(s[e]=[]),s[e].push(c.morphAttributes[e])}if(t){let e;if(n)e=c.index.count;else{if(void 0===c.attributes.position)return console.error("THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index "+h+". The geometry must have either an index or a position attribute"),null;e=c.attributes.position.count}l.addGroup(d,e,h),d+=e}}if(n){let t=0;const n=[];for(let r=0;r<e.length;++r){const a=e[r].index;for(let e=0;e<a.count;++e)n.push(a.getX(e)+t);t+=e[r].attributes.position.count}l.setIndex(n)}for(const e in i){const t=mergeAttributes(i[e]);if(!t)return console.error("THREE.BufferGeometryUtils: .mergeGeometries() failed while trying to merge the "+e+" attribute."),null;l.setAttribute(e,t)}for(const e in s){const t=s[e][0].length;if(0===t)break;l.morphAttributes=l.morphAttributes||{},l.morphAttributes[e]=[];for(let n=0;n<t;++n){const t=[];for(let r=0;r<s[e].length;++r)t.push(s[e][r][n]);const r=mergeAttributes(t);if(!r)return console.error("THREE.BufferGeometryUtils: .mergeGeometries() failed while trying to merge the "+e+" morphAttribute."),null;l.morphAttributes[e].push(r)}}return l}([s,t.geometry]),r.push(t)}),n.forEach(e=>t.addMesh(e)),r.forEach(e=>t.removeMesh(e)),this._cacheHolder.componentCache.set(t.hash,t)}}_addRootComponent(e){this._listener&&this._listener.display(e)}removeDockingComponent(){this._getKernelAccess().requestDeleteComponent(this._configuratorContext.dockingRootComponentId),this._configuratorContext.dockingRootComponentId=null}dockComponent(e,t,n,r){let a=this._components.get(t),i=this._components.get(e);i&&(i.roomlePosition=n,i.roomleRotation=r,a&&a.add(i))}dockComponentWithPosition(e,t){let n,r=this._components.get(e.parentId);n=t?t.getKernelPosition(r):e.getKernelPosition(r),Benchmark.start("dock_component_with_position_"+e.childId),this._getKernelAccess().dockComponentWithPosition(e.parentId,e.parentDockId,e.childId,e.childDockId,n),this._configuratorContext.dockingRootComponentId=null}removePreviews(){this._previews.size>0&&(this._previews.forEach(e=>{e.removeFromParent(),e.removeAllMeshes()}),this._previews.clear())}_updatePlanObject(e){const t=this._components.get(e.rootPlanComponentId);let n=!0;t&&(n=t.geometryChanged),this._listener&&this._listener.planObjectUpdated(e,n)}Editor3dAddBakedMesh(e,t,n,r,a,i,s,o){this._addMeshToComponent(e,null,null,t,null,null,n,r,a,i,s,o)}Editor3dAddDockPreview(e,t){const n=this._componentFactory.createPreview(t,e,this._creator_);this._previews.set(t.toString(),n)}Editor3dAddNamedMesh(e,t,n,r,a,i,s,o,l,d,h,c){this._addMeshToComponent(e,t,n,r,a,h,i,s,o,l,d,c)}Editor3ChangedNamedMesh(e,t,n,r,a,i,s){this._changeMeshOfComponent(e,t,n,r,a,i,s)}Editor3dRemoveNamedMesh(e,t){this._removeMeshFromComponent(e,t)}Editor3dBeginConstruction(e,t){if(!t){const t=this._components.get(e);t&&t.removeAllMeshes()}this._subPartGuard&&e===this._subPartGuard.info&&(this._subPartObject=new Object3D)}Editor3dComponentCreated(e,t,n,r,a){a&&(this._configuratorContext.rootComponentId=e);let i=null;this._components.has(e)?(i=this._components.get(e),i.removeAllMeshes()):(i=this._componentFactory.create(e,t,n,r),i.layers.set(3)),this._components.set(e,i),a&&this._addRootComponent(i)}Editor3dComponentDocked(e,t,n,r){this.dockComponent(e,t,n,r)}Editor3dEndConstruction(e){if(this._subPartGuard&&this._subPartGuard.info===e)return void this._subPartGuard.resolve(this._subPartObject);const t=this._getKernelAccess().kernelInstance.getComponent(e),n=this._components.get(e);n&&(n.computeBoundingBox(t.boxForMeasurement),n.boundingBoxMesh&&this._listener&&this._listener.addComponentHandlers(n));let r=this._previews.get(e.toString());r&&r.computeBoundingBox(t.boxForMeasurement,!0)}Editor3dGeometryReady(e){const t=this._components.get(e);t&&t.loadingFinished()}Editor3dGeometryNotReady(e){const t=this._components.get(e);t&&t.loading()}Editor3dPlanObjectConstructionDone(e){const t=this._getKernelAccess().kernelInstance.getPlanObject(e),n=[t,this._getKernelAccess().kernelInstance.getFullPartList(),this._getKernelAccess().kernelInstance.getHashOfConfiguration(e),this._getKernelAccess().kernelInstance.getComponentId(t.rootPlanComponentId)];AsyncHelper.finishOperation(2,n),this._updatePlanObject(t),this._listener&&this._listener.planObjectConstructionDone(t)}Editor3dPreviewConstructionDone(e,t){let n=!1;this._previews.forEach(e=>{null!==e.parent&&(this._listener&&(this._componentFactory.isPreviewLine(e)?this._listener.addPreviewLineHandlers(e):this._listener.addPreviewHandlers(e)),n=!0)}),this._listener&&this._listener.previewConstructionDone(this._components.get(e),n)}Editor3dSetPreviewLineAssociations(e,t){let n=this._previews.get(t.toString());if(n.clear(),!n)return;let r=this._componentFactory.createPreviewLine(n,this._creator_),a=this._components.get(this._configuratorContext.rootComponentId);for(let t=0;t<e.length;t++){let n;n=0===t?r:r.clonePreviewLine(t),n.name="Preview Line",n.parentDockId=e[t].parentDockId,n.parentId=e[t].parentId,n.childDockId=e[t].childDockId,n.childId=e[t].childId,n.docklineRotation=(i=e[t].rotation,new Euler(i.x,i.z,-i.y)),n.roomlePosition=e[t].position,e[t].lineFrom.x>e[t].lineTo.x||e[t].lineFrom.y>e[t].lineTo.y||e[t].lineFrom.z>e[t].lineTo.z?(n.roomleLineFrom=e[t].lineTo,n.roomleLineTo=e[t].lineFrom):(n.roomleLineFrom=e[t].lineFrom,n.roomleLineTo=e[t].lineTo),e[t].positionFrom.x>e[t].positionTo.x||e[t].positionFrom.y>e[t].positionTo.y||e[t].positionFrom.z>e[t].positionTo.z?(n.roomlePositionFrom=e[t].positionTo,n.roomlePositionTo=e[t].positionFrom):(n.roomlePositionFrom=e[t].positionFrom,n.roomlePositionTo=e[t].positionTo),a.add(n),n.preparePreview(),this._previews.set(n.stringId,n)}var i}Editor3dSetPreviewPointAssociations(e,t){let n=this._previews.get(t.toString());if(!n)return;let r=this._components.get(this._configuratorContext.rootComponentId);for(let t=0;t<e.length;t++){let a;0===t?a=n:(a=n.clonePreview(t),this._previews.set(a.stringId,a)),a.name="Preview Point",a.parentDockId=e[t].parentDockId,a.parentId=e[t].parentId,a.childDockId=e[t].childDockId,a.childId=e[t].childId,a.preparePreview(),a.receivedPointAssociation=!0,a.userData.ignoreComponentRaycast=!0,r.add(a),a.roomlePosition=e[t].position,a.roomleRotation=e[t].rotation,a.startPulsating()}}componentDeleted(e){const t=this._components.get(e);t&&(this._listener&&this._listener.componentDeleted(t),t.removeFromParent(),t.removeAllMeshes(),this._components.delete(e))}componentMetaUpdated(e){const t=this._getRuntimeComponent(e.id);t&&(t.hash=e.hash,t.roomlePosition=e.position,t.roomleRotation=e.rotation,e.boxForMeasurement&&t.computeBoundingBox(e.boxForMeasurement),this._listener&&this._listener.componentUpdated(t,e))}componentConfigurationUpdated(e,t){const n=this._getRuntimeComponent(e);n&&(n.geometryChanged=t)}_getRuntimeComponent(e){let t=this._components.get(e);return t||(t=this._previews.get(e.toString()),t)?t:null}configurationLoaded(e,t,n,r,a){10===e&&(this._configuratorContext.dockingRootComponentId=n);let i=0===t;i?this._getKernelAccess().kernelInstance.requestPlanComponentConstructionRecursive(n):this._getKernelAccess().kernelInstance.requestPlanObjectConstruction(t);let s=this._getKernelAccess().kernelInstance.getComponent(n),o=this._components.get(n);o&&(o.computeBoundingBox(s.boxForMeasurement),o.hash=s.hash),this._listener&&this._listener.configurationLoaded(o,i&&void 0!==o.boundingBoxMesh)}finishParameterChange(e,t){this.materialQueue.registerCallback(e)}planObjectConfigurationUpdated(e,t,n){let r=this._getKernelAccess().kernelInstance.getPlanObject(e);this._updatePlanObject(r)}planObjectCreated(e,t){this._configuratorContext.planObjectId=t,this._listener&&this._listener.clearScene()}planObjectUpdated(e){this._updatePlanObject(e)}sceneCleared(){this._components.forEach((function(e){e.removeFromParent(),e.removeAllMeshes()})),this._components.clear(),this._componentNumberOfPossibleChildren.clear(),this._previews.forEach(e=>{e.removeFromParent(),e.removeAllMeshes()}),this._previews.clear()}setListener(e){this._listener=e}getBoundingBox(){if(this._configuratorContext.planObjectId){const e=this._getKernelAccess().kernelInstance.getPlanObject(this._configuratorContext.planObjectId);if(e&&e.boxForMeasurement)return kernelBoxToThreeBox(e.boxForMeasurement)}else if(this._configuratorContext.rootComponentId){const e=this._components.get(this._configuratorContext.rootComponentId);return(new Box3).setFromObject(e)}return null}getBoundingBoxWithPreviews(){const e=this._components.get(this._configuratorContext.rootComponentId);return e?(new Box3).setFromObject(e):null}hasPreviews(){return this._previews.size>0}clearRootComponent(){var e;null===(e=this._components.get(this._configuratorContext.rootComponentId))||void 0===e||e.hoverOff()}debugSceneGraph(e){e?this._components.has(e)?this._components.get(e):this._previews.has(e.toString())&&this._previews.get(e.toString()):this._configuratorContext}getComponentsForIds(e){let t=[];return e.forEach(e=>{const n=this._components.get(e);n&&t.push(n)}),t}getComponents(){return Array.from(this._components.values())}getPreviews(){return Array.from(this._previews.values())}hasPreviewLines(){for(const e of this._previews.values())if(this._componentFactory.isPreviewLine(e))return!0;return!1}isPreviewLine(e){return this._componentFactory.isPreviewLine(e)}isPreview(e){return this._componentFactory.isPreview(e)}setGeometriesMergedListener(e){this._geometriesMerged=e}removeGeometriesMergedListener(){this._geometriesMerged=void 0}setMergeThreshold(e){this._mergeThreshold=e}_generateMesh(e=0,t=null,n,r,a,i,s,o,l,d){return this._configuratorMeshGenerator.generateMesh(e,t,n,r,a,i,s,!1,d)}_setMaterial(e,t,n){this._configuratorMeshGenerator.setMaterial(e,t)}constructComponents(e){this._getKernelAccess().kernelInstance.requestPlanObjectConstruction(e)}requestSubPartConstruction(e){return this._subPartGuard=new AsyncGuard(e),this._getKernelAccess().requestPlanComponentConstruction(e,!1),this._subPartGuard.wait()}getMeshGenerator(){return this._configuratorMeshGenerator}setRequestRenderCallback(e){this._requestRenderCallback=e}}__decorate([inject],ConfiguratorViewModel.prototype,"_configuratorMeshGenerator",void 0),__decorate([inject],ConfiguratorViewModel.prototype,"_configuratorContext",void 0),__decorate([inject],ConfiguratorViewModel.prototype,"_cacheHolder",void 0),__decorate([inject],ConfiguratorViewModel.prototype,"_initData",void 0);class OccurrenceMap extends Map{largestValue(){let e=this.entries().next().value[0],t=0;return this.forEach((n,r)=>{n>t&&(e=r,t=n)}),e}}const ASYNC_PARAMTER_CHANGES=["material"];class ConfiguratorKernelAccess extends CommonKernelAccess{constructor(e){super(e),this.externalMeshQueue=new PromiseQueue,this.muteKernelCallbacks=!1,this.listOfVariants=(e,t)=>{}}init(e){super.init(e),Benchmark.addMeta("kernel_is_ready",{isWasm:this._useWASM}),AppContext.kernelInstance?(this._kernelContainer=AppContext.kernelContainer,setTimeout(()=>this._loadSuccess(),0)):this._scriptLoader.fetch(this._kernelPath,{id:"kernel"}).then(this._loadSuccess.bind(this),this._loadError.bind(this))}_loadSuccess(){Benchmark.start("kernel_is_ready"),window.ConfiguratorKernel&&(AppContext.kernelInstance?setTimeout(()=>this.isReady(),0):(window.ConfiguratorKernel(this._kernelContainer),window.ConfiguratorKernel=null))}_loadError(){this._configuratorKernelAccessCallback.loadError()}selectedComponent(e){this._updateComponentDependencies(e)}uiRequestConfiguration(e){const t=this._kernelInstance.getSerializedConfiguration(e);AsyncHelper.finishOperation(1,t)}_updateComponentParameters(e){let t=this._kernelInstance.getComponentParameters(e);const n=this._kernelInstance.getComponent(e);this._configuratorKernelAccessCallback.updateParameters(t,n.parameterGroups,e,1)}selectionChange(e,t){let n=!1,r=[];if(e){let t=this._kernelInstance.getComponent(e);t.componentId=this._kernelInstance.getComponentId(e),t&&t.childIds&&t.childIds.length>0&&(n=!0),r.push(t)}this._configuratorUiCallbacks.onSelectionChange("standard",t,n,r)}multiSelectionChange(e,t){this._updateCommonComponentDependencies(e);let n=!1,r=!1,a=[];e&&e.forEach(e=>{let i=this._kernelInstance.getComponent(e);i.componentId=this._kernelInstance.getComponentId(e),i&&i.childIds&&i.childIds.length>0&&(n=!0),i.id===t&&(r=!0),a.push(i)}),this._configuratorUiCallbacks.onSelectionChange("multiselect",r,n,a)}_updateCommonComponentDependencies(e){const{parameters:t,parameterGroups:n}=this._kernelInstance.getCommonPlanComponentParameters(this._utilityToLongArray(e));this._configuratorKernelAccessCallback.updateParameters(t,n,e,2)}_updateComponentChildren(e){const t=this._kernelInstance.getPlanComponentPossibleChildren(e);this._configuratorKernelAccessCallback.updatePossibleChildren(e,t,1)}_updateComponentDependencies(e){this._updateComponentParameters(e),this._updateComponentChildren(e)}_updatePlanObjectParameters(e){let t,n=this._kernelInstance.getPlanObjectParameters(e);if(0===n.length){let r=this._kernelInstance.getRootPlanComponentIdFromObjectId(e);n=this._kernelInstance.getComponentParameters(r),this._enableRootComponentParametersAsGlobal(),t=this._kernelInstance.getComponent(r)}else this._configuratorContext.rootComponentParametersAsGlobal=!1,t=this._kernelInstance.getPlanObject(e);this._configuratorKernelAccessCallback.updateParameters(n,t.parameterGroups,e,0)}_enableRootComponentParametersAsGlobal(){this._configuratorContext.selectedRuntimeComponentId||(this._configuratorContext.rootComponentParametersAsGlobal=!0)}_updatePlanObjectChildren(e){const t=this._kernelInstance.getPlanObjectPossibleChildren(e);this._configuratorKernelAccessCallback.updatePossibleChildren(e,t,0)}updatePlanObjectDependencies(e){this._updatePlanObjectParameters(e),this._updatePlanObjectChildren(e)}_updateConfigurationHasChildren(e,t=null){t||(t=this._kernelInstance.getComponent(this._kernelInstance.getRootPlanComponentIdFromObjectId(e)));const n=t.childIds.size?t.childIds.size():t.childIds.length;this._configuratorUiCallbacks.onConfigurationHasChildren(n>0)}dockComponent(e,t,n,r){const a=this._kernelInstance.getComponentId(n),i=this._kernelInstance.getComponentId(e);this._kernelInstance.dockComponent(n,r,e,t),this._configuratorUiCallbacks.onUserInitiatedDockDone(a,r,i,t,null)}changeUseOfHDGeometry(e,t){this._rapiAccess.changeUseOfHDGeometry();const n=e.planObjectId,r=e.lastLoadedRapiId?e.lastLoadedRapiId:this._kernelInstance.getComponentId(n),a=this._kernelInstance.getSerializedConfiguration(n);this._kernelInstance.clearAll(),this._kernelInstance.useHDGeometry(t),AsyncHelper.finishOperation(3,[a,r])}webGlPreviewDockings(e,t){AsyncHelper.waitFor(4).then(({componentId:n})=>{t&&this.requestPlanComponentConstruction(n),this._kernelInstance.requestPreviewGeometry(n,e.planObjectId)}),e.lastPossibleChild&&e.lastPossibleChild.isComponent&&(this._kernelIo.setMeta({componentId:e.lastPossibleChild.id}),this._kernelInstance.loadPlainComponent(10,e.lastPossibleChild.id,e.lastPossibleChild.configuration)),e.lastPossibleChild&&e.lastPossibleChild.isItem&&this._kernelInstance.loadFreeFlyingConfiguration(10,e.lastPossibleChild.configuration)}previewDockingsWithDrag(e,t){this._kernelInstance.requestPreviewGeometry(e,t)}loadConfiguration(e){this._initData.id?this._memoryManager.loadingConfiguration(this._initData.id):this._memoryManager.loadingConfigurationString(),this._memoryManager.shouldHardReset()?this._kernelInstance.clearAll():this._kernelInstance.clearScene(),this._kernelInstance.loadConfiguration(9,e,{x:0,y:0,z:0})}changeCommonComponentParameter(e,t,n,r,a,i){"string"==typeof r?this._kernelInstance.setPlanComponentParameters(this._utilityToLongArray(e),t,r):console.warn("tried to set a parameter to a none string value!",r,t,n),this._finishParameterChange(n,a,i),this._updateCommonComponentDependencies(e)}changeComponentParameter(e,t,n,r,a,i){"string"==typeof r?this._kernelInstance.setComponentParameter(e,t,r):console.warn("tried to set a parameter to a none string value!",r,t,n),this._finishParameterChange(n,a,i),this._updateComponentDependencies(e)}changePlanObjectParameter(e,t,n,r,a,i){"string"==typeof r?this._kernelInstance.setPlanObjectParameter(e,t,r):console.warn("tried to set a parameter to a none string value!",r,t,n),this._finishParameterChange(n,a,i)}_finishParameterChange(e,t,n){-1===ASYNC_PARAMTER_CHANGES.indexOf(e)?setTimeout(()=>t(),0):this._configuratorKernelCallbackListener.forEach(e=>e.finishParameterChange(t,n))}requestDeleteComponents(e){e&&this._kernelInstance.deletePlanComponents(this._utilityToLongArray(e))}requestDeletePlanComponent(e){var t,n;e&&(null===(n=null===(t=this._initData)||void 0===t?void 0:t.featureFlags)||void 0===n?void 0:n.reDock)&&this._kernelInstance.deletePlanComponent(e)}loadComponentIntoKernel(e,t){this._kernelIo.setMeta({componentId:t}),this._kernelInstance.loadComponentDefinition(10,e)}async requestPartListAndUpdatePricesOfParts(e,t){let n=this._kernelInstance.getFullPartList();e||(e=this._kernelInstance.getHashOfConfiguration(this._configuratorContext.planObjectId));const r=await this.addUiDataAndPriceToPartList(n,e);this._configuratorUiCallbacks.onPartListUpdate(r,btoa(e))}requestSync(e,t){this.planObjectCreated(e,t),this._kernelInstance.syncPlanObjectToView(e,t)}getGlobalParameters(e,t){return new Promise(n=>{let r=this._kernelInstance.getPlanObjectParameters,a=e;t&&(r=this._kernelInstance.getComponentParameters,a=this._kernelInstance.getRootPlanComponentIdFromObjectId(e)),n(r.apply(this._kernelInstance,[a]))})}getPartList(){return new Promise(e=>{e(this._kernelInstance.getFullPartList())})}getConfigurationHash(e){return new Promise(t=>t(this._kernelInstance.getHashOfConfiguration(e.planObjectId)))}requestPlanObjectConstruction(e){this._kernelInstance.requestPlanObjectConstruction(e)}isReady(){super.isReady(),this._setupKernel(),Env.isProduction||(window.__RML__DEBUG__.Kernel=this._kernelInstance,window.__RML__DEBUG__.KernelContainer=this._kernelContainer,window.__RML__DEBUG__.Helper={convertCObject}),this._configuratorKernelAccessCallback.isReady(),this._configuratorUiCallbacks.onConfiguratorKernelIsReady(this._kernelContainer,this._kernelInstance),AppContext.planObjectId&&this.planObjectCreated(-1,AppContext.planObjectId)}_setupKernel(){1===this._kernelType&&(Benchmark.start("kernel_create_instance"),AppContext.kernelInstance?this._kernelInstance=AppContext.kernelInstance:this._kernelInstance=new this._kernelContainer.Kernel),this._initKernel()}onLoadComponentError(e,t){this._configuratorUiCallbacks.onComponentLoadError(e,t)}configurationLoaded(e,t,n,r,a,i){AsyncHelper.finishOperation(4,{conversationId:e,objectId:t,componentId:n,hash:r,errors:convertCObject(a)}),this._configuratorKernelCallbackListener.forEach(i=>i.configurationLoaded(e,t,n,r,a))}componentDefinitionLoaded(e,t){AsyncHelper.finishOperation(0,t)}componentDefinitionLoadingError(e,t){this._kernelIo.error(t),AsyncHelper.failOperation(0,new Error(t))}configurationLoadingError(e,t){let n="Configuration loading error";if(t){const e=convertCObject(t);Array.isArray(e)&&(n=e.join("\n"),e.forEach(e=>this._kernelIo.error(e)))}AsyncHelper.failOperation(4,new Error(n)),AsyncHelper.failOperation(2,new Error(n))}componentConfigurationUpdated(e,t){this._configuratorKernelCallbackListener.forEach(n=>n.componentConfigurationUpdated(e,t)),this._kernelInstance.requestDeltaPlanComponentConstruction(e)}setActiveGroupInView(e){this._kernelInstance.setActiveGroupInView(e)}setActiveGroupInViewForPlanObject(e,t){this._kernelInstance.setActiveGroupInViewForPlanObject(e,t||this._configuratorContext.planObjectId)}componentParameters(){}requestComponentDimensions(){}planObjectCreated(e,t){this._configuratorKernelCallbackListener.forEach(n=>n.planObjectCreated(e,t))}planObjectUpdated(e){const t=this._kernelInstance.getPlanObject(e);this._onBoundsUpdate(t),this._configuratorKernelCallbackListener.forEach(e=>e.planObjectUpdated(t))}planObjectConfigurationUpdated(e,t,n,r,a){this.updatePlanObjectDependencies(e);let i=this._kernelInstance.getComponent(this._kernelInstance.getRootPlanComponentIdFromObjectId(e));this._configuratorKernelCallbackListener.forEach(r=>r.planObjectConfigurationUpdated(e,t,n));const s=this._kernelInstance.getPlanObject(e);return this._onBoundsUpdate(s),this._configuratorHistory.push(t),this._updateConfigurationHasChildren(e,i),this.requestPartListAndUpdatePricesOfParts(n)}_onBoundsUpdate(e){if(!e.boxForMeasurement)return;const t={width:this._unitFormatter.formatMMValueToUnitString(e.boxForMeasurement.size.x),height:this._unitFormatter.formatMMValueToUnitString(e.boxForMeasurement.size.z),depth:this._unitFormatter.formatMMValueToUnitString(e.boxForMeasurement.size.y),kernelBounds:e.boxForMeasurement};this._configuratorUiCallbacks.onBoundsUpdate(t)}planObjectDeleted(){}requestPlanObjectDimensions(){}async requestExternalMesh(e,t){let n=()=>{};const r=new Promise((e,t)=>{n=e});let a;this.externalMeshQueue.push(r),this._configuratorUiCallbacks.onRequestExternalMesh(e,t);try{a=await this._rapiAccess.getMesh(e,"crt",t)}catch(t){return this._handleInvalidMesh(e),this._configuratorUiCallbacks.onError(new Error(`Mesh with id "${e}" can not be loaded. "${t}"`)),void console.error(t)}try{const r=await fetch(new Request(this._dataSyncer.requestAsset(a.url,!0))),i=await r.arrayBuffer();this._handleCortoMesh(i,e,t),n()}catch(t){return this._handleInvalidMesh(e),this._configuratorUiCallbacks.onError(new Error(`Mesh with id "${e}" breaks. "${t}"`)),void console.error(t)}}Editor3dComponentCreated(e,t,n,r){this._configuratorKernelCallbackListener.forEach(a=>a.Editor3dComponentCreated(e,t,n,r,!1)),r&&r>0&&this._configuratorKernelCallbackListener.forEach(a=>a.Editor3dComponentDocked(e,r,t,n))}Editor3dRootComponentCreated(e,t,n,r){this._configuratorKernelCallbackListener.forEach(a=>a.Editor3dComponentCreated(e,t,n,r,!0))}Editor3dPlanObjectConstructionDone(e){this._configuratorKernelCallbackListener.forEach(t=>t.Editor3dPlanObjectConstructionDone(e)),this.updatePlanObjectDependencies(e),this._updateConfigurationHasChildren(e),this._initData.moc||this._calcPrice()}Editor3dBeginGroup(){}Editor3dEndGroup(){}Editor3dSetMaterial(){}Editor3dLoadMaterial(){}Editor3dAddDockPreview(e,t){this._configuratorKernelCallbackListener.forEach(n=>n.Editor3dAddDockPreview(e,t))}Editor3dSetPreviewPointAssociations(e,t){this._configuratorKernelCallbackListener.forEach(n=>n.Editor3dSetPreviewPointAssociations(e,t))}Editor3dSetPreviewLineAssociations(e,t){this._configuratorKernelCallbackListener.forEach(n=>n.Editor3dSetPreviewLineAssociations(e,t))}Editor3dPreviewConstructionDone(e,t){this._configuratorKernelCallbackListener.forEach(n=>n.Editor3dPreviewConstructionDone(e,t))}Editor3dTranslateBy(){}Editor3dRotateBy(){}Editor3dRotateAround(){}Editor3dAddCube(){}Editor3dAddCubeUVMod(){}Editor3dAddSphere(){}Editor3dAddSphereUVMod(){}Editor3dAddRectangle(){}Editor3dAddRectangleUVMod(){}Editor3dAddMesh(){}Editor3dAddMeshUVMod(){}Editor3dAddMeshUVCoord(){}Editor3dAddCylinder(){}Editor3dAddCylinderUVMod(){}Editor3dAddPrism(){}Editor3dAddPrismUVMod(){}Editor3dAddFittingPoint(){}Editor3dAddFittingLine(){}Editor3dSelectObject(){}Editor3dCopy(){}Editor3dUpdatePlanObjectPosition(){}Editor3dUpdatePlanObjectRotation(){}Editor3dUpdatePlanObjectTransform(){}Editor3dUpdatePlanComponentPosition(){}Editor3dUpdatePlanComponentRotation(){}Editor3dUpdatePlanComponentTransform(){}getRuntimeComponentIdOfRootComponent(e){return this._kernelInstance?this._kernelInstance.getRootPlanComponentIdFromObjectId(e):(console.warn("this._kernelInstance not ready now"),0)}getRuntimeComponentId(e){return this._kernelInstance.getComponentId(e)}getParameterGroups(){if(!this._configuratorContext.planObjectId)return[];const e=this._kernelInstance.getRootPlanComponentIdFromObjectId(this._configuratorContext.planObjectId);return this._kernelInstance.getComponent(e).parameterGroups}resume(){this.muteKernelCallbacks||super.resume()}getSerializedConfiguration(e){return this._kernelInstance.getSerializedConfiguration(e)}createNewSerializedConfiguration(e){return this._kernelInstance.createNewSerializedConfiguration(e)}getCurrentConfigurationHash(e){return this._kernelInstance.getHashOfConfiguration(e)}listOfVariantsError(e,t){this._kernelIo.setMeta({rapiId:e}),this._kernelIo.error(t)}}__decorate([inject],ConfiguratorKernelAccess.prototype,"_memoryManager",void 0),__decorate([inject],ConfiguratorKernelAccess.prototype,"_configuratorKernelAccessCallback",void 0),__decorate([inject],ConfiguratorKernelAccess.prototype,"_initData",void 0),__decorate([inject],ConfiguratorKernelAccess.prototype,"_configuratorHistory",void 0);class NodePlanElementViewModel extends PlanElementViewModel{constructor(e){super(e);const t=this.getPlanElement().getMaxWallHeight();this._container.position.y=(t<0?2800:t)/1e3+.01,this._container.name="Node Plan Element",this.addMesh(this._nodeUiMesh)}update(){super.update(),this._container.position.y=this.getPlanElement().getMaxWallHeight()/1e3+.01}_initNodeMesh(){if(this._nodeUiMesh)return;const e=new SphereGeometry(.05,32),t=new MeshBasicMaterial({color:16777215});this._sphere=new Mesh(e,t);const n=new RingGeometry(.05,.07,32),r=new MeshBasicMaterial({color:0,side:DoubleSide});this._innerRingMesh=new Mesh(n,r),this._innerRingMesh.rotation.set(Math.PI/2,0,0);const a=new RingGeometry(.07,.08,32),i=new MeshBasicMaterial({color:16777215,side:DoubleSide});this._outerRingMesh=new Mesh(a,i),this._outerRingMesh.rotation.set(Math.PI/2,0,0),this._nodeUiMesh=new Mesh,this._nodeUiMesh.add(this._sphere),this._nodeUiMesh.add(this._innerRingMesh),this._nodeUiMesh.add(this._outerRingMesh)}setTopView(e){super.setTopView(e),e||(this._nodeUiMesh.visible=!1)}getSize(){return this._initNodeMesh(),(new Box3).setFromObject(this._nodeUiMesh).getSize(new Vector3)}show(){this._nodeUiMesh.visible=this._topView}hide(){this._nodeUiMesh.visible=!1}select(){this._innerRingMesh.material=new MeshBasicMaterial({color:10526880,side:DoubleSide}),super.select()}deselect(){this._innerRingMesh.material=new MeshBasicMaterial({color:0,side:DoubleSide}),super.deselect()}hoverOn(){this._sphere.geometry=new SphereGeometry(.07,32),this._innerRingMesh.geometry=new RingGeometry(.07,.07+.02,32),this._outerRingMesh.geometry=new RingGeometry(.07+.02,.1,32),super.hoverOn()}hoverOff(){this._sphere.geometry=new SphereGeometry(.05,32),this._innerRingMesh.geometry=new RingGeometry(.05,.07,32),this._outerRingMesh.geometry=new RingGeometry(.07,.08,32),super.hoverOff()}_generateBoundingBox(){const e=super._generateBoundingBox();return e.layers.set(9),e}addMesh(e){super.addMesh(e)}}class ConstructionPlanObjectViewModel extends StaticPlanObjectViewModel{constructor(e){super(e),this._container.name="Construction "+this._container.name}setTopView(e){super.setTopView(e),e?this._enableTopView():this._disableTopView(),this._updateBoundingBox()}_enableTopView(){if(!this._topViewContainer){this._topViewContainer=new Group;const e=this.getPlanElement(),{x:t,z:n}=convertToThreeDimensions(e.size),r=new BoxGeometry(t,.01,n);if(this._topGreyMesh=new Mesh(r,MaterialCreator.createMeshStandardMaterial({transparent:!0,opacity:1,color:11645361})),this._topViewContainer.add(this._topGreyMesh),"window"===e.getObjectType()){const e=new BoxGeometry(t,.02,.05);this._topBlackMesh=new Mesh(e,MaterialCreator.createMeshStandardMaterial({transparent:!0,opacity:1,color:0})),this._topViewContainer.add(this._topBlackMesh)}this._topViewContainer.position.y=5,this._container.add(this._topViewContainer)}this._topViewContainer.visible=!0}_disableTopView(){this._topViewContainer&&(this._topViewContainer.visible=!1)}getPlanElement(){return super.getPlanElement()}_generateBoundingBox(){const e=super._generateBoundingBox(),t=this.getSize();return e.geometry=new BoxGeometry(t.x,this._topView?5:t.y,t.z),e}_updateBoundingBox(){super._updateBoundingBox();const e=this.getSize();this._boundingBox.geometry=new BoxGeometry(e.x,this._topView?5:e.y,e.z)}getTopViewContainer(){return this._topViewContainer}update(){if(super.update(),!this._topGreyMesh)return;const{x:e,z:t}=convertToThreeDimensions(this.getPlanElement().size);this._topGreyMesh.geometry=new BoxGeometry(e,.01,t),this._topBlackMesh&&(this._topBlackMesh.geometry=new BoxGeometry(e,.02,.05))}}class PlannerKernelAccess extends ConfiguratorKernelAccess{get kernelContainer(){return this._kernelContainer}constructor(e){super(e),this._plannerKernelCallbackListener=new Set}_loadSuccess(){super._loadSuccess(),window.RoomleCore&&window.RoomleCore(this._kernelContainer)}_loadError(){super._loadError(),console.error("kernel load error")}_createPlanInteractionHandler(){this._planInteractionHandler=new this._kernelContainer.PlanInteractionHandler,this._planInteractionHandler.init(this._planInteractionHandler,1,50,!!this._initData.snappingEnabled,!0,this._kernelContainer.DrawingType.CLICK_PER_CLICK),this._roomlePlannerUiCallback.onPlanInteractionHandlerCreated(this._planInteractionHandler)}addPlannerListener(e){this._plannerKernelCallbackListener.add(e)}removePlannerListener(e){this._plannerKernelCallbackListener.delete(e)}isReady(){super.isReady(),this.registerCallbacks(),this._roomlePlannerUiCallback.onPlannerKernelIsReady(this._kernelContainer),this._roomlePlannerUiCallback.onConfiguratorKernelIsReady(this._kernelContainer,this._kernelInstance),Env.isProduction||(window.__RML__DEBUG__.ConfiguratorKernel=this._kernelInstance,window.__RML__DEBUG__.PlannerKernelContainer=this._kernelContainer),this._kernelAccessCallback.isReady()}_setupKernel(){0===this._kernelType&&(this._createPlanInteractionHandler(),AppContext.kernelInstance?this._kernelInstance=AppContext.kernelInstance:this._kernelInstance=this._planInteractionHandler.getConfiguratorKernel()),super._setupKernel()}get callbacks(){return this._roomlePlannerUiCallback}get planInteractionHandler(){return this._planInteractionHandler}get planModelViewHelper(){return this._kernelContainer.PlanModelViewHelper}catalogItemLoaded(e){const t=this._rapiItemToKernelItem(e);this._kernelContainer.catalogItemLoaded(t)}async insertItems(e){this.planInteractionHandler.startInteraction();let t=new this._kernelContainer.CatalogItemPtrList;e.forEach(e=>{let n=e.count||1;for(let r=0;r<n;r++)e.count||(e.count=0),t.push_back(this._rapiItemToKernelItem(e))});const n=this.planInteractionHandler.getPlan().extRef.jsObject,r=n.getPlanObjectViewModelsFromRapiId().reduce((e,t)=>(e[t.getId()]=!0,e),{});this.planInteractionHandler.addPlanObjects(t,!0),await Promise.allSettled([Promise.allSettled(n.getStaticPlanObjectViewModels().map(async e=>{if(e.needsRapiItem()){const t=await this._rapiAccess.getItem(e.getPlanObject().getCatalogItemId());e.setRapiItem(t)}})),Promise.allSettled(n.getConfigurablePlanObjectViewModels().map(e=>e.isInitDone()))]);const a=n.getPlanObjectViewModelsFromRapiId().map(e=>e.getId()).filter(e=>!r[e]);return this.planInteractionHandler.endInteraction(),a}duplicateItems(e){const t=new this.kernelContainer.PlanObjectPtrList;return e.forEach(e=>{t.push_back(e)}),this.planInteractionHandler.duplicatePlanObjects(t,1,!0)}_rapiItemToKernelItem(e){let t=new this._kernelContainer.CatalogItem(e.id),n=t.size;return n.x=e.width||0,n.y=e.depth||0,n.z=e.height||0,t.size=n,t.flipable=e.flipable,e.layer&&(t.layer=e.layer),t.orderable=e.orderable,t.scaleable=e.scaleable,t.type=e.type||"other",t.detailType=e.detailType||t.type||"other",t.configuration=e.configuration||"",t}planObjectDeleted(){}requestPlanObjectDimensions(){}cleanUpCallbacks(){var e;super.cleanUpCallbacks(),(null===(e=this._kernelContainer)||void 0===e?void 0:e.unregisterPlannerCallback)&&this._kernelContainer.unregisterPlannerCallback(this)}registerCallbacks(){var e;super.registerCallbacks(),(null===(e=this._kernelContainer)||void 0===e?void 0:e.registerPlannerCallback)&&this._kernelContainer.registerPlannerCallback(this)}planElementRemoved(e){this._plannerKernelCallbackListener.forEach(t=>t.planElementRemoved(e)),this._plannerKernelCallbackListener.forEach(t=>t.removePlanObjectFromScene(e.extRef.jsObject)),this._decoupleReferences(e)}handlerSwitchedPlans(e,t){this._decoupleReferences(e),t&&this._plannerKernelCallbackListener.forEach(n=>n.handlerSwitchedPlans(e,t))}planBoundsChanged(){this._plannerKernelCallbackListener.forEach(e=>e.planBoundsChanged())}planCleared(){this._plannerKernelCallbackListener.forEach(e=>e.planCleared())}planCompletelyLoaded(e){this._plannerKernelCallbackListener.forEach(t=>t.planCompletelyLoaded(e))}planElement3dMeshChanged(e,t){if(t.extRef){const e=t.extRef.jsObject;for(let t=e.getObject().children.length-1;t>=0;t--)e.getObject().remove(e.getObject().children[t])}this.planModelViewHelper.requestMesh3d(t)}async _onStaticItemAdded(e,t){let n;n=this.isConstructionPlanElement(t)?new ConstructionPlanObjectViewModel(t):new StaticPlanObjectViewModel(t),this.coupleReferences(n,t),e.extRef.jsObject.addPlanElementViewModel(n);const r=t.getCatalogItemId();if(r){const e=await this._rapiAccess.getItem(r);n.setRapiItem(e),this._plannerKernelCallbackListener.forEach(e=>e.addPlanObjectToScene(n))}}_onConfigurableItemAdded(e,t){const n=new ConfiguratorPlanObjectViewModel(t);this.coupleReferences(n,t),e.extRef.jsObject.addPlanElementViewModel(n),this._plannerKernelCallbackListener.forEach(e=>e.addPlanObjectToScene(n))}async planElementAdded(e,t){if(e&&e.extRef)if(t.getType()===this._kernelContainer.PlanElementType.OBJECT)t.hasConfiguration()?this._onConfigurableItemAdded(e,t):await this._onStaticItemAdded(e,t);else{const n=t;let r;if(t.getType()===this._kernelContainer.PlanElementType.WALL?r=new WallPlanElementViewModel(n):t.getType()===this._kernelContainer.PlanElementType.FLOOR?r=new FloorPlanElementViewModel(n):t.getType()===this._kernelContainer.PlanElementType.CEILING?r=new CeilingPlanElementViewModel(n):t.getType()===this._kernelContainer.PlanElementType.NODE&&(r=new NodePlanElementViewModel(n)),!r)return;this.coupleReferences(r,n),e.extRef.jsObject.addPlanElementViewModel(r),this.planModelViewHelper.requestMesh3d(t),this._plannerKernelCallbackListener.forEach(e=>e.addPlanObjectToScene(null))}}planElementChanged(e,t){if(t.extRef){let n=t.extRef.jsObject;n.update(),this._plannerKernelCallbackListener.forEach(t=>t.planElementChanged(e,n))}}planHistoryStateChanged(){this.planInteractionHandler&&(this._plannerKernelCallbackListener.forEach(e=>e.planHistoryStateChanged()),this._roomlePlannerUiCallback.onHistoryChange(this.planInteractionHandler.isUndoPossible(),this.planInteractionHandler.isRedoPossible()))}planObjectConfigurationCreated(e,t){}planObjectConfigurationLoaded(e,t,n){e&&e.extRef&&t&&t.extRef&&t.extRef.jsObject.getPlanObject().getConfigurationRuntimeId()>0&&this._plannerKernelCallbackListener.forEach(r=>r.planObjectConfigurationLoaded(e,t,n))}requestCatalogItem(e){}startedDrawing(){this._plannerKernelCallbackListener.forEach(e=>e.startedDrawing())}stoppedDrawing(){this._plannerKernelCallbackListener.forEach(e=>e.stoppedDrawing())}updateMesh2d(){}beginConstruction(){}addMesh(e,t,n,r,a,i){this._plannerKernelCallbackListener.forEach(s=>s.addMesh(e,t,n,r,a,i))}endConstruction(){}beginPlanConstruction(e){this._plannerKernelCallbackListener.forEach(t=>t.beginPlanConstruction(e))}addPlanMesh(e,t,n,r,a,i,s){this._plannerKernelCallbackListener.forEach(o=>o.addPlanMesh(e,t,n,r,a,i,s))}endPlanConstruction(e){this._plannerKernelCallbackListener.forEach(t=>t.endPlanConstruction(e))}async addPlanObjectFromItem(e,t,n){if(!t&&!n){const t=await this.insertItems([e]);if(1!==t.length)throw new Error("It was expected that 1 element is added but"+t.length+"were added");return t[0]}n=n||0===n?n:0,t=t||{x:0,y:0,z:0};const r=this._planInteractionHandler.addPlanObjectFromItem(this._rapiItemToKernelItem(e),t,n,!1),a=this._planInteractionHandler.getPlan().extRef.jsObject;let i;return r.hasConfiguration()?(i=a.getConfigurablePlanObjectForId(r.getId()),i||console.warn("Could not find configuration")):(i=a.getStaticPlanObjectViewModelForId(r.getId()),i?await i.setRapiItem(e):console.warn("Could not find static item")),await i.isInitDone(),i.getId()}coupleReferences(e,t){let n=new this._kernelContainer.EMSReference;n.jsObject=e,t.extRef=n}_decoupleReferences(e){e&&e.extRef&&(e.extRef.jsObject.clearReference(),e.extRef.jsObject=null,e.extRef.delete(),e.extRef=null)}isConstructionPlanElement(e){return e instanceof this.kernelContainer.ConstructionObject}}__decorate([inject],PlannerKernelAccess.prototype,"_kernelAccessCallback",void 0),__decorate([inject],PlannerKernelAccess.prototype,"_roomlePlannerUiCallback",void 0);class PlannerMeshGenerator extends MeshGenerator{constructor(e){super(e),this._wallMeshes=[],this._defaultMaterial=MaterialCreator.createMeshPhysicalMaterial({color:"#ffffff",side:DoubleSide})}generateGeometry(e=null,t,n,r,a,i=!1){let s;return s=i?this._generateGeometry(e,t,n,r,a).clone():this._generateGeometry(e,t,n,r,a),s}generateMesh(e=0,t=null,n,r,a,i,s,o,l=!1,d){let h;h=l?this._generateGeometry(t,r,a,i,s).clone():this._generateGeometry(t,r,a,i,s);const c=this._createMesh(e,t,h);return c.userData.materialId=n,c.layers.set(4),n&&this.setMaterial(c,n,o,d).then(()=>{e&&t&&n&&this._geometryComponentMaterialCache.set(this._getComponentMeshId(e,t),n);const r=o&&3===o.value,a=o&&1===o.value;c.castShadow=!r&&!a,c.userData.isFloor=r}),this._checkWallMaterial(c,o),c}async setMaterial(e,t,n,r){if(e.userData.materialId=getMaterialId(t,n),isString(t))t?await this._assignMaterial(e,t,r):(console.warn("Used default material because material is empty"),this.changeMaterialOfMesh(e,this._getDefaultMaterial(n)));else{if(!t)return void this.changeMaterialOfMesh(e,this._configuratorPreviewMaterial);2===(t=t).getSourceType().value?await this._assignMaterial(e,t.materialId,r):1===t.getSourceType().value?await this._assignItem(e,t.catalogItemId):3===t.getSourceType().value?await this._assignRGB(e,t.rgbValue):0===t.getSourceType().value?this.changeMaterialOfMesh(e,this._getDefaultMaterial(n)):(this.changeMaterialOfMesh(e,this._getDefaultMaterial(n)),1!==n.value&&7!==n.value&&3!==n.value&&console.warn("Used default material because material is not supported",t))}}_getDefaultMaterial(e){return 3===(null==e?void 0:e.value)?this._defaultMaterialFloor:this._defaultMaterial}set maxAnisotropy(e){this._maxAnisotropy=e}_checkWallMaterial(e,t){t&&1===t.value&&(e.renderOrder=5,this._wallMeshes.push(e))}clear(){super.clear(),this.clearWallMeshes()}clearWallMeshes(){this._wallMeshes.forEach(e=>{disposeMesh(e)}),this._wallMeshes=[]}get wallMeshes(){return this._wallMeshes}}let KERNEL_UNIT={InchFeet:null,Feet:null,MM:null,CM:null,Inch:null},KERNEL_UNIT_STRING_TYPE={NoUnitString:null,LongUnitString:null,ShortUnitString:null};const METRIC_UNIT_TYPES=["mm","cm","feet"],IMPERIAL_UNIT_TYPES=["inch","inchfeet"];class UnitFormatter{constructor(e){this._formatter=null,this._precision=0,this._creator_=e}init(e){const t=new e.UnitMeasureFormatter;KERNEL_UNIT=e.Unit,KERNEL_UNIT_STRING_TYPE=e.UnitStringType,this._initActualUnit(),this._initMeasurementSystemType(),this._initActualUnitStringType();const{precisionCm:n,precisionInch:r}=this._initData;this._actualUnit===KERNEL_UNIT.InchFeet?this._precision=void 0!==r?parseInt(r,10):2:this._actualUnit===KERNEL_UNIT.CM&&(this._precision=void 0!==n?parseInt(n,10):1),t.init("mm","cm","'","ft",'"',"inch","m²","sqft",!0,this._precision,!0),this._formatter=t}_initMeasurementSystemType(){let{measurementSystem:e,unit:t}=this._initData;if(this._actualMeasurementString=e,e||!t){if("metric"===e){t||(t="cm");const e=METRIC_UNIT_TYPES.find(e=>e===t);e?(this._actualUnit=this._getKernelUnitEnum(t),this._actualUnitString=e):(console.warn("Unit is not a metric unit, using CM"),this._actualUnit=KERNEL_UNIT.CM,this._actualUnitString="cm")}if("imperial"===e){t||(t="inch");const e=IMPERIAL_UNIT_TYPES.find(e=>e===t);e?(this._actualUnit=this._getKernelUnitEnum(t),this._actualUnitString=e):(console.warn("Unit is not an imperial unit, using Inches"),this._actualUnit=KERNEL_UNIT.Inch,this._actualUnitString="inch")}}else{this._actualUnitString=t;const e=METRIC_UNIT_TYPES.find(e=>e===t);this._actualMeasurementString=e?"metric":"imperial"}}_initActualUnit(){const{unit:e}=this._initData;this._actualUnit=this._getKernelUnitEnum(e)}_getKernelUnitEnum(e){switch(e){case"cm":return KERNEL_UNIT.CM;case"mm":return KERNEL_UNIT.MM;case"inchfeet":return KERNEL_UNIT.InchFeet;case"feet":return KERNEL_UNIT.Feet;case"inch":return KERNEL_UNIT.Inch;default:return KERNEL_UNIT.CM}}_initActualUnitStringType(){const{unitStringType:e}=this._initData;e&&"short"!==e&&console.warn("Only short unit strings is supported at the moment"),this._actualUnitStringType=KERNEL_UNIT_STRING_TYPE.ShortUnitString}_isFormatterReady(){return!!this._formatter||(console.warn("Formatter is not ready..."),!1)}formatAngleValueToUnitString(e,t){const n="Integer"===t.type?0:2;return e.toFixed(n)+"°"}parseAngleValueFromUnitString(e){return e.replace("°","").replace(/\s/g,"")}parseValue(e,t){return null===t.unitType||"unknown"===t.unitType||"count"===t.unitType?e:"length"===t.unitType?this.parseMMValueFromUnitString(e,t.unitType):"angle"===t.unitType||"area"===t.unitType?this.parseAngleValueFromUnitString(e):e}formatValueToUnitString(e,t){return null===t.unitType||"unknown"===t.unitType||"count"===t.unitType?"Integer"===t.type?e.toString():parseFloat(e.toString()).toFixed(2):"length"===t.unitType?this.formatMMValueToUnitString(e,t.unitType):"angle"===t.unitType?this.formatAngleValueToUnitString(e,t):"area"===t.unitType?this.formatSquareMMValueToUnitString(e):e}isParseableNumber(e){return this._isFormatterReady()?this._formatter.isParseableNumber(e):null}isParseableUnitString(e,t){return this._isFormatterReady()?"angle"===t.unitType?this._formatter.isParseableUnitString(this.parseAngleValueFromUnitString(e),this._actualUnit):this._formatter.isParseableUnitString(e,this._actualUnit):null}parseMMValueFromUnitString(e,t){return this._isFormatterReady()?"count"===t?parseFloat(e):this._formatter.parseMMValueFromUnitString(e,this._actualUnit):null}parseNumber(e){return this._isFormatterReady()?this._formatter.parseNumber(e):null}formatNumber(e,t=0){return this._isFormatterReady()?this._formatter.formatNumber(e,t):null}formatSquareMMValueToUnitString(e){return this._isFormatterReady()?this._formatter.formatSquareMMValueToUnitString(e,this._actualUnit):null}formatMMValueToUnitString(e,t){return this._isFormatterReady()?"count"===t?e.toString():this._formatter.formatMMValueToUnitString(e,this._actualUnit,this._actualUnitStringType):null}formatMMValueWithReqMaxLength(e,t){return this._isFormatterReady()?this._formatter.formatMMValueWithReqMaxLength(e,this._actualUnit,t):null}_formatParameterValue(e,t){return"length"===t?this.formatMMValueToUnitString(parseFloat(e)):"area"===t?this.formatSquareMMValueToUnitString(parseFloat(e)):e}formatPartListParameter(e){(function(e){return"length"===e.unitType||"area"===e.unitType})(e)&&(e.valueLabel=this._formatParameterValue(e.value,e.unitType))}formatParameter(e){if(e.valueLabel=this._formatParameterValue(e.value,e.unitType),isMaterial(e))e.uiType="Material";else if(function(e){return"Boolean"===e.type}(e))e.uiType="Boolean";else if(isRange(e)){e.uiType="Range";const t=null!==e.validRange.valueFrom?e.validRange.valueFrom:Number.MIN_SAFE_INTEGER,n=null!==e.validRange.valueTo?e.validRange.valueTo:Number.MAX_SAFE_INTEGER;e.validRangeLabels={valueFrom:this._formatParameterValue(t.toString(),e.unitType),valueTo:this._formatParameterValue(n.toString(),e.unitType),type:e.validRange.type}}else isOptions(e)?(e.uiType="Options",function(e){return!!isOptions(e)&&Array.isArray(e.validValues)&&e.validValues.length>0&&"string"==typeof e.validValues[0].thumbnail}(e)&&(e.uiType="Thumbnails")):(console.error("Could not detect uiType of param"),e.uiType=null)}isInch(){return this._actualUnit===KERNEL_UNIT.InchFeet}getActualUnitString(){return this._actualUnitString}getActualMeasurementString(){return this._actualMeasurementString}getUnitStringType(){return this._initData.unitStringType}getPrecision(){return this._precision}getAllowedDelta(){const e=1/Math.pow(10,this._precision);return this.isInch()?25.4*e:e}setUnitInitData(e,t=""){this._initData.unit=e,this._initData.measurementSystem=t,this._initActualUnit(),this._initMeasurementSystemType(),this._initActualUnitStringType(),this._plannerKernelAccess.kernelInstance.setEnvironmentVariable("unit",this._actualUnitString)}}__decorate([inject],UnitFormatter.prototype,"_initData",void 0),__decorate([inject],UnitFormatter.prototype,"_plannerKernelAccess",void 0);class ConfiguratorHistory{constructor(e){this._history=[],this._index=0,this._creator_=e}undo(){if(!this.canUndo())return null;this._index++;const[e]=this._history.slice(this._index);return this._index===this._history.length-1?this._configuratorUiCallbacks.onHistoryChange(!1,!0):this._configuratorUiCallbacks.onHistoryChange(!0,!0),e}redo(){if(!this.canRedo())return null;this._index--;const[e]=this._history.slice(this._index);return 0===this._index?this._configuratorUiCallbacks.onHistoryChange(!0,!1):this._configuratorUiCallbacks.onHistoryChange(!0,!0),e}push(e){const[t]=this._history.slice(this._index);t!==e&&(this._history=this._history.slice(this._index),this._history.unshift(e),this._index=0,1===this._history.length?this._configuratorUiCallbacks.onHistoryChange(!1,!1):this._configuratorUiCallbacks.onHistoryChange(!0,!1))}canUndo(){return this._index!==this._history.length-1}canRedo(){return 0!==this._index}getHistory(){return this._history}clearHistory(){this._history=[],this._index=0}}__decorate([inject],ConfiguratorHistory.prototype,"_configuratorUiCallbacks",void 0);const PLAN_ELEMENT_CHANGE_TYPES={ADDED:"added",CHANGED:"changed",REMOVED:"removed"};class RoomleToolsCore{constructor(e){this._kernelCallbacks={isReady:()=>{},throw:e=>console.error("Kernel exception",e),log:e=>{},error:(e,t,n,r)=>{},message:e=>{this._analyzeComponentCallback&&this._analyzeComponentCallback(e)}},this._creator_=e}async init(){if(this._toolsCoreInstance)return Promise.resolve();const e=this,t={locateFile:e=>"RoomleToolsCore.wasm"===e?getAssetPath()+"static/RoomleToolsCore-ee930f1b940807bb.wasm":e,wasmBinaryFile:getAssetPath()+"static/RoomleToolsCore-ee930f1b940807bb.wasm",preRun:[],postRun:[],setStatus:null,print(t){e._kernelIo.log(t)},printErr(t){e._kernelIo.error(t)},quit(t){0!==t&&e._kernelIo.throw(t&&t.toString?t.toString():"Unknown error while C/C++ main executes")}};await this._scriptLoader.fetch("static/RoomleToolsCore-68f11fca64f9af7b.js",{id:"core-tool"});const n=await window.RoomleToolsCore(t);n.setContext(this._kernelCallbacks),this._toolsCoreInstance=new n.ToolsCore}analyzeComponent(e,t){const n=[];return this._analyzeComponentCallback=e=>{n.push(e)},this._toolsCoreInstance.analyzeComponent(e,t),this._analyzeComponentCallback=null,Promise.resolve(n)}}__decorate([inject],RoomleToolsCore.prototype,"_scriptLoader",void 0),__decorate([inject],RoomleToolsCore.prototype,"_kernelIo",void 0);
|
|
1
|
+
import{g as getAssetPath,A as AmbientLight,D as DirectionalLight,V as Vector2,a as Vector3,R as RectAreaLight,S as SpotLight,C as Color$1,M as MainThreadToWorker,B as BufferGeometry,b as BufferAttribute,T as TrianglesDrawMode,c as TriangleFanDrawMode,d as TriangleStripDrawMode,L as Loader,e as LoaderUtils,F as FileLoader,P as PointLight,f as MeshBasicMaterial,h as SRGBColorSpace,i as MeshPhysicalMaterial,j as Matrix4,Q as Quaternion,I as InstancedMesh,O as Object3D,k as TextureLoader,l as ImageBitmapLoader,m as InterleavedBuffer,n as LinearFilter,o as LinearMipmapLinearFilter,p as RepeatWrapping,q as PointsMaterial,r as Material,s as LineBasicMaterial,t as MeshStandardMaterial,u as DoubleSide,v as PropertyBinding,w as SkinnedMesh,x as Mesh,y as LineSegments,z as Line,E as LineLoop,G as Points,H as Group,J as PerspectiveCamera,K as MathUtils,N as OrthographicCamera,U as Skeleton,W as AnimationClip,X as Bone,Y as InterpolateLinear,Z as NearestFilter,_ as NearestMipmapNearestFilter,$ as LinearMipmapNearestFilter,a0 as NearestMipmapLinearFilter,a1 as ClampToEdgeWrapping,a2 as MirroredRepeatWrapping,a3 as InterpolateDiscrete,a4 as FrontSide,a5 as InterleavedBufferAttribute,a6 as Texture,a7 as VectorKeyframeTrack,a8 as NumberKeyframeTrack,a9 as QuaternionKeyframeTrack,aa as Box3,ab as Sphere,ac as Interpolant,ad as LinearSRGBColorSpace,ae as Euler,af as CubeTexture,ag as RGBAFormat,ah as DataTexture,ai as getValue,aj as ROOMLE_COLORS,ak as ROOMLE_HIGHLIGHTNG,al as deepMerge,am as setWriteable,an as setDescriptor,ao as Uint32BufferAttribute,ap as Float32BufferAttribute,aq as createBenchmarkMaterial,ar as createBenchmarkTexture,as as ShapePath,at as removeItem,au as BoxGeometry,av as getGlbUrl,aw as transformRange,ax as wait,ay as objectArrayToMap,az as roundWithPrecision,aA as uuid,aB as handleJsonResponse,aC as setCursor,aD as EdgesGeometry,aE as LineDashedMaterial,aF as ArrowHelper,aG as CylinderGeometry,aH as Line3,aI as SphereGeometry,aJ as RingGeometry,aK as isString,aL as DataTextureLoader,aM as HalfFloatType,aN as FloatType,aO as RedFormat,aP as NoColorSpace,aQ as DataUtils,aR as EquirectangularReflectionMapping,aS as Vector4,aT as Matrix3,aU as ShaderMaterial,aV as DstColorFactor,aW as ZeroFactor,aX as AddEquation,aY as DstAlphaFactor,aZ as UniformsUtils,a_ as NoBlending,a$ as Scene,b0 as MeshNormalMaterial,b1 as WebGLRenderTarget,b2 as DepthTexture,b3 as DepthStencilFormat,b4 as UnsignedInt248Type,b5 as PlaneGeometry,b6 as CameraHelper,b7 as MeshDepthMaterial,b8 as RGBADepthPacking,b9 as AdditiveBlending,ba as BackSide,bb as PCFShadowMap,bc as BasicShadowMap,bd as PCFSoftShadowMap,be as VSMShadowMap,bf as ShadowMaterial,bg as MeshPhongMaterial,bh as MeshLambertMaterial,bi as BasicDepthPacking,bj as Camera,bk as CustomBlending,bl as MinEquation,bm as OneFactor,bn as RGFormat,bo as NoToneMapping,bp as LinearToneMapping,bq as ReinhardToneMapping,br as CineonToneMapping,bs as ACESFilmicToneMapping,bt as Layers,bu as WebGLRenderer}from"./main-thread-to-worker-d5d5841d.js";class Container{constructor(){this._context=new Map,this._lookups=new Map,this._singletons=new Map}getContext(e){if(this._context.has(e)){const t=this._context.get(e);return this._context.set(e,t+1),e+t}return this._context.set(e,1),e+0}addDependencyInjectionAssignments(e){e.forEach(e=>{this._lookups.set(e.className,e)})}lookup(e,t){if(!this._lookups.has(e))return null;const n=this._lookups.get(e);if(1===n.type&&void 0===t){const t="Dependency "+e+" has definition context but no context was defined!";return console.trace(t),console.error(t),null}let r=t&&1===n.type?t:"global";if(r+="_"+e,2===n.type)return new n.classDefinition;if(this._singletons.has(r))return this._singletons.get(r);const a=new n.classDefinition(t);return this._singletons.set(r,a),a}cleanUp(e){if(e){let t=[];this._singletons.forEach((n,r)=>{r.startsWith(e)&&t.push(r)}),t.forEach(e=>{this._singletons.delete(e)})}else this._singletons.clear(),this._singletons=new Map}}class DependencyInjectionAssignment{constructor(e,t,n){this.className=e,this.classDefinition=t,this.type=void 0===n?0:n}}const IMAGE_FORMATS={JPG:".jpg",JPEG:".jpeg",PNG:".png",GIF:".gif"};class FormDataUtil{_base64toBlob(e,t){t=t||"";const n=atob(e),r=n.length,a=Math.ceil(r/1024),i=new Array(a);for(let e=0;e<a;++e){let t=1024*e,a=Math.min(t+1024,r);const s=new Array(a-t);for(let e=t,r=0;e<a;++r,++e)s[r]=n[e].charCodeAt(0);i[e]=new Uint8Array(s)}return new Blob(i,{type:t})}_createFormData(e,t,n,r){const a=new FormData;-1!==e.indexOf(",")&&(e=e.substr(e.indexOf(",")+1));const i=-1===Object.keys(IMAGE_FORMATS).map(e=>IMAGE_FORMATS[e]).indexOf(n)?"application":"image",s=this._base64toBlob(e,i+"/"+n.substr(1));return a.append(r,s,t+n),a}create(e,t,n,r){return this._createFormData(e,t,n,r)}}const PREDEFINED_LIGHTSETTING={SOFA:"sofa",SHELF:"shelf",SHELF_FRONT:"shelf_front",BAKED:"baked",CAMERA:"camera",EQUAL:"equal"};class DynamicLightSettingLoader{static createDynamicLightSettingSource(e,t){let n={};if(e)n.url=e;else if(t)switch(t){case PREDEFINED_LIGHTSETTING.SHELF:n.url=getAssetPath()+"static/shelf-2975dd3f2fa9c763.json";break;case PREDEFINED_LIGHTSETTING.SHELF_FRONT:n.url=getAssetPath()+"static/shelf_front-8c9566a4512f0de8.json";break;case PREDEFINED_LIGHTSETTING.SOFA:n.url=getAssetPath()+"static/sofa-997b116bc5f2e92e.json";break;case PREDEFINED_LIGHTSETTING.BAKED:n.url=getAssetPath()+"static/baked-6485a2b1daeb69e8.json";break;case PREDEFINED_LIGHTSETTING.CAMERA:n.url=getAssetPath()+"static/camera-05824b47cdb951e4.json";break;case PREDEFINED_LIGHTSETTING.EQUAL:n.url=getAssetPath()+"static/equal-319f6b83c827913f.json";break;default:n.url=getAssetPath()+"static/camera-05824b47cdb951e4.json"}else n=null;return n}parse(e){let t=JSON.parse(e);return t.lights?this.load(t):[]}load(e){let t=[];return e.lights?(e.lights.forEach(e=>{let n;switch(e.type){case"ambient":n=this._parseAmbientLight(e);break;case"rectarea":n=this._parseRectAreaLight(e);break;case"spot":n=this._parseSpotLight(e);break;case"directional":n=this._parseDirectionalLight(e)}n&&t.push(n)}),t):[]}_parseAmbientLight(e){let t=new AmbientLight;return this._parseCommon(t,e),t}_parseRectAreaLight(e){let{intensity:t,castShadow:n,target:r,width:a,height:i}=e,s=null;if(n&&DynamicLightSettingLoader.rectAreaLightReplacement){const n=new DirectionalLight;this._parseCommon(n,e),s=n,n.castShadow=!0,n.shadow.camera.near=.1,n.shadow.camera.far=100,n.shadow.mapSize=new Vector2(1024,1024),n.shadow.bias=-5e-5,n.shadow.normalBias=.01,n.intensity=t?t/100:1,n.lookAt(r?new Vector3(r.x,r.y,r.z):new Vector3(0,0,0))}else{const n=new RectAreaLight;this._parseCommon(n,e),s=n,n.width=a||.8,n.height=i||.8,n.castShadow=!1,n.matrixAutoUpdate=!0,n.intensity=(t||240)/((a||.8)*(i||.8)),n.lookAt(r?new Vector3(r.x,r.y,r.z):new Vector3(0,0,0)),DynamicLightSettingLoader.rectAreaLightLoadingListener&&DynamicLightSettingLoader.rectAreaLightLoadingListener(n)}return s}_parseSpotLight(e){let t=new SpotLight;this._parseCommon(t,e);let{angle:n,penumbra:r,target:a,castShadow:i}=e;return t.angle=(n||100)*Math.PI/180,t.penumbra=r||.5,t.lookAt(a?new Vector3(a.x,a.y,a.z):new Vector3(0,0,0)),t.shadow.camera.near=.1,t.shadow.camera.far=10,t.shadow.mapSize=new Vector2(1024,1024),t.castShadow=i||!1,t}_parseDirectionalLight(e){let t=new DirectionalLight;this._parseCommon(t,e);let{target:n,castShadow:r}=e;return t.castShadow=r||!1,t.shadow.camera.near=.1,t.shadow.camera.far=100,t.shadow.mapSize=new Vector2(1024,1024),t.shadow.bias=-5e-5,t.lookAt(n?new Vector3(n.x,n.y,n.z):new Vector3(0,0,0)),t}_parseCommon(e,t){let{name:n,intensity:r,color:a,position:i,movesWithCamera:s}=t;e.name=n||"",e.intensity=r||1,e.color=new Color$1(a||"#ffffff"),e.position.copy(i?new Vector3(i.x,i.y,i.z):new Vector3(0,0,0)),e.visible=!0,e.layers.set(1),e.userData.movesWithCamera=s}}DynamicLightSettingLoader.rectAreaLightReplacement=!0;const NAMES_FOR_LOCALHOST=["127.0.0.1","localhost","0.0.0.0"],isIdItemId=function(e){return!(!e||"string"!=typeof e||e.split(":").length>2)},getCatalogIdFromItemOrConfigurationId=e=>{if(!e||"string"!=typeof e)return null;const t=e.split(":");return t.length<2?null:t[0]},kernelPartToPriceId=({articleNr:e,componentId:t})=>e&&""!==e?t.split(":")[0]+":"+e:null,wasRequestSuccess=(e,t)=>null!=e?"string"==typeof e?"true"===e:!0===e:("string"==typeof t&&(t=parseInt(t,10)),t>=200&&t<300);class NetworkLayer{constructor(){this._queue=[],this._pendingRequests=0}_nextSlot(){if(this._pendingRequests-=1,!this._queue.length)return;const{request:e,resolve:t,reject:n}=this._queue.shift();this._fetch(e).then(t,n)}_fetch(e,t={},n={}){return this._pendingRequests+=1,new Promise((r,a)=>{self.fetch(e,t).then(async function(e){this._nextSlot();const t=!n.checkResponse||!1!==await n.checkResponse(e);if(wasRequestSuccess(e.ok,e.status)&&t)r(...arguments);else{const t=(null==e?void 0:e.url)||"URL unknown";a(new Error(e.statusText||'Http error "'+(e&&e.status?e.status:"unknown")+'", for "'+t+'"'))}}.bind(this),e=>{this._nextSlot(),a(e)})})}fetch(e,t={},n={}){return this._pendingRequests>=40?new Promise((t,n)=>this._queue.push({request:e,resolve:t,reject:n})):this._fetch(e,t,n)}}function __decorate(e,t,n,r){var a,i=arguments.length,s=i<3?t:null===r?r=Object.getOwnPropertyDescriptor(t,n):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)s=Reflect.decorate(e,t,n,r);else for(var o=e.length-1;o>=0;o--)(a=e[o])&&(s=(i<3?a(s):i>3?a(t,n,s):a(t,n))||s);return i>3&&s&&Object.defineProperty(t,n,s),s}"function"==typeof SuppressedError&&SuppressedError;const dashCase=function(e){return e.startsWith("_")&&(e=e.substr(1)),e.replace(/[A-Z](?:(?=[^A-Z])|[A-Z]*(?=[A-Z][^A-Z]|$))/g,(function(e,t){return(t>0?"-":"")+e.toLowerCase()}))};function inject(e,t){const n=Symbol("property-cache");Object.defineProperty(e,t,{get(){if(!this[n]){const e=window.__RML__DI__.lookup(dashCase(t),this._creator_);e?this[n]=e:console.error("Dependency "+dashCase(t)+" not found! Add dependency to /utils/injectables.ts")}return this[n]}})}class Logger{info(...e){console}log(...e){console}warn(...e){console.warn.apply(console,e)}error(...e){console.warn.apply(console,e)}}class KernelIo extends Logger{constructor(e){super(),this._creator_=e}setMeta(e){this._meta=e}get meta(){return this._meta?this._meta:{}}throw(e){const t="[Kernel Exception]: "+e;this._globalCallback.onKernelMsg("exception",e,this.meta),this.error(t)}error(e){this._globalCallback.onKernelMsg("error",e,this.meta),super.error(e)}warn(e){this._globalCallback.onKernelMsg("warning",e,this.meta),super.warn(e)}}__decorate([inject],KernelIo.prototype,"_globalCallback",void 0);const ASSET_CACHE=new Map,SYNCED_CATALOGS=new Map,SYNCED_FLOORS_TAGS=new Map,SYNCED_TYPE_CHANGE_TAGS=new Map;class DataSyncer{constructor(e){this._bootCallbacks=[],this._isStarted=!1,this._isStarting=!1,this._alwaysUseCache=!1,this._creator_=e}start(e){return this._configuratorUiCallbacks.onSyncStarted(),this._startWorker().then(()=>this._handleCatalog(e)).then(()=>{const{typeChangeTag:e,floorMaterialsTag:t}=this._initData;Promise.all([this._syncFloorTag(t),this._syncTypeChangeTag(e)]).then(()=>{SYNCED_TYPE_CHANGE_TAGS.set(e,!0),this._configuratorUiCallbacks.onSyncDone()})})}syncCatalog(e){return this._startWorker().then(()=>this._handleCatalog(e))}syncFloorTag(e){return this._startWorker().then(()=>this._syncFloorTag(e))}syncTypeChangeTag(e){return this._startWorker().then(()=>this._syncTypeChangeTag(e))}_syncFloorTag(e){const t=[];return e&&!SYNCED_FLOORS_TAGS.get(e)?(t.push(this._handleTags([e])),this._rapiAccess.getTag(e).then(e=>{t.push(this._handleMaterialsAndTextures(e))}),this._singlePromiseFactory.create(1,e,n=>{Promise.all(t).then(()=>{SYNCED_FLOORS_TAGS.set(e,!0),n()},e=>this._softReject(n,'_syncFloorTag error: "'+e+'"'))})):Promise.resolve()}_syncTypeChangeTag(e){const t=[];return e&&!SYNCED_TYPE_CHANGE_TAGS.get(e)?(t.push(this._handleTags([e])),this._rapiAccess.getTag(e).then(e=>{this._rapiAccess.getItems(e.items).then(e=>{e.forEach(e=>{this.getIsCatalogSynced(e.catalog)&&t.push(this._handleCatalog(e.catalog))})})}),this._singlePromiseFactory.create(2,e,n=>{Promise.all(t).then(()=>{SYNCED_FLOORS_TAGS.set(e,!0),n()},e=>this._softReject(n,'_syncTypeChangeTag error: "'+e+'"'))})):Promise.resolve()}getIsCatalogSynced(e){return!!SYNCED_CATALOGS.get(e)}_startWorker(){return new Promise((e,t)=>{if(this._isStarted)return e();this._bootCallbacks.push({resolve:e,reject:t}),this._isStarting||(this._worker=new Worker(getAssetPath()+"static/asset-loader.worker-1735a5fb1e401244.js"),this._mainThreadToWorker=new MainThreadToWorker(this,this._worker),this._isStarting=!0,this._mainThreadToWorker.sendToWorker(1))})}onCommand(e,t,n){switch(e){case 4:this._isStarted=!0,this._bootCallbacks.forEach(({resolve:e})=>e());break;case 3:this._mainThreadToWorker.resolvePromises(t,n)}}_handleCatalog(e){return this._singlePromiseFactory.create(0,e,t=>this.getIsCatalogSynced(e)?t():this._rapiAccess.getCatalog(e).then(e=>Promise.all([this._handleContentWithAssets(this._rapiAccess.getComponentsOf(e),["perspectiveImage"]),this._handleItemsAndAdditionalContents(e),this._handleMaterialsAndTextures(e),this._handleExternalMeshes(e),this._handleTags(e.tags)])).then(()=>{SYNCED_CATALOGS.set(e,!0),t()},e=>this._softReject(t,'Catalog sync error: "'+e+'"')))}_handleTags(e){return this._handleContentWithAssets(this._rapiAccess.getTags(e),["pngIcon","svgIcon"])}_handleExternalMeshes(e){return new Promise(t=>{this._rapiAccess.getMeshesOfCatalog(e.id).then(e=>{const n=[];e.forEach(e=>{n.push(this._handleContentWithAssets(Promise.all([this._rapiAccess.getMesh(e.id)]),["url"]))}),Promise.all(n).then(t,e=>this._softReject(t,'Sync crt files error: "'+e+'"'))},e=>this._softReject(t,'getMeshesOfCatalog error: "'+e+'"'))})}_handleItemsAndAdditionalContents(e){return new Promise(t=>{this._rapiAccess.getItemsOf(e).then(e=>{const n=[];n.push(this._handleContentWithAssets(Promise.resolve(e),["perspectiveImage"])),this._rapiAccess.getAdditionalContentsOfItems(e).then(e=>{const t=e.filter(e=>-1!==[5,6,4].indexOf(e.type));n.push(this._handleContentWithAssets(Promise.resolve(t),["content"]))},e=>this._softReject(t,'getAdditionalContentsOfItems error: "'+e+'"')),Promise.all(n).then(t,e=>this._softReject(t,'AdditionalContent image sync error:"'+e+'"'))})})}_handleMaterialsAndTextures(e){return new Promise(t=>{this._rapiAccess.getMaterialsOf(e).then(e=>{const n=[];n.push(this._handleContentWithAssets(Promise.resolve(e),["thumbnail"])),e.forEach(e=>{n.push(this._handleContentWithAssets(this._rapiAccess.getTexturesOf(e),["image"]))}),Promise.all(n).then(t,e=>this._softReject(t,'getTexturesOf error: "'+e+'"'))},e=>this._softReject(t,'getMaterialsOf error: "'+e+'"'))})}_handleContentWithAssets(e,t){return new Promise(n=>e.then(e=>this._fetchAssets(e,t).then(n,e=>this._softReject(n,'_handleContentWithAssets error: "'+e+'"')),e=>this._softReject(n,'_handleContentWithAssets promise error: "'+e+'"')))}_fetchAssets(e,t){const n=[];e||(e=[]);for(let r=0,a=e.length;r<a;r++){const a=e[r];t.forEach(e=>{const t=a[e];t&&n.push(this._preCacheAsset(t))})}return Promise.all(n)}_preCacheAsset(e){return new Promise(t=>{if(ASSET_CACHE.get(e))return t();this._assetUrlToBase64(e).then(n=>{ASSET_CACHE.set(e,n),t()},e=>this._softReject(t,'_preCacheAsset error: "'+e+'"'))})}_assetUrlToBase64(e){return new Promise(t=>{this._mainThreadToWorker.sendToWorker(5,e,t,e=>this._softReject(t,'_assetUrlToBase64 error: "'+e+'"'))})}_softReject(e,t){this._errorHandler.softReject(e,t,2)}requestAsset(e,t=!1){return navigator.onLine&&!this._alwaysUseCache?e:ASSET_CACHE.get(e)||(t?e:null)}setAlwaysUseCache(e){this._alwaysUseCache=e}preFillAssetCache(e,t){ASSET_CACHE.set(e,t)}}__decorate([inject],DataSyncer.prototype,"_rapiAccess",void 0),__decorate([inject],DataSyncer.prototype,"_singlePromiseFactory",void 0),__decorate([inject],DataSyncer.prototype,"_errorHandler",void 0),__decorate([inject],DataSyncer.prototype,"_configuratorUiCallbacks",void 0),__decorate([inject],DataSyncer.prototype,"_initData",void 0);class AsyncGuard{constructor(e){this.info=e,this._init()}_init(){this._promise=new Promise((e,t)=>{this._resolve=e,this._reject=t})}resolve(e){e&&this._resolve(e),this._resolve()}reject(e){this._reject(e)}wait(){return this._promise}reset(){this._init()}}function mergeAttributes(e){let t,n,r,a=-1,i=0;for(let s=0;s<e.length;++s){const o=e[s];if(o.isInterleavedBufferAttribute)return console.error("THREE.BufferGeometryUtils: .mergeAttributes() failed. InterleavedBufferAttributes are not supported."),null;if(void 0===t&&(t=o.array.constructor),t!==o.array.constructor)return console.error("THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.array must be of consistent array types across matching attributes."),null;if(void 0===n&&(n=o.itemSize),n!==o.itemSize)return console.error("THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.itemSize must be consistent across matching attributes."),null;if(void 0===r&&(r=o.normalized),r!==o.normalized)return console.error("THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.normalized must be consistent across matching attributes."),null;if(-1===a&&(a=o.gpuType),a!==o.gpuType)return console.error("THREE.BufferGeometryUtils: .mergeAttributes() failed. BufferAttribute.gpuType must be consistent across matching attributes."),null;i+=o.array.length}const s=new t(i);let o=0;for(let t=0;t<e.length;++t)s.set(e[t].array,o),o+=e[t].array.length;const l=new BufferAttribute(s,n,r);return void 0!==a&&(l.gpuType=a),l}function toTrianglesDrawMode(e,t){if(t===TrianglesDrawMode)return console.warn("THREE.BufferGeometryUtils.toTrianglesDrawMode(): Geometry already defined as triangles."),e;if(t===TriangleFanDrawMode||t===TriangleStripDrawMode){let n=e.getIndex();if(null===n){const t=[],r=e.getAttribute("position");if(void 0===r)return console.error("THREE.BufferGeometryUtils.toTrianglesDrawMode(): Undefined position attribute. Processing not possible."),e;for(let e=0;e<r.count;e++)t.push(e);e.setIndex(t),n=e.getIndex()}const r=n.count-2,a=[];if(t===TriangleFanDrawMode)for(let e=1;e<=r;e++)a.push(n.getX(0)),a.push(n.getX(e)),a.push(n.getX(e+1));else for(let e=0;e<r;e++)e%2==0?(a.push(n.getX(e)),a.push(n.getX(e+1)),a.push(n.getX(e+2))):(a.push(n.getX(e+2)),a.push(n.getX(e+1)),a.push(n.getX(e)));a.length/3!==r&&console.error("THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unable to generate correct amount of triangles.");const i=e.clone();return i.setIndex(a),i.clearGroups(),i}return console.error("THREE.BufferGeometryUtils.toTrianglesDrawMode(): Unknown draw mode:",t),e}class GLTFLoader extends Loader{constructor(e){super(e),this.dracoLoader=null,this.ktx2Loader=null,this.meshoptDecoder=null,this.pluginCallbacks=[],this.register((function(e){return new GLTFMaterialsClearcoatExtension(e)})),this.register((function(e){return new GLTFTextureBasisUExtension(e)})),this.register((function(e){return new GLTFTextureWebPExtension(e)})),this.register((function(e){return new GLTFTextureAVIFExtension(e)})),this.register((function(e){return new GLTFMaterialsSheenExtension(e)})),this.register((function(e){return new GLTFMaterialsTransmissionExtension(e)})),this.register((function(e){return new GLTFMaterialsVolumeExtension(e)})),this.register((function(e){return new GLTFMaterialsIorExtension(e)})),this.register((function(e){return new GLTFMaterialsEmissiveStrengthExtension(e)})),this.register((function(e){return new GLTFMaterialsSpecularExtension(e)})),this.register((function(e){return new GLTFMaterialsIridescenceExtension(e)})),this.register((function(e){return new GLTFMaterialsAnisotropyExtension(e)})),this.register((function(e){return new GLTFLightsExtension(e)})),this.register((function(e){return new GLTFMeshoptCompression(e)})),this.register((function(e){return new GLTFMeshGpuInstancing(e)}))}load(e,t,n,r){const a=this;let i;i=""!==this.resourcePath?this.resourcePath:""!==this.path?this.path:LoaderUtils.extractUrlBase(e),this.manager.itemStart(e);const s=function(t){r?r(t):console.error(t),a.manager.itemError(e),a.manager.itemEnd(e)},o=new FileLoader(this.manager);o.setPath(this.path),o.setResponseType("arraybuffer"),o.setRequestHeader(this.requestHeader),o.setWithCredentials(this.withCredentials),o.load(e,(function(n){try{a.parse(n,i,(function(n){t(n),a.manager.itemEnd(e)}),s)}catch(e){s(e)}}),n,s)}setDRACOLoader(e){return this.dracoLoader=e,this}setDDSLoader(){throw new Error('THREE.GLTFLoader: "MSFT_texture_dds" no longer supported. Please update to "KHR_texture_basisu".')}setKTX2Loader(e){return this.ktx2Loader=e,this}setMeshoptDecoder(e){return this.meshoptDecoder=e,this}register(e){return-1===this.pluginCallbacks.indexOf(e)&&this.pluginCallbacks.push(e),this}unregister(e){return-1!==this.pluginCallbacks.indexOf(e)&&this.pluginCallbacks.splice(this.pluginCallbacks.indexOf(e),1),this}parse(e,t,n,r){let a;const i={},s={},o=new TextDecoder;if("string"==typeof e)a=JSON.parse(e);else if(e instanceof ArrayBuffer)if(o.decode(new Uint8Array(e,0,4))===BINARY_EXTENSION_HEADER_MAGIC){try{i[EXTENSIONS.KHR_BINARY_GLTF]=new GLTFBinaryExtension(e)}catch(e){return void(r&&r(e))}a=JSON.parse(i[EXTENSIONS.KHR_BINARY_GLTF].content)}else a=JSON.parse(o.decode(e));else a=e;if(void 0===a.asset||a.asset.version[0]<2)return void(r&&r(new Error("THREE.GLTFLoader: Unsupported asset. glTF versions >=2.0 are supported.")));const l=new GLTFParser(a,{path:t||this.resourcePath||"",crossOrigin:this.crossOrigin,requestHeader:this.requestHeader,manager:this.manager,ktx2Loader:this.ktx2Loader,meshoptDecoder:this.meshoptDecoder});l.fileLoader.setRequestHeader(this.requestHeader);for(let e=0;e<this.pluginCallbacks.length;e++){const t=this.pluginCallbacks[e](l);s[t.name]=t,i[t.name]=!0}if(a.extensionsUsed)for(let e=0;e<a.extensionsUsed.length;++e){const t=a.extensionsUsed[e],n=a.extensionsRequired||[];switch(t){case EXTENSIONS.KHR_MATERIALS_UNLIT:i[t]=new GLTFMaterialsUnlitExtension;break;case EXTENSIONS.KHR_DRACO_MESH_COMPRESSION:i[t]=new GLTFDracoMeshCompressionExtension(a,this.dracoLoader);break;case EXTENSIONS.KHR_TEXTURE_TRANSFORM:i[t]=new GLTFTextureTransformExtension;break;case EXTENSIONS.KHR_MESH_QUANTIZATION:i[t]=new GLTFMeshQuantizationExtension;break;default:n.indexOf(t)>=0&&void 0===s[t]&&console.warn('THREE.GLTFLoader: Unknown extension "'+t+'".')}}l.setExtensions(i),l.setPlugins(s),l.parse(n,r)}parseAsync(e,t){const n=this;return new Promise((function(r,a){n.parse(e,t,r,a)}))}}function GLTFRegistry(){let e={};return{get:function(t){return e[t]},add:function(t,n){e[t]=n},remove:function(t){delete e[t]},removeAll:function(){e={}}}}const EXTENSIONS={KHR_BINARY_GLTF:"KHR_binary_glTF",KHR_DRACO_MESH_COMPRESSION:"KHR_draco_mesh_compression",KHR_LIGHTS_PUNCTUAL:"KHR_lights_punctual",KHR_MATERIALS_CLEARCOAT:"KHR_materials_clearcoat",KHR_MATERIALS_IOR:"KHR_materials_ior",KHR_MATERIALS_SHEEN:"KHR_materials_sheen",KHR_MATERIALS_SPECULAR:"KHR_materials_specular",KHR_MATERIALS_TRANSMISSION:"KHR_materials_transmission",KHR_MATERIALS_IRIDESCENCE:"KHR_materials_iridescence",KHR_MATERIALS_ANISOTROPY:"KHR_materials_anisotropy",KHR_MATERIALS_UNLIT:"KHR_materials_unlit",KHR_MATERIALS_VOLUME:"KHR_materials_volume",KHR_TEXTURE_BASISU:"KHR_texture_basisu",KHR_TEXTURE_TRANSFORM:"KHR_texture_transform",KHR_MESH_QUANTIZATION:"KHR_mesh_quantization",KHR_MATERIALS_EMISSIVE_STRENGTH:"KHR_materials_emissive_strength",EXT_TEXTURE_WEBP:"EXT_texture_webp",EXT_TEXTURE_AVIF:"EXT_texture_avif",EXT_MESHOPT_COMPRESSION:"EXT_meshopt_compression",EXT_MESH_GPU_INSTANCING:"EXT_mesh_gpu_instancing"};class GLTFLightsExtension{constructor(e){this.parser=e,this.name=EXTENSIONS.KHR_LIGHTS_PUNCTUAL,this.cache={refs:{},uses:{}}}_markDefs(){const e=this.parser,t=this.parser.json.nodes||[];for(let n=0,r=t.length;n<r;n++){const r=t[n];r.extensions&&r.extensions[this.name]&&void 0!==r.extensions[this.name].light&&e._addNodeRef(this.cache,r.extensions[this.name].light)}}_loadLight(e){const t=this.parser,n="light:"+e;let r=t.cache.get(n);if(r)return r;const a=t.json,i=((a.extensions&&a.extensions[this.name]||{}).lights||[])[e];let s;const o=new Color$1(16777215);void 0!==i.color&&o.fromArray(i.color);const l=void 0!==i.range?i.range:0;switch(i.type){case"directional":s=new DirectionalLight(o),s.target.position.set(0,0,-1),s.add(s.target);break;case"point":s=new PointLight(o),s.distance=l;break;case"spot":s=new SpotLight(o),s.distance=l,i.spot=i.spot||{},i.spot.innerConeAngle=void 0!==i.spot.innerConeAngle?i.spot.innerConeAngle:0,i.spot.outerConeAngle=void 0!==i.spot.outerConeAngle?i.spot.outerConeAngle:Math.PI/4,s.angle=i.spot.outerConeAngle,s.penumbra=1-i.spot.innerConeAngle/i.spot.outerConeAngle,s.target.position.set(0,0,-1),s.add(s.target);break;default:throw new Error("THREE.GLTFLoader: Unexpected light type: "+i.type)}return s.position.set(0,0,0),s.decay=2,assignExtrasToUserData(s,i),void 0!==i.intensity&&(s.intensity=i.intensity),s.name=t.createUniqueName(i.name||"light_"+e),r=Promise.resolve(s),t.cache.add(n,r),r}getDependency(e,t){if("light"===e)return this._loadLight(t)}createNodeAttachment(e){const t=this,n=this.parser,r=n.json.nodes[e],a=(r.extensions&&r.extensions[this.name]||{}).light;return void 0===a?null:this._loadLight(a).then((function(e){return n._getNodeRef(t.cache,a,e)}))}}class GLTFMaterialsUnlitExtension{constructor(){this.name=EXTENSIONS.KHR_MATERIALS_UNLIT}getMaterialType(){return MeshBasicMaterial}extendParams(e,t,n){const r=[];e.color=new Color$1(1,1,1),e.opacity=1;const a=t.pbrMetallicRoughness;if(a){if(Array.isArray(a.baseColorFactor)){const t=a.baseColorFactor;e.color.fromArray(t),e.opacity=t[3]}void 0!==a.baseColorTexture&&r.push(n.assignTexture(e,"map",a.baseColorTexture,SRGBColorSpace))}return Promise.all(r)}}class GLTFMaterialsEmissiveStrengthExtension{constructor(e){this.parser=e,this.name=EXTENSIONS.KHR_MATERIALS_EMISSIVE_STRENGTH}extendMaterialParams(e,t){const n=this.parser.json.materials[e];if(!n.extensions||!n.extensions[this.name])return Promise.resolve();const r=n.extensions[this.name].emissiveStrength;return void 0!==r&&(t.emissiveIntensity=r),Promise.resolve()}}class GLTFMaterialsClearcoatExtension{constructor(e){this.parser=e,this.name=EXTENSIONS.KHR_MATERIALS_CLEARCOAT}getMaterialType(e){const t=this.parser.json.materials[e];return t.extensions&&t.extensions[this.name]?MeshPhysicalMaterial:null}extendMaterialParams(e,t){const n=this.parser,r=n.json.materials[e];if(!r.extensions||!r.extensions[this.name])return Promise.resolve();const a=[],i=r.extensions[this.name];if(void 0!==i.clearcoatFactor&&(t.clearcoat=i.clearcoatFactor),void 0!==i.clearcoatTexture&&a.push(n.assignTexture(t,"clearcoatMap",i.clearcoatTexture)),void 0!==i.clearcoatRoughnessFactor&&(t.clearcoatRoughness=i.clearcoatRoughnessFactor),void 0!==i.clearcoatRoughnessTexture&&a.push(n.assignTexture(t,"clearcoatRoughnessMap",i.clearcoatRoughnessTexture)),void 0!==i.clearcoatNormalTexture&&(a.push(n.assignTexture(t,"clearcoatNormalMap",i.clearcoatNormalTexture)),void 0!==i.clearcoatNormalTexture.scale)){const e=i.clearcoatNormalTexture.scale;t.clearcoatNormalScale=new Vector2(e,e)}return Promise.all(a)}}class GLTFMaterialsIridescenceExtension{constructor(e){this.parser=e,this.name=EXTENSIONS.KHR_MATERIALS_IRIDESCENCE}getMaterialType(e){const t=this.parser.json.materials[e];return t.extensions&&t.extensions[this.name]?MeshPhysicalMaterial:null}extendMaterialParams(e,t){const n=this.parser,r=n.json.materials[e];if(!r.extensions||!r.extensions[this.name])return Promise.resolve();const a=[],i=r.extensions[this.name];return void 0!==i.iridescenceFactor&&(t.iridescence=i.iridescenceFactor),void 0!==i.iridescenceTexture&&a.push(n.assignTexture(t,"iridescenceMap",i.iridescenceTexture)),void 0!==i.iridescenceIor&&(t.iridescenceIOR=i.iridescenceIor),void 0===t.iridescenceThicknessRange&&(t.iridescenceThicknessRange=[100,400]),void 0!==i.iridescenceThicknessMinimum&&(t.iridescenceThicknessRange[0]=i.iridescenceThicknessMinimum),void 0!==i.iridescenceThicknessMaximum&&(t.iridescenceThicknessRange[1]=i.iridescenceThicknessMaximum),void 0!==i.iridescenceThicknessTexture&&a.push(n.assignTexture(t,"iridescenceThicknessMap",i.iridescenceThicknessTexture)),Promise.all(a)}}class GLTFMaterialsSheenExtension{constructor(e){this.parser=e,this.name=EXTENSIONS.KHR_MATERIALS_SHEEN}getMaterialType(e){const t=this.parser.json.materials[e];return t.extensions&&t.extensions[this.name]?MeshPhysicalMaterial:null}extendMaterialParams(e,t){const n=this.parser,r=n.json.materials[e];if(!r.extensions||!r.extensions[this.name])return Promise.resolve();const a=[];t.sheenColor=new Color$1(0,0,0),t.sheenRoughness=0,t.sheen=1;const i=r.extensions[this.name];return void 0!==i.sheenColorFactor&&t.sheenColor.fromArray(i.sheenColorFactor),void 0!==i.sheenRoughnessFactor&&(t.sheenRoughness=i.sheenRoughnessFactor),void 0!==i.sheenColorTexture&&a.push(n.assignTexture(t,"sheenColorMap",i.sheenColorTexture,SRGBColorSpace)),void 0!==i.sheenRoughnessTexture&&a.push(n.assignTexture(t,"sheenRoughnessMap",i.sheenRoughnessTexture)),Promise.all(a)}}class GLTFMaterialsTransmissionExtension{constructor(e){this.parser=e,this.name=EXTENSIONS.KHR_MATERIALS_TRANSMISSION}getMaterialType(e){const t=this.parser.json.materials[e];return t.extensions&&t.extensions[this.name]?MeshPhysicalMaterial:null}extendMaterialParams(e,t){const n=this.parser,r=n.json.materials[e];if(!r.extensions||!r.extensions[this.name])return Promise.resolve();const a=[],i=r.extensions[this.name];return void 0!==i.transmissionFactor&&(t.transmission=i.transmissionFactor),void 0!==i.transmissionTexture&&a.push(n.assignTexture(t,"transmissionMap",i.transmissionTexture)),Promise.all(a)}}class GLTFMaterialsVolumeExtension{constructor(e){this.parser=e,this.name=EXTENSIONS.KHR_MATERIALS_VOLUME}getMaterialType(e){const t=this.parser.json.materials[e];return t.extensions&&t.extensions[this.name]?MeshPhysicalMaterial:null}extendMaterialParams(e,t){const n=this.parser,r=n.json.materials[e];if(!r.extensions||!r.extensions[this.name])return Promise.resolve();const a=[],i=r.extensions[this.name];t.thickness=void 0!==i.thicknessFactor?i.thicknessFactor:0,void 0!==i.thicknessTexture&&a.push(n.assignTexture(t,"thicknessMap",i.thicknessTexture)),t.attenuationDistance=i.attenuationDistance||1/0;const s=i.attenuationColor||[1,1,1];return t.attenuationColor=new Color$1(s[0],s[1],s[2]),Promise.all(a)}}class GLTFMaterialsIorExtension{constructor(e){this.parser=e,this.name=EXTENSIONS.KHR_MATERIALS_IOR}getMaterialType(e){const t=this.parser.json.materials[e];return t.extensions&&t.extensions[this.name]?MeshPhysicalMaterial:null}extendMaterialParams(e,t){const n=this.parser.json.materials[e];if(!n.extensions||!n.extensions[this.name])return Promise.resolve();const r=n.extensions[this.name];return t.ior=void 0!==r.ior?r.ior:1.5,Promise.resolve()}}class GLTFMaterialsSpecularExtension{constructor(e){this.parser=e,this.name=EXTENSIONS.KHR_MATERIALS_SPECULAR}getMaterialType(e){const t=this.parser.json.materials[e];return t.extensions&&t.extensions[this.name]?MeshPhysicalMaterial:null}extendMaterialParams(e,t){const n=this.parser,r=n.json.materials[e];if(!r.extensions||!r.extensions[this.name])return Promise.resolve();const a=[],i=r.extensions[this.name];t.specularIntensity=void 0!==i.specularFactor?i.specularFactor:1,void 0!==i.specularTexture&&a.push(n.assignTexture(t,"specularIntensityMap",i.specularTexture));const s=i.specularColorFactor||[1,1,1];return t.specularColor=new Color$1(s[0],s[1],s[2]),void 0!==i.specularColorTexture&&a.push(n.assignTexture(t,"specularColorMap",i.specularColorTexture,SRGBColorSpace)),Promise.all(a)}}class GLTFMaterialsAnisotropyExtension{constructor(e){this.parser=e,this.name=EXTENSIONS.KHR_MATERIALS_ANISOTROPY}getMaterialType(e){const t=this.parser.json.materials[e];return t.extensions&&t.extensions[this.name]?MeshPhysicalMaterial:null}extendMaterialParams(e,t){const n=this.parser,r=n.json.materials[e];if(!r.extensions||!r.extensions[this.name])return Promise.resolve();const a=[],i=r.extensions[this.name];return void 0!==i.anisotropyStrength&&(t.anisotropy=i.anisotropyStrength),void 0!==i.anisotropyRotation&&(t.anisotropyRotation=i.anisotropyRotation),void 0!==i.anisotropyTexture&&a.push(n.assignTexture(t,"anisotropyMap",i.anisotropyTexture)),Promise.all(a)}}class GLTFTextureBasisUExtension{constructor(e){this.parser=e,this.name=EXTENSIONS.KHR_TEXTURE_BASISU}loadTexture(e){const t=this.parser,n=t.json,r=n.textures[e];if(!r.extensions||!r.extensions[this.name])return null;const a=r.extensions[this.name],i=t.options.ktx2Loader;if(!i){if(n.extensionsRequired&&n.extensionsRequired.indexOf(this.name)>=0)throw new Error("THREE.GLTFLoader: setKTX2Loader must be called before loading KTX2 textures");return null}return t.loadTextureImage(e,a.source,i)}}class GLTFTextureWebPExtension{constructor(e){this.parser=e,this.name=EXTENSIONS.EXT_TEXTURE_WEBP,this.isSupported=null}loadTexture(e){const t=this.name,n=this.parser,r=n.json,a=r.textures[e];if(!a.extensions||!a.extensions[t])return null;const i=a.extensions[t],s=r.images[i.source];let o=n.textureLoader;if(s.uri){const e=n.options.manager.getHandler(s.uri);null!==e&&(o=e)}return this.detectSupport().then((function(a){if(a)return n.loadTextureImage(e,i.source,o);if(r.extensionsRequired&&r.extensionsRequired.indexOf(t)>=0)throw new Error("THREE.GLTFLoader: WebP required by asset but unsupported.");return n.loadTexture(e)}))}detectSupport(){return this.isSupported||(this.isSupported=new Promise((function(e){const t=new Image;t.src="data:image/webp;base64,UklGRiIAAABXRUJQVlA4IBYAAAAwAQCdASoBAAEADsD+JaQAA3AAAAAA",t.onload=t.onerror=function(){e(1===t.height)}}))),this.isSupported}}class GLTFTextureAVIFExtension{constructor(e){this.parser=e,this.name=EXTENSIONS.EXT_TEXTURE_AVIF,this.isSupported=null}loadTexture(e){const t=this.name,n=this.parser,r=n.json,a=r.textures[e];if(!a.extensions||!a.extensions[t])return null;const i=a.extensions[t],s=r.images[i.source];let o=n.textureLoader;if(s.uri){const e=n.options.manager.getHandler(s.uri);null!==e&&(o=e)}return this.detectSupport().then((function(a){if(a)return n.loadTextureImage(e,i.source,o);if(r.extensionsRequired&&r.extensionsRequired.indexOf(t)>=0)throw new Error("THREE.GLTFLoader: AVIF required by asset but unsupported.");return n.loadTexture(e)}))}detectSupport(){return this.isSupported||(this.isSupported=new Promise((function(e){const t=new Image;t.src="data:image/avif;base64,AAAAIGZ0eXBhdmlmAAAAAGF2aWZtaWYxbWlhZk1BMUIAAADybWV0YQAAAAAAAAAoaGRscgAAAAAAAAAAcGljdAAAAAAAAAAAAAAAAGxpYmF2aWYAAAAADnBpdG0AAAAAAAEAAAAeaWxvYwAAAABEAAABAAEAAAABAAABGgAAABcAAAAoaWluZgAAAAAAAQAAABppbmZlAgAAAAABAABhdjAxQ29sb3IAAAAAamlwcnAAAABLaXBjbwAAABRpc3BlAAAAAAAAAAEAAAABAAAAEHBpeGkAAAAAAwgICAAAAAxhdjFDgQAMAAAAABNjb2xybmNseAACAAIABoAAAAAXaXBtYQAAAAAAAAABAAEEAQKDBAAAAB9tZGF0EgAKCBgABogQEDQgMgkQAAAAB8dSLfI=",t.onload=t.onerror=function(){e(1===t.height)}}))),this.isSupported}}class GLTFMeshoptCompression{constructor(e){this.name=EXTENSIONS.EXT_MESHOPT_COMPRESSION,this.parser=e}loadBufferView(e){const t=this.parser.json,n=t.bufferViews[e];if(n.extensions&&n.extensions[this.name]){const e=n.extensions[this.name],r=this.parser.getDependency("buffer",e.buffer),a=this.parser.options.meshoptDecoder;if(!a||!a.supported){if(t.extensionsRequired&&t.extensionsRequired.indexOf(this.name)>=0)throw new Error("THREE.GLTFLoader: setMeshoptDecoder must be called before loading compressed files");return null}return r.then((function(t){const n=e.byteOffset||0,r=e.byteLength||0,i=e.count,s=e.byteStride,o=new Uint8Array(t,n,r);return a.decodeGltfBufferAsync?a.decodeGltfBufferAsync(i,s,o,e.mode,e.filter).then((function(e){return e.buffer})):a.ready.then((function(){const t=new ArrayBuffer(i*s);return a.decodeGltfBuffer(new Uint8Array(t),i,s,o,e.mode,e.filter),t}))}))}return null}}class GLTFMeshGpuInstancing{constructor(e){this.name=EXTENSIONS.EXT_MESH_GPU_INSTANCING,this.parser=e}createNodeMesh(e){const t=this.parser.json,n=t.nodes[e];if(!n.extensions||!n.extensions[this.name]||void 0===n.mesh)return null;const r=t.meshes[n.mesh];for(const e of r.primitives)if(e.mode!==WEBGL_CONSTANTS.TRIANGLES&&e.mode!==WEBGL_CONSTANTS.TRIANGLE_STRIP&&e.mode!==WEBGL_CONSTANTS.TRIANGLE_FAN&&void 0!==e.mode)return null;const a=n.extensions[this.name].attributes,i=[],s={};for(const e in a)i.push(this.parser.getDependency("accessor",a[e]).then(t=>(s[e]=t,s[e])));return i.length<1?null:(i.push(this.parser.createNodeMesh(e)),Promise.all(i).then(e=>{const t=e.pop(),n=t.isGroup?t.children:[t],r=e[0].count,a=[];for(const e of n){const t=new Matrix4,n=new Vector3,i=new Quaternion,o=new Vector3(1,1,1),l=new InstancedMesh(e.geometry,e.material,r);for(let e=0;e<r;e++)s.TRANSLATION&&n.fromBufferAttribute(s.TRANSLATION,e),s.ROTATION&&i.fromBufferAttribute(s.ROTATION,e),s.SCALE&&o.fromBufferAttribute(s.SCALE,e),l.setMatrixAt(e,t.compose(n,i,o));for(const t in s)"TRANSLATION"!==t&&"ROTATION"!==t&&"SCALE"!==t&&e.geometry.setAttribute(t,s[t]);Object3D.prototype.copy.call(l,e),this.parser.assignFinalMaterial(l),a.push(l)}return t.isGroup?(t.clear(),t.add(...a),t):a[0]}))}}const BINARY_EXTENSION_HEADER_MAGIC="glTF";class GLTFBinaryExtension{constructor(e){this.name=EXTENSIONS.KHR_BINARY_GLTF,this.content=null,this.body=null;const t=new DataView(e,0,12),n=new TextDecoder;if(this.header={magic:n.decode(new Uint8Array(e.slice(0,4))),version:t.getUint32(4,!0),length:t.getUint32(8,!0)},this.header.magic!==BINARY_EXTENSION_HEADER_MAGIC)throw new Error("THREE.GLTFLoader: Unsupported glTF-Binary header.");if(this.header.version<2)throw new Error("THREE.GLTFLoader: Legacy binary file detected.");const r=this.header.length-12,a=new DataView(e,12);let i=0;for(;i<r;){const t=a.getUint32(i,!0);i+=4;const r=a.getUint32(i,!0);if(i+=4,1313821514===r){const r=new Uint8Array(e,12+i,t);this.content=n.decode(r)}else if(5130562===r){const n=12+i;this.body=e.slice(n,n+t)}i+=t}if(null===this.content)throw new Error("THREE.GLTFLoader: JSON content not found.")}}class GLTFDracoMeshCompressionExtension{constructor(e,t){if(!t)throw new Error("THREE.GLTFLoader: No DRACOLoader instance provided.");this.name=EXTENSIONS.KHR_DRACO_MESH_COMPRESSION,this.json=e,this.dracoLoader=t,this.dracoLoader.preload()}decodePrimitive(e,t){const n=this.json,r=this.dracoLoader,a=e.extensions[this.name].bufferView,i=e.extensions[this.name].attributes,s={},o={},l={};for(const e in i){const t=ATTRIBUTES[e]||e.toLowerCase();s[t]=i[e]}for(const t in e.attributes){const r=ATTRIBUTES[t]||t.toLowerCase();if(void 0!==i[t]){const a=n.accessors[e.attributes[t]],i=WEBGL_COMPONENT_TYPES[a.componentType];l[r]=i.name,o[r]=!0===a.normalized}}return t.getDependency("bufferView",a).then((function(e){return new Promise((function(t){r.decodeDracoFile(e,(function(e){for(const t in e.attributes){const n=e.attributes[t],r=o[t];void 0!==r&&(n.normalized=r)}t(e)}),s,l)}))}))}}class GLTFTextureTransformExtension{constructor(){this.name=EXTENSIONS.KHR_TEXTURE_TRANSFORM}extendTexture(e,t){return void 0!==t.texCoord&&t.texCoord!==e.channel||void 0!==t.offset||void 0!==t.rotation||void 0!==t.scale?(e=e.clone(),void 0!==t.texCoord&&(e.channel=t.texCoord),void 0!==t.offset&&e.offset.fromArray(t.offset),void 0!==t.rotation&&(e.rotation=t.rotation),void 0!==t.scale&&e.repeat.fromArray(t.scale),e.needsUpdate=!0,e):e}}class GLTFMeshQuantizationExtension{constructor(){this.name=EXTENSIONS.KHR_MESH_QUANTIZATION}}class GLTFCubicSplineInterpolant extends Interpolant{constructor(e,t,n,r){super(e,t,n,r)}copySampleValue_(e){const t=this.resultBuffer,n=this.sampleValues,r=this.valueSize,a=e*r*3+r;for(let e=0;e!==r;e++)t[e]=n[a+e];return t}interpolate_(e,t,n,r){const a=this.resultBuffer,i=this.sampleValues,s=this.valueSize,o=2*s,l=3*s,d=r-t,h=(n-t)/d,c=h*h,u=c*h,p=e*l,m=p-l,g=-2*u+3*c,f=u-c,_=1-g,v=f-c+h;for(let e=0;e!==s;e++){const t=i[m+e+s],n=i[m+e+o]*d,r=i[p+e+s],l=i[p+e]*d;a[e]=_*t+v*n+g*r+f*l}return a}}const _q=new Quaternion;class GLTFCubicSplineQuaternionInterpolant extends GLTFCubicSplineInterpolant{interpolate_(e,t,n,r){const a=super.interpolate_(e,t,n,r);return _q.fromArray(a).normalize().toArray(a),a}}const WEBGL_CONSTANTS={FLOAT:5126,FLOAT_MAT3:35675,FLOAT_MAT4:35676,FLOAT_VEC2:35664,FLOAT_VEC3:35665,FLOAT_VEC4:35666,LINEAR:9729,REPEAT:10497,SAMPLER_2D:35678,POINTS:0,LINES:1,LINE_LOOP:2,LINE_STRIP:3,TRIANGLES:4,TRIANGLE_STRIP:5,TRIANGLE_FAN:6,UNSIGNED_BYTE:5121,UNSIGNED_SHORT:5123},WEBGL_COMPONENT_TYPES={5120:Int8Array,5121:Uint8Array,5122:Int16Array,5123:Uint16Array,5125:Uint32Array,5126:Float32Array},WEBGL_FILTERS={9728:NearestFilter,9729:LinearFilter,9984:NearestMipmapNearestFilter,9985:LinearMipmapNearestFilter,9986:NearestMipmapLinearFilter,9987:LinearMipmapLinearFilter},WEBGL_WRAPPINGS={33071:ClampToEdgeWrapping,33648:MirroredRepeatWrapping,10497:RepeatWrapping},WEBGL_TYPE_SIZES={SCALAR:1,VEC2:2,VEC3:3,VEC4:4,MAT2:4,MAT3:9,MAT4:16},ATTRIBUTES={POSITION:"position",NORMAL:"normal",TANGENT:"tangent",TEXCOORD_0:"uv",TEXCOORD_1:"uv1",TEXCOORD_2:"uv2",TEXCOORD_3:"uv3",COLOR_0:"color",WEIGHTS_0:"skinWeight",JOINTS_0:"skinIndex"},PATH_PROPERTIES={scale:"scale",translation:"position",rotation:"quaternion",weights:"morphTargetInfluences"},INTERPOLATION={CUBICSPLINE:void 0,LINEAR:InterpolateLinear,STEP:InterpolateDiscrete};function addUnknownExtensionsToUserData(e,t,n){for(const r in n.extensions)void 0===e[r]&&(t.userData.gltfExtensions=t.userData.gltfExtensions||{},t.userData.gltfExtensions[r]=n.extensions[r])}function assignExtrasToUserData(e,t){void 0!==t.extras&&("object"==typeof t.extras?Object.assign(e.userData,t.extras):console.warn("THREE.GLTFLoader: Ignoring primitive type .extras, "+t.extras))}function updateMorphTargets(e,t){if(e.updateMorphTargets(),void 0!==t.weights)for(let n=0,r=t.weights.length;n<r;n++)e.morphTargetInfluences[n]=t.weights[n];if(t.extras&&Array.isArray(t.extras.targetNames)){const n=t.extras.targetNames;if(e.morphTargetInfluences.length===n.length){e.morphTargetDictionary={};for(let t=0,r=n.length;t<r;t++)e.morphTargetDictionary[n[t]]=t}else console.warn("THREE.GLTFLoader: Invalid extras.targetNames length. Ignoring names.")}}function createPrimitiveKey(e){let t;const n=e.extensions&&e.extensions[EXTENSIONS.KHR_DRACO_MESH_COMPRESSION];if(t=n?"draco:"+n.bufferView+":"+n.indices+":"+createAttributesKey(n.attributes):e.indices+":"+createAttributesKey(e.attributes)+":"+e.mode,void 0!==e.targets)for(let n=0,r=e.targets.length;n<r;n++)t+=":"+createAttributesKey(e.targets[n]);return t}function createAttributesKey(e){let t="";const n=Object.keys(e).sort();for(let r=0,a=n.length;r<a;r++)t+=n[r]+":"+e[n[r]]+";";return t}function getNormalizedComponentScale(e){switch(e){case Int8Array:return 1/127;case Uint8Array:return 1/255;case Int16Array:return 1/32767;case Uint16Array:return 1/65535;default:throw new Error("THREE.GLTFLoader: Unsupported normalized accessor component type.")}}const _identityMatrix=new Matrix4;class GLTFParser{constructor(e={},t={}){this.json=e,this.extensions={},this.plugins={},this.options=t,this.cache=new GLTFRegistry,this.associations=new Map,this.primitiveCache={},this.nodeCache={},this.meshCache={refs:{},uses:{}},this.cameraCache={refs:{},uses:{}},this.lightCache={refs:{},uses:{}},this.sourceCache={},this.textureCache={},this.nodeNamesUsed={};let n=!1,r=!1,a=-1;"undefined"!=typeof navigator&&(n=!0===/^((?!chrome|android).)*safari/i.test(navigator.userAgent),r=navigator.userAgent.indexOf("Firefox")>-1,a=r?navigator.userAgent.match(/Firefox\/([0-9]+)\./)[1]:-1),"undefined"==typeof createImageBitmap||n||r&&a<98?this.textureLoader=new TextureLoader(this.options.manager):this.textureLoader=new ImageBitmapLoader(this.options.manager),this.textureLoader.setCrossOrigin(this.options.crossOrigin),this.textureLoader.setRequestHeader(this.options.requestHeader),this.fileLoader=new FileLoader(this.options.manager),this.fileLoader.setResponseType("arraybuffer"),"use-credentials"===this.options.crossOrigin&&this.fileLoader.setWithCredentials(!0)}setExtensions(e){this.extensions=e}setPlugins(e){this.plugins=e}parse(e,t){const n=this,r=this.json,a=this.extensions;this.cache.removeAll(),this.nodeCache={},this._invokeAll((function(e){return e._markDefs&&e._markDefs()})),Promise.all(this._invokeAll((function(e){return e.beforeRoot&&e.beforeRoot()}))).then((function(){return Promise.all([n.getDependencies("scene"),n.getDependencies("animation"),n.getDependencies("camera")])})).then((function(t){const i={scene:t[0][r.scene||0],scenes:t[0],animations:t[1],cameras:t[2],asset:r.asset,parser:n,userData:{}};addUnknownExtensionsToUserData(a,i,r),assignExtrasToUserData(i,r),Promise.all(n._invokeAll((function(e){return e.afterRoot&&e.afterRoot(i)}))).then((function(){e(i)}))})).catch(t)}_markDefs(){const e=this.json.nodes||[],t=this.json.skins||[],n=this.json.meshes||[];for(let n=0,r=t.length;n<r;n++){const r=t[n].joints;for(let t=0,n=r.length;t<n;t++)e[r[t]].isBone=!0}for(let t=0,r=e.length;t<r;t++){const r=e[t];void 0!==r.mesh&&(this._addNodeRef(this.meshCache,r.mesh),void 0!==r.skin&&(n[r.mesh].isSkinnedMesh=!0)),void 0!==r.camera&&this._addNodeRef(this.cameraCache,r.camera)}}_addNodeRef(e,t){void 0!==t&&(void 0===e.refs[t]&&(e.refs[t]=e.uses[t]=0),e.refs[t]++)}_getNodeRef(e,t,n){if(e.refs[t]<=1)return n;const r=n.clone(),a=(e,t)=>{const n=this.associations.get(e);null!=n&&this.associations.set(t,n);for(const[n,r]of e.children.entries())a(r,t.children[n])};return a(n,r),r.name+="_instance_"+e.uses[t]++,r}_invokeOne(e){const t=Object.values(this.plugins);t.push(this);for(let n=0;n<t.length;n++){const r=e(t[n]);if(r)return r}return null}_invokeAll(e){const t=Object.values(this.plugins);t.unshift(this);const n=[];for(let r=0;r<t.length;r++){const a=e(t[r]);a&&n.push(a)}return n}getDependency(e,t){const n=e+":"+t;let r=this.cache.get(n);if(!r){switch(e){case"scene":r=this.loadScene(t);break;case"node":r=this._invokeOne((function(e){return e.loadNode&&e.loadNode(t)}));break;case"mesh":r=this._invokeOne((function(e){return e.loadMesh&&e.loadMesh(t)}));break;case"accessor":r=this.loadAccessor(t);break;case"bufferView":r=this._invokeOne((function(e){return e.loadBufferView&&e.loadBufferView(t)}));break;case"buffer":r=this.loadBuffer(t);break;case"material":r=this._invokeOne((function(e){return e.loadMaterial&&e.loadMaterial(t)}));break;case"texture":r=this._invokeOne((function(e){return e.loadTexture&&e.loadTexture(t)}));break;case"skin":r=this.loadSkin(t);break;case"animation":r=this._invokeOne((function(e){return e.loadAnimation&&e.loadAnimation(t)}));break;case"camera":r=this.loadCamera(t);break;default:if(r=this._invokeOne((function(n){return n!=this&&n.getDependency&&n.getDependency(e,t)})),!r)throw new Error("Unknown type: "+e)}this.cache.add(n,r)}return r}getDependencies(e){let t=this.cache.get(e);if(!t){const n=this,r=this.json[e+("mesh"===e?"es":"s")]||[];t=Promise.all(r.map((function(t,r){return n.getDependency(e,r)}))),this.cache.add(e,t)}return t}loadBuffer(e){const t=this.json.buffers[e],n=this.fileLoader;if(t.type&&"arraybuffer"!==t.type)throw new Error("THREE.GLTFLoader: "+t.type+" buffer type is not supported.");if(void 0===t.uri&&0===e)return Promise.resolve(this.extensions[EXTENSIONS.KHR_BINARY_GLTF].body);const r=this.options;return new Promise((function(e,a){n.load(LoaderUtils.resolveURL(t.uri,r.path),e,void 0,(function(){a(new Error('THREE.GLTFLoader: Failed to load buffer "'+t.uri+'".'))}))}))}loadBufferView(e){const t=this.json.bufferViews[e];return this.getDependency("buffer",t.buffer).then((function(e){const n=t.byteLength||0,r=t.byteOffset||0;return e.slice(r,r+n)}))}loadAccessor(e){const t=this,n=this.json,r=this.json.accessors[e];if(void 0===r.bufferView&&void 0===r.sparse){const e=WEBGL_TYPE_SIZES[r.type],t=WEBGL_COMPONENT_TYPES[r.componentType],n=!0===r.normalized,a=new t(r.count*e);return Promise.resolve(new BufferAttribute(a,e,n))}const a=[];return void 0!==r.bufferView?a.push(this.getDependency("bufferView",r.bufferView)):a.push(null),void 0!==r.sparse&&(a.push(this.getDependency("bufferView",r.sparse.indices.bufferView)),a.push(this.getDependency("bufferView",r.sparse.values.bufferView))),Promise.all(a).then((function(e){const a=e[0],i=WEBGL_TYPE_SIZES[r.type],s=WEBGL_COMPONENT_TYPES[r.componentType],o=s.BYTES_PER_ELEMENT,l=o*i,d=r.byteOffset||0,h=void 0!==r.bufferView?n.bufferViews[r.bufferView].byteStride:void 0,c=!0===r.normalized;let u,p;if(h&&h!==l){const e=Math.floor(d/h),n="InterleavedBuffer:"+r.bufferView+":"+r.componentType+":"+e+":"+r.count;let l=t.cache.get(n);l||(u=new s(a,e*h,r.count*h/o),l=new InterleavedBuffer(u,h/o),t.cache.add(n,l)),p=new InterleavedBufferAttribute(l,i,d%h/o,c)}else u=null===a?new s(r.count*i):new s(a,d,r.count*i),p=new BufferAttribute(u,i,c);if(void 0!==r.sparse){const t=WEBGL_TYPE_SIZES.SCALAR,n=WEBGL_COMPONENT_TYPES[r.sparse.indices.componentType],o=r.sparse.indices.byteOffset||0,l=r.sparse.values.byteOffset||0,d=new n(e[1],o,r.sparse.count*t),h=new s(e[2],l,r.sparse.count*i);null!==a&&(p=new BufferAttribute(p.array.slice(),p.itemSize,p.normalized));for(let e=0,t=d.length;e<t;e++){const t=d[e];if(p.setX(t,h[e*i]),i>=2&&p.setY(t,h[e*i+1]),i>=3&&p.setZ(t,h[e*i+2]),i>=4&&p.setW(t,h[e*i+3]),i>=5)throw new Error("THREE.GLTFLoader: Unsupported itemSize in sparse BufferAttribute.")}}return p}))}loadTexture(e){const t=this.json,n=this.options,r=t.textures[e].source,a=t.images[r];let i=this.textureLoader;if(a.uri){const e=n.manager.getHandler(a.uri);null!==e&&(i=e)}return this.loadTextureImage(e,r,i)}loadTextureImage(e,t,n){const r=this,a=this.json,i=a.textures[e],s=a.images[t],o=(s.uri||s.bufferView)+":"+i.sampler;if(this.textureCache[o])return this.textureCache[o];const l=this.loadImageSource(t,n).then((function(t){t.flipY=!1,t.name=i.name||s.name||"",""===t.name&&"string"==typeof s.uri&&!1===s.uri.startsWith("data:image/")&&(t.name=s.uri);const n=(a.samplers||{})[i.sampler]||{};return t.magFilter=WEBGL_FILTERS[n.magFilter]||LinearFilter,t.minFilter=WEBGL_FILTERS[n.minFilter]||LinearMipmapLinearFilter,t.wrapS=WEBGL_WRAPPINGS[n.wrapS]||RepeatWrapping,t.wrapT=WEBGL_WRAPPINGS[n.wrapT]||RepeatWrapping,r.associations.set(t,{textures:e}),t})).catch((function(){return null}));return this.textureCache[o]=l,l}loadImageSource(e,t){const n=this.json,r=this.options;if(void 0!==this.sourceCache[e])return this.sourceCache[e].then(e=>e.clone());const a=n.images[e],i=self.URL||self.webkitURL;let s=a.uri||"",o=!1;if(void 0!==a.bufferView)s=this.getDependency("bufferView",a.bufferView).then((function(e){o=!0;const t=new Blob([e],{type:a.mimeType});return s=i.createObjectURL(t),s}));else if(void 0===a.uri)throw new Error("THREE.GLTFLoader: Image "+e+" is missing URI and bufferView");const l=Promise.resolve(s).then((function(e){return new Promise((function(n,a){let i=n;!0===t.isImageBitmapLoader&&(i=function(e){const t=new Texture(e);t.needsUpdate=!0,n(t)}),t.load(LoaderUtils.resolveURL(e,r.path),i,void 0,a)}))})).then((function(e){var t;return!0===o&&i.revokeObjectURL(s),e.userData.mimeType=a.mimeType||((t=a.uri).search(/\.jpe?g($|\?)/i)>0||0===t.search(/^data\:image\/jpeg/)?"image/jpeg":t.search(/\.webp($|\?)/i)>0||0===t.search(/^data\:image\/webp/)?"image/webp":"image/png"),e})).catch((function(e){throw console.error("THREE.GLTFLoader: Couldn't load texture",s),e}));return this.sourceCache[e]=l,l}assignTexture(e,t,n,r){const a=this;return this.getDependency("texture",n.index).then((function(i){if(!i)return null;if(void 0!==n.texCoord&&n.texCoord>0&&((i=i.clone()).channel=n.texCoord),a.extensions[EXTENSIONS.KHR_TEXTURE_TRANSFORM]){const e=void 0!==n.extensions?n.extensions[EXTENSIONS.KHR_TEXTURE_TRANSFORM]:void 0;if(e){const t=a.associations.get(i);i=a.extensions[EXTENSIONS.KHR_TEXTURE_TRANSFORM].extendTexture(i,e),a.associations.set(i,t)}}return void 0!==r&&(i.colorSpace=r),e[t]=i,i}))}assignFinalMaterial(e){const t=e.geometry;let n=e.material;const r=void 0===t.attributes.tangent,a=void 0!==t.attributes.color,i=void 0===t.attributes.normal;if(e.isPoints){const e="PointsMaterial:"+n.uuid;let t=this.cache.get(e);t||(t=new PointsMaterial,Material.prototype.copy.call(t,n),t.color.copy(n.color),t.map=n.map,t.sizeAttenuation=!1,this.cache.add(e,t)),n=t}else if(e.isLine){const e="LineBasicMaterial:"+n.uuid;let t=this.cache.get(e);t||(t=new LineBasicMaterial,Material.prototype.copy.call(t,n),t.color.copy(n.color),t.map=n.map,this.cache.add(e,t)),n=t}if(r||a||i){let e="ClonedMaterial:"+n.uuid+":";r&&(e+="derivative-tangents:"),a&&(e+="vertex-colors:"),i&&(e+="flat-shading:");let t=this.cache.get(e);t||(t=n.clone(),a&&(t.vertexColors=!0),i&&(t.flatShading=!0),r&&(t.normalScale&&(t.normalScale.y*=-1),t.clearcoatNormalScale&&(t.clearcoatNormalScale.y*=-1)),this.cache.add(e,t),this.associations.set(t,this.associations.get(n))),n=t}e.material=n}getMaterialType(){return MeshStandardMaterial}loadMaterial(e){const t=this,n=this.json,r=this.extensions,a=n.materials[e];let i;const s={},o=[];if((a.extensions||{})[EXTENSIONS.KHR_MATERIALS_UNLIT]){const e=r[EXTENSIONS.KHR_MATERIALS_UNLIT];i=e.getMaterialType(),o.push(e.extendParams(s,a,t))}else{const n=a.pbrMetallicRoughness||{};if(s.color=new Color$1(1,1,1),s.opacity=1,Array.isArray(n.baseColorFactor)){const e=n.baseColorFactor;s.color.fromArray(e),s.opacity=e[3]}void 0!==n.baseColorTexture&&o.push(t.assignTexture(s,"map",n.baseColorTexture,SRGBColorSpace)),s.metalness=void 0!==n.metallicFactor?n.metallicFactor:1,s.roughness=void 0!==n.roughnessFactor?n.roughnessFactor:1,void 0!==n.metallicRoughnessTexture&&(o.push(t.assignTexture(s,"metalnessMap",n.metallicRoughnessTexture)),o.push(t.assignTexture(s,"roughnessMap",n.metallicRoughnessTexture))),i=this._invokeOne((function(t){return t.getMaterialType&&t.getMaterialType(e)})),o.push(Promise.all(this._invokeAll((function(t){return t.extendMaterialParams&&t.extendMaterialParams(e,s)}))))}!0===a.doubleSided&&(s.side=DoubleSide);const l=a.alphaMode||"OPAQUE";if("BLEND"===l?(s.transparent=!0,s.depthWrite=!1):(s.transparent=!1,"MASK"===l&&(s.alphaTest=void 0!==a.alphaCutoff?a.alphaCutoff:.5)),void 0!==a.normalTexture&&i!==MeshBasicMaterial&&(o.push(t.assignTexture(s,"normalMap",a.normalTexture)),s.normalScale=new Vector2(1,1),void 0!==a.normalTexture.scale)){const e=a.normalTexture.scale;s.normalScale.set(e,e)}return void 0!==a.occlusionTexture&&i!==MeshBasicMaterial&&(o.push(t.assignTexture(s,"aoMap",a.occlusionTexture)),void 0!==a.occlusionTexture.strength&&(s.aoMapIntensity=a.occlusionTexture.strength)),void 0!==a.emissiveFactor&&i!==MeshBasicMaterial&&(s.emissive=(new Color$1).fromArray(a.emissiveFactor)),void 0!==a.emissiveTexture&&i!==MeshBasicMaterial&&o.push(t.assignTexture(s,"emissiveMap",a.emissiveTexture,SRGBColorSpace)),Promise.all(o).then((function(){const n=new i(s);return a.name&&(n.name=a.name),assignExtrasToUserData(n,a),t.associations.set(n,{materials:e}),a.extensions&&addUnknownExtensionsToUserData(r,n,a),n}))}createUniqueName(e){const t=PropertyBinding.sanitizeNodeName(e||"");return t in this.nodeNamesUsed?t+"_"+ ++this.nodeNamesUsed[t]:(this.nodeNamesUsed[t]=0,t)}loadGeometries(e){const t=this,n=this.extensions,r=this.primitiveCache;function a(e){return n[EXTENSIONS.KHR_DRACO_MESH_COMPRESSION].decodePrimitive(e,t).then((function(n){return addPrimitiveAttributes(n,e,t)}))}const i=[];for(let n=0,s=e.length;n<s;n++){const s=e[n],o=createPrimitiveKey(s),l=r[o];if(l)i.push(l.promise);else{let e;e=s.extensions&&s.extensions[EXTENSIONS.KHR_DRACO_MESH_COMPRESSION]?a(s):addPrimitiveAttributes(new BufferGeometry,s,t),r[o]={primitive:s,promise:e},i.push(e)}}return Promise.all(i)}loadMesh(e){const t=this,n=this.json,r=this.extensions,a=n.meshes[e],i=a.primitives,s=[];for(let e=0,t=i.length;e<t;e++){const t=void 0===i[e].material?(void 0===(o=this.cache).DefaultMaterial&&(o.DefaultMaterial=new MeshStandardMaterial({color:16777215,emissive:0,metalness:1,roughness:1,transparent:!1,depthTest:!0,side:FrontSide})),o.DefaultMaterial):this.getDependency("material",i[e].material);s.push(t)}var o;return s.push(t.loadGeometries(i)),Promise.all(s).then((function(n){const s=n.slice(0,n.length-1),o=n[n.length-1],l=[];for(let n=0,d=o.length;n<d;n++){const d=o[n],h=i[n];let c;const u=s[n];if(h.mode===WEBGL_CONSTANTS.TRIANGLES||h.mode===WEBGL_CONSTANTS.TRIANGLE_STRIP||h.mode===WEBGL_CONSTANTS.TRIANGLE_FAN||void 0===h.mode)c=!0===a.isSkinnedMesh?new SkinnedMesh(d,u):new Mesh(d,u),!0===c.isSkinnedMesh&&c.normalizeSkinWeights(),h.mode===WEBGL_CONSTANTS.TRIANGLE_STRIP?c.geometry=toTrianglesDrawMode(c.geometry,TriangleStripDrawMode):h.mode===WEBGL_CONSTANTS.TRIANGLE_FAN&&(c.geometry=toTrianglesDrawMode(c.geometry,TriangleFanDrawMode));else if(h.mode===WEBGL_CONSTANTS.LINES)c=new LineSegments(d,u);else if(h.mode===WEBGL_CONSTANTS.LINE_STRIP)c=new Line(d,u);else if(h.mode===WEBGL_CONSTANTS.LINE_LOOP)c=new LineLoop(d,u);else{if(h.mode!==WEBGL_CONSTANTS.POINTS)throw new Error("THREE.GLTFLoader: Primitive mode unsupported: "+h.mode);c=new Points(d,u)}Object.keys(c.geometry.morphAttributes).length>0&&updateMorphTargets(c,a),c.name=t.createUniqueName(a.name||"mesh_"+e),assignExtrasToUserData(c,a),h.extensions&&addUnknownExtensionsToUserData(r,c,h),t.assignFinalMaterial(c),l.push(c)}for(let n=0,r=l.length;n<r;n++)t.associations.set(l[n],{meshes:e,primitives:n});if(1===l.length)return a.extensions&&addUnknownExtensionsToUserData(r,l[0],a),l[0];const d=new Group;a.extensions&&addUnknownExtensionsToUserData(r,d,a),t.associations.set(d,{meshes:e});for(let e=0,t=l.length;e<t;e++)d.add(l[e]);return d}))}loadCamera(e){let t;const n=this.json.cameras[e],r=n[n.type];if(r)return"perspective"===n.type?t=new PerspectiveCamera(MathUtils.radToDeg(r.yfov),r.aspectRatio||1,r.znear||1,r.zfar||2e6):"orthographic"===n.type&&(t=new OrthographicCamera(-r.xmag,r.xmag,r.ymag,-r.ymag,r.znear,r.zfar)),n.name&&(t.name=this.createUniqueName(n.name)),assignExtrasToUserData(t,n),Promise.resolve(t);console.warn("THREE.GLTFLoader: Missing camera parameters.")}loadSkin(e){const t=this.json.skins[e],n=[];for(let e=0,r=t.joints.length;e<r;e++)n.push(this._loadNodeShallow(t.joints[e]));return void 0!==t.inverseBindMatrices?n.push(this.getDependency("accessor",t.inverseBindMatrices)):n.push(null),Promise.all(n).then((function(e){const n=e.pop(),r=e,a=[],i=[];for(let e=0,s=r.length;e<s;e++){const s=r[e];if(s){a.push(s);const t=new Matrix4;null!==n&&t.fromArray(n.array,16*e),i.push(t)}else console.warn('THREE.GLTFLoader: Joint "%s" could not be found.',t.joints[e])}return new Skeleton(a,i)}))}loadAnimation(e){const t=this.json,n=this,r=t.animations[e],a=r.name?r.name:"animation_"+e,i=[],s=[],o=[],l=[],d=[];for(let e=0,t=r.channels.length;e<t;e++){const t=r.channels[e],n=r.samplers[t.sampler],a=t.target,h=a.node,c=void 0!==r.parameters?r.parameters[n.input]:n.input,u=void 0!==r.parameters?r.parameters[n.output]:n.output;void 0!==a.node&&(i.push(this.getDependency("node",h)),s.push(this.getDependency("accessor",c)),o.push(this.getDependency("accessor",u)),l.push(n),d.push(a))}return Promise.all([Promise.all(i),Promise.all(s),Promise.all(o),Promise.all(l),Promise.all(d)]).then((function(e){const t=e[0],r=e[1],i=e[2],s=e[3],o=e[4],l=[];for(let e=0,a=t.length;e<a;e++){const a=t[e],d=r[e],h=i[e],c=s[e],u=o[e];if(void 0===a)continue;a.updateMatrix&&a.updateMatrix();const p=n._createAnimationTracks(a,d,h,c,u);if(p)for(let e=0;e<p.length;e++)l.push(p[e])}return new AnimationClip(a,void 0,l)}))}createNodeMesh(e){const t=this.json,n=this,r=t.nodes[e];return void 0===r.mesh?null:n.getDependency("mesh",r.mesh).then((function(e){const t=n._getNodeRef(n.meshCache,r.mesh,e);return void 0!==r.weights&&t.traverse((function(e){if(e.isMesh)for(let t=0,n=r.weights.length;t<n;t++)e.morphTargetInfluences[t]=r.weights[t]})),t}))}loadNode(e){const t=this,n=this.json.nodes[e],r=t._loadNodeShallow(e),a=[],i=n.children||[];for(let e=0,n=i.length;e<n;e++)a.push(t.getDependency("node",i[e]));const s=void 0===n.skin?Promise.resolve(null):t.getDependency("skin",n.skin);return Promise.all([r,Promise.all(a),s]).then((function(e){const t=e[0],n=e[1],r=e[2];null!==r&&t.traverse((function(e){e.isSkinnedMesh&&e.bind(r,_identityMatrix)}));for(let e=0,r=n.length;e<r;e++)t.add(n[e]);return t}))}_loadNodeShallow(e){const t=this.json,n=this.extensions,r=this;if(void 0!==this.nodeCache[e])return this.nodeCache[e];const a=t.nodes[e],i=a.name?r.createUniqueName(a.name):"",s=[],o=r._invokeOne((function(t){return t.createNodeMesh&&t.createNodeMesh(e)}));return o&&s.push(o),void 0!==a.camera&&s.push(r.getDependency("camera",a.camera).then((function(e){return r._getNodeRef(r.cameraCache,a.camera,e)}))),r._invokeAll((function(t){return t.createNodeAttachment&&t.createNodeAttachment(e)})).forEach((function(e){s.push(e)})),this.nodeCache[e]=Promise.all(s).then((function(t){let s;if(s=!0===a.isBone?new Bone:t.length>1?new Group:1===t.length?t[0]:new Object3D,s!==t[0])for(let e=0,n=t.length;e<n;e++)s.add(t[e]);if(a.name&&(s.userData.name=a.name,s.name=i),assignExtrasToUserData(s,a),a.extensions&&addUnknownExtensionsToUserData(n,s,a),void 0!==a.matrix){const e=new Matrix4;e.fromArray(a.matrix),s.applyMatrix4(e)}else void 0!==a.translation&&s.position.fromArray(a.translation),void 0!==a.rotation&&s.quaternion.fromArray(a.rotation),void 0!==a.scale&&s.scale.fromArray(a.scale);return r.associations.has(s)||r.associations.set(s,{}),r.associations.get(s).nodes=e,s})),this.nodeCache[e]}loadScene(e){const t=this.extensions,n=this.json.scenes[e],r=this,a=new Group;n.name&&(a.name=r.createUniqueName(n.name)),assignExtrasToUserData(a,n),n.extensions&&addUnknownExtensionsToUserData(t,a,n);const i=n.nodes||[],s=[];for(let e=0,t=i.length;e<t;e++)s.push(r.getDependency("node",i[e]));return Promise.all(s).then((function(e){for(let t=0,n=e.length;t<n;t++)a.add(e[t]);return r.associations=(e=>{const t=new Map;for(const[e,n]of r.associations)(e instanceof Material||e instanceof Texture)&&t.set(e,n);return e.traverse(e=>{const n=r.associations.get(e);null!=n&&t.set(e,n)}),t})(a),a}))}_createAnimationTracks(e,t,n,r,a){const i=[],s=e.name?e.name:e.uuid,o=[];let l;switch(PATH_PROPERTIES[a.path]===PATH_PROPERTIES.weights?e.traverse((function(e){e.morphTargetInfluences&&o.push(e.name?e.name:e.uuid)})):o.push(s),PATH_PROPERTIES[a.path]){case PATH_PROPERTIES.weights:l=NumberKeyframeTrack;break;case PATH_PROPERTIES.rotation:l=QuaternionKeyframeTrack;break;case PATH_PROPERTIES.position:case PATH_PROPERTIES.scale:l=VectorKeyframeTrack;break;default:switch(n.itemSize){case 1:l=NumberKeyframeTrack;break;case 2:case 3:default:l=VectorKeyframeTrack}}const d=void 0!==r.interpolation?INTERPOLATION[r.interpolation]:InterpolateLinear,h=this._getArrayFromAccessor(n);for(let e=0,n=o.length;e<n;e++){const n=new l(o[e]+"."+PATH_PROPERTIES[a.path],t.array,h,d);"CUBICSPLINE"===r.interpolation&&this._createCubicSplineTrackInterpolant(n),i.push(n)}return i}_getArrayFromAccessor(e){let t=e.array;if(e.normalized){const e=getNormalizedComponentScale(t.constructor),n=new Float32Array(t.length);for(let r=0,a=t.length;r<a;r++)n[r]=t[r]*e;t=n}return t}_createCubicSplineTrackInterpolant(e){e.createInterpolant=function(e){return new(this instanceof QuaternionKeyframeTrack?GLTFCubicSplineQuaternionInterpolant:GLTFCubicSplineInterpolant)(this.times,this.values,this.getValueSize()/3,e)},e.createInterpolant.isInterpolantFactoryMethodGLTFCubicSpline=!0}}function addPrimitiveAttributes(e,t,n){const r=t.attributes,a=[];function i(t,r){return n.getDependency("accessor",t).then((function(t){e.setAttribute(r,t)}))}for(const t in r){const n=ATTRIBUTES[t]||t.toLowerCase();n in e.attributes||a.push(i(r[t],n))}if(void 0!==t.indices&&!e.index){const r=n.getDependency("accessor",t.indices).then((function(t){e.setIndex(t)}));a.push(r)}return assignExtrasToUserData(e,t),function(e,t,n){const r=t.attributes,a=new Box3;if(void 0===r.POSITION)return;{const e=n.json.accessors[r.POSITION],t=e.min,i=e.max;if(void 0===t||void 0===i)return void console.warn("THREE.GLTFLoader: Missing min/max properties for accessor POSITION.");if(a.set(new Vector3(t[0],t[1],t[2]),new Vector3(i[0],i[1],i[2])),e.normalized){const t=getNormalizedComponentScale(WEBGL_COMPONENT_TYPES[e.componentType]);a.min.multiplyScalar(t),a.max.multiplyScalar(t)}}const i=t.targets;if(void 0!==i){const e=new Vector3,t=new Vector3;for(let r=0,a=i.length;r<a;r++){const a=i[r];if(void 0!==a.POSITION){const r=n.json.accessors[a.POSITION],i=r.min,s=r.max;if(void 0!==i&&void 0!==s){if(t.setX(Math.max(Math.abs(i[0]),Math.abs(s[0]))),t.setY(Math.max(Math.abs(i[1]),Math.abs(s[1]))),t.setZ(Math.max(Math.abs(i[2]),Math.abs(s[2]))),r.normalized){const e=getNormalizedComponentScale(WEBGL_COMPONENT_TYPES[r.componentType]);t.multiplyScalar(e)}e.max(t)}else console.warn("THREE.GLTFLoader: Missing min/max properties for accessor POSITION.")}}a.expandByVector(e)}e.boundingBox=a;const s=new Sphere;a.getCenter(s.center),s.radius=a.min.distanceTo(a.max)/2,e.boundingSphere=s}(e,t,n),Promise.all(a).then((function(){return void 0!==t.targets?function(e,t,n){let r=!1,a=!1,i=!1;for(let e=0,n=t.length;e<n;e++){const n=t[e];if(void 0!==n.POSITION&&(r=!0),void 0!==n.NORMAL&&(a=!0),void 0!==n.COLOR_0&&(i=!0),r&&a&&i)break}if(!r&&!a&&!i)return Promise.resolve(e);const s=[],o=[],l=[];for(let d=0,h=t.length;d<h;d++){const h=t[d];if(r){const t=void 0!==h.POSITION?n.getDependency("accessor",h.POSITION):e.attributes.position;s.push(t)}if(a){const t=void 0!==h.NORMAL?n.getDependency("accessor",h.NORMAL):e.attributes.normal;o.push(t)}if(i){const t=void 0!==h.COLOR_0?n.getDependency("accessor",h.COLOR_0):e.attributes.color;l.push(t)}}return Promise.all([Promise.all(s),Promise.all(o),Promise.all(l)]).then((function(t){const n=t[0],s=t[1],o=t[2];return r&&(e.morphAttributes.position=n),a&&(e.morphAttributes.normal=s),i&&(e.morphAttributes.color=o),e.morphTargetsRelative=!0,e}))}(e,t.targets,n):e}))}const _taskCache=new WeakMap;class DRACOLoader extends Loader{constructor(e){super(e),this.decoderPath="",this.decoderConfig={},this.decoderBinary=null,this.decoderPending=null,this.workerLimit=4,this.workerPool=[],this.workerNextTaskID=1,this.workerSourceURL="",this.defaultAttributeIDs={position:"POSITION",normal:"NORMAL",color:"COLOR",uv:"TEX_COORD"},this.defaultAttributeTypes={position:"Float32Array",normal:"Float32Array",color:"Float32Array",uv:"Float32Array"}}setDecoderPath(e){return this.decoderPath=e,this}setDecoderConfig(e){return this.decoderConfig=e,this}setWorkerLimit(e){return this.workerLimit=e,this}load(e,t,n,r){const a=new FileLoader(this.manager);a.setPath(this.path),a.setResponseType("arraybuffer"),a.setRequestHeader(this.requestHeader),a.setWithCredentials(this.withCredentials),a.load(e,e=>{this.parse(e,t,r)},n,r)}parse(e,t,n){this.decodeDracoFile(e,t,null,null,SRGBColorSpace).catch(n)}decodeDracoFile(e,t,n,r,a=LinearSRGBColorSpace){const i={attributeIDs:n||this.defaultAttributeIDs,attributeTypes:r||this.defaultAttributeTypes,useUniqueIDs:!!n,vertexColorSpace:a};return this.decodeGeometry(e,i).then(t)}decodeGeometry(e,t){const n=JSON.stringify(t);if(_taskCache.has(e)){const t=_taskCache.get(e);if(t.key===n)return t.promise;if(0===e.byteLength)throw new Error("THREE.DRACOLoader: Unable to re-decode a buffer with different settings. Buffer has already been transferred.")}let r;const a=this.workerNextTaskID++,i=e.byteLength,s=this._getWorker(a,i).then(n=>(r=n,new Promise((n,i)=>{r._callbacks[a]={resolve:n,reject:i},r.postMessage({type:"decode",id:a,taskConfig:t,buffer:e},[e])}))).then(e=>this._createGeometry(e.geometry));return s.catch(()=>!0).then(()=>{r&&a&&this._releaseTask(r,a)}),_taskCache.set(e,{key:n,promise:s}),s}_createGeometry(e){const t=new BufferGeometry;e.index&&t.setIndex(new BufferAttribute(e.index.array,1));for(let n=0;n<e.attributes.length;n++){const r=e.attributes[n],a=r.name,i=r.array,s=r.itemSize,o=new BufferAttribute(i,s);"color"===a&&(this._assignVertexColorSpace(o,r.vertexColorSpace),o.normalized=i instanceof Float32Array==0),t.setAttribute(a,o)}return t}_assignVertexColorSpace(e,t){if(t!==SRGBColorSpace)return;const n=new Color$1;for(let t=0,r=e.count;t<r;t++)n.fromBufferAttribute(e,t).convertSRGBToLinear(),e.setXYZ(t,n.r,n.g,n.b)}_loadLibrary(e,t){const n=new FileLoader(this.manager);return n.setPath(this.decoderPath),n.setResponseType(t),n.setWithCredentials(this.withCredentials),new Promise((t,r)=>{n.load(e,t,void 0,r)})}preload(){return this._initDecoder(),this}_initDecoder(){if(this.decoderPending)return this.decoderPending;const e="object"!=typeof WebAssembly||"js"===this.decoderConfig.type,t=[];return e?t.push(this._loadLibrary("draco_decoder.js","text")):(t.push(this._loadLibrary("draco_wasm_wrapper.js","text")),t.push(this._loadLibrary("draco_decoder.wasm","arraybuffer"))),this.decoderPending=Promise.all(t).then(t=>{const n=t[0];e||(this.decoderConfig.wasmBinary=t[1]);const r=DRACOWorker.toString(),a=["/* draco decoder */",n,"","/* worker */",r.substring(r.indexOf("{")+1,r.lastIndexOf("}"))].join("\n");this.workerSourceURL=URL.createObjectURL(new Blob([a]))}),this.decoderPending}_getWorker(e,t){return this._initDecoder().then(()=>{if(this.workerPool.length<this.workerLimit){const e=new Worker(this.workerSourceURL);e._callbacks={},e._taskCosts={},e._taskLoad=0,e.postMessage({type:"init",decoderConfig:this.decoderConfig}),e.onmessage=function(t){const n=t.data;switch(n.type){case"decode":e._callbacks[n.id].resolve(n);break;case"error":e._callbacks[n.id].reject(n);break;default:console.error('THREE.DRACOLoader: Unexpected message, "'+n.type+'"')}},this.workerPool.push(e)}else this.workerPool.sort((function(e,t){return e._taskLoad>t._taskLoad?-1:1}));const n=this.workerPool[this.workerPool.length-1];return n._taskCosts[e]=t,n._taskLoad+=t,n})}_releaseTask(e,t){e._taskLoad-=e._taskCosts[t],delete e._callbacks[t],delete e._taskCosts[t]}debug(){this.workerPool.map(e=>e._taskLoad)}dispose(){for(let e=0;e<this.workerPool.length;++e)this.workerPool[e].terminate();return this.workerPool.length=0,""!==this.workerSourceURL&&URL.revokeObjectURL(this.workerSourceURL),this}}function DRACOWorker(){let e,t;function n(e,t,n,r,a,i){const s=i.num_components(),o=n.num_points()*s,l=o*a.BYTES_PER_ELEMENT,d=function(e,t){switch(t){case Float32Array:return e.DT_FLOAT32;case Int8Array:return e.DT_INT8;case Int16Array:return e.DT_INT16;case Int32Array:return e.DT_INT32;case Uint8Array:return e.DT_UINT8;case Uint16Array:return e.DT_UINT16;case Uint32Array:return e.DT_UINT32}}(e,a),h=e._malloc(l);t.GetAttributeDataArrayForAllPoints(n,i,d,l,h);const c=new a(e.HEAPF32.buffer,h,o).slice();return e._free(h),{name:r,array:c,itemSize:s}}onmessage=function(r){const a=r.data;switch(a.type){case"init":e=a.decoderConfig,t=new Promise((function(t){e.onModuleLoaded=function(e){t({draco:e})},DracoDecoderModule(e)}));break;case"decode":const r=a.buffer,i=a.taskConfig;t.then(e=>{const t=e.draco,s=new t.Decoder;try{const e=function(e,t,r,a){const i=a.attributeIDs,s=a.attributeTypes;let o,l;const d=t.GetEncodedGeometryType(r);if(d===e.TRIANGULAR_MESH)o=new e.Mesh,l=t.DecodeArrayToMesh(r,r.byteLength,o);else{if(d!==e.POINT_CLOUD)throw new Error("THREE.DRACOLoader: Unexpected geometry type.");o=new e.PointCloud,l=t.DecodeArrayToPointCloud(r,r.byteLength,o)}if(!l.ok()||0===o.ptr)throw new Error("THREE.DRACOLoader: Decoding failed: "+l.error_msg());const h={index:null,attributes:[]};for(const r in i){const l=self[s[r]];let d,c;if(a.useUniqueIDs)c=i[r],d=t.GetAttributeByUniqueId(o,c);else{if(c=t.GetAttributeId(o,e[i[r]]),-1===c)continue;d=t.GetAttribute(o,c)}const u=n(e,t,o,r,l,d);"color"===r&&(u.vertexColorSpace=a.vertexColorSpace),h.attributes.push(u)}return d===e.TRIANGULAR_MESH&&(h.index=function(e,t,n){const r=3*n.num_faces(),a=4*r,i=e._malloc(a);t.GetTrianglesUInt32Array(n,a,i);const s=new Uint32Array(e.HEAPF32.buffer,i,r).slice();return e._free(i),{array:s,itemSize:1}}(e,t,o)),e.destroy(o),h}(t,s,new Int8Array(r),i),o=e.attributes.map(e=>e.array.buffer);e.index&&o.push(e.index.array.buffer),self.postMessage({type:"decode",id:a.id,geometry:e},o)}catch(e){console.error(e),self.postMessage({type:"error",id:a.id,error:e.message})}finally{t.destroy(s)}})}}}const DRACO_LIB_FILES={"draco_wasm_wrapper.js":"static/draco_wasm_wrapper-6263f3a4b71cdf3b.js","draco_decoder.wasm":"static/draco_decoder-b048235474cbf09e.wasm","draco_decoder.js":"static/draco_decoder-dc7f397e2a2ebac4.js"};class LocalStorageHelper{constructor(e){this._context_=e}getStore(e="rml_default"){return this._localStorage.getItem(e)||{entries:[]}}saveStore(e,t){this._localStorage.setItem(e,t)}addItem(e,t,n="rml_default",r=5){const a=this.getStore(n),i=a.entries.find(t=>t.id===e);if(i?(i.payload=t,i.date=Date.now()):a.entries.push({id:e,date:Date.now(),payload:t}),a.entries.length>r)for(a.entries.sort((e,t)=>t.date-e.date);a.entries.length>r;)a.entries.pop();this.saveStore(n,a)}getItem(e,t="rml_default"){const n=this.getStore(t).entries.find(t=>t.id===e);return n?n.payload:null}}__decorate([inject],LocalStorageHelper.prototype,"_localStorage",void 0);const toRadiant=function(e){return e*(Math.PI/180)},toDegrees=function(e){return e*(180/Math.PI)},getIdealDistance=function(e,t,n,r,a,i){e=Math.sqrt(e*e+n*n);const s=a/i,o=2*Math.atan(Math.tan(r*Math.PI/180/2)*s)*180/Math.PI,l=toRadiant(r),d=t/2/Math.tan(l/2),h=e/(2*Math.atan(Math.PI*o/360));return Math.max(d,h)},round=function(e){return Math.round(1e3*e)/1e3},getDelta=function(e,t){return Math.abs(e.y-t.y)+Math.abs(e.x-t.x)},convertToTHREE=e=>new Vector3(e.x/1e3,e.z/1e3,e.y/-1e3),convertToThreeDimensions=e=>new Vector3(e.x/1e3,e.z/1e3,e.y/1e3),convertToKernel=e=>({x:Math.round(1e3*e.x),y:Math.round(-1e3*e.z),z:Math.round(1e3*e.y)}),utilityStringToUTF16=e=>decodeURIComponent(encodeURIComponent(e)),convertCObject=e=>{if(!e){const t=typeof e;return"number"===t||"boolean"===t?e:null}if(!e.hasOwnProperty("size")&&e.size&&"function"==typeof e.size){let t=utilityToArray(e);for(let e=0;e<t.length;e++)t[e]=convertCObject(t[e]);return"string"==typeof t?utilityStringToUTF16(t):t}if("object"==typeof e)for(let t in e)e.hasOwnProperty(t)&&(e[t]=convertCObject(e[t]));return"string"==typeof e?utilityStringToUTF16(e):e},utilityToArray=e=>{let t=[];if(e){let n=e.size();for(let r=0;r<n;r++)t.push(e.get(r))}return t},convertToThreeMatrix=e=>{let t=new Matrix4,n=convertCObject(e);return t.fromArray(n),t.transpose(),(e=>{let t=new Matrix4;t.set(1,0,0,0,0,0,1,0,0,-1,0,0,0,0,0,1),t.scale(new Vector3(.001,.001,.001));let n=new Matrix4;return n.set(1,0,0,0,0,0,-1,0,0,1,0,0,0,0,0,1),n.scale(new Vector3(1e3,1e3,1e3)),t.multiply(e).multiply(n)})(t)};function colorToString(e,t){var n=e.__state.conversionName.toString(),r=Math.round(e.r),a=Math.round(e.g),i=Math.round(e.b),s=e.a,o=Math.round(e.h),l=e.s.toFixed(1),d=e.v.toFixed(1);if(t||"THREE_CHAR_HEX"===n||"SIX_CHAR_HEX"===n){for(var h=e.hex.toString(16);h.length<6;)h="0"+h;return"#"+h}return"CSS_RGB"===n?"rgb("+r+","+a+","+i+")":"CSS_RGBA"===n?"rgba("+r+","+a+","+i+","+s+")":"HEX"===n?"0x"+e.hex.toString(16):"RGB_ARRAY"===n?"["+r+","+a+","+i+"]":"RGBA_ARRAY"===n?"["+r+","+a+","+i+","+s+"]":"RGB_OBJ"===n?"{r:"+r+",g:"+a+",b:"+i+"}":"RGBA_OBJ"===n?"{r:"+r+",g:"+a+",b:"+i+",a:"+s+"}":"HSV_OBJ"===n?"{h:"+o+",s:"+l+",v:"+d+"}":"HSVA_OBJ"===n?"{h:"+o+",s:"+l+",v:"+d+",a:"+s+"}":"unknown format"}var ARR_EACH=Array.prototype.forEach,ARR_SLICE=Array.prototype.slice,Common={BREAK:{},extend:function(e){return this.each(ARR_SLICE.call(arguments,1),(function(t){(this.isObject(t)?Object.keys(t):[]).forEach(function(n){this.isUndefined(t[n])||(e[n]=t[n])}.bind(this))}),this),e},defaults:function(e){return this.each(ARR_SLICE.call(arguments,1),(function(t){(this.isObject(t)?Object.keys(t):[]).forEach(function(n){this.isUndefined(e[n])&&(e[n]=t[n])}.bind(this))}),this),e},compose:function(){var e=ARR_SLICE.call(arguments);return function(){for(var t=ARR_SLICE.call(arguments),n=e.length-1;n>=0;n--)t=[e[n].apply(this,t)];return t[0]}},each:function(e,t,n){if(e)if(ARR_EACH&&e.forEach&&e.forEach===ARR_EACH)e.forEach(t,n);else if(e.length===e.length+0){var r,a=void 0;for(a=0,r=e.length;a<r;a++)if(a in e&&t.call(n,e[a],a)===this.BREAK)return}else for(var i in e)if(t.call(n,e[i],i)===this.BREAK)return},defer:function(e){setTimeout(e,0)},debounce:function(e,t,n){var r=void 0;return function(){var a=this,i=arguments;function s(){r=null,n||e.apply(a,i)}var o=n||!r;clearTimeout(r),r=setTimeout(s,t),o&&e.apply(a,i)}},toArray:function(e){return e.toArray?e.toArray():ARR_SLICE.call(e)},isUndefined:function(e){return void 0===e},isNull:function(e){return null===e},isNaN:function(e){function t(t){return e.apply(this,arguments)}return t.toString=function(){return e.toString()},t}((function(e){return isNaN(e)})),isArray:Array.isArray||function(e){return e.constructor===Array},isObject:function(e){return e===Object(e)},isNumber:function(e){return e===e+0},isString:function(e){return e===e+""},isBoolean:function(e){return!1===e||!0===e},isFunction:function(e){return e instanceof Function}},INTERPRETATIONS=[{litmus:Common.isString,conversions:{THREE_CHAR_HEX:{read:function(e){var t=e.match(/^#([A-F0-9])([A-F0-9])([A-F0-9])$/i);return null!==t&&{space:"HEX",hex:parseInt("0x"+t[1].toString()+t[1].toString()+t[2].toString()+t[2].toString()+t[3].toString()+t[3].toString(),0)}},write:colorToString},SIX_CHAR_HEX:{read:function(e){var t=e.match(/^#([A-F0-9]{6})$/i);return null!==t&&{space:"HEX",hex:parseInt("0x"+t[1].toString(),0)}},write:colorToString},CSS_RGB:{read:function(e){var t=e.match(/^rgb\(\s*(\S+)\s*,\s*(\S+)\s*,\s*(\S+)\s*\)/);return null!==t&&{space:"RGB",r:parseFloat(t[1]),g:parseFloat(t[2]),b:parseFloat(t[3])}},write:colorToString},CSS_RGBA:{read:function(e){var t=e.match(/^rgba\(\s*(\S+)\s*,\s*(\S+)\s*,\s*(\S+)\s*,\s*(\S+)\s*\)/);return null!==t&&{space:"RGB",r:parseFloat(t[1]),g:parseFloat(t[2]),b:parseFloat(t[3]),a:parseFloat(t[4])}},write:colorToString}}},{litmus:Common.isNumber,conversions:{HEX:{read:function(e){return{space:"HEX",hex:e,conversionName:"HEX"}},write:function(e){return e.hex}}}},{litmus:Common.isArray,conversions:{RGB_ARRAY:{read:function(e){return 3===e.length&&{space:"RGB",r:e[0],g:e[1],b:e[2]}},write:function(e){return[e.r,e.g,e.b]}},RGBA_ARRAY:{read:function(e){return 4===e.length&&{space:"RGB",r:e[0],g:e[1],b:e[2],a:e[3]}},write:function(e){return[e.r,e.g,e.b,e.a]}}}},{litmus:Common.isObject,conversions:{RGBA_OBJ:{read:function(e){return!!(Common.isNumber(e.r)&&Common.isNumber(e.g)&&Common.isNumber(e.b)&&Common.isNumber(e.a))&&{space:"RGB",r:e.r,g:e.g,b:e.b,a:e.a}},write:function(e){return{r:e.r,g:e.g,b:e.b,a:e.a}}},RGB_OBJ:{read:function(e){return!!(Common.isNumber(e.r)&&Common.isNumber(e.g)&&Common.isNumber(e.b))&&{space:"RGB",r:e.r,g:e.g,b:e.b}},write:function(e){return{r:e.r,g:e.g,b:e.b}}},HSVA_OBJ:{read:function(e){return!!(Common.isNumber(e.h)&&Common.isNumber(e.s)&&Common.isNumber(e.v)&&Common.isNumber(e.a))&&{space:"HSV",h:e.h,s:e.s,v:e.v,a:e.a}},write:function(e){return{h:e.h,s:e.s,v:e.v,a:e.a}}},HSV_OBJ:{read:function(e){return!!(Common.isNumber(e.h)&&Common.isNumber(e.s)&&Common.isNumber(e.v))&&{space:"HSV",h:e.h,s:e.s,v:e.v}},write:function(e){return{h:e.h,s:e.s,v:e.v}}}}}],result=void 0,toReturn=void 0,interpret=function(){toReturn=!1;var e=arguments.length>1?Common.toArray(arguments):arguments[0];return Common.each(INTERPRETATIONS,(function(t){if(t.litmus(e))return Common.each(t.conversions,(function(t,n){if(result=t.read(e),!1===toReturn&&!1!==result)return toReturn=result,result.conversionName=n,result.conversion=t,Common.BREAK})),Common.BREAK})),toReturn},tmpComponent=void 0,ColorMath={hsv_to_rgb:function(e,t,n){var r=Math.floor(e/60)%6,a=e/60-Math.floor(e/60),i=n*(1-t),s=n*(1-a*t),o=n*(1-(1-a)*t),l=[[n,o,i],[s,n,i],[i,n,o],[i,s,n],[o,i,n],[n,i,s]][r];return{r:255*l[0],g:255*l[1],b:255*l[2]}},rgb_to_hsv:function(e,t,n){var r=Math.min(e,t,n),a=Math.max(e,t,n),i=a-r,s=void 0;return 0===a?{h:NaN,s:0,v:0}:(s=e===a?(t-n)/i:t===a?2+(n-e)/i:4+(e-t)/i,(s/=6)<0&&(s+=1),{h:360*s,s:i/a,v:a/255})},rgb_to_hex:function(e,t,n){var r=this.hex_with_component(0,2,e);return r=this.hex_with_component(r,1,t),this.hex_with_component(r,0,n)},component_from_hex:function(e,t){return e>>8*t&255},hex_with_component:function(e,t,n){return n<<(tmpComponent=8*t)|e&~(255<<tmpComponent)}},_typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},classCallCheck=function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")},createClass=function(){function e(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}return function(t,n,r){return n&&e(t.prototype,n),r&&e(t,r),t}}(),get=function e(t,n,r){null===t&&(t=Function.prototype);var a=Object.getOwnPropertyDescriptor(t,n);if(void 0===a){var i=Object.getPrototypeOf(t);return null===i?void 0:e(i,n,r)}if("value"in a)return a.value;var s=a.get;return void 0!==s?s.call(r):void 0},inherits=function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Super expression must either be null or a function, not "+typeof t);e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}}),t&&(Object.setPrototypeOf?Object.setPrototypeOf(e,t):e.__proto__=t)},possibleConstructorReturn=function(e,t){if(!e)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!t||"object"!=typeof t&&"function"!=typeof t?e:t},Color=function(){function e(){if(classCallCheck(this,e),this.__state=interpret.apply(this,arguments),!1===this.__state)throw new Error("Failed to interpret color arguments");this.__state.a=this.__state.a||1}return createClass(e,[{key:"toString",value:function(){return colorToString(this)}},{key:"toHexString",value:function(){return colorToString(this,!0)}},{key:"toOriginal",value:function(){return this.__state.conversion.write(this)}}]),e}();function defineRGBComponent(e,t,n){Object.defineProperty(e,t,{get:function(){return"RGB"===this.__state.space||Color.recalculateRGB(this,t,n),this.__state[t]},set:function(e){"RGB"!==this.__state.space&&(Color.recalculateRGB(this,t,n),this.__state.space="RGB"),this.__state[t]=e}})}function defineHSVComponent(e,t){Object.defineProperty(e,t,{get:function(){return"HSV"===this.__state.space||Color.recalculateHSV(this),this.__state[t]},set:function(e){"HSV"!==this.__state.space&&(Color.recalculateHSV(this),this.__state.space="HSV"),this.__state[t]=e}})}Color.recalculateRGB=function(e,t,n){if("HEX"===e.__state.space)e.__state[t]=ColorMath.component_from_hex(e.__state.hex,n);else{if("HSV"!==e.__state.space)throw new Error("Corrupted color state");Common.extend(e.__state,ColorMath.hsv_to_rgb(e.__state.h,e.__state.s,e.__state.v))}},Color.recalculateHSV=function(e){var t=ColorMath.rgb_to_hsv(e.r,e.g,e.b);Common.extend(e.__state,{s:t.s,v:t.v}),Common.isNaN(t.h)?Common.isUndefined(e.__state.h)&&(e.__state.h=0):e.__state.h=t.h},Color.COMPONENTS=["r","g","b","h","s","v","hex","a"],defineRGBComponent(Color.prototype,"r",2),defineRGBComponent(Color.prototype,"g",1),defineRGBComponent(Color.prototype,"b",0),defineHSVComponent(Color.prototype,"h"),defineHSVComponent(Color.prototype,"s"),defineHSVComponent(Color.prototype,"v"),Object.defineProperty(Color.prototype,"a",{get:function(){return this.__state.a},set:function(e){this.__state.a=e}}),Object.defineProperty(Color.prototype,"hex",{get:function(){return"HEX"!==this.__state.space&&(this.__state.hex=ColorMath.rgb_to_hex(this.r,this.g,this.b),this.__state.space="HEX"),this.__state.hex},set:function(e){this.__state.space="HEX",this.__state.hex=e}});var Controller=function(){function e(t,n){classCallCheck(this,e),this.initialValue=t[n],this.domElement=document.createElement("div"),this.object=t,this.property=n,this.__onChange=void 0,this.__onFinishChange=void 0}return createClass(e,[{key:"onChange",value:function(e){return this.__onChange=e,this}},{key:"onFinishChange",value:function(e){return this.__onFinishChange=e,this}},{key:"setValue",value:function(e){return this.object[this.property]=e,this.__onChange&&this.__onChange.call(this,e),this.updateDisplay(),this}},{key:"getValue",value:function(){return this.object[this.property]}},{key:"updateDisplay",value:function(){return this}},{key:"isModified",value:function(){return this.initialValue!==this.getValue()}}]),e}(),EVENT_MAP_INV={};Common.each({HTMLEvents:["change"],MouseEvents:["click","mousemove","mousedown","mouseup","mouseover"],KeyboardEvents:["keydown"]},(function(e,t){Common.each(e,(function(e){EVENT_MAP_INV[e]=t}))}));var CSS_VALUE_PIXELS=/(\d+(\.\d+)?)px/;function cssValueToPixels(e){if("0"===e||Common.isUndefined(e))return 0;var t=e.match(CSS_VALUE_PIXELS);return Common.isNull(t)?0:parseFloat(t[1])}var dom={makeSelectable:function(e,t){void 0!==e&&void 0!==e.style&&(e.onselectstart=t?function(){return!1}:function(){},e.style.MozUserSelect=t?"auto":"none",e.style.KhtmlUserSelect=t?"auto":"none",e.unselectable=t?"on":"off")},makeFullscreen:function(e,t,n){var r=n,a=t;Common.isUndefined(a)&&(a=!0),Common.isUndefined(r)&&(r=!0),e.style.position="absolute",a&&(e.style.left=0,e.style.right=0),r&&(e.style.top=0,e.style.bottom=0)},fakeEvent:function(e,t,n,r){var a=n||{},i=EVENT_MAP_INV[t];if(!i)throw new Error("Event type "+t+" not supported.");var s=document.createEvent(i);switch(i){case"MouseEvents":var o=a.x||a.clientX||0,l=a.y||a.clientY||0;s.initMouseEvent(t,a.bubbles||!1,a.cancelable||!0,window,a.clickCount||1,0,0,o,l,!1,!1,!1,!1,0,null);break;case"KeyboardEvents":var d=s.initKeyboardEvent||s.initKeyEvent;Common.defaults(a,{cancelable:!0,ctrlKey:!1,altKey:!1,shiftKey:!1,metaKey:!1,keyCode:void 0,charCode:void 0}),d(t,a.bubbles||!1,a.cancelable,window,a.ctrlKey,a.altKey,a.shiftKey,a.metaKey,a.keyCode,a.charCode);break;default:s.initEvent(t,a.bubbles||!1,a.cancelable||!0)}Common.defaults(s,r),e.dispatchEvent(s)},bind:function(e,t,n,r){var a=r||!1;return e.addEventListener?e.addEventListener(t,n,a):e.attachEvent&&e.attachEvent("on"+t,n),dom},unbind:function(e,t,n,r){var a=r||!1;return e.removeEventListener?e.removeEventListener(t,n,a):e.detachEvent&&e.detachEvent("on"+t,n),dom},addClass:function(e,t){if(void 0===e.className)e.className=t;else if(e.className!==t){var n=e.className.split(/ +/);-1===n.indexOf(t)&&(n.push(t),e.className=n.join(" ").replace(/^\s+/,"").replace(/\s+$/,""))}return dom},removeClass:function(e,t){if(t)if(e.className===t)e.removeAttribute("class");else{var n=e.className.split(/ +/),r=n.indexOf(t);-1!==r&&(n.splice(r,1),e.className=n.join(" "))}else e.className=void 0;return dom},hasClass:function(e,t){return new RegExp("(?:^|\\s+)"+t+"(?:\\s+|$)").test(e.className)||!1},getWidth:function(e){var t=getComputedStyle(e);return cssValueToPixels(t["border-left-width"])+cssValueToPixels(t["border-right-width"])+cssValueToPixels(t["padding-left"])+cssValueToPixels(t["padding-right"])+cssValueToPixels(t.width)},getHeight:function(e){var t=getComputedStyle(e);return cssValueToPixels(t["border-top-width"])+cssValueToPixels(t["border-bottom-width"])+cssValueToPixels(t["padding-top"])+cssValueToPixels(t["padding-bottom"])+cssValueToPixels(t.height)},getOffset:function(e){var t=e,n={left:0,top:0};if(t.offsetParent)do{n.left+=t.offsetLeft,n.top+=t.offsetTop,t=t.offsetParent}while(t);return n},isActive:function(e){return e===document.activeElement&&(e.type||e.href)}},BooleanController=function(e){function t(e,n){classCallCheck(this,t);var r=possibleConstructorReturn(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e,n)),a=r;return r.__prev=r.getValue(),r.__checkbox=document.createElement("input"),r.__checkbox.setAttribute("type","checkbox"),dom.bind(r.__checkbox,"change",(function(){a.setValue(!a.__prev)}),!1),r.domElement.appendChild(r.__checkbox),r.updateDisplay(),r}return inherits(t,Controller),createClass(t,[{key:"setValue",value:function(e){var n=get(t.prototype.__proto__||Object.getPrototypeOf(t.prototype),"setValue",this).call(this,e);return this.__onFinishChange&&this.__onFinishChange.call(this,this.getValue()),this.__prev=this.getValue(),n}},{key:"updateDisplay",value:function(){return!0===this.getValue()?(this.__checkbox.setAttribute("checked","checked"),this.__checkbox.checked=!0,this.__prev=!0):(this.__checkbox.checked=!1,this.__prev=!1),get(t.prototype.__proto__||Object.getPrototypeOf(t.prototype),"updateDisplay",this).call(this)}}]),t}(),OptionController=function(e){function t(e,n,r){classCallCheck(this,t);var a=possibleConstructorReturn(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e,n)),i=r,s=a;if(a.__select=document.createElement("select"),Common.isArray(i)){var o={};Common.each(i,(function(e){o[e]=e})),i=o}return Common.each(i,(function(e,t){var n=document.createElement("option");n.innerHTML=t,n.setAttribute("value",e),s.__select.appendChild(n)})),a.updateDisplay(),dom.bind(a.__select,"change",(function(){var e=this.options[this.selectedIndex].value;s.setValue(e)})),a.domElement.appendChild(a.__select),a}return inherits(t,Controller),createClass(t,[{key:"setValue",value:function(e){var n=get(t.prototype.__proto__||Object.getPrototypeOf(t.prototype),"setValue",this).call(this,e);return this.__onFinishChange&&this.__onFinishChange.call(this,this.getValue()),n}},{key:"updateDisplay",value:function(){return dom.isActive(this.__select)?this:(this.__select.value=this.getValue(),get(t.prototype.__proto__||Object.getPrototypeOf(t.prototype),"updateDisplay",this).call(this))}}]),t}(),StringController=function(e){function t(e,n){classCallCheck(this,t);var r=possibleConstructorReturn(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e,n)),a=r;function i(){a.setValue(a.__input.value)}return r.__input=document.createElement("input"),r.__input.setAttribute("type","text"),dom.bind(r.__input,"keyup",i),dom.bind(r.__input,"change",i),dom.bind(r.__input,"blur",(function(){a.__onFinishChange&&a.__onFinishChange.call(a,a.getValue())})),dom.bind(r.__input,"keydown",(function(e){13===e.keyCode&&this.blur()})),r.updateDisplay(),r.domElement.appendChild(r.__input),r}return inherits(t,Controller),createClass(t,[{key:"updateDisplay",value:function(){return dom.isActive(this.__input)||(this.__input.value=this.getValue()),get(t.prototype.__proto__||Object.getPrototypeOf(t.prototype),"updateDisplay",this).call(this)}}]),t}();function numDecimals(e){var t=e.toString();return t.indexOf(".")>-1?t.length-t.indexOf(".")-1:0}var NumberController=function(e){function t(e,n,r){classCallCheck(this,t);var a=possibleConstructorReturn(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e,n)),i=r||{};return a.__min=i.min,a.__max=i.max,a.__step=i.step,Common.isUndefined(a.__step)?0===a.initialValue?a.__impliedStep=1:a.__impliedStep=Math.pow(10,Math.floor(Math.log(Math.abs(a.initialValue))/Math.LN10))/10:a.__impliedStep=a.__step,a.__precision=numDecimals(a.__impliedStep),a}return inherits(t,Controller),createClass(t,[{key:"setValue",value:function(e){var n=e;return void 0!==this.__min&&n<this.__min?n=this.__min:void 0!==this.__max&&n>this.__max&&(n=this.__max),void 0!==this.__step&&n%this.__step!=0&&(n=Math.round(n/this.__step)*this.__step),get(t.prototype.__proto__||Object.getPrototypeOf(t.prototype),"setValue",this).call(this,n)}},{key:"min",value:function(e){return this.__min=e,this}},{key:"max",value:function(e){return this.__max=e,this}},{key:"step",value:function(e){return this.__step=e,this.__impliedStep=e,this.__precision=numDecimals(e),this}}]),t}(),NumberControllerBox=function(e){function t(e,n,r){classCallCheck(this,t);var a=possibleConstructorReturn(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e,n,r));a.__truncationSuspended=!1;var i=a,s=void 0;function o(){i.__onFinishChange&&i.__onFinishChange.call(i,i.getValue())}function l(e){var t=s-e.clientY;i.setValue(i.getValue()+t*i.__impliedStep),s=e.clientY}function d(){dom.unbind(window,"mousemove",l),dom.unbind(window,"mouseup",d),o()}return a.__input=document.createElement("input"),a.__input.setAttribute("type","text"),dom.bind(a.__input,"change",(function(){var e=parseFloat(i.__input.value);Common.isNaN(e)||i.setValue(e)})),dom.bind(a.__input,"blur",(function(){o()})),dom.bind(a.__input,"mousedown",(function(e){dom.bind(window,"mousemove",l),dom.bind(window,"mouseup",d),s=e.clientY})),dom.bind(a.__input,"keydown",(function(e){13===e.keyCode&&(i.__truncationSuspended=!0,this.blur(),i.__truncationSuspended=!1,o())})),a.updateDisplay(),a.domElement.appendChild(a.__input),a}return inherits(t,NumberController),createClass(t,[{key:"updateDisplay",value:function(){var e,n,r;return this.__input.value=this.__truncationSuspended?this.getValue():(e=this.getValue(),n=this.__precision,r=Math.pow(10,n),Math.round(e*r)/r),get(t.prototype.__proto__||Object.getPrototypeOf(t.prototype),"updateDisplay",this).call(this)}}]),t}();function map(e,t,n,r,a){return r+(e-t)/(n-t)*(a-r)}var NumberControllerSlider=function(e){function t(e,n,r,a,i){classCallCheck(this,t);var s=possibleConstructorReturn(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e,n,{min:r,max:a,step:i})),o=s;function l(e){e.preventDefault();var t=o.__background.getBoundingClientRect();return o.setValue(map(e.clientX,t.left,t.right,o.__min,o.__max)),!1}function d(){dom.unbind(window,"mousemove",l),dom.unbind(window,"mouseup",d),o.__onFinishChange&&o.__onFinishChange.call(o,o.getValue())}function h(e){var t=e.touches[0].clientX,n=o.__background.getBoundingClientRect();o.setValue(map(t,n.left,n.right,o.__min,o.__max))}function c(){dom.unbind(window,"touchmove",h),dom.unbind(window,"touchend",c),o.__onFinishChange&&o.__onFinishChange.call(o,o.getValue())}return s.__background=document.createElement("div"),s.__foreground=document.createElement("div"),dom.bind(s.__background,"mousedown",(function(e){document.activeElement.blur(),dom.bind(window,"mousemove",l),dom.bind(window,"mouseup",d),l(e)})),dom.bind(s.__background,"touchstart",(function(e){1===e.touches.length&&(dom.bind(window,"touchmove",h),dom.bind(window,"touchend",c),h(e))})),dom.addClass(s.__background,"slider"),dom.addClass(s.__foreground,"slider-fg"),s.updateDisplay(),s.__background.appendChild(s.__foreground),s.domElement.appendChild(s.__background),s}return inherits(t,NumberController),createClass(t,[{key:"updateDisplay",value:function(){var e=(this.getValue()-this.__min)/(this.__max-this.__min);return this.__foreground.style.width=100*e+"%",get(t.prototype.__proto__||Object.getPrototypeOf(t.prototype),"updateDisplay",this).call(this)}}]),t}(),FunctionController=function(e){function t(e,n,r){classCallCheck(this,t);var a=possibleConstructorReturn(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e,n)),i=a;return a.__button=document.createElement("div"),a.__button.innerHTML=void 0===r?"Fire":r,dom.bind(a.__button,"click",(function(e){return e.preventDefault(),i.fire(),!1})),dom.addClass(a.__button,"button"),a.domElement.appendChild(a.__button),a}return inherits(t,Controller),createClass(t,[{key:"fire",value:function(){this.__onChange&&this.__onChange.call(this),this.getValue().call(this.object),this.__onFinishChange&&this.__onFinishChange.call(this,this.getValue())}}]),t}(),ColorController=function(e){function t(e,n){classCallCheck(this,t);var r=possibleConstructorReturn(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e,n));r.__color=new Color(r.getValue()),r.__temp=new Color(0);var a=r;r.domElement=document.createElement("div"),dom.makeSelectable(r.domElement,!1),r.__selector=document.createElement("div"),r.__selector.className="selector",r.__saturation_field=document.createElement("div"),r.__saturation_field.className="saturation-field",r.__field_knob=document.createElement("div"),r.__field_knob.className="field-knob",r.__field_knob_border="2px solid ",r.__hue_knob=document.createElement("div"),r.__hue_knob.className="hue-knob",r.__hue_field=document.createElement("div"),r.__hue_field.className="hue-field",r.__input=document.createElement("input"),r.__input.type="text",r.__input_textShadow="0 1px 1px ",dom.bind(r.__input,"keydown",(function(e){13===e.keyCode&&c.call(this)})),dom.bind(r.__input,"blur",c),dom.bind(r.__selector,"mousedown",(function(){dom.addClass(this,"drag").bind(window,"mouseup",(function(){dom.removeClass(a.__selector,"drag")}))})),dom.bind(r.__selector,"touchstart",(function(){dom.addClass(this,"drag").bind(window,"touchend",(function(){dom.removeClass(a.__selector,"drag")}))}));var i,s=document.createElement("div");function o(e){p(e),dom.bind(window,"mousemove",p),dom.bind(window,"touchmove",p),dom.bind(window,"mouseup",d),dom.bind(window,"touchend",d)}function l(e){m(e),dom.bind(window,"mousemove",m),dom.bind(window,"touchmove",m),dom.bind(window,"mouseup",h),dom.bind(window,"touchend",h)}function d(){dom.unbind(window,"mousemove",p),dom.unbind(window,"touchmove",p),dom.unbind(window,"mouseup",d),dom.unbind(window,"touchend",d),u()}function h(){dom.unbind(window,"mousemove",m),dom.unbind(window,"touchmove",m),dom.unbind(window,"mouseup",h),dom.unbind(window,"touchend",h),u()}function c(){var e=interpret(this.value);!1!==e?(a.__color.__state=e,a.setValue(a.__color.toOriginal())):this.value=a.__color.toString()}function u(){a.__onFinishChange&&a.__onFinishChange.call(a,a.__color.toOriginal())}function p(e){-1===e.type.indexOf("touch")&&e.preventDefault();var t=a.__saturation_field.getBoundingClientRect(),n=e.touches&&e.touches[0]||e,r=n.clientX,i=n.clientY,s=(r-t.left)/(t.right-t.left),o=1-(i-t.top)/(t.bottom-t.top);return o>1?o=1:o<0&&(o=0),s>1?s=1:s<0&&(s=0),a.__color.v=o,a.__color.s=s,a.setValue(a.__color.toOriginal()),!1}function m(e){-1===e.type.indexOf("touch")&&e.preventDefault();var t=a.__hue_field.getBoundingClientRect(),n=1-((e.touches&&e.touches[0]||e).clientY-t.top)/(t.bottom-t.top);return n>1?n=1:n<0&&(n=0),a.__color.h=360*n,a.setValue(a.__color.toOriginal()),!1}return Common.extend(r.__selector.style,{width:"122px",height:"102px",padding:"3px",backgroundColor:"#222",boxShadow:"0px 1px 3px rgba(0,0,0,0.3)"}),Common.extend(r.__field_knob.style,{position:"absolute",width:"12px",height:"12px",border:r.__field_knob_border+(r.__color.v<.5?"#fff":"#000"),boxShadow:"0px 1px 3px rgba(0,0,0,0.5)",borderRadius:"12px",zIndex:1}),Common.extend(r.__hue_knob.style,{position:"absolute",width:"15px",height:"2px",borderRight:"4px solid #fff",zIndex:1}),Common.extend(r.__saturation_field.style,{width:"100px",height:"100px",border:"1px solid #555",marginRight:"3px",display:"inline-block",cursor:"pointer"}),Common.extend(s.style,{width:"100%",height:"100%",background:"none"}),linearGradient(s,"top","rgba(0,0,0,0)","#000"),Common.extend(r.__hue_field.style,{width:"15px",height:"100px",border:"1px solid #555",cursor:"ns-resize",position:"absolute",top:"3px",right:"3px"}),(i=r.__hue_field).style.background="",i.style.cssText+="background: -moz-linear-gradient(top, #ff0000 0%, #ff00ff 17%, #0000ff 34%, #00ffff 50%, #00ff00 67%, #ffff00 84%, #ff0000 100%);",i.style.cssText+="background: -webkit-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);",i.style.cssText+="background: -o-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);",i.style.cssText+="background: -ms-linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);",i.style.cssText+="background: linear-gradient(top, #ff0000 0%,#ff00ff 17%,#0000ff 34%,#00ffff 50%,#00ff00 67%,#ffff00 84%,#ff0000 100%);",Common.extend(r.__input.style,{outline:"none",textAlign:"center",color:"#fff",border:0,fontWeight:"bold",textShadow:r.__input_textShadow+"rgba(0,0,0,0.7)"}),dom.bind(r.__saturation_field,"mousedown",o),dom.bind(r.__saturation_field,"touchstart",o),dom.bind(r.__field_knob,"mousedown",o),dom.bind(r.__field_knob,"touchstart",o),dom.bind(r.__hue_field,"mousedown",l),dom.bind(r.__hue_field,"touchstart",l),r.__saturation_field.appendChild(s),r.__selector.appendChild(r.__field_knob),r.__selector.appendChild(r.__saturation_field),r.__selector.appendChild(r.__hue_field),r.__hue_field.appendChild(r.__hue_knob),r.domElement.appendChild(r.__input),r.domElement.appendChild(r.__selector),r.updateDisplay(),r}return inherits(t,Controller),createClass(t,[{key:"updateDisplay",value:function(){var e=interpret(this.getValue());if(!1!==e){var t=!1;Common.each(Color.COMPONENTS,(function(n){if(!Common.isUndefined(e[n])&&!Common.isUndefined(this.__color.__state[n])&&e[n]!==this.__color.__state[n])return t=!0,{}}),this),t&&Common.extend(this.__color.__state,e)}Common.extend(this.__temp.__state,this.__color.__state),this.__temp.a=1;var n=this.__color.v<.5||this.__color.s>.5?255:0,r=255-n;Common.extend(this.__field_knob.style,{marginLeft:100*this.__color.s-7+"px",marginTop:100*(1-this.__color.v)-7+"px",backgroundColor:this.__temp.toHexString(),border:this.__field_knob_border+"rgb("+n+","+n+","+n+")"}),this.__hue_knob.style.marginTop=100*(1-this.__color.h/360)+"px",this.__temp.s=1,this.__temp.v=1,linearGradient(this.__saturation_field,"left","#fff",this.__temp.toHexString()),this.__input.value=this.__color.toString(),Common.extend(this.__input.style,{backgroundColor:this.__color.toHexString(),color:"rgb("+n+","+n+","+n+")",textShadow:this.__input_textShadow+"rgba("+r+","+r+","+r+",.7)"})}}]),t}(),vendors=["-moz-","-o-","-webkit-","-ms-",""];function linearGradient(e,t,n,r){e.style.background="",Common.each(vendors,(function(a){e.style.cssText+="background: "+a+"linear-gradient("+t+", "+n+" 0%, "+r+" 100%); "}))}var saveDialogContents='<div id="dg-save" class="dg dialogue">\n\n Here\'s the new load parameter for your <code>GUI</code>\'s constructor:\n\n <textarea id="dg-new-constructor"></textarea>\n\n <div id="dg-save-locally">\n\n <input id="dg-local-storage" type="checkbox"/> Automatically save\n values to <code>localStorage</code> on exit.\n\n <div id="dg-local-explain">The values saved to <code>localStorage</code> will\n override those passed to <code>dat.GUI</code>\'s constructor. This makes it\n easier to work incrementally, but <code>localStorage</code> is fragile,\n and your friends may not see the same values you do.\n\n </div>\n\n </div>\n\n</div>',ControllerFactory=function(e,t){var n=e[t];return Common.isArray(arguments[2])||Common.isObject(arguments[2])?new OptionController(e,t,arguments[2]):Common.isNumber(n)?Common.isNumber(arguments[2])&&Common.isNumber(arguments[3])?Common.isNumber(arguments[4])?new NumberControllerSlider(e,t,arguments[2],arguments[3],arguments[4]):new NumberControllerSlider(e,t,arguments[2],arguments[3]):Common.isNumber(arguments[4])?new NumberControllerBox(e,t,{min:arguments[2],max:arguments[3],step:arguments[4]}):new NumberControllerBox(e,t,{min:arguments[2],max:arguments[3]}):Common.isString(n)?new StringController(e,t):Common.isFunction(n)?new FunctionController(e,t,""):Common.isBoolean(n)?new BooleanController(e,t):null},requestAnimationFrame$1=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(e){setTimeout(e,1e3/60)},CenteredDiv=function(){function e(){classCallCheck(this,e),this.backgroundElement=document.createElement("div"),Common.extend(this.backgroundElement.style,{backgroundColor:"rgba(0,0,0,0.8)",top:0,left:0,display:"none",zIndex:"1000",opacity:0,WebkitTransition:"opacity 0.2s linear",transition:"opacity 0.2s linear"}),dom.makeFullscreen(this.backgroundElement),this.backgroundElement.style.position="fixed",this.domElement=document.createElement("div"),Common.extend(this.domElement.style,{position:"fixed",display:"none",zIndex:"1001",opacity:0,WebkitTransition:"-webkit-transform 0.2s ease-out, opacity 0.2s linear",transition:"transform 0.2s ease-out, opacity 0.2s linear"}),document.body.appendChild(this.backgroundElement),document.body.appendChild(this.domElement);var t=this;dom.bind(this.backgroundElement,"click",(function(){t.hide()}))}return createClass(e,[{key:"show",value:function(){var e=this;this.backgroundElement.style.display="block",this.domElement.style.display="block",this.domElement.style.opacity=0,this.domElement.style.webkitTransform="scale(1.1)",this.layout(),Common.defer((function(){e.backgroundElement.style.opacity=1,e.domElement.style.opacity=1,e.domElement.style.webkitTransform="scale(1)"}))}},{key:"hide",value:function(){var e=this,t=function t(){e.domElement.style.display="none",e.backgroundElement.style.display="none",dom.unbind(e.domElement,"webkitTransitionEnd",t),dom.unbind(e.domElement,"transitionend",t),dom.unbind(e.domElement,"oTransitionEnd",t)};dom.bind(this.domElement,"webkitTransitionEnd",t),dom.bind(this.domElement,"transitionend",t),dom.bind(this.domElement,"oTransitionEnd",t),this.backgroundElement.style.opacity=0,this.domElement.style.opacity=0,this.domElement.style.webkitTransform="scale(1.1)"}},{key:"layout",value:function(){this.domElement.style.left=window.innerWidth/2-dom.getWidth(this.domElement)/2+"px",this.domElement.style.top=window.innerHeight/2-dom.getHeight(this.domElement)/2+"px"}}]),e}();!function(e,t){var n=document,r=document.createElement("style");r.type="text/css",r.innerHTML=e;var a=n.getElementsByTagName("head")[0];try{a.appendChild(r)}catch(e){}}(function(e){if("undefined"!=typeof window){var t=document.createElement("style");return t.setAttribute("type","text/css"),t.innerHTML=e,document.head.appendChild(t),e}}(".dg ul{list-style:none;margin:0;padding:0;width:100%;clear:both}.dg.ac{position:fixed;top:0;left:0;right:0;height:0;z-index:0}.dg:not(.ac) .main{overflow:hidden}.dg.main{-webkit-transition:opacity .1s linear;-o-transition:opacity .1s linear;-moz-transition:opacity .1s linear;transition:opacity .1s linear}.dg.main.taller-than-window{overflow-y:auto}.dg.main.taller-than-window .close-button{opacity:1;margin-top:-1px;border-top:1px solid #2c2c2c}.dg.main ul.closed .close-button{opacity:1 !important}.dg.main:hover .close-button,.dg.main .close-button.drag{opacity:1}.dg.main .close-button{-webkit-transition:opacity .1s linear;-o-transition:opacity .1s linear;-moz-transition:opacity .1s linear;transition:opacity .1s linear;border:0;line-height:19px;height:20px;cursor:pointer;text-align:center;background-color:#000}.dg.main .close-button.close-top{position:relative}.dg.main .close-button.close-bottom{position:absolute}.dg.main .close-button:hover{background-color:#111}.dg.a{float:right;margin-right:15px;overflow-y:visible}.dg.a.has-save>ul.close-top{margin-top:0}.dg.a.has-save>ul.close-bottom{margin-top:27px}.dg.a.has-save>ul.closed{margin-top:0}.dg.a .save-row{top:0;z-index:1002}.dg.a .save-row.close-top{position:relative}.dg.a .save-row.close-bottom{position:fixed}.dg li{-webkit-transition:height .1s ease-out;-o-transition:height .1s ease-out;-moz-transition:height .1s ease-out;transition:height .1s ease-out;-webkit-transition:overflow .1s linear;-o-transition:overflow .1s linear;-moz-transition:overflow .1s linear;transition:overflow .1s linear}.dg li:not(.folder){cursor:auto;height:27px;line-height:27px;padding:0 4px 0 5px}.dg li.folder{padding:0;border-left:4px solid rgba(0,0,0,0)}.dg li.title{cursor:pointer;margin-left:-4px}.dg .closed li:not(.title),.dg .closed ul li,.dg .closed ul li>*{height:0;overflow:hidden;border:0}.dg .cr{clear:both;padding-left:3px;height:27px;overflow:hidden}.dg .property-name{cursor:default;float:left;clear:left;width:40%;overflow:hidden;text-overflow:ellipsis}.dg .cr.function .property-name{width:100%}.dg .c{float:left;width:60%;position:relative}.dg .c input[type=text]{border:0;margin-top:4px;padding:3px;width:100%;float:right}.dg .has-slider input[type=text]{width:30%;margin-left:0}.dg .slider{float:left;width:66%;margin-left:-5px;margin-right:0;height:19px;margin-top:4px}.dg .slider-fg{height:100%}.dg .c input[type=checkbox]{margin-top:7px}.dg .c select{margin-top:5px}.dg .cr.function,.dg .cr.function .property-name,.dg .cr.function *,.dg .cr.boolean,.dg .cr.boolean *{cursor:pointer}.dg .cr.color{overflow:visible}.dg .selector{display:none;position:absolute;margin-left:-9px;margin-top:23px;z-index:10}.dg .c:hover .selector,.dg .selector.drag{display:block}.dg li.save-row{padding:0}.dg li.save-row .button{display:inline-block;padding:0px 6px}.dg.dialogue{background-color:#222;width:460px;padding:15px;font-size:13px;line-height:15px}#dg-new-constructor{padding:10px;color:#222;font-family:Monaco, monospace;font-size:10px;border:0;resize:none;box-shadow:inset 1px 1px 1px #888;word-wrap:break-word;margin:12px 0;display:block;width:440px;overflow-y:scroll;height:100px;position:relative}#dg-local-explain{display:none;font-size:11px;line-height:17px;border-radius:3px;background-color:#333;padding:8px;margin-top:10px}#dg-local-explain code{font-size:10px}#dat-gui-save-locally{display:none}.dg{color:#eee;font:11px 'Lucida Grande', sans-serif;text-shadow:0 -1px 0 #111}.dg.main::-webkit-scrollbar{width:5px;background:#1a1a1a}.dg.main::-webkit-scrollbar-corner{height:0;display:none}.dg.main::-webkit-scrollbar-thumb{border-radius:5px;background:#676767}.dg li:not(.folder){background:#1a1a1a;border-bottom:1px solid #2c2c2c}.dg li.save-row{line-height:25px;background:#dad5cb;border:0}.dg li.save-row select{margin-left:5px;width:108px}.dg li.save-row .button{margin-left:5px;margin-top:1px;border-radius:2px;font-size:9px;line-height:7px;padding:4px 4px 5px 4px;background:#c5bdad;color:#fff;text-shadow:0 1px 0 #b0a58f;box-shadow:0 -1px 0 #b0a58f;cursor:pointer}.dg li.save-row .button.gears{background:#c5bdad url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAsAAAANCAYAAAB/9ZQ7AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAQJJREFUeNpiYKAU/P//PwGIC/ApCABiBSAW+I8AClAcgKxQ4T9hoMAEUrxx2QSGN6+egDX+/vWT4e7N82AMYoPAx/evwWoYoSYbACX2s7KxCxzcsezDh3evFoDEBYTEEqycggWAzA9AuUSQQgeYPa9fPv6/YWm/Acx5IPb7ty/fw+QZblw67vDs8R0YHyQhgObx+yAJkBqmG5dPPDh1aPOGR/eugW0G4vlIoTIfyFcA+QekhhHJhPdQxbiAIguMBTQZrPD7108M6roWYDFQiIAAv6Aow/1bFwXgis+f2LUAynwoIaNcz8XNx3Dl7MEJUDGQpx9gtQ8YCueB+D26OECAAQDadt7e46D42QAAAABJRU5ErkJggg==) 2px 1px no-repeat;height:7px;width:8px}.dg li.save-row .button:hover{background-color:#bab19e;box-shadow:0 -1px 0 #b0a58f}.dg li.folder{border-bottom:0}.dg li.title{padding-left:16px;background:#000 url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlI+hKgFxoCgAOw==) 6px 10px no-repeat;cursor:pointer;border-bottom:1px solid rgba(255,255,255,0.2)}.dg .closed li.title{background-image:url(data:image/gif;base64,R0lGODlhBQAFAJEAAP////Pz8////////yH5BAEAAAIALAAAAAAFAAUAAAIIlGIWqMCbWAEAOw==)}.dg .cr.boolean{border-left:3px solid #806787}.dg .cr.color{border-left:3px solid}.dg .cr.function{border-left:3px solid #e61d5f}.dg .cr.number{border-left:3px solid #2FA1D6}.dg .cr.number input[type=text]{color:#2FA1D6}.dg .cr.string{border-left:3px solid #1ed36f}.dg .cr.string input[type=text]{color:#1ed36f}.dg .cr.function:hover,.dg .cr.boolean:hover{background:#111}.dg .c input[type=text]{background:#303030;outline:none}.dg .c input[type=text]:hover{background:#3c3c3c}.dg .c input[type=text]:focus{background:#494949;color:#fff}.dg .c .slider{background:#303030;cursor:ew-resize}.dg .c .slider-fg{background:#2FA1D6;max-width:100%}.dg .c .slider:hover{background:#3c3c3c}.dg .c .slider:hover .slider-fg{background:#44abda}\n"));var SUPPORTS_LOCAL_STORAGE=function(){try{return!!window.localStorage}catch(e){return!1}}(),SAVE_DIALOGUE=void 0,autoPlaceVirgin=!0,autoPlaceContainer=void 0,hide=!1,hideableGuis=[],GUI=function e(t){var n=this,r=t||{};this.domElement=document.createElement("div"),this.__ul=document.createElement("ul"),this.domElement.appendChild(this.__ul),dom.addClass(this.domElement,"dg"),this.__folders={},this.__controllers=[],this.__rememberedObjects=[],this.__rememberedObjectIndecesToControllers=[],this.__listening=[],r=Common.defaults(r,{closeOnTop:!1,autoPlace:!0,width:e.DEFAULT_WIDTH}),r=Common.defaults(r,{resizable:r.autoPlace,hideable:r.autoPlace}),Common.isUndefined(r.load)?r.load={preset:"Default"}:r.preset&&(r.load.preset=r.preset),Common.isUndefined(r.parent)&&r.hideable&&hideableGuis.push(this),r.resizable=Common.isUndefined(r.parent)&&r.resizable,r.autoPlace&&Common.isUndefined(r.scrollable)&&(r.scrollable=!0);var a,i=SUPPORTS_LOCAL_STORAGE&&"true"===localStorage.getItem(getLocalStorageHash(0,"isLocal")),s=void 0,o=void 0;if(Object.defineProperties(this,{parent:{get:function(){return r.parent}},scrollable:{get:function(){return r.scrollable}},autoPlace:{get:function(){return r.autoPlace}},closeOnTop:{get:function(){return r.closeOnTop}},preset:{get:function(){return n.parent?n.getRoot().preset:r.load.preset},set:function(e){n.parent?n.getRoot().preset=e:r.load.preset=e,function(e){for(var t=0;t<e.__preset_select.length;t++)e.__preset_select[t].value===e.preset&&(e.__preset_select.selectedIndex=t)}(this),n.revert()}},width:{get:function(){return r.width},set:function(e){r.width=e,setWidth(n,e)}},name:{get:function(){return r.name},set:function(e){r.name=e,o&&(o.innerHTML=r.name)}},closed:{get:function(){return r.closed},set:function(t){r.closed=t,r.closed?dom.addClass(n.__ul,e.CLASS_CLOSED):dom.removeClass(n.__ul,e.CLASS_CLOSED),this.onResize(),n.__closeButton&&(n.__closeButton.innerHTML=t?e.TEXT_OPEN:e.TEXT_CLOSED)}},load:{get:function(){return r.load}},useLocalStorage:{get:function(){return i},set:function(e){SUPPORTS_LOCAL_STORAGE&&(i=e,e?dom.bind(window,"unload",s):dom.unbind(window,"unload",s),localStorage.setItem(getLocalStorageHash(0,"isLocal"),e))}}}),Common.isUndefined(r.parent)){if(this.closed=r.closed||!1,dom.addClass(this.domElement,e.CLASS_MAIN),dom.makeSelectable(this.domElement,!1),SUPPORTS_LOCAL_STORAGE&&i){n.useLocalStorage=!0;var l=localStorage.getItem(getLocalStorageHash(0,"gui"));l&&(r.load=JSON.parse(l))}this.__closeButton=document.createElement("div"),this.__closeButton.innerHTML=e.TEXT_CLOSED,dom.addClass(this.__closeButton,e.CLASS_CLOSE_BUTTON),r.closeOnTop?(dom.addClass(this.__closeButton,e.CLASS_CLOSE_TOP),this.domElement.insertBefore(this.__closeButton,this.domElement.childNodes[0])):(dom.addClass(this.__closeButton,e.CLASS_CLOSE_BOTTOM),this.domElement.appendChild(this.__closeButton)),dom.bind(this.__closeButton,"click",(function(){n.closed=!n.closed}))}else{void 0===r.closed&&(r.closed=!0);var d=document.createTextNode(r.name);dom.addClass(d,"controller-name"),o=addRow(n,d),dom.addClass(this.__ul,e.CLASS_CLOSED),dom.addClass(o,"title"),dom.bind(o,"click",(function(e){return e.preventDefault(),n.closed=!n.closed,!1})),r.closed||(this.closed=!1)}r.autoPlace&&(Common.isUndefined(r.parent)&&(autoPlaceVirgin&&(autoPlaceContainer=document.createElement("div"),dom.addClass(autoPlaceContainer,"dg"),dom.addClass(autoPlaceContainer,e.CLASS_AUTO_PLACE_CONTAINER),document.body.appendChild(autoPlaceContainer),autoPlaceVirgin=!1),autoPlaceContainer.appendChild(this.domElement),dom.addClass(this.domElement,e.CLASS_AUTO_PLACE)),this.parent||setWidth(n,r.width)),this.__resizeHandler=function(){n.onResizeDebounced()},dom.bind(window,"resize",this.__resizeHandler),dom.bind(this.__ul,"webkitTransitionEnd",this.__resizeHandler),dom.bind(this.__ul,"transitionend",this.__resizeHandler),dom.bind(this.__ul,"oTransitionEnd",this.__resizeHandler),this.onResize(),r.resizable&&addResizeHandle(this),s=function(){SUPPORTS_LOCAL_STORAGE&&"true"===localStorage.getItem(getLocalStorageHash(0,"isLocal"))&&localStorage.setItem(getLocalStorageHash(0,"gui"),JSON.stringify(n.getSaveObject()))},this.saveToLocalStorageIfPossible=s,r.parent||((a=n.getRoot()).width+=1,Common.defer((function(){a.width-=1})))};function addRow(e,t,n){var r=document.createElement("li");return t&&r.appendChild(t),n?e.__ul.insertBefore(r,n):e.__ul.appendChild(r),e.onResize(),r}function removeListeners(e){dom.unbind(window,"resize",e.__resizeHandler),e.saveToLocalStorageIfPossible&&dom.unbind(window,"unload",e.saveToLocalStorageIfPossible)}function markPresetModified(e,t){var n=e.__preset_select[e.__preset_select.selectedIndex];n.innerHTML=t?n.value+"*":n.value}function recallSavedValue(e,t){var n=e.getRoot(),r=n.__rememberedObjects.indexOf(t.object);if(-1!==r){var a=n.__rememberedObjectIndecesToControllers[r];if(void 0===a&&(a={},n.__rememberedObjectIndecesToControllers[r]=a),a[t.property]=t,n.load&&n.load.remembered){var i=n.load.remembered,s=void 0;if(i[e.preset])s=i[e.preset];else{if(!i.Default)return;s=i.Default}if(s[r]&&void 0!==s[r][t.property]){var o=s[r][t.property];t.initialValue=o,t.setValue(o)}}}}function _add(e,t,n,r){if(void 0===t[n])throw new Error('Object "'+t+'" has no property "'+n+'"');var a=void 0;if(r.color)a=new ColorController(t,n);else{var i=[t,n].concat(r.factoryArgs);a=ControllerFactory.apply(e,i)}r.before instanceof Controller&&(r.before=r.before.__li),recallSavedValue(e,a),dom.addClass(a.domElement,"c");var s=document.createElement("span");dom.addClass(s,"property-name"),s.innerHTML=a.property;var o=document.createElement("div");o.appendChild(s),o.appendChild(a.domElement);var l=addRow(e,o,r.before);return dom.addClass(l,GUI.CLASS_CONTROLLER_ROW),a instanceof ColorController?dom.addClass(l,"color"):dom.addClass(l,_typeof(a.getValue())),function(e,t,n){if(n.__li=t,n.__gui=e,Common.extend(n,{options:function(t){if(arguments.length>1){var r=n.__li.nextElementSibling;return n.remove(),_add(e,n.object,n.property,{before:r,factoryArgs:[Common.toArray(arguments)]})}if(Common.isArray(t)||Common.isObject(t)){var a=n.__li.nextElementSibling;return n.remove(),_add(e,n.object,n.property,{before:a,factoryArgs:[t]})}},name:function(e){return n.__li.firstElementChild.firstElementChild.innerHTML=e,n},listen:function(){return n.__gui.listen(n),n},remove:function(){return n.__gui.remove(n),n}}),n instanceof NumberControllerSlider){var r=new NumberControllerBox(n.object,n.property,{min:n.__min,max:n.__max,step:n.__step});Common.each(["updateDisplay","onChange","onFinishChange","step","min","max"],(function(e){var t=n[e],a=r[e];n[e]=r[e]=function(){var e=Array.prototype.slice.call(arguments);return a.apply(r,e),t.apply(n,e)}})),dom.addClass(t,"has-slider"),n.domElement.insertBefore(r.domElement,n.domElement.firstElementChild)}else if(n instanceof NumberControllerBox){var a=function(t){if(Common.isNumber(n.__min)&&Common.isNumber(n.__max)){var r=n.__li.firstElementChild.firstElementChild.innerHTML,a=n.__gui.__listening.indexOf(n)>-1;n.remove();var i=_add(e,n.object,n.property,{before:n.__li.nextElementSibling,factoryArgs:[n.__min,n.__max,n.__step]});return i.name(r),a&&i.listen(),i}return t};n.min=Common.compose(a,n.min),n.max=Common.compose(a,n.max)}else n instanceof BooleanController?(dom.bind(t,"click",(function(){dom.fakeEvent(n.__checkbox,"click")})),dom.bind(n.__checkbox,"click",(function(e){e.stopPropagation()}))):n instanceof FunctionController?(dom.bind(t,"click",(function(){dom.fakeEvent(n.__button,"click")})),dom.bind(t,"mouseover",(function(){dom.addClass(n.__button,"hover")})),dom.bind(t,"mouseout",(function(){dom.removeClass(n.__button,"hover")}))):n instanceof ColorController&&(dom.addClass(t,"color"),n.updateDisplay=Common.compose((function(e){return t.style.borderLeftColor=n.__color.toString(),e}),n.updateDisplay),n.updateDisplay());n.setValue=Common.compose((function(t){return e.getRoot().__preset_select&&n.isModified()&&markPresetModified(e.getRoot(),!0),t}),n.setValue)}(e,l,a),e.__controllers.push(a),a}function getLocalStorageHash(e,t){return document.location.href+"."+t}function addPresetOption(e,t,n){var r=document.createElement("option");r.innerHTML=t,r.value=t,e.__preset_select.appendChild(r),n&&(e.__preset_select.selectedIndex=e.__preset_select.length-1)}function showHideExplain(e,t){t.style.display=e.useLocalStorage?"block":"none"}function addSaveMenu(e){var t=e.__save_row=document.createElement("li");dom.addClass(e.domElement,"has-save"),e.__ul.insertBefore(t,e.__ul.firstChild),dom.addClass(t,"save-row");var n=document.createElement("span");n.innerHTML=" ",dom.addClass(n,"button gears");var r=document.createElement("span");r.innerHTML="Save",dom.addClass(r,"button"),dom.addClass(r,"save");var a=document.createElement("span");a.innerHTML="New",dom.addClass(a,"button"),dom.addClass(a,"save-as");var i=document.createElement("span");i.innerHTML="Revert",dom.addClass(i,"button"),dom.addClass(i,"revert");var s=e.__preset_select=document.createElement("select");if(e.load&&e.load.remembered?Common.each(e.load.remembered,(function(t,n){addPresetOption(e,n,n===e.preset)})):addPresetOption(e,"Default",!1),dom.bind(s,"change",(function(){for(var t=0;t<e.__preset_select.length;t++)e.__preset_select[t].innerHTML=e.__preset_select[t].value;e.preset=this.value})),t.appendChild(s),t.appendChild(n),t.appendChild(r),t.appendChild(a),t.appendChild(i),SUPPORTS_LOCAL_STORAGE){var o=document.getElementById("dg-local-explain"),l=document.getElementById("dg-local-storage");document.getElementById("dg-save-locally").style.display="block","true"===localStorage.getItem(getLocalStorageHash(0,"isLocal"))&&l.setAttribute("checked","checked"),showHideExplain(e,o),dom.bind(l,"change",(function(){e.useLocalStorage=!e.useLocalStorage,showHideExplain(e,o)}))}var d=document.getElementById("dg-new-constructor");dom.bind(d,"keydown",(function(e){!e.metaKey||67!==e.which&&67!==e.keyCode||SAVE_DIALOGUE.hide()})),dom.bind(n,"click",(function(){d.innerHTML=JSON.stringify(e.getSaveObject(),void 0,2),SAVE_DIALOGUE.show(),d.focus(),d.select()})),dom.bind(r,"click",(function(){e.save()})),dom.bind(a,"click",(function(){var t=prompt("Enter a new preset name.");t&&e.saveAs(t)})),dom.bind(i,"click",(function(){e.revert()}))}function addResizeHandle(e){var t=void 0;function n(n){return n.preventDefault(),e.width+=t-n.clientX,e.onResize(),t=n.clientX,!1}function r(){dom.removeClass(e.__closeButton,GUI.CLASS_DRAG),dom.unbind(window,"mousemove",n),dom.unbind(window,"mouseup",r)}function a(a){return a.preventDefault(),t=a.clientX,dom.addClass(e.__closeButton,GUI.CLASS_DRAG),dom.bind(window,"mousemove",n),dom.bind(window,"mouseup",r),!1}e.__resize_handle=document.createElement("div"),Common.extend(e.__resize_handle.style,{width:"6px",marginLeft:"-3px",height:"200px",cursor:"ew-resize",position:"absolute"}),dom.bind(e.__resize_handle,"mousedown",a),dom.bind(e.__closeButton,"mousedown",a),e.domElement.insertBefore(e.__resize_handle,e.domElement.firstElementChild)}function setWidth(e,t){e.domElement.style.width=t+"px",e.__save_row&&e.autoPlace&&(e.__save_row.style.width=t+"px"),e.__closeButton&&(e.__closeButton.style.width=t+"px")}function getCurrentPreset(e,t){var n={};return Common.each(e.__rememberedObjects,(function(r,a){var i={},s=e.__rememberedObjectIndecesToControllers[a];Common.each(s,(function(e,n){i[n]=t?e.initialValue:e.getValue()})),n[a]=i})),n}GUI.toggleHide=function(){hide=!hide,Common.each(hideableGuis,(function(e){e.domElement.style.display=hide?"none":""}))},GUI.CLASS_AUTO_PLACE="a",GUI.CLASS_AUTO_PLACE_CONTAINER="ac",GUI.CLASS_MAIN="main",GUI.CLASS_CONTROLLER_ROW="cr",GUI.CLASS_TOO_TALL="taller-than-window",GUI.CLASS_CLOSED="closed",GUI.CLASS_CLOSE_BUTTON="close-button",GUI.CLASS_CLOSE_TOP="close-top",GUI.CLASS_CLOSE_BOTTOM="close-bottom",GUI.CLASS_DRAG="drag",GUI.DEFAULT_WIDTH=245,GUI.TEXT_CLOSED="Close Controls",GUI.TEXT_OPEN="Open Controls",GUI._keydownHandler=function(e){"text"===document.activeElement.type||72!==e.which&&72!==e.keyCode||GUI.toggleHide()},dom.bind(window,"keydown",GUI._keydownHandler,!1),Common.extend(GUI.prototype,{add:function(e,t){return _add(this,e,t,{factoryArgs:Array.prototype.slice.call(arguments,2)})},addColor:function(e,t){return _add(this,e,t,{color:!0})},remove:function(e){this.__ul.removeChild(e.__li),this.__controllers.splice(this.__controllers.indexOf(e),1);var t=this;Common.defer((function(){t.onResize()}))},destroy:function(){if(this.parent)throw new Error("Only the root GUI should be removed with .destroy(). For subfolders, use gui.removeFolder(folder) instead.");this.autoPlace&&autoPlaceContainer.removeChild(this.domElement);var e=this;Common.each(this.__folders,(function(t){e.removeFolder(t)})),dom.unbind(window,"keydown",GUI._keydownHandler,!1),removeListeners(this)},addFolder:function(e){if(void 0!==this.__folders[e])throw new Error('You already have a folder in this GUI by the name "'+e+'"');var t={name:e,parent:this};t.autoPlace=this.autoPlace,this.load&&this.load.folders&&this.load.folders[e]&&(t.closed=this.load.folders[e].closed,t.load=this.load.folders[e]);var n=new GUI(t);this.__folders[e]=n;var r=addRow(this,n.domElement);return dom.addClass(r,"folder"),n},removeFolder:function(e){this.__ul.removeChild(e.domElement.parentElement),delete this.__folders[e.name],this.load&&this.load.folders&&this.load.folders[e.name]&&delete this.load.folders[e.name],removeListeners(e);var t=this;Common.each(e.__folders,(function(t){e.removeFolder(t)})),Common.defer((function(){t.onResize()}))},open:function(){this.closed=!1},close:function(){this.closed=!0},hide:function(){this.domElement.style.display="none"},show:function(){this.domElement.style.display=""},onResize:function(){var e=this.getRoot();if(e.scrollable){var t=dom.getOffset(e.__ul).top,n=0;Common.each(e.__ul.childNodes,(function(t){e.autoPlace&&t===e.__save_row||(n+=dom.getHeight(t))})),window.innerHeight-t-20<n?(dom.addClass(e.domElement,GUI.CLASS_TOO_TALL),e.__ul.style.height=window.innerHeight-t-20+"px"):(dom.removeClass(e.domElement,GUI.CLASS_TOO_TALL),e.__ul.style.height="auto")}e.__resize_handle&&Common.defer((function(){e.__resize_handle.style.height=e.__ul.offsetHeight+"px"})),e.__closeButton&&(e.__closeButton.style.width=e.width+"px")},onResizeDebounced:Common.debounce((function(){this.onResize()}),50),remember:function(){if(Common.isUndefined(SAVE_DIALOGUE)&&((SAVE_DIALOGUE=new CenteredDiv).domElement.innerHTML=saveDialogContents),this.parent)throw new Error("You can only call remember on a top level GUI.");var e=this;Common.each(Array.prototype.slice.call(arguments),(function(t){0===e.__rememberedObjects.length&&addSaveMenu(e),-1===e.__rememberedObjects.indexOf(t)&&e.__rememberedObjects.push(t)})),this.autoPlace&&setWidth(this,this.width)},getRoot:function(){for(var e=this;e.parent;)e=e.parent;return e},getSaveObject:function(){var e=this.load;return e.closed=this.closed,this.__rememberedObjects.length>0&&(e.preset=this.preset,e.remembered||(e.remembered={}),e.remembered[this.preset]=getCurrentPreset(this)),e.folders={},Common.each(this.__folders,(function(t,n){e.folders[n]=t.getSaveObject()})),e},save:function(){this.load.remembered||(this.load.remembered={}),this.load.remembered[this.preset]=getCurrentPreset(this),markPresetModified(this,!1),this.saveToLocalStorageIfPossible()},saveAs:function(e){this.load.remembered||(this.load.remembered={},this.load.remembered.Default=getCurrentPreset(this,!0)),this.load.remembered[e]=getCurrentPreset(this),this.preset=e,addPresetOption(this,e,!0),this.saveToLocalStorageIfPossible()},revert:function(e){Common.each(this.__controllers,(function(t){this.getRoot().load.remembered?recallSavedValue(e||this.getRoot(),t):t.setValue(t.initialValue),t.__onFinishChange&&t.__onFinishChange.call(t,t.getValue())}),this),Common.each(this.__folders,(function(e){e.revert(e)})),e||markPresetModified(this.getRoot(),!1)},listen:function(e){var t=0===this.__listening.length;this.__listening.push(e),t&&function e(t){0!==t.length&&requestAnimationFrame$1.call(window,(function(){e(t)})),Common.each(t,(function(e){e.updateDisplay()}))}(this.__listening)},updateDisplay:function(){Common.each(this.__controllers,(function(e){e.updateDisplay()})),Common.each(this.__folders,(function(e){e.updateDisplay()}))}});var GUI$1=GUI;class MaterialCreator{static createMeshPhysicalMaterial(e){return new MeshPhysicalMaterial(e)}static createMeshStandardMaterial(e){return new MeshStandardMaterial(e)}}const getScreenXY=(e,t,n,r)=>{if(!e||!t||0===n||0===r)return new Vector3;let a=e.clone(),i=n/2,s=r/2;return a.project(t),a.x=Math.floor(a.x*i+i),a.y=Math.floor(-a.y*s+s),a.z=e.distanceTo(t.position),a},kernelBoxToThreeBox=(e,t)=>{t||(t=new Vector3(0,0,0));let n=new Vector3(e.size.x/1e3,e.size.z/1e3,e.size.y/1e3),r=new Vector3(e.origin.x/1e3,e.origin.z/1e3,e.origin.y/-1e3),a=new Vector3(0,0,-n.z).add(r).sub(t),i=new Vector3(n.x,n.y,0).add(r).add(t);return new Box3(a,i)},position3VectorsAreEqual=(e,t)=>{let n=round(e.x),r=round(e.y),a=round(e.z),i=round(t.x),s=round(t.y),o=round(t.z);return n===i&&r===s&&a===o},rotationQuaternionsAreEqual=(e,t)=>{let n=round(e.w),r=round(e.x),a=round(e.y),i=round(e.z),s=round(t.w),o=round(t.x),l=round(t.y),d=round(t.z);return n===s&&r===o&&a===l&&i===d},position2VectorsAreEqual=(e,t)=>{let n=round(e.x),r=round(e.y),a=round(t.x),i=round(t.y);return n===a&&r===i};let whiteTexture=null;const getWhiteTexture=()=>{if(whiteTexture)return whiteTexture;const e=new Uint8Array(4);for(let t=0;t<1;t++){const n=4*t;e[n]=255,e[n+1]=255,e[n+2]=255,e[n+3]=255}const t=new DataTexture(e,1,1,RGBAFormat);return t.needsUpdate=!0,t},createColorTexture=(e,t,n,r)=>{const a=new Uint8Array(4),i=Math.floor(255*e),s=Math.floor(255*t),o=Math.floor(255*n),l=Math.floor(255*r);for(let e=0;e<4;e++){const t=4*e;a[t]=i,a[t+1]=s,a[t+2]=o,a[t+3]=l}const d=new DataTexture(a,1,1,RGBAFormat);return d.needsUpdate=!0,d},createMaterial=e=>setMaterial(null,e),setMaterial=(e,t)=>{e||(e=createMeshPhysicalMaterial()),e.name=t.id?t.id.toString():"",void 0!==t.shading.metallic&&(e.metalness=1===t.shading.metallic?1:.5,e.reflectivity=getValue(t.shading.metallic,.5));let n=!1;if(t.shading.transmission&&t.shading.transmission>0?(e.opacity=1-t.shading.transmission,e.transparent=!0,e.depthWrite=!1,e.metalness=0,n=!0):void 0!==t.shading.alpha&&t.shading.alpha<1&&(e.transparent=t.shading.alpha<1,e.opacity=t.shading.alpha,e.depthWrite=t.shading.alpha>=1,e.metalness=.5*Math.max(0,t.shading.alpha),n=!0),e.aoMapIntensity=getValue(t.shading.occlusion,1),e.roughness=getValue(t.shading.roughness,.5),e.alphaTest=getValue(t.shading.alphaCutoff,0),void 0!==t.shading.basecolor){const n=new Color$1(t.shading.basecolor.r,t.shading.basecolor.g,t.shading.basecolor.b);e.color.copy(n.convertSRGBToLinear())}return n||t.shading.doubleSided?e.side=DoubleSide:e.side=FrontSide,e.map||(whiteTexture||(whiteTexture=getWhiteTexture()),e.map=whiteTexture),e},createMeshPhysicalMaterial=()=>MaterialCreator.createMeshPhysicalMaterial({}),getMaterialShading=e=>{let t=e.color.clone().convertLinearToSRGB(),n={alpha:e.opacity,metallic:e.reflectivity,basecolor:{r:t.r,g:t.g,b:t.b},roughness:e.roughness,doubleSided:e.side===DoubleSide,alphaCutoff:e.alphaTest,transmission:e.transmission};return 1===e.metalness?n.metallic=1:n.metallic=e.reflectivity,n};let textureLoader=null;const addTexture=(e,t,n,r,a,i,s=16)=>(textureLoader||(textureLoader=new TextureLoader,textureLoader.crossOrigin=""),new Promise((o,l)=>{if(!e)return console.warn("trying to add a texture without image",t),void o();textureLoader.load(e,e=>{addExistingTexture(e,t,n,r,a,i,s),o()},l)})),addExistingTexture=(e,t,n,r,a,i,s=16)=>{e.anisotropy=r,e.wrapS=RepeatWrapping,e.wrapT=RepeatWrapping,"ORM"===t.mapping&&s<=8?console.warn("ORM maps are not supported on devices with only "+s+" texture units"):(e.repeat.set(a,i),"XYZ"===t.mapping?(n.normalMap=e,n.map===getWhiteTexture()&&(n.map=null)):"ORM"===t.mapping?(n.aoMap=e,n.roughnessMap=e,n.metalnessMap=e):(e.colorSpace=SRGBColorSpace,n.map=e),"RGBA"===t.mapping&&(n.transparent=!0,n.name.includes("glow")&&(n.emissiveIntensity=.5,n.emissive=new Color$1(16777215),n.emissiveMap=n.map)),n.needsUpdate=!0)},getGUI=(e=!0)=>(window.__RML_GUI__||(window.__RML_GUI__=new GUI$1({autoPlace:e})),window.__RML_GUI__),hideWallsBasedOnCamera=(e,t)=>{let n=!1;for(const r of t){const t=r.getKernelObject();let a;if(2===t.wallType.value&&(a=convertToTHREE(t.rightNormal)),1===t.wallType.value&&(a=convertToTHREE(t.leftNormal)),!a)continue;let i=convertToTHREE(r.getPlanElement().getCenter());i=i.applyMatrix4(e.matrixWorldInverse),a=a.transformDirection(e.matrixWorldInverse);const s=i.dot(a)>=0;s!==r.getContainer().visible&&(n=!0),s?r.show():r.isSelected||r.hide()}return n},setWallTransparency=(e,t,n=!0)=>{if(!e.userData.tween)if(t)if(e.transparent=!0,n){let t={opacity:1};e.userData.tween=!0,new TWEEN.Tween(t).to({opacity:.2},400).easing(TWEEN.Easing.Sinusoidal.In).onUpdate(()=>{e.opacity=t.opacity}).onComplete(()=>{e.userData.tween=!1}).start()}else e.opacity=.2;else if(n){let t={opacity:.2};e.userData.tween=!0,new TWEEN.Tween(t).to({opacity:1},400).easing(TWEEN.Easing.Sinusoidal.In).onUpdate(()=>{e.opacity=t.opacity}).onComplete(()=>{e.transparent=!1,e.userData.tween=!1}).start()}else e.opacity=1,e.transparent=!1},transitionTransparencyOfMaterial=(e,t)=>{e.traverse(e=>{if(e instanceof Mesh&&TWEEN){const n=e.material;e.userData.tween&&e.userData.tween.stop();const r={opacity:n.opacity};t.transparent&&(n.transparent=t.transparent),e.userData.tween=new TWEEN.Tween(r).to(t,250).easing(TWEEN.Easing.Linear.None).onUpdate(()=>{n.opacity=r.opacity}).onStop(()=>{t.transparent||(n.transparent=t.transparent),n.opacity=t.opacity,n.needsUpdate=!0,e.userData.tween=void 0}).onComplete(()=>{t.transparent||(n.transparent=t.transparent),n.needsUpdate=!0,e.userData.tween=void 0}).start()}})},fadeIn=e=>{e.traverse(e=>{if(e instanceof Mesh&&TWEEN){let t=e.material;if(0===t.opacity)return;let n={opacity:0,transparent:!0},r={opacity:t.opacity,transparent:t.transparent};t.transparent=n.transparent,t.opacity=n.opacity,new TWEEN.Tween(n).to(r,500).easing(TWEEN.Easing.Linear.None).onUpdate(()=>{t.opacity=n.opacity}).onComplete(()=>{t.transparent=r.transparent}).start()}})},dispose=e=>{"Mesh"===e.type?disposeMesh(e):disposeObject(e)},disposeObject=e=>{e&&e.children&&0!==e.children.length&&e.children.forEach(e=>{disposeMesh(e)})},disposeMesh=e=>{e&&(e.material&&disposeMaterial(e.material),e.geometry&&disposeGeometry(e.geometry),e.children&&e.children.length>0&&disposeObject(e))},disposeGeometry=e=>{e&&e.dispose()},disposeMaterial=e=>{e&&(e.map&&e.map.dispose(),e.normalMap&&e.normalMap.dispose(),e.dispose())};let boundingBoxMaterial;const vectorIsZero=e=>0===e.x&&0===e.y&&0===e.z,getMaterialId=(e,t)=>{let n="";return e||""===e?(e.materialId&&""!==e.materialId?n=e.materialId:e.catalogItemId&&""!==e.catalogItemId?n=e.catalogItemId:e.rgbValue>0?n="rgb"+JSON.stringify(e.rgbValue):e.length>0?n=e:t&&1===t.value?n="default_wall_material_"+e.getSourceType().value:t&&7===t.value&&(n="default_ceiling_material_"+e.getSourceType().value),n):null},getYRotationOfObject=e=>{let t=e.getWorldDirection(new Vector3).clone();t.y=0,t.lengthSq()<.01&&(t=new Vector3(0,1,0),t.applyQuaternion(e.quaternion),t.y=0),t.normalize();let n=Math.asin(t.x);return t.z<0&&(n=Math.PI-n),n<0&&(n+=2*Math.PI),n},compareBox3Size=(e,t)=>{if(!e||!t)return 0;const n=e.clone().expandByScalar(.001).containsBox(t),r=t.clone().expandByScalar(.001).containsBox(e);return r&&n||!r&&!n?0:!0===n?1:-1},getDrawingMinBounds=(e,t,n,r=1)=>{const a=t>n,i=a?15:0,s=a?0:10,o=e.getSize(new Vector3),l=e.getCenter(new Vector3);let d=o.x>2*i?o.x/2:i,h=o.z>2*s?o.z/2:s;return d*=r,h*=r,new Box3(new Vector3(l.x-d,l.y,l.z-h),new Vector3(l.x+d,l.y,l.z+h))},threeVectorToTransferableXY=e=>{const{x:t,y:n}=e;return{x:t,y:n}},threeVectorToTransferableXYZ=e=>{const{x:t,y:n,z:r}=e;return{x:t,y:n,z:r}},viewSpacePositionFromUV=(e,t,n)=>(new Vector3).setFromSphericalCoords(e,Math.PI*(1-n),2*Math.PI*(1-t)),CAMERA_TYPE={CAMERA_2D:"2D",CAMERA_3D:"3D",CAMERA_FP:"FP"},sanitizedCameraMode=e=>{if(!e)return CAMERA_TYPE.CAMERA_3D;let t=e.toUpperCase();return-1===Object.values(CAMERA_TYPE).indexOf(t)&&(t=CAMERA_TYPE.CAMERA_3D),t};var ENV_HDR_256_FILE_NAME="static/default_256-f1c66a2764f88cc0.exr";class InitData{constructor(e){this.autoQuality=!1,this.colors=ROOMLE_COLORS,this.unit=null,this.unitStringType=null,this.meshSelection=!0,this.stats=!1,this._measureTraffic=!1,this.disableDebugGUI=!1,this.disableEnvMap=!1,this.envMapUrl="static/default_256-f1c66a2764f88cc0.exr",this.envMapIntensity=1.5,this.envMapRotation=0,this.maxLightSources=-1,this.legacyLight=!1,this.restrictionLevel=0,this.e2e=!1,this.highlighting=ROOMLE_HIGHLIGHTNG.SMART,this.dls=null,this.ls=null,this.cameraSpacing=0,this.transparentHighlighting=!0,this.featureFlags={pulsePreview:!1,reDock:!1},this.mode=CAMERA_TYPE.CAMERA_3D,this.edit=!1,this.moc=!1,this.callbacksOnlyIfGeometryIsReady=!0,this._creator_=e}setOverrides(e){deepMerge(this,e)}}const BROWSER_LANGUAGE_PROPERTY_KEYS_KNOWN=["language","browserLanguage","userLanguage","systemLanguage"],isSafari=/^((?!chrome|android).)*safari/i.test(navigator.userAgent);class GlobalInitData{constructor(e){this.locale=((e=null)=>{const t=window.navigator;if(e)return e.substr(0,2);if(Array.isArray(t.languages)&&t.languages.length>0)return t.languages[0].substr(0,2);for(let e=0,n=BROWSER_LANGUAGE_PROPERTY_KEYS_KNOWN.length;e<n;e++){const n=t[BROWSER_LANGUAGE_PROPERTY_KEYS_KNOWN[e]];if(n)return n.substr(0,2)}return"en"})()||"en",this.overrideCountry=null,this._creator_=e}setOverrides(e){deepMerge(this,e)}}class UiCallback{_setMute(e){setWriteable(this,"_isMute",!0),this._isMute=e,setWriteable(this,"_isMute",!1)}mute(){this._setMute(!0)}unmute(){this._setMute(!1)}constructor(e){return this._isMute=!1,this.cameraStartsMoving=()=>{},this._creator_=e,setDescriptor(this,"_isMute",{enumerable:!1,writable:!1}),setDescriptor(UiCallback.prototype,"_setMute",{enumerable:!1,writable:!1}),setDescriptor(UiCallback.prototype,"mute",{enumerable:!1,writable:!1}),setDescriptor(UiCallback.prototype,"unmute",{enumerable:!1,writable:!1}),new Proxy(this,this)}get(e,t){return this._isMute&&"function"==typeof this[t]&&"on"===t.substr(0,2)?()=>{}:this[t]}}class GlobalCallback extends UiCallback{constructor(){super(...arguments),this.onNetworkRequest=(e,t,n)=>{},this.onKernelMsg=(e,t,n={})=>{},this.onCheckExternalCache=async(e,t)=>Promise.resolve(null),this.onValidateNetworkResponse=(e,t)=>Promise.resolve(!0)}}const CANVAS_ID={HSC:"rml-configurator",HSP:"rml-hsp",GLB:"rml-glb",RMV:"rml-mv"};class DomHelper{get element(){return this._container}constructor(e){this._creator_=e,this._lifeCycleManager.addEventListener(this)}setDomElement(e){if(!this._container){this._container=document.createElement("div"),this._container.classList.add("rml-threejs-canvas-container"),this._container.setAttribute("ondragover","return false"),this._container.style.position="relative",this._container.style.width="100%",this._container.style.height="100%";const t=document.createElement("style");t.innerText=".rml-threejs-canvas-container canvas{position:absolute;top:0;left:0;right:0;bottom:0;z-index:100; opacity:1;}",this._container.appendChild(t),e.appendChild(this._container)}this._element=e}getClientDimensions(){return new Vector2(this._element.clientWidth,this._element.clientHeight)}_removeDomElement(e){if(!e)return;const t=e.parentElement;t&&t.removeChild(e)}reset(){this._element=null,this._removeDomElement(this._container),this._container=null}pause(){this.reset()}resume(){}destroy(){}}__decorate([inject],DomHelper.prototype,"_lifeCycleManager",void 0);class ScenePluginDefaultImplementation{constructor(e){this._creator_=e}setScene(e){}setUiScene(e){}updateBounds(e){}clearScene(e,t){}moveCameraEnd(e){}moveCameraStart(e){}needsUiScene(){return!1}}class PluginSystem{constructor(e){this._plugins=[],this._creator_=e}async init(e,t,n){this._scene=e,this._uiScene=t,this._cameraPosition=n;const{bananaForScale:r}=this._initData;r&&await import("./banana-for-scale-c4a33098.js").then(({default:e})=>this._plugins.push(new e(this._creator_))),this._plugins.forEach(e=>e.setScene(this._scene)),this._plugins.forEach(e=>e.setUiScene(this._uiScene)),this._plugins.forEach(e=>e.updateBounds(this._bounds)),this._plugins.forEach(e=>e.moveCameraEnd(this._cameraPosition))}addPlugin(e){this._plugins.push(e),e.setScene(this._scene),e.setUiScene(this._uiScene),e.updateBounds(this._bounds),e.moveCameraEnd(this._cameraPosition)}updateBounds(e){this._bounds=e,this._plugins.forEach(t=>t.updateBounds(e))}clearScene(e,t){this._plugins.forEach(n=>n.clearScene(e,t))}getActivePlugins(){return this._plugins}getPlugin(e){for(let t of this._plugins)if(t instanceof e)return t;return null}moveCameraEnd(e){this._cameraPosition=e,this._plugins.forEach(t=>t.moveCameraEnd(e))}moveCameraStart(e){this._cameraPosition=e,this._plugins.forEach(t=>t.moveCameraStart(e))}needsUiScene(){return this._plugins.map(e=>e.needsUiScene()).reduce((e,t)=>e||t,!1)}}__decorate([inject],PluginSystem.prototype,"_initData",void 0);class PromiseQueue{constructor(e,t){this._waitingPromises=[],this._finishPromiseExecutor=[],this._errorCallback=()=>{},Promise.allSettled=Promise.allSettled||(e=>Promise.all(e.map(e=>e.then(e=>({status:"fulfilled",value:e})).catch(e=>({status:"rejected",reason:e}))))),e&&this.registerCallback(e),t&&(this._errorCallback=t)}push(e){this._waitingPromises.push(e),Promise.all(this._waitingPromises).then(e=>{e.length===this._waitingPromises.length&&(this._callback&&this._callback(e),this._waitingPromises=[])},this._errorCallback)}finished(e=!1){return new Promise((t,n)=>{this._finishPromiseExecutor.push({resolve:t,reject:n});const r=e?"allSettled":"all";Promise[r](this._waitingPromises).then(e=>{if("allSettled"===r){const t=[];e.forEach(({value:e,status:n})=>{"fulfilled"===n&&t.push(e)}),this._resolveAllExecutors(t)}else this._resolveAllExecutors(e)},e=>{this._rejectAllExecutors(e)})})}registerCallback(e){this._callback=e}unregisterCallback(){this._callback=null}_resolveAllExecutors(e){this._finishPromiseExecutor.forEach(({resolve:t})=>t(e)),this._finishPromiseExecutor=[]}_rejectAllExecutors(e){this._finishPromiseExecutor.forEach(({reject:t})=>t(e)),this._finishPromiseExecutor=[]}clear(){const e=this._waitingPromises.length>0;this._waitingPromises=[],e?this._rejectAllExecutors(new Error("Promise queue has been cleared")):this._resolveAllExecutors([])}get length(){return this._waitingPromises.length}}class MeshGenerator{constructor(e){this.materialQueue=new PromiseQueue,this._geometryComponentMaterialCache=new Map,this._maxAnisotropy=1,this._maxTextures=16,this._textureLoader=new TextureLoader,this._configuratorPreviewMaterial=MaterialCreator.createMeshStandardMaterial({color:"#DDDDDD",transparent:!0,opacity:1,roughness:1,envMap:null,polygonOffset:!0,polygonOffsetFactor:-1}),this._creator_=e,this._previewMaterial=MaterialCreator.createMeshStandardMaterial({color:"#DDDDDD",roughness:1,metalness:0})}getGeometry(e){return e&&this._cacheHolder.geometryCache.has(e)?this._cacheHolder.geometryCache.get(e):null}_generateGeometry(e,t,n,r,a){let i;return e&&this._cacheHolder.geometryCache.has(e)?i=this._cacheHolder.geometryCache.get(e):(i=new BufferGeometry,i.setIndex(new Uint32BufferAttribute(n,1)),i.setAttribute("position",new Float32BufferAttribute(t,3)),i.setAttribute("normal",new Float32BufferAttribute(a,3)),i.setAttribute("uv",new Float32BufferAttribute(r,2)),i.scale(.001,.001,.001),i.rotateX(-Math.PI/2),e&&this._cacheHolder.geometryCache.set(e,i)),i}changeMaterialOfMesh(e,t,n){e&&t?(e.material=t,e.material.transparent||0===e.material.opacity||e.material.transmission>0?(e.castShadow=!1,e.receiveShadow=!1):(e.castShadow=!0,e.receiveShadow=!0),e.material.needsUpdate=!0,this._materialLoaded&&this._materialLoaded(t),this._updateMaterialProperties(e,n)):console.warn("could not assign material to mesh",{mesh:e},{material:t})}_updateMaterialProperties(e,t){var n;if(t&&Object.keys(t).length>0&&e.material instanceof MeshStandardMaterial){const r=e.material.clone();r.userData.materialAttributes=t,t.color&&(r.color=new Color$1(t.color)),t.alpha&&(r.opacity=parseFloat(t.alpha)),t.roughness&&(r.roughness=parseFloat(t.roughness)),t.metallic&&(r.metalness=parseFloat(t.metallic)),r instanceof MeshPhysicalMaterial&&t.transmission&&(r.transmission=parseFloat(t.transmission)),r.transparent=r.opacity<1;const a=e.material;e.material=r,(null===(n=a.userData)||void 0===n?void 0:n.materialAttributes)&&a.dispose()}}_createMaterial(e,t,n,r,a){if(this._cacheHolder.materialCache.has(e))t();else if(e.startsWith("benchmarkMaterial")){let i=createBenchmarkMaterial(e),s=createMaterial(i);this._loadBenchmarkTextures(i,s,r,a).then(t,n)}else this._rapiAccess.getMaterial(e).then(e=>{let i=createMaterial(e);this._loadTextures(e,i,r,a).then(t,n)},n)}_loadBenchmarkTextures(e,t,n=1,r=1){return new Promise((a,i)=>{const s=createBenchmarkTexture(e.id);addTexture(this._dataSyncer.requestAsset(s.image,!0),s,t,this._maxAnisotropy,n/(0===s.mmWidth?1:s.mmWidth),r/(0===s.mmHeight?1:s.mmHeight),this._maxTextures).then(()=>{this._cacheHolder.materialCache.set(e.id,t),a()},i)})}_loadTextures(e,t,n=1,r=1){return new Promise((a,i)=>{if(!e.textures||e.textures&&0===e.textures.length)return this._cacheHolder.materialCache.set(e.id,t),a();this._rapiAccess.getTexturesOf(e).then(s=>{let o=[];s.forEach(e=>{o.push(addTexture(this._dataSyncer.requestAsset(e.image,!0),e,t,this._maxAnisotropy,n/(0===e.mmWidth?1:e.mmWidth),r/(0===e.mmHeight?1:e.mmHeight),this._maxTextures))}),Promise.all(o).then(()=>{this._cacheHolder.materialCache.set(e.id,t),a()},i)})})}_loadMaterial(e,t,n){return new Promise((r,a)=>{this._singlePromiseFactory.create(6,e,(r,a)=>this._createMaterial(e,r,a,t,n)).then(()=>{setTimeout(()=>r(this._cacheHolder.materialCache.get(e)),0)},a)})}_assignMaterial(e,t,n){return this._cacheHolder.materialCache.has(t)?(this.changeMaterialOfMesh(e,this._cacheHolder.materialCache.get(t),n),Promise.resolve()):new Promise((r,a)=>{this._loadMaterial(t).then(a=>{e.userData.materialId===t&&this.changeMaterialOfMesh(e,a,n),r()},a)})}get maxAnisotropy(){return this._maxAnisotropy}set maxAnisotropy(e){this._maxAnisotropy=e}get maxTextures(){return this._maxTextures}set maxTextures(e){this._maxTextures=e}clear(){this._cacheHolder.clear()}_assignRGB(e,t){return new Promise(n=>{let r,a="rgb"+JSON.stringify(t);this._cacheHolder.materialCache.has(a)?r=this._cacheHolder.materialCache.get(a):(r=MaterialCreator.createMeshPhysicalMaterial({color:t}),this._cacheHolder.materialCache.set(a,r)),this.changeMaterialOfMesh(e,r),setTimeout(()=>n(),0)})}_assignItem(e,t){return new Promise((n,r)=>{if(this._cacheHolder.materialCache.has(t))return this.changeMaterialOfMesh(e,this._cacheHolder.materialCache.get(t)),void n();this._rapiAccess.getItem(t).then(a=>{if(a.topImage)this._textureLoader.load(a.topImage,r=>{r.anisotropy=this._maxAnisotropy,r.wrapS=RepeatWrapping,r.wrapT=RepeatWrapping;let i=new Vector2(1,1);a.width>0&&(i.x=1/a.width),a.depth>0&&(i.y=1/a.depth),r.repeat.set(i.x,i.y);const s=MaterialCreator.createMeshPhysicalMaterial({map:r,roughness:.5,metalness:.1});this._cacheHolder.materialCache.set(t,s),this.changeMaterialOfMesh(e,s),setTimeout(()=>n(),0)});else{const e="can not set material, catalog item top image is not set";console.warn(e),r(e)}},r)})}setMaterialLoadedListener(e){this._materialLoaded=e}removeMaterialLoadedListener(){this._materialLoaded=void 0}_createMesh(e,t,n){if(e&&t){const r=this._getComponentMeshId(e,t);if(this._geometryComponentMaterialCache.has(r)){const e=this._geometryComponentMaterialCache.get(r);if(this._cacheHolder.materialCache.has(e)){const t=this._cacheHolder.materialCache.get(e);return new Mesh(n,t)}}}return new Mesh(n,this._configuratorPreviewMaterial.clone())}_getComponentMeshId(e,t){return e+"_"+t}}__decorate([inject],MeshGenerator.prototype,"_initData",void 0),__decorate([inject],MeshGenerator.prototype,"_rapiAccess",void 0),__decorate([inject],MeshGenerator.prototype,"_dataSyncer",void 0),__decorate([inject],MeshGenerator.prototype,"_singlePromiseFactory",void 0),__decorate([inject],MeshGenerator.prototype,"_cacheHolder",void 0),__decorate([inject],MeshGenerator.prototype,"_plannerMeshGenerator",void 0);class ConfiguratorMeshGenerator extends MeshGenerator{constructor(e){super(e)}generateMesh(e=0,t=null,n,r,a,i,s,o=!1,l){let d;d=o?this._generateGeometry(t,r,a,i,s).clone():this._generateGeometry(t,r,a,i,s);const h=this._createMesh(e,t,d);return h.userData.materialId=n,h.layers.set(4),n&&this.materialQueue.push(this._assignMaterial(h,n,l).then(()=>{e&&t&&this._geometryComponentMaterialCache.set(this._getComponentMeshId(e,t),n)})),h}setMaterial(e,t,n,r){return this._assignMaterial(e,t,r)}loadMaterial(e,t,n){return super._loadMaterial(e,t,n)}loadTextures(e,t,n,r){return super._loadTextures(e,t,n,r)}}class EventDispatcher{constructor(){this._listeners={},this._disabled=!1}_addEventListener(e,t,n){this._listeners[e]||(this._listeners[e]=[]),this._listeners[e].push({callback:t,scope:n})}addEventListener(e,t,n){this._addEventListener(e,t,n)}dispatchEvent(e,t){if(!this._listeners[e]||this._disabled)return;const n=this._listeners[e];let r=n.length;for(let e=0;e<r;e++){const r=n[e];t?r.callback.apply(r.scope,[t]):r.callback.call(r.scope)}}removeEventListener(e,t){const n=this._listeners[e];if(n)for(let e=0,r=n.length;e<r;e++)if(n[e].callback===t)return void n.splice(e,1)}enableEvents(){this._disabled=!1}disableEvents(){this._disabled=!0}}const BROWSER_EVENTS={SCROLL:"scroll",MOUSE_MOVE:"mousemove",MOUSE_DOWN:"mousedown",MOUSE_UP:"mouseup",MOUSE_LEAVE:"mouseleave",MOUSE_ENTER:"mouseenter",MOUSE_WHEEL:"wheel",TOUCH_MOVE:"touchmove",TOUCH_START:"touchstart",TOUCH_END:"touchend",CONTEXT_MENU:"contextmenu",DOUBLE_CLICK:"dblclick"},INPUT_DELAY_TYPE={DRAG:50};class InputEvent{constructor(e,t,n,r,a){this.position=e,this.positionRelative=t,this.type=n,this.rotation=r,this.event=a}}const MIN_MOVE_DISTANCE=5*window.devicePixelRatio,MIN_DOLLY_DISTANCE=3*window.devicePixelRatio;class InputManager extends EventDispatcher{constructor(e){super(),this._elementHit=!1,this._delta=-1,this._state=0,this._pinchDistance=-1,this._rotationAngle=-1,this._lastMouseWheelEvent=null,this._lastTouchEvent=null,this._events=Object.keys(BROWSER_EVENTS).map(e=>BROWSER_EVENTS[e]),this._boundingClientRectInvalid=!0,this._creator_=e,this._downPosition={x:0,y:0},this._downPositionRelative={x:0,y:0},this._boundingClientRect=this._getBoundingClientRect()}enableDragIn(e){this._setState(1),this._dragEnabled=!0,e&&(this._dragMV=this._dragM.bind(this),this._dragEV=this._dragE.bind(this),this._dragTarget=e.currentTarget||e.target,this._delta=-1,this._dragMVName="drag",this._dragEVName="dragend",window.TouchEvent&&e instanceof TouchEvent?(this._dragMVName="touchmove",this._dragEVName="touchend"):e.dataTransfer&&e.dataTransfer.setData&&e.dataTransfer.setData("text/plain"," "),this._firefoxDragPosition={x:0,y:0},document.ondragover=e=>{e=e||window.event,this._firefoxDragPosition.x=e.pageX,this._firefoxDragPosition.y=e.pageY},this._dragTarget.addEventListener(this._dragMVName,this._dragMV,!1),this._dragTarget.addEventListener(this._dragEVName,this._dragEV,!1))}isMouseUp(){return 0===this._state}_dragM(e){let t=e,n=null,r=null;window.TouchEvent&&e instanceof TouchEvent?(n=this._getTouchPosition(t),r=this._getTouchPositionRelative(t)):(n=this._getMousePosition(t),r=this._getMousePositionRelative(t)),n.x>0&&n.y>0&&this._move(n,r)}_dragE(e){let t=e;document.ondragover=null,this._firefoxDragPosition=null,this._dragTarget.removeEventListener(this._dragMVName,this._dragMV),this._dragTarget.removeEventListener(this._dragEVName,this._dragEV),window.TouchEvent&&e instanceof TouchEvent?this._onUp(this._getTouchPosition(t),this._getTouchPositionRelative(t),2):this._onUp(this._getMousePosition(t),this._getMousePositionRelative(t),1)}addEvents(e){this._events.forEach(t=>e.addEventListener(t,this,!1)),null===window||void 0===window||window.addEventListener("scroll",this,!1)}removeEvents(e){this._events.forEach(t=>e.removeEventListener(t,this)),null===window||void 0===window||window.removeEventListener("scroll",this)}_move2(e){if(this._lastTouchEvent&&e.timeStamp-this._lastTouchEvent.timeStamp<16)return;const t=e.touches[0],n=e.touches[1],r=t.pageX-n.pageX,a=t.pageY-n.pageY,i=Math.abs(r)+Math.abs(a);this._pinchDistance>-1&&(i>this._pinchDistance+MIN_DOLLY_DISTANCE?(this._setState(3),this.dispatchEvent(7,new InputEvent(this._getTouchPosition(e),this._getTouchPositionRelative(e)))):i<this._pinchDistance-MIN_DOLLY_DISTANCE?(this._setState(3),this.dispatchEvent(8,new InputEvent(this._getTouchPosition(e),this._getTouchPositionRelative(e)))):i<=this._pinchDistance+MIN_DOLLY_DISTANCE&&i>=this._pinchDistance-MIN_DOLLY_DISTANCE&&(this._setState(5),this.dispatchEvent(11,new InputEvent(this._getTouchPosition(e),this._getTouchPositionRelative(e))))),this._pinchDistance=i,this._lastTouchEvent=e}_setState(e){this._state=e}_move(e,t,n,r){void 0===n&&(n=0),void 0===this._dragEnabled&&(this._dragEnabled=!1),1===this._state&&this._canDrag(n)&&(this._delta=this._getDelta(e),(this._delta>MIN_MOVE_DISTANCE||this._elementHit)&&(this._setState(2),this._longClickTimer&&clearTimeout(this._longClickTimer),this.dispatchEvent(0,new InputEvent(this._downPosition,this._downPositionRelative)))),2===this._state&&this.dispatchEvent(1,new InputEvent(e,t)),this.dispatchEvent(6,new InputEvent(e,t,n,null,r))}_longClick(e){2!==e&&(this._setState(2),this._longClickTimer&&clearTimeout(this._longClickTimer),this.dispatchEvent(0,new InputEvent(this._downPosition,this._downPositionRelative)),this.dispatchEvent(1,new InputEvent(this._downPosition,this._downPositionRelative))),this.dispatchEvent(14,new InputEvent(this._downPosition,this._downPositionRelative,2))}_onUp(e,t,n){this.dispatchEvent(4,new InputEvent(e,t,n)),this._getDelta(e)<=MIN_MOVE_DISTANCE&&this.dispatchEvent(5,new InputEvent(e,t)),2===this._state&&this.dispatchEvent(2,new InputEvent(e,t)),4===this._state&&(this.dispatchEvent(10,new InputEvent(e,t)),this._rotationAngle=-1),3===this._state&&(this._pinchDistance=-1),this._lastTouchEvent=null,this._setState(0),this._dragTarget=null,this._elementHit=!1,this._longClickTimer&&clearTimeout(this._longClickTimer)}_getTouchPosition(e){if(e.touches.length){let{clientX:t,clientY:n}=e.touches[0];if(e.touches.length>1){const r=e.touches[1],a=r.clientX,i=r.clientY;t=(t+a)/2,n=(n+i)/2}return{x:t,y:n}}const t=e.changedTouches[0];return{x:t.clientX,y:t.clientY}}_getTouchPositionRelative(e){const t=this._getBoundingClientRect(),{clientWidth:n,clientHeight:r}=this._domHelper.element;if(e.touches.length){const{clientX:a,clientY:i}=e.touches[0];return{x:(a-t.left)/n*2-1,y:-(i-t.top)/r*2+1}}const a=e.changedTouches[0];return{x:(a.clientX-t.left)/n*2-1,y:-(a.clientY-t.top)/r*2+1}}_getMousePosition(e){if(0!==e.clientX&&0!==e.clientY)return{x:e.clientX,y:e.clientY};{let{x:t,y:n}=this._getFireFoxMousePosition(e);return{x:t,y:n}}}_getFireFoxMousePosition(e){let{x:t,y:n}=this._domHelper.getClientDimensions();return{x:t-(t+e.offsetX),y:n-(n+e.offsetY)}}_getMousePositionRelative(e){const t=this._getBoundingClientRect();return 0!==e.clientX&&0!==e.clientY?{x:(e.clientX-t.left)/this._domHelper.element.clientWidth*2-1,y:-(e.clientY-t.top)/this._domHelper.element.clientHeight*2+1}:this._firefoxDragPosition&&0!==this._firefoxDragPosition.x&&0!==this._firefoxDragPosition.y?{x:(this._firefoxDragPosition.x-t.left)/this._domHelper.element.clientWidth*2-1,y:-(this._firefoxDragPosition.y-t.top)/this._domHelper.element.clientHeight*2+1}:{x:0,y:0}}_getDelta(e){return Math.abs(this._downPosition.y-e.y)+Math.abs(this._downPosition.x-e.x)}setDragEnabled(e){this._dragEnabled=e}handleEvent(e){switch(e.type){case BROWSER_EVENTS.SCROLL:this._boundingClientRectInvalid=!0;break;case BROWSER_EVENTS.MOUSE_MOVE:this._onMouseMove(e);break;case BROWSER_EVENTS.DOUBLE_CLICK:this._onDoubleClick(e);break;case BROWSER_EVENTS.MOUSE_DOWN:this._onMouseDown(e);break;case BROWSER_EVENTS.MOUSE_UP:this._onMouseUp(e);break;case BROWSER_EVENTS.MOUSE_LEAVE:this._onMouseLeave(e);break;case BROWSER_EVENTS.MOUSE_ENTER:this._onMouseEnter(e);break;case BROWSER_EVENTS.MOUSE_WHEEL:this._onMouseWheel(e);break;case BROWSER_EVENTS.TOUCH_MOVE:this._onTouchMove(e);break;case BROWSER_EVENTS.TOUCH_START:this._onTouchStart(e);break;case BROWSER_EVENTS.TOUCH_END:this._onTouchEnd(e);break;case BROWSER_EVENTS.CONTEXT_MENU:this._onContextMenu(e)}}_onMouseDown(e){if(e.preventDefault(),2===e.detail)return;let{x:t,y:n}=this._getMousePosition(e);this._downPosition={x:t,y:n},this._downPositionRelative=this._getMousePositionRelative(e),this.dispatchEvent(3,new InputEvent({x:t,y:n},this._downPositionRelative,1)),this._setState(1)}_onMouseUp(e){e.preventDefault(),2!==e.detail&&this._onUp(this._getMousePosition(e),this._getMousePositionRelative(e),1)}_onMouseMove(e){e.preventDefault(),this._move(this._getMousePosition(e),this._getMousePositionRelative(e),1,e)}_onDoubleClick(e){e.preventDefault(),this.dispatchEvent(12,new InputEvent(this._getMousePosition(e),this._getMousePositionRelative(e),1))}_onMouseLeave(e){var t;this._delta=-1,(null===(t=e.relatedTarget)||void 0===t?void 0:t.closest('[data-rml-sdk="ignore-mouse-leave"]'))||this._onMouseUp(e)}_onMouseEnter(e){e.preventDefault()}_onMouseWheel(e){if(this._lastMouseWheelEvent&&e.timeStamp-this._lastMouseWheelEvent.timeStamp<40)return e.preventDefault(),void e.stopPropagation();e.deltaY<0?this.dispatchEvent(7,new InputEvent(this._getMousePosition(e),this._getMousePositionRelative(e),1,0,e)):this.dispatchEvent(8,new InputEvent(this._getMousePosition(e),this._getMousePositionRelative(e),1,0,e)),this._lastMouseWheelEvent=e}_onTouchMove(e){if(e.preventDefault(),!this._dragTarget)if(1===e.touches.length)this._move(this._getTouchPosition(e),this._getTouchPositionRelative(e),2);else if(2===e.touches.length)if(this._elementHit||4===this._state){const r=e.touches[0],a=e.touches[1],i=function(e){let t=toDegrees(e);return t<0&&(t=180+(180+t)),t}((t={x:r.pageX,y:r.pageY},n={x:a.pageX,y:a.pageY},Math.atan2(n.y-t.y,n.x-t.x)));this._rotationAngle<0&&(this._rotationAngle=i);const s=i-this._rotationAngle;this._rotationAngle=i,this.dispatchEvent(9,new InputEvent(this._getTouchPosition(e),this._getTouchPositionRelative(e),2,toRadiant(s))),this._setState(4)}else this._move2(e);var t,n}_onTouchStart(e){if(e.preventDefault(),1===e.touches.length){let{x:t,y:n}=this._getTouchPosition(e);this._downPosition={x:t,y:n},this._downPositionRelative=this._getTouchPositionRelative(e),this.dispatchEvent(3,new InputEvent({x:t,y:n},this._downPositionRelative,2)),this._setState(1),this._longClickTimer=window.setTimeout(this._longClick.bind(this,2),350)}else 2===e.touches.length&&(1!==this._state&&2!==this._state||this._onUp(this._getTouchPosition(e),this._getTouchPositionRelative(e),2),this._setState(3))}_onTouchEnd(e){e.preventDefault(),e.touches.length>1&&5===this._state||3===this._state||(this.dispatchEvent(13,new InputEvent(this._getTouchPosition(e),this._getTouchPositionRelative(e),2)),this._onUp(this._getTouchPosition(e),this._getTouchPositionRelative(e),2))}_onContextMenu(e){e.preventDefault()}_canDrag(e){return this._dragEnabled}onElementHit(){this._elementHit=!0}_getBoundingClientRect(){return this._boundingClientRectInvalid&&(this._boundingClientRect=this._domHelper.element.getBoundingClientRect(),this._boundingClientRectInvalid=!1),this._boundingClientRect}updateSize(){this._boundingClientRectInvalid=!0}}__decorate([inject],InputManager.prototype,"_domHelper",void 0);class SelectionHandlerEvent{constructor(e){const{component:t,resetCamera:n,consecutive:r}=e;this.component=t,this.resetCamera=void 0===n||n,this.consecutive=void 0===r||r}}class FontLoader extends Loader{constructor(e){super(e)}load(e,t,n,r){const a=this,i=new FileLoader(this.manager);i.setPath(this.path),i.setRequestHeader(this.requestHeader),i.setWithCredentials(this.withCredentials),i.load(e,(function(e){const n=a.parse(JSON.parse(e));t&&t(n)}),n,r)}parse(e){return new Font(e)}}class Font{constructor(e){this.isFont=!0,this.type="Font",this.data=e}generateShapes(e,t=100){const n=[],r=function(e,t,n){const r=Array.from(e),a=t/n.resolution,i=(n.boundingBox.yMax-n.boundingBox.yMin+n.underlineThickness)*a,s=[];let o=0,l=0;for(let e=0;e<r.length;e++){const t=r[e];if("\n"===t)o=0,l-=i;else{const e=createPath(t,a,o,l,n);o+=e.offsetX,s.push(e.path)}}return s}(e,t,this.data);for(let e=0,t=r.length;e<t;e++)n.push(...r[e].toShapes());return n}}function createPath(e,t,n,r,a){const i=a.glyphs[e]||a.glyphs["?"];if(!i)return void console.error('THREE.Font: character "'+e+'" does not exists in font family '+a.familyName+".");const s=new ShapePath;let o,l,d,h,c,u,p,m;if(i.o){const e=i._cachedOutline||(i._cachedOutline=i.o.split(" "));for(let a=0,i=e.length;a<i;)switch(e[a++]){case"m":o=e[a++]*t+n,l=e[a++]*t+r,s.moveTo(o,l);break;case"l":o=e[a++]*t+n,l=e[a++]*t+r,s.lineTo(o,l);break;case"q":d=e[a++]*t+n,h=e[a++]*t+r,c=e[a++]*t+n,u=e[a++]*t+r,s.quadraticCurveTo(c,u,d,h);break;case"b":d=e[a++]*t+n,h=e[a++]*t+r,c=e[a++]*t+n,u=e[a++]*t+r,p=e[a++]*t+n,m=e[a++]*t+r,s.bezierCurveTo(c,u,p,m,d,h)}}return{offsetX:i.ha*t,path:s}}const PROMISE_CALLBACKS=new Map,RESOURCES=new Map;class AsyncDependencyLoader{static loadFont(e){if(RESOURCES.has(e))return new Promise(t=>{t(RESOURCES.get(e))});if(PROMISE_CALLBACKS.has(e))return new Promise((t,n)=>{PROMISE_CALLBACKS.get(e).push({resolve:t,reject:n})});let t=new FontLoader;return new Promise((n,r)=>{PROMISE_CALLBACKS.set(e,[{resolve:n,reject:r}]),t.load(getAssetPath()+e,t=>{RESOURCES.set(e,t),AsyncDependencyLoader._resolveAll(e,t)})})}static _resolveAll(e,t){PROMISE_CALLBACKS.has(e)&&PROMISE_CALLBACKS.get(e).forEach(e=>e.resolve(t)),PROMISE_CALLBACKS.delete(e)}}class ComponentDimensioningHelper{constructor(e){this._activeComponents=[],this._componentDimensioningsExist=new Map,this._creator_=e}setCamera(e){this._camera=e}add(e){if(this._componentDimensioningsExist.has(e.runtimeId)&&!this._componentDimensioningsExist.get(e.runtimeId))return!1;const t=this._plannerKernelAccess.kernelInstance.getComponent(e.runtimeId),n=t.dimensionings;if(this._componentDimensioningsExist.set(e.runtimeId,n.length>0),!n||0===n.length||this._camera.position.z<0)return!1;const r=kernelBoxToThreeBox(t.boxForMeasurement),a={x:this._camera.position.x,y:this._camera.position.z};return import("./component-dimensioning-389dc894.js").then(t=>{AsyncDependencyLoader.loadFont("static/rubik_regular-bc008a7de2daee79.json").then(i=>{n.forEach(n=>{var s;e.add(new t.default(((s=n).from=s.from/1e3,s.to=s.to/1e3,1===s.type.value?(s.type={value:2},s.from*=-1,s.to*=-1):2===s.type.value&&(s.type={value:1}),s),r,i,a))})})}),this._activeComponents.push(e),!0}remove(e,t=!0){return new Promise(n=>{import("./component-dimensioning-389dc894.js").then(r=>{let a=[];e.children.forEach(e=>{e instanceof r.default&&a.push(e)}),a.forEach(t=>{e.remove(t),dispose(t)}),t&&removeItem(this._activeComponents,e),n()})})}hasComponentDimensions(){return this._activeComponents.length>0}async reset(){for(const e of this._activeComponents)await this.remove(e);this._activeComponents=[]}invalidateDimensioningsCache(e){e?this._componentDimensioningsExist.delete(e):this._componentDimensioningsExist.clear()}}__decorate([inject],ComponentDimensioningHelper.prototype,"_plannerKernelAccess",void 0);class Waiter{constructor(){this._promiseExecutors=[]}create(){return new Promise((e,t)=>{this._promiseExecutors.push({resolve:e,reject:t})})}resolve(e){return new Promise(t=>{this._promiseExecutors.forEach(t=>t.resolve(e)),this._promiseExecutors=[],t(e)})}reject(e){return new Promise((t,n)=>{this._promiseExecutors.forEach(t=>t.reject(e)),this._promiseExecutors=[],n(e)})}}class PlanElementViewModel extends class{constructor(e){this._coreReference=e.clone()}clearReference(){this._coreReference.delete(),this._coreReference=null}getKernelObject(){return this._coreReference}}{constructor(e){super(e),this._objectWaiter=new Waiter,this._topView=!1;const t=convertToTHREE(e.getCenter());this._container=new Object3D,this._container.position.copy(t),this._boundingBox=this._generateBoundingBox(),fadeIn(this._boundingBox),this._container.add(this._boundingBox),2!==this.getPlanElement().getType().value&&(this._object=new Object3D,this._container.add(this._object))}getSize(){return this._object?(new Box3).setFromObject(this._object).getSize(new Vector3):new Vector3}update(){this._container.position.copy(convertToTHREE(this.getPlanElement().getMeshCenter())),this._boundingBox&&this._updateBoundingBox()}_updateBoundingBox(){const e=this.getSize();this._boundingBox.geometry=new BoxGeometry(e.x,e.y,e.z),this._boundingBox.position.y=e.y/2}getPosition(){return this._container.position}getRotation(){return this._container.rotation.y}getBounds(){let e;return this.getPlanElement().boxForMeasurement?(e=kernelBoxToThreeBox(this.getPlanElement().boxForMeasurement),e.applyMatrix4(this.getContainer().matrix)):(e=new Box3,e.setFromObject(this._container)),e}getBoundingBox(){return this._boundingBox}getPlanElement(){return this._coreReference}setObject(e){this._object=e,this._objectWaiter.resolve(e)}getObject(){return this._object}async getObjectAsync(){return this._object?Promise.resolve(this._object):this._objectWaiter.create()}addMesh(e){this._object.add(e),this.hidePreviewBox()}getMesh(e){if(!this._object||0===this._object.children.length)return null;const t=getMaterialId(e,this.getPlanElement().getType());return this._object.children.find(e=>e.userData.material===t)}getContainer(){return this._container}getId(){return this.getPlanElement().getId()}clear(){dispose(this._container),this._selectionMesh&&dispose(this._selectionMesh)}remove(){var e;null===(e=this._container.parent)||void 0===e||e.remove(this._container),this.clear()}hidePreviewBox(){this._container&&this._boundingBox&&(this._boundingBox.material=(boundingBoxMaterial||(boundingBoxMaterial=new MeshBasicMaterial,boundingBoxMaterial.visible=!1),boundingBoxMaterial))}_generateBoundingBox(){const e=this.getSize(),t=new BoxGeometry(e.x,e.y,e.z);let n=new Color$1("#DDDDDD");const r=this.getPlanElement().customColor;r>0&&(n=(e=>{let t=new Color$1;return t.setRGB((e>>16)/255,(e>>8&255)/255,(e>>0&255)/255),t})(r));let a=MaterialCreator.createMeshStandardMaterial({color:n,opacity:1,transparent:!0}),i=new Mesh(t,a);return i.name="bounding box",i.position.y=e.y/2,i.castShadow=!1,i.receiveShadow=!1,i.layers.set(6),i}select(){this._isSelected=!0,this._selectionMesh&&this._container.add(this._selectionMesh)}deselect(){this._isSelected=!1,this._selectionMesh&&this._container.remove(this._selectionMesh)}hoverOn(){}hoverOff(){}setTopView(e){this._topView=e}}class PlanObjectViewModel extends PlanElementViewModel{constructor(e){super(e),this._initDone=!1,this._initFailed=null,this._initWaiter=new Waiter,this._container.rotation.y=e.rotation}finishInit(){return this._initDone=!0,this._initFailed=null,this._initWaiter.resolve()}failInit(e){return this._initFailed=e,this._initDone=!1,this._initWaiter.reject(this._initFailed)}isInitDone(){return this._initDone?Promise.resolve():this._initFailed?Promise.reject(this._initFailed):this._initWaiter.create()}getPlanObject(){return this.getPlanElement()}getSize(){return convertToThreeDimensions(this.getPlanObject().size)}update(){super.update(),this._container.rotation.y=this.getPlanObject().rotation}}class ConfiguratorPlanObjectViewModel extends PlanObjectViewModel{constructor(e){super(e),this._container.name="Configurable "+this._container.name}addRootComponent(e){this.setObject(e),this._rootComponentId=e.id,this._rootComponentRuntimeId=e.runtimeId,this._container.add(this.getObject())}getConfigurationRuntimeId(){return this.getPlanObject().getConfigurationRuntimeId()}getRootComponentId(){return this._rootComponentId}getRootComponentRuntimeId(){return this._rootComponentRuntimeId}finishConstruction(){return this.finishInit()}failConstruction(){return this.failInit(new Error("Construction of configuration failed"))}}let settings=JSON.parse(JSON.stringify({isProduction:!0,isUnitTesting:!1,environment:"production",detailEnvironment:"development",features:{},APP:{RAPI:{server:"/api/v2",localReverseProxy:"https://www.roomle.com/api/v2",liveServer:"https://www.roomle.com/api/v2",testServer:"https://www.test.roomle.com/api/v2",headers:{apiKey:"roomle_portal_v2",currentTenant:9,locale:"en",language:"en",device:1,token:"anonymous",platform:"web"},itemHeaders:{assetRevision:"glb",assetFileFormat:"glb"}},SHORTENER_URL:"http://rml.co/"},environments:{PRODUCTION:"production",DEVELOPMENT:"development",TEST:"test",TEST_SERVER:"test_server",ALPHA:"alpha"}}));settings.isUnitTesting=!1,"undefined"!=typeof module&&module.exports||(window.IS_DEBUG=!0);var Env=(function(e=!1){if(e){let e=JSON.parse(JSON.stringify(settings));e.APP,e.features}}(),JSON.parse(JSON.stringify(settings)));class StaticPlanObjectViewModel extends PlanObjectViewModel{constructor(e){super(e),this._originalSize=new Vector3,this._container.name="Static "+this._container.name}setRapiItem(e){return this._rapiItem?Promise.resolve():this._addStaticItem(e)}async _addStaticItem(e){this._rapiItem=e;let t=this.getPlanObject();if(this._glbUrl=getGlbUrl(e),!this._glbUrl)return Promise.reject("No glb url found");let n=e.scaleable?convertToThreeDimensions(t.size):void 0,r=new Vector3(1,1,1);t.flipX&&(r.x*=-1),t.flipY&&(r.z*=-1);try{const a=await this._staticItemLoader.loadGLB(this._glbUrl,void 0,void 0,n,r,t.customColor,e.colorable);this._originalSize.copy(a.boundingBox.getSize(new Vector3)),a.scene.name=e.label,this.setObject(a.scene),((e,t)=>{let n=(new Box3).setFromObject(e),r=n.getSize(new Vector3),a=Math.min(r.x,r.y,r.z),i=!0;a>5&&(console.warn("GLB seems to be too big ("+a+")",t),i=!1),n.min.y<-.01&&(console.warn("GLB seems to be under the floor ("+n.min.y+"): ",t),i=!1)})(a.scene,this._glbUrl),fadeIn(a.scene),this._container.add(this.getObject()),this.hidePreviewBox(),await this.finishInit()}catch(e){await this.failInit(e)}}getRapiItem(){return this._rapiItem}needsRapiItem(){return!this._glbUrl}getGLBUrl(){return this._glbUrl}update(){const e=convertToThreeDimensions(this.getPlanElement().size),t=this.getObject();if(!t)return;if(e){const{x:n,y:r,z:a}=this._originalSize;let i=new Vector3(e.x/n,e.y/r,e.z/a);t.scale.copy(i)}this.getPlanElement().flipX&&(t.scale.x*=-1),this.getPlanElement().flipY&&(t.scale.z*=-1);const n=this.getPlanElement().customColor;t.traverse(e=>{if(e instanceof Mesh&&e.material instanceof MeshStandardMaterial){const t=e.material;if(this._rapiItem.colorable&&n&&n>0){let e=new Color$1(n);t.color=e.copySRGBToLinear(e)}t.needsUpdate=!0}}),super.update()}}__decorate([inject],StaticPlanObjectViewModel.prototype,"_staticItemLoader",void 0);const wallDimensionToTransferable=e=>{const{id:t,textRotation:n,length:r,lengthFormatted:a}=e;return{id:t,fromWithoutPadding:threeVectorToTransferableXYZ(e.fromWithoutPadding),toWithoutPadding:threeVectorToTransferableXYZ(e.toWithoutPadding),fromPosition3d:threeVectorToTransferableXYZ(e.fromPosition3d),toPosition3d:threeVectorToTransferableXYZ(e.toPosition3d),textPosition3d:threeVectorToTransferableXYZ(e.textPosition3d),fromPosition2d:threeVectorToTransferableXY(e.fromPosition2d),toPosition2d:threeVectorToTransferableXY(e.toPosition2d),textPosition2d:threeVectorToTransferableXY(e.textPosition2d),textDirection:threeVectorToTransferableXYZ(e.textDirection),textRotation:n,length:r,lengthFormatted:a}};let WALL_TOP_VIEW_MATERIAL;const getTopViewMaterial=()=>(WALL_TOP_VIEW_MATERIAL||(WALL_TOP_VIEW_MATERIAL=MaterialCreator.createMeshPhysicalMaterial({color:0})),WALL_TOP_VIEW_MATERIAL);class WallPlanElementViewModel extends PlanElementViewModel{constructor(e){super(e),this._container.name="Wall Plan Element"}get isSelected(){return this._isSelected}getWallDimension(e){const t=this.getPlanElement(),n=convertToTHREE(t.getCenter()),r=t.getPreferredSide();let a,i;0===r.value?(a=convertToTHREE(t.getCornerFromLeft()),i=convertToTHREE(t.getCornerToLeft())):1===r.value&&(a=convertToTHREE(t.getCornerFromRight()),i=convertToTHREE(t.getCornerToRight()));const s=a.clone().add(i).divideScalar(2),o=a.clone().sub(i),l=o.clone().cross(new Vector3(0,1,0)).normalize();l.clone().dot(s.clone().sub(n))<0&&l.multiplyScalar(-1);const d={maxZoomedIn:Math.max(.7,e),maxZoomedOut:.01,minPadding:.05,maxPadding:.25},h=transformRange(e,d.maxZoomedIn,d.maxZoomedOut,d.minPadding,d.maxPadding),c=l.clone().multiplyScalar(h/2),u=a.clone().add(c),p=i.clone().add(c),m=l.multiplyScalar(h),g=a.add(m),f=i.add(m),_=o.clone();o.dot(new Vector3(1,0,0))<0&&_.multiplyScalar(-1);const v=Math.atan2(_.z,_.x),w=g.clone().add(f).divideScalar(2);return{id:t.getId(),fromPosition3d:g,toPosition3d:f,textPosition3d:w,textDirection:_,textRotation:v,length:t.getLength(r.value),fromWithoutPadding:u,toWithoutPadding:p}}addMesh(e){e.traverse(e=>{this._setMaterial(e)}),e.layers.set(9),super.addMesh(e);const t=(new Box3).setFromObject(this.getObject()).getSize(new Vector3);this._boundingBox.geometry=new BoxGeometry(t.x,t.y,t.z),this._boundingBox.position.y=t.y/2}show(){var e,t;this.getContainer().visible=!0,null===(e=this.getObject())||void 0===e||e.traverse(e=>{e.layers.set(9)}),null===(t=this.getBoundingBox())||void 0===t||t.layers.set(6)}hide(){var e,t;this.getContainer().visible=!1,null===(e=this.getObject())||void 0===e||e.traverse(e=>{e.layers.disableAll()}),null===(t=this.getBoundingBox())||void 0===t||t.layers.disableAll()}_enableTopView(){this._container.traverse(e=>{this._setTopMaterial(e)})}_setTopMaterial(e){e instanceof Mesh&&!e.userData.originalMaterial&&e.material&&e!==this._boundingBox&&(e.userData.originalMaterial=e.material,e.material=getTopViewMaterial())}_disableTopView(){this._container.traverse(e=>{e instanceof Mesh&&e.userData.originalMaterial&&(e.material=e.userData.originalMaterial,delete e.userData.originalMaterial)})}setTopView(e){super.setTopView(e),e?this._enableTopView():this._disableTopView()}getKernelObject(){return super.getKernelObject()}_setMaterial(e){e instanceof Mesh&&e.material&&e!==this._boundingBox&&(e.userData.originalMaterial||(e.userData.originalMaterial=e.material),this._topView&&this._isSelected?e.material=new MeshBasicMaterial({color:10526880,side:DoubleSide}):this._topView&&!this._isSelected?e.material=getTopViewMaterial():(e.material=e.userData.originalMaterial,delete e.userData.originalMaterial))}select(){super.select(),this._container.traverse(e=>{this._setMaterial(e)})}deselect(){super.deselect(),this._container.traverse(e=>{this._setMaterial(e)})}}class FloorPlanElementViewModel extends PlanElementViewModel{constructor(e){super(e),this._container.name="Floor Plan Element"}addMesh(e){this.getObject().clear(),super.addMesh(e),e.layers.set(9),e.castShadow=!1,e.position.y=-.001}}class CeilingPlanElementViewModel extends PlanElementViewModel{constructor(e){super(e),this._container.name="Ceiling Plan Element"}addMesh(e){super.addMesh(e),e.castShadow=!1;const t=(new Box3).setFromObject(this.getObject()).getSize(new Vector3);this._boundingBox.geometry=new BoxGeometry(t.x,.01,t.z)}}const META_INFO=new Map;class Benchmark{static start(e){if(!window.performance||!window.performance.getEntriesByName)return"";let t=window.performance.getEntriesByName(e).length++,n="";t<100&&(n="0"),t<10&&(n="0"+n);const r=t>0?e+"_"+n+t:e,a=r+"_start";return window.performance.mark(a),r}static addMeta(e,t){const n=Benchmark.getMeta(e);META_INFO.set(e,Object.assign(n,t))}static getMeta(e){return META_INFO.get(e)||{}}static end(e){}static getMeasure(e){return[]}static showBenchmarks(e){const t=window.performance.getEntriesByType("measure");t.sort((function(e,t){return e.startTime-t.startTime}));const n=[];for(let r=0,a=t.length;r<a;r++){const a=t[r];e&&-1===a.name.indexOf(e)||n.push({Start:parseFloat(a.startTime.toFixed(2)),Name:a.name,Duration:parseFloat(a.duration.toFixed(2))})}console.table(n)}}class AppContext{static init(e={}){const{kernelInstance:t,kernelContainer:n,planObjectId:r}=e;AppContext.kernelInstance=t,AppContext.kernelContainer=n,AppContext.planObjectId=r}static cleanUp(){AppContext.useHDGeometry=!1,AppContext.kernelInstance=null,AppContext.kernelContainer=null,AppContext.planObjectId=null}}AppContext.useHDGeometry=!1,AppContext.kernelInstance=null,AppContext.kernelContainer=null,AppContext.planObjectId=null;const WAITERS=new Map,_endOperation=function(e,t,n){let r=WAITERS.get(e);if(r){const a=n?[n]:void 0;r.forEach(({resolve:e,reject:n})=>t?e.apply(e,a):n.apply(n,a)),WAITERS.delete(e)}};class AsyncHelper{static finishOperation(e,t){_endOperation(e,!0,t)}static failOperation(e,t){_endOperation(e,!1,t)}static waitFor(e,t){return new Promise((n,r)=>{let a=WAITERS.get(e);a||(WAITERS.set(e,[]),a=WAITERS.get(e)),a.push({resolve:n,reject:r}),"function"==typeof t&&t.apply(t)})}}const isRange=function(e){return e.validRange&&"string"==typeof e.validRange.type},isOptions=function(e){return e.validValues&&e.validValues.length>0},isMaterial=function(e){return"Material"===e.type};let MEM_URL,WASM_URL,WASM_LOADER,ASM_LOADER,CACHE_COMPILATION;const KERNEL_PATHS={WASM:{CONFIGURATOR:{URL:"static/ConfiguratorKernel-9a599eeb4293df18.wasm",LOADER:"static/ConfiguratorKernel-4cae014a679bd075.js"},PLANNER:{URL:"static/RoomleCore-02c32bc54042f811.wasm",LOADER:"static/RoomleCore-c8f6b8cd39eb2b33.js"}},WASM_MODERN:{CONFIGURATOR:{URL:"static/ConfiguratorKernel-9457a9c787a94211.wasm",LOADER:"static/ConfiguratorKernel-5c4fcff0d630e61b.js"},PLANNER:{URL:"static/RoomleCore-0fd00939f2ec4d85.wasm",LOADER:"static/RoomleCore-c9e8fbc848d32a0e.js"}},ASM:{CONFIGURATOR:{MEM_URL:"static/ConfiguratorKernelJs-27242c64dc21b819.mem",LOADER:"static/ConfiguratorKernelJs-9abaf09525b8e7fb.js"},PLANNER:{MEM_URL:"static/RoomleCoreJs-7305a65c8029e4fe.mem",LOADER:"static/RoomleCoreJs-0bfad314ad4cc1a1.js"}}},USE_WASM=!!window.WebAssembly;class CommonKernelAccess{_utilityToLongArray(e){const t=new this._kernelContainer.LongArray;return e.forEach(e=>t.push_back(e)),t}constructor(e){this._requestedItemIds=[],this._requestedMaterialIds=[],this._configuratorKernelCallbackListener=new Set,this._cachedGroupIds=[],this._waitingForGroups=!1,this._subComponentsWaiters=new Map,this._shouldWait=!0,this._creator_=e,window.KernelCallback={isReady:this.isReady.bind(this)},this._lifeCycleManager.addEventListener(this)}init(e){this._kernelType=e,this._setupKernelPaths(e),this._setupEmsModule(e),this._useWASM=USE_WASM,this._kernelPath=USE_WASM?WASM_LOADER:ASM_LOADER}_initKernel(){const{restrictionLevel:e}=this._initData,t=!1!==this._initData.callbacksOnlyIfGeometryIsReady;this._kernelInstance.setUpdateCallbacksOnlyIfGeometryIsReady(t),this._kernelInstance.setLevel(e),this._unitFormatter.init(this._kernelContainer),this._kernelInstance.setEnvironmentVariable("unit",this._unitFormatter._actualUnitString||"cm"),this._kernelInstance.setEnvironmentVariable("unitString","short"),this._kernelInstance.useEnvironmentGeometry(1===this._kernelType);const{overrideCountry:n,locale:r}=this._globalInitData;n&&(this._kernelInstance.resetPriceListIds(),this._kernelInstance.addPriceList(n)),this._kernelInstance.setEnvironmentVariable("language",r)}get kernelContainer(){return this._kernelContainer}get kernelInstance(){return this._kernelInstance}get configurationExporter(){return this._configurationExporter||(this._configurationExporter=this._kernelContainer.newConfigurationExporter()),this._configurationExporter}_setupKernelPaths(e){const t=0===e?"PLANNER":"CONFIGURATOR";MEM_URL=KERNEL_PATHS.ASM[t].MEM_URL,ASM_LOADER=KERNEL_PATHS.ASM[t].LOADER,WebAssembly.validate(new Uint8Array([0,97,115,109,1,0,0,0,1,4,1,96,0,0,3,2,1,0,10,8,1,6,0,6,64,25,11,11]))?(WASM_URL=KERNEL_PATHS.WASM_MODERN[t].URL,WASM_LOADER=KERNEL_PATHS.WASM_MODERN[t].LOADER):(WASM_URL=KERNEL_PATHS.WASM[t].URL,WASM_LOADER=KERNEL_PATHS.WASM[t].LOADER),CACHE_COMPILATION=!0}_setupEmsModule(e){const t=this;this._kernelContainer={locateFile(t){const n=0===e?/RoomleCoreJs[\-a-z0-9]*\.js\.mem/:/ConfiguratorKernelJs[\-a-z0-9]*\.js\.mem/;return t.match(n)?getAssetPath()+MEM_URL:t},wasmBinaryFile:getAssetPath()+WASM_URL,preRun:[],postRun:[],setStatus:null,print(e){t._kernelIo.log(e)},printErr(e){t._kernelIo.error(e)},quit(e){0!==e&&t._kernelIo.throw(e&&e.toString?e.toString():"Unknown error while C/C++ main executes")}},CACHE_COMPILATION&&USE_WASM&&(this._kernelContainer.instantiateWasm=function(e,t){return((e,t,n)=>{const r="function"==typeof WebAssembly.instantiateStreaming;Benchmark.addMeta("kernel_is_ready",{cachedInIndexedDB:!1});let a=null;r?(Benchmark.start("kernel_stream_compile"),a=WebAssembly.instantiateStreaming(fetch(getAssetPath()+e),t)):(Benchmark.start("kernel_legacy_compile"),a=fetch(getAssetPath()+e).then(e=>e.arrayBuffer()).then(e=>WebAssembly.instantiate(e,t))),Benchmark.addMeta("kernel_is_ready",{instantiateStreaming:r}),a.then(e=>{n(e.instance)},e=>console.error(e))})(WASM_URL,e,t),{}})}_passSubComponentsToKernel(e,t){const n=e.id,r=t.get(n);if(r)for(let t=0,a=r.length;t<a;t++){const{parentId:a,partId:i}=r[t];this._kernelIo.setMeta({componentId:n}),this._kernelInstance.loadedSubComponent(a,i,n,e.configuration)}}_fetchSubComponents(e){let t=[...e.keys()];t.length&&this._rapiAccess.getComponents(t).then(t=>{for(let n=0,r=t.length;n<r;n++)this._passSubComponentsToKernel(t[n],e);this._flushSubComponentsWaiters()})}_flushSubComponentsWaiters(){this._fetchSubComponents(this._subComponentsWaiters),this._subComponentsWaiters=new Map,this._shouldWait=!1}isReady(){this._kernelContainer.setExternalHelpers(this._kernelIo,{convertCObject}),Env.isProduction||Env.isUnitTesting||this.addDebugInfo(),window.KernelCallback&&(window.KernelCallback=null,delete window.KernelCallback)}addDebugInfo(){const e=function(t,n=[]){const r=Object.getPrototypeOf(t),a=r?Object.getOwnPropertyNames(r):[],i=t?Object.getOwnPropertyNames(t):[];return r?e(r,[...n,...i,...a]):[...i,...a,...n]},t=e(this),n=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toString","valueOf"];[...new Set(t)].forEach(e=>{if(!e.startsWith("_")&&"function"==typeof this[e]&&-1===n.indexOf(e))try{const t=this[e].bind(this);this[e]=function(...n){return this._kernelIo.log("[ KernelCommunication ]: "+e),t(...n)}}catch(e){}})}getConfigurationData(e){return new Promise(t=>{var n;const r=this.kernelInstance.getPlanObject(e),a=(new Date).toISOString(),i=this.kernelInstance.getComponentId(e),s=getCatalogIdFromItemOrConfigurationId(i),o=(null===(n=r.boxForMeasurement)||void 0===n?void 0:n.size)||r.bounds;t({created:a,lastAccess:a,configuration:this.kernelInstance.getSerializedConfiguration(e),configurationHash:this.kernelInstance.getHashOfConfiguration(e),parts:JSON.stringify(this.kernelInstance.getPartList(e)),rootComponentId:i,width:o.x,height:o.z,depth:o.y,catalog:s,orderable:!1,requestable:!1})})}loadComponent(e,t,n){this._rapiAccess.getComponent(t.componentId).then(r=>{var a;let i=r.configuration;i||(i="error",null===(a=this._configuratorUiCallbacks)||void 0===a||a.onContentProblem({rapiPath:"components",ids:[t.componentId],message:t.componentId+" has no configuration"})),this._kernelIo.setMeta({componentId:t.componentId}),this._kernelInstance.loadComponent(e,i,t,n),this._flushSubComponentsWaiters()},r=>{var a;this._kernelInstance.loadComponent(e,"error",t,n),this.onLoadComponentError(r,t.componentId),null===(a=this._configuratorUiCallbacks)||void 0===a||a.onError(new Error(`Component with id "${t.componentId}" can not be loaded. "${r}"`)),this._flushSubComponentsWaiters()})}loadSubComponent(e,t,n){if(this._shouldWait){let r=this._subComponentsWaiters.get(n);r||this._subComponentsWaiters.set(n,[]),r=this._subComponentsWaiters.get(n),r.push({parentId:e,partId:t}),this._subComponentsWaiters.set(n,r)}else this._rapiAccess.getComponent(n).then(r=>{var a;let i=r.configuration;i||(i="error",null===(a=this._configuratorUiCallbacks)||void 0===a||a.onContentProblem({rapiPath:"components",ids:[n],message:"SubComponent "+n+" has no configuration"})),this._kernelIo.setMeta({componentId:n,parentId:e}),this._kernelInstance.loadedSubComponent(e,t,n,i)})}async loadItemConfigurations(e,t){let n=Array.isArray(t)?t:[t];if(this._requestedItemIds.push(...n),await wait(0),!this._requestedItemIds.length)return;const r=[...this._requestedItemIds];this._requestedItemIds=[],(await this._rapiAccess.getItems(r)).forEach(t=>{this._kernelInstance.loadedItemConfiguration(e,t.id,t.configuration)})}requestDeleteComponent(e){var t,n;e&&((null===(n=null===(t=this._initData)||void 0===t?void 0:t.featureFlags)||void 0===n?void 0:n.reDock)?this._kernelInstance.deletePlanComponent(e):this._kernelInstance.deleteComponent(e))}dockComponentWithPosition(e,t,n,r,a){var i;this._kernelInstance.dockComponentWithPosition(n,r,e,t,a);const s=this._kernelInstance.getComponentId(n),o=this._kernelInstance.getComponentId(e);null===(i=this._configuratorUiCallbacks)||void 0===i||i.onUserInitiatedDockDone(s,r,o,t,a)}Editor3dAddBakedMesh(e,t,n,r,a,i,s,o){this._configuratorKernelCallbackListener.forEach(l=>l.Editor3dAddBakedMesh(e,t,n,r,a,i,s,o))}Editor3dAddNamedMesh(e,t,n,r,a,i,s,o,l,d,h,c){this._configuratorKernelCallbackListener.forEach(u=>u.Editor3dAddNamedMesh(e,t,n,r,a,i,s,o,l,d,h,c))}Editor3ChangedNamedMesh(e,t,n,r,a,i,s){this._configuratorKernelCallbackListener.forEach(o=>o.Editor3ChangedNamedMesh(e,t,n,r,a,i,s))}Editor3dRemoveNamedMesh(e,t){this._configuratorKernelCallbackListener.forEach(n=>n.Editor3dRemoveNamedMesh(e,t))}Editor3dBeginConstruction(e,t){this._configuratorKernelCallbackListener.forEach(n=>n.Editor3dBeginConstruction(e,t))}Editor3dEndConstruction(e){this._configuratorKernelCallbackListener.forEach(t=>t.Editor3dEndConstruction(e))}Editor3dComponentCreated(e,t,n,r){this._configuratorKernelCallbackListener.forEach(a=>a.Editor3dComponentCreated(e,t,n,r,!1))}Editor3dComponentDocked(e,t,n,r){this._configuratorKernelCallbackListener.forEach(a=>a.Editor3dComponentDocked(e,t,n,r))}Editor3dGeometryReady(e){this._configuratorKernelCallbackListener.forEach(t=>t.Editor3dGeometryReady(e)),this.requestPlanComponentConstruction(e),this._configuratorUiCallbacks.onGeometryReady(e)}Editor3dGeometryNotReady(e){this._configuratorKernelCallbackListener.forEach(t=>t.Editor3dGeometryNotReady(e)),this._configuratorUiCallbacks.onGeometryNotReady(e)}componentDeleted(e){this._configuratorKernelCallbackListener.forEach(t=>t.componentDeleted(e))}componentMetaUpdated(e){let t=this._kernelInstance.getComponent(e);this._configuratorKernelCallbackListener.forEach(e=>e.componentMetaUpdated(t))}sceneCleared(){this._configuratorKernelCallbackListener.forEach(e=>e.sceneCleared())}requestMaterialsInGroup(e){(Array.isArray(e)?e:[e]).forEach(e=>{-1===this._cachedGroupIds.indexOf(e)&&this._cachedGroupIds.push(e)}),this._waitingForGroups||(this._waitingForGroups=!0,AsyncHelper.waitFor(4).then(()=>{this._rapiAccess.getMaterialsByGroup(this._cachedGroupIds).then(e=>{let t=[];e.forEach(e=>{const n=[];e.materials.forEach(e=>n.push(e.id));const r=e.legacyId||e.id;e.legacyId||console.warn("Material group has no legacy id, please check content why this is the case"),t.push({group:r,materials:n})}),t.length&&this._kernelInstance.setMaterialsInGroup(t),this._cachedGroupIds=[]},e=>{var t;console.error(e),null===(t=this._configuratorUiCallbacks)||void 0===t||t.onError(new Error(`Material group with ids "${this._cachedGroupIds.join(",")}" can not be loaded. "${e}"`)),this._cachedGroupIds=[]})}))}requestPlanComponentConstruction(e,t=!0){t?this._kernelInstance.requestDeltaPlanComponentConstruction(e):this._kernelInstance.requestPlanComponentConstruction(e)}addConfiguratorListener(e){this._configuratorKernelCallbackListener.add(e)}removeConfiguratorListener(e){this._configuratorKernelCallbackListener.delete(e)}cleanUpCallbacks(){"function"==typeof this._kernelContainer.unregisterConfiguratorCallback&&this._kernelContainer.unregisterConfiguratorCallback(this)}async requestMaterialProperties(e){let t=Array.isArray(e)?e:[e];if(this._requestedMaterialIds.push(...t),await wait(0),!this._requestedMaterialIds.length)return;const n=[...this._requestedMaterialIds];this._requestedMaterialIds=[];const r=await this._rapiAccess.getMaterials(n);let a=[];r.forEach(e=>{const t=new this._kernelContainer.StringStringMap,n=e.properties||{};for(let e in n)n.hasOwnProperty(e)&&t.set(e,n[e]);t.size()&&a.push({id:e.id,properties:t})}),a.length&&this._kernelInstance.setMaterialProperties(a)}registerCallbacks(){this._kernelContainer.registerConfiguratorCallback(this)}pause(){this.cleanUpCallbacks()}resume(){this.cleanUpCallbacks(),this.registerCallbacks()}destroy(){}_handleCortoMesh(e,t,n){var r;try{this._kernelInstance.addMeshCorto(t,n,new Uint8Array(e))}catch(e){console.error(e),null===(r=this._configuratorUiCallbacks)||void 0===r||r.onMemoryCorruption()}}_handleInvalidMesh(e){try{this._kernelInstance.setExternalMeshInvalid(e)}catch(e){console.error(e)}}calcPartsPriceSum(e){return this._calcPrice(e)}_calcPrice(e){const t=new Map;e||(e=this._kernelInstance.getFullPartList());const n=!!e&&!!e.fullList&&!!e.fullList.length;if(this._initData.useRoomlePrice&&n){const n=e.fullList[0].currencySymbol,r=e.fullList.reduce((e,t)=>e+(t.count?t.count:0)*(t.price?t.price:0),0),a=roundWithPrecision(r,2);return this._configuratorUiCallbacks.onUpdatePrice(n,a),Promise.resolve({totalSum:a,partMap:t})}if(this._initData.usePriceService&&n){const n=e.fullList.reduce((e,n)=>{const r=kernelPartToPriceId(n);return r&&(t.set(r,n),e.push(r)),e},[]);return new Promise((r,a)=>{this._rapiAccess.getPrices(n).then(n=>{if(!n.length)return a(new Error("prices are empty"));let i=0;const s=objectArrayToMap(n,"priceId");for(const t of e.fullList){const e=kernelPartToPriceId(t);if(!s.has(e)){console.warn("PriceId: "+e+" has no corresponding kernel-part");continue}const{price:n,currencySymbol:r}=s.get(e);t.price=n,t.currencySymbol=r,i+=n*t.count}return i=roundWithPrecision(i,2),this._configuratorUiCallbacks.onUpdatePrice(n[0].currencySymbol,i),r({totalSum:i,partMap:t})},e=>{console.error(e),a(e)})})}return Promise.resolve({totalSum:0,partMap:t})}async addUiDataAndPriceToPartList(e,t){const{fullList:n,originPart:r}=e,a=e.perMainComponent;let i;this.addUiDataToPartList(n,t);try{const t=await this._calcPrice(e);i=t.partMap}catch(e){console.error(e),i=new Map}const s=this._initData.usePriceService||this._initData.useRoomlePrice,o=e=>{s||(e.price=null,e.currencySymbol=null);const t=kernelPartToPriceId(e);if(!t)return;if(!i.has(t))return;const{price:n,currencySymbol:r}=i.get(t);"number"==typeof n&&(e.price=n,e.currencySymbol=r)};return n.forEach(o),a.forEach(({fullList:e,perMainComponent:n})=>{n.length>0&&console.error("Not implemented! perMainComponent is deeper than one level"),this.addUiDataToPartList(e,t),e.forEach(o)}),{fullList:n,perMainComponent:a,originPart:r}}addUiDataToPartList(e,t){const n=[];return e.forEach(e=>{const t=this._rapiAccess.peekComponent(e.componentId);!t||e.labelIsCalculated&&e.label||(e.label=t.label),e.parameters.forEach(e=>{if(this._unitFormatter.formatPartListParameter(e),isMaterial(e)){const t=this._rapiAccess.peekMaterial(e.value);t?e.valueLabel=t.label||t.name||e.value:-1===n.indexOf(e.value)&&n.push(e.value)}})}),n.length&&this._rapiAccess.getMaterials(n).then(e=>{const n=this._lastPartListHash!==t;Array.isArray(e)&&e.length&&n&&(this._lastPartListHash=t,this.requestPartListAndUpdatePricesOfParts())}),e}async requestPartListAndUpdatePricesOfParts(e,t){let n=this._kernelInstance.getFullPartList();e||(e=this._kernelInstance.getHashOfConfiguration(this._configuratorContext.planObjectId));const r=await this.addUiDataAndPriceToPartList(n,e);this._configuratorUiCallbacks.onPartListUpdate(r,btoa(e))}}__decorate([inject],CommonKernelAccess.prototype,"_rapiAccess",void 0),__decorate([inject],CommonKernelAccess.prototype,"_scriptLoader",void 0),__decorate([inject],CommonKernelAccess.prototype,"_kernelIo",void 0),__decorate([inject],CommonKernelAccess.prototype,"_dataSyncer",void 0),__decorate([inject],CommonKernelAccess.prototype,"_lifeCycleManager",void 0),__decorate([inject],CommonKernelAccess.prototype,"_configuratorUiCallbacks",void 0),__decorate([inject],CommonKernelAccess.prototype,"_globalCallback",void 0),__decorate([inject],CommonKernelAccess.prototype,"_initData",void 0),__decorate([inject],CommonKernelAccess.prototype,"_unitFormatter",void 0),__decorate([inject],CommonKernelAccess.prototype,"_configuratorContext",void 0),__decorate([inject],CommonKernelAccess.prototype,"_globalInitData",void 0);const{APP}=Env,{RAPI}=APP,headers=RAPI.headers,itemHeaders=RAPI.itemHeaders,TOKEN_IDENTIFIER=headers.token,isPlanSnapshotId=e=>e.startsWith("ps_"),LEGACY_GROUP_INDICATOR=uuid();let RAPI_MATERIAL_GROUP_CACHE=new Map,ITEM_ADDITIONAL_CONTENT_CACHE=new Map,RAPI_RELATIONS_CACHE=new Map,RAPI_CACHE=new Map,MESHES_TO_CATALOG_CACHE=new Map,RAPI_PACKAGE_CACHE=new Map,RAPI_PRELOAD_CACHE=new Map,WAITERS_FOR_URL=new Map,RAPI_ERROR_CACHE=new Map;const getCachedMaterialGroup=e=>RAPI_MATERIAL_GROUP_CACHE.get(e)||RAPI_MATERIAL_GROUP_CACHE.get(LEGACY_GROUP_INDICATOR+e),hasMaterialTags=e=>e&&e.tags&&e.tags.length,materialHasNoTagsButGroup=e=>!hasMaterialTags(e)&&e.group;class RapiAccess{constructor(e){this._itemLoaded=!1,this._currentToken=null,this._creator_=e,window.addEventListener("online",this._flushOfflineQueue.bind(this))}getPreloadForItem(e){return this._getPreload(e,!0)}getPreloadForConfiguration(e){return this._getPreload(e,!1)}_getPreload(e,t){return new Promise((n,r)=>{if(!navigator.onLine)return n();if(this._dataSyncer.getIsCatalogSynced(getCatalogIdFromItemOrConfigurationId(e)))return n();if(RAPI_PRELOAD_CACHE.get(e))return n();const a=t?"?itemId=":"?configurationId=";this._get("/preloads/components/"+a+e,"preloads/components").then(t=>{if(RAPI_PRELOAD_CACHE.get(e))return n();t.forEach(e=>{this._prepareData(e,"components")}),RAPI_PRELOAD_CACHE.set(e,!0),n()},r)})}changeUseOfHDGeometry(){const e=RAPI_CACHE.get("components");RAPI_PRELOAD_CACHE.clear(),RAPI_PACKAGE_CACHE.clear(),e&&RAPI_CACHE.delete("components")}getHSCPackage(e){return new Promise((t,n)=>{if(RAPI_PACKAGE_CACHE.get(e))return t();this._get("/catalogs/"+e+"/package","package").then(n=>{if(RAPI_PACKAGE_CACHE.get(e))return t(n);n.components.forEach(e=>{this._prepareData(e,"components")}),n.materials.forEach(e=>{this._prepareData(e,"materials"),this._prepareGroups(e)}),n.textures.forEach(e=>{this._prepareData(e,"textures")}),RAPI_PACKAGE_CACHE.set(e,!0),t(n)},n)})}getComponent(e){return this._getById(e,"components")}getConfiguration(e){return this._getById(e,"configurations")}getConfigurations(e){return this._getByIds(e,"configurations")}getItem(e){return this._getById(e,"items",{additionalHeaders:itemHeaders})}getComponents(e){return this._getByIds(e,"components")}getItems(e){return this._getByIds(e,"items",{additionalHeaders:itemHeaders})}getTag(e){return this._getById(e,"tags")}getTags(e){return this._getByIds(e,"tags")}getTexture(e){return this._getById(e,"textures")}getCatalog(e){return this._getById(e,"catalogs")}getMesh(e,t="crt",n=50){return this._getById(e,"meshes",{pathSuffix:"/data?format="+t+"&targetQuality="+n.toString()})}getMeshesOfCatalog(e){return new Promise((t,n)=>{const r=MESHES_TO_CATALOG_CACHE.get(e);r?t(r):this._get("/meshes?catalog="+e,"catalogMeshes").then(n=>{MESHES_TO_CATALOG_CACHE.set(e,n),t(n)},n)})}getTexturesOf(e){return this._getRelationData(e,{rapiPath:"textures"})}getItemsOf(e){return this._getRelationData(e,{rapiPath:"items"})}async getMaterialsOf(e){return(await this._getRelationData(e,{rapiPath:"materials"},{embed:["textures"]})).filter(e=>e.active)}getComponentsOf(e){return this._getRelationData(e,{rapiPath:"components"})}getAdditionalContentsOfItems(e){const t=[],n=[];return e.forEach(e=>{const r=ITEM_ADDITIONAL_CONTENT_CACHE.get(e.id.toString());r?n.push(...r):t.push(e.id.toString())}),new Promise((e,r)=>{0!==t.length?this._getByIdsPackets(t,"itemAdditionalContents",{filterKey:"itemIds"}).then(t=>{t.forEach(e=>{let t=ITEM_ADDITIONAL_CONTENT_CACHE.get(e.itemId);t||(t=[]);for(let n=0,r=t.length;n<r;n++)if(t[n].id===e.id)return;t.push(e),ITEM_ADDITIONAL_CONTENT_CACHE.set(e.itemId,t)}),e([...t,...n])},r):e(n)})}getMaterial(e){return this._getById(e,"materials",{embed:["textures"]})}peekMaterial(e){return this._peekData(e,"materials")}peekComponent(e){return this._peekData(e,"components")}peekItem(e){return this._peekData(e,"items")}peekConfiguration(e){return this._peekData(e,"configurations")}async getMaterials(e){return(await this._getByIds(e,"materials",{embed:["textures"]})).filter(e=>e.active)}getPlan(e){return this._getById(e,"plans")}getPlanSnapshot(e){return this._getById(e,"planSnapshots")}static clearCaches(){RAPI_MATERIAL_GROUP_CACHE=new Map,RAPI_RELATIONS_CACHE=new Map,RAPI_CACHE=new Map,RAPI_PACKAGE_CACHE=new Map,RAPI_PRELOAD_CACHE=new Map,WAITERS_FOR_URL=new Map,ITEM_ADDITIONAL_CONTENT_CACHE=new Map}cleanUp(){RapiAccess.clearCaches()}getMaterialsByGroup(e){const t=e.slice(),n=[];let r=t.length;for(let e=0;e<r;e++){const a=getCachedMaterialGroup(t[e]);if(a){const i=a.length;for(let e=0;e<i;e++){const t=this._getCache("materials").get(a[e]);n.push(t)}t.splice(e,1),r--,e--}}return new Promise((e,r)=>{0!==t.length&&navigator.onLine?this._getByIdsPackets(t,"materials",{filterKey:"groups",embed:["textures"]}).then(t=>{e(this.combineMaterialsToGroups([...t,...n]))},r):e(this.combineMaterialsToGroups(n))})}_flushOfflineQueue(){return new Promise((e,t)=>{const n=this._localStorage.getItem("hsc_configurations_offline_queue_v1"),r=[];for(let e in n)if(n.hasOwnProperty(e)){const t=n[e];r.push(new Promise((e,n)=>{this.saveConfiguration(t.data).then(r=>{const a=[];t.perspectiveImage&&!r.perspectiveImage&&a.push(this.savePerspectiveImage(r,t.perspectiveImage)),t.topImage&&!r.topImage&&a.push(this.savePerspectiveImage(r,t.topImage)),Promise.all(a).then(e,n)},n)}))}Promise.all(r).then(()=>{this._localStorage.setItem("hsc_configurations_offline_queue_v1",{}),e()},t)})}_setQueuedConfiguration(e,t={}){const n=e.configurationHash,{perspectiveImage:r,topImage:a}=t;let i=this._localStorage.getItem("hsc_configurations_offline_queue_v1")||{},s=i[n]||{};s.data=e,s.perspectiveImage=r,s.topImage=a,i[n]=s,this._localStorage.setItem("hsc_configurations_offline_queue_v1",i)}async saveConfiguration(e){return navigator.onLine?await this._save("/configurations",{configuration:e},"configurations",{accept:"application/json",contentType:"application/json; charset=UTF-8"}):(e.perspectiveImage=null,e.topImage=null,this._setQueuedConfiguration(e),this._markConfigurationAsLocally(e),Promise.resolve(e))}saveTopImage(e,t){return this._saveConfigurationImage(e,t,"topImage")}savePerspectiveImage(e,t){return this._saveConfigurationImage(e,t,"perspectiveImage")}savePlanSnapshotTopImage(e,t){return this._savePlanSnapshotImage(e,t,"topImage")}savePlanSnapshotPerspectiveImage(e,t){return this._savePlanSnapshotImage(e,t,"perspectiveImage")}getShortUrl(e,t){return new Promise((n,r)=>this._fetchJson("/shortIds","shortIds",{method:"POST",resolve:n,reject:r,data:JSON.stringify({shortId:{type:t,referencedId:e}}),accept:"application/json",contentType:"application/json; charset=UTF-8"}))}_peekData(e,t){const n=RAPI_CACHE.get(t);return n&&n.get(e)||null}_saveConfigurationImage(e,t,n){if(!navigator.onLine){const r={};return r[n]=t,this._setQueuedConfiguration(e,r),this._markConfigurationAsLocally(e),e[n]=t.image,Promise.resolve(e)}const r=this._formDataUtil.create(t.image,e.configurationHash,IMAGE_FORMATS.PNG,n);return this._save("/configurations/"+e.id+"/"+n,r,"configurations",{accept:"application/json"})}_savePlanSnapshotImage(e,t,n){const r=this._formDataUtil.create(t.image,e.id,IMAGE_FORMATS.PNG,"file");return r.append("type",n),this._save("/planSnapshots/"+e.id,r,"planSnapshots",{accept:"application/json",method:"PUT"})}_markConfigurationAsLocally(e){e.isLocally=!0,e.id=e.configurationHash}_save(e,t,n,r={}){const a=t instanceof FormData?t:JSON.stringify(t);return new Promise((t,i)=>{const s={method:r.method||"POST",data:a,resolve:t,reject:i};r.contentType&&(s.contentType=r.contentType),r.accept&&(s.accept=r.accept),this._fetchJson(e,n,s)})}combineMaterialsToGroups(e){return new Promise((t,n)=>{const r=new Map,a={id:null,label:null,materials:[]},i=[];for(let t=0,n=e.length;t<n;t++){const n=e[t],s=n.tags&&n.tags.length?n.tags.map(e=>({isTag:!0,id:e})):[];n.group&&s.push({isTag:!1,id:LEGACY_GROUP_INDICATOR+n.group,legacyId:n.group}),s.length||s.push({isTag:!1,id:null}),n.tags&&n.tags.length&&n.tags.forEach(e=>-1===i.indexOf(e)?i.push(e):null),s.forEach(({isTag:e,id:t,legacyId:i})=>{const s=n.id;let o=t?getCachedMaterialGroup(t):[];o||(RAPI_MATERIAL_GROUP_CACHE.set(t,[]),o=getCachedMaterialGroup(t)),-1===o.indexOf(s.toString())&&o.push(s.toString());const l=hasMaterialTags(n),d=l&&e,h=materialHasNoTagsButGroup(n);if(d||h&&!e||!l&&!h&&!t){let e=t?r.get(t):a;e||(r.set(t,{id:t,label:n.groupLabel,legacyId:i,materials:[]}),e=r.get(t)),e.materials.push(n)}})}const s=a.materials.length?[a]:[];this.getTags(i).then(e=>{const n=e.reduce((e,t)=>(e[t.id]=t,e),{});return r.forEach((e,t)=>{s.push({id:t,label:n[t]?n[t].label:e.label,materials:e.materials,legacyId:e.legacyId,sort:n[t]?n[t].sort:void 0})}),t(s)},n)})}_getByIds(e,t,n={}){const r=this._getCache(t),a=this._getErrorCache(t),i=[],s=[...new Set(e)];let o=s.length;if(r&&r.size){const e=(new Date).getTime();for(let t=0;t<o;t++){const n=s[t],l=r.get(n),d=a.get(n);let h=!1;null!=l?(i.push(l),h=!0):h=void 0!==d&&(e-d.timestamp<6e4||!1===navigator.onLine),h&&(s.splice(t,1),o--,t--)}}return new Promise((e,r)=>{0!==s.length&&navigator.onLine?this._getByIdsPackets(s,t,n).then(t=>{e([...t,...i])},r):e(i)})}_getByIdsPackets(e,t,n={}){const r=n.filterKey||"ids";let a,i="/"+t+"/",s="?",o=[];const l=e.length;if(!l)return new Promise(e=>e([]));let d=!0,h=[];for(a=0;a<l;a++){d=!1;const n=e[a],l=s+r+"[]="+n,c=l.length+i.length;h.push(n),s="&",c<=1500?i+=l:(c>1500&&(h.pop(),a--),o.push({url:i,ids:h}),d=!0,i="/"+t+"/",s="?",h=[])}d||o.push({url:i,ids:h});const c=[];return o.forEach(e=>c.push(this._getByIdsSingle(e.ids,e.url,t,n))),new Promise((e,t)=>{Promise.all(c).then(t=>{const n=[];t.length&&t.forEach(e=>n.push(...e)),e(n)},t)})}_getByIdsSingle(e,t,n,r={}){return new Promise((a,i)=>{this._get(t,n,r).then(t=>{for(let n=0,a=t.length;n<a;n++){const a=r&&r.cacheKey?t[n][r.cacheKey]:t[n].id,i=e.indexOf(a.toString());-1!==i&&e.splice(i,1)}const i=e.length;if(i){const t=this._getCache(n),r=this._getErrorCache(n),a=(new Date).getTime();for(let n=0;n<i;n++)r.set(e[n],{code:0,timestamp:a}),t.delete(e[n]);this._errorHandler.dispatch(2,[n,e.map(e=>'"'+e+'"').join(",")])}a(t)},i)})}_getById(e,t,n={}){if(!e||""===e||"string"!=typeof e)return console.error("no id passed to _getById"),Promise.reject(new Error("no id passed to _getById"));const r=this._getCache(t).get(e);if(r)return new Promise(e=>e(r));if(!navigator.onLine)return Promise.reject("Nothing cached but tried to fetch in offline mode");const a={...n,id:e},i=n.pathSuffix||"";return this._get("/"+t+"/"+e+i,t,a)}_get(e,t,n={}){const r=AppContext.useHDGeometry?"includeGeometryHD=true":"";let a=-1===e.indexOf("?")?"?":"&";return""!==r&&(e+=a+r),n.embed&&Array.isArray(n.embed)&&n.embed.forEach(t=>{e+=a+"embed"+(t[0].toUpperCase()+t.substr(1))+"=true",a="&"}),new Promise((r,a)=>{const i=WAITERS_FOR_URL.get(e);Array.isArray(i)&&i.length>0?i.push({resolve:r,reject:a}):(WAITERS_FOR_URL.set(e,[{resolve:r,reject:a}]),this._fetchJson(e,t,n))})}_fetchJson(e,t,n={}){this._fetch(e,n).then(handleJsonResponse.bind(this)).then(this._handleJson(e,t,n).bind(this)).catch(this._handleError(e,n).bind(this))}async _fetch(e,t){const n={method:t.method?t.method:"GET",headers:this._createHeaders(t),mode:"cors",cache:"default"};t.data&&(n.body=t.data);let r=RAPI.server;const a=this._globalInitData.overrideRapi;a&&(r="live"===a?RAPI.liveServer:RAPI.testServer),(this._globalInitData.customApiUrl||""===this._globalInitData.customApiUrl)&&(r=this._globalInitData.customApiUrl);const i=new Request(r+e,n);this._globalCallback.onNetworkRequest(e,n,t);const s=await this._globalCallback.onCheckExternalCache(e,n);return s?{headers:{get:()=>"application/json"},json:()=>Promise.resolve(s)}:this._networkLayer.fetch(i,{},{checkResponse:e=>this._globalCallback.onValidateNetworkResponse("rapi-access",e)})}_createHeaders(e={}){const t={...headers};this._globalInitData.overrideTenant&&(t.currentTenant=this._globalInitData.overrideTenant),this._globalInitData.overrideCountry&&(t.country=this._globalInitData.overrideCountry);const n=this._globalInitData.locale||"en";t.language=n,t.locale=n;const{contentType:r,accept:a,additionalHeaders:i,data:s}=e;if(r&&(t["content-type"]=e.contentType),a&&(t.accept=e.accept),i)for(let e in i)i.hasOwnProperty(e)&&(t[e]=i[e]);this._globalInitData.configuratorId&&(t.configurator=this._globalInitData.configuratorId);const o=this._currentToken||TOKEN_IDENTIFIER;t.token="03-"+window.btoa((new Date).toISOString()+";"+o+";"+headers.apiKey);const l=new Headers(t);return s instanceof FormData&&l.delete("content-type"),l}_handleJson(e,t,n={}){return r=>{let a=null,i=null;"number"==typeof r&&(a=r);for(let e in r)"meta"!==e&&r.hasOwnProperty(e)&&(a=r[e],i=e);if("error"===i)return this._handleError(e,n)(new Error(JSON.stringify(a)));if(!a)throw new TypeError("RAPI returned empty JSON");if(Array.isArray(a))for(let e=0,r=a.length;e<r;e++)this._prepareData(a[e],t,n),this._prepareEmbeddedData(a[e],t,n);else this._prepareData(a,t,n),this._prepareEmbeddedData(a,t,n);n.resolve?n.resolve(a):this._notifyWaiters(e,null,a)}}_prepareEmbeddedData(e,t,n={}){n.embed&&Array.isArray(n.embed)&&n.embed.forEach(r=>{const a=e[r.slice(0,-1)+"Objects"];if(Array.isArray(a)){for(let e=0,t=a.length;e<t;e++)this._prepareData(a[e],r,n);this._prepareRelationalData(t,r,e.id,a)}else a&&(this._prepareData(a,r,n),this._prepareRelationalData(t,r,e.id,[a]))})}_getCache(e){return this._getCacheFrom(e,RAPI_CACHE)}_getErrorCache(e){return this._getCacheFrom(e,RAPI_ERROR_CACHE)}_getCacheFrom(e,t){let n=t.get(e);return n||(t.set(e,new Map),n=t.get(e)),n}_setCache(e,t,n){n.set(e.toString(),t)}_prepareData(e,t,n=null){let r=this._getCache(t);const a=n&&n.cacheKey?e[n.cacheKey]:e.id;if(a||n&&n.id||"tenants/me"===t)if("tenants/me"!==t){{const t=a||n.id;this._setCache(t,e,r)}e.__rapi_path__=t}else this._setCache("0",e,r);else"shortIds"!==t&&console.error("Can not cache because there is no ID!")}_getRelationsCacheFor(e,t,n){let r=RAPI_RELATIONS_CACHE.get(t);if(!r){const a=new Map,i=new Map;i.set(n,void 0),a.set(e,i),RAPI_RELATIONS_CACHE.set(t,a),r=RAPI_RELATIONS_CACHE.get(t)}let a=r.get(e);if(!a){const t=new Map;t.set(n,void 0),r.set(e,t),a=r.get(e)}return a.get(n)}_prepareGroups(e){const t=e.group,n=e.id;let r=getCachedMaterialGroup(t);r||(RAPI_MATERIAL_GROUP_CACHE.set(t,[]),r=getCachedMaterialGroup(t)),-1===r.indexOf(n.toString())&&r.push(n.toString())}_handleError(e,t={}){return n=>{navigator.onLine?(n.rmlErrorCode=1,n.message='Failed to load "'+e+'" because of "'+n.message+'"',this._errorHandler.dispatch(1,[n])):(n.rmlErrorCode=0,n.message='Failed to load "'+e+'" because of "'+n.message+'"',this._errorHandler.dispatch(0,[n])),t.reject?t.reject(n):this._notifyWaiters(e,n,null)}}_getRelationData(e,t,n={}){const r=e.id;if(!r)return Promise.resolve([]);const a=e.__rapi_path__,i=t.rapiPath;let s=this._getCache(i),o=this._getRelationsCacheFor(r.toString(),a,i),l=[];return o?(o.forEach(e=>l.push(s.get(e))),new Promise(e=>e(l))):navigator.onLine?new Promise((e,t)=>{this._get("/"+a+"/"+r+"/"+i,i,n).then(t=>{this._prepareRelationalData(a,i,r,t),e(t)},t)}):Promise.resolve([])}_prepareRelationalData(e,t,n,r){RAPI_RELATIONS_CACHE.has(e)||RAPI_RELATIONS_CACHE.set(e,new Map);let a=RAPI_RELATIONS_CACHE.get(e);const i=n.toString();a.has(i)||a.set(i,new Map);let s=a.get(i),o=this._getCache(t),l=[];for(let e=0,t=r.length;e<t;e++){const t=r[e],n=t.id.toString();l.push(n),o.set(n,t)}s.set(t,l)}_notifyWaiters(e,t,n){const r=WAITERS_FOR_URL.get(e);if(r&&r.length){for(let e=0,a=r.length;e<a;e++)t?r[e].reject(t):r[e].resolve(n);WAITERS_FOR_URL.delete(e)}}_tenantMe(){return new Promise((e,t)=>{const n=this._getCache("tenants/me"),r=this._globalInitData.overrideTenant?this._globalInitData.overrideTenant:n.get("0");if(r)return e(r);this._fetchJson("/tenants/me","tenants/me",{resolve:t=>e(t),reject:t})})}async getTenant(e){return e||(e=await this._tenantMe()),this._getById(e.toString(),"tenants")}getCurrentSkin(){return this._tenantMe().then(e=>this._getById(e.toString(),"tenants").then(e=>this._getById(e.skin.toString(),"skins")))}getPrices(e){return this._getByIds(e,"prices",{filterKey:"priceIds",cacheKey:"priceId"})}async getConfiguratorSettings(e){const t=await this._getById(e,"configurators");return t.allowedHosts||(t.allowedHosts=[]),t.allowedHosts&&!Array.isArray(t.allowedHosts)&&(t.allowedHosts=t.allowedHosts.split(" ")),t}sendUserAction(e){return this._save("/userActions",{userAction:e},"userActions",{accept:"application/json",contentType:"application/json; charset=UTF-8"})}_share(e,t,n,r){const a="/"+r+"/"+e+"/shares",i=new FormData;return i.append("email",t),i.append("type",n.toString()),new Promise((e,t)=>{const n={method:"POST",data:i,resolve:e,reject:t,accept:"application/json",contentType:"application/json; charset=UTF-8"};this._fetch(a,n).then(n.resolve,n.reject)})}shareConfiguration(e,t,n){return this._share(e,t,n,"configurations")}sharePlanSnapshot(e,t,n){return this._share(e,t,n,"planSnapshots")}export3D(e,t,n,r={}){const a="/"+(isPlanSnapshotId(e)?"planSnapshots":"configurations")+"/"+e+"/3d-exports",i={formats:[{file_format:n,pack_external_data:!0,...r}]},s=JSON.stringify(i),o=new FormData;return o.append("email",t),o.append("settings",s),new Promise((e,t)=>{const n={method:"POST",data:o,resolve:e,reject:t};this._fetch(a,n).then(n.resolve,n.reject)})}async trackView(e){if(this._itemLoaded||(t=(()=>{var e;const t=(()=>{if(window.__RML__ENV__&&window.__RML__ENV__.skipIframeCheck)return!1;try{return window.self!==window.top}catch(e){return!0}})();let n=null===(e=null===window||void 0===window?void 0:window.location)||void 0===e?void 0:e.href;if(!n)return null;if(t){if(!document.referrer)return null;n=document.referrer}const{hostname:r}=new URL(n);return r})())&&(NAMES_FOR_LOCALHOST.includes(t)||t.endsWith("gitlab.io")||t.endsWith("gitlab.com")||t.endsWith("codesandbox.io")||t.endsWith("stackblitz.com")||/^(admin.*.roomle.com)$/.test(t)))return;var t;const{configuratorId:n}=this._globalInitData,r={module:3,action:1,actionId:e,actionLabel:n};await this.sendUserAction(r),this._itemLoaded=!0}signinUser(e,t){return new Promise((n,r)=>{const a={method:"POST",accept:"application/json",contentType:"application/json; charset=UTF-8",data:JSON.stringify({identification:e,passwordMD5:t}),cacheKey:"token",resolve:n,reject:r};this._fetchJson("/auth/signin","auth",a)})}async signoutUser(e){const t=this._currentToken;t!==e&&this.setCurrentToken(e),await this._fetch("/auth/signout",{}),t&&t!==e?this.setCurrentToken(t):this.removeCurrentToken()}async savePlan(e){const t=e.id?"/plans/"+e.id:"/plans";return this._save(t,{plan:e},"plans",{method:e.id?"PUT":"POST",accept:"application/json",contentType:"application/json; charset=UTF-8"})}async savePlanSnapshot(e){return this._save("/planSnapshots",{planSnapshot:e},"planSnapshots",{accept:"application/json",contentType:"application/json; charset=UTF-8"})}setCurrentToken(e){this._currentToken=e}removeCurrentToken(){this._currentToken=null}createNewPlan(){return{name:"",description:"",changeDate:(new Date).toISOString(),created:(new Date).toISOString(),draftId:null,thumbnail:"data:image/png;base64,missing",planObjects:null,active:!0,open:0,planDirectory:0,changed:0,version:2,floorLevel:0,visibility:9,user:null,tenant:null,assets:[],parent:null,setting:null}}}__decorate([inject],RapiAccess.prototype,"_formDataUtil",void 0),__decorate([inject],RapiAccess.prototype,"_errorHandler",void 0),__decorate([inject],RapiAccess.prototype,"_dataSyncer",void 0),__decorate([inject],RapiAccess.prototype,"_networkLayer",void 0),__decorate([inject],RapiAccess.prototype,"_localStorage",void 0),__decorate([inject],RapiAccess.prototype,"_globalInitData",void 0),__decorate([inject],RapiAccess.prototype,"_globalCallback",void 0);const PULSE_DURATION=1500,PULSE_LOOPS=5;function RoomleComponentFactoryInitializer(){class e extends Object3D{static _generateOutline(e,t){let n=new LineSegments(new EdgesGeometry(e),new LineDashedMaterial({color:"#000000",dashSize:.03,gapSize:.01,linewidth:1}));return n.translateOnAxis(t,1),n.userData.ignoreComponentRaycast=!0,n}static cloneDockLine(e,t){let n=new LineSegments(e.geometry,e.material);return n.translateOnAxis(t.getCenter(new Vector3),1),n.name="dockline",n.layers.set(5),n.userData.ignoreComponentRaycast=!0,n}_setValues(e,t,n,r){e&&(this.runtimeId=e,this.name=e.toString()),t&&(this.roomlePosition=Object.assign({},t)),n&&(this.roomleRotation=Object.assign({},n)),r&&(this.parentObjectId=r)}constructor(e,t,n,r){super(),this._selected=!1,this.geometryChanged=!0,this.meshes=[],this.castShadow=!1,this.receiveShadow=!0,this._setValues(e,t,n,r)}get loadingMesh(){return this._loadingMesh}get boundingBoxMesh(){return this._boundingBoxMesh}get boundingBox(){return this._boundingBox}set roomlePosition(e){this._roomlePosition=e,e&&this.position.set(e.x/1e3,e.z/1e3,e.y/-1e3)}get roomlePosition(){return this._roomlePosition}set roomleRotation(e){this._roomleRotation=e,e&&this.rotation.set(e.x,e.z,-e.y)}get roomleRotation(){return this._roomleRotation}replaceMeshes(e){this.removeAllMeshes(),e.forEach(e=>{this.addMesh(new Mesh(e.geometry,e.material))})}addMesh(e,t){e.renderOrder=2,e.userData.meshType=0,t&&e.applyMatrix4(convertToThreeMatrix(t)),this.add(e),this.meshes.push(e)}getMeshById(e){return this.meshes.find(t=>t.userData.meshId===e)}removeMeshById(e){const t=this.getMeshById(e);t?this.removeMesh(t):console.warn("Could not remove mesh with id "+e,this.runtimeId,this.meshes)}removeMesh(e){const t=this.meshes.indexOf(e);this.remove(e),disposeMesh(e),t<0||this.meshes.splice(t,1)}removeAllMeshes(e=!0){this.meshes.forEach(t=>{this.remove(t),e&&disposeMesh(t)}),this.meshes=[],this._removeLoadingMesh(),this.remove(this._boundingBoxMesh),disposeMesh(this._boundingBoxMesh),this._boundingBoxMesh=null}_hideAllMeshes(){this.meshes.forEach(e=>e.visible=!1)}_showAllMeshes(){this.meshes.forEach(e=>e.visible=!0)}select(){this._selected=!0}loading(){if(!this._kernelBoundingBox)return void console.warn("Bounding box (box for measurements) for component "+this.runtimeId+" not set, can not show external mesh loading box!");this._removeLoadingMesh(),this._hideAllMeshes();const{x:e,y:t,z:n}=this._kernelBoundingBox.getSize(new Vector3);let r=new BoxGeometry(e,t,n);this._loadingMesh=new Mesh(r,MaterialCreator.createMeshStandardMaterial({transparent:!0,opacity:1,color:new Color$1("#DDDDDD")})),this._loadingMesh.name="loading mesh",this._loadingMesh.receiveShadow=!1,this._loadingMesh.castShadow=!1,this._loadingMesh.layers.set(5),this._loadingMesh.translateOnAxis(this._kernelBoundingBox.getCenter(new Vector3),1),this._loadingMesh.renderOrder=3,this.add(this._loadingMesh)}_removeLoadingMesh(){this._loadingMesh&&(this.remove(this._loadingMesh),disposeMesh(this._loadingMesh),this._loadingMesh=null)}loadingFinished(){this._removeLoadingMesh(),this._showAllMeshes()}deselect(){this._selected=!1}hoverOn(){setCursor("pointer")}hoverOff(){setCursor("default")}removeFromParent(){return this.parent&&(this.parent.remove(this),this.removeAllMeshes()),this}computeBoundingBox(t,n=!1){if(this._boundingBoxMesh&&this.remove(this._boundingBoxMesh),!n&&t&&0===t.size.x&&0===t.size.y&&0===t.size.z)return;let r;if(!t||n){this._boundingBox=new Box3;let e=new Vector3;this.meshes.forEach(t=>{if(t.geometry instanceof BufferGeometry){let n=t.geometry.attributes.position;if(void 0!==n)for(let r=0,a=n.count;r<a;r++)e.fromBufferAttribute(n,r).applyMatrix4(t.matrix),this._boundingBox.expandByPoint(e)}}),this._kernelBoundingBox=this._boundingBox.clone();let t=this._boundingBox.max.x-this._boundingBox.min.x,n=this._boundingBox.max.y-this._boundingBox.min.y,a=this._boundingBox.max.z-this._boundingBox.min.z;r=new BoxGeometry(t,n,a)}else{this._kernelBoundingBox=kernelBoxToThreeBox(t),this._boundingBox=this._kernelBoundingBox.clone();let{x:e,y:n,z:a}=this._boundingBox.getSize(new Vector3);r=new BoxGeometry(e,n,a)}this._boundingBoxMesh=new Mesh(r,MaterialCreator.createMeshStandardMaterial({color:"#FFFFFF",transparent:!0,opacity:0,polygonOffset:!0,polygonOffsetFactor:-1,visible:!1})),this._boundingBoxMesh.name="bounding box mesh";let a=this._boundingBox.getCenter(new Vector3);this._boundingBoxMesh.position.add(a),this._boundingBoxMesh.layers.set(5),this._boundingBoxMesh.renderOrder=3,this._boundingBoxMesh.castShadow=!1,this._boundingBoxMesh.receiveShadow=!1,this.add(this._boundingBoxMesh),this._dockline=e._generateOutline(r,a),this._dockline.name="bounding box outline",this._dockline.layers.set(5),this._selected&&this.add(this._dockline)}recursiveMeshes(){let t=this.meshes.slice();return this.children.forEach(n=>{n instanceof e&&t.push(...n.recursiveMeshes())}),t}isChild(t){let n=!1;return this.children.forEach(r=>{r instanceof e&&!n&&(n=r.runtimeId===t||r.isChild(t))}),n}getKernelPosition(e){let t=this.parent.localToWorld(this.position);return convertToKernel(e.worldToLocal(t))}}class t extends e{constructor(e,t){super(e,null,null,null),this.glbUrl=t}}class n extends e{constructor(e,t,n,r,a){super(t,n,r,a),this._stringId=null,this.receivedPointAssociation=!1,this.castShadow=!1,this.receiveShadow=!1,this._creator_=e}get stringId(){return this._stringId?this._stringId:this.runtimeId.toString()}addMesh(e,t){super.addMesh(e,t),e.material instanceof MeshStandardMaterial&&(e.material.opacity=.8,e.material.roughness=1,e.material.metalness=0,e.material.color=new Color$1(this._initData.colors.PREVIEW_DOCKING_COLOR)),e.renderOrder=1,e.castShadow=!1,e.receiveShadow=!1}startPulsating(){var e,t;if(null===(t=null===(e=this._initData)||void 0===e?void 0:e.featureFlags)||void 0===t?void 0:t.pulsePreview)for(const e of this.meshes){const t={opacity:.8},n={opacity:.3};new TWEEN.Tween(t).to(n,1500).easing(TWEEN.Easing.Sinusoidal.In).onUpdate(()=>{e.material.opacity=t.opacity}).yoyo(!0).repeat(5).start()}}hoverOn(){this.remove(this._dockline),this.meshes.forEach(({material:e})=>{e.opacity=.9,e.roughness=1,e.metalness=0,e.color=new Color$1(this._initData.colors.PREVIEW_DOCKING_COLOR)}),setCursor("pointer")}hoverOff(){this.add(this._dockline),this.meshes.forEach(({material:e})=>{e.opacity=.8,e.roughness=1,e.metalness=0,e.color=new Color$1(this._initData.colors.PREVIEW_DOCKING_COLOR)}),setCursor("default")}clonePreview(t){const r=new n(this._creator_,this.runtimeId,this.roomlePosition,this.roomleRotation,this.parentObjectId);return r._stringId=this.runtimeId+"_"+t,this.children.forEach(e=>{e instanceof Mesh&&0===e.userData.meshType&&r.meshes.push(e.clone(!0))}),r.meshes.forEach(e=>{e.material=e.material.clone(),e.geometry=e.geometry.clone(),r.add(e)}),this._dockline&&(r._dockline=e.cloneDockLine(this._dockline,this._boundingBox)),this._boundingBoxMesh&&(r._boundingBoxMesh=this._boundingBoxMesh.clone(!0)),this._boundingBox&&(r._boundingBox=this._boundingBox.clone()),r}preparePreview(){this.add(this._dockline),this.add(this._boundingBoxMesh)}}__decorate([inject],n.prototype,"_initData",void 0);class r extends n{constructor(e,t,n,r,a,i){super(e,t,n,r,a),i&&(this._stringId=this.runtimeId+"_has_additional_dock_point_copy")}set roomleLineFrom(e){this._roomleLineFrom=e,this.lineFrom=convertToTHREE(e)}get roomleLineFrom(){return this._roomleLineFrom}set roomleLineTo(e){this._roomleLineTo=e;let t=convertToTHREE(e);t.equals(this.lineFrom)&&(console.warn("lineFrom and lineTo are equal!"),t.add(new Vector3(0,.01,0))),this.lineTo=t}get roomleLineTo(){return this._roomleLineTo}set roomlePositionFrom(e){this._roomlePositionFrom=e,this.positionFrom=convertToTHREE(e)}get roomlePositionFrom(){return this._roomlePositionFrom}set roomlePositionTo(e){this._roomlePositionTo=e;let t=convertToTHREE(e);t.equals(this.positionFrom)&&(console.warn("positionFrom and positionTo are equal!"),t.add(new Vector3(0,.01,0))),this.positionTo=t}get roomlePositionTo(){return this._roomlePositionTo}addMesh(e,t){super.addMesh(e,t),e.visible=!1,e.renderOrder=3}hoverOn(){this._dockline.visible=!0,setCursor("pointer")}hoverOff(){this._dockline.visible=!1,setCursor("default")}preparePreview(){super.preparePreview(),this._dockline.visible=!1;let e=this.lineTo.clone(),t=this.lineFrom.clone();const n=(new Vector3).subVectors(e,t);let r=n.length(),a=n.normalize(),i=new ArrowHelper(a,t),s=new CylinderGeometry(.01,.01,r,16,1);this.lineMesh=new Mesh(s,MaterialCreator.createMeshStandardMaterial({color:"#DDDDDD",transparent:!0,opacity:.4})),this.lineMesh.name="line mesh";const o=(new Quaternion).setFromEuler(i.rotation);this.lineMesh.quaternion.multiply(o),this.lineMesh.renderOrder=1;let l=(new Vector3).addVectors(e,t).multiplyScalar(.5);this.lineMesh.position.copy((new Vector3).subVectors(l,this.position.clone())),this.add(this.lineMesh);let d=this._boundingBox.getCenter(new Vector3).applyEuler(this.docklineRotation),h=null,c=0,u=Math.abs(a.x),p=Math.abs(a.y),m=Math.abs(a.z);u>=p&&u>=m?(h=new Vector3(d.x,0,0),c=Math.sqrt(d.y*d.y+d.z*d.z)):p>=u&&p>=m?(h=new Vector3(0,d.y,0),c=Math.sqrt(d.x*d.x+d.z*d.z)):m>=p&&m>=u&&(h=new Vector3(0,0,d.z),c=Math.sqrt(d.y*d.y+d.x*d.x)),c=c>0?c:.01;let g=(new Vector3).subVectors(this.positionTo.clone(),this.positionFrom.clone()).length()+h.length(),f=new CylinderGeometry(1.1*c,1.1*c,g,32,1);this.boundingLineMesh=new Mesh(f,MaterialCreator.createMeshStandardMaterial({color:"#ffffff",transparent:!0,opacity:0})),this.boundingLineMesh.name="bounding line mesh",this.boundingLineMesh.userData.ignoreComponentRaycast=!0,this.boundingLineMesh.layers.set(5);let _=this.positionTo.clone(),v=this.positionFrom.clone(),w=(new Vector3).subVectors(_,v).normalize(),b=new ArrowHelper(w,v);const S=(new Quaternion).setFromEuler(b.rotation);this.boundingLineMesh.quaternion.multiply(S),this.boundingLineMesh.renderOrder=3;let y=(new Vector3).addVectors(this.positionTo.clone(),this.positionFrom.clone()).multiplyScalar(.5).add(d);this.boundingLineMesh.position.copy((new Vector3).subVectors(y,this.position.clone())),this.add(this.boundingLineMesh)}clonePreviewLine(t){let n=new r(this._creator_,this.runtimeId,this.roomlePosition,this.roomleRotation,this.parentObjectId,this.receivedPointAssociation);return n._stringId=this.runtimeId+"_"+t,this.children.forEach(e=>{e instanceof Mesh&&0===e.userData.meshType&&n.meshes.push(e.clone(!0))}),n.meshes.forEach(e=>{e.material=e.material.clone(),e.geometry=e.geometry.clone(),n.add(e)}),this._dockline&&(n._dockline=e.cloneDockLine(this._dockline,this._boundingBox)),this._boundingBoxMesh&&(n._boundingBoxMesh=this._boundingBoxMesh.clone(!0)),this._boundingBox&&(n._boundingBox=this._boundingBox.clone()),n}getPositionForIntersectionPoint(e){let t=this._boundingBox.getCenter(new Vector3).applyEuler(this.docklineRotation),n=this.positionTo.clone().add(t),r=this.positionFrom.clone().add(t),a=new Line3(r,n).closestPointToPoint(e,!0,new Vector3);return(isNaN(a.x)||isNaN(a.y)||isNaN(a.z))&&a.copy(e),a.sub(t)}updatePreviewPosition(e){let t=this.getPositionForIntersectionPoint(e),n=this.parent.localToWorld(t);this._newPosition=this.worldToLocal(n);let r=this._boundingBox.getCenter(new Vector3).applyEuler(this.docklineRotation);this._dockline.position.copy((new Vector3).addVectors(this._newPosition,r)),this._dockline.rotation.copy(this.docklineRotation)}hideSelectionLine(){this._dockline.visible=!1}getKernelPosition(e){if(this._newPosition){let t=this.localToWorld(this._newPosition);return convertToKernel(e.worldToLocal(t))}return super.getKernelPosition(e)}}class a extends OrthographicCamera{constructor(e,t,n,r,a,i,s){super(e,t,n,r,a,i),s||(s={left:0,top:1,right:1,bottom:0}),this.offset=s}set offset(e){this._offset=e,this.updateProjectionMatrix()}get offset(){return this._offset}resetOffset(){this._offset={left:0,top:1,right:1,bottom:0}}updateProjectionMatrix(){this._offset?(this.projectionMatrix=this._calculateProjectionMatrix(),this.projectionMatrixInverse.copy(this.projectionMatrix).invert()):super.updateProjectionMatrix()}_calculateProjectionMatrix(){const e=this._calculate2DPlanes();if(this._offset.left>=this._offset.right||this._offset.bottom>this._offset.top)return(new Matrix4).makeOrthographic(e.left,e.right,e.top,e.bottom,this.near,this.far);const t=this._scaleRange(e.left,e.right,this._offset.left,this._offset.right);let n=t.from,r=t.to;const a=this._scaleRange(e.bottom,e.top,this._offset.bottom,this._offset.top);let i=a.from,s=a.to;const o=(e.right-e.left)/(e.top-e.bottom),l=(r-n)/(s-i);if(l>o){const e=(i+s)/2,t=(s-i)*l/o;i=e-t/2,s=e+t/2}else{const e=(n+r)/2,t=(r-n)*o/l;n=e-t/2,r=e+t/2}return(new Matrix4).makeOrthographic(n,r,s,i,this.near,this.far)}_scaleRange(e,t,n,r){const a=(t-e)/(r-n);return{from:e-a*n,to:t+a*(1-r)}}_calculate2DPlanes(){const e=(this.right-this.left)/(2*this.zoom),t=(this.top-this.bottom)/(2*this.zoom),n=(this.right+this.left)/2,r=(this.top+this.bottom)/2;let a=n-e,i=n+e,s=r+t,o=r-t;if(null!==this.view&&this.view.enabled){const e=(this.right-this.left)/this.view.fullWidth/this.zoom,t=(this.top-this.bottom)/this.view.fullHeight/this.zoom;a+=e*this.view.offsetX,i=a+e*this.view.width,s-=t*this.view.offsetY,o=s-t*this.view.height}return{left:a,right:i,top:s,bottom:o}}}class i extends PerspectiveCamera{constructor(e,t,n,r,a){super(e,t,n,r),a||(a={left:0,top:1,right:1,bottom:0}),this.offset=a}copy(e,t){return super.copy(e,t),this._offset=e._offset,this}set offset(e){this._offset=e,this.updateProjectionMatrix()}get offset(){return this._offset}resetOffset(){this._offset={left:0,top:1,right:1,bottom:0}}_calculateProjectionMatrix(){let e,t,n,r,a=this.fov*(2*Math.PI/360)/2;n=Math.tan(a),r=-n;let i=Math.atan(this.aspect*Math.tan(a));t=Math.tan(i),e=-t;let s=this._offset.left,o=this._offset.right,l=this._offset.top,d=this._offset.bottom,h=new Vector2(o-s,l-d),c=new Vector2(s+h.x/2,d+h.y/2);if(h.x<h.y){let a=(1-c.x)/(h.x/2),i=c.x/(h.x/2);t*=a,e*=i;let s=(a+i)/2;n*=s,r*=s}else{let a=(1-c.y)/(h.y/2),i=c.y/(h.y/2);n*=a,r*=i;let s=(i+a)/2;e*=s,t*=s}e*=this.near,t*=this.near,n*=this.near,r*=this.near;let u=this.near*Math.tan(Math.PI/180*.5*this.fov)/this.zoom*2,p=this.aspect*u;return this.view&&this.view.enabled&&(e+=this.view.offsetX*p/this.view.fullWidth,n-=this.view.offsetY*u/this.view.fullHeight,t+=this.view.offsetX*p/this.view.fullWidth,r-=this.view.offsetY*u/this.view.fullHeight),(new Matrix4).makePerspective(e,t,n,r,this.near,this.far)}clearViewOffset(){null!==this.view&&(this.view.enabled=!1),this.updateProjectionMatrix()}updateProjectionMatrix(){this._offset?(this.projectionMatrix=this._calculateProjectionMatrix(),this.projectionMatrixInverse.copy(this.projectionMatrix).invert()):super.updateProjectionMatrix()}}return{create:function(t,n,r,a){return new e(t,n,r,a)},createPreview:function(e,t,r){return new n(r,e,{x:0,y:0,z:0},{x:0,y:0,z:0},t)},createStatic:function(e,n){return new t(e,n)},createPreviewLine:function(e,t){let n=new r(t,e.id,e.roomlePosition,e.roomleRotation,e.parentObjectId,e.receivedPointAssociation);return e.meshes.forEach(e=>{let t=e.clone();t.material=e.material.clone(),t.geometry=e.geometry.clone(),n.addMesh(t)}),n.computeBoundingBox(),n},isPreview:function(e){return e instanceof n},isPreviewLine:function(e){return e instanceof r},createPerspectiveCamera:function(e,t,n,r,a){return new i(e,t,n,r,a)},createOrthographicCamera:function(e,t,n,r,i,s,o){return new a(e,t,n,r,i,s,o)}}}const DEFAULT_CONVERSATION_ID=9;class ConfiguratorViewModel{constructor(e){this._mergeThreshold=3,this._componentsToMerge=new OccurrenceMap,this._mergeInProgress=!1,this._components=new Map,this._previews=new Map,this._componentNumberOfPossibleChildren=new Map,this._creator_=e,this._getKernelAccess().addConfiguratorListener(this),this._componentFactory=RoomleComponentFactoryInitializer()}get materialQueue(){return this.getMeshGenerator().materialQueue}_getKernelAccess(){return RoomleDependencyInjection.lookup("planner-kernel-access",this._creator_)}_applyMeshTransform(e,t,n,r,a){if(n){const r=e.userData.transform=convertToThreeMatrix(n);t&&(e.userData.transform=r),e.applyMatrix4(r)}this._applyMeshUVTransform(e,t,r,a)}_applyMeshUVTransform(e,t,n,r){if(6!==(null==n?void 0:n.length)||(e=>1===e[0]&&0===e[1]&&0===e[2]&&1===e[3]&&0===e[4]&&0===e[5])(n))t&&(t.uvTransform=void 0),r&&(e.geometry=r);else{const a=(e=>{const t=new Matrix4;return t.set(e[0],e[2],0,e[4],e[1],e[3],0,e[5],0,0,1,0,0,0,0,1),t})(n);t&&(t.uvTransform=a);const i=null!=r?r:e.geometry;if(i&&i.attributes.uv){const t=i.clone();t.attributes.uv.applyMatrix4(a),e.geometry=t}}}_addMeshToSubPart(e,t,n,r,a,i,s,o,l,d){const h=this._generateMesh(e,t,n,i,s,o,l,void 0,void 0,d);this._applyMeshTransform(h,null,r,a),this._subPartObject.add(h)}_addMeshToComponent(e,t,n,r,a,i,s,o,l,d,h,c){if(this._subPartGuard&&this._subPartGuard.info===e)return void this._addMeshToSubPart(e,null,r,null,null,s,o,l,d,c);const u=this.getComponent(e);if(!u)return;const p=this._componentFactory.isPreview(u),m=this._generateMesh(e,n,p?null:r,s,o,l,d,void 0,void 0,c);m.userData.meshId=t,m.userData.geometryId=n,m.userData.materialId=r,this._applyMeshTransform(m,m.userData,a,i),p&&m.layers.set(5),u&&u.addMesh(m),u.meshes.length>this._mergeThreshold&&this._componentsToMerge.set(e,u.meshes.length)}_changeMeshOfComponent(e,t,n,r,a,i,s){const o=this.getComponent(e);if(!o)return;const l=o.getMeshById(t);if(l){l.userData.geometryId!==n&&console.warn("Geometry of mesh has changed!"),l.userData.materialId=r,l.userData.materialAttributes=s;const e=l.material.clone();this._configuratorMeshGenerator.setMaterial(l,r,void 0,s),e.opacity!==l.material.opacity&&this._requestRenderCallback&&this._requestRenderCallback(),a&&(l.position.set(0,0,0),l.scale.set(1,1,1),l.rotation.set(0,0,0));const t=this._configuratorMeshGenerator.getGeometry(n);this._applyMeshTransform(l,l.userData,a,i,t)}}_removeMeshFromComponent(e,t){const n=this.getComponent(e);n&&n.removeMeshById(t)}getComponent(e){let t=this._components.get(e);return t||(t=this._previews.get(e.toString()),t)?t:(console.warn("component not found!",e),null)}getNumberOfPossibleChildrenForComponent(e){if(this._componentNumberOfPossibleChildren.has(e))return this._componentNumberOfPossibleChildren.get(e);const t=this._getKernelAccess().kernelInstance.getPlanComponentPossibleChildren(e).length;return this._componentNumberOfPossibleChildren.set(e,t),t}tryToMergeComponents(){this._initData.moc||this._mergeInProgress||(this._mergeInProgress=!0,this._componentsToMerge.size,this._requestMergeComponents())}_requestMergeComponents(){window.requestIdleCallback(this._mergeNextComponent.bind(this))}_mergeNextComponent(){if(this._componentsToMerge.size>0){const e=this._componentsToMerge.largestValue();this._componentsToMerge.delete(e),this._mergeComponent(e),this._requestMergeComponents()}else this._mergeInProgress=!1,this._geometriesMerged&&this._geometriesMerged(),this._components.forEach(e=>{e.loadingMesh&&console.warn("component still has loading mesh: ",e.hash)})}_mergeComponent(e){const t=this._components.get(e);if(t&&!(t.meshes.length<=this._mergeThreshold))if(this._cacheHolder.componentCache.has(t.hash)){const e=this._cacheHolder.componentCache.get(t.hash).meshes;t.replaceMeshes(e)}else{const e=new Map,n=[],r=[];t.meshes.forEach(t=>{const a=t.userData.materialId;if(!a)return void console.warn("mesh has no material id set");if(!e.has(a)){const r=new Mesh(new BufferGeometry,t.material);r.userData.materialId=a,r.receiveShadow=!0,r.castShadow=!0,r.layers.set(3),this._setMaterial(r,a),n.push(r),e.set(a,r)}const i=e.get(a),s=i.geometry;t.userData.transform&&t.geometry.applyMatrix4(t.userData.transform),i.geometry=function(e,t=!1){const n=null!==e[0].index,r=new Set(Object.keys(e[0].attributes)),a=new Set(Object.keys(e[0].morphAttributes)),i={},s={},o=e[0].morphTargetsRelative,l=new BufferGeometry;let d=0;for(let h=0;h<e.length;++h){const c=e[h];let u=0;if(n!==(null!==c.index))return console.error("THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index "+h+". All geometries must have compatible attributes; make sure index attribute exists among all geometries, or in none of them."),null;for(const e in c.attributes){if(!r.has(e))return console.error("THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index "+h+'. All geometries must have compatible attributes; make sure "'+e+'" attribute exists among all geometries, or in none of them.'),null;void 0===i[e]&&(i[e]=[]),i[e].push(c.attributes[e]),u++}if(u!==r.size)return console.error("THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index "+h+". Make sure all geometries have the same number of attributes."),null;if(o!==c.morphTargetsRelative)return console.error("THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index "+h+". .morphTargetsRelative must be consistent throughout all geometries."),null;for(const e in c.morphAttributes){if(!a.has(e))return console.error("THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index "+h+". .morphAttributes must be consistent throughout all geometries."),null;void 0===s[e]&&(s[e]=[]),s[e].push(c.morphAttributes[e])}if(t){let e;if(n)e=c.index.count;else{if(void 0===c.attributes.position)return console.error("THREE.BufferGeometryUtils: .mergeGeometries() failed with geometry at index "+h+". The geometry must have either an index or a position attribute"),null;e=c.attributes.position.count}l.addGroup(d,e,h),d+=e}}if(n){let t=0;const n=[];for(let r=0;r<e.length;++r){const a=e[r].index;for(let e=0;e<a.count;++e)n.push(a.getX(e)+t);t+=e[r].attributes.position.count}l.setIndex(n)}for(const e in i){const t=mergeAttributes(i[e]);if(!t)return console.error("THREE.BufferGeometryUtils: .mergeGeometries() failed while trying to merge the "+e+" attribute."),null;l.setAttribute(e,t)}for(const e in s){const t=s[e][0].length;if(0===t)break;l.morphAttributes=l.morphAttributes||{},l.morphAttributes[e]=[];for(let n=0;n<t;++n){const t=[];for(let r=0;r<s[e].length;++r)t.push(s[e][r][n]);const r=mergeAttributes(t);if(!r)return console.error("THREE.BufferGeometryUtils: .mergeGeometries() failed while trying to merge the "+e+" morphAttribute."),null;l.morphAttributes[e].push(r)}}return l}([s,t.geometry]),r.push(t)}),n.forEach(e=>t.addMesh(e)),r.forEach(e=>t.removeMesh(e)),this._cacheHolder.componentCache.set(t.hash,t)}}_addRootComponent(e){this._listener&&this._listener.display(e)}removeDockingComponent(){this._getKernelAccess().requestDeleteComponent(this._configuratorContext.dockingRootComponentId),this._configuratorContext.dockingRootComponentId=null}dockComponent(e,t,n,r){let a=this._components.get(t),i=this._components.get(e);i&&(i.roomlePosition=n,i.roomleRotation=r,a&&a.add(i))}dockComponentWithPosition(e,t){let n,r=this._components.get(e.parentId);n=t?t.getKernelPosition(r):e.getKernelPosition(r),Benchmark.start("dock_component_with_position_"+e.childId),this._getKernelAccess().dockComponentWithPosition(e.parentId,e.parentDockId,e.childId,e.childDockId,n),this._configuratorContext.dockingRootComponentId=null}removePreviews(){this._previews.size>0&&(this._previews.forEach(e=>{e.removeFromParent(),e.removeAllMeshes()}),this._previews.clear())}_updatePlanObject(e){const t=this._components.get(e.rootPlanComponentId);let n=!0;t&&(n=t.geometryChanged),this._listener&&this._listener.planObjectUpdated(e,n)}Editor3dAddBakedMesh(e,t,n,r,a,i,s,o){this._addMeshToComponent(e,null,null,t,null,null,n,r,a,i,s,o)}Editor3dAddDockPreview(e,t){const n=this._componentFactory.createPreview(t,e,this._creator_);this._previews.set(t.toString(),n)}Editor3dAddNamedMesh(e,t,n,r,a,i,s,o,l,d,h,c){this._addMeshToComponent(e,t,n,r,a,h,i,s,o,l,d,c)}Editor3ChangedNamedMesh(e,t,n,r,a,i,s){this._changeMeshOfComponent(e,t,n,r,a,i,s)}Editor3dRemoveNamedMesh(e,t){this._removeMeshFromComponent(e,t)}Editor3dBeginConstruction(e,t){if(!t){const t=this._components.get(e);t&&t.removeAllMeshes()}this._subPartGuard&&e===this._subPartGuard.info&&(this._subPartObject=new Object3D)}Editor3dComponentCreated(e,t,n,r,a){a&&(this._configuratorContext.rootComponentId=e);let i=null;this._components.has(e)?(i=this._components.get(e),i.removeAllMeshes()):(i=this._componentFactory.create(e,t,n,r),i.layers.set(3)),this._components.set(e,i),a&&this._addRootComponent(i)}Editor3dComponentDocked(e,t,n,r){this.dockComponent(e,t,n,r)}Editor3dEndConstruction(e){if(this._subPartGuard&&this._subPartGuard.info===e)return void this._subPartGuard.resolve(this._subPartObject);const t=this._getKernelAccess().kernelInstance.getComponent(e),n=this._components.get(e);n&&(n.computeBoundingBox(t.boxForMeasurement),n.boundingBoxMesh&&this._listener&&this._listener.addComponentHandlers(n));let r=this._previews.get(e.toString());r&&r.computeBoundingBox(t.boxForMeasurement,!0)}Editor3dGeometryReady(e){const t=this._components.get(e);t&&t.loadingFinished()}Editor3dGeometryNotReady(e){const t=this._components.get(e);t&&t.loading()}Editor3dPlanObjectConstructionDone(e){const t=this._getKernelAccess().kernelInstance.getPlanObject(e),n=[t,this._getKernelAccess().kernelInstance.getFullPartList(),this._getKernelAccess().kernelInstance.getHashOfConfiguration(e),this._getKernelAccess().kernelInstance.getComponentId(t.rootPlanComponentId)];AsyncHelper.finishOperation(2,n),this._updatePlanObject(t),this._listener&&this._listener.planObjectConstructionDone(t)}Editor3dPreviewConstructionDone(e,t){let n=!1;this._previews.forEach(e=>{null!==e.parent&&(this._listener&&(this._componentFactory.isPreviewLine(e)?this._listener.addPreviewLineHandlers(e):this._listener.addPreviewHandlers(e)),n=!0)}),this._listener&&this._listener.previewConstructionDone(this._components.get(e),n)}Editor3dSetPreviewLineAssociations(e,t){let n=this._previews.get(t.toString());if(n.clear(),!n)return;let r=this._componentFactory.createPreviewLine(n,this._creator_),a=this._components.get(this._configuratorContext.rootComponentId);for(let t=0;t<e.length;t++){let n;n=0===t?r:r.clonePreviewLine(t),n.name="Preview Line",n.parentDockId=e[t].parentDockId,n.parentId=e[t].parentId,n.childDockId=e[t].childDockId,n.childId=e[t].childId,n.docklineRotation=(i=e[t].rotation,new Euler(i.x,i.z,-i.y)),n.roomlePosition=e[t].position,e[t].lineFrom.x>e[t].lineTo.x||e[t].lineFrom.y>e[t].lineTo.y||e[t].lineFrom.z>e[t].lineTo.z?(n.roomleLineFrom=e[t].lineTo,n.roomleLineTo=e[t].lineFrom):(n.roomleLineFrom=e[t].lineFrom,n.roomleLineTo=e[t].lineTo),e[t].positionFrom.x>e[t].positionTo.x||e[t].positionFrom.y>e[t].positionTo.y||e[t].positionFrom.z>e[t].positionTo.z?(n.roomlePositionFrom=e[t].positionTo,n.roomlePositionTo=e[t].positionFrom):(n.roomlePositionFrom=e[t].positionFrom,n.roomlePositionTo=e[t].positionTo),a.add(n),n.preparePreview(),this._previews.set(n.stringId,n)}var i}Editor3dSetPreviewPointAssociations(e,t){let n=this._previews.get(t.toString());if(!n)return;let r=this._components.get(this._configuratorContext.rootComponentId);for(let t=0;t<e.length;t++){let a;0===t?a=n:(a=n.clonePreview(t),this._previews.set(a.stringId,a)),a.name="Preview Point",a.parentDockId=e[t].parentDockId,a.parentId=e[t].parentId,a.childDockId=e[t].childDockId,a.childId=e[t].childId,a.preparePreview(),a.receivedPointAssociation=!0,a.userData.ignoreComponentRaycast=!0,r.add(a),a.roomlePosition=e[t].position,a.roomleRotation=e[t].rotation,a.startPulsating()}}componentDeleted(e){const t=this._components.get(e);t&&(this._listener&&this._listener.componentDeleted(t),t.removeFromParent(),t.removeAllMeshes(),this._components.delete(e))}componentMetaUpdated(e){const t=this._getRuntimeComponent(e.id);t&&(t.hash=e.hash,t.roomlePosition=e.position,t.roomleRotation=e.rotation,e.boxForMeasurement&&t.computeBoundingBox(e.boxForMeasurement),this._listener&&this._listener.componentUpdated(t,e))}componentConfigurationUpdated(e,t){const n=this._getRuntimeComponent(e);n&&(n.geometryChanged=t)}_getRuntimeComponent(e){let t=this._components.get(e);return t||(t=this._previews.get(e.toString()),t)?t:null}configurationLoaded(e,t,n,r,a){10===e&&(this._configuratorContext.dockingRootComponentId=n);let i=0===t;i?this._getKernelAccess().kernelInstance.requestPlanComponentConstructionRecursive(n):this._getKernelAccess().kernelInstance.requestPlanObjectConstruction(t);let s=this._getKernelAccess().kernelInstance.getComponent(n),o=this._components.get(n);o&&(o.computeBoundingBox(s.boxForMeasurement),o.hash=s.hash),this._listener&&this._listener.configurationLoaded(o,i&&void 0!==o.boundingBoxMesh)}finishParameterChange(e,t){this.materialQueue.registerCallback(e)}planObjectConfigurationUpdated(e,t,n){let r=this._getKernelAccess().kernelInstance.getPlanObject(e);this._updatePlanObject(r)}planObjectCreated(e,t){this._configuratorContext.planObjectId=t,this._listener&&this._listener.clearScene()}planObjectUpdated(e){this._updatePlanObject(e)}sceneCleared(){this._components.forEach((function(e){e.removeFromParent(),e.removeAllMeshes()})),this._components.clear(),this._componentNumberOfPossibleChildren.clear(),this._previews.forEach(e=>{e.removeFromParent(),e.removeAllMeshes()}),this._previews.clear()}setListener(e){this._listener=e}getBoundingBox(){if(this._configuratorContext.planObjectId){const e=this._getKernelAccess().kernelInstance.getPlanObject(this._configuratorContext.planObjectId);if(e&&e.boxForMeasurement)return kernelBoxToThreeBox(e.boxForMeasurement)}else if(this._configuratorContext.rootComponentId){const e=this._components.get(this._configuratorContext.rootComponentId);return(new Box3).setFromObject(e)}return null}getBoundingBoxWithPreviews(){const e=this._components.get(this._configuratorContext.rootComponentId);return e?(new Box3).setFromObject(e):null}hasPreviews(){return this._previews.size>0}clearRootComponent(){var e;null===(e=this._components.get(this._configuratorContext.rootComponentId))||void 0===e||e.hoverOff()}debugSceneGraph(e){e?this._components.has(e)?this._components.get(e):this._previews.has(e.toString())&&this._previews.get(e.toString()):this._configuratorContext}getComponentsForIds(e){let t=[];return e.forEach(e=>{const n=this._components.get(e);n&&t.push(n)}),t}getComponents(){return Array.from(this._components.values())}getPreviews(){return Array.from(this._previews.values())}hasPreviewLines(){for(const e of this._previews.values())if(this._componentFactory.isPreviewLine(e))return!0;return!1}isPreviewLine(e){return this._componentFactory.isPreviewLine(e)}isPreview(e){return this._componentFactory.isPreview(e)}setGeometriesMergedListener(e){this._geometriesMerged=e}removeGeometriesMergedListener(){this._geometriesMerged=void 0}setMergeThreshold(e){this._mergeThreshold=e}_generateMesh(e=0,t=null,n,r,a,i,s,o,l,d){return this._configuratorMeshGenerator.generateMesh(e,t,n,r,a,i,s,!1,d)}_setMaterial(e,t,n){this._configuratorMeshGenerator.setMaterial(e,t)}constructComponents(e){this._getKernelAccess().kernelInstance.requestPlanObjectConstruction(e)}requestSubPartConstruction(e){return this._subPartGuard=new AsyncGuard(e),this._getKernelAccess().requestPlanComponentConstruction(e,!1),this._subPartGuard.wait()}getMeshGenerator(){return this._configuratorMeshGenerator}setRequestRenderCallback(e){this._requestRenderCallback=e}}__decorate([inject],ConfiguratorViewModel.prototype,"_configuratorMeshGenerator",void 0),__decorate([inject],ConfiguratorViewModel.prototype,"_configuratorContext",void 0),__decorate([inject],ConfiguratorViewModel.prototype,"_cacheHolder",void 0),__decorate([inject],ConfiguratorViewModel.prototype,"_initData",void 0);class OccurrenceMap extends Map{largestValue(){let e=this.entries().next().value[0],t=0;return this.forEach((n,r)=>{n>t&&(e=r,t=n)}),e}}const ASYNC_PARAMTER_CHANGES=["material"];class ConfiguratorKernelAccess extends CommonKernelAccess{constructor(e){super(e),this.externalMeshQueue=new PromiseQueue,this.muteKernelCallbacks=!1,this.listOfVariants=(e,t)=>{}}init(e){super.init(e),Benchmark.addMeta("kernel_is_ready",{isWasm:this._useWASM}),AppContext.kernelInstance?(this._kernelContainer=AppContext.kernelContainer,setTimeout(()=>this._loadSuccess(),0)):this._scriptLoader.fetch(this._kernelPath,{id:"kernel"}).then(this._loadSuccess.bind(this),this._loadError.bind(this))}_loadSuccess(){Benchmark.start("kernel_is_ready"),window.ConfiguratorKernel&&(AppContext.kernelInstance?setTimeout(()=>this.isReady(),0):(window.ConfiguratorKernel(this._kernelContainer),window.ConfiguratorKernel=null))}_loadError(){this._configuratorKernelAccessCallback.loadError()}selectedComponent(e){this._updateComponentDependencies(e)}uiRequestConfiguration(e){const t=this._kernelInstance.getSerializedConfiguration(e);AsyncHelper.finishOperation(1,t)}_updateComponentParameters(e){let t=this._kernelInstance.getComponentParameters(e);const n=this._kernelInstance.getComponent(e);this._configuratorKernelAccessCallback.updateParameters(t,n.parameterGroups,e,1)}selectionChange(e,t){let n=!1,r=[];if(e){let t=this._kernelInstance.getComponent(e);t.componentId=this._kernelInstance.getComponentId(e),t&&t.childIds&&t.childIds.length>0&&(n=!0),r.push(t)}this._configuratorUiCallbacks.onSelectionChange("standard",t,n,r)}multiSelectionChange(e,t){this._updateCommonComponentDependencies(e);let n=!1,r=!1,a=[];e&&e.forEach(e=>{let i=this._kernelInstance.getComponent(e);i.componentId=this._kernelInstance.getComponentId(e),i&&i.childIds&&i.childIds.length>0&&(n=!0),i.id===t&&(r=!0),a.push(i)}),this._configuratorUiCallbacks.onSelectionChange("multiselect",r,n,a)}_updateCommonComponentDependencies(e){const{parameters:t,parameterGroups:n}=this._kernelInstance.getCommonPlanComponentParameters(this._utilityToLongArray(e));this._configuratorKernelAccessCallback.updateParameters(t,n,e,2)}_updateComponentChildren(e){const t=this._kernelInstance.getPlanComponentPossibleChildren(e);this._configuratorKernelAccessCallback.updatePossibleChildren(e,t,1)}_updateComponentDependencies(e){this._updateComponentParameters(e),this._updateComponentChildren(e)}_updatePlanObjectParameters(e){let t,n=this._kernelInstance.getPlanObjectParameters(e);if(0===n.length){let r=this._kernelInstance.getRootPlanComponentIdFromObjectId(e);n=this._kernelInstance.getComponentParameters(r),this._enableRootComponentParametersAsGlobal(),t=this._kernelInstance.getComponent(r)}else this._configuratorContext.rootComponentParametersAsGlobal=!1,t=this._kernelInstance.getPlanObject(e);this._configuratorKernelAccessCallback.updateParameters(n,t.parameterGroups,e,0)}_enableRootComponentParametersAsGlobal(){this._configuratorContext.selectedRuntimeComponentId||(this._configuratorContext.rootComponentParametersAsGlobal=!0)}_updatePlanObjectChildren(e){const t=this._kernelInstance.getPlanObjectPossibleChildren(e);this._configuratorKernelAccessCallback.updatePossibleChildren(e,t,0)}updatePlanObjectDependencies(e){this._updatePlanObjectParameters(e),this._updatePlanObjectChildren(e)}_updateConfigurationHasChildren(e,t=null){t||(t=this._kernelInstance.getComponent(this._kernelInstance.getRootPlanComponentIdFromObjectId(e)));const n=t.childIds.size?t.childIds.size():t.childIds.length;this._configuratorUiCallbacks.onConfigurationHasChildren(n>0)}dockComponent(e,t,n,r){const a=this._kernelInstance.getComponentId(n),i=this._kernelInstance.getComponentId(e);this._kernelInstance.dockComponent(n,r,e,t),this._configuratorUiCallbacks.onUserInitiatedDockDone(a,r,i,t,null)}changeUseOfHDGeometry(e,t){this._rapiAccess.changeUseOfHDGeometry();const n=e.planObjectId,r=e.lastLoadedRapiId?e.lastLoadedRapiId:this._kernelInstance.getComponentId(n),a=this._kernelInstance.getSerializedConfiguration(n);this._kernelInstance.clearAll(),this._kernelInstance.useHDGeometry(t),AsyncHelper.finishOperation(3,[a,r])}webGlPreviewDockings(e,t){AsyncHelper.waitFor(4).then(({componentId:n})=>{t&&this.requestPlanComponentConstruction(n),this._kernelInstance.requestPreviewGeometry(n,e.planObjectId)}),e.lastPossibleChild&&e.lastPossibleChild.isComponent&&(this._kernelIo.setMeta({componentId:e.lastPossibleChild.id}),this._kernelInstance.loadPlainComponent(10,e.lastPossibleChild.id,e.lastPossibleChild.configuration)),e.lastPossibleChild&&e.lastPossibleChild.isItem&&this._kernelInstance.loadFreeFlyingConfiguration(10,e.lastPossibleChild.configuration)}previewDockingsWithDrag(e,t){this._kernelInstance.requestPreviewGeometry(e,t)}loadConfiguration(e){this._initData.id?this._memoryManager.loadingConfiguration(this._initData.id):this._memoryManager.loadingConfigurationString(),this._memoryManager.shouldHardReset()?this._kernelInstance.clearAll():this._kernelInstance.clearScene(),this._kernelInstance.loadConfiguration(9,e,{x:0,y:0,z:0})}changeCommonComponentParameter(e,t,n,r,a,i){"string"==typeof r?this._kernelInstance.setPlanComponentParameters(this._utilityToLongArray(e),t,r):console.warn("tried to set a parameter to a none string value!",r,t,n),this._finishParameterChange(n,a,i),this._updateCommonComponentDependencies(e)}changeComponentParameter(e,t,n,r,a,i){"string"==typeof r?this._kernelInstance.setComponentParameter(e,t,r):console.warn("tried to set a parameter to a none string value!",r,t,n),this._finishParameterChange(n,a,i),this._updateComponentDependencies(e)}changePlanObjectParameter(e,t,n,r,a,i){"string"==typeof r?this._kernelInstance.setPlanObjectParameter(e,t,r):console.warn("tried to set a parameter to a none string value!",r,t,n),this._finishParameterChange(n,a,i)}_finishParameterChange(e,t,n){-1===ASYNC_PARAMTER_CHANGES.indexOf(e)?setTimeout(()=>t(),0):this._configuratorKernelCallbackListener.forEach(e=>e.finishParameterChange(t,n))}requestDeleteComponents(e){e&&this._kernelInstance.deletePlanComponents(this._utilityToLongArray(e))}requestDeletePlanComponent(e){var t,n;e&&(null===(n=null===(t=this._initData)||void 0===t?void 0:t.featureFlags)||void 0===n?void 0:n.reDock)&&this._kernelInstance.deletePlanComponent(e)}loadComponentIntoKernel(e,t){this._kernelIo.setMeta({componentId:t}),this._kernelInstance.loadComponentDefinition(10,e)}async requestPartListAndUpdatePricesOfParts(e,t){let n=this._kernelInstance.getFullPartList();e||(e=this._kernelInstance.getHashOfConfiguration(this._configuratorContext.planObjectId));const r=await this.addUiDataAndPriceToPartList(n,e);this._configuratorUiCallbacks.onPartListUpdate(r,btoa(e))}requestSync(e,t){this.planObjectCreated(e,t),this._kernelInstance.syncPlanObjectToView(e,t)}getGlobalParameters(e,t){return new Promise(n=>{let r=this._kernelInstance.getPlanObjectParameters,a=e;t&&(r=this._kernelInstance.getComponentParameters,a=this._kernelInstance.getRootPlanComponentIdFromObjectId(e)),n(r.apply(this._kernelInstance,[a]))})}getPartList(){return new Promise(e=>{e(this._kernelInstance.getFullPartList())})}getConfigurationHash(e){return new Promise(t=>t(this._kernelInstance.getHashOfConfiguration(e.planObjectId)))}requestPlanObjectConstruction(e){this._kernelInstance.requestPlanObjectConstruction(e)}isReady(){super.isReady(),this._setupKernel(),Env.isProduction||(window.__RML__DEBUG__.Kernel=this._kernelInstance,window.__RML__DEBUG__.KernelContainer=this._kernelContainer,window.__RML__DEBUG__.Helper={convertCObject}),this._configuratorKernelAccessCallback.isReady(),this._configuratorUiCallbacks.onConfiguratorKernelIsReady(this._kernelContainer,this._kernelInstance),AppContext.planObjectId&&this.planObjectCreated(-1,AppContext.planObjectId)}_setupKernel(){1===this._kernelType&&(Benchmark.start("kernel_create_instance"),AppContext.kernelInstance?this._kernelInstance=AppContext.kernelInstance:this._kernelInstance=new this._kernelContainer.Kernel),this._initKernel()}onLoadComponentError(e,t){this._configuratorUiCallbacks.onComponentLoadError(e,t)}configurationLoaded(e,t,n,r,a,i){AsyncHelper.finishOperation(4,{conversationId:e,objectId:t,componentId:n,hash:r,errors:convertCObject(a)}),this._configuratorKernelCallbackListener.forEach(i=>i.configurationLoaded(e,t,n,r,a))}componentDefinitionLoaded(e,t){AsyncHelper.finishOperation(0,t)}componentDefinitionLoadingError(e,t){this._kernelIo.error(t),AsyncHelper.failOperation(0,new Error(t))}configurationLoadingError(e,t){let n="Configuration loading error";if(t){const e=convertCObject(t);Array.isArray(e)&&(n=e.join("\n"),e.forEach(e=>this._kernelIo.error(e)))}AsyncHelper.failOperation(4,new Error(n)),AsyncHelper.failOperation(2,new Error(n))}componentConfigurationUpdated(e,t){this._configuratorKernelCallbackListener.forEach(n=>n.componentConfigurationUpdated(e,t)),this._kernelInstance.requestDeltaPlanComponentConstruction(e)}setActiveGroupInView(e){this._kernelInstance.setActiveGroupInView(e)}setActiveGroupInViewForPlanObject(e,t){this._kernelInstance.setActiveGroupInViewForPlanObject(e,t||this._configuratorContext.planObjectId)}componentParameters(){}requestComponentDimensions(){}planObjectCreated(e,t){this._configuratorKernelCallbackListener.forEach(n=>n.planObjectCreated(e,t))}planObjectUpdated(e){const t=this._kernelInstance.getPlanObject(e);this._onBoundsUpdate(t),this._configuratorKernelCallbackListener.forEach(e=>e.planObjectUpdated(t))}planObjectConfigurationUpdated(e,t,n,r,a){this.updatePlanObjectDependencies(e);let i=this._kernelInstance.getComponent(this._kernelInstance.getRootPlanComponentIdFromObjectId(e));this._configuratorKernelCallbackListener.forEach(r=>r.planObjectConfigurationUpdated(e,t,n));const s=this._kernelInstance.getPlanObject(e);return this._onBoundsUpdate(s),this._configuratorHistory.push(t),this._updateConfigurationHasChildren(e,i),this.requestPartListAndUpdatePricesOfParts(n)}_onBoundsUpdate(e){if(!e.boxForMeasurement)return;const t={width:this._unitFormatter.formatMMValueToUnitString(e.boxForMeasurement.size.x),height:this._unitFormatter.formatMMValueToUnitString(e.boxForMeasurement.size.z),depth:this._unitFormatter.formatMMValueToUnitString(e.boxForMeasurement.size.y),kernelBounds:e.boxForMeasurement};this._configuratorUiCallbacks.onBoundsUpdate(t)}planObjectDeleted(){}requestPlanObjectDimensions(){}async requestExternalMesh(e,t){let n=()=>{};const r=new Promise((e,t)=>{n=e});let a;this.externalMeshQueue.push(r),this._configuratorUiCallbacks.onRequestExternalMesh(e,t);try{a=await this._rapiAccess.getMesh(e,"crt",t)}catch(t){return this._handleInvalidMesh(e),this._configuratorUiCallbacks.onError(new Error(`Mesh with id "${e}" can not be loaded. "${t}"`)),void console.error(t)}try{const r=await fetch(new Request(this._dataSyncer.requestAsset(a.url,!0))),i=await r.arrayBuffer();this._handleCortoMesh(i,e,t),n()}catch(t){return this._handleInvalidMesh(e),this._configuratorUiCallbacks.onError(new Error(`Mesh with id "${e}" breaks. "${t}"`)),void console.error(t)}}Editor3dComponentCreated(e,t,n,r){this._configuratorKernelCallbackListener.forEach(a=>a.Editor3dComponentCreated(e,t,n,r,!1)),r&&r>0&&this._configuratorKernelCallbackListener.forEach(a=>a.Editor3dComponentDocked(e,r,t,n))}Editor3dRootComponentCreated(e,t,n,r){this._configuratorKernelCallbackListener.forEach(a=>a.Editor3dComponentCreated(e,t,n,r,!0))}Editor3dPlanObjectConstructionDone(e){this._configuratorKernelCallbackListener.forEach(t=>t.Editor3dPlanObjectConstructionDone(e)),this.updatePlanObjectDependencies(e),this._updateConfigurationHasChildren(e),this._initData.moc||this._calcPrice()}Editor3dBeginGroup(){}Editor3dEndGroup(){}Editor3dSetMaterial(){}Editor3dLoadMaterial(){}Editor3dAddDockPreview(e,t){this._configuratorKernelCallbackListener.forEach(n=>n.Editor3dAddDockPreview(e,t))}Editor3dSetPreviewPointAssociations(e,t){this._configuratorKernelCallbackListener.forEach(n=>n.Editor3dSetPreviewPointAssociations(e,t))}Editor3dSetPreviewLineAssociations(e,t){this._configuratorKernelCallbackListener.forEach(n=>n.Editor3dSetPreviewLineAssociations(e,t))}Editor3dPreviewConstructionDone(e,t){this._configuratorKernelCallbackListener.forEach(n=>n.Editor3dPreviewConstructionDone(e,t))}Editor3dTranslateBy(){}Editor3dRotateBy(){}Editor3dRotateAround(){}Editor3dAddCube(){}Editor3dAddCubeUVMod(){}Editor3dAddSphere(){}Editor3dAddSphereUVMod(){}Editor3dAddRectangle(){}Editor3dAddRectangleUVMod(){}Editor3dAddMesh(){}Editor3dAddMeshUVMod(){}Editor3dAddMeshUVCoord(){}Editor3dAddCylinder(){}Editor3dAddCylinderUVMod(){}Editor3dAddPrism(){}Editor3dAddPrismUVMod(){}Editor3dAddFittingPoint(){}Editor3dAddFittingLine(){}Editor3dSelectObject(){}Editor3dCopy(){}Editor3dUpdatePlanObjectPosition(){}Editor3dUpdatePlanObjectRotation(){}Editor3dUpdatePlanObjectTransform(){}Editor3dUpdatePlanComponentPosition(){}Editor3dUpdatePlanComponentRotation(){}Editor3dUpdatePlanComponentTransform(){}getRuntimeComponentIdOfRootComponent(e){return this._kernelInstance?this._kernelInstance.getRootPlanComponentIdFromObjectId(e):(console.warn("this._kernelInstance not ready now"),0)}getRuntimeComponentId(e){return this._kernelInstance.getComponentId(e)}getParameterGroups(){if(!this._configuratorContext.planObjectId)return[];const e=this._kernelInstance.getRootPlanComponentIdFromObjectId(this._configuratorContext.planObjectId);return this._kernelInstance.getComponent(e).parameterGroups}resume(){this.muteKernelCallbacks||super.resume()}getSerializedConfiguration(e){return this._kernelInstance.getSerializedConfiguration(e)}createNewSerializedConfiguration(e){return this._kernelInstance.createNewSerializedConfiguration(e)}getCurrentConfigurationHash(e){return this._kernelInstance.getHashOfConfiguration(e)}listOfVariantsError(e,t){this._kernelIo.setMeta({rapiId:e}),this._kernelIo.error(t)}}__decorate([inject],ConfiguratorKernelAccess.prototype,"_memoryManager",void 0),__decorate([inject],ConfiguratorKernelAccess.prototype,"_configuratorKernelAccessCallback",void 0),__decorate([inject],ConfiguratorKernelAccess.prototype,"_initData",void 0),__decorate([inject],ConfiguratorKernelAccess.prototype,"_configuratorHistory",void 0);class NodePlanElementViewModel extends PlanElementViewModel{constructor(e){super(e);const t=this.getPlanElement().getMaxWallHeight();this._container.position.y=(t<0?2800:t)/1e3+.01,this._container.name="Node Plan Element",this.addMesh(this._nodeUiMesh)}update(){super.update(),this._container.position.y=this.getPlanElement().getMaxWallHeight()/1e3+.01}_initNodeMesh(){if(this._nodeUiMesh)return;const e=new SphereGeometry(.05,32),t=new MeshBasicMaterial({color:16777215});this._sphere=new Mesh(e,t);const n=new RingGeometry(.05,.07,32),r=new MeshBasicMaterial({color:0,side:DoubleSide});this._innerRingMesh=new Mesh(n,r),this._innerRingMesh.rotation.set(Math.PI/2,0,0);const a=new RingGeometry(.07,.08,32),i=new MeshBasicMaterial({color:16777215,side:DoubleSide});this._outerRingMesh=new Mesh(a,i),this._outerRingMesh.rotation.set(Math.PI/2,0,0),this._nodeUiMesh=new Mesh,this._nodeUiMesh.add(this._sphere),this._nodeUiMesh.add(this._innerRingMesh),this._nodeUiMesh.add(this._outerRingMesh)}setTopView(e){super.setTopView(e),e||(this._nodeUiMesh.visible=!1)}getSize(){return this._initNodeMesh(),(new Box3).setFromObject(this._nodeUiMesh).getSize(new Vector3)}show(){this._nodeUiMesh.visible=this._topView}hide(){this._nodeUiMesh.visible=!1}select(){this._innerRingMesh.material=new MeshBasicMaterial({color:10526880,side:DoubleSide}),super.select()}deselect(){this._innerRingMesh.material=new MeshBasicMaterial({color:0,side:DoubleSide}),super.deselect()}hoverOn(){this._sphere.geometry=new SphereGeometry(.07,32),this._innerRingMesh.geometry=new RingGeometry(.07,.07+.02,32),this._outerRingMesh.geometry=new RingGeometry(.07+.02,.1,32),super.hoverOn()}hoverOff(){this._sphere.geometry=new SphereGeometry(.05,32),this._innerRingMesh.geometry=new RingGeometry(.05,.07,32),this._outerRingMesh.geometry=new RingGeometry(.07,.08,32),super.hoverOff()}_generateBoundingBox(){const e=super._generateBoundingBox();return e.layers.set(9),e}addMesh(e){super.addMesh(e)}}class ConstructionPlanObjectViewModel extends StaticPlanObjectViewModel{constructor(e){super(e),this._container.name="Construction "+this._container.name}setTopView(e){super.setTopView(e),e?this._enableTopView():this._disableTopView(),this._updateBoundingBox()}_enableTopView(){if(!this._topViewContainer){this._topViewContainer=new Group;const e=this.getPlanElement(),{x:t,z:n}=convertToThreeDimensions(e.size),r=new BoxGeometry(t,.01,n);if(this._topGreyMesh=new Mesh(r,MaterialCreator.createMeshStandardMaterial({transparent:!0,opacity:1,color:11645361})),this._topViewContainer.add(this._topGreyMesh),"window"===e.getObjectType()){const e=new BoxGeometry(t,.02,.05);this._topBlackMesh=new Mesh(e,MaterialCreator.createMeshStandardMaterial({transparent:!0,opacity:1,color:0})),this._topViewContainer.add(this._topBlackMesh)}this._topViewContainer.position.y=5,this._container.add(this._topViewContainer)}this._topViewContainer.visible=!0}_disableTopView(){this._topViewContainer&&(this._topViewContainer.visible=!1)}getPlanElement(){return super.getPlanElement()}_generateBoundingBox(){const e=super._generateBoundingBox(),t=this.getSize();return e.geometry=new BoxGeometry(t.x,this._topView?5:t.y,t.z),e}_updateBoundingBox(){super._updateBoundingBox();const e=this.getSize();this._boundingBox.geometry=new BoxGeometry(e.x,this._topView?5:e.y,e.z)}getTopViewContainer(){return this._topViewContainer}update(){if(super.update(),!this._topGreyMesh)return;const{x:e,z:t}=convertToThreeDimensions(this.getPlanElement().size);this._topGreyMesh.geometry=new BoxGeometry(e,.01,t),this._topBlackMesh&&(this._topBlackMesh.geometry=new BoxGeometry(e,.02,.05))}}class PlannerKernelAccess extends ConfiguratorKernelAccess{get kernelContainer(){return this._kernelContainer}constructor(e){super(e),this._plannerKernelCallbackListener=new Set}_loadSuccess(){super._loadSuccess(),window.RoomleCore&&window.RoomleCore(this._kernelContainer)}_loadError(){super._loadError(),console.error("kernel load error")}_createPlanInteractionHandler(){this._planInteractionHandler=new this._kernelContainer.PlanInteractionHandler,this._planInteractionHandler.init(this._planInteractionHandler,1,50,!!this._initData.snappingEnabled,!0,this._kernelContainer.DrawingType.CLICK_PER_CLICK),this._roomlePlannerUiCallback.onPlanInteractionHandlerCreated(this._planInteractionHandler)}addPlannerListener(e){this._plannerKernelCallbackListener.add(e)}removePlannerListener(e){this._plannerKernelCallbackListener.delete(e)}isReady(){super.isReady(),this.registerCallbacks(),this._roomlePlannerUiCallback.onPlannerKernelIsReady(this._kernelContainer),this._roomlePlannerUiCallback.onConfiguratorKernelIsReady(this._kernelContainer,this._kernelInstance),Env.isProduction||(window.__RML__DEBUG__.ConfiguratorKernel=this._kernelInstance,window.__RML__DEBUG__.PlannerKernelContainer=this._kernelContainer),this._kernelAccessCallback.isReady()}_setupKernel(){0===this._kernelType&&(this._createPlanInteractionHandler(),AppContext.kernelInstance?this._kernelInstance=AppContext.kernelInstance:this._kernelInstance=this._planInteractionHandler.getConfiguratorKernel()),super._setupKernel()}get callbacks(){return this._roomlePlannerUiCallback}get planInteractionHandler(){return this._planInteractionHandler}get planModelViewHelper(){return this._kernelContainer.PlanModelViewHelper}catalogItemLoaded(e){const t=this._rapiItemToKernelItem(e);this._kernelContainer.catalogItemLoaded(t)}async insertItems(e){this.planInteractionHandler.startInteraction();let t=new this._kernelContainer.CatalogItemPtrList;e.forEach(e=>{let n=e.count||1;for(let r=0;r<n;r++)e.count||(e.count=0),t.push_back(this._rapiItemToKernelItem(e))});const n=this.planInteractionHandler.getPlan().extRef.jsObject,r=n.getPlanObjectViewModelsFromRapiId().reduce((e,t)=>(e[t.getId()]=!0,e),{});this.planInteractionHandler.addPlanObjects(t,!0),await Promise.allSettled([Promise.allSettled(n.getStaticPlanObjectViewModels().map(async e=>{if(e.needsRapiItem()){const t=await this._rapiAccess.getItem(e.getPlanObject().getCatalogItemId());e.setRapiItem(t)}})),Promise.allSettled(n.getConfigurablePlanObjectViewModels().map(e=>e.isInitDone()))]);const a=n.getPlanObjectViewModelsFromRapiId().map(e=>e.getId()).filter(e=>!r[e]);return this.planInteractionHandler.endInteraction(),a}duplicateItems(e){const t=new this.kernelContainer.PlanObjectPtrList;return e.forEach(e=>{t.push_back(e)}),this.planInteractionHandler.duplicatePlanObjects(t,1,!0)}_rapiItemToKernelItem(e){let t=new this._kernelContainer.CatalogItem(e.id),n=t.size;return n.x=e.width||0,n.y=e.depth||0,n.z=e.height||0,t.size=n,t.flipable=e.flipable,e.layer&&(t.layer=e.layer),t.orderable=e.orderable,t.scaleable=e.scaleable,t.type=e.type||"other",t.detailType=e.detailType||t.type||"other",t.configuration=e.configuration||"",t}planObjectDeleted(){}requestPlanObjectDimensions(){}cleanUpCallbacks(){var e;super.cleanUpCallbacks(),(null===(e=this._kernelContainer)||void 0===e?void 0:e.unregisterPlannerCallback)&&this._kernelContainer.unregisterPlannerCallback(this)}registerCallbacks(){var e;super.registerCallbacks(),(null===(e=this._kernelContainer)||void 0===e?void 0:e.registerPlannerCallback)&&this._kernelContainer.registerPlannerCallback(this)}planElementRemoved(e){this._plannerKernelCallbackListener.forEach(t=>t.planElementRemoved(e)),this._plannerKernelCallbackListener.forEach(t=>t.removePlanObjectFromScene(e.extRef.jsObject)),this._decoupleReferences(e)}handlerSwitchedPlans(e,t){this._decoupleReferences(e),t&&this._plannerKernelCallbackListener.forEach(n=>n.handlerSwitchedPlans(e,t))}planBoundsChanged(){this._plannerKernelCallbackListener.forEach(e=>e.planBoundsChanged())}planCleared(){this._plannerKernelCallbackListener.forEach(e=>e.planCleared())}planCompletelyLoaded(e){this._plannerKernelCallbackListener.forEach(t=>t.planCompletelyLoaded(e))}planElement3dMeshChanged(e,t){if(t.extRef){const e=t.extRef.jsObject;for(let t=e.getObject().children.length-1;t>=0;t--)e.getObject().remove(e.getObject().children[t])}this.planModelViewHelper.requestMesh3d(t)}async _onStaticItemAdded(e,t){let n;n=this.isConstructionPlanElement(t)?new ConstructionPlanObjectViewModel(t):new StaticPlanObjectViewModel(t),this.coupleReferences(n,t),e.extRef.jsObject.addPlanElementViewModel(n);const r=t.getCatalogItemId();if(r){const e=await this._rapiAccess.getItem(r);n.setRapiItem(e),this._plannerKernelCallbackListener.forEach(e=>e.addPlanObjectToScene(n))}}_onConfigurableItemAdded(e,t){const n=new ConfiguratorPlanObjectViewModel(t);this.coupleReferences(n,t),e.extRef.jsObject.addPlanElementViewModel(n),this._plannerKernelCallbackListener.forEach(e=>e.addPlanObjectToScene(n))}async planElementAdded(e,t){if(e&&e.extRef)if(t.getType()===this._kernelContainer.PlanElementType.OBJECT)t.hasConfiguration()?this._onConfigurableItemAdded(e,t):await this._onStaticItemAdded(e,t);else{const n=t;let r;if(t.getType()===this._kernelContainer.PlanElementType.WALL?r=new WallPlanElementViewModel(n):t.getType()===this._kernelContainer.PlanElementType.FLOOR?r=new FloorPlanElementViewModel(n):t.getType()===this._kernelContainer.PlanElementType.CEILING?r=new CeilingPlanElementViewModel(n):t.getType()===this._kernelContainer.PlanElementType.NODE&&(r=new NodePlanElementViewModel(n)),!r)return;this.coupleReferences(r,n),e.extRef.jsObject.addPlanElementViewModel(r),this.planModelViewHelper.requestMesh3d(t),this._plannerKernelCallbackListener.forEach(e=>e.addPlanObjectToScene(null))}}planElementChanged(e,t){if(t.extRef){let n=t.extRef.jsObject;n.update(),this._plannerKernelCallbackListener.forEach(t=>t.planElementChanged(e,n))}}planHistoryStateChanged(){this.planInteractionHandler&&(this._plannerKernelCallbackListener.forEach(e=>e.planHistoryStateChanged()),this._roomlePlannerUiCallback.onHistoryChange(this.planInteractionHandler.isUndoPossible(),this.planInteractionHandler.isRedoPossible()))}planObjectConfigurationCreated(e,t){}planObjectConfigurationLoaded(e,t,n){e&&e.extRef&&t&&t.extRef&&t.extRef.jsObject.getPlanObject().getConfigurationRuntimeId()>0&&this._plannerKernelCallbackListener.forEach(r=>r.planObjectConfigurationLoaded(e,t,n))}requestCatalogItem(e){}startedDrawing(){this._plannerKernelCallbackListener.forEach(e=>e.startedDrawing())}stoppedDrawing(){this._plannerKernelCallbackListener.forEach(e=>e.stoppedDrawing())}updateMesh2d(){}beginConstruction(){}addMesh(e,t,n,r,a,i){this._plannerKernelCallbackListener.forEach(s=>s.addMesh(e,t,n,r,a,i))}endConstruction(){}beginPlanConstruction(e){this._plannerKernelCallbackListener.forEach(t=>t.beginPlanConstruction(e))}addPlanMesh(e,t,n,r,a,i,s){this._plannerKernelCallbackListener.forEach(o=>o.addPlanMesh(e,t,n,r,a,i,s))}endPlanConstruction(e){this._plannerKernelCallbackListener.forEach(t=>t.endPlanConstruction(e))}async addPlanObjectFromItem(e,t,n){if(!t&&!n){const t=await this.insertItems([e]);if(1!==t.length)throw new Error("It was expected that 1 element is added but"+t.length+"were added");return t[0]}n=n||0===n?n:0,t=t||{x:0,y:0,z:0};const r=this._planInteractionHandler.addPlanObjectFromItem(this._rapiItemToKernelItem(e),t,n,!1),a=this._planInteractionHandler.getPlan().extRef.jsObject;let i;return r.hasConfiguration()?(i=a.getConfigurablePlanObjectForId(r.getId()),i||console.warn("Could not find configuration")):(i=a.getStaticPlanObjectViewModelForId(r.getId()),i?await i.setRapiItem(e):console.warn("Could not find static item")),await i.isInitDone(),i.getId()}coupleReferences(e,t){let n=new this._kernelContainer.EMSReference;n.jsObject=e,t.extRef=n}_decoupleReferences(e){e&&e.extRef&&(e.extRef.jsObject.clearReference(),e.extRef.jsObject=null,e.extRef.delete(),e.extRef=null)}isConstructionPlanElement(e){return e instanceof this.kernelContainer.ConstructionObject}}__decorate([inject],PlannerKernelAccess.prototype,"_kernelAccessCallback",void 0),__decorate([inject],PlannerKernelAccess.prototype,"_roomlePlannerUiCallback",void 0);class PlannerMeshGenerator extends MeshGenerator{constructor(e){super(e),this._wallMeshes=[],this._defaultMaterial=MaterialCreator.createMeshPhysicalMaterial({color:"#ffffff",side:DoubleSide})}generateGeometry(e=null,t,n,r,a,i=!1){let s;return s=i?this._generateGeometry(e,t,n,r,a).clone():this._generateGeometry(e,t,n,r,a),s}generateMesh(e=0,t=null,n,r,a,i,s,o,l=!1,d){let h;h=l?this._generateGeometry(t,r,a,i,s).clone():this._generateGeometry(t,r,a,i,s);const c=this._createMesh(e,t,h);return c.userData.materialId=n,c.layers.set(4),n&&this.setMaterial(c,n,o,d).then(()=>{e&&t&&n&&this._geometryComponentMaterialCache.set(this._getComponentMeshId(e,t),n);const r=o&&3===o.value,a=o&&1===o.value;c.castShadow=!r&&!a,c.userData.isFloor=r}),this._checkWallMaterial(c,o),c}async setMaterial(e,t,n,r){if(e.userData.materialId=getMaterialId(t,n),isString(t))t?await this._assignMaterial(e,t,r):(console.warn("Used default material because material is empty"),this.changeMaterialOfMesh(e,this._getDefaultMaterial(n)));else{if(!t)return void this.changeMaterialOfMesh(e,this._configuratorPreviewMaterial);2===(t=t).getSourceType().value?await this._assignMaterial(e,t.materialId,r):1===t.getSourceType().value?await this._assignItem(e,t.catalogItemId):3===t.getSourceType().value?await this._assignRGB(e,t.rgbValue):0===t.getSourceType().value?this.changeMaterialOfMesh(e,this._getDefaultMaterial(n)):(this.changeMaterialOfMesh(e,this._getDefaultMaterial(n)),1!==n.value&&7!==n.value&&3!==n.value&&console.warn("Used default material because material is not supported",t))}}_getDefaultMaterial(e){return 3===(null==e?void 0:e.value)?this._defaultMaterialFloor:this._defaultMaterial}set maxAnisotropy(e){this._maxAnisotropy=e}_checkWallMaterial(e,t){t&&1===t.value&&(e.renderOrder=5,this._wallMeshes.push(e))}clear(){super.clear(),this.clearWallMeshes()}clearWallMeshes(){this._wallMeshes.forEach(e=>{disposeMesh(e)}),this._wallMeshes=[]}get wallMeshes(){return this._wallMeshes}}let KERNEL_UNIT={InchFeet:null,Feet:null,MM:null,CM:null,Inch:null},KERNEL_UNIT_STRING_TYPE={NoUnitString:null,LongUnitString:null,ShortUnitString:null};const METRIC_UNIT_TYPES=["mm","cm","feet"],IMPERIAL_UNIT_TYPES=["inch","inchfeet"];class UnitFormatter{constructor(e){this._formatter=null,this._precision=0,this._creator_=e}init(e){const t=new e.UnitMeasureFormatter;KERNEL_UNIT=e.Unit,KERNEL_UNIT_STRING_TYPE=e.UnitStringType,this._initActualUnit(),this._initMeasurementSystemType(),this._initActualUnitStringType();const{precisionCm:n,precisionInch:r}=this._initData;this._actualUnit===KERNEL_UNIT.InchFeet?this._precision=void 0!==r?parseInt(r,10):2:this._actualUnit===KERNEL_UNIT.CM&&(this._precision=void 0!==n?parseInt(n,10):1),t.init("mm","cm","'","ft",'"',"inch","m²","sqft",!0,this._precision,!0),this._formatter=t}_initMeasurementSystemType(){let{measurementSystem:e,unit:t}=this._initData;if(this._actualMeasurementString=e,e||!t){if("metric"===e){t||(t="cm");const e=METRIC_UNIT_TYPES.find(e=>e===t);e?(this._actualUnit=this._getKernelUnitEnum(t),this._actualUnitString=e):(console.warn("Unit is not a metric unit, using CM"),this._actualUnit=KERNEL_UNIT.CM,this._actualUnitString="cm")}if("imperial"===e){t||(t="inch");const e=IMPERIAL_UNIT_TYPES.find(e=>e===t);e?(this._actualUnit=this._getKernelUnitEnum(t),this._actualUnitString=e):(console.warn("Unit is not an imperial unit, using Inches"),this._actualUnit=KERNEL_UNIT.Inch,this._actualUnitString="inch")}}else{this._actualUnitString=t;const e=METRIC_UNIT_TYPES.find(e=>e===t);this._actualMeasurementString=e?"metric":"imperial"}}_initActualUnit(){const{unit:e}=this._initData;this._actualUnit=this._getKernelUnitEnum(e)}_getKernelUnitEnum(e){switch(e){case"cm":return KERNEL_UNIT.CM;case"mm":return KERNEL_UNIT.MM;case"inchfeet":return KERNEL_UNIT.InchFeet;case"feet":return KERNEL_UNIT.Feet;case"inch":return KERNEL_UNIT.Inch;default:return KERNEL_UNIT.CM}}_initActualUnitStringType(){const{unitStringType:e}=this._initData;e&&"short"!==e&&console.warn("Only short unit strings is supported at the moment"),this._actualUnitStringType=KERNEL_UNIT_STRING_TYPE.ShortUnitString}_isFormatterReady(){return!!this._formatter||(console.warn("Formatter is not ready..."),!1)}formatAngleValueToUnitString(e,t){const n="Integer"===t.type?0:2;return e.toFixed(n)+"°"}parseAngleValueFromUnitString(e){return e.replace("°","").replace(/\s/g,"")}parseValue(e,t){return null===t.unitType||"unknown"===t.unitType||"count"===t.unitType?e:"length"===t.unitType?this.parseMMValueFromUnitString(e,t.unitType):"angle"===t.unitType||"area"===t.unitType?this.parseAngleValueFromUnitString(e):e}formatValueToUnitString(e,t){return null===t.unitType||"unknown"===t.unitType||"count"===t.unitType?"Integer"===t.type?e.toString():parseFloat(e.toString()).toFixed(2):"length"===t.unitType?this.formatMMValueToUnitString(e,t.unitType):"angle"===t.unitType?this.formatAngleValueToUnitString(e,t):"area"===t.unitType?this.formatSquareMMValueToUnitString(e):e}isParseableNumber(e){return this._isFormatterReady()?this._formatter.isParseableNumber(e):null}isParseableUnitString(e,t){return this._isFormatterReady()?"angle"===t.unitType?this._formatter.isParseableUnitString(this.parseAngleValueFromUnitString(e),this._actualUnit):this._formatter.isParseableUnitString(e,this._actualUnit):null}parseMMValueFromUnitString(e,t){return this._isFormatterReady()?"count"===t?parseFloat(e):this._formatter.parseMMValueFromUnitString(e,this._actualUnit):null}parseNumber(e){return this._isFormatterReady()?this._formatter.parseNumber(e):null}formatNumber(e,t=0){return this._isFormatterReady()?this._formatter.formatNumber(e,t):null}formatSquareMMValueToUnitString(e){return this._isFormatterReady()?this._formatter.formatSquareMMValueToUnitString(e,this._actualUnit):null}formatMMValueToUnitString(e,t){return this._isFormatterReady()?"count"===t?e.toString():this._formatter.formatMMValueToUnitString(e,this._actualUnit,this._actualUnitStringType):null}formatMMValueWithReqMaxLength(e,t){return this._isFormatterReady()?this._formatter.formatMMValueWithReqMaxLength(e,this._actualUnit,t):null}_formatParameterValue(e,t){return"length"===t?this.formatMMValueToUnitString(parseFloat(e)):"area"===t?this.formatSquareMMValueToUnitString(parseFloat(e)):e}formatPartListParameter(e){(function(e){return"length"===e.unitType||"area"===e.unitType})(e)&&(e.valueLabel=this._formatParameterValue(e.value,e.unitType))}formatParameter(e){if(e.valueLabel=this._formatParameterValue(e.value,e.unitType),isMaterial(e))e.uiType="Material";else if(function(e){return"Boolean"===e.type}(e))e.uiType="Boolean";else if(isRange(e)){e.uiType="Range";const t=null!==e.validRange.valueFrom?e.validRange.valueFrom:Number.MIN_SAFE_INTEGER,n=null!==e.validRange.valueTo?e.validRange.valueTo:Number.MAX_SAFE_INTEGER;e.validRangeLabels={valueFrom:this._formatParameterValue(t.toString(),e.unitType),valueTo:this._formatParameterValue(n.toString(),e.unitType),type:e.validRange.type}}else isOptions(e)?(e.uiType="Options",function(e){return!!isOptions(e)&&Array.isArray(e.validValues)&&e.validValues.length>0&&"string"==typeof e.validValues[0].thumbnail}(e)&&(e.uiType="Thumbnails")):(console.error("Could not detect uiType of param"),e.uiType=null)}isInch(){return this._actualUnit===KERNEL_UNIT.InchFeet}getActualUnitString(){return this._actualUnitString}getActualMeasurementString(){return this._actualMeasurementString}getUnitStringType(){return this._initData.unitStringType}getPrecision(){return this._precision}getAllowedDelta(){const e=1/Math.pow(10,this._precision);return this.isInch()?25.4*e:e}setUnitInitData(e,t=""){this._initData.unit=e,this._initData.measurementSystem=t,this._initActualUnit(),this._initMeasurementSystemType(),this._initActualUnitStringType(),this._plannerKernelAccess.kernelInstance.setEnvironmentVariable("unit",this._actualUnitString)}}__decorate([inject],UnitFormatter.prototype,"_initData",void 0),__decorate([inject],UnitFormatter.prototype,"_plannerKernelAccess",void 0);class ConfiguratorHistory{constructor(e){this._history=[],this._index=0,this._creator_=e}undo(){if(!this.canUndo())return null;this._index++;const[e]=this._history.slice(this._index);return this._index===this._history.length-1?this._configuratorUiCallbacks.onHistoryChange(!1,!0):this._configuratorUiCallbacks.onHistoryChange(!0,!0),e}redo(){if(!this.canRedo())return null;this._index--;const[e]=this._history.slice(this._index);return 0===this._index?this._configuratorUiCallbacks.onHistoryChange(!0,!1):this._configuratorUiCallbacks.onHistoryChange(!0,!0),e}push(e){const[t]=this._history.slice(this._index);t!==e&&(this._history=this._history.slice(this._index),this._history.unshift(e),this._index=0,1===this._history.length?this._configuratorUiCallbacks.onHistoryChange(!1,!1):this._configuratorUiCallbacks.onHistoryChange(!0,!1))}canUndo(){return this._index!==this._history.length-1}canRedo(){return 0!==this._index}getHistory(){return this._history}clearHistory(){this._history=[],this._index=0}}__decorate([inject],ConfiguratorHistory.prototype,"_configuratorUiCallbacks",void 0);const PLAN_ELEMENT_CHANGE_TYPES={ADDED:"added",CHANGED:"changed",REMOVED:"removed"};class RoomleToolsCore{constructor(e){this._kernelCallbacks={isReady:()=>{},throw:e=>console.error("Kernel exception",e),log:e=>{},error:(e,t,n,r)=>{},message:e=>{this._analyzeComponentCallback&&this._analyzeComponentCallback(e)}},this._creator_=e}async init(){if(this._toolsCoreInstance)return Promise.resolve();const e=this,t={locateFile:e=>"RoomleToolsCore.wasm"===e?getAssetPath()+"static/RoomleToolsCore-ee930f1b940807bb.wasm":e,wasmBinaryFile:getAssetPath()+"static/RoomleToolsCore-ee930f1b940807bb.wasm",preRun:[],postRun:[],setStatus:null,print(t){e._kernelIo.log(t)},printErr(t){e._kernelIo.error(t)},quit(t){0!==t&&e._kernelIo.throw(t&&t.toString?t.toString():"Unknown error while C/C++ main executes")}};await this._scriptLoader.fetch("static/RoomleToolsCore-68f11fca64f9af7b.js",{id:"core-tool"});const n=await window.RoomleToolsCore(t);n.setContext(this._kernelCallbacks),this._toolsCoreInstance=new n.ToolsCore}analyzeComponent(e,t){const n=[];return this._analyzeComponentCallback=e=>{n.push(e)},this._toolsCoreInstance.analyzeComponent(e,t),this._analyzeComponentCallback=null,Promise.resolve(n)}}__decorate([inject],RoomleToolsCore.prototype,"_scriptLoader",void 0),__decorate([inject],RoomleToolsCore.prototype,"_kernelIo",void 0);
|
|
2
2
|
/*!
|
|
3
3
|
fflate - fast JavaScript compression/decompression
|
|
4
4
|
<https://101arrowz.github.io/fflate>
|
|
5
5
|
Licensed under MIT. https://github.com/101arrowz/fflate/blob/master/LICENSE
|
|
6
6
|
version 0.6.9
|
|
7
7
|
*/
|
|
8
|
-
var durl=function(e){return URL.createObjectURL(new Blob([e],{type:"text/javascript"}))};try{URL.revokeObjectURL(durl(""))}catch(e){durl=function(e){return"data:application/javascript;charset=UTF-8,"+encodeURI(e)}}var u8=Uint8Array,u16=Uint16Array,u32=Uint32Array,fleb=new u8([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0]),fdeb=new u8([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0]),clim=new u8([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),freb=function(e,t){for(var n=new u16(31),r=0;r<31;++r)n[r]=t+=1<<e[r-1];var a=new u32(n[30]);for(r=1;r<30;++r)for(var i=n[r];i<n[r+1];++i)a[i]=i-n[r]<<5|r;return[n,a]},_a=freb(fleb,2),fl=_a[0],revfl=_a[1];fl[28]=258,revfl[258]=28;for(var fd=freb(fdeb,0)[0],rev=new u16(32768),i=0;i<32768;++i){var x=(43690&i)>>>1|(21845&i)<<1;x=(61680&(x=(52428&x)>>>2|(13107&x)<<2))>>>4|(3855&x)<<4,rev[i]=((65280&x)>>>8|(255&x)<<8)>>>1}var hMap=function(e,t,n){for(var r=e.length,a=0,i=new u16(t);a<r;++a)++i[e[a]-1];var s,o=new u16(t);for(a=0;a<t;++a)o[a]=o[a-1]+i[a-1]<<1;if(n){s=new u16(1<<t);var l=15-t;for(a=0;a<r;++a)if(e[a])for(var d=a<<4|e[a],h=t-e[a],c=o[e[a]-1]++<<h,u=c|(1<<h)-1;c<=u;++c)s[rev[c]>>>l]=d}else for(s=new u16(r),a=0;a<r;++a)e[a]&&(s[a]=rev[o[e[a]-1]++]>>>15-e[a]);return s},flt=new u8(288);for(i=0;i<144;++i)flt[i]=8;for(i=144;i<256;++i)flt[i]=9;for(i=256;i<280;++i)flt[i]=7;for(i=280;i<288;++i)flt[i]=8;var fdt=new u8(32);for(i=0;i<32;++i)fdt[i]=5;var flrm=hMap(flt,9,1),fdrm=hMap(fdt,5,1),max=function(e){for(var t=e[0],n=1;n<e.length;++n)e[n]>t&&(t=e[n]);return t},bits=function(e,t,n){var r=t/8|0;return(e[r]|e[r+1]<<8)>>(7&t)&n},bits16=function(e,t){var n=t/8|0;return(e[n]|e[n+1]<<8|e[n+2]<<16)>>(7&t)},et=new u8(0);function unzlibSync(e,t){return function(e,t,n){var r=e.length;if(!r||n&&!n.l&&r<5)return t||new u8(0);var a=!t||n,i=!n||n.i;n||(n={}),t||(t=new u8(3*r));var s,o=function(e){var n=t.length;if(e>n){var r=new u8(Math.max(2*n,e));r.set(t),t=r}},l=n.f||0,d=n.p||0,h=n.b||0,c=n.l,u=n.d,p=n.m,m=n.n,g=8*r;do{if(!c){n.f=l=bits(e,d,1);var f=bits(e,d+1,3);if(d+=3,!f){var _=e[(E=((s=d)/8|0)+(7&s&&1)+4)-4]|e[E-3]<<8,v=E+_;if(v>r){if(i)throw"unexpected EOF";break}a&&o(h+_),t.set(e.subarray(E,v),h),n.b=h+=_,n.p=d=8*v;continue}if(1==f)c=flrm,u=fdrm,p=9,m=5;else{if(2!=f)throw"invalid block type";var w=bits(e,d,31)+257,b=bits(e,d+10,15)+4,S=w+bits(e,d+5,31)+1;d+=14;for(var y=new u8(S),C=new u8(19),T=0;T<b;++T)C[clim[T]]=bits(e,d+3*T,7);d+=3*b;var M=max(C),A=(1<<M)-1,x=hMap(C,M,1);for(T=0;T<S;){var E,P=x[bits(e,d,A)];if(d+=15&P,(E=P>>>4)<16)y[T++]=E;else{var R=0,I=0;for(16==E?(I=3+bits(e,d,3),d+=2,R=y[T-1]):17==E?(I=3+bits(e,d,7),d+=3):18==E&&(I=11+bits(e,d,127),d+=7);I--;)y[T++]=R}}var L=y.subarray(0,w),O=y.subarray(w);p=max(L),m=max(O),c=hMap(L,p,1),u=hMap(O,m,1)}if(d>g){if(i)throw"unexpected EOF";break}}a&&o(h+131072);for(var D=(1<<p)-1,N=(1<<m)-1,k=d;;k=d){var B=(R=c[bits16(e,d)&D])>>>4;if((d+=15&R)>g){if(i)throw"unexpected EOF";break}if(!R)throw"invalid length/literal";if(B<256)t[h++]=B;else{if(256==B){k=d,c=null;break}var F=B-254;if(B>264){var U=fleb[T=B-257];F=bits(e,d,(1<<U)-1)+fl[T],d+=U}var G=u[bits16(e,d)&N],V=G>>>4;if(!G)throw"invalid distance";if(d+=15&G,O=fd[V],V>3&&(U=fdeb[V],O+=bits16(e,d)&(1<<U)-1,d+=U),d>g){if(i)throw"unexpected EOF";break}a&&o(h+131072);for(var H=h+F;h<H;h+=4)t[h]=t[h-O],t[h+1]=t[h+1-O],t[h+2]=t[h+2-O],t[h+3]=t[h+3-O];h=H}}n.l=c,n.p=k,n.b=h,c&&(l=1,n.m=p,n.d=u,n.n=m)}while(!l);return h==t.length?t:function(e,t,n){(null==t||t<0)&&(t=0),(null==n||n>e.length)&&(n=e.length);var r=new(e instanceof u16?u16:e instanceof u32?u32:u8)(n-t);return r.set(e.subarray(t,n)),r}(t,0,h)}((function(e){if(8!=(15&e[0])||e[0]>>>4>7||(e[0]<<8|e[1])%31)throw"invalid zlib data";if(32&e[1])throw"invalid zlib data: preset dictionaries not supported"}(e),e.subarray(2,-4)),t)}var td="undefined"!=typeof TextDecoder&&new TextDecoder;try{td.decode(et,{stream:!0})}catch(e){}class EXRLoader extends DataTextureLoader{constructor(e){super(e),this.type=HalfFloatType}parse(e){const t=Math.pow(2.7182818,2.2),n={l:0,c:0,lc:0};function r(e,t,r,a,i){for(;r<e;)t=t<<8|D(a,i),r+=8;r-=e,n.l=t>>r&(1<<e)-1,n.c=t,n.lc=r}const a=new Array(59);function i(e){return 63&e}function s(e){return e>>6}const o={c:0,lc:0};function l(e,t,n,r){e=e<<8|D(n,r),t+=8,o.c=e,o.lc=t}const d={c:0,lc:0};function h(e,t,n,r,a,i,s,h,c){if(e==t){r<8&&(l(n,r,a,i),n=o.c,r=o.lc);let e=n>>(r-=8);if(e=new Uint8Array([e])[0],h.value+e>c)return!1;const t=s[h.value-1];for(;e-- >0;)s[h.value++]=t}else{if(!(h.value<c))return!1;s[h.value++]=e}d.c=n,d.lc=r}function c(e){return 65535&e}function u(e){const t=c(e);return t>32767?t-65536:t}const p={a:0,b:0};function m(e,t){const n=u(e),r=u(t),a=n+(1&r)+(r>>1),i=a,s=a-r;p.a=i,p.b=s}function g(e,t){const n=c(e),r=c(t),a=n-(r>>1)&65535,i=r+a-32768&65535;p.a=i,p.b=a}function f(e,t,n,r,a,i,s){const o=s<16384,l=n>a?a:n;let d,h,c=1;for(;c<=l;)c<<=1;for(c>>=1,d=c,c>>=1;c>=1;){h=0;const s=h+i*(a-d),l=i*c,u=i*d,f=r*c,_=r*d;let v,w,b,S;for(;h<=s;h+=u){let a=h;const i=h+r*(n-d);for(;a<=i;a+=_){const n=a+f,r=a+l,i=r+f;o?(m(e[a+t],e[r+t]),v=p.a,b=p.b,m(e[n+t],e[i+t]),w=p.a,S=p.b,m(v,w),e[a+t]=p.a,e[n+t]=p.b,m(b,S),e[r+t]=p.a,e[i+t]=p.b):(g(e[a+t],e[r+t]),v=p.a,b=p.b,g(e[n+t],e[i+t]),w=p.a,S=p.b,g(v,w),e[a+t]=p.a,e[n+t]=p.b,g(b,S),e[r+t]=p.a,e[i+t]=p.b)}if(n&c){const n=a+l;o?m(e[a+t],e[n+t]):g(e[a+t],e[n+t]),v=p.a,e[n+t]=p.b,e[a+t]=v}}if(a&c){let a=h;const i=h+r*(n-d);for(;a<=i;a+=_){const n=a+f;o?m(e[a+t],e[n+t]):g(e[a+t],e[n+t]),v=p.a,e[n+t]=p.b,e[a+t]=v}}d=c,c>>=1}return h}function _(e,t,c,u,p,m){const g=c.value,f=O(t,c),_=O(t,c);c.value+=4;const v=O(t,c);if(c.value+=4,f<0||f>=65537||_<0||_>=65537)throw new Error("Something wrong with HUF_ENCSIZE");const w=new Array(65537),b=new Array(16384);if(function(e){for(let t=0;t<16384;t++)e[t]={},e[t].len=0,e[t].lit=0,e[t].p=null}(b),function(e,t,i,s,o,l){const d=t;let h=0,c=0;for(;s<=o;s++){if(d.value-t.value>i)return!1;r(6,h,c,e,d);const a=n.l;if(h=n.c,c=n.lc,l[s]=a,63==a){if(d.value-t.value>i)throw new Error("Something wrong with hufUnpackEncTable");r(8,h,c,e,d);let a=n.l+6;if(h=n.c,c=n.lc,s+a>o+1)throw new Error("Something wrong with hufUnpackEncTable");for(;a--;)l[s++]=0;s--}else if(a>=59){let e=a-59+2;if(s+e>o+1)throw new Error("Something wrong with hufUnpackEncTable");for(;e--;)l[s++]=0;s--}}!function(e){for(let e=0;e<=58;++e)a[e]=0;for(let t=0;t<65537;++t)a[e[t]]+=1;let t=0;for(let e=58;e>0;--e){const n=t+a[e]>>1;a[e]=t,t=n}for(let t=0;t<65537;++t){const n=e[t];n>0&&(e[t]=n|a[n]++<<6)}}(l)}(e,c,u-(c.value-g),f,_,w),v>8*(u-(c.value-g)))throw new Error("Something wrong with hufUncompress");!function(e,t,n,r){for(;t<=n;t++){const n=s(e[t]),a=i(e[t]);if(n>>a)throw new Error("Invalid table entry");if(a>14){const e=r[n>>a-14];if(e.len)throw new Error("Invalid table entry");if(e.lit++,e.p){const t=e.p;e.p=new Array(e.lit);for(let n=0;n<e.lit-1;++n)e.p[n]=t[n]}else e.p=new Array(1);e.p[e.lit-1]=t}else if(a){let e=0;for(let i=1<<14-a;i>0;i--){const i=r[(n<<14-a)+e];if(i.len||i.p)throw new Error("Invalid table entry");i.len=a,i.lit=t,e++}}}}(w,f,_,b),function(e,t,n,r,a,c,u,p,m){let g=0,f=0;const _=u,v=Math.trunc(r.value+(a+7)/8);for(;r.value<v;)for(l(g,f,n,r),g=o.c,f=o.lc;f>=14;){const a=t[g>>f-14&16383];if(a.len)f-=a.len,h(a.lit,c,g,f,n,r,p,m,_),g=d.c,f=d.lc;else{if(!a.p)throw new Error("hufDecode issues");let t;for(t=0;t<a.lit;t++){const u=i(e[a.p[t]]);for(;f<u&&r.value<v;)l(g,f,n,r),g=o.c,f=o.lc;if(f>=u&&s(e[a.p[t]])==(g>>f-u&(1<<u)-1)){f-=u,h(a.p[t],c,g,f,n,r,p,m,_),g=d.c,f=d.lc;break}}if(t==a.lit)throw new Error("hufDecode issues")}}const w=8-a&7;for(g>>=w,f-=w;f>0;){const e=t[g<<14-f&16383];if(!e.len)throw new Error("hufDecode issues");f-=e.len,h(e.lit,c,g,f,n,r,p,m,_),g=d.c,f=d.lc}}(w,b,e,c,v,_,m,p,{value:0})}function v(e){for(let t=1;t<e.length;t++){const n=e[t-1]+e[t]-128;e[t]=n}}function w(e,t){let n=0,r=Math.floor((e.length+1)/2),a=0;const i=e.length-1;for(;!(a>i||(t[a++]=e[n++],a>i));)t[a++]=e[r++]}function b(e){let t=e.byteLength;const n=new Array;let r=0;const a=new DataView(e);for(;t>0;){const e=a.getInt8(r++);if(e<0){const i=-e;t-=i+1;for(let e=0;e<i;e++)n.push(a.getUint8(r++))}else{const i=e;t-=2;const s=a.getUint8(r++);for(let e=0;e<i+1;e++)n.push(s)}}return n}function S(e,t,n){let r,a=1;for(;a<64;)r=t[e.value],65280==r?a=64:r>>8==255?a+=255&r:(n[a]=r,a++),e.value++}function y(e){const t=.5*Math.cos(.7853975),n=.5*Math.cos(3.14159/16),r=.5*Math.cos(3.14159/8),a=.5*Math.cos(3*3.14159/16),i=.5*Math.cos(.981746875),s=.5*Math.cos(3*3.14159/8),o=.5*Math.cos(1.374445625),l=new Array(4),d=new Array(4),h=new Array(4),c=new Array(4);for(let u=0;u<8;++u){const p=8*u;l[0]=r*e[p+2],l[1]=s*e[p+2],l[2]=r*e[p+6],l[3]=s*e[p+6],d[0]=n*e[p+1]+a*e[p+3]+i*e[p+5]+o*e[p+7],d[1]=a*e[p+1]-o*e[p+3]-n*e[p+5]-i*e[p+7],d[2]=i*e[p+1]-n*e[p+3]+o*e[p+5]+a*e[p+7],d[3]=o*e[p+1]-i*e[p+3]+a*e[p+5]-n*e[p+7],h[0]=t*(e[p+0]+e[p+4]),h[3]=t*(e[p+0]-e[p+4]),h[1]=l[0]+l[3],h[2]=l[1]-l[2],c[0]=h[0]+h[1],c[1]=h[3]+h[2],c[2]=h[3]-h[2],c[3]=h[0]-h[1],e[p+0]=c[0]+d[0],e[p+1]=c[1]+d[1],e[p+2]=c[2]+d[2],e[p+3]=c[3]+d[3],e[p+4]=c[3]-d[3],e[p+5]=c[2]-d[2],e[p+6]=c[1]-d[1],e[p+7]=c[0]-d[0]}for(let u=0;u<8;++u)l[0]=r*e[16+u],l[1]=s*e[16+u],l[2]=r*e[48+u],l[3]=s*e[48+u],d[0]=n*e[8+u]+a*e[24+u]+i*e[40+u]+o*e[56+u],d[1]=a*e[8+u]-o*e[24+u]-n*e[40+u]-i*e[56+u],d[2]=i*e[8+u]-n*e[24+u]+o*e[40+u]+a*e[56+u],d[3]=o*e[8+u]-i*e[24+u]+a*e[40+u]-n*e[56+u],h[0]=t*(e[u]+e[32+u]),h[3]=t*(e[u]-e[32+u]),h[1]=l[0]+l[3],h[2]=l[1]-l[2],c[0]=h[0]+h[1],c[1]=h[3]+h[2],c[2]=h[3]-h[2],c[3]=h[0]-h[1],e[0+u]=c[0]+d[0],e[8+u]=c[1]+d[1],e[16+u]=c[2]+d[2],e[24+u]=c[3]+d[3],e[32+u]=c[3]-d[3],e[40+u]=c[2]-d[2],e[48+u]=c[1]-d[1],e[56+u]=c[0]-d[0]}function C(e){for(let t=0;t<64;++t){const n=e[0][t],r=e[1][t],a=e[2][t];e[0][t]=n+1.5747*a,e[1][t]=n-.1873*r-.4682*a,e[2][t]=n+1.8556*r}}function T(e,n,r){for(let i=0;i<64;++i)n[r+i]=DataUtils.toHalfFloat((a=e[i])<=1?Math.sign(a)*Math.pow(Math.abs(a),2.2):Math.sign(a)*Math.pow(t,Math.abs(a)-1));var a}function M(e){return new DataView(e.array.buffer,e.offset.value,e.size)}function A(e){const t=e.viewer.buffer.slice(e.offset.value,e.offset.value+e.size),n=new Uint8Array(b(t)),r=new Uint8Array(n.length);return v(n),w(n,r),new DataView(r.buffer)}function x(e){const t=unzlibSync(e.array.slice(e.offset.value,e.offset.value+e.size)),n=new Uint8Array(t.length);return v(t),w(t,n),new DataView(n.buffer)}function E(e){const t=e.viewer,n={value:e.offset.value},r=new Uint16Array(e.width*e.scanlineBlockSize*(e.channels*e.type)),a=new Uint8Array(8192);let i=0;const s=new Array(e.channels);for(let t=0;t<e.channels;t++)s[t]={},s[t].start=i,s[t].end=s[t].start,s[t].nx=e.width,s[t].ny=e.lines,s[t].size=e.type,i+=s[t].nx*s[t].ny*s[t].size;const o=G(t,n),l=G(t,n);if(l>=8192)throw new Error("Something is wrong with PIZ_COMPRESSION BITMAP_SIZE");if(o<=l)for(let e=0;e<l-o+1;e++)a[e+o]=N(t,n);const d=new Uint16Array(65536),h=function(e,t){let n=0;for(let r=0;r<65536;++r)(0==r||e[r>>3]&1<<(7&r))&&(t[n++]=r);const r=n-1;for(;n<65536;)t[n++]=0;return r}(a,d),c=O(t,n);_(e.array,t,n,c,r,i);for(let t=0;t<e.channels;++t){const e=s[t];for(let n=0;n<s[t].size;++n)f(r,e.start+n,e.nx,e.size,e.ny,e.nx*e.size,h)}!function(e,t,n){for(let r=0;r<n;++r)t[r]=e[t[r]]}(d,r,i);let u=0;const p=new Uint8Array(r.buffer.byteLength);for(let t=0;t<e.lines;t++)for(let t=0;t<e.channels;t++){const e=s[t],n=e.nx*e.size,a=new Uint8Array(r.buffer,2*e.end,2*n);p.set(a,u),u+=2*n,e.end+=n}return new DataView(p.buffer)}function P(e){const t=unzlibSync(e.array.slice(e.offset.value,e.offset.value+e.size)),n=e.lines*e.channels*e.width,r=1==e.type?new Uint16Array(n):new Uint32Array(n);let a=0,i=0;const s=new Array(4);for(let n=0;n<e.lines;n++)for(let n=0;n<e.channels;n++){let n=0;switch(e.type){case 1:s[0]=a,s[1]=s[0]+e.width,a=s[1]+e.width;for(let a=0;a<e.width;++a)n+=t[s[0]++]<<8|t[s[1]++],r[i]=n,i++;break;case 2:s[0]=a,s[1]=s[0]+e.width,s[2]=s[1]+e.width,a=s[2]+e.width;for(let a=0;a<e.width;++a)n+=t[s[0]++]<<24|t[s[1]++]<<16|t[s[2]++]<<8,r[i]=n,i++}}return new DataView(r.buffer)}function R(e){const t=e.viewer,n={value:e.offset.value},r=new Uint8Array(e.width*e.lines*(e.channels*e.type*2)),a={version:k(t,n),unknownUncompressedSize:k(t,n),unknownCompressedSize:k(t,n),acCompressedSize:k(t,n),dcCompressedSize:k(t,n),rleCompressedSize:k(t,n),rleUncompressedSize:k(t,n),rleRawSize:k(t,n),totalAcUncompressedCount:k(t,n),totalDcUncompressedCount:k(t,n),acCompression:k(t,n)};if(a.version<2)throw new Error("EXRLoader.parse: "+K.compression+" version "+a.version+" is unsupported");const i=new Array;let s=G(t,n)-2;for(;s>0;){const e=I(t.buffer,n),r=N(t,n),a=r>>2&3,o=new Int8Array([(r>>4)-1])[0],l=N(t,n);i.push({name:e,index:o,type:l,compression:a}),s-=e.length+3}const o=K.channels,l=new Array(e.channels);for(let t=0;t<e.channels;++t){const n=l[t]={},r=o[t];n.name=r.name,n.compression=0,n.decoded=!1,n.type=r.pixelType,n.pLinear=r.pLinear,n.width=e.width,n.height=e.lines}const d={idx:new Array(3)};for(let t=0;t<e.channels;++t){const e=l[t];for(let n=0;n<i.length;++n){const r=i[n];e.name==r.name&&(e.compression=r.compression,r.index>=0&&(d.idx[r.index]=t),e.offset=t)}}let h,c,u;if(a.acCompressedSize>0)switch(a.acCompression){case 0:h=new Uint16Array(a.totalAcUncompressedCount),_(e.array,t,n,a.acCompressedSize,h,a.totalAcUncompressedCount);break;case 1:const r=unzlibSync(e.array.slice(n.value,n.value+a.totalAcUncompressedCount));h=new Uint16Array(r.buffer),n.value+=a.totalAcUncompressedCount}if(a.dcCompressedSize>0){const t={array:e.array,offset:n,size:a.dcCompressedSize};c=new Uint16Array(x(t).buffer),n.value+=a.dcCompressedSize}a.rleRawSize>0&&(u=b(unzlibSync(e.array.slice(n.value,n.value+a.rleCompressedSize)).buffer),n.value+=a.rleCompressedSize);let p=0;const m=new Array(l.length);for(let e=0;e<m.length;++e)m[e]=new Array;for(let t=0;t<e.lines;++t)for(let t=0;t<l.length;++t)m[t].push(p),p+=l[t].width*e.type*2;!function(e,t,n,r,a,i){let s=new DataView(i.buffer);const o=n[e.idx[0]].width,l=n[e.idx[0]].height,d=Math.floor(o/8),h=Math.ceil(o/8),c=Math.ceil(l/8),u=o-8*(h-1),p=l-8*(c-1),m={value:0},g=new Array(3),f=new Array(3),_=new Array(3),v=new Array(3),w=new Array(3);for(let n=0;n<3;++n)w[n]=t[e.idx[n]],g[n]=n<1?0:g[n-1]+h*c,f[n]=new Float32Array(64),_[n]=new Uint16Array(64),v[n]=new Uint16Array(64*h);for(let t=0;t<c;++t){let i=8;t==c-1&&(i=p);let o=8;for(let e=0;e<h;++e){e==h-1&&(o=u);for(let e=0;e<3;++e)_[e].fill(0),_[e][0]=a[g[e]++],S(m,r,_[e]),b=_[e],(M=f[e])[0]=U(b[0]),M[1]=U(b[1]),M[2]=U(b[5]),M[3]=U(b[6]),M[4]=U(b[14]),M[5]=U(b[15]),M[6]=U(b[27]),M[7]=U(b[28]),M[8]=U(b[2]),M[9]=U(b[4]),M[10]=U(b[7]),M[11]=U(b[13]),M[12]=U(b[16]),M[13]=U(b[26]),M[14]=U(b[29]),M[15]=U(b[42]),M[16]=U(b[3]),M[17]=U(b[8]),M[18]=U(b[12]),M[19]=U(b[17]),M[20]=U(b[25]),M[21]=U(b[30]),M[22]=U(b[41]),M[23]=U(b[43]),M[24]=U(b[9]),M[25]=U(b[11]),M[26]=U(b[18]),M[27]=U(b[24]),M[28]=U(b[31]),M[29]=U(b[40]),M[30]=U(b[44]),M[31]=U(b[53]),M[32]=U(b[10]),M[33]=U(b[19]),M[34]=U(b[23]),M[35]=U(b[32]),M[36]=U(b[39]),M[37]=U(b[45]),M[38]=U(b[52]),M[39]=U(b[54]),M[40]=U(b[20]),M[41]=U(b[22]),M[42]=U(b[33]),M[43]=U(b[38]),M[44]=U(b[46]),M[45]=U(b[51]),M[46]=U(b[55]),M[47]=U(b[60]),M[48]=U(b[21]),M[49]=U(b[34]),M[50]=U(b[37]),M[51]=U(b[47]),M[52]=U(b[50]),M[53]=U(b[56]),M[54]=U(b[59]),M[55]=U(b[61]),M[56]=U(b[35]),M[57]=U(b[36]),M[58]=U(b[48]),M[59]=U(b[49]),M[60]=U(b[57]),M[61]=U(b[58]),M[62]=U(b[62]),M[63]=U(b[63]),y(f[e]);C(f);for(let t=0;t<3;++t)T(f[t],v[t],64*e)}let l=0;for(let r=0;r<3;++r){const a=n[e.idx[r]].type;for(let e=8*t;e<8*t+i;++e){l=w[r][e];for(let t=0;t<d;++t){const n=64*t+8*(7&e);s.setUint16(l+0*a,v[r][n+0],!0),s.setUint16(l+2*a,v[r][n+1],!0),s.setUint16(l+4*a,v[r][n+2],!0),s.setUint16(l+6*a,v[r][n+3],!0),s.setUint16(l+8*a,v[r][n+4],!0),s.setUint16(l+10*a,v[r][n+5],!0),s.setUint16(l+12*a,v[r][n+6],!0),s.setUint16(l+14*a,v[r][n+7],!0),l+=16*a}}if(d!=h)for(let e=8*t;e<8*t+i;++e){const t=w[r][e]+8*d*2*a,n=64*d+8*(7&e);for(let e=0;e<o;++e)s.setUint16(t+2*e*a,v[r][n+e],!0)}}}var b,M;const A=new Uint16Array(o);s=new DataView(i.buffer);for(let t=0;t<3;++t){n[e.idx[t]].decoded=!0;const r=n[e.idx[t]].type;if(2==n[t].type)for(let e=0;e<l;++e){const n=w[t][e];for(let e=0;e<o;++e)A[e]=s.getUint16(n+2*e*r,!0);for(let e=0;e<o;++e)s.setFloat32(n+2*e*r,U(A[e]),!0)}}}(d,m,l,h,c,r);for(let t=0;t<l.length;++t){const n=l[t];if(!n.decoded)switch(n.compression){case 2:let a=0,i=0;for(let s=0;s<e.lines;++s){let e=m[t][a];for(let t=0;t<n.width;++t){for(let t=0;t<2*n.type;++t)r[e++]=u[i+t*n.width*n.height];i++}a++}break;case 1:default:throw new Error("EXRLoader.parse: unsupported channel compression")}}return new DataView(r.buffer)}function I(e,t){const n=new Uint8Array(e);let r=0;for(;0!=n[t.value+r];)r+=1;const a=(new TextDecoder).decode(n.slice(t.value,t.value+r));return t.value=t.value+r+1,a}function L(e,t){const n=e.getInt32(t.value,!0);return t.value=t.value+4,n}function O(e,t){const n=e.getUint32(t.value,!0);return t.value=t.value+4,n}function D(e,t){const n=e[t.value];return t.value=t.value+1,n}function N(e,t){const n=e.getUint8(t.value);return t.value=t.value+1,n}const k=function(e,t){let n;return n="getBigInt64"in DataView.prototype?Number(e.getBigInt64(t.value,!0)):e.getUint32(t.value+4,!0)+Number(e.getUint32(t.value,!0)<<32),t.value+=8,n};function B(e,t){const n=e.getFloat32(t.value,!0);return t.value+=4,n}function F(e,t){return DataUtils.toHalfFloat(B(e,t))}function U(e){const t=(31744&e)>>10,n=1023&e;return(e>>15?-1:1)*(t?31===t?n?NaN:1/0:Math.pow(2,t-15)*(1+n/1024):n/1024*6103515625e-14)}function G(e,t){const n=e.getUint16(t.value,!0);return t.value+=2,n}function V(e,t){return U(G(e,t))}function H(e,t,n,r,a){return"string"===r||"stringvector"===r||"iccProfile"===r?function(e,t,n){const r=(new TextDecoder).decode(new Uint8Array(e).slice(t.value,t.value+n));return t.value=t.value+n,r}(t,n,a):"chlist"===r?function(e,t,n,r){const a=n.value,i=[];for(;n.value<a+r-1;){const r=I(t,n),a=L(e,n),s=N(e,n);n.value+=3;const o=L(e,n),l=L(e,n);i.push({name:r,pixelType:a,pLinear:s,xSampling:o,ySampling:l})}return n.value+=1,i}(e,t,n,a):"chromaticities"===r?function(e,t){return{redX:B(e,t),redY:B(e,t),greenX:B(e,t),greenY:B(e,t),blueX:B(e,t),blueY:B(e,t),whiteX:B(e,t),whiteY:B(e,t)}}(e,n):"compression"===r?function(e,t){return["NO_COMPRESSION","RLE_COMPRESSION","ZIPS_COMPRESSION","ZIP_COMPRESSION","PIZ_COMPRESSION","PXR24_COMPRESSION","B44_COMPRESSION","B44A_COMPRESSION","DWAA_COMPRESSION","DWAB_COMPRESSION"][N(e,t)]}(e,n):"box2i"===r?function(e,t){return{xMin:O(e,t),yMin:O(e,t),xMax:O(e,t),yMax:O(e,t)}}(e,n):"lineOrder"===r?function(e,t){return["INCREASING_Y"][N(e,t)]}(e,n):"float"===r?B(e,n):"v2f"===r?function(e,t){return[B(e,t),B(e,t)]}(e,n):"v3f"===r?function(e,t){return[B(e,t),B(e,t),B(e,t)]}(e,n):"int"===r?L(e,n):"rational"===r?function(e,t){return[L(e,t),O(e,t)]}(e,n):"timecode"===r?function(e,t){return[O(e,t),O(e,t)]}(e,n):"preview"===r?(n.value+=a,"skipped"):void(n.value+=a)}const j=new DataView(e),z=new Uint8Array(e),W={value:0},K=function(e,t,n){const r={};if(20000630!=e.getUint32(0,!0))throw new Error("THREE.EXRLoader: provided file doesn't appear to be in OpenEXR format.");r.version=e.getUint8(4);const a=e.getUint8(5);r.spec={singleTile:!!(2&a),longName:!!(4&a),deepFormat:!!(8&a),multiPart:!!(16&a)},n.value=8;let i=!0;for(;i;){const a=I(t,n);if(0==a)i=!1;else{const i=I(t,n),s=H(e,t,n,i,O(e,n));void 0===s?console.warn(`EXRLoader.parse: skipped unknown header attribute type '${i}'.`):r[a]=s}}if(0!=(-5&a))throw console.error("EXRHeader:",r),new Error("THREE.EXRLoader: provided file is currently unsupported.");return r}(j,e,W),X=function(e,t,n,r,a){const i={size:0,viewer:t,array:n,offset:r,width:e.dataWindow.xMax-e.dataWindow.xMin+1,height:e.dataWindow.yMax-e.dataWindow.yMin+1,channels:e.channels.length,bytesPerLine:null,lines:null,inputSize:null,type:e.channels[0].pixelType,uncompress:null,getter:null,format:null,colorSpace:LinearSRGBColorSpace};switch(e.compression){case"NO_COMPRESSION":i.lines=1,i.uncompress=M;break;case"RLE_COMPRESSION":i.lines=1,i.uncompress=A;break;case"ZIPS_COMPRESSION":i.lines=1,i.uncompress=x;break;case"ZIP_COMPRESSION":i.lines=16,i.uncompress=x;break;case"PIZ_COMPRESSION":i.lines=32,i.uncompress=E;break;case"PXR24_COMPRESSION":i.lines=16,i.uncompress=P;break;case"DWAA_COMPRESSION":i.lines=32,i.uncompress=R;break;case"DWAB_COMPRESSION":i.lines=256,i.uncompress=R;break;default:throw new Error("EXRLoader.parse: "+e.compression+" is unsupported")}if(i.scanlineBlockSize=i.lines,1==i.type)switch(a){case FloatType:i.getter=V,i.inputSize=2;break;case HalfFloatType:i.getter=G,i.inputSize=2}else{if(2!=i.type)throw new Error("EXRLoader.parse: unsupported pixelType "+i.type+" for "+e.compression+".");switch(a){case FloatType:i.getter=B,i.inputSize=4;break;case HalfFloatType:i.getter=F,i.inputSize=4}}i.blockCount=(e.dataWindow.yMax+1)/i.scanlineBlockSize;for(let e=0;e<i.blockCount;e++)k(t,r);i.outputChannels=3==i.channels?4:i.channels;const s=i.width*i.height*i.outputChannels;switch(a){case FloatType:i.byteArray=new Float32Array(s),i.channels<i.outputChannels&&i.byteArray.fill(1,0,s);break;case HalfFloatType:i.byteArray=new Uint16Array(s),i.channels<i.outputChannels&&i.byteArray.fill(15360,0,s);break;default:console.error("THREE.EXRLoader: unsupported type: ",a)}return i.bytesPerLine=i.width*i.inputSize*i.channels,4==i.outputChannels?(i.format=RGBAFormat,i.colorSpace=LinearSRGBColorSpace):(i.format=RedFormat,i.colorSpace=NoColorSpace),i}(K,j,z,W,this.type),Y={value:0},Q={R:0,G:1,B:2,A:3,Y:0};for(let e=0;e<X.height/X.scanlineBlockSize;e++){const t=O(j,W);X.size=O(j,W),X.lines=t+X.scanlineBlockSize>X.height?X.height-t:X.scanlineBlockSize;const n=X.size<X.lines*X.bytesPerLine?X.uncompress(X):M(X);W.value+=X.size;for(let t=0;t<X.scanlineBlockSize;t++){const r=t+e*X.scanlineBlockSize;if(r>=X.height)break;for(let e=0;e<X.channels;e++){const a=Q[K.channels[e].name];for(let i=0;i<X.width;i++){Y.value=(t*(X.channels*X.width)+e*X.width+i)*X.inputSize;const s=(X.height-1-r)*(X.width*X.outputChannels)+i*X.outputChannels+a;X.byteArray[s]=X.getter(n,Y)}}}}return{header:K,width:X.width,height:X.height,data:X.byteArray,format:X.format,colorSpace:X.colorSpace,type:this.type}}setDataType(e){return this.type=e,this}load(e,t,n,r){return super.load(e,(function(e,n){e.colorSpace=n.colorSpace,e.minFilter=LinearFilter,e.magFilter=LinearFilter,e.generateMipmaps=!1,e.flipY=!1,t&&t(e,n)}),n,r)}}class RGBELoader extends DataTextureLoader{constructor(e){super(e),this.type=HalfFloatType}parse(e){const t=function(e,t){switch(e){case 1:console.error("THREE.RGBELoader Read Error: "+(t||""));break;case 2:console.error("THREE.RGBELoader Write Error: "+(t||""));break;case 3:console.error("THREE.RGBELoader Bad File Format: "+(t||""));break;default:case 4:console.error("THREE.RGBELoader: Error: "+(t||""))}return-1},n=function(e,t,n){t=t||1024;let r=e.pos,a=-1,i=0,s="",o=String.fromCharCode.apply(null,new Uint16Array(e.subarray(r,r+128)));for(;0>(a=o.indexOf("\n"))&&i<t&&r<e.byteLength;)s+=o,i+=o.length,r+=128,o+=String.fromCharCode.apply(null,new Uint16Array(e.subarray(r,r+128)));return-1<a&&(!1!==n&&(e.pos+=i+a+1),s+o.slice(0,a))},r=function(e,t,n,r){const a=e[t+3],i=Math.pow(2,a-128)/255;n[r+0]=e[t+0]*i,n[r+1]=e[t+1]*i,n[r+2]=e[t+2]*i,n[r+3]=1},a=function(e,t,n,r){const a=e[t+3],i=Math.pow(2,a-128)/255;n[r+0]=DataUtils.toHalfFloat(Math.min(e[t+0]*i,65504)),n[r+1]=DataUtils.toHalfFloat(Math.min(e[t+1]*i,65504)),n[r+2]=DataUtils.toHalfFloat(Math.min(e[t+2]*i,65504)),n[r+3]=DataUtils.toHalfFloat(1)},i=new Uint8Array(e);i.pos=0;const s=function(e){const r=/^\s*GAMMA\s*=\s*(\d+(\.\d+)?)\s*$/,a=/^\s*EXPOSURE\s*=\s*(\d+(\.\d+)?)\s*$/,i=/^\s*FORMAT=(\S+)\s*$/,s=/^\s*\-Y\s+(\d+)\s+\+X\s+(\d+)\s*$/,o={valid:0,string:"",comments:"",programtype:"RGBE",format:"",gamma:1,exposure:1,width:0,height:0};let l,d;if(e.pos>=e.byteLength||!(l=n(e)))return t(1,"no header found");if(!(d=l.match(/^#\?(\S+)/)))return t(3,"bad initial token");for(o.valid|=1,o.programtype=d[1],o.string+=l+"\n";l=n(e),!1!==l;)if(o.string+=l+"\n","#"!==l.charAt(0)){if((d=l.match(r))&&(o.gamma=parseFloat(d[1])),(d=l.match(a))&&(o.exposure=parseFloat(d[1])),(d=l.match(i))&&(o.valid|=2,o.format=d[1]),(d=l.match(s))&&(o.valid|=4,o.height=parseInt(d[1],10),o.width=parseInt(d[2],10)),2&o.valid&&4&o.valid)break}else o.comments+=l+"\n";return 2&o.valid?4&o.valid?o:t(3,"missing image size specifier"):t(3,"missing format specifier")}(i);if(-1!==s){const e=s.width,n=s.height,o=function(e,n,r){const a=n;if(a<8||a>32767||2!==e[0]||2!==e[1]||128&e[2])return new Uint8Array(e);if(a!==(e[2]<<8|e[3]))return t(3,"wrong scanline width");const i=new Uint8Array(4*n*r);if(!i.length)return t(4,"unable to allocate buffer space");let s=0,o=0;const l=4*a,d=new Uint8Array(4),h=new Uint8Array(l);let c=r;for(;c>0&&o<e.byteLength;){if(o+4>e.byteLength)return t(1);if(d[0]=e[o++],d[1]=e[o++],d[2]=e[o++],d[3]=e[o++],2!=d[0]||2!=d[1]||(d[2]<<8|d[3])!=a)return t(3,"bad rgbe scanline format");let n,r=0;for(;r<l&&o<e.byteLength;){n=e[o++];const a=n>128;if(a&&(n-=128),0===n||r+n>l)return t(3,"bad scanline data");if(a){const t=e[o++];for(let e=0;e<n;e++)h[r++]=t}else h.set(e.subarray(o,o+n),r),r+=n,o+=n}const u=a;for(let e=0;e<u;e++){let t=0;i[s]=h[e+t],t+=a,i[s+1]=h[e+t],t+=a,i[s+2]=h[e+t],t+=a,i[s+3]=h[e+t],s+=4}c--}return i}(i.subarray(i.pos),e,n);if(-1!==o){let t,i,l;switch(this.type){case FloatType:l=o.length/4;const e=new Float32Array(4*l);for(let t=0;t<l;t++)r(o,4*t,e,4*t);t=e,i=FloatType;break;case HalfFloatType:l=o.length/4;const n=new Uint16Array(4*l);for(let e=0;e<l;e++)a(o,4*e,n,4*e);t=n,i=HalfFloatType;break;default:console.error("THREE.RGBELoader: unsupported type: ",this.type)}return{width:e,height:n,data:t,header:s.string,gamma:s.gamma,exposure:s.exposure,type:i}}}return null}setDataType(e){return this.type=e,this}load(e,t,n,r){return super.load(e,(function(e,n){switch(e.type){case FloatType:case HalfFloatType:e.colorSpace=LinearSRGBColorSpace,e.minFilter=LinearFilter,e.magFilter=LinearFilter,e.generateMipmaps=!1,e.flipY=!0}t&&t(e,n)}),n,r)}}const CopyTransformShader={uniforms:{tDiffuse:{value:null},colorTransform:{value:new Matrix4},colorBase:{value:new Vector4(0,0,0,0)},multiplyChannels:{value:0},uvTransform:{value:new Matrix3}},vertexShader:"\n varying vec2 vUv;\n uniform mat3 uvTransform;\n \n void main() {\n vUv = (uvTransform * vec3(uv, 1.0)).xy;\n gl_Position = (projectionMatrix * modelViewMatrix * vec4(position, 1.0)).xyww;\n }",fragmentShader:"\n uniform sampler2D tDiffuse;\n uniform mat4 colorTransform;\n uniform vec4 colorBase;\n uniform float multiplyChannels;\n varying vec2 vUv;\n \n void main() {\n vec4 color = colorTransform * texture2D(tDiffuse, vUv) + colorBase;\n color.rgb = mix(color.rgb, vec3(color.r * color.g * color.b), multiplyChannels);\n gl_FragColor = color;\n }"},DEFAULT_TRANSFORM=new Matrix4,RGB_TRANSFORM=(new Matrix4).set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0),ALPHA_TRANSFORM=(new Matrix4).set(0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0),RED_TRANSFORM=(new Matrix4).set(1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,1),GRAYSCALE_TRANSFORM=(new Matrix4).set(1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,1),ZERO_RGBA=new Vector4(0,0,0,0),ALPHA_RGBA=new Vector4(0,0,0,1),DEFAULT_UV_TRANSFORM=new Matrix3,FLIP_Y_UV_TRANSFORM=(new Matrix3).set(1,0,0,0,-1,1,0,0,1),interpolationMatrix=(e,t,n,r)=>(new Matrix4).set(e,0,0,1-e,0,t,0,1-t,0,0,n,1-n,0,0,0,r);var CopyMaterialBlendMode;!function(e){e[e.DEFAULT=0]="DEFAULT",e[e.ADDITIVE=1]="ADDITIVE"}(CopyMaterialBlendMode||(CopyMaterialBlendMode={}));class CopyTransformMaterial extends ShaderMaterial{constructor(e,t=CopyMaterialBlendMode.ADDITIVE){const n=t===CopyMaterialBlendMode.ADDITIVE?{blendSrc:DstColorFactor,blendDst:ZeroFactor,blendEquation:AddEquation,blendSrcAlpha:DstAlphaFactor,blendDstAlpha:ZeroFactor,blendEquationAlpha:AddEquation}:{};super({uniforms:UniformsUtils.clone(CopyTransformShader.uniforms),vertexShader:CopyTransformShader.vertexShader,fragmentShader:CopyTransformShader.fragmentShader,transparent:!0,depthTest:!1,depthWrite:!1,...n}),this.update(e)}update(e){return void 0!==(null==e?void 0:e.texture)&&(this.uniforms.tDiffuse.value=null==e?void 0:e.texture),void 0!==(null==e?void 0:e.colorTransform)&&(this.uniforms.colorTransform.value=null==e?void 0:e.colorTransform),void 0!==(null==e?void 0:e.colorBase)&&(this.uniforms.colorBase.value=null==e?void 0:e.colorBase),void 0!==(null==e?void 0:e.multiplyChannels)&&(this.uniforms.multiplyChannels.value=null==e?void 0:e.multiplyChannels),void 0!==(null==e?void 0:e.uvTransform)&&(this.uniforms.uvTransform.value=null==e?void 0:e.uvTransform),void 0!==(null==e?void 0:e.blending)&&(this.blending=null==e?void 0:e.blending),void 0!==(null==e?void 0:e.blendSrc)&&(this.blendSrc=null==e?void 0:e.blendSrc),void 0!==(null==e?void 0:e.blendDst)&&(this.blendDst=null==e?void 0:e.blendDst),void 0!==(null==e?void 0:e.blendEquation)&&(this.blendEquation=null==e?void 0:e.blendEquation),void 0!==(null==e?void 0:e.blendSrcAlpha)&&(this.blendSrcAlpha=null==e?void 0:e.blendSrcAlpha),void 0!==(null==e?void 0:e.blendDstAlpha)&&(this.blendDstAlpha=null==e?void 0:e.blendDstAlpha),void 0!==(null==e?void 0:e.blendEquationAlpha)&&(this.blendEquationAlpha=null==e?void 0:e.blendEquationAlpha),this}}const BlurShader={uniforms:{tDiffuse:{value:null},rangeMin:{value:new Vector2(1/512,1/512)},rangeMax:{value:new Vector2(1/512,1/512)}},vertexShader:"\n varying vec2 vUv;\n void main() {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n }",fragmentShader:"\n uniform sampler2D tDiffuse;\n uniform vec2 rangeMin;\n uniform vec2 rangeMax;\n varying vec2 vUv;\n \n void main() {\n vec4 baseColor = texture2D(tDiffuse, vUv);\n vec2 blur = mix(rangeMax, rangeMin, baseColor.a);\n vec4 sum = vec4( 0.0 );\n sum += texture2D(tDiffuse, vUv - 1.0 * blur) * 0.051;\n sum += texture2D(tDiffuse, vUv - 0.75 * blur) * 0.0918;\n sum += texture2D(tDiffuse, vUv - 0.5 * blur) * 0.12245;\n sum += texture2D(tDiffuse, vUv - 0.25 * blur) * 0.1531;\n sum += baseColor * 0.1633;\n sum += texture2D(tDiffuse, vUv + 0.25 * blur) * 0.1531;\n sum += texture2D(tDiffuse, vUv + 0.5 * blur) * 0.12245;\n sum += texture2D(tDiffuse, vUv + 0.75 * blur) * 0.0918;\n sum += texture2D(tDiffuse, vUv + 1.0 * blur) * 0.051;\n gl_FragColor = sum;\n }"};new Vector2(.1,.9),new Vector2(.1,.9);class LinearDepthRenderMaterial extends ShaderMaterial{constructor(e){super({defines:Object.assign({},LinearDepthRenderMaterial._linearDepthShader.defines),uniforms:UniformsUtils.clone(LinearDepthRenderMaterial._linearDepthShader.uniforms),vertexShader:LinearDepthRenderMaterial._linearDepthShader.vertexShader,fragmentShader:LinearDepthRenderMaterial._linearDepthShader.fragmentShader,blending:NoBlending}),this.update(e)}update(e){if(void 0!==(null==e?void 0:e.depthTexture)&&(this.uniforms.tDepth.value=null==e?void 0:e.depthTexture),void 0!==(null==e?void 0:e.camera)){const t=(null==e?void 0:e.camera)||(null==e?void 0:e.camera);this.uniforms.cameraNear.value=t.near,this.uniforms.cameraFar.value=t.far}return void 0!==(null==e?void 0:e.depthFilter)&&(this.uniforms.depthFilter.value=null==e?void 0:e.depthFilter),this}}LinearDepthRenderMaterial._linearDepthShader={uniforms:{tDepth:{value:null},depthFilter:{value:new Vector4(1,0,0,0)},cameraNear:{value:.1},cameraFar:{value:1}},defines:{PERSPECTIVE_CAMERA:1,ALPHA_DEPTH:0},vertexShader:"varying vec2 vUv;\n void main() {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n }",fragmentShader:"uniform sampler2D tDepth;\n uniform vec4 depthFilter;\n uniform float cameraNear;\n uniform float cameraFar;\n varying vec2 vUv;\n \n #include <packing>\n \n float getLinearDepth(const in vec2 screenPosition) {\n float fragCoordZ = dot(texture2D(tDepth, screenPosition), depthFilter);\n #if PERSPECTIVE_CAMERA == 1\n float viewZ = perspectiveDepthToViewZ(fragCoordZ, cameraNear, cameraFar);\n return viewZToOrthographicDepth(viewZ, cameraNear, cameraFar);\n #else\n return fragCoordZ;\n #endif\n }\n \n void main() {\n float depth = getLinearDepth(vUv);\n gl_FragColor = vec4(vec3(1.0 - depth), 1.0);\n }"};class NormalAndDepthRenderMaterial extends ShaderMaterial{constructor(e){var t;super({defines:Object.assign({...NormalAndDepthRenderMaterial._normalAndDepthShader.defines,FLOAT_BUFFER:(null==e?void 0:e.floatBufferType)?1:0,LINEAR_DEPTH:(null==e?void 0:e.linearDepth)?1:0}),uniforms:UniformsUtils.clone(NormalAndDepthRenderMaterial._normalAndDepthShader.uniforms),vertexShader:NormalAndDepthRenderMaterial._normalAndDepthShader.vertexShader,fragmentShader:NormalAndDepthRenderMaterial._normalAndDepthShader.fragmentShader,blending:null!==(t=null==e?void 0:e.blending)&&void 0!==t?t:NoBlending}),this.update(e)}update(e){if(void 0!==(null==e?void 0:e.camera)){const t=(null==e?void 0:e.camera)||(null==e?void 0:e.camera);this.uniforms.cameraNear.value=t.near,this.uniforms.cameraFar.value=t.far}return this}}NormalAndDepthRenderMaterial._normalAndDepthShader={uniforms:{cameraNear:{value:.1},cameraFar:{value:1}},defines:{FLOAT_BUFFER:0,LINEAR_DEPTH:0},vertexShader:"varying vec3 vNormal;\n#if LINEAR_DEPTH == 1\n varying float vZ; \n#endif\n\n void main() {\n vNormal = normalMatrix * normal;\n vec4 viewPosition = modelViewMatrix * vec4(position, 1.0);\n #if LINEAR_DEPTH == 1\n vZ = viewPosition.z; \n #endif\n gl_Position = projectionMatrix * viewPosition;\n }",fragmentShader:"varying vec3 vNormal;\n#if LINEAR_DEPTH == 1\n varying float vZ; \n uniform float cameraNear;\n uniform float cameraFar;\n#endif\n\n void main() {\n #if FLOAT_BUFFER == 1\n vec3 normal = normalize(vNormal);\n #else\n vec3 normal = normalize(vNormal) * 0.5 + 0.5;\n #endif\n #if LINEAR_DEPTH == 1\n float depth = (-vZ - cameraNear) / (cameraFar - cameraNear);\n #else\n float depth = gl_FragCoord.z;\n #endif\n gl_FragColor = vec4(normal, depth);\n }"};const _camera=new OrthographicCamera(-1,1,1,-1,0,1),_geometry=new BufferGeometry;_geometry.setAttribute("position",new Float32BufferAttribute([-1,3,0,-1,-1,0,3,-1,0],3)),_geometry.setAttribute("uv",new Float32BufferAttribute([0,2,0,0,2,0],2));class FullScreenQuad{constructor(e){this._mesh=new Mesh(_geometry,e)}dispose(){this._mesh.geometry.dispose()}render(e){e.render(this._mesh,_camera)}get material(){return this._mesh.material}set material(e){this._mesh.material=e}}new TextureLoader;class SceneVolume{constructor(){this.bounds=new Box3(new Vector3(-1,-1,-1),new Vector3(1,1,1)),this.size=new Vector3(2,2,2),this.center=new Vector3(0,0,0),this.maxSceneDistanceFromCenter=Math.sqrt(3),this.maxSceneDistanceFrom0=Math.sqrt(3)}copyFrom(e){this.bounds.copy(e.bounds),this.size.copy(e.size),this.center.copy(e.center),this.maxSceneDistanceFromCenter=e.maxSceneDistanceFromCenter,this.maxSceneDistanceFrom0=e.maxSceneDistanceFrom0}updateFromObject(e){e.updateMatrixWorld(),this.bounds.setFromObject(e),this.updateFromBox(this.bounds)}updateFromBox(e){this.bounds!==e&&this.bounds.copy(e),this.bounds.getSize(this.size),this.bounds.getCenter(this.center),this.maxSceneDistanceFromCenter=this.size.length()/2,this.maxSceneDistanceFrom0=new Vector3(Math.max(Math.abs(this.bounds.min.x),Math.abs(this.bounds.max.x)),Math.max(Math.abs(this.bounds.min.y),Math.abs(this.bounds.max.y)),Math.max(Math.abs(this.bounds.min.z),Math.abs(this.bounds.max.z))).length()}updateCameraViewVolumeFromBounds(e){e.updateMatrixWorld();const t=this.bounds.clone().applyMatrix4(e.matrixWorldInverse);e instanceof OrthographicCamera?((e,t)=>{e.left=t.min.x,e.right=t.max.x,e.bottom=t.min.y,e.top=t.max.y,e.near=Math.min(-t.min.z,-t.max.z),e.far=Math.max(-t.min.z,-t.max.z),e.updateProjectionMatrix()})(e,t):e instanceof PerspectiveCamera&&((e,t)=>{const n=Math.min(-t.min.z,-t.max.z),r=Math.max(-t.min.z,-t.max.z);if(n<.001)return;const a=Math.max(Math.abs(t.min.x),Math.abs(t.max.x)),i=Math.max(Math.abs(t.min.y),Math.abs(t.max.y));e.aspect=a/i,e.fov=MathUtils.radToDeg(2*Math.atan2(i,n)),e.near=n,e.far=r,e.updateProjectionMatrix()})(e,t)}getNearAndFarForPerspectiveCamera(e,t=1){const n=e.clone().sub(this.center).length();return[Math.max(.01,n-this.maxSceneDistanceFromCenter-.01),n+this.maxSceneDistanceFromCenter*t+.01]}}class CameraUpdate{changed(e){var t,n;const r=!(null===(t=this._lastCameraProjection)||void 0===t?void 0:t.equals(e.projectionMatrix))||!(null===(n=this._lastCameraWorld)||void 0===n?void 0:n.equals(e.matrixWorld));return this._lastCameraProjection=e.projectionMatrix.clone(),this._lastCameraWorld=e.matrixWorld.clone(),r}}class RenderPass{constructor(){this._originalClearColor=new Color$1,this._originalClearAlpha=0,this._originalAutoClear=!1,this._originalRenderTarget=null,this._screenSpaceQuad=new FullScreenQuad(void 0),this._emptyScene=new Scene,this._defaultCamera=new PerspectiveCamera}renderWithOverrideMaterial(e,t,n,r,a,i,s){this._backup(e),this._prepareRenderer(e,a,i,s);const o=t.overrideMaterial;t.overrideMaterial=r,e.render(t,n),t.overrideMaterial=o,this._restore(e)}clear(e,t,n,r){this._backup(e),this._prepareRenderer(e,t,n,r),e.render(this._emptyScene,this._defaultCamera),this._restore(e)}render(e,t,n,r,a,i){this._backup(e),this._prepareRenderer(e,r,a,i),e.render(t,n),this._restore(e)}renderScreenSpace(e,t,n,r,a){this._backup(e),this._prepareRenderer(e,n,r,a),this._screenSpaceQuad.material=t,this._screenSpaceQuad.render(e),this._restore(e)}_prepareRenderer(e,t,n,r){e.setRenderTarget(t),e.autoClear=!1,null!=n&&(e.setClearColor(n),e.setClearAlpha(r||0),e.clear())}_backup(e){e.getClearColor(this._originalClearColor),this._originalClearAlpha=e.getClearAlpha(),this._originalAutoClear=e.autoClear,this._originalRenderTarget=e.getRenderTarget()}_restore(e){e.setClearColor(this._originalClearColor),e.setClearAlpha(this._originalClearAlpha),e.setRenderTarget(this._originalRenderTarget),e.autoClear=this._originalAutoClear}}class BlurPass{constructor(e,t){var n;this._renderPass=null!==(n=null==t?void 0:t._renderPass)&&void 0!==n?n:new RenderPass,this._blurMaterial=new ShaderMaterial(null!=e?e:BlurShader),this._blurMaterial.depthTest=!1}dispose(){this._blurMaterial.dispose()}render(e,t,n,r){this._blurMaterial.uniforms.tDiffuse.value=t[0].texture,this._blurMaterial.uniforms.rangeMin.value.x=n[0],this._blurMaterial.uniforms.rangeMin.value.y=0,this._blurMaterial.uniforms.rangeMax.value.x=r[0],this._blurMaterial.uniforms.rangeMax.value.y=0,this._renderPass.renderScreenSpace(e,this._blurMaterial,t[1]),this._blurMaterial.uniforms.tDiffuse.value=t[1].texture,this._blurMaterial.uniforms.rangeMin.value.x=0,this._blurMaterial.uniforms.rangeMin.value.y=n[1],this._blurMaterial.uniforms.rangeMax.value.x=0,this._blurMaterial.uniforms.rangeMax.value.y=r[1],this._renderPass.renderScreenSpace(e,this._blurMaterial,t[2])}}class RenderCacheMapItem{constructor(e){this.needsUpdate=!0,this._cache=null,this._cache=e}dispose(){var e;null===(e=this._cache)||void 0===e||e.dispose()}clear(){var e;null===(e=this._cache)||void 0===e||e.clear(),this.needsUpdate=!0}update(e){this.needsUpdate&&this._cache&&(e.traverse(e=>{var t,n,r;e.isLine||e.isPoints?null===(t=this._cache)||void 0===t||t.addLineOrPoint(e):e.isMesh?null===(n=this._cache)||void 0===n||n.addMesh(e):null===(r=this._cache)||void 0===r||r.addObject(e)}),this.needsUpdate=!1)}onBeforeRender(){var e;null===(e=this._cache)||void 0===e||e.onBeforeRender()}onAfterRender(){var e;null===(e=this._cache)||void 0===e||e.onAfterRender()}}class RenderCacheManager{constructor(){this._cacheMap=new Map}dispose(){this._cacheMap.forEach(e=>{e.dispose()})}registerCache(e,t){this._cacheMap.set(e,new RenderCacheMapItem(t))}clearCache(){this._cacheMap.forEach(e=>{e.clear()})}clearObjectCache(e){const t=this._cacheMap.get(e);t&&t.clear()}onBeforeRender(e,t){const n=this._cacheMap.get(e);n&&(n.update(t),n.onBeforeRender())}onAfterRender(e){const t=this._cacheMap.get(e);t&&t.onAfterRender()}render(e,t,n){const r=this._cacheMap.get(e);r&&(r.update(t),r.onBeforeRender()),n(),r&&r.onAfterRender()}}class VisibilityRenderCache{constructor(e){this._visibilityCache=new Map,this._isObjectInvisible=e}dispose(){this._visibilityCache.clear()}clear(){this._visibilityCache.clear()}addLineOrPoint(e){this._visibilityCache.set(e,e.visible)}addMesh(e){this._isObjectInvisible&&this._isObjectInvisible(e)&&this._visibilityCache.set(e,e.visible)}addObject(e){this._isObjectInvisible&&this._isObjectInvisible(e)&&this._visibilityCache.set(e,e.visible)}onBeforeRender(){this._visibilityCache.forEach((e,t)=>{t.visible=!1})}onAfterRender(){this._visibilityCache.forEach((e,t)=>{t.visible=e})}}class DepthWriteRenderCache{constructor(e){this._depthWriteCache=new Set,this._doNotWriteDepth=e}dispose(){this._depthWriteCache.clear()}clear(){this._depthWriteCache.clear()}addLineOrPoint(e){}addObject(e){}addMesh(e){this._doNotWriteDepth&&this._doNotWriteDepth(e)&&e.material instanceof MeshStandardMaterial&&e.material.depthWrite&&this._depthWriteCache.add(e.material)}onBeforeRender(){this._depthWriteCache.forEach(e=>{e.depthWrite=!1})}onAfterRender(){this._depthWriteCache.forEach(e=>{e.depthWrite=!0})}}class GBufferRenderTargets{get isFloatGBufferWithRgbNormalAlphaDepth(){return this.floatGBufferRgbNormalAlphaDepth}get gBufferTexture(){return this.depthNormalRenderTarget.texture}get depthBufferTexture(){return this.copyToSeparateDepthBuffer&&this.floatGBufferRgbNormalAlphaDepth?this.separateDeptRenderTarget.texture:this.depthNormalRenderTarget.depthTexture}get textureWithDepthValue(){return this.floatGBufferRgbNormalAlphaDepth?this.depthNormalRenderTarget.texture:this.depthNormalRenderTarget.depthTexture}get normalRenderMaterial(){var e;return this._normalRenderMaterial=null!==(e=this._normalRenderMaterial)&&void 0!==e?e:this.floatGBufferRgbNormalAlphaDepth?new NormalAndDepthRenderMaterial({blending:NoBlending,floatBufferType:!0,linearDepth:!1}):new MeshNormalMaterial({blending:NoBlending}),this._normalRenderMaterial}get depthNormalRenderTarget(){if(!this._depthNormalRenderTarget)if(this.floatGBufferRgbNormalAlphaDepth)this._depthNormalRenderTarget=new WebGLRenderTarget(this._width*this.parameters.depthNormalScale,this._height*this.parameters.depthNormalScale,{minFilter:this._targetMinificationTextureFilter,magFilter:this._targetMagnificationTextureFilter,type:FloatType,samples:this._samples});else{const e=new DepthTexture(this._width*this.parameters.depthNormalScale,this._height*this.parameters.depthNormalScale);e.format=DepthStencilFormat,e.type=UnsignedInt248Type,this._depthNormalRenderTarget=new WebGLRenderTarget(this._width*this.parameters.depthNormalScale,this._height*this.parameters.depthNormalScale,{minFilter:this._targetMinificationTextureFilter,magFilter:this._targetMagnificationTextureFilter,depthTexture:e})}return this._depthNormalRenderTarget}get separateDeptRenderTarget(){return this._separateDeptRenderTarget||(this._separateDeptRenderTarget=new WebGLRenderTarget(this._width*this.parameters.depthNormalScale,this._height*this.parameters.depthNormalScale,{minFilter:this._targetMinificationTextureFilter,magFilter:this._targetMagnificationTextureFilter,type:FloatType,samples:0})),this._separateDeptRenderTarget}constructor(e,t){var n,r,a,i,s,o,l,d,h,c;this.floatGBufferRgbNormalAlphaDepth=!1,this.copyToSeparateDepthBuffer=!1,this.needsUpdate=!0,this.floatGBufferRgbNormalAlphaDepth=null!==(r=null===(n=null==t?void 0:t.capabilities)||void 0===n?void 0:n.isWebGL2)&&void 0!==r&&r,this._renderCacheManager=e,this._renderCacheManager&&this._renderCacheManager.registerCache(this,new VisibilityRenderCache(e=>{if(e.isMesh&&e.material){if(e.material.transparent&&e.material.opacity<.7||e.material.alphaTest>0)return!0;if(e.material instanceof MeshPhysicalMaterial)return e.material.transmission>0}return!1})),this.parameters={depthNormalScale:null!==(a=null==t?void 0:t.depthNormalScale)&&void 0!==a?a:1},this._targetMinificationTextureFilter=null!==(i=null==t?void 0:t.textureMinificationFilter)&&void 0!==i?i:NearestFilter,this._targetMagnificationTextureFilter=null!==(s=null==t?void 0:t.textureMagnificationFilter)&&void 0!==s?s:NearestFilter,this._width=null!==(o=null==t?void 0:t.width)&&void 0!==o?o:1024,this._height=null!==(l=null==t?void 0:t.height)&&void 0!==l?l:1024,this._samples=null!==(d=null==t?void 0:t.samples)&&void 0!==d?d:0,this._shared=null!==(h=null==t?void 0:t.shared)&&void 0!==h&&h,this._renderPass=null!==(c=null==t?void 0:t.renderPass)&&void 0!==c?c:new RenderPass}dispose(){var e,t;null===(e=this._normalRenderMaterial)||void 0===e||e.dispose(),null===(t=this._depthNormalRenderTarget)||void 0===t||t.dispose()}setSize(e,t){var n;this._width=e,this._height=t,null===(n=this._depthNormalRenderTarget)||void 0===n||n.setSize(this._width*this.parameters.depthNormalScale,this._height*this.parameters.depthNormalScale)}render(e,t,n){if(this._shared&&!this.needsUpdate)return;this.needsUpdate=!1;const r=this.normalRenderMaterial;r instanceof NormalAndDepthRenderMaterial&&r.update({camera:n}),this._renderCacheManager?this._renderCacheManager.render(this,t,()=>{this._renderGBuffer(e,t,n)}):this._renderGBuffer(e,t,n),this.floatGBufferRgbNormalAlphaDepth&&this.copyToSeparateDepthBuffer&&this._copyDepthToSeparateDepthTexture(e,this.depthNormalRenderTarget)}_renderGBuffer(e,t,n){this._renderPass.renderWithOverrideMaterial(e,t,n,this.normalRenderMaterial,this.depthNormalRenderTarget,7829503,1)}getCopyMaterial(e){var t;return null!==(t=this._copyMaterial)&&void 0!==t||(this._copyMaterial=new CopyTransformMaterial),this._copyMaterial.update(e)}_copyDepthToSeparateDepthTexture(e,t){this._renderPass.renderScreenSpace(e,this.getCopyMaterial({texture:t.texture,blending:NoBlending,colorTransform:ALPHA_TRANSFORM,colorBase:ALPHA_RGBA,multiplyChannels:0,uvTransform:DEFAULT_UV_TRANSFORM}),this.separateDeptRenderTarget)}}class BakedGroundContactShadow{constructor(e,t,n){var r;this.needsUpdate=!0,this.noNeedOfUpdateCount=0,this._blurScale=1,this._shadowScale=1,this._groundGroup=t,this.shadowMapSize=null!==(r=n.shadowMapSize)&&void 0!==r?r:2048,this.parameters=this._getDefaultParameters(n),this._groundShadowFar=this.parameters.cameraFar,this._renderer=e,this._renderCacheManager=null==n?void 0:n._renderCacheManager,this._renderCacheManager&&this._renderCacheManager.registerCache(this,new VisibilityRenderCache(e=>e.isMesh&&!(e=>{var t;if(!e.isMesh)return!1;if(!e.castShadow&&!(null===(t=e.userData)||void 0===t?void 0:t.meshId))return!1;const n=e.material;return!n.transparent||n.opacity>.5})(e)||void 0!==e.name&&["Ground","Floor"].includes(e.name))),this.renderTarget=new WebGLRenderTarget(this.shadowMapSize,this.shadowMapSize),this.renderTarget.texture.generateMipmaps=!1,this._renderTargetBlur=new WebGLRenderTarget(this.shadowMapSize,this.shadowMapSize),this._renderTargetBlur.texture.generateMipmaps=!1,this.shadowGroundPlane=new ShadowGroundPlane(this.renderTarget.texture,this.parameters),this._groundGroup.add(this.shadowGroundPlane),this._groundContactCamera=new GroundContactCamera,this._groundGroup.add(this._groundContactCamera),this._depthMaterial=new MeshDepthMaterial,this._depthMaterial.userData.fadeoutBias={value:this.parameters.fadeoutBias},this._depthMaterial.userData.fadeoutFalloff={value:this.parameters.fadeoutFalloff},this._depthMaterial.onBeforeCompile=e=>{e.uniforms.fadeoutBias=this._depthMaterial.userData.fadeoutBias,e.uniforms.fadeoutFalloff=this._depthMaterial.userData.fadeoutFalloff,e.fragmentShader=`\n uniform float fadeoutBias;\n uniform float fadeoutFalloff;\n ${e.fragmentShader.replace("gl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), opacity );",ShadowGroundPlane.alphaMap?"gl_FragColor = vec4(clamp(pow(1.0 + fadeoutBias - fragCoordZ, 1.0/(1.0-fadeoutFalloff)), 0.0, 1.0));":"gl_FragColor = vec4(vec3(0.0), clamp(pow(1.0 + fadeoutBias - fragCoordZ, 1.0/(1.0-fadeoutFalloff)), 0.0, 1.0));")}\n `},this._depthMaterial.side=DoubleSide,this._depthMaterial.depthTest=!0,this._depthMaterial.depthWrite=!0,this._blurPass=new BlurPass(BlurShader,n),this.updatePlaneAndShadowCamera()}_getDefaultParameters(e){return{enabled:!0,cameraHelper:!1,alwaysUpdate:!1,fadeIn:!1,blurMin:.001,blurMax:.1,fadeoutFalloff:.9,fadeoutBias:.03,opacity:.5,maximumPlaneSize:20,planeSize:10,cameraFar:3,hardLayers:null,softLayers:null,polygonOffset:2,excludeGroundObjects:!0,...e}}dispose(){this.renderTarget.dispose(),this._renderTargetBlur.dispose(),this._blurPass.dispose(),this._depthMaterial.dispose()}updateParameters(e){for(let t in e)this.parameters.hasOwnProperty(t)&&(this.parameters[t]=e[t]);void 0!==e.cameraFar&&(this._groundShadowFar=this.parameters.cameraFar)}applyParameters(){this.shadowGroundPlane.updateMaterial(this.parameters),this._groundContactCamera.updateCameraHelper(this.parameters.cameraHelper),this._groundContactCamera.far!==this.parameters.cameraFar&&this.updatePlaneAndShadowCamera();const e=this.parameters.fadeoutFalloff;this._depthMaterial.userData.fadeoutFalloff.value!==e&&(this._depthMaterial.userData.fadeoutFalloff.value=this.parameters.fadeoutFalloff);const t=this.parameters.fadeoutBias/this._groundContactCamera.far;this._depthMaterial.userData.fadeoutBias.value!==t&&(this._depthMaterial.userData.fadeoutBias.value=t),this.needsUpdate=!0}setScale(e,t){this._blurScale=e,this._shadowScale=null!=t?t:e,this.needsUpdate=!0}updateBounds(e,t){var n;this._groundShadowFar=this.parameters.cameraFar,this._groundShadowFar<e.size.z&&(this._groundShadowFar=1.01*e.size.z);const r=Math.max(e.size.x,e.size.z);this.parameters.planeSize=r+2*Math.max(this._blurScale,null!==(n=this._shadowScale)&&void 0!==n?n:1,1),this.parameters.planeSize>this.parameters.maximumPlaneSize?(this.parameters.planeSize=this.parameters.maximumPlaneSize,this._groundGroup.position.set(0,null!=t?t:0,0)):this._groundGroup.position.set(e.center.x,null!=t?t:0,e.center.z),this._groundGroup.updateMatrixWorld(),this.updatePlaneAndShadowCamera()}updatePlaneAndShadowCamera(){const e=this.parameters.planeSize;this.shadowGroundPlane.scale.x=e,this.shadowGroundPlane.scale.y=e,this._groundContactCamera.updateCameraFormPlaneSize(e,this._groundShadowFar),this.needsUpdate=!0}setGroundVisibility(e,t){this.shadowGroundPlane.updateVisibility(e)}render(e){if(this._groundContactCamera.updateCameraHelper(this.parameters.cameraHelper,e),this.shadowGroundPlane.visible=this.parameters.enabled,this.parameters.alwaysUpdate||this.needsUpdate)this.noNeedOfUpdateCount=0;else if(this.noNeedOfUpdateCount++,this.noNeedOfUpdateCount>=10)return;this.needsUpdate=!1,this.shadowGroundPlane.material.opacity=this.parameters.alwaysUpdate||!this.parameters.fadeIn?this.parameters.opacity:this.parameters.opacity*(this.noNeedOfUpdateCount+2)/12;const t=this._renderer.getClearAlpha();this._renderer.setClearAlpha(0),this._groundGroup.visible=!1,this.shadowGroundPlane.visible=!1,this._groundContactCamera.setCameraHelperVisibility(!1),0===this.noNeedOfUpdateCount?(this._renderGroundContact(e),this._renderBlur()):1===this.noNeedOfUpdateCount&&this._renderBlur(),this._renderReduceBandingBlur(),this._renderer.setRenderTarget(null),this._renderer.setClearAlpha(t),this._groundGroup.visible=!0,this.shadowGroundPlane.visible=this.parameters.enabled,this._groundContactCamera.setCameraHelperVisibility(this.parameters.cameraHelper)}_renderGroundContact(e){const t=e.background;e.background=null,e.overrideMaterial=this._depthMaterial,this._renderer.setRenderTarget(this.renderTarget),this._renderer.clear();const n=this._renderer.autoClear;this._renderer.autoClear=!1,this.parameters.hardLayers&&(this._groundContactCamera.layers.mask=this.parameters.hardLayers.mask,this._groundContactCamera.updateCameraFarPlane(10),this._depthMaterial.userData.fadeoutBias.value=.99,this._renderer.render(e,this._groundContactCamera),this._groundContactCamera.updateCameraFarPlane(this._groundShadowFar),this._depthMaterial.userData.fadeoutBias.value=this.parameters.fadeoutBias/this._groundShadowFar),this._groundContactCamera.layers.enableAll(),this.parameters.softLayers&&(this._groundContactCamera.layers.mask=this.parameters.softLayers.mask),this._renderCacheManager?this._renderCacheManager.render(this,e,()=>{this._renderer.render(e,this._groundContactCamera)}):this._renderer.render(e,this._groundContactCamera),this._renderer.autoClear=n,e.overrideMaterial=null,e.background=t}_renderBlur(){this._renderBlurPass(this._blurScale*this.parameters.blurMin/this.parameters.planeSize,this._blurScale*this.parameters.blurMax/this.parameters.planeSize)}_renderReduceBandingBlur(){const e=.01*this._blurScale/this.parameters.planeSize;this._renderBlurPass(e,e)}_renderBlurPass(e,t){this._blurPass.render(this._renderer,[this.renderTarget,this._renderTargetBlur,this.renderTarget],[e,e],[t,t])}}BakedGroundContactShadow.addTestMesh=!1;class ShadowGroundPlane extends Mesh{constructor(e,t){const n=new MeshBasicMaterial({transparent:!0,depthWrite:!1});ShadowGroundPlane.alphaMap&&n.color.set(0),n.polygonOffset=!0,super(new PlaneGeometry(1,1,10,10),n),this.name="GroundContactShadowPlane",this.userData.isFloor=!0,this.renderOrder=1,this.receiveShadow=!1,this.layers.disableAll(),t&&this.updateMaterial(t),this.setShadowMap(e)}setVisibility(e){this.visible=e,this.visible?this.layers.enableAll():this.layers.disableAll()}setDepthWrite(e){const t=this.material;t.depthWrite=e,t.transparent=!e,t.needsUpdate=!0,this.setVisibility(e)}setReceiveShadow(e){this.receiveShadow=e,this.setVisibility(e)}setShadowMap(e){const t=this.material;t.map=e,ShadowGroundPlane.alphaMap&&(t.alphaMap=e),t.needsUpdate=!0}updateMaterial(e){const t=this.material;t.opacity!==e.opacity&&(t.opacity=e.opacity),t.polygonOffsetFactor!==e.polygonOffset&&(t.polygonOffset=!0,t.polygonOffsetFactor=e.polygonOffset,t.polygonOffsetUnits=e.polygonOffset)}updateVisibility(e){e?this.layers.enableAll():this.layers.disableAll()}}ShadowGroundPlane.alphaMap=!1;class GroundContactCamera extends OrthographicCamera{constructor(){super(-1,1,-1,1,-1,1),this.rotation.x=Math.PI}updateCameraFormPlaneSize(e,t){var n;this.left=-e/2,this.right=e/2,this.top=-e/2,this.bottom=e/2,this.near=0,this.far=t,this.updateProjectionMatrix(),null===(n=this.cameraHelper)||void 0===n||n.update()}updateCameraFarPlane(e){var t;this.far=e,this.updateProjectionMatrix(),null===(t=this.cameraHelper)||void 0===t||t.update()}updateCameraHelper(e,t){var n,r,a;e?(this.cameraHelper=null!==(n=this.cameraHelper)&&void 0!==n?n:new CameraHelper(this),this.cameraHelper.visible=!0,null==t||t.add(this.cameraHelper)):(null===(r=this.cameraHelper)||void 0===r?void 0:r.parent)&&(null===(a=this.cameraHelper)||void 0===a||a.removeFromParent())}setCameraHelperVisibility(e){this.cameraHelper&&(this.cameraHelper.visible=e)}}const CopyShader={name:"CopyShader",uniforms:{tDiffuse:{value:null},opacity:{value:1}},vertexShader:"\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}",fragmentShader:"\n\n\t\tuniform float opacity;\n\n\t\tuniform sampler2D tDiffuse;\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvec4 texel = texture2D( tDiffuse, vUv );\n\t\t\tgl_FragColor = opacity * texel;\n\n\n\t\t}"},FXAAShader={uniforms:{tDiffuse:{value:null},resolution:{value:new Vector2(1/1024,1/512)}},vertexShader:"\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}",fragmentShader:"\n\tprecision highp float;\n\n\tuniform sampler2D tDiffuse;\n\n\tuniform vec2 resolution;\n\n\tvarying vec2 vUv;\n\n\t// FXAA 3.11 implementation by NVIDIA, ported to WebGL by Agost Biro (biro@archilogic.com)\n\n\t//----------------------------------------------------------------------------------\n\t// File: es3-keplerFXAAassetsshaders/FXAA_DefaultES.frag\n\t// SDK Version: v3.00\n\t// Email: gameworks@nvidia.com\n\t// Site: http://developer.nvidia.com/\n\t//\n\t// Copyright (c) 2014-2015, NVIDIA CORPORATION. All rights reserved.\n\t//\n\t// Redistribution and use in source and binary forms, with or without\n\t// modification, are permitted provided that the following conditions\n\t// are met:\n\t// * Redistributions of source code must retain the above copyright\n\t// notice, this list of conditions and the following disclaimer.\n\t// * Redistributions in binary form must reproduce the above copyright\n\t// notice, this list of conditions and the following disclaimer in the\n\t// documentation and/or other materials provided with the distribution.\n\t// * Neither the name of NVIDIA CORPORATION nor the names of its\n\t// contributors may be used to endorse or promote products derived\n\t// from this software without specific prior written permission.\n\t//\n\t// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY\n\t// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n\t// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n\t// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n\t// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n\t// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n\t// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n\t// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY\n\t// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n\t// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n\t// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\t//\n\t//----------------------------------------------------------------------------------\n\n\t#ifndef FXAA_DISCARD\n\t\t\t//\n\t\t\t// Only valid for PC OpenGL currently.\n\t\t\t// Probably will not work when FXAA_GREEN_AS_LUMA = 1.\n\t\t\t//\n\t\t\t// 1 = Use discard on pixels which don't need AA.\n\t\t\t// For APIs which enable concurrent TEX+ROP from same surface.\n\t\t\t// 0 = Return unchanged color on pixels which don't need AA.\n\t\t\t//\n\t\t\t#define FXAA_DISCARD 0\n\t#endif\n\n\t/*--------------------------------------------------------------------------*/\n\t#define FxaaTexTop(t, p) texture2D(t, p, -100.0)\n\t#define FxaaTexOff(t, p, o, r) texture2D(t, p + (o * r), -100.0)\n\t/*--------------------------------------------------------------------------*/\n\n\t#define NUM_SAMPLES 5\n\n\t// assumes colors have premultipliedAlpha, so that the calculated color contrast is scaled by alpha\n\tfloat contrast( vec4 a, vec4 b ) {\n\t\t\tvec4 diff = abs( a - b );\n\t\t\treturn max( max( max( diff.r, diff.g ), diff.b ), diff.a );\n\t}\n\n\t/*============================================================================\n\n\t\t\t\t\t\t\t\t\tFXAA3 QUALITY - PC\n\n\t============================================================================*/\n\n\t/*--------------------------------------------------------------------------*/\n\tvec4 FxaaPixelShader(\n\t\t\tvec2 posM,\n\t\t\tsampler2D tex,\n\t\t\tvec2 fxaaQualityRcpFrame,\n\t\t\tfloat fxaaQualityEdgeThreshold,\n\t\t\tfloat fxaaQualityinvEdgeThreshold\n\t) {\n\t\t\tvec4 rgbaM = FxaaTexTop(tex, posM);\n\t\t\tvec4 rgbaS = FxaaTexOff(tex, posM, vec2( 0.0, 1.0), fxaaQualityRcpFrame.xy);\n\t\t\tvec4 rgbaE = FxaaTexOff(tex, posM, vec2( 1.0, 0.0), fxaaQualityRcpFrame.xy);\n\t\t\tvec4 rgbaN = FxaaTexOff(tex, posM, vec2( 0.0,-1.0), fxaaQualityRcpFrame.xy);\n\t\t\tvec4 rgbaW = FxaaTexOff(tex, posM, vec2(-1.0, 0.0), fxaaQualityRcpFrame.xy);\n\t\t\t// . S .\n\t\t\t// W M E\n\t\t\t// . N .\n\n\t\t\tbool earlyExit = max( max( max(\n\t\t\t\t\tcontrast( rgbaM, rgbaN ),\n\t\t\t\t\tcontrast( rgbaM, rgbaS ) ),\n\t\t\t\t\tcontrast( rgbaM, rgbaE ) ),\n\t\t\t\t\tcontrast( rgbaM, rgbaW ) )\n\t\t\t\t\t< fxaaQualityEdgeThreshold;\n\t\t\t// . 0 .\n\t\t\t// 0 0 0\n\t\t\t// . 0 .\n\n\t\t\t#if (FXAA_DISCARD == 1)\n\t\t\t\t\tif(earlyExit) FxaaDiscard;\n\t\t\t#else\n\t\t\t\t\tif(earlyExit) return rgbaM;\n\t\t\t#endif\n\n\t\t\tfloat contrastN = contrast( rgbaM, rgbaN );\n\t\t\tfloat contrastS = contrast( rgbaM, rgbaS );\n\t\t\tfloat contrastE = contrast( rgbaM, rgbaE );\n\t\t\tfloat contrastW = contrast( rgbaM, rgbaW );\n\n\t\t\tfloat relativeVContrast = ( contrastN + contrastS ) - ( contrastE + contrastW );\n\t\t\trelativeVContrast *= fxaaQualityinvEdgeThreshold;\n\n\t\t\tbool horzSpan = relativeVContrast > 0.;\n\t\t\t// . 1 .\n\t\t\t// 0 0 0\n\t\t\t// . 1 .\n\n\t\t\t// 45 deg edge detection and corners of objects, aka V/H contrast is too similar\n\t\t\tif( abs( relativeVContrast ) < .3 ) {\n\t\t\t\t\t// locate the edge\n\t\t\t\t\tvec2 dirToEdge;\n\t\t\t\t\tdirToEdge.x = contrastE > contrastW ? 1. : -1.;\n\t\t\t\t\tdirToEdge.y = contrastS > contrastN ? 1. : -1.;\n\t\t\t\t\t// . 2 . . 1 .\n\t\t\t\t\t// 1 0 2 ~= 0 0 1\n\t\t\t\t\t// . 1 . . 0 .\n\n\t\t\t\t\t// tap 2 pixels and see which ones are \"outside\" the edge, to\n\t\t\t\t\t// determine if the edge is vertical or horizontal\n\n\t\t\t\t\tvec4 rgbaAlongH = FxaaTexOff(tex, posM, vec2( dirToEdge.x, -dirToEdge.y ), fxaaQualityRcpFrame.xy);\n\t\t\t\t\tfloat matchAlongH = contrast( rgbaM, rgbaAlongH );\n\t\t\t\t\t// . 1 .\n\t\t\t\t\t// 0 0 1\n\t\t\t\t\t// . 0 H\n\n\t\t\t\t\tvec4 rgbaAlongV = FxaaTexOff(tex, posM, vec2( -dirToEdge.x, dirToEdge.y ), fxaaQualityRcpFrame.xy);\n\t\t\t\t\tfloat matchAlongV = contrast( rgbaM, rgbaAlongV );\n\t\t\t\t\t// V 1 .\n\t\t\t\t\t// 0 0 1\n\t\t\t\t\t// . 0 .\n\n\t\t\t\t\trelativeVContrast = matchAlongV - matchAlongH;\n\t\t\t\t\trelativeVContrast *= fxaaQualityinvEdgeThreshold;\n\n\t\t\t\t\tif( abs( relativeVContrast ) < .3 ) { // 45 deg edge\n\t\t\t\t\t\t\t// 1 1 .\n\t\t\t\t\t\t\t// 0 0 1\n\t\t\t\t\t\t\t// . 0 1\n\n\t\t\t\t\t\t\t// do a simple blur\n\t\t\t\t\t\t\treturn mix(\n\t\t\t\t\t\t\t\t\trgbaM,\n\t\t\t\t\t\t\t\t\t(rgbaN + rgbaS + rgbaE + rgbaW) * .25,\n\t\t\t\t\t\t\t\t\t.4\n\t\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\thorzSpan = relativeVContrast > 0.;\n\t\t\t}\n\n\t\t\tif(!horzSpan) rgbaN = rgbaW;\n\t\t\tif(!horzSpan) rgbaS = rgbaE;\n\t\t\t// . 0 . 1\n\t\t\t// 1 0 1 -> 0\n\t\t\t// . 0 . 1\n\n\t\t\tbool pairN = contrast( rgbaM, rgbaN ) > contrast( rgbaM, rgbaS );\n\t\t\tif(!pairN) rgbaN = rgbaS;\n\n\t\t\tvec2 offNP;\n\t\t\toffNP.x = (!horzSpan) ? 0.0 : fxaaQualityRcpFrame.x;\n\t\t\toffNP.y = ( horzSpan) ? 0.0 : fxaaQualityRcpFrame.y;\n\n\t\t\tbool doneN = false;\n\t\t\tbool doneP = false;\n\n\t\t\tfloat nDist = 0.;\n\t\t\tfloat pDist = 0.;\n\n\t\t\tvec2 posN = posM;\n\t\t\tvec2 posP = posM;\n\n\t\t\tint iterationsUsed = 0;\n\t\t\tint iterationsUsedN = 0;\n\t\t\tint iterationsUsedP = 0;\n\t\t\tfor( int i = 0; i < NUM_SAMPLES; i++ ) {\n\t\t\t\t\titerationsUsed = i;\n\n\t\t\t\t\tfloat increment = float(i + 1);\n\n\t\t\t\t\tif(!doneN) {\n\t\t\t\t\t\t\tnDist += increment;\n\t\t\t\t\t\t\tposN = posM + offNP * nDist;\n\t\t\t\t\t\t\tvec4 rgbaEndN = FxaaTexTop(tex, posN.xy);\n\t\t\t\t\t\t\tdoneN = contrast( rgbaEndN, rgbaM ) > contrast( rgbaEndN, rgbaN );\n\t\t\t\t\t\t\titerationsUsedN = i;\n\t\t\t\t\t}\n\n\t\t\t\t\tif(!doneP) {\n\t\t\t\t\t\t\tpDist += increment;\n\t\t\t\t\t\t\tposP = posM - offNP * pDist;\n\t\t\t\t\t\t\tvec4 rgbaEndP = FxaaTexTop(tex, posP.xy);\n\t\t\t\t\t\t\tdoneP = contrast( rgbaEndP, rgbaM ) > contrast( rgbaEndP, rgbaN );\n\t\t\t\t\t\t\titerationsUsedP = i;\n\t\t\t\t\t}\n\n\t\t\t\t\tif(doneN || doneP) break;\n\t\t\t}\n\n\n\t\t\tif ( !doneP && !doneN ) return rgbaM; // failed to find end of edge\n\n\t\t\tfloat dist = min(\n\t\t\t\t\tdoneN ? float( iterationsUsedN ) / float( NUM_SAMPLES - 1 ) : 1.,\n\t\t\t\t\tdoneP ? float( iterationsUsedP ) / float( NUM_SAMPLES - 1 ) : 1.\n\t\t\t);\n\n\t\t\t// hacky way of reduces blurriness of mostly diagonal edges\n\t\t\t// but reduces AA quality\n\t\t\tdist = pow(dist, .5);\n\n\t\t\tdist = 1. - dist;\n\n\t\t\treturn mix(\n\t\t\t\t\trgbaM,\n\t\t\t\t\trgbaN,\n\t\t\t\t\tdist * .5\n\t\t\t);\n\t}\n\n\tvoid main() {\n\t\t\tconst float edgeDetectionQuality = .2;\n\t\t\tconst float invEdgeDetectionQuality = 1. / edgeDetectionQuality;\n\n\t\t\tgl_FragColor = FxaaPixelShader(\n\t\t\t\t\tvUv,\n\t\t\t\t\ttDiffuse,\n\t\t\t\t\tresolution,\n\t\t\t\t\tedgeDetectionQuality, // [0,1] contrast needed, otherwise early discard\n\t\t\t\t\tinvEdgeDetectionQuality\n\t\t\t);\n\n\t}\n\t"};class OutlinePass extends class{constructor(){this.isPass=!0,this.enabled=!0,this.needsSwap=!0,this.clear=!1,this.renderToScreen=!1}setSize(){}render(){console.error("THREE.Pass: .render() must be implemented in derived pass.")}dispose(){}}{constructor(e,t,n,r,a){var i;super(),this.patternTexture=null,this._gBufferRenderTarget=null==a?void 0:a._gBufferRenderTarget,this.renderScene=t,this.renderCamera=n,this.selectedObjects=void 0!==r?r:[],this.visibleEdgeColor=new Color$1(1,1,1),this.hiddenEdgeColor=new Color$1(.1,.04,.02),this.edgeGlow=0,this.usePatternTexture=!1,this.edgeThickness=1,this.edgeStrength=3,this.downSampleRatio=(null==a?void 0:a.downSampleRatio)||2,this.pulsePeriod=0,this.edgeDetectionFxaa=(null==a?void 0:a.edgeDetectionFxaa)||!1,this._visibilityCache=new Map,this.resolution=void 0!==e?new Vector2(e.x,e.y):new Vector2(256,256);const s=Math.round(this.resolution.x/this.downSampleRatio),o=Math.round(this.resolution.y/this.downSampleRatio);this.renderTargetMaskBuffer=new WebGLRenderTarget(this.resolution.x,this.resolution.y),this.renderTargetMaskBuffer.texture.name="OutlinePass.mask",this.renderTargetMaskBuffer.texture.generateMipmaps=!1,this._gBufferRenderTarget||(this.depthMaterial=new MeshDepthMaterial,this.depthMaterial.side=DoubleSide,this.depthMaterial.depthPacking=RGBADepthPacking,this.depthMaterial.blending=NoBlending),this.prepareMaskMaterial=this._getPrepareMaskMaterial(null===(i=this._gBufferRenderTarget)||void 0===i?void 0:i.isFloatGBufferWithRgbNormalAlphaDepth),this.prepareMaskMaterial.side=DoubleSide,this.prepareMaskMaterial.fragmentShader=function(e,t){const n=t.isPerspectiveCamera?"perspective":"orthographic";return e.replace(/DEPTH_TO_VIEW_Z/g,n+"DepthToViewZ")}(this.prepareMaskMaterial.fragmentShader,this.renderCamera),this._gBufferRenderTarget||(this.renderTargetDepthBuffer=new WebGLRenderTarget(this.resolution.x,this.resolution.y),this.renderTargetDepthBuffer.texture.name="OutlinePass.depth",this.renderTargetDepthBuffer.texture.generateMipmaps=!1),this.edgeDetectionFxaa&&(this.fxaaRenderMaterial=new ShaderMaterial(FXAAShader),this.fxaaRenderMaterial.uniforms.tDiffuse.value=this.renderTargetMaskBuffer.texture,this.fxaaRenderMaterial.uniforms.resolution.value.set(1/this.resolution.x,1/this.resolution.y),this.renderTargetFxaaBuffer=new WebGLRenderTarget(this.resolution.x,this.resolution.y),this.renderTargetFxaaBuffer.texture.name="OutlinePass.fxaa",this.renderTargetFxaaBuffer.texture.generateMipmaps=!1),this.renderTargetMaskDownSampleBuffer=new WebGLRenderTarget(s,o),this.renderTargetMaskDownSampleBuffer.texture.name="OutlinePass.depthDownSample",this.renderTargetMaskDownSampleBuffer.texture.generateMipmaps=!1,this.renderTargetBlurBuffer1=new WebGLRenderTarget(s,o),this.renderTargetBlurBuffer1.texture.name="OutlinePass.blur1",this.renderTargetBlurBuffer1.texture.generateMipmaps=!1,this.renderTargetBlurBuffer2=new WebGLRenderTarget(Math.round(s/2),Math.round(o/2)),this.renderTargetBlurBuffer2.texture.name="OutlinePass.blur2",this.renderTargetBlurBuffer2.texture.generateMipmaps=!1,this.edgeDetectionMaterial=this._getEdgeDetectionMaterial(),this.renderTargetEdgeBuffer1=new WebGLRenderTarget(s,o),this.renderTargetEdgeBuffer1.texture.name="OutlinePass.edge1",this.renderTargetEdgeBuffer1.texture.generateMipmaps=!1,this.renderTargetEdgeBuffer2=new WebGLRenderTarget(Math.round(s/2),Math.round(o/2)),this.renderTargetEdgeBuffer2.texture.name="OutlinePass.edge2",this.renderTargetEdgeBuffer2.texture.generateMipmaps=!1,this.separableBlurMaterial1=this._getSeperableBlurMaterial(4),this.separableBlurMaterial1.uniforms.texSize.value.set(s,o),this.separableBlurMaterial1.uniforms.kernelRadius.value=1,this.separableBlurMaterial2=this._getSeperableBlurMaterial(4),this.separableBlurMaterial2.uniforms.texSize.value.set(Math.round(s/2),Math.round(o/2)),this.separableBlurMaterial2.uniforms.kernelRadius.value=4,this.overlayMaterial=this._getOverlayMaterial();const l=CopyShader;this.copyUniforms=UniformsUtils.clone(l.uniforms),this.copyUniforms.opacity.value=1,this.materialCopy=new ShaderMaterial({uniforms:this.copyUniforms,vertexShader:l.vertexShader,fragmentShader:l.fragmentShader,blending:NoBlending,depthTest:!1,depthWrite:!1,transparent:!0}),this.enabled=!0,this.needsSwap=!1,this._oldClearColor=new Color$1,this.oldClearAlpha=1,this.fsQuad=new FullScreenQuad(void 0),this.tempPulseColor1=new Color$1,this.tempPulseColor2=new Color$1,this.textureMatrix=new Matrix4}dispose(){var e,t,n,r;this.renderTargetMaskBuffer.dispose(),null===(e=this.renderTargetFxaaBuffer)||void 0===e||e.dispose(),null===(t=this.renderTargetDepthBuffer)||void 0===t||t.dispose(),this.renderTargetMaskDownSampleBuffer.dispose(),this.renderTargetBlurBuffer1.dispose(),this.renderTargetBlurBuffer2.dispose(),this.renderTargetEdgeBuffer1.dispose(),this.renderTargetEdgeBuffer2.dispose(),null===(n=this.depthMaterial)||void 0===n||n.dispose(),this.prepareMaskMaterial.dispose(),null===(r=this.fxaaRenderMaterial)||void 0===r||r.dispose(),this.edgeDetectionMaterial.dispose(),this.separableBlurMaterial1.dispose(),this.separableBlurMaterial2.dispose(),this.overlayMaterial.dispose(),this.materialCopy.dispose(),this.fsQuad.dispose()}setSize(e,t){var n,r,a;this.renderTargetMaskBuffer.setSize(e,t),null===(n=this.renderTargetDepthBuffer)||void 0===n||n.setSize(e,t);let i=Math.round(e/this.downSampleRatio),s=Math.round(t/this.downSampleRatio);this.renderTargetMaskDownSampleBuffer.setSize(i,s),this.renderTargetBlurBuffer1.setSize(i,s),this.renderTargetEdgeBuffer1.setSize(i,s),this.separableBlurMaterial1.uniforms.texSize.value.set(i,s),i=Math.round(i/2),s=Math.round(s/2),this.renderTargetBlurBuffer2.setSize(i,s),this.renderTargetEdgeBuffer2.setSize(i,s),this.separableBlurMaterial2.uniforms.texSize.value.set(i,s),null===(r=this.fxaaRenderMaterial)||void 0===r||r.uniforms.resolution.value.set(1/this.resolution.x,1/this.resolution.y),null===(a=this.renderTargetFxaaBuffer)||void 0===a||a.setSize(e,t)}_changeVisibilityOfSelectedObjects(e){const t=this._visibilityCache;function n(n){n.isMesh&&(!0===e?n.visible=t.get(n):(t.set(n,n.visible),n.visible=e))}this.selectedObjects.forEach(e=>e.traverse(n))}_changeVisibilityOfNonSelectedObjects(e){const t=this._visibilityCache,n=[];function r(e){e.isMesh&&n.push(e)}this.selectedObjects.forEach(e=>e.traverse(r)),this.renderScene.traverse((function(r){if(r.isMesh||r.isSprite){if(!1===n.some(e=>e.id===r.id)){const n=r.visible;!1!==e&&!0!==t.get(r)||(r.visible=e),t.set(r,n)}}else(r.isPoints||r.isLine)&&(!0===e?r.visible=t.get(r):(t.set(r,r.visible),r.visible=e))}))}_updateTextureMatrix(){this.textureMatrix.set(.5,0,0,.5,0,.5,0,.5,0,0,.5,.5,0,0,0,1),this.textureMatrix.multiply(this.renderCamera.projectionMatrix),this.textureMatrix.multiply(this.renderCamera.matrixWorldInverse)}render(e,t,n,r,a){var i,s;if(this.selectedObjects.length>0){null===(i=this._gBufferRenderTarget)||void 0===i||i.render(e,this.renderScene,this.renderCamera),e.getClearColor(this._oldClearColor),this.oldClearAlpha=e.getClearAlpha();const t=e.autoClear;e.autoClear=!1,a&&e.state.buffers.stencil.setTest(!1),e.setClearColor(16777215,1),this._changeVisibilityOfSelectedObjects(!1);const r=this.renderScene.background;this.renderScene.background=null,this.renderTargetDepthBuffer&&this.depthMaterial&&(this.renderScene.overrideMaterial=this.depthMaterial,e.setRenderTarget(this.renderTargetDepthBuffer),e.clear(),e.render(this.renderScene,this.renderCamera)),this._changeVisibilityOfSelectedObjects(!0),this._visibilityCache.clear(),this._updateTextureMatrix(),this._changeVisibilityOfNonSelectedObjects(!1),this.renderScene.overrideMaterial=this.prepareMaskMaterial,this.prepareMaskMaterial.uniforms.cameraNearFar.value.set(this.renderCamera.near,this.renderCamera.far),this._gBufferRenderTarget?this.prepareMaskMaterial.uniforms.depthTexture.value=this._gBufferRenderTarget.textureWithDepthValue:this.prepareMaskMaterial.uniforms.depthTexture.value=null===(s=this.renderTargetDepthBuffer)||void 0===s?void 0:s.texture,this.prepareMaskMaterial.uniforms.textureMatrix.value=this.textureMatrix,e.setRenderTarget(this.renderTargetMaskBuffer),e.clear(),e.render(this.renderScene,this.renderCamera),this.renderScene.overrideMaterial=null,this._changeVisibilityOfNonSelectedObjects(!0),this._visibilityCache.clear(),this.renderScene.background=r;let o=this.renderTargetMaskBuffer;if(this.edgeDetectionFxaa&&this.fxaaRenderMaterial&&this.renderTargetFxaaBuffer&&(this.fxaaRenderMaterial.uniforms.tDiffuse.value=this.renderTargetMaskBuffer.texture,this.fsQuad.material=this.fxaaRenderMaterial,e.setRenderTarget(this.renderTargetFxaaBuffer),e.clear(),this.fsQuad.render(e),o=this.renderTargetFxaaBuffer),this.fsQuad.material=this.materialCopy,this.copyUniforms.tDiffuse.value=o.texture,e.setRenderTarget(this.renderTargetMaskDownSampleBuffer),e.clear(),this.fsQuad.render(e),this.tempPulseColor1.copy(this.visibleEdgeColor),this.tempPulseColor2.copy(this.hiddenEdgeColor),this.pulsePeriod>0){const e=.625+.75*Math.cos(.01*performance.now()/this.pulsePeriod)/2;this.tempPulseColor1.multiplyScalar(e),this.tempPulseColor2.multiplyScalar(e)}this.fsQuad.material=this.edgeDetectionMaterial,this.edgeDetectionMaterial.uniforms.maskTexture.value=this.renderTargetMaskDownSampleBuffer.texture,this.edgeDetectionMaterial.uniforms.texSize.value.set(this.renderTargetMaskDownSampleBuffer.width,this.renderTargetMaskDownSampleBuffer.height),this.edgeDetectionMaterial.uniforms.visibleEdgeColor.value=this.tempPulseColor1,this.edgeDetectionMaterial.uniforms.hiddenEdgeColor.value=this.tempPulseColor2,e.setRenderTarget(this.renderTargetEdgeBuffer1),e.clear(),this.fsQuad.render(e),this.fsQuad.material=this.separableBlurMaterial1,this.separableBlurMaterial1.uniforms.colorTexture.value=this.renderTargetEdgeBuffer1.texture,this.separableBlurMaterial1.uniforms.direction.value=OutlinePass.BlurDirectionX,this.separableBlurMaterial1.uniforms.kernelRadius.value=this.edgeThickness,e.setRenderTarget(this.renderTargetBlurBuffer1),e.clear(),this.fsQuad.render(e),this.separableBlurMaterial1.uniforms.colorTexture.value=this.renderTargetBlurBuffer1.texture,this.separableBlurMaterial1.uniforms.direction.value=OutlinePass.BlurDirectionY,e.setRenderTarget(this.renderTargetEdgeBuffer1),e.clear(),this.fsQuad.render(e),this.fsQuad.material=this.separableBlurMaterial2,this.separableBlurMaterial2.uniforms.colorTexture.value=this.renderTargetEdgeBuffer1.texture,this.separableBlurMaterial2.uniforms.direction.value=OutlinePass.BlurDirectionX,e.setRenderTarget(this.renderTargetBlurBuffer2),e.clear(),this.fsQuad.render(e),this.separableBlurMaterial2.uniforms.colorTexture.value=this.renderTargetBlurBuffer2.texture,this.separableBlurMaterial2.uniforms.direction.value=OutlinePass.BlurDirectionY,e.setRenderTarget(this.renderTargetEdgeBuffer2),e.clear(),this.fsQuad.render(e),this.fsQuad.material=this.overlayMaterial,this.overlayMaterial.uniforms.maskTexture.value=o.texture,this.overlayMaterial.uniforms.edgeTexture1.value=this.renderTargetEdgeBuffer1.texture,this.overlayMaterial.uniforms.edgeTexture2.value=this.renderTargetEdgeBuffer2.texture,this.overlayMaterial.uniforms.patternTexture.value=this.patternTexture,this.overlayMaterial.uniforms.edgeStrength.value=this.edgeStrength,this.overlayMaterial.uniforms.edgeGlow.value=this.edgeGlow,this.overlayMaterial.uniforms.usePatternTexture.value=this.usePatternTexture,a&&e.state.buffers.stencil.setTest(!0),e.setRenderTarget(n),this.fsQuad.render(e),e.setClearColor(this._oldClearColor,this.oldClearAlpha),e.autoClear=t}this.renderToScreen&&n&&(this.fsQuad.material=this.materialCopy,this.copyUniforms.tDiffuse.value=n.texture,e.setRenderTarget(null),this.fsQuad.render(e))}_getPrepareMaskMaterial(e){return new ShaderMaterial({uniforms:{depthTexture:{value:null},cameraNearFar:{value:new Vector2(.5,.5)},textureMatrix:{value:null}},defines:{FLOAT_ALPHA_DEPTH:e?1:0},vertexShader:"#include <morphtarget_pars_vertex>\n\t\t\t\t#include <skinning_pars_vertex>\n\n\t\t\t\tvarying vec4 projTexCoord;\n\t\t\t\tvarying vec4 vPosition;\n\t\t\t\tuniform mat4 textureMatrix;\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\t#include <skinbase_vertex>\n\t\t\t\t\t#include <begin_vertex>\n\t\t\t\t\t#include <morphtarget_vertex>\n\t\t\t\t\t#include <skinning_vertex>\n\t\t\t\t\t#include <project_vertex>\n\n\t\t\t\t\tvPosition = mvPosition;\n\n\t\t\t\t\tvec4 worldPosition = vec4( transformed, 1.0 );\n\n\t\t\t\t\t#ifdef USE_INSTANCING\n\n\t\t\t\t\t\tworldPosition = instanceMatrix * worldPosition;\n\n\t\t\t\t\t#endif\n\t\t\t\t\t\n\t\t\t\t\tworldPosition = modelMatrix * worldPosition;\n\n\t\t\t\t\tprojTexCoord = textureMatrix * worldPosition;\n\n\t\t\t\t}",fragmentShader:"#include <packing>\n\t\t\t\tvarying vec4 vPosition;\n\t\t\t\tvarying vec4 projTexCoord;\n\t\t\t\tuniform sampler2D depthTexture;\n\t\t\t\tuniform vec2 cameraNearFar;\n\n\t\t\t\tvoid main() {\n\n #if FLOAT_ALPHA_DEPTH == 1\n\t\t\t\t\t float depth = texture2DProj( depthTexture, projTexCoord ).w;\n #else\n float depth = unpackRGBAToDepth(texture2DProj( depthTexture, projTexCoord ));\n #endif\n\t\t\t\t\tfloat viewZ = - DEPTH_TO_VIEW_Z( depth, cameraNearFar.x, cameraNearFar.y );\n\t\t\t\t\tfloat depthTest = (-vPosition.z > viewZ) ? 1.0 : 0.0;\n\t\t\t\t\tgl_FragColor = vec4(0.0, depthTest, 1.0, 1.0);\n\n\t\t\t\t}"})}_getEdgeDetectionMaterial(){return new ShaderMaterial({uniforms:{maskTexture:{value:null},texSize:{value:new Vector2(.5,.5)},visibleEdgeColor:{value:new Vector3(1,1,1)},hiddenEdgeColor:{value:new Vector3(1,1,1)}},vertexShader:"varying vec2 vUv;\n\n\t\t\t\tvoid main() {\n\t\t\t\t\tvUv = uv;\n\t\t\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\t\t\t\t}",fragmentShader:"varying vec2 vUv;\n\n\t\t\t\tuniform sampler2D maskTexture;\n\t\t\t\tuniform vec2 texSize;\n\t\t\t\tuniform vec3 visibleEdgeColor;\n\t\t\t\tuniform vec3 hiddenEdgeColor;\n\n\t\t\t\tvoid main() {\n\t\t\t\t\tvec2 invSize = 1.0 / texSize;\n\t\t\t\t\tvec4 uvOffset = vec4(1.0, 0.0, 0.0, 1.0) * vec4(invSize, invSize);\n\t\t\t\t\tvec4 c1 = texture2D( maskTexture, vUv + uvOffset.xy);\n\t\t\t\t\tvec4 c2 = texture2D( maskTexture, vUv - uvOffset.xy);\n\t\t\t\t\tvec4 c3 = texture2D( maskTexture, vUv + uvOffset.yw);\n\t\t\t\t\tvec4 c4 = texture2D( maskTexture, vUv - uvOffset.yw);\n\t\t\t\t\tfloat diff1 = (c1.r - c2.r)*0.5;\n\t\t\t\t\tfloat diff2 = (c3.r - c4.r)*0.5;\n\t\t\t\t\tfloat d = length( vec2(diff1, diff2) );\n\t\t\t\t\tfloat a1 = min(c1.g, c2.g);\n\t\t\t\t\tfloat a2 = min(c3.g, c4.g);\n\t\t\t\t\tfloat visibilityFactor = min(a1, a2);\n\t\t\t\t\tvec3 edgeColor = 1.0 - visibilityFactor > 0.001 ? visibleEdgeColor : hiddenEdgeColor;\n\t\t\t\t\tgl_FragColor = vec4(edgeColor, 1.0) * vec4(d);\n\t\t\t\t}"})}_getSeperableBlurMaterial(e){return new ShaderMaterial({defines:{MAX_RADIUS:e},uniforms:{colorTexture:{value:null},texSize:{value:new Vector2(.5,.5)},direction:{value:new Vector2(.5,.5)},kernelRadius:{value:1}},vertexShader:"varying vec2 vUv;\n\n\t\t\t\tvoid main() {\n\t\t\t\t\tvUv = uv;\n\t\t\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\t\t\t\t}",fragmentShader:"#include <common>\n\t\t\t\tvarying vec2 vUv;\n\t\t\t\tuniform sampler2D colorTexture;\n\t\t\t\tuniform vec2 texSize;\n\t\t\t\tuniform vec2 direction;\n\t\t\t\tuniform float kernelRadius;\n\n\t\t\t\tfloat gaussianPdf(in float x, in float sigma) {\n\t\t\t\t\treturn 0.39894 * exp( -0.5 * x * x/( sigma * sigma))/sigma;\n\t\t\t\t}\n\n\t\t\t\tvoid main() {\n\t\t\t\t\tvec2 invSize = 1.0 / texSize;\n\t\t\t\t\tfloat sigma = kernelRadius/2.0;\n\t\t\t\t\tfloat weightSum = gaussianPdf(0.0, sigma);\n\t\t\t\t\tvec4 diffuseSum = texture2D( colorTexture, vUv) * weightSum;\n\t\t\t\t\tvec2 delta = direction * invSize * kernelRadius/float(MAX_RADIUS);\n\t\t\t\t\tvec2 uvOffset = delta;\n\t\t\t\t\tfor( int i = 1; i <= MAX_RADIUS; i ++ ) {\n\t\t\t\t\t\tfloat x = kernelRadius * float(i) / float(MAX_RADIUS);\n\t\t\t\t\t\tfloat w = gaussianPdf(x, sigma);\n\t\t\t\t\t\tvec4 sample1 = texture2D( colorTexture, vUv + uvOffset);\n\t\t\t\t\t\tvec4 sample2 = texture2D( colorTexture, vUv - uvOffset);\n\t\t\t\t\t\tdiffuseSum += ((sample1 + sample2) * w);\n\t\t\t\t\t\tweightSum += (2.0 * w);\n\t\t\t\t\t\tuvOffset += delta;\n\t\t\t\t\t}\n\t\t\t\t\tgl_FragColor = diffuseSum/weightSum;\n\t\t\t\t}"})}_getOverlayMaterial(){return new ShaderMaterial({uniforms:{maskTexture:{value:null},edgeTexture1:{value:null},edgeTexture2:{value:null},patternTexture:{value:null},edgeStrength:{value:1},edgeGlow:{value:1},usePatternTexture:{value:0}},vertexShader:"varying vec2 vUv;\n\n\t\t\t\tvoid main() {\n\t\t\t\t\tvUv = uv;\n\t\t\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\t\t\t\t}",fragmentShader:"varying vec2 vUv;\n\n\t\t\t\tuniform sampler2D maskTexture;\n\t\t\t\tuniform sampler2D edgeTexture1;\n\t\t\t\tuniform sampler2D edgeTexture2;\n\t\t\t\tuniform sampler2D patternTexture;\n\t\t\t\tuniform float edgeStrength;\n\t\t\t\tuniform float edgeGlow;\n\t\t\t\tuniform bool usePatternTexture;\n\n\t\t\t\tvoid main() {\n\t\t\t\t\tvec4 edgeValue1 = texture2D(edgeTexture1, vUv);\n\t\t\t\t\tvec4 edgeValue2 = texture2D(edgeTexture2, vUv);\n\t\t\t\t\tvec4 maskColor = texture2D(maskTexture, vUv);\n\t\t\t\t\tvec4 patternColor = texture2D(patternTexture, 6.0 * vUv);\n\t\t\t\t\tfloat visibilityFactor = 1.0 - maskColor.g > 0.0 ? 1.0 : 0.5;\n\t\t\t\t\tvec4 edgeValue = edgeValue1 + edgeValue2 * edgeGlow;\n\t\t\t\t\tvec4 finalColor = edgeStrength * maskColor.r * edgeValue;\n\t\t\t\t\tif(usePatternTexture)\n\t\t\t\t\t\tfinalColor += + visibilityFactor * (1.0 - maskColor.r) * (1.0 - patternColor.r);\n\t\t\t\t\tgl_FragColor = finalColor;\n }",blending:AdditiveBlending,depthTest:!1,depthWrite:!1,transparent:!0})}}OutlinePass.BlurDirectionX=new Vector2(1,0),OutlinePass.BlurDirectionY=new Vector2(0,1);class OutLineRenderer{get isOutlinePassActivated(){return this.outlinePassActivated}constructor(e,t,n,r){this._width=0,this._height=0,this._effectComposer=null,this.outlinePass=null,this.outlinePassActivated=!1,this._effectComposer=e,this._gBufferRenderTarget=null==r?void 0:r._gBufferRenderTarget,this._width=t,this._height=n,this.parameters={enabled:!0,edgeStrength:2,edgeGlow:1,edgeThickness:2,pulsePeriod:0,usePatternTexture:!1,visibleEdgeColor:16777215,hiddenEdgeColor:16777215,...r}}dispose(){var e;null===(e=this.outlinePass)||void 0===e||e.dispose()}setSize(e,t){var n;this._width=e,this._height=t,null===(n=this.outlinePass)||void 0===n||n.setSize(e,t)}updateParameters(e){for(let t in e)this.parameters.hasOwnProperty(t)&&(this.parameters[t]=e[t])}applyParameters(){this.outlinePass&&(this.outlinePass.edgeStrength=this.parameters.edgeStrength,this.outlinePass.edgeGlow=this.parameters.edgeGlow,this.outlinePass.edgeThickness=this.parameters.edgeThickness,this.outlinePass.pulsePeriod=this.parameters.pulsePeriod,this.outlinePass.usePatternTexture=this.parameters.usePatternTexture,this.outlinePass.visibleEdgeColor.set(this.parameters.visibleEdgeColor),this.outlinePass.hiddenEdgeColor.set(this.parameters.hiddenEdgeColor))}activateOutline(e,t){var n;if(!this.parameters.enabled)return void this.deactivateOutline();const r=(null===(n=this.outlinePass)||void 0===n?void 0:n.renderCamera)&&t.isPerspectiveCamera!==this.outlinePass.renderCamera.isPerspectiveCamera;this.outlinePass&&(this.outlinePass.renderScene=e,this.outlinePass.renderCamera=t),!r&&this.outlinePassActivated||(!r&&this.outlinePass||(this.outlinePass=new OutlinePass(new Vector2(this._width,this._height),e,t,[],{downSampleRatio:2,edgeDetectionFxaa:!0,_gBufferRenderTarget:this._gBufferRenderTarget})),this.applyParameters(),this._effectComposer&&this._effectComposer.addPass(this.outlinePass),this.outlinePassActivated=!0)}deactivateOutline(){this.outlinePassActivated&&(this.outlinePass&&this._effectComposer&&this._effectComposer.removePass(this.outlinePass),this.outlinePassActivated=!1)}updateOutline(e,t,n){n.length>0?(this.activateOutline(e,t),this.outlinePass&&(this.outlinePass.selectedObjects=n)):this.deactivateOutline()}}class RectAreaLightHelper extends Line{constructor(e,t){const n=new BufferGeometry;n.setAttribute("position",new Float32BufferAttribute([1,1,0,-1,1,0,-1,-1,0,1,-1,0,1,1,0],3)),n.computeBoundingSphere(),super(n,new LineBasicMaterial({fog:!1})),this.light=e,this.color=t,this.type="RectAreaLightHelper";const r=new BufferGeometry;r.setAttribute("position",new Float32BufferAttribute([1,1,0,-1,1,0,-1,-1,0,1,1,0,-1,-1,0,1,-1,0],3)),r.computeBoundingSphere(),this.add(new Mesh(r,new MeshBasicMaterial({side:BackSide,fog:!1})))}updateMatrixWorld(){if(this.scale.set(.5*this.light.width,.5*this.light.height,1),void 0!==this.color)this.material.color.set(this.color),this.children[0].material.color.set(this.color);else{this.material.color.copy(this.light.color).multiplyScalar(this.light.intensity);const e=this.material.color,t=Math.max(e.r,e.g,e.b);t>1&&e.multiplyScalar(1/t),this.children[0].material.color.copy(this.material.color)}this.matrixWorld.extractRotation(this.light.matrixWorld).scale(this.scale).copyPosition(this.light.matrixWorld),this.children[0].matrixWorld.copy(this.matrixWorld)}dispose(){this.geometry.dispose(),this.material.dispose(),this.children[0].geometry.dispose(),this.children[0].material.dispose()}}var ShadowLightSourceType;!function(e){e[e.DirectionalLightShadow=0]="DirectionalLightShadow",e[e.SpotLightShadow=1]="SpotLightShadow"}(ShadowLightSourceType||(ShadowLightSourceType={}));const defaultScreenSpaceShadowMapParameters={alwaysUpdate:!1,enableShadowMap:!0,layers:null,shadowLightSourceType:ShadowLightSourceType.DirectionalLightShadow,maximumNumberOfLightSources:-1,directionalDependency:1,directionalExponent:1,groundContainment:1,fadeOutDistance:.1,fadeOutBlur:20};class ScreenSpaceShadowMap{get shadowTexture(){return this._shadowRenderTarget.texture}constructor(e,t,n){var r,a;this.needsUpdate=!1,this.shadowTypeNeedsUpdate=!0,this.shadowConfiguration=new ShadowTypeConfiguration,this._shadowLightSources=[],this._shadowScale=1,this._renderPass=new RenderPass,this._cameraUpdate=new CameraUpdate,this._renderCacheManager=e,this._viewportSize=new Vector2(t.x,t.y),this._samples=null!==(r=null==n?void 0:n.samples)&&void 0!==r?r:0,this._shadowMapSize=null!==(a=null==n?void 0:n.shadowMapSize)&&void 0!==a?a:1024,this.parameters=this._getScreenSpaceShadowMapParameters(n),this.castShadow=this.parameters.enableShadowMap,this._shadowMapPassOverrideMaterialCache=new ShadowMapPassOverrideMaterialCache(this.parameters),this._renderCacheManager.registerCache(this,this._shadowMapPassOverrideMaterialCache);const i=this._samples;this._shadowRenderTarget=new WebGLRenderTarget(this._viewportSize.x,this._viewportSize.y,{samples:i,format:RedFormat})}_getScreenSpaceShadowMapParameters(e){return{...defaultScreenSpaceShadowMapParameters,...e}}dispose(){this._shadowLightSources.forEach(e=>e.dispose()),this._shadowRenderTarget.dispose(),this._shadowMapPassOverrideMaterialCache.dispose()}updateParameters(e){for(let t in e)this.parameters.hasOwnProperty(t)&&(this.parameters[t]=e[t])}updateBounds(e,t){const n=this._shadowScale;this._shadowScale=t,Math.abs(n-this._shadowScale)>1e-5&&(this.shadowTypeNeedsUpdate=!0),this._shadowLightSources.forEach(t=>t.updateBounds(e)),this._shadowMapPassOverrideMaterialCache.setBoundingBox(e.bounds)}forceShadowUpdate(){this._shadowLightSources.forEach(e=>e.forceShadowUpdate()),this.needsUpdate=!0}getShadowLightSources(){return this._shadowLightSources.map(e=>e.getShadowLight())}findShadowLightSource(e){var t;return null===(t=this._shadowLightSources.find(t=>t.getOriginalLight()===e))||void 0===t?void 0:t.getShadowLight()}addRectAreaLight(e,t){const n=new RectAreaShadowLightSource(e,{shadowMapSize:this._shadowMapSize,shadowLightSourceType:this.parameters.shadowLightSourceType});this._shadowLightSources.push(n),n.addTo(t),n.updatePositionAndTarget(),this.needsUpdate=!0}updateRectAreaLights(e,t){this._shadowLightSources=this._shadowLightSources.filter(n=>{if(n instanceof RectAreaShadowLightSource){const t=n.getRectAreaLight();if(e.includes(t))return n.updatePositionAndTarget(),!0}return n.removeFrom(t),n.dispose(),!1}),e.forEach(e=>{this._shadowLightSources.find(t=>t instanceof RectAreaShadowLightSource&&t.getRectAreaLight()===e)||this.addRectAreaLight(e,t)}),this.needsUpdate=!0,this.shadowTypeNeedsUpdate=!0}createShadowFromLightSources(e,t){this._shadowLightSources=this._shadowLightSources.filter(t=>{t.removeFrom(e),t.dispose()});const n=1/(t.length>0?Math.max(...t.map(e=>e.maxIntensity)):1);this._addShadowFromLightSources(t,n),this._shadowLightSources.forEach(t=>{t.addTo(e),t.updatePositionAndTarget()}),this.needsUpdate=!0,this.shadowTypeNeedsUpdate=!0}_addShadowFromLightSources(e,t){e.forEach(e=>{const n=e.maxIntensity*t;if(n>=.1&&e.position.z>=0){const t=new Vector3(e.position.x,e.position.z,e.position.y).multiplyScalar(7),r=new EnvironmentShadowLightSource(t,n,{shadowMapSize:this._shadowMapSize,shadowLightSourceType:this.parameters.shadowLightSourceType});this._shadowLightSources.push(r)}})}setSize(e,t){this._viewportSize=new Vector2(e,t),this._shadowRenderTarget.setSize(this._viewportSize.x,this._viewportSize.y)}updatePositionAndTarget(){this._shadowLightSources.forEach(e=>e.updatePositionAndTarget())}renderShadowMap(e,t,n){if(!(this.needsUpdate||this.parameters.alwaysUpdate||this._cameraUpdate.changed(n)))return;this.needsUpdate=!1,this.shadowTypeNeedsUpdate&&(this.shadowTypeNeedsUpdate=!1,this.needsUpdate=!0,this._updateShadowType(e));const r=t.background,a=t.environment,i=n.layers.mask;t.environment=null,t.background=null,this.parameters.layers&&(n.layers.mask=this.parameters.layers.mask),this._renderSimpleShadowMapFromShadowLightSources(e,t,n),n.layers.mask=i,t.environment=a,t.background=r}_renderSimpleShadowMapFromShadowLightSources(e,t,n){this._shadowMapPassOverrideMaterialCache.setShadowParameters(this.parameters.directionalDependency,this.parameters.directionalExponent,this.parameters.groundContainment,this.parameters.fadeOutDistance*this._shadowScale,this.parameters.fadeOutBlur);const r=this._getSortedShadowLightSources();0===r.length?this._renderPass.clear(e,this._shadowRenderTarget,16777215,1):(this._setShadowLightSourcesIntensity(r),this._renderCacheManager.render(this,t,()=>{this._renderPass.render(e,t,n,this._shadowRenderTarget,16777215,1)}),this._shadowLightSources.forEach(e=>e.finishRenderShadow()))}_getSortedShadowLightSources(){let e=[];return this._shadowLightSources.forEach(t=>e.push(...t.prepareRenderShadow())),e.sort((e,t)=>e.light.castShadow&&!t.light.castShadow?-1:!e.light.castShadow&&t.light.castShadow?1:t.intensity-e.intensity),e}_setShadowLightSourcesIntensity(e){var t;let n=0;for(let t=0;t<e.length;t++){const r=e[t];(this.parameters.maximumNumberOfLightSources<0||t<this.parameters.maximumNumberOfLightSources)&&(n+=r.intensity)}for(let r=0;r<e.length;r++){const a=e[r];this.parameters.maximumNumberOfLightSources<0||r<this.parameters.maximumNumberOfLightSources?(a.light.visible=!0,a.light.intensity=a.intensity/n,(t=a.light).castShadow&&(t.castShadow=this.castShadow)):(a.light.visible=!1,a.light.intensity=0,a.light.castShadow=!1)}}_updateShadowType(e){e.shadowMap.type=this.shadowConfiguration.currentConfiguration.type;const t=this.parameters.enableShadowMap&&this.shadowConfiguration.currentConfiguration.castShadow;e.shadowMap.enabled=t,e.shadowMap.needsUpdate=!0,this.castShadow=t&&this.shadowConfiguration.currentConfiguration.castShadow,this._shadowLightSources.forEach(e=>e._updateShadowType(this.shadowConfiguration.currentConfiguration,this._shadowScale))}switchType(e){return!!this.shadowConfiguration.switchType(e)&&(this.needsUpdate=!0,this.shadowTypeNeedsUpdate=!0,!0)}}var ShadowMaterialType;!function(e){e[e.Default=0]="Default",e[e.Unlit=1]="Unlit",e[e.Emissive=2]="Emissive",e[e.Shadow=3]="Shadow"}(ShadowMaterialType||(ShadowMaterialType={}));class ShadowMapPassOverrideMaterialCache{constructor(e){var t,n;this._sceneBoxMin=new Vector3(-1,-1,-1),this._sceneBoxMax=new Vector3(1,1,1),this._distributionProperties=new Vector4(1,1,1,0),this._objectCache=new Map,this._shadowFadeOut=new Vector2(null!==(t=null==e?void 0:e.fadeOutTo)&&void 0!==t?t:.5,null!==(n=null==e?void 0:e.fadeOutBlur)&&void 0!==n?n:60),this._shadowObjectMaterial=this._createShadowMaterial(ShadowMaterialType.Default),this._unlitMaterial=this._createShadowMaterial(ShadowMaterialType.Unlit),this._emissiveMaterial=this._createShadowMaterial(ShadowMaterialType.Emissive),this._receiveShadowMaterial=this._createShadowMaterial(ShadowMaterialType.Shadow)}dispose(){this._shadowObjectMaterial.dispose(),this._unlitMaterial.dispose(),this._emissiveMaterial.dispose(),this._receiveShadowMaterial.dispose()}setShadowParameters(e,t,n,r,a){this._distributionProperties.set(e,t,n,0),this._shadowFadeOut.set(r,a)}setBoundingBox(e){this._sceneBoxMin.copy(e.min),this._sceneBoxMax.copy(e.max)}_createShadowMaterial(e){let t;return t=e===ShadowMaterialType.Emissive||e===ShadowMaterialType.Unlit?new MeshBasicMaterial({color:16777215,side:DoubleSide}):e===ShadowMaterialType.Shadow?new ShadowMaterial({side:DoubleSide}):ShadowMapPassOverrideMaterialCache.useModifiedMaterial?this._createCustomerShadowMaterial():new MeshPhongMaterial({color:16777215,shininess:0,polygonOffsetFactor:0,polygonOffsetUnits:0,side:DoubleSide}),t}_createCustomerShadowMaterial(){const e=new MeshLambertMaterial({side:DoubleSide});return e.onBeforeCompile=e=>{e.vertexShader="\n#define LAMBERT\n\nvarying vec3 vViewPosition;\nvarying vec3 vWorldPosition;\n\n#include <common>\n#include <displacementmap_pars_vertex>\n#include <normal_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\n\nvoid main() {\n #include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <normal_vertex>\n\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\n\tvViewPosition = - mvPosition.xyz;\n\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\n vWorldPosition = worldPosition.xyz;\n}\n",e.fragmentShader="\n#define LAMBERT\n\nuniform vec3 diffuse;\nuniform float opacity;\n\nvarying vec3 vViewPosition;\nvarying vec3 vWorldPosition;\n\n#ifdef DYNAMIC_SHADOW_RADIUS\n uniform vec2 shadowFadeOut;\n uniform vec3 sceneBoxMin;\n uniform vec3 sceneBoxMax;\n#endif\nuniform vec4 distributionProperties;\n\n#include <common>\n#include <packing>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <alphahash_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lights_pars_begin>\n#include <normal_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\n\nvec2 getShadowDynamicScale() {\n\n vec2 dynamicScale = vec2(0.0, 1.0);\n\n#ifdef DYNAMIC_SHADOW_RADIUS\n if (shadowFadeOut.x > 0.0) {\n vec3 boxDistanceVec = max(vec3(0.0), max(sceneBoxMin - vWorldPosition, vWorldPosition - sceneBoxMax));\n float boxDistance = length(boxDistanceVec);\n \n // linear interpolation gives better result than smooth Hermite interpolation\n // float shadowBase = smoothstep(0.0, shadowFadeOut.x, boxDistance);\n float shadowBase = boxDistance / shadowFadeOut.x;\n\n shadowBase = clamp(shadowBase, 0.0, 1.0);\n dynamicScale = vec2(shadowBase, 1.0 - shadowBase);\n }\n#endif\n\n return dynamicScale;\n}\n\nfloat getShadowDynamicRadius(sampler2D shadowMap, float shadowBias, float shadowRadius, vec4 shadowCoord, vec2 shadowScale) {\n\n float dynamicRadius = shadowRadius;\n\n#ifdef DYNAMIC_SHADOW_RADIUS\n shadowCoord.xyz /= shadowCoord.w;\n shadowCoord.z += shadowBias;\n\n bool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\n bool frustumTest = inFrustum && shadowCoord.z <= 1.0;\n if (frustumTest && shadowFadeOut.x > 0.0) {\n float shadowDepth = unpackRGBAToDepth(texture2D(shadowMap, shadowCoord.xy));\n float delta = shadowDepth - shadowCoord.z;\n float fadeOutScale = max(shadowScale.x, smoothstep(max(shadowDepth, 0.5), shadowFadeOut.x * 0.5 + 0.5, shadowCoord.z));\n dynamicRadius = shadowRadius + shadowFadeOut.y * max(0.0, fadeOutScale);\n }\n#endif\n\n return dynamicRadius;\n}\n\nvoid main() {\n\n\t#include <clipping_planes_fragment>\n\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t\n\t#include <logdepthbuf_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <alphahash_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\n\t// accumulation\n\n\tvec3 geometryPosition = - vViewPosition;\n \n // add in three.js 157\n //vec3 geometryNormal = normal;\n\n vec3 geometryViewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );\n\n // remeove in three.js 157\n GeometricContext geometry;\n geometry.position = - vViewPosition;\n geometry.normal = normal;\n geometry.viewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );\n\n IncidentLight directLight;\n\n vec3 accumulatedShadowLight = vec3(0.0);\n vec3 directionDependentShadowLight = vec3(1.0);\n float groundDistance = clamp((vWorldPosition.y - sceneBoxMin.y) * 100.0, 0.0, 1.0);\n float groundContainment = mix(1.0, groundDistance, distributionProperties.z);\n vec2 dynamicScale = getShadowDynamicScale();\n #if ( NUM_DIR_LIGHTS > 0 )\n\n DirectionalLight directionalLight;\n #if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\n DirectionalLightShadow directionalLightShadow;\n #endif\n\n float dynamicRadius;\n vec3 incidentLightSum = vec3(0.0);\n vec3 incidentShadowLight = vec3(0.0);\n float shadowFactor;\n float dotNL;\n float incidentLightFactor;\n\n #pragma unroll_loop_start\n for ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\n directionalLight = directionalLights[ i ];\n\n // change for three.js 157\n //getDirectionalLightInfo( directionalLight, directLight );\n getDirectionalLightInfo( directionalLight, geometry, directLight );\n\n dotNL = dot(dot(geometryNormal, geometryPosition) >= 0.0 ? -geometryNormal : geometryNormal, directLight.direction);\n incidentLightFactor = clamp(dotNL, 0.0, 1.0);\n\n dynamicRadius = 0.0;\n shadowFactor = 1.0;\n #if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\n directionalLightShadow = directionalLightShadows[ i ];\n dynamicRadius = getShadowDynamicRadius(directionalShadowMap[i], directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[i], dynamicScale);\n shadowFactor = ( directLight.visible && receiveShadow ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowBias, dynamicRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n #endif\n\n accumulatedShadowLight += directLight.color * shadowFactor * saturate(min(dotNL * 10.0 + 0.9, 1.0));\n incidentLightFactor = mix(\n mix(pow(incidentLightFactor, 4.0), 1.0, step(0.99, shadowFactor)),\n pow(incidentLightFactor, distributionProperties.y),\n groundContainment);\n incidentLightSum += directLight.color * mix(incidentLightFactor, 1.0, groundContainment);\n incidentShadowLight += directLight.color * mix(\n shadowFactor * incidentLightFactor, \n mix(1.0, shadowFactor, incidentLightFactor), \n groundContainment);\n }\n #pragma unroll_loop_end\n\n if (dot(incidentLightSum, vec3(1.0)) > 0.01) {\n directionDependentShadowLight = incidentShadowLight / incidentLightSum;\n }\n #else\n accumulatedShadowLight = vec3(1.0);\n #endif \n\n\t// modulation\n\n\tvec3 outgoingLight = mix(accumulatedShadowLight, directionDependentShadowLight, max(distributionProperties.x, 1.0 - groundDistance));\n outgoingLight = dynamicScale.x + directionDependentShadowLight.y * outgoingLight;\n\n\t#include <opaque_fragment>\n\t#include <premultiplied_alpha_fragment>\n}\n",e.defines=Object.assign({...e.defines,DYNAMIC_SHADOW_RADIUS:""});const t=e.uniforms;t&&(t.distributionProperties={value:this._distributionProperties},t.shadowFadeOut={value:this._shadowFadeOut},t.sceneBoxMin={value:this._sceneBoxMin},t.sceneBoxMax={value:this._sceneBoxMax})},e}clear(){this._objectCache.clear()}addLineOrPoint(e){this._addCacheEntry(e,!1,!1)}addMesh(e){e.visible&&this._setMeshMaterialAndVisibility(e)}addObject(e){e.isLight&&!e.userData.shadowLightSource&&this._addCacheEntry(e,!1,!1)}_addCacheEntry(e,t,n,r){this._objectCache.set(e,{originalObject:{visible:e.visible,castShadow:e.castShadow,material:e.material},shadowObject:{visible:t,castShadow:n,material:r}})}onBeforeRender(){this._objectCache.forEach((e,t)=>{t.visible=e.shadowObject.visible,t.castShadow=e.shadowObject.castShadow,t instanceof Mesh&&e.shadowObject.material&&(t.material=e.shadowObject.material)})}onAfterRender(){this._objectCache.forEach((e,t)=>{t.visible=e.originalObject.visible,t.castShadow=e.originalObject.castShadow,e.originalObject.material&&(t.material=e.originalObject.material)})}_setMeshMaterialAndVisibility(e){!e.material||!e.receiveShadow||Array.isArray(e.material)||!0===e.material.transparent&&e.material.opacity<.9?e.userData.isFloor?this._addCacheEntry(e,e.visible,e.castShadow,this._shadowObjectMaterial):e.material&&e.material.transparent&&e.material.opacity<.9?this._addCacheEntry(e,!1,e.castShadow,this._shadowObjectMaterial):e.receiveShadow?this._addCacheEntry(e,e.visible,!1,this._receiveShadowMaterial):this._addCacheEntry(e,!1,e.castShadow,e.material):this._setShadowMaterialForOpaqueObject(e)}_setShadowMaterialForOpaqueObject(e){const t=e.material;t instanceof LineBasicMaterial||t instanceof MeshBasicMaterial?this._addCacheEntry(e,e.visible,e.castShadow,this._unlitMaterial):t instanceof MeshStandardMaterial?this._setMeshShadowStandardMaterial(e,t):this._addCacheEntry(e,e.visible,e.castShadow,e.receiveShadow?this._shadowObjectMaterial:this._unlitMaterial)}_setMeshShadowStandardMaterial(e,t){const n=t.emissiveIntensity>0&&(t.emissive.r>0||t.emissive.g>0||t.emissive.b>0);this._addCacheEntry(e,e.visible,!n&&e.castShadow,n?this._emissiveMaterial:e.receiveShadow?this._shadowObjectMaterial:this._unlitMaterial)}}ShadowMapPassOverrideMaterialCache.useModifiedMaterial=!0;class ShadowTypeConfiguration{constructor(){var e;this.types=new Map([["off",ShadowTypeConfiguration._noShadow],["BasicShadowMap",ShadowTypeConfiguration._basicShadow],["PCFShadowMap",ShadowTypeConfiguration._pcfShadow],["PCFSoftShadowMap",ShadowTypeConfiguration._pcfSoftShadow],["VSMShadowMap",ShadowTypeConfiguration._vcmShadow]]),this.shadowType="PCFShadowMap",this.currentConfiguration=null!==(e=this.types.get(this.shadowType))&&void 0!==e?e:ShadowTypeConfiguration._defaultType}switchType(e){var t;return!!this.types.has(e)&&(this.currentConfiguration=null!==(t=this.types.get(e))&&void 0!==t?t:ShadowTypeConfiguration._defaultType,!0)}}ShadowTypeConfiguration._noShadow={castShadow:!1,type:PCFShadowMap,bias:0,normalBias:0,radius:0},ShadowTypeConfiguration._basicShadow={castShadow:!0,type:BasicShadowMap,bias:-5e-5,normalBias:.005,radius:0},ShadowTypeConfiguration._pcfShadow={castShadow:!0,type:PCFShadowMap,bias:-5e-5,normalBias:.01,radius:4},ShadowTypeConfiguration._pcfSoftShadow={castShadow:!0,type:PCFSoftShadowMap,bias:-5e-5,normalBias:.01,radius:1},ShadowTypeConfiguration._vcmShadow={castShadow:!0,type:VSMShadowMap,bias:1e-4,normalBias:0,radius:15},ShadowTypeConfiguration._defaultType=ShadowTypeConfiguration._pcfShadow;class BaseShadowLightSource{constructor(e,t){var n,r;this._isVisibleBackup=!0,this._castShadowBackup=!0,this._shadowMapSize=null!==(n=null==t?void 0:t.shadowMapSize)&&void 0!==n?n:1024,this._blurSamples=null!==(r=null==t?void 0:t._blurSamples)&&void 0!==r?r:8,this._shadowLightSource=e,this._shadowLightSource.visible=!1,this._shadowLightSource.castShadow=!0,this._shadowLightSource.shadow&&(this._shadowLightSource.shadow.mapSize=new Vector2(this._shadowMapSize,this._shadowMapSize),this._shadowLightSource.shadow.blurSamples=this._blurSamples,this._shadowLightSource.shadow.autoUpdate=!1),this._shadowLightSource.userData.shadowLightSource=this}getPosition(){return this._shadowLightSource.position}getShadowLight(){return this._shadowLightSource}getOriginalLight(){return null}dispose(){this._shadowLightSource.dispose()}addTo(e){e.add(this._shadowLightSource)}removeFrom(e){e.remove(this._shadowLightSource)}updatePositionAndTarget(){this._updateShadowPositionAndTarget(this.getPosition(),new Vector3(0,0,0))}updateBounds(e){if(this._shadowLightSource instanceof SpotLight){const t=this._shadowLightSource.shadow.camera,n=e.bounds.clone().applyMatrix4(t.matrixWorldInverse),r=Math.max(.001,Math.min(-n.min.z,-n.max.z)),a=Math.max(-n.min.z,-n.max.z),i=Math.max(Math.abs(n.min.x),Math.abs(n.max.x)),s=Math.max(Math.abs(n.min.y),Math.abs(n.max.y)),o=Math.atan2(1.05*Math.hypot(s,i),r);t.aspect=1,t.near=r,t.far=a,this._shadowLightSource.angle=o}else if(this._shadowLightSource.shadow){const t=this._shadowLightSource.shadow.camera;e.updateCameraViewVolumeFromBounds(t);const n=t;n.far+=n.far-n.near,n.updateProjectionMatrix()}this._shadowLightSource.shadow&&(this._shadowLightSource.shadow.needsUpdate=!0)}forceShadowUpdate(){this._shadowLightSource.shadow&&(this._shadowLightSource.shadow.needsUpdate=!0)}_updateShadowPositionAndTarget(e,t){var n,r,a;if(this._shadowLightSource instanceof SpotLight){const n=t.clone().sub(e),r=n.length();n.normalize();const a=t.clone().sub(n.clone().multiplyScalar(4*r));this._shadowLightSource.shadow.camera.position.copy(a),this._shadowLightSource.shadow.camera.position.copy(a),this._shadowLightSource.shadow.camera.lookAt(t),this._shadowLightSource.position.copy(a),this._shadowLightSource.lookAt(t)}else this._shadowLightSource.position.copy(e),this._shadowLightSource.lookAt(t),null===(n=this._shadowLightSource.shadow)||void 0===n||n.camera.position.copy(e),null===(r=this._shadowLightSource.shadow)||void 0===r||r.camera.lookAt(t);null===(a=this._shadowLightSource.shadow)||void 0===a||a.camera.updateMatrixWorld(),this._shadowLightSource.updateMatrixWorld()}_updateShadowType(e,t){const n=this._shadowLightSource.shadow;n&&(n.bias=e.bias,n.normalBias=e.normalBias*t,n.radius=e.radius,n.needsUpdate=!0)}prepareRenderShadow(){return[]}finishRenderShadow(){}}class RectAreaShadowLightSource extends BaseShadowLightSource{constructor(e,t){let n;switch(null==t?void 0:t.shadowLightSourceType){default:case ShadowLightSourceType.DirectionalLightShadow:n=new DirectionalLight(16777215,1);break;case ShadowLightSourceType.SpotLightShadow:n=new SpotLight(16777215,1,0,Math.PI/4,0)}n.position.copy(e.position),n.lookAt(0,0,0),super(n,t),this._rectAreaLight=e,this._rectAreaLight.userData.shadowLightSource=this,(null==t?void 0:t.addHelper)&&(this._rectLightHelper=new RectAreaLightHelper(this._rectAreaLight),this._rectLightHelper.material.depthWrite=!1,this._rectAreaLight.add(this._rectLightHelper))}getPosition(){return this._rectAreaLight.position}getRectAreaLight(){return this._rectAreaLight}getOriginalLight(){return this._rectAreaLight}prepareRenderShadow(){return this._isVisibleBackup=this._rectAreaLight.visible,this._castShadowBackup=this._shadowLightSource.castShadow,this._shadowLightSource.visible=this._rectAreaLight.visible,this._rectAreaLight.visible=!1,this._shadowLightSource.visible?[{light:this._shadowLightSource,intensity:this._rectAreaLight.intensity}]:[]}finishRenderShadow(){this._shadowLightSource.visible=!1,this._shadowLightSource.castShadow=this._castShadowBackup,this._rectAreaLight.visible=this._isVisibleBackup}}class EnvironmentShadowLightSource extends BaseShadowLightSource{constructor(e,t,n){const r=new DirectionalLight(16777215,t);r.position.copy(e),r.lookAt(0,0,0),r.updateMatrix(),r.castShadow=!0,super(r,n),this._position=e.clone(),this._intensity=t}getPosition(){return this._position}prepareRenderShadow(){return this._castShadowBackup=this._shadowLightSource.castShadow,this._shadowLightSource.visible=!0,[{light:this._shadowLightSource,intensity:this._intensity}]}finishRenderShadow(){this._shadowLightSource.castShadow=this._castShadowBackup,this._shadowLightSource.visible=!1}}const dummyCamera=new Camera;let geometry=null;class Pass{constructor(e="Pass",t=new Scene,n=dummyCamera){this.name=e,this.renderer=null,this.scene=t,this.camera=n,this.screen=null,this.rtt=!0,this.needsSwap=!0,this.needsDepthTexture=!1,this.enabled=!0}get renderToScreen(){return!this.rtt}set renderToScreen(e){if(this.rtt===e){const t=this.fullscreenMaterial;null!==t&&(t.needsUpdate=!0),this.rtt=!e}}set mainScene(e){}set mainCamera(e){}setRenderer(e){this.renderer=e}isEnabled(){return this.enabled}setEnabled(e){this.enabled=e}get fullscreenMaterial(){return null!==this.screen?this.screen.material:null}set fullscreenMaterial(e){let t=this.screen;null!==t?t.material=e:(t=new Mesh(function(){if(null===geometry){const e=new Float32Array([-1,-1,0,3,-1,0,-1,3,0]),t=new Float32Array([0,0,2,0,0,2]);geometry=new BufferGeometry,void 0!==geometry.setAttribute?(geometry.setAttribute("position",new BufferAttribute(e,3)),geometry.setAttribute("uv",new BufferAttribute(t,2))):(geometry.addAttribute("position",new BufferAttribute(e,3)),geometry.addAttribute("uv",new BufferAttribute(t,2)))}return geometry}(),e),t.frustumCulled=!1,null===this.scene&&(this.scene=new Scene),this.scene.add(t),this.screen=t)}getFullscreenMaterial(){return this.fullscreenMaterial}setFullscreenMaterial(e){this.fullscreenMaterial=e}getDepthTexture(){return null}setDepthTexture(e,t=BasicDepthPacking){}render(e,t,n,r,a){throw new Error("Render method not implemented!")}setSize(e,t){}initialize(e,t,n){}dispose(){for(const e of Object.keys(this)){const t=this[e];(t instanceof WebGLRenderTarget||t instanceof Material||t instanceof Texture||t instanceof Pass)&&this[e].dispose()}}}var blueNoiseImage="data:image/png;base64,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",vertexShader="#define GLSLIFY 1\nvarying vec2 vUv;void main(){vUv=position.xy*0.5+0.5;gl_Position=vec4(position.xy,1.0,1.0);}",sampleBlueNoise="#define GLSLIFY 1\nconst float g=1.6180339887498948482;const float a1=1.0/g;float r1(float n){return fract(1.1127756842787055+a1*n);}const vec4 hn=vec4(0.618033988749895,0.3247179572447458,0.2207440846057596,0.1673039782614187);vec4 sampleBlueNoise(sampler2D texture,int seed,vec2 repeat,vec2 texSize){vec2 size=vUv*texSize;vec2 blueNoiseSize=texSize/repeat;float blueNoiseIndex=floor(floor(size.y/blueNoiseSize.y)*repeat.x)+floor(size.x/blueNoiseSize.x);vec2 blueNoiseUv=vUv*repeat;vec4 blueNoise=textureLod(texture,blueNoiseUv,0.);if(seed!=0){blueNoise=fract(blueNoise+hn*float(seed));blueNoise.r=(blueNoise.r>0.5 ? 1.0-blueNoise.r : blueNoise.r)*2.0;blueNoise.g=(blueNoise.g>0.5 ? 1.0-blueNoise.g : blueNoise.g)*2.0;blueNoise.b=(blueNoise.b>0.5 ? 1.0-blueNoise.b : blueNoise.b)*2.0;blueNoise.a=(blueNoise.a>0.5 ? 1.0-blueNoise.a : blueNoise.a)*2.0;}return blueNoise;}";class AOPass extends Pass{constructor(e,t,n){super(),this._camera=e,this._scene=t,this.renderTarget=new WebGLRenderTarget(1,1,{type:HalfFloatType,depthBuffer:!1});const r=n.replace("#include <sampleBlueNoise>",sampleBlueNoise);this.fullscreenMaterial=new ShaderMaterial({fragmentShader:r,vertexShader,uniforms:{depthTexture:{value:null},normalTexture:{value:null},cameraNear:{value:0},cameraFar:{value:0},viewMatrix:{value:this._camera.matrixWorldInverse},projectionViewMatrix:{value:new Matrix4},projectionMatrixInverse:{value:this._camera.projectionMatrixInverse},cameraMatrixWorld:{value:this._camera.matrixWorld},texSize:{value:new Vector2},blueNoiseTexture:{value:null},blueNoiseRepeat:{value:new Vector2},aoDistance:{value:0},distancePower:{value:0},bias:{value:0},thickness:{value:0},power:{value:0},frame:{value:0}},blending:NoBlending,depthWrite:!1,depthTest:!1,toneMapped:!1}),(new TextureLoader).load(blueNoiseImage,e=>{e.minFilter=NearestFilter,e.magFilter=NearestFilter,e.wrapS=RepeatWrapping,e.wrapT=RepeatWrapping,e.colorSpace=NoColorSpace,this.fullscreenMaterial.uniforms.blueNoiseTexture.value=e})}get texture(){return this.renderTarget.texture}setSize(e,t){this.renderTarget.setSize(e,t),this.fullscreenMaterial.uniforms.texSize.value.set(this.renderTarget.width,this.renderTarget.height)}render(e){const t=+this.fullscreenMaterial.defines.spp;this.fullscreenMaterial.uniforms.frame.value=(this.fullscreenMaterial.uniforms.frame.value+t)%65536,this.fullscreenMaterial.uniforms.cameraNear.value=this._camera.near,this.fullscreenMaterial.uniforms.cameraFar.value=this._camera.far,this.fullscreenMaterial.uniforms.projectionViewMatrix.value.multiplyMatrices(this._camera.projectionMatrix,this._camera.matrixWorldInverse);const n=this.fullscreenMaterial.uniforms.blueNoiseTexture.value;if(n){const{width:e,height:t}=n.source.data;this.fullscreenMaterial.uniforms.blueNoiseRepeat.value.set(this.renderTarget.width/e,this.renderTarget.height/t)}e.setRenderTarget(this.renderTarget),e.render(this.scene,this.camera)}}class SSAOPass extends AOPass{constructor(e,t){super(e,t,"#define GLSLIFY 1\nvarying vec2 vUv;uniform sampler2D depthTexture;uniform sampler2D normalTexture;uniform mat4 projectionViewMatrix;uniform mat4 cameraMatrixWorld;uniform sampler2D blueNoiseTexture;uniform vec2 blueNoiseRepeat;uniform vec2 texSize;uniform mat4 projectionMatrixInverse;uniform float aoDistance;uniform float distancePower;uniform float cameraNear;uniform float cameraFar;uniform int frame;uniform vec3[spp]samples;uniform float[spp]samplesR;\n#include <common>\n#include <packing>\n#include <sampleBlueNoise>\nvec3 getWorldPos(const float depth,const vec2 coord){float z=depth*2.0-1.0;vec4 clipSpacePosition=vec4(coord*2.0-1.0,z,1.0);vec4 viewSpacePosition=projectionMatrixInverse*clipSpacePosition;vec4 worldSpacePosition=cameraMatrixWorld*viewSpacePosition;worldSpacePosition.xyz/=worldSpacePosition.w;return worldSpacePosition.xyz;}vec3 computeNormal(vec3 worldPos,vec2 vUv){vec2 size=vec2(textureSize(depthTexture,0));ivec2 p=ivec2(vUv*size);float c0=texelFetch(depthTexture,p,0).x;float l2=texelFetch(depthTexture,p-ivec2(2,0),0).x;float l1=texelFetch(depthTexture,p-ivec2(1,0),0).x;float r1=texelFetch(depthTexture,p+ivec2(1,0),0).x;float r2=texelFetch(depthTexture,p+ivec2(2,0),0).x;float b2=texelFetch(depthTexture,p-ivec2(0,2),0).x;float b1=texelFetch(depthTexture,p-ivec2(0,1),0).x;float t1=texelFetch(depthTexture,p+ivec2(0,1),0).x;float t2=texelFetch(depthTexture,p+ivec2(0,2),0).x;float dl=abs((2.0*l1-l2)-c0);float dr=abs((2.0*r1-r2)-c0);float db=abs((2.0*b1-b2)-c0);float dt=abs((2.0*t1-t2)-c0);vec3 ce=getWorldPos(c0,vUv).xyz;vec3 dpdx=(dl<dr)? ce-getWorldPos(l1,(vUv-vec2(1.0/size.x,0.0))).xyz:-ce+getWorldPos(r1,(vUv+vec2(1.0/size.x,0.0))).xyz;vec3 dpdy=(db<dt)? ce-getWorldPos(b1,(vUv-vec2(0.0,1.0/size.y))).xyz:-ce+getWorldPos(t1,(vUv+vec2(0.0,1.0/size.y))).xyz;return normalize(cross(dpdx,dpdy));}highp float linearize_depth(highp float d,highp float zNear,highp float zFar){highp float z_n=2.0*d-1.0;return 2.0*zNear*zFar/(zFar+zNear-z_n*(zFar-zNear));}void main(){\n#if DepthValueSourceType == NORMAL_VECTOR_ALPHA\nfloat depth=textureLod(depthTexture,vUv,0.).a;\n#else\nfloat depth=textureLod(depthTexture,vUv,0.).x;\n#endif\nif(depth==1.0){discard;return;}vec3 worldPos=getWorldPos(depth,vUv);\n#if NormalVectorSourceType == FLOAT_BUFFER_NORMAL\nvec3 normal=normalize(textureLod(normalTexture,vUv,0.).rgb);\n#else\nvec3 normal=computeNormal(worldPos,vUv);\n#endif\n#ifdef animatedNoise\nint seed=frame;\n#else\nint seed=0;\n#endif\nvec4 noise=sampleBlueNoise(blueNoiseTexture,seed,blueNoiseRepeat,texSize);vec3 randomVec=normalize(noise.rgb*2.0-1.0);vec3 tangent=normalize(randomVec-normal*dot(randomVec,normal));vec3 bitangent=cross(normal,tangent);mat3 tbn=mat3(tangent,bitangent,normal);float occluded=0.0;float totalWeight=0.0;vec3 samplePos;float sppF=float(spp);for(float i=0.0;i<sppF;i++){vec3 sampleDirection=tbn*samples[int(i)];if(dot(sampleDirection,normal)<0.0)sampleDirection*=-1.0;float moveAmt=samplesR[int(mod(i+noise.a*sppF,sppF))];samplePos=worldPos+aoDistance*moveAmt*sampleDirection;vec4 offset=projectionViewMatrix*vec4(samplePos,1.0);offset.xyz/=offset.w;offset.xyz=offset.xyz*0.5+0.5;\n#if DepthValueSourceType == NORMAL_VECTOR_ALPHA\nfloat sampleDepth=textureLod(depthTexture,offset.xy,0.0).a;\n#else\nfloat sampleDepth=textureLod(depthTexture,offset.xy,0.0).x;\n#endif\nfloat distSample=linearize_depth(sampleDepth,cameraNear,cameraFar);float distWorld=linearize_depth(offset.z,cameraNear,cameraFar);float rangeCheck=smoothstep(0.0,1.0,aoDistance/(aoDistance*abs(distSample-distWorld)));rangeCheck=pow(rangeCheck,distancePower);float weight=dot(sampleDirection,normal);occluded+=rangeCheck*weight*(distSample<distWorld ? 1.0 : 0.0);totalWeight+=weight;}float occ=clamp(1.0-occluded/totalWeight,0.0,1.0);\n#ifdef MODULATE_RED_CHANNEL\ngl_FragColor=vec4(occ,1.0,1.0,1.0);\n#else\ngl_FragColor=vec4(normal,occ);\n#endif\n}")}}const finalFragmentShader$1="#define GLSLIFY 1\nvarying vec2 vUv;uniform sampler2D depthTexture;uniform mat4 projectionViewMatrix;uniform int frame;uniform sampler2D blueNoiseTexture;uniform vec2 blueNoiseRepeat;uniform vec2 texSize;uniform float aoDistance;uniform float distancePower;uniform float bias;uniform float thickness;\n#include <packing>\n#include <hbao_utils>\nfloat getOcclusion(const vec3 cameraPosition,const vec3 worldPos,const vec3 worldNormal,const float depth,const int seed,inout float totalWeight){vec4 blueNoise=sampleBlueNoise(blueNoiseTexture,seed,blueNoiseRepeat,texSize);vec3 sampleWorldDir=cosineSampleHemisphere(worldNormal,blueNoise.rg);vec3 sampleWorldPos=worldPos+aoDistance*pow(blueNoise.b,distancePower+1.0)*sampleWorldDir;vec4 sampleUv=projectionViewMatrix*vec4(sampleWorldPos,1.);sampleUv.xy/=sampleUv.w;sampleUv.xy=sampleUv.xy*0.5+0.5;\n#if DepthValueSourceType == NORMAL_VECTOR_ALPHA\nfloat sampleDepth=textureLod(depthTexture,sampleUv.xy,0.0).a;\n#else\nfloat sampleDepth=textureLod(depthTexture,sampleUv.xy,0.0).r;\n#endif\nfloat deltaDepth=depth-sampleDepth;float d=distance(sampleWorldPos,cameraPosition);deltaDepth*=0.001*d*d;float th=thickness*0.01;float theta=dot(worldNormal,sampleWorldDir);totalWeight+=theta;if(deltaDepth<th){float horizon=sampleDepth+deltaDepth*bias*1000.;float occlusion=max(0.0,horizon-depth)*theta;float m=max(0.,1.-deltaDepth/th);occlusion=10.*occlusion*m/d;occlusion=sqrt(occlusion);return occlusion;}return 0.;}void main(){\n#if DepthValueSourceType == NORMAL_VECTOR_ALPHA\nfloat depth=textureLod(depthTexture,vUv,0.0).a;\n#else\nfloat depth=textureLod(depthTexture,vUv,0.0).r;\n#endif\nif(depth==1.0){discard;return;}vec4 cameraPosition=cameraMatrixWorld*vec4(0.0,0.0,0.0,1.0);vec3 worldPos=getWorldPos(depth,vUv);vec3 worldNormal=getWorldNormal(vUv);float ao=0.0,totalWeight=0.0;for(int i=0;i<spp;i++){int seed=i;\n#ifdef animatedNoise\nseed+=frame;\n#endif\nfloat occlusion=getOcclusion(cameraPosition.xyz,worldPos,worldNormal,depth,seed,totalWeight);ao+=occlusion;}if(totalWeight>0.)ao/=totalWeight;ao=clamp(1.-ao,0.,1.);\n#ifdef MODULATE_RED_CHANNEL\ngl_FragColor=vec4(ao,1.0,1.0,1.0);\n#else\ngl_FragColor=vec4(worldNormal,ao);\n#endif\n}".replace("#include <hbao_utils>","#define GLSLIFY 1\n#include <sampleBlueNoise>\nuniform sampler2D normalTexture;uniform float cameraNear;uniform float cameraFar;uniform mat4 projectionMatrixInverse;uniform mat4 cameraMatrixWorld;float getViewZ(const float depth){\n#ifdef PERSPECTIVE_CAMERA\nreturn perspectiveDepthToViewZ(depth,cameraNear,cameraFar);\n#else\nreturn orthographicDepthToViewZ(depth,cameraNear,cameraFar);\n#endif\n}vec3 getWorldPos(const float depth,const vec2 coord){float z=depth*2.0-1.0;vec4 clipSpacePosition=vec4(coord*2.0-1.0,z,1.0);vec4 viewSpacePosition=projectionMatrixInverse*clipSpacePosition;vec4 worldSpacePosition=cameraMatrixWorld*viewSpacePosition;worldSpacePosition.xyz/=worldSpacePosition.w;return worldSpacePosition.xyz;}vec3 slerp(const vec3 a,const vec3 b,const float t){float cosAngle=dot(a,b);float angle=acos(cosAngle);if(abs(angle)<0.001){return mix(a,b,t);}float sinAngle=sin(angle);float t1=sin((1.0-t)*angle)/sinAngle;float t2=sin(t*angle)/sinAngle;return(a*t1)+(b*t2);}vec3 computeWorldNormal(){vec2 size=vec2(textureSize(depthTexture,0));ivec2 p=ivec2(vUv*size);float c0=texelFetch(depthTexture,p,0).x;float l2=texelFetch(depthTexture,p-ivec2(2,0),0).x;float l1=texelFetch(depthTexture,p-ivec2(1,0),0).x;float r1=texelFetch(depthTexture,p+ivec2(1,0),0).x;float r2=texelFetch(depthTexture,p+ivec2(2,0),0).x;float b2=texelFetch(depthTexture,p-ivec2(0,2),0).x;float b1=texelFetch(depthTexture,p-ivec2(0,1),0).x;float t1=texelFetch(depthTexture,p+ivec2(0,1),0).x;float t2=texelFetch(depthTexture,p+ivec2(0,2),0).x;float dl=abs((2.0*l1-l2)-c0);float dr=abs((2.0*r1-r2)-c0);float db=abs((2.0*b1-b2)-c0);float dt=abs((2.0*t1-t2)-c0);vec3 ce=getWorldPos(c0,vUv).xyz;vec3 dpdx=(dl<dr)? ce-getWorldPos(l1,(vUv-vec2(1.0/size.x,0.0))).xyz:-ce+getWorldPos(r1,(vUv+vec2(1.0/size.x,0.0))).xyz;vec3 dpdy=(db<dt)? ce-getWorldPos(b1,(vUv-vec2(0.0,1.0/size.y))).xyz:-ce+getWorldPos(t1,(vUv+vec2(0.0,1.0/size.y))).xyz;return normalize(cross(dpdx,dpdy));}vec3 getWorldNormal(const vec2 uv){\n#ifdef useNormalTexture\n#if NormalVectorSourceType == FLOAT_BUFFER_NORMAL\nvec3 worldNormal=normalize(textureLod(normalTexture,uv,0.).rgb);\n#else\nvec3 worldNormal=unpackRGBToNormal(textureLod(normalTexture,uv,0.).rgb);\n#endif\nworldNormal=(vec4(worldNormal,1.)*viewMatrix).xyz;return normalize(worldNormal);\n#else\nreturn computeWorldNormal();\n#endif\n}\n#define PI 3.14159265358979323846264338327950288\nvec3 cosineSampleHemisphere(const vec3 n,const vec2 u){float r=sqrt(u.x);float theta=2.0*PI*u.y;vec3 b=normalize(cross(n,vec3(0.0,1.0,1.0)));vec3 t=cross(b,n);return normalize(r*sin(theta)*b+sqrt(1.0-u.x)*n+r*cos(theta)*t);}");class HBAOPass extends AOPass{constructor(e,t){super(e,t,finalFragmentShader$1)}}const finalFragmentShader="#define GLSLIFY 1\nvarying vec2 vUv;uniform sampler2D inputTexture;uniform sampler2D depthTexture;uniform sampler2D normalTexture;uniform mat4 projectionMatrixInverse;uniform mat4 cameraMatrixWorld;uniform float lumaPhi;uniform float depthPhi;uniform float normalPhi;uniform sampler2D blueNoiseTexture;uniform vec2 blueNoiseRepeat;uniform int index;uniform vec2 resolution;\n#include <common>\n#include <sampleBlueNoise>\nvec3 getWorldPos(float depth,vec2 coord){float z=depth*2.0-1.0;vec4 clipSpacePosition=vec4(coord*2.0-1.0,z,1.0);vec4 viewSpacePosition=projectionMatrixInverse*clipSpacePosition;vec4 worldSpacePosition=cameraMatrixWorld*viewSpacePosition;worldSpacePosition.xyz/=worldSpacePosition.w;return worldSpacePosition.xyz;}\n#ifdef RG_INPUT_TEXTURE\n#define luminance(a) (a.r * a.g)\n#else\n#define luminance(a) dot(vec3(0.2125, 0.7154, 0.0721), a)\n#endif\nvec3 getNormal(vec2 uv,vec4 texel){\n#ifdef NORMAL_IN_RGB\nreturn texel.rgb;\n#elif NormalVectorSourceType == FLOAT_BUFFER_NORMAL\nreturn normalize(textureLod(normalTexture,uv,0.).xyz);\n#elif NormalVectorSourceType == CONSTANT_Z\nreturn vec3(0.0,0.0,1.0);\n#else\nreturn normalize(textureLod(normalTexture,uv,0.).xyz*2.0-1.0);\n#endif\n}float distToPlane(const vec3 worldPos,const vec3 neighborWorldPos,const vec3 worldNormal){vec3 toCurrent=worldPos-neighborWorldPos;float distToPlane=abs(dot(toCurrent,worldNormal));return distToPlane;}void main(){\n#if DepthValueSourceType == NORMAL_VECTOR_ALPHA\nvec4 depthTexel=textureLod(normalTexture,vUv,0.).argb;\n#else\nvec4 depthTexel=textureLod(depthTexture,vUv,0.);\n#endif\nif(depthTexel.r==1.0||dot(depthTexel.rgb,depthTexel.rgb)==0.){discard;return;}vec4 texel=textureLod(inputTexture,vUv,0.0);vec3 normal=getNormal(vUv,texel);\n#ifdef NORMAL_IN_RGB\nfloat denoised=texel.a;float center=texel.a;\n#else\nvec3 denoised=texel.rgb;vec3 center=texel.rgb;\n#endif\nfloat depth=depthTexel.x;vec3 worldPos=getWorldPos(depth,vUv);float totalWeight=1.0;vec4 blueNoise=sampleBlueNoise(blueNoiseTexture,0,blueNoiseRepeat,resolution);float angle=blueNoise[index];float s=sin(angle),c=cos(angle);mat2 rotationMatrix=mat2(c,-s,s,c);for(int i=0;i<samples;i++){vec2 offset=rotationMatrix*poissonDisk[i];vec2 neighborUv=vUv+offset;vec4 neighborTexel=textureLod(inputTexture,neighborUv,0.0);vec3 neighborNormal=getNormal(neighborUv,neighborTexel);\n#ifdef NORMAL_IN_RGB\nfloat neighborColor=neighborTexel.a;\n#else\nvec3 neighborColor=neighborTexel.rgb;\n#endif\n#if DepthValueSourceType == NORMAL_VECTOR_ALPHA\nfloat sampleDepth=textureLod(depthTexture,neighborUv,0.0).a;\n#else\nfloat sampleDepth=textureLod(depthTexture,neighborUv,0.0).x;\n#endif\nvec3 worldPosSample=getWorldPos(sampleDepth,neighborUv);float tangentPlaneDist=abs(dot(worldPos-worldPosSample,normal));float normalDiff=dot(normal,neighborNormal);float normalSimilarity=pow(max(normalDiff,0.),normalPhi);\n#ifdef NORMAL_IN_RGB\nfloat lumaDiff=abs(neighborColor-center);\n#else\nfloat lumaDiff=abs(luminance(neighborColor)-luminance(center));\n#endif\nfloat lumaSimilarity=max(1.0-lumaDiff/lumaPhi,0.0);float depthDiff=1.-distToPlane(worldPos,worldPosSample,normal);float depthSimilarity=max(depthDiff/depthPhi,0.);float w=lumaSimilarity*depthSimilarity*normalSimilarity;denoised+=w*neighborColor;totalWeight+=w;}if(totalWeight>0.)denoised/=totalWeight;\n#ifdef NORMAL_IN_RGB\ngl_FragColor=vec4(normal,denoised);\n#else\ngl_FragColor=vec4(denoised,1.);\n#endif\n}".replace("#include <sampleBlueNoise>",sampleBlueNoise),defaultPoissonBlurOptions={iterations:1,radius:8,rings:5.625,lumaPhi:10,depthPhi:2,normalPhi:3.25,samples:16,normalTexture:null};class PoissionDenoisePass extends Pass{iterations=defaultPoissonBlurOptions.iterations;index=0;constructor(e,t,n,r=defaultPoissonBlurOptions){super("PoissionBlurPass"),r={...defaultPoissonBlurOptions,...r},this.inputTexture=t,this.fullscreenMaterial=new ShaderMaterial({fragmentShader:finalFragmentShader,vertexShader,uniforms:{depthTexture:{value:null},inputTexture:{value:null},projectionMatrixInverse:{value:new Matrix4},cameraMatrixWorld:{value:new Matrix4},lumaPhi:{value:5},depthPhi:{value:5},normalPhi:{value:5},resolution:{value:new Vector2},blueNoiseTexture:{value:null},index:{value:0},blueNoiseRepeat:{value:new Vector2}}});const a={type:HalfFloatType,depthBuffer:!1};this.renderTargetA=new WebGLRenderTarget(1,1,a),this.renderTargetB=new WebGLRenderTarget(1,1,a);const{uniforms:i}=this.fullscreenMaterial;i.inputTexture.value=this.inputTexture,i.depthTexture.value=n,i.projectionMatrixInverse.value=e.projectionMatrixInverse,i.cameraMatrixWorld.value=e.matrixWorld,i.depthPhi.value=r.depthPhi,i.normalPhi.value=r.normalPhi,r.normalTexture?i.normalTexture={value:r.normalTexture}:this.fullscreenMaterial.defines.NORMAL_IN_RGB="";for(const e of["radius","rings","samples"])Object.defineProperty(this,e,{get:()=>r[e],set:t=>{r[e]=t,this.setSize(this.renderTargetA.width,this.renderTargetA.height)}});(new TextureLoader).load(blueNoiseImage,e=>{e.minFilter=NearestFilter,e.magFilter=NearestFilter,e.wrapS=RepeatWrapping,e.wrapT=RepeatWrapping,e.colorSpace=NoColorSpace,this.fullscreenMaterial.uniforms.blueNoiseTexture.value=e})}setSize(e,t){this.renderTargetA.setSize(e,t),this.renderTargetB.setSize(e,t),this.fullscreenMaterial.uniforms.resolution.value.set(e,t);const n=function(e,t,n,r){const a=2*Math.PI*t/e,i=1/e,s=i,o=[];let l=i,d=0;for(let t=0;t<e;t++){const e=new Vector2(Math.cos(d),Math.sin(d)).multiplyScalar(Math.pow(l,.75)).multiply(r).multiplyScalar(n);o.push(e),l+=s,d+=a}return o}(this.samples,this.rings,this.radius,new Vector2(1/e,1/t)),r=`const int samples = ${this.samples};\n`,a=function(e){const t=e.length;let n="const vec2 poissonDisk[samples] = vec2[samples](\n";for(let r=0;r<t;r++){const a=e[r];n+=` vec2(${a.x}, ${a.y})`,r<t-1&&(n+=","),n+="\n"}return n+=");",n}(n);this.fullscreenMaterial.fragmentShader=r+a+"\n"+finalFragmentShader,this.fullscreenMaterial.needsUpdate=!0}get texture(){return this.renderTargetB.texture}render(e){this.fullscreenMaterial.uniforms.index.value=0;const t=this.fullscreenMaterial.uniforms.blueNoiseTexture.value;if(t){const{width:e,height:n}=t.source.data;this.fullscreenMaterial.uniforms.blueNoiseRepeat.value.set(this.renderTargetA.width/e,this.renderTargetA.height/n)}for(let t=0;t<2*this.iterations;t++){const n=t%2==0,r=n?this.renderTargetB:this.renderTargetA;this.fullscreenMaterial.uniforms.inputTexture.value=0===t?this.inputTexture:r.texture;const a=n?this.renderTargetA:this.renderTargetB;e.setRenderTarget(a),e.render(this.scene,this.camera),this.fullscreenMaterial.uniforms.index.value=(this.fullscreenMaterial.uniforms.index.value+1)%4}}}var NormalVectorSourceType,DepthValueSourceType;PoissionDenoisePass.DefaultOptions=defaultPoissonBlurOptions,function(e){e[e.INPUT_RGB_NORMAL=0]="INPUT_RGB_NORMAL",e[e.FLOAT_BUFFER_NORMAL=1]="FLOAT_BUFFER_NORMAL",e[e.CONSTANT_Z=2]="CONSTANT_Z"}(NormalVectorSourceType||(NormalVectorSourceType={})),function(e){e[e.SEPARATE_BUFFER=0]="SEPARATE_BUFFER",e[e.NORMAL_VECTOR_ALPHA=1]="NORMAL_VECTOR_ALPHA"}(DepthValueSourceType||(DepthValueSourceType={}));const defaultSSAOEffectParameters={resolutionScale:1,spp:16,distance:.25,distancePower:.25,power:2,bias:40,thickness:.075},defaultHBAOEffectParameters={resolutionScale:1,spp:16,distance:.25,distancePower:1,power:2,bias:20,thickness:.05},defaultPoisonDenoiseParameters={iterations:1,radius:10,rings:5.625,lumaPhi:10,depthPhi:12,normalPhi:3.25,samples:16};class SSAOEffect{get texture(){return this.ssaoPass?this.ssaoPass.texture:null}constructor(e,t,n){this.needsUpdate=!0,this.parameters={...defaultSSAOEffectParameters},this._width=0,this._height=0,this._loaded=!1,this._normalVectorSourceType=NormalVectorSourceType.FLOAT_BUFFER_NORMAL,this._depthValueSourceType=DepthValueSourceType.NORMAL_VECTOR_ALPHA,this._modulateRedChannel=!1,this.depthTexture=null,this.normalTexture=null,this._width=e,this._height=t,this._normalVectorSourceType=(null==n?void 0:n.normalVectorSourceType)||NormalVectorSourceType.FLOAT_BUFFER_NORMAL,this._depthValueSourceType=(null==n?void 0:n.depthValueSourceType)||DepthValueSourceType.NORMAL_VECTOR_ALPHA,this._modulateRedChannel=(null==n?void 0:n.modulateRedChannel)||!1,(null==n?void 0:n.ssaoParameters)&&(this.parameters=n.ssaoParameters),n&&this.updateParameters(n)}_getPass(e,t){if(!this.ssaoPass){this.ssaoPass=new SSAOPass(e,t);const n=this.ssaoPass.fullscreenMaterial;n.defines.useNormalTexture="",this._modulateRedChannel&&(n.blending=CustomBlending,n.blendEquation=MinEquation,n.blendEquationAlpha=null,n.blendSrc=OneFactor,n.blendSrcAlpha=null,n.blendDst=OneFactor,n.blendDstAlpha=null),n.onBeforeCompile=e=>{e.defines={...e.defines,FLOAT_BUFFER_NORMAL:NormalVectorSourceType.FLOAT_BUFFER_NORMAL,NormalVectorSourceType:this._normalVectorSourceType,NORMAL_VECTOR_ALPHA:DepthValueSourceType.NORMAL_VECTOR_ALPHA,DepthValueSourceType:this._depthValueSourceType,MODULATE_RED_CHANNEL:this._modulateRedChannel?"MODULATE_RED_CHANNEL":void 0}},this.needsUpdate=!0}return this.ssaoPass}dispose(){var e;null===(e=this.ssaoPass)||void 0===e||e.dispose()}setSize(e,t){var n;this._width=e,this._height=t,null===(n=this.ssaoPass)||void 0===n||n.setSize(e,t),this.needsUpdate=!0}updateParameters(e){for(let t in e)this.parameters.hasOwnProperty(t)&&(this.parameters[t]=e[t],this.needsUpdate=!0);e.depthTexture&&(this.depthTexture=e.depthTexture,this.needsUpdate=!0),e.normalTexture&&(this.normalTexture=e.normalTexture,this.needsUpdate=!0)}render(e,t,n,r){var a;this._loaded||null===(null===(a=this.ssaoPass)||void 0===a?void 0:a.fullscreenMaterial.uniforms.blueNoiseTexture.value)||(this._loaded=!0,this.needsUpdate=!0);const i=!this.ssaoPass,s=this._getPass(t,n);if(this.needsUpdate||i){if(this.needsUpdate=!1,s.fullscreenMaterial.uniforms.aoDistance.value=this.parameters.distance,s.fullscreenMaterial.uniforms.distancePower.value=this.parameters.distancePower,s.fullscreenMaterial.uniforms.bias.value=this.parameters.bias,s.fullscreenMaterial.uniforms.thickness.value=this.parameters.thickness,s.fullscreenMaterial.uniforms.power.value=this.parameters.power,s.fullscreenMaterial.uniforms.depthTexture.value=this._depthValueSourceType===DepthValueSourceType.NORMAL_VECTOR_ALPHA?this.normalTexture:this.depthTexture,s.fullscreenMaterial.uniforms.normalTexture.value=this.normalTexture,s.fullscreenMaterial.needsUpdate=!0,i){const e=Math.round(this.parameters.spp);s.fullscreenMaterial.defines.spp=e;const t=function(e){const t=[],n=Math.PI*(3-Math.sqrt(5)),r=2/e;for(let a=0;a<e;a++){const e=a*r-1+r/2,i=Math.sqrt(1-e*e),s=a*n;t.push(new Vector3(Math.cos(s)*i,e,Math.sin(s)*i))}return t}(e),n=[];for(let t=0;t<e;t++)n.push((t+1)/e);s.fullscreenMaterial.uniforms.samples={value:t},s.fullscreenMaterial.uniforms.samplesR={value:n}}s.setSize(this._width,this._height),s.renderToScreen=!1}s._camera=t,s.fullscreenMaterial.uniforms.viewMatrix.value=t.matrixWorldInverse,s.fullscreenMaterial.uniforms.projectionMatrixInverse.value=t.projectionMatrixInverse,s.fullscreenMaterial.uniforms.cameraMatrixWorld.value=t.matrixWorld;const o=e.getRenderTarget();r&&(s.renderTarget=r),s.render(e),e.setRenderTarget(o)}}class HBAOEffect{get texture(){return this.hbaoPass.texture}constructor(e,t,n){this.needsUpdate=!0,this.parameters={...defaultHBAOEffectParameters},this._width=0,this._height=0,this._loaded=!1,this._normalVectorSourceType=NormalVectorSourceType.FLOAT_BUFFER_NORMAL,this._depthValueSourceType=DepthValueSourceType.NORMAL_VECTOR_ALPHA,this._modulateRedChannel=!1,this.depthTexture=null,this.normalTexture=null,this._width=e,this._height=t,this._normalVectorSourceType=(null==n?void 0:n.normalVectorSourceType)||NormalVectorSourceType.FLOAT_BUFFER_NORMAL,this._depthValueSourceType=(null==n?void 0:n.depthValueSourceType)||DepthValueSourceType.NORMAL_VECTOR_ALPHA,this._modulateRedChannel=(null==n?void 0:n.modulateRedChannel)||!1,(null==n?void 0:n.hbaoParameters)&&(this.parameters=n.hbaoParameters),n&&this.updateParameters(n)}_getPass(e,t){if(!this.hbaoPass){this.hbaoPass=new HBAOPass(e,t);const n=this.hbaoPass.fullscreenMaterial;n.defines.useNormalTexture="",this._modulateRedChannel&&(n.blending=CustomBlending,n.blendEquation=MinEquation,n.blendEquationAlpha=null,n.blendSrc=OneFactor,n.blendSrcAlpha=null,n.blendDst=OneFactor,n.blendDstAlpha=null),n.onBeforeCompile=e=>{e.defines={...e.defines,FLOAT_BUFFER_NORMAL:NormalVectorSourceType.FLOAT_BUFFER_NORMAL,NormalVectorSourceType:this._normalVectorSourceType,NORMAL_VECTOR_ALPHA:DepthValueSourceType.NORMAL_VECTOR_ALPHA,DepthValueSourceType:this._depthValueSourceType,MODULATE_RED_CHANNEL:this._modulateRedChannel?"MODULATE_RED_CHANNEL":void 0}},this.needsUpdate=!0}return this.hbaoPass}dispose(){var e;null===(e=this.hbaoPass)||void 0===e||e.dispose()}setSize(e,t){var n;this._width=e,this._height=t,null===(n=this.hbaoPass)||void 0===n||n.setSize(e,t),this.needsUpdate=!0}updateParameters(e){for(let t in e)this.parameters.hasOwnProperty(t)&&(this.parameters[t]=e[t],this.needsUpdate=!0);e.depthTexture&&(this.depthTexture=e.depthTexture,this.needsUpdate=!0),e.normalTexture&&(this.normalTexture=e.normalTexture,this.needsUpdate=!0)}render(e,t,n,r){var a;this._loaded||null===(null===(a=this.hbaoPass)||void 0===a?void 0:a.fullscreenMaterial.uniforms.blueNoiseTexture.value)||(this._loaded=!0,this.needsUpdate=!0);const i=this._getPass(t,n);if(this.needsUpdate){this.needsUpdate=!1;const e=Math.round(this.parameters.spp);i.fullscreenMaterial.defines.spp=e,i.fullscreenMaterial.uniforms.aoDistance.value=this.parameters.distance,i.fullscreenMaterial.uniforms.distancePower.value=this.parameters.distancePower,i.fullscreenMaterial.uniforms.bias.value=this.parameters.bias,i.fullscreenMaterial.uniforms.thickness.value=this.parameters.thickness,i.fullscreenMaterial.uniforms.power.value=this.parameters.power,i.fullscreenMaterial.uniforms.depthTexture.value=this._depthValueSourceType===DepthValueSourceType.NORMAL_VECTOR_ALPHA?this.normalTexture:this.depthTexture,i.fullscreenMaterial.uniforms.normalTexture.value=this.normalTexture,i.fullscreenMaterial.needsUpdate=!0,i.setSize(this._width,this._height),i.renderToScreen=!1}i._camera=t,i.fullscreenMaterial.uniforms.viewMatrix.value=t.matrixWorldInverse,i.fullscreenMaterial.uniforms.projectionMatrixInverse.value=t.projectionMatrixInverse,i.fullscreenMaterial.uniforms.cameraMatrixWorld.value=t.matrixWorld;const s=e.getRenderTarget();r&&(i.renderTarget=r),i.render(e),e.setRenderTarget(s)}}class PoissonDenoiseEffect{get texture(){return this.denoisePass?this.denoisePass.texture:null}set inputTexture(e){this._inputTexture=e}constructor(e,t,n){this.needsUpdate=!0,this.parameters={...defaultPoisonDenoiseParameters},this._width=0,this._height=0,this._normalVectorSourceType=NormalVectorSourceType.FLOAT_BUFFER_NORMAL,this._depthValueSourceType=DepthValueSourceType.NORMAL_VECTOR_ALPHA,this._rgInputTexture=!0,this._inputTexture=null,this.depthTexture=null,this.normalTexture=null,this._width=e,this._height=t,this._normalVectorSourceType=(null==n?void 0:n.normalVectorSourceType)||NormalVectorSourceType.FLOAT_BUFFER_NORMAL,this._depthValueSourceType=(null==n?void 0:n.depthValueSourceType)||DepthValueSourceType.NORMAL_VECTOR_ALPHA,this._rgInputTexture=(null==n?void 0:n.rgInputTexture)||!0,this._inputTexture=(null==n?void 0:n.inputTexture)||null,this.depthTexture=(null==n?void 0:n.depthTexture)||null,this.normalTexture=(null==n?void 0:n.normalTexture)||null,n.poisonDenoiseParameters?this.parameters=n.poisonDenoiseParameters:n&&this.updateParameters(n)}_getPass(e){return this.denoisePass||(this.normalTexture?(this.denoisePass=new PoissionDenoisePass(e,this._inputTexture,this.depthTexture,{normalTexture:this.normalTexture}),this.denoisePass.fullscreenMaterial.onBeforeCompile=e=>{e.defines={...e.defines,FLOAT_BUFFER_NORMAL:NormalVectorSourceType.FLOAT_BUFFER_NORMAL,CONSTANT_Z:NormalVectorSourceType.CONSTANT_Z,NormalVectorSourceType:this._normalVectorSourceType,NORMAL_VECTOR_ALPHA:DepthValueSourceType.NORMAL_VECTOR_ALPHA,DepthValueSourceType:this._depthValueSourceType,RG_INPUT_TEXTURE:this._rgInputTexture?"RG_INPUT_TEXTURE":void 0}}):this.denoisePass=new PoissionDenoisePass(e,this._inputTexture,this.depthTexture),this.needsUpdate=!0),this.denoisePass}dispose(){var e;null===(e=this.denoisePass)||void 0===e||e.dispose()}setSize(e,t){var n;this._width=e,this._height=t,null===(n=this.denoisePass)||void 0===n||n.setSize(e,t),this.needsUpdate=!0}updateParameters(e){for(let t in e)this.parameters.hasOwnProperty(t)&&(this.parameters[t]=e[t],this.needsUpdate=!0);e.inputTexture&&(this._inputTexture=e.inputTexture,this.needsUpdate=!0),e.depthTexture&&(this.depthTexture=e.depthTexture,this.needsUpdate=!0),e.normalTexture&&(this.normalTexture=e.normalTexture,this.needsUpdate=!0)}render(e,t){const n=this._getPass(t);this.needsUpdate&&(this.needsUpdate=!1,n.iterations=this.parameters.iterations,n.samples=this.parameters.samples,n.rings=this.parameters.rings,n.radius=this.parameters.radius,n.fullscreenMaterial.uniforms.lumaPhi.value=this.parameters.lumaPhi,n.fullscreenMaterial.uniforms.depthPhi.value=this.parameters.depthPhi,n.fullscreenMaterial.uniforms.normalPhi.value=this.parameters.normalPhi,n.fullscreenMaterial.needsUpdate=!0,n.setSize(this._width,this._height),n.renderToScreen=!1,this.normalTexture?(n.fullscreenMaterial.uniforms.depthTexture.value=this._depthValueSourceType===DepthValueSourceType.NORMAL_VECTOR_ALPHA?this.normalTexture:this.depthTexture,n.fullscreenMaterial.uniforms.normalTexture.value=this.normalTexture):n.fullscreenMaterial.uniforms.depthTexture.value=this.depthTexture),n.inputTexture=this._inputTexture,n.fullscreenMaterial.uniforms.projectionMatrixInverse.value=t.projectionMatrixInverse,n.fullscreenMaterial.uniforms.cameraMatrixWorld.value=t.matrixWorld;const r=new Color$1;e.getClearColor(r);const a=e.getClearAlpha(),i=e.autoClear,s=e.getRenderTarget();e.autoClear=!0,e.setClearColor(16777215,1),e.setRenderTarget(this.denoisePass.renderTargetA),e.setRenderTarget(this.denoisePass.renderTargetB),e.clear(!0,!1,!1),n.render(e),e.setClearColor(r),e.setClearAlpha(a),e.setRenderTarget(s),e.autoClear=i}}var ShadowBlurType,AmbientOcclusionType;!function(e){e[e.OFF=0]="OFF",e[e.HARD=1]="HARD",e[e.POISSON=2]="POISSON",e[e.FULL=3]="FULL"}(ShadowBlurType||(ShadowBlurType={})),function(e){e[e.NONE=0]="NONE",e[e.SSAO=1]="SSAO",e[e.EffectsSSAO=2]="EffectsSSAO",e[e.EffectsHBAO=3]="EffectsHBAO"}(AmbientOcclusionType||(AmbientOcclusionType={}));const defaultShadowAndAoParameters={aoKernelRadius:.25,aoDepthBias:1e-4,aoMaxDistance:.5,aoMaxDepth:.99,aoFadeout:.5,shadowRadius:.05},defaultPassParameters={enabled:!0,aoType:AmbientOcclusionType.SSAO,aoIntensity:.5,shadowIntensity:.35,aoOnGround:!0,shadowOnGround:!1,alwaysUpdate:!1};class ShadowAndAoPass{get gBufferRenderTarget(){var e;return this._sharedGBufferRenderTarget?this._sharedGBufferRenderTarget:(this._gBufferRenderTarget=null!==(e=this._gBufferRenderTarget)&&void 0!==e?e:new GBufferRenderTargets(void 0,{_width:this._width,_height:this._height,_samples:this._samples,_renderPass:this._renderPass,textureFilter:NearestFilter}),this._gBufferRenderTarget)}get SSAOEffect(){return this._ssaoEffect||(this._ssaoEffect=new SSAOEffect(this._width,this._height,{normalVectorSourceType:this.gBufferRenderTarget.isFloatGBufferWithRgbNormalAlphaDepth?NormalVectorSourceType.FLOAT_BUFFER_NORMAL:NormalVectorSourceType.INPUT_RGB_NORMAL,depthValueSourceType:this.gBufferRenderTarget.isFloatGBufferWithRgbNormalAlphaDepth?DepthValueSourceType.NORMAL_VECTOR_ALPHA:DepthValueSourceType.SEPARATE_BUFFER,modulateRedChannel:!0,ssaoParameters:this.parameters.ssao})),this._ssaoEffect}get HBAOEffect(){return this._hbaoEffect||(this._hbaoEffect=new HBAOEffect(this._width,this._height,{normalVectorSourceType:this.gBufferRenderTarget.isFloatGBufferWithRgbNormalAlphaDepth?NormalVectorSourceType.FLOAT_BUFFER_NORMAL:NormalVectorSourceType.INPUT_RGB_NORMAL,depthValueSourceType:this.gBufferRenderTarget.isFloatGBufferWithRgbNormalAlphaDepth?DepthValueSourceType.NORMAL_VECTOR_ALPHA:DepthValueSourceType.SEPARATE_BUFFER,modulateRedChannel:!0,hbaoParameters:this.parameters.hbao})),this._hbaoEffect}get fadeRenderTarget(){var e;return this._fadeRenderTarget=null!==(e=this._fadeRenderTarget)&&void 0!==e?e:new WebGLRenderTarget(this._width,this._height,{format:RGFormat,magFilter:LinearFilter,minFilter:LinearFilter}),this._fadeRenderTarget}get denoisePass(){return this.poissonDenoiseEffect||(this.poissonDenoiseEffect=new PoissonDenoiseEffect(this._width,this._height,{inputTexture:this.shadowAndAoRenderTargets.passRenderTarget.texture,depthTexture:this.gBufferRenderTarget.depthBufferTexture,normalTexture:this.gBufferRenderTarget.gBufferTexture,normalVectorSourceType:this.gBufferRenderTarget.isFloatGBufferWithRgbNormalAlphaDepth?NormalVectorSourceType.FLOAT_BUFFER_NORMAL:NormalVectorSourceType.INPUT_RGB_NORMAL,depthValueSourceType:this.gBufferRenderTarget.isFloatGBufferWithRgbNormalAlphaDepth?DepthValueSourceType.NORMAL_VECTOR_ALPHA:DepthValueSourceType.SEPARATE_BUFFER,rgInputTexture:!0,poisonDenoiseParameters:this.parameters.poissonDenoise})),this.poissonDenoiseEffect}get denoiseRenderTargetTexture(){return this.denoisePass?this.denoisePass.texture:null}constructor(e,t,n,r){var a,i,s,o,l,d,h;this.needsUpdate=!0,this._renderPass=new RenderPass,this._cameraUpdate=new CameraUpdate,(null==r?void 0:r.gBufferRenderTarget)&&(this._sharedGBufferRenderTarget=null==r?void 0:r.gBufferRenderTarget),this._width=e,this._height=t,this._samples=n,this.shadowAndAoRenderTargets=new ShadowAndAoRenderTargets(this.gBufferRenderTarget,{...r,width:e,height:t,samples:n,_renderPass:this._renderPass}),this.parameters={enabled:null!==(a=null==r?void 0:r.enabled)&&void 0!==a?a:defaultPassParameters.enabled,aoType:null!==(i=null==r?void 0:r.aoType)&&void 0!==i?i:defaultPassParameters.aoType,aoIntensity:null!==(s=null==r?void 0:r.aoIntensity)&&void 0!==s?s:defaultPassParameters.aoIntensity,shadowIntensity:null!==(o=null==r?void 0:r.shadowIntensity)&&void 0!==o?o:defaultPassParameters.shadowIntensity,aoOnGround:null!==(l=null==r?void 0:r.aoOnGround)&&void 0!==l?l:defaultPassParameters.aoOnGround,shadowOnGround:null!==(d=null==r?void 0:r.shadowOnGround)&&void 0!==d?d:defaultPassParameters.shadowOnGround,alwaysUpdate:null!==(h=null==r?void 0:r.alwaysUpdate)&&void 0!==h?h:defaultPassParameters.alwaysUpdate,shAndAo:this.shadowAndAoRenderTargets.shadowAndAoParameters,ssao:{...defaultSSAOEffectParameters},hbao:{...defaultHBAOEffectParameters},poissonDenoise:{...defaultPoisonDenoiseParameters}},this._copyMaterial=new CopyTransformMaterial,this._blendMaterial=new CopyTransformMaterial({},CopyMaterialBlendMode.DEFAULT)}dispose(){var e,t,n,r,a,i,s;null===(e=this.gBufferRenderTarget)||void 0===e||e.dispose(),this.shadowAndAoRenderTargets.dispose(),null===(t=this._ssaoEffect)||void 0===t||t.dispose(),null===(n=this._hbaoEffect)||void 0===n||n.dispose(),null===(r=this._fadeRenderTarget)||void 0===r||r.dispose(),null===(a=this.poissonDenoiseEffect)||void 0===a||a.dispose(),null===(i=this._copyMaterial)||void 0===i||i.dispose(),null===(s=this._blendMaterial)||void 0===s||s.dispose()}setSize(e,t){var n,r,a,i,s;this._width=e,this._height=t,null===(n=this._gBufferRenderTarget)||void 0===n||n.setSize(e,t),this.shadowAndAoRenderTargets.setSize(e,t),null===(r=this._ssaoEffect)||void 0===r||r.setSize(e,t),null===(a=this._hbaoEffect)||void 0===a||a.setSize(e,t),null===(i=this._fadeRenderTarget)||void 0===i||i.setSize(e,t),null===(s=this.poissonDenoiseEffect)||void 0===s||s.setSize(this._width,this._height),this.needsUpdate=!0}updateParameters(e){void 0!==e.enabled&&(this.parameters.enabled=e.enabled),void 0!==e.aoType&&(this.parameters.aoType=e.aoType),void 0!==e.aoIntensity&&(this.parameters.aoIntensity=e.aoIntensity),void 0!==e.shadowIntensity&&(this.parameters.shadowIntensity=e.shadowIntensity),void 0!==e.aoOnGround&&(this.parameters.aoOnGround=e.aoOnGround),void 0!==e.shadowOnGround&&(this.parameters.shadowOnGround=e.shadowOnGround),void 0!==e.alwaysUpdate&&(this.parameters.alwaysUpdate=e.alwaysUpdate),this._updatePassParameters(e)}_updatePassParameters(e){var t,n,r;if(null==e?void 0:e.shAndAo)for(let t in e.shAndAo)this.parameters.shAndAo.hasOwnProperty(t)&&(this.parameters.shAndAo[t]=e.shAndAo[t],this.shadowAndAoRenderTargets.parametersNeedsUpdate=!0);(null==e?void 0:e.ssao)&&(null===(t=this._hbaoEffect)||void 0===t||t.updateParameters(null==e?void 0:e.hbao)),(null==e?void 0:e.hbao)&&(null===(n=this._ssaoEffect)||void 0===n||n.updateParameters(null==e?void 0:e.hbao)),(null==e?void 0:e.poissonDenoise)&&(null===(r=this.poissonDenoiseEffect)||void 0===r||r.updateParameters(null==e?void 0:e.poissonDenoise))}updateBounds(e,t){this.shadowAndAoRenderTargets.updateBounds(e,t)}render(e,t,n,r,a=ShadowBlurType.FULL,i=ShadowBlurType.FULL,s=0){if(!this._setRenderState())return;let o=!1;const l=i===ShadowBlurType.POISSON&&s>.001,d=i===ShadowBlurType.HARD&&s>.001&&s<.999,h=i===ShadowBlurType.HARD&&!d;!h&&a===ShadowBlurType.FULL&&this._evaluateIfUpdateIsNeeded(n)&&(this._renderShadowAndAo(e,t,n,r),o=!0);let c=h?r:this.denoiseRenderTargetTexture;l&&(c=this._renderDynamicShadow(e,this.shadowAndAoRenderTargets.passRenderTarget.texture,r,s),o=!0),o&&(c=this._renderDenoise(e,n,l)),d&&(c=this._renderDynamicShadow(e,this.denoiseRenderTargetTexture,r,s)),this._renderToTarget(e,c,h)}_setRenderState(){return this.shadowAndAoRenderTargets.aoEnabled=this.parameters.aoType===AmbientOcclusionType.SSAO,this.shadowAndAoRenderTargets.shadowEnabled=this.parameters.shadowIntensity>.01,!(!this.parameters.enabled||this.parameters.aoType===AmbientOcclusionType.NONE&&!this.shadowAndAoRenderTargets.shadowEnabled||(this.needsUpdate&&(this._ssaoEffect&&(this._ssaoEffect.needsUpdate=!0),this._hbaoEffect&&(this._hbaoEffect.needsUpdate=!0),this.poissonDenoiseEffect&&(this.poissonDenoiseEffect.needsUpdate=!0)),0))}_evaluateIfUpdateIsNeeded(e){e.updateProjectionMatrix();const t=this.parameters.alwaysUpdate||this.needsUpdate||null!=e&&this._cameraUpdate.changed(e);return this.needsUpdate=!1,t}_renderShadowAndAo(e,t,n,r){this.gBufferRenderTarget.render(e,t,n),this.shadowAndAoRenderTargets.render(e,n,r),this._renderAoEffect(e,t,n)}_renderAoEffect(e,t,n){if(this.parameters.aoType!==AmbientOcclusionType.EffectsSSAO&&this.parameters.aoType!==AmbientOcclusionType.EffectsHBAO)return;const r=this.gBufferRenderTarget.depthBufferTexture,a=this.gBufferRenderTarget.gBufferTexture,i=this.shadowAndAoRenderTargets.passRenderTarget,s=e.autoClear;switch(e.autoClear=!1,this.parameters.aoType){default:break;case AmbientOcclusionType.EffectsSSAO:{const s=this.SSAOEffect;s.depthTexture=r,s.normalTexture=a,s.render(e,n,t,i)}break;case AmbientOcclusionType.EffectsHBAO:{const s=this.HBAOEffect;s.depthTexture=r,s.normalTexture=a,s.render(e,n,t,i)}}e.autoClear=s}_renderDynamicShadow(e,t,n,r=1){const a=r<.999;return a&&(this._copyMaterial.update({texture:t,blending:NoBlending,colorTransform:DEFAULT_TRANSFORM,multiplyChannels:0}),this._renderPass.renderScreenSpace(e,this._copyMaterial,this.fadeRenderTarget)),r>.001&&(this._blendMaterial.update({texture:n,blending:a?CustomBlending:NoBlending,colorTransform:(new Matrix4).set(0,0,0,1,1,0,0,0,0,0,0,1,0,0,0,a?r:1),multiplyChannels:0}),this._renderPass.renderScreenSpace(e,this._blendMaterial,this.fadeRenderTarget)),this.fadeRenderTarget.texture}_renderDenoise(e,t,n){return this.denoisePass.inputTexture=n?this.fadeRenderTarget.texture:this.shadowAndAoRenderTargets.passRenderTarget.texture,this.denoisePass.render(e,t),this.denoisePass.texture}_renderToTarget(e,t,n){const r=n?this.parameters.shadowIntensity:this.parameters.aoIntensity,a=n?0:this.parameters.shadowIntensity;this._renderPass.renderScreenSpace(e,this._copyMaterial.update({texture:t,blending:CustomBlending,colorTransform:interpolationMatrix(r,a,0,1),multiplyChannels:1}),e.getRenderTarget())}}ShadowAndAoPass.shadowTransform=(new Matrix4).set(0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,1);class ShadowAndAoRenderTargets{get passRenderTarget(){var e;return this._passRenderTarget=null!==(e=this._passRenderTarget)&&void 0!==e?e:new WebGLRenderTarget(this._width,this._height,{samples:this._aoTargetSamples,format:RGFormat,magFilter:LinearFilter,minFilter:LinearFilter}),this._passRenderTarget}get passRenderMaterial(){var e;return this._passRenderMaterial=null!==(e=this._passRenderMaterial)&&void 0!==e?e:new ShadowAndAoRenderMaterial({normalTexture:this._depthAndNormalTextures.gBufferTexture,depthTexture:this._depthAndNormalTextures.depthBufferTexture,noiseTexture:this.noiseTexture,sampleKernel:this.sampleKernel,floatGBufferRgbNormalAlphaDepth:this._depthAndNormalTextures.isFloatGBufferWithRgbNormalAlphaDepth}),this._passRenderMaterial}get noiseTexture(){var e;return this._noiseTexture=null!==(e=this._noiseTexture)&&void 0!==e?e:(()=>{const e=new Uint8Array(64);for(let t=0;t<16;++t){const n=Math.floor(t/2)+t%2*8,r=2*Math.PI*n/16,a=new Vector3(Math.cos(r),Math.sin(r),0).normalize();e[4*t]=255*(.5*a.x+.5),e[4*t+1]=255*(.5*a.y+.5),e[4*t+2]=127,e[4*t+3]=0}const t=new DataTexture(e,4,4);return t.wrapS=RepeatWrapping,t.wrapT=RepeatWrapping,t.needsUpdate=!0,t})(),this._noiseTexture}get sampleKernel(){return this._sampleKernel.length||(this._sampleKernel=(e=>{const t=[];for(let n=0;n<e;n++){const r=n*Math.PI*(3-Math.sqrt(5)),a=.99-n/(e-1)*.8,i=Math.sqrt(1-a*a),s=Math.cos(r)*i,o=Math.sin(r)*i,l=8,d=Math.floor(e/l);let h=1-(Math.floor(n/l)+n%l*d)/e;h=MathUtils.lerp(.1,1,h*h),t.push(new Vector3(s*h,o*h,a*h))}return t})(ShadowAndAoRenderMaterial.kernelSize)),this._sampleKernel}constructor(e,t){var n,r,a,i;this.parametersNeedsUpdate=!0,this.aoEnabled=!0,this.shadowEnabled=!0,this._sceneBoxMin=new Vector3(-1,-1,-1),this._sceneBoxMax=new Vector3(1,1,1),this._shadowAndAoScale=1,this._aoTargetSamples=0,this._sampleKernel=[],this.shadowAndAoParameters=this._getShadowAndAoParameters(t),this._width=null!==(n=null==t?void 0:t._width)&&void 0!==n?n:1024,this._height=null!==(r=null==t?void 0:t._height)&&void 0!==r?r:1024,this._samples=null!==(a=null==t?void 0:t._samples)&&void 0!==a?a:0,this._depthAndNormalTextures=e,this._renderPass=null!==(i=null==t?void 0:t._renderPass)&&void 0!==i?i:new RenderPass}_getShadowAndAoParameters(e){return{...defaultShadowAndAoParameters,...e}}dispose(){var e,t,n;null===(e=this._noiseTexture)||void 0===e||e.dispose(),null===(t=this._passRenderMaterial)||void 0===t||t.dispose(),null===(n=this._passRenderTarget)||void 0===n||n.dispose()}setSize(e,t){var n;this._width=e,this._height=t,null===(n=this._passRenderMaterial)||void 0===n||n.update({_width:this._width,_height:this._height})}updateBounds(e,t){this._sceneBoxMin.copy(e.bounds.min),this._sceneBoxMax.copy(e.bounds.max),this._shadowAndAoScale=t,this.parametersNeedsUpdate=!0}render(e,t,n){this._renderPass.renderScreenSpace(e,this.updateSSAOMaterial(t,n),this.passRenderTarget),this.parametersNeedsUpdate=!1}updateSSAOMaterial(e,t){const n=this.passRenderMaterial;return n.updateDependencies({_width:this._width,_height:this._height,camera:e,shadowTexture:t,sceneBoxMin:this._sceneBoxMin,sceneBoxMax:this._sceneBoxMax}),this.parametersNeedsUpdate&&n.updateSettings({...this.shadowAndAoParameters,aoKernelRadius:this.shadowAndAoParameters.aoKernelRadius*this._shadowAndAoScale,aoMaxDistance:this.shadowAndAoParameters.aoMaxDistance*this._shadowAndAoScale,shadowRadius:this.shadowAndAoParameters.shadowRadius*this._shadowAndAoScale,aoIntensity:this.aoEnabled?1:0,shadowIntensity:this.shadowEnabled?1:0}),n}}class ShadowAndAoRenderMaterial extends ShaderMaterial{constructor(e){var t,n;super({defines:Object.assign({...ShadowAndAoRenderMaterial._shader.defines,KERNEL_SIZE:null!==(n=null===(t=null==e?void 0:e.sampleKernel)||void 0===t?void 0:t.length)&&void 0!==n?n:ShadowAndAoRenderMaterial.kernelSize,FLOAT_GBUFFER_RGB_NORMAL_ALPHA_DEPTH:(null==e?void 0:e.floatGBufferRgbNormalAlphaDepth)?1:0}),uniforms:UniformsUtils.clone(ShadowAndAoRenderMaterial._shader.uniforms),vertexShader:ShadowAndAoRenderMaterial._shader.vertexShader,fragmentShader:ShadowAndAoRenderMaterial._shader.fragmentShader,blending:NoBlending}),this.update(e)}update(e){return this.updateDependencies(e),this.updateSettings(e),this}updateDependencies(e){var t,n;if(void 0!==(null==e?void 0:e.shadowTexture)&&(this.uniforms.tShadow.value=null==e?void 0:e.shadowTexture),void 0!==(null==e?void 0:e.normalTexture)&&(this.uniforms.tNormal.value=null==e?void 0:e.normalTexture),void 0!==(null==e?void 0:e.depthTexture)&&(this.uniforms.tDepth.value=null==e?void 0:e.depthTexture),void 0!==(null==e?void 0:e.noiseTexture)&&(this.uniforms.tNoise.value=null==e?void 0:e.noiseTexture),(null==e?void 0:e._width)||(null==e?void 0:e._height)){const r=null!==(t=null==e?void 0:e._width)&&void 0!==t?t:this.uniforms.resolution.value.x,a=null!==(n=null==e?void 0:e._height)&&void 0!==n?n:this.uniforms.resolution.value.y;this.uniforms.resolution.value.set(r,a)}void 0!==(null==e?void 0:e.sampleKernel)&&(this.uniforms.sampleKernel.value=null==e?void 0:e.sampleKernel),void 0!==(null==e?void 0:e.sceneBoxMin)&&(this.uniforms.sceneBoxMin.value=null==e?void 0:e.sceneBoxMin),void 0!==(null==e?void 0:e.sceneBoxMax)&&(this.uniforms.sceneBoxMax.value=null==e?void 0:e.sceneBoxMax),this._updateCameraDependentUniforms(e)}_updateCameraDependentUniforms(e){if(void 0!==(null==e?void 0:e.camera)){const t=(null==e?void 0:e.camera)||(null==e?void 0:e.camera);this.uniforms.cameraNear.value=t.near,this.uniforms.cameraFar.value=t.far,this.uniforms.cameraProjectionMatrix.value.copy(t.projectionMatrix),this.uniforms.cameraInverseProjectionMatrix.value.copy(t.projectionMatrixInverse),this.uniforms.cameraWorldMatrix.value.copy(t.matrixWorld)}}updateSettings(e){void 0!==(null==e?void 0:e.aoKernelRadius)&&(this.uniforms.aoKernelRadius.value=null==e?void 0:e.aoKernelRadius),void 0!==(null==e?void 0:e.aoDepthBias)&&(this.uniforms.aoDepthBias.value=null==e?void 0:e.aoDepthBias),void 0!==(null==e?void 0:e.aoMaxDistance)&&(this.uniforms.aoMaxDistance.value=null==e?void 0:e.aoMaxDistance),void 0!==(null==e?void 0:e.aoMaxDepth)&&(this.uniforms.aoMaxDepth.value=null==e?void 0:e.aoMaxDepth),void 0!==(null==e?void 0:e.aoIntensity)&&(this.uniforms.aoIntensity.value=null==e?void 0:e.aoIntensity),void 0!==(null==e?void 0:e.aoFadeout)&&(this.uniforms.aoFadeout.value=null==e?void 0:e.aoFadeout),void 0!==(null==e?void 0:e.shadowRadius)&&(this.uniforms.shKernelRadius.value=null==e?void 0:e.shadowRadius),void 0!==(null==e?void 0:e.shadowIntensity)&&(this.uniforms.shIntensity.value=null==e?void 0:e.shadowIntensity)}}ShadowAndAoRenderMaterial.kernelSize=32,ShadowAndAoRenderMaterial._shader={uniforms:{tShadow:{value:null},tNormal:{value:null},tDepth:{value:null},tNoise:{value:null},sampleKernel:{value:null},cameraNear:{value:.1},cameraFar:{value:1},resolution:{value:new Vector2},cameraProjectionMatrix:{value:new Matrix4},cameraInverseProjectionMatrix:{value:new Matrix4},cameraWorldMatrix:{value:new Matrix4},aoKernelRadius:{value:.1},aoDepthBias:{value:.001},aoMaxDistance:{value:.05},aoMaxDepth:{value:.99},aoIntensity:{value:1},aoFadeout:{value:0},shKernelRadius:{value:.15},shIntensity:{value:1},sceneBoxMin:{value:new Vector3(-1,-1,-1)},sceneBoxMax:{value:new Vector3(1,1,1)}},defines:{PERSPECTIVE_CAMERA:1,KERNEL_SIZE:ShadowAndAoRenderMaterial.kernelSize,FLOAT_GBUFFER_RGB_NORMAL_ALPHA_DEPTH:0,NORMAL_VECTOR_ANTIALIAS:2},vertexShader:"varying vec2 vUv;\n void main() {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n }",fragmentShader:"uniform sampler2D tShadow;\n uniform sampler2D tNormal;\n#if FLOAT_GBUFFER_RGB_NORMAL_ALPHA_DEPTH != 1 \n uniform sampler2D tDepth;\n#endif \n uniform sampler2D tNoise;\n uniform vec3 sampleKernel[KERNEL_SIZE];\n uniform vec2 resolution;\n uniform float cameraNear;\n uniform float cameraFar;\n uniform mat4 cameraProjectionMatrix;\n uniform mat4 cameraInverseProjectionMatrix;\n uniform mat4 cameraWorldMatrix;\n uniform float aoKernelRadius;\n uniform float aoDepthBias; // avoid artifacts caused by neighbour fragments with minimal depth difference\n uniform float aoMaxDistance; // avoid the influence of fragments which are too far away\n uniform float aoMaxDepth;\n uniform float aoIntensity;\n uniform float aoFadeout;\n uniform float shKernelRadius;\n uniform float shIntensity;\n uniform vec3 sceneBoxMin;\n uniform vec3 sceneBoxMax;\n \n varying vec2 vUv;\n \n #include <packing>\n \n float getDepth(const in vec2 screenPosition) {\n #if FLOAT_GBUFFER_RGB_NORMAL_ALPHA_DEPTH == 1\n return texture2D(tNormal, screenPosition).w;\n #else \n return texture2D(tDepth, screenPosition).x;\n #endif\n }\n \n float getViewZ(const in float depth) {\n #if PERSPECTIVE_CAMERA == 1\n return perspectiveDepthToViewZ(depth, cameraNear, cameraFar);\n #else\n return orthographicDepthToViewZ(depth, cameraNear, cameraFar);\n #endif\n }\n \n vec3 getViewPosition(const in vec2 screenPosition, const in float depth) {\n vec4 clipSpacePosition = vec4(vec3(screenPosition, depth) * 2.0 - 1.0, 1.0);\n vec4 viewSpacePosition = cameraInverseProjectionMatrix * clipSpacePosition;\n return viewSpacePosition.xyz / viewSpacePosition.w;\n }\n\n vec3 getAntiAliasedViewNormal(const in vec2 screenPosition) {\n #if FLOAT_GBUFFER_RGB_NORMAL_ALPHA_DEPTH == 1\n #if NORMAL_VECTOR_ANTIALIAS == 1\n vec2 uv = screenPosition;\n vec2 size = vec2(textureSize(tNormal, 0));\n ivec2 p = ivec2(screenPosition * size);\n float c0 = texelFetch(tNormal, p, 0).a;\n float l2 = texelFetch(tNormal, p - ivec2(2, 0), 0).a;\n float l1 = texelFetch(tNormal, p - ivec2(1, 0), 0).a;\n float r1 = texelFetch(tNormal, p + ivec2(1, 0), 0).a;\n float r2 = texelFetch(tNormal, p + ivec2(2, 0), 0).a;\n float b2 = texelFetch(tNormal, p - ivec2(0, 2), 0).a;\n float b1 = texelFetch(tNormal, p - ivec2(0, 1), 0).a;\n float t1 = texelFetch(tNormal, p + ivec2(0, 1), 0).a;\n float t2 = texelFetch(tNormal, p + ivec2(0, 2), 0).a;\n float dl = abs((2.0 * l1 - l2) - c0);\n float dr = abs((2.0 * r1 - r2) - c0);\n float db = abs((2.0 * b1 - b2) - c0);\n float dt = abs((2.0 * t1 - t2) - c0);\n vec3 ce = getViewPosition(uv, c0).xyz;\n vec3 dpdx = (dl < dr) ? ce - getViewPosition((uv - vec2(1.0 / size.x, 0.0)), l1).xyz\n : -ce + getViewPosition((uv + vec2(1.0 / size.x, 0.0)), r1).xyz;\n vec3 dpdy = (db < dt) ? ce - getViewPosition((uv - vec2(0.0, 1.0 / size.y)), b1).xyz\n : -ce + getViewPosition((uv + vec2(0.0, 1.0 / size.y)), t1).xyz;\n return normalize(cross(dpdx, dpdy));\n #elif NORMAL_VECTOR_ANTIALIAS == 2\n vec2 size = vec2(textureSize(tNormal, 0));\n ivec2 p = ivec2(screenPosition * size);\n vec3 normalVector = texelFetch(tNormal, p, 0).xyz;\n normalVector += texelFetch(tNormal, p + ivec2(1, 0), 0).xyz;\n normalVector += texelFetch(tNormal, p - ivec2(1, 0), 0).xyz;\n normalVector += texelFetch(tNormal, p + ivec2(0, 1), 0).xyz;\n normalVector += texelFetch(tNormal, p - ivec2(0, 1), 0).xyz;\n return normalize(normalVector);\n #else\n return texture2D(tNormal, screenPosition).xyz;\n #endif\n #else\n return unpackRGBToNormal(texture2D(tNormal, screenPosition).xyz);\n #endif\n }\n\n vec3 getViewNormal(const in vec2 screenPosition) {\n #if FLOAT_GBUFFER_RGB_NORMAL_ALPHA_DEPTH == 1\n return texture2D(tNormal, screenPosition).xyz;\n #else\n return unpackRGBToNormal(texture2D(tNormal, screenPosition).xyz);\n #endif\n }\n \n void main() {\n \n float depth = getDepth(vUv);\n float viewZ = getViewZ(depth);\n \n vec3 viewPosition = getViewPosition(vUv, depth);\n vec3 viewNormal = getAntiAliasedViewNormal(vUv);\n vec3 worldPosition = (cameraWorldMatrix * vec4(viewPosition, 1.0)).xyz;\n float boxDistance = length(max(vec3(0.0), max(sceneBoxMin - worldPosition, worldPosition - sceneBoxMax)));\n \n vec2 noiseScale = resolution.xy / 4.0;\n vec3 random = texture2D(tNoise, vUv * noiseScale).xyz * 2.0 - 1.0;\n \n // compute matrix used to reorient a kernel vector\n vec3 tangent = normalize(random - viewNormal * dot(random, viewNormal));\n vec3 bitangent = cross(viewNormal, tangent);\n mat3 kernelMatrix = mat3(tangent, bitangent, viewNormal);\n \n float aoOcclusion = 0.0;\n float shOcclusion = texture2D(tShadow, vUv).r;\n float shSamples = 0.0;\n if (aoIntensity >= 0.01 && boxDistance < aoMaxDistance && length(viewNormal) > 0.01) {\n for (int i = 0; i < KERNEL_SIZE; i ++) {\n vec3 aoSampleVector = kernelMatrix * sampleKernel[i]; \n vec3 aoSamplePoint = viewPosition + aoSampleVector * aoKernelRadius; \n vec4 aoSamplePointNDC = cameraProjectionMatrix * vec4(aoSamplePoint, 1.0); \n aoSamplePointNDC /= aoSamplePointNDC.w;\n vec2 aoSamplePointUv = aoSamplePointNDC.xy * 0.5 + 0.5;\n float aoRealSampleDepth = getDepth(aoSamplePointUv);\n float aoSampleDeltaZ = getViewZ(aoRealSampleDepth) - aoSamplePoint.z;\n float aoRealDeltaZ = viewZ - aoSamplePoint.z;\n float w_long = clamp((aoMaxDistance - max(aoRealDeltaZ, aoSampleDeltaZ)) / aoMaxDistance, 0.0, 1.0);\n float w_lat = clamp(1.0 - length(aoSampleVector.xy), 0.0, 1.0);\n aoOcclusion +=\n step(aoRealSampleDepth, aoMaxDepth) * \n step(aoDepthBias, aoSampleDeltaZ / (cameraFar - cameraNear)) * \n step(aoSampleDeltaZ, aoMaxDistance) * mix(1.0, w_long * w_lat, aoFadeout);\n }\n }\n if (shIntensity >= 0.01 && length(viewNormal) > 0.01) {\n for (int i = 0; i < KERNEL_SIZE; i ++) {\n vec3 shSampleVector = kernelMatrix * sampleKernel[i]; // reorient sample vector in view space\n vec3 shSamplePoint = viewPosition + shSampleVector * shKernelRadius; // calculate sample point\n vec4 shSamplePointNDC = cameraProjectionMatrix * vec4(shSamplePoint, 1.0); // project point and calculate NDC\n shSamplePointNDC /= shSamplePointNDC.w;\n vec2 shSamplePointUv = shSamplePointNDC.xy * 0.5 + 0.5; // compute uv coordinates\n vec3 shSampleNormal = getViewNormal(shSamplePointUv);\n float shDeltaZ = getViewZ(getDepth(shSamplePointUv)) - shSamplePoint.z;\n float w = step(abs(shDeltaZ), shKernelRadius) * max(0.0, dot(shSampleNormal, viewNormal));\n shSamples += w;\n shOcclusion += texture2D(tShadow, shSamplePointUv).r * w;\n }\n }\n \n aoOcclusion = clamp(aoOcclusion / float(KERNEL_SIZE) * (1.0 + aoFadeout), 0.0, 1.0);\n aoOcclusion = 1.0 - aoOcclusion * clamp(1.0 - boxDistance / aoMaxDistance, 0.0, 1.0);\n shOcclusion = clamp(shOcclusion / (shSamples + 1.0), 0.0, 1.0);\n gl_FragColor = vec4(aoOcclusion, shOcclusion, 0.0, 1.0);\n }"};class GroundReflectionPass{get reflectionRenderTarget(){var e;return this._reflectionRenderTarget=null!==(e=this._reflectionRenderTarget)&&void 0!==e?e:this._newRenderTarget(!0),this._reflectionRenderTarget}get intensityRenderTarget(){var e;return this._intensityRenderTarget=null!==(e=this._intensityRenderTarget)&&void 0!==e?e:this._newRenderTarget(!1),this._intensityRenderTarget}get blurRenderTarget(){var e;return this._blurRenderTarget=null!==(e=this._blurRenderTarget)&&void 0!==e?e:this._newRenderTarget(!1),this._blurRenderTarget}constructor(e,t,n){var r;this._width=e,this._height=t,this.parameters={enabled:!1,intensity:.25,fadeOutDistance:1,fadeOutExponent:4,brightness:1,blurHorizontal:3,blurVertical:6,blurAscent:0,groundLevel:0,groundReflectionScale:1,renderTargetDownScale:4,...n},this._copyMaterial=new CopyTransformMaterial({}),this._updateCopyMaterial(null),this._reflectionIntensityMaterial=new GroundReflectionIntensityMaterial({_width:this._width/this.parameters.renderTargetDownScale,_height:this._height/this.parameters.renderTargetDownScale}),this._blurPass=new BlurPass(BlurShader,n),this._renderPass=null!==(r=null==n?void 0:n._renderPass)&&void 0!==r?r:new RenderPass}_newRenderTarget(e){const t=this._width/this.parameters.renderTargetDownScale,n=this._height/this.parameters.renderTargetDownScale;let r={};if(e){const e=new DepthTexture(t,n);e.format=DepthStencilFormat,e.type=UnsignedInt248Type,r.minFilter=NearestFilter,r.magFilter=NearestFilter,r.depthTexture=e}else r.samples=1;return new WebGLRenderTarget(t,n,{format:RGBAFormat,...r})}dispose(){var e,t,n;null===(e=this._reflectionRenderTarget)||void 0===e||e.dispose(),null===(t=this._intensityRenderTarget)||void 0===t||t.dispose(),null===(n=this._blurRenderTarget)||void 0===n||n.dispose(),this._copyMaterial.dispose()}setSize(e,t){var n,r,a,i;this._width=e,this._height=t,null===(n=this._reflectionRenderTarget)||void 0===n||n.setSize(this._width/this.parameters.renderTargetDownScale,this._height/this.parameters.renderTargetDownScale),null===(r=this._intensityRenderTarget)||void 0===r||r.setSize(this._width/this.parameters.renderTargetDownScale,this._height/this.parameters.renderTargetDownScale),null===(a=this._blurRenderTarget)||void 0===a||a.setSize(this._width/this.parameters.renderTargetDownScale,this._height/this.parameters.renderTargetDownScale),null===(i=this._reflectionIntensityMaterial)||void 0===i||i.update({_width:this._width/this.parameters.renderTargetDownScale,_height:this._height/this.parameters.renderTargetDownScale})}updateParameters(e){for(let t in e)this.parameters.hasOwnProperty(t)&&(this.parameters[t]=e[t])}updateBounds(e,t){this.parameters.groundLevel=e,this.parameters.groundReflectionScale=t}_updateCopyMaterial(e,t=1){var n;const r=this.parameters.intensity*t,a=this.parameters.brightness;this._copyMaterial.update({texture:null!==(n=null==e?void 0:e.texture)&&void 0!==n?n:void 0,colorTransform:(new Matrix4).set(a,0,0,0,0,a,0,0,0,0,a,0,0,0,0,r),multiplyChannels:0,uvTransform:FLIP_Y_UV_TRANSFORM}),this._copyMaterial.depthTest=!0,this._copyMaterial.depthWrite=!1}render(e,t,n,r=1){if(!(this.parameters.enabled&&n instanceof PerspectiveCamera))return;const a=this._createGroundReflectionCamera(n);this._renderGroundReflection(e,t,a,this.reflectionRenderTarget),this._renderGroundReflectionIntensity(e,a,this.intensityRenderTarget),(this.parameters.blurHorizontal>0||this.parameters.blurVertical>0)&&this.blurReflection(e,n,[this.intensityRenderTarget,this.blurRenderTarget,this.intensityRenderTarget]),this._updateCopyMaterial(this.intensityRenderTarget,r),this._renderPass.renderScreenSpace(e,this._copyMaterial,e.getRenderTarget())}_renderGroundReflection(e,t,n,r){const a=e.getRenderTarget();r&&e.setRenderTarget(r),e.render(t,n),r&&e.setRenderTarget(a)}_renderGroundReflectionIntensity(e,t,n){const r=e.getRenderTarget();e.setRenderTarget(n),this._renderPass.renderScreenSpace(e,this._reflectionIntensityMaterial.update({texture:this.reflectionRenderTarget.texture,depthTexture:this.reflectionRenderTarget.depthTexture,camera:t,groundLevel:this.parameters.groundLevel,fadeOutDistance:this.parameters.fadeOutDistance*this.parameters.groundReflectionScale,fadeOutExponent:this.parameters.fadeOutExponent}),e.getRenderTarget()),e.setRenderTarget(r)}blurReflection(e,t,n){const r=new Vector3(t.matrixWorld.elements[4],t.matrixWorld.elements[5],t.matrixWorld.elements[6]),a=this.parameters.blurHorizontal/this._width,i=this.parameters.blurVertical/this._height*Math.abs(r.dot(new Vector3(0,0,1)));this._blurPass.render(e,n,[4*a,4*i],[4*a*(1+this.parameters.blurAscent),4*i*(1+this.parameters.blurAscent)])}_createGroundReflectionCamera(e){const t=e.clone(),n=t;return n._offset&&(n._offset={left:n._offset.left,top:1-n._offset.bottom,right:n._offset.right,bottom:1-n._offset.top}),t.position.set(e.position.x,-e.position.y+2*this.parameters.groundLevel,e.position.z),t.rotation.set(-e.rotation.x,e.rotation.y,-e.rotation.z),t.updateMatrixWorld(),t.updateProjectionMatrix(),t}}class GroundReflectionIntensityMaterial extends ShaderMaterial{constructor(e){super({defines:Object.assign({},GroundReflectionIntensityMaterial.shader.defines),uniforms:UniformsUtils.clone(GroundReflectionIntensityMaterial.shader.uniforms),vertexShader:GroundReflectionIntensityMaterial.shader.vertexShader,fragmentShader:GroundReflectionIntensityMaterial.shader.fragmentShader,blending:NoBlending}),this.update(e)}update(e){var t,n;if(void 0!==(null==e?void 0:e.texture)&&(this.uniforms.tDiffuse.value=null==e?void 0:e.texture),void 0!==(null==e?void 0:e.depthTexture)&&(this.uniforms.tDepth.value=null==e?void 0:e.depthTexture),(null==e?void 0:e._width)||(null==e?void 0:e._height)){const r=null!==(t=null==e?void 0:e._width)&&void 0!==t?t:this.uniforms.resolution.value.x,a=null!==(n=null==e?void 0:e._height)&&void 0!==n?n:this.uniforms.resolution.value.y;this.uniforms.resolution.value.set(r,a)}if(void 0!==(null==e?void 0:e.camera)){const t=(null==e?void 0:e.camera)||(null==e?void 0:e.camera);this.uniforms.cameraNear.value=t.near,this.uniforms.cameraFar.value=t.far,this.uniforms.cameraProjectionMatrix.value.copy(t.projectionMatrix),this.uniforms.cameraInverseProjectionMatrix.value.copy(t.projectionMatrixInverse),this.uniforms.inverseViewMatrix.value.copy(t.matrixWorld)}return void 0!==(null==e?void 0:e.groundLevel)&&(this.uniforms.groundLevel.value=null==e?void 0:e.groundLevel),void 0!==(null==e?void 0:e.fadeOutDistance)&&(this.uniforms.fadeOutDistance.value=null==e?void 0:e.fadeOutDistance),void 0!==(null==e?void 0:e.fadeOutExponent)&&(this.uniforms.fadeOutExponent.value=null==e?void 0:e.fadeOutExponent),this}}GroundReflectionIntensityMaterial.shader={uniforms:{tDiffuse:{value:null},tDepth:{value:null},resolution:{value:new Vector2},cameraNear:{value:.1},cameraFar:{value:1},cameraProjectionMatrix:{value:new Matrix4},cameraInverseProjectionMatrix:{value:new Matrix4},inverseViewMatrix:{value:new Matrix4},groundLevel:{value:0},fadeOutDistance:{value:1},fadeOutExponent:{value:1}},defines:{PERSPECTIVE_CAMERA:1,LINEAR_TO_SRGB:1},vertexShader:"\n varying vec2 vUv;\n void main() {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n }",fragmentShader:"\n uniform sampler2D tDiffuse;\n uniform sampler2D tDepth;\n uniform vec2 resolution;\n uniform float cameraNear;\n uniform float cameraFar;\n uniform mat4 cameraProjectionMatrix;\n uniform mat4 cameraInverseProjectionMatrix;\n uniform mat4 inverseViewMatrix;\n uniform float groundLevel;\n uniform float fadeOutDistance;\n uniform float fadeOutExponent;\n varying vec2 vUv;\n\n #include <packing>\n\n float getDepth(const in vec2 screenPosition) {\n return texture2D(tDepth, screenPosition).x;\n }\n\n float getLinearDepth(const in vec2 screenPosition) {\n #if PERSPECTIVE_CAMERA == 1\n float fragCoordZ = texture2D(tDepth, screenPosition).x;\n float viewZ = perspectiveDepthToViewZ(fragCoordZ, cameraNear, cameraFar);\n return viewZToOrthographicDepth(viewZ, cameraNear, cameraFar);\n #else\n return texture2D(tDepth, screenPosition).x;\n #endif\n }\n\n float getViewZ(const in float depth) {\n #if PERSPECTIVE_CAMERA == 1\n return perspectiveDepthToViewZ(depth, cameraNear, cameraFar);\n #else\n return 0.0;//orthographicDepthToViewZ(depth, cameraNear, cameraFar);\n #endif\n }\n\n vec3 getViewPosition(const in vec2 screenPosition, const in float depth, const in float viewZ ) {\n float clipW = cameraProjectionMatrix[2][3] * viewZ + cameraProjectionMatrix[3][3];\n vec4 clipPosition = vec4((vec3(screenPosition, depth) - 0.5) * 2.0, 1.0);\n clipPosition *= clipW;\n return (cameraInverseProjectionMatrix * clipPosition).xyz;\n }\n\n void main() {\n float verticalBias = 1.5 / resolution.y;\n vec2 uv = vUv.xy + vec2(0.0, verticalBias);\n float depth = getDepth(uv);\n float viewZ = getViewZ(depth);\n vec4 worldPosition = inverseViewMatrix * vec4(getViewPosition(uv, depth, viewZ), 1.0);\n float distance = worldPosition.y - groundLevel;\n vec4 fragColor = texture2D(tDiffuse, uv).rgba;\n #if LINEAR_TO_SRGB == 1\n fragColor.rgb = mix(fragColor.rgb * 12.92, 1.055 * pow(fragColor.rgb, vec3(0.41666)) - 0.055, step(0.0031308, fragColor.rgb));\n #endif\n float fadeOutAlpha = pow(clamp(1.0 - distance / fadeOutDistance, 0.0, 1.0), fadeOutExponent);\n fragColor.a *= fadeOutAlpha;\n gl_FragColor = fragColor * step(depth, 0.9999);\n }"};const sphereToEquirectangular=e=>{const t=Math.atan2(e.y,e.x)/(2*Math.PI)+.5,n=Math.asin(e.z)/Math.PI+.5;return new Vector2(t,n)};class TextureConverter{get colorRenderTarget(){var e;return this._colorRenderTarget=null!==(e=this._colorRenderTarget)&&void 0!==e?e:new WebGLRenderTarget,this._colorRenderTarget}get environmentMapDecodeTarget(){var e;return this._environmentMapDecodeTarget=null!==(e=this._environmentMapDecodeTarget)&&void 0!==e?e:new WebGLRenderTarget,this._environmentMapDecodeTarget}environmentMapDecodeMaterial(e){var t,n;return e?(this._equirectangularDecodeMaterial=null!==(t=this._equirectangularDecodeMaterial)&&void 0!==t?t:new EnvironmentMapDecodeMaterial(!0,!1),this._equirectangularDecodeMaterial):(this._pmremDecodeMaterial=null!==(n=this._pmremDecodeMaterial)&&void 0!==n?n:new EnvironmentMapDecodeMaterial(!1,!1),this._pmremDecodeMaterial)}get camera(){var e;return this._camera=null!==(e=this._camera)&&void 0!==e?e:new OrthographicCamera(-1,1,1,-1,-1,1),this._camera}scaleTexture(e,t,n,r){var a;this.colorRenderTarget.setSize(n,r),this._planeMesh=null!==(a=this._planeMesh)&&void 0!==a?a:new Mesh(new PlaneGeometry(2,2),new MeshBasicMaterial({map:t}));const i=e.getRenderTarget();e.setRenderTarget(this.colorRenderTarget),e.render(this._planeMesh,this.camera),e.setRenderTarget(i);const s=this.environmentMapDecodeTarget.texture,o=new Uint8Array(n*r*4);return e.readRenderTargetPixels(this.colorRenderTarget,0,0,n,r,o),{texture:s,pixels:o}}newGrayscaleTexture(e,t,n,r){var a;const i=this.environmentMapDecodeMaterial("PMREM.cubeUv"===t.name);this.environmentMapDecodeTarget.setSize(n,r),i.setSourceTexture(t),this._planeMesh=null!==(a=this._planeMesh)&&void 0!==a?a:new Mesh(new PlaneGeometry(2,2),i);const s=e.getRenderTarget();e.setRenderTarget(this.environmentMapDecodeTarget),e.render(this._planeMesh,this.camera),e.setRenderTarget(s);const o=this.environmentMapDecodeTarget.texture,l=new Uint8Array(n*r*4);return e.readRenderTargetPixels(this.environmentMapDecodeTarget,0,0,n,r,l),{texture:o,pixels:l}}}const EnvironmentMapDecodeShader_uniforms={tDiffuse:{value:null}};class EnvironmentMapDecodeMaterial extends ShaderMaterial{constructor(e,t){super({uniforms:UniformsUtils.clone(EnvironmentMapDecodeShader_uniforms),vertexShader:"\n varying vec2 vUv;\n void main() {\n vUv = uv;\n gl_Position = (projectionMatrix * modelViewMatrix * vec4(position, 1.0)).xyww;\n }",fragmentShader:"\n uniform sampler2D tDiffuse;\n varying vec2 vUv;\n \n float getFace( vec3 direction ) {\n vec3 absDirection = abs( direction );\n float face = - 1.0;\n if ( absDirection.x > absDirection.z ) {\n if ( absDirection.x > absDirection.y )\n face = direction.x > 0.0 ? 0.0 : 3.0;\n else\n face = direction.y > 0.0 ? 1.0 : 4.0;\n } else {\n if ( absDirection.z > absDirection.y )\n face = direction.z > 0.0 ? 2.0 : 5.0;\n else\n face = direction.y > 0.0 ? 1.0 : 4.0;\n }\n return face;\n }\n\n vec2 getUV( vec3 direction, float face ) {\n vec2 uv;\n if ( face == 0.0 ) {\n uv = vec2( direction.z, direction.y ) / abs( direction.x ); // pos x\n } else if ( face == 1.0 ) {\n uv = vec2( - direction.x, - direction.z ) / abs( direction.y ); // pos y\n } else if ( face == 2.0 ) {\n uv = vec2( - direction.x, direction.y ) / abs( direction.z ); // pos z\n } else if ( face == 3.0 ) {\n uv = vec2( - direction.z, direction.y ) / abs( direction.x ); // neg x\n } else if ( face == 4.0 ) {\n uv = vec2( - direction.x, direction.z ) / abs( direction.y ); // neg y\n } else {\n uv = vec2( direction.x, direction.y ) / abs( direction.z ); // neg z\n }\n return 0.5 * ( uv + 1.0 );\n }\n\n void main() {\n #if PMREM_DECODE == 1\n float altitude = (vUv.y - 0.5) * 3.141593;\n float azimuth = vUv.x * 2.0 * 3.141593;\n vec3 direction = vec3(\n cos(altitude) * cos(azimuth) * -1.0, \n sin(altitude), \n cos(altitude) * sin(azimuth) * -1.0\n );\n float face = getFace(direction);\n vec2 uv = getUV(direction, face) / vec2(3.0, 4.0);\n if (face > 2.5) {\n uv.y += 0.25;\n face -= 3.0;\n }\n uv.x += face / 3.0;\n vec4 color = texture2D(tDiffuse, uv);\n #else\n vec4 color = texture2D(tDiffuse, vUv);\n #endif \n #if GRAYSCALE_CONVERT == 1\n float grayscale = dot(color.rgb, vec3(0.2126, 0.7152, 0.0722));\n //float grayscale = dot(color.rgb, vec3(1.0/3.0));\n gl_FragColor = vec4(vec3(grayscale), 1.0);\n #else\n gl_FragColor = vec4(color.rgb, 1.0);\n #endif\n }",defines:{PMREM_DECODE:e?1:0,GRAYSCALE_CONVERT:t?1:0}})}setSourceTexture(e){this.uniforms.tDiffuse.value=e}}class LightSourceDetector{constructor(e){var t,n,r,a;this.samplePoints=[],this.sampleUVs=[],this.grayscaleTexture={texture:new Texture,pixels:new Uint8Array(0)},this.detectorTexture=new Texture,this.detectorArray=new Float32Array(0),this.lightSamples=[],this.lightGraph=new LightGraph(0),this.lightSources=[],this._createEquirectangularSamplePoints=e=>{const t=[];for(let n=0;n<e;n++){const r=n*Math.PI*(3-Math.sqrt(5)),a=1-n/(e-1)*2,i=Math.sqrt(1-a*a),s=Math.cos(r)*i,o=Math.sin(r)*i;t.push(new Vector3(s,o,a))}return t},this._numberOfSamples=null!==(t=null==e?void 0:e._numberOfSamples)&&void 0!==t?t:1e3,this._width=null!==(n=null==e?void 0:e._width)&&void 0!==n?n:1024,this._height=null!==(r=null==e?void 0:e._height)&&void 0!==r?r:512,this._sampleThreshold=null!==(a=null==e?void 0:e._sampleThreshold)&&void 0!==a?a:.707,this.pointDistance=Math.sqrt(4*Math.PI)/Math.sqrt(this._numberOfSamples),this.pixelDistance=Math.sqrt(2)*Math.PI*2/this._width,this.samplePoints=this._createEquirectangularSamplePoints(this._numberOfSamples),this.sampleUVs=this.samplePoints.map(e=>sphereToEquirectangular(e))}detectLightSources(e,t,n){var r;this.textureData=n,this._textureConverter=null!==(r=this._textureConverter)&&void 0!==r?r:new TextureConverter,this.grayscaleTexture=this._textureConverter.newGrayscaleTexture(e,t,this._width,this._height),this.detectorArray=this._redFromRgbaToNormalizedFloatArray(this.grayscaleTexture.pixels),this.detectorTexture=this._grayscaleTextureFromFloatArray(this.detectorArray,this._width,this._height),this.lightSamples=this._filterLightSamples(this._sampleThreshold),this.lightGraph=this._findClusterSegments(this.lightSamples,this._sampleThreshold),this.lightGraph.findConnectedComponents(),this.lightSources=this.createLightSourcesFromLightGraph(this.lightSamples,this.lightGraph),this.lightSources.sort((e,t)=>t.maxIntensity-e.maxIntensity)}_redFromRgbaToNormalizedFloatArray(e,t){const n=new Float32Array(e.length/4);let r=1,a=0;for(let t=0;t<e.length/4;++t){const i=e[4*t]/255;r=Math.min(r,i),a=Math.max(a,i),n[t]=i}if(t)for(let e=0;e<n.length;++e){const i=(n[e]-r)/(a-r);n[e]=Math.pow(i,t)}else for(let e=0;e<n.length;++e)n[e]=(n[e]-r)/(a-r);return n}_grayscaleTextureFromFloatArray(e,t,n){const r=t*n,a=new Uint8Array(4*r);for(let t=0;t<r;t++){const n=255*e[t];a[4*t+0]=n,a[4*t+1]=n,a[4*t+2]=n,a[4*t+3]=255}const i=new DataTexture(a,t,n);return i.needsUpdate=!0,i}_filterLightSamples(e){const t=[];for(let n=0;n<this.sampleUVs.length;n++){const r=this.sampleUVs[n];this._detectorTextureLuminanceValueFromUV(r)>e&&t.push(new LightSample(this.samplePoints[n],r))}return t}_detectorTextureLuminanceValueFromUV(e){const t=Math.floor(e.x*this._width),n=Math.floor(e.y*this._height)*this._width+t;return this.detectorArray[n]}_originalLuminanceValueFromUV(e){if(!(this.textureData&&this.textureData.data&&this.textureData._width&&this.textureData._height))return 256*this._detectorTextureLuminanceValueFromUV(e);const t=Math.floor(e.x*this.textureData._width),n=Math.floor(e.y*this.textureData._height);let r=0;for(let e=Math.max(0,t-2);e<Math.max(0,t+2);++e)for(let t=Math.max(0,n-2);t<Math.max(0,n+2);++t){const n=t*this.textureData._width+e,a=(this.textureData.data[4*n]+this.textureData.data[4*n+1]+this.textureData.data[4*n+2])/3;r=Math.max(r,a)}return r}_findClusterSegments(e,t){const n=2*this.pixelDistance,r=1.5*this.pointDistance,a=new LightGraph(e.length);for(let i=0;i<e.length;i++)for(let s=i+1;s<e.length;s++)if(e[i].position.angleTo(e[s].position)<r){const r=e[s].position.clone().sub(e[i].position),o=Math.floor(r.length()/n);let l=!0,d=0;for(let n=1;n<o;n++){const a=r.clone().multiplyScalar(n/o),s=sphereToEquirectangular(e[i].position.clone().add(a).normalize());if(this._detectorTextureLuminanceValueFromUV(s)<t){if(d++,d>1){l=!1;break}}else d=0}l&&(a.adjacent[i].push(s),a.adjacent[s].push(i),a.edges.push([i,s]))}return a}createLightSourcesFromLightGraph(e,t){const n=t.components.filter(e=>e.length>1).map(t=>new LightSource(t.map(t=>e[t])));return n.forEach(e=>e.calculateLightSourceProperties(e=>this._originalLuminanceValueFromUV(e))),n}}class LightSample{constructor(e,t){this.position=e,this.uv=t}}class LightGraph{constructor(e){this.edges=[],this.adjacent=[],this.components=[],this.noOfNodes=e;for(let t=0;t<e;t++)this.adjacent.push([])}findConnectedComponents(){const e=new Array(this.noOfNodes).fill(!1);this.components=[];for(let t=0;t<this.noOfNodes;t++)if(!e[t]){const n=[];this._dfs(t,e,n),this.components.push(n)}this.components.sort((e,t)=>t.length-e.length)}_dfs(e,t,n){t[e]=!0,n.push(e);for(const r of this.adjacent[e])t[r]||this._dfs(r,t,n)}}class LightSource{constructor(e){this.position=new Vector3,this.uv=new Vector2,this.averageIntensity=0,this.maxIntensity=0,this.size=0,this.lightSamples=e}calculateLightSourceProperties(e){this.position=new Vector3,this.averageIntensity=0,this.maxIntensity=0;for(const t of this.lightSamples){this.position.add(t.position);const n=e(t.uv);this.averageIntensity+=n,this.maxIntensity=Math.max(this.maxIntensity,n)}this.averageIntensity/=this.lightSamples.length,this.position.normalize(),this.uv=sphereToEquirectangular(this.position);let t=0;for(const e of this.lightSamples)t+=e.position.distanceTo(this.position);t/=this.lightSamples.length,this.size=t/Math.PI}}class DebugPass{constructor(e){this.grayMaterial=MaterialCreator.createMeshStandardMaterial({color:12632256,side:DoubleSide,envMapIntensity:.4}),this._renderPass=new RenderPass,this._sceneRenderer=e,this._environmentMapDecodeMaterial=new EnvironmentMapDecodeMaterial(!0,!1),this._environmentMapDecodeMaterial.blending=NoBlending,this._environmentMapDecodeMaterial.depthTest=!1}get _gBufferRenderTarget(){return this._sceneRenderer.gBufferRenderTarget}get _screenSpaceShadow(){return this._sceneRenderer.screenSpaceShadow}get _shadowAndAoPass(){return this._sceneRenderer.shadowAndAoPass}get _groundReflectionPass(){return this._sceneRenderer.groundReflectionPass}get _bakedGroundContactShadow(){return this._sceneRenderer.bakedGroundContactShadow}dispose(){var e,t;null===(e=this._depthRenderMaterial)||void 0===e||e.dispose(),null===(t=this._copyMaterial)||void 0===t||t.dispose(),this.grayMaterial.dispose()}getCopyMaterial(e){var t;return this._copyMaterial=null!==(t=this._copyMaterial)&&void 0!==t?t:new CopyTransformMaterial,this._copyMaterial.update(e)}_getDepthRenderMaterial(e){var t;return this._depthRenderMaterial=null!==(t=this._depthRenderMaterial)&&void 0!==t?t:new LinearDepthRenderMaterial({depthTexture:this._gBufferRenderTarget.textureWithDepthValue,depthFilter:this._gBufferRenderTarget.isFloatGBufferWithRgbNormalAlphaDepth?new Vector4(0,0,0,1):new Vector4(1,0,0,0)}),this._depthRenderMaterial.update({camera:e})}render(e,t,n,r,a,i,s){e(r,a,i),"color"!==s?("grayscale"===s?this._sceneRenderer.renderCacheManager.render("debug",a,()=>{this._renderPass.renderWithOverrideMaterial(r,a,i,this.grayMaterial,null,0,1)}):t(r,a,i),n(r,a,i),this._renderDebugPass(r,a,i,s)):r.render(a,i)}_renderDebugPass(e,t,n,r){var a,i,s,o,l,d;switch(r){default:break;case"lineardepth":this._renderPass.renderScreenSpace(e,this._getDepthRenderMaterial(n),null);break;case"g-normal":this._gBufferRenderTarget.isFloatGBufferWithRgbNormalAlphaDepth?this._renderPass.renderScreenSpace(e,this.getCopyMaterial({texture:null===(a=this._gBufferRenderTarget)||void 0===a?void 0:a.gBufferTexture,blending:NoBlending,colorTransform:(new Matrix4).set(.5,0,0,0,0,.5,0,0,0,0,.5,0,0,0,0,0),colorBase:new Vector4(.5,.5,.5,1),multiplyChannels:0,uvTransform:DEFAULT_UV_TRANSFORM}),null):this._renderPass.renderScreenSpace(e,this.getCopyMaterial({texture:null===(i=this._gBufferRenderTarget)||void 0===i?void 0:i.gBufferTexture,blending:NoBlending,colorTransform:RGB_TRANSFORM,colorBase:ALPHA_RGBA,multiplyChannels:0,uvTransform:DEFAULT_UV_TRANSFORM}),null);break;case"g-depth":this._gBufferRenderTarget.isFloatGBufferWithRgbNormalAlphaDepth?this._renderPass.renderScreenSpace(e,this.getCopyMaterial({texture:null===(s=this._gBufferRenderTarget)||void 0===s?void 0:s.gBufferTexture,blending:NoBlending,colorTransform:ALPHA_TRANSFORM,colorBase:ALPHA_RGBA,multiplyChannels:0,uvTransform:DEFAULT_UV_TRANSFORM}),null):this._renderPass.renderScreenSpace(e,this.getCopyMaterial({texture:null===(o=this._gBufferRenderTarget)||void 0===o?void 0:o.depthBufferTexture,blending:NoBlending,colorTransform:RED_TRANSFORM,colorBase:ALPHA_RGBA,multiplyChannels:0,uvTransform:DEFAULT_UV_TRANSFORM}),null);break;case"ssao":this._renderPass.renderScreenSpace(e,this.getCopyMaterial({texture:this._shadowAndAoPass.shadowAndAoRenderTargets.passRenderTarget.texture,blending:NoBlending,colorTransform:GRAYSCALE_TRANSFORM,colorBase:ZERO_RGBA,multiplyChannels:0,uvTransform:DEFAULT_UV_TRANSFORM}),null);break;case"ssaodenoise":this._renderPass.renderScreenSpace(e,this.getCopyMaterial({texture:this._shadowAndAoPass.denoiseRenderTargetTexture,blending:NoBlending,colorTransform:GRAYSCALE_TRANSFORM,colorBase:ZERO_RGBA,multiplyChannels:0,uvTransform:DEFAULT_UV_TRANSFORM}),null);break;case"shadowmap":this._renderPass.renderScreenSpace(e,this.getCopyMaterial({texture:this._screenSpaceShadow.shadowTexture,blending:NoBlending,colorTransform:GRAYSCALE_TRANSFORM,colorBase:ZERO_RGBA,multiplyChannels:0,uvTransform:DEFAULT_UV_TRANSFORM}),null);break;case"shadow":this._renderPass.renderScreenSpace(e,this.getCopyMaterial({texture:this._shadowAndAoPass.shadowAndAoRenderTargets.passRenderTarget.texture,blending:NoBlending,colorTransform:ShadowAndAoPass.shadowTransform,colorBase:ZERO_RGBA,multiplyChannels:0,uvTransform:DEFAULT_UV_TRANSFORM}),null);break;case"shadowblur":this._renderPass.renderScreenSpace(e,this.getCopyMaterial({texture:this._shadowAndAoPass.denoiseRenderTargetTexture,blending:NoBlending,colorTransform:ShadowAndAoPass.shadowTransform,colorBase:ZERO_RGBA,multiplyChannels:0,uvTransform:DEFAULT_UV_TRANSFORM}),null);break;case"shadowfadein":this._renderPass.renderScreenSpace(e,this.getCopyMaterial({texture:this._shadowAndAoPass.fadeRenderTarget.texture,blending:NoBlending,colorTransform:ShadowAndAoPass.shadowTransform,colorBase:ZERO_RGBA,multiplyChannels:0,uvTransform:DEFAULT_UV_TRANSFORM}),null);break;case"shadowandao":this._renderPass.renderScreenSpace(e,this.getCopyMaterial({texture:this._shadowAndAoPass.denoiseRenderTargetTexture,blending:NoBlending,colorTransform:interpolationMatrix(this._shadowAndAoPass.parameters.aoIntensity,this._shadowAndAoPass.parameters.shadowIntensity,0,1),colorBase:ZERO_RGBA,multiplyChannels:1,uvTransform:DEFAULT_UV_TRANSFORM}),null);break;case"groundreflection":this._renderPass.renderScreenSpace(e,this.getCopyMaterial({texture:this._groundReflectionPass.reflectionRenderTarget.texture,blending:NoBlending,colorTransform:DEFAULT_TRANSFORM,colorBase:ZERO_RGBA,multiplyChannels:0,uvTransform:FLIP_Y_UV_TRANSFORM}),null);break;case"bakedgroundshadow":this._renderPass.renderScreenSpace(e,this.getCopyMaterial({texture:this._bakedGroundContactShadow.renderTarget.texture,blending:NoBlending,colorTransform:DEFAULT_TRANSFORM,colorBase:ZERO_RGBA,multiplyChannels:0,uvTransform:DEFAULT_UV_TRANSFORM}),null);break;case"environmentmap":this._environmentMapDecodeMaterial.setSourceTexture(t.environment),this._renderPass.renderScreenSpace(e,this._environmentMapDecodeMaterial,null);break;case"lightsourcedetection":if(null===(l=t.userData)||void 0===l?void 0:l.environmentDefinition){const n=this._sceneRenderer.width/this._sceneRenderer.height,r=new OrthographicCamera(-1,1,1/n,-1/n,-1,1),a=null===(d=t.userData)||void 0===d?void 0:d.environmentDefinition.createDebugScene(e,t);a.background=new Color$1(16777215),e.render(a,r)}}}}var QualityLevel;!function(e){e[e.HIGHEST=0]="HIGHEST",e[e.HIGH=1]="HIGH",e[e.MEDIUM=2]="MEDIUM",e[e.LOW=3]="LOW"}(QualityLevel||(QualityLevel={}));class SceneRenderer{constructor(e,t,n){this.debugOutput="off",this._prevDebugOutput="off",this.outputColorSpace="",this.toneMapping="",this.environmentLights=!1,this.movingCamera=!1,this.groundLevel=0,this.uiInteractionMode=!1,this._noUpdateNeededCount=0,this._cameraUpdate=new CameraUpdate,this.width=0,this.height=0,this._maxSamples=1,this._cameraChanged=!0,this.boundingVolume=new SceneVolume,this._boundingVolumeSet=!1,this.renderCacheManager=new RenderCacheManager,this._renderPass=new RenderPass,this.selectedObjects=[],this.groundGroup=new Group,this._qualityLevel=QualityLevel.HIGHEST,this._qualityMap=new Map,this.width=t,this.height=n,this._maxSamples=e.capabilities.maxSamples,this.renderer=e,this.renderCacheManager.registerCache("inivisibleGround",new VisibilityRenderCache(e=>e===this.groundGroup)),this.renderCacheManager.registerCache("debug",new VisibilityRenderCache),this.renderCacheManager.registerCache("floorDepthWrite",new DepthWriteRenderCache(e=>{var t;return null===(t=e.userData)||void 0===t?void 0:t.isFloor})),this.gBufferRenderTarget=new GBufferRenderTargets(this.renderCacheManager,{shared:!0,capabilities:e.capabilities,width:this.width,height:this.height,samples:1,_renderPass:this._renderPass,textureFilter:NearestFilter}),this.shadowAndAoPass=new ShadowAndAoPass(this.width,this.height,1,{gBufferRenderTarget:this.gBufferRenderTarget}),this.screenSpaceShadow=new ScreenSpaceShadowMap(this.renderCacheManager,new Vector2(this.width,this.height),{samples:this._maxSamples,alwaysUpdate:!1}),this.groundReflectionPass=new GroundReflectionPass(this.width,this.height,{_renderPass:this._renderPass}),this.bakedGroundContactShadow=new BakedGroundContactShadow(this.renderer,this.groundGroup,{_renderPass:this._renderPass,renderCacheManager:this.renderCacheManager}),this.groundGroup.rotateX(-Math.PI/2),this.outlineRenderer=new OutLineRenderer(null,this.width,this.height,{gBufferRenderTarget:this.gBufferRenderTarget}),this.parameters={gBufferRenderTargetParameters:this.gBufferRenderTarget.parameters,bakedGroundContactShadowParameters:this.bakedGroundContactShadow.parameters,screenSpaceShadowMapParameters:this.screenSpaceShadow.parameters,shAndAoPassParameters:this.shadowAndAoPass.parameters,groundReflectionParameters:this.groundReflectionPass.parameters,outlineParameters:this.outlineRenderer.parameters,effectSuspendFrames:0,effectFadeInFrames:0,suspendGroundReflection:!1,shadowOnCameraChange:ShadowBlurType.OFF},this._addEventListeners(this.renderer)}_addEventListeners(e){e.domElement.addEventListener("webglcontextlost",()=>{}),e.domElement.addEventListener("webglcontextrestored",()=>{this._forceEnvironmentMapUpdate(this.renderer)})}dispose(){var e,t;null===(e=this._debugPass)||void 0===e||e.dispose(),null===(t=this._copyMaterial)||void 0===t||t.dispose(),this.gBufferRenderTarget.dispose(),this.screenSpaceShadow.dispose(),this.shadowAndAoPass.dispose(),this.outlineRenderer.dispose(),this.renderer.dispose()}setSize(e,t){this.width=e,this.height=t,this.gBufferRenderTarget.setSize(e,t),this.screenSpaceShadow.setSize(e,t),this.shadowAndAoPass.setSize(e,t),this.outlineRenderer.setSize(e,t),this.groundReflectionPass.setSize(e,t),this.renderer.setSize(e,t)}getQualityLevel(){return this._qualityLevel}setQualityLevel(e){this._qualityLevel!==e&&(this._qualityMap.has(this._qualityLevel)&&(this._qualityLevel=e),this.applyCurrentParameters())}setQualityMap(e){this._qualityMap=e,this.applyCurrentParameters()}applyCurrentParameters(){this._qualityMap.has(this._qualityLevel)&&(this.updateParameters(this._qualityMap.get(this._qualityLevel)),this.bakedGroundContactShadow.applyParameters()),this.uiInteractionMode&&this.updateParameters({groundReflectionParameters:{enabled:!1}})}forceShadowUpdates(e){this.renderCacheManager.clearCache(),this.gBufferRenderTarget.needsUpdate=!0,this.screenSpaceShadow.forceShadowUpdate(),this.shadowAndAoPass.needsUpdate=!0,e&&(this.bakedGroundContactShadow.needsUpdate=!0)}updateParameters(e){void 0!==e.shAndAoPassParameters&&this.shadowAndAoPass.updateParameters(e.shAndAoPassParameters),void 0!==e.effectParameters&&this.shadowAndAoPass.updateParameters({effectParameters:e.effectParameters}),void 0!==e.bakedGroundContactShadowParameters&&this.bakedGroundContactShadow.updateParameters(e.bakedGroundContactShadowParameters),void 0!==e.screenSpaceShadowMapParameters&&this.screenSpaceShadow.updateParameters(e.screenSpaceShadowMapParameters),void 0!==e.groundReflectionParameters&&this.groundReflectionPass.updateParameters(e.groundReflectionParameters),void 0!==e.outlineParameters&&this.outlineRenderer.updateParameters(e.outlineParameters),void 0!==e.effectSuspendFrames&&(this.parameters.effectSuspendFrames=e.effectSuspendFrames),void 0!==e.effectFadeInFrames&&(this.parameters.effectFadeInFrames=e.effectFadeInFrames),void 0!==e.suspendGroundReflection&&(this.parameters.suspendGroundReflection=e.suspendGroundReflection),void 0!==e.shadowOnCameraChange&&(this.parameters.shadowOnCameraChange=e.shadowOnCameraChange)}addRectAreaLight(e,t){this.environmentLights=!1,this.screenSpaceShadow.addRectAreaLight(e,t),this.shadowAndAoPass.needsUpdate=!0}updateRectAreaLights(e,t){e.length>0&&(this.environmentLights=!1),this.screenSpaceShadow.updateRectAreaLights(e,t),this.shadowAndAoPass.needsUpdate=!0}createShadowFromLightSources(e,t){this.environmentLights=!0,this.screenSpaceShadow.createShadowFromLightSources(e,t),this.shadowAndAoPass.needsUpdate=!0}selectObjects(e){this.selectedObjects=e}updateBounds(e,t){this.renderCacheManager.clearCache(),this._boundingVolumeSet=!0,this.boundingVolume.updateFromBox(e);const n=this.boundingVolume.size,r=(n.x+n.y+n.z)/3,a=Math.min(n.x,n.y,n.z),i=Math.max(n.x,n.y,n.z),s=a<.5?a/.5:n.z>5?n.z/5:1;this.bakedGroundContactShadow.setScale(t?r:s,r),this.groundReflectionPass.updateBounds(this.groundLevel,Math.min(1,i)),this.screenSpaceShadow.updateBounds(this.boundingVolume,r),this.shadowAndAoPass.updateBounds(this.boundingVolume,t?r:Math.min(1,2*i))}updateNearAndFarPlaneOfPerspectiveCamera(e,t){const n=this.boundingVolume.getNearAndFarForPerspectiveCamera(e.position,3);e.near=Math.max(1e-5,.9*n[0]),e.far=Math.max(null!=t?t:e.near,n[1]),e.updateProjectionMatrix()}_setRenderState(e,t){var n;const r=this.debugOutput!==this._prevDebugOutput;this._prevDebugOutput=this.debugOutput,this.screenSpaceShadow.parameters.alwaysUpdate=this.shadowAndAoPass.parameters.alwaysUpdate,this._cameraChanged=this._cameraUpdate.changed(t),(n=this.gBufferRenderTarget).needsUpdate||(n.needsUpdate=this._cameraChanged||r)}_forceEnvironmentMapUpdate(e){const t=e.userData;if(null==t?void 0:t.environmentTexture){const e=t.environmentTexture;t.environmentTexture=void 0,e.dispose()}}_updateEnvironment(e,t){var n,r;if(!(null===(n=t.userData)||void 0===n?void 0:n.environmentDefinition))return;e.userData||(e.userData={});const a=e.userData;if(a&&((null===(r=t.userData)||void 0===r?void 0:r.environmentDefinition.needsUpdate)||!a.environmentTexture||a.environmentDefinition!==t.userData.environmentDefinition)){const n=t.userData.environmentDefinition;a.environmentDefinition=n,a.environmentTexture=n.createNewEnvironment(e),t.userData.shadowFromEnvironment&&this.createShadowFromLightSources(t,n.lightSources)}t.environment=null==a?void 0:a.environmentTexture,t.userData.showEnvironmentBackground?t.background=t.environment:t.background===t.environment&&(t.background=null)}render(e,t){e.add(this.groundGroup),this._setRenderState(e,t),this._updateEnvironment(this.renderer,e),this.outlineRenderer.updateOutline(e,t,this.movingCamera?[]:this.selectedObjects),this.renderer.setRenderTarget(null),this.debugOutput&&""!==this.debugOutput&&"off"!==this.debugOutput?this._renderDebug(this.renderer,e,t):(this.renderPreRenderPasses(this.renderer,e,t),this._renderScene(this.renderer,e,t),this.renderPostProcessingEffects(this.renderer,e,t)),e.remove(this.groundGroup)}_renderDebug(e,t,n){var r;this._debugPass=null!==(r=this._debugPass)&&void 0!==r?r:new DebugPass(this),this._debugPass.render((e,t,n)=>this.renderPreRenderPasses(e,t,n),(e,t,n)=>this._renderScene(e,t,n),(e,t,n)=>this.renderPostProcessingEffects(e,t,n),e,t,n,this.debugOutput)}renderPreRenderPasses(e,t,n){this._renderGroundContactShadow(t)}_renderScene(e,t,n){this.renderCacheManager.onBeforeRender("floorDepthWrite",t),this.bakedGroundContactShadow.setGroundVisibility(!0,n),e.render(t,n),this.bakedGroundContactShadow.setGroundVisibility(!1,n),this.renderCacheManager.onAfterRender("floorDepthWrite")}renderPostProcessingEffects(e,t,n){this.renderShadowAndAo(e,t,n),this._renderOutline()}_renderGroundContactShadow(e){this.bakedGroundContactShadow.needsUpdate&&this.bakedGroundContactShadow.updateBounds(this.boundingVolume,this.groundLevel),this.bakedGroundContactShadow.render(e)}renderShadowAndAo(e,t,n){const r=this._evaluateIfShadowAndAoUpdateIsNeeded(n);if(r.needsUpdate||r.shadowOnCameraChange!==ShadowBlurType.OFF){if(!this.parameters.suspendGroundReflection||r.needsUpdate){const a=this.parameters.suspendGroundReflection?r.intensityScale:1;this._renderGroundReflection(e,t,n,a)}this.gBufferRenderTarget.needsUpdate=r.needsUpdate||r.shadowOnCameraChange===ShadowBlurType.POISSON,this._renderEffectsWithGround(e,t,n),this._renderEffectsWithoutGround(e,t,n),this.shadowAndAoPass.render(e,t,n,this.screenSpaceShadow.shadowTexture,r.needsUpdate?ShadowBlurType.FULL:r.shadowOnCameraChange,r.shadowOnCameraChange,1-r.intensityScale)}}_evaluateIfShadowAndAoUpdateIsNeeded(e){const t=this.shadowAndAoPass.parameters.alwaysUpdate||this.screenSpaceShadow.needsUpdate||this.screenSpaceShadow.shadowTypeNeedsUpdate;let n=(this.shadowAndAoPass.parameters.enabled||this.groundReflectionPass.parameters.enabled)&&(0===this.parameters.effectSuspendFrames||this._cameraChanged);n&&(this._noUpdateNeededCount=0);let r=1;return!t&&this.parameters.effectSuspendFrames>0&&(this._noUpdateNeededCount++,n=this._noUpdateNeededCount>=this.parameters.effectSuspendFrames,r=Math.max(0,Math.min(1,(this._noUpdateNeededCount-this.parameters.effectSuspendFrames)/this.parameters.effectFadeInFrames))),n=t||n,{needsUpdate:n,shadowOnCameraChange:!n||r<.99?this.parameters.shadowOnCameraChange:ShadowBlurType.OFF,intensityScale:r}}_renderGroundReflection(e,t,n,r=1){this.groundReflectionPass.parameters.enabled&&this.renderCacheManager.render("inivisibleGround",t,()=>{this.groundReflectionPass.render(e,t,n,r)})}_renderEffectsWithGround(e,t,n){const r=this._boundingVolumeSet&&this.shadowAndAoPass.parameters.aoOnGround,a=this.shadowAndAoPass.parameters.shadowIntensity>0&&this._boundingVolumeSet&&this.shadowAndAoPass.parameters.shadowOnGround,i=this.bakedGroundContactShadow.shadowGroundPlane;if(r){const r=null===this.bakedGroundContactShadow.parameters.hardLayers;r&&i.setDepthWrite(!0),this.gBufferRenderTarget.render(e,t,n),r&&i.setDepthWrite(!1)}a&&(i.setReceiveShadow(!0),this.screenSpaceShadow.renderShadowMap(e,t,n),i.setReceiveShadow(!1))}_renderEffectsWithoutGround(e,t,n){const r=!this._boundingVolumeSet||!this.shadowAndAoPass.parameters.aoOnGround,a=this.shadowAndAoPass.parameters.shadowIntensity>0&&(!this._boundingVolumeSet||!this.shadowAndAoPass.parameters.shadowOnGround);(r||a)&&this.renderCacheManager.render("inivisibleGround",t,()=>{r&&this.gBufferRenderTarget.render(e,t,n),a&&this.screenSpaceShadow.renderShadowMap(e,t,n)})}_renderOutline(){if(this.outlineRenderer.outlinePassActivated&&this.outlineRenderer.outlinePass){const e=this.renderer.getClearColor(new Color$1),t=this.renderer.getClearAlpha();"outline"===this.debugOutput&&(this.renderer.setClearColor(0,255),this.renderer.clear(!0,!1,!1)),this.outlineRenderer.outlinePass.renderToScreen=!1,this.outlineRenderer.outlinePass.render(this.renderer,null,null,0,!1),"outline"===this.debugOutput&&this.renderer.setClearColor(e,t)}}}class SceneRendererGUI{constructor(e){this._qualityLevel="",this._ambientOcclusionType="",this._sceneRenderer=e}addGUI(e,t){this._addRepresentationalGUI(e,t),this._addDebugGUI(e,t);const n=e.addFolder("Shadow type");this._addShadowTypeGUI(n,t);const r=e.addFolder("Shadow and Ambient Occlusion");this._addShadowAndAoGUI(r,t);const a=e.addFolder("Ground Reflection");this._addGroundReflectionGUI(a,t);const i=e.addFolder("Baked Ground Contact Shadow");this._addBakedGroundContactShadowGUI(i,t);const s=e.addFolder("Outline");this._addOutlineGUI(s,t)}_addRepresentationalGUI(e,t){const n=new Map([["LinearSRGBColorSpace",LinearSRGBColorSpace],["SRGBColorSpace",SRGBColorSpace]]),r=[];n.forEach((e,t)=>{r.push(t),this._sceneRenderer.renderer.outputColorSpace===e&&(this._sceneRenderer.outputColorSpace=t)}),e.add(this._sceneRenderer,"outputColorSpace",r).onChange(e=>{var r;n.has(e)&&(this._sceneRenderer.renderer.outputColorSpace=null!==(r=n.get(e))&&void 0!==r?r:SRGBColorSpace,t())});const a=new Map([["NoToneMapping",NoToneMapping],["LinearToneMapping",LinearToneMapping],["ReinhardToneMapping",ReinhardToneMapping],["CineonToneMapping",CineonToneMapping],["ACESFilmicToneMapping",ACESFilmicToneMapping]]),i=[];a.forEach((e,t)=>{i.push(t),this._sceneRenderer.renderer.toneMapping===e&&(this._sceneRenderer.toneMapping=t)}),e.add(this._sceneRenderer,"toneMapping",i).onChange(e=>{var n;a.has(e)&&(this._sceneRenderer.renderer.toneMapping=null!==(n=a.get(e))&&void 0!==n?n:NoToneMapping,t())})}_addDebugGUI(e,t){const n=new Map([["HIGHEST",QualityLevel.HIGHEST],["HIGH",QualityLevel.HIGH],["MEDIUM",QualityLevel.MEDIUM],["LOW",QualityLevel.LOW]]),r=[];n.forEach((e,t)=>r.push(t)),e.add(this,"_qualityLevel",r).onChange(e=>{var t;n.has(e)&&this._sceneRenderer.setQualityLevel(null!==(t=n.get(e))&&void 0!==t?t:QualityLevel.HIGHEST)}),e.add(this._sceneRenderer,"debugOutput",{"off ":"off","grayscale (no textures)":"grayscale","color buffer":"color","linear depth":"lineardepth","g-buffer normal vector":"g-normal","g-buffer depth":"g-depth","AO pure":"ssao","AO denoised":"ssaodenoise","shadow map":"shadowmap","shadow Monte Carlo":"shadow","shadow blur":"shadowblur","shadow fade in":"shadowfadein","shadow and AO":"shadowandao","ground reflection":"groundreflection","baked ground shadow":"bakedgroundshadow","selection outline":"outline","environment map":"environmentmap","light source detection":"lightsourcedetection"}).onChange(()=>t())}_addShadowTypeGUI(e,t){const n=this._sceneRenderer.screenSpaceShadow.shadowConfiguration,r=[];n.types.forEach((e,t)=>{r.push(t)});const a=()=>{this._sceneRenderer.screenSpaceShadow.needsUpdate=!0,this._sceneRenderer.screenSpaceShadow.shadowTypeNeedsUpdate=!0,this._sceneRenderer.shadowAndAoPass.needsUpdate=!0,t()};e.add(n,"shadowType",r).onChange(e=>{this._sceneRenderer.screenSpaceShadow.switchType(e)&&(i.object=n.currentConfiguration,s.object=n.currentConfiguration,o.object=n.currentConfiguration,i.updateDisplay(),s.updateDisplay(),o.updateDisplay(),a())});const i=e.add(n.currentConfiguration,"bias",-.001,.001,1e-5).onChange(()=>a()),s=e.add(n.currentConfiguration,"normalBias",-.05,.05).onChange(()=>a()),o=e.add(n.currentConfiguration,"radius",0,100).onChange(()=>a())}_addShadowAndAoGUI(e,t){const n=()=>{this._sceneRenderer.gBufferRenderTarget.needsUpdate=!0,this._sceneRenderer.screenSpaceShadow.needsUpdate=!0,this._sceneRenderer.shadowAndAoPass.needsUpdate=!0,this._sceneRenderer.shadowAndAoPass.shadowAndAoRenderTargets.parametersNeedsUpdate=!0,t()},r=this._sceneRenderer.shadowAndAoPass.parameters,a=r.shAndAo,i=this._sceneRenderer.screenSpaceShadow.parameters,s=r.ssao,o=r.hbao,l=r.poissonDenoise;e.add(r,"enabled").onChange(()=>n());const d=new Map([["none",AmbientOcclusionType.NONE],["SSAO",AmbientOcclusionType.SSAO],["effects SSAO",AmbientOcclusionType.EffectsSSAO],["effects HBAO",AmbientOcclusionType.EffectsHBAO]]),h=Array.from(d.keys());d.forEach((e,t)=>{e===r.aoType&&(this._ambientOcclusionType=t)}),e.add(this,"_ambientOcclusionType",h).onChange(e=>{var t;d.has(e)&&(r.aoType=null!==(t=d.get(e))&&void 0!==t?t:AmbientOcclusionType.SSAO,n())}),e.add(r,"aoIntensity",0,1).onChange(()=>{n()}),e.add(r,"aoOnGround").onChange(()=>{n()}),e.add(r,"shadowOnGround").onChange(()=>{n()}),e.add(r,"shadowIntensity",0,1).onChange(()=>n()),e.add(r,"alwaysUpdate").onChange(()=>n());const c=e.addFolder("Shadow and Monte Carlo integration");c.add(i,"maximumNumberOfLightSources").onChange(()=>n()),c.add(i,"directionalDependency",0,1,.01).onChange(()=>n()),c.add(i,"directionalExponent",0,2,.01).onChange(()=>n()),c.add(i,"groundContainment",0,1,.01).onChange(()=>n()),c.add(i,"fadeOutDistance",0,5,.01).onChange(()=>n()),c.add(i,"fadeOutBlur",0,100).onChange(()=>n()),c.add(a,"shadowRadius",.001,.5).onChange(()=>n());const u=e.addFolder("Roomle SSAO");u.add(a,"aoFadeout",0,1).onChange(()=>n()),u.add(a,"aoKernelRadius",.001,1).onChange(()=>n()),u.add(a,"aoDepthBias",1e-4,.01).onChange(()=>n()),u.add(a,"aoMaxDistance",.01,1).onChange(()=>n()),u.add(a,"aoMaxDepth",.9,1).onChange(()=>n());const p=e.addFolder("effects SSAO");p.add(s,"resolutionScale",.25,1,.25).onChange(()=>n()),p.add(s,"spp",1,64,1).onChange(()=>n()),p.add(s,"distance",.1,10,.1).onChange(()=>n()),p.add(s,"distancePower",0,2,.125).onChange(()=>n()),p.add(s,"bias",0,500,1).onChange(()=>n()),p.add(s,"power",.5,32,.5).onChange(()=>n()),p.add(s,"thickness",0,.1,.001).onChange(()=>n());const m=e.addFolder("effects HBAO");m.add(o,"resolutionScale",.25,1,.2).onChange(()=>n()),m.add(o,"spp",1,64,1).onChange(()=>n()),m.add(o,"distance",.1,10,.01).onChange(()=>n()),m.add(o,"distancePower",.1,10,.1).onChange(()=>n()),m.add(o,"bias",0,100,1).onChange(()=>n()),m.add(o,"power",.5,8,.5).onChange(()=>n()),m.add(o,"thickness",0,.1,.001).onChange(()=>n());const g=e.addFolder("Possion Denoise");g.add(l,"iterations",0,3,1).onChange(()=>n()),g.add(l,"radius",0,32,1).onChange(()=>n()),g.add(l,"rings",0,16,.125).onChange(()=>n()),g.add(l,"samples",0,32,1).onChange(()=>n()),g.add(l,"lumaPhi",0,20,.001).onChange(()=>n()),g.add(l,"depthPhi",0,20,.001).onChange(()=>n()),g.add(l,"normalPhi",0,20,.001).onChange(()=>n())}_addGroundReflectionGUI(e,t){const n=this._sceneRenderer.parameters.groundReflectionParameters;e.add(n,"enabled"),e.add(n,"intensity",0,1).onChange(()=>t()),e.add(n,"fadeOutDistance",0,4).onChange(()=>t()),e.add(n,"fadeOutExponent",.1,10).onChange(()=>t()),e.add(n,"brightness",0,2).onChange(()=>t()),e.add(n,"blurHorizontal",0,10).onChange(()=>t()),e.add(n,"blurVertical",0,10).onChange(()=>t())}_addBakedGroundContactShadowGUI(e,t){const n=()=>{this._sceneRenderer.bakedGroundContactShadow.applyParameters(),t()},r=this._sceneRenderer.parameters.bakedGroundContactShadowParameters;e.add(r,"enabled"),e.add(r,"cameraHelper").onChange(()=>n()),e.add(r,"alwaysUpdate"),e.add(r,"fadeIn"),e.add(r,"blurMin",0,.2,.001).onChange(()=>n()),e.add(r,"blurMax",0,.5,.01).onChange(()=>n()),e.add(r,"fadeoutFalloff",0,1,.01).onChange(()=>n()),e.add(r,"fadeoutBias",0,.5).onChange(()=>n()),e.add(r,"opacity",0,1,.01).onChange(()=>n()),e.add(r,"maximumPlaneSize",0,50,1).onChange(()=>n()),e.add(r,"cameraFar",.1,10,.1).onChange(()=>n())}_addOutlineGUI(e,t){const n=()=>{this._sceneRenderer.outlineRenderer.applyParameters(),t()},r=this._sceneRenderer.outlineRenderer.parameters;e.add(r,"enabled"),e.add(r,"edgeStrength",.5,20).onChange(()=>n()),e.add(r,"edgeGlow",0,20).onChange(()=>n()),e.add(r,"edgeThickness",.5,20).onChange(()=>n()),e.add(r,"pulsePeriod",0,5).onChange(()=>n()),e.addColor(r,"visibleEdgeColor").onChange(()=>n()),e.addColor(r,"hiddenEdgeColor").onChange(()=>n())}}const noEffectsSuspension={effectSuspendFrames:0,effectFadeInFrames:0,suspendGroundReflection:!1,shadowOnCameraChange:ShadowBlurType.FULL},partialEffectsSuspension={effectSuspendFrames:5,effectFadeInFrames:5,suspendGroundReflection:!1,shadowOnCameraChange:ShadowBlurType.POISSON},fullEffectsSuspension={effectSuspendFrames:5,effectFadeInFrames:5,suspendGroundReflection:!0,shadowOnCameraChange:ShadowBlurType.HARD},roomleSsaoDenoiseParameters={iterations:1,radius:10,rings:5.625,lumaPhi:10,depthPhi:12,normalPhi:3.25,samples:16},standaloneConfiguratorQualityLevels=new Map([[QualityLevel.HIGHEST,{...noEffectsSuspension,shAndAoPassParameters:{enabled:!0,aoOnGround:!0,shadowOnGround:!0,poissonDenoise:roomleSsaoDenoiseParameters},groundReflectionParameters:{enabled:!0},bakedGroundContactShadowParameters:{enabled:!1}}],[QualityLevel.HIGH,{...partialEffectsSuspension,shAndAoPassParameters:{enabled:!0,aoOnGround:!0,shadowOnGround:!0,poissonDenoise:roomleSsaoDenoiseParameters},groundReflectionParameters:{enabled:!0},bakedGroundContactShadowParameters:{enabled:!1}}],[QualityLevel.MEDIUM,{...fullEffectsSuspension,shAndAoPassParameters:{enabled:!0,aoOnGround:!0,shadowOnGround:!0,poissonDenoise:roomleSsaoDenoiseParameters},groundReflectionParameters:{enabled:!1},bakedGroundContactShadowParameters:{enabled:!1}}],[QualityLevel.LOW,{shAndAoPassParameters:{enabled:!1,aoOnGround:!1,shadowOnGround:!1},groundReflectionParameters:{enabled:!1},bakedGroundContactShadowParameters:{enabled:!0}}]]),screenSpaceShadowLayers=new Layers;screenSpaceShadowLayers.enable(3);const bakedGroundShadowHardLayers=new Layers;bakedGroundShadowHardLayers.disableAll(),bakedGroundShadowHardLayers.enable(9);const aoConfiguratorParameters={enabled:!0,aoType:AmbientOcclusionType.SSAO,aoIntensity:.5,shadowIntensity:0,aoOnGround:!0,shadowOnGround:!1,poissonDenoise:roomleSsaoDenoiseParameters},aoPlan3dParameters={enabled:!0,aoType:AmbientOcclusionType.EffectsHBAO,aoIntensity:.5,shadowIntensity:0,aoOnGround:!0,shadowOnGround:!1,poissonDenoise:{iterations:1,radius:10,rings:5.625,lumaPhi:10,depthPhi:2,normalPhi:3.25,samples:16}},aoPlan2dParameters=aoPlan3dParameters,bakedGroundContactConfiguratorParameters={enabled:!0,fadeoutFalloff:.9,blurMax:.1,opacity:.5,hardLayers:null,softLayers:null,polygonOffset:2},bakedGroundContactPlan3dParameters={enabled:!0,fadeoutFalloff:.8,blurMax:.15,opacity:.5,hardLayers:bakedGroundShadowHardLayers,softLayers:null,polygonOffset:-1},bakedGroundContactPlan2dParameters={enabled:!1},plannerConfiguratorQualityLevels=new Map([[QualityLevel.HIGHEST,{...noEffectsSuspension,shAndAoPassParameters:aoConfiguratorParameters,screenSpaceShadowMapParameters:{layers:screenSpaceShadowLayers},groundReflectionParameters:{enabled:!0},bakedGroundContactShadowParameters:bakedGroundContactConfiguratorParameters}],[QualityLevel.HIGH,{...partialEffectsSuspension,shAndAoPassParameters:aoConfiguratorParameters,screenSpaceShadowMapParameters:{layers:screenSpaceShadowLayers},groundReflectionParameters:{enabled:!0},bakedGroundContactShadowParameters:bakedGroundContactConfiguratorParameters}],[QualityLevel.MEDIUM,{...fullEffectsSuspension,shAndAoPassParameters:aoConfiguratorParameters,screenSpaceShadowMapParameters:{layers:screenSpaceShadowLayers},groundReflectionParameters:{enabled:!0},bakedGroundContactShadowParameters:bakedGroundContactConfiguratorParameters}],[QualityLevel.LOW,{shAndAoPassParameters:{enabled:!1,aoOnGround:!1,shadowOnGround:!1},groundReflectionParameters:{enabled:!1},bakedGroundContactShadowParameters:bakedGroundContactConfiguratorParameters}]]),planner3dQualityLevels=new Map([[QualityLevel.HIGHEST,{...noEffectsSuspension,shAndAoPassParameters:aoPlan3dParameters,screenSpaceShadowMapParameters:{layers:screenSpaceShadowLayers},groundReflectionParameters:{enabled:!1},bakedGroundContactShadowParameters:bakedGroundContactPlan3dParameters}],[QualityLevel.HIGH,{...partialEffectsSuspension,shAndAoPassParameters:aoPlan3dParameters,screenSpaceShadowMapParameters:{layers:screenSpaceShadowLayers},groundReflectionParameters:{enabled:!1},bakedGroundContactShadowParameters:bakedGroundContactPlan3dParameters}],[QualityLevel.MEDIUM,{...fullEffectsSuspension,shAndAoPassParameters:aoPlan3dParameters,screenSpaceShadowMapParameters:{layers:screenSpaceShadowLayers},groundReflectionParameters:{enabled:!1},bakedGroundContactShadowParameters:bakedGroundContactPlan3dParameters}],[QualityLevel.LOW,{shAndAoPassParameters:{enabled:!1,aoOnGround:!1,shadowOnGround:!1},groundReflectionParameters:{enabled:!1},bakedGroundContactShadowParameters:bakedGroundContactPlan3dParameters}]]),planner2dQualityLevels=new Map([[QualityLevel.HIGHEST,{...noEffectsSuspension,shAndAoPassParameters:aoPlan2dParameters,screenSpaceShadowMapParameters:{layers:screenSpaceShadowLayers},groundReflectionParameters:{enabled:!1},bakedGroundContactShadowParameters:bakedGroundContactPlan2dParameters}],[QualityLevel.HIGH,{...partialEffectsSuspension,shAndAoPassParameters:aoPlan2dParameters,screenSpaceShadowMapParameters:{layers:screenSpaceShadowLayers},groundReflectionParameters:{enabled:!1},bakedGroundContactShadowParameters:bakedGroundContactPlan2dParameters}],[QualityLevel.MEDIUM,{...fullEffectsSuspension,shAndAoPassParameters:aoPlan2dParameters,screenSpaceShadowMapParameters:{layers:screenSpaceShadowLayers},groundReflectionParameters:{enabled:!1},bakedGroundContactShadowParameters:bakedGroundContactPlan2dParameters}],[QualityLevel.LOW,{shAndAoPassParameters:{enabled:!1,aoOnGround:!1,shadowOnGround:!1},groundReflectionParameters:{enabled:!1},bakedGroundContactShadowParameters:bakedGroundContactPlan2dParameters}]]);class FpsCounter{constructor(){this._index=0,this._prevTime=0,this._frames=0,this._fps=-1,this._fpsList=Array(2).fill(0),this._prevTime=(performance||Date).now(),this.reset()}update(){this._frames++;const e=(performance||Date).now();e>=this._prevTime+1e3&&(this._fpsList[this._index%2]=1e3*this._frames/(e-this._prevTime),this._index>=2&&(this._fps=this._fpsList.reduce((e,t)=>e+t)/this._fpsList.length),this._prevTime=e,this._frames=0,this._index++)}start(){this._prevTime=(performance||Date).now(),this._frames=0}reset(){this._fps=-1,this._fpsList=Array(2).fill(0),this._index=0}getFps(){return this._fps}}var RenderMode;!function(e){e[e.Mode3D=0]="Mode3D",e[e.Mode2D=1]="Mode2D"}(RenderMode||(RenderMode={}));class RoomleWebGLRenderer{get renderer(){return this._renderer}get screenSpaceShadowParameters(){return this.sceneRenderer.screenSpaceShadow.parameters}get shadowAndAoPassParameters(){return this.sceneRenderer.shadowAndAoPass.parameters}get bakedGroundContactShadowParameters(){return this.sceneRenderer.bakedGroundContactShadow.parameters}get groundReflectionParameters(){return this.sceneRenderer.groundReflectionPass.parameters}get outlineParameters(){return this.sceneRenderer.outlineRenderer.parameters}constructor(e,t,n){this.configuratorMode=!0,this.uiInteractionMode=!0,this._renderer=e,this.sceneRenderer=new SceneRenderer(this._renderer,t,n),this.outlineParameters.enabled=!0,this.outlineParameters.edgeStrength=2,this.outlineParameters.edgeGlow=1,this.outlineParameters.edgeThickness=2,this.outlineParameters.pulsePeriod=0,this.outlineParameters.usePatternTexture=!1,this.outlineParameters.visibleEdgeColor=16777215,this.outlineParameters.hiddenEdgeColor=16777215,RoomleWebGLRenderer.enableRectAreaLightShadow&&(DynamicLightSettingLoader.rectAreaLightReplacement=!1,DynamicLightSettingLoader.rectAreaLightLoadingListener=this.loadRectAreLight),this.sceneRenderer.setQualityLevel(QualityLevel.HIGHEST),this.SceneRendererGUI=new SceneRendererGUI(this.sceneRenderer)}dispose(){this.sceneRenderer.dispose()}setSize(e,t){this.sceneRenderer.setSize(e,t)}setAutoQuality(e){!this._fpsCounter&&e?this._fpsCounter=new FpsCounter:this._fpsCounter&&!e&&(this._fpsCounter=null)}setQualityLevel(e){this.sceneRenderer.setQualityLevel(e)}setQualityMap(e){this.sceneRenderer.setQualityMap(e)}enableUiInteractionMode(){this.sceneRenderer.uiInteractionMode=!0,this.sceneRenderer.applyCurrentParameters()}disableUiInteractionMode(){this.sceneRenderer.uiInteractionMode=!1,this.sceneRenderer.applyCurrentParameters()}loadRectAreLight(e){RoomleWebGLRenderer.rectAreaLightsNeedsUpdate=!0}updateRectAreaLight(e){let t=[];e.traverse(e=>{e instanceof RectAreaLight&&t.push(e)}),this.sceneRenderer.updateRectAreaLights(t,e),RoomleWebGLRenderer.rectAreaLightsNeedsUpdate=!1}forceShadowUpdates(e){this.sceneRenderer.forceShadowUpdates(e)}switchToConfigurator(){this.configuratorMode=!0,this.sceneRenderer.setQualityMap(plannerConfiguratorQualityLevels)}switchToPlanner(e){RenderMode.Mode3D,this.configuratorMode=!1,e===RenderMode.Mode3D?this.sceneRenderer.setQualityMap(planner3dQualityLevels):this.sceneRenderer.setQualityMap(planner2dQualityLevels)}updateBounds(e){this.sceneRenderer.updateBounds(e,!1)}updateEnvironment(e,t=!1){e&&this.updateBounds(e)}movingCameraStarts(){var e;this.sceneRenderer.movingCamera=!0,null===(e=this._fpsCounter)||void 0===e||e.start()}movingCameraStops(){this.sceneRenderer.movingCamera=!1}highlightObjects(e){this.sceneRenderer.selectObjects(e)}render(e,t){var n;RoomleWebGLRenderer.rectAreaLightsNeedsUpdate&&this.updateRectAreaLight(e),t.updateMatrixWorld(),(t instanceof PerspectiveCamera||t instanceof OrthographicCamera)&&t.updateProjectionMatrix();const r=RoomleWebGLRenderer.updateNearAndFarPlaneOfPerspectiveCamera?this.createRenderCamera(t):t;if(this.sceneRenderer.render(e,r),this.sceneRenderer.movingCamera&&this._fpsCounter){null===(n=this._fpsCounter)||void 0===n||n.update();const e=this.sceneRenderer.getQualityLevel(),t=this._fpsCounter.getFps();t>0&&t<30&&e<3&&(this.sceneRenderer.setQualityLevel(e+1),this._fpsCounter.reset())}}createRenderCamera(e){const t=e.clone();return this.configuratorMode&&t instanceof PerspectiveCamera&&(this.sceneRenderer.updateNearAndFarPlaneOfPerspectiveCamera(t,120),t.updateProjectionMatrix()),t}showGUI(e){const t=getGUI();this.SceneRendererGUI.addGUI(t,e)}}RoomleWebGLRenderer.enableRectAreaLightShadow=!0,RoomleWebGLRenderer.rectAreaLightsNeedsUpdate=!1,RoomleWebGLRenderer.updateNearAndFarPlaneOfPerspectiveCamera=!1;class ImageRenderer{_getRoomleRenderer(){if(!this._roomleRenderer){const e=new WebGLRenderer({antialias:!0,alpha:!0});e.outputColorSpace=SRGBColorSpace,e.autoClear=!0,e.setSize(1024,1024),e.outputColorSpace=SRGBColorSpace,e.autoClear=!1,e.shadowMap.enabled=!0,e.shadowMap.type=PCFSoftShadowMap,this._roomleRenderer=new RoomleWebGLRenderer(e,1024,1024),this._roomleRenderer.setQualityMap(standaloneConfiguratorQualityLevels),this._roomleRenderer.setSize(1024,1024)}return this._roomleRenderer}switchToPlannerSettings(){this._getRoomleRenderer().switchToPlanner(RenderMode.Mode3D)}switchToConfiguratorSettings(){this._getRoomleRenderer().switchToConfigurator()}static getCameraTargetForBBox(e,t=0){if(!e){const e=new Vector3;return{center:e,bounds:e,diagonal:0}}const n=e.getSize(new Vector3);return n.addScalar(t),{center:e.getCenter(new Vector3),bounds:n,diagonal:Math.sqrt(Math.pow(n.x,2)+Math.pow(n.y,2)+Math.pow(n.z,2))}}preparePerspectiveImage(e,t,n,r,a={},i=0){return new Promise(s=>{const{size:o=1024,showDimensions:l}=a,d=this._getRoomleRenderer();d.setSize(o,o);const h=e.fog?e.fog.clone():null,c=e.background?e.background.clone():null;e.background=null,e.fog=null,n.layers.disable(2),n.layers.disable(6),n.layers.disable(5),l?n.layers.enable(8):n.layers.disable(8);const u=-30+toDegrees(i);ImageRenderer.placeCameraForPerspectiveImage(n,r,-20,u);const p=this._render(d,e,t,n);n.layers.enable(2),n.layers.enable(6),n.layers.enable(5),e.background=c,e.fog=h,s({image:p,width:o,height:o,blob:null})})}renderPerspectiveImage(e,t,n,r){return new Promise(a=>{r||(r=1024);const i=this._getRoomleRenderer();i.setSize(r,r);const s=e.fog?e.fog.clone():null,o=e.background?e.background.clone():null;e.background=null,e.fog=null,t.layers.disable(2),t.layers.disable(6),t.layers.disable(5),n?ImageRenderer.placeCameraForPerspectiveImage(t,n,-20,-30):(t.aspect=1,t.updateProjectionMatrix());const l=this._render(i,e,null,t);t.layers.enable(2),t.layers.enable(6),t.layers.enable(5),e.background=o,e.fog=s,a({image:l,width:r,height:r,blob:null})})}static placeCameraForPerspectiveImage(e,t,n,r){e.far=1e3,e.fov=15,e.aspect=1,e.position.copy(t.center),e.rotation.set(0,0,0),e.rotateY(toRadiant(r)),e.rotateX(toRadiant(n)),e.translateZ(3.8*t.diagonal),e.updateProjectionMatrix()}prepareTopImage(e,t,n,r={}){const{showDimensions:a=!1}=r;return new Promise(r=>{const i=this._getRoomleRenderer();let s=new OrthographicCamera(-n.bounds.x/2,n.bounds.x/2,n.bounds.z/2,-n.bounds.z/2,.5);s.position.copy(n.center),s.rotateX(toRadiant(-90)),s.translateZ(n.bounds.y+1),s.far=s.position.y+.5,s.layers.mask=65535;let o=200*n.bounds.x,l=200*n.bounds.z;if(o>4096||l>4096){let e=0;o>4096?e=o/4096:l>4096&&(e=l/4096),o/=e,l/=e}i.setSize(o,l);let d=e.fog?e.fog.clone():null,h=e.background?e.background.clone():null;e.background=null,e.fog=null,s.layers.disable(2),s.layers.disable(6),s.layers.disable(5),a?s.layers.enable(8):s.layers.disable(8);const c=this._render(i,e,t,s);s.layers.enable(2),s.layers.enable(6),s.layers.enable(5),e.background=h,e.fog=d,r({image:c,width:o,height:l,blob:null})})}_render(e,t,n,r){return e.forceShadowUpdates(!0),e.render(t,r),e.render(t,r),n&&(e.renderer.autoClear=!1,e.renderer.clearDepth(),e.renderer.render(n,r),e.renderer.autoClear=!0),e.renderer.domElement.toDataURL()}}const INJECTABLES=[new DependencyInjectionAssignment("error-handler",class{constructor(){this._listeners={}}_subscribe(e,t){this._listeners[e]||(this._listeners[e]=[]),this._listeners[e].push(t)}subscribe(e,t){this._subscribe(e,t)}dispatch(e,t){if(!this._listeners[e])return;const n=this._listeners[e];let r=n.length;for(let e=0;e<r;e++){const r=n[e];r.apply(r,t)}}unsubscribe(e,t){if(!this._listeners[e])return;const n=this._listeners[e];let r=n.length;for(let e=0;e<r;e++)if(n[e]===t)return n.splice(e,1),r--,void e--}softReject(e,t,n){return this.dispatch(n,[t]),e()}}),new DependencyInjectionAssignment("form-data-util",FormDataUtil),new DependencyInjectionAssignment("hdr-environment-loader",class{constructor(e){this._creator_=e;const t=new Color$1("#DDDDDD");this._environmentMap=((e,t,n,r)=>{const a=new CubeTexture;a.format=RGBAFormat,a.generateMipmaps=!1;for(let r=0;r<6;++r){const i=createColorTexture(e,t,n,1);i.format=a.format,i.type=a.type,i.minFilter=a.minFilter,i.magFilter=a.magFilter,i.generateMipmaps=a.generateMipmaps,i.needsUpdate=!0,a.images[r]=i}return a.needsUpdate=!0,a})(t.r,t.g,t.b)}async loadUrl(e,t){const n=t.toLowerCase();this._environmentMap=n.endsWith(".exr")?await this._loadExr(t):await this._loadRgbe(t),this._environmentMap.mapping=EquirectangularReflectionMapping;const r={url:t,environmentMap:this._environmentMap};return this._envChangedCallback(r),r}_loadExr(e){var t;return this._exrLoader=null!==(t=this._exrLoader)&&void 0!==t?t:new EXRLoader,this._exrLoader.setPath(e.startsWith("http")?"":getAssetPath()),this._exrLoader.loadAsync(e)}_loadRgbe(e){var t;return this._rgbeLoader=null!==(t=this._rgbeLoader)&&void 0!==t?t:new RGBELoader,this._rgbeLoader.setPath(e.startsWith("http")?"":getAssetPath()),this._rgbeLoader.loadAsync(e)}registerEnvironmentChangedCallback(e){this._envChangedCallback=e}}),new DependencyInjectionAssignment("static-item-loader",class{constructor(e){this._gltfLoaderGuard=new AsyncGuard,this._creator_=e,this._initLoaders()}_initLoaders(){this._gltfLoader=new GLTFLoader;const e=new DRACOLoader,t=e._loadLibrary.bind(e._loadLibrary);e._loadLibrary=(e,n)=>{const r=DRACO_LIB_FILES[e];if(!r)throw new Error('Can not load draco dependency "'+e+'" did three.js update DracoLoader lib? Available files'+JSON.stringify(DRACO_LIB_FILES));return t(getAssetPath()+r,n)},e.setDecoderConfig({type:"wasm"}),this._gltfLoader.setDRACOLoader(e),this._gltfLoaderGuard.resolve(this._gltfLoader)}async loadGLB(e,t,n,r,a,i,s,o){return await this._gltfLoaderGuard.wait(),new Promise((l,d)=>{this._gltfLoader.load(e,e=>{l(this._handleGLTFScene("GLB",e,t,n,r,a,i,s))},e=>{o&&o(e.loaded/e.total)},e=>{d(e)})})}async loadGLTF(e,t,n,r,a,i,s,o){return await this._gltfLoaderGuard.wait(),new Promise((l,d)=>{this._gltfLoader.parse(e,null,e=>{l(this._handleGLTFScene("GLTF",e,t,n,r,a,i,s))},e=>{o&&o(e.loaded/e.total)},e=>{d(e)})})}_handleGLTFScene(e,t,n,r,a,i,s,o){if(!t||!t.scene||!t.scene.children||0===t.scene.children.length)return null;n&&t.scene.position.copy(n),r&&(t.scene.rotation.y=r);const l=new Box3;if(l.setFromObject(t.scene),a){const{x:e,y:n,z:r}=l.getSize(new Vector3);let i=new Vector3(a.x/e,a.y/n,a.z/r);t.scene.scale.copy(i)}return i&&t.scene.scale.multiply(i),t.scene.type=e,t.scene.traverse(e=>{if(e instanceof Mesh){if(e.layers.set(3),e.material instanceof MeshStandardMaterial){const t=e.material;if(o&&s&&s>0){let e=new Color$1(s);t.color=e.copySRGBToLinear(e),t.roughness=.5,t.metalness=.1}t.needsUpdate=!0}e.castShadow=!0,e.receiveShadow=!0}}),{boundingBox:l,scene:t.scene}}},0),new DependencyInjectionAssignment("form-data-util",FormDataUtil),new DependencyInjectionAssignment("single-promise-factory",class{constructor(e){this._promises=new Map,this._creator_=e}create(e,t,n){return new Promise((r,a)=>{let i=this._promises.get(e),s=!0;if(!i){const t=new Map;this._promises.set(e,t),i=this._promises.get(e),s=!1}i.get(t)||(i.set(t,[]),s=!1);const o=i.get(t);o.push({resolve:r,reject:a}),i.set(t,o);const l=()=>{i.delete(t),0===i.size&&this._promises.delete(e)};s||new Promise(n).then(e=>{i.get(t).forEach(({resolve:t})=>t(e)),l()},e=>{i.get(t).forEach(({reject:t})=>t(e)),l()})})}},1),new DependencyInjectionAssignment("dynamic-light-setting-loader",DynamicLightSettingLoader),new DependencyInjectionAssignment("network-layer",NetworkLayer),new DependencyInjectionAssignment("local-storage",class{constructor(e){this._context_=e}get _localStorage(){let e=null;try{e=window.localStorage}catch(e){console.error(e)}return e}getItem(e){if(!this._localStorage)return null;const t=this._localStorage.getItem(e);try{return JSON.parse(t)}catch(e){return t}}setItem(e,t){if(this._localStorage)try{const n=JSON.stringify(t);this._localStorage.setItem(e,n)}catch(e){console.error(e)}}}),new DependencyInjectionAssignment("network-layer",NetworkLayer),new DependencyInjectionAssignment("kernel-io",KernelIo,0),new DependencyInjectionAssignment("data-syncer",DataSyncer),new DependencyInjectionAssignment("memory-manager",class{constructor(){this._configurationStringSet=new Set,this._singleLoadCounter=0}loadingConfigurationString(){this._singleLoadCounter+=1}loadingConfiguration(e){this._configurationStringSet.add(e),this._singleLoadCounter+=1}shouldHardReset(){return this._configurationStringSet.size>=15||this._singleLoadCounter>=30}executedHardReset(){this._configurationStringSet.clear(),this._singleLoadCounter=0}}),new DependencyInjectionAssignment("life-cycle-manager",class{constructor(){this._listeners=[]}addEventListener(e){this._listeners.push(e)}removeEventListener(e){const t=this._listeners;let n=t.length;if(n)for(let r=0;r<n;r++)t[r]===e&&(t.splice(r,1),r--,n--)}pause(){this._listeners.forEach(e=>e.pause())}resume(){this._listeners.forEach(e=>e.resume())}destroy(){this._listeners.forEach(e=>e.destroy())}},1),new DependencyInjectionAssignment("local-storage-helper",LocalStorageHelper),new DependencyInjectionAssignment("cache-holder",class{constructor(){this._componentCache=new Map,this._geometryCache=new Map,this._materialCache=new Map}get componentCache(){return this._componentCache}get geometryCache(){return this._geometryCache}get materialCache(){return this._materialCache}clear(){for(const e of this._componentCache.values())disposeObject(e);for(const e of this._materialCache.values())disposeMaterial(e);for(const e of this._geometryCache.values())disposeGeometry(e);this._componentCache.clear(),this._geometryCache.clear(),this._materialCache.clear()}},0),new DependencyInjectionAssignment("kernel-access-callback",class{constructor(e){this._callbackListener=new Set,this._creator_=e}addListener(e){this._callbackListener.add(e)}removeListener(e){this._callbackListener.delete(e)}isReady(){this._callbackListener.forEach(e=>e.isReady())}loadError(e){this._callbackListener.forEach(t=>t.loadError(e))}},1),new DependencyInjectionAssignment("configurator-kernel-access-callback",class{constructor(e){this._callbackListener=new Set,this._creator_=e}addListener(e){this._callbackListener.add(e)}removeListener(e){this._callbackListener.delete(e)}isReady(){this._callbackListener.forEach(e=>e.isReady())}updatePossibleChildren(e,t,n){this._callbackListener.forEach(r=>r.updatePossibleChildren(e,t,n))}updateParameters(e,t,n,r){this._callbackListener.forEach(a=>a.updateParameters(e,t,n,r))}loadError(e){this._callbackListener.forEach(t=>t.loadError(e))}},1),new DependencyInjectionAssignment("configurator-context",class{constructor(){this.planObjectId=0,this.planElementId=0,this.rootComponentId=0,this.dockingRootComponentId=0,this.baseContext=null,this.rootComponentParametersAsGlobal=!1,this.lastLoadedRapiId=null,this.selectedRuntimeComponentIds=[],this.selectionMode="standard"}get selectedRuntimeComponentId(){return this.selectedRuntimeComponentIds.length>0?this.selectedRuntimeComponentIds[0]:null}},1),new DependencyInjectionAssignment("init-data",InitData,1),new DependencyInjectionAssignment("global-init-data",GlobalInitData,0),new DependencyInjectionAssignment("global-callback",GlobalCallback,0),new DependencyInjectionAssignment("dom-helper",DomHelper,1),new DependencyInjectionAssignment("unit-formatter",UnitFormatter,0),new DependencyInjectionAssignment("plugin-system",PluginSystem,1),new DependencyInjectionAssignment("configurator-mesh-generator",ConfiguratorMeshGenerator),new DependencyInjectionAssignment("configurator-input-manager",class extends InputManager{},1),new DependencyInjectionAssignment("selection-handler",class extends EventDispatcher{constructor(){super(...arguments),this._selectionMode="standard",this._selectedComponents=new Map}check(e){"standard"===this._selectionMode&&this._checkStandard(e),"multiselect"===this._selectionMode&&this._checkMulti(e)}cancelSelection(){0!==this._selectedComponents.size&&this._selectedComponents.forEach((e,t)=>{e.deselect(),this._selectedComponents.delete(t),this.dispatchEvent(1,new SelectionHandlerEvent({component:e}))})}_checkStandard(e){this._selectedComponents.has(e.runtimeId)?this.dispatchEvent(0,new SelectionHandlerEvent({component:e,consecutive:!0})):(this._selectedComponents.size>0&&this._selectedComponents.forEach((e,t)=>{this._selectedComponents.delete(t),this.dispatchEvent(1,new SelectionHandlerEvent({component:e,resetCamera:!1}))}),this._selectedComponents.set(e.runtimeId,e),this.dispatchEvent(0,new SelectionHandlerEvent({component:e,consecutive:!1})))}_checkMulti(e){if(this._selectedComponents.has(e.runtimeId))return this._selectedComponents.delete(e.runtimeId),void this.dispatchEvent(1,new SelectionHandlerEvent({component:e,resetCamera:0===this._selectedComponents.size}));this._selectedComponents.set(e.runtimeId,e),this.dispatchEvent(0,new SelectionHandlerEvent({component:e}))}setSelectionMode(e){this._selectionMode=e}getSelectionMode(){return this._selectionMode}hasSelection(){return this._selectedComponents.size>0}getSelectedRuntimeComponentIds(){let e=[];return this._selectedComponents.forEach(t=>e.push(t.runtimeId)),e}isSelected(e){return this._selectedComponents.has(e.runtimeId)}},1),new DependencyInjectionAssignment("component-dimensioning-helper",ComponentDimensioningHelper,1),new DependencyInjectionAssignment("component-dimensioning-helper",ComponentDimensioningHelper,1),new DependencyInjectionAssignment("planner-kernel-access",PlannerKernelAccess),new DependencyInjectionAssignment("planner-mesh-generator",PlannerMeshGenerator,1),new DependencyInjectionAssignment("unit-formatter",UnitFormatter),new DependencyInjectionAssignment("configurator-history",ConfiguratorHistory,1),new DependencyInjectionAssignment("roomle-planner-ui-callback",class extends UiCallback{constructor(e){super(e),this.onItemsLoaded=()=>{},this.onCameraChanged=e=>{},this.onCameraIdle=()=>{},this.onTotalFloorAreaChanged=e=>{},this.onPlanInteractionHandlerCreated=e=>{},this.onPlannerKernelIsReady=e=>{},this.onConfiguratorKernelIsReady=(e,t)=>{},this.onSelectionChange=(e,t,n,r,a)=>{},this.onSelectionCancel=e=>{},this.onPlanChanged=()=>{},this.onPlanElementChanged=(e,t)=>{},this.onCompletelyLoaded=()=>{},this.onRotationCancel=()=>{},this.onHistoryChange=(e,t)=>{},this.onUpdateWallDimensions=e=>{},this.disableWallDimensions=()=>{},this.onUpdatePlanObjectPositions=e=>{},this.onDrawCancel=()=>{},this.onHandlerSwitchedPlans=()=>{},this.onDragElementStart=()=>{},this.onDragElementEnd=()=>{},this.onClickElement=e=>{},this.onMultiSelectionChange=e=>{}}}),new DependencyInjectionAssignment("configurator-ui-callbacks",class extends UiCallback{constructor(e){super(e),this.onKernelIsReady=null,this.onComponentPositionsUpdated=null,this.onUpdateParameters=e=>{},this.onUpdatePossibleChildren=(e,t)=>{},this.onUpdatePrice=(e,t)=>{},this.onSelectionChange=(e,t,n,r)=>{},this.onSelectionCancel=()=>{},this.onPartListUpdate=(e,t)=>{},this.onBoundsUpdate=e=>{},this.onLoadConfiguration=()=>{},this.onConfigurationReady=(e,t,n)=>{},this.onOpenTag=e=>{},this.onOpenAddOns=()=>{},this.onClickOutside=()=>{},this.onNoDockingsAvailable=()=>{},this.onUiIntersectionChange=e=>{},this.onZoomChange=(e,t)=>{},this.onZoomToComponent=()=>{},this.onDimensionsVisibilityChange=e=>{},this.onErrorDueToOffline=e=>{},this.onError=e=>{},this.onDockingsPreviewRemoved=()=>{},this.onConfigurationHasChildren=e=>{},this.onTrackTiming=(e,t,n,r)=>{},this.onUserInitiatedDockDone=(e,t,n,r,a)=>{},this.onAddonPlusHover=()=>{},this.onAddonPlusHoverOff=()=>{},this.onAddonPlusShown=()=>{},this.onAddonPlusHidden=()=>{},this.onContentProblem=e=>{},this.onSyncStarted=()=>{},this.onSyncDone=()=>{},this.onOpenFloorMaterials=()=>{},this.onOpenPartList=()=>{},this.onComponentLoadError=(e,t)=>{},this.onConfigurationLoadError=()=>{},this.onChangeTypeChangeTag=e=>{},this.onRemoveTypeChangeTag=e=>{},this.onConfigurationLabelChange=(e,t,n)=>{},this.onMemoryCorruption=()=>{},this.onConfiguratorKernelIsReady=(e,t)=>{},this.onConfigurationSaved=e=>{},this.onCameraPositionChanges=()=>{},this.onHistoryChange=(e,t)=>{},this.onClickComponent=e=>{},this.onRequestExternalMesh=(e,t)=>{},this.onGeometryReady=e=>{},this.onGeometryNotReady=e=>{}}},1),new DependencyInjectionAssignment("roomle-tools-core",RoomleToolsCore,0),new DependencyInjectionAssignment("image-renderer",ImageRenderer,0)];class RoomleDependencyInjection{static _ensureContainer(){window.__RML__DI__||(window.__RML__DI__=new Container,window.__RML__DI__.addDependencyInjectionAssignments(INJECTABLES))}static setup(e){RoomleDependencyInjection.addToContainer(e)}static lookup(e,t){return window.__RML__DI__?window.__RML__DI__.lookup(e,t):null}static getContext(e){return RoomleDependencyInjection._ensureContainer(),window.__RML__DI__.getContext(e)}static cleanUp(e){return window.__RML__DI__?window.__RML__DI__.cleanUp(e):null}static addToContainer(e){RoomleDependencyInjection._ensureContainer(),window.__RML__DI__.addDependencyInjectionAssignments(e)}}export{rotationQuaternionsAreEqual as $,AppContext as A,Benchmark as B,ConfiguratorViewModel as C,DependencyInjectionAssignment as D,EventDispatcher as E,FloorPlanElementViewModel as F,getCatalogIdFromItemOrConfigurationId as G,isIdItemId as H,INJECTABLES as I,AsyncHelper as J,isRange as K,Logger as L,isMaterial as M,NodePlanElementViewModel as N,convertCObject as O,PlannerKernelAccess as P,position3VectorsAreEqual as Q,RapiAccess as R,StaticPlanObjectViewModel as S,position2VectorsAreEqual as T,compareBox3Size as U,MaterialCreator as V,WallPlanElementViewModel as W,createMaterial as X,addTexture as Y,getGUI as Z,__decorate as _,DataSyncer as a,getDelta as a0,MIN_MOVE_DISTANCE as a1,LightSourceDetector as a2,EnvironmentMapDecodeMaterial as a3,sanitizedCameraMode as a4,RoomleWebGLRenderer as a5,standaloneConfiguratorQualityLevels as a6,ENV_HDR_256_FILE_NAME as a7,transitionTransparencyOfMaterial as a8,isSafari as a9,convertToTHREE as aa,INPUT_DELAY_TYPE as ab,threeVectorToTransferableXY as ac,AsyncGuard as ad,RenderMode as ae,PLAN_ELEMENT_CHANGE_TYPES as af,hideWallsBasedOnCamera as ag,fadeIn as ah,viewSpacePositionFromUV as ai,setWallTransparency as aj,getDrawingMinBounds as ak,wallDimensionToTransferable as al,isPlanSnapshotId as am,InputManager as an,PlannerMeshGenerator as ao,setMaterial as ap,getMaterialShading as aq,addExistingTexture as ar,UiCallback as as,ConfiguratorMeshGenerator as at,GlobalCallback as au,GlobalInitData as av,InitData as aw,AsyncDependencyLoader as ax,ScenePluginDefaultImplementation as ay,RoomleDependencyInjection as b,ConfiguratorPlanObjectViewModel as c,ConstructionPlanObjectViewModel as d,CAMERA_TYPE as e,CeilingPlanElementViewModel as f,disposeMesh as g,convertToKernel as h,inject as i,getScreenXY as j,kernelBoxToThreeBox as k,CANVAS_ID as l,Env as m,PULSE_LOOPS as n,PULSE_DURATION as o,DynamicLightSettingLoader as p,PREDEFINED_LIGHTSETTING as q,ImageRenderer as r,dispose as s,toRadiant as t,getYRotationOfObject as u,vectorIsZero as v,getIdealDistance as w,RoomleComponentFactoryInitializer as x,toDegrees as y,DEFAULT_CONVERSATION_ID as z};
|
|
9
|
-
//# sourceMappingURL=roomle-dependency-injection-
|
|
8
|
+
var durl=function(e){return URL.createObjectURL(new Blob([e],{type:"text/javascript"}))};try{URL.revokeObjectURL(durl(""))}catch(e){durl=function(e){return"data:application/javascript;charset=UTF-8,"+encodeURI(e)}}var u8=Uint8Array,u16=Uint16Array,u32=Uint32Array,fleb=new u8([0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0,0]),fdeb=new u8([0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13,0,0]),clim=new u8([16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]),freb=function(e,t){for(var n=new u16(31),r=0;r<31;++r)n[r]=t+=1<<e[r-1];var a=new u32(n[30]);for(r=1;r<30;++r)for(var i=n[r];i<n[r+1];++i)a[i]=i-n[r]<<5|r;return[n,a]},_a=freb(fleb,2),fl=_a[0],revfl=_a[1];fl[28]=258,revfl[258]=28;for(var fd=freb(fdeb,0)[0],rev=new u16(32768),i=0;i<32768;++i){var x=(43690&i)>>>1|(21845&i)<<1;x=(61680&(x=(52428&x)>>>2|(13107&x)<<2))>>>4|(3855&x)<<4,rev[i]=((65280&x)>>>8|(255&x)<<8)>>>1}var hMap=function(e,t,n){for(var r=e.length,a=0,i=new u16(t);a<r;++a)++i[e[a]-1];var s,o=new u16(t);for(a=0;a<t;++a)o[a]=o[a-1]+i[a-1]<<1;if(n){s=new u16(1<<t);var l=15-t;for(a=0;a<r;++a)if(e[a])for(var d=a<<4|e[a],h=t-e[a],c=o[e[a]-1]++<<h,u=c|(1<<h)-1;c<=u;++c)s[rev[c]>>>l]=d}else for(s=new u16(r),a=0;a<r;++a)e[a]&&(s[a]=rev[o[e[a]-1]++]>>>15-e[a]);return s},flt=new u8(288);for(i=0;i<144;++i)flt[i]=8;for(i=144;i<256;++i)flt[i]=9;for(i=256;i<280;++i)flt[i]=7;for(i=280;i<288;++i)flt[i]=8;var fdt=new u8(32);for(i=0;i<32;++i)fdt[i]=5;var flrm=hMap(flt,9,1),fdrm=hMap(fdt,5,1),max=function(e){for(var t=e[0],n=1;n<e.length;++n)e[n]>t&&(t=e[n]);return t},bits=function(e,t,n){var r=t/8|0;return(e[r]|e[r+1]<<8)>>(7&t)&n},bits16=function(e,t){var n=t/8|0;return(e[n]|e[n+1]<<8|e[n+2]<<16)>>(7&t)},et=new u8(0);function unzlibSync(e,t){return function(e,t,n){var r=e.length;if(!r||n&&!n.l&&r<5)return t||new u8(0);var a=!t||n,i=!n||n.i;n||(n={}),t||(t=new u8(3*r));var s,o=function(e){var n=t.length;if(e>n){var r=new u8(Math.max(2*n,e));r.set(t),t=r}},l=n.f||0,d=n.p||0,h=n.b||0,c=n.l,u=n.d,p=n.m,m=n.n,g=8*r;do{if(!c){n.f=l=bits(e,d,1);var f=bits(e,d+1,3);if(d+=3,!f){var _=e[(E=((s=d)/8|0)+(7&s&&1)+4)-4]|e[E-3]<<8,v=E+_;if(v>r){if(i)throw"unexpected EOF";break}a&&o(h+_),t.set(e.subarray(E,v),h),n.b=h+=_,n.p=d=8*v;continue}if(1==f)c=flrm,u=fdrm,p=9,m=5;else{if(2!=f)throw"invalid block type";var w=bits(e,d,31)+257,b=bits(e,d+10,15)+4,S=w+bits(e,d+5,31)+1;d+=14;for(var y=new u8(S),C=new u8(19),T=0;T<b;++T)C[clim[T]]=bits(e,d+3*T,7);d+=3*b;var M=max(C),A=(1<<M)-1,x=hMap(C,M,1);for(T=0;T<S;){var E,P=x[bits(e,d,A)];if(d+=15&P,(E=P>>>4)<16)y[T++]=E;else{var R=0,I=0;for(16==E?(I=3+bits(e,d,3),d+=2,R=y[T-1]):17==E?(I=3+bits(e,d,7),d+=3):18==E&&(I=11+bits(e,d,127),d+=7);I--;)y[T++]=R}}var L=y.subarray(0,w),O=y.subarray(w);p=max(L),m=max(O),c=hMap(L,p,1),u=hMap(O,m,1)}if(d>g){if(i)throw"unexpected EOF";break}}a&&o(h+131072);for(var D=(1<<p)-1,N=(1<<m)-1,k=d;;k=d){var B=(R=c[bits16(e,d)&D])>>>4;if((d+=15&R)>g){if(i)throw"unexpected EOF";break}if(!R)throw"invalid length/literal";if(B<256)t[h++]=B;else{if(256==B){k=d,c=null;break}var F=B-254;if(B>264){var U=fleb[T=B-257];F=bits(e,d,(1<<U)-1)+fl[T],d+=U}var G=u[bits16(e,d)&N],V=G>>>4;if(!G)throw"invalid distance";if(d+=15&G,O=fd[V],V>3&&(U=fdeb[V],O+=bits16(e,d)&(1<<U)-1,d+=U),d>g){if(i)throw"unexpected EOF";break}a&&o(h+131072);for(var H=h+F;h<H;h+=4)t[h]=t[h-O],t[h+1]=t[h+1-O],t[h+2]=t[h+2-O],t[h+3]=t[h+3-O];h=H}}n.l=c,n.p=k,n.b=h,c&&(l=1,n.m=p,n.d=u,n.n=m)}while(!l);return h==t.length?t:function(e,t,n){(null==t||t<0)&&(t=0),(null==n||n>e.length)&&(n=e.length);var r=new(e instanceof u16?u16:e instanceof u32?u32:u8)(n-t);return r.set(e.subarray(t,n)),r}(t,0,h)}((function(e){if(8!=(15&e[0])||e[0]>>>4>7||(e[0]<<8|e[1])%31)throw"invalid zlib data";if(32&e[1])throw"invalid zlib data: preset dictionaries not supported"}(e),e.subarray(2,-4)),t)}var td="undefined"!=typeof TextDecoder&&new TextDecoder;try{td.decode(et,{stream:!0})}catch(e){}class EXRLoader extends DataTextureLoader{constructor(e){super(e),this.type=HalfFloatType}parse(e){const t=Math.pow(2.7182818,2.2),n={l:0,c:0,lc:0};function r(e,t,r,a,i){for(;r<e;)t=t<<8|D(a,i),r+=8;r-=e,n.l=t>>r&(1<<e)-1,n.c=t,n.lc=r}const a=new Array(59);function i(e){return 63&e}function s(e){return e>>6}const o={c:0,lc:0};function l(e,t,n,r){e=e<<8|D(n,r),t+=8,o.c=e,o.lc=t}const d={c:0,lc:0};function h(e,t,n,r,a,i,s,h,c){if(e==t){r<8&&(l(n,r,a,i),n=o.c,r=o.lc);let e=n>>(r-=8);if(e=new Uint8Array([e])[0],h.value+e>c)return!1;const t=s[h.value-1];for(;e-- >0;)s[h.value++]=t}else{if(!(h.value<c))return!1;s[h.value++]=e}d.c=n,d.lc=r}function c(e){return 65535&e}function u(e){const t=c(e);return t>32767?t-65536:t}const p={a:0,b:0};function m(e,t){const n=u(e),r=u(t),a=n+(1&r)+(r>>1),i=a,s=a-r;p.a=i,p.b=s}function g(e,t){const n=c(e),r=c(t),a=n-(r>>1)&65535,i=r+a-32768&65535;p.a=i,p.b=a}function f(e,t,n,r,a,i,s){const o=s<16384,l=n>a?a:n;let d,h,c=1;for(;c<=l;)c<<=1;for(c>>=1,d=c,c>>=1;c>=1;){h=0;const s=h+i*(a-d),l=i*c,u=i*d,f=r*c,_=r*d;let v,w,b,S;for(;h<=s;h+=u){let a=h;const i=h+r*(n-d);for(;a<=i;a+=_){const n=a+f,r=a+l,i=r+f;o?(m(e[a+t],e[r+t]),v=p.a,b=p.b,m(e[n+t],e[i+t]),w=p.a,S=p.b,m(v,w),e[a+t]=p.a,e[n+t]=p.b,m(b,S),e[r+t]=p.a,e[i+t]=p.b):(g(e[a+t],e[r+t]),v=p.a,b=p.b,g(e[n+t],e[i+t]),w=p.a,S=p.b,g(v,w),e[a+t]=p.a,e[n+t]=p.b,g(b,S),e[r+t]=p.a,e[i+t]=p.b)}if(n&c){const n=a+l;o?m(e[a+t],e[n+t]):g(e[a+t],e[n+t]),v=p.a,e[n+t]=p.b,e[a+t]=v}}if(a&c){let a=h;const i=h+r*(n-d);for(;a<=i;a+=_){const n=a+f;o?m(e[a+t],e[n+t]):g(e[a+t],e[n+t]),v=p.a,e[n+t]=p.b,e[a+t]=v}}d=c,c>>=1}return h}function _(e,t,c,u,p,m){const g=c.value,f=O(t,c),_=O(t,c);c.value+=4;const v=O(t,c);if(c.value+=4,f<0||f>=65537||_<0||_>=65537)throw new Error("Something wrong with HUF_ENCSIZE");const w=new Array(65537),b=new Array(16384);if(function(e){for(let t=0;t<16384;t++)e[t]={},e[t].len=0,e[t].lit=0,e[t].p=null}(b),function(e,t,i,s,o,l){const d=t;let h=0,c=0;for(;s<=o;s++){if(d.value-t.value>i)return!1;r(6,h,c,e,d);const a=n.l;if(h=n.c,c=n.lc,l[s]=a,63==a){if(d.value-t.value>i)throw new Error("Something wrong with hufUnpackEncTable");r(8,h,c,e,d);let a=n.l+6;if(h=n.c,c=n.lc,s+a>o+1)throw new Error("Something wrong with hufUnpackEncTable");for(;a--;)l[s++]=0;s--}else if(a>=59){let e=a-59+2;if(s+e>o+1)throw new Error("Something wrong with hufUnpackEncTable");for(;e--;)l[s++]=0;s--}}!function(e){for(let e=0;e<=58;++e)a[e]=0;for(let t=0;t<65537;++t)a[e[t]]+=1;let t=0;for(let e=58;e>0;--e){const n=t+a[e]>>1;a[e]=t,t=n}for(let t=0;t<65537;++t){const n=e[t];n>0&&(e[t]=n|a[n]++<<6)}}(l)}(e,c,u-(c.value-g),f,_,w),v>8*(u-(c.value-g)))throw new Error("Something wrong with hufUncompress");!function(e,t,n,r){for(;t<=n;t++){const n=s(e[t]),a=i(e[t]);if(n>>a)throw new Error("Invalid table entry");if(a>14){const e=r[n>>a-14];if(e.len)throw new Error("Invalid table entry");if(e.lit++,e.p){const t=e.p;e.p=new Array(e.lit);for(let n=0;n<e.lit-1;++n)e.p[n]=t[n]}else e.p=new Array(1);e.p[e.lit-1]=t}else if(a){let e=0;for(let i=1<<14-a;i>0;i--){const i=r[(n<<14-a)+e];if(i.len||i.p)throw new Error("Invalid table entry");i.len=a,i.lit=t,e++}}}}(w,f,_,b),function(e,t,n,r,a,c,u,p,m){let g=0,f=0;const _=u,v=Math.trunc(r.value+(a+7)/8);for(;r.value<v;)for(l(g,f,n,r),g=o.c,f=o.lc;f>=14;){const a=t[g>>f-14&16383];if(a.len)f-=a.len,h(a.lit,c,g,f,n,r,p,m,_),g=d.c,f=d.lc;else{if(!a.p)throw new Error("hufDecode issues");let t;for(t=0;t<a.lit;t++){const u=i(e[a.p[t]]);for(;f<u&&r.value<v;)l(g,f,n,r),g=o.c,f=o.lc;if(f>=u&&s(e[a.p[t]])==(g>>f-u&(1<<u)-1)){f-=u,h(a.p[t],c,g,f,n,r,p,m,_),g=d.c,f=d.lc;break}}if(t==a.lit)throw new Error("hufDecode issues")}}const w=8-a&7;for(g>>=w,f-=w;f>0;){const e=t[g<<14-f&16383];if(!e.len)throw new Error("hufDecode issues");f-=e.len,h(e.lit,c,g,f,n,r,p,m,_),g=d.c,f=d.lc}}(w,b,e,c,v,_,m,p,{value:0})}function v(e){for(let t=1;t<e.length;t++){const n=e[t-1]+e[t]-128;e[t]=n}}function w(e,t){let n=0,r=Math.floor((e.length+1)/2),a=0;const i=e.length-1;for(;!(a>i||(t[a++]=e[n++],a>i));)t[a++]=e[r++]}function b(e){let t=e.byteLength;const n=new Array;let r=0;const a=new DataView(e);for(;t>0;){const e=a.getInt8(r++);if(e<0){const i=-e;t-=i+1;for(let e=0;e<i;e++)n.push(a.getUint8(r++))}else{const i=e;t-=2;const s=a.getUint8(r++);for(let e=0;e<i+1;e++)n.push(s)}}return n}function S(e,t,n){let r,a=1;for(;a<64;)r=t[e.value],65280==r?a=64:r>>8==255?a+=255&r:(n[a]=r,a++),e.value++}function y(e){const t=.5*Math.cos(.7853975),n=.5*Math.cos(3.14159/16),r=.5*Math.cos(3.14159/8),a=.5*Math.cos(3*3.14159/16),i=.5*Math.cos(.981746875),s=.5*Math.cos(3*3.14159/8),o=.5*Math.cos(1.374445625),l=new Array(4),d=new Array(4),h=new Array(4),c=new Array(4);for(let u=0;u<8;++u){const p=8*u;l[0]=r*e[p+2],l[1]=s*e[p+2],l[2]=r*e[p+6],l[3]=s*e[p+6],d[0]=n*e[p+1]+a*e[p+3]+i*e[p+5]+o*e[p+7],d[1]=a*e[p+1]-o*e[p+3]-n*e[p+5]-i*e[p+7],d[2]=i*e[p+1]-n*e[p+3]+o*e[p+5]+a*e[p+7],d[3]=o*e[p+1]-i*e[p+3]+a*e[p+5]-n*e[p+7],h[0]=t*(e[p+0]+e[p+4]),h[3]=t*(e[p+0]-e[p+4]),h[1]=l[0]+l[3],h[2]=l[1]-l[2],c[0]=h[0]+h[1],c[1]=h[3]+h[2],c[2]=h[3]-h[2],c[3]=h[0]-h[1],e[p+0]=c[0]+d[0],e[p+1]=c[1]+d[1],e[p+2]=c[2]+d[2],e[p+3]=c[3]+d[3],e[p+4]=c[3]-d[3],e[p+5]=c[2]-d[2],e[p+6]=c[1]-d[1],e[p+7]=c[0]-d[0]}for(let u=0;u<8;++u)l[0]=r*e[16+u],l[1]=s*e[16+u],l[2]=r*e[48+u],l[3]=s*e[48+u],d[0]=n*e[8+u]+a*e[24+u]+i*e[40+u]+o*e[56+u],d[1]=a*e[8+u]-o*e[24+u]-n*e[40+u]-i*e[56+u],d[2]=i*e[8+u]-n*e[24+u]+o*e[40+u]+a*e[56+u],d[3]=o*e[8+u]-i*e[24+u]+a*e[40+u]-n*e[56+u],h[0]=t*(e[u]+e[32+u]),h[3]=t*(e[u]-e[32+u]),h[1]=l[0]+l[3],h[2]=l[1]-l[2],c[0]=h[0]+h[1],c[1]=h[3]+h[2],c[2]=h[3]-h[2],c[3]=h[0]-h[1],e[0+u]=c[0]+d[0],e[8+u]=c[1]+d[1],e[16+u]=c[2]+d[2],e[24+u]=c[3]+d[3],e[32+u]=c[3]-d[3],e[40+u]=c[2]-d[2],e[48+u]=c[1]-d[1],e[56+u]=c[0]-d[0]}function C(e){for(let t=0;t<64;++t){const n=e[0][t],r=e[1][t],a=e[2][t];e[0][t]=n+1.5747*a,e[1][t]=n-.1873*r-.4682*a,e[2][t]=n+1.8556*r}}function T(e,n,r){for(let i=0;i<64;++i)n[r+i]=DataUtils.toHalfFloat((a=e[i])<=1?Math.sign(a)*Math.pow(Math.abs(a),2.2):Math.sign(a)*Math.pow(t,Math.abs(a)-1));var a}function M(e){return new DataView(e.array.buffer,e.offset.value,e.size)}function A(e){const t=e.viewer.buffer.slice(e.offset.value,e.offset.value+e.size),n=new Uint8Array(b(t)),r=new Uint8Array(n.length);return v(n),w(n,r),new DataView(r.buffer)}function x(e){const t=unzlibSync(e.array.slice(e.offset.value,e.offset.value+e.size)),n=new Uint8Array(t.length);return v(t),w(t,n),new DataView(n.buffer)}function E(e){const t=e.viewer,n={value:e.offset.value},r=new Uint16Array(e.width*e.scanlineBlockSize*(e.channels*e.type)),a=new Uint8Array(8192);let i=0;const s=new Array(e.channels);for(let t=0;t<e.channels;t++)s[t]={},s[t].start=i,s[t].end=s[t].start,s[t].nx=e.width,s[t].ny=e.lines,s[t].size=e.type,i+=s[t].nx*s[t].ny*s[t].size;const o=G(t,n),l=G(t,n);if(l>=8192)throw new Error("Something is wrong with PIZ_COMPRESSION BITMAP_SIZE");if(o<=l)for(let e=0;e<l-o+1;e++)a[e+o]=N(t,n);const d=new Uint16Array(65536),h=function(e,t){let n=0;for(let r=0;r<65536;++r)(0==r||e[r>>3]&1<<(7&r))&&(t[n++]=r);const r=n-1;for(;n<65536;)t[n++]=0;return r}(a,d),c=O(t,n);_(e.array,t,n,c,r,i);for(let t=0;t<e.channels;++t){const e=s[t];for(let n=0;n<s[t].size;++n)f(r,e.start+n,e.nx,e.size,e.ny,e.nx*e.size,h)}!function(e,t,n){for(let r=0;r<n;++r)t[r]=e[t[r]]}(d,r,i);let u=0;const p=new Uint8Array(r.buffer.byteLength);for(let t=0;t<e.lines;t++)for(let t=0;t<e.channels;t++){const e=s[t],n=e.nx*e.size,a=new Uint8Array(r.buffer,2*e.end,2*n);p.set(a,u),u+=2*n,e.end+=n}return new DataView(p.buffer)}function P(e){const t=unzlibSync(e.array.slice(e.offset.value,e.offset.value+e.size)),n=e.lines*e.channels*e.width,r=1==e.type?new Uint16Array(n):new Uint32Array(n);let a=0,i=0;const s=new Array(4);for(let n=0;n<e.lines;n++)for(let n=0;n<e.channels;n++){let n=0;switch(e.type){case 1:s[0]=a,s[1]=s[0]+e.width,a=s[1]+e.width;for(let a=0;a<e.width;++a)n+=t[s[0]++]<<8|t[s[1]++],r[i]=n,i++;break;case 2:s[0]=a,s[1]=s[0]+e.width,s[2]=s[1]+e.width,a=s[2]+e.width;for(let a=0;a<e.width;++a)n+=t[s[0]++]<<24|t[s[1]++]<<16|t[s[2]++]<<8,r[i]=n,i++}}return new DataView(r.buffer)}function R(e){const t=e.viewer,n={value:e.offset.value},r=new Uint8Array(e.width*e.lines*(e.channels*e.type*2)),a={version:k(t,n),unknownUncompressedSize:k(t,n),unknownCompressedSize:k(t,n),acCompressedSize:k(t,n),dcCompressedSize:k(t,n),rleCompressedSize:k(t,n),rleUncompressedSize:k(t,n),rleRawSize:k(t,n),totalAcUncompressedCount:k(t,n),totalDcUncompressedCount:k(t,n),acCompression:k(t,n)};if(a.version<2)throw new Error("EXRLoader.parse: "+K.compression+" version "+a.version+" is unsupported");const i=new Array;let s=G(t,n)-2;for(;s>0;){const e=I(t.buffer,n),r=N(t,n),a=r>>2&3,o=new Int8Array([(r>>4)-1])[0],l=N(t,n);i.push({name:e,index:o,type:l,compression:a}),s-=e.length+3}const o=K.channels,l=new Array(e.channels);for(let t=0;t<e.channels;++t){const n=l[t]={},r=o[t];n.name=r.name,n.compression=0,n.decoded=!1,n.type=r.pixelType,n.pLinear=r.pLinear,n.width=e.width,n.height=e.lines}const d={idx:new Array(3)};for(let t=0;t<e.channels;++t){const e=l[t];for(let n=0;n<i.length;++n){const r=i[n];e.name==r.name&&(e.compression=r.compression,r.index>=0&&(d.idx[r.index]=t),e.offset=t)}}let h,c,u;if(a.acCompressedSize>0)switch(a.acCompression){case 0:h=new Uint16Array(a.totalAcUncompressedCount),_(e.array,t,n,a.acCompressedSize,h,a.totalAcUncompressedCount);break;case 1:const r=unzlibSync(e.array.slice(n.value,n.value+a.totalAcUncompressedCount));h=new Uint16Array(r.buffer),n.value+=a.totalAcUncompressedCount}if(a.dcCompressedSize>0){const t={array:e.array,offset:n,size:a.dcCompressedSize};c=new Uint16Array(x(t).buffer),n.value+=a.dcCompressedSize}a.rleRawSize>0&&(u=b(unzlibSync(e.array.slice(n.value,n.value+a.rleCompressedSize)).buffer),n.value+=a.rleCompressedSize);let p=0;const m=new Array(l.length);for(let e=0;e<m.length;++e)m[e]=new Array;for(let t=0;t<e.lines;++t)for(let t=0;t<l.length;++t)m[t].push(p),p+=l[t].width*e.type*2;!function(e,t,n,r,a,i){let s=new DataView(i.buffer);const o=n[e.idx[0]].width,l=n[e.idx[0]].height,d=Math.floor(o/8),h=Math.ceil(o/8),c=Math.ceil(l/8),u=o-8*(h-1),p=l-8*(c-1),m={value:0},g=new Array(3),f=new Array(3),_=new Array(3),v=new Array(3),w=new Array(3);for(let n=0;n<3;++n)w[n]=t[e.idx[n]],g[n]=n<1?0:g[n-1]+h*c,f[n]=new Float32Array(64),_[n]=new Uint16Array(64),v[n]=new Uint16Array(64*h);for(let t=0;t<c;++t){let i=8;t==c-1&&(i=p);let o=8;for(let e=0;e<h;++e){e==h-1&&(o=u);for(let e=0;e<3;++e)_[e].fill(0),_[e][0]=a[g[e]++],S(m,r,_[e]),b=_[e],(M=f[e])[0]=U(b[0]),M[1]=U(b[1]),M[2]=U(b[5]),M[3]=U(b[6]),M[4]=U(b[14]),M[5]=U(b[15]),M[6]=U(b[27]),M[7]=U(b[28]),M[8]=U(b[2]),M[9]=U(b[4]),M[10]=U(b[7]),M[11]=U(b[13]),M[12]=U(b[16]),M[13]=U(b[26]),M[14]=U(b[29]),M[15]=U(b[42]),M[16]=U(b[3]),M[17]=U(b[8]),M[18]=U(b[12]),M[19]=U(b[17]),M[20]=U(b[25]),M[21]=U(b[30]),M[22]=U(b[41]),M[23]=U(b[43]),M[24]=U(b[9]),M[25]=U(b[11]),M[26]=U(b[18]),M[27]=U(b[24]),M[28]=U(b[31]),M[29]=U(b[40]),M[30]=U(b[44]),M[31]=U(b[53]),M[32]=U(b[10]),M[33]=U(b[19]),M[34]=U(b[23]),M[35]=U(b[32]),M[36]=U(b[39]),M[37]=U(b[45]),M[38]=U(b[52]),M[39]=U(b[54]),M[40]=U(b[20]),M[41]=U(b[22]),M[42]=U(b[33]),M[43]=U(b[38]),M[44]=U(b[46]),M[45]=U(b[51]),M[46]=U(b[55]),M[47]=U(b[60]),M[48]=U(b[21]),M[49]=U(b[34]),M[50]=U(b[37]),M[51]=U(b[47]),M[52]=U(b[50]),M[53]=U(b[56]),M[54]=U(b[59]),M[55]=U(b[61]),M[56]=U(b[35]),M[57]=U(b[36]),M[58]=U(b[48]),M[59]=U(b[49]),M[60]=U(b[57]),M[61]=U(b[58]),M[62]=U(b[62]),M[63]=U(b[63]),y(f[e]);C(f);for(let t=0;t<3;++t)T(f[t],v[t],64*e)}let l=0;for(let r=0;r<3;++r){const a=n[e.idx[r]].type;for(let e=8*t;e<8*t+i;++e){l=w[r][e];for(let t=0;t<d;++t){const n=64*t+8*(7&e);s.setUint16(l+0*a,v[r][n+0],!0),s.setUint16(l+2*a,v[r][n+1],!0),s.setUint16(l+4*a,v[r][n+2],!0),s.setUint16(l+6*a,v[r][n+3],!0),s.setUint16(l+8*a,v[r][n+4],!0),s.setUint16(l+10*a,v[r][n+5],!0),s.setUint16(l+12*a,v[r][n+6],!0),s.setUint16(l+14*a,v[r][n+7],!0),l+=16*a}}if(d!=h)for(let e=8*t;e<8*t+i;++e){const t=w[r][e]+8*d*2*a,n=64*d+8*(7&e);for(let e=0;e<o;++e)s.setUint16(t+2*e*a,v[r][n+e],!0)}}}var b,M;const A=new Uint16Array(o);s=new DataView(i.buffer);for(let t=0;t<3;++t){n[e.idx[t]].decoded=!0;const r=n[e.idx[t]].type;if(2==n[t].type)for(let e=0;e<l;++e){const n=w[t][e];for(let e=0;e<o;++e)A[e]=s.getUint16(n+2*e*r,!0);for(let e=0;e<o;++e)s.setFloat32(n+2*e*r,U(A[e]),!0)}}}(d,m,l,h,c,r);for(let t=0;t<l.length;++t){const n=l[t];if(!n.decoded)switch(n.compression){case 2:let a=0,i=0;for(let s=0;s<e.lines;++s){let e=m[t][a];for(let t=0;t<n.width;++t){for(let t=0;t<2*n.type;++t)r[e++]=u[i+t*n.width*n.height];i++}a++}break;case 1:default:throw new Error("EXRLoader.parse: unsupported channel compression")}}return new DataView(r.buffer)}function I(e,t){const n=new Uint8Array(e);let r=0;for(;0!=n[t.value+r];)r+=1;const a=(new TextDecoder).decode(n.slice(t.value,t.value+r));return t.value=t.value+r+1,a}function L(e,t){const n=e.getInt32(t.value,!0);return t.value=t.value+4,n}function O(e,t){const n=e.getUint32(t.value,!0);return t.value=t.value+4,n}function D(e,t){const n=e[t.value];return t.value=t.value+1,n}function N(e,t){const n=e.getUint8(t.value);return t.value=t.value+1,n}const k=function(e,t){let n;return n="getBigInt64"in DataView.prototype?Number(e.getBigInt64(t.value,!0)):e.getUint32(t.value+4,!0)+Number(e.getUint32(t.value,!0)<<32),t.value+=8,n};function B(e,t){const n=e.getFloat32(t.value,!0);return t.value+=4,n}function F(e,t){return DataUtils.toHalfFloat(B(e,t))}function U(e){const t=(31744&e)>>10,n=1023&e;return(e>>15?-1:1)*(t?31===t?n?NaN:1/0:Math.pow(2,t-15)*(1+n/1024):n/1024*6103515625e-14)}function G(e,t){const n=e.getUint16(t.value,!0);return t.value+=2,n}function V(e,t){return U(G(e,t))}function H(e,t,n,r,a){return"string"===r||"stringvector"===r||"iccProfile"===r?function(e,t,n){const r=(new TextDecoder).decode(new Uint8Array(e).slice(t.value,t.value+n));return t.value=t.value+n,r}(t,n,a):"chlist"===r?function(e,t,n,r){const a=n.value,i=[];for(;n.value<a+r-1;){const r=I(t,n),a=L(e,n),s=N(e,n);n.value+=3;const o=L(e,n),l=L(e,n);i.push({name:r,pixelType:a,pLinear:s,xSampling:o,ySampling:l})}return n.value+=1,i}(e,t,n,a):"chromaticities"===r?function(e,t){return{redX:B(e,t),redY:B(e,t),greenX:B(e,t),greenY:B(e,t),blueX:B(e,t),blueY:B(e,t),whiteX:B(e,t),whiteY:B(e,t)}}(e,n):"compression"===r?function(e,t){return["NO_COMPRESSION","RLE_COMPRESSION","ZIPS_COMPRESSION","ZIP_COMPRESSION","PIZ_COMPRESSION","PXR24_COMPRESSION","B44_COMPRESSION","B44A_COMPRESSION","DWAA_COMPRESSION","DWAB_COMPRESSION"][N(e,t)]}(e,n):"box2i"===r?function(e,t){return{xMin:O(e,t),yMin:O(e,t),xMax:O(e,t),yMax:O(e,t)}}(e,n):"lineOrder"===r?function(e,t){return["INCREASING_Y"][N(e,t)]}(e,n):"float"===r?B(e,n):"v2f"===r?function(e,t){return[B(e,t),B(e,t)]}(e,n):"v3f"===r?function(e,t){return[B(e,t),B(e,t),B(e,t)]}(e,n):"int"===r?L(e,n):"rational"===r?function(e,t){return[L(e,t),O(e,t)]}(e,n):"timecode"===r?function(e,t){return[O(e,t),O(e,t)]}(e,n):"preview"===r?(n.value+=a,"skipped"):void(n.value+=a)}const j=new DataView(e),z=new Uint8Array(e),W={value:0},K=function(e,t,n){const r={};if(20000630!=e.getUint32(0,!0))throw new Error("THREE.EXRLoader: provided file doesn't appear to be in OpenEXR format.");r.version=e.getUint8(4);const a=e.getUint8(5);r.spec={singleTile:!!(2&a),longName:!!(4&a),deepFormat:!!(8&a),multiPart:!!(16&a)},n.value=8;let i=!0;for(;i;){const a=I(t,n);if(0==a)i=!1;else{const i=I(t,n),s=H(e,t,n,i,O(e,n));void 0===s?console.warn(`EXRLoader.parse: skipped unknown header attribute type '${i}'.`):r[a]=s}}if(0!=(-5&a))throw console.error("EXRHeader:",r),new Error("THREE.EXRLoader: provided file is currently unsupported.");return r}(j,e,W),X=function(e,t,n,r,a){const i={size:0,viewer:t,array:n,offset:r,width:e.dataWindow.xMax-e.dataWindow.xMin+1,height:e.dataWindow.yMax-e.dataWindow.yMin+1,channels:e.channels.length,bytesPerLine:null,lines:null,inputSize:null,type:e.channels[0].pixelType,uncompress:null,getter:null,format:null,colorSpace:LinearSRGBColorSpace};switch(e.compression){case"NO_COMPRESSION":i.lines=1,i.uncompress=M;break;case"RLE_COMPRESSION":i.lines=1,i.uncompress=A;break;case"ZIPS_COMPRESSION":i.lines=1,i.uncompress=x;break;case"ZIP_COMPRESSION":i.lines=16,i.uncompress=x;break;case"PIZ_COMPRESSION":i.lines=32,i.uncompress=E;break;case"PXR24_COMPRESSION":i.lines=16,i.uncompress=P;break;case"DWAA_COMPRESSION":i.lines=32,i.uncompress=R;break;case"DWAB_COMPRESSION":i.lines=256,i.uncompress=R;break;default:throw new Error("EXRLoader.parse: "+e.compression+" is unsupported")}if(i.scanlineBlockSize=i.lines,1==i.type)switch(a){case FloatType:i.getter=V,i.inputSize=2;break;case HalfFloatType:i.getter=G,i.inputSize=2}else{if(2!=i.type)throw new Error("EXRLoader.parse: unsupported pixelType "+i.type+" for "+e.compression+".");switch(a){case FloatType:i.getter=B,i.inputSize=4;break;case HalfFloatType:i.getter=F,i.inputSize=4}}i.blockCount=(e.dataWindow.yMax+1)/i.scanlineBlockSize;for(let e=0;e<i.blockCount;e++)k(t,r);i.outputChannels=3==i.channels?4:i.channels;const s=i.width*i.height*i.outputChannels;switch(a){case FloatType:i.byteArray=new Float32Array(s),i.channels<i.outputChannels&&i.byteArray.fill(1,0,s);break;case HalfFloatType:i.byteArray=new Uint16Array(s),i.channels<i.outputChannels&&i.byteArray.fill(15360,0,s);break;default:console.error("THREE.EXRLoader: unsupported type: ",a)}return i.bytesPerLine=i.width*i.inputSize*i.channels,4==i.outputChannels?(i.format=RGBAFormat,i.colorSpace=LinearSRGBColorSpace):(i.format=RedFormat,i.colorSpace=NoColorSpace),i}(K,j,z,W,this.type),Y={value:0},Q={R:0,G:1,B:2,A:3,Y:0};for(let e=0;e<X.height/X.scanlineBlockSize;e++){const t=O(j,W);X.size=O(j,W),X.lines=t+X.scanlineBlockSize>X.height?X.height-t:X.scanlineBlockSize;const n=X.size<X.lines*X.bytesPerLine?X.uncompress(X):M(X);W.value+=X.size;for(let t=0;t<X.scanlineBlockSize;t++){const r=t+e*X.scanlineBlockSize;if(r>=X.height)break;for(let e=0;e<X.channels;e++){const a=Q[K.channels[e].name];for(let i=0;i<X.width;i++){Y.value=(t*(X.channels*X.width)+e*X.width+i)*X.inputSize;const s=(X.height-1-r)*(X.width*X.outputChannels)+i*X.outputChannels+a;X.byteArray[s]=X.getter(n,Y)}}}}return{header:K,width:X.width,height:X.height,data:X.byteArray,format:X.format,colorSpace:X.colorSpace,type:this.type}}setDataType(e){return this.type=e,this}load(e,t,n,r){return super.load(e,(function(e,n){e.colorSpace=n.colorSpace,e.minFilter=LinearFilter,e.magFilter=LinearFilter,e.generateMipmaps=!1,e.flipY=!1,t&&t(e,n)}),n,r)}}class RGBELoader extends DataTextureLoader{constructor(e){super(e),this.type=HalfFloatType}parse(e){const t=function(e,t){switch(e){case 1:console.error("THREE.RGBELoader Read Error: "+(t||""));break;case 2:console.error("THREE.RGBELoader Write Error: "+(t||""));break;case 3:console.error("THREE.RGBELoader Bad File Format: "+(t||""));break;default:case 4:console.error("THREE.RGBELoader: Error: "+(t||""))}return-1},n=function(e,t,n){t=t||1024;let r=e.pos,a=-1,i=0,s="",o=String.fromCharCode.apply(null,new Uint16Array(e.subarray(r,r+128)));for(;0>(a=o.indexOf("\n"))&&i<t&&r<e.byteLength;)s+=o,i+=o.length,r+=128,o+=String.fromCharCode.apply(null,new Uint16Array(e.subarray(r,r+128)));return-1<a&&(!1!==n&&(e.pos+=i+a+1),s+o.slice(0,a))},r=function(e,t,n,r){const a=e[t+3],i=Math.pow(2,a-128)/255;n[r+0]=e[t+0]*i,n[r+1]=e[t+1]*i,n[r+2]=e[t+2]*i,n[r+3]=1},a=function(e,t,n,r){const a=e[t+3],i=Math.pow(2,a-128)/255;n[r+0]=DataUtils.toHalfFloat(Math.min(e[t+0]*i,65504)),n[r+1]=DataUtils.toHalfFloat(Math.min(e[t+1]*i,65504)),n[r+2]=DataUtils.toHalfFloat(Math.min(e[t+2]*i,65504)),n[r+3]=DataUtils.toHalfFloat(1)},i=new Uint8Array(e);i.pos=0;const s=function(e){const r=/^\s*GAMMA\s*=\s*(\d+(\.\d+)?)\s*$/,a=/^\s*EXPOSURE\s*=\s*(\d+(\.\d+)?)\s*$/,i=/^\s*FORMAT=(\S+)\s*$/,s=/^\s*\-Y\s+(\d+)\s+\+X\s+(\d+)\s*$/,o={valid:0,string:"",comments:"",programtype:"RGBE",format:"",gamma:1,exposure:1,width:0,height:0};let l,d;if(e.pos>=e.byteLength||!(l=n(e)))return t(1,"no header found");if(!(d=l.match(/^#\?(\S+)/)))return t(3,"bad initial token");for(o.valid|=1,o.programtype=d[1],o.string+=l+"\n";l=n(e),!1!==l;)if(o.string+=l+"\n","#"!==l.charAt(0)){if((d=l.match(r))&&(o.gamma=parseFloat(d[1])),(d=l.match(a))&&(o.exposure=parseFloat(d[1])),(d=l.match(i))&&(o.valid|=2,o.format=d[1]),(d=l.match(s))&&(o.valid|=4,o.height=parseInt(d[1],10),o.width=parseInt(d[2],10)),2&o.valid&&4&o.valid)break}else o.comments+=l+"\n";return 2&o.valid?4&o.valid?o:t(3,"missing image size specifier"):t(3,"missing format specifier")}(i);if(-1!==s){const e=s.width,n=s.height,o=function(e,n,r){const a=n;if(a<8||a>32767||2!==e[0]||2!==e[1]||128&e[2])return new Uint8Array(e);if(a!==(e[2]<<8|e[3]))return t(3,"wrong scanline width");const i=new Uint8Array(4*n*r);if(!i.length)return t(4,"unable to allocate buffer space");let s=0,o=0;const l=4*a,d=new Uint8Array(4),h=new Uint8Array(l);let c=r;for(;c>0&&o<e.byteLength;){if(o+4>e.byteLength)return t(1);if(d[0]=e[o++],d[1]=e[o++],d[2]=e[o++],d[3]=e[o++],2!=d[0]||2!=d[1]||(d[2]<<8|d[3])!=a)return t(3,"bad rgbe scanline format");let n,r=0;for(;r<l&&o<e.byteLength;){n=e[o++];const a=n>128;if(a&&(n-=128),0===n||r+n>l)return t(3,"bad scanline data");if(a){const t=e[o++];for(let e=0;e<n;e++)h[r++]=t}else h.set(e.subarray(o,o+n),r),r+=n,o+=n}const u=a;for(let e=0;e<u;e++){let t=0;i[s]=h[e+t],t+=a,i[s+1]=h[e+t],t+=a,i[s+2]=h[e+t],t+=a,i[s+3]=h[e+t],s+=4}c--}return i}(i.subarray(i.pos),e,n);if(-1!==o){let t,i,l;switch(this.type){case FloatType:l=o.length/4;const e=new Float32Array(4*l);for(let t=0;t<l;t++)r(o,4*t,e,4*t);t=e,i=FloatType;break;case HalfFloatType:l=o.length/4;const n=new Uint16Array(4*l);for(let e=0;e<l;e++)a(o,4*e,n,4*e);t=n,i=HalfFloatType;break;default:console.error("THREE.RGBELoader: unsupported type: ",this.type)}return{width:e,height:n,data:t,header:s.string,gamma:s.gamma,exposure:s.exposure,type:i}}}return null}setDataType(e){return this.type=e,this}load(e,t,n,r){return super.load(e,(function(e,n){switch(e.type){case FloatType:case HalfFloatType:e.colorSpace=LinearSRGBColorSpace,e.minFilter=LinearFilter,e.magFilter=LinearFilter,e.generateMipmaps=!1,e.flipY=!0}t&&t(e,n)}),n,r)}}const CopyTransformShader={uniforms:{tDiffuse:{value:null},colorTransform:{value:new Matrix4},colorBase:{value:new Vector4(0,0,0,0)},multiplyChannels:{value:0},uvTransform:{value:new Matrix3}},vertexShader:"\n varying vec2 vUv;\n uniform mat3 uvTransform;\n \n void main() {\n vUv = (uvTransform * vec3(uv, 1.0)).xy;\n gl_Position = (projectionMatrix * modelViewMatrix * vec4(position, 1.0)).xyww;\n }",fragmentShader:"\n uniform sampler2D tDiffuse;\n uniform mat4 colorTransform;\n uniform vec4 colorBase;\n uniform float multiplyChannels;\n varying vec2 vUv;\n \n void main() {\n vec4 color = colorTransform * texture2D(tDiffuse, vUv) + colorBase;\n color.rgb = mix(color.rgb, vec3(color.r * color.g * color.b), multiplyChannels);\n gl_FragColor = color;\n }"},DEFAULT_TRANSFORM=new Matrix4,RGB_TRANSFORM=(new Matrix4).set(1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0),ALPHA_TRANSFORM=(new Matrix4).set(0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0),RED_TRANSFORM=(new Matrix4).set(1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,1),GRAYSCALE_TRANSFORM=(new Matrix4).set(1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,1),ZERO_RGBA=new Vector4(0,0,0,0),ALPHA_RGBA=new Vector4(0,0,0,1),DEFAULT_UV_TRANSFORM=new Matrix3,FLIP_Y_UV_TRANSFORM=(new Matrix3).set(1,0,0,0,-1,1,0,0,1),interpolationMatrix=(e,t,n,r)=>(new Matrix4).set(e,0,0,1-e,0,t,0,1-t,0,0,n,1-n,0,0,0,r);var CopyMaterialBlendMode;!function(e){e[e.DEFAULT=0]="DEFAULT",e[e.ADDITIVE=1]="ADDITIVE"}(CopyMaterialBlendMode||(CopyMaterialBlendMode={}));class CopyTransformMaterial extends ShaderMaterial{constructor(e,t=CopyMaterialBlendMode.ADDITIVE){const n=t===CopyMaterialBlendMode.ADDITIVE?{blendSrc:DstColorFactor,blendDst:ZeroFactor,blendEquation:AddEquation,blendSrcAlpha:DstAlphaFactor,blendDstAlpha:ZeroFactor,blendEquationAlpha:AddEquation}:{};super({uniforms:UniformsUtils.clone(CopyTransformShader.uniforms),vertexShader:CopyTransformShader.vertexShader,fragmentShader:CopyTransformShader.fragmentShader,transparent:!0,depthTest:!1,depthWrite:!1,...n}),this.update(e)}update(e){return void 0!==(null==e?void 0:e.texture)&&(this.uniforms.tDiffuse.value=null==e?void 0:e.texture),void 0!==(null==e?void 0:e.colorTransform)&&(this.uniforms.colorTransform.value=null==e?void 0:e.colorTransform),void 0!==(null==e?void 0:e.colorBase)&&(this.uniforms.colorBase.value=null==e?void 0:e.colorBase),void 0!==(null==e?void 0:e.multiplyChannels)&&(this.uniforms.multiplyChannels.value=null==e?void 0:e.multiplyChannels),void 0!==(null==e?void 0:e.uvTransform)&&(this.uniforms.uvTransform.value=null==e?void 0:e.uvTransform),void 0!==(null==e?void 0:e.blending)&&(this.blending=null==e?void 0:e.blending),void 0!==(null==e?void 0:e.blendSrc)&&(this.blendSrc=null==e?void 0:e.blendSrc),void 0!==(null==e?void 0:e.blendDst)&&(this.blendDst=null==e?void 0:e.blendDst),void 0!==(null==e?void 0:e.blendEquation)&&(this.blendEquation=null==e?void 0:e.blendEquation),void 0!==(null==e?void 0:e.blendSrcAlpha)&&(this.blendSrcAlpha=null==e?void 0:e.blendSrcAlpha),void 0!==(null==e?void 0:e.blendDstAlpha)&&(this.blendDstAlpha=null==e?void 0:e.blendDstAlpha),void 0!==(null==e?void 0:e.blendEquationAlpha)&&(this.blendEquationAlpha=null==e?void 0:e.blendEquationAlpha),this}}const BlurShader={uniforms:{tDiffuse:{value:null},rangeMin:{value:new Vector2(1/512,1/512)},rangeMax:{value:new Vector2(1/512,1/512)}},vertexShader:"\n varying vec2 vUv;\n void main() {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n }",fragmentShader:"\n uniform sampler2D tDiffuse;\n uniform vec2 rangeMin;\n uniform vec2 rangeMax;\n varying vec2 vUv;\n \n void main() {\n vec4 baseColor = texture2D(tDiffuse, vUv);\n vec2 blur = mix(rangeMax, rangeMin, baseColor.a);\n vec4 sum = vec4( 0.0 );\n sum += texture2D(tDiffuse, vUv - 1.0 * blur) * 0.051;\n sum += texture2D(tDiffuse, vUv - 0.75 * blur) * 0.0918;\n sum += texture2D(tDiffuse, vUv - 0.5 * blur) * 0.12245;\n sum += texture2D(tDiffuse, vUv - 0.25 * blur) * 0.1531;\n sum += baseColor * 0.1633;\n sum += texture2D(tDiffuse, vUv + 0.25 * blur) * 0.1531;\n sum += texture2D(tDiffuse, vUv + 0.5 * blur) * 0.12245;\n sum += texture2D(tDiffuse, vUv + 0.75 * blur) * 0.0918;\n sum += texture2D(tDiffuse, vUv + 1.0 * blur) * 0.051;\n gl_FragColor = sum;\n }"};new Vector2(.1,.9),new Vector2(.1,.9);class LinearDepthRenderMaterial extends ShaderMaterial{constructor(e){super({defines:Object.assign({},LinearDepthRenderMaterial._linearDepthShader.defines),uniforms:UniformsUtils.clone(LinearDepthRenderMaterial._linearDepthShader.uniforms),vertexShader:LinearDepthRenderMaterial._linearDepthShader.vertexShader,fragmentShader:LinearDepthRenderMaterial._linearDepthShader.fragmentShader,blending:NoBlending}),this.update(e)}update(e){if(void 0!==(null==e?void 0:e.depthTexture)&&(this.uniforms.tDepth.value=null==e?void 0:e.depthTexture),void 0!==(null==e?void 0:e.camera)){const t=(null==e?void 0:e.camera)||(null==e?void 0:e.camera);this.uniforms.cameraNear.value=t.near,this.uniforms.cameraFar.value=t.far}return void 0!==(null==e?void 0:e.depthFilter)&&(this.uniforms.depthFilter.value=null==e?void 0:e.depthFilter),this}}LinearDepthRenderMaterial._linearDepthShader={uniforms:{tDepth:{value:null},depthFilter:{value:new Vector4(1,0,0,0)},cameraNear:{value:.1},cameraFar:{value:1}},defines:{PERSPECTIVE_CAMERA:1,ALPHA_DEPTH:0},vertexShader:"varying vec2 vUv;\n void main() {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n }",fragmentShader:"uniform sampler2D tDepth;\n uniform vec4 depthFilter;\n uniform float cameraNear;\n uniform float cameraFar;\n varying vec2 vUv;\n \n #include <packing>\n \n float getLinearDepth(const in vec2 screenPosition) {\n float fragCoordZ = dot(texture2D(tDepth, screenPosition), depthFilter);\n #if PERSPECTIVE_CAMERA == 1\n float viewZ = perspectiveDepthToViewZ(fragCoordZ, cameraNear, cameraFar);\n return viewZToOrthographicDepth(viewZ, cameraNear, cameraFar);\n #else\n return fragCoordZ;\n #endif\n }\n \n void main() {\n float depth = getLinearDepth(vUv);\n gl_FragColor = vec4(vec3(1.0 - depth), 1.0);\n }"};class NormalAndDepthRenderMaterial extends ShaderMaterial{constructor(e){var t;super({defines:Object.assign({...NormalAndDepthRenderMaterial._normalAndDepthShader.defines,FLOAT_BUFFER:(null==e?void 0:e.floatBufferType)?1:0,LINEAR_DEPTH:(null==e?void 0:e.linearDepth)?1:0}),uniforms:UniformsUtils.clone(NormalAndDepthRenderMaterial._normalAndDepthShader.uniforms),vertexShader:NormalAndDepthRenderMaterial._normalAndDepthShader.vertexShader,fragmentShader:NormalAndDepthRenderMaterial._normalAndDepthShader.fragmentShader,blending:null!==(t=null==e?void 0:e.blending)&&void 0!==t?t:NoBlending}),this.update(e)}update(e){if(void 0!==(null==e?void 0:e.camera)){const t=(null==e?void 0:e.camera)||(null==e?void 0:e.camera);this.uniforms.cameraNear.value=t.near,this.uniforms.cameraFar.value=t.far}return this}}NormalAndDepthRenderMaterial._normalAndDepthShader={uniforms:{cameraNear:{value:.1},cameraFar:{value:1}},defines:{FLOAT_BUFFER:0,LINEAR_DEPTH:0},vertexShader:"varying vec3 vNormal;\n#if LINEAR_DEPTH == 1\n varying float vZ; \n#endif\n\n void main() {\n vNormal = normalMatrix * normal;\n vec4 viewPosition = modelViewMatrix * vec4(position, 1.0);\n #if LINEAR_DEPTH == 1\n vZ = viewPosition.z; \n #endif\n gl_Position = projectionMatrix * viewPosition;\n }",fragmentShader:"varying vec3 vNormal;\n#if LINEAR_DEPTH == 1\n varying float vZ; \n uniform float cameraNear;\n uniform float cameraFar;\n#endif\n\n void main() {\n #if FLOAT_BUFFER == 1\n vec3 normal = normalize(vNormal);\n #else\n vec3 normal = normalize(vNormal) * 0.5 + 0.5;\n #endif\n #if LINEAR_DEPTH == 1\n float depth = (-vZ - cameraNear) / (cameraFar - cameraNear);\n #else\n float depth = gl_FragCoord.z;\n #endif\n gl_FragColor = vec4(normal, depth);\n }"};const _camera=new OrthographicCamera(-1,1,1,-1,0,1),_geometry=new BufferGeometry;_geometry.setAttribute("position",new Float32BufferAttribute([-1,3,0,-1,-1,0,3,-1,0],3)),_geometry.setAttribute("uv",new Float32BufferAttribute([0,2,0,0,2,0],2));class FullScreenQuad{constructor(e){this._mesh=new Mesh(_geometry,e)}dispose(){this._mesh.geometry.dispose()}render(e){e.render(this._mesh,_camera)}get material(){return this._mesh.material}set material(e){this._mesh.material=e}}new TextureLoader;class SceneVolume{constructor(){this.bounds=new Box3(new Vector3(-1,-1,-1),new Vector3(1,1,1)),this.size=new Vector3(2,2,2),this.center=new Vector3(0,0,0),this.maxSceneDistanceFromCenter=Math.sqrt(3),this.maxSceneDistanceFrom0=Math.sqrt(3)}copyFrom(e){this.bounds.copy(e.bounds),this.size.copy(e.size),this.center.copy(e.center),this.maxSceneDistanceFromCenter=e.maxSceneDistanceFromCenter,this.maxSceneDistanceFrom0=e.maxSceneDistanceFrom0}updateFromObject(e){e.updateMatrixWorld(),this.bounds.setFromObject(e),this.updateFromBox(this.bounds)}updateFromBox(e){this.bounds!==e&&this.bounds.copy(e),this.bounds.getSize(this.size),this.bounds.getCenter(this.center),this.maxSceneDistanceFromCenter=this.size.length()/2,this.maxSceneDistanceFrom0=new Vector3(Math.max(Math.abs(this.bounds.min.x),Math.abs(this.bounds.max.x)),Math.max(Math.abs(this.bounds.min.y),Math.abs(this.bounds.max.y)),Math.max(Math.abs(this.bounds.min.z),Math.abs(this.bounds.max.z))).length()}updateCameraViewVolumeFromBounds(e){e.updateMatrixWorld();const t=this.bounds.clone().applyMatrix4(e.matrixWorldInverse);e instanceof OrthographicCamera?((e,t)=>{e.left=t.min.x,e.right=t.max.x,e.bottom=t.min.y,e.top=t.max.y,e.near=Math.min(-t.min.z,-t.max.z),e.far=Math.max(-t.min.z,-t.max.z),e.updateProjectionMatrix()})(e,t):e instanceof PerspectiveCamera&&((e,t)=>{const n=Math.min(-t.min.z,-t.max.z),r=Math.max(-t.min.z,-t.max.z);if(n<.001)return;const a=Math.max(Math.abs(t.min.x),Math.abs(t.max.x)),i=Math.max(Math.abs(t.min.y),Math.abs(t.max.y));e.aspect=a/i,e.fov=MathUtils.radToDeg(2*Math.atan2(i,n)),e.near=n,e.far=r,e.updateProjectionMatrix()})(e,t)}getNearAndFarForPerspectiveCamera(e,t=1){const n=e.clone().sub(this.center).length();return[Math.max(.01,n-this.maxSceneDistanceFromCenter-.01),n+this.maxSceneDistanceFromCenter*t+.01]}}class CameraUpdate{changed(e){var t,n;const r=!(null===(t=this._lastCameraProjection)||void 0===t?void 0:t.equals(e.projectionMatrix))||!(null===(n=this._lastCameraWorld)||void 0===n?void 0:n.equals(e.matrixWorld));return this._lastCameraProjection=e.projectionMatrix.clone(),this._lastCameraWorld=e.matrixWorld.clone(),r}}class RenderPass{constructor(){this._originalClearColor=new Color$1,this._originalClearAlpha=0,this._originalAutoClear=!1,this._originalRenderTarget=null,this._screenSpaceQuad=new FullScreenQuad(void 0),this._emptyScene=new Scene,this._defaultCamera=new PerspectiveCamera}renderWithOverrideMaterial(e,t,n,r,a,i,s){this._backup(e),this._prepareRenderer(e,a,i,s);const o=t.overrideMaterial;t.overrideMaterial=r,e.render(t,n),t.overrideMaterial=o,this._restore(e)}clear(e,t,n,r){this._backup(e),this._prepareRenderer(e,t,n,r),e.render(this._emptyScene,this._defaultCamera),this._restore(e)}render(e,t,n,r,a,i){this._backup(e),this._prepareRenderer(e,r,a,i),e.render(t,n),this._restore(e)}renderScreenSpace(e,t,n,r,a){this._backup(e),this._prepareRenderer(e,n,r,a),this._screenSpaceQuad.material=t,this._screenSpaceQuad.render(e),this._restore(e)}_prepareRenderer(e,t,n,r){e.setRenderTarget(t),e.autoClear=!1,null!=n&&(e.setClearColor(n),e.setClearAlpha(r||0),e.clear())}_backup(e){e.getClearColor(this._originalClearColor),this._originalClearAlpha=e.getClearAlpha(),this._originalAutoClear=e.autoClear,this._originalRenderTarget=e.getRenderTarget()}_restore(e){e.setClearColor(this._originalClearColor),e.setClearAlpha(this._originalClearAlpha),e.setRenderTarget(this._originalRenderTarget),e.autoClear=this._originalAutoClear}}class BlurPass{constructor(e,t){var n;this._renderPass=null!==(n=null==t?void 0:t._renderPass)&&void 0!==n?n:new RenderPass,this._blurMaterial=new ShaderMaterial(null!=e?e:BlurShader),this._blurMaterial.depthTest=!1}dispose(){this._blurMaterial.dispose()}render(e,t,n,r){this._blurMaterial.uniforms.tDiffuse.value=t[0].texture,this._blurMaterial.uniforms.rangeMin.value.x=n[0],this._blurMaterial.uniforms.rangeMin.value.y=0,this._blurMaterial.uniforms.rangeMax.value.x=r[0],this._blurMaterial.uniforms.rangeMax.value.y=0,this._renderPass.renderScreenSpace(e,this._blurMaterial,t[1]),this._blurMaterial.uniforms.tDiffuse.value=t[1].texture,this._blurMaterial.uniforms.rangeMin.value.x=0,this._blurMaterial.uniforms.rangeMin.value.y=n[1],this._blurMaterial.uniforms.rangeMax.value.x=0,this._blurMaterial.uniforms.rangeMax.value.y=r[1],this._renderPass.renderScreenSpace(e,this._blurMaterial,t[2])}}class RenderCacheMapItem{constructor(e){this.needsUpdate=!0,this._cache=null,this._cache=e}dispose(){var e;null===(e=this._cache)||void 0===e||e.dispose()}clear(){var e;null===(e=this._cache)||void 0===e||e.clear(),this.needsUpdate=!0}update(e){this.needsUpdate&&this._cache&&(e.traverse(e=>{var t,n,r;e.isLine||e.isPoints?null===(t=this._cache)||void 0===t||t.addLineOrPoint(e):e.isMesh?null===(n=this._cache)||void 0===n||n.addMesh(e):null===(r=this._cache)||void 0===r||r.addObject(e)}),this.needsUpdate=!1)}onBeforeRender(){var e;null===(e=this._cache)||void 0===e||e.onBeforeRender()}onAfterRender(){var e;null===(e=this._cache)||void 0===e||e.onAfterRender()}}class RenderCacheManager{constructor(){this._cacheMap=new Map}dispose(){this._cacheMap.forEach(e=>{e.dispose()})}registerCache(e,t){this._cacheMap.set(e,new RenderCacheMapItem(t))}clearCache(){this._cacheMap.forEach(e=>{e.clear()})}clearObjectCache(e){const t=this._cacheMap.get(e);t&&t.clear()}onBeforeRender(e,t){const n=this._cacheMap.get(e);n&&(n.update(t),n.onBeforeRender())}onAfterRender(e){const t=this._cacheMap.get(e);t&&t.onAfterRender()}render(e,t,n){const r=this._cacheMap.get(e);r&&(r.update(t),r.onBeforeRender()),n(),r&&r.onAfterRender()}}class VisibilityRenderCache{constructor(e){this._visibilityCache=new Map,this._isObjectInvisible=e}dispose(){this._visibilityCache.clear()}clear(){this._visibilityCache.clear()}addLineOrPoint(e){this._visibilityCache.set(e,e.visible)}addMesh(e){this._isObjectInvisible&&this._isObjectInvisible(e)&&this._visibilityCache.set(e,e.visible)}addObject(e){this._isObjectInvisible&&this._isObjectInvisible(e)&&this._visibilityCache.set(e,e.visible)}onBeforeRender(){this._visibilityCache.forEach((e,t)=>{t.visible=!1})}onAfterRender(){this._visibilityCache.forEach((e,t)=>{t.visible=e})}}class DepthWriteRenderCache{constructor(e){this._depthWriteCache=new Set,this._doNotWriteDepth=e}dispose(){this._depthWriteCache.clear()}clear(){this._depthWriteCache.clear()}addLineOrPoint(e){}addObject(e){}addMesh(e){this._doNotWriteDepth&&this._doNotWriteDepth(e)&&e.material instanceof MeshStandardMaterial&&e.material.depthWrite&&this._depthWriteCache.add(e.material)}onBeforeRender(){this._depthWriteCache.forEach(e=>{e.depthWrite=!1})}onAfterRender(){this._depthWriteCache.forEach(e=>{e.depthWrite=!0})}}class GBufferRenderTargets{get isFloatGBufferWithRgbNormalAlphaDepth(){return this.floatGBufferRgbNormalAlphaDepth}get gBufferTexture(){return this.depthNormalRenderTarget.texture}get depthBufferTexture(){return this.copyToSeparateDepthBuffer&&this.floatGBufferRgbNormalAlphaDepth?this.separateDeptRenderTarget.texture:this.depthNormalRenderTarget.depthTexture}get textureWithDepthValue(){return this.floatGBufferRgbNormalAlphaDepth?this.depthNormalRenderTarget.texture:this.depthNormalRenderTarget.depthTexture}get normalRenderMaterial(){var e;return this._normalRenderMaterial=null!==(e=this._normalRenderMaterial)&&void 0!==e?e:this.floatGBufferRgbNormalAlphaDepth?new NormalAndDepthRenderMaterial({blending:NoBlending,floatBufferType:!0,linearDepth:!1}):new MeshNormalMaterial({blending:NoBlending}),this._normalRenderMaterial}get depthNormalRenderTarget(){if(!this._depthNormalRenderTarget)if(this.floatGBufferRgbNormalAlphaDepth)this._depthNormalRenderTarget=new WebGLRenderTarget(this._width*this.parameters.depthNormalScale,this._height*this.parameters.depthNormalScale,{minFilter:this._targetMinificationTextureFilter,magFilter:this._targetMagnificationTextureFilter,type:FloatType,samples:this._samples});else{const e=new DepthTexture(this._width*this.parameters.depthNormalScale,this._height*this.parameters.depthNormalScale);e.format=DepthStencilFormat,e.type=UnsignedInt248Type,this._depthNormalRenderTarget=new WebGLRenderTarget(this._width*this.parameters.depthNormalScale,this._height*this.parameters.depthNormalScale,{minFilter:this._targetMinificationTextureFilter,magFilter:this._targetMagnificationTextureFilter,depthTexture:e})}return this._depthNormalRenderTarget}get separateDeptRenderTarget(){return this._separateDeptRenderTarget||(this._separateDeptRenderTarget=new WebGLRenderTarget(this._width*this.parameters.depthNormalScale,this._height*this.parameters.depthNormalScale,{minFilter:this._targetMinificationTextureFilter,magFilter:this._targetMagnificationTextureFilter,type:FloatType,samples:0})),this._separateDeptRenderTarget}constructor(e,t){var n,r,a,i,s,o,l,d,h,c;this.floatGBufferRgbNormalAlphaDepth=!1,this.copyToSeparateDepthBuffer=!1,this.needsUpdate=!0,this.floatGBufferRgbNormalAlphaDepth=null!==(r=null===(n=null==t?void 0:t.capabilities)||void 0===n?void 0:n.isWebGL2)&&void 0!==r&&r,this._renderCacheManager=e,this._renderCacheManager&&this._renderCacheManager.registerCache(this,new VisibilityRenderCache(e=>{if(e.isMesh&&e.material){if(e.material.transparent&&e.material.opacity<.7||e.material.alphaTest>0)return!0;if(e.material instanceof MeshPhysicalMaterial)return e.material.transmission>0}return!1})),this.parameters={depthNormalScale:null!==(a=null==t?void 0:t.depthNormalScale)&&void 0!==a?a:1},this._targetMinificationTextureFilter=null!==(i=null==t?void 0:t.textureMinificationFilter)&&void 0!==i?i:NearestFilter,this._targetMagnificationTextureFilter=null!==(s=null==t?void 0:t.textureMagnificationFilter)&&void 0!==s?s:NearestFilter,this._width=null!==(o=null==t?void 0:t.width)&&void 0!==o?o:1024,this._height=null!==(l=null==t?void 0:t.height)&&void 0!==l?l:1024,this._samples=null!==(d=null==t?void 0:t.samples)&&void 0!==d?d:0,this._shared=null!==(h=null==t?void 0:t.shared)&&void 0!==h&&h,this._renderPass=null!==(c=null==t?void 0:t.renderPass)&&void 0!==c?c:new RenderPass}dispose(){var e,t;null===(e=this._normalRenderMaterial)||void 0===e||e.dispose(),null===(t=this._depthNormalRenderTarget)||void 0===t||t.dispose()}setSize(e,t){var n;this._width=e,this._height=t,null===(n=this._depthNormalRenderTarget)||void 0===n||n.setSize(this._width*this.parameters.depthNormalScale,this._height*this.parameters.depthNormalScale)}render(e,t,n){if(this._shared&&!this.needsUpdate)return;this.needsUpdate=!1;const r=this.normalRenderMaterial;r instanceof NormalAndDepthRenderMaterial&&r.update({camera:n}),this._renderCacheManager?this._renderCacheManager.render(this,t,()=>{this._renderGBuffer(e,t,n)}):this._renderGBuffer(e,t,n),this.floatGBufferRgbNormalAlphaDepth&&this.copyToSeparateDepthBuffer&&this._copyDepthToSeparateDepthTexture(e,this.depthNormalRenderTarget)}_renderGBuffer(e,t,n){this._renderPass.renderWithOverrideMaterial(e,t,n,this.normalRenderMaterial,this.depthNormalRenderTarget,7829503,1)}getCopyMaterial(e){var t;return null!==(t=this._copyMaterial)&&void 0!==t||(this._copyMaterial=new CopyTransformMaterial),this._copyMaterial.update(e)}_copyDepthToSeparateDepthTexture(e,t){this._renderPass.renderScreenSpace(e,this.getCopyMaterial({texture:t.texture,blending:NoBlending,colorTransform:ALPHA_TRANSFORM,colorBase:ALPHA_RGBA,multiplyChannels:0,uvTransform:DEFAULT_UV_TRANSFORM}),this.separateDeptRenderTarget)}}class BakedGroundContactShadow{constructor(e,t,n){var r;this.needsUpdate=!0,this.noNeedOfUpdateCount=0,this._blurScale=1,this._shadowScale=1,this._groundGroup=t,this.shadowMapSize=null!==(r=n.shadowMapSize)&&void 0!==r?r:2048,this.parameters=this._getDefaultParameters(n),this._groundShadowFar=this.parameters.cameraFar,this._renderer=e,this._renderCacheManager=null==n?void 0:n._renderCacheManager,this._renderCacheManager&&this._renderCacheManager.registerCache(this,new VisibilityRenderCache(e=>e.isMesh&&!(e=>{var t;if(!e.isMesh)return!1;if(!e.castShadow&&!(null===(t=e.userData)||void 0===t?void 0:t.meshId))return!1;const n=e.material;return!n.transparent||n.opacity>.5})(e)||void 0!==e.name&&["Ground","Floor"].includes(e.name))),this.renderTarget=new WebGLRenderTarget(this.shadowMapSize,this.shadowMapSize),this.renderTarget.texture.generateMipmaps=!1,this._renderTargetBlur=new WebGLRenderTarget(this.shadowMapSize,this.shadowMapSize),this._renderTargetBlur.texture.generateMipmaps=!1,this.shadowGroundPlane=new ShadowGroundPlane(this.renderTarget.texture,this.parameters),this._groundGroup.add(this.shadowGroundPlane),this._groundContactCamera=new GroundContactCamera,this._groundGroup.add(this._groundContactCamera),this._depthMaterial=new MeshDepthMaterial,this._depthMaterial.userData.fadeoutBias={value:this.parameters.fadeoutBias},this._depthMaterial.userData.fadeoutFalloff={value:this.parameters.fadeoutFalloff},this._depthMaterial.onBeforeCompile=e=>{e.uniforms.fadeoutBias=this._depthMaterial.userData.fadeoutBias,e.uniforms.fadeoutFalloff=this._depthMaterial.userData.fadeoutFalloff,e.fragmentShader=`\n uniform float fadeoutBias;\n uniform float fadeoutFalloff;\n ${e.fragmentShader.replace("gl_FragColor = vec4( vec3( 1.0 - fragCoordZ ), opacity );",ShadowGroundPlane.alphaMap?"gl_FragColor = vec4(clamp(pow(1.0 + fadeoutBias - fragCoordZ, 1.0/(1.0-fadeoutFalloff)), 0.0, 1.0));":"gl_FragColor = vec4(vec3(0.0), clamp(pow(1.0 + fadeoutBias - fragCoordZ, 1.0/(1.0-fadeoutFalloff)), 0.0, 1.0));")}\n `},this._depthMaterial.side=DoubleSide,this._depthMaterial.depthTest=!0,this._depthMaterial.depthWrite=!0,this._blurPass=new BlurPass(BlurShader,n),this.updatePlaneAndShadowCamera()}_getDefaultParameters(e){return{enabled:!0,cameraHelper:!1,alwaysUpdate:!1,fadeIn:!1,blurMin:.001,blurMax:.1,fadeoutFalloff:.9,fadeoutBias:.03,opacity:.5,maximumPlaneSize:20,planeSize:10,cameraFar:3,hardLayers:null,softLayers:null,polygonOffset:2,excludeGroundObjects:!0,...e}}dispose(){this.renderTarget.dispose(),this._renderTargetBlur.dispose(),this._blurPass.dispose(),this._depthMaterial.dispose()}updateParameters(e){for(let t in e)this.parameters.hasOwnProperty(t)&&(this.parameters[t]=e[t]);void 0!==e.cameraFar&&(this._groundShadowFar=this.parameters.cameraFar)}applyParameters(){this.shadowGroundPlane.updateMaterial(this.parameters),this._groundContactCamera.updateCameraHelper(this.parameters.cameraHelper),this._groundContactCamera.far!==this.parameters.cameraFar&&this.updatePlaneAndShadowCamera();const e=this.parameters.fadeoutFalloff;this._depthMaterial.userData.fadeoutFalloff.value!==e&&(this._depthMaterial.userData.fadeoutFalloff.value=this.parameters.fadeoutFalloff);const t=this.parameters.fadeoutBias/this._groundContactCamera.far;this._depthMaterial.userData.fadeoutBias.value!==t&&(this._depthMaterial.userData.fadeoutBias.value=t),this.needsUpdate=!0}setScale(e,t){this._blurScale=e,this._shadowScale=null!=t?t:e,this.needsUpdate=!0}updateBounds(e,t){var n;this._groundShadowFar=this.parameters.cameraFar,this._groundShadowFar<e.size.z&&(this._groundShadowFar=1.01*e.size.z);const r=Math.max(e.size.x,e.size.z);this.parameters.planeSize=r+2*Math.max(this._blurScale,null!==(n=this._shadowScale)&&void 0!==n?n:1,1),this.parameters.planeSize>this.parameters.maximumPlaneSize?(this.parameters.planeSize=this.parameters.maximumPlaneSize,this._groundGroup.position.set(0,null!=t?t:0,0)):this._groundGroup.position.set(e.center.x,null!=t?t:0,e.center.z),this._groundGroup.updateMatrixWorld(),this.updatePlaneAndShadowCamera()}updatePlaneAndShadowCamera(){const e=this.parameters.planeSize;this.shadowGroundPlane.scale.x=e,this.shadowGroundPlane.scale.y=e,this._groundContactCamera.updateCameraFormPlaneSize(e,this._groundShadowFar),this.needsUpdate=!0}setGroundVisibility(e,t){this.shadowGroundPlane.updateVisibility(e)}render(e){if(this._groundContactCamera.updateCameraHelper(this.parameters.cameraHelper,e),this.shadowGroundPlane.visible=this.parameters.enabled,this.parameters.alwaysUpdate||this.needsUpdate)this.noNeedOfUpdateCount=0;else if(this.noNeedOfUpdateCount++,this.noNeedOfUpdateCount>=10)return;this.needsUpdate=!1,this.shadowGroundPlane.material.opacity=this.parameters.alwaysUpdate||!this.parameters.fadeIn?this.parameters.opacity:this.parameters.opacity*(this.noNeedOfUpdateCount+2)/12;const t=this._renderer.getClearAlpha();this._renderer.setClearAlpha(0),this._groundGroup.visible=!1,this.shadowGroundPlane.visible=!1,this._groundContactCamera.setCameraHelperVisibility(!1),0===this.noNeedOfUpdateCount?(this._renderGroundContact(e),this._renderBlur()):1===this.noNeedOfUpdateCount&&this._renderBlur(),this._renderReduceBandingBlur(),this._renderer.setRenderTarget(null),this._renderer.setClearAlpha(t),this._groundGroup.visible=!0,this.shadowGroundPlane.visible=this.parameters.enabled,this._groundContactCamera.setCameraHelperVisibility(this.parameters.cameraHelper)}_renderGroundContact(e){const t=e.background;e.background=null,e.overrideMaterial=this._depthMaterial,this._renderer.setRenderTarget(this.renderTarget),this._renderer.clear();const n=this._renderer.autoClear;this._renderer.autoClear=!1,this.parameters.hardLayers&&(this._groundContactCamera.layers.mask=this.parameters.hardLayers.mask,this._groundContactCamera.updateCameraFarPlane(10),this._depthMaterial.userData.fadeoutBias.value=.99,this._renderer.render(e,this._groundContactCamera),this._groundContactCamera.updateCameraFarPlane(this._groundShadowFar),this._depthMaterial.userData.fadeoutBias.value=this.parameters.fadeoutBias/this._groundShadowFar),this._groundContactCamera.layers.enableAll(),this.parameters.softLayers&&(this._groundContactCamera.layers.mask=this.parameters.softLayers.mask),this._renderCacheManager?this._renderCacheManager.render(this,e,()=>{this._renderer.render(e,this._groundContactCamera)}):this._renderer.render(e,this._groundContactCamera),this._renderer.autoClear=n,e.overrideMaterial=null,e.background=t}_renderBlur(){this._renderBlurPass(this._blurScale*this.parameters.blurMin/this.parameters.planeSize,this._blurScale*this.parameters.blurMax/this.parameters.planeSize)}_renderReduceBandingBlur(){const e=.01*this._blurScale/this.parameters.planeSize;this._renderBlurPass(e,e)}_renderBlurPass(e,t){this._blurPass.render(this._renderer,[this.renderTarget,this._renderTargetBlur,this.renderTarget],[e,e],[t,t])}}BakedGroundContactShadow.addTestMesh=!1;class ShadowGroundPlane extends Mesh{constructor(e,t){const n=new MeshBasicMaterial({transparent:!0,depthWrite:!1});ShadowGroundPlane.alphaMap&&n.color.set(0),n.polygonOffset=!0,super(new PlaneGeometry(1,1,10,10),n),this.name="GroundContactShadowPlane",this.userData.isFloor=!0,this.renderOrder=1,this.receiveShadow=!1,this.layers.disableAll(),t&&this.updateMaterial(t),this.setShadowMap(e)}setVisibility(e){this.visible=e,this.visible?this.layers.enableAll():this.layers.disableAll()}setDepthWrite(e){const t=this.material;t.depthWrite=e,t.transparent=!e,t.needsUpdate=!0,this.setVisibility(e)}setReceiveShadow(e){this.receiveShadow=e,this.setVisibility(e)}setShadowMap(e){const t=this.material;t.map=e,ShadowGroundPlane.alphaMap&&(t.alphaMap=e),t.needsUpdate=!0}updateMaterial(e){const t=this.material;t.opacity!==e.opacity&&(t.opacity=e.opacity),t.polygonOffsetFactor!==e.polygonOffset&&(t.polygonOffset=!0,t.polygonOffsetFactor=e.polygonOffset,t.polygonOffsetUnits=e.polygonOffset)}updateVisibility(e){e?this.layers.enableAll():this.layers.disableAll()}}ShadowGroundPlane.alphaMap=!1;class GroundContactCamera extends OrthographicCamera{constructor(){super(-1,1,-1,1,-1,1),this.rotation.x=Math.PI}updateCameraFormPlaneSize(e,t){var n;this.left=-e/2,this.right=e/2,this.top=-e/2,this.bottom=e/2,this.near=0,this.far=t,this.updateProjectionMatrix(),null===(n=this.cameraHelper)||void 0===n||n.update()}updateCameraFarPlane(e){var t;this.far=e,this.updateProjectionMatrix(),null===(t=this.cameraHelper)||void 0===t||t.update()}updateCameraHelper(e,t){var n,r,a;e?(this.cameraHelper=null!==(n=this.cameraHelper)&&void 0!==n?n:new CameraHelper(this),this.cameraHelper.visible=!0,null==t||t.add(this.cameraHelper)):(null===(r=this.cameraHelper)||void 0===r?void 0:r.parent)&&(null===(a=this.cameraHelper)||void 0===a||a.removeFromParent())}setCameraHelperVisibility(e){this.cameraHelper&&(this.cameraHelper.visible=e)}}const CopyShader={name:"CopyShader",uniforms:{tDiffuse:{value:null},opacity:{value:1}},vertexShader:"\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}",fragmentShader:"\n\n\t\tuniform float opacity;\n\n\t\tuniform sampler2D tDiffuse;\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvec4 texel = texture2D( tDiffuse, vUv );\n\t\t\tgl_FragColor = opacity * texel;\n\n\n\t\t}"},FXAAShader={uniforms:{tDiffuse:{value:null},resolution:{value:new Vector2(1/1024,1/512)}},vertexShader:"\n\n\t\tvarying vec2 vUv;\n\n\t\tvoid main() {\n\n\t\t\tvUv = uv;\n\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\n\t\t}",fragmentShader:"\n\tprecision highp float;\n\n\tuniform sampler2D tDiffuse;\n\n\tuniform vec2 resolution;\n\n\tvarying vec2 vUv;\n\n\t// FXAA 3.11 implementation by NVIDIA, ported to WebGL by Agost Biro (biro@archilogic.com)\n\n\t//----------------------------------------------------------------------------------\n\t// File: es3-keplerFXAAassetsshaders/FXAA_DefaultES.frag\n\t// SDK Version: v3.00\n\t// Email: gameworks@nvidia.com\n\t// Site: http://developer.nvidia.com/\n\t//\n\t// Copyright (c) 2014-2015, NVIDIA CORPORATION. All rights reserved.\n\t//\n\t// Redistribution and use in source and binary forms, with or without\n\t// modification, are permitted provided that the following conditions\n\t// are met:\n\t// * Redistributions of source code must retain the above copyright\n\t// notice, this list of conditions and the following disclaimer.\n\t// * Redistributions in binary form must reproduce the above copyright\n\t// notice, this list of conditions and the following disclaimer in the\n\t// documentation and/or other materials provided with the distribution.\n\t// * Neither the name of NVIDIA CORPORATION nor the names of its\n\t// contributors may be used to endorse or promote products derived\n\t// from this software without specific prior written permission.\n\t//\n\t// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ''AS IS'' AND ANY\n\t// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n\t// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\n\t// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR\n\t// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n\t// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n\t// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n\t// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY\n\t// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n\t// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n\t// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\t//\n\t//----------------------------------------------------------------------------------\n\n\t#ifndef FXAA_DISCARD\n\t\t\t//\n\t\t\t// Only valid for PC OpenGL currently.\n\t\t\t// Probably will not work when FXAA_GREEN_AS_LUMA = 1.\n\t\t\t//\n\t\t\t// 1 = Use discard on pixels which don't need AA.\n\t\t\t// For APIs which enable concurrent TEX+ROP from same surface.\n\t\t\t// 0 = Return unchanged color on pixels which don't need AA.\n\t\t\t//\n\t\t\t#define FXAA_DISCARD 0\n\t#endif\n\n\t/*--------------------------------------------------------------------------*/\n\t#define FxaaTexTop(t, p) texture2D(t, p, -100.0)\n\t#define FxaaTexOff(t, p, o, r) texture2D(t, p + (o * r), -100.0)\n\t/*--------------------------------------------------------------------------*/\n\n\t#define NUM_SAMPLES 5\n\n\t// assumes colors have premultipliedAlpha, so that the calculated color contrast is scaled by alpha\n\tfloat contrast( vec4 a, vec4 b ) {\n\t\t\tvec4 diff = abs( a - b );\n\t\t\treturn max( max( max( diff.r, diff.g ), diff.b ), diff.a );\n\t}\n\n\t/*============================================================================\n\n\t\t\t\t\t\t\t\t\tFXAA3 QUALITY - PC\n\n\t============================================================================*/\n\n\t/*--------------------------------------------------------------------------*/\n\tvec4 FxaaPixelShader(\n\t\t\tvec2 posM,\n\t\t\tsampler2D tex,\n\t\t\tvec2 fxaaQualityRcpFrame,\n\t\t\tfloat fxaaQualityEdgeThreshold,\n\t\t\tfloat fxaaQualityinvEdgeThreshold\n\t) {\n\t\t\tvec4 rgbaM = FxaaTexTop(tex, posM);\n\t\t\tvec4 rgbaS = FxaaTexOff(tex, posM, vec2( 0.0, 1.0), fxaaQualityRcpFrame.xy);\n\t\t\tvec4 rgbaE = FxaaTexOff(tex, posM, vec2( 1.0, 0.0), fxaaQualityRcpFrame.xy);\n\t\t\tvec4 rgbaN = FxaaTexOff(tex, posM, vec2( 0.0,-1.0), fxaaQualityRcpFrame.xy);\n\t\t\tvec4 rgbaW = FxaaTexOff(tex, posM, vec2(-1.0, 0.0), fxaaQualityRcpFrame.xy);\n\t\t\t// . S .\n\t\t\t// W M E\n\t\t\t// . N .\n\n\t\t\tbool earlyExit = max( max( max(\n\t\t\t\t\tcontrast( rgbaM, rgbaN ),\n\t\t\t\t\tcontrast( rgbaM, rgbaS ) ),\n\t\t\t\t\tcontrast( rgbaM, rgbaE ) ),\n\t\t\t\t\tcontrast( rgbaM, rgbaW ) )\n\t\t\t\t\t< fxaaQualityEdgeThreshold;\n\t\t\t// . 0 .\n\t\t\t// 0 0 0\n\t\t\t// . 0 .\n\n\t\t\t#if (FXAA_DISCARD == 1)\n\t\t\t\t\tif(earlyExit) FxaaDiscard;\n\t\t\t#else\n\t\t\t\t\tif(earlyExit) return rgbaM;\n\t\t\t#endif\n\n\t\t\tfloat contrastN = contrast( rgbaM, rgbaN );\n\t\t\tfloat contrastS = contrast( rgbaM, rgbaS );\n\t\t\tfloat contrastE = contrast( rgbaM, rgbaE );\n\t\t\tfloat contrastW = contrast( rgbaM, rgbaW );\n\n\t\t\tfloat relativeVContrast = ( contrastN + contrastS ) - ( contrastE + contrastW );\n\t\t\trelativeVContrast *= fxaaQualityinvEdgeThreshold;\n\n\t\t\tbool horzSpan = relativeVContrast > 0.;\n\t\t\t// . 1 .\n\t\t\t// 0 0 0\n\t\t\t// . 1 .\n\n\t\t\t// 45 deg edge detection and corners of objects, aka V/H contrast is too similar\n\t\t\tif( abs( relativeVContrast ) < .3 ) {\n\t\t\t\t\t// locate the edge\n\t\t\t\t\tvec2 dirToEdge;\n\t\t\t\t\tdirToEdge.x = contrastE > contrastW ? 1. : -1.;\n\t\t\t\t\tdirToEdge.y = contrastS > contrastN ? 1. : -1.;\n\t\t\t\t\t// . 2 . . 1 .\n\t\t\t\t\t// 1 0 2 ~= 0 0 1\n\t\t\t\t\t// . 1 . . 0 .\n\n\t\t\t\t\t// tap 2 pixels and see which ones are \"outside\" the edge, to\n\t\t\t\t\t// determine if the edge is vertical or horizontal\n\n\t\t\t\t\tvec4 rgbaAlongH = FxaaTexOff(tex, posM, vec2( dirToEdge.x, -dirToEdge.y ), fxaaQualityRcpFrame.xy);\n\t\t\t\t\tfloat matchAlongH = contrast( rgbaM, rgbaAlongH );\n\t\t\t\t\t// . 1 .\n\t\t\t\t\t// 0 0 1\n\t\t\t\t\t// . 0 H\n\n\t\t\t\t\tvec4 rgbaAlongV = FxaaTexOff(tex, posM, vec2( -dirToEdge.x, dirToEdge.y ), fxaaQualityRcpFrame.xy);\n\t\t\t\t\tfloat matchAlongV = contrast( rgbaM, rgbaAlongV );\n\t\t\t\t\t// V 1 .\n\t\t\t\t\t// 0 0 1\n\t\t\t\t\t// . 0 .\n\n\t\t\t\t\trelativeVContrast = matchAlongV - matchAlongH;\n\t\t\t\t\trelativeVContrast *= fxaaQualityinvEdgeThreshold;\n\n\t\t\t\t\tif( abs( relativeVContrast ) < .3 ) { // 45 deg edge\n\t\t\t\t\t\t\t// 1 1 .\n\t\t\t\t\t\t\t// 0 0 1\n\t\t\t\t\t\t\t// . 0 1\n\n\t\t\t\t\t\t\t// do a simple blur\n\t\t\t\t\t\t\treturn mix(\n\t\t\t\t\t\t\t\t\trgbaM,\n\t\t\t\t\t\t\t\t\t(rgbaN + rgbaS + rgbaE + rgbaW) * .25,\n\t\t\t\t\t\t\t\t\t.4\n\t\t\t\t\t\t\t);\n\t\t\t\t\t}\n\n\t\t\t\t\thorzSpan = relativeVContrast > 0.;\n\t\t\t}\n\n\t\t\tif(!horzSpan) rgbaN = rgbaW;\n\t\t\tif(!horzSpan) rgbaS = rgbaE;\n\t\t\t// . 0 . 1\n\t\t\t// 1 0 1 -> 0\n\t\t\t// . 0 . 1\n\n\t\t\tbool pairN = contrast( rgbaM, rgbaN ) > contrast( rgbaM, rgbaS );\n\t\t\tif(!pairN) rgbaN = rgbaS;\n\n\t\t\tvec2 offNP;\n\t\t\toffNP.x = (!horzSpan) ? 0.0 : fxaaQualityRcpFrame.x;\n\t\t\toffNP.y = ( horzSpan) ? 0.0 : fxaaQualityRcpFrame.y;\n\n\t\t\tbool doneN = false;\n\t\t\tbool doneP = false;\n\n\t\t\tfloat nDist = 0.;\n\t\t\tfloat pDist = 0.;\n\n\t\t\tvec2 posN = posM;\n\t\t\tvec2 posP = posM;\n\n\t\t\tint iterationsUsed = 0;\n\t\t\tint iterationsUsedN = 0;\n\t\t\tint iterationsUsedP = 0;\n\t\t\tfor( int i = 0; i < NUM_SAMPLES; i++ ) {\n\t\t\t\t\titerationsUsed = i;\n\n\t\t\t\t\tfloat increment = float(i + 1);\n\n\t\t\t\t\tif(!doneN) {\n\t\t\t\t\t\t\tnDist += increment;\n\t\t\t\t\t\t\tposN = posM + offNP * nDist;\n\t\t\t\t\t\t\tvec4 rgbaEndN = FxaaTexTop(tex, posN.xy);\n\t\t\t\t\t\t\tdoneN = contrast( rgbaEndN, rgbaM ) > contrast( rgbaEndN, rgbaN );\n\t\t\t\t\t\t\titerationsUsedN = i;\n\t\t\t\t\t}\n\n\t\t\t\t\tif(!doneP) {\n\t\t\t\t\t\t\tpDist += increment;\n\t\t\t\t\t\t\tposP = posM - offNP * pDist;\n\t\t\t\t\t\t\tvec4 rgbaEndP = FxaaTexTop(tex, posP.xy);\n\t\t\t\t\t\t\tdoneP = contrast( rgbaEndP, rgbaM ) > contrast( rgbaEndP, rgbaN );\n\t\t\t\t\t\t\titerationsUsedP = i;\n\t\t\t\t\t}\n\n\t\t\t\t\tif(doneN || doneP) break;\n\t\t\t}\n\n\n\t\t\tif ( !doneP && !doneN ) return rgbaM; // failed to find end of edge\n\n\t\t\tfloat dist = min(\n\t\t\t\t\tdoneN ? float( iterationsUsedN ) / float( NUM_SAMPLES - 1 ) : 1.,\n\t\t\t\t\tdoneP ? float( iterationsUsedP ) / float( NUM_SAMPLES - 1 ) : 1.\n\t\t\t);\n\n\t\t\t// hacky way of reduces blurriness of mostly diagonal edges\n\t\t\t// but reduces AA quality\n\t\t\tdist = pow(dist, .5);\n\n\t\t\tdist = 1. - dist;\n\n\t\t\treturn mix(\n\t\t\t\t\trgbaM,\n\t\t\t\t\trgbaN,\n\t\t\t\t\tdist * .5\n\t\t\t);\n\t}\n\n\tvoid main() {\n\t\t\tconst float edgeDetectionQuality = .2;\n\t\t\tconst float invEdgeDetectionQuality = 1. / edgeDetectionQuality;\n\n\t\t\tgl_FragColor = FxaaPixelShader(\n\t\t\t\t\tvUv,\n\t\t\t\t\ttDiffuse,\n\t\t\t\t\tresolution,\n\t\t\t\t\tedgeDetectionQuality, // [0,1] contrast needed, otherwise early discard\n\t\t\t\t\tinvEdgeDetectionQuality\n\t\t\t);\n\n\t}\n\t"};class OutlinePass extends class{constructor(){this.isPass=!0,this.enabled=!0,this.needsSwap=!0,this.clear=!1,this.renderToScreen=!1}setSize(){}render(){console.error("THREE.Pass: .render() must be implemented in derived pass.")}dispose(){}}{constructor(e,t,n,r,a){var i;super(),this.patternTexture=null,this._gBufferRenderTarget=null==a?void 0:a._gBufferRenderTarget,this.renderScene=t,this.renderCamera=n,this.selectedObjects=void 0!==r?r:[],this.visibleEdgeColor=new Color$1(1,1,1),this.hiddenEdgeColor=new Color$1(.1,.04,.02),this.edgeGlow=0,this.usePatternTexture=!1,this.edgeThickness=1,this.edgeStrength=3,this.downSampleRatio=(null==a?void 0:a.downSampleRatio)||2,this.pulsePeriod=0,this.edgeDetectionFxaa=(null==a?void 0:a.edgeDetectionFxaa)||!1,this._visibilityCache=new Map,this.resolution=void 0!==e?new Vector2(e.x,e.y):new Vector2(256,256);const s=Math.round(this.resolution.x/this.downSampleRatio),o=Math.round(this.resolution.y/this.downSampleRatio);this.renderTargetMaskBuffer=new WebGLRenderTarget(this.resolution.x,this.resolution.y),this.renderTargetMaskBuffer.texture.name="OutlinePass.mask",this.renderTargetMaskBuffer.texture.generateMipmaps=!1,this._gBufferRenderTarget||(this.depthMaterial=new MeshDepthMaterial,this.depthMaterial.side=DoubleSide,this.depthMaterial.depthPacking=RGBADepthPacking,this.depthMaterial.blending=NoBlending),this.prepareMaskMaterial=this._getPrepareMaskMaterial(null===(i=this._gBufferRenderTarget)||void 0===i?void 0:i.isFloatGBufferWithRgbNormalAlphaDepth),this.prepareMaskMaterial.side=DoubleSide,this.prepareMaskMaterial.fragmentShader=function(e,t){const n=t.isPerspectiveCamera?"perspective":"orthographic";return e.replace(/DEPTH_TO_VIEW_Z/g,n+"DepthToViewZ")}(this.prepareMaskMaterial.fragmentShader,this.renderCamera),this._gBufferRenderTarget||(this.renderTargetDepthBuffer=new WebGLRenderTarget(this.resolution.x,this.resolution.y),this.renderTargetDepthBuffer.texture.name="OutlinePass.depth",this.renderTargetDepthBuffer.texture.generateMipmaps=!1),this.edgeDetectionFxaa&&(this.fxaaRenderMaterial=new ShaderMaterial(FXAAShader),this.fxaaRenderMaterial.uniforms.tDiffuse.value=this.renderTargetMaskBuffer.texture,this.fxaaRenderMaterial.uniforms.resolution.value.set(1/this.resolution.x,1/this.resolution.y),this.renderTargetFxaaBuffer=new WebGLRenderTarget(this.resolution.x,this.resolution.y),this.renderTargetFxaaBuffer.texture.name="OutlinePass.fxaa",this.renderTargetFxaaBuffer.texture.generateMipmaps=!1),this.renderTargetMaskDownSampleBuffer=new WebGLRenderTarget(s,o),this.renderTargetMaskDownSampleBuffer.texture.name="OutlinePass.depthDownSample",this.renderTargetMaskDownSampleBuffer.texture.generateMipmaps=!1,this.renderTargetBlurBuffer1=new WebGLRenderTarget(s,o),this.renderTargetBlurBuffer1.texture.name="OutlinePass.blur1",this.renderTargetBlurBuffer1.texture.generateMipmaps=!1,this.renderTargetBlurBuffer2=new WebGLRenderTarget(Math.round(s/2),Math.round(o/2)),this.renderTargetBlurBuffer2.texture.name="OutlinePass.blur2",this.renderTargetBlurBuffer2.texture.generateMipmaps=!1,this.edgeDetectionMaterial=this._getEdgeDetectionMaterial(),this.renderTargetEdgeBuffer1=new WebGLRenderTarget(s,o),this.renderTargetEdgeBuffer1.texture.name="OutlinePass.edge1",this.renderTargetEdgeBuffer1.texture.generateMipmaps=!1,this.renderTargetEdgeBuffer2=new WebGLRenderTarget(Math.round(s/2),Math.round(o/2)),this.renderTargetEdgeBuffer2.texture.name="OutlinePass.edge2",this.renderTargetEdgeBuffer2.texture.generateMipmaps=!1,this.separableBlurMaterial1=this._getSeperableBlurMaterial(4),this.separableBlurMaterial1.uniforms.texSize.value.set(s,o),this.separableBlurMaterial1.uniforms.kernelRadius.value=1,this.separableBlurMaterial2=this._getSeperableBlurMaterial(4),this.separableBlurMaterial2.uniforms.texSize.value.set(Math.round(s/2),Math.round(o/2)),this.separableBlurMaterial2.uniforms.kernelRadius.value=4,this.overlayMaterial=this._getOverlayMaterial();const l=CopyShader;this.copyUniforms=UniformsUtils.clone(l.uniforms),this.copyUniforms.opacity.value=1,this.materialCopy=new ShaderMaterial({uniforms:this.copyUniforms,vertexShader:l.vertexShader,fragmentShader:l.fragmentShader,blending:NoBlending,depthTest:!1,depthWrite:!1,transparent:!0}),this.enabled=!0,this.needsSwap=!1,this._oldClearColor=new Color$1,this.oldClearAlpha=1,this.fsQuad=new FullScreenQuad(void 0),this.tempPulseColor1=new Color$1,this.tempPulseColor2=new Color$1,this.textureMatrix=new Matrix4}dispose(){var e,t,n,r;this.renderTargetMaskBuffer.dispose(),null===(e=this.renderTargetFxaaBuffer)||void 0===e||e.dispose(),null===(t=this.renderTargetDepthBuffer)||void 0===t||t.dispose(),this.renderTargetMaskDownSampleBuffer.dispose(),this.renderTargetBlurBuffer1.dispose(),this.renderTargetBlurBuffer2.dispose(),this.renderTargetEdgeBuffer1.dispose(),this.renderTargetEdgeBuffer2.dispose(),null===(n=this.depthMaterial)||void 0===n||n.dispose(),this.prepareMaskMaterial.dispose(),null===(r=this.fxaaRenderMaterial)||void 0===r||r.dispose(),this.edgeDetectionMaterial.dispose(),this.separableBlurMaterial1.dispose(),this.separableBlurMaterial2.dispose(),this.overlayMaterial.dispose(),this.materialCopy.dispose(),this.fsQuad.dispose()}setSize(e,t){var n,r,a;this.renderTargetMaskBuffer.setSize(e,t),null===(n=this.renderTargetDepthBuffer)||void 0===n||n.setSize(e,t);let i=Math.round(e/this.downSampleRatio),s=Math.round(t/this.downSampleRatio);this.renderTargetMaskDownSampleBuffer.setSize(i,s),this.renderTargetBlurBuffer1.setSize(i,s),this.renderTargetEdgeBuffer1.setSize(i,s),this.separableBlurMaterial1.uniforms.texSize.value.set(i,s),i=Math.round(i/2),s=Math.round(s/2),this.renderTargetBlurBuffer2.setSize(i,s),this.renderTargetEdgeBuffer2.setSize(i,s),this.separableBlurMaterial2.uniforms.texSize.value.set(i,s),null===(r=this.fxaaRenderMaterial)||void 0===r||r.uniforms.resolution.value.set(1/this.resolution.x,1/this.resolution.y),null===(a=this.renderTargetFxaaBuffer)||void 0===a||a.setSize(e,t)}_changeVisibilityOfSelectedObjects(e){const t=this._visibilityCache;function n(n){n.isMesh&&(!0===e?n.visible=t.get(n):(t.set(n,n.visible),n.visible=e))}this.selectedObjects.forEach(e=>e.traverse(n))}_changeVisibilityOfNonSelectedObjects(e){const t=this._visibilityCache,n=[];function r(e){e.isMesh&&n.push(e)}this.selectedObjects.forEach(e=>e.traverse(r)),this.renderScene.traverse((function(r){if(r.isMesh||r.isSprite){if(!1===n.some(e=>e.id===r.id)){const n=r.visible;!1!==e&&!0!==t.get(r)||(r.visible=e),t.set(r,n)}}else(r.isPoints||r.isLine)&&(!0===e?r.visible=t.get(r):(t.set(r,r.visible),r.visible=e))}))}_updateTextureMatrix(){this.textureMatrix.set(.5,0,0,.5,0,.5,0,.5,0,0,.5,.5,0,0,0,1),this.textureMatrix.multiply(this.renderCamera.projectionMatrix),this.textureMatrix.multiply(this.renderCamera.matrixWorldInverse)}render(e,t,n,r,a){var i,s;if(this.selectedObjects.length>0){null===(i=this._gBufferRenderTarget)||void 0===i||i.render(e,this.renderScene,this.renderCamera),e.getClearColor(this._oldClearColor),this.oldClearAlpha=e.getClearAlpha();const t=e.autoClear;e.autoClear=!1,a&&e.state.buffers.stencil.setTest(!1),e.setClearColor(16777215,1),this._changeVisibilityOfSelectedObjects(!1);const r=this.renderScene.background;this.renderScene.background=null,this.renderTargetDepthBuffer&&this.depthMaterial&&(this.renderScene.overrideMaterial=this.depthMaterial,e.setRenderTarget(this.renderTargetDepthBuffer),e.clear(),e.render(this.renderScene,this.renderCamera)),this._changeVisibilityOfSelectedObjects(!0),this._visibilityCache.clear(),this._updateTextureMatrix(),this._changeVisibilityOfNonSelectedObjects(!1),this.renderScene.overrideMaterial=this.prepareMaskMaterial,this.prepareMaskMaterial.uniforms.cameraNearFar.value.set(this.renderCamera.near,this.renderCamera.far),this._gBufferRenderTarget?this.prepareMaskMaterial.uniforms.depthTexture.value=this._gBufferRenderTarget.textureWithDepthValue:this.prepareMaskMaterial.uniforms.depthTexture.value=null===(s=this.renderTargetDepthBuffer)||void 0===s?void 0:s.texture,this.prepareMaskMaterial.uniforms.textureMatrix.value=this.textureMatrix,e.setRenderTarget(this.renderTargetMaskBuffer),e.clear(),e.render(this.renderScene,this.renderCamera),this.renderScene.overrideMaterial=null,this._changeVisibilityOfNonSelectedObjects(!0),this._visibilityCache.clear(),this.renderScene.background=r;let o=this.renderTargetMaskBuffer;if(this.edgeDetectionFxaa&&this.fxaaRenderMaterial&&this.renderTargetFxaaBuffer&&(this.fxaaRenderMaterial.uniforms.tDiffuse.value=this.renderTargetMaskBuffer.texture,this.fsQuad.material=this.fxaaRenderMaterial,e.setRenderTarget(this.renderTargetFxaaBuffer),e.clear(),this.fsQuad.render(e),o=this.renderTargetFxaaBuffer),this.fsQuad.material=this.materialCopy,this.copyUniforms.tDiffuse.value=o.texture,e.setRenderTarget(this.renderTargetMaskDownSampleBuffer),e.clear(),this.fsQuad.render(e),this.tempPulseColor1.copy(this.visibleEdgeColor),this.tempPulseColor2.copy(this.hiddenEdgeColor),this.pulsePeriod>0){const e=.625+.75*Math.cos(.01*performance.now()/this.pulsePeriod)/2;this.tempPulseColor1.multiplyScalar(e),this.tempPulseColor2.multiplyScalar(e)}this.fsQuad.material=this.edgeDetectionMaterial,this.edgeDetectionMaterial.uniforms.maskTexture.value=this.renderTargetMaskDownSampleBuffer.texture,this.edgeDetectionMaterial.uniforms.texSize.value.set(this.renderTargetMaskDownSampleBuffer.width,this.renderTargetMaskDownSampleBuffer.height),this.edgeDetectionMaterial.uniforms.visibleEdgeColor.value=this.tempPulseColor1,this.edgeDetectionMaterial.uniforms.hiddenEdgeColor.value=this.tempPulseColor2,e.setRenderTarget(this.renderTargetEdgeBuffer1),e.clear(),this.fsQuad.render(e),this.fsQuad.material=this.separableBlurMaterial1,this.separableBlurMaterial1.uniforms.colorTexture.value=this.renderTargetEdgeBuffer1.texture,this.separableBlurMaterial1.uniforms.direction.value=OutlinePass.BlurDirectionX,this.separableBlurMaterial1.uniforms.kernelRadius.value=this.edgeThickness,e.setRenderTarget(this.renderTargetBlurBuffer1),e.clear(),this.fsQuad.render(e),this.separableBlurMaterial1.uniforms.colorTexture.value=this.renderTargetBlurBuffer1.texture,this.separableBlurMaterial1.uniforms.direction.value=OutlinePass.BlurDirectionY,e.setRenderTarget(this.renderTargetEdgeBuffer1),e.clear(),this.fsQuad.render(e),this.fsQuad.material=this.separableBlurMaterial2,this.separableBlurMaterial2.uniforms.colorTexture.value=this.renderTargetEdgeBuffer1.texture,this.separableBlurMaterial2.uniforms.direction.value=OutlinePass.BlurDirectionX,e.setRenderTarget(this.renderTargetBlurBuffer2),e.clear(),this.fsQuad.render(e),this.separableBlurMaterial2.uniforms.colorTexture.value=this.renderTargetBlurBuffer2.texture,this.separableBlurMaterial2.uniforms.direction.value=OutlinePass.BlurDirectionY,e.setRenderTarget(this.renderTargetEdgeBuffer2),e.clear(),this.fsQuad.render(e),this.fsQuad.material=this.overlayMaterial,this.overlayMaterial.uniforms.maskTexture.value=o.texture,this.overlayMaterial.uniforms.edgeTexture1.value=this.renderTargetEdgeBuffer1.texture,this.overlayMaterial.uniforms.edgeTexture2.value=this.renderTargetEdgeBuffer2.texture,this.overlayMaterial.uniforms.patternTexture.value=this.patternTexture,this.overlayMaterial.uniforms.edgeStrength.value=this.edgeStrength,this.overlayMaterial.uniforms.edgeGlow.value=this.edgeGlow,this.overlayMaterial.uniforms.usePatternTexture.value=this.usePatternTexture,a&&e.state.buffers.stencil.setTest(!0),e.setRenderTarget(n),this.fsQuad.render(e),e.setClearColor(this._oldClearColor,this.oldClearAlpha),e.autoClear=t}this.renderToScreen&&n&&(this.fsQuad.material=this.materialCopy,this.copyUniforms.tDiffuse.value=n.texture,e.setRenderTarget(null),this.fsQuad.render(e))}_getPrepareMaskMaterial(e){return new ShaderMaterial({uniforms:{depthTexture:{value:null},cameraNearFar:{value:new Vector2(.5,.5)},textureMatrix:{value:null}},defines:{FLOAT_ALPHA_DEPTH:e?1:0},vertexShader:"#include <morphtarget_pars_vertex>\n\t\t\t\t#include <skinning_pars_vertex>\n\n\t\t\t\tvarying vec4 projTexCoord;\n\t\t\t\tvarying vec4 vPosition;\n\t\t\t\tuniform mat4 textureMatrix;\n\n\t\t\t\tvoid main() {\n\n\t\t\t\t\t#include <skinbase_vertex>\n\t\t\t\t\t#include <begin_vertex>\n\t\t\t\t\t#include <morphtarget_vertex>\n\t\t\t\t\t#include <skinning_vertex>\n\t\t\t\t\t#include <project_vertex>\n\n\t\t\t\t\tvPosition = mvPosition;\n\n\t\t\t\t\tvec4 worldPosition = vec4( transformed, 1.0 );\n\n\t\t\t\t\t#ifdef USE_INSTANCING\n\n\t\t\t\t\t\tworldPosition = instanceMatrix * worldPosition;\n\n\t\t\t\t\t#endif\n\t\t\t\t\t\n\t\t\t\t\tworldPosition = modelMatrix * worldPosition;\n\n\t\t\t\t\tprojTexCoord = textureMatrix * worldPosition;\n\n\t\t\t\t}",fragmentShader:"#include <packing>\n\t\t\t\tvarying vec4 vPosition;\n\t\t\t\tvarying vec4 projTexCoord;\n\t\t\t\tuniform sampler2D depthTexture;\n\t\t\t\tuniform vec2 cameraNearFar;\n\n\t\t\t\tvoid main() {\n\n #if FLOAT_ALPHA_DEPTH == 1\n\t\t\t\t\t float depth = texture2DProj( depthTexture, projTexCoord ).w;\n #else\n float depth = unpackRGBAToDepth(texture2DProj( depthTexture, projTexCoord ));\n #endif\n\t\t\t\t\tfloat viewZ = - DEPTH_TO_VIEW_Z( depth, cameraNearFar.x, cameraNearFar.y );\n\t\t\t\t\tfloat depthTest = (-vPosition.z > viewZ) ? 1.0 : 0.0;\n\t\t\t\t\tgl_FragColor = vec4(0.0, depthTest, 1.0, 1.0);\n\n\t\t\t\t}"})}_getEdgeDetectionMaterial(){return new ShaderMaterial({uniforms:{maskTexture:{value:null},texSize:{value:new Vector2(.5,.5)},visibleEdgeColor:{value:new Vector3(1,1,1)},hiddenEdgeColor:{value:new Vector3(1,1,1)}},vertexShader:"varying vec2 vUv;\n\n\t\t\t\tvoid main() {\n\t\t\t\t\tvUv = uv;\n\t\t\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\t\t\t\t}",fragmentShader:"varying vec2 vUv;\n\n\t\t\t\tuniform sampler2D maskTexture;\n\t\t\t\tuniform vec2 texSize;\n\t\t\t\tuniform vec3 visibleEdgeColor;\n\t\t\t\tuniform vec3 hiddenEdgeColor;\n\n\t\t\t\tvoid main() {\n\t\t\t\t\tvec2 invSize = 1.0 / texSize;\n\t\t\t\t\tvec4 uvOffset = vec4(1.0, 0.0, 0.0, 1.0) * vec4(invSize, invSize);\n\t\t\t\t\tvec4 c1 = texture2D( maskTexture, vUv + uvOffset.xy);\n\t\t\t\t\tvec4 c2 = texture2D( maskTexture, vUv - uvOffset.xy);\n\t\t\t\t\tvec4 c3 = texture2D( maskTexture, vUv + uvOffset.yw);\n\t\t\t\t\tvec4 c4 = texture2D( maskTexture, vUv - uvOffset.yw);\n\t\t\t\t\tfloat diff1 = (c1.r - c2.r)*0.5;\n\t\t\t\t\tfloat diff2 = (c3.r - c4.r)*0.5;\n\t\t\t\t\tfloat d = length( vec2(diff1, diff2) );\n\t\t\t\t\tfloat a1 = min(c1.g, c2.g);\n\t\t\t\t\tfloat a2 = min(c3.g, c4.g);\n\t\t\t\t\tfloat visibilityFactor = min(a1, a2);\n\t\t\t\t\tvec3 edgeColor = 1.0 - visibilityFactor > 0.001 ? visibleEdgeColor : hiddenEdgeColor;\n\t\t\t\t\tgl_FragColor = vec4(edgeColor, 1.0) * vec4(d);\n\t\t\t\t}"})}_getSeperableBlurMaterial(e){return new ShaderMaterial({defines:{MAX_RADIUS:e},uniforms:{colorTexture:{value:null},texSize:{value:new Vector2(.5,.5)},direction:{value:new Vector2(.5,.5)},kernelRadius:{value:1}},vertexShader:"varying vec2 vUv;\n\n\t\t\t\tvoid main() {\n\t\t\t\t\tvUv = uv;\n\t\t\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\t\t\t\t}",fragmentShader:"#include <common>\n\t\t\t\tvarying vec2 vUv;\n\t\t\t\tuniform sampler2D colorTexture;\n\t\t\t\tuniform vec2 texSize;\n\t\t\t\tuniform vec2 direction;\n\t\t\t\tuniform float kernelRadius;\n\n\t\t\t\tfloat gaussianPdf(in float x, in float sigma) {\n\t\t\t\t\treturn 0.39894 * exp( -0.5 * x * x/( sigma * sigma))/sigma;\n\t\t\t\t}\n\n\t\t\t\tvoid main() {\n\t\t\t\t\tvec2 invSize = 1.0 / texSize;\n\t\t\t\t\tfloat sigma = kernelRadius/2.0;\n\t\t\t\t\tfloat weightSum = gaussianPdf(0.0, sigma);\n\t\t\t\t\tvec4 diffuseSum = texture2D( colorTexture, vUv) * weightSum;\n\t\t\t\t\tvec2 delta = direction * invSize * kernelRadius/float(MAX_RADIUS);\n\t\t\t\t\tvec2 uvOffset = delta;\n\t\t\t\t\tfor( int i = 1; i <= MAX_RADIUS; i ++ ) {\n\t\t\t\t\t\tfloat x = kernelRadius * float(i) / float(MAX_RADIUS);\n\t\t\t\t\t\tfloat w = gaussianPdf(x, sigma);\n\t\t\t\t\t\tvec4 sample1 = texture2D( colorTexture, vUv + uvOffset);\n\t\t\t\t\t\tvec4 sample2 = texture2D( colorTexture, vUv - uvOffset);\n\t\t\t\t\t\tdiffuseSum += ((sample1 + sample2) * w);\n\t\t\t\t\t\tweightSum += (2.0 * w);\n\t\t\t\t\t\tuvOffset += delta;\n\t\t\t\t\t}\n\t\t\t\t\tgl_FragColor = diffuseSum/weightSum;\n\t\t\t\t}"})}_getOverlayMaterial(){return new ShaderMaterial({uniforms:{maskTexture:{value:null},edgeTexture1:{value:null},edgeTexture2:{value:null},patternTexture:{value:null},edgeStrength:{value:1},edgeGlow:{value:1},usePatternTexture:{value:0}},vertexShader:"varying vec2 vUv;\n\n\t\t\t\tvoid main() {\n\t\t\t\t\tvUv = uv;\n\t\t\t\t\tgl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n\t\t\t\t}",fragmentShader:"varying vec2 vUv;\n\n\t\t\t\tuniform sampler2D maskTexture;\n\t\t\t\tuniform sampler2D edgeTexture1;\n\t\t\t\tuniform sampler2D edgeTexture2;\n\t\t\t\tuniform sampler2D patternTexture;\n\t\t\t\tuniform float edgeStrength;\n\t\t\t\tuniform float edgeGlow;\n\t\t\t\tuniform bool usePatternTexture;\n\n\t\t\t\tvoid main() {\n\t\t\t\t\tvec4 edgeValue1 = texture2D(edgeTexture1, vUv);\n\t\t\t\t\tvec4 edgeValue2 = texture2D(edgeTexture2, vUv);\n\t\t\t\t\tvec4 maskColor = texture2D(maskTexture, vUv);\n\t\t\t\t\tvec4 patternColor = texture2D(patternTexture, 6.0 * vUv);\n\t\t\t\t\tfloat visibilityFactor = 1.0 - maskColor.g > 0.0 ? 1.0 : 0.5;\n\t\t\t\t\tvec4 edgeValue = edgeValue1 + edgeValue2 * edgeGlow;\n\t\t\t\t\tvec4 finalColor = edgeStrength * maskColor.r * edgeValue;\n\t\t\t\t\tif(usePatternTexture)\n\t\t\t\t\t\tfinalColor += + visibilityFactor * (1.0 - maskColor.r) * (1.0 - patternColor.r);\n\t\t\t\t\tgl_FragColor = finalColor;\n }",blending:AdditiveBlending,depthTest:!1,depthWrite:!1,transparent:!0})}}OutlinePass.BlurDirectionX=new Vector2(1,0),OutlinePass.BlurDirectionY=new Vector2(0,1);class OutLineRenderer{get isOutlinePassActivated(){return this.outlinePassActivated}constructor(e,t,n,r){this._width=0,this._height=0,this._effectComposer=null,this.outlinePass=null,this.outlinePassActivated=!1,this._effectComposer=e,this._gBufferRenderTarget=null==r?void 0:r._gBufferRenderTarget,this._width=t,this._height=n,this.parameters={enabled:!0,edgeStrength:2,edgeGlow:1,edgeThickness:2,pulsePeriod:0,usePatternTexture:!1,visibleEdgeColor:16777215,hiddenEdgeColor:16777215,...r}}dispose(){var e;null===(e=this.outlinePass)||void 0===e||e.dispose()}setSize(e,t){var n;this._width=e,this._height=t,null===(n=this.outlinePass)||void 0===n||n.setSize(e,t)}updateParameters(e){for(let t in e)this.parameters.hasOwnProperty(t)&&(this.parameters[t]=e[t])}applyParameters(){this.outlinePass&&(this.outlinePass.edgeStrength=this.parameters.edgeStrength,this.outlinePass.edgeGlow=this.parameters.edgeGlow,this.outlinePass.edgeThickness=this.parameters.edgeThickness,this.outlinePass.pulsePeriod=this.parameters.pulsePeriod,this.outlinePass.usePatternTexture=this.parameters.usePatternTexture,this.outlinePass.visibleEdgeColor.set(this.parameters.visibleEdgeColor),this.outlinePass.hiddenEdgeColor.set(this.parameters.hiddenEdgeColor))}activateOutline(e,t){var n;if(!this.parameters.enabled)return void this.deactivateOutline();const r=(null===(n=this.outlinePass)||void 0===n?void 0:n.renderCamera)&&t.isPerspectiveCamera!==this.outlinePass.renderCamera.isPerspectiveCamera;this.outlinePass&&(this.outlinePass.renderScene=e,this.outlinePass.renderCamera=t),!r&&this.outlinePassActivated||(!r&&this.outlinePass||(this.outlinePass=new OutlinePass(new Vector2(this._width,this._height),e,t,[],{downSampleRatio:2,edgeDetectionFxaa:!0,_gBufferRenderTarget:this._gBufferRenderTarget})),this.applyParameters(),this._effectComposer&&this._effectComposer.addPass(this.outlinePass),this.outlinePassActivated=!0)}deactivateOutline(){this.outlinePassActivated&&(this.outlinePass&&this._effectComposer&&this._effectComposer.removePass(this.outlinePass),this.outlinePassActivated=!1)}updateOutline(e,t,n){n.length>0?(this.activateOutline(e,t),this.outlinePass&&(this.outlinePass.selectedObjects=n)):this.deactivateOutline()}}class RectAreaLightHelper extends Line{constructor(e,t){const n=new BufferGeometry;n.setAttribute("position",new Float32BufferAttribute([1,1,0,-1,1,0,-1,-1,0,1,-1,0,1,1,0],3)),n.computeBoundingSphere(),super(n,new LineBasicMaterial({fog:!1})),this.light=e,this.color=t,this.type="RectAreaLightHelper";const r=new BufferGeometry;r.setAttribute("position",new Float32BufferAttribute([1,1,0,-1,1,0,-1,-1,0,1,1,0,-1,-1,0,1,-1,0],3)),r.computeBoundingSphere(),this.add(new Mesh(r,new MeshBasicMaterial({side:BackSide,fog:!1})))}updateMatrixWorld(){if(this.scale.set(.5*this.light.width,.5*this.light.height,1),void 0!==this.color)this.material.color.set(this.color),this.children[0].material.color.set(this.color);else{this.material.color.copy(this.light.color).multiplyScalar(this.light.intensity);const e=this.material.color,t=Math.max(e.r,e.g,e.b);t>1&&e.multiplyScalar(1/t),this.children[0].material.color.copy(this.material.color)}this.matrixWorld.extractRotation(this.light.matrixWorld).scale(this.scale).copyPosition(this.light.matrixWorld),this.children[0].matrixWorld.copy(this.matrixWorld)}dispose(){this.geometry.dispose(),this.material.dispose(),this.children[0].geometry.dispose(),this.children[0].material.dispose()}}var ShadowLightSourceType;!function(e){e[e.DirectionalLightShadow=0]="DirectionalLightShadow",e[e.SpotLightShadow=1]="SpotLightShadow"}(ShadowLightSourceType||(ShadowLightSourceType={}));const defaultScreenSpaceShadowMapParameters={alwaysUpdate:!1,enableShadowMap:!0,layers:null,shadowLightSourceType:ShadowLightSourceType.DirectionalLightShadow,maximumNumberOfLightSources:-1,directionalDependency:1,directionalExponent:1,groundContainment:1,fadeOutDistance:.1,fadeOutBlur:20};class ScreenSpaceShadowMap{get shadowTexture(){return this._shadowRenderTarget.texture}constructor(e,t,n){var r,a;this.needsUpdate=!1,this.shadowTypeNeedsUpdate=!0,this.shadowConfiguration=new ShadowTypeConfiguration,this._shadowLightSources=[],this._shadowScale=1,this._renderPass=new RenderPass,this._cameraUpdate=new CameraUpdate,this._renderCacheManager=e,this._viewportSize=new Vector2(t.x,t.y),this._samples=null!==(r=null==n?void 0:n.samples)&&void 0!==r?r:0,this._shadowMapSize=null!==(a=null==n?void 0:n.shadowMapSize)&&void 0!==a?a:1024,this.parameters=this._getScreenSpaceShadowMapParameters(n),this.castShadow=this.parameters.enableShadowMap,this._shadowMapPassOverrideMaterialCache=new ShadowMapPassOverrideMaterialCache(this.parameters),this._renderCacheManager.registerCache(this,this._shadowMapPassOverrideMaterialCache);const i=this._samples;this._shadowRenderTarget=new WebGLRenderTarget(this._viewportSize.x,this._viewportSize.y,{samples:i,format:RedFormat})}_getScreenSpaceShadowMapParameters(e){return{...defaultScreenSpaceShadowMapParameters,...e}}dispose(){this._shadowLightSources.forEach(e=>e.dispose()),this._shadowRenderTarget.dispose(),this._shadowMapPassOverrideMaterialCache.dispose()}updateParameters(e){for(let t in e)this.parameters.hasOwnProperty(t)&&(this.parameters[t]=e[t])}updateBounds(e,t){const n=this._shadowScale;this._shadowScale=t,Math.abs(n-this._shadowScale)>1e-5&&(this.shadowTypeNeedsUpdate=!0),this._shadowLightSources.forEach(t=>t.updateBounds(e)),this._shadowMapPassOverrideMaterialCache.setBoundingBox(e.bounds)}forceShadowUpdate(){this._shadowLightSources.forEach(e=>e.forceShadowUpdate()),this.needsUpdate=!0}getShadowLightSources(){return this._shadowLightSources.map(e=>e.getShadowLight())}findShadowLightSource(e){var t;return null===(t=this._shadowLightSources.find(t=>t.getOriginalLight()===e))||void 0===t?void 0:t.getShadowLight()}addRectAreaLight(e,t){const n=new RectAreaShadowLightSource(e,{shadowMapSize:this._shadowMapSize,shadowLightSourceType:this.parameters.shadowLightSourceType});this._shadowLightSources.push(n),n.addTo(t),n.updatePositionAndTarget(),this.needsUpdate=!0}updateRectAreaLights(e,t){this._shadowLightSources=this._shadowLightSources.filter(n=>{if(n instanceof RectAreaShadowLightSource){const t=n.getRectAreaLight();if(e.includes(t))return n.updatePositionAndTarget(),!0}return n.removeFrom(t),n.dispose(),!1}),e.forEach(e=>{this._shadowLightSources.find(t=>t instanceof RectAreaShadowLightSource&&t.getRectAreaLight()===e)||this.addRectAreaLight(e,t)}),this.needsUpdate=!0,this.shadowTypeNeedsUpdate=!0}createShadowFromLightSources(e,t){this._shadowLightSources=this._shadowLightSources.filter(t=>{t.removeFrom(e),t.dispose()});const n=1/(t.length>0?Math.max(...t.map(e=>e.maxIntensity)):1);this._addShadowFromLightSources(t,n),this._shadowLightSources.forEach(t=>{t.addTo(e),t.updatePositionAndTarget()}),this.needsUpdate=!0,this.shadowTypeNeedsUpdate=!0}_addShadowFromLightSources(e,t){e.forEach(e=>{const n=e.maxIntensity*t;if(n>=.1&&e.position.z>=0){const t=new Vector3(e.position.x,e.position.z,e.position.y).multiplyScalar(7),r=new EnvironmentShadowLightSource(t,n,{shadowMapSize:this._shadowMapSize,shadowLightSourceType:this.parameters.shadowLightSourceType});this._shadowLightSources.push(r)}})}setSize(e,t){this._viewportSize=new Vector2(e,t),this._shadowRenderTarget.setSize(this._viewportSize.x,this._viewportSize.y)}updatePositionAndTarget(){this._shadowLightSources.forEach(e=>e.updatePositionAndTarget())}renderShadowMap(e,t,n){if(!(this.needsUpdate||this.parameters.alwaysUpdate||this._cameraUpdate.changed(n)))return;this.needsUpdate=!1,this.shadowTypeNeedsUpdate&&(this.shadowTypeNeedsUpdate=!1,this.needsUpdate=!0,this._updateShadowType(e));const r=t.background,a=t.environment,i=n.layers.mask;t.environment=null,t.background=null,this.parameters.layers&&(n.layers.mask=this.parameters.layers.mask),this._renderSimpleShadowMapFromShadowLightSources(e,t,n),n.layers.mask=i,t.environment=a,t.background=r}_renderSimpleShadowMapFromShadowLightSources(e,t,n){this._shadowMapPassOverrideMaterialCache.setShadowParameters(this.parameters.directionalDependency,this.parameters.directionalExponent,this.parameters.groundContainment,this.parameters.fadeOutDistance*this._shadowScale,this.parameters.fadeOutBlur);const r=this._getSortedShadowLightSources();0===r.length?this._renderPass.clear(e,this._shadowRenderTarget,16777215,1):(this._setShadowLightSourcesIntensity(r),this._renderCacheManager.render(this,t,()=>{this._renderPass.render(e,t,n,this._shadowRenderTarget,16777215,1)}),this._shadowLightSources.forEach(e=>e.finishRenderShadow()))}_getSortedShadowLightSources(){let e=[];return this._shadowLightSources.forEach(t=>e.push(...t.prepareRenderShadow())),e.sort((e,t)=>e.light.castShadow&&!t.light.castShadow?-1:!e.light.castShadow&&t.light.castShadow?1:t.intensity-e.intensity),e}_setShadowLightSourcesIntensity(e){var t;let n=0;for(let t=0;t<e.length;t++){const r=e[t];(this.parameters.maximumNumberOfLightSources<0||t<this.parameters.maximumNumberOfLightSources)&&(n+=r.intensity)}for(let r=0;r<e.length;r++){const a=e[r];this.parameters.maximumNumberOfLightSources<0||r<this.parameters.maximumNumberOfLightSources?(a.light.visible=!0,a.light.intensity=a.intensity/n,(t=a.light).castShadow&&(t.castShadow=this.castShadow)):(a.light.visible=!1,a.light.intensity=0,a.light.castShadow=!1)}}_updateShadowType(e){e.shadowMap.type=this.shadowConfiguration.currentConfiguration.type;const t=this.parameters.enableShadowMap&&this.shadowConfiguration.currentConfiguration.castShadow;e.shadowMap.enabled=t,e.shadowMap.needsUpdate=!0,this.castShadow=t&&this.shadowConfiguration.currentConfiguration.castShadow,this._shadowLightSources.forEach(e=>e._updateShadowType(this.shadowConfiguration.currentConfiguration,this._shadowScale))}switchType(e){return!!this.shadowConfiguration.switchType(e)&&(this.needsUpdate=!0,this.shadowTypeNeedsUpdate=!0,!0)}}var ShadowMaterialType;!function(e){e[e.Default=0]="Default",e[e.Unlit=1]="Unlit",e[e.Emissive=2]="Emissive",e[e.Shadow=3]="Shadow"}(ShadowMaterialType||(ShadowMaterialType={}));class ShadowMapPassOverrideMaterialCache{constructor(e){var t,n;this._sceneBoxMin=new Vector3(-1,-1,-1),this._sceneBoxMax=new Vector3(1,1,1),this._distributionProperties=new Vector4(1,1,1,0),this._objectCache=new Map,this._shadowFadeOut=new Vector2(null!==(t=null==e?void 0:e.fadeOutTo)&&void 0!==t?t:.5,null!==(n=null==e?void 0:e.fadeOutBlur)&&void 0!==n?n:60),this._shadowObjectMaterial=this._createShadowMaterial(ShadowMaterialType.Default),this._unlitMaterial=this._createShadowMaterial(ShadowMaterialType.Unlit),this._emissiveMaterial=this._createShadowMaterial(ShadowMaterialType.Emissive),this._receiveShadowMaterial=this._createShadowMaterial(ShadowMaterialType.Shadow)}dispose(){this._shadowObjectMaterial.dispose(),this._unlitMaterial.dispose(),this._emissiveMaterial.dispose(),this._receiveShadowMaterial.dispose()}setShadowParameters(e,t,n,r,a){this._distributionProperties.set(e,t,n,0),this._shadowFadeOut.set(r,a)}setBoundingBox(e){this._sceneBoxMin.copy(e.min),this._sceneBoxMax.copy(e.max)}_createShadowMaterial(e){let t;return t=e===ShadowMaterialType.Emissive||e===ShadowMaterialType.Unlit?new MeshBasicMaterial({color:16777215,side:DoubleSide}):e===ShadowMaterialType.Shadow?new ShadowMaterial({side:DoubleSide}):ShadowMapPassOverrideMaterialCache.useModifiedMaterial?this._createCustomerShadowMaterial():new MeshPhongMaterial({color:16777215,shininess:0,polygonOffsetFactor:0,polygonOffsetUnits:0,side:DoubleSide}),t}_createCustomerShadowMaterial(){const e=new MeshLambertMaterial({side:DoubleSide});return e.onBeforeCompile=e=>{e.vertexShader="\n#define LAMBERT\n\nvarying vec3 vViewPosition;\nvarying vec3 vWorldPosition;\n\n#include <common>\n#include <displacementmap_pars_vertex>\n#include <normal_pars_vertex>\n#include <morphtarget_pars_vertex>\n#include <skinning_pars_vertex>\n#include <shadowmap_pars_vertex>\n#include <logdepthbuf_pars_vertex>\n#include <clipping_planes_pars_vertex>\n\nvoid main() {\n #include <beginnormal_vertex>\n\t#include <morphnormal_vertex>\n\t#include <skinbase_vertex>\n\t#include <skinnormal_vertex>\n\t#include <defaultnormal_vertex>\n\t#include <normal_vertex>\n\n\t#include <begin_vertex>\n\t#include <morphtarget_vertex>\n\t#include <skinning_vertex>\n\t#include <displacementmap_vertex>\n\t#include <project_vertex>\n\t#include <logdepthbuf_vertex>\n\t#include <clipping_planes_vertex>\n\n\tvViewPosition = - mvPosition.xyz;\n\n\t#include <worldpos_vertex>\n\t#include <shadowmap_vertex>\n\n vWorldPosition = worldPosition.xyz;\n}\n",e.fragmentShader="\n#define LAMBERT\n\nuniform vec3 diffuse;\nuniform float opacity;\n\nvarying vec3 vViewPosition;\nvarying vec3 vWorldPosition;\n\n#ifdef DYNAMIC_SHADOW_RADIUS\n uniform vec2 shadowFadeOut;\n uniform vec3 sceneBoxMin;\n uniform vec3 sceneBoxMax;\n#endif\nuniform vec4 distributionProperties;\n\n#include <common>\n#include <packing>\n#include <map_pars_fragment>\n#include <alphamap_pars_fragment>\n#include <alphatest_pars_fragment>\n#include <alphahash_pars_fragment>\n#include <aomap_pars_fragment>\n#include <lights_pars_begin>\n#include <normal_pars_fragment>\n#include <shadowmap_pars_fragment>\n#include <bumpmap_pars_fragment>\n#include <normalmap_pars_fragment>\n#include <logdepthbuf_pars_fragment>\n#include <clipping_planes_pars_fragment>\n\nvec2 getShadowDynamicScale() {\n\n vec2 dynamicScale = vec2(0.0, 1.0);\n\n#ifdef DYNAMIC_SHADOW_RADIUS\n if (shadowFadeOut.x > 0.0) {\n vec3 boxDistanceVec = max(vec3(0.0), max(sceneBoxMin - vWorldPosition, vWorldPosition - sceneBoxMax));\n float boxDistance = length(boxDistanceVec);\n \n // linear interpolation gives better result than smooth Hermite interpolation\n // float shadowBase = smoothstep(0.0, shadowFadeOut.x, boxDistance);\n float shadowBase = boxDistance / shadowFadeOut.x;\n\n shadowBase = clamp(shadowBase, 0.0, 1.0);\n dynamicScale = vec2(shadowBase, 1.0 - shadowBase);\n }\n#endif\n\n return dynamicScale;\n}\n\nfloat getShadowDynamicRadius(sampler2D shadowMap, float shadowBias, float shadowRadius, vec4 shadowCoord, vec2 shadowScale) {\n\n float dynamicRadius = shadowRadius;\n\n#ifdef DYNAMIC_SHADOW_RADIUS\n shadowCoord.xyz /= shadowCoord.w;\n shadowCoord.z += shadowBias;\n\n bool inFrustum = shadowCoord.x >= 0.0 && shadowCoord.x <= 1.0 && shadowCoord.y >= 0.0 && shadowCoord.y <= 1.0;\n bool frustumTest = inFrustum && shadowCoord.z <= 1.0;\n if (frustumTest && shadowFadeOut.x > 0.0) {\n float shadowDepth = unpackRGBAToDepth(texture2D(shadowMap, shadowCoord.xy));\n float delta = shadowDepth - shadowCoord.z;\n float fadeOutScale = max(shadowScale.x, smoothstep(max(shadowDepth, 0.5), shadowFadeOut.x * 0.5 + 0.5, shadowCoord.z));\n dynamicRadius = shadowRadius + shadowFadeOut.y * max(0.0, fadeOutScale);\n }\n#endif\n\n return dynamicRadius;\n}\n\nvoid main() {\n\n\t#include <clipping_planes_fragment>\n\n\tvec4 diffuseColor = vec4( diffuse, opacity );\n\t\n\t#include <logdepthbuf_fragment>\n\t#include <alphamap_fragment>\n\t#include <alphatest_fragment>\n\t#include <alphahash_fragment>\n\t#include <normal_fragment_begin>\n\t#include <normal_fragment_maps>\n\n\t// accumulation\n\n\tvec3 geometryPosition = - vViewPosition;\n \n // add in three.js 157\n //vec3 geometryNormal = normal;\n\n vec3 geometryViewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );\n\n // remeove in three.js 157\n GeometricContext geometry;\n geometry.position = - vViewPosition;\n geometry.normal = normal;\n geometry.viewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );\n\n IncidentLight directLight;\n\n vec3 accumulatedShadowLight = vec3(0.0);\n vec3 directionDependentShadowLight = vec3(1.0);\n float groundDistance = clamp((vWorldPosition.y - sceneBoxMin.y) * 100.0, 0.0, 1.0);\n float groundContainment = mix(1.0, groundDistance, distributionProperties.z);\n vec2 dynamicScale = getShadowDynamicScale();\n #if ( NUM_DIR_LIGHTS > 0 )\n\n DirectionalLight directionalLight;\n #if defined( USE_SHADOWMAP ) && NUM_DIR_LIGHT_SHADOWS > 0\n DirectionalLightShadow directionalLightShadow;\n #endif\n\n float dynamicRadius;\n vec3 incidentLightSum = vec3(0.0);\n vec3 incidentShadowLight = vec3(0.0);\n float shadowFactor;\n float dotNL;\n float incidentLightFactor;\n\n #pragma unroll_loop_start\n for ( int i = 0; i < NUM_DIR_LIGHTS; i ++ ) {\n\n directionalLight = directionalLights[ i ];\n\n // change for three.js 157\n //getDirectionalLightInfo( directionalLight, directLight );\n getDirectionalLightInfo( directionalLight, geometry, directLight );\n\n dotNL = dot(dot(geometryNormal, geometryPosition) >= 0.0 ? -geometryNormal : geometryNormal, directLight.direction);\n incidentLightFactor = clamp(dotNL, 0.0, 1.0);\n\n dynamicRadius = 0.0;\n shadowFactor = 1.0;\n #if defined( USE_SHADOWMAP ) && ( UNROLLED_LOOP_INDEX < NUM_DIR_LIGHT_SHADOWS )\n directionalLightShadow = directionalLightShadows[ i ];\n dynamicRadius = getShadowDynamicRadius(directionalShadowMap[i], directionalLightShadow.shadowBias, directionalLightShadow.shadowRadius, vDirectionalShadowCoord[i], dynamicScale);\n shadowFactor = ( directLight.visible && receiveShadow ) ? getShadow( directionalShadowMap[ i ], directionalLightShadow.shadowMapSize, directionalLightShadow.shadowBias, dynamicRadius, vDirectionalShadowCoord[ i ] ) : 1.0;\n #endif\n\n accumulatedShadowLight += directLight.color * shadowFactor * saturate(min(dotNL * 10.0 + 0.9, 1.0));\n incidentLightFactor = mix(\n mix(pow(incidentLightFactor, 4.0), 1.0, step(0.99, shadowFactor)),\n pow(incidentLightFactor, distributionProperties.y),\n groundContainment);\n incidentLightSum += directLight.color * mix(incidentLightFactor, 1.0, groundContainment);\n incidentShadowLight += directLight.color * mix(\n shadowFactor * incidentLightFactor, \n mix(1.0, shadowFactor, incidentLightFactor), \n groundContainment);\n }\n #pragma unroll_loop_end\n\n if (dot(incidentLightSum, vec3(1.0)) > 0.01) {\n directionDependentShadowLight = incidentShadowLight / incidentLightSum;\n }\n #else\n accumulatedShadowLight = vec3(1.0);\n #endif \n\n\t// modulation\n\n\tvec3 outgoingLight = mix(accumulatedShadowLight, directionDependentShadowLight, max(distributionProperties.x, 1.0 - groundDistance));\n outgoingLight = dynamicScale.x + directionDependentShadowLight.y * outgoingLight;\n\n\t#include <opaque_fragment>\n\t#include <premultiplied_alpha_fragment>\n}\n",e.defines=Object.assign({...e.defines,DYNAMIC_SHADOW_RADIUS:""});const t=e.uniforms;t&&(t.distributionProperties={value:this._distributionProperties},t.shadowFadeOut={value:this._shadowFadeOut},t.sceneBoxMin={value:this._sceneBoxMin},t.sceneBoxMax={value:this._sceneBoxMax})},e}clear(){this._objectCache.clear()}addLineOrPoint(e){this._addCacheEntry(e,!1,!1)}addMesh(e){e.visible&&this._setMeshMaterialAndVisibility(e)}addObject(e){e.isLight&&!e.userData.shadowLightSource&&this._addCacheEntry(e,!1,!1)}_addCacheEntry(e,t,n,r){this._objectCache.set(e,{originalObject:{visible:e.visible,castShadow:e.castShadow,material:e.material},shadowObject:{visible:t,castShadow:n,material:r}})}onBeforeRender(){this._objectCache.forEach((e,t)=>{t.visible=e.shadowObject.visible,t.castShadow=e.shadowObject.castShadow,t instanceof Mesh&&e.shadowObject.material&&(t.material=e.shadowObject.material)})}onAfterRender(){this._objectCache.forEach((e,t)=>{t.visible=e.originalObject.visible,t.castShadow=e.originalObject.castShadow,e.originalObject.material&&(t.material=e.originalObject.material)})}_setMeshMaterialAndVisibility(e){!e.material||!e.receiveShadow||Array.isArray(e.material)||!0===e.material.transparent&&e.material.opacity<.9?e.userData.isFloor?this._addCacheEntry(e,e.visible,e.castShadow,this._shadowObjectMaterial):e.material&&e.material.transparent&&e.material.opacity<.9?this._addCacheEntry(e,!1,e.castShadow,this._shadowObjectMaterial):e.receiveShadow?this._addCacheEntry(e,e.visible,!1,this._receiveShadowMaterial):this._addCacheEntry(e,!1,e.castShadow,e.material):this._setShadowMaterialForOpaqueObject(e)}_setShadowMaterialForOpaqueObject(e){const t=e.material;t instanceof LineBasicMaterial||t instanceof MeshBasicMaterial?this._addCacheEntry(e,e.visible,e.castShadow,this._unlitMaterial):t instanceof MeshStandardMaterial?this._setMeshShadowStandardMaterial(e,t):this._addCacheEntry(e,e.visible,e.castShadow,e.receiveShadow?this._shadowObjectMaterial:this._unlitMaterial)}_setMeshShadowStandardMaterial(e,t){const n=t.emissiveIntensity>0&&(t.emissive.r>0||t.emissive.g>0||t.emissive.b>0);this._addCacheEntry(e,e.visible,!n&&e.castShadow,n?this._emissiveMaterial:e.receiveShadow?this._shadowObjectMaterial:this._unlitMaterial)}}ShadowMapPassOverrideMaterialCache.useModifiedMaterial=!0;class ShadowTypeConfiguration{constructor(){var e;this.types=new Map([["off",ShadowTypeConfiguration._noShadow],["BasicShadowMap",ShadowTypeConfiguration._basicShadow],["PCFShadowMap",ShadowTypeConfiguration._pcfShadow],["PCFSoftShadowMap",ShadowTypeConfiguration._pcfSoftShadow],["VSMShadowMap",ShadowTypeConfiguration._vcmShadow]]),this.shadowType="PCFShadowMap",this.currentConfiguration=null!==(e=this.types.get(this.shadowType))&&void 0!==e?e:ShadowTypeConfiguration._defaultType}switchType(e){var t;return!!this.types.has(e)&&(this.currentConfiguration=null!==(t=this.types.get(e))&&void 0!==t?t:ShadowTypeConfiguration._defaultType,!0)}}ShadowTypeConfiguration._noShadow={castShadow:!1,type:PCFShadowMap,bias:0,normalBias:0,radius:0},ShadowTypeConfiguration._basicShadow={castShadow:!0,type:BasicShadowMap,bias:-5e-5,normalBias:.005,radius:0},ShadowTypeConfiguration._pcfShadow={castShadow:!0,type:PCFShadowMap,bias:-5e-5,normalBias:.01,radius:4},ShadowTypeConfiguration._pcfSoftShadow={castShadow:!0,type:PCFSoftShadowMap,bias:-5e-5,normalBias:.01,radius:1},ShadowTypeConfiguration._vcmShadow={castShadow:!0,type:VSMShadowMap,bias:1e-4,normalBias:0,radius:15},ShadowTypeConfiguration._defaultType=ShadowTypeConfiguration._pcfShadow;class BaseShadowLightSource{constructor(e,t){var n,r;this._isVisibleBackup=!0,this._castShadowBackup=!0,this._shadowMapSize=null!==(n=null==t?void 0:t.shadowMapSize)&&void 0!==n?n:1024,this._blurSamples=null!==(r=null==t?void 0:t._blurSamples)&&void 0!==r?r:8,this._shadowLightSource=e,this._shadowLightSource.visible=!1,this._shadowLightSource.castShadow=!0,this._shadowLightSource.shadow&&(this._shadowLightSource.shadow.mapSize=new Vector2(this._shadowMapSize,this._shadowMapSize),this._shadowLightSource.shadow.blurSamples=this._blurSamples,this._shadowLightSource.shadow.autoUpdate=!1),this._shadowLightSource.userData.shadowLightSource=this}getPosition(){return this._shadowLightSource.position}getShadowLight(){return this._shadowLightSource}getOriginalLight(){return null}dispose(){this._shadowLightSource.dispose()}addTo(e){e.add(this._shadowLightSource)}removeFrom(e){e.remove(this._shadowLightSource)}updatePositionAndTarget(){this._updateShadowPositionAndTarget(this.getPosition(),new Vector3(0,0,0))}updateBounds(e){if(this._shadowLightSource instanceof SpotLight){const t=this._shadowLightSource.shadow.camera,n=e.bounds.clone().applyMatrix4(t.matrixWorldInverse),r=Math.max(.001,Math.min(-n.min.z,-n.max.z)),a=Math.max(-n.min.z,-n.max.z),i=Math.max(Math.abs(n.min.x),Math.abs(n.max.x)),s=Math.max(Math.abs(n.min.y),Math.abs(n.max.y)),o=Math.atan2(1.05*Math.hypot(s,i),r);t.aspect=1,t.near=r,t.far=a,this._shadowLightSource.angle=o}else if(this._shadowLightSource.shadow){const t=this._shadowLightSource.shadow.camera;e.updateCameraViewVolumeFromBounds(t);const n=t;n.far+=n.far-n.near,n.updateProjectionMatrix()}this._shadowLightSource.shadow&&(this._shadowLightSource.shadow.needsUpdate=!0)}forceShadowUpdate(){this._shadowLightSource.shadow&&(this._shadowLightSource.shadow.needsUpdate=!0)}_updateShadowPositionAndTarget(e,t){var n,r,a;if(this._shadowLightSource instanceof SpotLight){const n=t.clone().sub(e),r=n.length();n.normalize();const a=t.clone().sub(n.clone().multiplyScalar(4*r));this._shadowLightSource.shadow.camera.position.copy(a),this._shadowLightSource.shadow.camera.position.copy(a),this._shadowLightSource.shadow.camera.lookAt(t),this._shadowLightSource.position.copy(a),this._shadowLightSource.lookAt(t)}else this._shadowLightSource.position.copy(e),this._shadowLightSource.lookAt(t),null===(n=this._shadowLightSource.shadow)||void 0===n||n.camera.position.copy(e),null===(r=this._shadowLightSource.shadow)||void 0===r||r.camera.lookAt(t);null===(a=this._shadowLightSource.shadow)||void 0===a||a.camera.updateMatrixWorld(),this._shadowLightSource.updateMatrixWorld()}_updateShadowType(e,t){const n=this._shadowLightSource.shadow;n&&(n.bias=e.bias,n.normalBias=e.normalBias*t,n.radius=e.radius,n.needsUpdate=!0)}prepareRenderShadow(){return[]}finishRenderShadow(){}}class RectAreaShadowLightSource extends BaseShadowLightSource{constructor(e,t){let n;switch(null==t?void 0:t.shadowLightSourceType){default:case ShadowLightSourceType.DirectionalLightShadow:n=new DirectionalLight(16777215,1);break;case ShadowLightSourceType.SpotLightShadow:n=new SpotLight(16777215,1,0,Math.PI/4,0)}n.position.copy(e.position),n.lookAt(0,0,0),super(n,t),this._rectAreaLight=e,this._rectAreaLight.userData.shadowLightSource=this,(null==t?void 0:t.addHelper)&&(this._rectLightHelper=new RectAreaLightHelper(this._rectAreaLight),this._rectLightHelper.material.depthWrite=!1,this._rectAreaLight.add(this._rectLightHelper))}getPosition(){return this._rectAreaLight.position}getRectAreaLight(){return this._rectAreaLight}getOriginalLight(){return this._rectAreaLight}prepareRenderShadow(){return this._isVisibleBackup=this._rectAreaLight.visible,this._castShadowBackup=this._shadowLightSource.castShadow,this._shadowLightSource.visible=this._rectAreaLight.visible,this._rectAreaLight.visible=!1,this._shadowLightSource.visible?[{light:this._shadowLightSource,intensity:this._rectAreaLight.intensity}]:[]}finishRenderShadow(){this._shadowLightSource.visible=!1,this._shadowLightSource.castShadow=this._castShadowBackup,this._rectAreaLight.visible=this._isVisibleBackup}}class EnvironmentShadowLightSource extends BaseShadowLightSource{constructor(e,t,n){const r=new DirectionalLight(16777215,t);r.position.copy(e),r.lookAt(0,0,0),r.updateMatrix(),r.castShadow=!0,super(r,n),this._position=e.clone(),this._intensity=t}getPosition(){return this._position}prepareRenderShadow(){return this._castShadowBackup=this._shadowLightSource.castShadow,this._shadowLightSource.visible=!0,[{light:this._shadowLightSource,intensity:this._intensity}]}finishRenderShadow(){this._shadowLightSource.castShadow=this._castShadowBackup,this._shadowLightSource.visible=!1}}const dummyCamera=new Camera;let geometry=null;class Pass{constructor(e="Pass",t=new Scene,n=dummyCamera){this.name=e,this.renderer=null,this.scene=t,this.camera=n,this.screen=null,this.rtt=!0,this.needsSwap=!0,this.needsDepthTexture=!1,this.enabled=!0}get renderToScreen(){return!this.rtt}set renderToScreen(e){if(this.rtt===e){const t=this.fullscreenMaterial;null!==t&&(t.needsUpdate=!0),this.rtt=!e}}set mainScene(e){}set mainCamera(e){}setRenderer(e){this.renderer=e}isEnabled(){return this.enabled}setEnabled(e){this.enabled=e}get fullscreenMaterial(){return null!==this.screen?this.screen.material:null}set fullscreenMaterial(e){let t=this.screen;null!==t?t.material=e:(t=new Mesh(function(){if(null===geometry){const e=new Float32Array([-1,-1,0,3,-1,0,-1,3,0]),t=new Float32Array([0,0,2,0,0,2]);geometry=new BufferGeometry,void 0!==geometry.setAttribute?(geometry.setAttribute("position",new BufferAttribute(e,3)),geometry.setAttribute("uv",new BufferAttribute(t,2))):(geometry.addAttribute("position",new BufferAttribute(e,3)),geometry.addAttribute("uv",new BufferAttribute(t,2)))}return geometry}(),e),t.frustumCulled=!1,null===this.scene&&(this.scene=new Scene),this.scene.add(t),this.screen=t)}getFullscreenMaterial(){return this.fullscreenMaterial}setFullscreenMaterial(e){this.fullscreenMaterial=e}getDepthTexture(){return null}setDepthTexture(e,t=BasicDepthPacking){}render(e,t,n,r,a){throw new Error("Render method not implemented!")}setSize(e,t){}initialize(e,t,n){}dispose(){for(const e of Object.keys(this)){const t=this[e];(t instanceof WebGLRenderTarget||t instanceof Material||t instanceof Texture||t instanceof Pass)&&this[e].dispose()}}}var blueNoiseImage="data:image/png;base64,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",vertexShader="#define GLSLIFY 1\nvarying vec2 vUv;void main(){vUv=position.xy*0.5+0.5;gl_Position=vec4(position.xy,1.0,1.0);}",sampleBlueNoise="#define GLSLIFY 1\nconst float g=1.6180339887498948482;const float a1=1.0/g;float r1(float n){return fract(1.1127756842787055+a1*n);}const vec4 hn=vec4(0.618033988749895,0.3247179572447458,0.2207440846057596,0.1673039782614187);vec4 sampleBlueNoise(sampler2D texture,int seed,vec2 repeat,vec2 texSize){vec2 size=vUv*texSize;vec2 blueNoiseSize=texSize/repeat;float blueNoiseIndex=floor(floor(size.y/blueNoiseSize.y)*repeat.x)+floor(size.x/blueNoiseSize.x);vec2 blueNoiseUv=vUv*repeat;vec4 blueNoise=textureLod(texture,blueNoiseUv,0.);if(seed!=0){blueNoise=fract(blueNoise+hn*float(seed));blueNoise.r=(blueNoise.r>0.5 ? 1.0-blueNoise.r : blueNoise.r)*2.0;blueNoise.g=(blueNoise.g>0.5 ? 1.0-blueNoise.g : blueNoise.g)*2.0;blueNoise.b=(blueNoise.b>0.5 ? 1.0-blueNoise.b : blueNoise.b)*2.0;blueNoise.a=(blueNoise.a>0.5 ? 1.0-blueNoise.a : blueNoise.a)*2.0;}return blueNoise;}";class AOPass extends Pass{constructor(e,t,n){super(),this._camera=e,this._scene=t,this.renderTarget=new WebGLRenderTarget(1,1,{type:HalfFloatType,depthBuffer:!1});const r=n.replace("#include <sampleBlueNoise>",sampleBlueNoise);this.fullscreenMaterial=new ShaderMaterial({fragmentShader:r,vertexShader,uniforms:{depthTexture:{value:null},normalTexture:{value:null},cameraNear:{value:0},cameraFar:{value:0},viewMatrix:{value:this._camera.matrixWorldInverse},projectionViewMatrix:{value:new Matrix4},projectionMatrixInverse:{value:this._camera.projectionMatrixInverse},cameraMatrixWorld:{value:this._camera.matrixWorld},texSize:{value:new Vector2},blueNoiseTexture:{value:null},blueNoiseRepeat:{value:new Vector2},aoDistance:{value:0},distancePower:{value:0},bias:{value:0},thickness:{value:0},power:{value:0},frame:{value:0}},blending:NoBlending,depthWrite:!1,depthTest:!1,toneMapped:!1}),(new TextureLoader).load(blueNoiseImage,e=>{e.minFilter=NearestFilter,e.magFilter=NearestFilter,e.wrapS=RepeatWrapping,e.wrapT=RepeatWrapping,e.colorSpace=NoColorSpace,this.fullscreenMaterial.uniforms.blueNoiseTexture.value=e})}get texture(){return this.renderTarget.texture}setSize(e,t){this.renderTarget.setSize(e,t),this.fullscreenMaterial.uniforms.texSize.value.set(this.renderTarget.width,this.renderTarget.height)}render(e){const t=+this.fullscreenMaterial.defines.spp;this.fullscreenMaterial.uniforms.frame.value=(this.fullscreenMaterial.uniforms.frame.value+t)%65536,this.fullscreenMaterial.uniforms.cameraNear.value=this._camera.near,this.fullscreenMaterial.uniforms.cameraFar.value=this._camera.far,this.fullscreenMaterial.uniforms.projectionViewMatrix.value.multiplyMatrices(this._camera.projectionMatrix,this._camera.matrixWorldInverse);const n=this.fullscreenMaterial.uniforms.blueNoiseTexture.value;if(n){const{width:e,height:t}=n.source.data;this.fullscreenMaterial.uniforms.blueNoiseRepeat.value.set(this.renderTarget.width/e,this.renderTarget.height/t)}e.setRenderTarget(this.renderTarget),e.render(this.scene,this.camera)}}class SSAOPass extends AOPass{constructor(e,t){super(e,t,"#define GLSLIFY 1\nvarying vec2 vUv;uniform sampler2D depthTexture;uniform sampler2D normalTexture;uniform mat4 projectionViewMatrix;uniform mat4 cameraMatrixWorld;uniform sampler2D blueNoiseTexture;uniform vec2 blueNoiseRepeat;uniform vec2 texSize;uniform mat4 projectionMatrixInverse;uniform float aoDistance;uniform float distancePower;uniform float cameraNear;uniform float cameraFar;uniform int frame;uniform vec3[spp]samples;uniform float[spp]samplesR;\n#include <common>\n#include <packing>\n#include <sampleBlueNoise>\nvec3 getWorldPos(const float depth,const vec2 coord){float z=depth*2.0-1.0;vec4 clipSpacePosition=vec4(coord*2.0-1.0,z,1.0);vec4 viewSpacePosition=projectionMatrixInverse*clipSpacePosition;vec4 worldSpacePosition=cameraMatrixWorld*viewSpacePosition;worldSpacePosition.xyz/=worldSpacePosition.w;return worldSpacePosition.xyz;}vec3 computeNormal(vec3 worldPos,vec2 vUv){vec2 size=vec2(textureSize(depthTexture,0));ivec2 p=ivec2(vUv*size);float c0=texelFetch(depthTexture,p,0).x;float l2=texelFetch(depthTexture,p-ivec2(2,0),0).x;float l1=texelFetch(depthTexture,p-ivec2(1,0),0).x;float r1=texelFetch(depthTexture,p+ivec2(1,0),0).x;float r2=texelFetch(depthTexture,p+ivec2(2,0),0).x;float b2=texelFetch(depthTexture,p-ivec2(0,2),0).x;float b1=texelFetch(depthTexture,p-ivec2(0,1),0).x;float t1=texelFetch(depthTexture,p+ivec2(0,1),0).x;float t2=texelFetch(depthTexture,p+ivec2(0,2),0).x;float dl=abs((2.0*l1-l2)-c0);float dr=abs((2.0*r1-r2)-c0);float db=abs((2.0*b1-b2)-c0);float dt=abs((2.0*t1-t2)-c0);vec3 ce=getWorldPos(c0,vUv).xyz;vec3 dpdx=(dl<dr)? ce-getWorldPos(l1,(vUv-vec2(1.0/size.x,0.0))).xyz:-ce+getWorldPos(r1,(vUv+vec2(1.0/size.x,0.0))).xyz;vec3 dpdy=(db<dt)? ce-getWorldPos(b1,(vUv-vec2(0.0,1.0/size.y))).xyz:-ce+getWorldPos(t1,(vUv+vec2(0.0,1.0/size.y))).xyz;return normalize(cross(dpdx,dpdy));}highp float linearize_depth(highp float d,highp float zNear,highp float zFar){highp float z_n=2.0*d-1.0;return 2.0*zNear*zFar/(zFar+zNear-z_n*(zFar-zNear));}void main(){\n#if DepthValueSourceType == NORMAL_VECTOR_ALPHA\nfloat depth=textureLod(depthTexture,vUv,0.).a;\n#else\nfloat depth=textureLod(depthTexture,vUv,0.).x;\n#endif\nif(depth==1.0){discard;return;}vec3 worldPos=getWorldPos(depth,vUv);\n#if NormalVectorSourceType == FLOAT_BUFFER_NORMAL\nvec3 normal=normalize(textureLod(normalTexture,vUv,0.).rgb);\n#else\nvec3 normal=computeNormal(worldPos,vUv);\n#endif\n#ifdef animatedNoise\nint seed=frame;\n#else\nint seed=0;\n#endif\nvec4 noise=sampleBlueNoise(blueNoiseTexture,seed,blueNoiseRepeat,texSize);vec3 randomVec=normalize(noise.rgb*2.0-1.0);vec3 tangent=normalize(randomVec-normal*dot(randomVec,normal));vec3 bitangent=cross(normal,tangent);mat3 tbn=mat3(tangent,bitangent,normal);float occluded=0.0;float totalWeight=0.0;vec3 samplePos;float sppF=float(spp);for(float i=0.0;i<sppF;i++){vec3 sampleDirection=tbn*samples[int(i)];if(dot(sampleDirection,normal)<0.0)sampleDirection*=-1.0;float moveAmt=samplesR[int(mod(i+noise.a*sppF,sppF))];samplePos=worldPos+aoDistance*moveAmt*sampleDirection;vec4 offset=projectionViewMatrix*vec4(samplePos,1.0);offset.xyz/=offset.w;offset.xyz=offset.xyz*0.5+0.5;\n#if DepthValueSourceType == NORMAL_VECTOR_ALPHA\nfloat sampleDepth=textureLod(depthTexture,offset.xy,0.0).a;\n#else\nfloat sampleDepth=textureLod(depthTexture,offset.xy,0.0).x;\n#endif\nfloat distSample=linearize_depth(sampleDepth,cameraNear,cameraFar);float distWorld=linearize_depth(offset.z,cameraNear,cameraFar);float rangeCheck=smoothstep(0.0,1.0,aoDistance/(aoDistance*abs(distSample-distWorld)));rangeCheck=pow(rangeCheck,distancePower);float weight=dot(sampleDirection,normal);occluded+=rangeCheck*weight*(distSample<distWorld ? 1.0 : 0.0);totalWeight+=weight;}float occ=clamp(1.0-occluded/totalWeight,0.0,1.0);\n#ifdef MODULATE_RED_CHANNEL\ngl_FragColor=vec4(occ,1.0,1.0,1.0);\n#else\ngl_FragColor=vec4(normal,occ);\n#endif\n}")}}const finalFragmentShader$1="#define GLSLIFY 1\nvarying vec2 vUv;uniform sampler2D depthTexture;uniform mat4 projectionViewMatrix;uniform int frame;uniform sampler2D blueNoiseTexture;uniform vec2 blueNoiseRepeat;uniform vec2 texSize;uniform float aoDistance;uniform float distancePower;uniform float bias;uniform float thickness;\n#include <packing>\n#include <hbao_utils>\nfloat getOcclusion(const vec3 cameraPosition,const vec3 worldPos,const vec3 worldNormal,const float depth,const int seed,inout float totalWeight){vec4 blueNoise=sampleBlueNoise(blueNoiseTexture,seed,blueNoiseRepeat,texSize);vec3 sampleWorldDir=cosineSampleHemisphere(worldNormal,blueNoise.rg);vec3 sampleWorldPos=worldPos+aoDistance*pow(blueNoise.b,distancePower+1.0)*sampleWorldDir;vec4 sampleUv=projectionViewMatrix*vec4(sampleWorldPos,1.);sampleUv.xy/=sampleUv.w;sampleUv.xy=sampleUv.xy*0.5+0.5;\n#if DepthValueSourceType == NORMAL_VECTOR_ALPHA\nfloat sampleDepth=textureLod(depthTexture,sampleUv.xy,0.0).a;\n#else\nfloat sampleDepth=textureLod(depthTexture,sampleUv.xy,0.0).r;\n#endif\nfloat deltaDepth=depth-sampleDepth;float d=distance(sampleWorldPos,cameraPosition);deltaDepth*=0.001*d*d;float th=thickness*0.01;float theta=dot(worldNormal,sampleWorldDir);totalWeight+=theta;if(deltaDepth<th){float horizon=sampleDepth+deltaDepth*bias*1000.;float occlusion=max(0.0,horizon-depth)*theta;float m=max(0.,1.-deltaDepth/th);occlusion=10.*occlusion*m/d;occlusion=sqrt(occlusion);return occlusion;}return 0.;}void main(){\n#if DepthValueSourceType == NORMAL_VECTOR_ALPHA\nfloat depth=textureLod(depthTexture,vUv,0.0).a;\n#else\nfloat depth=textureLod(depthTexture,vUv,0.0).r;\n#endif\nif(depth==1.0){discard;return;}vec4 cameraPosition=cameraMatrixWorld*vec4(0.0,0.0,0.0,1.0);vec3 worldPos=getWorldPos(depth,vUv);vec3 worldNormal=getWorldNormal(vUv);float ao=0.0,totalWeight=0.0;for(int i=0;i<spp;i++){int seed=i;\n#ifdef animatedNoise\nseed+=frame;\n#endif\nfloat occlusion=getOcclusion(cameraPosition.xyz,worldPos,worldNormal,depth,seed,totalWeight);ao+=occlusion;}if(totalWeight>0.)ao/=totalWeight;ao=clamp(1.-ao,0.,1.);\n#ifdef MODULATE_RED_CHANNEL\ngl_FragColor=vec4(ao,1.0,1.0,1.0);\n#else\ngl_FragColor=vec4(worldNormal,ao);\n#endif\n}".replace("#include <hbao_utils>","#define GLSLIFY 1\n#include <sampleBlueNoise>\nuniform sampler2D normalTexture;uniform float cameraNear;uniform float cameraFar;uniform mat4 projectionMatrixInverse;uniform mat4 cameraMatrixWorld;float getViewZ(const float depth){\n#ifdef PERSPECTIVE_CAMERA\nreturn perspectiveDepthToViewZ(depth,cameraNear,cameraFar);\n#else\nreturn orthographicDepthToViewZ(depth,cameraNear,cameraFar);\n#endif\n}vec3 getWorldPos(const float depth,const vec2 coord){float z=depth*2.0-1.0;vec4 clipSpacePosition=vec4(coord*2.0-1.0,z,1.0);vec4 viewSpacePosition=projectionMatrixInverse*clipSpacePosition;vec4 worldSpacePosition=cameraMatrixWorld*viewSpacePosition;worldSpacePosition.xyz/=worldSpacePosition.w;return worldSpacePosition.xyz;}vec3 slerp(const vec3 a,const vec3 b,const float t){float cosAngle=dot(a,b);float angle=acos(cosAngle);if(abs(angle)<0.001){return mix(a,b,t);}float sinAngle=sin(angle);float t1=sin((1.0-t)*angle)/sinAngle;float t2=sin(t*angle)/sinAngle;return(a*t1)+(b*t2);}vec3 computeWorldNormal(){vec2 size=vec2(textureSize(depthTexture,0));ivec2 p=ivec2(vUv*size);float c0=texelFetch(depthTexture,p,0).x;float l2=texelFetch(depthTexture,p-ivec2(2,0),0).x;float l1=texelFetch(depthTexture,p-ivec2(1,0),0).x;float r1=texelFetch(depthTexture,p+ivec2(1,0),0).x;float r2=texelFetch(depthTexture,p+ivec2(2,0),0).x;float b2=texelFetch(depthTexture,p-ivec2(0,2),0).x;float b1=texelFetch(depthTexture,p-ivec2(0,1),0).x;float t1=texelFetch(depthTexture,p+ivec2(0,1),0).x;float t2=texelFetch(depthTexture,p+ivec2(0,2),0).x;float dl=abs((2.0*l1-l2)-c0);float dr=abs((2.0*r1-r2)-c0);float db=abs((2.0*b1-b2)-c0);float dt=abs((2.0*t1-t2)-c0);vec3 ce=getWorldPos(c0,vUv).xyz;vec3 dpdx=(dl<dr)? ce-getWorldPos(l1,(vUv-vec2(1.0/size.x,0.0))).xyz:-ce+getWorldPos(r1,(vUv+vec2(1.0/size.x,0.0))).xyz;vec3 dpdy=(db<dt)? ce-getWorldPos(b1,(vUv-vec2(0.0,1.0/size.y))).xyz:-ce+getWorldPos(t1,(vUv+vec2(0.0,1.0/size.y))).xyz;return normalize(cross(dpdx,dpdy));}vec3 getWorldNormal(const vec2 uv){\n#ifdef useNormalTexture\n#if NormalVectorSourceType == FLOAT_BUFFER_NORMAL\nvec3 worldNormal=normalize(textureLod(normalTexture,uv,0.).rgb);\n#else\nvec3 worldNormal=unpackRGBToNormal(textureLod(normalTexture,uv,0.).rgb);\n#endif\nworldNormal=(vec4(worldNormal,1.)*viewMatrix).xyz;return normalize(worldNormal);\n#else\nreturn computeWorldNormal();\n#endif\n}\n#define PI 3.14159265358979323846264338327950288\nvec3 cosineSampleHemisphere(const vec3 n,const vec2 u){float r=sqrt(u.x);float theta=2.0*PI*u.y;vec3 b=normalize(cross(n,vec3(0.0,1.0,1.0)));vec3 t=cross(b,n);return normalize(r*sin(theta)*b+sqrt(1.0-u.x)*n+r*cos(theta)*t);}");class HBAOPass extends AOPass{constructor(e,t){super(e,t,finalFragmentShader$1)}}const finalFragmentShader="#define GLSLIFY 1\nvarying vec2 vUv;uniform sampler2D inputTexture;uniform sampler2D depthTexture;uniform sampler2D normalTexture;uniform mat4 projectionMatrixInverse;uniform mat4 cameraMatrixWorld;uniform float lumaPhi;uniform float depthPhi;uniform float normalPhi;uniform sampler2D blueNoiseTexture;uniform vec2 blueNoiseRepeat;uniform int index;uniform vec2 resolution;\n#include <common>\n#include <sampleBlueNoise>\nvec3 getWorldPos(float depth,vec2 coord){float z=depth*2.0-1.0;vec4 clipSpacePosition=vec4(coord*2.0-1.0,z,1.0);vec4 viewSpacePosition=projectionMatrixInverse*clipSpacePosition;vec4 worldSpacePosition=cameraMatrixWorld*viewSpacePosition;worldSpacePosition.xyz/=worldSpacePosition.w;return worldSpacePosition.xyz;}\n#ifdef RG_INPUT_TEXTURE\n#define luminance(a) (a.r * a.g)\n#else\n#define luminance(a) dot(vec3(0.2125, 0.7154, 0.0721), a)\n#endif\nvec3 getNormal(vec2 uv,vec4 texel){\n#ifdef NORMAL_IN_RGB\nreturn texel.rgb;\n#elif NormalVectorSourceType == FLOAT_BUFFER_NORMAL\nreturn normalize(textureLod(normalTexture,uv,0.).xyz);\n#elif NormalVectorSourceType == CONSTANT_Z\nreturn vec3(0.0,0.0,1.0);\n#else\nreturn normalize(textureLod(normalTexture,uv,0.).xyz*2.0-1.0);\n#endif\n}float distToPlane(const vec3 worldPos,const vec3 neighborWorldPos,const vec3 worldNormal){vec3 toCurrent=worldPos-neighborWorldPos;float distToPlane=abs(dot(toCurrent,worldNormal));return distToPlane;}void main(){\n#if DepthValueSourceType == NORMAL_VECTOR_ALPHA\nvec4 depthTexel=textureLod(normalTexture,vUv,0.).argb;\n#else\nvec4 depthTexel=textureLod(depthTexture,vUv,0.);\n#endif\nif(depthTexel.r==1.0||dot(depthTexel.rgb,depthTexel.rgb)==0.){discard;return;}vec4 texel=textureLod(inputTexture,vUv,0.0);vec3 normal=getNormal(vUv,texel);\n#ifdef NORMAL_IN_RGB\nfloat denoised=texel.a;float center=texel.a;\n#else\nvec3 denoised=texel.rgb;vec3 center=texel.rgb;\n#endif\nfloat depth=depthTexel.x;vec3 worldPos=getWorldPos(depth,vUv);float totalWeight=1.0;vec4 blueNoise=sampleBlueNoise(blueNoiseTexture,0,blueNoiseRepeat,resolution);float angle=blueNoise[index];float s=sin(angle),c=cos(angle);mat2 rotationMatrix=mat2(c,-s,s,c);for(int i=0;i<samples;i++){vec2 offset=rotationMatrix*poissonDisk[i];vec2 neighborUv=vUv+offset;vec4 neighborTexel=textureLod(inputTexture,neighborUv,0.0);vec3 neighborNormal=getNormal(neighborUv,neighborTexel);\n#ifdef NORMAL_IN_RGB\nfloat neighborColor=neighborTexel.a;\n#else\nvec3 neighborColor=neighborTexel.rgb;\n#endif\n#if DepthValueSourceType == NORMAL_VECTOR_ALPHA\nfloat sampleDepth=textureLod(depthTexture,neighborUv,0.0).a;\n#else\nfloat sampleDepth=textureLod(depthTexture,neighborUv,0.0).x;\n#endif\nvec3 worldPosSample=getWorldPos(sampleDepth,neighborUv);float tangentPlaneDist=abs(dot(worldPos-worldPosSample,normal));float normalDiff=dot(normal,neighborNormal);float normalSimilarity=pow(max(normalDiff,0.),normalPhi);\n#ifdef NORMAL_IN_RGB\nfloat lumaDiff=abs(neighborColor-center);\n#else\nfloat lumaDiff=abs(luminance(neighborColor)-luminance(center));\n#endif\nfloat lumaSimilarity=max(1.0-lumaDiff/lumaPhi,0.0);float depthDiff=1.-distToPlane(worldPos,worldPosSample,normal);float depthSimilarity=max(depthDiff/depthPhi,0.);float w=lumaSimilarity*depthSimilarity*normalSimilarity;denoised+=w*neighborColor;totalWeight+=w;}if(totalWeight>0.)denoised/=totalWeight;\n#ifdef NORMAL_IN_RGB\ngl_FragColor=vec4(normal,denoised);\n#else\ngl_FragColor=vec4(denoised,1.);\n#endif\n}".replace("#include <sampleBlueNoise>",sampleBlueNoise),defaultPoissonBlurOptions={iterations:1,radius:8,rings:5.625,lumaPhi:10,depthPhi:2,normalPhi:3.25,samples:16,normalTexture:null};class PoissionDenoisePass extends Pass{iterations=defaultPoissonBlurOptions.iterations;index=0;constructor(e,t,n,r=defaultPoissonBlurOptions){super("PoissionBlurPass"),r={...defaultPoissonBlurOptions,...r},this.inputTexture=t,this.fullscreenMaterial=new ShaderMaterial({fragmentShader:finalFragmentShader,vertexShader,uniforms:{depthTexture:{value:null},inputTexture:{value:null},projectionMatrixInverse:{value:new Matrix4},cameraMatrixWorld:{value:new Matrix4},lumaPhi:{value:5},depthPhi:{value:5},normalPhi:{value:5},resolution:{value:new Vector2},blueNoiseTexture:{value:null},index:{value:0},blueNoiseRepeat:{value:new Vector2}}});const a={type:HalfFloatType,depthBuffer:!1};this.renderTargetA=new WebGLRenderTarget(1,1,a),this.renderTargetB=new WebGLRenderTarget(1,1,a);const{uniforms:i}=this.fullscreenMaterial;i.inputTexture.value=this.inputTexture,i.depthTexture.value=n,i.projectionMatrixInverse.value=e.projectionMatrixInverse,i.cameraMatrixWorld.value=e.matrixWorld,i.depthPhi.value=r.depthPhi,i.normalPhi.value=r.normalPhi,r.normalTexture?i.normalTexture={value:r.normalTexture}:this.fullscreenMaterial.defines.NORMAL_IN_RGB="";for(const e of["radius","rings","samples"])Object.defineProperty(this,e,{get:()=>r[e],set:t=>{r[e]=t,this.setSize(this.renderTargetA.width,this.renderTargetA.height)}});(new TextureLoader).load(blueNoiseImage,e=>{e.minFilter=NearestFilter,e.magFilter=NearestFilter,e.wrapS=RepeatWrapping,e.wrapT=RepeatWrapping,e.colorSpace=NoColorSpace,this.fullscreenMaterial.uniforms.blueNoiseTexture.value=e})}setSize(e,t){this.renderTargetA.setSize(e,t),this.renderTargetB.setSize(e,t),this.fullscreenMaterial.uniforms.resolution.value.set(e,t);const n=function(e,t,n,r){const a=2*Math.PI*t/e,i=1/e,s=i,o=[];let l=i,d=0;for(let t=0;t<e;t++){const e=new Vector2(Math.cos(d),Math.sin(d)).multiplyScalar(Math.pow(l,.75)).multiply(r).multiplyScalar(n);o.push(e),l+=s,d+=a}return o}(this.samples,this.rings,this.radius,new Vector2(1/e,1/t)),r=`const int samples = ${this.samples};\n`,a=function(e){const t=e.length;let n="const vec2 poissonDisk[samples] = vec2[samples](\n";for(let r=0;r<t;r++){const a=e[r];n+=` vec2(${a.x}, ${a.y})`,r<t-1&&(n+=","),n+="\n"}return n+=");",n}(n);this.fullscreenMaterial.fragmentShader=r+a+"\n"+finalFragmentShader,this.fullscreenMaterial.needsUpdate=!0}get texture(){return this.renderTargetB.texture}render(e){this.fullscreenMaterial.uniforms.index.value=0;const t=this.fullscreenMaterial.uniforms.blueNoiseTexture.value;if(t){const{width:e,height:n}=t.source.data;this.fullscreenMaterial.uniforms.blueNoiseRepeat.value.set(this.renderTargetA.width/e,this.renderTargetA.height/n)}for(let t=0;t<2*this.iterations;t++){const n=t%2==0,r=n?this.renderTargetB:this.renderTargetA;this.fullscreenMaterial.uniforms.inputTexture.value=0===t?this.inputTexture:r.texture;const a=n?this.renderTargetA:this.renderTargetB;e.setRenderTarget(a),e.render(this.scene,this.camera),this.fullscreenMaterial.uniforms.index.value=(this.fullscreenMaterial.uniforms.index.value+1)%4}}}var NormalVectorSourceType,DepthValueSourceType;PoissionDenoisePass.DefaultOptions=defaultPoissonBlurOptions,function(e){e[e.INPUT_RGB_NORMAL=0]="INPUT_RGB_NORMAL",e[e.FLOAT_BUFFER_NORMAL=1]="FLOAT_BUFFER_NORMAL",e[e.CONSTANT_Z=2]="CONSTANT_Z"}(NormalVectorSourceType||(NormalVectorSourceType={})),function(e){e[e.SEPARATE_BUFFER=0]="SEPARATE_BUFFER",e[e.NORMAL_VECTOR_ALPHA=1]="NORMAL_VECTOR_ALPHA"}(DepthValueSourceType||(DepthValueSourceType={}));const defaultSSAOEffectParameters={resolutionScale:1,spp:16,distance:.25,distancePower:.25,power:2,bias:40,thickness:.075},defaultHBAOEffectParameters={resolutionScale:1,spp:16,distance:.25,distancePower:1,power:2,bias:20,thickness:.05},defaultPoisonDenoiseParameters={iterations:1,radius:10,rings:5.625,lumaPhi:10,depthPhi:12,normalPhi:3.25,samples:16};class SSAOEffect{get texture(){return this.ssaoPass?this.ssaoPass.texture:null}constructor(e,t,n){this.needsUpdate=!0,this.parameters={...defaultSSAOEffectParameters},this._width=0,this._height=0,this._loaded=!1,this._normalVectorSourceType=NormalVectorSourceType.FLOAT_BUFFER_NORMAL,this._depthValueSourceType=DepthValueSourceType.NORMAL_VECTOR_ALPHA,this._modulateRedChannel=!1,this.depthTexture=null,this.normalTexture=null,this._width=e,this._height=t,this._normalVectorSourceType=(null==n?void 0:n.normalVectorSourceType)||NormalVectorSourceType.FLOAT_BUFFER_NORMAL,this._depthValueSourceType=(null==n?void 0:n.depthValueSourceType)||DepthValueSourceType.NORMAL_VECTOR_ALPHA,this._modulateRedChannel=(null==n?void 0:n.modulateRedChannel)||!1,(null==n?void 0:n.ssaoParameters)&&(this.parameters=n.ssaoParameters),n&&this.updateParameters(n)}_getPass(e,t){if(!this.ssaoPass){this.ssaoPass=new SSAOPass(e,t);const n=this.ssaoPass.fullscreenMaterial;n.defines.useNormalTexture="",this._modulateRedChannel&&(n.blending=CustomBlending,n.blendEquation=MinEquation,n.blendEquationAlpha=null,n.blendSrc=OneFactor,n.blendSrcAlpha=null,n.blendDst=OneFactor,n.blendDstAlpha=null),n.onBeforeCompile=e=>{e.defines={...e.defines,FLOAT_BUFFER_NORMAL:NormalVectorSourceType.FLOAT_BUFFER_NORMAL,NormalVectorSourceType:this._normalVectorSourceType,NORMAL_VECTOR_ALPHA:DepthValueSourceType.NORMAL_VECTOR_ALPHA,DepthValueSourceType:this._depthValueSourceType,MODULATE_RED_CHANNEL:this._modulateRedChannel?"MODULATE_RED_CHANNEL":void 0}},this.needsUpdate=!0}return this.ssaoPass}dispose(){var e;null===(e=this.ssaoPass)||void 0===e||e.dispose()}setSize(e,t){var n;this._width=e,this._height=t,null===(n=this.ssaoPass)||void 0===n||n.setSize(e,t),this.needsUpdate=!0}updateParameters(e){for(let t in e)this.parameters.hasOwnProperty(t)&&(this.parameters[t]=e[t],this.needsUpdate=!0);e.depthTexture&&(this.depthTexture=e.depthTexture,this.needsUpdate=!0),e.normalTexture&&(this.normalTexture=e.normalTexture,this.needsUpdate=!0)}render(e,t,n,r){var a;this._loaded||null===(null===(a=this.ssaoPass)||void 0===a?void 0:a.fullscreenMaterial.uniforms.blueNoiseTexture.value)||(this._loaded=!0,this.needsUpdate=!0);const i=!this.ssaoPass,s=this._getPass(t,n);if(this.needsUpdate||i){if(this.needsUpdate=!1,s.fullscreenMaterial.uniforms.aoDistance.value=this.parameters.distance,s.fullscreenMaterial.uniforms.distancePower.value=this.parameters.distancePower,s.fullscreenMaterial.uniforms.bias.value=this.parameters.bias,s.fullscreenMaterial.uniforms.thickness.value=this.parameters.thickness,s.fullscreenMaterial.uniforms.power.value=this.parameters.power,s.fullscreenMaterial.uniforms.depthTexture.value=this._depthValueSourceType===DepthValueSourceType.NORMAL_VECTOR_ALPHA?this.normalTexture:this.depthTexture,s.fullscreenMaterial.uniforms.normalTexture.value=this.normalTexture,s.fullscreenMaterial.needsUpdate=!0,i){const e=Math.round(this.parameters.spp);s.fullscreenMaterial.defines.spp=e;const t=function(e){const t=[],n=Math.PI*(3-Math.sqrt(5)),r=2/e;for(let a=0;a<e;a++){const e=a*r-1+r/2,i=Math.sqrt(1-e*e),s=a*n;t.push(new Vector3(Math.cos(s)*i,e,Math.sin(s)*i))}return t}(e),n=[];for(let t=0;t<e;t++)n.push((t+1)/e);s.fullscreenMaterial.uniforms.samples={value:t},s.fullscreenMaterial.uniforms.samplesR={value:n}}s.setSize(this._width,this._height),s.renderToScreen=!1}s._camera=t,s.fullscreenMaterial.uniforms.viewMatrix.value=t.matrixWorldInverse,s.fullscreenMaterial.uniforms.projectionMatrixInverse.value=t.projectionMatrixInverse,s.fullscreenMaterial.uniforms.cameraMatrixWorld.value=t.matrixWorld;const o=e.getRenderTarget();r&&(s.renderTarget=r),s.render(e),e.setRenderTarget(o)}}class HBAOEffect{get texture(){return this.hbaoPass.texture}constructor(e,t,n){this.needsUpdate=!0,this.parameters={...defaultHBAOEffectParameters},this._width=0,this._height=0,this._loaded=!1,this._normalVectorSourceType=NormalVectorSourceType.FLOAT_BUFFER_NORMAL,this._depthValueSourceType=DepthValueSourceType.NORMAL_VECTOR_ALPHA,this._modulateRedChannel=!1,this.depthTexture=null,this.normalTexture=null,this._width=e,this._height=t,this._normalVectorSourceType=(null==n?void 0:n.normalVectorSourceType)||NormalVectorSourceType.FLOAT_BUFFER_NORMAL,this._depthValueSourceType=(null==n?void 0:n.depthValueSourceType)||DepthValueSourceType.NORMAL_VECTOR_ALPHA,this._modulateRedChannel=(null==n?void 0:n.modulateRedChannel)||!1,(null==n?void 0:n.hbaoParameters)&&(this.parameters=n.hbaoParameters),n&&this.updateParameters(n)}_getPass(e,t){if(!this.hbaoPass){this.hbaoPass=new HBAOPass(e,t);const n=this.hbaoPass.fullscreenMaterial;n.defines.useNormalTexture="",this._modulateRedChannel&&(n.blending=CustomBlending,n.blendEquation=MinEquation,n.blendEquationAlpha=null,n.blendSrc=OneFactor,n.blendSrcAlpha=null,n.blendDst=OneFactor,n.blendDstAlpha=null),n.onBeforeCompile=e=>{e.defines={...e.defines,FLOAT_BUFFER_NORMAL:NormalVectorSourceType.FLOAT_BUFFER_NORMAL,NormalVectorSourceType:this._normalVectorSourceType,NORMAL_VECTOR_ALPHA:DepthValueSourceType.NORMAL_VECTOR_ALPHA,DepthValueSourceType:this._depthValueSourceType,MODULATE_RED_CHANNEL:this._modulateRedChannel?"MODULATE_RED_CHANNEL":void 0}},this.needsUpdate=!0}return this.hbaoPass}dispose(){var e;null===(e=this.hbaoPass)||void 0===e||e.dispose()}setSize(e,t){var n;this._width=e,this._height=t,null===(n=this.hbaoPass)||void 0===n||n.setSize(e,t),this.needsUpdate=!0}updateParameters(e){for(let t in e)this.parameters.hasOwnProperty(t)&&(this.parameters[t]=e[t],this.needsUpdate=!0);e.depthTexture&&(this.depthTexture=e.depthTexture,this.needsUpdate=!0),e.normalTexture&&(this.normalTexture=e.normalTexture,this.needsUpdate=!0)}render(e,t,n,r){var a;this._loaded||null===(null===(a=this.hbaoPass)||void 0===a?void 0:a.fullscreenMaterial.uniforms.blueNoiseTexture.value)||(this._loaded=!0,this.needsUpdate=!0);const i=this._getPass(t,n);if(this.needsUpdate){this.needsUpdate=!1;const e=Math.round(this.parameters.spp);i.fullscreenMaterial.defines.spp=e,i.fullscreenMaterial.uniforms.aoDistance.value=this.parameters.distance,i.fullscreenMaterial.uniforms.distancePower.value=this.parameters.distancePower,i.fullscreenMaterial.uniforms.bias.value=this.parameters.bias,i.fullscreenMaterial.uniforms.thickness.value=this.parameters.thickness,i.fullscreenMaterial.uniforms.power.value=this.parameters.power,i.fullscreenMaterial.uniforms.depthTexture.value=this._depthValueSourceType===DepthValueSourceType.NORMAL_VECTOR_ALPHA?this.normalTexture:this.depthTexture,i.fullscreenMaterial.uniforms.normalTexture.value=this.normalTexture,i.fullscreenMaterial.needsUpdate=!0,i.setSize(this._width,this._height),i.renderToScreen=!1}i._camera=t,i.fullscreenMaterial.uniforms.viewMatrix.value=t.matrixWorldInverse,i.fullscreenMaterial.uniforms.projectionMatrixInverse.value=t.projectionMatrixInverse,i.fullscreenMaterial.uniforms.cameraMatrixWorld.value=t.matrixWorld;const s=e.getRenderTarget();r&&(i.renderTarget=r),i.render(e),e.setRenderTarget(s)}}class PoissonDenoiseEffect{get texture(){return this.denoisePass?this.denoisePass.texture:null}set inputTexture(e){this._inputTexture=e}constructor(e,t,n){this.needsUpdate=!0,this.parameters={...defaultPoisonDenoiseParameters},this._width=0,this._height=0,this._normalVectorSourceType=NormalVectorSourceType.FLOAT_BUFFER_NORMAL,this._depthValueSourceType=DepthValueSourceType.NORMAL_VECTOR_ALPHA,this._rgInputTexture=!0,this._inputTexture=null,this.depthTexture=null,this.normalTexture=null,this._width=e,this._height=t,this._normalVectorSourceType=(null==n?void 0:n.normalVectorSourceType)||NormalVectorSourceType.FLOAT_BUFFER_NORMAL,this._depthValueSourceType=(null==n?void 0:n.depthValueSourceType)||DepthValueSourceType.NORMAL_VECTOR_ALPHA,this._rgInputTexture=(null==n?void 0:n.rgInputTexture)||!0,this._inputTexture=(null==n?void 0:n.inputTexture)||null,this.depthTexture=(null==n?void 0:n.depthTexture)||null,this.normalTexture=(null==n?void 0:n.normalTexture)||null,n.poisonDenoiseParameters?this.parameters=n.poisonDenoiseParameters:n&&this.updateParameters(n)}_getPass(e){return this.denoisePass||(this.normalTexture?(this.denoisePass=new PoissionDenoisePass(e,this._inputTexture,this.depthTexture,{normalTexture:this.normalTexture}),this.denoisePass.fullscreenMaterial.onBeforeCompile=e=>{e.defines={...e.defines,FLOAT_BUFFER_NORMAL:NormalVectorSourceType.FLOAT_BUFFER_NORMAL,CONSTANT_Z:NormalVectorSourceType.CONSTANT_Z,NormalVectorSourceType:this._normalVectorSourceType,NORMAL_VECTOR_ALPHA:DepthValueSourceType.NORMAL_VECTOR_ALPHA,DepthValueSourceType:this._depthValueSourceType,RG_INPUT_TEXTURE:this._rgInputTexture?"RG_INPUT_TEXTURE":void 0}}):this.denoisePass=new PoissionDenoisePass(e,this._inputTexture,this.depthTexture),this.needsUpdate=!0),this.denoisePass}dispose(){var e;null===(e=this.denoisePass)||void 0===e||e.dispose()}setSize(e,t){var n;this._width=e,this._height=t,null===(n=this.denoisePass)||void 0===n||n.setSize(e,t),this.needsUpdate=!0}updateParameters(e){for(let t in e)this.parameters.hasOwnProperty(t)&&(this.parameters[t]=e[t],this.needsUpdate=!0);e.inputTexture&&(this._inputTexture=e.inputTexture,this.needsUpdate=!0),e.depthTexture&&(this.depthTexture=e.depthTexture,this.needsUpdate=!0),e.normalTexture&&(this.normalTexture=e.normalTexture,this.needsUpdate=!0)}render(e,t){const n=this._getPass(t);this.needsUpdate&&(this.needsUpdate=!1,n.iterations=this.parameters.iterations,n.samples=this.parameters.samples,n.rings=this.parameters.rings,n.radius=this.parameters.radius,n.fullscreenMaterial.uniforms.lumaPhi.value=this.parameters.lumaPhi,n.fullscreenMaterial.uniforms.depthPhi.value=this.parameters.depthPhi,n.fullscreenMaterial.uniforms.normalPhi.value=this.parameters.normalPhi,n.fullscreenMaterial.needsUpdate=!0,n.setSize(this._width,this._height),n.renderToScreen=!1,this.normalTexture?(n.fullscreenMaterial.uniforms.depthTexture.value=this._depthValueSourceType===DepthValueSourceType.NORMAL_VECTOR_ALPHA?this.normalTexture:this.depthTexture,n.fullscreenMaterial.uniforms.normalTexture.value=this.normalTexture):n.fullscreenMaterial.uniforms.depthTexture.value=this.depthTexture),n.inputTexture=this._inputTexture,n.fullscreenMaterial.uniforms.projectionMatrixInverse.value=t.projectionMatrixInverse,n.fullscreenMaterial.uniforms.cameraMatrixWorld.value=t.matrixWorld;const r=new Color$1;e.getClearColor(r);const a=e.getClearAlpha(),i=e.autoClear,s=e.getRenderTarget();e.autoClear=!0,e.setClearColor(16777215,1),e.setRenderTarget(this.denoisePass.renderTargetA),e.setRenderTarget(this.denoisePass.renderTargetB),e.clear(!0,!1,!1),n.render(e),e.setClearColor(r),e.setClearAlpha(a),e.setRenderTarget(s),e.autoClear=i}}var ShadowBlurType,AmbientOcclusionType;!function(e){e[e.OFF=0]="OFF",e[e.HARD=1]="HARD",e[e.POISSON=2]="POISSON",e[e.FULL=3]="FULL"}(ShadowBlurType||(ShadowBlurType={})),function(e){e[e.NONE=0]="NONE",e[e.SSAO=1]="SSAO",e[e.EffectsSSAO=2]="EffectsSSAO",e[e.EffectsHBAO=3]="EffectsHBAO"}(AmbientOcclusionType||(AmbientOcclusionType={}));const defaultShadowAndAoParameters={aoKernelRadius:.25,aoDepthBias:1e-4,aoMaxDistance:.5,aoMaxDepth:.99,aoFadeout:.5,shadowRadius:.05},defaultPassParameters={enabled:!0,aoType:AmbientOcclusionType.SSAO,aoIntensity:.5,shadowIntensity:.35,aoOnGround:!0,shadowOnGround:!1,alwaysUpdate:!1};class ShadowAndAoPass{get gBufferRenderTarget(){var e;return this._sharedGBufferRenderTarget?this._sharedGBufferRenderTarget:(this._gBufferRenderTarget=null!==(e=this._gBufferRenderTarget)&&void 0!==e?e:new GBufferRenderTargets(void 0,{_width:this._width,_height:this._height,_samples:this._samples,_renderPass:this._renderPass,textureFilter:NearestFilter}),this._gBufferRenderTarget)}get SSAOEffect(){return this._ssaoEffect||(this._ssaoEffect=new SSAOEffect(this._width,this._height,{normalVectorSourceType:this.gBufferRenderTarget.isFloatGBufferWithRgbNormalAlphaDepth?NormalVectorSourceType.FLOAT_BUFFER_NORMAL:NormalVectorSourceType.INPUT_RGB_NORMAL,depthValueSourceType:this.gBufferRenderTarget.isFloatGBufferWithRgbNormalAlphaDepth?DepthValueSourceType.NORMAL_VECTOR_ALPHA:DepthValueSourceType.SEPARATE_BUFFER,modulateRedChannel:!0,ssaoParameters:this.parameters.ssao})),this._ssaoEffect}get HBAOEffect(){return this._hbaoEffect||(this._hbaoEffect=new HBAOEffect(this._width,this._height,{normalVectorSourceType:this.gBufferRenderTarget.isFloatGBufferWithRgbNormalAlphaDepth?NormalVectorSourceType.FLOAT_BUFFER_NORMAL:NormalVectorSourceType.INPUT_RGB_NORMAL,depthValueSourceType:this.gBufferRenderTarget.isFloatGBufferWithRgbNormalAlphaDepth?DepthValueSourceType.NORMAL_VECTOR_ALPHA:DepthValueSourceType.SEPARATE_BUFFER,modulateRedChannel:!0,hbaoParameters:this.parameters.hbao})),this._hbaoEffect}get fadeRenderTarget(){var e;return this._fadeRenderTarget=null!==(e=this._fadeRenderTarget)&&void 0!==e?e:new WebGLRenderTarget(this._width,this._height,{format:RGFormat,magFilter:LinearFilter,minFilter:LinearFilter}),this._fadeRenderTarget}get denoisePass(){return this.poissonDenoiseEffect||(this.poissonDenoiseEffect=new PoissonDenoiseEffect(this._width,this._height,{inputTexture:this.shadowAndAoRenderTargets.passRenderTarget.texture,depthTexture:this.gBufferRenderTarget.depthBufferTexture,normalTexture:this.gBufferRenderTarget.gBufferTexture,normalVectorSourceType:this.gBufferRenderTarget.isFloatGBufferWithRgbNormalAlphaDepth?NormalVectorSourceType.FLOAT_BUFFER_NORMAL:NormalVectorSourceType.INPUT_RGB_NORMAL,depthValueSourceType:this.gBufferRenderTarget.isFloatGBufferWithRgbNormalAlphaDepth?DepthValueSourceType.NORMAL_VECTOR_ALPHA:DepthValueSourceType.SEPARATE_BUFFER,rgInputTexture:!0,poisonDenoiseParameters:this.parameters.poissonDenoise})),this.poissonDenoiseEffect}get denoiseRenderTargetTexture(){return this.denoisePass?this.denoisePass.texture:null}constructor(e,t,n,r){var a,i,s,o,l,d,h;this.needsUpdate=!0,this._renderPass=new RenderPass,this._cameraUpdate=new CameraUpdate,(null==r?void 0:r.gBufferRenderTarget)&&(this._sharedGBufferRenderTarget=null==r?void 0:r.gBufferRenderTarget),this._width=e,this._height=t,this._samples=n,this.shadowAndAoRenderTargets=new ShadowAndAoRenderTargets(this.gBufferRenderTarget,{...r,width:e,height:t,samples:n,_renderPass:this._renderPass}),this.parameters={enabled:null!==(a=null==r?void 0:r.enabled)&&void 0!==a?a:defaultPassParameters.enabled,aoType:null!==(i=null==r?void 0:r.aoType)&&void 0!==i?i:defaultPassParameters.aoType,aoIntensity:null!==(s=null==r?void 0:r.aoIntensity)&&void 0!==s?s:defaultPassParameters.aoIntensity,shadowIntensity:null!==(o=null==r?void 0:r.shadowIntensity)&&void 0!==o?o:defaultPassParameters.shadowIntensity,aoOnGround:null!==(l=null==r?void 0:r.aoOnGround)&&void 0!==l?l:defaultPassParameters.aoOnGround,shadowOnGround:null!==(d=null==r?void 0:r.shadowOnGround)&&void 0!==d?d:defaultPassParameters.shadowOnGround,alwaysUpdate:null!==(h=null==r?void 0:r.alwaysUpdate)&&void 0!==h?h:defaultPassParameters.alwaysUpdate,shAndAo:this.shadowAndAoRenderTargets.shadowAndAoParameters,ssao:{...defaultSSAOEffectParameters},hbao:{...defaultHBAOEffectParameters},poissonDenoise:{...defaultPoisonDenoiseParameters}},this._copyMaterial=new CopyTransformMaterial,this._blendMaterial=new CopyTransformMaterial({},CopyMaterialBlendMode.DEFAULT)}dispose(){var e,t,n,r,a,i,s;null===(e=this.gBufferRenderTarget)||void 0===e||e.dispose(),this.shadowAndAoRenderTargets.dispose(),null===(t=this._ssaoEffect)||void 0===t||t.dispose(),null===(n=this._hbaoEffect)||void 0===n||n.dispose(),null===(r=this._fadeRenderTarget)||void 0===r||r.dispose(),null===(a=this.poissonDenoiseEffect)||void 0===a||a.dispose(),null===(i=this._copyMaterial)||void 0===i||i.dispose(),null===(s=this._blendMaterial)||void 0===s||s.dispose()}setSize(e,t){var n,r,a,i,s;this._width=e,this._height=t,null===(n=this._gBufferRenderTarget)||void 0===n||n.setSize(e,t),this.shadowAndAoRenderTargets.setSize(e,t),null===(r=this._ssaoEffect)||void 0===r||r.setSize(e,t),null===(a=this._hbaoEffect)||void 0===a||a.setSize(e,t),null===(i=this._fadeRenderTarget)||void 0===i||i.setSize(e,t),null===(s=this.poissonDenoiseEffect)||void 0===s||s.setSize(this._width,this._height),this.needsUpdate=!0}updateParameters(e){void 0!==e.enabled&&(this.parameters.enabled=e.enabled),void 0!==e.aoType&&(this.parameters.aoType=e.aoType),void 0!==e.aoIntensity&&(this.parameters.aoIntensity=e.aoIntensity),void 0!==e.shadowIntensity&&(this.parameters.shadowIntensity=e.shadowIntensity),void 0!==e.aoOnGround&&(this.parameters.aoOnGround=e.aoOnGround),void 0!==e.shadowOnGround&&(this.parameters.shadowOnGround=e.shadowOnGround),void 0!==e.alwaysUpdate&&(this.parameters.alwaysUpdate=e.alwaysUpdate),this._updatePassParameters(e)}_updatePassParameters(e){var t,n,r;if(null==e?void 0:e.shAndAo)for(let t in e.shAndAo)this.parameters.shAndAo.hasOwnProperty(t)&&(this.parameters.shAndAo[t]=e.shAndAo[t],this.shadowAndAoRenderTargets.parametersNeedsUpdate=!0);(null==e?void 0:e.ssao)&&(null===(t=this._hbaoEffect)||void 0===t||t.updateParameters(null==e?void 0:e.hbao)),(null==e?void 0:e.hbao)&&(null===(n=this._ssaoEffect)||void 0===n||n.updateParameters(null==e?void 0:e.hbao)),(null==e?void 0:e.poissonDenoise)&&(null===(r=this.poissonDenoiseEffect)||void 0===r||r.updateParameters(null==e?void 0:e.poissonDenoise))}updateBounds(e,t){this.shadowAndAoRenderTargets.updateBounds(e,t)}render(e,t,n,r,a=ShadowBlurType.FULL,i=ShadowBlurType.FULL,s=0){if(!this._setRenderState())return;let o=!1;const l=i===ShadowBlurType.POISSON&&s>.001,d=i===ShadowBlurType.HARD&&s>.001&&s<.999,h=i===ShadowBlurType.HARD&&!d;!h&&a===ShadowBlurType.FULL&&this._evaluateIfUpdateIsNeeded(n)&&(this._renderShadowAndAo(e,t,n,r),o=!0);let c=h?r:this.denoiseRenderTargetTexture;l&&(c=this._renderDynamicShadow(e,this.shadowAndAoRenderTargets.passRenderTarget.texture,r,s),o=!0),o&&(c=this._renderDenoise(e,n,l)),d&&(c=this._renderDynamicShadow(e,this.denoiseRenderTargetTexture,r,s)),this._renderToTarget(e,c,h)}_setRenderState(){return this.shadowAndAoRenderTargets.aoEnabled=this.parameters.aoType===AmbientOcclusionType.SSAO,this.shadowAndAoRenderTargets.shadowEnabled=this.parameters.shadowIntensity>.01,!(!this.parameters.enabled||this.parameters.aoType===AmbientOcclusionType.NONE&&!this.shadowAndAoRenderTargets.shadowEnabled||(this.needsUpdate&&(this._ssaoEffect&&(this._ssaoEffect.needsUpdate=!0),this._hbaoEffect&&(this._hbaoEffect.needsUpdate=!0),this.poissonDenoiseEffect&&(this.poissonDenoiseEffect.needsUpdate=!0)),0))}_evaluateIfUpdateIsNeeded(e){e.updateProjectionMatrix();const t=this.parameters.alwaysUpdate||this.needsUpdate||null!=e&&this._cameraUpdate.changed(e);return this.needsUpdate=!1,t}_renderShadowAndAo(e,t,n,r){this.gBufferRenderTarget.render(e,t,n),this.shadowAndAoRenderTargets.render(e,n,r),this._renderAoEffect(e,t,n)}_renderAoEffect(e,t,n){if(this.parameters.aoType!==AmbientOcclusionType.EffectsSSAO&&this.parameters.aoType!==AmbientOcclusionType.EffectsHBAO)return;const r=this.gBufferRenderTarget.depthBufferTexture,a=this.gBufferRenderTarget.gBufferTexture,i=this.shadowAndAoRenderTargets.passRenderTarget,s=e.autoClear;switch(e.autoClear=!1,this.parameters.aoType){default:break;case AmbientOcclusionType.EffectsSSAO:{const s=this.SSAOEffect;s.depthTexture=r,s.normalTexture=a,s.render(e,n,t,i)}break;case AmbientOcclusionType.EffectsHBAO:{const s=this.HBAOEffect;s.depthTexture=r,s.normalTexture=a,s.render(e,n,t,i)}}e.autoClear=s}_renderDynamicShadow(e,t,n,r=1){const a=r<.999;return a&&(this._copyMaterial.update({texture:t,blending:NoBlending,colorTransform:DEFAULT_TRANSFORM,multiplyChannels:0}),this._renderPass.renderScreenSpace(e,this._copyMaterial,this.fadeRenderTarget)),r>.001&&(this._blendMaterial.update({texture:n,blending:a?CustomBlending:NoBlending,colorTransform:(new Matrix4).set(0,0,0,1,1,0,0,0,0,0,0,1,0,0,0,a?r:1),multiplyChannels:0}),this._renderPass.renderScreenSpace(e,this._blendMaterial,this.fadeRenderTarget)),this.fadeRenderTarget.texture}_renderDenoise(e,t,n){return this.denoisePass.inputTexture=n?this.fadeRenderTarget.texture:this.shadowAndAoRenderTargets.passRenderTarget.texture,this.denoisePass.render(e,t),this.denoisePass.texture}_renderToTarget(e,t,n){const r=n?this.parameters.shadowIntensity:this.parameters.aoIntensity,a=n?0:this.parameters.shadowIntensity;this._renderPass.renderScreenSpace(e,this._copyMaterial.update({texture:t,blending:CustomBlending,colorTransform:interpolationMatrix(r,a,0,1),multiplyChannels:1}),e.getRenderTarget())}}ShadowAndAoPass.shadowTransform=(new Matrix4).set(0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,1);class ShadowAndAoRenderTargets{get passRenderTarget(){var e;return this._passRenderTarget=null!==(e=this._passRenderTarget)&&void 0!==e?e:new WebGLRenderTarget(this._width,this._height,{samples:this._aoTargetSamples,format:RGFormat,magFilter:LinearFilter,minFilter:LinearFilter}),this._passRenderTarget}get passRenderMaterial(){var e;return this._passRenderMaterial=null!==(e=this._passRenderMaterial)&&void 0!==e?e:new ShadowAndAoRenderMaterial({normalTexture:this._depthAndNormalTextures.gBufferTexture,depthTexture:this._depthAndNormalTextures.depthBufferTexture,noiseTexture:this.noiseTexture,sampleKernel:this.sampleKernel,floatGBufferRgbNormalAlphaDepth:this._depthAndNormalTextures.isFloatGBufferWithRgbNormalAlphaDepth}),this._passRenderMaterial}get noiseTexture(){var e;return this._noiseTexture=null!==(e=this._noiseTexture)&&void 0!==e?e:(()=>{const e=new Uint8Array(64);for(let t=0;t<16;++t){const n=Math.floor(t/2)+t%2*8,r=2*Math.PI*n/16,a=new Vector3(Math.cos(r),Math.sin(r),0).normalize();e[4*t]=255*(.5*a.x+.5),e[4*t+1]=255*(.5*a.y+.5),e[4*t+2]=127,e[4*t+3]=0}const t=new DataTexture(e,4,4);return t.wrapS=RepeatWrapping,t.wrapT=RepeatWrapping,t.needsUpdate=!0,t})(),this._noiseTexture}get sampleKernel(){return this._sampleKernel.length||(this._sampleKernel=(e=>{const t=[];for(let n=0;n<e;n++){const r=n*Math.PI*(3-Math.sqrt(5)),a=.99-n/(e-1)*.8,i=Math.sqrt(1-a*a),s=Math.cos(r)*i,o=Math.sin(r)*i,l=8,d=Math.floor(e/l);let h=1-(Math.floor(n/l)+n%l*d)/e;h=MathUtils.lerp(.1,1,h*h),t.push(new Vector3(s*h,o*h,a*h))}return t})(ShadowAndAoRenderMaterial.kernelSize)),this._sampleKernel}constructor(e,t){var n,r,a,i;this.parametersNeedsUpdate=!0,this.aoEnabled=!0,this.shadowEnabled=!0,this._sceneBoxMin=new Vector3(-1,-1,-1),this._sceneBoxMax=new Vector3(1,1,1),this._shadowAndAoScale=1,this._aoTargetSamples=0,this._sampleKernel=[],this.shadowAndAoParameters=this._getShadowAndAoParameters(t),this._width=null!==(n=null==t?void 0:t._width)&&void 0!==n?n:1024,this._height=null!==(r=null==t?void 0:t._height)&&void 0!==r?r:1024,this._samples=null!==(a=null==t?void 0:t._samples)&&void 0!==a?a:0,this._depthAndNormalTextures=e,this._renderPass=null!==(i=null==t?void 0:t._renderPass)&&void 0!==i?i:new RenderPass}_getShadowAndAoParameters(e){return{...defaultShadowAndAoParameters,...e}}dispose(){var e,t,n;null===(e=this._noiseTexture)||void 0===e||e.dispose(),null===(t=this._passRenderMaterial)||void 0===t||t.dispose(),null===(n=this._passRenderTarget)||void 0===n||n.dispose()}setSize(e,t){var n;this._width=e,this._height=t,null===(n=this._passRenderMaterial)||void 0===n||n.update({_width:this._width,_height:this._height})}updateBounds(e,t){this._sceneBoxMin.copy(e.bounds.min),this._sceneBoxMax.copy(e.bounds.max),this._shadowAndAoScale=t,this.parametersNeedsUpdate=!0}render(e,t,n){this._renderPass.renderScreenSpace(e,this.updateSSAOMaterial(t,n),this.passRenderTarget),this.parametersNeedsUpdate=!1}updateSSAOMaterial(e,t){const n=this.passRenderMaterial;return n.updateDependencies({_width:this._width,_height:this._height,camera:e,shadowTexture:t,sceneBoxMin:this._sceneBoxMin,sceneBoxMax:this._sceneBoxMax}),this.parametersNeedsUpdate&&n.updateSettings({...this.shadowAndAoParameters,aoKernelRadius:this.shadowAndAoParameters.aoKernelRadius*this._shadowAndAoScale,aoMaxDistance:this.shadowAndAoParameters.aoMaxDistance*this._shadowAndAoScale,shadowRadius:this.shadowAndAoParameters.shadowRadius*this._shadowAndAoScale,aoIntensity:this.aoEnabled?1:0,shadowIntensity:this.shadowEnabled?1:0}),n}}class ShadowAndAoRenderMaterial extends ShaderMaterial{constructor(e){var t,n;super({defines:Object.assign({...ShadowAndAoRenderMaterial._shader.defines,KERNEL_SIZE:null!==(n=null===(t=null==e?void 0:e.sampleKernel)||void 0===t?void 0:t.length)&&void 0!==n?n:ShadowAndAoRenderMaterial.kernelSize,FLOAT_GBUFFER_RGB_NORMAL_ALPHA_DEPTH:(null==e?void 0:e.floatGBufferRgbNormalAlphaDepth)?1:0}),uniforms:UniformsUtils.clone(ShadowAndAoRenderMaterial._shader.uniforms),vertexShader:ShadowAndAoRenderMaterial._shader.vertexShader,fragmentShader:ShadowAndAoRenderMaterial._shader.fragmentShader,blending:NoBlending}),this.update(e)}update(e){return this.updateDependencies(e),this.updateSettings(e),this}updateDependencies(e){var t,n;if(void 0!==(null==e?void 0:e.shadowTexture)&&(this.uniforms.tShadow.value=null==e?void 0:e.shadowTexture),void 0!==(null==e?void 0:e.normalTexture)&&(this.uniforms.tNormal.value=null==e?void 0:e.normalTexture),void 0!==(null==e?void 0:e.depthTexture)&&(this.uniforms.tDepth.value=null==e?void 0:e.depthTexture),void 0!==(null==e?void 0:e.noiseTexture)&&(this.uniforms.tNoise.value=null==e?void 0:e.noiseTexture),(null==e?void 0:e._width)||(null==e?void 0:e._height)){const r=null!==(t=null==e?void 0:e._width)&&void 0!==t?t:this.uniforms.resolution.value.x,a=null!==(n=null==e?void 0:e._height)&&void 0!==n?n:this.uniforms.resolution.value.y;this.uniforms.resolution.value.set(r,a)}void 0!==(null==e?void 0:e.sampleKernel)&&(this.uniforms.sampleKernel.value=null==e?void 0:e.sampleKernel),void 0!==(null==e?void 0:e.sceneBoxMin)&&(this.uniforms.sceneBoxMin.value=null==e?void 0:e.sceneBoxMin),void 0!==(null==e?void 0:e.sceneBoxMax)&&(this.uniforms.sceneBoxMax.value=null==e?void 0:e.sceneBoxMax),this._updateCameraDependentUniforms(e)}_updateCameraDependentUniforms(e){if(void 0!==(null==e?void 0:e.camera)){const t=(null==e?void 0:e.camera)||(null==e?void 0:e.camera);this.uniforms.cameraNear.value=t.near,this.uniforms.cameraFar.value=t.far,this.uniforms.cameraProjectionMatrix.value.copy(t.projectionMatrix),this.uniforms.cameraInverseProjectionMatrix.value.copy(t.projectionMatrixInverse),this.uniforms.cameraWorldMatrix.value.copy(t.matrixWorld)}}updateSettings(e){void 0!==(null==e?void 0:e.aoKernelRadius)&&(this.uniforms.aoKernelRadius.value=null==e?void 0:e.aoKernelRadius),void 0!==(null==e?void 0:e.aoDepthBias)&&(this.uniforms.aoDepthBias.value=null==e?void 0:e.aoDepthBias),void 0!==(null==e?void 0:e.aoMaxDistance)&&(this.uniforms.aoMaxDistance.value=null==e?void 0:e.aoMaxDistance),void 0!==(null==e?void 0:e.aoMaxDepth)&&(this.uniforms.aoMaxDepth.value=null==e?void 0:e.aoMaxDepth),void 0!==(null==e?void 0:e.aoIntensity)&&(this.uniforms.aoIntensity.value=null==e?void 0:e.aoIntensity),void 0!==(null==e?void 0:e.aoFadeout)&&(this.uniforms.aoFadeout.value=null==e?void 0:e.aoFadeout),void 0!==(null==e?void 0:e.shadowRadius)&&(this.uniforms.shKernelRadius.value=null==e?void 0:e.shadowRadius),void 0!==(null==e?void 0:e.shadowIntensity)&&(this.uniforms.shIntensity.value=null==e?void 0:e.shadowIntensity)}}ShadowAndAoRenderMaterial.kernelSize=32,ShadowAndAoRenderMaterial._shader={uniforms:{tShadow:{value:null},tNormal:{value:null},tDepth:{value:null},tNoise:{value:null},sampleKernel:{value:null},cameraNear:{value:.1},cameraFar:{value:1},resolution:{value:new Vector2},cameraProjectionMatrix:{value:new Matrix4},cameraInverseProjectionMatrix:{value:new Matrix4},cameraWorldMatrix:{value:new Matrix4},aoKernelRadius:{value:.1},aoDepthBias:{value:.001},aoMaxDistance:{value:.05},aoMaxDepth:{value:.99},aoIntensity:{value:1},aoFadeout:{value:0},shKernelRadius:{value:.15},shIntensity:{value:1},sceneBoxMin:{value:new Vector3(-1,-1,-1)},sceneBoxMax:{value:new Vector3(1,1,1)}},defines:{PERSPECTIVE_CAMERA:1,KERNEL_SIZE:ShadowAndAoRenderMaterial.kernelSize,FLOAT_GBUFFER_RGB_NORMAL_ALPHA_DEPTH:0,NORMAL_VECTOR_ANTIALIAS:2},vertexShader:"varying vec2 vUv;\n void main() {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4( position, 1.0 );\n }",fragmentShader:"uniform sampler2D tShadow;\n uniform sampler2D tNormal;\n#if FLOAT_GBUFFER_RGB_NORMAL_ALPHA_DEPTH != 1 \n uniform sampler2D tDepth;\n#endif \n uniform sampler2D tNoise;\n uniform vec3 sampleKernel[KERNEL_SIZE];\n uniform vec2 resolution;\n uniform float cameraNear;\n uniform float cameraFar;\n uniform mat4 cameraProjectionMatrix;\n uniform mat4 cameraInverseProjectionMatrix;\n uniform mat4 cameraWorldMatrix;\n uniform float aoKernelRadius;\n uniform float aoDepthBias; // avoid artifacts caused by neighbour fragments with minimal depth difference\n uniform float aoMaxDistance; // avoid the influence of fragments which are too far away\n uniform float aoMaxDepth;\n uniform float aoIntensity;\n uniform float aoFadeout;\n uniform float shKernelRadius;\n uniform float shIntensity;\n uniform vec3 sceneBoxMin;\n uniform vec3 sceneBoxMax;\n \n varying vec2 vUv;\n \n #include <packing>\n \n float getDepth(const in vec2 screenPosition) {\n #if FLOAT_GBUFFER_RGB_NORMAL_ALPHA_DEPTH == 1\n return texture2D(tNormal, screenPosition).w;\n #else \n return texture2D(tDepth, screenPosition).x;\n #endif\n }\n \n float getViewZ(const in float depth) {\n #if PERSPECTIVE_CAMERA == 1\n return perspectiveDepthToViewZ(depth, cameraNear, cameraFar);\n #else\n return orthographicDepthToViewZ(depth, cameraNear, cameraFar);\n #endif\n }\n \n vec3 getViewPosition(const in vec2 screenPosition, const in float depth) {\n vec4 clipSpacePosition = vec4(vec3(screenPosition, depth) * 2.0 - 1.0, 1.0);\n vec4 viewSpacePosition = cameraInverseProjectionMatrix * clipSpacePosition;\n return viewSpacePosition.xyz / viewSpacePosition.w;\n }\n\n vec3 getAntiAliasedViewNormal(const in vec2 screenPosition) {\n #if FLOAT_GBUFFER_RGB_NORMAL_ALPHA_DEPTH == 1\n #if NORMAL_VECTOR_ANTIALIAS == 1\n vec2 uv = screenPosition;\n vec2 size = vec2(textureSize(tNormal, 0));\n ivec2 p = ivec2(screenPosition * size);\n float c0 = texelFetch(tNormal, p, 0).a;\n float l2 = texelFetch(tNormal, p - ivec2(2, 0), 0).a;\n float l1 = texelFetch(tNormal, p - ivec2(1, 0), 0).a;\n float r1 = texelFetch(tNormal, p + ivec2(1, 0), 0).a;\n float r2 = texelFetch(tNormal, p + ivec2(2, 0), 0).a;\n float b2 = texelFetch(tNormal, p - ivec2(0, 2), 0).a;\n float b1 = texelFetch(tNormal, p - ivec2(0, 1), 0).a;\n float t1 = texelFetch(tNormal, p + ivec2(0, 1), 0).a;\n float t2 = texelFetch(tNormal, p + ivec2(0, 2), 0).a;\n float dl = abs((2.0 * l1 - l2) - c0);\n float dr = abs((2.0 * r1 - r2) - c0);\n float db = abs((2.0 * b1 - b2) - c0);\n float dt = abs((2.0 * t1 - t2) - c0);\n vec3 ce = getViewPosition(uv, c0).xyz;\n vec3 dpdx = (dl < dr) ? ce - getViewPosition((uv - vec2(1.0 / size.x, 0.0)), l1).xyz\n : -ce + getViewPosition((uv + vec2(1.0 / size.x, 0.0)), r1).xyz;\n vec3 dpdy = (db < dt) ? ce - getViewPosition((uv - vec2(0.0, 1.0 / size.y)), b1).xyz\n : -ce + getViewPosition((uv + vec2(0.0, 1.0 / size.y)), t1).xyz;\n return normalize(cross(dpdx, dpdy));\n #elif NORMAL_VECTOR_ANTIALIAS == 2\n vec2 size = vec2(textureSize(tNormal, 0));\n ivec2 p = ivec2(screenPosition * size);\n vec3 normalVector = texelFetch(tNormal, p, 0).xyz;\n normalVector += texelFetch(tNormal, p + ivec2(1, 0), 0).xyz;\n normalVector += texelFetch(tNormal, p - ivec2(1, 0), 0).xyz;\n normalVector += texelFetch(tNormal, p + ivec2(0, 1), 0).xyz;\n normalVector += texelFetch(tNormal, p - ivec2(0, 1), 0).xyz;\n return normalize(normalVector);\n #else\n return texture2D(tNormal, screenPosition).xyz;\n #endif\n #else\n return unpackRGBToNormal(texture2D(tNormal, screenPosition).xyz);\n #endif\n }\n\n vec3 getViewNormal(const in vec2 screenPosition) {\n #if FLOAT_GBUFFER_RGB_NORMAL_ALPHA_DEPTH == 1\n return texture2D(tNormal, screenPosition).xyz;\n #else\n return unpackRGBToNormal(texture2D(tNormal, screenPosition).xyz);\n #endif\n }\n \n void main() {\n \n float depth = getDepth(vUv);\n float viewZ = getViewZ(depth);\n \n vec3 viewPosition = getViewPosition(vUv, depth);\n vec3 viewNormal = getAntiAliasedViewNormal(vUv);\n vec3 worldPosition = (cameraWorldMatrix * vec4(viewPosition, 1.0)).xyz;\n float boxDistance = length(max(vec3(0.0), max(sceneBoxMin - worldPosition, worldPosition - sceneBoxMax)));\n \n vec2 noiseScale = resolution.xy / 4.0;\n vec3 random = texture2D(tNoise, vUv * noiseScale).xyz * 2.0 - 1.0;\n \n // compute matrix used to reorient a kernel vector\n vec3 tangent = normalize(random - viewNormal * dot(random, viewNormal));\n vec3 bitangent = cross(viewNormal, tangent);\n mat3 kernelMatrix = mat3(tangent, bitangent, viewNormal);\n \n float aoOcclusion = 0.0;\n float shOcclusion = texture2D(tShadow, vUv).r;\n float shSamples = 0.0;\n if (aoIntensity >= 0.01 && boxDistance < aoMaxDistance && length(viewNormal) > 0.01) {\n for (int i = 0; i < KERNEL_SIZE; i ++) {\n vec3 aoSampleVector = kernelMatrix * sampleKernel[i]; \n vec3 aoSamplePoint = viewPosition + aoSampleVector * aoKernelRadius; \n vec4 aoSamplePointNDC = cameraProjectionMatrix * vec4(aoSamplePoint, 1.0); \n aoSamplePointNDC /= aoSamplePointNDC.w;\n vec2 aoSamplePointUv = aoSamplePointNDC.xy * 0.5 + 0.5;\n float aoRealSampleDepth = getDepth(aoSamplePointUv);\n float aoSampleDeltaZ = getViewZ(aoRealSampleDepth) - aoSamplePoint.z;\n float aoRealDeltaZ = viewZ - aoSamplePoint.z;\n float w_long = clamp((aoMaxDistance - max(aoRealDeltaZ, aoSampleDeltaZ)) / aoMaxDistance, 0.0, 1.0);\n float w_lat = clamp(1.0 - length(aoSampleVector.xy), 0.0, 1.0);\n aoOcclusion +=\n step(aoRealSampleDepth, aoMaxDepth) * \n step(aoDepthBias, aoSampleDeltaZ / (cameraFar - cameraNear)) * \n step(aoSampleDeltaZ, aoMaxDistance) * mix(1.0, w_long * w_lat, aoFadeout);\n }\n }\n if (shIntensity >= 0.01 && length(viewNormal) > 0.01) {\n for (int i = 0; i < KERNEL_SIZE; i ++) {\n vec3 shSampleVector = kernelMatrix * sampleKernel[i]; // reorient sample vector in view space\n vec3 shSamplePoint = viewPosition + shSampleVector * shKernelRadius; // calculate sample point\n vec4 shSamplePointNDC = cameraProjectionMatrix * vec4(shSamplePoint, 1.0); // project point and calculate NDC\n shSamplePointNDC /= shSamplePointNDC.w;\n vec2 shSamplePointUv = shSamplePointNDC.xy * 0.5 + 0.5; // compute uv coordinates\n vec3 shSampleNormal = getViewNormal(shSamplePointUv);\n float shDeltaZ = getViewZ(getDepth(shSamplePointUv)) - shSamplePoint.z;\n float w = step(abs(shDeltaZ), shKernelRadius) * max(0.0, dot(shSampleNormal, viewNormal));\n shSamples += w;\n shOcclusion += texture2D(tShadow, shSamplePointUv).r * w;\n }\n }\n \n aoOcclusion = clamp(aoOcclusion / float(KERNEL_SIZE) * (1.0 + aoFadeout), 0.0, 1.0);\n aoOcclusion = 1.0 - aoOcclusion * clamp(1.0 - boxDistance / aoMaxDistance, 0.0, 1.0);\n shOcclusion = clamp(shOcclusion / (shSamples + 1.0), 0.0, 1.0);\n gl_FragColor = vec4(aoOcclusion, shOcclusion, 0.0, 1.0);\n }"};class GroundReflectionPass{get reflectionRenderTarget(){var e;return this._reflectionRenderTarget=null!==(e=this._reflectionRenderTarget)&&void 0!==e?e:this._newRenderTarget(!0),this._reflectionRenderTarget}get intensityRenderTarget(){var e;return this._intensityRenderTarget=null!==(e=this._intensityRenderTarget)&&void 0!==e?e:this._newRenderTarget(!1),this._intensityRenderTarget}get blurRenderTarget(){var e;return this._blurRenderTarget=null!==(e=this._blurRenderTarget)&&void 0!==e?e:this._newRenderTarget(!1),this._blurRenderTarget}constructor(e,t,n){var r;this._width=e,this._height=t,this.parameters={enabled:!1,intensity:.25,fadeOutDistance:1,fadeOutExponent:4,brightness:1,blurHorizontal:3,blurVertical:6,blurAscent:0,groundLevel:0,groundReflectionScale:1,renderTargetDownScale:4,...n},this._copyMaterial=new CopyTransformMaterial({}),this._updateCopyMaterial(null),this._reflectionIntensityMaterial=new GroundReflectionIntensityMaterial({_width:this._width/this.parameters.renderTargetDownScale,_height:this._height/this.parameters.renderTargetDownScale}),this._blurPass=new BlurPass(BlurShader,n),this._renderPass=null!==(r=null==n?void 0:n._renderPass)&&void 0!==r?r:new RenderPass}_newRenderTarget(e){const t=this._width/this.parameters.renderTargetDownScale,n=this._height/this.parameters.renderTargetDownScale;let r={};if(e){const e=new DepthTexture(t,n);e.format=DepthStencilFormat,e.type=UnsignedInt248Type,r.minFilter=NearestFilter,r.magFilter=NearestFilter,r.depthTexture=e}else r.samples=1;return new WebGLRenderTarget(t,n,{format:RGBAFormat,...r})}dispose(){var e,t,n;null===(e=this._reflectionRenderTarget)||void 0===e||e.dispose(),null===(t=this._intensityRenderTarget)||void 0===t||t.dispose(),null===(n=this._blurRenderTarget)||void 0===n||n.dispose(),this._copyMaterial.dispose()}setSize(e,t){var n,r,a,i;this._width=e,this._height=t,null===(n=this._reflectionRenderTarget)||void 0===n||n.setSize(this._width/this.parameters.renderTargetDownScale,this._height/this.parameters.renderTargetDownScale),null===(r=this._intensityRenderTarget)||void 0===r||r.setSize(this._width/this.parameters.renderTargetDownScale,this._height/this.parameters.renderTargetDownScale),null===(a=this._blurRenderTarget)||void 0===a||a.setSize(this._width/this.parameters.renderTargetDownScale,this._height/this.parameters.renderTargetDownScale),null===(i=this._reflectionIntensityMaterial)||void 0===i||i.update({_width:this._width/this.parameters.renderTargetDownScale,_height:this._height/this.parameters.renderTargetDownScale})}updateParameters(e){for(let t in e)this.parameters.hasOwnProperty(t)&&(this.parameters[t]=e[t])}updateBounds(e,t){this.parameters.groundLevel=e,this.parameters.groundReflectionScale=t}_updateCopyMaterial(e,t=1){var n;const r=this.parameters.intensity*t,a=this.parameters.brightness;this._copyMaterial.update({texture:null!==(n=null==e?void 0:e.texture)&&void 0!==n?n:void 0,colorTransform:(new Matrix4).set(a,0,0,0,0,a,0,0,0,0,a,0,0,0,0,r),multiplyChannels:0,uvTransform:FLIP_Y_UV_TRANSFORM}),this._copyMaterial.depthTest=!0,this._copyMaterial.depthWrite=!1}render(e,t,n,r=1){if(!(this.parameters.enabled&&n instanceof PerspectiveCamera))return;const a=this._createGroundReflectionCamera(n);this._renderGroundReflection(e,t,a,this.reflectionRenderTarget),this._renderGroundReflectionIntensity(e,a,this.intensityRenderTarget),(this.parameters.blurHorizontal>0||this.parameters.blurVertical>0)&&this.blurReflection(e,n,[this.intensityRenderTarget,this.blurRenderTarget,this.intensityRenderTarget]),this._updateCopyMaterial(this.intensityRenderTarget,r),this._renderPass.renderScreenSpace(e,this._copyMaterial,e.getRenderTarget())}_renderGroundReflection(e,t,n,r){const a=e.getRenderTarget();r&&e.setRenderTarget(r),e.render(t,n),r&&e.setRenderTarget(a)}_renderGroundReflectionIntensity(e,t,n){const r=e.getRenderTarget();e.setRenderTarget(n),this._renderPass.renderScreenSpace(e,this._reflectionIntensityMaterial.update({texture:this.reflectionRenderTarget.texture,depthTexture:this.reflectionRenderTarget.depthTexture,camera:t,groundLevel:this.parameters.groundLevel,fadeOutDistance:this.parameters.fadeOutDistance*this.parameters.groundReflectionScale,fadeOutExponent:this.parameters.fadeOutExponent}),e.getRenderTarget()),e.setRenderTarget(r)}blurReflection(e,t,n){const r=new Vector3(t.matrixWorld.elements[4],t.matrixWorld.elements[5],t.matrixWorld.elements[6]),a=this.parameters.blurHorizontal/this._width,i=this.parameters.blurVertical/this._height*Math.abs(r.dot(new Vector3(0,0,1)));this._blurPass.render(e,n,[4*a,4*i],[4*a*(1+this.parameters.blurAscent),4*i*(1+this.parameters.blurAscent)])}_createGroundReflectionCamera(e){const t=e.clone(),n=t;return n._offset&&(n._offset={left:n._offset.left,top:1-n._offset.bottom,right:n._offset.right,bottom:1-n._offset.top}),t.position.set(e.position.x,-e.position.y+2*this.parameters.groundLevel,e.position.z),t.rotation.set(-e.rotation.x,e.rotation.y,-e.rotation.z),t.updateMatrixWorld(),t.updateProjectionMatrix(),t}}class GroundReflectionIntensityMaterial extends ShaderMaterial{constructor(e){super({defines:Object.assign({},GroundReflectionIntensityMaterial.shader.defines),uniforms:UniformsUtils.clone(GroundReflectionIntensityMaterial.shader.uniforms),vertexShader:GroundReflectionIntensityMaterial.shader.vertexShader,fragmentShader:GroundReflectionIntensityMaterial.shader.fragmentShader,blending:NoBlending}),this.update(e)}update(e){var t,n;if(void 0!==(null==e?void 0:e.texture)&&(this.uniforms.tDiffuse.value=null==e?void 0:e.texture),void 0!==(null==e?void 0:e.depthTexture)&&(this.uniforms.tDepth.value=null==e?void 0:e.depthTexture),(null==e?void 0:e._width)||(null==e?void 0:e._height)){const r=null!==(t=null==e?void 0:e._width)&&void 0!==t?t:this.uniforms.resolution.value.x,a=null!==(n=null==e?void 0:e._height)&&void 0!==n?n:this.uniforms.resolution.value.y;this.uniforms.resolution.value.set(r,a)}if(void 0!==(null==e?void 0:e.camera)){const t=(null==e?void 0:e.camera)||(null==e?void 0:e.camera);this.uniforms.cameraNear.value=t.near,this.uniforms.cameraFar.value=t.far,this.uniforms.cameraProjectionMatrix.value.copy(t.projectionMatrix),this.uniforms.cameraInverseProjectionMatrix.value.copy(t.projectionMatrixInverse),this.uniforms.inverseViewMatrix.value.copy(t.matrixWorld)}return void 0!==(null==e?void 0:e.groundLevel)&&(this.uniforms.groundLevel.value=null==e?void 0:e.groundLevel),void 0!==(null==e?void 0:e.fadeOutDistance)&&(this.uniforms.fadeOutDistance.value=null==e?void 0:e.fadeOutDistance),void 0!==(null==e?void 0:e.fadeOutExponent)&&(this.uniforms.fadeOutExponent.value=null==e?void 0:e.fadeOutExponent),this}}GroundReflectionIntensityMaterial.shader={uniforms:{tDiffuse:{value:null},tDepth:{value:null},resolution:{value:new Vector2},cameraNear:{value:.1},cameraFar:{value:1},cameraProjectionMatrix:{value:new Matrix4},cameraInverseProjectionMatrix:{value:new Matrix4},inverseViewMatrix:{value:new Matrix4},groundLevel:{value:0},fadeOutDistance:{value:1},fadeOutExponent:{value:1}},defines:{PERSPECTIVE_CAMERA:1,LINEAR_TO_SRGB:1},vertexShader:"\n varying vec2 vUv;\n void main() {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n }",fragmentShader:"\n uniform sampler2D tDiffuse;\n uniform sampler2D tDepth;\n uniform vec2 resolution;\n uniform float cameraNear;\n uniform float cameraFar;\n uniform mat4 cameraProjectionMatrix;\n uniform mat4 cameraInverseProjectionMatrix;\n uniform mat4 inverseViewMatrix;\n uniform float groundLevel;\n uniform float fadeOutDistance;\n uniform float fadeOutExponent;\n varying vec2 vUv;\n\n #include <packing>\n\n float getDepth(const in vec2 screenPosition) {\n return texture2D(tDepth, screenPosition).x;\n }\n\n float getLinearDepth(const in vec2 screenPosition) {\n #if PERSPECTIVE_CAMERA == 1\n float fragCoordZ = texture2D(tDepth, screenPosition).x;\n float viewZ = perspectiveDepthToViewZ(fragCoordZ, cameraNear, cameraFar);\n return viewZToOrthographicDepth(viewZ, cameraNear, cameraFar);\n #else\n return texture2D(tDepth, screenPosition).x;\n #endif\n }\n\n float getViewZ(const in float depth) {\n #if PERSPECTIVE_CAMERA == 1\n return perspectiveDepthToViewZ(depth, cameraNear, cameraFar);\n #else\n return 0.0;//orthographicDepthToViewZ(depth, cameraNear, cameraFar);\n #endif\n }\n\n vec3 getViewPosition(const in vec2 screenPosition, const in float depth, const in float viewZ ) {\n float clipW = cameraProjectionMatrix[2][3] * viewZ + cameraProjectionMatrix[3][3];\n vec4 clipPosition = vec4((vec3(screenPosition, depth) - 0.5) * 2.0, 1.0);\n clipPosition *= clipW;\n return (cameraInverseProjectionMatrix * clipPosition).xyz;\n }\n\n void main() {\n float verticalBias = 1.5 / resolution.y;\n vec2 uv = vUv.xy + vec2(0.0, verticalBias);\n float depth = getDepth(uv);\n float viewZ = getViewZ(depth);\n vec4 worldPosition = inverseViewMatrix * vec4(getViewPosition(uv, depth, viewZ), 1.0);\n float distance = worldPosition.y - groundLevel;\n vec4 fragColor = texture2D(tDiffuse, uv).rgba;\n #if LINEAR_TO_SRGB == 1\n fragColor.rgb = mix(fragColor.rgb * 12.92, 1.055 * pow(fragColor.rgb, vec3(0.41666)) - 0.055, step(0.0031308, fragColor.rgb));\n #endif\n float fadeOutAlpha = pow(clamp(1.0 - distance / fadeOutDistance, 0.0, 1.0), fadeOutExponent);\n fragColor.a *= fadeOutAlpha;\n gl_FragColor = fragColor * step(depth, 0.9999);\n }"};const sphereToEquirectangular=e=>{const t=Math.atan2(e.y,e.x)/(2*Math.PI)+.5,n=Math.asin(e.z)/Math.PI+.5;return new Vector2(t,n)};class TextureConverter{get colorRenderTarget(){var e;return this._colorRenderTarget=null!==(e=this._colorRenderTarget)&&void 0!==e?e:new WebGLRenderTarget,this._colorRenderTarget}get environmentMapDecodeTarget(){var e;return this._environmentMapDecodeTarget=null!==(e=this._environmentMapDecodeTarget)&&void 0!==e?e:new WebGLRenderTarget,this._environmentMapDecodeTarget}environmentMapDecodeMaterial(e){var t,n;return e?(this._equirectangularDecodeMaterial=null!==(t=this._equirectangularDecodeMaterial)&&void 0!==t?t:new EnvironmentMapDecodeMaterial(!0,!1),this._equirectangularDecodeMaterial):(this._pmremDecodeMaterial=null!==(n=this._pmremDecodeMaterial)&&void 0!==n?n:new EnvironmentMapDecodeMaterial(!1,!1),this._pmremDecodeMaterial)}get camera(){var e;return this._camera=null!==(e=this._camera)&&void 0!==e?e:new OrthographicCamera(-1,1,1,-1,-1,1),this._camera}scaleTexture(e,t,n,r){var a;this.colorRenderTarget.setSize(n,r),this._planeMesh=null!==(a=this._planeMesh)&&void 0!==a?a:new Mesh(new PlaneGeometry(2,2),new MeshBasicMaterial({map:t}));const i=e.getRenderTarget();e.setRenderTarget(this.colorRenderTarget),e.render(this._planeMesh,this.camera),e.setRenderTarget(i);const s=this.environmentMapDecodeTarget.texture,o=new Uint8Array(n*r*4);return e.readRenderTargetPixels(this.colorRenderTarget,0,0,n,r,o),{texture:s,pixels:o}}newGrayscaleTexture(e,t,n,r){var a;const i=this.environmentMapDecodeMaterial("PMREM.cubeUv"===t.name);this.environmentMapDecodeTarget.setSize(n,r),i.setSourceTexture(t),this._planeMesh=null!==(a=this._planeMesh)&&void 0!==a?a:new Mesh(new PlaneGeometry(2,2),i);const s=e.getRenderTarget();e.setRenderTarget(this.environmentMapDecodeTarget),e.render(this._planeMesh,this.camera),e.setRenderTarget(s);const o=this.environmentMapDecodeTarget.texture,l=new Uint8Array(n*r*4);return e.readRenderTargetPixels(this.environmentMapDecodeTarget,0,0,n,r,l),{texture:o,pixels:l}}}const EnvironmentMapDecodeShader_uniforms={tDiffuse:{value:null}};class EnvironmentMapDecodeMaterial extends ShaderMaterial{constructor(e,t){super({uniforms:UniformsUtils.clone(EnvironmentMapDecodeShader_uniforms),vertexShader:"\n varying vec2 vUv;\n void main() {\n vUv = uv;\n gl_Position = (projectionMatrix * modelViewMatrix * vec4(position, 1.0)).xyww;\n }",fragmentShader:"\n uniform sampler2D tDiffuse;\n varying vec2 vUv;\n \n float getFace( vec3 direction ) {\n vec3 absDirection = abs( direction );\n float face = - 1.0;\n if ( absDirection.x > absDirection.z ) {\n if ( absDirection.x > absDirection.y )\n face = direction.x > 0.0 ? 0.0 : 3.0;\n else\n face = direction.y > 0.0 ? 1.0 : 4.0;\n } else {\n if ( absDirection.z > absDirection.y )\n face = direction.z > 0.0 ? 2.0 : 5.0;\n else\n face = direction.y > 0.0 ? 1.0 : 4.0;\n }\n return face;\n }\n\n vec2 getUV( vec3 direction, float face ) {\n vec2 uv;\n if ( face == 0.0 ) {\n uv = vec2( direction.z, direction.y ) / abs( direction.x ); // pos x\n } else if ( face == 1.0 ) {\n uv = vec2( - direction.x, - direction.z ) / abs( direction.y ); // pos y\n } else if ( face == 2.0 ) {\n uv = vec2( - direction.x, direction.y ) / abs( direction.z ); // pos z\n } else if ( face == 3.0 ) {\n uv = vec2( - direction.z, direction.y ) / abs( direction.x ); // neg x\n } else if ( face == 4.0 ) {\n uv = vec2( - direction.x, direction.z ) / abs( direction.y ); // neg y\n } else {\n uv = vec2( direction.x, direction.y ) / abs( direction.z ); // neg z\n }\n return 0.5 * ( uv + 1.0 );\n }\n\n void main() {\n #if PMREM_DECODE == 1\n float altitude = (vUv.y - 0.5) * 3.141593;\n float azimuth = vUv.x * 2.0 * 3.141593;\n vec3 direction = vec3(\n cos(altitude) * cos(azimuth) * -1.0, \n sin(altitude), \n cos(altitude) * sin(azimuth) * -1.0\n );\n float face = getFace(direction);\n vec2 uv = getUV(direction, face) / vec2(3.0, 4.0);\n if (face > 2.5) {\n uv.y += 0.25;\n face -= 3.0;\n }\n uv.x += face / 3.0;\n vec4 color = texture2D(tDiffuse, uv);\n #else\n vec4 color = texture2D(tDiffuse, vUv);\n #endif \n #if GRAYSCALE_CONVERT == 1\n float grayscale = dot(color.rgb, vec3(0.2126, 0.7152, 0.0722));\n //float grayscale = dot(color.rgb, vec3(1.0/3.0));\n gl_FragColor = vec4(vec3(grayscale), 1.0);\n #else\n gl_FragColor = vec4(color.rgb, 1.0);\n #endif\n }",defines:{PMREM_DECODE:e?1:0,GRAYSCALE_CONVERT:t?1:0}})}setSourceTexture(e){this.uniforms.tDiffuse.value=e}}class LightSourceDetector{constructor(e){var t,n,r,a;this.samplePoints=[],this.sampleUVs=[],this.grayscaleTexture={texture:new Texture,pixels:new Uint8Array(0)},this.detectorTexture=new Texture,this.detectorArray=new Float32Array(0),this.lightSamples=[],this.lightGraph=new LightGraph(0),this.lightSources=[],this._createEquirectangularSamplePoints=e=>{const t=[];for(let n=0;n<e;n++){const r=n*Math.PI*(3-Math.sqrt(5)),a=1-n/(e-1)*2,i=Math.sqrt(1-a*a),s=Math.cos(r)*i,o=Math.sin(r)*i;t.push(new Vector3(s,o,a))}return t},this._numberOfSamples=null!==(t=null==e?void 0:e._numberOfSamples)&&void 0!==t?t:1e3,this._width=null!==(n=null==e?void 0:e._width)&&void 0!==n?n:1024,this._height=null!==(r=null==e?void 0:e._height)&&void 0!==r?r:512,this._sampleThreshold=null!==(a=null==e?void 0:e._sampleThreshold)&&void 0!==a?a:.707,this.pointDistance=Math.sqrt(4*Math.PI)/Math.sqrt(this._numberOfSamples),this.pixelDistance=Math.sqrt(2)*Math.PI*2/this._width,this.samplePoints=this._createEquirectangularSamplePoints(this._numberOfSamples),this.sampleUVs=this.samplePoints.map(e=>sphereToEquirectangular(e))}detectLightSources(e,t,n){var r;this.textureData=n,this._textureConverter=null!==(r=this._textureConverter)&&void 0!==r?r:new TextureConverter,this.grayscaleTexture=this._textureConverter.newGrayscaleTexture(e,t,this._width,this._height),this.detectorArray=this._redFromRgbaToNormalizedFloatArray(this.grayscaleTexture.pixels),this.detectorTexture=this._grayscaleTextureFromFloatArray(this.detectorArray,this._width,this._height),this.lightSamples=this._filterLightSamples(this._sampleThreshold),this.lightGraph=this._findClusterSegments(this.lightSamples,this._sampleThreshold),this.lightGraph.findConnectedComponents(),this.lightSources=this.createLightSourcesFromLightGraph(this.lightSamples,this.lightGraph),this.lightSources.sort((e,t)=>t.maxIntensity-e.maxIntensity)}_redFromRgbaToNormalizedFloatArray(e,t){const n=new Float32Array(e.length/4);let r=1,a=0;for(let t=0;t<e.length/4;++t){const i=e[4*t]/255;r=Math.min(r,i),a=Math.max(a,i),n[t]=i}if(t)for(let e=0;e<n.length;++e){const i=(n[e]-r)/(a-r);n[e]=Math.pow(i,t)}else for(let e=0;e<n.length;++e)n[e]=(n[e]-r)/(a-r);return n}_grayscaleTextureFromFloatArray(e,t,n){const r=t*n,a=new Uint8Array(4*r);for(let t=0;t<r;t++){const n=255*e[t];a[4*t+0]=n,a[4*t+1]=n,a[4*t+2]=n,a[4*t+3]=255}const i=new DataTexture(a,t,n);return i.needsUpdate=!0,i}_filterLightSamples(e){const t=[];for(let n=0;n<this.sampleUVs.length;n++){const r=this.sampleUVs[n];this._detectorTextureLuminanceValueFromUV(r)>e&&t.push(new LightSample(this.samplePoints[n],r))}return t}_detectorTextureLuminanceValueFromUV(e){const t=Math.floor(e.x*this._width),n=Math.floor(e.y*this._height)*this._width+t;return this.detectorArray[n]}_originalLuminanceValueFromUV(e){if(!(this.textureData&&this.textureData.data&&this.textureData._width&&this.textureData._height))return 256*this._detectorTextureLuminanceValueFromUV(e);const t=Math.floor(e.x*this.textureData._width),n=Math.floor(e.y*this.textureData._height);let r=0;for(let e=Math.max(0,t-2);e<Math.max(0,t+2);++e)for(let t=Math.max(0,n-2);t<Math.max(0,n+2);++t){const n=t*this.textureData._width+e,a=(this.textureData.data[4*n]+this.textureData.data[4*n+1]+this.textureData.data[4*n+2])/3;r=Math.max(r,a)}return r}_findClusterSegments(e,t){const n=2*this.pixelDistance,r=1.5*this.pointDistance,a=new LightGraph(e.length);for(let i=0;i<e.length;i++)for(let s=i+1;s<e.length;s++)if(e[i].position.angleTo(e[s].position)<r){const r=e[s].position.clone().sub(e[i].position),o=Math.floor(r.length()/n);let l=!0,d=0;for(let n=1;n<o;n++){const a=r.clone().multiplyScalar(n/o),s=sphereToEquirectangular(e[i].position.clone().add(a).normalize());if(this._detectorTextureLuminanceValueFromUV(s)<t){if(d++,d>1){l=!1;break}}else d=0}l&&(a.adjacent[i].push(s),a.adjacent[s].push(i),a.edges.push([i,s]))}return a}createLightSourcesFromLightGraph(e,t){const n=t.components.filter(e=>e.length>1).map(t=>new LightSource(t.map(t=>e[t])));return n.forEach(e=>e.calculateLightSourceProperties(e=>this._originalLuminanceValueFromUV(e))),n}}class LightSample{constructor(e,t){this.position=e,this.uv=t}}class LightGraph{constructor(e){this.edges=[],this.adjacent=[],this.components=[],this.noOfNodes=e;for(let t=0;t<e;t++)this.adjacent.push([])}findConnectedComponents(){const e=new Array(this.noOfNodes).fill(!1);this.components=[];for(let t=0;t<this.noOfNodes;t++)if(!e[t]){const n=[];this._dfs(t,e,n),this.components.push(n)}this.components.sort((e,t)=>t.length-e.length)}_dfs(e,t,n){t[e]=!0,n.push(e);for(const r of this.adjacent[e])t[r]||this._dfs(r,t,n)}}class LightSource{constructor(e){this.position=new Vector3,this.uv=new Vector2,this.averageIntensity=0,this.maxIntensity=0,this.size=0,this.lightSamples=e}calculateLightSourceProperties(e){this.position=new Vector3,this.averageIntensity=0,this.maxIntensity=0;for(const t of this.lightSamples){this.position.add(t.position);const n=e(t.uv);this.averageIntensity+=n,this.maxIntensity=Math.max(this.maxIntensity,n)}this.averageIntensity/=this.lightSamples.length,this.position.normalize(),this.uv=sphereToEquirectangular(this.position);let t=0;for(const e of this.lightSamples)t+=e.position.distanceTo(this.position);t/=this.lightSamples.length,this.size=t/Math.PI}}class DebugPass{constructor(e){this.grayMaterial=MaterialCreator.createMeshStandardMaterial({color:12632256,side:DoubleSide,envMapIntensity:.4}),this._renderPass=new RenderPass,this._sceneRenderer=e,this._environmentMapDecodeMaterial=new EnvironmentMapDecodeMaterial(!0,!1),this._environmentMapDecodeMaterial.blending=NoBlending,this._environmentMapDecodeMaterial.depthTest=!1}get _gBufferRenderTarget(){return this._sceneRenderer.gBufferRenderTarget}get _screenSpaceShadow(){return this._sceneRenderer.screenSpaceShadow}get _shadowAndAoPass(){return this._sceneRenderer.shadowAndAoPass}get _groundReflectionPass(){return this._sceneRenderer.groundReflectionPass}get _bakedGroundContactShadow(){return this._sceneRenderer.bakedGroundContactShadow}dispose(){var e,t;null===(e=this._depthRenderMaterial)||void 0===e||e.dispose(),null===(t=this._copyMaterial)||void 0===t||t.dispose(),this.grayMaterial.dispose()}getCopyMaterial(e){var t;return this._copyMaterial=null!==(t=this._copyMaterial)&&void 0!==t?t:new CopyTransformMaterial,this._copyMaterial.update(e)}_getDepthRenderMaterial(e){var t;return this._depthRenderMaterial=null!==(t=this._depthRenderMaterial)&&void 0!==t?t:new LinearDepthRenderMaterial({depthTexture:this._gBufferRenderTarget.textureWithDepthValue,depthFilter:this._gBufferRenderTarget.isFloatGBufferWithRgbNormalAlphaDepth?new Vector4(0,0,0,1):new Vector4(1,0,0,0)}),this._depthRenderMaterial.update({camera:e})}render(e,t,n,r,a,i,s){e(r,a,i),"color"!==s?("grayscale"===s?this._sceneRenderer.renderCacheManager.render("debug",a,()=>{this._renderPass.renderWithOverrideMaterial(r,a,i,this.grayMaterial,null,0,1)}):t(r,a,i),n(r,a,i),this._renderDebugPass(r,a,i,s)):r.render(a,i)}_renderDebugPass(e,t,n,r){var a,i,s,o,l,d;switch(r){default:break;case"lineardepth":this._renderPass.renderScreenSpace(e,this._getDepthRenderMaterial(n),null);break;case"g-normal":this._gBufferRenderTarget.isFloatGBufferWithRgbNormalAlphaDepth?this._renderPass.renderScreenSpace(e,this.getCopyMaterial({texture:null===(a=this._gBufferRenderTarget)||void 0===a?void 0:a.gBufferTexture,blending:NoBlending,colorTransform:(new Matrix4).set(.5,0,0,0,0,.5,0,0,0,0,.5,0,0,0,0,0),colorBase:new Vector4(.5,.5,.5,1),multiplyChannels:0,uvTransform:DEFAULT_UV_TRANSFORM}),null):this._renderPass.renderScreenSpace(e,this.getCopyMaterial({texture:null===(i=this._gBufferRenderTarget)||void 0===i?void 0:i.gBufferTexture,blending:NoBlending,colorTransform:RGB_TRANSFORM,colorBase:ALPHA_RGBA,multiplyChannels:0,uvTransform:DEFAULT_UV_TRANSFORM}),null);break;case"g-depth":this._gBufferRenderTarget.isFloatGBufferWithRgbNormalAlphaDepth?this._renderPass.renderScreenSpace(e,this.getCopyMaterial({texture:null===(s=this._gBufferRenderTarget)||void 0===s?void 0:s.gBufferTexture,blending:NoBlending,colorTransform:ALPHA_TRANSFORM,colorBase:ALPHA_RGBA,multiplyChannels:0,uvTransform:DEFAULT_UV_TRANSFORM}),null):this._renderPass.renderScreenSpace(e,this.getCopyMaterial({texture:null===(o=this._gBufferRenderTarget)||void 0===o?void 0:o.depthBufferTexture,blending:NoBlending,colorTransform:RED_TRANSFORM,colorBase:ALPHA_RGBA,multiplyChannels:0,uvTransform:DEFAULT_UV_TRANSFORM}),null);break;case"ssao":this._renderPass.renderScreenSpace(e,this.getCopyMaterial({texture:this._shadowAndAoPass.shadowAndAoRenderTargets.passRenderTarget.texture,blending:NoBlending,colorTransform:GRAYSCALE_TRANSFORM,colorBase:ZERO_RGBA,multiplyChannels:0,uvTransform:DEFAULT_UV_TRANSFORM}),null);break;case"ssaodenoise":this._renderPass.renderScreenSpace(e,this.getCopyMaterial({texture:this._shadowAndAoPass.denoiseRenderTargetTexture,blending:NoBlending,colorTransform:GRAYSCALE_TRANSFORM,colorBase:ZERO_RGBA,multiplyChannels:0,uvTransform:DEFAULT_UV_TRANSFORM}),null);break;case"shadowmap":this._renderPass.renderScreenSpace(e,this.getCopyMaterial({texture:this._screenSpaceShadow.shadowTexture,blending:NoBlending,colorTransform:GRAYSCALE_TRANSFORM,colorBase:ZERO_RGBA,multiplyChannels:0,uvTransform:DEFAULT_UV_TRANSFORM}),null);break;case"shadow":this._renderPass.renderScreenSpace(e,this.getCopyMaterial({texture:this._shadowAndAoPass.shadowAndAoRenderTargets.passRenderTarget.texture,blending:NoBlending,colorTransform:ShadowAndAoPass.shadowTransform,colorBase:ZERO_RGBA,multiplyChannels:0,uvTransform:DEFAULT_UV_TRANSFORM}),null);break;case"shadowblur":this._renderPass.renderScreenSpace(e,this.getCopyMaterial({texture:this._shadowAndAoPass.denoiseRenderTargetTexture,blending:NoBlending,colorTransform:ShadowAndAoPass.shadowTransform,colorBase:ZERO_RGBA,multiplyChannels:0,uvTransform:DEFAULT_UV_TRANSFORM}),null);break;case"shadowfadein":this._renderPass.renderScreenSpace(e,this.getCopyMaterial({texture:this._shadowAndAoPass.fadeRenderTarget.texture,blending:NoBlending,colorTransform:ShadowAndAoPass.shadowTransform,colorBase:ZERO_RGBA,multiplyChannels:0,uvTransform:DEFAULT_UV_TRANSFORM}),null);break;case"shadowandao":this._renderPass.renderScreenSpace(e,this.getCopyMaterial({texture:this._shadowAndAoPass.denoiseRenderTargetTexture,blending:NoBlending,colorTransform:interpolationMatrix(this._shadowAndAoPass.parameters.aoIntensity,this._shadowAndAoPass.parameters.shadowIntensity,0,1),colorBase:ZERO_RGBA,multiplyChannels:1,uvTransform:DEFAULT_UV_TRANSFORM}),null);break;case"groundreflection":this._renderPass.renderScreenSpace(e,this.getCopyMaterial({texture:this._groundReflectionPass.reflectionRenderTarget.texture,blending:NoBlending,colorTransform:DEFAULT_TRANSFORM,colorBase:ZERO_RGBA,multiplyChannels:0,uvTransform:FLIP_Y_UV_TRANSFORM}),null);break;case"bakedgroundshadow":this._renderPass.renderScreenSpace(e,this.getCopyMaterial({texture:this._bakedGroundContactShadow.renderTarget.texture,blending:NoBlending,colorTransform:DEFAULT_TRANSFORM,colorBase:ZERO_RGBA,multiplyChannels:0,uvTransform:DEFAULT_UV_TRANSFORM}),null);break;case"environmentmap":this._environmentMapDecodeMaterial.setSourceTexture(t.environment),this._renderPass.renderScreenSpace(e,this._environmentMapDecodeMaterial,null);break;case"lightsourcedetection":if(null===(l=t.userData)||void 0===l?void 0:l.environmentDefinition){const n=this._sceneRenderer.width/this._sceneRenderer.height,r=new OrthographicCamera(-1,1,1/n,-1/n,-1,1),a=null===(d=t.userData)||void 0===d?void 0:d.environmentDefinition.createDebugScene(e,t);a.background=new Color$1(16777215),e.render(a,r)}}}}var QualityLevel;!function(e){e[e.HIGHEST=0]="HIGHEST",e[e.HIGH=1]="HIGH",e[e.MEDIUM=2]="MEDIUM",e[e.LOW=3]="LOW"}(QualityLevel||(QualityLevel={}));class SceneRenderer{constructor(e,t,n){this.debugOutput="off",this._prevDebugOutput="off",this.outputColorSpace="",this.toneMapping="",this.environmentLights=!1,this.movingCamera=!1,this.groundLevel=0,this.uiInteractionMode=!1,this._noUpdateNeededCount=0,this._cameraUpdate=new CameraUpdate,this.width=0,this.height=0,this._maxSamples=1,this._cameraChanged=!0,this.boundingVolume=new SceneVolume,this._boundingVolumeSet=!1,this.renderCacheManager=new RenderCacheManager,this._renderPass=new RenderPass,this.selectedObjects=[],this.groundGroup=new Group,this._qualityLevel=QualityLevel.HIGHEST,this._qualityMap=new Map,this.width=t,this.height=n,this._maxSamples=e.capabilities.maxSamples,this.renderer=e,this.renderCacheManager.registerCache("inivisibleGround",new VisibilityRenderCache(e=>e===this.groundGroup)),this.renderCacheManager.registerCache("debug",new VisibilityRenderCache),this.renderCacheManager.registerCache("floorDepthWrite",new DepthWriteRenderCache(e=>{var t;return null===(t=e.userData)||void 0===t?void 0:t.isFloor})),this.gBufferRenderTarget=new GBufferRenderTargets(this.renderCacheManager,{shared:!0,capabilities:e.capabilities,width:this.width,height:this.height,samples:1,_renderPass:this._renderPass,textureFilter:NearestFilter}),this.shadowAndAoPass=new ShadowAndAoPass(this.width,this.height,1,{gBufferRenderTarget:this.gBufferRenderTarget}),this.screenSpaceShadow=new ScreenSpaceShadowMap(this.renderCacheManager,new Vector2(this.width,this.height),{samples:this._maxSamples,alwaysUpdate:!1}),this.groundReflectionPass=new GroundReflectionPass(this.width,this.height,{_renderPass:this._renderPass}),this.bakedGroundContactShadow=new BakedGroundContactShadow(this.renderer,this.groundGroup,{_renderPass:this._renderPass,renderCacheManager:this.renderCacheManager}),this.groundGroup.rotateX(-Math.PI/2),this.outlineRenderer=new OutLineRenderer(null,this.width,this.height,{gBufferRenderTarget:this.gBufferRenderTarget}),this.parameters={gBufferRenderTargetParameters:this.gBufferRenderTarget.parameters,bakedGroundContactShadowParameters:this.bakedGroundContactShadow.parameters,screenSpaceShadowMapParameters:this.screenSpaceShadow.parameters,shAndAoPassParameters:this.shadowAndAoPass.parameters,groundReflectionParameters:this.groundReflectionPass.parameters,outlineParameters:this.outlineRenderer.parameters,effectSuspendFrames:0,effectFadeInFrames:0,suspendGroundReflection:!1,shadowOnCameraChange:ShadowBlurType.OFF},this._addEventListeners(this.renderer)}_addEventListeners(e){e.domElement.addEventListener("webglcontextlost",()=>{}),e.domElement.addEventListener("webglcontextrestored",()=>{this._forceEnvironmentMapUpdate(this.renderer)})}dispose(){var e,t;null===(e=this._debugPass)||void 0===e||e.dispose(),null===(t=this._copyMaterial)||void 0===t||t.dispose(),this.gBufferRenderTarget.dispose(),this.screenSpaceShadow.dispose(),this.shadowAndAoPass.dispose(),this.outlineRenderer.dispose(),this.renderer.dispose()}setSize(e,t){this.width=e,this.height=t,this.gBufferRenderTarget.setSize(e,t),this.screenSpaceShadow.setSize(e,t),this.shadowAndAoPass.setSize(e,t),this.outlineRenderer.setSize(e,t),this.groundReflectionPass.setSize(e,t),this.renderer.setSize(e,t)}getQualityLevel(){return this._qualityLevel}setQualityLevel(e){this._qualityLevel!==e&&(this._qualityMap.has(this._qualityLevel)&&(this._qualityLevel=e),this.applyCurrentParameters())}setQualityMap(e){this._qualityMap=e,this.applyCurrentParameters()}applyCurrentParameters(){this._qualityMap.has(this._qualityLevel)&&(this.updateParameters(this._qualityMap.get(this._qualityLevel)),this.bakedGroundContactShadow.applyParameters()),this.uiInteractionMode&&this.updateParameters({groundReflectionParameters:{enabled:!1}})}forceShadowUpdates(e){this.renderCacheManager.clearCache(),this.gBufferRenderTarget.needsUpdate=!0,this.screenSpaceShadow.forceShadowUpdate(),this.shadowAndAoPass.needsUpdate=!0,e&&(this.bakedGroundContactShadow.needsUpdate=!0)}updateParameters(e){void 0!==e.shAndAoPassParameters&&this.shadowAndAoPass.updateParameters(e.shAndAoPassParameters),void 0!==e.effectParameters&&this.shadowAndAoPass.updateParameters({effectParameters:e.effectParameters}),void 0!==e.bakedGroundContactShadowParameters&&this.bakedGroundContactShadow.updateParameters(e.bakedGroundContactShadowParameters),void 0!==e.screenSpaceShadowMapParameters&&this.screenSpaceShadow.updateParameters(e.screenSpaceShadowMapParameters),void 0!==e.groundReflectionParameters&&this.groundReflectionPass.updateParameters(e.groundReflectionParameters),void 0!==e.outlineParameters&&this.outlineRenderer.updateParameters(e.outlineParameters),void 0!==e.effectSuspendFrames&&(this.parameters.effectSuspendFrames=e.effectSuspendFrames),void 0!==e.effectFadeInFrames&&(this.parameters.effectFadeInFrames=e.effectFadeInFrames),void 0!==e.suspendGroundReflection&&(this.parameters.suspendGroundReflection=e.suspendGroundReflection),void 0!==e.shadowOnCameraChange&&(this.parameters.shadowOnCameraChange=e.shadowOnCameraChange)}addRectAreaLight(e,t){this.environmentLights=!1,this.screenSpaceShadow.addRectAreaLight(e,t),this.shadowAndAoPass.needsUpdate=!0}updateRectAreaLights(e,t){e.length>0&&(this.environmentLights=!1),this.screenSpaceShadow.updateRectAreaLights(e,t),this.shadowAndAoPass.needsUpdate=!0}createShadowFromLightSources(e,t){this.environmentLights=!0,this.screenSpaceShadow.createShadowFromLightSources(e,t),this.shadowAndAoPass.needsUpdate=!0}selectObjects(e){this.selectedObjects=e}updateBounds(e,t){this.renderCacheManager.clearCache(),this._boundingVolumeSet=!0,this.boundingVolume.updateFromBox(e);const n=this.boundingVolume.size,r=(n.x+n.y+n.z)/3,a=Math.min(n.x,n.y,n.z),i=Math.max(n.x,n.y,n.z),s=a<.5?a/.5:n.z>5?n.z/5:1;this.bakedGroundContactShadow.setScale(t?r:s,r),this.groundReflectionPass.updateBounds(this.groundLevel,Math.min(1,i)),this.screenSpaceShadow.updateBounds(this.boundingVolume,r),this.shadowAndAoPass.updateBounds(this.boundingVolume,t?r:Math.min(1,2*i))}updateNearAndFarPlaneOfPerspectiveCamera(e,t){const n=this.boundingVolume.getNearAndFarForPerspectiveCamera(e.position,3);e.near=Math.max(1e-5,.9*n[0]),e.far=Math.max(null!=t?t:e.near,n[1]),e.updateProjectionMatrix()}_setRenderState(e,t){var n;const r=this.debugOutput!==this._prevDebugOutput;this._prevDebugOutput=this.debugOutput,this.screenSpaceShadow.parameters.alwaysUpdate=this.shadowAndAoPass.parameters.alwaysUpdate,this._cameraChanged=this._cameraUpdate.changed(t),(n=this.gBufferRenderTarget).needsUpdate||(n.needsUpdate=this._cameraChanged||r)}_forceEnvironmentMapUpdate(e){const t=e.userData;if(null==t?void 0:t.environmentTexture){const e=t.environmentTexture;t.environmentTexture=void 0,e.dispose()}}_updateEnvironment(e,t){var n,r;if(!(null===(n=t.userData)||void 0===n?void 0:n.environmentDefinition))return;e.userData||(e.userData={});const a=e.userData;if(a&&((null===(r=t.userData)||void 0===r?void 0:r.environmentDefinition.needsUpdate)||!a.environmentTexture||a.environmentDefinition!==t.userData.environmentDefinition)){const n=t.userData.environmentDefinition;a.environmentDefinition=n,a.environmentTexture=n.createNewEnvironment(e),t.userData.shadowFromEnvironment&&this.createShadowFromLightSources(t,n.lightSources)}t.environment=null==a?void 0:a.environmentTexture,t.userData.showEnvironmentBackground?t.background=t.environment:t.background===t.environment&&(t.background=null)}render(e,t){e.add(this.groundGroup),this._setRenderState(e,t),this._updateEnvironment(this.renderer,e),this.outlineRenderer.updateOutline(e,t,this.movingCamera?[]:this.selectedObjects),this.renderer.setRenderTarget(null),this.debugOutput&&""!==this.debugOutput&&"off"!==this.debugOutput?this._renderDebug(this.renderer,e,t):(this.renderPreRenderPasses(this.renderer,e,t),this._renderScene(this.renderer,e,t),this.renderPostProcessingEffects(this.renderer,e,t)),e.remove(this.groundGroup)}_renderDebug(e,t,n){var r;this._debugPass=null!==(r=this._debugPass)&&void 0!==r?r:new DebugPass(this),this._debugPass.render((e,t,n)=>this.renderPreRenderPasses(e,t,n),(e,t,n)=>this._renderScene(e,t,n),(e,t,n)=>this.renderPostProcessingEffects(e,t,n),e,t,n,this.debugOutput)}renderPreRenderPasses(e,t,n){this._renderGroundContactShadow(t)}_renderScene(e,t,n){this.renderCacheManager.onBeforeRender("floorDepthWrite",t),this.bakedGroundContactShadow.setGroundVisibility(!0,n),e.render(t,n),this.bakedGroundContactShadow.setGroundVisibility(!1,n),this.renderCacheManager.onAfterRender("floorDepthWrite")}renderPostProcessingEffects(e,t,n){this.renderShadowAndAo(e,t,n),this._renderOutline()}_renderGroundContactShadow(e){this.bakedGroundContactShadow.needsUpdate&&this.bakedGroundContactShadow.updateBounds(this.boundingVolume,this.groundLevel),this.bakedGroundContactShadow.render(e)}renderShadowAndAo(e,t,n){const r=this._evaluateIfShadowAndAoUpdateIsNeeded(n);if(r.needsUpdate||r.shadowOnCameraChange!==ShadowBlurType.OFF){if(!this.parameters.suspendGroundReflection||r.needsUpdate){const a=this.parameters.suspendGroundReflection?r.intensityScale:1;this._renderGroundReflection(e,t,n,a)}this.gBufferRenderTarget.needsUpdate=r.needsUpdate||r.shadowOnCameraChange===ShadowBlurType.POISSON,this._renderEffectsWithGround(e,t,n),this._renderEffectsWithoutGround(e,t,n),this.shadowAndAoPass.render(e,t,n,this.screenSpaceShadow.shadowTexture,r.needsUpdate?ShadowBlurType.FULL:r.shadowOnCameraChange,r.shadowOnCameraChange,1-r.intensityScale)}}_evaluateIfShadowAndAoUpdateIsNeeded(e){const t=this.shadowAndAoPass.parameters.alwaysUpdate||this.screenSpaceShadow.needsUpdate||this.screenSpaceShadow.shadowTypeNeedsUpdate;let n=(this.shadowAndAoPass.parameters.enabled||this.groundReflectionPass.parameters.enabled)&&(0===this.parameters.effectSuspendFrames||this._cameraChanged);n&&(this._noUpdateNeededCount=0);let r=1;return!t&&this.parameters.effectSuspendFrames>0&&(this._noUpdateNeededCount++,n=this._noUpdateNeededCount>=this.parameters.effectSuspendFrames,r=Math.max(0,Math.min(1,(this._noUpdateNeededCount-this.parameters.effectSuspendFrames)/this.parameters.effectFadeInFrames))),n=t||n,{needsUpdate:n,shadowOnCameraChange:!n||r<.99?this.parameters.shadowOnCameraChange:ShadowBlurType.OFF,intensityScale:r}}_renderGroundReflection(e,t,n,r=1){this.groundReflectionPass.parameters.enabled&&this.renderCacheManager.render("inivisibleGround",t,()=>{this.groundReflectionPass.render(e,t,n,r)})}_renderEffectsWithGround(e,t,n){const r=this._boundingVolumeSet&&this.shadowAndAoPass.parameters.aoOnGround,a=this.shadowAndAoPass.parameters.shadowIntensity>0&&this._boundingVolumeSet&&this.shadowAndAoPass.parameters.shadowOnGround,i=this.bakedGroundContactShadow.shadowGroundPlane;if(r){const r=null===this.bakedGroundContactShadow.parameters.hardLayers;r&&i.setDepthWrite(!0),this.gBufferRenderTarget.render(e,t,n),r&&i.setDepthWrite(!1)}a&&(i.setReceiveShadow(!0),this.screenSpaceShadow.renderShadowMap(e,t,n),i.setReceiveShadow(!1))}_renderEffectsWithoutGround(e,t,n){const r=!this._boundingVolumeSet||!this.shadowAndAoPass.parameters.aoOnGround,a=this.shadowAndAoPass.parameters.shadowIntensity>0&&(!this._boundingVolumeSet||!this.shadowAndAoPass.parameters.shadowOnGround);(r||a)&&this.renderCacheManager.render("inivisibleGround",t,()=>{r&&this.gBufferRenderTarget.render(e,t,n),a&&this.screenSpaceShadow.renderShadowMap(e,t,n)})}_renderOutline(){if(this.outlineRenderer.outlinePassActivated&&this.outlineRenderer.outlinePass){const e=this.renderer.getClearColor(new Color$1),t=this.renderer.getClearAlpha();"outline"===this.debugOutput&&(this.renderer.setClearColor(0,255),this.renderer.clear(!0,!1,!1)),this.outlineRenderer.outlinePass.renderToScreen=!1,this.outlineRenderer.outlinePass.render(this.renderer,null,null,0,!1),"outline"===this.debugOutput&&this.renderer.setClearColor(e,t)}}}class SceneRendererGUI{constructor(e){this._qualityLevel="",this._ambientOcclusionType="",this._sceneRenderer=e}addGUI(e,t){this._addRepresentationalGUI(e,t),this._addDebugGUI(e,t);const n=e.addFolder("Shadow type");this._addShadowTypeGUI(n,t);const r=e.addFolder("Shadow and Ambient Occlusion");this._addShadowAndAoGUI(r,t);const a=e.addFolder("Ground Reflection");this._addGroundReflectionGUI(a,t);const i=e.addFolder("Baked Ground Contact Shadow");this._addBakedGroundContactShadowGUI(i,t);const s=e.addFolder("Outline");this._addOutlineGUI(s,t)}_addRepresentationalGUI(e,t){const n=new Map([["LinearSRGBColorSpace",LinearSRGBColorSpace],["SRGBColorSpace",SRGBColorSpace]]),r=[];n.forEach((e,t)=>{r.push(t),this._sceneRenderer.renderer.outputColorSpace===e&&(this._sceneRenderer.outputColorSpace=t)}),e.add(this._sceneRenderer,"outputColorSpace",r).onChange(e=>{var r;n.has(e)&&(this._sceneRenderer.renderer.outputColorSpace=null!==(r=n.get(e))&&void 0!==r?r:SRGBColorSpace,t())});const a=new Map([["NoToneMapping",NoToneMapping],["LinearToneMapping",LinearToneMapping],["ReinhardToneMapping",ReinhardToneMapping],["CineonToneMapping",CineonToneMapping],["ACESFilmicToneMapping",ACESFilmicToneMapping]]),i=[];a.forEach((e,t)=>{i.push(t),this._sceneRenderer.renderer.toneMapping===e&&(this._sceneRenderer.toneMapping=t)}),e.add(this._sceneRenderer,"toneMapping",i).onChange(e=>{var n;a.has(e)&&(this._sceneRenderer.renderer.toneMapping=null!==(n=a.get(e))&&void 0!==n?n:NoToneMapping,t())})}_addDebugGUI(e,t){const n=new Map([["HIGHEST",QualityLevel.HIGHEST],["HIGH",QualityLevel.HIGH],["MEDIUM",QualityLevel.MEDIUM],["LOW",QualityLevel.LOW]]),r=[];n.forEach((e,t)=>r.push(t)),e.add(this,"_qualityLevel",r).onChange(e=>{var t;n.has(e)&&this._sceneRenderer.setQualityLevel(null!==(t=n.get(e))&&void 0!==t?t:QualityLevel.HIGHEST)}),e.add(this._sceneRenderer,"debugOutput",{"off ":"off","grayscale (no textures)":"grayscale","color buffer":"color","linear depth":"lineardepth","g-buffer normal vector":"g-normal","g-buffer depth":"g-depth","AO pure":"ssao","AO denoised":"ssaodenoise","shadow map":"shadowmap","shadow Monte Carlo":"shadow","shadow blur":"shadowblur","shadow fade in":"shadowfadein","shadow and AO":"shadowandao","ground reflection":"groundreflection","baked ground shadow":"bakedgroundshadow","selection outline":"outline","environment map":"environmentmap","light source detection":"lightsourcedetection"}).onChange(()=>t())}_addShadowTypeGUI(e,t){const n=this._sceneRenderer.screenSpaceShadow.shadowConfiguration,r=[];n.types.forEach((e,t)=>{r.push(t)});const a=()=>{this._sceneRenderer.screenSpaceShadow.needsUpdate=!0,this._sceneRenderer.screenSpaceShadow.shadowTypeNeedsUpdate=!0,this._sceneRenderer.shadowAndAoPass.needsUpdate=!0,t()};e.add(n,"shadowType",r).onChange(e=>{this._sceneRenderer.screenSpaceShadow.switchType(e)&&(i.object=n.currentConfiguration,s.object=n.currentConfiguration,o.object=n.currentConfiguration,i.updateDisplay(),s.updateDisplay(),o.updateDisplay(),a())});const i=e.add(n.currentConfiguration,"bias",-.001,.001,1e-5).onChange(()=>a()),s=e.add(n.currentConfiguration,"normalBias",-.05,.05).onChange(()=>a()),o=e.add(n.currentConfiguration,"radius",0,100).onChange(()=>a())}_addShadowAndAoGUI(e,t){const n=()=>{this._sceneRenderer.gBufferRenderTarget.needsUpdate=!0,this._sceneRenderer.screenSpaceShadow.needsUpdate=!0,this._sceneRenderer.shadowAndAoPass.needsUpdate=!0,this._sceneRenderer.shadowAndAoPass.shadowAndAoRenderTargets.parametersNeedsUpdate=!0,t()},r=this._sceneRenderer.shadowAndAoPass.parameters,a=r.shAndAo,i=this._sceneRenderer.screenSpaceShadow.parameters,s=r.ssao,o=r.hbao,l=r.poissonDenoise;e.add(r,"enabled").onChange(()=>n());const d=new Map([["none",AmbientOcclusionType.NONE],["SSAO",AmbientOcclusionType.SSAO],["effects SSAO",AmbientOcclusionType.EffectsSSAO],["effects HBAO",AmbientOcclusionType.EffectsHBAO]]),h=Array.from(d.keys());d.forEach((e,t)=>{e===r.aoType&&(this._ambientOcclusionType=t)}),e.add(this,"_ambientOcclusionType",h).onChange(e=>{var t;d.has(e)&&(r.aoType=null!==(t=d.get(e))&&void 0!==t?t:AmbientOcclusionType.SSAO,n())}),e.add(r,"aoIntensity",0,1).onChange(()=>{n()}),e.add(r,"aoOnGround").onChange(()=>{n()}),e.add(r,"shadowOnGround").onChange(()=>{n()}),e.add(r,"shadowIntensity",0,1).onChange(()=>n()),e.add(r,"alwaysUpdate").onChange(()=>n());const c=e.addFolder("Shadow and Monte Carlo integration");c.add(i,"maximumNumberOfLightSources").onChange(()=>n()),c.add(i,"directionalDependency",0,1,.01).onChange(()=>n()),c.add(i,"directionalExponent",0,2,.01).onChange(()=>n()),c.add(i,"groundContainment",0,1,.01).onChange(()=>n()),c.add(i,"fadeOutDistance",0,5,.01).onChange(()=>n()),c.add(i,"fadeOutBlur",0,100).onChange(()=>n()),c.add(a,"shadowRadius",.001,.5).onChange(()=>n());const u=e.addFolder("Roomle SSAO");u.add(a,"aoFadeout",0,1).onChange(()=>n()),u.add(a,"aoKernelRadius",.001,1).onChange(()=>n()),u.add(a,"aoDepthBias",1e-4,.01).onChange(()=>n()),u.add(a,"aoMaxDistance",.01,1).onChange(()=>n()),u.add(a,"aoMaxDepth",.9,1).onChange(()=>n());const p=e.addFolder("effects SSAO");p.add(s,"resolutionScale",.25,1,.25).onChange(()=>n()),p.add(s,"spp",1,64,1).onChange(()=>n()),p.add(s,"distance",.1,10,.1).onChange(()=>n()),p.add(s,"distancePower",0,2,.125).onChange(()=>n()),p.add(s,"bias",0,500,1).onChange(()=>n()),p.add(s,"power",.5,32,.5).onChange(()=>n()),p.add(s,"thickness",0,.1,.001).onChange(()=>n());const m=e.addFolder("effects HBAO");m.add(o,"resolutionScale",.25,1,.2).onChange(()=>n()),m.add(o,"spp",1,64,1).onChange(()=>n()),m.add(o,"distance",.1,10,.01).onChange(()=>n()),m.add(o,"distancePower",.1,10,.1).onChange(()=>n()),m.add(o,"bias",0,100,1).onChange(()=>n()),m.add(o,"power",.5,8,.5).onChange(()=>n()),m.add(o,"thickness",0,.1,.001).onChange(()=>n());const g=e.addFolder("Possion Denoise");g.add(l,"iterations",0,3,1).onChange(()=>n()),g.add(l,"radius",0,32,1).onChange(()=>n()),g.add(l,"rings",0,16,.125).onChange(()=>n()),g.add(l,"samples",0,32,1).onChange(()=>n()),g.add(l,"lumaPhi",0,20,.001).onChange(()=>n()),g.add(l,"depthPhi",0,20,.001).onChange(()=>n()),g.add(l,"normalPhi",0,20,.001).onChange(()=>n())}_addGroundReflectionGUI(e,t){const n=this._sceneRenderer.parameters.groundReflectionParameters;e.add(n,"enabled"),e.add(n,"intensity",0,1).onChange(()=>t()),e.add(n,"fadeOutDistance",0,4).onChange(()=>t()),e.add(n,"fadeOutExponent",.1,10).onChange(()=>t()),e.add(n,"brightness",0,2).onChange(()=>t()),e.add(n,"blurHorizontal",0,10).onChange(()=>t()),e.add(n,"blurVertical",0,10).onChange(()=>t())}_addBakedGroundContactShadowGUI(e,t){const n=()=>{this._sceneRenderer.bakedGroundContactShadow.applyParameters(),t()},r=this._sceneRenderer.parameters.bakedGroundContactShadowParameters;e.add(r,"enabled"),e.add(r,"cameraHelper").onChange(()=>n()),e.add(r,"alwaysUpdate"),e.add(r,"fadeIn"),e.add(r,"blurMin",0,.2,.001).onChange(()=>n()),e.add(r,"blurMax",0,.5,.01).onChange(()=>n()),e.add(r,"fadeoutFalloff",0,1,.01).onChange(()=>n()),e.add(r,"fadeoutBias",0,.5).onChange(()=>n()),e.add(r,"opacity",0,1,.01).onChange(()=>n()),e.add(r,"maximumPlaneSize",0,50,1).onChange(()=>n()),e.add(r,"cameraFar",.1,10,.1).onChange(()=>n())}_addOutlineGUI(e,t){const n=()=>{this._sceneRenderer.outlineRenderer.applyParameters(),t()},r=this._sceneRenderer.outlineRenderer.parameters;e.add(r,"enabled"),e.add(r,"edgeStrength",.5,20).onChange(()=>n()),e.add(r,"edgeGlow",0,20).onChange(()=>n()),e.add(r,"edgeThickness",.5,20).onChange(()=>n()),e.add(r,"pulsePeriod",0,5).onChange(()=>n()),e.addColor(r,"visibleEdgeColor").onChange(()=>n()),e.addColor(r,"hiddenEdgeColor").onChange(()=>n())}}const noEffectsSuspension={effectSuspendFrames:0,effectFadeInFrames:0,suspendGroundReflection:!1,shadowOnCameraChange:ShadowBlurType.FULL},partialEffectsSuspension={effectSuspendFrames:5,effectFadeInFrames:5,suspendGroundReflection:!1,shadowOnCameraChange:ShadowBlurType.POISSON},fullEffectsSuspension={effectSuspendFrames:5,effectFadeInFrames:5,suspendGroundReflection:!0,shadowOnCameraChange:ShadowBlurType.HARD},roomleSsaoDenoiseParameters={iterations:1,radius:10,rings:5.625,lumaPhi:10,depthPhi:12,normalPhi:3.25,samples:16},standaloneConfiguratorQualityLevels=new Map([[QualityLevel.HIGHEST,{...noEffectsSuspension,shAndAoPassParameters:{enabled:!0,aoOnGround:!0,shadowOnGround:!0,poissonDenoise:roomleSsaoDenoiseParameters},groundReflectionParameters:{enabled:!0},bakedGroundContactShadowParameters:{enabled:!1}}],[QualityLevel.HIGH,{...partialEffectsSuspension,shAndAoPassParameters:{enabled:!0,aoOnGround:!0,shadowOnGround:!0,poissonDenoise:roomleSsaoDenoiseParameters},groundReflectionParameters:{enabled:!0},bakedGroundContactShadowParameters:{enabled:!1}}],[QualityLevel.MEDIUM,{...fullEffectsSuspension,shAndAoPassParameters:{enabled:!0,aoOnGround:!0,shadowOnGround:!0,poissonDenoise:roomleSsaoDenoiseParameters},groundReflectionParameters:{enabled:!1},bakedGroundContactShadowParameters:{enabled:!1}}],[QualityLevel.LOW,{shAndAoPassParameters:{enabled:!1,aoOnGround:!1,shadowOnGround:!1},groundReflectionParameters:{enabled:!1},bakedGroundContactShadowParameters:{enabled:!0}}]]),screenSpaceShadowLayers=new Layers;screenSpaceShadowLayers.enable(3);const bakedGroundShadowHardLayers=new Layers;bakedGroundShadowHardLayers.disableAll(),bakedGroundShadowHardLayers.enable(9);const aoConfiguratorParameters={enabled:!0,aoType:AmbientOcclusionType.SSAO,aoIntensity:.5,shadowIntensity:0,aoOnGround:!0,shadowOnGround:!1,poissonDenoise:roomleSsaoDenoiseParameters},aoPlan3dParameters={enabled:!0,aoType:AmbientOcclusionType.EffectsHBAO,aoIntensity:.5,shadowIntensity:0,aoOnGround:!0,shadowOnGround:!1,poissonDenoise:{iterations:1,radius:10,rings:5.625,lumaPhi:10,depthPhi:2,normalPhi:3.25,samples:16}},aoPlan2dParameters=aoPlan3dParameters,bakedGroundContactConfiguratorParameters={enabled:!0,fadeoutFalloff:.9,blurMax:.1,opacity:.5,hardLayers:null,softLayers:null,polygonOffset:2},bakedGroundContactPlan3dParameters={enabled:!0,fadeoutFalloff:.8,blurMax:.15,opacity:.5,hardLayers:bakedGroundShadowHardLayers,softLayers:null,polygonOffset:-1},bakedGroundContactPlan2dParameters={enabled:!1},plannerConfiguratorQualityLevels=new Map([[QualityLevel.HIGHEST,{...noEffectsSuspension,shAndAoPassParameters:aoConfiguratorParameters,screenSpaceShadowMapParameters:{layers:screenSpaceShadowLayers},groundReflectionParameters:{enabled:!0},bakedGroundContactShadowParameters:bakedGroundContactConfiguratorParameters}],[QualityLevel.HIGH,{...partialEffectsSuspension,shAndAoPassParameters:aoConfiguratorParameters,screenSpaceShadowMapParameters:{layers:screenSpaceShadowLayers},groundReflectionParameters:{enabled:!0},bakedGroundContactShadowParameters:bakedGroundContactConfiguratorParameters}],[QualityLevel.MEDIUM,{...fullEffectsSuspension,shAndAoPassParameters:aoConfiguratorParameters,screenSpaceShadowMapParameters:{layers:screenSpaceShadowLayers},groundReflectionParameters:{enabled:!0},bakedGroundContactShadowParameters:bakedGroundContactConfiguratorParameters}],[QualityLevel.LOW,{shAndAoPassParameters:{enabled:!1,aoOnGround:!1,shadowOnGround:!1},groundReflectionParameters:{enabled:!1},bakedGroundContactShadowParameters:bakedGroundContactConfiguratorParameters}]]),planner3dQualityLevels=new Map([[QualityLevel.HIGHEST,{...noEffectsSuspension,shAndAoPassParameters:aoPlan3dParameters,screenSpaceShadowMapParameters:{layers:screenSpaceShadowLayers},groundReflectionParameters:{enabled:!1},bakedGroundContactShadowParameters:bakedGroundContactPlan3dParameters}],[QualityLevel.HIGH,{...partialEffectsSuspension,shAndAoPassParameters:aoPlan3dParameters,screenSpaceShadowMapParameters:{layers:screenSpaceShadowLayers},groundReflectionParameters:{enabled:!1},bakedGroundContactShadowParameters:bakedGroundContactPlan3dParameters}],[QualityLevel.MEDIUM,{...fullEffectsSuspension,shAndAoPassParameters:aoPlan3dParameters,screenSpaceShadowMapParameters:{layers:screenSpaceShadowLayers},groundReflectionParameters:{enabled:!1},bakedGroundContactShadowParameters:bakedGroundContactPlan3dParameters}],[QualityLevel.LOW,{shAndAoPassParameters:{enabled:!1,aoOnGround:!1,shadowOnGround:!1},groundReflectionParameters:{enabled:!1},bakedGroundContactShadowParameters:bakedGroundContactPlan3dParameters}]]),planner2dQualityLevels=new Map([[QualityLevel.HIGHEST,{...noEffectsSuspension,shAndAoPassParameters:aoPlan2dParameters,screenSpaceShadowMapParameters:{layers:screenSpaceShadowLayers},groundReflectionParameters:{enabled:!1},bakedGroundContactShadowParameters:bakedGroundContactPlan2dParameters}],[QualityLevel.HIGH,{...partialEffectsSuspension,shAndAoPassParameters:aoPlan2dParameters,screenSpaceShadowMapParameters:{layers:screenSpaceShadowLayers},groundReflectionParameters:{enabled:!1},bakedGroundContactShadowParameters:bakedGroundContactPlan2dParameters}],[QualityLevel.MEDIUM,{...fullEffectsSuspension,shAndAoPassParameters:aoPlan2dParameters,screenSpaceShadowMapParameters:{layers:screenSpaceShadowLayers},groundReflectionParameters:{enabled:!1},bakedGroundContactShadowParameters:bakedGroundContactPlan2dParameters}],[QualityLevel.LOW,{shAndAoPassParameters:{enabled:!1,aoOnGround:!1,shadowOnGround:!1},groundReflectionParameters:{enabled:!1},bakedGroundContactShadowParameters:bakedGroundContactPlan2dParameters}]]);class FpsCounter{constructor(){this._index=0,this._prevTime=0,this._frames=0,this._fps=-1,this._fpsList=Array(2).fill(0),this._prevTime=(performance||Date).now(),this.reset()}update(){this._frames++;const e=(performance||Date).now();e>=this._prevTime+1e3&&(this._fpsList[this._index%2]=1e3*this._frames/(e-this._prevTime),this._index>=2&&(this._fps=this._fpsList.reduce((e,t)=>e+t)/this._fpsList.length),this._prevTime=e,this._frames=0,this._index++)}start(){this._prevTime=(performance||Date).now(),this._frames=0}reset(){this._fps=-1,this._fpsList=Array(2).fill(0),this._index=0}getFps(){return this._fps}}var RenderMode;!function(e){e[e.Mode3D=0]="Mode3D",e[e.Mode2D=1]="Mode2D"}(RenderMode||(RenderMode={}));class RoomleWebGLRenderer{get renderer(){return this._renderer}get screenSpaceShadowParameters(){return this.sceneRenderer.screenSpaceShadow.parameters}get shadowAndAoPassParameters(){return this.sceneRenderer.shadowAndAoPass.parameters}get bakedGroundContactShadowParameters(){return this.sceneRenderer.bakedGroundContactShadow.parameters}get groundReflectionParameters(){return this.sceneRenderer.groundReflectionPass.parameters}get outlineParameters(){return this.sceneRenderer.outlineRenderer.parameters}constructor(e,t,n){this.configuratorMode=!0,this.uiInteractionMode=!0,this._renderer=e,this.sceneRenderer=new SceneRenderer(this._renderer,t,n),this.outlineParameters.enabled=!0,this.outlineParameters.edgeStrength=2,this.outlineParameters.edgeGlow=1,this.outlineParameters.edgeThickness=2,this.outlineParameters.pulsePeriod=0,this.outlineParameters.usePatternTexture=!1,this.outlineParameters.visibleEdgeColor=16777215,this.outlineParameters.hiddenEdgeColor=16777215,RoomleWebGLRenderer.enableRectAreaLightShadow&&(DynamicLightSettingLoader.rectAreaLightReplacement=!1,DynamicLightSettingLoader.rectAreaLightLoadingListener=this.loadRectAreLight),this.sceneRenderer.setQualityLevel(QualityLevel.HIGHEST),this.SceneRendererGUI=new SceneRendererGUI(this.sceneRenderer)}dispose(){this.sceneRenderer.dispose()}setSize(e,t){this.sceneRenderer.setSize(e,t)}setAutoQuality(e){!this._fpsCounter&&e?this._fpsCounter=new FpsCounter:this._fpsCounter&&!e&&(this._fpsCounter=null)}setQualityLevel(e){this.sceneRenderer.setQualityLevel(e)}setQualityMap(e){this.sceneRenderer.setQualityMap(e)}enableUiInteractionMode(){this.sceneRenderer.uiInteractionMode=!0,this.sceneRenderer.applyCurrentParameters()}disableUiInteractionMode(){this.sceneRenderer.uiInteractionMode=!1,this.sceneRenderer.applyCurrentParameters()}loadRectAreLight(e){RoomleWebGLRenderer.rectAreaLightsNeedsUpdate=!0}updateRectAreaLight(e){let t=[];e.traverse(e=>{e instanceof RectAreaLight&&t.push(e)}),this.sceneRenderer.updateRectAreaLights(t,e),RoomleWebGLRenderer.rectAreaLightsNeedsUpdate=!1}forceShadowUpdates(e){this.sceneRenderer.forceShadowUpdates(e)}switchToConfigurator(){this.configuratorMode=!0,this.sceneRenderer.setQualityMap(plannerConfiguratorQualityLevels)}switchToPlanner(e){RenderMode.Mode3D,this.configuratorMode=!1,e===RenderMode.Mode3D?this.sceneRenderer.setQualityMap(planner3dQualityLevels):this.sceneRenderer.setQualityMap(planner2dQualityLevels)}updateBounds(e){this.sceneRenderer.updateBounds(e,!1)}updateEnvironment(e,t=!1){e&&this.updateBounds(e)}movingCameraStarts(){var e;this.sceneRenderer.movingCamera=!0,null===(e=this._fpsCounter)||void 0===e||e.start()}movingCameraStops(){this.sceneRenderer.movingCamera=!1}highlightObjects(e){this.sceneRenderer.selectObjects(e)}render(e,t){var n;RoomleWebGLRenderer.rectAreaLightsNeedsUpdate&&this.updateRectAreaLight(e),t.updateMatrixWorld(),(t instanceof PerspectiveCamera||t instanceof OrthographicCamera)&&t.updateProjectionMatrix();const r=RoomleWebGLRenderer.updateNearAndFarPlaneOfPerspectiveCamera?this.createRenderCamera(t):t;if(this.sceneRenderer.render(e,r),this.sceneRenderer.movingCamera&&this._fpsCounter){null===(n=this._fpsCounter)||void 0===n||n.update();const e=this.sceneRenderer.getQualityLevel(),t=this._fpsCounter.getFps();t>0&&t<30&&e<3&&(this.sceneRenderer.setQualityLevel(e+1),this._fpsCounter.reset())}}createRenderCamera(e){const t=e.clone();return this.configuratorMode&&t instanceof PerspectiveCamera&&(this.sceneRenderer.updateNearAndFarPlaneOfPerspectiveCamera(t,120),t.updateProjectionMatrix()),t}showGUI(e){const t=getGUI();this.SceneRendererGUI.addGUI(t,e)}}RoomleWebGLRenderer.enableRectAreaLightShadow=!0,RoomleWebGLRenderer.rectAreaLightsNeedsUpdate=!1,RoomleWebGLRenderer.updateNearAndFarPlaneOfPerspectiveCamera=!1;class ImageRenderer{_getRoomleRenderer(e=!1){if(!this._roomleRenderer){const t=new WebGLRenderer({antialias:!e,alpha:!0});t.outputColorSpace=SRGBColorSpace,t.autoClear=!0,t.setSize(1024,1024),t.outputColorSpace=SRGBColorSpace,t.autoClear=!1,t.shadowMap.enabled=!0,t.shadowMap.type=PCFSoftShadowMap,this._roomleRenderer=new RoomleWebGLRenderer(t,1024,1024),this._roomleRenderer.setQualityMap(standaloneConfiguratorQualityLevels),this._roomleRenderer.setSize(1024,1024)}return this._roomleRenderer}switchToPlannerSettings(){this._getRoomleRenderer().switchToPlanner(RenderMode.Mode3D)}switchToConfiguratorSettings(){this._getRoomleRenderer().switchToConfigurator()}static getCameraTargetForBBox(e,t=0){if(!e){const e=new Vector3;return{center:e,bounds:e,diagonal:0}}const n=e.getSize(new Vector3);return n.addScalar(t),{center:e.getCenter(new Vector3),bounds:n,diagonal:Math.sqrt(Math.pow(n.x,2)+Math.pow(n.y,2)+Math.pow(n.z,2))}}preparePerspectiveImage(e,t,n,r,a={},i=0,s=!1){return new Promise(o=>{const{size:l=1024,showDimensions:d}=a,h=this._getRoomleRenderer(s);h.setSize(l,l);const c=e.fog?e.fog.clone():null,u=e.background?e.background.clone():null;e.background=null,e.fog=null,n.layers.disable(2),n.layers.disable(6),n.layers.disable(5),d?n.layers.enable(8):n.layers.disable(8);const p=-30+toDegrees(i);ImageRenderer.placeCameraForPerspectiveImage(n,r,-20,p);const m=this._render(h,e,t,n,s);n.layers.enable(2),n.layers.enable(6),n.layers.enable(5),e.background=u,e.fog=c,o({image:m,width:l,height:l,blob:null})})}renderPerspectiveImage(e,t,n,r){return new Promise(a=>{r||(r=1024);const i=this._getRoomleRenderer();i.setSize(r,r);const s=e.fog?e.fog.clone():null,o=e.background?e.background.clone():null;e.background=null,e.fog=null,t.layers.disable(2),t.layers.disable(6),t.layers.disable(5),n?ImageRenderer.placeCameraForPerspectiveImage(t,n,-20,-30):(t.aspect=1,t.updateProjectionMatrix());const l=this._render(i,e,null,t);t.layers.enable(2),t.layers.enable(6),t.layers.enable(5),e.background=o,e.fog=s,a({image:l,width:r,height:r,blob:null})})}static placeCameraForPerspectiveImage(e,t,n,r){e.far=1e3,e.fov=15,e.aspect=1,e.position.copy(t.center),e.rotation.set(0,0,0),e.rotateY(toRadiant(r)),e.rotateX(toRadiant(n)),e.translateZ(3.8*t.diagonal),e.updateProjectionMatrix()}prepareTopImage(e,t,n,r={}){const{showDimensions:a=!1}=r;return new Promise(r=>{const i=this._getRoomleRenderer();let s=new OrthographicCamera(-n.bounds.x/2,n.bounds.x/2,n.bounds.z/2,-n.bounds.z/2,.5);s.position.copy(n.center),s.rotateX(toRadiant(-90)),s.translateZ(n.bounds.y+1),s.far=s.position.y+.5,s.layers.mask=65535;let o=200*n.bounds.x,l=200*n.bounds.z;if(o>4096||l>4096){let e=0;o>4096?e=o/4096:l>4096&&(e=l/4096),o/=e,l/=e}i.setSize(o,l);let d=e.fog?e.fog.clone():null,h=e.background?e.background.clone():null;e.background=null,e.fog=null,s.layers.disable(2),s.layers.disable(6),s.layers.disable(5),a?s.layers.enable(8):s.layers.disable(8);const c=this._render(i,e,t,s);s.layers.enable(2),s.layers.enable(6),s.layers.enable(5),e.background=h,e.fog=d,r({image:c,width:o,height:l,blob:null})})}_render(e,t,n,r,a=!1){return a?e.renderer.render(t,r):(e.forceShadowUpdates(!0),e.render(t,r),e.render(t,r)),n&&(e.renderer.autoClear=!1,e.renderer.clearDepth(),e.renderer.render(n,r),e.renderer.autoClear=!0),e.renderer.domElement.toDataURL()}}const INJECTABLES=[new DependencyInjectionAssignment("error-handler",class{constructor(){this._listeners={}}_subscribe(e,t){this._listeners[e]||(this._listeners[e]=[]),this._listeners[e].push(t)}subscribe(e,t){this._subscribe(e,t)}dispatch(e,t){if(!this._listeners[e])return;const n=this._listeners[e];let r=n.length;for(let e=0;e<r;e++){const r=n[e];r.apply(r,t)}}unsubscribe(e,t){if(!this._listeners[e])return;const n=this._listeners[e];let r=n.length;for(let e=0;e<r;e++)if(n[e]===t)return n.splice(e,1),r--,void e--}softReject(e,t,n){return this.dispatch(n,[t]),e()}}),new DependencyInjectionAssignment("form-data-util",FormDataUtil),new DependencyInjectionAssignment("hdr-environment-loader",class{constructor(e){this._creator_=e;const t=new Color$1("#DDDDDD");this._environmentMap=((e,t,n,r)=>{const a=new CubeTexture;a.format=RGBAFormat,a.generateMipmaps=!1;for(let r=0;r<6;++r){const i=createColorTexture(e,t,n,1);i.format=a.format,i.type=a.type,i.minFilter=a.minFilter,i.magFilter=a.magFilter,i.generateMipmaps=a.generateMipmaps,i.needsUpdate=!0,a.images[r]=i}return a.needsUpdate=!0,a})(t.r,t.g,t.b)}async loadUrl(e,t){const n=t.toLowerCase();this._environmentMap=n.endsWith(".exr")?await this._loadExr(t):await this._loadRgbe(t),this._environmentMap.mapping=EquirectangularReflectionMapping;const r={url:t,environmentMap:this._environmentMap};return this._envChangedCallback(r),r}_loadExr(e){var t;return this._exrLoader=null!==(t=this._exrLoader)&&void 0!==t?t:new EXRLoader,this._exrLoader.setPath(e.startsWith("http")?"":getAssetPath()),this._exrLoader.loadAsync(e)}_loadRgbe(e){var t;return this._rgbeLoader=null!==(t=this._rgbeLoader)&&void 0!==t?t:new RGBELoader,this._rgbeLoader.setPath(e.startsWith("http")?"":getAssetPath()),this._rgbeLoader.loadAsync(e)}registerEnvironmentChangedCallback(e){this._envChangedCallback=e}}),new DependencyInjectionAssignment("static-item-loader",class{constructor(e){this._gltfLoaderGuard=new AsyncGuard,this._creator_=e,this._initLoaders()}_initLoaders(){this._gltfLoader=new GLTFLoader;const e=new DRACOLoader,t=e._loadLibrary.bind(e._loadLibrary);e._loadLibrary=(e,n)=>{const r=DRACO_LIB_FILES[e];if(!r)throw new Error('Can not load draco dependency "'+e+'" did three.js update DracoLoader lib? Available files'+JSON.stringify(DRACO_LIB_FILES));return t(getAssetPath()+r,n)},e.setDecoderConfig({type:"wasm"}),this._gltfLoader.setDRACOLoader(e),this._gltfLoaderGuard.resolve(this._gltfLoader)}async loadGLB(e,t,n,r,a,i,s,o){return await this._gltfLoaderGuard.wait(),new Promise((l,d)=>{this._gltfLoader.load(e,e=>{l(this._handleGLTFScene("GLB",e,t,n,r,a,i,s))},e=>{o&&o(e.loaded/e.total)},e=>{d(e)})})}async loadGLTF(e,t,n,r,a,i,s,o){return await this._gltfLoaderGuard.wait(),new Promise((l,d)=>{this._gltfLoader.parse(e,null,e=>{l(this._handleGLTFScene("GLTF",e,t,n,r,a,i,s))},e=>{o&&o(e.loaded/e.total)},e=>{d(e)})})}_handleGLTFScene(e,t,n,r,a,i,s,o){if(!t||!t.scene||!t.scene.children||0===t.scene.children.length)return null;n&&t.scene.position.copy(n),r&&(t.scene.rotation.y=r);const l=new Box3;if(l.setFromObject(t.scene),a){const{x:e,y:n,z:r}=l.getSize(new Vector3);let i=new Vector3(a.x/e,a.y/n,a.z/r);t.scene.scale.copy(i)}return i&&t.scene.scale.multiply(i),t.scene.type=e,t.scene.traverse(e=>{if(e instanceof Mesh){if(e.layers.set(3),e.material instanceof MeshStandardMaterial){const t=e.material;if(o&&s&&s>0){let e=new Color$1(s);t.color=e.copySRGBToLinear(e),t.roughness=.5,t.metalness=.1}t.needsUpdate=!0}e.castShadow=!0,e.receiveShadow=!0}}),{boundingBox:l,scene:t.scene}}},0),new DependencyInjectionAssignment("form-data-util",FormDataUtil),new DependencyInjectionAssignment("single-promise-factory",class{constructor(e){this._promises=new Map,this._creator_=e}create(e,t,n){return new Promise((r,a)=>{let i=this._promises.get(e),s=!0;if(!i){const t=new Map;this._promises.set(e,t),i=this._promises.get(e),s=!1}i.get(t)||(i.set(t,[]),s=!1);const o=i.get(t);o.push({resolve:r,reject:a}),i.set(t,o);const l=()=>{i.delete(t),0===i.size&&this._promises.delete(e)};s||new Promise(n).then(e=>{i.get(t).forEach(({resolve:t})=>t(e)),l()},e=>{i.get(t).forEach(({reject:t})=>t(e)),l()})})}},1),new DependencyInjectionAssignment("dynamic-light-setting-loader",DynamicLightSettingLoader),new DependencyInjectionAssignment("network-layer",NetworkLayer),new DependencyInjectionAssignment("local-storage",class{constructor(e){this._context_=e}get _localStorage(){let e=null;try{e=window.localStorage}catch(e){console.error(e)}return e}getItem(e){if(!this._localStorage)return null;const t=this._localStorage.getItem(e);try{return JSON.parse(t)}catch(e){return t}}setItem(e,t){if(this._localStorage)try{const n=JSON.stringify(t);this._localStorage.setItem(e,n)}catch(e){console.error(e)}}}),new DependencyInjectionAssignment("network-layer",NetworkLayer),new DependencyInjectionAssignment("kernel-io",KernelIo,0),new DependencyInjectionAssignment("data-syncer",DataSyncer),new DependencyInjectionAssignment("memory-manager",class{constructor(){this._configurationStringSet=new Set,this._singleLoadCounter=0}loadingConfigurationString(){this._singleLoadCounter+=1}loadingConfiguration(e){this._configurationStringSet.add(e),this._singleLoadCounter+=1}shouldHardReset(){return this._configurationStringSet.size>=15||this._singleLoadCounter>=30}executedHardReset(){this._configurationStringSet.clear(),this._singleLoadCounter=0}}),new DependencyInjectionAssignment("life-cycle-manager",class{constructor(){this._listeners=[]}addEventListener(e){this._listeners.push(e)}removeEventListener(e){const t=this._listeners;let n=t.length;if(n)for(let r=0;r<n;r++)t[r]===e&&(t.splice(r,1),r--,n--)}pause(){this._listeners.forEach(e=>e.pause())}resume(){this._listeners.forEach(e=>e.resume())}destroy(){this._listeners.forEach(e=>e.destroy())}},1),new DependencyInjectionAssignment("local-storage-helper",LocalStorageHelper),new DependencyInjectionAssignment("cache-holder",class{constructor(){this._componentCache=new Map,this._geometryCache=new Map,this._materialCache=new Map}get componentCache(){return this._componentCache}get geometryCache(){return this._geometryCache}get materialCache(){return this._materialCache}clear(){for(const e of this._componentCache.values())disposeObject(e);for(const e of this._materialCache.values())disposeMaterial(e);for(const e of this._geometryCache.values())disposeGeometry(e);this._componentCache.clear(),this._geometryCache.clear(),this._materialCache.clear()}},0),new DependencyInjectionAssignment("kernel-access-callback",class{constructor(e){this._callbackListener=new Set,this._creator_=e}addListener(e){this._callbackListener.add(e)}removeListener(e){this._callbackListener.delete(e)}isReady(){this._callbackListener.forEach(e=>e.isReady())}loadError(e){this._callbackListener.forEach(t=>t.loadError(e))}},1),new DependencyInjectionAssignment("configurator-kernel-access-callback",class{constructor(e){this._callbackListener=new Set,this._creator_=e}addListener(e){this._callbackListener.add(e)}removeListener(e){this._callbackListener.delete(e)}isReady(){this._callbackListener.forEach(e=>e.isReady())}updatePossibleChildren(e,t,n){this._callbackListener.forEach(r=>r.updatePossibleChildren(e,t,n))}updateParameters(e,t,n,r){this._callbackListener.forEach(a=>a.updateParameters(e,t,n,r))}loadError(e){this._callbackListener.forEach(t=>t.loadError(e))}},1),new DependencyInjectionAssignment("configurator-context",class{constructor(){this.planObjectId=0,this.planElementId=0,this.rootComponentId=0,this.dockingRootComponentId=0,this.baseContext=null,this.rootComponentParametersAsGlobal=!1,this.lastLoadedRapiId=null,this.selectedRuntimeComponentIds=[],this.selectionMode="standard"}get selectedRuntimeComponentId(){return this.selectedRuntimeComponentIds.length>0?this.selectedRuntimeComponentIds[0]:null}},1),new DependencyInjectionAssignment("init-data",InitData,1),new DependencyInjectionAssignment("global-init-data",GlobalInitData,0),new DependencyInjectionAssignment("global-callback",GlobalCallback,0),new DependencyInjectionAssignment("dom-helper",DomHelper,1),new DependencyInjectionAssignment("unit-formatter",UnitFormatter,0),new DependencyInjectionAssignment("plugin-system",PluginSystem,1),new DependencyInjectionAssignment("configurator-mesh-generator",ConfiguratorMeshGenerator),new DependencyInjectionAssignment("configurator-input-manager",class extends InputManager{},1),new DependencyInjectionAssignment("selection-handler",class extends EventDispatcher{constructor(){super(...arguments),this._selectionMode="standard",this._selectedComponents=new Map}check(e){"standard"===this._selectionMode&&this._checkStandard(e),"multiselect"===this._selectionMode&&this._checkMulti(e)}cancelSelection(){0!==this._selectedComponents.size&&this._selectedComponents.forEach((e,t)=>{e.deselect(),this._selectedComponents.delete(t),this.dispatchEvent(1,new SelectionHandlerEvent({component:e}))})}_checkStandard(e){this._selectedComponents.has(e.runtimeId)?this.dispatchEvent(0,new SelectionHandlerEvent({component:e,consecutive:!0})):(this._selectedComponents.size>0&&this._selectedComponents.forEach((e,t)=>{this._selectedComponents.delete(t),this.dispatchEvent(1,new SelectionHandlerEvent({component:e,resetCamera:!1}))}),this._selectedComponents.set(e.runtimeId,e),this.dispatchEvent(0,new SelectionHandlerEvent({component:e,consecutive:!1})))}_checkMulti(e){if(this._selectedComponents.has(e.runtimeId))return this._selectedComponents.delete(e.runtimeId),void this.dispatchEvent(1,new SelectionHandlerEvent({component:e,resetCamera:0===this._selectedComponents.size}));this._selectedComponents.set(e.runtimeId,e),this.dispatchEvent(0,new SelectionHandlerEvent({component:e}))}setSelectionMode(e){this._selectionMode=e}getSelectionMode(){return this._selectionMode}hasSelection(){return this._selectedComponents.size>0}getSelectedRuntimeComponentIds(){let e=[];return this._selectedComponents.forEach(t=>e.push(t.runtimeId)),e}isSelected(e){return this._selectedComponents.has(e.runtimeId)}},1),new DependencyInjectionAssignment("component-dimensioning-helper",ComponentDimensioningHelper,1),new DependencyInjectionAssignment("component-dimensioning-helper",ComponentDimensioningHelper,1),new DependencyInjectionAssignment("planner-kernel-access",PlannerKernelAccess),new DependencyInjectionAssignment("planner-mesh-generator",PlannerMeshGenerator,1),new DependencyInjectionAssignment("unit-formatter",UnitFormatter),new DependencyInjectionAssignment("configurator-history",ConfiguratorHistory,1),new DependencyInjectionAssignment("roomle-planner-ui-callback",class extends UiCallback{constructor(e){super(e),this.onItemsLoaded=()=>{},this.onCameraChanged=e=>{},this.onCameraIdle=()=>{},this.onTotalFloorAreaChanged=e=>{},this.onPlanInteractionHandlerCreated=e=>{},this.onPlannerKernelIsReady=e=>{},this.onConfiguratorKernelIsReady=(e,t)=>{},this.onSelectionChange=(e,t,n,r,a)=>{},this.onSelectionCancel=e=>{},this.onPlanChanged=()=>{},this.onPlanElementChanged=(e,t)=>{},this.onCompletelyLoaded=()=>{},this.onRotationCancel=()=>{},this.onHistoryChange=(e,t)=>{},this.onUpdateWallDimensions=e=>{},this.disableWallDimensions=()=>{},this.onUpdatePlanObjectPositions=e=>{},this.onDrawCancel=()=>{},this.onHandlerSwitchedPlans=()=>{},this.onDragElementStart=()=>{},this.onDragElementEnd=()=>{},this.onClickElement=e=>{},this.onMultiSelectionChange=e=>{}}}),new DependencyInjectionAssignment("configurator-ui-callbacks",class extends UiCallback{constructor(e){super(e),this.onKernelIsReady=null,this.onComponentPositionsUpdated=null,this.onUpdateParameters=e=>{},this.onUpdatePossibleChildren=(e,t)=>{},this.onUpdatePrice=(e,t)=>{},this.onSelectionChange=(e,t,n,r)=>{},this.onSelectionCancel=()=>{},this.onPartListUpdate=(e,t)=>{},this.onBoundsUpdate=e=>{},this.onLoadConfiguration=()=>{},this.onConfigurationReady=(e,t,n)=>{},this.onOpenTag=e=>{},this.onOpenAddOns=()=>{},this.onClickOutside=()=>{},this.onNoDockingsAvailable=()=>{},this.onUiIntersectionChange=e=>{},this.onZoomChange=(e,t)=>{},this.onZoomToComponent=()=>{},this.onDimensionsVisibilityChange=e=>{},this.onErrorDueToOffline=e=>{},this.onError=e=>{},this.onDockingsPreviewRemoved=()=>{},this.onConfigurationHasChildren=e=>{},this.onTrackTiming=(e,t,n,r)=>{},this.onUserInitiatedDockDone=(e,t,n,r,a)=>{},this.onAddonPlusHover=()=>{},this.onAddonPlusHoverOff=()=>{},this.onAddonPlusShown=()=>{},this.onAddonPlusHidden=()=>{},this.onContentProblem=e=>{},this.onSyncStarted=()=>{},this.onSyncDone=()=>{},this.onOpenFloorMaterials=()=>{},this.onOpenPartList=()=>{},this.onComponentLoadError=(e,t)=>{},this.onConfigurationLoadError=()=>{},this.onChangeTypeChangeTag=e=>{},this.onRemoveTypeChangeTag=e=>{},this.onConfigurationLabelChange=(e,t,n)=>{},this.onMemoryCorruption=()=>{},this.onConfiguratorKernelIsReady=(e,t)=>{},this.onConfigurationSaved=e=>{},this.onCameraPositionChanges=()=>{},this.onHistoryChange=(e,t)=>{},this.onClickComponent=e=>{},this.onRequestExternalMesh=(e,t)=>{},this.onGeometryReady=e=>{},this.onGeometryNotReady=e=>{}}},1),new DependencyInjectionAssignment("roomle-tools-core",RoomleToolsCore,0),new DependencyInjectionAssignment("image-renderer",ImageRenderer,0)];class RoomleDependencyInjection{static _ensureContainer(){window.__RML__DI__||(window.__RML__DI__=new Container,window.__RML__DI__.addDependencyInjectionAssignments(INJECTABLES))}static setup(e){RoomleDependencyInjection.addToContainer(e)}static lookup(e,t){return window.__RML__DI__?window.__RML__DI__.lookup(e,t):null}static getContext(e){return RoomleDependencyInjection._ensureContainer(),window.__RML__DI__.getContext(e)}static cleanUp(e){return window.__RML__DI__?window.__RML__DI__.cleanUp(e):null}static addToContainer(e){RoomleDependencyInjection._ensureContainer(),window.__RML__DI__.addDependencyInjectionAssignments(e)}}export{rotationQuaternionsAreEqual as $,AppContext as A,Benchmark as B,ConfiguratorViewModel as C,DependencyInjectionAssignment as D,EventDispatcher as E,FloorPlanElementViewModel as F,getCatalogIdFromItemOrConfigurationId as G,isIdItemId as H,INJECTABLES as I,AsyncHelper as J,isRange as K,Logger as L,isMaterial as M,NodePlanElementViewModel as N,convertCObject as O,PlannerKernelAccess as P,position3VectorsAreEqual as Q,RapiAccess as R,StaticPlanObjectViewModel as S,position2VectorsAreEqual as T,compareBox3Size as U,MaterialCreator as V,WallPlanElementViewModel as W,createMaterial as X,addTexture as Y,getGUI as Z,__decorate as _,DataSyncer as a,getDelta as a0,MIN_MOVE_DISTANCE as a1,LightSourceDetector as a2,EnvironmentMapDecodeMaterial as a3,sanitizedCameraMode as a4,RoomleWebGLRenderer as a5,standaloneConfiguratorQualityLevels as a6,ENV_HDR_256_FILE_NAME as a7,transitionTransparencyOfMaterial as a8,isSafari as a9,convertToTHREE as aa,INPUT_DELAY_TYPE as ab,threeVectorToTransferableXY as ac,AsyncGuard as ad,RenderMode as ae,PLAN_ELEMENT_CHANGE_TYPES as af,hideWallsBasedOnCamera as ag,fadeIn as ah,viewSpacePositionFromUV as ai,setWallTransparency as aj,getDrawingMinBounds as ak,wallDimensionToTransferable as al,isPlanSnapshotId as am,InputManager as an,PlannerMeshGenerator as ao,setMaterial as ap,getMaterialShading as aq,addExistingTexture as ar,UiCallback as as,ConfiguratorMeshGenerator as at,GlobalCallback as au,GlobalInitData as av,InitData as aw,AsyncDependencyLoader as ax,ScenePluginDefaultImplementation as ay,RoomleDependencyInjection as b,ConfiguratorPlanObjectViewModel as c,ConstructionPlanObjectViewModel as d,CAMERA_TYPE as e,CeilingPlanElementViewModel as f,disposeMesh as g,convertToKernel as h,inject as i,getScreenXY as j,kernelBoxToThreeBox as k,CANVAS_ID as l,Env as m,PULSE_LOOPS as n,PULSE_DURATION as o,DynamicLightSettingLoader as p,PREDEFINED_LIGHTSETTING as q,ImageRenderer as r,dispose as s,toRadiant as t,getYRotationOfObject as u,vectorIsZero as v,getIdealDistance as w,RoomleComponentFactoryInitializer as x,toDegrees as y,DEFAULT_CONVERSATION_ID as z};
|
|
9
|
+
//# sourceMappingURL=roomle-dependency-injection-a6b6e5b9.js.map
|