illutions 0.24.1 → 0.26.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/main.min.cjs CHANGED
@@ -5,4 +5,4 @@
5
5
  * Commercial use is permitted only under the illutions License Agreement. Unauthorized copying, modification, distribution, resale, sublicensing, reverse engineering, deobfuscation, or bypassing of license mechanisms is prohibited.
6
6
  * The illutions menu bar, branding, attribution, and license validation must not be removed, hidden, disabled, altered, or obscured without prior written permission.
7
7
  */
8
- Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});let three=require("three"),gsap=require("gsap"),xstate=require("xstate");var THREE={ACESFilmicToneMapping:three.ACESFilmicToneMapping,AgXToneMapping:three.AgXToneMapping,AmbientLight:three.AmbientLight,AdditiveAnimationBlendMode:three.AdditiveAnimationBlendMode,AnimationAction:three.AnimationAction,AnimationClip:three.AnimationClip,AnimationMixer:three.AnimationMixer,Audio:three.Audio,AudioContext:three.AudioContext,AudioListener:three.AudioListener,AudioLoader:three.AudioLoader,BasicShadowMap:three.BasicShadowMap,Box3:three.Box3,BoxGeometry:three.BoxGeometry,Camera:three.Camera,CatmullRomCurve3:three.CatmullRomCurve3,CineonToneMapping:three.CineonToneMapping,Color:three.Color,CustomToneMapping:three.CustomToneMapping,DataTexture:three.DataTexture,DirectionalLight:three.DirectionalLight,EquirectangularReflectionMapping:three.EquirectangularReflectionMapping,Euler:three.Euler,FloatType:three.FloatType,Fog:three.Fog,Group:three.Group,HalfFloatType:three.HalfFloatType,HemisphereLight:three.HemisphereLight,KeyframeTrack:three.KeyframeTrack,Light:three.Light,LinearSRGBColorSpace:three.LinearSRGBColorSpace,LinearToneMapping:three.LinearToneMapping,NormalAnimationBlendMode:three.NormalAnimationBlendMode,LoopOnce:three.LoopOnce,LoopRepeat:three.LoopRepeat,MathUtils:three.MathUtils,Matrix4:three.Matrix4,Mesh:three.Mesh,MeshPhysicalMaterial:three.MeshPhysicalMaterial,MeshStandardMaterial:three.MeshStandardMaterial,MOUSE:three.MOUSE,NeutralToneMapping:three.NeutralToneMapping,NoToneMapping:three.NoToneMapping,Object3D:three.Object3D,OrthographicCamera:three.OrthographicCamera,PCFShadowMap:three.PCFShadowMap,PMREMGenerator:three.PMREMGenerator,PerspectiveCamera:three.PerspectiveCamera,PointLight:three.PointLight,PositionalAudio:three.PositionalAudio,Quaternion:three.Quaternion,Raycaster:three.Raycaster,ReinhardToneMapping:three.ReinhardToneMapping,Scene:three.Scene,SpotLight:three.SpotLight,Sphere:three.Sphere,SRGBColorSpace:three.SRGBColorSpace,Texture:three.Texture,TextureLoader:three.TextureLoader,TOUCH:three.TOUCH,UnsignedByteType:three.UnsignedByteType,Vector2:three.Vector2,Vector3:three.Vector3,VSMShadowMap:three.VSMShadowMap,WebGLRenderer:three.WebGLRenderer},EventDispatcher=class{listeners=new Map;addEventListener(e,t){let s=this.listeners.get(e);return s||(s=new Set,this.listeners.set(e,s)),s.add(t),()=>this.removeEventListener(e,t)}removeEventListener(e,t){const s=this.listeners.get(e);s&&(s.delete(t),0===s.size&&this.listeners.delete(e))}emit(e){const t=this.listeners.get(e.type);if(t)for(const s of[...t])s(e)}listenerCount(e){return this.listeners.get(e)?.size??0}},Obj3D=class{canvas;cfg;events;name;obj=null;objs3D=null;raycast;renderer;scene;enableOcclusionCheck=!1;eventDispatcher=new EventDispatcher;posScreen=new THREE.Vector2;posScreenLast=null;posWorld=new THREE.Vector3;posWorldLast=null;visible=!1;visibleFrustum=!1;visibleLast=null;visibleOcclusion=!1;constructor(e,t,s){this.canvas=e,this.cfg=t,this.name=s}addEventListener(e,t){const s=this.eventDispatcher.addEventListener(e,t);return()=>{s(),this.resetEventStateIfNoListeners(e)}}calcScreenPos(e,t){t.updateMatrixWorld(!0);const s=new THREE.Vector3;t.getWorldPosition(s);const n=s.clone().project(e.obj),i=this.canvas.getBoundingClientRect();return this.visibleFrustum=n.x>=-1&&n.x<=1&&n.y>=-1&&n.y<=1&&n.z>=-1&&n.z<=1,new THREE.Vector2((.5*n.x+.5)*i.width,(.5*-n.y+.5)*i.height)}checkWorldAndScreenPos(e,t){if(t.getWorldPosition(this.posWorld),null!==this.posWorldLast&&this.posWorld.equals(this.posWorldLast)||(this.eventDispatcher.emit({type:"OBJ3D_POS_WORLD_CHANGED",posWorld:this.posWorld.clone()}),null===this.posWorldLast?this.posWorldLast=this.posWorld.clone():this.posWorldLast.copy(this.posWorld)),this.visibleFrustum=this.isVisibleFrustum(e,t),!this.visibleFrustum)return this.visibleOcclusion=!1,void this.posScreen.set(0,0);if(this.enableOcclusionCheck){if(this.visibleOcclusion=this.raycast.isVisibleOcclusion(t),!this.visibleOcclusion)return void this.posScreen.set(0,0)}else this.visibleOcclusion=!0;this.posScreen.copy(this.calcScreenPos(e,t)),null!=this.posScreenLast&&this.posScreen.equals(this.posScreenLast)||(this.eventDispatcher.emit({type:"OBJ3D_POS_SCREEN_CHANGED",posScreen:this.posScreen.clone()}),null===this.posScreenLast?this.posScreenLast=this.posScreen.clone():this.posScreenLast.copy(this.posScreen))}checkVisible(){this.visible=this.visibleFrustum&&this.visibleOcclusion,this.visible!==this.visibleLast&&(this.emitEvent({type:"OBJ3D_VISIBLE_CHANGED",visible:this.visible}),this.visibleLast=this.visible)}emitEvent(e){this.eventDispatcher.emit(e),this.events.send(e,this.name)}getScreenPosition(e){if(!this.obj)return null;const t=this.calcScreenPos(e,this.obj);return{x:t.x,y:t.y}}isVisibleFrustum(e,t){t.updateMatrixWorld(!0);const s=new THREE.Vector3;t.getWorldPosition(s);const n=s.clone().project(e.obj);return n.x>=-1&&n.x<=1&&n.y>=-1&&n.y<=1&&n.z>=-1&&n.z<=1}onReady(){}onStart(){}onTraverse(e){this.obj=e,this.visible=e.visible}onUpdate(e){}ready(e){this.objs3D=e,this.onReady()}removeEventListener(e,t){this.eventDispatcher.removeEventListener(e,t),0===this.eventDispatcher.listenerCount(e)&&this.resetEventStateIfNoListeners(e)}resetEventStateIfNoListeners(e){"OBJ3D_POS_WORLD_CHANGED"===e&&(this.posWorldLast=null),"OBJ3D_POS_SCREEN_CHANGED"===e&&(this.posScreenLast=null),"OBJ3D_VISIBLE_CHANGED"===e&&(this.visibleLast=null)}start(e,t){this.renderer=e,this.scene=t,this.onStart()}traverse(e){this.onTraverse(e)}update(e,t){this.obj&&(this.onUpdate(e),0==this.eventDispatcher.listenerCount("OBJ3D_POS_WORLD_CHANGED")&&0==this.eventDispatcher.listenerCount("OBJ3D_POS_SCREEN_CHANGED")||(this.checkWorldAndScreenPos(t,this.obj),0!=this.eventDispatcher.listenerCount("OBJ3D_VISIBLE_CHANGED")&&this.checkVisible()))}},Comp=class extends HTMLElement{canvas;cfg;comps=null;events;objs3D;unsubFollow=void 0;unsubVisible=void 0;follow({obj:e,enableOcclusionCheck:t=!1}){const s=this.follow.name;if(!e)return void console.warn(`${s}: Missing parameter object`);const n=e instanceof Obj3D?e:this.objs3D.get(e);n?n.obj?(this.unfollow(),n.enableOcclusionCheck=t,this.unsubFollow=n.addEventListener("OBJ3D_POS_SCREEN_CHANGED",e=>{const{x:t,y:s}=e.posScreen;this.style.left=`${t}px`,this.style.top=`${s}px`}),this.unsubVisible=n.addEventListener("OBJ3D_VISIBLE_CHANGED",e=>{this.style.display=e.visible?"block":"none"})):console.warn(`${s}: Obj3D "${e}" has no THREE.Object3D assigned.`):console.warn(`${s}: Obj3D "${e}" is not registered.`)}unfollow(){this.unsubFollow&&(this.unsubFollow(),this.unsubFollow=void 0),this.unsubVisible&&(this.unsubVisible(),this.unsubVisible=void 0)}onReady(){}onStart(){}ready(e){this.objs3D=e,this.onReady()}start(e){this.comps=e,this.onStart()}},Cam3D=class extends Obj3D{lookMode="target";obj;objGltf=null;objTarget;targetGltf=null;tmpVec=new THREE.Vector3;constructor(e,t,s){super(e,t,s),this.canvas=e;const n=e.getBoundingClientRect();"perspective"===t.cam.type?this.obj=new THREE.PerspectiveCamera(t.cam.fov,n.width/n.height,t.cam.near,t.cam.far):this.obj=new THREE.OrthographicCamera(t.cam.left,t.cam.right,t.cam.top,t.cam.bottom,t.cam.near,t.cam.far),this.objTarget=new THREE.Object3D,this.objTarget.position.copy(t.cam.lookAt),this.obj.position.copy(t.cam.position),this.obj.lookAt(this.objTarget.position)}onTraverse(e){const t=new THREE.Vector3,s=new THREE.Quaternion,n=new THREE.Vector3;e.updateMatrixWorld(!0),e.matrixWorld.decompose(t,s,n),this.obj.copy(e),this.obj.position.copy(t),this.obj.quaternion.copy(s),this.obj.scale.copy(n),this.obj instanceof THREE.PerspectiveCamera&&e instanceof THREE.PerspectiveCamera&&this.obj.updateProjectionMatrix(),this.obj.updateMatrixWorld(!0),this.objGltf=e}traverse(e){if(this.obj instanceof THREE.PerspectiveCamera&&e instanceof THREE.PerspectiveCamera||this.obj instanceof THREE.OrthographicCamera&&e instanceof THREE.OrthographicCamera){this.onTraverse(e);let t=this.canvas.getBoundingClientRect();this.updateCanvasResize(t)}else console.warn("Camera type mismatch between cfg and .gltf model.")}update(e,t){if(this.onUpdate(e),"target"===this.lookMode)this.obj.lookAt(this.objTarget.position);else{let e=this.obj.position.distanceTo(this.objTarget.position);this.objTarget.position.copy(this.obj.position).add(this.tmpVec.set(0,0,-e).applyQuaternion(this.obj.quaternion))}this.obj.updateMatrixWorld(!0),this.checkWorldAndScreenPos(t,this.obj)}updateCanvasResize(e){const t=e.width/e.height;if(this.obj instanceof THREE.PerspectiveCamera)this.obj.aspect=t,this.obj.updateProjectionMatrix();else if(this.obj instanceof THREE.OrthographicCamera){const e=this.obj.top-this.obj.bottom,s=e*t/2,n=e/2;this.obj.left=-s,this.obj.right=s,this.obj.top=n,this.obj.bottom=-n,this.obj.updateProjectionMatrix()}}},Light3D=class extends Obj3D{obj;constructor(e,t,s){super(e,t,s),this.obj=new THREE.PointLight}onTraverse(e){this.obj=e}traverse(e){this.onTraverse(e)}},Mesh3D=class extends Obj3D{obj;groundReflector=null;reflectivesSSR=[];constructor(e,t,s){super(e,t,s),this.obj=new THREE.Mesh(new THREE.BoxGeometry,new THREE.MeshPhysicalMaterial)}onTraverse(e){this.obj=e}setReflectivesSSR(e){this.reflectivesSSR=e}traverse(e){this.onTraverse(e)}},Audio=class{ctx=THREE.AudioContext.getContext();loader=new THREE.AudioLoader;engine;events;loadedSounds=[];params;listener=null;constructor(e,t,s){this.engine=t,this.events=s,this.params={...e}}attachSoundTo(e,t){if(!e)return void console.warn("No name assigned.");if(!t)return void console.warn("No object to attach provided.");const s=this.engine.scene.getObjectByName(t);if(!s)return void console.warn(`Object "${t}" not found in scene.`);const n=this.loadedSounds.find(t=>t.name===e);n?s.add(n.audio):console.warn(`Sound "${e}" not found.`)}get(){return{delayPlaySound:this.params.delayPlaySound,refDistance:this.params.refDistance,rolloffFactor:this.params.rolloffFactor,maxDistance:this.params.maxDistance,distanceModel:this.params.distanceModel,coneInnerAngle:this.params.coneInnerAngle,coneOuterAngle:this.params.coneOuterAngle,coneOuterGain:this.params.coneOuterGain}}isLoaded({name:e}){return!!this.loadedSounds.find(t=>t.name===e)}isPlaying({name:e}){let t=this.isPlaying.name;if("running"!==this.ctx.state)return console.warn(`${t}: ctx.state is not running.`),!1;const s=this.loadedSounds.find(t=>t.name===e);return s?s.audio.isPlaying:(console.warn(`${t}: Sound not found.`),!1)}loadSound({name:e,url:t,object:s,volume:n,fade:i,loop:o},a=!1){if(!this.listener)return void console.warn(`${this.load.name}: No audio listener set.`);if(this.loadedSounds.some(t=>t.name===e))return void console.warn(`${this.load.name}: Sound with name '${e}' is already loaded.`);const r=s?new THREE.PositionalAudio(this.listener):new THREE.Audio(this.listener);this.loader.load(t,t=>{r.setBuffer(t),r.setLoop(o),r.setVolume(0),r instanceof THREE.PositionalAudio&&this.setPositionalSoundCfg(r),this.loadedSounds.push({name:e,audio:r,volume:n,fade:i,loop:o}),s&&this.attachSoundTo(e,s),this.events.audioLoaded({type:"AUDIO_LOADED",soundName:e}),a&&this.play({name:e})},void 0,e=>{throw new Error(`Audio loading error for ${t}: ${e}`)})}load({name:e,url:t,object:s,volume:n=0,fade:i=2,loop:o=!0}){this.loadSound({name:e,url:t,object:s,volume:n,fade:i,loop:o})}loadAndPlay({name:e,url:t,object:s,volume:n=0,fade:i=2,loop:o=!0}){let a=this.loadAndPlay.name;if(!this.listener)return void console.warn(`${a}: No audio listener set.`);const r=()=>{this.loadSound({name:e,url:t,object:s,volume:n,fade:i,loop:o},!0)};"suspended"===this.ctx.state||"running"===this.ctx.state?this.ctx.resume().then(()=>{setTimeout(()=>{r()},this.params.delayPlaySound)}).catch(e=>{throw new Error(`Audio API resume error: ${e}`)}):r()}play({name:e}){let t=this.play.name;if("suspended"===this.ctx.state)return void this.ctx.resume().then(()=>this.play({name:e})).catch(e=>{throw new Error(`Audio API resume error: ${e}`)});if("running"!==this.ctx.state)return void console.warn(`${t}: AudioContext is not running.`);const s=this.loadedSounds.find(t=>t.name===e);if(!s)return void console.warn(`${t}: Sound with name '${e}' is not loaded.`);if(s.audio.isPlaying)return;s.audio.play();const n={value:0};gsap.gsap.to(n,{duration:s.fade,value:s.volume,ease:"power1.in",onUpdate:()=>{s.audio.setVolume(n.value)}})}resume(){"suspended"===this.ctx.state&&this.ctx.resume().catch(e=>{throw new Error(`Audio API resume error: ${e}`)})}setAttribute({name:e,attribute:t,duration:s,value:n}){if("running"!==this.ctx.state)return void console.warn("AudioContext is not running.");const i=this.loadedSounds.find(t=>t.name===e);i?gsap.gsap.to(i.audio,{duration:s,[t]:n,ease:"power1.inOut"}):console.warn(`Sound '${e}' not found.`)}setAudioContext({state:e}){if(!this.ctx)return void console.warn("AudioContext does not exist.");const t=this.ctx.state;if(this.ctx.state!==e)switch(e){case"running":"suspended"===t&&this.ctx.resume().catch(e=>{throw new Error(`Error resuming context: ${e}`)});break;case"suspended":"running"===t&&this.ctx.suspend().catch(e=>{throw new Error(`Error suspending context: ${e}`)});break;case"closed":"closed"!==t&&this.ctx.close().catch(e=>{throw new Error(`Error closing context: ${e}`)});break;default:throw new Error(`Unknown AudioContext state: ${e}`)}}setListener({object:e}){const t="string"==typeof e?this.engine.scene.getObjectByName(e):e.obj;if(!t)return void console.warn(`${this.setListener.name}: Listener object not found.`);const s=new THREE.AudioListener;t.add(s),this.listener=s}setAllPositionalSoundsCfg(){for(const e of this.loadedSounds)e.audio instanceof THREE.PositionalAudio&&this.setPositionalSoundCfg(e.audio)}setPositionalSoundCfg(e){e.setRefDistance(this.params.refDistance),e.setRolloffFactor(this.params.rolloffFactor),e.setMaxDistance(this.params.maxDistance),e.setDistanceModel(this.params.distanceModel),e.setDirectionalCone(this.params.coneInnerAngle,this.params.coneOuterAngle,this.params.coneOuterGain)}set(e){let t=!1;void 0!==e.delayPlaySound&&(this.params.delayPlaySound=e.delayPlaySound),void 0!==e.refDistance&&(this.params.refDistance=e.refDistance,t=!0),void 0!==e.rolloffFactor&&(this.params.rolloffFactor=e.rolloffFactor,t=!0),void 0!==e.maxDistance&&(this.params.maxDistance=e.maxDistance,t=!0),void 0!==e.distanceModel&&(this.params.distanceModel=e.distanceModel,t=!0),void 0!==e.coneInnerAngle&&(this.params.coneInnerAngle=e.coneInnerAngle,t=!0),void 0!==e.coneOuterAngle&&(this.params.coneOuterAngle=e.coneOuterAngle,t=!0),void 0!==e.coneOuterGain&&(this.params.coneOuterGain=e.coneOuterGain,t=!0),t&&this.setAllPositionalSoundsCfg()}stop({name:e}){let t=this.stop.name;if("running"!==this.ctx.state)return void console.warn(`${t}: AudioContext is not running.`);const s=this.loadedSounds.find(t=>t.name===e);if(!s)return void console.warn(`${t}: Sound '${e}' not found.`);const n={value:s.audio.getVolume()};gsap.gsap.to(n,{duration:s.fade,value:0,ease:"power1.inOut",onUpdate:()=>{s.audio.setVolume(n.value)},onComplete:()=>{s.audio.stop()}})}use(e){e(this)}},ActionObserver=class{mixer;items=new Map;constructor(e){this.mixer=e,this.mixer.addEventListener("finished",this.onFinished)}dispose(){this.mixer.removeEventListener("finished",this.onFinished),this.items.clear()}add(e,t,s,n={}){this.items.set(e,{clipName:t,action:e,objName:s,hooks:n,started:!1,completed:!1})}has(e){return this.items.has(e)}update(){for(const e of this.items.values()){const t=e.action;!t.enabled||t.paused||t.weight<=0||(e.started||(e.started=!0,e.hooks.onStart?.()),e.hooks.onUpdate?.())}}onFinished=e=>{const t=e.action,s=this.items.get(t);s&&(s.completed||(s.completed=!0,1===e.direction?s.hooks.onComplete?.():-1===e.direction&&s.hooks.onReverseComplete?.(),this.items.delete(t)))}},progressbar_default=':host {\r\n position: absolute;\r\n display: block;\r\n top: 50%; left: 50%;\r\n width: 25%; height: 5px;\r\n transform: translate(-50%, -50%);\r\n background: #ffffff30;\r\n border-radius: 3px;\r\n pointer-events: none;\r\n z-index: 1;\r\n overflow: hidden;\r\n}\r\n\r\n#bar {\r\n position: relative;\r\n width: 0%; height: 100%;\r\n background: #F40B57;\r\n border-radius: 3px;\r\n transition: width 0.3s ease-in;\r\n overflow: hidden;\r\n}\r\n\r\n#bar::after {\r\n content: "";\r\n position: absolute;\r\n top: 0;\r\n left: -40%;\r\n width: 40%;\r\n height: 100%;\r\n\r\n background: linear-gradient(\r\n 90deg,\r\n transparent,\r\n rgba(255, 255, 255, 0.5),\r\n transparent\r\n );\r\n\r\n animation: progress-active 1s linear infinite;\r\n}\r\n\r\n@keyframes progress-active {\r\n from {\r\n transform: translateX(0);\r\n }\r\n to {\r\n transform: translateX(350%);\r\n }\r\n}',ProgressBar=class extends HTMLElement{bar;events;constructor(){super();const e=this.attachShadow({mode:"closed"}),t=document.createElement("div");t.id="bar";const s=document.createElement("style");s.textContent=progressbar_default,e.append(s,t),this.bar=t}setProgress(e){this.bar.style.width=e+"%",e>=100&&setTimeout(()=>{if("100%"===this.bar.style.width){const e=t=>{t.target===this&&"opacity"===t.propertyName&&(this.events.send({type:"PROGRESSBAR_HIDDEN"},"Progress bar finished hiding."),this.removeEventListener("transitionend",e),this.remove())};this.addEventListener("transitionend",e),this.style.transition="opacity 0.3s ease",this.style.opacity="0"}},300)}},TAG="ilu-progressbar";function loadProgressBar(e,t){const s=document.createElement(TAG);return s.events=t,e.appendChild(s),s}customElements.get(TAG)||customElements.define(TAG,ProgressBar);var infobox_default=":host {\r\n z-index: 999;\r\n position: absolute;\r\n left: 8px; top: 8px;\r\n font-family: monospace;\r\n font-size: 12px;\r\n color: #ffffff;\r\n pointer-events: none;\r\n}\r\n\r\n#infobox {\r\n padding: 8px;\r\n border-radius: 8px;\r\n background: hsla(230, 25%, 16%, 1.00);\r\n box-sizing: border-box;\r\n}\r\n\r\n.row {\r\n display: flex;\r\n justify-content: space-between;\r\n gap: 1em;\r\n line-height: 1.45;\r\n white-space: nowrap;\r\n}\r\n\r\n.label {\r\n opacity: 0.75;\r\n}\r\n\r\n.value {\r\n text-align: right;\r\n}\r\n\r\n.separator {\r\n height: 1px;\r\n margin: 5px 0;\r\n background: rgba(255, 255, 255, 0.18);\r\n}",InfoBox=class extends HTMLElement{cfg;rendererApi="WebGL";values=new Map;timeBegin=0;timeLastFrame=0;timeFrameMs=0;timeCpuMs=0;fps=0;timeLastUpdate=0;updateInterval=100;constructor(){super();const e=this.attachShadow({mode:"closed"}),t=document.createElement("style");t.textContent=infobox_default;const s=document.createElement("div");s.id="infobox",this.addRow(s,"Api","api"),this.addSeparator(s),this.addRow(s,"Fps","fps"),this.addRow(s,"Cpu","cpu"),this.addRow(s,"Frame","frame"),this.addSeparator(s),this.addRow(s,"Calls","calls"),this.addRow(s,"Triangles","triangles"),this.addRow(s,"Lines","lines"),this.addRow(s,"Points","points"),this.addSeparator(s),this.addRow(s,"Geometries","geometries"),this.addRow(s,"Textures","textures"),this.addRow(s,"Programs","programs"),e.append(t,s)}applyCfg(){this.setValue("api",this.rendererApi);const e=this.cfg?.gui.infoBox;e&&(this.setVisible("fps",e.fps),this.setVisible("cpu",e.cpu),this.setVisible("frame",e.frame),this.setVisible("calls",e.calls),this.setVisible("triangles",e.triangles),this.setVisible("lines",e.lines),this.setVisible("points",e.points),this.setVisible("geometries",e.geometries),this.setVisible("textures",e.textures),this.setVisible("programs",e.programs),this.updateInterval=1e3/Math.max(1,e.logsPerSecond))}begin(e){this.timeLastFrame>0&&(this.timeFrameMs=e-this.timeLastFrame,this.timeFrameMs>0&&(this.fps=1e3/this.timeFrameMs)),this.timeLastFrame=e,this.timeBegin=e}end(e,t){if(this.timeCpuMs=e-this.timeBegin,e-this.timeLastUpdate<this.updateInterval)return;this.timeLastUpdate=e;const s=t.info,n=Array.isArray(s.programs)?s.programs.length:s.memory.programs??0;this.setValue("fps",this.fps.toFixed(0)),this.setValue("cpu",`${this.timeCpuMs.toFixed(2)} ms`),this.setValue("frame",`${this.timeFrameMs.toFixed(2)} ms`),this.setValue("calls",String(s.render.drawCalls??s.render.calls??0)),this.setValue("triangles",this.formatNumber(s.render.triangles??0)),this.setValue("lines",this.formatNumber(s.render.lines??0)),this.setValue("points",this.formatNumber(s.render.points??0)),this.setValue("geometries",String(s.memory.geometries??0)),this.setValue("textures",String(s.memory.textures??0)),this.setValue("programs",String(n))}setUpdateInterval(e){this.updateInterval=Math.max(0,e)}addRow(e,t,s){const n=document.createElement("div");n.className="row";const i=document.createElement("span");i.className="label",i.textContent=t;const o=document.createElement("span");o.className="value",o.textContent="-",n.append(i,o),e.appendChild(n),this.values.set(s,o)}addSeparator(e){const t=document.createElement("div");t.className="separator",e.appendChild(t)}setValue(e,t){const s=this.values.get(e);s&&(s.textContent=t)}setVisible(e,t){const s=this.values.get(e);s?.parentElement&&(s.parentElement.style.display=t?"":"none")}formatNumber(e){return Math.round(e).toLocaleString("de-DE")}};function loadInfoBox(e,t){const s="ilu-infobox";customElements.get(s)||customElements.define(s,InfoBox);const n=document.createElement(s);return n.cfg=e,n.rendererApi=t,n.applyCfg(),document.body.appendChild(n),n}var Engine=class{scene;cam3D;events;modules;comps;objs3D;cfg;infoBox=null;actionObserver=null;objActions=new Map;gltf=null;mixer=null;callbacks=[];canvas;composer=null;renderer;renderPipeline=null;sceneReady;rendererReady=null;fxaaPass=null;outputPass=null;renderPass=null;smaaPass=null;tslPass=null;ssaoPass=null;gtaoNode=null;ssrPass=null;ssrNode=null;groundReflector=null;reflectivesSSR=[];ambientLight=null;hemisphereLight=null;powerMode="Low";postNoise=!0;dTs=[];dT=0;dTFrameMax=0;gpuFps=0;timeGsap=0;timeLast=-1;timeLastFrame=0;resizeTimeout=null;resizeDelay=100;constructor(e,t,s,n,i,o,a){this.canvas=t,this.cam3D=e,this.comps=n,this.events=i,this.objs3D=a,this.modules=o,this.cfg=s,this.scene=new THREE.Scene,this.scene.backgroundBlurriness=this.cfg.envCtrls.backgroundBlurriness,this.scene.backgroundIntensity=this.cfg.envCtrls.backgroundIntensity,this.scene.environmentIntensity=this.cfg.envCtrls.environmentIntensity,this.scene.add(this.cam3D.obj);const r=this.modules.webGpuRendererClass;if(r){const e={...this.cfg.render.params,...this.cfg.render.webgpu.params};this.renderer=new r(e),this.rendererReady=this.initWebGpuRenderer(),"none"!==this.cfg.debug.log&&console.log("WebGPU Renderer")}else{const e={...this.cfg.render.params,...this.cfg.render.webgl.params};this.renderer=new THREE.WebGLRenderer(e),this.rendererReady=Promise.resolve(),"none"!==this.cfg.debug.log&&console.log(this.renderer.getContext().getParameter(this.renderer.getContext().VERSION))}const l=this.canvas.getBoundingClientRect();this.renderer.setPixelRatio(this.cfg.render.pixelRatio),this.renderer.setSize(l.width,l.height,!1),this.renderer.shadowMap.enabled=this.cfg.render.shadowMapEnabled,this.renderer.shadowMap.type=this.cfg.render.shadowMapType,this.renderer.toneMapping=this.cfg.render.toneMapping,this.renderer.toneMappingExposure=this.cfg.render.toneMappingExposure,this.renderer.outputColorSpace=this.cfg.render.outputColorSpace,this.cfg.model.file?this.sceneReady=this.loadScene(this.cfg.model.file):this.sceneReady=Promise.resolve();const c=this.renderer.domElement;c.style.display="block",c.style.width="100%",c.style.height="100%",c.style.boxSizing="border-box",this.canvas.tabIndex=0,this.canvas.addEventListener("click",e=>{this.canvas.focus(),this.events.send({type:"CANVAS_CLICK",event:e})}),this.canvas.addEventListener("pointerleave",e=>{this.events.send({type:"CANVAS_POINTER_LEAVE",event:e})}),this.canvas.addEventListener("pointerenter",e=>{this.events.send({type:"CANVAS_POINTER_ENTER",event:e})}),this.canvas.addEventListener("keydown",e=>{this.events.send({type:"CANVAS_KEY_DOWN",event:e})}),this.canvas.addEventListener("keyup",e=>{this.events.send({type:"CANVAS_KEY_UP",event:e})}),this.canvas.prepend(this.renderer.domElement);for(const e of a.values())e instanceof Mesh3D?(e.setReflectivesSSR(this.reflectivesSSR),e.start(this.renderer,this.scene),e.groundReflector&&(this.groundReflector=e.groundReflector)):e.start(this.renderer,this.scene);if(this.cfg.gui.infoBox.enable&&(loadInfoBox(this.cfg,r?"WebGPU":"WebGL"),this.infoBox=document.querySelector("ilu-infobox"),this.renderer.info.autoReset=!1),this.isPostCfg()){const e=this.modules.gpuTier;"none"!==this.cfg.debug.log&&console.log(JSON.stringify(e)),"number"==typeof e?.fps&&(this.gpuFps=e.fps)}this.dTFrameMax=1/this.cfg.render.fpsMax,this.timeLastFrame=performance.now()/1e3,this.cfg.scene.fog.enable&&this.setFog({color:this.cfg.scene.fog.color,near:this.cfg.scene.fog.near,far:this.cfg.scene.fog.far}),this.cfg.scene.ambientlight.enable&&this.setAmbientLight({color:this.cfg.scene.ambientlight.color,intensity:this.cfg.scene.ambientlight.intensity}),this.cfg.scene.hemisphere.enable&&this.setHemisphereLight({skyColor:this.cfg.scene.hemisphere.skyColor,groundColor:this.cfg.scene.hemisphere.groundColor,intensity:this.cfg.scene.hemisphere.intensity}),this.updateCanvasResize(),window.addEventListener("resize",()=>{this.resizeTimeout&&clearTimeout(this.resizeTimeout),this.resizeTimeout=setTimeout(()=>{!1===this.cfg.render.autoResize?this.events.windowResize({type:"WINDOW_RESIZE"}):this.updateCanvasResize()},this.resizeDelay)}),gsap.gsap.ticker.remove(gsap.gsap.updateRoot),gsap.gsap.ticker.lagSmoothing(0)}init(){this.isPostEnabled()?this.modules.webGpuRendererClass?(this.setPostWebGpu(this.cfg.post.aa.mode,this.cfg.post.ssao.enable,this.cfg.post.ssr.enable),this.renderPipeline?.render()):(this.setPostWebGl(),this.composer?.render()):this.renderer.render(this.scene,this.cam3D.obj),this.events.send({type:"SCENE_RENDERED"},"Scene first time rendered."),this.setAnimationLoop()}async initWebGpuRenderer(){await this.renderer.init()}addActionToObj(e,t,s,n){let i=this.objActions.get(e);i||(i=new Map,this.objActions.set(e,i)),i.delete(t),i.set(t,{blendMode:s,finishMode:n})}addOnFrameUpdate(e){this.callbacks.push(e)}animCamCurveToTarget({camTarget:e,aimTarget:t,radiusOut:s=1,duration:n=2,ease:i="power1.inOut"}){const o=this.animCamCurveToTarget.name,a=e=>{for(;e>Math.PI;)e-=2*Math.PI;for(;e<-Math.PI;)e+=2*Math.PI;return e},r=e=>{if("string"==typeof e){const t=this.scene.getObjectByName(e);return t?t.getWorldPosition(new THREE.Vector3):(console.warn(`${o}: Object with name "${e}" not found.`),null)}return e instanceof Obj3D?e.obj?e.obj.getWorldPosition(new THREE.Vector3):(console.warn(`${o}: Obj3D not found.`),null):e instanceof THREE.Vector3?e.clone():(console.warn(`${o}: Invalid target.`),null)},l=e=>{const t=Math.max(e.length(),1e-4);return{radius:t,lat:Math.asin(THREE.MathUtils.clamp(e.y/t,-1,1)),lon:Math.atan2(e.x,e.z)}};this.cam3D.lookMode="target";const c=this.cam3D.objTarget.position.clone(),d=r(e);if(!d)return void console.warn(`Camera object with name "${e}" was not found.`);const h=t?r(t):c;if(!h)return void console.warn(`Aim object with name "${t}" was not found.`);const m=this.cam3D.obj.getWorldPosition(new THREE.Vector3).clone().sub(c),p=d.clone().sub(h),u=l(m),g=l(p),b=u.lat,f=g.lat,v=a(u.lon),C=a(a(g.lon)-v),y=u.radius,w=g.radius,T=Math.max(y,w)*s,L={t:0};gsap.gsap.to(L,{t:1,duration:n,ease:i,onStart:()=>{this.events.anim({type:"ANIM_START",objName:"Camera",fct:o})},onUpdate:()=>{const e=L.t,t=c.clone().lerp(h,e),s=THREE.MathUtils.lerp(b,f,e),n=a(v+C*e),i=THREE.MathUtils.lerp(y,w,e),o=Math.sin(Math.PI*e)*T,r=((e,t,s)=>{const n=Math.cos(t);return new THREE.Vector3(e*n*Math.sin(s),e*Math.sin(t),e*n*Math.cos(s))})(Math.max(1e-4,i+o),s,n),l=t.clone().add(r);this.cam3D.obj.position.copy(l),this.cam3D.objTarget.position.copy(t)},onComplete:()=>{this.events.anim({type:"ANIM_COMPLETE",objName:"Camera",fct:o})}})}animCamToObj({target:e,duration:t=1,ease:s="power2.inOut",dist:n=1.25}){const i="animCamToObj";this.cam3D.lookMode="target";const o=(e=>{if("string"==typeof e){const t=this.scene.getObjectByName(e);return t||(console.warn(`${i}: Object with name "${e}" not found.`),null)}return e instanceof Obj3D?e.obj?e.obj:(console.warn(`${i}: Obj3D object not found.`),null):(console.warn(`${i}: Invalid target.`),null)})(e);if(!o)return;const a=((e,t)=>{const s=(new THREE.Box3).setFromObject(e,!0);if(s.isEmpty())return console.warn(`${i}: Object bounding box is empty.`),null;const n=s.getBoundingSphere(new THREE.Sphere),o=this.cam3D.obj,a=THREE.MathUtils.degToRad(o.fov),r=2*Math.atan(Math.tan(a/2)*o.aspect),l=Math.min(a,r),c=n.radius/Math.sin(l/2)*t;return{center:n.center.clone(),camDistance:c}})(o,n);if(!a)return;const r=a.center,l=this.cam3D.objTarget.position.clone(),c=this.cam3D.obj.position.clone(),d=c.clone().sub(r);0===d.lengthSq()&&d.set(0,0,1);const h=r.clone().add(d.normalize().multiplyScalar(a.camDistance)),m={t:0};gsap.gsap.to(m,{t:1,duration:t,ease:s,onStart:()=>{this.events.anim({type:"ANIM_START",objName:"Camera",fct:i})},onUpdate:()=>{const e=m.t,t=l.clone().lerp(r,e),s=c.clone().lerp(h,e);this.cam3D.obj.position.copy(s),this.cam3D.objTarget.position.copy(t)},onComplete:()=>{this.cam3D.obj.position.copy(h),this.cam3D.objTarget.position.copy(r),this.events.anim({type:"ANIM_COMPLETE",objName:"Camera",fct:i})}})}animMaterialColor({mesh:e,duration:t=0,ease:s="power1.inOut",...n}){let i=this.animMaterialColor.name;if(!e)return void console.warn(`${i}: Missing object name`);const o=this.scene.getObjectByName(e);if(!o)return void console.warn(`${i}: Object with name "${e}" not found.`);if(!("material"in o)||!o.material)return void console.warn(`${i}: Object "${e}" has no material.`);const a=o.material,r=Object.keys(n);0!==r.length?r.forEach(o=>{const r=n[o];if(!(o in a)||!a[o].isColor)return void console.warn(`${i}: Material property "${o}" is not a color.`);if(null==r)return void console.warn(`${i}: Color value for "${o}" is null or undefined.`);const l=a[o],c=new THREE.Color(r);gsap.gsap.to(l,{r:c.r,g:c.g,b:c.b,duration:t,ease:s,onStart:()=>{this.events.animFade({type:"ANIM_FADE_START",objName:e,fct:i,property:o,value:l.getHexString()})},onUpdate:()=>{a[o].copy(l),a.needsUpdate=!0},onComplete:()=>{this.events.animFade({type:"ANIM_FADE_COMPLETE",objName:e,fct:i,property:o,value:l.getHexString()})}})}):console.warn(`${i}: No color property provided to animate.`)}animMaterialNumeric({mesh:e,startValue:t=null,infinite:s=!1,duration:n=0,ease:i="power1.inOut",...o}){let a=this.animMaterialNumeric.name;if(!e)return void console.warn(`${a}: Missing object name.`);const r=this.scene.getObjectByName(e);if(!r)return void console.warn(`${a}: Object with name "${e}" not found.`);if(!("material"in r)||!r.material)return void console.warn(`${a}: Object "${e}" has no material.`);const l=r.material,c=Object.keys(o);if(0===c.length)return void console.warn(`${a}: No property provided to animate.`);const d=c[0],h=o[d];if(!(d in l))return void console.warn(`${a}: Material property "${d}" does not exist.`);const m=l[d];if("number"!=typeof m)return void console.warn(`${a}: Material property "${d}" is not a number.`);if(null==h||"number"!=typeof h)return void console.warn(`${a}: Material property "${d}" endValue is null or undefined or not a number.`);const p={[d]:null===t?m:t};gsap.gsap.to(p,{[d]:h,duration:n,delay:0,ease:i,repeat:s?-1:0,onStart:()=>{this.events.animFade({type:"ANIM_FADE_START",objName:e,fct:a,property:d,value:p[d]})},onUpdate:()=>{l[d]=p[d],l.needsUpdate=!0},onComplete:()=>{this.events.animFade({type:"ANIM_FADE_COMPLETE",objName:e,fct:a,property:d,value:p[d]})}})}calcEaseArea(e){const t=gsap.gsap.parseEase(e);return function(e=100){let s=0;for(let n=0;n<=e;n++){s+=t(n/e)}return s/e}()}stopObjActions(e,t,s,n=0){const i=this.objActions.get(e);if(!i)return!1;let o=!1;for(const e of[...i.keys()].reverse())if(e!==s&&e.enabled&&!(e.getEffectiveWeight()<=0)){if("none"===t)return!0;if(n>0?e.fadeOut(n):e.enabled=!1,"last"===t)return!0;o=!0}return o}finishAction(e,t,s){"hold"!==t&&(s>0?e.fadeOut(s):e.enabled=!1)}async enableAaMode(e){this.modules.webGpuRendererClass?("fxaa"===e?await this.modules.importFXAANode("fxaa"):"smaa"===e&&await this.modules.importSMAANode("smaa"),this.setPostWebGpu(e,this.cfg.post.ssao.enable,this.cfg.post.ssr.enable),this.cfg.post.aa.mode=e):(this.fxaaPass||"fxaa"!==e?this.smaaPass||"smaa"!==e||await this.modules.importSMAAPass("smaa"):await this.modules.importFXAAShader("fxaa"),this.setPostWebGl())}async enableSsao(e){this.modules.webGpuRendererClass?(await this.modules.importGtaoNode(e),this.setPostWebGpu(this.cfg.post.aa.mode,e,this.cfg.post.ssr.enable),this.cfg.post.ssao.enable=e):(this.cfg.post.ssao.enable=e,this.ssaoPass||await this.modules.importSSAOPass(e),this.setPostWebGl())}async enableSsr(e){this.modules.webGpuRendererClass?(await this.modules.importSsrNode(e),this.setPostWebGpu(this.cfg.post.aa.mode,this.cfg.post.ssao.enable,e),this.cfg.post.ssr.enable=e):(this.cfg.post.ssr.enable=e,e?this.ssrPass||await this.modules.importSsrPass(e):this.groundReflector&&(this.groundReflector.visible=!1),this.setPostWebGl())}isPostCfg(){return this.cfg.post.ssao.enable||this.cfg.post.ssr.enable||"none"!==this.cfg.post.aa.mode}isPostEnabled(){let e=this.isPostCfg(),t=this.isPostGpu();return e&&t&&this.postNoise}isPostGpu(){return!(this.gpuFps<50)}async loadScene(e){const t=this.modules.gltfLoader;if(!t)return void console.warn("Three.js GLTFLoader could not be started.");if("ktx2"===this.cfg.model.compress.texture){const e=this.modules.ktx2Loader;e?(await this.rendererReady,e.setTranscoderPath("ktx2/").detectSupport(this.renderer),t.setKTX2Loader(e)):console.warn("KTX2Loader not imported.")}"draco"===this.cfg.model.compress.mesh?this.modules.dracoLoader?this.cfg.model.decoderPath?(this.modules.dracoLoader.setDecoderPath(this.cfg.model.decoderPath),t.setDRACOLoader(this.modules.dracoLoader)):console.warn("Draco decoderPath is empty."):console.warn("DRACOLoader not imported."):"meshopt"===this.cfg.model.compress.mesh&&(this.modules.meshoptDecoder?t.setMeshoptDecoder(this.modules.meshoptDecoder):console.warn("MeshoptDecoder not imported."));let s=null;return this.cfg.model.progressBar&&(s=loadProgressBar(this.canvas,this.events)),new Promise((n,i)=>{t.load(e,e=>{this.gltf=e,this.scene.add(e.scene),this.objActions.clear(),e.animations&&e.animations.length>0&&(this.mixer=new THREE.AnimationMixer(e.scene),this.actionObserver=new ActionObserver(this.mixer)),e.scene.traverse(e=>{const t=this.objs3D.get(e.name);e instanceof THREE.Mesh?(e.castShadow=this.cfg.mesh.castShadow,e.receiveShadow=this.cfg.mesh.receiveShadow,e.frustumCulled=this.cfg.mesh.frustumCulled,t instanceof Mesh3D?(t.traverse(e),!this.groundReflector&&t.groundReflector&&(this.groundReflector=t.groundReflector)):e.material instanceof THREE.MeshStandardMaterial&&e.material.roughness<this.cfg.post.webgl.ssr.maxRoughness&&this.reflectivesSSR.push(e)):e instanceof THREE.Light?(e.castShadow=this.cfg.light.castShadow,(e instanceof THREE.DirectionalLight||e instanceof THREE.SpotLight||e instanceof THREE.PointLight)&&(e.shadow.mapSize.width=this.cfg.light.mapWidth,e.shadow.mapSize.height=this.cfg.light.mapHeight,e.shadow.bias=this.cfg.light.bias,e.shadow.normalBias=this.cfg.light.normalBias,(e.shadow.camera instanceof THREE.PerspectiveCamera||e.shadow.camera instanceof THREE.OrthographicCamera)&&(e.shadow.camera.near=this.cfg.light.near,e.shadow.camera.far=this.cfg.light.far)),t instanceof Light3D&&t.traverse(e)):e instanceof THREE.Camera?this.cam3D.traverse(e):e instanceof THREE.Object3D&&t instanceof Obj3D&&t.traverse(e)}),s?.setProgress(100),n()},e=>{if(e.total>0){const t=e.loaded/e.total,n=Math.round(90*t);n<90&&s?.setProgress(n);const i=Math.round(100*t);this.events.modelLoading({type:"MODEL_LOADING",loading:i})}else this.events.modelLoading({type:"MODEL_LOADING",loading:0})},e=>{const t=e instanceof Error?e:new Error(String(e));this.events.modelError({type:"MODEL_ERROR",error:t}),i(e)})})}playClip({obj:e,clip:t,blendMode:s="normal",finishMode:n="hold",loop:i=1,stopMode:o="all",fadeDuration:a=0,fadeDurationFinish:r=0,reverse:l=!1,reset:c=!1,startSpeed:d=0,endSpeed:h=1,duration:m=0,ease:p="power1.inOut"}){const u=this.playClip.name;if(!e)return void console.warn(`${u}: Missing objectname.`);if(!t)return void console.warn(`${u}: Missing clipname.`);if("infinite"!==i&&(!Number.isInteger(i)||i<1))return void console.warn(`${u}: loop must be a positive integer or "infinite".`);if(!this.gltf?.animations?.length)return void console.warn(`${u}: gltf has no animations.`);const g=THREE.AnimationClip.findByName(this.gltf.animations,t);if(!g)return void console.warn(`${u}: ClipAnimation "${t}" not found`);if(!this.mixer)return void console.warn(`${u}: Mixer not found.`);const b="additive"===s?THREE.AdditiveAnimationBlendMode:THREE.NormalAnimationBlendMode,f=this.mixer.clipAction(g,void 0,b);if(!f)return void console.warn(`${u}: Could not create or find action for clip`);if(this.addActionToObj(e,f,s,n),c?(f.reset(),f.time=l?f.getClip().duration:0):(f.stopFading(),f.enabled=!0,f.paused=!1),f.setEffectiveWeight(1),"infinite"===i?(f.setLoop(THREE.LoopRepeat,1/0),f.clampWhenFinished=!1):1===i?(f.setLoop(THREE.LoopOnce,1),f.clampWhenFinished=!0):(f.setLoop(THREE.LoopRepeat,i),f.clampWhenFinished=!0),m>0){f.timeScale=l?-d:d;const e={timeScale:d};gsap.gsap.to(e,{id:t,timeScale:l?-h:h,duration:m,delay:0,ease:p,onStart:()=>{this.events.clip({type:"CLIP_START",clipName:t,fct:u,action:f}),this.events.clipFade({type:"CLIP_FADE_START",clipName:t,fct:u,action:f})},onComplete:()=>{this.events.clipFade({type:"CLIP_FADE_COMPLETE",clipName:t,fct:u,action:f})},onUpdate:()=>{f.timeScale=e.timeScale},onReverseComplete:()=>{this.events.clipFade({type:"CLIP_FADE_COMPLETE",clipName:t,fct:u,action:f})}})}else f.timeScale=l?-h:h;const v=this.stopObjActions(e,o,f,a);a>0&&v&&f.fadeIn(a),this.actionObserver&&this.actionObserver.add(f,t,e,{onStart:()=>{0==m&&this.events.clip({type:"CLIP_START",clipName:t,fct:u,action:f})},onComplete:()=>{this.finishAction(f,n,r),this.events.clip({type:"CLIP_COMPLETE",clipName:t,fct:u,action:f})},onReverseComplete:()=>{this.finishAction(f,n,r),this.events.clip({type:"CLIP_COMPLETE",clipName:t,fct:u,action:f})}}),f.play(),this.mixer.update(0)}playClipCam({obj:e,clip:t,blendMode:s="normal",loop:n=1,stopMode:i="all",fadeDuration:o=0,reverse:a=!1,reset:r=!1,startSpeed:l=0,endSpeed:c=1,duration:d=0,ease:h="power1.inOut"}){const m=this.playClipCam.name,p=this.cam3D.targetGltf,u=this.cam3D.objGltf;if(!p)return void console.warn(`${m}: Aim object not found.`);if(!u)return void console.warn(`${m}: Gltf object not found.`);if(!t)return void console.warn(`${m}: Missing clipname.`);if("infinite"!==n&&(!Number.isInteger(n)||n<1))return void console.warn(`${m}: loop must be a positive integer or "infinite".`);if(!this.gltf?.animations?.length)return void console.warn(`${m}: gltf has no animations.`);const g=THREE.AnimationClip.findByName(this.gltf.animations,t);if(!g)return void console.warn(`${m}: ClipAnimation "${t}" not found`);if(!this.mixer)return void console.warn(`${m}: Mixer not found.`);const b="additive"===s?THREE.AdditiveAnimationBlendMode:THREE.NormalAnimationBlendMode,f=this.mixer.clipAction(g,void 0,b);if(!f)return void console.warn(`${m}: Could not create or find action for clip`);this.addActionToObj(e,f,s,"hold"),r?(f.reset(),f.time=a?f.getClip().duration:0):(f.stopFading(),f.enabled=!0,f.paused=!1),f.setEffectiveWeight(1),"infinite"===n?(f.setLoop(THREE.LoopRepeat,1/0),f.clampWhenFinished=!1):1===n?(f.setLoop(THREE.LoopOnce,1),f.clampWhenFinished=!0):(f.setLoop(THREE.LoopRepeat,n),f.clampWhenFinished=!0),d>0?(f.timeScale=a?-l:l,gsap.gsap.to(f,{id:t,timeScale:a?-c:c,duration:d,delay:0,ease:h,onStart:()=>{this.events.clip({type:"CLIP_START",clipName:t,fct:m,action:f}),this.events.clipFade({type:"CLIP_FADE_START",clipName:t,fct:m,action:f})},onComplete:()=>{this.events.clipFade({type:"CLIP_FADE_COMPLETE",clipName:t,fct:m,action:f})},onReverseComplete:()=>{this.events.clipFade({type:"CLIP_FADE_COMPLETE",clipName:t,fct:m,action:f})}})):f.timeScale=a?-c:c;const v=this.stopObjActions(e,i,f,o);o>0&&v&&f.fadeIn(o),this.cam3D.lookMode="target";const C=new THREE.Vector3,y=new THREE.Vector3,w=()=>{this.cam3D.obj.position.copy(u.getWorldPosition(C)),this.cam3D.objTarget.position.copy(p.getWorldPosition(y))};this.actionObserver&&this.actionObserver.add(f,t,"Camera",{onStart:()=>{0==d&&this.events.clip({type:"CLIP_START",clipName:t,fct:m,action:f})},onUpdate:w,onComplete:()=>{this.events.clip({type:"CLIP_COMPLETE",clipName:t,fct:m,action:f})},onReverseComplete:()=>{this.events.clip({type:"CLIP_COMPLETE",clipName:t,fct:m,action:f})}}),f.play(),this.mixer.update(0),w()}removeAmbientLight(){this.ambientLight&&(this.scene.remove(this.ambientLight),this.ambientLight.dispose(),this.ambientLight=null)}removeFog(){this.scene.fog&&(this.scene.fog=null)}removeHemisphereLight(){this.hemisphereLight&&(this.scene.remove(this.hemisphereLight),this.hemisphereLight.dispose(),this.hemisphereLight=null)}removeOnFrameUpdate(e){this.callbacks=this.callbacks.filter(t=>t!==e)}setAmbientLight({color:e,intensity:t}){if(!this.ambientLight){if(void 0===e||void 0===t)return;return this.ambientLight=new THREE.AmbientLight(e,t),void this.scene.add(this.ambientLight)}void 0!==e&&this.ambientLight.color.set(e),void 0!==t&&(this.ambientLight.intensity=t)}setAnimationLoop(){this.renderer.setAnimationLoop(e=>this.update(e))}setFog({color:e,near:t,far:s}){if(this.scene.fog)void 0!==e&&this.scene.fog.color.set(e),this.scene.fog instanceof THREE.Fog&&(void 0!==t&&(this.scene.fog.near=t),void 0!==s&&(this.scene.fog.far=s));else{if(void 0===e||void 0===t||void 0===s)return;this.scene.fog=new THREE.Fog(e,t,s)}}setFxaaResolution(e){if(!this.fxaaPass)return;const t=this.renderer.getSize(new THREE.Vector2),s=this.renderer.getPixelRatio(),n=this.fxaaPass.material.uniforms;n.resolution.value.x=e/(t.x*s),n.resolution.value.y=e/(t.y*s)}setHemisphereLight({skyColor:e,groundColor:t,intensity:s}){if(!this.hemisphereLight){if(void 0===e||void 0===t||void 0===s)return;return this.hemisphereLight=new THREE.HemisphereLight(e,t,s),void this.scene.add(this.hemisphereLight)}void 0!==e&&this.hemisphereLight.color.set(e),void 0!==t&&this.hemisphereLight.groundColor.set(t),void 0!==s&&(this.hemisphereLight.intensity=s)}setMaterialProperties({obj:e,...t}){let s=this.setMaterialProperties.name;if(!e)return void console.warn(`${s}: Missing objName`);const n=this.scene.getObjectByName(e);if(!n)return void console.warn(`${s}: Object with name "${e}" not found.`);if(!("material"in n)||!n.material)return void console.warn(`${s}: Object "${e}" has no material.`);const i=n.material,o=Object.keys(t);if(0===o.length)return void console.warn(`${s}: No material properties provided.`);let a=null;for(const e of o){const n=t[e];if(("map"===e||"emissiveMap"===e)&&"string"==typeof n){a||(a=new THREE.TextureLoader),a.load(n,t=>{i[e]=t,i.needsUpdate=!0},void 0,t=>{console.error(`${s}: Failed to load texture "${n}" for "${e}":`,t)});continue}if(!(e in i)){console.warn(`${s}: Material property "${e}" does not exist.`);continue}const o=i[e];o instanceof THREE.Color?o.set(n):typeof o==typeof n?i[e]=n:console.warn(`${s}: Type mismatch for "${e}": expected ${typeof o}, got ${typeof n}`)}i.needsUpdate=!0}setPostWebGl(){if(!this.composer){const e=this.modules.effectComposerClass;e?this.renderer instanceof THREE.WebGLRenderer&&(this.composer=new e(this.renderer)):console.warn("EffectComposer could not be started.")}if(!this.composer)return;for(const e of this.composer.passes)e.dispose?.();this.composer.passes.length=0;const e=this.canvas.getBoundingClientRect();if(!this.renderPass){const e=this.modules.renderPassClass;e?this.renderPass=new e(this.scene,this.cam3D.obj):console.warn("Module Three.js RenderPass could not be imported.")}if(this.renderPass&&this.composer.addPass(this.renderPass),this.cfg.post.ssr.enable){if(!this.ssrPass)if(this.modules.ssrPassClass){this.groundReflector&&!this.groundReflector.parent&&this.scene.add(this.groundReflector);const t=this.cfg.post.webgl.ssr;this.ssrPass=new this.modules.ssrPassClass({renderer:this.renderer,scene:this.scene,camera:this.cam3D.obj,width:e.width,height:e.height,bouncing:t.bouncing,groundReflector:this.groundReflector,selects:t.selective?this.reflectivesSSR:null}),this.ssrPass&&(this.ssrPass.enabled=!0,this.ssrPass.clear=t.clear,this.ssrPass.selective=t.selective,this.ssrPass.fresnel=t.fresnel,this.ssrPass.distanceAttenuation=t.distanceAttenuation,this.ssrPass.infiniteThick=t.infiniteThick,this.ssrPass.maxDistance=t.maxDistance,this.ssrPass.opacity=t.opacity,this.ssrPass.thickness=t.thickness,this.ssrPass.resolutionScale=t.resolutionScale,this.ssrPass.blur=t.blur,this.ssrPass.output=t.output)}else console.warn("Module Three.js SSRPass could not be imported.");this.ssrPass&&this.composer.addPass(this.ssrPass)}this.cfg.post.ssao.enable&&(this.ssaoPass||(this.modules.ssaoPassClass?(this.ssaoPass=new this.modules.ssaoPassClass(this.scene,this.cam3D.obj,e.width,e.height),this.ssaoPass&&(this.ssaoPass.enabled=!0,this.ssaoPass.kernelRadius=this.cfg.post.webgl.ssao.kernelRadius,this.ssaoPass.minDistance=this.cfg.post.webgl.ssao.minDistance,this.ssaoPass.maxDistance=this.cfg.post.webgl.ssao.maxDistance)):console.warn("Module Three.js SSAOPass could not be imported.")),this.ssaoPass&&this.composer.addPass(this.ssaoPass));const t=this.cfg.post.aa;if("smaa"===t.mode&&(this.smaaPass||(this.modules.smaaPassClass?(this.smaaPass=new this.modules.smaaPassClass,this.smaaPass&&(this.smaaPass.enabled=!0)):console.warn("Module Three.js SMAAPass could not be imported.")),this.smaaPass&&this.composer.addPass(this.smaaPass)),!this.outputPass){const e=this.modules.outputPassClass;e?this.outputPass=new e:console.warn("Module Three.js OutputPass could not be imported.")}if(this.outputPass&&this.composer.addPass(this.outputPass),"fxaa"===t.mode){if(!this.fxaaPass){const e=this.modules.shaderPassClass;e&&this.modules.fxaaShader?(this.fxaaPass=new e(this.modules.fxaaShader),this.fxaaPass&&(this.fxaaPass.enabled=!0),this.setFxaaResolution(this.cfg.post.webgl.aa.fxaa.sharpness)):console.warn("Module Three.js FXAAShader could not be imported.")}this.fxaaPass&&this.composer.addPass(this.fxaaPass)}}setPostWebGpu(e,t,s){if(!this.renderPipeline){const e=this.modules.renderPipelineClass;if(e){const t=this.modules.webGpuRendererClass;t&&this.renderer instanceof t&&(this.renderPipeline=new e(this.renderer))}else console.warn("EffectComposer could not be started.")}if(!this.renderPipeline)return;const{tslPass:n,tslMrt:i,tslOutput:o,tslNormalView:a,tslMetalness:r,tslRoughness:l,tslSample:c,tslVec2:d,tslVec3:h,tslVec4:m,packNormalToRGB:p,unpackRGBToNormal:u}=this.modules;if(!(n&&i&&o&&a&&r&&l&&c&&d&&h&&m&&p&&u))return;this.tslPass||(this.tslPass=n(this.scene,this.cam3D.obj),this.tslPass.setMRT(i({output:o,normal:p(a),metalrough:d(r,l)})),this.tslPass.getTexture("normal").type=THREE.UnsignedByteType,this.tslPass.getTexture("metalrough").type=THREE.UnsignedByteType);const g=this.tslPass,b=g.getTextureNode("output"),f=g.getTextureNode("depth"),v=g.getTextureNode("normal"),C=g.getTextureNode("metalrough"),y=c(e=>u(v.sample(e)));let w=b;if(t)if(this.modules.gtaoNodeClass){if(!this.gtaoNode){const e=this.cfg.post.webgpu.ssao,t=this.modules.gtaoNodeClass(f,y,this.cam3D.obj);this.gtaoNode=t,t.radius.value=e.radius,t.thickness.value=e.thickness,t.distanceExponent.value=e.distanceExponent,t.distanceFallOff.value=e.distanceFallOff,t.scale.value=e.scale,t.samples.value=e.samples,t.resolutionScale=e.resolutionScale}if(this.gtaoNode){const e=this.gtaoNode.getTextureNode();w=w.mul(m(h(e.r),1))}}else console.warn("Module Three.js GTAONode could not be imported.");if(s)if(this.modules.ssrNode){if(!this.ssrNode){const e=this.cfg.post.webgpu.ssr,t=this.modules.ssrNode(b,f,y,{metalnessNode:C.r,roughnessNode:C.g,camera:this.cam3D.obj});this.ssrNode=t,t.quality.value=e.quality,t.blurQuality=e.blurQuality,t.maxDistance.value=e.maxDistance,t.intensity.value=e.intensity,t.thickness.value=e.thickness,t.resolutionScale=e.resolutionScale}this.ssrNode&&(w=w.add(m(this.ssrNode.rgb,0)))}else console.warn("Module Three.js SSRNode could not be imported.");if("smaa"===e&&this.modules.smaaNode){const e=this.modules.smaaNode(w);e?w=e.getTextureNode():console.warn("Module Three.js SMAANode could not be imported.")}if("fxaa"===e&&this.modules.fxaaNode){const e=this.modules.fxaaNode(w);e?w=e:console.warn("Module Three.js FXAANode could not be imported.")}this.renderPipeline.outputNode=w,this.renderPipeline.needsUpdate=!0}stopAnimClip({clipName:e,fadeOut:t=0,ease:s="power1.inOut"}){let n=this.stopAnimClip.name;if(!e)return void console.warn(`${n}: Missing clipName.`);if(!this.gltf?.animations?.length)return void console.warn(`${n}: glb has no animations.`);const i=THREE.AnimationClip.findByName(this.gltf.animations,e);if(!i)return void console.warn(`${n}: ClipAnimation "${e}" not found.`);if(!this.mixer)return void console.warn(`${n}: Mixer not exists.`);const o=this.mixer.existingAction(i);if(o)if(t>0){const i=(e,t,s,i)=>{gsap.gsap.to(t,{id:e,timeScale:0,duration:s,ease:i,onStart:()=>{this.events.clipFade({type:"CLIP_FADEOUT_START",clipName:e,fct:n,action:o})},onUpdate:()=>{o.timeScale=t.timeScale},onComplete:()=>{this.events.clipFade({type:"CLIP_FADEOUT_COMPLETE",clipName:e,fct:n,action:o})}})};i(e,{timeScale:o.timeScale},t,s)}else o.stop();else console.warn(`${n}: "${e}" is not currently playing on object`)}toggleFullscreen(){document.fullscreenElement?document.exitFullscreen():this.canvas.requestFullscreen()}use(e){e(this)}update(e){-1===this.timeLast&&(this.timeLast=e),this.dT=(e-this.timeLast)/1e3,this.timeLast=e;let t=!1,s=0;if(this.cfg.render.fpsLimiter){let n=0,i=0,o=0;if(this.dTs.push(this.dT),this.dTs.length>this.cfg.render.deltaTimesMax){this.dTs.shift();const e=[...this.dTs].sort((e,t)=>e-t);n=e[Math.floor(.5*(e.length-1))],o=e[Math.floor(.75*(e.length-1))],i=o/this.dTFrameMax}if(i<.75)if("Low"==this.powerMode){s=(e-this.timeLastFrame)/1e3;const i=s+n;(s>=this.dTFrameMax||i>=this.dTFrameMax&&i-this.dTFrameMax>this.dTFrameMax-s)&&(t=!0)}else t=!0,s=this.dT;else this.postNoise&&(this.postNoise=!1),t=!0,s=this.dT,this.dTs.length=0}else t=!0,s=this.dT;if(t){this.infoBox&&this.infoBox.begin(e),this.timeGsap+=s,gsap.gsap.updateRoot(this.timeGsap),this.mixer&&this.actionObserver&&(this.actionObserver.update(),this.mixer.update(s));for(const e of this.callbacks)e(s);for(const e of this.objs3D.values())e.update(s,this.cam3D);this.isPostEnabled()?this.modules.webGpuRendererClass?this.renderPipeline?.render():this.composer?.render():this.renderer.render(this.scene,this.cam3D.obj),this.timeLastFrame=e,this.infoBox&&(this.infoBox.end(performance.now(),this.renderer),this.renderer.info.reset())}}updateCanvasResize(){const e=this.canvas.getBoundingClientRect(),t=e.width,s=e.height;this.renderer.setSize(t,s,!1),this.modules.webGpuRendererClass?(this.tslPass?.setSize(t,s),this.gtaoNode?.setSize(t,s),this.ssrNode?.setSize(t,s),this.renderPipeline&&(this.renderPipeline.needsUpdate=!0)):(this.composer?.setSize(t,s),this.smaaPass?.setSize(t,s),this.fxaaPass&&this.setFxaaResolution(this.cfg.post.webgl.aa.fxaa.sharpness)),this.postNoise||(this.postNoise=!0),this.dTs.length=0,this.cam3D.updateCanvasResize(e),this.groundReflector&&(this.groundReflector.getRenderTarget().setSize(t,s),this.groundReflector.resolution.set(t,s))}},EnvCtrls=class{cfg;engine;modules;envReady=Promise.resolve();textReady=Promise.resolve(null);bgdReady=Promise.resolve();envEnabled=!1;envInit=!1;envLoadId=0;envIntensity;bgdIntensity;bgdBlurriness;rotation;rotationSpeed;envType;envMaps;envText=null;bgdText=null;callback=null;frameWaiters=[];timeBgdRot=0;constructor(e,t,s){this.cfg=e,this.engine=t,this.modules=s,this.envIntensity=this.cfg.envCtrls.environmentIntensity,this.bgdIntensity=this.cfg.envCtrls.backgroundIntensity,this.bgdBlurriness=this.cfg.envCtrls.backgroundBlurriness,this.rotationSpeed=this.cfg.envCtrls.rotationSpeed,this.envType=this.cfg.envCtrls.type,this.envMaps=[...this.cfg.envCtrls.map],this.rotation=new THREE.Euler(THREE.MathUtils.degToRad(this.cfg.envCtrls.rotation.x),THREE.MathUtils.degToRad(this.cfg.envCtrls.rotation.y),THREE.MathUtils.degToRad(this.cfg.envCtrls.rotation.z)),this.cfg.envCtrls.enable&&(this.textReady=this.loadText(this.envType,this.envMaps[0]??""))}init(){!this.cfg.envCtrls.enable||this.envEnabled||this.envInit||(this.envInit=!0,this.startEnv())}async applyBgds(e,t,s,n){let i=n;for(const n of s){const s=await this.loadText(t,n);if(s){if(this.envLoadId!==e)return void this.disposeText(s);if(await this.waitFrames(2),this.envLoadId!==e)return void this.disposeText(s);if(this.setBgd(s),await this.waitFrames(1),this.envLoadId!==e)return this.disposeText(s),void this.disposePrevBgd(i);this.disposePrevBgd(i),i=s}}}async applyEnv(e,t,s){const n=await this.textReady;if(!n||this.envLoadId!==e)return;const i=this.modules.webGpuRendererClass;if(i&&this.engine.renderer instanceof i)this.setEnv(n);else{const e=new THREE.PMREMGenerator(this.engine.renderer);try{e.compileEquirectangularShader();const t=e.fromEquirectangular(n).texture;this.setEnv(t,n)}finally{e.dispose()}}this.callback||(this.callback=e=>this.update(e),this.engine.addOnFrameUpdate(this.callback)),this.bgdReady=this.applyBgds(e,t,s.slice(1),n).catch(e=>{console.warn("Failed to apply background map:",e)})}disposePrevBgd(e){e&&this.envText!==e&&this.engine.scene.environment!==e&&(this.bgdText===e&&(this.bgdText=null),this.disposeText(e))}disposeText(e){e&&(this.envText===e&&(this.envText=null),this.bgdText===e&&(this.bgdText=null),e.dispose())}enable(e){if(this.envEnabled)return;const t=e?.type??this.cfg.envCtrls.type,s=[...e?.map??this.cfg.envCtrls.map];this.cfg.envCtrls.enable=!0,this.envEnabled=!0,this.envType=t,this.envMaps=s,this.textReady=this.loadText(t,s[0]??""),this.startEnv(t,s)}disable(){if(!this.envEnabled&&!this.envInit&&!this.isEnabled())return;this.cfg.envCtrls.enable=!1,this.envEnabled=!1,this.envInit=!1,this.envLoadId++,this.resolveFrameWaiters(!0),this.engine&&this.callback&&(this.engine.removeOnFrameUpdate(this.callback),this.callback=null);const e=this.envText,t=this.bgdText;this.disposeText(e),t!==e&&this.disposeText(t),this.engine.scene.environment=null,this.engine.scene.environmentRotation.set(0,0,0),this.engine.scene.environmentIntensity=this.envIntensity,this.engine.scene.background=null,this.engine.scene.backgroundRotation.set(0,0,0),this.engine.scene.backgroundIntensity=this.bgdIntensity,this.engine.scene.backgroundBlurriness=this.bgdBlurriness,this.rotationSpeed=this.cfg.envCtrls.rotationSpeed,this.timeBgdRot=0}get(){return{rotationSpeed:this.rotationSpeed,environmentIntensity:this.envIntensity,backgroundIntensity:this.bgdIntensity,backgroundBlurriness:this.bgdBlurriness,rotation:{x:THREE.MathUtils.radToDeg(this.rotation.x),y:THREE.MathUtils.radToDeg(this.rotation.y),z:THREE.MathUtils.radToDeg(this.rotation.z)}}}isEnabled(){return null!==this.engine.scene.environment||null!==this.engine.scene.background}async loadText(e,t){if(!t)return console.warn("Environment map is empty."),null;try{let s;if("hdr"===e||"exr"===e){if(!this.modules.envLoader)return console.warn("Modules EXRLoader or ENVLoader could not be imported."),null;const e=this.modules.webGpuRendererClass,n="float"===this.cfg.envCtrls.dataType&&(e&&this.engine.renderer instanceof e||this.engine.renderer.extensions.has("OES_texture_float_linear"));this.modules.envLoader.setDataType(n?THREE.FloatType:THREE.HalfFloatType),s=await this.modules.envLoader.loadAsync(t)}else s=await(new THREE.TextureLoader).loadAsync(t);return s.mapping=THREE.EquirectangularReflectionMapping,s}catch(e){return console.warn("Failed to load environment map:",t,e),null}}set(e){void 0!==e.rotationSpeed&&(this.rotationSpeed=e.rotationSpeed),void 0!==e.environmentIntensity&&(this.envIntensity=e.environmentIntensity,this.engine.scene.environmentIntensity=this.envIntensity),void 0!==e.backgroundIntensity&&(this.bgdIntensity=e.backgroundIntensity,this.engine.scene.backgroundIntensity=this.bgdIntensity),void 0!==e.backgroundBlurriness&&(this.bgdBlurriness=e.backgroundBlurriness,this.engine.scene.backgroundBlurriness=this.bgdBlurriness),void 0!==e.rotation&&(this.rotation.set(THREE.MathUtils.degToRad(e.rotation.x),THREE.MathUtils.degToRad(e.rotation.y),THREE.MathUtils.degToRad(e.rotation.z)),this.engine.scene.environmentRotation.copy(this.rotation),this.engine.scene.backgroundRotation.copy(this.rotation))}setEnv(e,t=e){this.envText=e,this.engine.scene.environment=e,this.engine.scene.environmentRotation.copy(this.rotation),this.engine.scene.environmentIntensity=this.envIntensity,this.setBgd(t)}setBgd(e){this.bgdText=e,this.engine.scene.background=e,this.engine.scene.backgroundRotation.copy(this.rotation),this.engine.scene.backgroundIntensity=this.bgdIntensity,this.engine.scene.backgroundBlurriness=this.bgdBlurriness}startEnv(e=this.envType,t=this.envMaps){const s=++this.envLoadId;this.envReady=this.applyEnv(s,e,t).catch(e=>{console.warn("Failed to apply environment:",e),this.envLoadId===s&&this.setEnv(null)})}waitFrames(e){return e<=0?Promise.resolve():new Promise(t=>{this.frameWaiters.push({remaining:e,resolve:t})})}resolveFrameWaiters(e=!1){const t=[];for(const s of this.frameWaiters)e||s.remaining--,e||s.remaining<=0?s.resolve():t.push(s);this.frameWaiters=t}update(e){if(0===this.rotationSpeed)this.engine.scene.environmentRotation.copy(this.rotation);else{this.timeBgdRot+=e*this.rotationSpeed;const t=THREE.MathUtils.degToRad(this.timeBgdRot);this.engine.scene.environmentRotation.set(this.rotation.x,this.rotation.y+t,this.rotation.z)}this.engine.scene.backgroundRotation.copy(this.engine.scene.environmentRotation),this.resolveFrameWaiters()}},Events=class{cfg;stateMachine;eventQueue=[];isProcessingEvents=!1;constructor(e,t){this.cfg=e,this.stateMachine=t}enqueue(e){if(this.eventQueue.push(e),!this.isProcessingEvents){this.isProcessingEvents=!0;try{for(;this.eventQueue.length>0;){const e=this.eventQueue.shift();e&&e()}}finally{this.isProcessingEvents=!1}}}anim(e){let t=`${e.fct} | ${e.objName}`;this.send(e,t)}animFade(e){let t=`${e.fct} | ${e.objName} | ${e.property} | ${e.value}`;this.send(e,t)}audioLoaded(e){this.send(e,e.soundName)}clip(e){let t=[];e.fct&&t.push(e.fct),e.clipName&&t.push(e.clipName),e.action&&t.push(`timeScale=${e.action.timeScale}`),e.action&&t.push(`time=${e.action.time}`);const s=t.join(" | ");this.send(e,s)}clipFade(e){let t=[];e.fct&&t.push(e.fct),e.clipName&&t.push(e.clipName),e.action&&t.push(`timeScale=${e.action.timeScale}`),e.action&&t.push(`time=${e.action.time}`);const s=t.join(" | ");this.send(e,s)}modelError(e){let t="";t="SyntaxError"==e.error.name?"MODEL_ERROR: Invalid GLTF file or wrong path/filename.":`${e.error.name} / ${e.error.message}`,this.send(e,t)}modelLoading(e){this.send(e,`${e.loading}% loaded model`)}send(e,t){this.enqueue(()=>{const s=this.stateMachine.sendEvent(e,t);"all"!=this.cfg.debug.log||s||console.log(`${e.type}${t?`: ${t}`:""}`)})}windowResize(e){this.send(e,"Window render size updated.")}},OrbitCtrls=class{cam3D;canvas;engine;events;modules;orbitControls=null;params;orbitCtrlsFirstChange=!0;callback=null;touchPointerIds=new Set;constructor(e,t,s,n,i,o){this.cam3D=e,this.engine=n,this.events=i,this.modules=o,this.canvas=t,this.params={...s}}create(){this.orbitControls||this.modules.orbitControlsClass&&(this.orbitControls=new this.modules.orbitControlsClass(this.cam3D.obj,this.engine.renderer.domElement),this.orbitControls?(this.orbitControls.enabled=!1,this.orbitCtrlsFirstChange=!0,this.orbitControls.addEventListener("start",()=>{this.orbitCtrlsFirstChange=!1,this.events.send({type:"ORBITCTRLS_START"})}),this.orbitControls.addEventListener("change",()=>{this.orbitCtrlsFirstChange||(this.orbitCtrlsFirstChange=!0,this.events.send({type:"ORBITCTRLS_CHANGED"}))}),this.orbitControls.addEventListener("end",()=>{this.events.send({type:"ORBITCTRLS_END"})})):console.warn("Module OrbitControls could not be imported."))}disable(){this.orbitControls&&!1!==this.orbitControls.enabled&&(this.orbitControls.enabled=!1,this.touchPointerIds.clear(),this.callback&&(this.engine.removeOnFrameUpdate(this.callback),this.callback=null),this.events.send({type:"ORBITCTRLS_DISABLED"}))}enable(){this.orbitControls||this.create(),this.orbitControls&&(this.orbitControls.enabled||(this.orbitCtrlsFirstChange=!0,this.orbitControls.enabled=!0,this.cam3D.lookMode="target",this.orbitControls.target.copy(this.cam3D.objTarget.position),this.orbitControls.enableDamping=this.params.enableDamping,this.orbitControls.dampingFactor=this.params.dampingFactor,this.orbitControls.minDistance=this.params.minDistance,this.orbitControls.maxDistance=this.params.maxDistance,this.orbitControls.enableZoom=this.params.enableZoom,this.orbitControls.zoomSpeed=this.params.zoomSpeed,this.orbitControls.enableRotate=this.params.enableRotate,this.orbitControls.rotateSpeed=this.params.rotateSpeed,this.orbitControls.enablePan=this.params.enablePan,this.orbitControls.panSpeed=this.params.panSpeed,this.orbitControls.autoRotate=this.params.autoRotate,this.orbitControls.autoRotateSpeed=this.params.autoRotateSpeed,this.orbitControls.minPolarAngle=THREE.MathUtils.degToRad(this.params.minPolarAngle),this.orbitControls.maxPolarAngle=THREE.MathUtils.degToRad(this.params.maxPolarAngle),this.orbitControls.mouseButtons.LEFT=THREE.MOUSE.ROTATE,this.orbitControls.mouseButtons.MIDDLE=THREE.MOUSE.DOLLY,this.orbitControls.mouseButtons.RIGHT=THREE.MOUSE.PAN,this.orbitControls.touches.ONE=THREE.TOUCH.ROTATE,this.orbitControls.touches.TWO=THREE.TOUCH.DOLLY_PAN,this.callback=e=>{this.orbitControls&&(this.orbitControls.update(e),this.cam3D.objTarget.position.copy(this.orbitControls.target))},this.engine.addOnFrameUpdate(this.callback),this.events.send({type:"ORBITCTRLS_ENABLED"})))}dispose(){this.touchPointerIds.clear(),this.callback&&(this.engine.removeOnFrameUpdate(this.callback),this.callback=null),this.orbitControls?.dispose(),this.orbitControls=null,this.events.send({type:"ORBITCTRLS_DISPOSED"})}get(){return{enableDamping:this.params.enableDamping,dampingFactor:this.params.dampingFactor,minDistance:this.params.minDistance,maxDistance:this.params.maxDistance,enableZoom:this.params.enableZoom,zoomSpeed:this.params.zoomSpeed,enableRotate:this.params.enableRotate,rotateSpeed:this.params.rotateSpeed,enablePan:this.params.enablePan,panSpeed:this.params.panSpeed,autoRotate:this.params.autoRotate,autoRotateSpeed:this.params.autoRotateSpeed,minPolarAngle:this.params.minPolarAngle,maxPolarAngle:this.params.maxPolarAngle}}isEnabled(){return null!==this.orbitControls&&!0===this.orbitControls?.enabled}set(e){this.orbitControls&&(void 0!==e.enableDamping&&(this.params.enableDamping=e.enableDamping,this.orbitControls.enableDamping=e.enableDamping),void 0!==e.dampingFactor&&(this.params.dampingFactor=e.dampingFactor,this.orbitControls.dampingFactor=e.dampingFactor),void 0!==e.minDistance&&(this.params.minDistance=e.minDistance,this.orbitControls.minDistance=e.minDistance),void 0!==e.maxDistance&&(this.params.maxDistance=e.maxDistance,this.orbitControls.maxDistance=e.maxDistance),void 0!==e.enableZoom&&(this.params.enableZoom=e.enableZoom,this.orbitControls.enableZoom=e.enableZoom),void 0!==e.zoomSpeed&&(this.params.zoomSpeed=e.zoomSpeed,this.orbitControls.zoomSpeed=e.zoomSpeed),void 0!==e.enableRotate&&(this.params.enableRotate=e.enableRotate,this.orbitControls.enableRotate=e.enableRotate),void 0!==e.rotateSpeed&&(this.params.rotateSpeed=e.rotateSpeed,this.orbitControls.rotateSpeed=e.rotateSpeed),void 0!==e.enablePan&&(this.params.enablePan=e.enablePan,this.orbitControls.enablePan=e.enablePan),void 0!==e.panSpeed&&(this.params.panSpeed=e.panSpeed,this.orbitControls.panSpeed=e.panSpeed),void 0!==e.autoRotate&&(this.params.autoRotate=e.autoRotate,this.orbitControls.autoRotate=e.autoRotate),void 0!==e.autoRotateSpeed&&(this.params.autoRotateSpeed=e.autoRotateSpeed,this.orbitControls.autoRotateSpeed=e.autoRotateSpeed),void 0!==e.minPolarAngle&&(this.params.minPolarAngle=e.minPolarAngle,this.orbitControls.minPolarAngle=THREE.MathUtils.degToRad(e.minPolarAngle)),void 0!==e.maxPolarAngle&&(this.params.maxPolarAngle=e.maxPolarAngle,this.orbitControls.maxPolarAngle=THREE.MathUtils.degToRad(e.maxPolarAngle)))}use(e){e(this)}},FpvCtrls=class{cam3D;canvas;engine;events;modules;pointerLockCtrls=null;params;isMoveForward=!1;isMoveLeft=!1;isMoveBackward=!1;isMoveRight=!1;isMoveUp=!1;isMoveDown=!1;callback=null;onClick=()=>{this.isEnabled()&&(this.isLocked()?this.unlock():this.lock())};onKeyDown=e=>{this.isEnabled()&&(e.code===this.params.keyMoveForward&&(this.isMoveForward=!0),e.code===this.params.keyMoveLeft&&(this.isMoveLeft=!0),e.code===this.params.keyMoveBackward&&(this.isMoveBackward=!0),e.code===this.params.keyMoveRight&&(this.isMoveRight=!0),e.code===this.params.keyMoveUp&&(this.isMoveUp=!0),e.code===this.params.keyMoveDown&&(this.isMoveDown=!0))};onKeyUp=e=>{this.isEnabled()&&(e.code===this.params.keyMoveForward&&(this.isMoveForward=!1),e.code===this.params.keyMoveLeft&&(this.isMoveLeft=!1),e.code===this.params.keyMoveBackward&&(this.isMoveBackward=!1),e.code===this.params.keyMoveRight&&(this.isMoveRight=!1),e.code===this.params.keyMoveUp&&(this.isMoveUp=!1),e.code===this.params.keyMoveDown&&(this.isMoveDown=!1))};constructor(e,t,s,n,i,o){this.cam3D=e,this.canvas=t,this.engine=n,this.events=i,this.modules=o,this.params={...s}}create(){this.pointerLockCtrls||this.modules.pointerLockControlsClass&&(this.pointerLockCtrls=new this.modules.pointerLockControlsClass(this.cam3D.obj,this.engine.renderer.domElement),this.pointerLockCtrls?(this.pointerLockCtrls.enabled=!1,this.pointerLockCtrls.addEventListener("lock",()=>{this.events.send({type:"FPVCTRLS_LOCK"})}),this.pointerLockCtrls.addEventListener("unlock",()=>{this.events.send({type:"FPVCTRLS_UNLOCK"})}),this.canvas.addEventListener("click",this.onClick),this.canvas.addEventListener("keydown",this.onKeyDown),this.canvas.addEventListener("keyup",this.onKeyUp)):console.warn("Module PointerLockControls could not be imported."))}disable(){this.pointerLockCtrls&&0!=this.pointerLockCtrls.enabled&&(this.pointerLockCtrls.enabled=!1,this.pointerLockCtrls.isLocked&&this.pointerLockCtrls.unlock(),this.callback&&(this.engine.removeOnFrameUpdate(this.callback),this.callback=null),this.isMoveForward=!1,this.isMoveLeft=!1,this.isMoveBackward=!1,this.isMoveRight=!1,this.isMoveUp=!1,this.isMoveDown=!1,this.events.send({type:"FPVCTRLS_DISABLED"}))}enable(){this.pointerLockCtrls||this.create(),this.pointerLockCtrls&&1!=this.pointerLockCtrls.enabled&&(this.pointerLockCtrls.enabled=!0,this.pointerLockCtrls.minPolarAngle=this.params.minPolarAngle,this.pointerLockCtrls.maxPolarAngle=this.params.maxPolarAngle,this.pointerLockCtrls.pointerSpeed=this.params.pointerSpeed,this.callback=e=>{this.pointerLockCtrls?.isLocked&&(this.isMoveForward&&this.moveForward(e),this.isMoveBackward&&this.moveForward(-e),this.isMoveLeft&&this.moveRight(-e),this.isMoveRight&&this.moveRight(e),this.isMoveUp&&this.moveUp(e),this.isMoveDown&&this.moveUp(-e))},this.engine.addOnFrameUpdate(this.callback),this.events.send({type:"FPVCTRLS_ENABLED"}))}dispose(){this.callback&&(this.engine.removeOnFrameUpdate(this.callback),this.callback=null),this.canvas.removeEventListener("click",this.onClick),this.canvas.removeEventListener("keydown",this.onKeyDown),this.canvas.removeEventListener("keyup",this.onKeyUp),this.isMoveForward=!1,this.isMoveLeft=!1,this.isMoveBackward=!1,this.isMoveRight=!1,this.isMoveUp=!1,this.isMoveDown=!1,this.pointerLockCtrls?.isLocked&&this.pointerLockCtrls.unlock(),this.pointerLockCtrls?.dispose(),this.pointerLockCtrls=null,this.events.send({type:"FPVCTRLS_DISPOSED"})}get(){return{minPolarAngle:this.params.minPolarAngle,maxPolarAngle:this.params.maxPolarAngle,pointerSpeed:this.params.pointerSpeed,keyMoveForward:this.params.keyMoveForward,keyMoveLeft:this.params.keyMoveLeft,keyMoveBackward:this.params.keyMoveBackward,keyMoveRight:this.params.keyMoveRight,keyMoveUp:this.params.keyMoveUp,keyMoveDown:this.params.keyMoveDown}}isEnabled(){return!0===this.pointerLockCtrls?.enabled}isLocked(){return this.pointerLockCtrls?.isLocked??!1}lock(){this.cam3D.lookMode="free",this.pointerLockCtrls?.lock()}moveForward(e){this.pointerLockCtrls?.moveForward(e)}moveRight(e){this.pointerLockCtrls?.moveRight(e)}moveUp(e){this.cam3D.obj.position.y+=e}set(e){this.pointerLockCtrls&&(void 0!==e.minPolarAngle&&(this.params.minPolarAngle=e.minPolarAngle,this.pointerLockCtrls.minPolarAngle=e.minPolarAngle),void 0!==e.maxPolarAngle&&(this.params.maxPolarAngle=e.maxPolarAngle,this.pointerLockCtrls.maxPolarAngle=e.maxPolarAngle),void 0!==e.pointerSpeed&&(this.params.pointerSpeed=e.pointerSpeed,this.pointerLockCtrls.pointerSpeed=e.pointerSpeed),void 0!==e.keyMoveForward&&(this.params.keyMoveForward=e.keyMoveForward),void 0!==e.keyMoveLeft&&(this.params.keyMoveLeft=e.keyMoveLeft),void 0!==e.keyMoveBackward&&(this.params.keyMoveBackward=e.keyMoveBackward),void 0!==e.keyMoveRight&&(this.params.keyMoveRight=e.keyMoveRight),void 0!==e.keyMoveUp&&(this.params.keyMoveUp=e.keyMoveUp),void 0!==e.keyMoveDown&&(this.params.keyMoveDown=e.keyMoveDown))}unlock(){this.pointerLockCtrls?.unlock(),this.events.send({type:"FPVCTRLS_UNLOCK"})}use(e){e(this)}},Raycast=class{cam3D;canvas;cfg;engine;events;objs3D;raycasterSelect=new THREE.Raycaster;raycasterVisible=new THREE.Raycaster;objsSelectTracked=new Set;objActive=null;objCandidate=null;closestObjCounter=0;isEnabled=!1;callbackSelect=null;listenerClick;listenerDown;listenerMove;listenerUp;pointerEvent=null;posPrevPointerX=0;posPrevPointerY=0;posWorldObj=new THREE.Vector3;dirCamToObj=new THREE.Vector3;posNdcPointer=new THREE.Vector2;constructor(e,t,s,n,i,o){this.cam3D=e,this.canvas=t,this.cfg=s,this.engine=n,this.events=i,this.objs3D=o,this.listenerMove=e=>this.updatePointer(e),this.listenerClick=e=>this.onClick(e),this.listenerDown=e=>this.onPointerDown(e),this.listenerUp=e=>this.onPointerUp(e)}enable(){this.isEnabled||0!==this.objsSelectTracked.size&&(this.canvas.addEventListener("pointermove",this.listenerMove),this.canvas.addEventListener("click",this.listenerClick),this.canvas.addEventListener("pointerdown",this.listenerDown),this.canvas.addEventListener("pointerup",this.listenerUp),this.callbackSelect=()=>this.updateSelect(),this.engine.addOnFrameUpdate(this.callbackSelect),this.isEnabled=!0)}disable(){this.isEnabled&&(this.canvas.removeEventListener("pointermove",this.listenerMove),this.canvas.removeEventListener("click",this.listenerClick),this.canvas.removeEventListener("pointerdown",this.listenerDown),this.canvas.removeEventListener("pointerup",this.listenerUp),this.callbackSelect&&(this.engine.removeOnFrameUpdate(this.callbackSelect),this.callbackSelect=null),this.objActive=null,this.objCandidate=null,this.closestObjCounter=0,this.pointerEvent=null,this.isEnabled=!1)}isVisibleOcclusion(e){e.updateMatrixWorld(!0),e.getWorldPosition(this.posWorldObj),this.dirCamToObj.subVectors(this.posWorldObj,this.cam3D.obj.position);const t=this.dirCamToObj.length();return t<=0||(this.dirCamToObj.normalize(),this.raycasterVisible.set(this.cam3D.obj.position,this.dirCamToObj),this.raycasterVisible.near=0,this.raycasterVisible.far=Math.max(0,t-1e-4),0===this.raycasterVisible.intersectObjects(this.engine.scene.children,!0).filter(t=>t.object!==e).length)}onClick(e){this.objActive?.name&&this.objs3D.get(this.objActive.name)?.emitEvent({type:"OBJ3D_CLICK",event:e,objName:this.objActive.name})}onPointerDown(e){this.objActive?.name&&this.objs3D.get(this.objActive.name)?.emitEvent({type:"OBJ3D_POINTER_DOWN",event:e,objName:this.objActive.name})}onPointerEnter(e,t){const s=this.objs3D.get(e);s&&s?.emitEvent({type:"OBJ3D_POINTER_ENTER",event:t,objName:e})}onPointerLeave(e,t){const s=this.objs3D.get(e);s&&s?.emitEvent({type:"OBJ3D_POINTER_LEAVE",event:t,objName:e})}onPointerMove(e,t){this.objs3D.get(e)?.emitEvent({type:"OBJ3D_POINTER_MOVE",event:t,objName:e})}onPointerUp(e){this.objActive?.name&&this.objs3D.get(this.objActive.name)?.emitEvent({type:"OBJ3D_POINTER_UP",event:e,objName:this.objActive.name})}trackSelectables({objs3D:e}){if(Array.isArray(e)){for(const t of e)t.obj&&this.objsSelectTracked.add(t.obj);this.enable()}}use(e){e(this)}untrackSelectable({objs3D:e}){if(Array.isArray(e)){for(const t of e)t.obj&&this.objsSelectTracked.delete(t.obj);0===this.objsSelectTracked.size&&this.disable()}}updateSelect(){if(0===this.objsSelectTracked.size)return;let e=null,t=1/0;for(let s=0;s<this.cfg.raycast.circleSteps;s++){const n=s/this.cfg.raycast.circleSteps*Math.PI*2,i=this.canvas.getBoundingClientRect(),o=Math.cos(n)*this.cfg.raycast.circleRadius/i.width*2,a=Math.sin(n)*this.cfg.raycast.circleRadius/i.height*2,r=new THREE.Vector2(this.posNdcPointer.x+o,this.posNdcPointer.y+a);this.raycasterSelect.setFromCamera(r,this.cam3D.obj);const l=this.raycasterSelect.intersectObjects([...this.objsSelectTracked],!1);if(l.length>0){const s=l[0],n=s.point.clone().project(this.cam3D.obj),i=this.posNdcPointer.distanceTo(n);i<t&&(t=i,e=s.object)}}if(e!==this.objActive)e===this.objCandidate?this.closestObjCounter++:(this.objCandidate=e,this.closestObjCounter=1),this.closestObjCounter>=this.cfg.raycast.countClosestObjs&&(this.objActive?.name&&this.pointerEvent&&this.onPointerLeave(this.objActive.name,this.pointerEvent),this.objCandidate?.name&&this.pointerEvent&&this.onPointerEnter(this.objCandidate.name,this.pointerEvent),this.objActive=this.objCandidate,this.objCandidate=null,this.closestObjCounter=0);else{if(this.closestObjCounter=0,this.objCandidate=null,!this.pointerEvent)return;const e=this.pointerEvent;e.clientX===this.posPrevPointerX&&e.clientY===this.posPrevPointerY||!this.objActive?.name||this.onPointerMove(this.objActive.name,e),this.posPrevPointerX=e.clientX,this.posPrevPointerY=e.clientY}}updatePointer(e){this.pointerEvent=e;const t=this.canvas.getBoundingClientRect(),s=(e.clientX-t.left)/t.width,n=(e.clientY-t.top)/t.height;this.posNdcPointer.x=2*s-1,this.posNdcPointer.y=-(2*n-1)}},StateMachine=class{cfg;modules;actor=null;lastState="";snapshot=null;stateMachine=null;constructor(e,t){this.cfg=e,this.modules=t}sendEvent(e,t){if(!this.actor)return null;let s=!1;return(null!=this.snapshot?this.snapshot:this.actor.getSnapshot?.())?.can?.(e)&&(s=!0,"none"!=this.cfg.debug.log&&console.log(`${e.type}${t?`: ${t}`:""}`),this.actor.send(e)),s}start(e){if(this.stateMachine=e,this.stateMachine)if(this.actor)console.warn("Actor is already started.");else{if(this.cfg.stateMachine.inspector&&this.modules.createBrowserInspector){const{inspect:e}=this.modules.createBrowserInspector();this.actor=(0,xstate.createActor)(this.stateMachine,{inspect:e})}else this.actor=(0,xstate.createActor)(this.stateMachine);this.actor.subscribe(e=>{if(this.snapshot=e,"none"==this.cfg.debug.log)return;const t=e.value,s=JSON.stringify(t);if(s!==this.lastState)if(this.lastState=s,"object"==typeof t&&null!==t){const e=(t,s="")=>{if("string"==typeof t)return[s?`${s} > ${t}`:t];const n=[];for(const[i,o]of Object.entries(t)){const t=s?`${s} > ${i}`:i;n.push(...e(o,t))}return n};e(t).forEach(e=>{console.log(`STATE: ${e}`)})}else console.log(`STATE: ${t}`)}),this.actor.start()}else console.warn("State Machine not found.")}},cfg={audio:{enable:!1,guiOpened:!1,delayPlaySound:200,refDistance:1,rolloffFactor:1,maxDistance:1e3,distanceModel:"inverse",coneInnerAngle:360,coneOuterAngle:360,coneOuterGain:0},cam:{fov:75,near:.1,far:1e3,type:"perspective",lookAt:{x:0,y:0,z:0},position:{x:0,y:.5,z:.5}},debug:{log:"xstate"},envCtrls:{backgroundBlurriness:0,backgroundIntensity:0,dataType:"halfFloat",enable:!1,environmentIntensity:1.8,load:!1,map:[],rotation:{x:0,y:0,z:0},rotationSpeed:0,type:"exr"},fpvCtrls:{enable:!1,load:!1,minPolarAngle:0,maxPolarAngle:Math.PI,pointerSpeed:.1,keyMoveForward:"KeyW",keyMoveLeft:"KeyA",keyMoveBackward:"KeyS",keyMoveRight:"KeyD",keyMoveUp:"KeyQ",keyMoveDown:"KeyE"},gui:{infoBox:{enable:!1,fps:!0,cpu:!0,frame:!0,calls:!0,triangles:!0,lines:!0,points:!0,geometries:!0,textures:!0,programs:!0,logsPerSecond:10},inspector:{enable:!1},menuBar:{enable:!0,backgroundColor:"#ffffff29",logo:""}},light:{castShadow:!0,mapWidth:512,mapHeight:512,bias:0,normalBias:0,near:.5,far:500},mesh:{castShadow:!0,receiveShadow:!0,frustumCulled:!1},model:{compress:{mesh:"none",texture:"none"},decoderPath:"draco/",file:null,progressBar:!0},orbitCtrls:{autoRotate:!1,autoRotateSpeed:2,dampingFactor:.1,enable:!1,enableDamping:!1,enablePan:!0,enableRotate:!0,enableZoom:!0,load:!1,maxDistance:1/0,maxPolarAngle:180,minDistance:0,minPolarAngle:0,panSpeed:1,rotateSpeed:1,zoomSpeed:1},post:{guiOpened:!1,aa:{guiOpened:!1,mode:"none"},ssao:{enable:!1,guiOpened:!1},ssr:{enable:!1,guiOpened:!1},webgl:{aa:{fxaa:{sharpness:.5}},ssao:{kernelRadius:8,minDistance:.005,maxDistance:.1},ssr:{bouncing:!1,distanceAttenuation:!0,fresnel:!0,infiniteThick:!1,maxDistance:180,opacity:.5,thickness:.018,blur:!0,resolutionScale:1,output:0,selective:!1,clear:!0,maxRoughness:.5}},webgpu:{ssao:{radius:.25,thickness:1,distanceExponent:1,distanceFallOff:1,scale:1,samples:16,resolutionScale:1},ssr:{distanceAttenuation:!0,fresnel:!0,maxDistance:180,intensity:.5,thickness:.018,resolutionScale:1,quality:.5,blurQuality:1}}},raycast:{circleRadius:10,circleSteps:12,countClosestObjs:5},render:{api:"auto",autoResize:!0,guiOpened:!1,fpsLimiter:!0,fpsMax:30,deltaTimesMax:10,outputColorSpace:THREE.SRGBColorSpace,pixelRatio:1,shadowMapEnabled:!0,shadowMapType:THREE.PCFShadowMap,toneMapping:THREE.ACESFilmicToneMapping,toneMappingExposure:1,params:{alpha:!1,aa:!1},webgl:{params:{}},webgpu:{params:{}}},scene:{guiOpened:!1,canvas:"ilu-canvas",fog:{enable:!1,color:0,near:0,far:100},ambientlight:{enable:!1,color:16777215,intensity:1},hemisphere:{enable:!1,skyColor:16777147,groundColor:526368,intensity:1}},stateMachine:{inspector:!1}},inspector_default="/* nur Chrome / Edge / Safari */\r\n.illutions-pane {\r\n font-family: monospace;\r\n font-size: 12px;\r\n\r\n --tp-base-background-color: hsla(230, 20%, 11%, 1.00);\r\n --tp-base-shadow-color: hsla(0, 0%, 0%, 0.2);\r\n --tp-button-background-color: hsla(230, 10%, 80%, 1.00);\r\n --tp-button-background-color-active: hsla(230, 10%, 95%, 1.00);\r\n --tp-button-background-color-focus: hsla(230, 10%, 90%, 1.00);\r\n --tp-button-background-color-hover: hsla(230, 10%, 85%, 1.00);\r\n --tp-button-foreground-color: hsla(230, 20%, 11%, 1.00);\r\n --tp-container-background-color: hsla(230, 25%, 16%, 1.00);\r\n --tp-container-background-color-active: hsla(230, 25%, 31%, 1.00);\r\n --tp-container-background-color-focus: hsla(230, 25%, 26%, 1.00);\r\n --tp-container-background-color-hover: hsla(230, 25%, 21%, 1.00);\r\n --tp-container-foreground-color: hsla(230, 10%, 80%, 1.00);\r\n --tp-groove-foreground-color: hsla(230, 20%, 8%, 1.00);\r\n --tp-input-background-color: hsla(230, 20%, 8%, 1.00);\r\n --tp-input-background-color-active: hsla(230, 28%, 23%, 1.00);\r\n --tp-input-background-color-focus: hsla(230, 28%, 18%, 1.00);\r\n --tp-input-background-color-hover: hsla(230, 20%, 13%, 1.00);\r\n --tp-input-foreground-color: hsla(230, 10%, 80%, 1.00);\r\n --tp-label-foreground-color: hsla(230, 12%, 48%, 1.00);\r\n --tp-monitor-background-color: hsla(230, 20%, 8%, 1.00);\r\n --tp-monitor-foreground-color: hsla(230, 12%, 48%, 1.00);\r\n\r\n max-height: 95vh;\r\n overflow-y: auto;\r\n scrollbar-width: thin;\r\n scrollbar-color: #F40B5780 #1e1e1e;\r\n}\r\n\r\n/* WebKit Hover + Fallback for older Chrome / Edge / Safari */\r\n.illutions-pane::-webkit-scrollbar {\r\n width: 10px;\r\n}\r\n\r\n.illutions-pane::-webkit-scrollbar-track {\r\n background: #1e1e1e;\r\n}\r\n\r\n.illutions-pane::-webkit-scrollbar-thumb {\r\n background: #F40B5780;\r\n border-radius: 6px;\r\n}\r\n\r\n.illutions-pane::-webkit-scrollbar-thumb:hover {\r\n background: #F40B57;\r\n}\r\n",outputColorSpaceParam={SRGB:THREE.SRGBColorSpace,LinearSRGB:THREE.LinearSRGBColorSpace},shadowMapTypeParam={Basic:THREE.BasicShadowMap,PCF:THREE.PCFShadowMap,PCFSoft:THREE.PCFShadowMap,VSM:THREE.VSMShadowMap},toneMappingParam={None:THREE.NoToneMapping,Linear:THREE.LinearToneMapping,Reinhard:THREE.ReinhardToneMapping,Cineon:THREE.CineonToneMapping,ACESFilmic:THREE.ACESFilmicToneMapping,AgX:THREE.AgXToneMapping,Neutral:THREE.NeutralToneMapping,Custom:THREE.CustomToneMapping},Inspector=class{engine;envCtrls;pane=null;modules;orbitCtrls;fpvCtrls;audio;cfg;constructor(e,t,s,n,i,o,a){if(this.audio=t,this.engine=s,this.envCtrls=n,this.modules=i,this.orbitCtrls=o,this.fpvCtrls=a,this.cfg=e,!this.modules.paneClass)return void console.warn("Module tweakpane could not be imported.");if(this.pane=new this.modules.paneClass({title:"illutions"}),!this.pane)return;const r=this.pane.element;r.style.position="fixed",r.style.top="8px",r.style.right="8px",r.style.zIndex="1000",r.classList.add("illutions-pane");const l=document.createElement("style");if(l.textContent=inspector_default,document.head.appendChild(l),this.cfg.audio.enable){const y=this.audio.get(),w=this.pane.addFolder({title:"Audio",expanded:this.cfg.audio.guiOpened});w.addBinding(y,"delayPlaySound",{min:0,max:2e3,step:10}).on("change",e=>this.audio.set({delayPlaySound:e.value})),w.addBinding(y,"refDistance",{min:.1,max:20,step:.1}).on("change",e=>this.audio.set({refDistance:e.value})),w.addBinding(y,"rolloffFactor",{min:0,max:100,step:.1}).on("change",e=>this.audio.set({rolloffFactor:e.value})),w.addBinding(y,"maxDistance",{min:1,max:5e3,step:10}).on("change",e=>this.audio.set({maxDistance:e.value})),w.addBinding(y,"distanceModel",{options:{linear:"linear",inverse:"inverse",exponential:"exponential"}}).on("change",e=>this.audio.set({distanceModel:e.value})),w.addBinding(y,"coneInnerAngle",{min:0,max:360,step:1}).on("change",e=>this.audio.set({coneInnerAngle:e.value})),w.addBinding(y,"coneOuterAngle",{min:0,max:360,step:1}).on("change",e=>this.audio.set({coneOuterAngle:e.value})),w.addBinding(y,"coneOuterGain",{min:0,max:1,step:.01}).on("change",e=>this.audio.set({coneOuterGain:e.value}))}const c=this.pane.addFolder({title:"Navigation",expanded:!1});if(this.cfg.orbitCtrls.enable||this.cfg.orbitCtrls.load){const T=c.addFolder({title:"Orbit",expanded:!0});T.addBinding(this.cfg.orbitCtrls,"enableDamping").on("change",e=>this.orbitCtrls.set({enableDamping:e.value})),T.addBinding(this.cfg.orbitCtrls,"dampingFactor",{min:0,max:1,step:.01}).on("change",e=>this.orbitCtrls.set({dampingFactor:e.value})),T.addBinding(this.cfg.orbitCtrls,"minDistance",{min:0,max:500,step:.1}).on("change",e=>this.orbitCtrls.set({minDistance:e.value})),T.addBinding(this.cfg.orbitCtrls,"maxDistance",{min:0,max:2e3,step:.1}).on("change",e=>this.orbitCtrls.set({maxDistance:e.value})),T.addBinding(this.cfg.orbitCtrls,"minPolarAngle",{min:0,max:180,step:1,format:e=>`${e}°`,parse:e=>Number(e.replace("°",""))}).on("change",e=>this.orbitCtrls.set({minPolarAngle:e.value})),T.addBinding(this.cfg.orbitCtrls,"maxPolarAngle",{min:0,max:180,step:1,format:e=>`${e}°`,parse:e=>Number(e.replace("°",""))}).on("change",e=>this.orbitCtrls.set({maxPolarAngle:e.value})),T.addBinding(this.cfg.orbitCtrls,"enableZoom").on("change",e=>this.orbitCtrls.set({enableZoom:e.value})),T.addBinding(this.cfg.orbitCtrls,"zoomSpeed",{min:.1,max:5,step:.1}).on("change",e=>this.orbitCtrls.set({zoomSpeed:e.value})),T.addBinding(this.cfg.orbitCtrls,"enableRotate"),T.addBinding(this.cfg.orbitCtrls,"rotateSpeed",{min:.1,max:5,step:.1}).on("change",e=>this.orbitCtrls.set({rotateSpeed:e.value})),T.addBinding(this.cfg.orbitCtrls,"enablePan").on("change",e=>this.orbitCtrls.set({enablePan:e.value})),T.addBinding(this.cfg.orbitCtrls,"panSpeed",{min:.1,max:5,step:.1}).on("change",e=>this.orbitCtrls.set({panSpeed:e.value})),T.addBinding(this.cfg.orbitCtrls,"autoRotate").on("change",e=>this.orbitCtrls.set({autoRotate:e.value})),T.addBinding(this.cfg.orbitCtrls,"autoRotateSpeed",{min:.1,max:10,step:.1}).on("change",e=>this.orbitCtrls.set({autoRotateSpeed:e.value}))}if(this.cfg.fpvCtrls.enable){const L=c.addFolder({title:"FirstPerson",expanded:!0});L.addBinding(this.cfg.fpvCtrls,"minPolarAngle",{min:0,max:Math.PI,step:.01}).on("change",e=>this.fpvCtrls.set({minPolarAngle:e.value})),L.addBinding(this.cfg.fpvCtrls,"maxPolarAngle",{min:0,max:Math.PI,step:.01}).on("change",e=>this.fpvCtrls.set({maxPolarAngle:e.value})),L.addBinding(this.cfg.fpvCtrls,"pointerSpeed",{min:.01,max:1,step:.01}).on("change",e=>this.fpvCtrls.set({pointerSpeed:e.value}))}const d=this.pane.addFolder({title:"Renderer",expanded:this.cfg.render.guiOpened});d.addBinding(this.cfg.render,"fpsLimiter"),d.addBinding(this.cfg.render,"deltaTimesMax",{min:1,max:120,step:1}),d.addBinding(this.cfg.render,"pixelRatio",{min:.25,max:2,step:.05}).on("change",e=>{this.engine.renderer.setPixelRatio(e.value)});const h={outputColorSpace:Object.keys(outputColorSpaceParam).find(e=>outputColorSpaceParam[e]===this.cfg.render.outputColorSpace)},m=Object.keys(outputColorSpaceParam).reduce((e,t)=>(e[t]=t,e),{});d.addBinding(h,"outputColorSpace",{options:m}).on("change",e=>{const t=outputColorSpaceParam[e.value];this.cfg.render.outputColorSpace=t,this.engine.renderer.outputColorSpace=t});const p=d.addFolder({title:"ShadowMap",expanded:!1});p.addBinding(this.cfg.render,"shadowMapEnabled").on("change",e=>{this.engine.renderer.shadowMap.enabled=e.value});const u={shadowMapType:Object.keys(shadowMapTypeParam).find(e=>shadowMapTypeParam[e]===this.cfg.render.shadowMapType)},g=Object.keys(shadowMapTypeParam).reduce((e,t)=>(e[t]=t,e),{});p.addBinding(u,"shadowMapType",{options:g}).on("change",e=>{const t=shadowMapTypeParam[e.value];this.engine.renderer.shadowMap.type=t});const b=d.addFolder({title:"ToneMapping",expanded:!1}),f={toneMapping:Object.keys(toneMappingParam).find(e=>toneMappingParam[e]===this.cfg.render.toneMapping)},v=Object.keys(toneMappingParam).reduce((e,t)=>(e[t]=t,e),{});if(b.addBinding(f,"toneMapping",{options:v}).on("change",e=>{const t=e.value;this.engine.renderer.toneMapping=toneMappingParam[t]}),b.addBinding(this.cfg.render,"toneMappingExposure",{min:0,max:5}).on("change",e=>{this.engine.renderer.toneMappingExposure=e.value}),this.engine.isPostEnabled()){const E=d.addFolder({title:"Postprocessing",expanded:this.cfg.post.guiOpened}),M={ssaoEnable:this.cfg.post.ssao.enable,ssrEnable:this.cfg.post.ssr.enable,aaMode:this.cfg.post.aa.mode};function x(e,t,s){for(const n of e.children)n!==t&&(n.disabled=s)}const P=this.cfg.post.ssao;if(this.modules.webGpuRendererClass){const A=this.cfg.post.webgpu.ssao,B=E.addFolder({title:"SSAO",expanded:P.guiOpened}),j=B.addBinding(M,"ssaoEnable",{label:"Enable"}).on("change",async e=>{await this.engine.enableSsao(e.value),x(B,j,!e.value)});B.addBinding(A,"radius",{min:0,max:10,step:.01,label:"Radius"}).on("change",e=>{this.engine.gtaoNode&&(this.engine.gtaoNode.radius.value=e.value)}),B.addBinding(A,"thickness",{min:0,max:10,step:.01,label:"Thickness"}).on("change",e=>{this.engine.gtaoNode&&(this.engine.gtaoNode.thickness.value=e.value)}),B.addBinding(A,"distanceExponent",{min:0,max:10,step:.01,label:"DistanceExponent"}).on("change",e=>{this.engine.gtaoNode&&(this.engine.gtaoNode.distanceExponent.value=e.value)}),B.addBinding(A,"distanceFallOff",{min:0,max:10,step:.01,label:"DistanceFallOff"}).on("change",e=>{this.engine.gtaoNode&&(this.engine.gtaoNode.distanceFallOff.value=e.value)}),B.addBinding(A,"scale",{min:0,max:5,step:.01,label:"Scale"}).on("change",e=>{this.engine.gtaoNode&&(this.engine.gtaoNode.scale.value=e.value)}),B.addBinding(A,"samples",{min:1,max:64,step:1,label:"Samples"}).on("change",e=>{this.engine.gtaoNode&&(this.engine.gtaoNode.samples.value=Math.round(e.value))}),x(B,j,!P.enable)}else{const O=this.cfg.post.webgl.ssao,I=E.addFolder({title:"SSAO",expanded:P.guiOpened}),U=I.addBinding(P,"enable",{label:"Enable"}).on("change",e=>{this.engine.enableSsao(e.value),x(I,U,!e.value)});I.addBinding(O,"kernelRadius",{min:0,max:32,step:1,label:"KernelRadius"}).on("change",e=>{this.engine.ssaoPass&&(this.engine.ssaoPass.kernelRadius=e.value)}),I.addBinding(O,"minDistance",{min:0,max:.5,step:.001,label:"MinDistance"}).on("change",e=>{this.engine.ssaoPass&&(this.engine.ssaoPass.minDistance=e.value)}),I.addBinding(O,"maxDistance",{min:0,max:1,step:.01,label:"MaxDistance"}).on("change",e=>{this.engine.ssaoPass&&(this.engine.ssaoPass.maxDistance=e.value)}),x(I,U,!P.enable)}const S=this.cfg.post.ssr;if(this.modules.webGpuRendererClass){const k=this.cfg.post.webgpu.ssr,N=E.addFolder({title:"SSR",expanded:S.guiOpened}),J=N.addBinding(M,"ssrEnable",{label:"Enable"}).on("change",async e=>{await this.engine.enableSsr(e.value),x(N,J,!e.value)});N.addBinding(k,"maxDistance",{min:0,max:180,step:.01,label:"MaxDistance"}).on("change",e=>{this.engine.ssrNode&&(this.engine.ssrNode.maxDistance.value=e.value)}),N.addBinding(k,"intensity",{min:0,max:1,step:.01,label:"Intensity"}).on("change",e=>{this.engine.ssrNode&&(this.engine.ssrNode.intensity.value=e.value)}),N.addBinding(k,"thickness",{min:0,max:.1,step:.001,label:"Thickness"}).on("change",e=>{this.engine.ssrNode&&(this.engine.ssrNode.thickness.value=e.value)}),N.addBinding(k,"resolutionScale",{min:0,max:1,step:.01,label:"ResolutionScale"}).on("change",e=>{this.engine.ssrNode&&(this.engine.ssrNode.resolutionScale=e.value)}),N.addBinding(k,"quality",{min:0,max:1,step:.01,label:"Quality"}).on("change",e=>{this.engine.ssrNode&&(this.engine.ssrNode.quality.value=e.value)}),N.addBinding(k,"blurQuality",{min:1,max:3,step:1,label:"BlurQuality"}).on("change",e=>{this.engine.ssrNode&&(this.engine.ssrNode.blurQuality=Math.round(e.value))}),x(N,J,!S.enable)}else{const Y=this.cfg.post.webgl.ssr,Z=E.addFolder({title:"SSR",expanded:S.guiOpened});let z=null;const W=()=>{if(z)return;if(!this.modules.ssrPassClass)return;const e={Default:this.modules.ssrPassClass.OUTPUT.Default,"SSR Only":this.modules.ssrPassClass.OUTPUT.SSR,Beauty:this.modules.ssrPassClass.OUTPUT.Beauty,Depth:this.modules.ssrPassClass.OUTPUT.Depth,Normal:this.modules.ssrPassClass.OUTPUT.Normal,Metalness:this.modules.ssrPassClass.OUTPUT.Metalness};z=Z.addBinding(Y,"output",{label:"Output",options:e}).on("change",e=>{this.engine.ssrPass&&(this.engine.ssrPass.output=e.value)})},F=Z.addBinding(S,"enable",{label:"Enable"}).on("change",async e=>{await this.engine.enableSsr(e.value),W(),x(Z,F,!e.value)});Z.addBinding(Y,"fresnel",{label:"Fresnel"}).on("change",e=>{this.engine.ssrPass&&(this.engine.ssrPass.fresnel=e.value),this.engine.groundReflector&&(this.engine.groundReflector.fresnel=e.value)}),Z.addBinding(Y,"distanceAttenuation",{label:"DistanceAttenuation"}).on("change",e=>{this.engine.ssrPass&&(this.engine.ssrPass.distanceAttenuation=e.value),this.engine.groundReflector&&(this.engine.groundReflector.distanceAttenuation=e.value)}),Z.addBinding(Y,"maxDistance",{min:0,max:180,step:.01,label:"MaxDistance"}).on("change",e=>{this.engine.ssrPass&&(this.engine.ssrPass.maxDistance=e.value),this.engine.groundReflector&&(this.engine.groundReflector.maxDistance=e.value)}),Z.addBinding(Y,"opacity",{min:0,max:1,step:.01,label:"Opacity"}).on("change",e=>{this.engine.ssrPass&&(this.engine.ssrPass.opacity=e.value),this.engine.groundReflector&&(this.engine.groundReflector.opacity=e.value)}),Z.addBinding(Y,"thickness",{min:0,max:.1,step:.001,label:"Thickness"}).on("change",e=>{this.engine.ssrPass&&(this.engine.ssrPass.thickness=e.value)}),Z.addBinding(Y,"infiniteThick",{label:"InfiniteThick"}).on("change",e=>{this.engine.ssrPass&&(this.engine.ssrPass.infiniteThick=e.value)}),Z.addBinding(Y,"blur",{label:"Blur"}).on("change",e=>{this.engine.ssrPass&&(this.engine.ssrPass.blur=e.value)}),Z.addBinding(Y,"resolutionScale",{min:0,max:1,step:.01,label:"ResolutionScale"}).on("change",e=>{this.engine.ssrPass&&(this.engine.ssrPass.resolutionScale=e.value)}),Z.addBinding(Y,"bouncing",{label:"Bouncing"}).on("change",e=>{this.engine.ssrPass&&(this.engine.ssrPass.bouncing=e.value)}),Z.addBinding(Y,"clear",{label:"Clear"}).on("change",e=>{this.engine.ssrPass&&(this.engine.ssrPass.clear=e.value)}),W(),x(Z,F,!S.enable)}const D=this.cfg.post.aa,R=E.addFolder({title:"AA",expanded:D.guiOpened});let G=null;R.addBinding(M,"aaMode",{label:"Mode",options:{None:"none",FXAA:"fxaa",SMAA:"smaa"}}).on("change",async e=>{D.mode=e.value,await this.engine.enableAaMode(D.mode),G&&(G.hidden="fxaa"!==D.mode)}),this.modules.webGpuRendererClass||(G=R.addBinding(this.cfg.post.webgl.aa.fxaa,"sharpness",{min:.1,max:1,step:.05,label:"Sharpness"}).on("change",e=>{"fxaa"===D.mode&&this.engine.setFxaaResolution(e.value)}),G.hidden="fxaa"!==D.mode)}const C=this.pane.addFolder({title:"Scene",expanded:this.cfg.scene.guiOpened});if(this.cfg.scene.ambientlight.enable){const H=C.addFolder({title:"Ambient Light",expanded:!0});H.addBinding(this.cfg.scene.ambientlight,"enable",{label:"Enabled"}).on("change",e=>{e.value?this.engine.setAmbientLight({color:this.cfg.scene.ambientlight.color,intensity:this.cfg.scene.ambientlight.intensity}):this.engine.removeAmbientLight()}),H.addBinding(this.cfg.scene.ambientlight,"color",{label:"Color",view:"color"}).on("change",e=>{this.engine.setAmbientLight({color:e.value})}),H.addBinding(this.cfg.scene.ambientlight,"intensity",{min:0,max:5,label:"Intensity"}).on("change",e=>{this.engine.setAmbientLight({intensity:e.value})})}if(this.cfg.scene.hemisphere.enable){const q=C.addFolder({title:"Hemisphere Light",expanded:!0});q.addBinding(this.cfg.scene.hemisphere,"enable",{label:"Enabled"}).on("change",e=>{e.value?this.engine.setHemisphereLight({skyColor:this.cfg.scene.hemisphere.skyColor,groundColor:this.cfg.scene.hemisphere.groundColor,intensity:this.cfg.scene.hemisphere.intensity}):this.engine.removeHemisphereLight()}),q.addBinding(this.cfg.scene.hemisphere,"skyColor",{label:"Sky Color",view:"color"}).on("change",e=>{this.engine.setHemisphereLight({skyColor:e.value})}),q.addBinding(this.cfg.scene.hemisphere,"groundColor",{label:"Ground Color",view:"color"}).on("change",e=>{this.engine.setHemisphereLight({groundColor:e.value})}),q.addBinding(this.cfg.scene.hemisphere,"intensity",{min:0,max:5,label:"Intensity"}).on("change",e=>{this.engine.setHemisphereLight({intensity:e.value})})}if(this.cfg.scene.fog.enable){const V=C.addFolder({title:"Fog",expanded:!0});V.addBinding(this.cfg.scene.fog,"enable",{label:"Enabled"}).on("change",e=>{e.value?this.engine.setFog({color:this.cfg.scene.fog.color,near:this.cfg.scene.fog.near,far:this.cfg.scene.fog.far}):this.engine.removeFog()}),V.addBinding(this.cfg.scene.fog,"color",{label:"Color",view:"color"}).on("change",e=>{this.engine.setFog({color:e.value})}),V.addBinding(this.cfg.scene.fog,"near",{min:0,max:50,label:"Near"}).on("change",e=>{this.engine.setFog({near:e.value})}),V.addBinding(this.cfg.scene.fog,"far",{min:0,max:100,label:"Far"}).on("change",e=>{this.engine.setFog({far:e.value})})}if(this.cfg.envCtrls.enable||this.cfg.envCtrls.load){const X=C.addBinding(this.cfg.envCtrls,"enable",{label:"Enabled"}),_=C.addFolder({title:"Background",expanded:!1}),K=C.addFolder({title:"Environment",expanded:!1});X.on("change",e=>{e.value?this.envCtrls.enable():this.envCtrls.disable(),_.disabled=!e.value,K.disabled=!e.value}),_.disabled=!this.cfg.envCtrls.enable,K.disabled=!this.cfg.envCtrls.enable,_.addBinding(this.cfg.envCtrls,"backgroundBlurriness",{min:0,max:1,label:"Blurriness"}).on("change",e=>{this.envCtrls.set({backgroundBlurriness:e.value})}),_.addBinding(this.cfg.envCtrls,"backgroundIntensity",{min:0,max:5,label:"Intensity"}).on("change",e=>{this.envCtrls.set({backgroundIntensity:e.value})}),K.addBinding(this.cfg.envCtrls,"environmentIntensity",{min:0,max:10,label:"Intensity"}).on("change",e=>{this.envCtrls.set({environmentIntensity:e.value})});const $=this.envCtrls.get().rotation;if($){const Q={x:$.x,y:$.y,z:$.z};K.addBinding(Q,"x",{min:0,max:360,label:"Rotate X"}).on("change",()=>{this.envCtrls.set({rotation:Q})}),K.addBinding(Q,"y",{min:0,max:360,label:"Rotate Y"}).on("change",()=>{this.envCtrls.set({rotation:Q})}),K.addBinding(Q,"z",{min:0,max:360,label:"Rotate Z"}).on("change",()=>{this.envCtrls.set({rotation:Q})})}}}},Modules=class{gpuTier=null;fxaaNode=null;fxaaShader=null;smaaPassClass=null;smaaNode=null;ssaoPassClass=null;gtaoNodeClass=null;ssrNode=null;ssrPassClass=null;paneClass=null;createBrowserInspector=null;effectComposerClass=null;envLoader=null;dracoLoader=null;gltfLoader=null;ktx2Loader=null;meshoptDecoder=null;outputPassClass=null;renderPassClass=null;shaderPassClass=null;orbitControlsClass=null;pointerLockControlsClass=null;webGpuRendererClass=null;renderPipelineClass=null;tslPass=null;tslMrt=null;tslOutput=null;tslNormalView=null;tslMetalness=null;tslRoughness=null;tslSample=null;tslVec2=null;tslVec3=null;tslVec4=null;tslFloat=null;packNormalToRGB=null;unpackRGBToNormal=null;cfg;constructor(e){this.cfg=e}consoleLog(e){"none"!==this.cfg.debug.log&&console.log(`Module ${e} successfully imported.`)}async importDracoLoader(){if(!this.dracoLoader&&"draco"===this.cfg.model.compress.mesh)try{const e=await import("three/addons/loaders/DRACOLoader.js");this.consoleLog("DRACOLoader"),this.dracoLoader=new e.DRACOLoader,this.dracoLoader.setDecoderPath("draco/")}catch{console.warn("DRACOLoader could not be imported")}}async importEffectComposer(){if(!this.effectComposerClass)try{const e=await import("three/addons/postprocessing/EffectComposer.js");this.effectComposerClass=e.EffectComposer,this.consoleLog("EffectComposer")}catch{console.warn("EffectComposer could not be imported")}}async importENVLoader(){if(!this.envLoader&&(this.cfg.envCtrls.enable||this.cfg.envCtrls.load))if("exr"===this.cfg.envCtrls.type)try{const e=await import("three/addons/loaders/EXRLoader.js");this.consoleLog("EXRLoader");const t=new e.EXRLoader;this.envLoader=t}catch{console.warn("EXRLoader could not be imported")}else if("hdr"===this.cfg.envCtrls.type)try{const e=await import("three/addons/loaders/HDRLoader.js");this.consoleLog("HDRLoader");const t=new e.HDRLoader;this.envLoader=t}catch{console.warn("HDRLoader could not be imported")}}async importFpvCtrls(){if(this.cfg.fpvCtrls.enable||this.cfg.fpvCtrls.load)try{const e=await import("three/addons/controls/PointerLockControls.js");this.pointerLockControlsClass=e.PointerLockControls,this.consoleLog("PointerLockControls")}catch{console.warn("PointerLockControls could not be imported")}}async importFXAANode(e){if(!this.fxaaNode&&"fxaa"===e)try{const e=await import("three/addons/tsl/display/FXAANode.js");this.fxaaNode=e.fxaa,this.consoleLog("FXAANode")}catch{console.warn("FXAANode could not be imported")}}async importFXAAShader(e){if(!this.fxaaShader&&"fxaa"===e){try{const e=await import("three/addons/shaders/FXAAShader.js");this.fxaaShader=e.FXAAShader,this.consoleLog("FXAAShader")}catch{console.warn("FXAAShader could not be imported")}if(!this.shaderPassClass)try{const e=await import("three/addons/postprocessing/ShaderPass.js");this.shaderPassClass=e.ShaderPass,this.consoleLog("ShaderPass")}catch{console.warn("ShaderPass could not be imported")}}}async importGLTFLoader(){if(this.cfg.model.file)try{const e=await import("three/addons/loaders/GLTFLoader.js");this.consoleLog("GLTFLoader"),this.gltfLoader=new e.GLTFLoader}catch{console.warn("GLTFLoader could not be imported")}}async importGpuDetect(){try{const e=await import("detect-gpu");this.consoleLog("detect-gpu");const t=e.getGPUTier;this.gpuTier=await t()}catch{console.warn("detect-gpu could not be imported")}}async importGtaoNode(e){if(!this.gtaoNodeClass&&e)try{const e=await import("three/addons/tsl/display/GTAONode.js");this.gtaoNodeClass=e.ao,this.consoleLog("SSAONode")}catch{console.warn("SSAONode could not be imported")}}async importKTX2Loader(){if(!this.ktx2Loader&&"ktx2"===this.cfg.model.compress.texture)try{const e=await import("three/addons/loaders/KTX2Loader.js");this.ktx2Loader=new e.KTX2Loader,this.consoleLog("KTX2Loader")}catch{console.warn("KTX2Loader could not be imported")}}async importMeshoptDecoder(){if(!this.meshoptDecoder&&"meshopt"===this.cfg.model.compress.mesh)try{const e=await import("three/addons/libs/meshopt_decoder.module.js");this.meshoptDecoder=e.MeshoptDecoder,this.consoleLog("MeshoptDecoder")}catch{console.warn("MeshoptDecoder could not be imported")}}async importOrbitCtrls(){if(this.cfg.orbitCtrls.enable||this.cfg.orbitCtrls.load)try{const e=await import("three/addons/controls/OrbitControls.js");this.orbitControlsClass=e.OrbitControls,this.consoleLog("OrbitControls")}catch{console.warn("OrbitControls could not be imported")}}async importOutputPass(){if(!this.outputPassClass)try{const e=await import("three/addons/postprocessing/OutputPass.js");this.outputPassClass=e.OutputPass,this.consoleLog("OutputPass")}catch{console.warn("OutputPass could not be imported")}}async importRenderPass(){if(!this.renderPassClass)try{const e=await import("three/addons/postprocessing/RenderPass.js");this.renderPassClass=e.RenderPass,this.consoleLog("RenderPass")}catch{console.warn("RenderPass could not be imported")}}async importSMAANode(e){if(!this.smaaNode&&"smaa"===e)try{const e=await import("three/addons/tsl/display/SMAANode.js");this.smaaNode=e.smaa,this.consoleLog("SMAANode")}catch{console.warn("SMAANode could not be imported")}}async importSMAAPass(e){if(!this.smaaPassClass&&"smaa"===e)try{const e=await import("three/addons/postprocessing/SMAAPass.js");this.smaaPassClass=e.SMAAPass,this.consoleLog("SMAAPass")}catch{console.warn("SMAAPass could not be imported")}}async importSSAOPass(e){if(!this.ssaoPassClass&&e)try{const e=await import("three/addons/postprocessing/SSAOPass.js");this.ssaoPassClass=e.SSAOPass,this.consoleLog("SSAOPass")}catch{console.warn("SSAOPass could not be imported")}}async importSsrNode(e){if(!this.ssrNode&&e)try{const e=await import("three/addons/tsl/display/SSRNode.js");this.ssrNode=e.ssr,this.consoleLog("SSRNode")}catch{console.warn("SSRNode could not be imported")}}async importSsrPass(e){if(!this.ssrPassClass&&e)try{const e=await import("three/addons/postprocessing/SSRPass.js");this.ssrPassClass=e.SSRPass,this.consoleLog("SSRPass")}catch{console.warn("SSRPass could not be imported")}}async importStatelyAi(){if(!this.createBrowserInspector&&this.cfg.stateMachine.inspector)try{const e=await import("@statelyai/inspect");this.createBrowserInspector=e.createBrowserInspector,this.consoleLog("StatelyAi Inspector")}catch{console.warn("StatelyAi Inspector could not be imported")}}async importThreeTsl(){try{const e=await import("three/tsl");this.tslPass=e.pass,this.tslMrt=e.mrt,this.tslOutput=e.output,this.tslNormalView=e.normalView,this.tslMetalness=e.metalness,this.tslRoughness=e.roughness,this.tslSample=e.sample,this.tslVec2=e.vec2,this.tslVec3=e.vec3,this.tslVec4=e.vec4,this.tslFloat=e.float,this.packNormalToRGB=e.packNormalToRGB,this.unpackRGBToNormal=e.unpackRGBToNormal,this.consoleLog("Three TSL")}catch{console.warn("Three TSL could not be imported")}}async importThreeWebGpu(){try{const e=await import("three/webgpu");this.webGpuRendererClass=e.WebGPURenderer,this.renderPipelineClass=e.RenderPipeline,this.consoleLog("WebGPU")}catch{console.warn("Three WebGPU could not be imported")}}async importTweakpane(){if(this.cfg.gui.inspector.enable)try{const e=await import("tweakpane");this.paneClass=e.Pane,this.consoleLog("Tweakpane")}catch{console.warn("Tweakpane could not be imported")}}};function _0x5b8c(){const e=["te9xpgjYpLbVD2vY","C2HHzg93uM9VDa","CxvLCNLtzwXLy3rVCG","i3bVD2vY","y2fUDMfZ","yxjPys1WCMvZC2vK","Dg9Nz2XLu2nYzwvUu2L6zq","Aw5Uzxjive1m","i2XVz28","y3jLyxrLrwXLBwvUDa","zNbZtgLTAxrLCG","yxr0ywnOu2HHzg93","yxbWzw5K","mtzyCwPUCgi","C3r5Bgu","i21LBNvIDxr0B25Z","z2v0qxr0CMLIDxrL","seLhsdXICJ5qB3DLCG","yxbWzw5Kq2HPBgq","CMvUzgvY","Dgv4DenVBNrLBNq","ywrKrxzLBNrmAxn0zw5LCG","i2XPy2vUC2u","ntmYmtG4tfD2s25n","Dw5KzwzPBMvK","zw5HyMXL","C2v0qMfJA2DYB3vUzenVBg9Y","i3nPEMu","i3bVD2vYlxrLEhq","twf4Aw1PEMu","i21LBNvIyxiGEW0kicb6lwLUzgv4oIaXmdaWoW0kicbWB3nPDgLVBJOGzML4zwq7ic8Qie9YAwvUDgf0zxmGDg8GDMLZDwfSihzPzxDWB3j0ig9UigfUzhjVAwqGzgv2AwnLCYWGywjZB2X1DguGBM90icOVdqOGigjVDhrVBtOGmJbWEdSGBgvMDdOGntaLoW0kicb0CMfUC2zVCM06ihrYyw5ZBgf0zvGOltuWjsK7ia0kicbKAxnWBgf5oIbMBgv4oW0kicbMBgv4lwrPCMvJDgLVBJOGy29SDw1UoYaGicaGia0kicbHBgLNBI1PDgvTCZOGy2vUDgvYoW0kicbMB250lxnPEMu6ideYChG7dqOGigzVBNqTzMfTAwX5oIbbCMLHBcWGsgvSDMv0AwnHlcbZyw5ZlxnLCMLMoYaGicaGdqOGigDHCdOGnxb4oW0kFq0kdqOJBwvUDwj1DhrVBNmGEW0kicbKAxnWBgf5oIbMBgv4oW0kicbHBgLNBI1PDgvTCZOGy2vUDgvYoW0kicbNyxa6idqWChG7dqOGihbHzgrPBMC6idvWEcaYmhb4oW0kicbMB250lwzHBwLSEtOGqxjPywWSieHLBhzLDgLJysWGC2fUCY1ZzxjPzJSncIaGzM9UDc1ZAxPLoIaXCMvToW0kicbJB2XVCJOGi2zMzJSncIaGyMfJA2DYB3vUzdOGi2zMzMzMzJi5oW0kicbIB3jKzxi6idfWEcbZB2XPzcaJzMzMzMzMmgq7dqOGigjVCMrLCI1YywrPDxm6idjLBtSncIaGyM94lxnOywrVDZOGAw5ZzxqGmcaXChGGm3b4icnMzMzMzMy0mcWGAw5ZzxqGmcaTmtbWEcaXohb4icmWmdaWmdaYmdSncIaGyMfJA2rYB3aTzMLSDgvYoIbIBhvYkdeYChGPoW0kicaTD2vIA2L0lwjHy2TKCM9WlwzPBhrLCJOGyMX1CIGXmNb4ktSncIaGy3vYC29YoIbWB2LUDgvYoW0kicbWB2LUDgvYlwv2zw50CZOGyxv0BZSncN0ncG0ki2XVz28GEW0kicbVCgfJAxr5oIaWlJG7dqOGigrPC3bSyxK6igLUBgLUzs1IBg9JAZSncIaGD2LKDgG6ideUogvToYbOzwLNAhq6ideUogvToW0kicbIywnRz3jVDw5KlxnPEMu6ignVBNrHAw47dqOGigjHy2TNCM91BMqTCMvWzwf0oIbUBY1YzxbLyxq7dqOGigjHy2TNCM91BMqTCg9ZAxrPB246ignLBNrLCJSncIaGlYOGrw5JB2rLzcb2AweGAhr0Chm6lY95B2TZzwWUz2L0AhvIlMLVl3vYBc1LBMnVzgvYlYaQlW0kicbIywnRz3jVDw5KlwLTywDLoIb1CMWOiMrHDge6Aw1Hz2uVC3zNk3HTBcWLm0nZDMCGDMvYC2LVBJ0Nms4YjYb4BwXUCZ0NAhr0CdOVl3D3DY53mY5VCMCVmJaWmc9ZDMCNihzPzxDcB3G9jZaGmcaYndqGmJG1jYb3Awr0Ad0NmJq0jYbOzwLNAhq9jZi4nsCLm0uLm0nZDhLSzsuZrsaUCZaGjtDcigzPBgW6icuYm2y0mgi1nYaLn0qGjtndl3n0EwXLjtnfjtndCgf0AcbPzd0Nu2HHCguGmsCGzMLSBc1YDwXLpsDLDMvUB2rKjYbJBgfZCZ0NCZaNigq9j201mIaWDJi4nwWTnteTnJiUmJD2lte2mc40nNONlYuZrsuZq3bHDgGGAwq9j1nOyxbLideGy29WEsCGzMLSBc1YDwXLpsDLDMvUB2rKjYbJBgfZCZ0NCZaNigq9j20XndGGmhyYodvSltuXltyYlJi3DI0XnJaUndz6jY8Lm0uLm0nWyxrOigLKpsDtAgfWzsaXignVChKGmICGzMLSBc1YDwXLpsDLDMvUB2rKjYbJBgfZCZ0NCZaNigq9j20YndqGmhyYodvSltuXltyYlJi3DI0XnJaUndz6jY8Lm0uLm0mVC3zNjtnfiIK7dqP9dqOncInWB3DLCIb7dqOGigrPC3bSyxK6igzSzxG7dqOGigfSAwDUlwL0zw1ZoIbJzw50zxi7dqOGihbVC2L0Aw9UoIbYzwXHDgL2ztSncIaGCgfKzgLUzZOGmdSncIaGD2LKDgG6idKWChG7igHLAwDODdOGmZzWEdSncIaGyMfJA2DYB3vUzc1JB2XVCJOGiZaWmdaWmdq0oW0kicbIB3jKzxiTCMfKAxvZoIaYmhb4oW0kicbIB3jKzxi6ig5VBMu7dqOGign1CNnVCJOGCg9PBNrLCJSncIaGDhjHBNnPDgLVBJOGyMfJA2DYB3vUzc1JB2XVCIaWlJnZigvHC2u7dqP9dqOncInWB3DLCI1RBM9IihSncIaGEI1PBMrLEdOGmJSncIaGB3bHy2L0EtOGmc45oW0kicbWB3nPDgLVBJOGywjZB2X1Dgu7dqOGigXLzNq6idzWEdSGlYOGu3rHCNrWB3nPDgLVBIbSzwz0icOVdqOGihDPzhrOoIaYnxb4oYbOzwLNAhq6idi1ChG7dqOGigjHy2TNCM91BMqTy29SB3i6ihDOAxrLoW0kicbIB3jKzxiTCMfKAxvZoIa1mcu7dqOGihrYyw5ZAxrPB246ihrYyw5ZzM9YBsaWlJnZigvHC2uTAw4TB3v0oW0kFq0kdqOJCg93zxiTDgv4Dcb7dqOGihOTAw5KzxG6ide7ic8QiejLAgLUzcbRBM9IicOVdqOGig9WywnPDhK6idaUodSncIaGzgLZCgXHEtOGzMXLEdSncIaGCgfKzgLUzZOGmcaXnhb4oW0kicb3Awr0AdOGmtaWjtSncIaGANvZDgLMEs1JB250zw50oIbMBgv4lwvUzdSGlYOGvgv4DcbYAwDODcaQlW0kicbMB250lxDLAwDODdOGyM9SzdSncIaGzM9UDc1ZAxPLoIaWlJLLBtSncIaGDhjHBNnPDgLVBJOGy29SB3iGm3m7dqOGignVBg9YoIb3AgL0ztSncN0ncG0klYOGu3rHDguGAgLNAcbIywnRz3jVDw5KicOVdqOJCg93zxjByxjPys1WCMvZC2vKpsj0CNvLiL0GEW0kicbIywnRz3jVDw5KlwnVBg9YoIaJzJqWyJu3otK7dqP9dqOncI8Qifn0yxrLigHPz2GGDgv4DcOVdqOJCg93zxjByxjPys1WCMvZC2vKpsj0CNvLiL0Gi3bVD2vYlxrLEhqGEW0kicbQDxn0Awz5lwnVBNrLBNq6igzSzxGTC3rHCNq7dqP9dqOncI8Qifn0yxrLigHPz2GGA25VyIaQlW0ki3bVD2vYw2fYAweTChjLC3nLzd0IDhj1zsjDicnWB3DLCI1RBM9IihSncIaGDhjHBNnMB3jToIb0CMfUC2XHDgvykduYChGPoYancN0ncG0klYOGu3rHDguGBg93icOVdqOJCg93zxjByxjPys1WCMvZC2vKpsjMywXZzsjDicnWB3DLCI10zxH0ihSncIaGANvZDgLMEs1JB250zw50oIbMBgv4lwvUzdSncIaGDgv4Dc1HBgLNBJOGBgvMDdSncN0ncG0ki3bVD2vYlMLUDgvYywn0zwrByxjPys1WCMvZC2vKpsj0CNvLiL0Gi3bVD2vYlxrLEhqGEW0kicbQDxn0Awz5lwnVBNrLBNq6igzSzxGTC3rHCNq7dqOGigfUAw1HDgLVBJOGzMfKzs10BY1OAwDOidaUnhmGzwfZzs1PBI1VDxq7dqP9dqOncInWB3DLCI5PBNrLCMfJDgvKw2fYAweTChjLC3nLzd0IzMfSC2uIxsaJCg93zxiTDgv4Dcb7dqOGigP1C3rPzNKTy29UDgvUDdOGzMXLEc1LBMq7dqOGigfUAw1HDgLVBJOGzMfKzs10BY1SB3CGmc40CYbLyxnLlwLUlw91DdSncN0ncG0kqgTLEwzYyw1LCYbMywrLlxrVlwHPz2GGEW0kicaWjsb7ig9WywnPDhK6idaUodSGFq0kicaYmcuGEYbVCgfJAxr5oIaWoYb9dqOGideWmcuGEYbVCgfJAxr5oIaWlJG7ih0ncN0ncG0kqgTLEwzYyw1LCYbMywrLlxrVlwXVDYb7dqOGidaLihSGB3bHy2L0EtOGmc44oYb9dqOGidiWjsb7ig9WywnPDhK6ida7ih0ncIaGmtaWjsb7ig9WywnPDhK6idaUodSGFq0kFq0kdqOJC2L6zsb7dqOGig9WywnPDhK6idaUodSncIaGD2LKDgG6idjLBtSGAgvPz2H0oIaYzw07dqOGigjHy2TNCM91BMq6ig5VBMu7dqOGigjVCMrLCJOGBM9UztSncIaGy3vYC29YoIbWB2LUDgvYoW0kicbIywnRz3jVDw5KlxnPEMu6ignVBNrHAw47dqOGigjHy2TNCM91BMqTCMvWzwf0oIbUBY1YzxbLyxq7dqOGigjHy2TNCM91BMqTCg9ZAxrPB246ignLBNrLCJSncIaGlYOGrw5JB2rLzcb2AweGAhr0Chm6lY95B2TZzwWUz2L0AhvIlMLVl3vYBc1LBMnVzgvYlYaQlW0kicbIywnRz3jVDw5KlwLTywDLoIb1CMWOiMrHDge6Aw1Hz2uVC3zNk3HTBcWLm0nZDMCGDMvYC2LVBJ0Nms4YjYb4BwXUCZ0NAhr0CdOVl3D3DY53mY5VCMCVmJaWmc9ZDMCNihzPzxDcB3G9jZaGmcaZmdGGmZeYjYb3Awr0Ad0NmZa4jYbOzwLNAhq9jZmXmICLm0uLm0nZDhLSzsuZrsaUCZaGjtDcigzPBgW6icuYm2zMzMzMzIaLn0qGjtndl3n0EwXLjtnfjtndCgf0AcbPzd0Nq29SB3iGrMLSBcaXjYbMAwXSlxj1Bgu9j2v2zw5VzgqNignSyxnZpsDZmcCGzd0NBteZlJy3idCUmdvSnZmUmtCTmc4XmYa0lJyGnc42m2mYlJuZidiUntuGnc42idyUmtiGnc42idCUotuGmcaXlJGYlteUntiGns4ZnY0ZlJm2idCUodGTmY4Zmsa0lJq5ltmUnJKGnc41nY00mI44mIa1lJm5Bdm2lJK5idm3lJm0yZi5lJK2idmWlJi0idm3lJaXidm4lJiXidm3lJa2idqXlJKGmc4WncaYlJuXlteUnJeGnI40ns0ZlJy1idGUnZuTmI42nYaZlJaXltuUmZqGnc4XnY05lJq5idqUmtmTns4Yos0WlJa3ltGUodmTmY4Xnc03os4Yns03mY44nMWWlJaYide3lJG0yZaUmdeGos44ms0WlJCZide5lJmZlteUnJmGmJeUmtuTmc45msaXlJGZltmUodGGnc40nc02lJyXiduUodeTmI43mIaXlJm3ltuUmZiGmI40os01lJC3idiUndKTmc40nIaWltmUndmTmI4Ync0XmI4Zoc05lJK2Bc0WlJm4ltCXlJf6BtiWnY45ncaWBdCZlJe3ltaUmtiGos4YidKUmJuTmc4Wmsa3ms4ZnI00lJe4idqUntzJltiUndiGmI42nc01lJKYidqUntyToc4Zmsa0lJu2ltiUmJCGmc01lJK4lteUmtiToc4Yns0YlJq5ltqUmdiTmI40mI00lJeZltiUotGTnc4XmY0Yms41nYaWlteYlJG4ltaUntKTmtKUmdGTms44mY0Xos4Woc0XlJaXidaTmtCUosaXnI4Wnc0ZnY41ncaZns42ns0Zmc4ZncaZmc4Yos0ZnI40nIaZns42nI00mc42nYaZns43ms0ZlJi0idaUmdqTnI41nY0XlJuYltKUnJqTnc41mY0ZlJG1ltmUnZGTnc40os01lJq5ltmUntKTos41ocaWlJC4ltmUntuGmteUmJyTmtuUmJqGmZyUndqTndaUnJyGmtKUndqTmtKUnJiGmZuUmZyTmZyUmJqGmZuUmZyTmZyUotiGmc4Wms0WlJy5ltCUnZGTms4Yns0XnY4Zms0XlJi1ltKUntmGmc0Xoc41ns0WlJu2ltiWlJa0lteUmJqTms40os0WlJy5ltmUnZeTmY4ZltqUotuTns44ms0XlJiZltiUnteTmI4ZmY01lJi1ltiUndmTnI4Wos0WlJeTmc44nsaXlJGXltmUodmGnc4YnI02lJy0EM0TmteXlJe3ide4mc44ogmZlJy0idaGnI41nYaXlJqXidKUndyGnc41nYaYlJmGmI41msa0lJeZidyUndmGnc4Woca4lJCXltaUmdGGmY4XmY05lJmXideZlJqYltC1lJeGnZKUnZfSndaUndmTmc4WnIaZlJmGnc45ogmYlJaZidmUmdCGmI45osa2lJu4idiUndGGos4XmY0WlJq1idiUmJGTmI41iduUnJyTnc41nca3lJuTmY40osaZlJe1ltuUotiGmY4Zns03nI4ZmYaZlJm2Bc05lJaYltKUmI0WlJaZltm0lJq0yY0WlJaXltiYlJK5idaUnJeTmZuUnJCGms45ltm4lJe2ideUmduTmI4WnIaZlJa5ltqUnJuGnc41mY01lJC2ideUndqTms4Xmsa0lJy2ltiUmduGnY4XnI0YlJa3idiUnJKTmc4Wnca2lJiYideUnJmGoc42nIa0lJa5idmUodCGmY44osa0lJe1iduUmZqGnc43oca0ms4ZowWZnI40oc0ZnI44n2mZmI4Zoc0ZmI43ncaZnY4WnY0ZnI44oca0ms43nI0ZnI44ohPTodGUndmGmc4Wm2m0lJq4idaUmdmGos43mIa0lJyYidqWlJyYidm1lJy2ide5lJuYide5lJyGmZyUndiGmZuUnJqGmZCUntuGmZuUnJuGms41msaWlJaYidiUmtCTns4XnIaYlJG5ltm4lJu5BduUnZCTmY4WmMm0lJq1ltiUmZmGnI41nc0YlJyYidKUmdGTms4YnsaXlJGYidaUotGGnc41ocaZlJm3idyUmtuGns4ZmIaYlJuGmY4XidiUodCGnY45ocaZlJa1idC0lJLSltGUodiGos4XmY0ZnI41ltaUmdzJlti2lJa4ltaUmdqTmZCUmJqTmc42mY0Zos4Xms0YlJa3lteUndqTms4Xms0ZlJq5ltmUnY00lJu0ltuUnZyTms4WnI0YlJa1lteUotuTnc42nI0XlJK4ltuUodeTmc4WmY0XlJe0ideUodmTnc4XmIa0lJeZltyUnJmGnc4Xms00lJq4idqUntmTnc41nYa0mI45nI00lJu2Bc0Zns43mI0ZnI4XyY0Xos42nc0Xos44ns0ZnI41nc0ZnY43nY0ZnY41nc0Zos44mY0XlJaXltiUmduTms45mY00lJC1ltiUmduTnI0WlJeZlteUmJqGms44mY00lJiZidqUmZuTnI42mYaYlJK2ltiUodmGnI4Zos00lJm3idKUnZeTnc4ZnxONlYuZrsuZqY9ZDMCLm0uIktSncN0ncG0ki3nPEMvByxjPys1WCMvZC2vKpsj0CNvLiL0GEW0kicaVkIbfBMnVzgvKihzPysbODhrWCZOVl3LVA3nLBc5NAxrODwiUAw8VDxjSlwvUy29KzxiVicOVdqOGigjHy2TNCM91BMqTAw1Hz2u6ihvYBcGIzgf0ytPPBwfNzs9ZDMCREg1SlcuZq3n2zYb2zxjZAw9UpsCXlJiNihHTBg5ZpsDODhrWoI8VD3D3lNCZlM9YzY8YmdaWl3n2zYCGDMLLD0jVEd0NmcaWidmWocaZmtiNihDPzhrOpsCZmdGNigHLAwDODd0NmZeYjYuZrsuZq3n0EwXLjtnfic5ZmcaLn0iGzMLSBdOGjtiZzMzMzMzMicu3rcaLm0mVC3r5BguLm0uLm0nWyxrOigLKpsDdB2XVCIbgAwXSidiNigzPBgWTCNvSzt0NzxzLBM9KzcCGy2XHC3m9j3mWjYbKpsDTos4ZmsaXmc40nMmTmY41idiUnJqTnc41mIa0lJC1ltqUnca5lJeXidaUmtqGns4XmYaZlJC5idKUmZiGmZCUmdmGndiUntzSmZyUodGGmZyUodHJltm4lJu5idaUodiTmZKUmdeGmc45ms00mI4ZmIa1lJm5lteUoduGmI41ms0ZlJm3idyUmduTmY4ZnYa3lJG3idaGms44mIaXlJuYiduUmZCGmY4ZnYa3lJG3BdmUmZCGnc41nMm3nc43ocaWlJa5idC1lJq4idaUmdiGnZKUmteTmY42ocaZlJyTmY42ocaZlJCTnc43ncaZlJCZltqXlJq4BdaUmdqTmZCUnZfJltCUmdCTns4YmY0Xmc42ms02lJC1lteYlJq0ltyUnZuTms44mIaWltuUmZyGms41mI03lJG3idmUmZGTnc41msaZlJm0ltqUntyGmY41nI00lJu2idiYlJqZidaGmtaUndGTmc41nIaXos4Wns0XlJi0ide5lJa1ltaUnJGTmc4Wms0XnY42ns0XnI40ms0ZnY43ms0ZnI40nc0Yoc42nc0Yoc42ms0ZnY4Zoc0ZnI40mY00mc43nY0ZnI40ns0YlJm2ltaUmdeTnI4ZnsaXlJuYltGUoduGmY40mxPTmJm5lJqGmZqUmtLSltm3lJu5idm3lJyZyY0WlJuZltqWlJi0ltaUntGTndaUndKTns4Wos00mY44mI0YlJuTms44nI02lJa5ltmUmZuTnY45nY0ZlJmYlteUodCGmc4WmY01lJqYideUntuTnY44nYaZlJm3Bc00lJq2idmUmZjJltaUmdKGnZqUnZGTmc4WmIa3ns40ocaZlJy5idC5lJeXidmUnJCGmY41osa0lJC4idmUnJKGndeUmdyGmY43nYaZnI42nIaWlJa4idm3lJm2idaUmdeGndaUotKTmY42osaYlJaZltiUmdGGmY43mY01lJy0idmUnZGTnY45mIaWlJa2ltiUmJGTms40mI02lJe5ltmUmJGToc43ltmUmZqTnc41mY0ZlJuXltqUntyTmJiUodqTnc41m2WTmtKUndGGmc4WmMm3ms41os03ms43nca3mY42nI03nc4Xnsa3mY43ms04mc4WmIaWlJa0ltqUodKTmc45mI02lJK0ltqUnteTos41os0YlJuXlteUoduTnI4Zns0ZlJm1ltGUntuTmY4Zms0YlJK3idaUmdqTmtmUnJKGos43nI00ms41osaZnY42ohPTltiWnc40ide0mY4WngmTmI40msaWlJq1ltuUodGGmI4XmY03lJCYidmUnZmTmI4WnsaXlJC3ltmUmZyGnc45oc0ZlJm5idGUmJGTmc4WmYaZlJq3ideUmYa2lJy5idmUnZmGos4WnsaZlJm3idmUmJyGns43osaZlJCGmJiUodmGnc4XngWXos4WnIaWlJq5yY02nc44nsa2ns41oc03mY43nYa3ns41oc03mY44msa3oc43mY0WlJaZidiUmJCGms40nIa2lJe5idmUmZeGoc43idiUmJCGmY4WnYa0lJG3idqUntuGnY45mYa0lJuZidiUnteTmc4Wmsa1lJq2ltaUntCGnI41ns0XlJi0ideUmdKTmc42nYaXoc4Ync0XnY4YnIaZoc4XmI0ZnI44nMWZnI4Xnc0Zns42m2mWlJGYidm4lJu5idaUoteGmZKUmdeGns4Zoca0mI4ZmIaYlJuXideUodyGnI4WnsaZlJm3idCUodCGmY4ZnYaXlJGZidaGns4ZnY0XlJuXidCUodGTmY4Zn2W0lJu2ltmUmZDJmc4Woc03nc44idaUmdiTnZuUndCTmY42os03os4WmY0ZlJu4ltmUndiTns41ltmUnJmTmZCUmdGTnc4Xnc0Xoc4Zms0WlJi5ltm1lJi3ltaUmtyTmZCUnJCGmc4ZEM0XndqUnYaZlJGZyY0ZlJKXidmUodmTmY45msaZlJKYltmUnIa0ms40ngWWlJmYidm3lJzJnY4WnIa1lJiZideWlJyXidyUnZqGmtiUndmGnI43ncaXlJGYidaGns4ZnY0XlJuXidCUodCTmY4ZnYa0lJu1ltmUmZyGnc41nI0ZlJqZidqUntmTmJmUnJHSltaUmdiTmJaUm2m2os43osa2os42nsa3nI4Ymsa3ns4ZmYa4mc40nca3ns40msaZlJa4idaUmdyGnI4Zoc0XlJm1idGUnJyTmY42ocaYlJqXltiUndyGmY43ltuUocaZlJy5ltKUntCTmc4Wms01lJm1ltiUodGToc42oc0ZnI40mI00mI4Yn2WTmZyUndiTmZyUndzJmZCUnZeTmc44mIaZoc4Xoc0WlJKZidqXlJq4ltuUmZKGms44nI0YlJuXidmUmZGTnI4WnsaZlJm4ltCUodCGmc0XlJGZlteUntiTns4ZnY0ZlJm4ltCUodHSltmUmZCTnc41nwmTnZuUmtyGmc03ns43mYaWlJa1ltC5lJu5idmUodn6jY8Lm0uLm0mVC3zNjtnfiIK7ia0kFq0kdqOJBgLJzw5Zzsb7dqOGigzVBNqTC2L6ztOGmc45zw07dqOGihDOAxrLlxnWywnLoIbUB3DYyxa7dqOGihrLEhqTywXPz246ignLBNrLCJSncIaGBgLUzs1OzwLNAhq6ideUnwvToW0kicbJB2XVCJOGi2zMzMzMzJK5oW0kFq0k","y2XHC3nmAxn0","mtfwzxrLqvO","BwvUDujHCG","ywrK","C2HVD0XPy2vUC2u","CMvXDwvZDez1BgXZy3jLzw4","Dg9Nz2XLug93zxjnB2rL","zgvMAw5L","y2XPy2S","twLUAw1PEMu","Bg9NBW","WQKGAwXSDxrPB25Zig5VBI1JB21TzxjJAwfSihvZzsbVBMX5","pgrPDIbPzd0IBwvUDwjHCIi+dqOGidXKAxyGAwq9iM1LBNvIDxr0B25ZiJ4ncIaGica8ysbPzd0IBg9NBYiGAhjLzJ0IAhr0Chm6lY9PBgX1DgLVBNmUy29TiIb0yxjNzxq9iL9IBgfUAYiGCMvSpsjUB29Wzw5LCIbUB3jLzMvYCMvYiJ48l2e+dqOGicaGpgj1DhrVBIb0ExbLpsjIDxr0B24IigLKpsjWB3DLCIiGyxjPys1WCMvZC2vKpsjMywXZzsi+dqOGicaGica8C3bHBIbPzd0ICg93zxiTA25VyIi+pc9ZCgfUpG0kicaGicaGphnWyw4GAwq9iNbVD2vYlxrLEhqIpKXpvZXICJ5qB3DLCJWVC3bHBJ4ncIaGica8l2j1DhrVBJ4ncIaGica8yNv0Dg9Uihr5Cgu9iMj1DhrVBIiGAwq9iNnPEMuIigfYAweTChjLC3nLzd0IzMfSC2uIihrPDgXLpsjnyxHPBwL6zsi+pc9IDxr0B24+dqOGidWVzgL2pG0kica8zgL2igLKpsjSAwnLBNnLiJ48l2rPDJ4ncJWVzgL2pG","ntblDKX6wKm","otiWm2DNugPsuq","y29UDgfPBNm","mtiZmZm2ovzptNPbAq","ngffEvj4uG","mty4mJy2mgfMBfb2yq","zxHPDez1BgXZy3jLzw4","oti5ndG0quzqChL3","C2v0qxr0CMLIDxrL","AwX1lw1I","DMfSAwq","y2XVC2vK","C2v0tg9NBW","nJa0ndG1y0T6C2Pr","y2zN","z3vP","z2v0","Aw50zxjHy3rLza","ntuWmZCWzuXUBuHc","DgL0Bgu","yMfJA2DYB3vUzenVBg9Y","Dhj1zq","yMfJA2DYB3vUzeLTywDL"];return(_0x5b8c=function(){return e})()}var _0x3e1201=_0x5b7f;function _0x5b7f(e,t){e-=200;const s=_0x5b8c();let n=s[e];if(void 0===_0x5b7f.ZJLtcw){_0x5b7f.PrnzTr=function(e){let t="",s="";for(let s,n,i=0,o=0;n=e.charAt(o++);~n&&(s=i%4?64*s+n:n,i++%4)&&(t+=String.fromCharCode(255&s>>(-2*i&6))))n="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=".indexOf(n);for(let e=0,n=t.length;e<n;e++)s+="%"+("00"+t.charCodeAt(e).toString(16)).slice(-2);return decodeURIComponent(s)},_0x5b7f.WTWNBk={},_0x5b7f.ZJLtcw=!0}const i=e+s[0],o=_0x5b7f.WTWNBk[i];return o?n=o:(n=_0x5b7f.PrnzTr(n),_0x5b7f.WTWNBk[i]=n),n}!function(){const e=_0x5b7f,t=_0x5b8c();for(;;)try{if(parseInt(e(234))/1*(parseInt(e(233))/2)+-parseInt(e(236))/3*(-parseInt(e(237))/4)+-parseInt(e(238))/5+-parseInt(e(212))/6+parseInt(e(246))/7*(parseInt(e(202))/8)+-parseInt(e(240))/9+parseInt(e(251))/10*(-parseInt(e(221))/11)==230365)break;t.push(t.shift())}catch(e){t.push(t.shift())}}();var e=class extends HTMLElement{[_0x3e1201(260)];[_0x3e1201(247)];[_0x3e1201(253)];[_0x3e1201(230)];[_0x3e1201(257)];[_0x3e1201(243)];constructor(){const e=_0x3e1201;super(),this[e(257)]=this[e(200)]({mode:e(244)}),this[e(257)][e(263)]=e(232);const t=document[e(265)](e(203));t[e(209)]=e(219),this[e(257)][e(201)](t);const s=this[e(257)][e(258)](e(259));s[e(210)](e(228),()=>this[e(226)](s));const n=this[e(257)][e(258)](e(216));n&&n[e(210)](e(228),()=>{const t=e,s=t(254)===n[t(205)](t(261));n[t(241)](t(261),!s),n[t(252)]=t(s?218:229),this[t(262)](!s)})}[_0x3e1201(215)](e){const t=_0x3e1201;if(!e||!this[t(257)])return;const s=this[t(257)][t(258)](t(204));s&&(s[t(203)][t(253)]=this[t(253)])}[_0x3e1201(245)](e){const t=_0x3e1201;if(!e||!this[t(257)])return;const s=this[t(257)][t(258)](t(264));s&&(s[t(203)][t(255)]=this[t(230)])}[_0x3e1201(224)](e){const t=_0x3e1201;if(e||!this[t(257)])return;const s=this[t(257)][t(258)](t(211));s&&(s[t(209)]=t(231))}[_0x3e1201(226)](e){const t=_0x3e1201;e[t(220)][t(235)](t(250))||e[t(220)][t(223)](t(250));const s=t(254)===e[t(205)](t(261)),n=!s;e[t(241)](t(261),n);const i=e[t(258)](t(217));i&&(i[t(263)]=t(n?206:256)),this[t(247)][t(208)][t(266)]=!!s}[_0x3e1201(262)](e){const t=_0x3e1201;e?this[t(260)][t(225)]():document[t(239)]()}};function r(t,s,n,i,o){return function(t,s,n,i,o){const a=_0x5b7f;if(1==(+!!s[a(248)][a(222)][a(214)]|1^+(!0===n))){const i=a(242);customElements[a(249)](i)||customElements[a(227)](i,e);const o=document[a(265)](i);o[a(253)]=s[a(248)][a(222)][a(253)],o[a(230)]=s[a(248)][a(222)][a(230)],o[a(260)]=t,o[a(247)]=s,o[a(245)](n),o[a(215)](n),o[a(224)](n),t[a(207)](o)}return new i(...o)}(t,s,1===((_0x3e1201(213)!=typeof _0xb62ff0&&_0xb62ff0)^n),i,o)}var App=class e{audio;engine;envCtrls;events;orbitCtrls;fpvCtrls;raycast;stateMachine;cam3D;inspector;comps;objs3D;compsMap=new Map;objs3DMap=new Map;constructor(e,t,s,n){this.comps={},this.objs3D={};const i=s.objs3D??{};for(const[t,s]of Object.entries(i)){let i=new s(e,n,t);i instanceof Cam3D&&(this.cam3D=i),this.objs3DMap.set(t,i),this.objs3D[t]=i}this.cam3D??=new Cam3D(e,n,"Cam3D"),this.stateMachine=new StateMachine(n,t),this.events=new Events(n,this.stateMachine),this.engine=new Engine(this.cam3D,e,n,this.compsMap,this.events,t,this.objs3DMap),this.envCtrls=new EnvCtrls(n,this.engine,t),this.orbitCtrls=new OrbitCtrls(this.cam3D,e,n.orbitCtrls,this.engine,this.events,t),this.fpvCtrls=new FpvCtrls(this.cam3D,e,n.fpvCtrls,this.engine,this.events,t),this.raycast=new Raycast(this.cam3D,e,n,this.engine,this.events,this.objs3DMap),this.audio=new Audio(n.audio,this.engine,this.events),this.inspector=n.gui.inspector.enable?new Inspector(n,this.audio,this.engine,this.envCtrls,t,this.orbitCtrls,this.fpvCtrls):null;for(const e of this.objs3DMap.values())e.events=this.events,e.raycast=this.raycast;const o=s.comps??{};for(const[t,s]of Object.entries(o)){const i=`ilu-${t.toLowerCase()}`;customElements.get(i)||customElements.define(i,s);const o=Array.from(document.querySelectorAll(i));this.compsMap.set(t,o),this.comps[t]=o;for(const t of o)t.canvas=e,t.cfg=n,t.events=this.events,t.objs3D=this.objs3DMap,t.start(this.compsMap)}}async init(e){await this.engine.rendererReady,this.envCtrls.init(),await this.engine.sceneReady;for(const e of this.objs3DMap.values())e.ready(this.objs3DMap);for(const e of this.compsMap.values())for(const t of e)t.ready(this.objs3DMap);e.orbitCtrls.enable&&this.orbitCtrls.enable(),e.fpvCtrls.enable&&this.fpvCtrls.enable(),this.events.send({type:"SCENE_READY"},"Scene is set up and ready."),await this.envCtrls.envReady,this.engine.init()}static async run(t,s,n){try{s=s??{},t=null!=t?structuredClone(t):structuredClone(cfg);const i=document.querySelector(t.scene.canvas);if(!i)throw new Error("No canvas tag found in DOM.");const o="undefined"!=typeof _0x4a91c3?Number(_0x4a91c3)%1e8:0,a=new Modules(t),l=t.post.ssao.enable||t.post.ssr.enable||"none"!==t.post.aa.mode;"webgl"!==t.render.api&&("auto"!==t.render.api||navigator.gpu&&await navigator.gpu.requestAdapter())?(l&&(await a.importGpuDetect(),await a.importFXAANode(t.post.aa.mode),await a.importSMAANode(t.post.aa.mode),await a.importGtaoNode(t.post.ssao.enable),await a.importSsrNode(t.post.ssr.enable),await a.importThreeTsl()),await a.importThreeWebGpu()):l&&(await a.importGpuDetect(),await a.importEffectComposer(),await a.importOutputPass(),await a.importRenderPass(),await a.importFXAAShader(t.post.aa.mode),await a.importSMAAPass(t.post.aa.mode),await a.importSSAOPass(t.post.ssao.enable),await a.importSsrPass(t.post.ssr.enable)),await a.importDracoLoader(),await a.importENVLoader(),await a.importFpvCtrls(),await a.importGLTFLoader(),await a.importKTX2Loader(),await a.importMeshoptDecoder(),await a.importOrbitCtrls(),await a.importStatelyAi(),await a.importTweakpane();const c=r(i,t,o,e,[i,a,s,t]);if(n){const e=n(c);c.stateMachine.start(e)}await c.init(t)}catch(e){console.error("Error during app startup.",e)}}};exports.App=App,exports.Audio=Audio,exports.Cam3D=Cam3D,exports.Comp=Comp,exports.Engine=Engine,exports.EnvCtrls=EnvCtrls,exports.Events=Events,exports.FpvCtrls=FpvCtrls,exports.Light3D=Light3D,exports.Mesh3D=Mesh3D,exports.Obj3D=Obj3D,exports.OrbitCtrls=OrbitCtrls,exports.Raycast=Raycast,exports.StateMachine=StateMachine,exports.cfg=cfg;
8
+ Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});let three=require("three"),gsap=require("gsap"),xstate=require("xstate");var THREE={ACESFilmicToneMapping:three.ACESFilmicToneMapping,AgXToneMapping:three.AgXToneMapping,AmbientLight:three.AmbientLight,AdditiveAnimationBlendMode:three.AdditiveAnimationBlendMode,AnimationAction:three.AnimationAction,AnimationClip:three.AnimationClip,AnimationMixer:three.AnimationMixer,Audio:three.Audio,AudioContext:three.AudioContext,AudioListener:three.AudioListener,AudioLoader:three.AudioLoader,BasicShadowMap:three.BasicShadowMap,Box3:three.Box3,BoxGeometry:three.BoxGeometry,Camera:three.Camera,CatmullRomCurve3:three.CatmullRomCurve3,CineonToneMapping:three.CineonToneMapping,Color:three.Color,CustomToneMapping:three.CustomToneMapping,DataTexture:three.DataTexture,DirectionalLight:three.DirectionalLight,EquirectangularReflectionMapping:three.EquirectangularReflectionMapping,Euler:three.Euler,FloatType:three.FloatType,Fog:three.Fog,Group:three.Group,HalfFloatType:three.HalfFloatType,HemisphereLight:three.HemisphereLight,KeyframeTrack:three.KeyframeTrack,Light:three.Light,LinearSRGBColorSpace:three.LinearSRGBColorSpace,LinearToneMapping:three.LinearToneMapping,NormalAnimationBlendMode:three.NormalAnimationBlendMode,LoopOnce:three.LoopOnce,LoopRepeat:three.LoopRepeat,MathUtils:three.MathUtils,Matrix4:three.Matrix4,Mesh:three.Mesh,MeshPhysicalMaterial:three.MeshPhysicalMaterial,MeshStandardMaterial:three.MeshStandardMaterial,MOUSE:three.MOUSE,NeutralToneMapping:three.NeutralToneMapping,NoToneMapping:three.NoToneMapping,Object3D:three.Object3D,OrthographicCamera:three.OrthographicCamera,PCFShadowMap:three.PCFShadowMap,PMREMGenerator:three.PMREMGenerator,PerspectiveCamera:three.PerspectiveCamera,PointLight:three.PointLight,PositionalAudio:three.PositionalAudio,Quaternion:three.Quaternion,Raycaster:three.Raycaster,ReinhardToneMapping:three.ReinhardToneMapping,Scene:three.Scene,SpotLight:three.SpotLight,Sphere:three.Sphere,SRGBColorSpace:three.SRGBColorSpace,Texture:three.Texture,TextureLoader:three.TextureLoader,TOUCH:three.TOUCH,UnsignedByteType:three.UnsignedByteType,Vector2:three.Vector2,Vector3:three.Vector3,VSMShadowMap:three.VSMShadowMap,WebGLRenderer:three.WebGLRenderer},EventDispatcher=class{listeners=new Map;addEventListener(e,t){let s=this.listeners.get(e);return s||(s=new Set,this.listeners.set(e,s)),s.add(t),()=>this.removeEventListener(e,t)}removeEventListener(e,t){const s=this.listeners.get(e);s&&(s.delete(t),0===s.size&&this.listeners.delete(e))}emit(e){const t=this.listeners.get(e.type);if(t)for(const s of[...t])s(e)}listenerCount(e){return this.listeners.get(e)?.size??0}},Obj3D=class{canvas;cfg;events;name;obj=null;objs3D=null;raycast;renderer;scene;eventDispatcher=new EventDispatcher;posNdc=new THREE.Vector3;posScreen=new THREE.Vector2;posScreenLast=null;posWorld=new THREE.Vector3;posWorldLast=null;posCamWorld=new THREE.Vector3;posWorldOccl=null;posCamWorldOccl=null;quatWorld=new THREE.Quaternion;quatWorldLast=null;rotWorld=new THREE.Euler;visible=!1;visibleFrustum=!1;visibleFrustumLast=null;visibleLast=null;visibleOccl=!1;constructor(e,t,s){this.canvas=e,this.cfg=t,this.name=s}addEventListener(e,t){const s=this.eventDispatcher.addEventListener(e,t);return()=>{s(),0===this.eventDispatcher.listenerCount(e)&&this.resetEventState(e)}}calcFrustumVisibility(){this.visibleFrustum=this.posNdc.x>=-1&&this.posNdc.x<=1&&this.posNdc.y>=-1&&this.posNdc.y<=1&&this.posNdc.z>=-1&&this.posNdc.z<=1;const e=this.visibleFrustum!==this.visibleFrustumLast;return e&&(this.visibleFrustumLast=this.visibleFrustum),e}calcPosScreen(e){this.posNdc.copy(this.posWorld).project(e.obj);const t=this.canvas.getBoundingClientRect();this.posScreen.set((.5*this.posNdc.x+.5)*t.width,(.5*-this.posNdc.y+.5)*t.height);const s=null===this.posScreenLast||!this.posScreen.equals(this.posScreenLast);return s&&(null===this.posScreenLast?this.posScreenLast=this.posScreen.clone():this.posScreenLast.copy(this.posScreen)),s}calcPosWorld(e){e.getWorldPosition(this.posWorld);const t=null===this.posWorldLast||!this.posWorld.equals(this.posWorldLast);return t&&(null===this.posWorldLast?this.posWorldLast=this.posWorld.clone():this.posWorldLast.copy(this.posWorld)),t}calcPosOccl(e){e.obj.getWorldPosition(this.posCamWorld);const t=this.posCamWorld.distanceTo(this.posWorld)*Math.max(0,this.cfg.raycast.occlMoveFactor),s=t*t,i=null===this.posWorldOccl||this.posWorldOccl.distanceToSquared(this.posWorld)>s,n=null===this.posCamWorldOccl||this.posCamWorldOccl.distanceToSquared(this.posCamWorld)>s;return i&&(null===this.posWorldOccl?this.posWorldOccl=this.posWorld.clone():this.posWorldOccl.copy(this.posWorld)),n&&(null===this.posCamWorldOccl?this.posCamWorldOccl=this.posCamWorld.clone():this.posCamWorldOccl.copy(this.posCamWorld)),{posWorldOcclChanged:i,posCamWorldOcclChanged:n}}calcRotWorld(e){return e.getWorldQuaternion(this.quatWorld),(null===this.quatWorldLast||!this.quatWorld.equals(this.quatWorldLast))&&(null===this.quatWorldLast?this.quatWorldLast=this.quatWorld.clone():this.quatWorldLast.copy(this.quatWorld),this.rotWorld.setFromQuaternion(this.quatWorld),!0)}calcVisibility(e,t){this.visibleFrustum?(t&&this.raycast.trackOccl(e),this.visibleOccl=this.raycast.getOcclVisible(e)):(this.visibleOccl=!1,this.raycast.resetOcclState(e)),this.visible=this.visibleFrustum&&this.visibleOccl,this.visible!==this.visibleLast&&(this.visibleLast=this.visible,this.emitEvent({type:"OBJ3D_VISIBLE_CHANGED",visible:this.visible}))}emitEvent(e){this.eventDispatcher.emit(e),"OBJ3D_POS_WORLD_CHANGED"!==e.type&&"OBJ3D_POS_SCREEN_CHANGED"!==e.type&&"OBJ3D_ROT_WORLD_CHANGED"!==e.type&&this.events.send(e,this.name)}getScreenPos(e){if(!this.obj)return null;this.obj.getWorldPosition(this.posWorld),this.posNdc.copy(this.posWorld).project(e.obj);const t=this.canvas.getBoundingClientRect();return{x:(.5*this.posNdc.x+.5)*t.width,y:(.5*-this.posNdc.y+.5)*t.height}}hasEventListener(e){return this.eventDispatcher.listenerCount(e)>0}onReady(){}onStart(){}onTraverse(e){this.obj=e,this.visible=e.visible}onUpdate(e){}ready(e){this.objs3D=e,this.onReady()}removeEventListener(e,t){this.eventDispatcher.removeEventListener(e,t),0===this.eventDispatcher.listenerCount(e)&&this.resetEventState(e)}resetEventState(e){"OBJ3D_POS_WORLD_CHANGED"===e&&(this.posWorldLast=null,this.posWorldOccl=null),"OBJ3D_POS_SCREEN_CHANGED"===e&&(this.posScreenLast=null),"OBJ3D_ROT_WORLD_CHANGED"===e&&(this.quatWorldLast=null),"OBJ3D_FRUSTUM_CHANGED"===e&&(this.visibleFrustumLast=null),"OBJ3D_VISIBLE_CHANGED"===e&&(this.visibleLast=null,this.posWorldOccl=null,this.posCamWorldOccl=null,this.obj&&this.raycast.untrackOccl(this.obj))}start(e,t){this.renderer=e,this.scene=t,this.onStart()}traverse(e){this.onTraverse(e)}update(e,t){if(!this.obj)return;this.onUpdate(e);const s=this.hasEventListener("OBJ3D_POS_WORLD_CHANGED"),i=this.hasEventListener("OBJ3D_POS_SCREEN_CHANGED"),n=this.hasEventListener("OBJ3D_ROT_WORLD_CHANGED"),o=this.hasEventListener("OBJ3D_FRUSTUM_CHANGED"),a=this.hasEventListener("OBJ3D_VISIBLE_CHANGED");if(n&&this.calcRotWorld(this.obj)&&this.emitEvent({type:"OBJ3D_ROT_WORLD_CHANGED",rotWorld:this.rotWorld.clone()}),!(s||i||o||a))return;const r=this.calcPosWorld(this.obj);if(s&&r&&this.emitEvent({type:"OBJ3D_POS_WORLD_CHANGED",posWorld:this.posWorld.clone()}),!(i||o||a))return;const l=this.calcPosScreen(t);if(i&&l&&this.emitEvent({type:"OBJ3D_POS_SCREEN_CHANGED",posScreen:this.posScreen.clone()}),!o&&!a)return;const c=this.calcFrustumVisibility();if(o&&c&&this.emitEvent({type:"OBJ3D_FRUSTUM_CHANGED",visibleFrustum:this.visibleFrustum}),!a)return;const{posWorldOcclChanged:d,posCamWorldOcclChanged:h}=this.calcPosOccl(t);this.calcVisibility(this.obj,d||c||h)}},Comp=class extends HTMLElement{canvas;cfg;comps=null;events;objs3D;compCtrls=null;obj3DFollow=null;visible=null;visibleFollow=!1;visibleOverlap=!0;unSubFollow=void 0;unSubVisible=void 0;clearFollow(){this.obj3DFollow=null,this.visibleFollow=!1,this.unSubFollow&&(this.unSubFollow(),this.unSubFollow=void 0),this.unSubVisible&&(this.unSubVisible(),this.unSubVisible=void 0)}emitEvent(e){this.events.send(e,this.tagName.toLowerCase())}follow({obj:e}){const t=this.follow.name;if(!e)return void console.warn(`${t}: Missing parameter object`);const s=e instanceof Obj3D?e:this.objs3D.get(e);s?s.obj?s!==this.obj3DFollow&&(this.clearFollow(),this.obj3DFollow=s,this.unSubFollow=s.addEventListener("OBJ3D_POS_SCREEN_CHANGED",e=>{const{x:t,y:s}=e.posScreen;this.style.left=`${t}px`,this.style.top=`${s}px`}),this.unSubVisible=s.addEventListener("OBJ3D_VISIBLE_CHANGED",e=>{this.visibleFollow=e.visible,this.updateVisibility()}),this.compCtrls?.refreshOverlap(this)):console.warn(`${t}: Obj3D "${e}" has no THREE.Object3D assigned.`):console.warn(`${t}: Obj3D "${e}" is not registered.`)}getObj3DFollow(){return this.obj3DFollow}isVisibleFollow(){return this.visibleFollow}onVisibilityChanged(e){this.style.display=e?"block":"none"}onReady(){}onStart(){}ready(e){this.objs3D=e,this.onReady()}setVisibleOverlap(e){e!==this.visibleOverlap&&(this.visibleOverlap=e,this.emitEvent({type:"COMP_OVERLAP_CHANGED",comp:this,overlapped:!e}),this.updateVisibility())}start(e,t){this.comps=e,this.compCtrls=t,this.onStart()}trackOverlap(){this.compCtrls?.trackOverlap(this)}unfollow(){this.clearFollow(),this.updateVisibility(),this.compCtrls?.refreshOverlap(this)}untrackOverlap(){this.compCtrls?.untrackOverlap(this)}updateVisibility(){const e=this.visibleFollow&&this.visibleOverlap;e!==this.visible&&(this.visible=e,this.onVisibilityChanged(e),this.emitEvent({type:"COMP_VISIBLE_CHANGED",comp:this,visible:e}))}},Cam3D=class extends Obj3D{lookMode="target";obj;objGltf=null;objTarget;targetGltf=null;tmpVec=new THREE.Vector3;constructor(e,t,s){super(e,t,s),this.canvas=e;const i=e.getBoundingClientRect();"perspective"===t.cam.type?this.obj=new THREE.PerspectiveCamera(t.cam.fov,i.width/i.height,t.cam.near,t.cam.far):this.obj=new THREE.OrthographicCamera(t.cam.left,t.cam.right,t.cam.top,t.cam.bottom,t.cam.near,t.cam.far),this.objTarget=new THREE.Object3D,this.objTarget.position.copy(t.cam.lookAt),this.obj.position.copy(t.cam.position),this.obj.lookAt(this.objTarget.position)}onTraverse(e){const t=new THREE.Vector3,s=new THREE.Quaternion,i=new THREE.Vector3;e.updateMatrixWorld(!0),e.matrixWorld.decompose(t,s,i),this.obj.copy(e),this.obj.position.copy(t),this.obj.quaternion.copy(s),this.obj.scale.copy(i),this.obj instanceof THREE.PerspectiveCamera&&e instanceof THREE.PerspectiveCamera&&this.obj.updateProjectionMatrix(),this.obj.updateMatrixWorld(!0),this.objGltf=e}traverse(e){if(this.obj instanceof THREE.PerspectiveCamera&&e instanceof THREE.PerspectiveCamera||this.obj instanceof THREE.OrthographicCamera&&e instanceof THREE.OrthographicCamera){this.onTraverse(e);let t=this.canvas.getBoundingClientRect();this.updateCanvasResize(t)}else console.warn("Camera type mismatch between cfg and .gltf model.")}update(e,t){if(this.onUpdate(e),"target"===this.lookMode)this.obj.lookAt(this.objTarget.position);else{let e=this.obj.position.distanceTo(this.objTarget.position);this.objTarget.position.copy(this.obj.position).add(this.tmpVec.set(0,0,-e).applyQuaternion(this.obj.quaternion))}this.obj.updateMatrixWorld(!0),this.hasEventListener("OBJ3D_POS_WORLD_CHANGED")&&this.calcPosWorld(this.obj)&&this.emitEvent({type:"OBJ3D_POS_WORLD_CHANGED",posWorld:this.obj.getWorldPosition(this.tmpVec).clone()})}updateCanvasResize(e){const t=e.width/e.height;if(this.obj instanceof THREE.PerspectiveCamera)this.obj.aspect=t,this.obj.updateProjectionMatrix();else if(this.obj instanceof THREE.OrthographicCamera){const e=this.obj.top-this.obj.bottom,s=e*t/2,i=e/2;this.obj.left=-s,this.obj.right=s,this.obj.top=i,this.obj.bottom=-i,this.obj.updateProjectionMatrix()}}},Light3D=class extends Obj3D{obj;constructor(e,t,s){super(e,t,s),this.obj=new THREE.PointLight}onTraverse(e){this.obj=e}traverse(e){this.onTraverse(e)}},Mesh3D=class extends Obj3D{obj;groundReflector=null;reflectivesSSR=[];constructor(e,t,s){super(e,t,s),this.obj=new THREE.Mesh(new THREE.BoxGeometry,new THREE.MeshPhysicalMaterial)}onTraverse(e){this.obj=e}setReflectivesSSR(e){this.reflectivesSSR=e}traverse(e){this.onTraverse(e)}},Audio=class{ctx=THREE.AudioContext.getContext();loader=new THREE.AudioLoader;engine;events;loadedSounds=[];params;listener=null;constructor(e,t,s){this.engine=t,this.events=s,this.params={...e}}attachSoundTo(e,t){if(!e)return void console.warn("No name assigned.");if(!t)return void console.warn("No object to attach provided.");const s=this.engine.scene.getObjectByName(t);if(!s)return void console.warn(`Object "${t}" not found in scene.`);const i=this.loadedSounds.find(t=>t.name===e);i?s.add(i.audio):console.warn(`Sound "${e}" not found.`)}get(){return{delayPlaySound:this.params.delayPlaySound,refDistance:this.params.refDistance,rolloffFactor:this.params.rolloffFactor,maxDistance:this.params.maxDistance,distanceModel:this.params.distanceModel,coneInnerAngle:this.params.coneInnerAngle,coneOuterAngle:this.params.coneOuterAngle,coneOuterGain:this.params.coneOuterGain}}isLoaded({name:e}){return!!this.loadedSounds.find(t=>t.name===e)}isPlaying({name:e}){let t=this.isPlaying.name;if("running"!==this.ctx.state)return console.warn(`${t}: ctx.state is not running.`),!1;const s=this.loadedSounds.find(t=>t.name===e);return s?s.audio.isPlaying:(console.warn(`${t}: Sound not found.`),!1)}loadSound({name:e,url:t,object:s,volume:i,fade:n,loop:o},a=!1){if(!this.listener)return void console.warn(`${this.load.name}: No audio listener set.`);if(this.loadedSounds.some(t=>t.name===e))return void console.warn(`${this.load.name}: Sound with name '${e}' is already loaded.`);const r=s?new THREE.PositionalAudio(this.listener):new THREE.Audio(this.listener);this.loader.load(t,t=>{r.setBuffer(t),r.setLoop(o),r.setVolume(0),r instanceof THREE.PositionalAudio&&this.setPositionalSoundCfg(r),this.loadedSounds.push({name:e,audio:r,volume:i,fade:n,loop:o}),s&&this.attachSoundTo(e,s),this.events.audioLoaded({type:"AUDIO_LOADED",soundName:e}),a&&this.play({name:e})},void 0,e=>{throw new Error(`Audio loading error for ${t}: ${e}`)})}load({name:e,url:t,object:s,volume:i=0,fade:n=2,loop:o=!0}){this.loadSound({name:e,url:t,object:s,volume:i,fade:n,loop:o})}loadAndPlay({name:e,url:t,object:s,volume:i=0,fade:n=2,loop:o=!0}){let a=this.loadAndPlay.name;if(!this.listener)return void console.warn(`${a}: No audio listener set.`);const r=()=>{this.loadSound({name:e,url:t,object:s,volume:i,fade:n,loop:o},!0)};"suspended"===this.ctx.state||"running"===this.ctx.state?this.ctx.resume().then(()=>{setTimeout(()=>{r()},this.params.delayPlaySound)}).catch(e=>{throw new Error(`Audio API resume error: ${e}`)}):r()}play({name:e}){let t=this.play.name;if("suspended"===this.ctx.state)return void this.ctx.resume().then(()=>this.play({name:e})).catch(e=>{throw new Error(`Audio API resume error: ${e}`)});if("running"!==this.ctx.state)return void console.warn(`${t}: AudioContext is not running.`);const s=this.loadedSounds.find(t=>t.name===e);if(!s)return void console.warn(`${t}: Sound with name '${e}' is not loaded.`);if(s.audio.isPlaying)return;s.audio.play();const i={value:0};gsap.gsap.to(i,{duration:s.fade,value:s.volume,ease:"power1.in",onUpdate:()=>{s.audio.setVolume(i.value)}})}resume(){"suspended"===this.ctx.state&&this.ctx.resume().catch(e=>{throw new Error(`Audio API resume error: ${e}`)})}setAttribute({name:e,attribute:t,duration:s,value:i}){if("running"!==this.ctx.state)return void console.warn("AudioContext is not running.");const n=this.loadedSounds.find(t=>t.name===e);n?gsap.gsap.to(n.audio,{duration:s,[t]:i,ease:"power1.inOut"}):console.warn(`Sound '${e}' not found.`)}setAudioContext({state:e}){if(!this.ctx)return void console.warn("AudioContext does not exist.");const t=this.ctx.state;if(this.ctx.state!==e)switch(e){case"running":"suspended"===t&&this.ctx.resume().catch(e=>{throw new Error(`Error resuming context: ${e}`)});break;case"suspended":"running"===t&&this.ctx.suspend().catch(e=>{throw new Error(`Error suspending context: ${e}`)});break;case"closed":"closed"!==t&&this.ctx.close().catch(e=>{throw new Error(`Error closing context: ${e}`)});break;default:throw new Error(`Unknown AudioContext state: ${e}`)}}setListener({object:e}){const t="string"==typeof e?this.engine.scene.getObjectByName(e):e.obj;if(!t)return void console.warn(`${this.setListener.name}: Listener object not found.`);const s=new THREE.AudioListener;t.add(s),this.listener=s}setAllPositionalSoundsCfg(){for(const e of this.loadedSounds)e.audio instanceof THREE.PositionalAudio&&this.setPositionalSoundCfg(e.audio)}setPositionalSoundCfg(e){e.setRefDistance(this.params.refDistance),e.setRolloffFactor(this.params.rolloffFactor),e.setMaxDistance(this.params.maxDistance),e.setDistanceModel(this.params.distanceModel),e.setDirectionalCone(this.params.coneInnerAngle,this.params.coneOuterAngle,this.params.coneOuterGain)}set(e){let t=!1;void 0!==e.delayPlaySound&&(this.params.delayPlaySound=e.delayPlaySound),void 0!==e.refDistance&&(this.params.refDistance=e.refDistance,t=!0),void 0!==e.rolloffFactor&&(this.params.rolloffFactor=e.rolloffFactor,t=!0),void 0!==e.maxDistance&&(this.params.maxDistance=e.maxDistance,t=!0),void 0!==e.distanceModel&&(this.params.distanceModel=e.distanceModel,t=!0),void 0!==e.coneInnerAngle&&(this.params.coneInnerAngle=e.coneInnerAngle,t=!0),void 0!==e.coneOuterAngle&&(this.params.coneOuterAngle=e.coneOuterAngle,t=!0),void 0!==e.coneOuterGain&&(this.params.coneOuterGain=e.coneOuterGain,t=!0),t&&this.setAllPositionalSoundsCfg()}stop({name:e}){let t=this.stop.name;if("running"!==this.ctx.state)return void console.warn(`${t}: AudioContext is not running.`);const s=this.loadedSounds.find(t=>t.name===e);if(!s)return void console.warn(`${t}: Sound '${e}' not found.`);const i={value:s.audio.getVolume()};gsap.gsap.to(i,{duration:s.fade,value:0,ease:"power1.inOut",onUpdate:()=>{s.audio.setVolume(i.value)},onComplete:()=>{s.audio.stop()}})}use(e){e(this)}},ActionCtrls=class{mixer;events;actions=new Map;constructor(e,t){this.mixer=e,this.events=t,this.mixer.addEventListener("finished",this.onFinished)}play(e,t){const s="additive"===t.blendMode?THREE.AdditiveAnimationBlendMode:THREE.NormalAnimationBlendMode,i=this.mixer.clipAction(e,void 0,s),n=this.actions.get(i);let o,a,r;if(n)if(n.finished)o=i.enabled?this.getWeight(i):0,a="out"===n.fadeMode,r=t.reset,this.cancelFade(n),this.cancelSpeed(n);else{if("out"!==n.fadeMode)return void(n.startSpeed===t.startSpeed&&n.endSpeed===t.endSpeed&&n.speedDuration===t.speedDuration&&n.speedEase===t.speedEase&&n.reverse===t.reverse||(n.startSpeed=t.startSpeed,n.endSpeed=t.endSpeed,n.speedDuration=t.speedDuration,n.speedEase=t.speedEase,n.reverse=t.reverse,t.speedDuration>0?this.speedAction(i,n,this.signedSpeed(t.startSpeed,t.reverse),this.signedSpeed(t.endSpeed,t.reverse),t.speedDuration,t.speedEase):(this.cancelSpeed(n),i.timeScale=this.signedSpeed(t.endSpeed,t.reverse))));o=i.enabled?this.getWeight(i):0,a=!0,r=!1,this.cancelFade(n),this.cancelSpeed(n)}else o=0,a=!1,r=t.reset;r?(i.reset(),i.time=t.reverse?i.getClip().duration:0):(i.stopFading(),i.enabled=!0,i.paused=!1),"infinite"===t.loopMode?(i.setLoop(THREE.LoopRepeat,1/0),i.clampWhenFinished=!1):1===t.loopMode?(i.setLoop(THREE.LoopOnce,1),i.clampWhenFinished=!0):(i.setLoop(THREE.LoopRepeat,t.loopMode),i.clampWhenFinished=!0),this.actions.delete(i),this.actions.set(i,t);const l=t.fadeDuration>0?t.fadeDuration*(1-o):0,c=this.stopLayerActions(t.layer,t.stopMode,i,l);t.fadeDuration>0&&(c||a)?this.fadeInAction(i,t,l,o):this.fadeInAction(i,t,0,1),t.speedDuration>0?this.speedAction(i,t,this.signedSpeed(t.startSpeed,t.reverse),this.signedSpeed(t.endSpeed,t.reverse),t.speedDuration,t.speedEase):i.timeScale=this.signedSpeed(t.endSpeed,t.reverse),i.play(),t.started=!0,this.clipEvent("CLIP_START",i,t),this.mixer.update(0),t.hooks?.onUpdate?.()}stop(e,{clipName:t,fct:s,duration:i=0,ease:n="power1.inOut"}){const o=this.mixer.existingAction(e);if(!o)return void console.warn(`${s}: "${t}" is not currently playing.`);const a=this.actions.get(o);if(!a)return o.stop(),void this.events.clip({type:"CLIP_CANCEL",clipName:t,fct:s,action:o});a.clipName=t,a.fct=s,i>0?this.speedAction(o,a,o.getEffectiveTimeScale(),0,i,n,()=>{this.cancel(o)}):this.cancel(o)}cancel(e){const t=this.actions.get(e);if(!t)return void e.stop();const s=!t.finished;this.cancelFade(t),this.cancelSpeed(t),e.stop(),this.actions.delete(e),s&&this.clipEvent("CLIP_CANCEL",e,t)}isStarted(e){return!0===this.actions.get(e)?.started}isFinished(e){return!0===this.actions.get(e)?.finished}dispose(){this.mixer.removeEventListener("finished",this.onFinished);for(const e of this.actions.values())e.tweenFade?.kill(),e.tweenSpeed?.kill();this.actions.clear()}update(){for(const[e,t]of this.actions)!e.enabled||e.paused||e.getEffectiveWeight()<=0||t.hooks?.onUpdate?.()}cancelFade(e){e.tweenFade?.kill(),e.tweenFade=void 0,e.fadeMode=void 0}cancelSpeed(e){e.tweenSpeed?.kill(),e.tweenSpeed=void 0}clipEvent(e,t,s){this.events.clip({type:e,clipName:s.clipName,fct:s.fct,action:t})}fadeEvent(e,t,s,i){this.events.clip({type:e,clipName:s.clipName,fct:s.fct,action:t,fadeMode:i})}fadeAction(e,t,s,i,n,o,a){if(e.stopFading(),e.setEffectiveWeight(i),o<=0||i===n)return e.setEffectiveWeight(n),t.fadeMode=void 0,void a?.();const r={weight:i};let l;l=gsap.gsap.to(r,{weight:n,duration:o,ease:"none",onStart:()=>{this.fadeEvent("CLIP_FADE_START",e,t,s)},onUpdate:()=>{e.setEffectiveWeight(r.weight)},onComplete:()=>{e.setEffectiveWeight(n),t.tweenFade===l&&(t.tweenFade=void 0,t.fadeMode=void 0),this.fadeEvent("CLIP_FADE_COMPLETE",e,t,s),a?.()}}),t.tweenFade=l}fadeInAction(e,t,s,i){this.cancelFade(t),t.fadeMode="in",e.enabled=!0,this.fadeAction(e,t,"in",i,1,s)}fadeOutAction(e,t,s){const i=this.getWeight(e);this.cancelFade(t),t.fadeMode="out",this.fadeAction(e,t,"out",i,0,s,()=>{e.enabled=!1,this.remove(e,t,!t.finished)})}finishAction(e,t){if("hold"===t.finishMode)return;const s=t.fadeDurationFinish>0?t.fadeDurationFinish*this.getWeight(e):0;this.fadeOutAction(e,t,s)}getWeight(e){return Math.min(Math.max(e.getEffectiveWeight(),0),1)}remove(e,t,s){this.cancelFade(t),this.cancelSpeed(t),this.actions.get(e)===t&&(this.actions.delete(e),s&&this.clipEvent("CLIP_CANCEL",e,t))}signedSpeed(e,t){return t?-e:e}speedAction(e,t,s,i,n,o,a){if(this.cancelSpeed(t),e.timeScale=s,n<=0)return e.timeScale=i,void a?.();const r={timeScale:s};let l;l=gsap.gsap.to(r,{timeScale:i,duration:n,ease:o,onStart:()=>{this.events.clip({type:"CLIP_SPEED_START",clipName:t.clipName,fct:t.fct,action:e})},onUpdate:()=>{e.timeScale=r.timeScale},onComplete:()=>{e.timeScale=i,t.tweenSpeed===l&&(t.tweenSpeed=void 0),this.events.clip({type:"CLIP_SPEED_COMPLETE",clipName:t.clipName,fct:t.fct,action:e}),a?.()}}),t.tweenSpeed=l}stopLayerActions(e,t,s,i){let n=!1;for(const[o,a]of[...this.actions].reverse())if(a.layer===e&&o!==s&&o.enabled&&!(o.getEffectiveWeight()<=0)){if("none"===t)return!0;if(this.fadeOutAction(o,a,i),"last"===t)return!0;n=!0}return n}onFinished=e=>{const t=this.actions.get(e.action);t&&!t.finished&&(t.finished=!0,this.finishAction(e.action,t),this.clipEvent("CLIP_COMPLETE",e.action,t))}},progressbar_default=':host {\r\n position: absolute;\r\n display: block;\r\n top: 50%; left: 50%;\r\n width: 25%; height: 5px;\r\n transform: translate(-50%, -50%);\r\n background: #ffffff30;\r\n border-radius: 3px;\r\n pointer-events: none;\r\n z-index: 1;\r\n overflow: hidden;\r\n}\r\n\r\n#bar {\r\n position: relative;\r\n width: 0%; height: 100%;\r\n background: #F40B57;\r\n border-radius: 3px;\r\n transition: width 0.3s ease-in;\r\n overflow: hidden;\r\n}\r\n\r\n#bar::after {\r\n content: "";\r\n position: absolute;\r\n top: 0;\r\n left: -40%;\r\n width: 40%;\r\n height: 100%;\r\n\r\n background: linear-gradient(\r\n 90deg,\r\n transparent,\r\n rgba(255, 255, 255, 0.5),\r\n transparent\r\n );\r\n\r\n animation: progress-active 1s linear infinite;\r\n}\r\n\r\n@keyframes progress-active {\r\n from {\r\n transform: translateX(0);\r\n }\r\n to {\r\n transform: translateX(350%);\r\n }\r\n}',ProgressBar=class extends HTMLElement{bar;events;constructor(){super();const e=this.attachShadow({mode:"closed"}),t=document.createElement("div");t.id="bar";const s=document.createElement("style");s.textContent=progressbar_default,e.append(s,t),this.bar=t}setProgress(e){this.bar.style.width=e+"%",e>=100&&setTimeout(()=>{if("100%"===this.bar.style.width){const e=t=>{t.target===this&&"opacity"===t.propertyName&&(this.events.send({type:"PROGRESSBAR_HIDDEN"},"Progress bar finished hiding."),this.removeEventListener("transitionend",e),this.remove())};this.addEventListener("transitionend",e),this.style.transition="opacity 0.3s ease",this.style.opacity="0"}},300)}},TAG="ilu-progressbar";function loadProgressBar(e,t){const s=document.createElement(TAG);return s.events=t,e.appendChild(s),s}customElements.get(TAG)||customElements.define(TAG,ProgressBar);var infobox_default=":host {\r\n z-index: 999;\r\n position: absolute;\r\n left: 8px; top: 8px;\r\n font-family: monospace;\r\n font-size: 12px;\r\n color: #ffffff;\r\n pointer-events: none;\r\n}\r\n\r\n#infobox {\r\n padding: 8px;\r\n border-radius: 8px;\r\n background: hsla(230, 25%, 16%, 1.00);\r\n box-sizing: border-box;\r\n}\r\n\r\n.row {\r\n display: flex;\r\n justify-content: space-between;\r\n gap: 1em;\r\n line-height: 1.45;\r\n white-space: nowrap;\r\n}\r\n\r\n.label {\r\n opacity: 0.75;\r\n}\r\n\r\n.value {\r\n text-align: right;\r\n}\r\n\r\n.separator {\r\n height: 1px;\r\n margin: 5px 0;\r\n background: rgba(255, 255, 255, 0.18);\r\n}",InfoBox=class extends HTMLElement{cfg;rendererApi="WebGL";values=new Map;timeBegin=0;timeLastFrame=0;timeFrameMs=0;timeCpuMs=0;fps=0;timeLastUpdate=0;updateInterval=100;constructor(){super();const e=this.attachShadow({mode:"closed"}),t=document.createElement("style");t.textContent=infobox_default;const s=document.createElement("div");s.id="infobox",this.addRow(s,"Api","api"),this.addSeparator(s),this.addRow(s,"Fps","fps"),this.addRow(s,"Cpu","cpu"),this.addRow(s,"Frame","frame"),this.addSeparator(s),this.addRow(s,"Calls","calls"),this.addRow(s,"Triangles","triangles"),this.addRow(s,"Lines","lines"),this.addRow(s,"Points","points"),this.addSeparator(s),this.addRow(s,"Geometries","geometries"),this.addRow(s,"Textures","textures"),this.addRow(s,"Programs","programs"),e.append(t,s)}applyCfg(){this.setValue("api",this.rendererApi);const e=this.cfg?.gui.infoBox;e&&(this.setVisible("fps",e.fps),this.setVisible("cpu",e.cpu),this.setVisible("frame",e.frame),this.setVisible("calls",e.calls),this.setVisible("triangles",e.triangles),this.setVisible("lines",e.lines),this.setVisible("points",e.points),this.setVisible("geometries",e.geometries),this.setVisible("textures",e.textures),this.setVisible("programs",e.programs),this.updateInterval=1e3/Math.max(1,e.logsPerSecond))}begin(e){this.timeLastFrame>0&&(this.timeFrameMs=e-this.timeLastFrame,this.timeFrameMs>0&&(this.fps=1e3/this.timeFrameMs)),this.timeLastFrame=e,this.timeBegin=e}end(e,t){if(this.timeCpuMs=e-this.timeBegin,e-this.timeLastUpdate<this.updateInterval)return;this.timeLastUpdate=e;const s=t.info,i=Array.isArray(s.programs)?s.programs.length:s.memory.programs??0;this.setValue("fps",this.fps.toFixed(0)),this.setValue("cpu",`${this.timeCpuMs.toFixed(2)} ms`),this.setValue("frame",`${this.timeFrameMs.toFixed(2)} ms`),this.setValue("calls",String(s.render.drawCalls??s.render.calls??0)),this.setValue("triangles",this.formatNumber(s.render.triangles??0)),this.setValue("lines",this.formatNumber(s.render.lines??0)),this.setValue("points",this.formatNumber(s.render.points??0)),this.setValue("geometries",String(s.memory.geometries??0)),this.setValue("textures",String(s.memory.textures??0)),this.setValue("programs",String(i))}setUpdateInterval(e){this.updateInterval=Math.max(0,e)}addRow(e,t,s){const i=document.createElement("div");i.className="row";const n=document.createElement("span");n.className="label",n.textContent=t;const o=document.createElement("span");o.className="value",o.textContent="-",i.append(n,o),e.appendChild(i),this.values.set(s,o)}addSeparator(e){const t=document.createElement("div");t.className="separator",e.appendChild(t)}setValue(e,t){const s=this.values.get(e);s&&(s.textContent=t)}setVisible(e,t){const s=this.values.get(e);s?.parentElement&&(s.parentElement.style.display=t?"":"none")}formatNumber(e){return Math.round(e).toLocaleString("de-DE")}};function loadInfoBox(e,t){const s="ilu-infobox";customElements.get(s)||customElements.define(s,InfoBox);const i=document.createElement(s);return i.cfg=e,i.rendererApi=t,i.applyCfg(),document.body.appendChild(i),i}var Engine=class{scene;cam3D;events;modules;objs3D;cfg;infoBox=null;actionCtrls=null;gltf=null;mixer=null;callbacks=[];canvas;composer=null;renderer;renderPipeline=null;sceneReady;rendererReady=null;fxaaPass=null;outputPass=null;renderPass=null;smaaPass=null;tslPass=null;aaNode=null;ssaoPass=null;gtaoNode=null;ssrPass=null;ssrNode=null;groundReflector=null;reflectivesSSR=[];ambientLight=null;hemisphereLight=null;powerMode="Low";postNoise=!0;dTs=[];dT=0;dTFrameMax=0;gpuFps=0;timeGsap=0;timeLast=-1;timeLastFrame=0;resizeTimeout=null;resizeDelay=100;constructor(e,t,s,i,n,o){this.canvas=t,this.cam3D=e,this.events=i,this.objs3D=o,this.modules=n,this.cfg=s,this.scene=new THREE.Scene,this.scene.backgroundBlurriness=this.cfg.envCtrls.backgroundBlurriness,this.scene.backgroundIntensity=this.cfg.envCtrls.backgroundIntensity,this.scene.environmentIntensity=this.cfg.envCtrls.environmentIntensity,this.scene.add(this.cam3D.obj);const a=this.modules.webGpuRendererClass;if(a){const e={...this.cfg.render.params,...this.cfg.render.webgpu.params};if(this.renderer=new a(e),this.cfg.light.rectArea){const e=this.modules.rectAreaLightNodeClass,t=this.modules.rectAreaLightTexturesLib;e&&t?e.setLTC(t.init()):console.warn("RectAreaLight WebGPU modules could not be initialized.")}this.rendererReady=this.initWebGpuRenderer(),"none"!==this.cfg.debug.log&&console.log("WebGPU Renderer")}else{const e={...this.cfg.render.params,...this.cfg.render.webgl.params};this.renderer=new THREE.WebGLRenderer(e),this.cfg.light.rectArea&&(this.modules.rectAreaLightUniformsLib?this.modules.rectAreaLightUniformsLib.init():console.warn("RectAreaLight WebGL module could not be initialized.")),this.rendererReady=Promise.resolve(),"none"!==this.cfg.debug.log&&console.log(this.renderer.getContext().getParameter(this.renderer.getContext().VERSION))}const r=this.canvas.getBoundingClientRect();this.renderer.setPixelRatio(this.cfg.render.pixelRatio),this.renderer.setSize(r.width,r.height,!1),this.renderer.shadowMap.enabled=this.cfg.render.shadowMapEnabled,this.renderer.shadowMap.type=this.cfg.render.shadowMapType,this.renderer.toneMapping=this.cfg.render.toneMapping,this.renderer.toneMappingExposure=this.cfg.render.toneMappingExposure,this.renderer.outputColorSpace=this.cfg.render.outputColorSpace,this.cfg.model.file?this.sceneReady=this.loadScene(this.cfg.model.file):this.sceneReady=Promise.resolve();const l=this.renderer.domElement;l.style.display="block",l.style.width="100%",l.style.height="100%",l.style.boxSizing="border-box",this.canvas.tabIndex=0;const c={pointerId:null,downX:0,downY:0,moved:!1};this.canvas.addEventListener("pointerdown",e=>{e.isPrimary&&0===e.button&&(c.pointerId=e.pointerId,c.downX=e.clientX,c.downY=e.clientY,c.moved=!1)}),this.canvas.addEventListener("pointermove",e=>{if(e.pointerId!==c.pointerId||c.moved)return;const t=e.clientX-c.downX,s=e.clientY-c.downY;c.moved=Math.hypot(t,s)>5}),this.canvas.addEventListener("pointercancel",e=>{e.pointerId===c.pointerId&&(c.pointerId=null,c.moved=!1)}),this.canvas.addEventListener("click",e=>{this.canvas.focus(),null===c.pointerId||c.moved||this.events.send({type:"CANVAS_CLICK",event:e}),c.pointerId=null,c.moved=!1}),this.canvas.addEventListener("pointerleave",e=>{this.events.send({type:"CANVAS_POINTER_LEAVE",event:e})}),this.canvas.addEventListener("pointerenter",e=>{this.events.send({type:"CANVAS_POINTER_ENTER",event:e})}),this.canvas.addEventListener("keydown",e=>{this.events.send({type:"CANVAS_KEY_DOWN",event:e})}),this.canvas.addEventListener("keyup",e=>{this.events.send({type:"CANVAS_KEY_UP",event:e})}),this.canvas.prepend(this.renderer.domElement);for(const e of o.values())e instanceof Mesh3D?(e.setReflectivesSSR(this.reflectivesSSR),e.start(this.renderer,this.scene),e.groundReflector&&(this.groundReflector=e.groundReflector)):e.start(this.renderer,this.scene);if(this.cfg.gui.infoBox.enable&&(loadInfoBox(this.cfg,a?"WebGPU":"WebGL"),this.infoBox=document.querySelector("ilu-infobox"),this.renderer.info.autoReset=!1),this.isPostCfg()){const e=this.modules.gpuTier;"none"!==this.cfg.debug.log&&console.log(JSON.stringify(e)),"number"==typeof e?.fps&&(this.gpuFps=e.fps)}this.dTFrameMax=1/this.cfg.render.fpsMax,this.timeLastFrame=performance.now()/1e3,this.cfg.scene.fog.enable&&this.setFog({color:this.cfg.scene.fog.color,near:this.cfg.scene.fog.near,far:this.cfg.scene.fog.far}),this.cfg.scene.ambientlight.enable&&this.setAmbientLight({color:this.cfg.scene.ambientlight.color,intensity:this.cfg.scene.ambientlight.intensity}),this.cfg.scene.hemisphere.enable&&this.setHemisphereLight({skyColor:this.cfg.scene.hemisphere.skyColor,groundColor:this.cfg.scene.hemisphere.groundColor,intensity:this.cfg.scene.hemisphere.intensity}),this.updateCanvasResize(),window.addEventListener("resize",()=>{this.resizeTimeout&&clearTimeout(this.resizeTimeout),this.resizeTimeout=setTimeout(()=>{!1===this.cfg.render.autoResize?this.events.windowResize({type:"WINDOW_RESIZE"}):this.updateCanvasResize()},this.resizeDelay)}),gsap.gsap.ticker.remove(gsap.gsap.updateRoot),gsap.gsap.ticker.lagSmoothing(0)}init(){this.isPostEnabled()?this.modules.webGpuRendererClass?(this.setPostWebGpu(this.cfg.post.aa.mode,this.cfg.post.ssao.enable,this.cfg.post.ssr.enable),this.renderPipeline?.render()):(this.setPostWebGl(),this.composer?.render()):this.renderer.render(this.scene,this.cam3D.obj),this.events.send({type:"SCENE_RENDERED"},"Scene first time rendered."),this.setAnimationLoop()}async initWebGpuRenderer(){await this.renderer.init()}addOnFrameUpdate(e){this.callbacks.push(e)}animCamCurveTo({camTarget:e,aimTarget:t,radiusOut:s=1,duration:i=2,ease:n="power1.inOut"}){const o=this.animCamCurveTo.name,a=e=>{for(;e>Math.PI;)e-=2*Math.PI;for(;e<-Math.PI;)e+=2*Math.PI;return e},r=e=>{if("string"==typeof e){const t=this.scene.getObjectByName(e);return t?t.getWorldPosition(new THREE.Vector3):(console.warn(`${o}: Object with name "${e}" not found.`),null)}return e instanceof Obj3D?e.obj?e.obj.getWorldPosition(new THREE.Vector3):(console.warn(`${o}: Obj3D not found.`),null):e instanceof THREE.Vector3?e.clone():(console.warn(`${o}: Invalid target.`),null)},l=e=>{const t=Math.max(e.length(),1e-4);return{radius:t,lat:Math.asin(THREE.MathUtils.clamp(e.y/t,-1,1)),lon:Math.atan2(e.x,e.z)}};this.cam3D.lookMode="target";const c=this.cam3D.objTarget.position.clone(),d=r(e);if(!d)return void console.warn(`Camera object with name "${e}" was not found.`);const h=t?r(t):c;if(!h)return void console.warn(`Aim object with name "${t}" was not found.`);const m=this.cam3D.obj.getWorldPosition(new THREE.Vector3).clone().sub(c),p=d.clone().sub(h),u=l(m),g=l(p),b=u.lat,v=g.lat,f=a(u.lon),C=a(a(g.lon)-f),y=u.radius,w=g.radius,L=Math.max(y,w)*s,E={t:0};gsap.gsap.to(E,{t:1,duration:i,ease:n,onStart:()=>{this.events.anim({type:"ANIM_START",objName:"Camera",fct:o})},onUpdate:()=>{const e=E.t,t=c.clone().lerp(h,e),s=THREE.MathUtils.lerp(b,v,e),i=a(f+C*e),n=THREE.MathUtils.lerp(y,w,e),o=Math.sin(Math.PI*e)*L,r=((e,t,s)=>{const i=Math.cos(t);return new THREE.Vector3(e*i*Math.sin(s),e*Math.sin(t),e*i*Math.cos(s))})(Math.max(1e-4,n+o),s,i),l=t.clone().add(r);this.cam3D.obj.position.copy(l),this.cam3D.objTarget.position.copy(t)},onComplete:()=>{this.events.anim({type:"ANIM_COMPLETE",objName:"Camera",fct:o})}})}animCamTo({target:e,duration:t=1,ease:s="power2.inOut",dist:i=1.25}){const n="animCamTo";this.cam3D.lookMode="target";const o=(e=>{if("string"==typeof e){const t=this.scene.getObjectByName(e);return t||(console.warn(`${n}: Object with name "${e}" not found.`),null)}return e instanceof Obj3D?e.obj?e.obj:(console.warn(`${n}: Obj3D object not found.`),null):(console.warn(`${n}: Invalid target.`),null)})(e);if(!o)return;const a=((e,t)=>{const s=(new THREE.Box3).setFromObject(e,!0);if(s.isEmpty())return console.warn(`${n}: Object bounding box is empty.`),null;const i=s.getBoundingSphere(new THREE.Sphere),o=this.cam3D.obj,a=THREE.MathUtils.degToRad(o.fov),r=2*Math.atan(Math.tan(a/2)*o.aspect),l=Math.min(a,r),c=i.radius/Math.sin(l/2)*t;return{center:i.center.clone(),camDistance:c}})(o,i);if(!a)return;const r=a.center,l=this.cam3D.objTarget.position.clone(),c=this.cam3D.obj.position.clone(),d=c.clone().sub(r);0===d.lengthSq()&&d.set(0,0,1);const h=r.clone().add(d.normalize().multiplyScalar(a.camDistance)),m={t:0};gsap.gsap.to(m,{t:1,duration:t,ease:s,onStart:()=>{this.events.anim({type:"ANIM_START",objName:"Camera",fct:n})},onUpdate:()=>{const e=m.t,t=l.clone().lerp(r,e),s=c.clone().lerp(h,e);this.cam3D.obj.position.copy(s),this.cam3D.objTarget.position.copy(t)},onComplete:()=>{this.cam3D.obj.position.copy(h),this.cam3D.objTarget.position.copy(r),this.events.anim({type:"ANIM_COMPLETE",objName:"Camera",fct:n})}})}animMaterialColor({mesh:e,duration:t=0,ease:s="power1.inOut",...i}){let n=this.animMaterialColor.name;if(!e)return void console.warn(`${n}: Missing object name`);const o=this.scene.getObjectByName(e);if(!o)return void console.warn(`${n}: Object with name "${e}" not found.`);if(!("material"in o)||!o.material)return void console.warn(`${n}: Object "${e}" has no material.`);const a=o.material,r=Object.keys(i);0!==r.length?r.forEach(o=>{const r=i[o];if(!(o in a)||!a[o].isColor)return void console.warn(`${n}: Material property "${o}" is not a color.`);if(null==r)return void console.warn(`${n}: Color value for "${o}" is null or undefined.`);const l=a[o],c=new THREE.Color(r);gsap.gsap.to(l,{r:c.r,g:c.g,b:c.b,duration:t,ease:s,onStart:()=>{this.events.animFade({type:"ANIM_FADE_START",objName:e,fct:n,property:o,value:l.getHexString()})},onUpdate:()=>{a[o].copy(l),a.needsUpdate=!0},onComplete:()=>{this.events.animFade({type:"ANIM_FADE_COMPLETE",objName:e,fct:n,property:o,value:l.getHexString()})}})}):console.warn(`${n}: No color property provided to animate.`)}animMaterialNumeric({mesh:e,startValue:t=null,infinite:s=!1,duration:i=0,ease:n="power1.inOut",...o}){let a=this.animMaterialNumeric.name;if(!e)return void console.warn(`${a}: Missing object name.`);const r=this.scene.getObjectByName(e);if(!r)return void console.warn(`${a}: Object with name "${e}" not found.`);if(!("material"in r)||!r.material)return void console.warn(`${a}: Object "${e}" has no material.`);const l=r.material,c=Object.keys(o);if(0===c.length)return void console.warn(`${a}: No property provided to animate.`);const d=c[0],h=o[d];if(!(d in l))return void console.warn(`${a}: Material property "${d}" does not exist.`);const m=l[d];if("number"!=typeof m)return void console.warn(`${a}: Material property "${d}" is not a number.`);if(null==h||"number"!=typeof h)return void console.warn(`${a}: Material property "${d}" endValue is null or undefined or not a number.`);const p={[d]:null===t?m:t};gsap.gsap.to(p,{[d]:h,duration:i,delay:0,ease:n,repeat:s?-1:0,onStart:()=>{this.events.animFade({type:"ANIM_FADE_START",objName:e,fct:a,property:d,value:p[d]})},onUpdate:()=>{l[d]=p[d],l.needsUpdate=!0},onComplete:()=>{this.events.animFade({type:"ANIM_FADE_COMPLETE",objName:e,fct:a,property:d,value:p[d]})}})}calcEaseArea(e){const t=gsap.gsap.parseEase(e);return function(e=100){let s=0;for(let i=0;i<=e;i++){s+=t(i/e)}return s/e}()}async enableAaMode(e){this.modules.webGpuRendererClass?("fxaa"===e?await this.modules.importFXAANode("fxaa"):"smaa"===e?await this.modules.importSMAANode("smaa"):"traa"===e&&await this.modules.importTRAANode("traa"),this.setPostWebGpu(e,this.cfg.post.ssao.enable,this.cfg.post.ssr.enable),this.cfg.post.aa.mode=e):(this.fxaaPass||"fxaa"!==e?this.smaaPass||"smaa"!==e||await this.modules.importSMAAPass("smaa"):await this.modules.importFXAAShader("fxaa"),this.setPostWebGl())}async enableSsao(e){this.modules.webGpuRendererClass?(await this.modules.importGtaoNode(e),this.setPostWebGpu(this.cfg.post.aa.mode,e,this.cfg.post.ssr.enable),this.cfg.post.ssao.enable=e):(this.cfg.post.ssao.enable=e,this.ssaoPass||await this.modules.importSSAOPass(e),this.setPostWebGl())}async enableSsr(e){this.modules.webGpuRendererClass?(await this.modules.importSsrNode(e),this.setPostWebGpu(this.cfg.post.aa.mode,this.cfg.post.ssao.enable,e),this.cfg.post.ssr.enable=e):(this.cfg.post.ssr.enable=e,e?this.ssrPass||await this.modules.importSsrPass(e):this.groundReflector&&(this.groundReflector.visible=!1),this.setPostWebGl())}isPostCfg(){return this.cfg.post.ssao.enable||this.cfg.post.ssr.enable||"none"!==this.cfg.post.aa.mode}isPostEnabled(){let e=this.isPostCfg(),t=this.isPostGpu();return e&&t&&this.postNoise}isPostGpu(){return!(this.gpuFps<50)}async loadScene(e){const t=this.modules.gltfLoader;if(!t)return void console.warn("Three.js GLTFLoader could not be started.");if("ktx2"===this.cfg.model.compress.texture){const e=this.modules.ktx2Loader;e?(await this.rendererReady,e.setTranscoderPath("ktx2/").detectSupport(this.renderer),t.setKTX2Loader(e)):console.warn("KTX2Loader not imported.")}"draco"===this.cfg.model.compress.mesh?this.modules.dracoLoader?this.cfg.model.decoderPath?(this.modules.dracoLoader.setDecoderPath(this.cfg.model.decoderPath),t.setDRACOLoader(this.modules.dracoLoader)):console.warn("Draco decoderPath is empty."):console.warn("DRACOLoader not imported."):"meshopt"===this.cfg.model.compress.mesh&&(this.modules.meshoptDecoder?t.setMeshoptDecoder(this.modules.meshoptDecoder):console.warn("MeshoptDecoder not imported."));let s=null;return this.cfg.model.progressBar&&(s=loadProgressBar(this.canvas,this.events)),new Promise((i,n)=>{t.load(e,e=>{this.gltf=e,this.scene.add(e.scene),this.actionCtrls?.dispose(),this.actionCtrls=null,this.mixer=null,e.animations&&e.animations.length>0&&(this.mixer=new THREE.AnimationMixer(e.scene),this.actionCtrls=new ActionCtrls(this.mixer,this.events)),e.scene.traverse(e=>{const t=this.objs3D.get(e.name);e instanceof THREE.Mesh?(e.castShadow=this.cfg.mesh.castShadow,e.receiveShadow=this.cfg.mesh.receiveShadow,e.frustumCulled=this.cfg.mesh.frustumCulled,t instanceof Mesh3D?(t.traverse(e),!this.groundReflector&&t.groundReflector&&(this.groundReflector=t.groundReflector)):e.material instanceof THREE.MeshStandardMaterial&&e.material.roughness<this.cfg.post.webgl.ssr.maxRoughness&&this.reflectivesSSR.push(e)):e instanceof THREE.Light?(e.castShadow=this.cfg.light.castShadow,(e instanceof THREE.DirectionalLight||e instanceof THREE.SpotLight||e instanceof THREE.PointLight)&&(e.shadow.mapSize.width=this.cfg.light.mapWidth,e.shadow.mapSize.height=this.cfg.light.mapHeight,e.shadow.bias=this.cfg.light.bias,e.shadow.normalBias=this.cfg.light.normalBias,(e.shadow.camera instanceof THREE.PerspectiveCamera||e.shadow.camera instanceof THREE.OrthographicCamera)&&(e.shadow.camera.near=this.cfg.light.near,e.shadow.camera.far=this.cfg.light.far)),t instanceof Light3D&&t.traverse(e)):e instanceof THREE.Camera?this.cam3D.traverse(e):e instanceof THREE.Object3D&&t instanceof Obj3D&&t.traverse(e)}),s?.setProgress(100),i()},e=>{if(e.total>0){const t=e.loaded/e.total,i=Math.round(90*t);i<90&&s?.setProgress(i);const n=Math.round(100*t);this.events.modelLoading({type:"MODEL_LOADING",loading:n})}else this.events.modelLoading({type:"MODEL_LOADING",loading:0})},e=>{const t=e instanceof Error?e:new Error(String(e));this.events.modelError({type:"MODEL_ERROR",error:t}),n(e)})})}playClip({layer:e,clip:t,blendMode:s="normal",finishMode:i="hold",loopMode:n=1,stopMode:o="all",fadeDuration:a=0,fadeDurationFinish:r=0,reverse:l=!1,reset:c=!1,startSpeed:d=0,endSpeed:h=1,duration:m=0,ease:p="power1.inOut"}){const u=this.playClip.name;if(!e)return void console.warn(`${u}: Missing layer.`);if(!t)return void console.warn(`${u}: Missing clipname.`);if("infinite"!==n&&(!Number.isInteger(n)||n<1))return void console.warn(`${u}: loopMode must be a positive integer or "infinite".`);if(!this.gltf?.animations?.length)return void console.warn(`${u}: gltf has no animations.`);const g=THREE.AnimationClip.findByName(this.gltf.animations,t);g?this.mixer?this.actionCtrls&&this.actionCtrls.play(g,{clipName:t,fct:u,layer:e,blendMode:s,loopMode:n,finishMode:i,stopMode:o,fadeDuration:a,fadeDurationFinish:r,reverse:l,reset:c,startSpeed:d,endSpeed:h,speedDuration:m,speedEase:p,started:!1,finished:!1}):console.warn(`${u}: Mixer not found.`):console.warn(`${u}: ClipAnimation "${t}" not found`)}playClipCam({layer:e,clip:t,blendMode:s="normal",loopMode:i=1,stopMode:n="all",fadeDuration:o=0,reverse:a=!1,reset:r=!1,startSpeed:l=0,endSpeed:c=1,duration:d=0,ease:h="power1.inOut"}){const m=this.playClipCam.name;if(!e)return void console.warn(`${m}: Missing layer.`);const p=this.cam3D.targetGltf,u=this.cam3D.objGltf;if(!p)return void console.warn(`${m}: Aim object not found.`);if(!u)return void console.warn(`${m}: Gltf object not found.`);if(!t)return void console.warn(`${m}: Missing clipname.`);if("infinite"!==i&&(!Number.isInteger(i)||i<1))return void console.warn(`${m}: loopMode must be a positive integer or "infinite".`);if(!this.gltf?.animations?.length)return void console.warn(`${m}: gltf has no animations.`);const g=THREE.AnimationClip.findByName(this.gltf.animations,t);if(!g)return void console.warn(`${m}: ClipAnimation "${t}" not found`);if(!this.mixer)return void console.warn(`${m}: Mixer not found.`);if(!this.actionCtrls)return;this.cam3D.lookMode="target";const b=new THREE.Vector3,v=new THREE.Vector3;this.actionCtrls.play(g,{clipName:t,fct:m,layer:e,blendMode:s,loopMode:i,finishMode:"hold",stopMode:n,fadeDuration:o,fadeDurationFinish:0,reverse:a,reset:r,startSpeed:l,endSpeed:c,speedDuration:d,speedEase:h,started:!1,finished:!1,hooks:{onUpdate:()=>{this.cam3D.obj.position.copy(u.getWorldPosition(b)),this.cam3D.objTarget.position.copy(p.getWorldPosition(v))}}})}removeAmbientLight(){this.ambientLight&&(this.scene.remove(this.ambientLight),this.ambientLight.dispose(),this.ambientLight=null)}removeFog(){this.scene.fog&&(this.scene.fog=null)}removeHemisphereLight(){this.hemisphereLight&&(this.scene.remove(this.hemisphereLight),this.hemisphereLight.dispose(),this.hemisphereLight=null)}removeOnFrameUpdate(e){this.callbacks=this.callbacks.filter(t=>t!==e)}setAmbientLight({color:e,intensity:t}){if(!this.ambientLight){if(void 0===e||void 0===t)return;return this.ambientLight=new THREE.AmbientLight(e,t),void this.scene.add(this.ambientLight)}void 0!==e&&this.ambientLight.color.set(e),void 0!==t&&(this.ambientLight.intensity=t)}setAnimationLoop(){this.renderer.setAnimationLoop(e=>this.update(e))}setFog({color:e,near:t,far:s}){if(this.scene.fog)void 0!==e&&this.scene.fog.color.set(e),this.scene.fog instanceof THREE.Fog&&(void 0!==t&&(this.scene.fog.near=t),void 0!==s&&(this.scene.fog.far=s));else{if(void 0===e||void 0===t||void 0===s)return;this.scene.fog=new THREE.Fog(e,t,s)}}setFxaaResolution(e){if(!this.fxaaPass)return;const t=this.renderer.getSize(new THREE.Vector2),s=this.renderer.getPixelRatio(),i=this.fxaaPass.material.uniforms;i.resolution.value.x=e/(t.x*s),i.resolution.value.y=e/(t.y*s)}setHemisphereLight({skyColor:e,groundColor:t,intensity:s}){if(!this.hemisphereLight){if(void 0===e||void 0===t||void 0===s)return;return this.hemisphereLight=new THREE.HemisphereLight(e,t,s),void this.scene.add(this.hemisphereLight)}void 0!==e&&this.hemisphereLight.color.set(e),void 0!==t&&this.hemisphereLight.groundColor.set(t),void 0!==s&&(this.hemisphereLight.intensity=s)}setMaterialProperties({obj:e,...t}){let s=this.setMaterialProperties.name;if(!e)return void console.warn(`${s}: Missing objName`);const i=this.scene.getObjectByName(e);if(!i)return void console.warn(`${s}: Object with name "${e}" not found.`);if(!("material"in i)||!i.material)return void console.warn(`${s}: Object "${e}" has no material.`);const n=i.material,o=Object.keys(t);if(0===o.length)return void console.warn(`${s}: No material properties provided.`);let a=null;for(const e of o){const i=t[e];if(("map"===e||"emissiveMap"===e)&&"string"==typeof i){a||(a=new THREE.TextureLoader),a.load(i,t=>{n[e]=t,n.needsUpdate=!0},void 0,t=>{console.error(`${s}: Failed to load texture "${i}" for "${e}":`,t)});continue}if(!(e in n)){console.warn(`${s}: Material property "${e}" does not exist.`);continue}const o=n[e];o instanceof THREE.Color?o.set(i):typeof o==typeof i?n[e]=i:console.warn(`${s}: Type mismatch for "${e}": expected ${typeof o}, got ${typeof i}`)}n.needsUpdate=!0}setPostWebGl(){if(!this.composer){const e=this.modules.effectComposerClass;e?this.renderer instanceof THREE.WebGLRenderer&&(this.composer=new e(this.renderer)):console.warn("EffectComposer could not be started.")}if(!this.composer)return;for(const e of this.composer.passes)e.dispose?.();this.composer.passes.length=0;const e=this.canvas.getBoundingClientRect();if(!this.renderPass){const e=this.modules.renderPassClass;e?this.renderPass=new e(this.scene,this.cam3D.obj):console.warn("Module Three.js RenderPass could not be imported.")}if(this.renderPass&&this.composer.addPass(this.renderPass),this.cfg.post.ssr.enable){if(!this.ssrPass)if(this.modules.ssrPassClass){this.groundReflector&&!this.groundReflector.parent&&this.scene.add(this.groundReflector);const t=this.cfg.post.ssr,s=this.cfg.post.webgl.ssr;this.ssrPass=new this.modules.ssrPassClass({renderer:this.renderer,scene:this.scene,camera:this.cam3D.obj,width:e.width,height:e.height,bouncing:s.bouncing,groundReflector:this.groundReflector,selects:s.selective?this.reflectivesSSR:null}),this.ssrPass&&(this.ssrPass.enabled=!0,this.ssrPass.clear=s.clear,this.ssrPass.selective=s.selective,this.ssrPass.fresnel=s.fresnel,this.ssrPass.distanceAttenuation=s.distanceAttenuation,this.ssrPass.infiniteThick=s.infiniteThick,this.ssrPass.maxDistance=t.maxDistance,this.ssrPass.opacity=s.opacity,this.ssrPass.thickness=t.thickness,this.ssrPass.resolutionScale=t.resolutionScale,this.ssrPass.blur=s.blur,this.ssrPass.output=s.output)}else console.warn("Module Three.js SSRPass could not be imported.");this.ssrPass&&this.composer.addPass(this.ssrPass)}this.cfg.post.ssao.enable&&(this.ssaoPass||(this.modules.ssaoPassClass?(this.ssaoPass=new this.modules.ssaoPassClass(this.scene,this.cam3D.obj,e.width,e.height),this.ssaoPass&&(this.ssaoPass.enabled=!0,this.ssaoPass.kernelRadius=this.cfg.post.webgl.ssao.kernelRadius,this.ssaoPass.minDistance=this.cfg.post.webgl.ssao.minDistance,this.ssaoPass.maxDistance=this.cfg.post.webgl.ssao.maxDistance)):console.warn("Module Three.js SSAOPass could not be imported.")),this.ssaoPass&&this.composer.addPass(this.ssaoPass));const t=this.cfg.post.aa;if("smaa"===t.mode&&(this.smaaPass||(this.modules.smaaPassClass?(this.smaaPass=new this.modules.smaaPassClass,this.smaaPass&&(this.smaaPass.enabled=!0)):console.warn("Module Three.js SMAAPass could not be imported.")),this.smaaPass&&this.composer.addPass(this.smaaPass)),!this.outputPass){const e=this.modules.outputPassClass;e?this.outputPass=new e:console.warn("Module Three.js OutputPass could not be imported.")}if(this.outputPass&&this.composer.addPass(this.outputPass),"fxaa"===t.mode){if(!this.fxaaPass){const e=this.modules.shaderPassClass;e&&this.modules.fxaaShader?(this.fxaaPass=new e(this.modules.fxaaShader),this.fxaaPass&&(this.fxaaPass.enabled=!0),this.setFxaaResolution(this.cfg.post.webgl.aa.fxaa.sharpness)):console.warn("Module Three.js FXAAShader could not be imported.")}this.fxaaPass&&this.composer.addPass(this.fxaaPass)}}setPostWebGpu(e,t,s){if(!this.renderPipeline){const e=this.modules.renderPipelineClass;if(e){const t=this.modules.webGpuRendererClass;t&&this.renderer instanceof t&&(this.renderPipeline=new e(this.renderer))}else console.warn("EffectComposer could not be started.")}if(!this.renderPipeline)return;const{tslPass:i,tslMrt:n,tslOutput:o,tslVelocity:a,tslRenderOutput:r,tslNormalView:l,tslMetalness:c,tslRoughness:d,tslSample:h,tslVec2:m,tslVec3:p,tslVec4:u,packNormalToRGB:g,unpackRGBToNormal:b}=this.modules;if(!(i&&n&&o&&r&&l&&c&&d&&h&&m&&p&&u&&g&&b))return;if("traa"===e&&!a)return;this.aaNode?.dispose(),this.aaNode=null,this.gtaoNode?.dispose(),this.gtaoNode=null,this.ssrNode?.dispose(),this.ssrNode=null,this.tslPass?.dispose(),this.tslPass=null;const v=i(this.scene,this.cam3D.obj);this.tslPass=v,"traa"===e&&a?v.setMRT(n({output:o,normal:g(l),metalrough:m(c,d),velocity:a})):v.setMRT(n({output:o,normal:g(l),metalrough:m(c,d)})),v.getTexture("normal").type=THREE.UnsignedByteType,v.getTexture("metalrough").type=THREE.UnsignedByteType;const f=v.getTextureNode("output"),C=v.getTextureNode("depth"),y=v.getTextureNode("normal"),w=v.getTextureNode("metalrough"),L=h(e=>b(y.sample(e)));let E=f;if(t)if(this.modules.gtaoNodeClass){const t=this.cfg.post.webgpu.ssao,s=this.modules.gtaoNodeClass(C,L,this.cam3D.obj);this.gtaoNode=s,s.radius.value=t.radius,s.thickness.value=t.thickness,s.distanceExponent.value=t.distanceExponent,s.distanceFallOff.value=t.distanceFallOff,s.scale.value=t.scale,s.samples.value=t.samples,s.resolutionScale=t.resolutionScale,s.useTemporalFiltering="traa"===e;const i=s.getTextureNode();E=E.mul(u(p(i.r),1))}else console.warn("Module Three.js GTAONode could not be imported.");if(s)if(this.modules.ssrNode){const e=this.cfg.post.ssr,t=this.cfg.post.webgpu.ssr,s=this.modules.ssrNode(f,C,L,{metalnessNode:w.r,roughnessNode:w.g,camera:this.cam3D.obj});this.ssrNode=s,s.quality.value=t.quality,s.blurQuality=t.blurQuality,s.maxDistance.value=e.maxDistance,s.intensity.value=t.intensity,s.thickness.value=e.thickness,s.resolutionScale=e.resolutionScale,E=E.add(u(s.rgb,0))}else console.warn("Module Three.js SSRNode could not be imported.");if("smaa"===e&&this.modules.smaaNode){const e=this.modules.smaaNode(E);this.aaNode=e,E=e.getTextureNode()}else if("traa"===e&&this.modules.traaNode){const e=v.getTextureNode("velocity"),t=this.modules.traaNode(E,C,e,this.cam3D.obj);this.aaNode=t,E=t}if(this.renderPipeline.outputColorTransform=!0,"fxaa"===e&&this.modules.fxaaNode){const e=r(E),t=this.modules.fxaaNode(e);this.aaNode=t,E=t,this.renderPipeline.outputColorTransform=!1}this.renderPipeline.outputNode=E,this.renderPipeline.needsUpdate=!0}stopAnimClip({clipName:e,fadeOut:t=0,ease:s="power1.inOut"}){let i=this.stopAnimClip.name;if(!e)return void console.warn(`${i}: Missing clipName.`);if(!this.gltf?.animations?.length)return void console.warn(`${i}: glb has no animations.`);const n=THREE.AnimationClip.findByName(this.gltf.animations,e);n?this.mixer?this.actionCtrls&&this.actionCtrls.stop(n,{clipName:e,fct:i,duration:t,ease:s}):console.warn(`${i}: Mixer not exists.`):console.warn(`${i}: ClipAnimation "${e}" not found.`)}toggleFullscreen(){document.fullscreenElement?document.exitFullscreen():this.canvas.requestFullscreen()}use(e){e(this)}update(e){-1===this.timeLast&&(this.timeLast=e),this.dT=(e-this.timeLast)/1e3,this.timeLast=e;let t=!1,s=0;if(this.cfg.render.fpsLimiter){let i=0,n=0,o=0;if(this.dTs.push(this.dT),this.dTs.length>this.cfg.render.deltaTimesMax){this.dTs.shift();const e=[...this.dTs].sort((e,t)=>e-t);i=e[Math.floor(.5*(e.length-1))],o=e[Math.floor(.75*(e.length-1))],n=o/this.dTFrameMax}if(n<.75)if("Low"==this.powerMode){s=(e-this.timeLastFrame)/1e3;const n=s+i;(s>=this.dTFrameMax||n>=this.dTFrameMax&&n-this.dTFrameMax>this.dTFrameMax-s)&&(t=!0)}else t=!0,s=this.dT;else this.postNoise&&(this.postNoise=!1),t=!0,s=this.dT,this.dTs.length=0}else t=!0,s=this.dT;if(t){this.infoBox&&this.infoBox.begin(e),this.timeGsap+=s,gsap.gsap.updateRoot(this.timeGsap),this.mixer&&this.actionCtrls&&(this.actionCtrls.update(),this.mixer.update(s));for(const e of this.callbacks)e(s);for(const e of this.objs3D.values())e.update(s,this.cam3D);this.isPostEnabled()?this.modules.webGpuRendererClass?this.renderPipeline?.render():this.composer?.render():this.renderer.render(this.scene,this.cam3D.obj),this.timeLastFrame=e,this.infoBox&&(this.infoBox.end(performance.now(),this.renderer),this.renderer.info.reset())}}updateCanvasResize(){const e=this.canvas.getBoundingClientRect(),t=e.width,s=e.height;this.renderer.setSize(t,s,!1),this.modules.webGpuRendererClass?(this.tslPass?.setSize(t,s),this.gtaoNode?.setSize(t,s),this.ssrNode?.setSize(t,s),this.renderPipeline&&(this.renderPipeline.needsUpdate=!0)):(this.composer?.setSize(t,s),this.smaaPass?.setSize(t,s),this.fxaaPass&&this.setFxaaResolution(this.cfg.post.webgl.aa.fxaa.sharpness)),this.postNoise||(this.postNoise=!0),this.dTs.length=0,this.cam3D.updateCanvasResize(e),this.groundReflector&&(this.groundReflector.getRenderTarget().setSize(t,s),this.groundReflector.resolution.set(t,s))}},EnvCtrls=class{cfg;engine;modules;envReady=Promise.resolve();textReady=Promise.resolve(null);bgdReady=Promise.resolve();envEnabled=!1;envInit=!1;envLoadId=0;envIntensity;bgdIntensity;bgdBlurriness;rotation;rotationSpeed;envType;envMaps;envText=null;bgdText=null;callback=null;frameWaiters=[];timeBgdRot=0;constructor(e,t,s){this.cfg=e,this.engine=t,this.modules=s,this.envIntensity=this.cfg.envCtrls.environmentIntensity,this.bgdIntensity=this.cfg.envCtrls.backgroundIntensity,this.bgdBlurriness=this.cfg.envCtrls.backgroundBlurriness,this.rotationSpeed=this.cfg.envCtrls.rotationSpeed,this.envType=this.cfg.envCtrls.type,this.envMaps=[...this.cfg.envCtrls.map],this.rotation=new THREE.Euler(THREE.MathUtils.degToRad(this.cfg.envCtrls.rotation.x),THREE.MathUtils.degToRad(this.cfg.envCtrls.rotation.y),THREE.MathUtils.degToRad(this.cfg.envCtrls.rotation.z)),this.cfg.envCtrls.enable&&(this.textReady=this.loadText(this.envType,this.envMaps[0]??""))}init(){!this.cfg.envCtrls.enable||this.envEnabled||this.envInit||(this.envInit=!0,this.startEnv())}async applyBgds(e,t,s,i){let n=i;for(const i of s){const s=await this.loadText(t,i);if(s){if(this.envLoadId!==e)return void this.disposeText(s);if(await this.waitFrames(2),this.envLoadId!==e)return void this.disposeText(s);if(this.setBgd(s),await this.waitFrames(1),this.envLoadId!==e)return this.disposeText(s),void this.disposePrevBgd(n);this.disposePrevBgd(n),n=s}}}async applyEnv(e,t,s){const i=await this.textReady;if(!i||this.envLoadId!==e)return;const n=this.modules.webGpuRendererClass;if(n&&this.engine.renderer instanceof n)this.setEnv(i);else{const e=new THREE.PMREMGenerator(this.engine.renderer);try{e.compileEquirectangularShader();const t=e.fromEquirectangular(i).texture;this.setEnv(t,i)}finally{e.dispose()}}this.callback||(this.callback=e=>this.update(e),this.engine.addOnFrameUpdate(this.callback)),this.bgdReady=this.applyBgds(e,t,s.slice(1),i).catch(e=>{console.warn("Failed to apply background map:",e)})}disposePrevBgd(e){e&&this.envText!==e&&this.engine.scene.environment!==e&&(this.bgdText===e&&(this.bgdText=null),this.disposeText(e))}disposeText(e){e&&(this.envText===e&&(this.envText=null),this.bgdText===e&&(this.bgdText=null),e.dispose())}enable(e){if(this.envEnabled)return;const t=e?.type??this.cfg.envCtrls.type,s=[...e?.map??this.cfg.envCtrls.map];this.cfg.envCtrls.enable=!0,this.envEnabled=!0,this.envType=t,this.envMaps=s,this.textReady=this.loadText(t,s[0]??""),this.startEnv(t,s)}disable(){if(!this.envEnabled&&!this.envInit&&!this.isEnabled())return;this.cfg.envCtrls.enable=!1,this.envEnabled=!1,this.envInit=!1,this.envLoadId++,this.resolveFrameWaiters(!0),this.engine&&this.callback&&(this.engine.removeOnFrameUpdate(this.callback),this.callback=null);const e=this.envText,t=this.bgdText;this.disposeText(e),t!==e&&this.disposeText(t),this.engine.scene.environment=null,this.engine.scene.environmentRotation.set(0,0,0),this.engine.scene.environmentIntensity=this.envIntensity,this.engine.scene.background=null,this.engine.scene.backgroundRotation.set(0,0,0),this.engine.scene.backgroundIntensity=this.bgdIntensity,this.engine.scene.backgroundBlurriness=this.bgdBlurriness,this.rotationSpeed=this.cfg.envCtrls.rotationSpeed,this.timeBgdRot=0}get(){return{rotationSpeed:this.rotationSpeed,environmentIntensity:this.envIntensity,backgroundIntensity:this.bgdIntensity,backgroundBlurriness:this.bgdBlurriness,rotation:{x:THREE.MathUtils.radToDeg(this.rotation.x),y:THREE.MathUtils.radToDeg(this.rotation.y),z:THREE.MathUtils.radToDeg(this.rotation.z)}}}isEnabled(){return null!==this.engine.scene.environment||null!==this.engine.scene.background}async loadText(e,t){if(!t)return console.warn("Environment map is empty."),null;try{let s;if("hdr"===e||"exr"===e){if(!this.modules.envLoader)return console.warn("Modules EXRLoader or ENVLoader could not be imported."),null;const e=this.modules.webGpuRendererClass,i="float"===this.cfg.envCtrls.dataType&&(e&&this.engine.renderer instanceof e||this.engine.renderer.extensions.has("OES_texture_float_linear"));this.modules.envLoader.setDataType(i?THREE.FloatType:THREE.HalfFloatType),s=await this.modules.envLoader.loadAsync(t)}else s=await(new THREE.TextureLoader).loadAsync(t);return s.mapping=THREE.EquirectangularReflectionMapping,s}catch(e){return console.warn("Failed to load environment map:",t,e),null}}set(e){void 0!==e.rotationSpeed&&(this.rotationSpeed=e.rotationSpeed),void 0!==e.environmentIntensity&&(this.envIntensity=e.environmentIntensity,this.engine.scene.environmentIntensity=this.envIntensity),void 0!==e.backgroundIntensity&&(this.bgdIntensity=e.backgroundIntensity,this.engine.scene.backgroundIntensity=this.bgdIntensity),void 0!==e.backgroundBlurriness&&(this.bgdBlurriness=e.backgroundBlurriness,this.engine.scene.backgroundBlurriness=this.bgdBlurriness),void 0!==e.rotation&&(this.rotation.set(THREE.MathUtils.degToRad(e.rotation.x),THREE.MathUtils.degToRad(e.rotation.y),THREE.MathUtils.degToRad(e.rotation.z)),this.engine.scene.environmentRotation.copy(this.rotation),this.engine.scene.backgroundRotation.copy(this.rotation))}setEnv(e,t=e){this.envText=e,this.engine.scene.environment=e,this.engine.scene.environmentRotation.copy(this.rotation),this.engine.scene.environmentIntensity=this.envIntensity,this.setBgd(t)}setBgd(e){this.bgdText=e,this.engine.scene.background=e,this.engine.scene.backgroundRotation.copy(this.rotation),this.engine.scene.backgroundIntensity=this.bgdIntensity,this.engine.scene.backgroundBlurriness=this.bgdBlurriness}startEnv(e=this.envType,t=this.envMaps){const s=++this.envLoadId;this.envReady=this.applyEnv(s,e,t).catch(e=>{console.warn("Failed to apply environment:",e),this.envLoadId===s&&this.setEnv(null)})}waitFrames(e){return e<=0?Promise.resolve():new Promise(t=>{this.frameWaiters.push({remaining:e,resolve:t})})}resolveFrameWaiters(e=!1){const t=[];for(const s of this.frameWaiters)e||s.remaining--,e||s.remaining<=0?s.resolve():t.push(s);this.frameWaiters=t}update(e){if(0===this.rotationSpeed)this.engine.scene.environmentRotation.copy(this.rotation);else{this.timeBgdRot+=e*this.rotationSpeed;const t=THREE.MathUtils.degToRad(this.timeBgdRot);this.engine.scene.environmentRotation.set(this.rotation.x,this.rotation.y+t,this.rotation.z)}this.engine.scene.backgroundRotation.copy(this.engine.scene.environmentRotation),this.resolveFrameWaiters()}},Events=class{cfg;stateMachine;eventQueue=[];isProcessingEvents=!1;constructor(e,t){this.cfg=e,this.stateMachine=t}enqueue(e){if(this.eventQueue.push(e),!this.isProcessingEvents){this.isProcessingEvents=!0;try{for(;this.eventQueue.length>0;){const e=this.eventQueue.shift();e&&e()}}finally{this.isProcessingEvents=!1}}}anim(e){let t=`${e.fct} | ${e.objName}`;this.send(e,t)}animFade(e){let t=`${e.fct} | ${e.objName} | ${e.property} | ${e.value}`;this.send(e,t)}audioLoaded(e){this.send(e,e.soundName)}clip(e){const t=[];e.fct&&t.push(e.fct),e.clipName&&t.push(e.clipName),e.action&&t.push(`timeScale=${e.action.timeScale}`),e.action&&t.push(`time=${e.action.time}`),this.send(e,t.join(" | "))}modelError(e){let t="";t="SyntaxError"==e.error.name?"MODEL_ERROR: Invalid GLTF file or wrong path/filename.":`${e.error.name} / ${e.error.message}`,this.send(e,t)}modelLoading(e){this.send(e,`${e.loading}% loaded model`)}send(e,t){this.enqueue(()=>{const s=this.stateMachine.sendEvent(e,t);"all"!=this.cfg.debug.log||s||console.log(`${e.type}${t?`: ${t}`:""}`)})}windowResize(e){this.send(e,"Window render size updated.")}},OrbitCtrls=class{cam3D;canvas;engine;events;modules;orbitControls=null;params;orbitCtrlsFirstChange=!0;callback=null;touchPointerIds=new Set;constructor(e,t,s,i,n,o){this.cam3D=e,this.engine=i,this.events=n,this.modules=o,this.canvas=t,this.params={...s}}create(){this.orbitControls||this.modules.orbitControlsClass&&(this.orbitControls=new this.modules.orbitControlsClass(this.cam3D.obj,this.engine.renderer.domElement),this.orbitControls?(this.orbitControls.enabled=!1,this.orbitCtrlsFirstChange=!0,this.orbitControls.addEventListener("start",()=>{this.orbitCtrlsFirstChange=!1,this.events.send({type:"ORBITCTRLS_START"})}),this.orbitControls.addEventListener("change",()=>{this.orbitCtrlsFirstChange||(this.orbitCtrlsFirstChange=!0,this.events.send({type:"ORBITCTRLS_CHANGED"}))}),this.orbitControls.addEventListener("end",()=>{this.events.send({type:"ORBITCTRLS_END"})})):console.warn("Module OrbitControls could not be imported."))}disable(){this.orbitControls&&!1!==this.orbitControls.enabled&&(this.orbitControls.enabled=!1,this.touchPointerIds.clear(),this.callback&&(this.engine.removeOnFrameUpdate(this.callback),this.callback=null),this.events.send({type:"ORBITCTRLS_DISABLED"}))}enable(){this.orbitControls||this.create(),this.orbitControls&&(this.orbitControls.enabled||(this.orbitCtrlsFirstChange=!0,this.orbitControls.enabled=!0,this.cam3D.lookMode="target",this.orbitControls.target.copy(this.cam3D.objTarget.position),this.orbitControls.enableDamping=this.params.enableDamping,this.orbitControls.dampingFactor=this.params.dampingFactor,this.orbitControls.minDistance=this.params.minDistance,this.orbitControls.maxDistance=this.params.maxDistance,this.orbitControls.enableZoom=this.params.enableZoom,this.orbitControls.zoomSpeed=this.params.zoomSpeed,this.orbitControls.enableRotate=this.params.enableRotate,this.orbitControls.rotateSpeed=this.params.rotateSpeed,this.orbitControls.enablePan=this.params.enablePan,this.orbitControls.panSpeed=this.params.panSpeed,this.orbitControls.autoRotate=this.params.autoRotate,this.orbitControls.autoRotateSpeed=this.params.autoRotateSpeed,this.orbitControls.minPolarAngle=THREE.MathUtils.degToRad(this.params.minPolarAngle),this.orbitControls.maxPolarAngle=THREE.MathUtils.degToRad(this.params.maxPolarAngle),this.orbitControls.mouseButtons.LEFT=THREE.MOUSE.ROTATE,this.orbitControls.mouseButtons.MIDDLE=THREE.MOUSE.DOLLY,this.orbitControls.mouseButtons.RIGHT=THREE.MOUSE.PAN,this.orbitControls.touches.ONE=THREE.TOUCH.ROTATE,this.orbitControls.touches.TWO=THREE.TOUCH.DOLLY_PAN,this.callback=e=>{this.orbitControls&&(this.orbitControls.update(e),this.cam3D.objTarget.position.copy(this.orbitControls.target))},this.engine.addOnFrameUpdate(this.callback),this.events.send({type:"ORBITCTRLS_ENABLED"})))}dispose(){this.touchPointerIds.clear(),this.callback&&(this.engine.removeOnFrameUpdate(this.callback),this.callback=null),this.orbitControls?.dispose(),this.orbitControls=null,this.events.send({type:"ORBITCTRLS_DISPOSED"})}get(){return{enableDamping:this.params.enableDamping,dampingFactor:this.params.dampingFactor,minDistance:this.params.minDistance,maxDistance:this.params.maxDistance,enableZoom:this.params.enableZoom,zoomSpeed:this.params.zoomSpeed,enableRotate:this.params.enableRotate,rotateSpeed:this.params.rotateSpeed,enablePan:this.params.enablePan,panSpeed:this.params.panSpeed,autoRotate:this.params.autoRotate,autoRotateSpeed:this.params.autoRotateSpeed,minPolarAngle:this.params.minPolarAngle,maxPolarAngle:this.params.maxPolarAngle}}isEnabled(){return null!==this.orbitControls&&!0===this.orbitControls?.enabled}set(e){this.orbitControls&&(void 0!==e.enableDamping&&(this.params.enableDamping=e.enableDamping,this.orbitControls.enableDamping=e.enableDamping),void 0!==e.dampingFactor&&(this.params.dampingFactor=e.dampingFactor,this.orbitControls.dampingFactor=e.dampingFactor),void 0!==e.minDistance&&(this.params.minDistance=e.minDistance,this.orbitControls.minDistance=e.minDistance),void 0!==e.maxDistance&&(this.params.maxDistance=e.maxDistance,this.orbitControls.maxDistance=e.maxDistance),void 0!==e.enableZoom&&(this.params.enableZoom=e.enableZoom,this.orbitControls.enableZoom=e.enableZoom),void 0!==e.zoomSpeed&&(this.params.zoomSpeed=e.zoomSpeed,this.orbitControls.zoomSpeed=e.zoomSpeed),void 0!==e.enableRotate&&(this.params.enableRotate=e.enableRotate,this.orbitControls.enableRotate=e.enableRotate),void 0!==e.rotateSpeed&&(this.params.rotateSpeed=e.rotateSpeed,this.orbitControls.rotateSpeed=e.rotateSpeed),void 0!==e.enablePan&&(this.params.enablePan=e.enablePan,this.orbitControls.enablePan=e.enablePan),void 0!==e.panSpeed&&(this.params.panSpeed=e.panSpeed,this.orbitControls.panSpeed=e.panSpeed),void 0!==e.autoRotate&&(this.params.autoRotate=e.autoRotate,this.orbitControls.autoRotate=e.autoRotate),void 0!==e.autoRotateSpeed&&(this.params.autoRotateSpeed=e.autoRotateSpeed,this.orbitControls.autoRotateSpeed=e.autoRotateSpeed),void 0!==e.minPolarAngle&&(this.params.minPolarAngle=e.minPolarAngle,this.orbitControls.minPolarAngle=THREE.MathUtils.degToRad(e.minPolarAngle)),void 0!==e.maxPolarAngle&&(this.params.maxPolarAngle=e.maxPolarAngle,this.orbitControls.maxPolarAngle=THREE.MathUtils.degToRad(e.maxPolarAngle)))}use(e){e(this)}},FpvCtrls=class{cam3D;canvas;engine;events;modules;pointerLockCtrls=null;params;isMoveForward=!1;isMoveLeft=!1;isMoveBackward=!1;isMoveRight=!1;isMoveUp=!1;isMoveDown=!1;callback=null;onClick=()=>{this.isEnabled()&&(this.isLocked()?this.unlock():this.lock())};onKeyDown=e=>{this.isEnabled()&&(e.code===this.params.keyMoveForward&&(this.isMoveForward=!0),e.code===this.params.keyMoveLeft&&(this.isMoveLeft=!0),e.code===this.params.keyMoveBackward&&(this.isMoveBackward=!0),e.code===this.params.keyMoveRight&&(this.isMoveRight=!0),e.code===this.params.keyMoveUp&&(this.isMoveUp=!0),e.code===this.params.keyMoveDown&&(this.isMoveDown=!0))};onKeyUp=e=>{this.isEnabled()&&(e.code===this.params.keyMoveForward&&(this.isMoveForward=!1),e.code===this.params.keyMoveLeft&&(this.isMoveLeft=!1),e.code===this.params.keyMoveBackward&&(this.isMoveBackward=!1),e.code===this.params.keyMoveRight&&(this.isMoveRight=!1),e.code===this.params.keyMoveUp&&(this.isMoveUp=!1),e.code===this.params.keyMoveDown&&(this.isMoveDown=!1))};constructor(e,t,s,i,n,o){this.cam3D=e,this.canvas=t,this.engine=i,this.events=n,this.modules=o,this.params={...s}}create(){this.pointerLockCtrls||this.modules.pointerLockControlsClass&&(this.pointerLockCtrls=new this.modules.pointerLockControlsClass(this.cam3D.obj,this.engine.renderer.domElement),this.pointerLockCtrls?(this.pointerLockCtrls.enabled=!1,this.pointerLockCtrls.addEventListener("lock",()=>{this.events.send({type:"FPVCTRLS_LOCK"})}),this.pointerLockCtrls.addEventListener("unlock",()=>{this.events.send({type:"FPVCTRLS_UNLOCK"})}),this.canvas.addEventListener("click",this.onClick),this.canvas.addEventListener("keydown",this.onKeyDown),this.canvas.addEventListener("keyup",this.onKeyUp)):console.warn("Module PointerLockControls could not be imported."))}disable(){this.pointerLockCtrls&&0!=this.pointerLockCtrls.enabled&&(this.pointerLockCtrls.enabled=!1,this.pointerLockCtrls.isLocked&&this.pointerLockCtrls.unlock(),this.callback&&(this.engine.removeOnFrameUpdate(this.callback),this.callback=null),this.isMoveForward=!1,this.isMoveLeft=!1,this.isMoveBackward=!1,this.isMoveRight=!1,this.isMoveUp=!1,this.isMoveDown=!1,this.events.send({type:"FPVCTRLS_DISABLED"}))}enable(){this.pointerLockCtrls||this.create(),this.pointerLockCtrls&&1!=this.pointerLockCtrls.enabled&&(this.pointerLockCtrls.enabled=!0,this.pointerLockCtrls.minPolarAngle=this.params.minPolarAngle,this.pointerLockCtrls.maxPolarAngle=this.params.maxPolarAngle,this.pointerLockCtrls.pointerSpeed=this.params.pointerSpeed,this.callback=e=>{this.pointerLockCtrls?.isLocked&&(this.isMoveForward&&this.moveForward(e),this.isMoveBackward&&this.moveForward(-e),this.isMoveLeft&&this.moveRight(-e),this.isMoveRight&&this.moveRight(e),this.isMoveUp&&this.moveUp(e),this.isMoveDown&&this.moveUp(-e))},this.engine.addOnFrameUpdate(this.callback),this.events.send({type:"FPVCTRLS_ENABLED"}))}dispose(){this.callback&&(this.engine.removeOnFrameUpdate(this.callback),this.callback=null),this.canvas.removeEventListener("click",this.onClick),this.canvas.removeEventListener("keydown",this.onKeyDown),this.canvas.removeEventListener("keyup",this.onKeyUp),this.isMoveForward=!1,this.isMoveLeft=!1,this.isMoveBackward=!1,this.isMoveRight=!1,this.isMoveUp=!1,this.isMoveDown=!1,this.pointerLockCtrls?.isLocked&&this.pointerLockCtrls.unlock(),this.pointerLockCtrls?.dispose(),this.pointerLockCtrls=null,this.events.send({type:"FPVCTRLS_DISPOSED"})}get(){return{minPolarAngle:this.params.minPolarAngle,maxPolarAngle:this.params.maxPolarAngle,pointerSpeed:this.params.pointerSpeed,keyMoveForward:this.params.keyMoveForward,keyMoveLeft:this.params.keyMoveLeft,keyMoveBackward:this.params.keyMoveBackward,keyMoveRight:this.params.keyMoveRight,keyMoveUp:this.params.keyMoveUp,keyMoveDown:this.params.keyMoveDown}}isEnabled(){return!0===this.pointerLockCtrls?.enabled}isLocked(){return this.pointerLockCtrls?.isLocked??!1}lock(){this.cam3D.lookMode="free",this.pointerLockCtrls?.lock()}moveForward(e){this.pointerLockCtrls?.moveForward(e)}moveRight(e){this.pointerLockCtrls?.moveRight(e)}moveUp(e){this.cam3D.obj.position.y+=e}set(e){this.pointerLockCtrls&&(void 0!==e.minPolarAngle&&(this.params.minPolarAngle=e.minPolarAngle,this.pointerLockCtrls.minPolarAngle=e.minPolarAngle),void 0!==e.maxPolarAngle&&(this.params.maxPolarAngle=e.maxPolarAngle,this.pointerLockCtrls.maxPolarAngle=e.maxPolarAngle),void 0!==e.pointerSpeed&&(this.params.pointerSpeed=e.pointerSpeed,this.pointerLockCtrls.pointerSpeed=e.pointerSpeed),void 0!==e.keyMoveForward&&(this.params.keyMoveForward=e.keyMoveForward),void 0!==e.keyMoveLeft&&(this.params.keyMoveLeft=e.keyMoveLeft),void 0!==e.keyMoveBackward&&(this.params.keyMoveBackward=e.keyMoveBackward),void 0!==e.keyMoveRight&&(this.params.keyMoveRight=e.keyMoveRight),void 0!==e.keyMoveUp&&(this.params.keyMoveUp=e.keyMoveUp),void 0!==e.keyMoveDown&&(this.params.keyMoveDown=e.keyMoveDown))}unlock(){this.pointerLockCtrls?.unlock(),this.events.send({type:"FPVCTRLS_UNLOCK"})}use(e){e(this)}},Raycast=class{cam3D;canvas;cfg;engine;objs3D;raycasterPick=new THREE.Raycaster;raycasterVisible=new THREE.Raycaster;objsOccluders=[];objsOccls=[];objsPickables=new Set;objActive=null;objCandidate=null;closestObjCounter=0;indexOcclNext=0;timeOcclNext=0;isEnabled=!1;callbackOccls=null;callbackPointerHover=null;listenerClick;listenerCancel;listenerDown;listenerLeave;listenerMove;listenerUp;eventPointerMove=null;posPrevPointerX=0;posPrevPointerY=0;posWorldObj=new THREE.Vector3;dirCamToObj=new THREE.Vector3;posNdcPointer=new THREE.Vector2;constructor(e,t,s,i,n){this.cam3D=e,this.canvas=t,this.cfg=s,this.engine=i,this.objs3D=n,this.listenerMove=e=>this.onCanvasPointerMove(e),this.listenerClick=e=>this.onCanvasClick(e),this.listenerCancel=e=>this.onCanvasPointerCancel(e),this.listenerDown=e=>this.onCanvasPointerDown(e),this.listenerLeave=e=>this.onCanvasPointerLeave(e),this.listenerUp=e=>this.onCanvasPointerUp(e)}checkOcclVisible(e){e.getWorldPosition(this.posWorldObj),this.dirCamToObj.subVectors(this.posWorldObj,this.cam3D.obj.position);const t=this.dirCamToObj.length();if(t<=0)return!0;this.dirCamToObj.normalize(),this.raycasterVisible.set(this.cam3D.obj.position,this.dirCamToObj),this.raycasterVisible.near=0,this.raycasterVisible.far=Math.max(0,t-1e-4);const s=0===this.objsOccluders.length?this.engine.scene.children:this.objsOccluders;return!this.raycasterVisible.intersectObjects(s,!0).some(t=>t.object!==e)}enable(){this.isEnabled||0!==this.objsPickables.size&&(this.canvas.addEventListener("pointermove",this.listenerMove),this.canvas.addEventListener("click",this.listenerClick),this.canvas.addEventListener("pointercancel",this.listenerCancel),this.canvas.addEventListener("pointerdown",this.listenerDown),this.canvas.addEventListener("pointerleave",this.listenerLeave),this.canvas.addEventListener("pointerup",this.listenerUp),null===this.callbackPointerHover&&(this.callbackPointerHover=()=>this.updatePointerHover(),this.engine.addOnFrameUpdate(this.callbackPointerHover)),this.isEnabled=!0)}disable(){this.isEnabled&&(this.canvas.removeEventListener("pointermove",this.listenerMove),this.canvas.removeEventListener("click",this.listenerClick),this.canvas.removeEventListener("pointercancel",this.listenerCancel),this.canvas.removeEventListener("pointerdown",this.listenerDown),this.canvas.removeEventListener("pointerleave",this.listenerLeave),this.canvas.removeEventListener("pointerup",this.listenerUp),null!==this.callbackPointerHover&&(this.engine.removeOnFrameUpdate(this.callbackPointerHover),this.callbackPointerHover=null),this.objActive=null,this.objCandidate=null,this.closestObjCounter=0,this.eventPointerMove=null,this.isEnabled=!1)}getObjAtPointer(){this.raycasterPick.setFromCamera(this.posNdcPointer,this.cam3D.obj);const e=this.raycasterPick.intersectObjects([...this.objsPickables],!1);return 0===e.length?null:e[0].object}getOcclState(e){let t=this.objsOccls.find(t=>t.obj===e);return t||(t={obj:e,needsCheck:!1,visible:!1},this.objsOccls.push(t),1===this.objsOccls.length&&(this.indexOcclNext=0),t)}getOcclVisible(e){return this.getOcclState(e).visible}onCanvasClick(e){this.updatePointerPosition(e);const t=this.getObjAtPointer();t&&t.name&&this.objs3D.get(t.name)?.emitEvent({type:"OBJ3D_CLICK",event:e,objName:t.name})}onCanvasPointerLeave(e){this.onCanvasPointerExit(e)}onCanvasPointerMove(e){this.updatePointerPosition(e),this.eventPointerMove=e}onCanvasPointerCancel(e){this.onCanvasPointerExit(e)}onCanvasPointerDown(e){this.updatePointerPosition(e);const t=this.getObjAtPointer();this.objActive?.name&&t!==this.objActive&&this.onPointerLeave(this.objActive.name,e),t?.name&&t!==this.objActive&&this.onPointerEnter(t.name,e),this.objActive=t,this.objCandidate=null,this.closestObjCounter=0,this.objActive?.name&&this.objs3D.get(this.objActive.name)?.emitEvent({type:"OBJ3D_POINTER_DOWN",event:e,objName:this.objActive.name})}onCanvasPointerExit(e){this.objActive?.name&&this.onPointerLeave(this.objActive.name,e),this.objActive=null,this.objCandidate=null,this.closestObjCounter=0,this.eventPointerMove=null}onCanvasPointerUp(e){this.objActive?.name&&(this.objs3D.get(this.objActive.name)?.emitEvent({type:"OBJ3D_POINTER_UP",event:e,objName:this.objActive.name}),"touch"===e.pointerType&&this.onCanvasPointerExit(e))}onPointerEnter(e,t){const s=this.objs3D.get(e);s&&s?.emitEvent({type:"OBJ3D_POINTER_ENTER",event:t,objName:e})}onPointerLeave(e,t){const s=this.objs3D.get(e);s&&s?.emitEvent({type:"OBJ3D_POINTER_LEAVE",event:t,objName:e})}onPointerMove(e,t){this.objs3D.get(e)?.emitEvent({type:"OBJ3D_POINTER_MOVE",event:t,objName:e})}resetOcclState(e){const t=this.getOcclState(e);t.needsCheck=!1,t.visible=!1}resetOccluders(){this.objsOccluders=[]}setOccluders({objs3D:e}){if(!Array.isArray(e))return;const t=new Set;for(const s of e)s.obj&&t.add(s.obj);this.objsOccluders=[...t]}trackOccl(e){const t=this.getOcclState(e);return t.needsCheck=!0,null===this.callbackOccls&&(this.timeOcclNext=0,this.callbackOccls=()=>this.updateOccls(),this.engine.addOnFrameUpdate(this.callbackOccls)),t.visible}trackPickables({objs3D:e}){if(Array.isArray(e)){for(const t of e)t.obj&&this.objsPickables.add(t.obj);this.enable()}}untrackOccl(e){const t=this.objsOccls.findIndex(t=>t.obj===e);-1!==t&&(this.objsOccls.splice(t,1),this.indexOcclNext=0,this.timeOcclNext=0,0===this.objsOccls.length&&null!==this.callbackOccls&&(this.engine.removeOnFrameUpdate(this.callbackOccls),this.callbackOccls=null))}untrackPickables({objs3D:e}){if(Array.isArray(e)){for(const t of e)t.obj&&this.objsPickables.delete(t.obj);0===this.objsPickables.size&&this.disable()}}use(e){e(this)}updateOccls(){const e=this.objsOccls.length,t=this.cfg.raycast.occlInterval;if(0===t){for(const e of this.objsOccls)e.needsCheck&&(e.visible=this.checkOcclVisible(e.obj),e.needsCheck=!1);return}const s=performance.now(),i=t/e;let n=0;for((0===this.timeOcclNext||s-this.timeOcclNext>=t)&&(this.timeOcclNext=s);s>=this.timeOcclNext&&n<e;){const t=this.objsOccls[this.indexOcclNext];this.indexOcclNext=(this.indexOcclNext+1)%e,this.timeOcclNext+=i,n++,t.needsCheck&&(t.visible=this.checkOcclVisible(t.obj),t.needsCheck=!1)}}updatePointerHover(){if(0===this.objsPickables.size)return;if(!this.eventPointerMove)return;let e=null,t=1/0;for(let s=0;s<this.cfg.raycast.circleSteps;s++){const i=s/this.cfg.raycast.circleSteps*Math.PI*2,n=this.canvas.getBoundingClientRect(),o=Math.cos(i)*this.cfg.raycast.circleRadius/n.width*2,a=Math.sin(i)*this.cfg.raycast.circleRadius/n.height*2,r=new THREE.Vector2(this.posNdcPointer.x+o,this.posNdcPointer.y+a);this.raycasterPick.setFromCamera(r,this.cam3D.obj);const l=this.raycasterPick.intersectObjects([...this.objsPickables],!1);if(l.length>0){const s=l[0],i=s.point.clone().project(this.cam3D.obj),n=this.posNdcPointer.distanceTo(i);n<t&&(t=n,e=s.object)}}if(e!==this.objActive)e===this.objCandidate?this.closestObjCounter++:(this.objCandidate=e,this.closestObjCounter=1),this.closestObjCounter>=this.cfg.raycast.countClosestObjs&&(this.objActive?.name&&this.eventPointerMove&&this.onPointerLeave(this.objActive.name,this.eventPointerMove),this.objCandidate?.name&&this.eventPointerMove&&this.onPointerEnter(this.objCandidate.name,this.eventPointerMove),this.objActive=this.objCandidate,this.objCandidate=null,this.closestObjCounter=0);else{if(this.closestObjCounter=0,this.objCandidate=null,!this.eventPointerMove)return;const e=this.eventPointerMove;e.clientX===this.posPrevPointerX&&e.clientY===this.posPrevPointerY||!this.objActive?.name||this.onPointerMove(this.objActive.name,e),this.posPrevPointerX=e.clientX,this.posPrevPointerY=e.clientY}}updatePointerPosition(e){const t=this.canvas.getBoundingClientRect(),s=(e.clientX-t.left)/t.width,i=(e.clientY-t.top)/t.height;this.posNdcPointer.x=2*s-1,this.posNdcPointer.y=-(2*i-1)}},StateMachine=class{cfg;modules;actor=null;lastState="";snapshot=null;stateMachine=null;constructor(e,t){this.cfg=e,this.modules=t}sendEvent(e,t){if(!this.actor)return null;let s=!1;return(null!=this.snapshot?this.snapshot:this.actor.getSnapshot?.())?.can?.(e)&&(s=!0,"none"!=this.cfg.debug.log&&console.log(`${e.type}${t?`: ${t}`:""}`),this.actor.send(e)),s}start(e){if(this.stateMachine=e,this.stateMachine)if(this.actor)console.warn("Actor is already started.");else{if(this.cfg.stateMachine.inspector&&this.modules.createBrowserInspector){const{inspect:e}=this.modules.createBrowserInspector();this.actor=(0,xstate.createActor)(this.stateMachine,{inspect:e})}else this.actor=(0,xstate.createActor)(this.stateMachine);this.actor.subscribe(e=>{if(this.snapshot=e,"none"==this.cfg.debug.log)return;const t=e.value,s=JSON.stringify(t);if(s!==this.lastState)if(this.lastState=s,"object"==typeof t&&null!==t){const e=(t,s="")=>{if("string"==typeof t)return[s?`${s} > ${t}`:t];const i=[];for(const[n,o]of Object.entries(t)){const t=s?`${s} > ${n}`:n;i.push(...e(o,t))}return i};e(t).forEach(e=>{console.log(`STATE: ${e}`)})}else console.log(`STATE: ${t}`)}),this.actor.start()}else console.warn("State Machine not found.")}},cfg={audio:{enable:!1,guiOpened:!1,delayPlaySound:200,refDistance:1,rolloffFactor:1,maxDistance:1e3,distanceModel:"inverse",coneInnerAngle:360,coneOuterAngle:360,coneOuterGain:0},cam:{fov:75,near:.1,far:1e3,type:"perspective",lookAt:{x:0,y:0,z:0},position:{x:0,y:.5,z:.5}},comps:{overlap:{padding:20}},debug:{log:"xstate"},envCtrls:{backgroundBlurriness:0,backgroundIntensity:0,dataType:"halfFloat",enable:!1,environmentIntensity:1.8,load:!1,map:[],rotation:{x:0,y:0,z:0},rotationSpeed:0,type:"exr"},fpvCtrls:{enable:!1,load:!1,minPolarAngle:0,maxPolarAngle:Math.PI,pointerSpeed:.1,keyMoveForward:"KeyW",keyMoveLeft:"KeyA",keyMoveBackward:"KeyS",keyMoveRight:"KeyD",keyMoveUp:"KeyQ",keyMoveDown:"KeyE"},gui:{infoBox:{enable:!1,fps:!0,cpu:!0,frame:!0,calls:!0,triangles:!0,lines:!0,points:!0,geometries:!0,textures:!0,programs:!0,logsPerSecond:10},inspector:{enable:!1},menuBar:{enable:!0,backgroundColor:"#ffffff29",logo:""}},light:{castShadow:!0,rectArea:!1,mapWidth:512,mapHeight:512,bias:0,normalBias:0,near:.5,far:500},mesh:{castShadow:!0,receiveShadow:!0,frustumCulled:!1},model:{compress:{mesh:"none",texture:"none"},decoderPath:"draco/",file:null,progressBar:!0},orbitCtrls:{autoRotate:!1,autoRotateSpeed:2,dampingFactor:.1,enable:!1,enableDamping:!1,enablePan:!0,enableRotate:!0,enableZoom:!0,load:!1,maxDistance:1/0,maxPolarAngle:180,minDistance:0,minPolarAngle:0,panSpeed:1,rotateSpeed:1,zoomSpeed:1},post:{guiOpened:!1,aa:{guiOpened:!1,mode:"none"},ssao:{enable:!1,guiOpened:!1},ssr:{enable:!1,guiOpened:!1,maxDistance:180,thickness:.018,resolutionScale:1},webgl:{aa:{fxaa:{sharpness:.5}},ssao:{kernelRadius:8,minDistance:.005,maxDistance:.1},ssr:{bouncing:!1,distanceAttenuation:!0,fresnel:!0,infiniteThick:!1,opacity:.5,blur:!0,output:0,selective:!1,clear:!0,maxRoughness:.5}},webgpu:{ssao:{radius:.25,thickness:1,distanceExponent:1,distanceFallOff:1,scale:1,samples:16,resolutionScale:1},ssr:{intensity:.5,quality:.5,blurQuality:1}}},raycast:{occlInterval:0,occlMoveFactor:.01,circleRadius:10,circleSteps:12,countClosestObjs:5},render:{api:"auto",autoResize:!0,guiOpened:!1,fpsLimiter:!0,fpsMax:30,deltaTimesMax:10,outputColorSpace:THREE.SRGBColorSpace,pixelRatio:1,shadowMapEnabled:!0,shadowMapType:THREE.PCFShadowMap,toneMapping:THREE.ACESFilmicToneMapping,toneMappingExposure:1,params:{alpha:!1,antialias:!1},webgl:{params:{}},webgpu:{params:{}}},scene:{guiOpened:!1,canvas:"ilu-canvas",fog:{enable:!1,color:0,near:0,far:100},ambientlight:{enable:!1,color:16777215,intensity:1},hemisphere:{enable:!1,skyColor:16777147,groundColor:526368,intensity:1}},stateMachine:{inspector:!1}},CompCtrls=class{cam3D;engine;padding;posCamWorld=new THREE.Vector3;compsTracked=[];updateRequired=!1;callback=()=>{this.update()};requestUpdate=()=>{this.updateRequired=!0};constructor(e,t,s){this.cam3D=e,this.engine=t,this.padding=Math.max(0,s)}applyOverlaps(){this.cam3D.obj.getWorldPosition(this.posCamWorld);const e=[];for(const t of this.compsTracked){const s=t.comp.getObj3DFollow();if(!t.comp.isConnected||!t.comp.isVisibleFollow()||!s?.obj){t.comp.setVisibleOverlap(!0);continue}s.obj.getWorldPosition(t.posWorld);const i=t.comp.getBoundingClientRect();0!==i.width&&0!==i.height?e.push({comp:t.comp,distanceSquared:t.posWorld.distanceToSquared(this.posCamWorld),rect:i}):t.comp.setVisibleOverlap(!0)}e.sort((e,t)=>e.distanceSquared-t.distanceSquared);const t=[];for(const s of e){const e=!t.some(e=>this.rectsOverlap(s.rect,e));s.comp.setVisibleOverlap(e),e&&t.push(s.rect)}}rectsOverlap(e,t){return e.left<t.right+this.padding&&e.right+this.padding>t.left&&e.top<t.bottom+this.padding&&e.bottom+this.padding>t.top}subCompTracked(e){e.posScreen=null;const t=e.comp.getObj3DFollow();t&&e.unSubs.push(t.addEventListener("OBJ3D_POS_SCREEN_CHANGED",t=>{const s=Math.round(t.posScreen.x),i=Math.round(t.posScreen.y);if(null!==e.posScreen){if(e.posScreen.x===s&&e.posScreen.y===i)return;e.posScreen.set(s,i)}else e.posScreen=new THREE.Vector2(s,i);this.requestUpdate()}),t.addEventListener("OBJ3D_VISIBLE_CHANGED",()=>{this.requestUpdate()}))}refreshOverlap(e){const t=this.compsTracked.find(t=>t.comp===e);t&&(this.unsubCompTracked(t),this.subCompTracked(t),this.requestUpdate(),this.update())}trackOverlap(e){if(this.compsTracked.some(t=>t.comp===e))return;const t={comp:e,posWorld:new THREE.Vector3,posScreen:null,unSubs:[]};this.compsTracked.push(t),this.subCompTracked(t),1===this.compsTracked.length&&this.engine.addOnFrameUpdate(this.callback),this.requestUpdate(),this.update()}unsubCompTracked(e){for(const t of e.unSubs)t();e.unSubs=[]}untrackOverlap(e){const t=this.compsTracked.findIndex(t=>t.comp===e);if(-1===t)return;const s=this.compsTracked[t];if(this.unsubCompTracked(s),this.compsTracked.splice(t,1),e.setVisibleOverlap(!0),0===this.compsTracked.length)return this.engine.removeOnFrameUpdate(this.callback),void(this.updateRequired=!1);this.requestUpdate(),this.update()}update(){0!==this.compsTracked.length&&this.updateRequired&&(this.updateRequired=!1,this.applyOverlaps())}},inspector_default="/* nur Chrome / Edge / Safari */\r\n.illutions-pane {\r\n font-family: monospace;\r\n font-size: 12px;\r\n\r\n --tp-base-background-color: hsla(230, 20%, 11%, 1.00);\r\n --tp-base-shadow-color: hsla(0, 0%, 0%, 0.2);\r\n --tp-button-background-color: hsla(230, 10%, 80%, 1.00);\r\n --tp-button-background-color-active: hsla(230, 10%, 95%, 1.00);\r\n --tp-button-background-color-focus: hsla(230, 10%, 90%, 1.00);\r\n --tp-button-background-color-hover: hsla(230, 10%, 85%, 1.00);\r\n --tp-button-foreground-color: hsla(230, 20%, 11%, 1.00);\r\n --tp-container-background-color: hsla(230, 25%, 16%, 1.00);\r\n --tp-container-background-color-active: hsla(230, 25%, 31%, 1.00);\r\n --tp-container-background-color-focus: hsla(230, 25%, 26%, 1.00);\r\n --tp-container-background-color-hover: hsla(230, 25%, 21%, 1.00);\r\n --tp-container-foreground-color: hsla(230, 10%, 80%, 1.00);\r\n --tp-groove-foreground-color: hsla(230, 20%, 8%, 1.00);\r\n --tp-input-background-color: hsla(230, 20%, 8%, 1.00);\r\n --tp-input-background-color-active: hsla(230, 28%, 23%, 1.00);\r\n --tp-input-background-color-focus: hsla(230, 28%, 18%, 1.00);\r\n --tp-input-background-color-hover: hsla(230, 20%, 13%, 1.00);\r\n --tp-input-foreground-color: hsla(230, 10%, 80%, 1.00);\r\n --tp-label-foreground-color: hsla(230, 12%, 48%, 1.00);\r\n --tp-monitor-background-color: hsla(230, 20%, 8%, 1.00);\r\n --tp-monitor-foreground-color: hsla(230, 12%, 48%, 1.00);\r\n\r\n max-height: 95vh;\r\n overflow-y: auto;\r\n scrollbar-width: thin;\r\n scrollbar-color: #F40B5780 #1e1e1e;\r\n}\r\n\r\n/* WebKit Hover + Fallback for older Chrome / Edge / Safari */\r\n.illutions-pane::-webkit-scrollbar {\r\n width: 10px;\r\n}\r\n\r\n.illutions-pane::-webkit-scrollbar-track {\r\n background: #1e1e1e;\r\n}\r\n\r\n.illutions-pane::-webkit-scrollbar-thumb {\r\n background: #F40B5780;\r\n border-radius: 6px;\r\n}\r\n\r\n.illutions-pane::-webkit-scrollbar-thumb:hover {\r\n background: #F40B57;\r\n}\r\n",outputColorSpaceParam={SRGB:THREE.SRGBColorSpace,LinearSRGB:THREE.LinearSRGBColorSpace},shadowMapTypeParam={Basic:THREE.BasicShadowMap,PCF:THREE.PCFShadowMap,PCFSoft:THREE.PCFShadowMap,VSM:THREE.VSMShadowMap},toneMappingParam={None:THREE.NoToneMapping,Linear:THREE.LinearToneMapping,Reinhard:THREE.ReinhardToneMapping,Cineon:THREE.CineonToneMapping,ACESFilmic:THREE.ACESFilmicToneMapping,AgX:THREE.AgXToneMapping,Neutral:THREE.NeutralToneMapping,Custom:THREE.CustomToneMapping},Inspector=class{engine;envCtrls;pane=null;modules;orbitCtrls;fpvCtrls;audio;cfg;constructor(e,t,s,i,n,o,a){if(this.audio=t,this.engine=s,this.envCtrls=i,this.modules=n,this.orbitCtrls=o,this.fpvCtrls=a,this.cfg=e,!this.modules.paneClass)return void console.warn("Module tweakpane could not be imported.");if(this.pane=new this.modules.paneClass({title:"illutions"}),!this.pane)return;const r=this.pane.element;r.style.position="fixed",r.style.top="8px",r.style.right="8px",r.style.zIndex="1000",r.classList.add("illutions-pane");const l=document.createElement("style");if(l.textContent=inspector_default,document.head.appendChild(l),this.cfg.audio.enable){const y=this.audio.get(),w=this.pane.addFolder({title:"Audio",expanded:this.cfg.audio.guiOpened});w.addBinding(y,"delayPlaySound",{min:0,max:2e3,step:10}).on("change",e=>this.audio.set({delayPlaySound:e.value})),w.addBinding(y,"refDistance",{min:.1,max:20,step:.1}).on("change",e=>this.audio.set({refDistance:e.value})),w.addBinding(y,"rolloffFactor",{min:0,max:100,step:.1}).on("change",e=>this.audio.set({rolloffFactor:e.value})),w.addBinding(y,"maxDistance",{min:1,max:5e3,step:10}).on("change",e=>this.audio.set({maxDistance:e.value})),w.addBinding(y,"distanceModel",{options:{linear:"linear",inverse:"inverse",exponential:"exponential"}}).on("change",e=>this.audio.set({distanceModel:e.value})),w.addBinding(y,"coneInnerAngle",{min:0,max:360,step:1}).on("change",e=>this.audio.set({coneInnerAngle:e.value})),w.addBinding(y,"coneOuterAngle",{min:0,max:360,step:1}).on("change",e=>this.audio.set({coneOuterAngle:e.value})),w.addBinding(y,"coneOuterGain",{min:0,max:1,step:.01}).on("change",e=>this.audio.set({coneOuterGain:e.value}))}const c=this.pane.addFolder({title:"Navigation",expanded:!1});if(this.cfg.orbitCtrls.enable||this.cfg.orbitCtrls.load){const L=c.addFolder({title:"Orbit",expanded:!0});L.addBinding(this.cfg.orbitCtrls,"enableDamping").on("change",e=>this.orbitCtrls.set({enableDamping:e.value})),L.addBinding(this.cfg.orbitCtrls,"dampingFactor",{min:0,max:1,step:.01}).on("change",e=>this.orbitCtrls.set({dampingFactor:e.value})),L.addBinding(this.cfg.orbitCtrls,"minDistance",{min:0,max:500,step:.1}).on("change",e=>this.orbitCtrls.set({minDistance:e.value})),L.addBinding(this.cfg.orbitCtrls,"maxDistance",{min:0,max:2e3,step:.1}).on("change",e=>this.orbitCtrls.set({maxDistance:e.value})),L.addBinding(this.cfg.orbitCtrls,"minPolarAngle",{min:0,max:180,step:1,format:e=>`${e}°`,parse:e=>Number(e.replace("°",""))}).on("change",e=>this.orbitCtrls.set({minPolarAngle:e.value})),L.addBinding(this.cfg.orbitCtrls,"maxPolarAngle",{min:0,max:180,step:1,format:e=>`${e}°`,parse:e=>Number(e.replace("°",""))}).on("change",e=>this.orbitCtrls.set({maxPolarAngle:e.value})),L.addBinding(this.cfg.orbitCtrls,"enableZoom").on("change",e=>this.orbitCtrls.set({enableZoom:e.value})),L.addBinding(this.cfg.orbitCtrls,"zoomSpeed",{min:.1,max:5,step:.1}).on("change",e=>this.orbitCtrls.set({zoomSpeed:e.value})),L.addBinding(this.cfg.orbitCtrls,"enableRotate"),L.addBinding(this.cfg.orbitCtrls,"rotateSpeed",{min:.1,max:5,step:.1}).on("change",e=>this.orbitCtrls.set({rotateSpeed:e.value})),L.addBinding(this.cfg.orbitCtrls,"enablePan").on("change",e=>this.orbitCtrls.set({enablePan:e.value})),L.addBinding(this.cfg.orbitCtrls,"panSpeed",{min:.1,max:5,step:.1}).on("change",e=>this.orbitCtrls.set({panSpeed:e.value})),L.addBinding(this.cfg.orbitCtrls,"autoRotate").on("change",e=>this.orbitCtrls.set({autoRotate:e.value})),L.addBinding(this.cfg.orbitCtrls,"autoRotateSpeed",{min:.1,max:10,step:.1}).on("change",e=>this.orbitCtrls.set({autoRotateSpeed:e.value}))}if(this.cfg.fpvCtrls.enable){const E=c.addFolder({title:"FirstPerson",expanded:!0});E.addBinding(this.cfg.fpvCtrls,"minPolarAngle",{min:0,max:Math.PI,step:.01}).on("change",e=>this.fpvCtrls.set({minPolarAngle:e.value})),E.addBinding(this.cfg.fpvCtrls,"maxPolarAngle",{min:0,max:Math.PI,step:.01}).on("change",e=>this.fpvCtrls.set({maxPolarAngle:e.value})),E.addBinding(this.cfg.fpvCtrls,"pointerSpeed",{min:.01,max:1,step:.01}).on("change",e=>this.fpvCtrls.set({pointerSpeed:e.value}))}const d=this.pane.addFolder({title:"Renderer",expanded:this.cfg.render.guiOpened});d.addBinding(this.cfg.render,"fpsLimiter"),d.addBinding(this.cfg.render,"deltaTimesMax",{min:1,max:120,step:1}),d.addBinding(this.cfg.render,"pixelRatio",{min:.25,max:2,step:.05}).on("change",e=>{this.engine.renderer.setPixelRatio(e.value)});const h={outputColorSpace:Object.keys(outputColorSpaceParam).find(e=>outputColorSpaceParam[e]===this.cfg.render.outputColorSpace)},m=Object.keys(outputColorSpaceParam).reduce((e,t)=>(e[t]=t,e),{});d.addBinding(h,"outputColorSpace",{options:m}).on("change",e=>{const t=outputColorSpaceParam[e.value];this.cfg.render.outputColorSpace=t,this.engine.renderer.outputColorSpace=t});const p=d.addFolder({title:"ShadowMap",expanded:!1});p.addBinding(this.cfg.render,"shadowMapEnabled").on("change",e=>{this.engine.renderer.shadowMap.enabled=e.value});const u={shadowMapType:Object.keys(shadowMapTypeParam).find(e=>shadowMapTypeParam[e]===this.cfg.render.shadowMapType)},g=Object.keys(shadowMapTypeParam).reduce((e,t)=>(e[t]=t,e),{});p.addBinding(u,"shadowMapType",{options:g}).on("change",e=>{const t=shadowMapTypeParam[e.value];this.engine.renderer.shadowMap.type=t});const b=d.addFolder({title:"ToneMapping",expanded:!1}),v={toneMapping:Object.keys(toneMappingParam).find(e=>toneMappingParam[e]===this.cfg.render.toneMapping)},f=Object.keys(toneMappingParam).reduce((e,t)=>(e[t]=t,e),{});if(b.addBinding(v,"toneMapping",{options:f}).on("change",e=>{const t=e.value;this.engine.renderer.toneMapping=toneMappingParam[t]}),b.addBinding(this.cfg.render,"toneMappingExposure",{min:0,max:5}).on("change",e=>{this.engine.renderer.toneMappingExposure=e.value}),this.engine.isPostEnabled()){const T=d.addFolder({title:"Postprocessing",expanded:this.cfg.post.guiOpened}),M={ssaoEnable:this.cfg.post.ssao.enable,ssrEnable:this.cfg.post.ssr.enable,aaMode:this.cfg.post.aa.mode};function P(e,t,s){for(const i of e.children)i!==t&&(i.disabled=s)}const x=this.cfg.post.ssao;if(this.modules.webGpuRendererClass){const R=this.cfg.post.webgpu.ssao,G=T.addFolder({title:"SSAO",expanded:x.guiOpened}),B=G.addBinding(M,"ssaoEnable",{label:"Enable"}).on("change",async e=>{await this.engine.enableSsao(e.value),P(G,B,!e.value)});G.addBinding(R,"radius",{min:0,max:10,step:.01,label:"Radius"}).on("change",e=>{this.engine.gtaoNode&&(this.engine.gtaoNode.radius.value=e.value)}),G.addBinding(R,"thickness",{min:0,max:10,step:.01,label:"Thickness"}).on("change",e=>{this.engine.gtaoNode&&(this.engine.gtaoNode.thickness.value=e.value)}),G.addBinding(R,"distanceExponent",{min:0,max:10,step:.01,label:"DistanceExponent"}).on("change",e=>{this.engine.gtaoNode&&(this.engine.gtaoNode.distanceExponent.value=e.value)}),G.addBinding(R,"distanceFallOff",{min:0,max:10,step:.01,label:"DistanceFallOff"}).on("change",e=>{this.engine.gtaoNode&&(this.engine.gtaoNode.distanceFallOff.value=e.value)}),G.addBinding(R,"scale",{min:0,max:5,step:.01,label:"Scale"}).on("change",e=>{this.engine.gtaoNode&&(this.engine.gtaoNode.scale.value=e.value)}),G.addBinding(R,"samples",{min:1,max:64,step:1,label:"Samples"}).on("change",e=>{this.engine.gtaoNode&&(this.engine.gtaoNode.samples.value=Math.round(e.value))}),P(G,B,!x.enable)}else{const j=this.cfg.post.webgl.ssao,k=T.addFolder({title:"SSAO",expanded:x.guiOpened}),U=k.addBinding(x,"enable",{label:"Enable"}).on("change",e=>{this.engine.enableSsao(e.value),P(k,U,!e.value)});k.addBinding(j,"kernelRadius",{min:0,max:32,step:1,label:"KernelRadius"}).on("change",e=>{this.engine.ssaoPass&&(this.engine.ssaoPass.kernelRadius=e.value)}),k.addBinding(j,"minDistance",{min:0,max:.5,step:.001,label:"MinDistance"}).on("change",e=>{this.engine.ssaoPass&&(this.engine.ssaoPass.minDistance=e.value)}),k.addBinding(j,"maxDistance",{min:0,max:1,step:.01,label:"MaxDistance"}).on("change",e=>{this.engine.ssaoPass&&(this.engine.ssaoPass.maxDistance=e.value)}),P(k,U,!x.enable)}const S=this.cfg.post.ssr;if(this.modules.webGpuRendererClass){const N=this.cfg.post.webgpu.ssr,I=T.addFolder({title:"SSR",expanded:S.guiOpened}),J=I.addBinding(M,"ssrEnable",{label:"Enable"}).on("change",async e=>{await this.engine.enableSsr(e.value),P(I,J,!e.value)});I.addBinding(S,"maxDistance",{min:0,max:180,step:.01,label:"MaxDistance"}).on("change",e=>{this.engine.ssrNode&&(this.engine.ssrNode.maxDistance.value=e.value)}),I.addBinding(N,"intensity",{min:0,max:1,step:.01,label:"Intensity"}).on("change",e=>{this.engine.ssrNode&&(this.engine.ssrNode.intensity.value=e.value)}),I.addBinding(S,"thickness",{min:0,max:.1,step:.001,label:"Thickness"}).on("change",e=>{this.engine.ssrNode&&(this.engine.ssrNode.thickness.value=e.value)}),I.addBinding(S,"resolutionScale",{min:0,max:1,step:.01,label:"ResolutionScale"}).on("change",e=>{this.engine.ssrNode&&(this.engine.ssrNode.resolutionScale=e.value)}),I.addBinding(N,"quality",{min:0,max:1,step:.01,label:"Quality"}).on("change",e=>{this.engine.ssrNode&&(this.engine.ssrNode.quality.value=e.value)}),I.addBinding(N,"blurQuality",{min:1,max:3,step:1,label:"BlurQuality"}).on("change",e=>{this.engine.ssrNode&&(this.engine.ssrNode.blurQuality=Math.round(e.value))}),P(I,J,!S.enable)}else{const W=this.cfg.post.webgl.ssr,Y=T.addFolder({title:"SSR",expanded:S.guiOpened});let Z=null;const z=()=>{if(Z)return;if(!this.modules.ssrPassClass)return;const e={Default:this.modules.ssrPassClass.OUTPUT.Default,"SSR Only":this.modules.ssrPassClass.OUTPUT.SSR,Beauty:this.modules.ssrPassClass.OUTPUT.Beauty,Depth:this.modules.ssrPassClass.OUTPUT.Depth,Normal:this.modules.ssrPassClass.OUTPUT.Normal,Metalness:this.modules.ssrPassClass.OUTPUT.Metalness};Z=Y.addBinding(W,"output",{label:"Output",options:e}).on("change",e=>{this.engine.ssrPass&&(this.engine.ssrPass.output=e.value)})},F=Y.addBinding(S,"enable",{label:"Enable"}).on("change",async e=>{await this.engine.enableSsr(e.value),z(),P(Y,F,!e.value)});Y.addBinding(W,"fresnel",{label:"Fresnel"}).on("change",e=>{this.engine.ssrPass&&(this.engine.ssrPass.fresnel=e.value),this.engine.groundReflector&&(this.engine.groundReflector.fresnel=e.value)}),Y.addBinding(W,"distanceAttenuation",{label:"DistanceAttenuation"}).on("change",e=>{this.engine.ssrPass&&(this.engine.ssrPass.distanceAttenuation=e.value),this.engine.groundReflector&&(this.engine.groundReflector.distanceAttenuation=e.value)}),Y.addBinding(S,"maxDistance",{min:0,max:180,step:.01,label:"MaxDistance"}).on("change",e=>{this.engine.ssrPass&&(this.engine.ssrPass.maxDistance=e.value),this.engine.groundReflector&&(this.engine.groundReflector.maxDistance=e.value)}),Y.addBinding(W,"opacity",{min:0,max:1,step:.01,label:"Opacity"}).on("change",e=>{this.engine.ssrPass&&(this.engine.ssrPass.opacity=e.value),this.engine.groundReflector&&(this.engine.groundReflector.opacity=e.value)}),Y.addBinding(S,"thickness",{min:0,max:.1,step:.001,label:"Thickness"}).on("change",e=>{this.engine.ssrPass&&(this.engine.ssrPass.thickness=e.value)}),Y.addBinding(W,"infiniteThick",{label:"InfiniteThick"}).on("change",e=>{this.engine.ssrPass&&(this.engine.ssrPass.infiniteThick=e.value)}),Y.addBinding(W,"blur",{label:"Blur"}).on("change",e=>{this.engine.ssrPass&&(this.engine.ssrPass.blur=e.value)}),Y.addBinding(S,"resolutionScale",{min:0,max:1,step:.01,label:"ResolutionScale"}).on("change",e=>{this.engine.ssrPass&&(this.engine.ssrPass.resolutionScale=e.value)}),Y.addBinding(W,"bouncing",{label:"Bouncing"}).on("change",e=>{this.engine.ssrPass&&(this.engine.ssrPass.bouncing=e.value)}),Y.addBinding(W,"clear",{label:"Clear"}).on("change",e=>{this.engine.ssrPass&&(this.engine.ssrPass.clear=e.value)}),z(),P(Y,F,!S.enable)}const D=this.cfg.post.aa,A=T.addFolder({title:"AA",expanded:D.guiOpened});let O=null;A.addBinding(M,"aaMode",{label:"Mode",options:this.modules.webGpuRendererClass?{None:"none",FXAA:"fxaa",SMAA:"smaa",TRAA:"traa"}:{None:"none",FXAA:"fxaa",SMAA:"smaa"}}).on("change",async e=>{D.mode=e.value,await this.engine.enableAaMode(D.mode),O&&(O.hidden="fxaa"!==D.mode)}),this.modules.webGpuRendererClass||(O=A.addBinding(this.cfg.post.webgl.aa.fxaa,"sharpness",{min:.1,max:1,step:.05,label:"Sharpness"}).on("change",e=>{"fxaa"===D.mode&&this.engine.setFxaaResolution(e.value)}),O.hidden="fxaa"!==D.mode)}const C=this.pane.addFolder({title:"Scene",expanded:this.cfg.scene.guiOpened});if(this.cfg.scene.ambientlight.enable){const H=C.addFolder({title:"Ambient Light",expanded:!0});H.addBinding(this.cfg.scene.ambientlight,"enable",{label:"Enabled"}).on("change",e=>{e.value?this.engine.setAmbientLight({color:this.cfg.scene.ambientlight.color,intensity:this.cfg.scene.ambientlight.intensity}):this.engine.removeAmbientLight()}),H.addBinding(this.cfg.scene.ambientlight,"color",{label:"Color",view:"color"}).on("change",e=>{this.engine.setAmbientLight({color:e.value})}),H.addBinding(this.cfg.scene.ambientlight,"intensity",{min:0,max:5,label:"Intensity"}).on("change",e=>{this.engine.setAmbientLight({intensity:e.value})})}if(this.cfg.scene.hemisphere.enable){const q=C.addFolder({title:"Hemisphere Light",expanded:!0});q.addBinding(this.cfg.scene.hemisphere,"enable",{label:"Enabled"}).on("change",e=>{e.value?this.engine.setHemisphereLight({skyColor:this.cfg.scene.hemisphere.skyColor,groundColor:this.cfg.scene.hemisphere.groundColor,intensity:this.cfg.scene.hemisphere.intensity}):this.engine.removeHemisphereLight()}),q.addBinding(this.cfg.scene.hemisphere,"skyColor",{label:"Sky Color",view:"color"}).on("change",e=>{this.engine.setHemisphereLight({skyColor:e.value})}),q.addBinding(this.cfg.scene.hemisphere,"groundColor",{label:"Ground Color",view:"color"}).on("change",e=>{this.engine.setHemisphereLight({groundColor:e.value})}),q.addBinding(this.cfg.scene.hemisphere,"intensity",{min:0,max:5,label:"Intensity"}).on("change",e=>{this.engine.setHemisphereLight({intensity:e.value})})}if(this.cfg.scene.fog.enable){const V=C.addFolder({title:"Fog",expanded:!0});V.addBinding(this.cfg.scene.fog,"enable",{label:"Enabled"}).on("change",e=>{e.value?this.engine.setFog({color:this.cfg.scene.fog.color,near:this.cfg.scene.fog.near,far:this.cfg.scene.fog.far}):this.engine.removeFog()}),V.addBinding(this.cfg.scene.fog,"color",{label:"Color",view:"color"}).on("change",e=>{this.engine.setFog({color:e.value})}),V.addBinding(this.cfg.scene.fog,"near",{min:0,max:50,label:"Near"}).on("change",e=>{this.engine.setFog({near:e.value})}),V.addBinding(this.cfg.scene.fog,"far",{min:0,max:100,label:"Far"}).on("change",e=>{this.engine.setFog({far:e.value})})}if(this.cfg.envCtrls.enable||this.cfg.envCtrls.load){const X=C.addBinding(this.cfg.envCtrls,"enable",{label:"Enabled"}),_=C.addFolder({title:"Background",expanded:!1}),K=C.addFolder({title:"Environment",expanded:!1});X.on("change",e=>{e.value?this.envCtrls.enable():this.envCtrls.disable(),_.disabled=!e.value,K.disabled=!e.value}),_.disabled=!this.cfg.envCtrls.enable,K.disabled=!this.cfg.envCtrls.enable,_.addBinding(this.cfg.envCtrls,"backgroundBlurriness",{min:0,max:1,label:"Blurriness"}).on("change",e=>{this.envCtrls.set({backgroundBlurriness:e.value})}),_.addBinding(this.cfg.envCtrls,"backgroundIntensity",{min:0,max:5,label:"Intensity"}).on("change",e=>{this.envCtrls.set({backgroundIntensity:e.value})}),K.addBinding(this.cfg.envCtrls,"environmentIntensity",{min:0,max:10,label:"Intensity"}).on("change",e=>{this.envCtrls.set({environmentIntensity:e.value})});const $=this.envCtrls.get().rotation;if($){const Q={x:$.x,y:$.y,z:$.z};K.addBinding(Q,"x",{min:0,max:360,label:"Rotate X"}).on("change",()=>{this.envCtrls.set({rotation:Q})}),K.addBinding(Q,"y",{min:0,max:360,label:"Rotate Y"}).on("change",()=>{this.envCtrls.set({rotation:Q})}),K.addBinding(Q,"z",{min:0,max:360,label:"Rotate Z"}).on("change",()=>{this.envCtrls.set({rotation:Q})})}}}},Modules=class{gpuTier=null;fxaaNode=null;fxaaShader=null;smaaPassClass=null;smaaNode=null;traaNode=null;ssaoPassClass=null;gtaoNodeClass=null;ssrNode=null;ssrPassClass=null;paneClass=null;createBrowserInspector=null;effectComposerClass=null;envLoader=null;dracoLoader=null;gltfLoader=null;ktx2Loader=null;meshoptDecoder=null;outputPassClass=null;renderPassClass=null;shaderPassClass=null;rectAreaLightNodeClass=null;rectAreaLightTexturesLib=null;rectAreaLightUniformsLib=null;orbitControlsClass=null;pointerLockControlsClass=null;webGpuRendererClass=null;renderPipelineClass=null;tslPass=null;tslMrt=null;tslOutput=null;tslVelocity=null;tslRenderOutput=null;tslNormalView=null;tslMetalness=null;tslRoughness=null;tslSample=null;tslVec2=null;tslVec3=null;tslVec4=null;tslFloat=null;packNormalToRGB=null;unpackRGBToNormal=null;cfg;constructor(e){this.cfg=e}consoleLog(e){"none"!==this.cfg.debug.log&&console.log(`Module ${e} successfully imported.`)}async importDracoLoader(){if(!this.dracoLoader&&"draco"===this.cfg.model.compress.mesh)try{const e=await import("three/addons/loaders/DRACOLoader.js");this.consoleLog("DRACOLoader"),this.dracoLoader=new e.DRACOLoader,this.dracoLoader.setDecoderPath("draco/")}catch{console.warn("DRACOLoader could not be imported")}}async importEffectComposer(){if(!this.effectComposerClass)try{const e=await import("three/addons/postprocessing/EffectComposer.js");this.effectComposerClass=e.EffectComposer,this.consoleLog("EffectComposer")}catch{console.warn("EffectComposer could not be imported")}}async importENVLoader(){if(!this.envLoader&&(this.cfg.envCtrls.enable||this.cfg.envCtrls.load))if("exr"===this.cfg.envCtrls.type)try{const e=await import("three/addons/loaders/EXRLoader.js");this.consoleLog("EXRLoader");const t=new e.EXRLoader;this.envLoader=t}catch{console.warn("EXRLoader could not be imported")}else if("hdr"===this.cfg.envCtrls.type)try{const e=await import("three/addons/loaders/HDRLoader.js");this.consoleLog("HDRLoader");const t=new e.HDRLoader;this.envLoader=t}catch{console.warn("HDRLoader could not be imported")}}async importFpvCtrls(){if(this.cfg.fpvCtrls.enable||this.cfg.fpvCtrls.load)try{const e=await import("three/addons/controls/PointerLockControls.js");this.pointerLockControlsClass=e.PointerLockControls,this.consoleLog("PointerLockControls")}catch{console.warn("PointerLockControls could not be imported")}}async importFXAANode(e){if(!this.fxaaNode&&"fxaa"===e)try{const e=await import("three/addons/tsl/display/FXAANode.js");this.fxaaNode=e.fxaa,this.consoleLog("FXAANode")}catch{console.warn("FXAANode could not be imported")}}async importFXAAShader(e){if(!this.fxaaShader&&"fxaa"===e){try{const e=await import("three/addons/shaders/FXAAShader.js");this.fxaaShader=e.FXAAShader,this.consoleLog("FXAAShader")}catch{console.warn("FXAAShader could not be imported")}if(!this.shaderPassClass)try{const e=await import("three/addons/postprocessing/ShaderPass.js");this.shaderPassClass=e.ShaderPass,this.consoleLog("ShaderPass")}catch{console.warn("ShaderPass could not be imported")}}}async importGLTFLoader(){if(this.cfg.model.file)try{const e=await import("three/addons/loaders/GLTFLoader.js");this.consoleLog("GLTFLoader"),this.gltfLoader=new e.GLTFLoader}catch{console.warn("GLTFLoader could not be imported")}}async importGpuDetect(){try{const e=await import("detect-gpu");this.consoleLog("detect-gpu");const t=e.getGPUTier;this.gpuTier=await t()}catch{console.warn("detect-gpu could not be imported")}}async importGtaoNode(e){if(!this.gtaoNodeClass&&e)try{const e=await import("three/addons/tsl/display/GTAONode.js");this.gtaoNodeClass=e.ao,this.consoleLog("SSAONode")}catch{console.warn("SSAONode could not be imported")}}async importKTX2Loader(){if(!this.ktx2Loader&&"ktx2"===this.cfg.model.compress.texture)try{const e=await import("three/addons/loaders/KTX2Loader.js");this.ktx2Loader=new e.KTX2Loader,this.consoleLog("KTX2Loader")}catch{console.warn("KTX2Loader could not be imported")}}async importMeshoptDecoder(){if(!this.meshoptDecoder&&"meshopt"===this.cfg.model.compress.mesh)try{const e=await import("three/addons/libs/meshopt_decoder.module.js");this.meshoptDecoder=e.MeshoptDecoder,this.consoleLog("MeshoptDecoder")}catch{console.warn("MeshoptDecoder could not be imported")}}async importOrbitCtrls(){if(this.cfg.orbitCtrls.enable||this.cfg.orbitCtrls.load)try{const e=await import("three/addons/controls/OrbitControls.js");this.orbitControlsClass=e.OrbitControls,this.consoleLog("OrbitControls")}catch{console.warn("OrbitControls could not be imported")}}async importOutputPass(){if(!this.outputPassClass)try{const e=await import("three/addons/postprocessing/OutputPass.js");this.outputPassClass=e.OutputPass,this.consoleLog("OutputPass")}catch{console.warn("OutputPass could not be imported")}}async importRectAreaLight(e){if(this.cfg.light.rectArea)if(e){if(this.rectAreaLightTexturesLib)return;try{const e=await import("three/addons/lights/RectAreaLightTexturesLib.js");this.rectAreaLightTexturesLib=e.RectAreaLightTexturesLib,this.consoleLog("RectAreaLightTexturesLib")}catch{console.warn("RectAreaLightTexturesLib could not be imported")}}else{if(this.rectAreaLightUniformsLib)return;try{const e=await import("three/addons/lights/RectAreaLightUniformsLib.js");this.rectAreaLightUniformsLib=e.RectAreaLightUniformsLib,this.consoleLog("RectAreaLightUniformsLib")}catch{console.warn("RectAreaLightUniformsLib could not be imported")}}}async importRenderPass(){if(!this.renderPassClass)try{const e=await import("three/addons/postprocessing/RenderPass.js");this.renderPassClass=e.RenderPass,this.consoleLog("RenderPass")}catch{console.warn("RenderPass could not be imported")}}async importSMAANode(e){if(!this.smaaNode&&"smaa"===e)try{const e=await import("three/addons/tsl/display/SMAANode.js");this.smaaNode=e.smaa,this.consoleLog("SMAANode")}catch{console.warn("SMAANode could not be imported")}}async importSMAAPass(e){if(!this.smaaPassClass&&"smaa"===e)try{const e=await import("three/addons/postprocessing/SMAAPass.js");this.smaaPassClass=e.SMAAPass,this.consoleLog("SMAAPass")}catch{console.warn("SMAAPass could not be imported")}}async importSSAOPass(e){if(!this.ssaoPassClass&&e)try{const e=await import("three/addons/postprocessing/SSAOPass.js");this.ssaoPassClass=e.SSAOPass,this.consoleLog("SSAOPass")}catch{console.warn("SSAOPass could not be imported")}}async importSsrNode(e){if(!this.ssrNode&&e)try{const e=await import("three/addons/tsl/display/SSRNode.js");this.ssrNode=e.ssr,this.consoleLog("SSRNode")}catch{console.warn("SSRNode could not be imported")}}async importSsrPass(e){if(!this.ssrPassClass&&e)try{const e=await import("three/addons/postprocessing/SSRPass.js");this.ssrPassClass=e.SSRPass,this.consoleLog("SSRPass")}catch{console.warn("SSRPass could not be imported")}}async importStatelyAi(){if(!this.createBrowserInspector&&this.cfg.stateMachine.inspector)try{const e=await import("@statelyai/inspect");this.createBrowserInspector=e.createBrowserInspector,this.consoleLog("StatelyAi Inspector")}catch{console.warn("StatelyAi Inspector could not be imported")}}async importThreeTsl(){try{const e=await import("three/tsl");this.tslPass=e.pass,this.tslMrt=e.mrt,this.tslOutput=e.output,this.tslVelocity=e.velocity,this.tslRenderOutput=e.renderOutput,this.tslNormalView=e.normalView,this.tslMetalness=e.metalness,this.tslRoughness=e.roughness,this.tslSample=e.sample,this.tslVec2=e.vec2,this.tslVec3=e.vec3,this.tslVec4=e.vec4,this.tslFloat=e.float,this.packNormalToRGB=e.packNormalToRGB,this.unpackRGBToNormal=e.unpackRGBToNormal,this.consoleLog("Three TSL")}catch{console.warn("Three TSL could not be imported")}}async importThreeWebGpu(){try{const e=await import("three/webgpu");this.webGpuRendererClass=e.WebGPURenderer,this.renderPipelineClass=e.RenderPipeline,this.rectAreaLightNodeClass=e.RectAreaLightNode,this.consoleLog("WebGPU")}catch{console.warn("Three WebGPU could not be imported")}}async importTRAANode(e){if(!this.traaNode&&"traa"===e)try{const e=await import("three/addons/tsl/display/TRAANode.js");this.traaNode=e.traa,this.consoleLog("TRAANode")}catch{console.warn("TRAANode could not be imported")}}async importTweakpane(){if(this.cfg.gui.inspector.enable)try{const e=await import("tweakpane");this.paneClass=e.Pane,this.consoleLog("Tweakpane")}catch{console.warn("Tweakpane could not be imported")}}};function _0x5b8c(){const e=["te9xpgjYpLbVD2vY","C2HHzg93uM9VDa","CxvLCNLtzwXLy3rVCG","i3bVD2vY","y2fUDMfZ","yxjPys1WCMvZC2vK","Dg9Nz2XLu2nYzwvUu2L6zq","Aw5Uzxjive1m","i2XVz28","y3jLyxrLrwXLBwvUDa","zNbZtgLTAxrLCG","yxr0ywnOu2HHzg93","yxbWzw5K","mtzyCwPUCgi","C3r5Bgu","i21LBNvIDxr0B25Z","z2v0qxr0CMLIDxrL","seLhsdXICJ5qB3DLCG","yxbWzw5Kq2HPBgq","CMvUzgvY","Dgv4DenVBNrLBNq","ywrKrxzLBNrmAxn0zw5LCG","i2XPy2vUC2u","ntmYmtG4tfD2s25n","Dw5KzwzPBMvK","zw5HyMXL","C2v0qMfJA2DYB3vUzenVBg9Y","i3nPEMu","i3bVD2vYlxrLEhq","twf4Aw1PEMu","i21LBNvIyxiGEW0kicb6lwLUzgv4oIaXmdaWoW0kicbWB3nPDgLVBJOGzML4zwq7ic8Qie9YAwvUDgf0zxmGDg8GDMLZDwfSihzPzxDWB3j0ig9UigfUzhjVAwqGzgv2AwnLCYWGywjZB2X1DguGBM90icOVdqOGigjVDhrVBtOGmJbWEdSGBgvMDdOGntaLoW0kicb0CMfUC2zVCM06ihrYyw5ZBgf0zvGOltuWjsK7ia0kicbKAxnWBgf5oIbMBgv4oW0kicbMBgv4lwrPCMvJDgLVBJOGy29SDw1UoYaGicaGia0kicbHBgLNBI1PDgvTCZOGy2vUDgvYoW0kicbMB250lxnPEMu6ideYChG7dqOGigzVBNqTzMfTAwX5oIbbCMLHBcWGsgvSDMv0AwnHlcbZyw5ZlxnLCMLMoYaGicaGdqOGigDHCdOGnxb4oW0kFq0kdqOJBwvUDwj1DhrVBNmGEW0kicbKAxnWBgf5oIbMBgv4oW0kicbHBgLNBI1PDgvTCZOGy2vUDgvYoW0kicbNyxa6idqWChG7dqOGihbHzgrPBMC6idvWEcaYmhb4oW0kicbMB250lwzHBwLSEtOGqxjPywWSieHLBhzLDgLJysWGC2fUCY1ZzxjPzJSncIaGzM9UDc1ZAxPLoIaXCMvToW0kicbJB2XVCJOGi2zMzJSncIaGyMfJA2DYB3vUzdOGi2zMzMzMzJi5oW0kicbIB3jKzxi6idfWEcbZB2XPzcaJzMzMzMzMmgq7dqOGigjVCMrLCI1YywrPDxm6idjLBtSncIaGyM94lxnOywrVDZOGAw5ZzxqGmcaXChGGm3b4icnMzMzMzMy0mcWGAw5ZzxqGmcaTmtbWEcaXohb4icmWmdaWmdaYmdSncIaGyMfJA2rYB3aTzMLSDgvYoIbIBhvYkdeYChGPoW0kicaTD2vIA2L0lwjHy2TKCM9WlwzPBhrLCJOGyMX1CIGXmNb4ktSncIaGy3vYC29YoIbWB2LUDgvYoW0kicbWB2LUDgvYlwv2zw50CZOGyxv0BZSncN0ncG0ki2XVz28GEW0kicbVCgfJAxr5oIaWlJG7dqOGigrPC3bSyxK6igLUBgLUzs1IBg9JAZSncIaGD2LKDgG6ideUogvToYbOzwLNAhq6ideUogvToW0kicbIywnRz3jVDw5KlxnPEMu6ignVBNrHAw47dqOGigjHy2TNCM91BMqTCMvWzwf0oIbUBY1YzxbLyxq7dqOGigjHy2TNCM91BMqTCg9ZAxrPB246ignLBNrLCJSncIaGlYOGrw5JB2rLzcb2AweGAhr0Chm6lY95B2TZzwWUz2L0AhvIlMLVl3vYBc1LBMnVzgvYlYaQlW0kicbIywnRz3jVDw5KlwLTywDLoIb1CMWOiMrHDge6Aw1Hz2uVC3zNk3HTBcWLm0nZDMCGDMvYC2LVBJ0Nms4YjYb4BwXUCZ0NAhr0CdOVl3D3DY53mY5VCMCVmJaWmc9ZDMCNihzPzxDcB3G9jZaGmcaYndqGmJG1jYb3Awr0Ad0NmJq0jYbOzwLNAhq9jZi4nsCLm0uLm0nZDhLSzsuZrsaUCZaGjtDcigzPBgW6icuYm2y0mgi1nYaLn0qGjtndl3n0EwXLjtnfjtndCgf0AcbPzd0Nu2HHCguGmsCGzMLSBc1YDwXLpsDLDMvUB2rKjYbJBgfZCZ0NCZaNigq9j201mIaWDJi4nwWTnteTnJiUmJD2lte2mc40nNONlYuZrsuZq3bHDgGGAwq9j1nOyxbLideGy29WEsCGzMLSBc1YDwXLpsDLDMvUB2rKjYbJBgfZCZ0NCZaNigq9j20XndGGmhyYodvSltuXltyYlJi3DI0XnJaUndz6jY8Lm0uLm0nWyxrOigLKpsDtAgfWzsaXignVChKGmICGzMLSBc1YDwXLpsDLDMvUB2rKjYbJBgfZCZ0NCZaNigq9j20YndqGmhyYodvSltuXltyYlJi3DI0XnJaUndz6jY8Lm0uLm0mVC3zNjtnfiIK7dqP9dqOncInWB3DLCIb7dqOGigrPC3bSyxK6igzSzxG7dqOGigfSAwDUlwL0zw1ZoIbJzw50zxi7dqOGihbVC2L0Aw9UoIbYzwXHDgL2ztSncIaGCgfKzgLUzZOGmdSncIaGD2LKDgG6idKWChG7igHLAwDODdOGmZzWEdSncIaGyMfJA2DYB3vUzc1JB2XVCJOGiZaWmdaWmdq0oW0kicbIB3jKzxiTCMfKAxvZoIaYmhb4oW0kicbIB3jKzxi6ig5VBMu7dqOGign1CNnVCJOGCg9PBNrLCJSncIaGDhjHBNnPDgLVBJOGyMfJA2DYB3vUzc1JB2XVCIaWlJnZigvHC2u7dqP9dqOncInWB3DLCI1RBM9IihSncIaGEI1PBMrLEdOGmJSncIaGB3bHy2L0EtOGmc45oW0kicbWB3nPDgLVBJOGywjZB2X1Dgu7dqOGigXLzNq6idzWEdSGlYOGu3rHCNrWB3nPDgLVBIbSzwz0icOVdqOGihDPzhrOoIaYnxb4oYbOzwLNAhq6idi1ChG7dqOGigjHy2TNCM91BMqTy29SB3i6ihDOAxrLoW0kicbIB3jKzxiTCMfKAxvZoIa1mcu7dqOGihrYyw5ZAxrPB246ihrYyw5ZzM9YBsaWlJnZigvHC2uTAw4TB3v0oW0kFq0kdqOJCg93zxiTDgv4Dcb7dqOGihOTAw5KzxG6ide7ic8QiejLAgLUzcbRBM9IicOVdqOGig9WywnPDhK6idaUodSncIaGzgLZCgXHEtOGzMXLEdSncIaGCgfKzgLUzZOGmcaXnhb4oW0kicb3Awr0AdOGmtaWjtSncIaGANvZDgLMEs1JB250zw50oIbMBgv4lwvUzdSGlYOGvgv4DcbYAwDODcaQlW0kicbMB250lxDLAwDODdOGyM9SzdSncIaGzM9UDc1ZAxPLoIaWlJLLBtSncIaGDhjHBNnPDgLVBJOGy29SB3iGm3m7dqOGignVBg9YoIb3AgL0ztSncN0ncG0klYOGu3rHDguGAgLNAcbIywnRz3jVDw5KicOVdqOJCg93zxjByxjPys1WCMvZC2vKpsj0CNvLiL0GEW0kicbIywnRz3jVDw5KlwnVBg9YoIaJzJqWyJu3otK7dqP9dqOncI8Qifn0yxrLigHPz2GGDgv4DcOVdqOJCg93zxjByxjPys1WCMvZC2vKpsj0CNvLiL0Gi3bVD2vYlxrLEhqGEW0kicbQDxn0Awz5lwnVBNrLBNq6igzSzxGTC3rHCNq7dqP9dqOncI8Qifn0yxrLigHPz2GGA25VyIaQlW0ki3bVD2vYw2fYAweTChjLC3nLzd0IDhj1zsjDicnWB3DLCI1RBM9IihSncIaGDhjHBNnMB3jToIb0CMfUC2XHDgvykduYChGPoYancN0ncG0klYOGu3rHDguGBg93icOVdqOJCg93zxjByxjPys1WCMvZC2vKpsjMywXZzsjDicnWB3DLCI10zxH0ihSncIaGANvZDgLMEs1JB250zw50oIbMBgv4lwvUzdSncIaGDgv4Dc1HBgLNBJOGBgvMDdSncN0ncG0ki3bVD2vYlMLUDgvYywn0zwrByxjPys1WCMvZC2vKpsj0CNvLiL0Gi3bVD2vYlxrLEhqGEW0kicbQDxn0Awz5lwnVBNrLBNq6igzSzxGTC3rHCNq7dqOGigfUAw1HDgLVBJOGzMfKzs10BY1OAwDOidaUnhmGzwfZzs1PBI1VDxq7dqP9dqOncInWB3DLCI5PBNrLCMfJDgvKw2fYAweTChjLC3nLzd0IzMfSC2uIxsaJCg93zxiTDgv4Dcb7dqOGigP1C3rPzNKTy29UDgvUDdOGzMXLEc1LBMq7dqOGigfUAw1HDgLVBJOGzMfKzs10BY1SB3CGmc40CYbLyxnLlwLUlw91DdSncN0ncG0kqgTLEwzYyw1LCYbMywrLlxrVlwHPz2GGEW0kicaWjsb7ig9WywnPDhK6idaUodSGFq0kicaYmcuGEYbVCgfJAxr5oIaWoYb9dqOGideWmcuGEYbVCgfJAxr5oIaWlJG7ih0ncN0ncG0kqgTLEwzYyw1LCYbMywrLlxrVlwXVDYb7dqOGidaLihSGB3bHy2L0EtOGmc44oYb9dqOGidiWjsb7ig9WywnPDhK6ida7ih0ncIaGmtaWjsb7ig9WywnPDhK6idaUodSGFq0kFq0kdqOJC2L6zsb7dqOGig9WywnPDhK6idaUodSncIaGD2LKDgG6idjLBtSGAgvPz2H0oIaYzw07dqOGigjHy2TNCM91BMq6ig5VBMu7dqOGigjVCMrLCJOGBM9UztSncIaGy3vYC29YoIbWB2LUDgvYoW0kicbIywnRz3jVDw5KlxnPEMu6ignVBNrHAw47dqOGigjHy2TNCM91BMqTCMvWzwf0oIbUBY1YzxbLyxq7dqOGigjHy2TNCM91BMqTCg9ZAxrPB246ignLBNrLCJSncIaGlYOGrw5JB2rLzcb2AweGAhr0Chm6lY95B2TZzwWUz2L0AhvIlMLVl3vYBc1LBMnVzgvYlYaQlW0kicbIywnRz3jVDw5KlwLTywDLoIb1CMWOiMrHDge6Aw1Hz2uVC3zNk3HTBcWLm0nZDMCGDMvYC2LVBJ0Nms4YjYb4BwXUCZ0NAhr0CdOVl3D3DY53mY5VCMCVmJaWmc9ZDMCNihzPzxDcB3G9jZaGmcaZmdGGmZeYjYb3Awr0Ad0NmZa4jYbOzwLNAhq9jZmXmICLm0uLm0nZDhLSzsuZrsaUCZaGjtDcigzPBgW6icuYm2zMzMzMzIaLn0qGjtndl3n0EwXLjtnfjtndCgf0AcbPzd0Nq29SB3iGrMLSBcaXjYbMAwXSlxj1Bgu9j2v2zw5VzgqNignSyxnZpsDZmcCGzd0NBteZlJy3idCUmdvSnZmUmtCTmc4XmYa0lJyGnc42m2mYlJuZidiUntuGnc42idyUmtiGnc42idCUotuGmcaXlJGYlteUntiGns4ZnY0ZlJm2idCUodGTmY4Zmsa0lJq5ltmUnJKGnc41nY00mI44mIa1lJm5Bdm2lJK5idm3lJm0yZi5lJK2idmWlJi0idm3lJaXidm4lJiXidm3lJa2idqXlJKGmc4WncaYlJuXlteUnJeGnI40ns0ZlJy1idGUnZuTmI42nYaZlJaXltuUmZqGnc4XnY05lJq5idqUmtmTns4Yos0WlJa3ltGUodmTmY4Xnc03os4Yns03mY44nMWWlJaYide3lJG0yZaUmdeGos44ms0WlJCZide5lJmZlteUnJmGmJeUmtuTmc45msaXlJGZltmUodGGnc40nc02lJyXiduUodeTmI43mIaXlJm3ltuUmZiGmI40os01lJC3idiUndKTmc40nIaWltmUndmTmI4Ync0XmI4Zoc05lJK2Bc0WlJm4ltCXlJf6BtiWnY45ncaWBdCZlJe3ltaUmtiGos4YidKUmJuTmc4Wmsa3ms4ZnI00lJe4idqUntzJltiUndiGmI42nc01lJKYidqUntyToc4Zmsa0lJu2ltiUmJCGmc01lJK4lteUmtiToc4Yns0YlJq5ltqUmdiTmI40mI00lJeZltiUotGTnc4XmY0Yms41nYaWlteYlJG4ltaUntKTmtKUmdGTms44mY0Xos4Woc0XlJaXidaTmtCUosaXnI4Wnc0ZnY41ncaZns42ns0Zmc4ZncaZmc4Yos0ZnI40nIaZns42nI00mc42nYaZns43ms0ZlJi0idaUmdqTnI41nY0XlJuYltKUnJqTnc41mY0ZlJG1ltmUnZGTnc40os01lJq5ltmUntKTos41ocaWlJC4ltmUntuGmteUmJyTmtuUmJqGmZyUndqTndaUnJyGmtKUndqTmtKUnJiGmZuUmZyTmZyUmJqGmZuUmZyTmZyUotiGmc4Wms0WlJy5ltCUnZGTms4Yns0XnY4Zms0XlJi1ltKUntmGmc0Xoc41ns0WlJu2ltiWlJa0lteUmJqTms40os0WlJy5ltmUnZeTmY4ZltqUotuTns44ms0XlJiZltiUnteTmI4ZmY01lJi1ltiUndmTnI4Wos0WlJeTmc44nsaXlJGXltmUodmGnc4YnI02lJy0EM0TmteXlJe3ide4mc44ogmZlJy0idaGnI41nYaXlJqXidKUndyGnc41nYaYlJmGmI41msa0lJeZidyUndmGnc4Woca4lJCXltaUmdGGmY4XmY05lJmXideZlJqYltC1lJeGnZKUnZfSndaUndmTmc4WnIaZlJmGnc45ogmYlJaZidmUmdCGmI45osa2lJu4idiUndGGos4XmY0WlJq1idiUmJGTmI41iduUnJyTnc41nca3lJuTmY40osaZlJe1ltuUotiGmY4Zns03nI4ZmYaZlJm2Bc05lJaYltKUmI0WlJaZltm0lJq0yY0WlJaXltiYlJK5idaUnJeTmZuUnJCGms45ltm4lJe2ideUmduTmI4WnIaZlJa5ltqUnJuGnc41mY01lJC2ideUndqTms4Xmsa0lJy2ltiUmduGnY4XnI0YlJa3idiUnJKTmc4Wnca2lJiYideUnJmGoc42nIa0lJa5idmUodCGmY44osa0lJe1iduUmZqGnc43oca0ms4ZowWZnI40oc0ZnI44n2mZmI4Zoc0ZmI43ncaZnY4WnY0ZnI44oca0ms43nI0ZnI44ohPTodGUndmGmc4Wm2m0lJq4idaUmdmGos43mIa0lJyYidqWlJyYidm1lJy2ide5lJuYide5lJyGmZyUndiGmZuUnJqGmZCUntuGmZuUnJuGms41msaWlJaYidiUmtCTns4XnIaYlJG5ltm4lJu5BduUnZCTmY4WmMm0lJq1ltiUmZmGnI41nc0YlJyYidKUmdGTms4YnsaXlJGYidaUotGGnc41ocaZlJm3idyUmtuGns4ZmIaYlJuGmY4XidiUodCGnY45ocaZlJa1idC0lJLSltGUodiGos4XmY0ZnI41ltaUmdzJlti2lJa4ltaUmdqTmZCUmJqTmc42mY0Zos4Xms0YlJa3lteUndqTms4Xms0ZlJq5ltmUnY00lJu0ltuUnZyTms4WnI0YlJa1lteUotuTnc42nI0XlJK4ltuUodeTmc4WmY0XlJe0ideUodmTnc4XmIa0lJeZltyUnJmGnc4Xms00lJq4idqUntmTnc41nYa0mI45nI00lJu2Bc0Zns43mI0ZnI4XyY0Xos42nc0Xos44ns0ZnI41nc0ZnY43nY0ZnY41nc0Zos44mY0XlJaXltiUmduTms45mY00lJC1ltiUmduTnI0WlJeZlteUmJqGms44mY00lJiZidqUmZuTnI42mYaYlJK2ltiUodmGnI4Zos00lJm3idKUnZeTnc4ZnxONlYuZrsuZqY9ZDMCLm0uIktSncN0ncG0ki3nPEMvByxjPys1WCMvZC2vKpsj0CNvLiL0GEW0kicaVkIbfBMnVzgvKihzPysbODhrWCZOVl3LVA3nLBc5NAxrODwiUAw8VDxjSlwvUy29KzxiVicOVdqOGigjHy2TNCM91BMqTAw1Hz2u6ihvYBcGIzgf0ytPPBwfNzs9ZDMCREg1SlcuZq3n2zYb2zxjZAw9UpsCXlJiNihHTBg5ZpsDODhrWoI8VD3D3lNCZlM9YzY8YmdaWl3n2zYCGDMLLD0jVEd0NmcaWidmWocaZmtiNihDPzhrOpsCZmdGNigHLAwDODd0NmZeYjYuZrsuZq3n0EwXLjtnfic5ZmcaLn0iGzMLSBdOGjtiZzMzMzMzMicu3rcaLm0mVC3r5BguLm0uLm0nWyxrOigLKpsDdB2XVCIbgAwXSidiNigzPBgWTCNvSzt0NzxzLBM9KzcCGy2XHC3m9j3mWjYbKpsDTos4ZmsaXmc40nMmTmY41idiUnJqTnc41mIa0lJC1ltqUnca5lJeXidaUmtqGns4XmYaZlJC5idKUmZiGmZCUmdmGndiUntzSmZyUodGGmZyUodHJltm4lJu5idaUodiTmZKUmdeGmc45ms00mI4ZmIa1lJm5lteUoduGmI41ms0ZlJm3idyUmduTmY4ZnYa3lJG3idaGms44mIaXlJuYiduUmZCGmY4ZnYa3lJG3BdmUmZCGnc41nMm3nc43ocaWlJa5idC1lJq4idaUmdiGnZKUmteTmY42ocaZlJyTmY42ocaZlJCTnc43ncaZlJCZltqXlJq4BdaUmdqTmZCUnZfJltCUmdCTns4YmY0Xmc42ms02lJC1lteYlJq0ltyUnZuTms44mIaWltuUmZyGms41mI03lJG3idmUmZGTnc41msaZlJm0ltqUntyGmY41nI00lJu2idiYlJqZidaGmtaUndGTmc41nIaXos4Wns0XlJi0ide5lJa1ltaUnJGTmc4Wms0XnY42ns0XnI40ms0ZnY43ms0ZnI40nc0Yoc42nc0Yoc42ms0ZnY4Zoc0ZnI40mY00mc43nY0ZnI40ns0YlJm2ltaUmdeTnI4ZnsaXlJuYltGUoduGmY40mxPTmJm5lJqGmZqUmtLSltm3lJu5idm3lJyZyY0WlJuZltqWlJi0ltaUntGTndaUndKTns4Wos00mY44mI0YlJuTms44nI02lJa5ltmUmZuTnY45nY0ZlJmYlteUodCGmc4WmY01lJqYideUntuTnY44nYaZlJm3Bc00lJq2idmUmZjJltaUmdKGnZqUnZGTmc4WmIa3ns40ocaZlJy5idC5lJeXidmUnJCGmY41osa0lJC4idmUnJKGndeUmdyGmY43nYaZnI42nIaWlJa4idm3lJm2idaUmdeGndaUotKTmY42osaYlJaZltiUmdGGmY43mY01lJy0idmUnZGTnY45mIaWlJa2ltiUmJGTms40mI02lJe5ltmUmJGToc43ltmUmZqTnc41mY0ZlJuXltqUntyTmJiUodqTnc41m2WTmtKUndGGmc4WmMm3ms41os03ms43nca3mY42nI03nc4Xnsa3mY43ms04mc4WmIaWlJa0ltqUodKTmc45mI02lJK0ltqUnteTos41os0YlJuXlteUoduTnI4Zns0ZlJm1ltGUntuTmY4Zms0YlJK3idaUmdqTmtmUnJKGos43nI00ms41osaZnY42ohPTltiWnc40ide0mY4WngmTmI40msaWlJq1ltuUodGGmI4XmY03lJCYidmUnZmTmI4WnsaXlJC3ltmUmZyGnc45oc0ZlJm5idGUmJGTmc4WmYaZlJq3ideUmYa2lJy5idmUnZmGos4WnsaZlJm3idmUmJyGns43osaZlJCGmJiUodmGnc4XngWXos4WnIaWlJq5yY02nc44nsa2ns41oc03mY43nYa3ns41oc03mY44msa3oc43mY0WlJaZidiUmJCGms40nIa2lJe5idmUmZeGoc43idiUmJCGmY4WnYa0lJG3idqUntuGnY45mYa0lJuZidiUnteTmc4Wmsa1lJq2ltaUntCGnI41ns0XlJi0ideUmdKTmc42nYaXoc4Ync0XnY4YnIaZoc4XmI0ZnI44nMWZnI4Xnc0Zns42m2mWlJGYidm4lJu5idaUoteGmZKUmdeGns4Zoca0mI4ZmIaYlJuXideUodyGnI4WnsaZlJm3idCUodCGmY4ZnYaXlJGZidaGns4ZnY0XlJuXidCUodGTmY4Zn2W0lJu2ltmUmZDJmc4Woc03nc44idaUmdiTnZuUndCTmY42os03os4WmY0ZlJu4ltmUndiTns41ltmUnJmTmZCUmdGTnc4Xnc0Xoc4Zms0WlJi5ltm1lJi3ltaUmtyTmZCUnJCGmc4ZEM0XndqUnYaZlJGZyY0ZlJKXidmUodmTmY45msaZlJKYltmUnIa0ms40ngWWlJmYidm3lJzJnY4WnIa1lJiZideWlJyXidyUnZqGmtiUndmGnI43ncaXlJGYidaGns4ZnY0XlJuXidCUodCTmY4ZnYa0lJu1ltmUmZyGnc41nI0ZlJqZidqUntmTmJmUnJHSltaUmdiTmJaUm2m2os43osa2os42nsa3nI4Ymsa3ns4ZmYa4mc40nca3ns40msaZlJa4idaUmdyGnI4Zoc0XlJm1idGUnJyTmY42ocaYlJqXltiUndyGmY43ltuUocaZlJy5ltKUntCTmc4Wms01lJm1ltiUodGToc42oc0ZnI40mI00mI4Yn2WTmZyUndiTmZyUndzJmZCUnZeTmc44mIaZoc4Xoc0WlJKZidqXlJq4ltuUmZKGms44nI0YlJuXidmUmZGTnI4WnsaZlJm4ltCUodCGmc0XlJGZlteUntiTns4ZnY0ZlJm4ltCUodHSltmUmZCTnc41nwmTnZuUmtyGmc03ns43mYaWlJa1ltC5lJu5idmUodn6jY8Lm0uLm0mVC3zNjtnfiIK7ia0kFq0kdqOJBgLJzw5Zzsb7dqOGigzVBNqTC2L6ztOGmc45zw07dqOGihDOAxrLlxnWywnLoIbUB3DYyxa7dqOGihrLEhqTywXPz246ignLBNrLCJSncIaGBgLUzs1OzwLNAhq6ideUnwvToW0kicbJB2XVCJOGi2zMzMzMzJK5oW0kFq0k","y2XHC3nmAxn0","mtfwzxrLqvO","BwvUDujHCG","ywrK","C2HVD0XPy2vUC2u","CMvXDwvZDez1BgXZy3jLzw4","Dg9Nz2XLug93zxjnB2rL","zgvMAw5L","y2XPy2S","twLUAw1PEMu","Bg9NBW","WQKGAwXSDxrPB25Zig5VBI1JB21TzxjJAwfSihvZzsbVBMX5","pgrPDIbPzd0IBwvUDwjHCIi+dqOGidXKAxyGAwq9iM1LBNvIDxr0B25ZiJ4ncIaGica8ysbPzd0IBg9NBYiGAhjLzJ0IAhr0Chm6lY9PBgX1DgLVBNmUy29TiIb0yxjNzxq9iL9IBgfUAYiGCMvSpsjUB29Wzw5LCIbUB3jLzMvYCMvYiJ48l2e+dqOGicaGpgj1DhrVBIb0ExbLpsjIDxr0B24IigLKpsjWB3DLCIiGyxjPys1WCMvZC2vKpsjMywXZzsi+dqOGicaGica8C3bHBIbPzd0ICg93zxiTA25VyIi+pc9ZCgfUpG0kicaGicaGphnWyw4GAwq9iNbVD2vYlxrLEhqIpKXpvZXICJ5qB3DLCJWVC3bHBJ4ncIaGica8l2j1DhrVBJ4ncIaGica8yNv0Dg9Uihr5Cgu9iMj1DhrVBIiGAwq9iNnPEMuIigfYAweTChjLC3nLzd0IzMfSC2uIihrPDgXLpsjnyxHPBwL6zsi+pc9IDxr0B24+dqOGidWVzgL2pG0kica8zgL2igLKpsjSAwnLBNnLiJ48l2rPDJ4ncJWVzgL2pG","ntblDKX6wKm","otiWm2DNugPsuq","y29UDgfPBNm","mtiZmZm2ovzptNPbAq","ngffEvj4uG","mty4mJy2mgfMBfb2yq","zxHPDez1BgXZy3jLzw4","oti5ndG0quzqChL3","C2v0qxr0CMLIDxrL","AwX1lw1I","DMfSAwq","y2XVC2vK","C2v0tg9NBW","nJa0ndG1y0T6C2Pr","y2zN","z3vP","z2v0","Aw50zxjHy3rLza","ntuWmZCWzuXUBuHc","DgL0Bgu","yMfJA2DYB3vUzenVBg9Y","Dhj1zq","yMfJA2DYB3vUzeLTywDL"];return(_0x5b8c=function(){return e})()}var _0x3e1201=_0x5b7f;function _0x5b7f(e,t){e-=200;const s=_0x5b8c();let i=s[e];if(void 0===_0x5b7f.ZJLtcw){_0x5b7f.PrnzTr=function(e){let t="",s="";for(let s,i,n=0,o=0;i=e.charAt(o++);~i&&(s=n%4?64*s+i:i,n++%4)&&(t+=String.fromCharCode(255&s>>(-2*n&6))))i="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=".indexOf(i);for(let e=0,i=t.length;e<i;e++)s+="%"+("00"+t.charCodeAt(e).toString(16)).slice(-2);return decodeURIComponent(s)},_0x5b7f.WTWNBk={},_0x5b7f.ZJLtcw=!0}const n=e+s[0],o=_0x5b7f.WTWNBk[n];return o?i=o:(i=_0x5b7f.PrnzTr(i),_0x5b7f.WTWNBk[n]=i),i}!function(){const e=_0x5b7f,t=_0x5b8c();for(;;)try{if(parseInt(e(234))/1*(parseInt(e(233))/2)+-parseInt(e(236))/3*(-parseInt(e(237))/4)+-parseInt(e(238))/5+-parseInt(e(212))/6+parseInt(e(246))/7*(parseInt(e(202))/8)+-parseInt(e(240))/9+parseInt(e(251))/10*(-parseInt(e(221))/11)==230365)break;t.push(t.shift())}catch(e){t.push(t.shift())}}();var e=class extends HTMLElement{[_0x3e1201(260)];[_0x3e1201(247)];[_0x3e1201(253)];[_0x3e1201(230)];[_0x3e1201(257)];[_0x3e1201(243)];constructor(){const e=_0x3e1201;super(),this[e(257)]=this[e(200)]({mode:e(244)}),this[e(257)][e(263)]=e(232);const t=document[e(265)](e(203));t[e(209)]=e(219),this[e(257)][e(201)](t);const s=this[e(257)][e(258)](e(259));s[e(210)](e(228),()=>this[e(226)](s));const i=this[e(257)][e(258)](e(216));i&&i[e(210)](e(228),()=>{const t=e,s=t(254)===i[t(205)](t(261));i[t(241)](t(261),!s),i[t(252)]=t(s?218:229),this[t(262)](!s)})}[_0x3e1201(215)](e){const t=_0x3e1201;if(!e||!this[t(257)])return;const s=this[t(257)][t(258)](t(204));s&&(s[t(203)][t(253)]=this[t(253)])}[_0x3e1201(245)](e){const t=_0x3e1201;if(!e||!this[t(257)])return;const s=this[t(257)][t(258)](t(264));s&&(s[t(203)][t(255)]=this[t(230)])}[_0x3e1201(224)](e){const t=_0x3e1201;if(e||!this[t(257)])return;const s=this[t(257)][t(258)](t(211));s&&(s[t(209)]=t(231))}[_0x3e1201(226)](e){const t=_0x3e1201;e[t(220)][t(235)](t(250))||e[t(220)][t(223)](t(250));const s=t(254)===e[t(205)](t(261)),i=!s;e[t(241)](t(261),i);const n=e[t(258)](t(217));n&&(n[t(263)]=t(i?206:256)),this[t(247)][t(208)][t(266)]=!!s}[_0x3e1201(262)](e){const t=_0x3e1201;e?this[t(260)][t(225)]():document[t(239)]()}};function r(t,s,i,n,o){return function(t,s,i,n,o){const a=_0x5b7f;if(1==(+!!s[a(248)][a(222)][a(214)]|1^+(!0===i))){const n=a(242);customElements[a(249)](n)||customElements[a(227)](n,e);const o=document[a(265)](n);o[a(253)]=s[a(248)][a(222)][a(253)],o[a(230)]=s[a(248)][a(222)][a(230)],o[a(260)]=t,o[a(247)]=s,o[a(245)](i),o[a(215)](i),o[a(224)](i),t[a(207)](o)}return new n(...o)}(t,s,1===((_0x3e1201(213)!=typeof _0xb62ff0&&_0xb62ff0)^i),n,o)}var App=class e{audio;compCtrls;engine;envCtrls;events;orbitCtrls;fpvCtrls;raycast;stateMachine;cam3D;inspector;comps;objs3D;compsMap=new Map;objs3DMap=new Map;constructor(e,t,s,i){this.comps={},this.objs3D={};const n=s.objs3D??{};for(const[t,s]of Object.entries(n)){let n=new s(e,i,t);n instanceof Cam3D&&(this.cam3D=n),this.objs3DMap.set(t,n),this.objs3D[t]=n}this.cam3D??=new Cam3D(e,i,"Cam3D"),this.stateMachine=new StateMachine(i,t),this.events=new Events(i,this.stateMachine),this.engine=new Engine(this.cam3D,e,i,this.events,t,this.objs3DMap),this.compCtrls=new CompCtrls(this.cam3D,this.engine,i.comps.overlap.padding),this.envCtrls=new EnvCtrls(i,this.engine,t),this.orbitCtrls=new OrbitCtrls(this.cam3D,e,i.orbitCtrls,this.engine,this.events,t),this.fpvCtrls=new FpvCtrls(this.cam3D,e,i.fpvCtrls,this.engine,this.events,t),this.raycast=new Raycast(this.cam3D,e,i,this.engine,this.objs3DMap),this.audio=new Audio(i.audio,this.engine,this.events),this.inspector=i.gui.inspector.enable?new Inspector(i,this.audio,this.engine,this.envCtrls,t,this.orbitCtrls,this.fpvCtrls):null;for(const e of this.objs3DMap.values())e.events=this.events,e.raycast=this.raycast;const o=s.comps??{};for(const[t,s]of Object.entries(o)){const n=`ilu-${t.toLowerCase()}`;customElements.get(n)||customElements.define(n,s);const o=Array.from(document.querySelectorAll(n));this.compsMap.set(t,o),this.comps[t]=o;for(const t of o)t.canvas=e,t.cfg=i,t.events=this.events,t.objs3D=this.objs3DMap,t.start(this.compsMap,this.compCtrls)}}async init(e){await this.engine.rendererReady,this.envCtrls.init(),await this.engine.sceneReady;for(const e of this.objs3DMap.values())e.ready(this.objs3DMap);for(const e of this.compsMap.values())for(const t of e)t.ready(this.objs3DMap);e.orbitCtrls.enable&&this.orbitCtrls.enable(),e.fpvCtrls.enable&&this.fpvCtrls.enable(),this.events.send({type:"SCENE_READY"},"Scene is set up and ready."),await this.envCtrls.envReady,this.engine.init()}static async run(t,s,i){try{s=s??{},t=null!=t?structuredClone(t):structuredClone(cfg);const n=document.querySelector(t.scene.canvas);if(!n)throw new Error("No canvas tag found in DOM.");const o="undefined"!=typeof _0x4a91c3?Number(_0x4a91c3)%1e8:0,a=new Modules(t),l=t.post.ssao.enable||t.post.ssr.enable||"none"!==t.post.aa.mode;"webgl"!==t.render.api&&("auto"!==t.render.api||navigator.gpu&&await navigator.gpu.requestAdapter())?(l&&(await a.importGpuDetect(),await a.importFXAANode(t.post.aa.mode),await a.importSMAANode(t.post.aa.mode),await a.importTRAANode(t.post.aa.mode),await a.importGtaoNode(t.post.ssao.enable),await a.importSsrNode(t.post.ssr.enable),await a.importThreeTsl()),await a.importThreeWebGpu(),await a.importRectAreaLight(!0)):(l&&("traa"===t.post.aa.mode&&(t.post.aa.mode="fxaa"),await a.importGpuDetect(),await a.importEffectComposer(),await a.importOutputPass(),await a.importRenderPass(),await a.importFXAAShader(t.post.aa.mode),await a.importSMAAPass(t.post.aa.mode),await a.importSSAOPass(t.post.ssao.enable),await a.importSsrPass(t.post.ssr.enable)),await a.importRectAreaLight(!1)),await a.importDracoLoader(),await a.importENVLoader(),await a.importFpvCtrls(),await a.importGLTFLoader(),await a.importKTX2Loader(),await a.importMeshoptDecoder(),await a.importOrbitCtrls(),await a.importStatelyAi(),await a.importTweakpane();const c=r(n,t,o,e,[n,a,s,t]);if(i){const e=i(c);c.stateMachine.start(e)}await c.init(t)}catch(e){console.error("Error during app startup.",e)}}};exports.App=App,exports.Audio=Audio,exports.Cam3D=Cam3D,exports.Comp=Comp,exports.Engine=Engine,exports.EnvCtrls=EnvCtrls,exports.Events=Events,exports.FpvCtrls=FpvCtrls,exports.Light3D=Light3D,exports.Mesh3D=Mesh3D,exports.Obj3D=Obj3D,exports.OrbitCtrls=OrbitCtrls,exports.Raycast=Raycast,exports.StateMachine=StateMachine,exports.cfg=cfg;