@tomorrowevening/hermes 0.0.138 → 0.0.139

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.
@@ -1,165 +1,165 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o=require("three"),O=require("react"),yt=()=>{},sn=()=>{};function Ct(i){return i.substring(0,1).toUpperCase()+i.substring(1)}function ms(i){const e=JSON.stringify(i);return navigator.clipboard.writeText(e),e}function fs(){return Math.round(Math.random()*1e6).toString()}function gs(i){return i.r!==void 0&&i.g!==void 0&&i.b!==void 0}function di(i){const e=Math.round(i.r*255),t=Math.round(i.g*255),s=Math.round(i.b*255),n=c=>{const h=c.toString(16);return h.length===1?"0"+h:h},a=n(e),r=n(t),l=n(s);return"#"+a+r+l}function Qt(i,e,t,s){return new(t||(t=Promise))(function(n,a){function r(h){try{c(s.next(h))}catch(d){a(d)}}function l(h){try{c(s.throw(h))}catch(d){a(d)}}function c(h){var d;h.done?n(h.value):(d=h.value,d instanceof t?d:new t(function(f){f(d)})).then(r,l)}c((s=s.apply(i,e||[])).next())})}const nn=["geforce 320m","geforce 8600","geforce 8600m gt","geforce 8800 gs","geforce 8800 gt","geforce 9400","geforce 9400m g","geforce 9400m","geforce 9600m gt","geforce 9600m","geforce fx go5200","geforce gt 120","geforce gt 130","geforce gt 330m","geforce gtx 285","google swiftshader","intel g41","intel g45","intel gma 4500mhd","intel gma x3100","intel hd 3000","intel q45","legacy","mali-2","mali-3","mali-4","quadro fx 1500","quadro fx 4","quadro fx 5","radeon hd 2400","radeon hd 2600","radeon hd 4670","radeon hd 4850","radeon hd 4870","radeon hd 5670","radeon hd 5750","radeon hd 6290","radeon hd 6300","radeon hd 6310","radeon hd 6320","radeon hd 6490m","radeon hd 6630m","radeon hd 6750m","radeon hd 6770m","radeon hd 6970m","sgx 543","sgx543"];function Fi(i){return i=i.toLowerCase().replace(/.*angle ?\((.+)\)(?: on vulkan [0-9.]+)?$/i,"$1").replace(/\s(\d{1,2}gb|direct3d.+$)|\(r\)| \([^)]+\)$/g,"").replace(/(?:vulkan|opengl) \d+\.\d+(?:\.\d+)?(?: \((.*)\))?/,"$1")}const _s=typeof window>"u",Oe=(()=>{if(_s)return;const{userAgent:i,platform:e,maxTouchPoints:t}=window.navigator,s=/(iphone|ipod|ipad)/i.test(i),n=e==="iPad"||e==="MacIntel"&&t>0&&!window.MSStream;return{isIpad:n,isMobile:/android/i.test(i)||s||n,isSafari12:/Version\/12.+Safari/.test(i),isFirefox:/Firefox/.test(i)}})();function an(i,e,t){if(!t)return[e];const s=function(h){const d=`
2
- precision highp float;
3
- attribute vec3 aPosition;
4
- varying float vvv;
5
- void main() {
6
- vvv = 0.31622776601683794;
7
- gl_Position = vec4(aPosition, 1.0);
8
- }
9
- `,f=`
10
- precision highp float;
11
- varying float vvv;
12
- void main() {
13
- vec4 enc = vec4(1.0, 255.0, 65025.0, 16581375.0) * vvv;
14
- enc = fract(enc);
15
- enc -= enc.yzww * vec4(1.0 / 255.0, 1.0 / 255.0, 1.0 / 255.0, 0.0);
16
- gl_FragColor = enc;
17
- }
18
- `,m=h.createShader(35633),g=h.createShader(35632),E=h.createProgram();if(!(g&&m&&E))return;h.shaderSource(m,d),h.shaderSource(g,f),h.compileShader(m),h.compileShader(g),h.attachShader(E,m),h.attachShader(E,g),h.linkProgram(E),h.detachShader(E,m),h.detachShader(E,g),h.deleteShader(m),h.deleteShader(g),h.useProgram(E);const y=h.createBuffer();h.bindBuffer(34962,y),h.bufferData(34962,new Float32Array([-1,-1,0,3,-1,0,-1,3,0]),35044);const T=h.getAttribLocation(E,"aPosition");h.vertexAttribPointer(T,3,5126,!1,0,0),h.enableVertexAttribArray(T),h.clearColor(1,1,1,1),h.clear(16384),h.viewport(0,0,1,1),h.drawArrays(4,0,3);const _=new Uint8Array(4);return h.readPixels(0,0,1,1,6408,5121,_),h.deleteProgram(E),h.deleteBuffer(y),_.join("")}(i),n="801621810",a="8016218135",r="80162181161",l=Oe?.isIpad?[["a7",r,12],["a8",a,15],["a8x",a,15],["a9",a,15],["a9x",a,15],["a10",a,15],["a10x",a,15],["a12",n,15],["a12x",n,15],["a12z",n,15],["a14",n,15],["a15",n,15],["m1",n,15],["m2",n,15]]:[["a7",r,12],["a8",a,12],["a9",a,15],["a10",a,15],["a11",n,15],["a12",n,15],["a13",n,15],["a14",n,15],["a15",n,15],["a16",n,15],["a17",n,15]];let c;return s==="80162181255"?c=l.filter(([,,h])=>h>=14):(c=l.filter(([,h])=>h===s),c.length||(c=l)),c.map(([h])=>`apple ${h} gpu`)}class zi extends Error{constructor(e){super(e),Object.setPrototypeOf(this,new.target.prototype)}}const Kt=[],Hi=[];function rn(i,e){if(i===e)return 0;const t=i;i.length>e.length&&(i=e,e=t);let s=i.length,n=e.length;for(;s>0&&i.charCodeAt(~-s)===e.charCodeAt(~-n);)s--,n--;let a,r=0;for(;r<s&&i.charCodeAt(r)===e.charCodeAt(r);)r++;if(s-=r,n-=r,s===0)return n;let l,c,h=0,d=0,f=0;for(;d<s;)Hi[d]=i.charCodeAt(r+d),Kt[d]=++d;for(;f<n;)for(a=e.charCodeAt(r+f),l=f++,h=f,d=0;d<s;d++)c=a===Hi[d]?l:l+1,l=Kt[d],h=Kt[d]=l>h?c>h?h+1:c:c>l?l+1:c;return h}function on(i){return i!=null}const ln=({mobileTiers:i=[0,15,30,60],desktopTiers:e=[0,15,30,60],override:t={},glContext:s,failIfMajorPerformanceCaveat:n=!1,benchmarksURL:a="https://unpkg.com/detect-gpu@5.0.57/dist/benchmarks"}={})=>Qt(void 0,void 0,void 0,function*(){const r={};if(_s)return{tier:0,type:"SSR"};const{isIpad:l=!!Oe?.isIpad,isMobile:c=!!Oe?.isMobile,screenSize:h=window.screen,loadBenchmarks:d=x=>Qt(void 0,void 0,void 0,function*(){const M=yield fetch(`${a}/${x}`).then(D=>D.json());if(parseInt(M.shift().split(".")[0],10)<4)throw new zi("Detect GPU benchmark data is out of date. Please update to version 4x");return M})}=t;let{renderer:f}=t;const m=(x,M,D,k,R)=>({device:R,fps:k,gpu:D,isMobile:c,tier:x,type:M});let g,E="";if(f)f=Fi(f),g=[f];else{const x=s||function(D,k=!1){const R={alpha:!1,antialias:!1,depth:!1,failIfMajorPerformanceCaveat:k,powerPreference:"high-performance",stencil:!1};D&&delete R.powerPreference;const B=window.document.createElement("canvas"),ge=B.getContext("webgl",R)||B.getContext("experimental-webgl",R);return ge??void 0}(Oe?.isSafari12,n);if(!x)return m(0,"WEBGL_UNSUPPORTED");const M=Oe?.isFirefox?null:x.getExtension("WEBGL_debug_renderer_info");if(f=M?x.getParameter(M.UNMASKED_RENDERER_WEBGL):x.getParameter(x.RENDERER),!f)return m(1,"FALLBACK");E=f,f=Fi(f),g=function(D,k,R){return k==="apple gpu"?an(D,k,R):[k]}(x,f,c)}const y=(yield Promise.all(g.map(function(x){var M;return Qt(this,void 0,void 0,function*(){const D=(G=>{const ae=c?["adreno","apple","mali-t","mali","nvidia","powervr","samsung"]:["intel","apple","amd","radeon","nvidia","geforce","adreno"];for(const be of ae)if(G.includes(be))return be})(x);if(!D)return;const k=`${c?"m":"d"}-${D}${l?"-ipad":""}.json`,R=r[k]=(M=r[k])!==null&&M!==void 0?M:d(k);let B;try{B=yield R}catch(G){if(G instanceof zi)throw G;return}const ge=function(G){var ae;const be=(G=G.replace(/\([^)]+\)/,"")).match(/\d+/)||G.match(/(\W|^)([A-Za-z]{1,3})(\W|$)/g);return(ae=be?.join("").replace(/\W|amd/g,""))!==null&&ae!==void 0?ae:""}(x);let ue=B.filter(([,G])=>G===ge);ue.length||(ue=B.filter(([G])=>G.includes(x)));const se=ue.length;if(se===0)return;const Q=x.split(/[.,()\[\]/\s]/g).sort().filter((G,ae,be)=>ae===0||G!==be[ae-1]).join(" ");let X,[Ae,,,,le]=se>1?ue.map(G=>[G,rn(Q,G[2])]).sort(([,G],[,ae])=>G-ae)[0][0]:ue[0],fe=Number.MAX_VALUE;const{devicePixelRatio:te}=window,Pe=h.width*te*h.height*te;for(const G of le){const[ae,be]=G,it=ae*be,Be=Math.abs(Pe-it);Be<fe&&(fe=Be,X=G)}if(!X)return;const[,,Re,De]=X;return[fe,Re,Ae,De]})}))).filter(on).sort(([x=Number.MAX_VALUE,M],[D=Number.MAX_VALUE,k])=>x===D?M-k:x-D);if(!y.length){const x=nn.find(M=>f.includes(M));return x?m(0,"BLOCKLISTED",x):m(1,"FALLBACK",`${f} (${E})`)}const[,T,_,C]=y[0];if(T===-1)return m(0,"BLOCKLISTED",_,T,C);const S=c?i:e;let w=0;for(let x=0;x<S.length;x++)T>=S[x]&&(w=x);return m(w,"BENCHMARK",_,T,C)});var vs=(i=>(i[i.High=0]="High",i[i.Medium=1]="Medium",i[i.Low=2]="Low",i))(vs||{});function ys(i){let e=0;const t=performance.now();function s(){e++;const n=performance.now();if(n-t>=100){const a=e/((n-t)/1e3),r=Math.round(a/30)*30;i(r)}else requestAnimationFrame(s)}requestAnimationFrame(s)}function cn(i){return new Promise(e=>{ln().then(t=>{let s=!1;const n=/^((?!chrome|android).)*safari/i.test(navigator.userAgent);if(s="transferControlToOffscreen"in i,n){const r=navigator.userAgent.match(/version\/(\d+)/i);s=(r?parseInt(r[1]):0)>=17}const a={dpr:devicePixelRatio,fps:30,width:innerWidth,height:innerHeight,mobile:t.isMobile!==void 0?t.isMobile:!1,supportOffScreenCanvas:s,quality:2};t.tier===3?a.quality=0:t.tier===2&&(a.quality=1),ys(r=>{a.fps=r,e(a)}),e(a)})})}function Ue(i,e,t){return Math.min(e,Math.max(i,t))}function Nt(i,e,t){return(t-i)/(e-i)}function tt(i,e,t){return i*(1-t)+e*t}function hn(i,e,t,s,n){return tt(t,s,Nt(i,e,n))}function dn(i,e){const t=i-e;return Math.sqrt(t*t)}function ye(i,e=1){return Number(i.toFixed(e))}function un(i,e,t,s){return tt(i,e,1-Math.exp(-t*s))}function pn(i,e=1){return Number(i.toFixed(e))}function mn(i,e,t,s){return i===e&&t===s}function fn(i,e,t,s){return 1/(3*e*i*i+2*t*i+s)}function gn(i,e,t,s,n){return e*(i*i*i)+t*(i*i)+s*i+n}function _n(i,e,t,s,n){const a=i*i;return e*(a*i)+t*a+s*i+n}function vn(i,e,t,s,n){if(i<=0)return 0;if(i>=1)return 1;if(mn(e,t,s,n))return i;const a=0,r=0,l=e,c=t,h=s,d=n,f=1,m=1,g=f-3*h+3*l-a,E=3*h-6*l+3*a,y=3*l-3*a,T=a,_=m-3*d+3*c-r,C=3*d-6*c+3*r,S=3*c-3*r,w=r;let x=i;for(let M=0;M<5;M++){const D=gn(x,g,E,y,T);let k=fn(x,g,E,y);k===1/0&&(k=i),x-=(D-i)*k,x=Math.min(Math.max(x,0),1)}return _n(x,_,C,S,w)}const ui=i=>{i?.dispose()},Ci=i=>{if(i)if(Array.isArray(i))i.forEach(e=>Ci(e));else{for(const e in i){const t=i[e];t!==null&&t instanceof o.Texture&&ui(t)}if(i.isShaderMaterial===!0){const e=i;for(const t in e.uniforms){const s=e.uniforms[t];s.value!==null&&s.value instanceof o.Texture&&ui(s.value)}}i.dispose()}},Me=i=>{if(i){for(;i.children.length>0;){const e=i.children[0];e.type==="Audio"?(e.pause(),e.parent&&e.parent.remove(e)):Me(e)}if(i.parent&&i.parent.remove(i),i.isMesh){const e=i;e.geometry?.dispose(),Ci(e.material)}i.dispose!==void 0&&i.dispose()}};exports.totalThreeObjects=0;const pi=()=>{exports.totalThreeObjects=0},Ft=i=>{if(!i)return;let e=i.name.replaceAll(" ","").replaceAll("/",".");if(e.length===0&&(e=`obj_${exports.totalThreeObjects}`,exports.totalThreeObjects++),i.parent!==null&&i.parent.uuid.length>0&&(e=`${i.parent.uuid}.${e}`),i.uuid=e,i.isMesh!==void 0){const t=i;if(Array.isArray(t.material))t.material.forEach((s,n)=>{s.uuid=`${e}.material.${n}`});else{const s=t.material;s.uuid=`${e}.material`}}i.children.forEach(t=>Ft(t))};class vt{static renderer;static canvas;static context=null;static scene=null;static camera=null;static material=null;static inited=!1;static width=100;static height=100;static init(){this.inited||(this.canvas=document.createElement("canvas"),this.canvas.width=this.width,this.canvas.height=this.height,this.context=this.canvas.getContext("2d"),this.inited=!0)}static renderToBlob(e){this.init();const t=e.repeat.clone(),s=e.offset.clone();if(e.repeat.set(1,1),e.offset.set(0,0),this.context!==null){this.context.clearRect(0,0,this.width,this.height);const n=e.image;if(n!=null&&n.width>0){this.canvas.title=e.sourceFile;const a=this.canvas.width/n.width,r=this.renderToCanvas(e);this.context.drawImage(r,0,0,n.width*a,n.height*a)}}return e.repeat.copy(t),e.offset.copy(s),this.canvas.toDataURL("image/png")}static renderToCanvas(e){if(this.material===null){this.camera=new o.OrthographicCamera(-.5,.5,.5,-.5,0,100),this.scene=new o.Scene,this.material=new o.MeshBasicMaterial;const t=new o.BufferGeometry;t.setAttribute("position",new o.Float32BufferAttribute([-.5,-.5,0,1.5,-.5,0,-.5,1.5,0],3)),t.setAttribute("normal",new o.Float32BufferAttribute([0,0,1,0,0,1],3)),t.setAttribute("uv",new o.Float32BufferAttribute([0,0,2,0,0,2],2));const s=new o.Mesh(t,this.material);this.scene.add(s)}if(e.isRenderTargetTexture)this.material.map=e,this.renderer.render(this.scene,this.camera);else{const t=this.renderer.outputColorSpace,s=e.colorSpace;this.renderer.outputColorSpace=o.LinearSRGBColorSpace,e.colorSpace=o.LinearSRGBColorSpace,this.material.map=e,this.renderer.render(this.scene,this.camera),this.renderer.outputColorSpace=t,e.colorSpace=s}return this.renderer.domElement}}function yn(i){return new Promise(e=>{const t=new o.ObjectLoader;t.parseAsync(i.scene).then(s=>{const n=new o.AnimationMixer(s);if(i.animations.length>0){const r=i.animations.map(c=>o.AnimationClip.parse(c));n.clipAction(r[0]).play(),n.getRoot().animations=i.animations,n.getRoot().mixer=n}const a=[];i.cameras&&i.cameras.length>0&&i.cameras.forEach(r=>{const l=t.parse(r);a.push(l)}),e({animations:i.animations,model:s,mixer:n,cameras:a})})})}const Ze=bi(["ctrlKey","metaKey","shiftKey","button","pointerId","pointerType","clientX","clientY","pageX","pageY"]),Cn=bi(["clientX","clientY","deltaX","deltaY","deltaMode"]),bn=bi(["ctrlKey","metaKey","shiftKey","keyCode"]);function En(i,e){i.preventDefault(),Cn(i,e)}function Sn(i){i.preventDefault()}function wn(i,e,t){for(const s of e)t[s]=i[s]}function bi(i){return function(t,s){const n={type:t.type};wn(t,i,n),s(n)}}function $t(i,e){const t=[],s={type:i.type,touches:t};for(let n=0;n<i.touches.length;++n){const a=i.touches[n];t.push({pageX:a.pageX,pageY:a.pageY})}e(s)}const xn={37:!0,38:!0,39:!0,40:!0};function On(i,e){const{keyCode:t}=i;xn[t]&&(i.preventDefault(),bn(i,e))}const Tn={contextmenu:Sn,mousedown:Ze,mousemove:Ze,mouseup:Ze,pointerdown:Ze,pointermove:Ze,pointerup:Ze,touchstart:$t,touchmove:$t,touchend:$t,wheel:En,keydown:On};let Mn=0;class An{id;worker;constructor(e,t,s){this.id=Mn++,this.worker=t;const n=r=>{this.worker.postMessage({type:"event",id:this.id,data:r})};t.postMessage({type:"makeProxy",id:this.id});for(const[r,l]of Object.entries(s))e.addEventListener(r,c=>{l(c,n)});function a(){n({type:"resize",left:0,top:0,width:innerWidth,height:innerHeight})}window.addEventListener("resize",a),a()}}class Cs extends o.EventDispatcher{style={};left=0;top=0;width=0;height=0;ownerDocument=void 0;constructor(){super(),this.ownerDocument=this}get clientWidth(){return this.width}set clientWidth(e){this.width=e}get clientHeight(){return this.height}set clientHeight(e){this.height=e}setPointerCapture(){}releasePointerCapture(){}getBoundingClientRect(){return{x:this.left,y:this.top,left:this.left,top:this.top,width:this.width,height:this.height,right:this.left+this.width,bottom:this.top+this.height,toJSON:()=>({})}}handleEvent(e){if(e.type==="size"){this.left=e.left,this.top=e.top,this.width=e.width,this.height=e.height;return}e.preventDefault=yt,e.stopPropagation=yt,this.dispatchEvent(e)}focus(){}getRootNode(){return this}}class Pn{targets={};constructor(){this.handleEvent=this.handleEvent.bind(this)}makeProxy(e){const{id:t}=e,s=new Cs;this.targets[t]=s}getProxy(e){return this.targets[e]}handleEvent(e){this.targets[e.id]?.handleEvent(e.data)}}var P=(i=>(i.CUSTOM="ToolEvents::custom",i.SELECT_DROPDOWN="ToolEvents::selectDropdown",i.DRAG_UPDATE="ToolEvents::dragUpdate",i.ADD_SCENE="ToolEvents::addScene",i.REFRESH_SCENE="ToolEvents::refreshScene",i.REMOVE_SCENE="ToolEvents::removeScene",i.SET_SCENE="ToolEvents::setScene",i.GET_OBJECT="ToolEvents::getObject",i.SET_OBJECT="ToolEvents::setObject",i.UPDATE_OBJECT="ToolEvents::updateObject",i.CREATE_TEXTURE="ToolEvents::createTexture",i.REQUEST_METHOD="ToolEvents::requestMethod",i.ADD_CAMERA="ToolEvents::addCamera",i.REMOVE_CAMERA="ToolEvents::removeCamera",i.ADD_GROUP="ToolEvents::addGroup",i.REMOVE_GROUP="ToolEvents::removeGroup",i.ADD_SPLINE="ToolEvents::addSpline",i.ADD_RENDERER="ToolEvents::addRenderer",i.UPDATE_RENDERER="ToolEvents::updateRenderer",i))(P||{});class Rn extends o.EventDispatcher{components=new Map;appHandlers=[];editorHandlers=[];_appID="";_debugEnabled;_broadcastChannel=void 0;_webSocket=void 0;_mode="app";_connected=!1;_useBC=!1;constructor(e,t,s=!0){super(),this._appID=e,this._debugEnabled=t,t&&(this._useBC=s,s?(this._broadcastChannel=new BroadcastChannel(e),this._broadcastChannel.addEventListener("message",this.messageHandler)):(this._webSocket=new WebSocket(e),this._webSocket.addEventListener("open",this.openHandler),this._webSocket.addEventListener("close",this.closeHandler),this._webSocket.addEventListener("message",this.messageHandler)))}addComponent(e,t){this.components.set(e,t)}dispose(){this._broadcastChannel!==void 0&&this._broadcastChannel.removeEventListener("message",this.messageHandler),this._webSocket!==void 0&&(this._webSocket.removeEventListener("open",this.openHandler),this._webSocket.removeEventListener("close",this.closeHandler),this._webSocket.removeEventListener("message",this.messageHandler)),this.components.forEach(e=>{e.dispose()}),this.components.clear()}send(e){this._mode!==e.target&&(this._useBC?this._broadcastChannel?.postMessage(e):this._connected&&this._webSocket?.send(JSON.stringify(e)))}messageHandler=e=>{let t=e.data;this._useBC||(t=JSON.parse(e.data)),t.target==="editor"?this.handleEditorBroadcast(t):this.handleAppBroadcast(t)};handleAppBroadcast(e){switch(this.appHandlers.forEach(t=>{t.callback(this,t.remote,e)}),e.event){case"custom":this.dispatchEvent({type:"ToolEvents::custom",value:e.data});break}}handleEditorBroadcast(e){switch(this.editorHandlers.forEach(t=>{t.callback(this,t.remote,e)}),e.event){case"custom":this.dispatchEvent({type:"ToolEvents::custom",value:e.data});break}}openHandler=()=>{this._connected=!0};closeHandler=()=>{this._connected=!1};get appID(){return this._appID}get connected(){return this._connected}get debugEnabled(){return this._debugEnabled}get mode(){return this._mode}get isApp(){return this._mode==="app"}get editor(){return this._mode==="editor"}set editor(e){e&&(this._mode="editor")}}class Dn{canvas;inputElement;settings;playing=!1;rafID=-1;constructor(e,t,s){this.canvas=e,this.inputElement=t,this.settings=s}dispose(){this.stop()}play(){this.playing||(this.playing=!0,this.onUpdate())}stop(){this.playing&&(this.playing=!1,cancelAnimationFrame(this.rafID),this.rafID=-1)}update(){}draw(){}resize(e,t){this.settings.supportOffScreenCanvas&&(this.inputElement.clientWidth=e,this.inputElement.clientHeight=t,this.inputElement.width=e,this.inputElement.height=t)}onResize=e=>{this.resize(e.width,e.height)};onUpdate=()=>{this.update(),this.draw(),this.rafID=requestAnimationFrame(this.onUpdate)}}class In extends o.Scene{clock;cameras;lights;world;constructor(e){super(),this.name=e,this.clock=new o.Clock,this.lights=new o.Group,this.lights.name="lights",this.add(this.lights),this.cameras=new o.Group,this.cameras.name="cameras",this.add(this.cameras),this.world=new o.Group,this.world.name="world",this.add(this.world)}init(){return new Promise(e=>{this.setupLights().then(()=>this.setupCameras()).then(()=>this.setupWorld()).then(()=>this.setupPost()).then(()=>this.setupAnimation()).then(()=>this.setupDebug()).then(()=>e())})}setupLights(){return new Promise(e=>{e()})}setupCameras(){return new Promise(e=>{e()})}setupWorld(){return new Promise(e=>{e()})}setupPost(){return new Promise(e=>{e()})}setupAnimation(){return new Promise(e=>{e()})}setupDebug(){return new Promise(e=>{e()})}dispose(){}update(){}draw(e){}postDraw(){}resize(e,t,s){}show(){this.clock.start(),this.showComplete()}showComplete(){this.enable()}hide(){this.disable(),this.hideComplete()}hideComplete(){this.clock.stop()}enable(){}disable(){}get deltaTime(){return Math.min(this.clock.getDelta(),1/30)}}class Ht{app;constructor(e){this.app=e}dispose(){}handleApp(e,t,s){}handleEditor(e,t,s){}}class Ln extends Ht{selectDropdown(e,t){this.app.send({event:"selectComponent",target:"app",data:{dropdown:e,value:t}})}updateDropdown(e,t){this.app.send({event:"draggableListUpdate",target:"app",data:{dropdown:e,value:t}})}handleApp(e,t,s){switch(s.event){case"selectComponent":e.dispatchEvent({type:P.SELECT_DROPDOWN,value:s.data});break;case"draggableListUpdate":e.dispatchEvent({type:P.DRAG_UPDATE,value:s.data});break}}}function kn(i,e,t){if(i.editor){t.ui.restore(),t.onSelectionChange(r=>{r.length<1||r.forEach(l=>{let c=l.address.sheetId,h="setSheet",d={};switch(l.type){case"Theatre_Sheet_PublicAPI":h="setSheet",d={sheet:l.address.sheetId},e.activeSheet=e.sheets.get(l.address.sheetId);break;case"Theatre_SheetObject_PublicAPI":h="setSheetObject",c+=`_${l.address.objectKey}`,d={id:c,sheet:l.address.sheetId,key:l.address.objectKey},e.activeSheet=e.sheets.get(l.address.sheetId);break}i.send({event:h,target:"app",data:d})})});let s=-1;const n=()=>{if(e.activeSheet!==void 0&&s!==e.activeSheet.sequence.position){s=e.activeSheet.sequence.position;const r=e.activeSheet;i.send({event:"updateTimeline",target:"app",data:{position:s,sheet:r.address.sheetId}})}},a=()=>{n(),requestAnimationFrame(a)};n(),a()}else t.ui.hide()}function Un(){setTimeout(()=>{const i=document.getElementById("theatrejs-studio-root");if(i===null||i.shadowRoot===null)return;const e=i.shadowRoot.getElementById("pointer-root");if(e===null)return;const t=e.children[0];if(t===null)return;const s=t.children[1];s.style.justifyContent="left";try{const n=s.children[1];for(n.style.transform="translateX(10px)";n.children.length>1;)n.removeChild(n.children[0])}catch{}try{const n=t.children[3];n.style.top="0",n.style.right="300px"}catch{}},1e3)}function jn(i,e,t,s,n){const a=1-i;return a*a*a*e+3*a*a*i*t+3*a*i*i*s+i*i*i*n}function Nn(i,e,t){if(i.type!=="bezier"||i.handles.length!==4)throw new Error("Invalid keyframe data for Bézier interpolation.");const[s,n]=i.handles,a=(t-i.position)/(e.position-i.position);return jn(a,i.value,i.value+s,e.value+n,e.value)}class Fn extends Ht{project;sheets=new Map;sheetObjects=new Map;sheetObjectCBs=new Map;sheetObjectUnsubscribe=new Map;activeSheet;studio=void 0;dispose(){this.project=void 0,this.sheets=new Map,this.sheetObjects=new Map,this.sheetObjectCBs=new Map,this.sheetObjectUnsubscribe=new Map}getSheetInstance(e,t){return t!==void 0?`${e}-${t}`:e}sheet(e,t){if(this.project===void 0){console.error("Theatre Project hasn't been created yet.");return}const s=this.getSheetInstance(e,t);let n=this.sheets.get(s);return n!==void 0||(n=this.project?.sheet(e,t),this.sheets.set(s,n)),n}playSheet(e,t,s){return new Promise(n=>{const a=t!==void 0?{...t}:{};this.sheet(e,s)?.sequence.play(a).then(r=>n(r)),this.app.send({event:"playSheet",target:"editor",data:{sheet:e,instance:s,value:t}})})}pauseSheet(e,t){this.sheet(e,t)?.sequence.pause(),this.app.send({event:"pauseSheet",target:"editor",data:{sheet:e,instance:t}})}clearSheetObjects(e){this.sheetObjects.forEach((t,s)=>{s.search(`${e}_`)>-1&&this.unsubscribe(t)})}sheetObject(e,t,s,n,a){if(this.project===void 0){console.error("Theatre Project hasn't been created yet.");return}const r=this.sheet(e,a);if(r===void 0)return;const c=`${this.getSheetInstance(e,a)}_${t}`;let h=this.sheetObjects.get(c),d=s;h!==void 0&&(d={...s,...h.value}),h=r.object(t,d),this.sheetObjects.set(c,h),this.sheetObjectCBs.set(c,n!==void 0?n:yt);const f=h.onValuesChange(m=>{if(this.app.editor){for(const E in m){const y=m[E];typeof y=="object"&&gs(y)&&(m[E]={r:y.r,g:y.g,b:y.b,a:y.a})}this.app.send({event:"updateSheetObject",target:"app",data:{sheet:e,sheetObject:c,values:m}})}const g=this.sheetObjectCBs.get(c);g!==void 0&&g(m)});return this.sheetObjectUnsubscribe.set(c,f),h}getSheetObjectKeyframes(e,t,s){const n=this.sheet(e);if(n===void 0)return[];const a=`${e}_${t}`,r=this.sheetObjects.get(a);return r===void 0?[]:n.sequence.__experimental_getKeyframes(r.props[s])}getSheetObjectVectors(e,t){const s=this.sheet(e);if(s===void 0)return[];const n=`${e}_${t}`,a=this.sheetObjects.get(n);if(a===void 0)return[];const r=[],l=s.sequence.__experimental_getKeyframes(a.props.x),c=s.sequence.__experimental_getKeyframes(a.props.y),h=s.sequence.__experimental_getKeyframes(a.props.z),d=new Set;return l.forEach(m=>d.add(m.position)),c.forEach(m=>d.add(m.position)),h.forEach(m=>d.add(m.position)),Array.from(d).sort((m,g)=>m-g).forEach(m=>{const g=(E,y)=>{const T=E.find((S,w)=>S.position<=y&&(E[w+1]?.position||1/0)>y),_=E.find(S=>S.position>y);if(!T)return _?.value||0;if(!_||T.position===y)return T.value;if(T.type==="bezier")return Nn(T,_,y);const C=(y-T.position)/(_.position-T.position);return T.value+C*(_.value-T.value)};r.push({position:m,x:g(l,m),y:g(c,m),z:g(h,m)})}),r}unsubscribe(e){if(this.project===void 0){console.error("Theatre Project hasn't been created yet.");return}const t=e.address.sheetId,s=e.address.objectKey;this.sheets.get(t)?.detachObject(s);const a=`${t}_${s}`,r=this.sheetObjectUnsubscribe.get(a);r!==void 0&&(this.sheetObjects.delete(a),this.sheetObjectCBs.delete(a),this.sheetObjectUnsubscribe.delete(a),r())}handleApp(e,t,s){const n=t;let a;switch(s.event){case"setSheet":a=n.sheets.get(s.data.sheet),a!==void 0&&(n.activeSheet=a,this.studio?.setSelection([a]));break;case"setSheetObject":a=n.sheetObjects.get(`${s.data.sheet}_${s.data.key}`),a!==void 0&&this.studio?.setSelection([a]);break;case"updateSheetObject":a=n.sheets.get(s.data.sheet),a!==void 0&&a.sequence.pause(),a=n.sheetObjectCBs.get(s.data.sheetObject),a!==void 0&&a(s.data.values);break;case"updateTimeline":a=n.sheets.get(s.data.sheet),n.activeSheet!==void 0&&(n.activeSheet.sequence.position=s.data.position);break}}handleEditor(e,t,s){if(e.editor){const n=t;switch(s.event){case"playSheet":n.sheet(s.data.sheet,s.data.instance)?.sequence.play(s.data.value);break;case"pauseSheet":n.sheet(s.data.sheet,s.data.instance)?.sequence.pause();break}}}handleEditorApp(e,t){if(e.editor){this.studio?.ui.restore(),this.studio?.onSelectionChange(r=>{r.length<1||r.forEach(l=>{let c=l.address.sheetId,h="setSheet",d={};switch(l.type){case"Theatre_Sheet_PublicAPI":h="setSheet",d={sheet:l.address.sheetId},t.activeSheet=t.sheets.get(l.address.sheetId);break;case"Theatre_SheetObject_PublicAPI":h="setSheetObject",c+=`_${l.address.objectKey}`,d={id:c,sheet:l.address.sheetId,key:l.address.objectKey},t.activeSheet=t.sheets.get(l.address.sheetId);break}e.send({event:h,target:"app",data:d})})});let s=-1;const n=()=>{if(t.activeSheet!==void 0&&s!==t.activeSheet.sequence.position){s=t.activeSheet.sequence.position;const r=t.activeSheet;e.send({event:"updateTimeline",target:"app",data:{position:s,sheet:r.address.sheetId}})}},a=()=>{n(),requestAnimationFrame(a)};n(),a()}else this.studio?.ui.hide()}}function zn(i){if(i.name==="cameras")return"camera";if(i.name==="interactive")return"interactive";if(i.name==="lights")return"light";if(i.name==="ui")return"ui";if(i.name==="utils")return"utils";const e=i.type;return e.search("Helper")>-1?"icon_utils":e.search("Camera")>-1?"camera":e.search("Light")>-1?"light":"obj3D"}function et(i){const e={name:i.name,type:i.type,uuid:i.uuid,children:[]};return i.children.forEach(t=>{e.children.push(et(t))}),e}function Hn(i){const e={};for(const t in i){const s=i[t].value;e[t]={value:s},s===null?e[t].value={src:"",offset:[0,0],repeat:[1,1]}:s!==void 0&&s.isTexture&&(e[t].value={src:s.image.src,offset:[s.offset.x,s.offset.y],repeat:[s.repeat.x,s.repeat.y]})}return e}function Vn(i){switch(i){case"blendSrcAlpha":case"blendDstAlpha":case"blendEquationAlpha":case"clippingPlanes":case"shadowSide":case"precision":return!0}return!1}function We(i){const e={};for(const t in i){if(t.substring(0,1)==="_"||t.substring(0,2)==="is"||Vn(t))continue;const s=typeof i[t],n=i[t];switch(s){case"boolean":case"number":case"string":e[t]=n;break;case"object":n!==null?(e[t]=n,n.isTexture?e[t]={src:vt.renderToBlob(n),offset:[n.offset.x,n.offset.y],repeat:[n.repeat.x,n.repeat.y]}:t==="uniforms"&&(e[t]=Hn(e[t]))):t==="glslVersion"?e[t]="":e[t]={src:"",offset:[0,0],repeat:[1,1]};break}}return i.anisotropy!==void 0&&(e.anisotropy=i.anisotropy),i.clearcoat!==void 0&&(e.clearcoat=i.clearcoat),i.iridescence!==void 0&&(e.iridescence=i.iridescence),i.dispersion!==void 0&&(e.dispersion=i.dispersion),i.sheen!==void 0&&(e.sheen=i.sheen),i.transmission!==void 0&&(e.transmission=i.transmission),i.transmission!==void 0&&(e.transmission=i.transmission),e}function Jt(i){i.updateMatrix();const e={name:i.name,type:i.type,uuid:i.uuid,visible:i.visible,matrix:i.matrix.elements,animations:[],material:void 0,perspectiveCameraInfo:void 0,orthographicCameraInfo:void 0,lightInfo:void 0,children:[]};i.animations.forEach(s=>{e.animations.push({name:s.name,duration:s.duration,blendMode:s.blendMode})});const t=i.type.toLowerCase();if(t.search("mesh")>-1){const s=i;if(Array.isArray(s.material)){const n=[];s.material.forEach(a=>{n.push(We(a))}),e.material=n}else e.material=We(s.material)}else if(t.search("points")>-1){const s=i;if(Array.isArray(s.material)){const n=[];s.material.forEach(a=>{n.push(We(a))}),e.material=n}else e.material=We(s.material)}else if(t.search("line")>-1){const s=i;if(Array.isArray(s.material)){const n=[];s.material.forEach(a=>{n.push(We(a))}),e.material=n}else e.material=We(s.material)}else t.search("camera")>-1?i.type==="PerspectiveCamera"?e.perspectiveCameraInfo={fov:i.fov,zoom:i.zoom,near:i.near,far:i.far,focus:i.focus,aspect:i.aspect,filmGauge:i.filmGauge,filmOffset:i.filmOffset}:i.type==="OrthographicCamera"&&(e.orthographicCameraInfo={zoom:i.zoom,near:i.near,far:i.far,left:i.left,right:i.right,top:i.top,bottom:i.bottom}):t.search("light")>-1&&(e.lightInfo={color:i.color,intensity:i.intensity,decay:i.decay,distance:i.distance,angle:i.angle,penumbra:i.penumbra,groundColor:i.groundColor,width:i.width,height:i.height});return e}function Bn(i,e){const t=e.split(".");switch(t.length){case 1:return i[t[0]];case 2:return i[t[0]][t[1]];case 3:return i[t[0]][t[1]][t[2]];case 4:return i[t[0]][t[1]][t[2]][t[3]];case 5:return i[t[0]][t[1]][t[2]][t[3]][t[4]];case 6:return i[t[0]][t[1]][t[2]][t[3]][t[4]][t[5]]}}function Yn(i,e){for(const t in e)i[t]=e[t]}function ee(i,e,t){if(i===void 0)return;const s=e.split("."),n=s.length;if(typeof t!="object")switch(n){case 1:i[s[0]]=t;break;case 2:i[s[0]][s[1]]=t;break;case 3:i[s[0]][s[1]][s[2]]=t;break;case 4:i[s[0]][s[1]][s[2]][s[3]]=t;break;case 5:i[s[0]][s[1]][s[2]][s[3]][s[4]]=t;break}else{let r;switch(n){case 1:r=i[s[0]];break;case 2:r=i[s[0]][s[1]];break;case 3:r=i[s[0]][s[1]][s[2]];break;case 4:r=i[s[0]][s[1]][s[2]][s[3]];break;case 5:r=i[s[0]][s[1]][s[2]][s[3]][s[4]];break}r!=null&&Yn(r,t)}}function bs(i){return new Promise((e,t)=>{const s=new Image;s.onload=()=>{const n=new o.Texture(s);n.wrapS=o.RepeatWrapping,n.wrapT=o.RepeatWrapping,n.needsUpdate=!0,e(n)},s.onerror=t,s.src=i})}class Gn extends Ht{canvas=null;inputElement=null;scene=void 0;scenes=new Map;renderer=void 0;renderTargets=new Map;groups=new Map;dispose(){this.scenes.forEach(e=>{Me(e)}),this.scenes.clear(),this.scene&&Me(this.scene),this.renderTargets.forEach(e=>{e.dispose()}),this.renderTargets.clear(),this.renderer?.dispose()}getObject(e){this.app.debugEnabled&&(this.renderer!==void 0&&(vt.renderer=this.renderer),this.app.send({event:"getObject",target:"app",data:e}))}setObject(e){this.renderer!==void 0&&(vt.renderer=this.renderer);const t=Jt(e);this.app.send({event:"setObject",target:"editor",data:t})}requestMethod(e,t,s,n){this.app.send({event:"requestMethod",target:"app",data:{uuid:e,key:t,value:s,subitem:n}})}updateObject(e,t,s){this.app.send({event:"updateObject",target:"app",data:{uuid:e,key:t,value:s}})}createTexture(e,t,s){this.app.send({event:"createTexture",target:"app",data:{uuid:e,key:t,value:s}})}addGroup(e){this.groups.get(e.title)===void 0&&(this.groups.set(e.title,{title:e.title,onUpdate:e.onUpdate}),this.app.send({event:"addGroup",target:"editor",data:JSON.stringify(e)}))}removeGroup(e){this.groups.get(e)!==void 0&&(this.groups.delete(e),this.app.send({event:"removeGroup",target:"editor",data:e}))}updateGroup(e,t,s){this.app.send({event:"updateGroup",target:"app",data:JSON.stringify({group:e,prop:t,value:s})})}removeAllGroups(){this.groups.forEach(e=>{const t=e.title;this.groups.delete(t),this.app.send({event:"removeGroup",target:"editor",data:t})}),this.groups.clear()}addSpline(e){setTimeout(()=>{this.app.send({event:"addSpline",target:"editor",data:JSON.stringify(e.toJSON())})},1)}setRenderer(e,t=null){if(this.renderer=e,this.canvas=e.domElement,this.inputElement=t!==null?t:this.canvas,!this.app.debugEnabled)return;const s=`#${e.getClearColor(new o.Color).getHexString()}`;this.app.send({event:"addRenderer",target:"editor",data:{autoClear:e.autoClear,autoClearColor:e.autoClearColor,autoClearDepth:e.autoClearDepth,autoClearStencil:e.autoClearStencil,outputColorSpace:e.outputColorSpace,localClippingEnabled:e.localClippingEnabled,clearColor:s,clearAlpha:e.getClearAlpha(),colorManagement:o.ColorManagement.enabled,toneMapping:e.toneMapping,toneMappingExposure:e.toneMappingExposure}})}updateRenderer(e){this.app.send({event:"updateRenderer",target:"app",data:e})}addScene(e){if(e===void 0||(this.scenes.set(e.name,e),!this.app.debugEnabled))return;pi(),Ft(e);const t=et(e);this.app.send({event:"addScene",target:"editor",data:t})}refreshScene(e){if(!this.app.debugEnabled)return;const t=this.scenes.get(e);if(t!==void 0){const s=et(t);this.app.send({event:"refreshScene",target:"app",data:s})}}removeScene(e){if(e===void 0||(this.scenes.delete(e.name),!this.app.debugEnabled))return;const t=et(e);this.app.send({event:"removeScene",target:"editor",data:t})}removeAllScenes(){this.scenes.forEach(e=>this.removeScene(e))}getScene(e){let t=null;return this.scenes.forEach((s,n)=>{e.search(n)>-1&&(t=s)}),t}setScene(e){if(e===void 0||(this.scene=e,!this.app.debugEnabled))return;this.renderer!==void 0&&(vt.renderer=this.renderer),pi(),Ft(e);const t=et(e);this.app.send({event:"setScene",target:"editor",data:t})}addCamera(e){if(!this.app.debugEnabled)return;const t=Jt(e);this.app.send({event:"addCamera",target:"editor",data:t})}removeCamera(e){if(!this.app.debugEnabled)return;const t=Jt(e);this.app.send({event:"removeCamera",target:"editor",data:t})}handleApp(e,t,s){const n=t;switch(s.event){case"getObject":e.dispatchEvent({type:P.GET_OBJECT,value:s.data});break;case"updateObject":e.dispatchEvent({type:P.UPDATE_OBJECT,value:s.data});break;case"createTexture":e.dispatchEvent({type:P.CREATE_TEXTURE,value:s.data});break;case"requestMethod":e.dispatchEvent({type:P.REQUEST_METHOD,value:s.data});break;case"refreshScene":e.send({event:"refreshScene",target:"editor",data:et(n.scenes.get(s.data.name))});break;case"updateRenderer":n.renderer&&(n.renderer.autoClear=s.data.autoClear,n.renderer.autoClearColor=s.data.autoClearColor,n.renderer.autoClearDepth=s.data.autoClearDepth,n.renderer.autoClearStencil=s.data.autoClearStencil,n.renderer.outputColorSpace=s.data.outputColorSpace,n.renderer.localClippingEnabled=s.data.localClippingEnabled,n.renderer.setClearColor(s.data.clearColor,s.data.clearAlpha),n.renderer.toneMapping=s.data.toneMapping,n.renderer.toneMappingExposure=s.data.toneMappingExposure,o.ColorManagement.enabled=s.data.colorManagement);break}if(s.event==="updateGroup"){const a=JSON.parse(s.data);n.groups.get(a.group)?.onUpdate(a.prop,a.value)}}handleEditor(e,t,s){switch(s.event){case"setObject":e.dispatchEvent({type:P.SET_OBJECT,value:s.data});break;case"addScene":e.dispatchEvent({type:P.ADD_SCENE,value:s.data});break;case"refreshScene":e.dispatchEvent({type:P.REFRESH_SCENE,value:s.data});break;case"removeScene":e.dispatchEvent({type:P.REMOVE_SCENE,value:s.data});break;case"setScene":e.dispatchEvent({type:P.SET_SCENE,value:s.data});break;case"addCamera":e.dispatchEvent({type:P.ADD_CAMERA,value:s.data});break;case"removeCamera":e.dispatchEvent({type:P.REMOVE_CAMERA,value:s.data});break;case"addGroup":e.dispatchEvent({type:P.ADD_GROUP,value:s.data});break;case"removeGroup":e.dispatchEvent({type:P.REMOVE_GROUP,value:s.data});break;case"addSpline":e.dispatchEvent({type:P.ADD_SPLINE,value:s.data});break;case"addRenderer":e.dispatchEvent({type:P.ADD_RENDERER,value:s.data})}}addRT(e,t){const s=new o.WebGLRenderTarget(32,32,t);s.texture.name=e,this.renderTargets.set(e,s)}resize(e,t){const s=this.dpr;this.renderTargets.forEach(a=>{a.setSize(e*s,t*s)});const n=!(this.renderer?.domElement instanceof OffscreenCanvas);this.renderer?.setSize(e,t,n)}set dpr(e){this.renderer?.setPixelRatio(Ue(1,2,e))}get dpr(){return this.renderer!==void 0?this.renderer?.getPixelRatio():1}get width(){return this.renderer!==void 0?this.renderer.domElement.width/this.dpr:0}get height(){return this.renderer!==void 0?this.renderer.domElement.height/this.dpr:0}}var mi={exports:{}},nt={};/**
19
- * @license React
20
- * react-jsx-runtime.production.min.js
21
- *
22
- * Copyright (c) Facebook, Inc. and its affiliates.
23
- *
24
- * This source code is licensed under the MIT license found in the
25
- * LICENSE file in the root directory of this source tree.
26
- */var Vi;function Zn(){if(Vi)return nt;Vi=1;var i=O,e=Symbol.for("react.element"),t=Symbol.for("react.fragment"),s=Object.prototype.hasOwnProperty,n=i.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,a={key:!0,ref:!0,__self:!0,__source:!0};function r(l,c,h){var d,f={},m=null,g=null;h!==void 0&&(m=""+h),c.key!==void 0&&(m=""+c.key),c.ref!==void 0&&(g=c.ref);for(d in c)s.call(c,d)&&!a.hasOwnProperty(d)&&(f[d]=c[d]);if(l&&l.defaultProps)for(d in c=l.defaultProps,c)f[d]===void 0&&(f[d]=c[d]);return{$$typeof:e,type:l,key:m,ref:g,props:f,_owner:n.current}}return nt.Fragment=t,nt.jsx=r,nt.jsxs=r,nt}var at={};/**
27
- * @license React
28
- * react-jsx-runtime.development.js
29
- *
30
- * Copyright (c) Facebook, Inc. and its affiliates.
31
- *
32
- * This source code is licensed under the MIT license found in the
33
- * LICENSE file in the root directory of this source tree.
34
- */var Bi;function Wn(){return Bi||(Bi=1,process.env.NODE_ENV!=="production"&&function(){var i=O,e=Symbol.for("react.element"),t=Symbol.for("react.portal"),s=Symbol.for("react.fragment"),n=Symbol.for("react.strict_mode"),a=Symbol.for("react.profiler"),r=Symbol.for("react.provider"),l=Symbol.for("react.context"),c=Symbol.for("react.forward_ref"),h=Symbol.for("react.suspense"),d=Symbol.for("react.suspense_list"),f=Symbol.for("react.memo"),m=Symbol.for("react.lazy"),g=Symbol.for("react.offscreen"),E=Symbol.iterator,y="@@iterator";function T(u){if(u===null||typeof u!="object")return null;var b=E&&u[E]||u[y];return typeof b=="function"?b:null}var _=i.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;function C(u){{for(var b=arguments.length,A=new Array(b>1?b-1:0),L=1;L<b;L++)A[L-1]=arguments[L];S("error",u,A)}}function S(u,b,A){{var L=_.ReactDebugCurrentFrame,z=L.getStackAddendum();z!==""&&(b+="%s",A=A.concat([z]));var Z=A.map(function(N){return String(N)});Z.unshift("Warning: "+b),Function.prototype.apply.call(console[u],console,Z)}}var w=!1,x=!1,M=!1,D=!1,k=!1,R;R=Symbol.for("react.module.reference");function B(u){return!!(typeof u=="string"||typeof u=="function"||u===s||u===a||k||u===n||u===h||u===d||D||u===g||w||x||M||typeof u=="object"&&u!==null&&(u.$$typeof===m||u.$$typeof===f||u.$$typeof===r||u.$$typeof===l||u.$$typeof===c||u.$$typeof===R||u.getModuleId!==void 0))}function ge(u,b,A){var L=u.displayName;if(L)return L;var z=b.displayName||b.name||"";return z!==""?A+"("+z+")":A}function ue(u){return u.displayName||"Context"}function se(u){if(u==null)return null;if(typeof u.tag=="number"&&C("Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue."),typeof u=="function")return u.displayName||u.name||null;if(typeof u=="string")return u;switch(u){case s:return"Fragment";case t:return"Portal";case a:return"Profiler";case n:return"StrictMode";case h:return"Suspense";case d:return"SuspenseList"}if(typeof u=="object")switch(u.$$typeof){case l:var b=u;return ue(b)+".Consumer";case r:var A=u;return ue(A._context)+".Provider";case c:return ge(u,u.render,"ForwardRef");case f:var L=u.displayName||null;return L!==null?L:se(u.type)||"Memo";case m:{var z=u,Z=z._payload,N=z._init;try{return se(N(Z))}catch{return null}}}return null}var Q=Object.assign,X=0,Ae,le,fe,te,Pe,Re,De;function G(){}G.__reactDisabledLog=!0;function ae(){{if(X===0){Ae=console.log,le=console.info,fe=console.warn,te=console.error,Pe=console.group,Re=console.groupCollapsed,De=console.groupEnd;var u={configurable:!0,enumerable:!0,value:G,writable:!0};Object.defineProperties(console,{info:u,log:u,warn:u,error:u,group:u,groupCollapsed:u,groupEnd:u})}X++}}function be(){{if(X--,X===0){var u={configurable:!0,enumerable:!0,writable:!0};Object.defineProperties(console,{log:Q({},u,{value:Ae}),info:Q({},u,{value:le}),warn:Q({},u,{value:fe}),error:Q({},u,{value:te}),group:Q({},u,{value:Pe}),groupCollapsed:Q({},u,{value:Re}),groupEnd:Q({},u,{value:De})})}X<0&&C("disabledDepth fell below zero. This is a bug in React. Please file an issue.")}}var it=_.ReactCurrentDispatcher,Be;function Et(u,b,A){{if(Be===void 0)try{throw Error()}catch(z){var L=z.stack.trim().match(/\n( *(at )?)/);Be=L&&L[1]||""}return`
35
- `+Be+u}}var Yt=!1,St;{var Is=typeof WeakMap=="function"?WeakMap:Map;St=new Is}function xi(u,b){if(!u||Yt)return"";{var A=St.get(u);if(A!==void 0)return A}var L;Yt=!0;var z=Error.prepareStackTrace;Error.prepareStackTrace=void 0;var Z;Z=it.current,it.current=null,ae();try{if(b){var N=function(){throw Error()};if(Object.defineProperty(N.prototype,"props",{set:function(){throw Error()}}),typeof Reflect=="object"&&Reflect.construct){try{Reflect.construct(N,[])}catch(Ie){L=Ie}Reflect.construct(u,[],N)}else{try{N.call()}catch(Ie){L=Ie}u.call(N.prototype)}}else{try{throw Error()}catch(Ie){L=Ie}u()}}catch(Ie){if(Ie&&L&&typeof Ie.stack=="string"){for(var j=Ie.stack.split(`
36
- `),de=L.stack.split(`
37
- `),J=j.length-1,ie=de.length-1;J>=1&&ie>=0&&j[J]!==de[ie];)ie--;for(;J>=1&&ie>=0;J--,ie--)if(j[J]!==de[ie]){if(J!==1||ie!==1)do if(J--,ie--,ie<0||j[J]!==de[ie]){var _e=`
38
- `+j[J].replace(" at new "," at ");return u.displayName&&_e.includes("<anonymous>")&&(_e=_e.replace("<anonymous>",u.displayName)),typeof u=="function"&&St.set(u,_e),_e}while(J>=1&&ie>=0);break}}}finally{Yt=!1,it.current=Z,be(),Error.prepareStackTrace=z}var Ge=u?u.displayName||u.name:"",Ni=Ge?Et(Ge):"";return typeof u=="function"&&St.set(u,Ni),Ni}function Ls(u,b,A){return xi(u,!1)}function ks(u){var b=u.prototype;return!!(b&&b.isReactComponent)}function wt(u,b,A){if(u==null)return"";if(typeof u=="function")return xi(u,ks(u));if(typeof u=="string")return Et(u);switch(u){case h:return Et("Suspense");case d:return Et("SuspenseList")}if(typeof u=="object")switch(u.$$typeof){case c:return Ls(u.render);case f:return wt(u.type,b,A);case m:{var L=u,z=L._payload,Z=L._init;try{return wt(Z(z),b,A)}catch{}}}return""}var xt=Object.prototype.hasOwnProperty,Oi={},Ti=_.ReactDebugCurrentFrame;function Ot(u){if(u){var b=u._owner,A=wt(u.type,u._source,b?b.type:null);Ti.setExtraStackFrame(A)}else Ti.setExtraStackFrame(null)}function Us(u,b,A,L,z){{var Z=Function.call.bind(xt);for(var N in u)if(Z(u,N)){var j=void 0;try{if(typeof u[N]!="function"){var de=Error((L||"React class")+": "+A+" type `"+N+"` is invalid; it must be a function, usually from the `prop-types` package, but received `"+typeof u[N]+"`.This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`.");throw de.name="Invariant Violation",de}j=u[N](b,N,L,A,null,"SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED")}catch(J){j=J}j&&!(j instanceof Error)&&(Ot(z),C("%s: type specification of %s `%s` is invalid; the type checker function must return `null` or an `Error` but returned a %s. You may have forgotten to pass an argument to the type checker creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and shape all require an argument).",L||"React class",A,N,typeof j),Ot(null)),j instanceof Error&&!(j.message in Oi)&&(Oi[j.message]=!0,Ot(z),C("Failed %s type: %s",A,j.message),Ot(null))}}}var js=Array.isArray;function Gt(u){return js(u)}function Ns(u){{var b=typeof Symbol=="function"&&Symbol.toStringTag,A=b&&u[Symbol.toStringTag]||u.constructor.name||"Object";return A}}function Fs(u){try{return Mi(u),!1}catch{return!0}}function Mi(u){return""+u}function Ai(u){if(Fs(u))return C("The provided key is an unsupported type %s. This value must be coerced to a string before before using it here.",Ns(u)),Mi(u)}var st=_.ReactCurrentOwner,zs={key:!0,ref:!0,__self:!0,__source:!0},Pi,Ri,Zt;Zt={};function Hs(u){if(xt.call(u,"ref")){var b=Object.getOwnPropertyDescriptor(u,"ref").get;if(b&&b.isReactWarning)return!1}return u.ref!==void 0}function Vs(u){if(xt.call(u,"key")){var b=Object.getOwnPropertyDescriptor(u,"key").get;if(b&&b.isReactWarning)return!1}return u.key!==void 0}function Bs(u,b){if(typeof u.ref=="string"&&st.current&&b&&st.current.stateNode!==b){var A=se(st.current.type);Zt[A]||(C('Component "%s" contains the string ref "%s". Support for string refs will be removed in a future major release. This case cannot be automatically converted to an arrow function. We ask you to manually fix this case by using useRef() or createRef() instead. Learn more about using refs safely here: https://reactjs.org/link/strict-mode-string-ref',se(st.current.type),u.ref),Zt[A]=!0)}}function Ys(u,b){{var A=function(){Pi||(Pi=!0,C("%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://reactjs.org/link/special-props)",b))};A.isReactWarning=!0,Object.defineProperty(u,"key",{get:A,configurable:!0})}}function Gs(u,b){{var A=function(){Ri||(Ri=!0,C("%s: `ref` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://reactjs.org/link/special-props)",b))};A.isReactWarning=!0,Object.defineProperty(u,"ref",{get:A,configurable:!0})}}var Zs=function(u,b,A,L,z,Z,N){var j={$$typeof:e,type:u,key:b,ref:A,props:N,_owner:Z};return j._store={},Object.defineProperty(j._store,"validated",{configurable:!1,enumerable:!1,writable:!0,value:!1}),Object.defineProperty(j,"_self",{configurable:!1,enumerable:!1,writable:!1,value:L}),Object.defineProperty(j,"_source",{configurable:!1,enumerable:!1,writable:!1,value:z}),Object.freeze&&(Object.freeze(j.props),Object.freeze(j)),j};function Ws(u,b,A,L,z){{var Z,N={},j=null,de=null;A!==void 0&&(Ai(A),j=""+A),Vs(b)&&(Ai(b.key),j=""+b.key),Hs(b)&&(de=b.ref,Bs(b,z));for(Z in b)xt.call(b,Z)&&!zs.hasOwnProperty(Z)&&(N[Z]=b[Z]);if(u&&u.defaultProps){var J=u.defaultProps;for(Z in J)N[Z]===void 0&&(N[Z]=J[Z])}if(j||de){var ie=typeof u=="function"?u.displayName||u.name||"Unknown":u;j&&Ys(N,ie),de&&Gs(N,ie)}return Zs(u,j,de,z,L,st.current,N)}}var Wt=_.ReactCurrentOwner,Di=_.ReactDebugCurrentFrame;function Ye(u){if(u){var b=u._owner,A=wt(u.type,u._source,b?b.type:null);Di.setExtraStackFrame(A)}else Di.setExtraStackFrame(null)}var Xt;Xt=!1;function qt(u){return typeof u=="object"&&u!==null&&u.$$typeof===e}function Ii(){{if(Wt.current){var u=se(Wt.current.type);if(u)return`
39
-
40
- Check the render method of \``+u+"`."}return""}}function Xs(u){{if(u!==void 0){var b=u.fileName.replace(/^.*[\\\/]/,""),A=u.lineNumber;return`
41
-
42
- Check your code at `+b+":"+A+"."}return""}}var Li={};function qs(u){{var b=Ii();if(!b){var A=typeof u=="string"?u:u.displayName||u.name;A&&(b=`
43
-
44
- Check the top-level render call using <`+A+">.")}return b}}function ki(u,b){{if(!u._store||u._store.validated||u.key!=null)return;u._store.validated=!0;var A=qs(b);if(Li[A])return;Li[A]=!0;var L="";u&&u._owner&&u._owner!==Wt.current&&(L=" It was passed a child from "+se(u._owner.type)+"."),Ye(u),C('Each child in a list should have a unique "key" prop.%s%s See https://reactjs.org/link/warning-keys for more information.',A,L),Ye(null)}}function Ui(u,b){{if(typeof u!="object")return;if(Gt(u))for(var A=0;A<u.length;A++){var L=u[A];qt(L)&&ki(L,b)}else if(qt(u))u._store&&(u._store.validated=!0);else if(u){var z=T(u);if(typeof z=="function"&&z!==u.entries)for(var Z=z.call(u),N;!(N=Z.next()).done;)qt(N.value)&&ki(N.value,b)}}}function Qs(u){{var b=u.type;if(b==null||typeof b=="string")return;var A;if(typeof b=="function")A=b.propTypes;else if(typeof b=="object"&&(b.$$typeof===c||b.$$typeof===f))A=b.propTypes;else return;if(A){var L=se(b);Us(A,u.props,"prop",L,u)}else if(b.PropTypes!==void 0&&!Xt){Xt=!0;var z=se(b);C("Component %s declared `PropTypes` instead of `propTypes`. Did you misspell the property assignment?",z||"Unknown")}typeof b.getDefaultProps=="function"&&!b.getDefaultProps.isReactClassApproved&&C("getDefaultProps is only used on classic React.createClass definitions. Use a static property named `defaultProps` instead.")}}function Ks(u){{for(var b=Object.keys(u.props),A=0;A<b.length;A++){var L=b[A];if(L!=="children"&&L!=="key"){Ye(u),C("Invalid prop `%s` supplied to `React.Fragment`. React.Fragment can only have `key` and `children` props.",L),Ye(null);break}}u.ref!==null&&(Ye(u),C("Invalid attribute `ref` supplied to `React.Fragment`."),Ye(null))}}function ji(u,b,A,L,z,Z){{var N=B(u);if(!N){var j="";(u===void 0||typeof u=="object"&&u!==null&&Object.keys(u).length===0)&&(j+=" You likely forgot to export your component from the file it's defined in, or you might have mixed up default and named imports.");var de=Xs(z);de?j+=de:j+=Ii();var J;u===null?J="null":Gt(u)?J="array":u!==void 0&&u.$$typeof===e?(J="<"+(se(u.type)||"Unknown")+" />",j=" Did you accidentally export a JSX literal instead of a component?"):J=typeof u,C("React.jsx: type is invalid -- expected a string (for built-in components) or a class/function (for composite components) but got: %s.%s",J,j)}var ie=Ws(u,b,A,z,Z);if(ie==null)return ie;if(N){var _e=b.children;if(_e!==void 0)if(L)if(Gt(_e)){for(var Ge=0;Ge<_e.length;Ge++)Ui(_e[Ge],u);Object.freeze&&Object.freeze(_e)}else C("React.jsx: Static children should always be an array. You are likely explicitly calling React.jsxs or React.jsxDEV. Use the Babel transform instead.");else Ui(_e,u)}return u===s?Ks(ie):Qs(ie),ie}}function $s(u,b,A){return ji(u,b,A,!0)}function Js(u,b,A){return ji(u,b,A,!1)}var en=Js,tn=$s;at.Fragment=s,at.jsx=en,at.jsxs=tn}()),at}process.env.NODE_ENV==="production"?mi.exports=Zn():mi.exports=Wn();var p=mi.exports;function Ei(i){return i.title.search("<")>-1?p.jsx("button",{className:"svg",dangerouslySetInnerHTML:{__html:i.title}}):p.jsx("button",{children:i.title})}const Xn=p.jsxs("svg",{className:"closeIcon",width:"14",height:"14",fill:"none",stroke:"#666666",strokeMiterlimit:"10",children:[p.jsx("circle",{cx:"7",cy:"7",r:"6"}),p.jsx("line",{x1:"4",y1:"4",x2:"10",y2:"10"}),p.jsx("line",{x1:"4",y1:"10",x2:"10",y2:"4"})]}),qn=p.jsx("svg",{className:"dragIcon",width:"14",height:"14",fill:"#666666",stroke:"none",children:p.jsx("path",{d:`M10.43,4H3.57C3.26,4,3,4.22,3,4.5v1C3,5.78,3.26,6,3.57,6h6.86C10.74,6,11,5.78,11,5.5v-1\r
45
- C11,4.22,10.74,4,10.43,4z M10.43,8H3.57C3.26,8,3,8.22,3,8.5v1C3,9.78,3.26,10,3.57,10h6.86C10.74,10,11,9.78,11,9.5v-1\r
46
- C11,8.22,10.74,8,10.43,8z`})});function Es(i){return p.jsx("li",{className:`reorder-item ${i.draggingIndex===i.index?"dragging":""}`,draggable:!0,onDragStart:()=>i.onDragStart(i.index),onDragOver:e=>{e.preventDefault(),i.onDragOver(i.index)},onDragEnd:i.onDragEnd,children:p.jsxs("div",{children:[qn,p.jsx("span",{children:i.title}),p.jsx("button",{className:"closeIcon",onClick:()=>i.onDelete(i.index),children:Xn})]})})}function Ss(i){const[e,t]=O.useState(!1),[s,n]=O.useState(i.options),[a,r]=O.useState(null),l=g=>{i.onDragComplete(g),n(g)},c=g=>{const E=[...s];E.splice(g,1),l(E)},h=g=>{r(g)},d=g=>{if(a===g||a===null)return;const E=[...s],y=E.splice(a,1)[0];E.splice(g,0,y),r(g),n(E)},f=()=>{i.onDragComplete(s),r(null)};let m="dropdown draggable";return i.subdropdown&&(m+=" subdropdown"),p.jsxs("div",{className:m,onMouseEnter:()=>t(!0),onMouseLeave:()=>t(!1),children:[p.jsx(Ei,{title:i.title}),p.jsx("ul",{className:"reorder-list",style:{display:e?"block":"none"},children:s.map((g,E)=>p.jsx(Es,{title:g,index:E,draggingIndex:a,onDelete:c,onDragStart:h,onDragOver:d,onDragEnd:f},g))})]})}function ws(i){const[e,t]=O.useState(!1),s=[];i.options.map((a,r)=>{i.onSelect!==void 0&&(a.onSelect=i.onSelect),s.push(p.jsx(xs,{option:a},r))});let n="dropdown";return i.subdropdown&&(n+=" subdropdown"),p.jsxs("div",{className:n,onMouseEnter:()=>t(!0),onMouseLeave:()=>t(!1),children:[p.jsx(Ei,{title:i.title}),p.jsx("ul",{style:{visibility:e?"visible":"hidden"},children:s})]})}function xs(i){const{option:e}=i,[t,s]=O.useState("");let n;switch(e.type){case"draggable":n=p.jsx(Ss,{title:e.title,options:e.value,onDragComplete:a=>{e.onDragComplete!==void 0&&e.onDragComplete(a)},subdropdown:!0});break;case"dropdown":n=p.jsx(ws,{title:e.title,options:e.value,onSelect:e.onSelect,subdropdown:!0});break;case"option":n=p.jsx("button",{onClick:()=>{e.onSelect!==void 0&&e.onSelect(e.value),e.selectable&&(t!==e.title?s(e.title):s(""))},children:e.title});break}return p.jsx("li",{className:t===e.title?"selected":"",children:n},fs())}function bt(i){const[e,t]=O.useState(i.open!==void 0?i.open:!0),s=!e||i.children===void 0,n=()=>{i.app.dispatchEvent({type:P.REMOVE_SCENE,value:i.scene})};return p.jsxs("div",{className:`accordion ${s?"hide":""}`,children:[p.jsxs("button",{className:"toggle",onClick:()=>{const a=!e;i.onToggle!==void 0&&i.onToggle(a),t(a)},children:[p.jsx("p",{className:`status ${e?"open":""}`,children:"Toggle"}),p.jsx("p",{className:"label",children:Ct(i.label)})]}),i.onRefresh?p.jsxs(p.Fragment,{children:[p.jsx("button",{className:"refresh",onClick:i.onRefresh}),p.jsx("button",{className:"remove",onClick:n})]}):null,i.button,p.jsx("div",{className:e?"open":"",children:p.jsx("div",{children:i.children})},Math.random())]})}function Si(i){const e=O.useRef(null),[t,s]=O.useState(!1),n=i.child!==void 0&&i.child.children.length>0,a=[];return i.child!==void 0&&i.child.children.length>0&&i.child.children.map((r,l)=>{a.push(p.jsx(Si,{app:i.app,child:r,three:i.three},l))}),O.useEffect(()=>{if(i.child){const r=i.three.getScene(i.child.uuid);if(r!==null){const l=r.getObjectByProperty("uuid",i.child.uuid);l!==void 0&&(e.current.style.opacity=l.visible?"1":"0.25")}}},[t]),p.jsx(p.Fragment,{children:i.child!==void 0&&p.jsxs("div",{className:"childObject",children:[p.jsxs("div",{className:"child",children:[n?p.jsx("button",{className:"status",style:{backgroundPositionX:t?"-14px":"2px"},onClick:()=>{s(!t)}}):null,p.jsx("button",{className:"name",style:{left:n?"20px":"5px"},onClick:()=>{i.child!==void 0&&(i.three.getObject(i.child.uuid),t||s(!0))},children:i.child.name.length>0?`${i.child.name} (${i.child.type})`:`${i.child.type}::${i.child.uuid}`}),p.jsx("button",{className:"visibility",ref:e,onClick:()=>{if(i.child){const r=i.three.getScene(i.child.uuid);if(r!==null){const l=r.getObjectByProperty("uuid",i.child.uuid);if(l!==void 0){const c="visible",h=!l.visible;e.current.style.opacity=h?"1":"0.25",i.three.updateObject(i.child.uuid,c,h),ee(l,c,h)}}}}}),p.jsx("div",{className:`icon ${zn(i.child)}`})]}),p.jsx("div",{className:t?"open":"",children:p.jsx("div",{className:"container",children:a})})]},Math.random())})}function fi(i){const e=[];return i.child?.children.map((t,s)=>{e.push(p.jsx(Si,{app:i.app,child:t,scene:i.scene,three:i.three},s))}),p.jsx("div",{className:`scene ${i.class!==void 0?i.class:""}`,children:e})}function mt(i){const[e,t]=O.useState(i.defaultValue);return O.useEffect(()=>{let s=!1,n=-1,a=0,r=i.defaultValue,l=!1;const c=g=>{l=g.ctrlKey},h=g=>{s=!0,a=Number(i.input.current?.value),n=g.clientX,document.addEventListener("mouseup",f,!1),document.addEventListener("mousemove",d,!1),document.addEventListener("contextmenu",f,!1)},d=g=>{if(!s)return;const E=i.step!==void 0?i.step:1,y=(g.clientX-n)*E*(l?10:1);r=Number((a+y).toFixed(4)),i.min!==void 0&&(r=Math.max(r,i.min)),i.max!==void 0&&(r=Math.min(r,i.max)),i.onChange!==void 0&&i.onChange(r),t(r)},f=()=>{s=!1,document.removeEventListener("mouseup",f),document.removeEventListener("mousemove",d),document.removeEventListener("contextmenu",f)},m=g=>{const E=Number(g.target.value);i.onChange!==void 0&&i.onChange(E),t(E)};return i.label.current?.addEventListener("mousedown",h,!1),i.sliderRef!==void 0&&i.sliderRef.current?.addEventListener("input",m),document.addEventListener("keydown",c,!1),document.addEventListener("keyup",c,!1),()=>{i.label.current?.removeEventListener("mousedown",h),i.sliderRef!==void 0&&i.sliderRef.current?.removeEventListener("input",m),document.removeEventListener("mouseup",f),document.removeEventListener("mousemove",d),document.removeEventListener("contextmenu",f),document.removeEventListener("keydown",c),document.addEventListener("keyup",c,!1)}},[]),e}function Ve(i){const e=O.useRef(null),t=O.useRef(null),[s,n]=O.useState(i.value);return mt({label:i.labelRef,input:e,sliderRef:t,defaultValue:s,min:i.min,max:i.max,step:i.step,onChange:a=>{n(a),i.onChange!==void 0&&i.onChange(i.prop,a)}}),p.jsxs(p.Fragment,{children:[i.type==="number"&&p.jsx("input",{alt:i.alt,className:i.className,ref:e,type:"number",value:s,min:i.min,max:i.max,step:i.step,disabled:i.disabled,onChange:a=>{if(n(a.target.value),a.target.value.length===0)return;const r=Number(a.target.value);isNaN(r)||i.onChange!==void 0&&i.onChange(i.prop,r)}}),i.type==="range"&&p.jsxs(p.Fragment,{children:[p.jsx("input",{type:"text",value:s.toString(),disabled:i.disabled,ref:e,className:"min",onChange:a=>{if(a.target.value.length===0)return;const r=Number(a.target.value);isNaN(r)||i.onChange!==void 0&&i.onChange(i.prop,r)}}),p.jsx("input",{disabled:i.disabled,type:"range",value:s,min:i.min,max:i.max,step:i.step,ref:t,onChange:yt})]})]})}function Qn(i){const e=O.useRef(null),t=O.useRef(null),s=O.useRef(null),n=O.useRef(null),a=O.useRef(null),r=O.useRef(null),l=O.useRef(null),c=O.useRef(null),h=O.useRef(null),d=O.useRef(null),[f,m]=O.useState(i.value.x),[g,E]=O.useState(i.value.y),[y,T]=O.useState({min:Math.min(i.min,Math.min(i.value.x,i.value.y)),max:Math.max(i.max,Math.max(i.value.x,i.value.y))}),[_,C]=O.useState(!1);mt({label:l,input:e,defaultValue:f,min:y.min,max:y.max,step:.01,onChange:R=>{m(R),i.onChange({target:{value:{x:R,y:g}}})}}),mt({label:c,input:t,defaultValue:g,min:y.min,max:y.max,step:.01,onChange:R=>{E(R),i.onChange({target:{value:{x:f,y:R}}})}}),mt({label:h,input:s,defaultValue:y.min,min:y.min-1,max:y.max+1,step:.01,onChange:R=>{T({min:R,max:y.max})}}),mt({label:d,input:n,defaultValue:y.max,min:y.min-1,max:y.max+1,step:.01,onChange:R=>{T({min:y.min,max:R})}});function S(){_||(window.addEventListener("mousemove",x),window.addEventListener("mouseup",w),C(!0))}function w(){window.removeEventListener("mousemove",x),window.removeEventListener("mouseup",w),C(!1)}function x(R){const B=a.current.getBoundingClientRect(),ge=Ue(0,99,R.clientX-B.left)/99,ue=1-Ue(0,99,R.clientY-B.top)/99,se=ye(tt(y.min,y.max,ge),3),Q=ye(tt(y.min,y.max,ue),3);i.onChange({target:{value:{x:se,y:Q}}}),m(se),E(Q)}function M(){const R=Number(s.current.value);T({min:R,max:y.max}),f<R&&m(Ue(R,y.max,f)),g<R&&E(Ue(R,y.max,g))}function D(){const R=Number(n.current.value);T({min:y.min,max:R}),f>R&&m(Ue(y.min,R,f)),g>R&&E(Ue(y.min,R,g))}O.useEffect(()=>{r.current.style.left=`${Nt(y.min,y.max,f)*100}%`,r.current.style.top=`${(1-Nt(y.min,y.max,g))*100}%`},[y,f,g]);const k=i.step!==void 0?i.step:.01;return p.jsxs("div",{className:"vector2",children:[p.jsxs("div",{className:"fields",children:[p.jsxs("div",{children:[p.jsx("label",{ref:l,children:"X"}),p.jsx("input",{ref:e,type:"number",value:f,min:y.min,max:y.max,step:k,onChange:R=>{if(m(R.target.value),R.target.value.length===0)return;const B=Number(R.target.value);isNaN(B)||(i.onChange({target:{value:{x:B,y:g}}}),B<y.min&&T({min:B,max:y.max}))}})]}),p.jsxs("div",{children:[p.jsx("label",{ref:c,children:"Y"}),p.jsx("input",{ref:t,type:"number",value:g,min:y.min,max:y.max,step:k,onChange:R=>{if(E(R.target.value),R.target.value.length===0)return;const B=Number(R.target.value);isNaN(B)||(i.onChange({target:{value:{x:f,y:B}}}),B>y.max&&T({min:y.min,max:B}))}})]}),p.jsxs("div",{children:[p.jsx("label",{ref:h,children:"Min"}),p.jsx("input",{ref:s,type:"number",value:y.min,step:k,onChange:M})]}),p.jsxs("div",{children:[p.jsx("label",{ref:d,children:"Max"}),p.jsx("input",{ref:n,type:"number",value:y.max,step:k,onChange:D})]})]}),p.jsxs("div",{className:"input",ref:a,onMouseDown:S,onMouseUp:w,children:[p.jsx("div",{className:"x"}),p.jsx("div",{className:"y"}),p.jsx("div",{className:"pt",ref:r})]})]})}const Kn=Math.PI/180,$n=180/Math.PI;function Xe(i,e,t,s,n){return s+(i-e)*(n-s)/(t-e)}function qe(i,e,t){return(1-t)*i+t*e}function gi(i){return i*Kn}function Jn(i){return i*$n}function Yi(i){const e=i.value.x!==void 0&&i.value.y!==void 0&&i.value.z!==void 0,t=i.value.isEuler!==void 0,s=i.value.elements!==void 0,n=i.step!==void 0?i.step:.01,a=[];if(t){const r=O.useMemo(()=>i.value,[]);["_x","_y","_z"].forEach(c=>{const h=O.useRef(null);a.push(p.jsxs("div",{children:[p.jsx("label",{ref:h,children:c.substring(1).toUpperCase()}),p.jsx(Ve,{value:Jn(r[c]),type:"number",prop:c,step:.1,labelRef:h,onChange:(d,f)=>{r[d]=gi(f),i.onChange({target:{value:r}})}})]},c))})}else if(e){const r=O.useMemo(()=>i.value,[]),l=(h,d)=>{r[h]=d,i.onChange({target:{value:r}})};["x","y","z"].forEach(h=>{const d=O.useRef(null);a.push(p.jsxs("div",{children:[p.jsx("label",{ref:d,children:h.toUpperCase()}),p.jsx(Ve,{value:r[h],type:"number",prop:h,step:n,labelRef:d,onChange:l})]},h))})}else if(s){const r=O.useMemo(()=>i.value,[]),l=(c,h)=>{const d=Number(c);r.elements[d]=h,i.onChange({target:{value:r}})};for(let c=0;c<9;c++){const h=O.useRef(null);a.push(p.jsxs("div",{children:[p.jsx("label",{ref:h,children:c+1}),p.jsx(Ve,{value:r.elements[c],type:"number",prop:c.toString(),step:n,labelRef:h,onChange:l})]},c.toString()))}}return p.jsx("div",{className:"grid3",children:a},Math.random().toString())}function ea(i){const e=i.value.x!==void 0,t=i.step!==void 0?i.step:.01,s=[];if(e){const n=O.useMemo(()=>i.value,[]),a=(l,c)=>{n[l]=c,i.onChange({target:{value:n}})};["x","y","z","w"].forEach(l=>{const c=O.useRef(null);s.push(p.jsxs("div",{children:[p.jsx("label",{ref:c,children:l.toUpperCase()}),p.jsx(Ve,{value:n[l],type:"number",prop:l,step:t,labelRef:c,onChange:a})]},l))})}else{const n=O.useMemo(()=>i.value,[]),a=(r,l)=>{const c=Number(r);n.elements[c]=l,i.onChange({target:{value:n}})};for(let r=0;r<16;r++){const l=O.useRef(null);s.push(p.jsxs("div",{children:[p.jsx("label",{ref:l,children:r+1}),p.jsx(Ve,{value:n.elements[r],type:"number",prop:r.toString(),step:t,labelRef:l,onChange:a})]},r.toString()))}}return p.jsx("div",{className:"grid4",children:s})}function ta(i){return!(i==="defaultAttributeValues"||i==="forceSinglePass"||i==="linecap"||i==="linejoin"||i==="linewidth"||i==="normalMapType"||i==="precision"||i==="shadowSide"||i==="uniformsGroups"||i==="uniformsNeedUpdate"||i==="userData"||i==="version"||i==="wireframeLinecap"||i==="wireframeLinejoin"||i==="wireframeLinewidth"||i.slice(0,4)==="clip"||i.slice(0,7)==="polygon"||i.slice(0,7)==="stencil"||i.slice(0,2)==="is")}function ia(i){switch(i){case"Alpha Map":return"alphaMap";case"Anisotropy Map":return"anisotropyMap";case"AO Map":return"aoMap";case"Bump Map":return"bumpMap";case"Clearcoat Map":return"clearcoatMap";case"Clearcoat Normal Map":return"clearcoatNormalMap";case"Clearcoat Roughness Map":return"clearcoatRoughnessMap";case"Displacement Map":return"displacementMap";case"Emissive Map":return"emissiveMap";case"Gradient Map":return"gradientMap";case"Iridescence Map":return"iridescenceMap";case"Iridescence Thickness Map":return"iridescenceThicknessMap";case"Map":return"map";case"Matcap":return"matcap";case"Normal Map":return"normalMap";case"Roughness Map":return"roughnessMap";case"Sheen Color Map":return"sheenColorMap";case"Sheen Roughness Map":return"sheenRoughnessMap";case"Specular Color Map":return"specularColorMap";case"Specular Map Intensity":return"specularIntensityMap";case"Thickness Map":return"thicknessMap";case"Transmission Map":return"transmissionMap"}return i}function Vt(i){switch(i){case"alphaHash":return"Alpha Hash";case"alphaMap":return"Alpha Map";case"alphaToCoverage":return"Alpha To Coverage";case"anisotropy":return"Anisotropy";case"anisotropyMap":return"Anisotropy Map";case"anisotropyRotation":return"Anisotropy Rotation";case"aoMap":return"AO Map";case"aoMapIntensity":return"AO Map Intensity";case"attenuationColor":return"Attenuation Color";case"attenuationDistance":return"Attenuation Distance";case"blendAlpha":return"Blend Alpha";case"blendColor":return"Blend Color";case"blendDst":return"Blend Dst";case"blendDstAlpha":return"Blend Dst Alha";case"blendEquation":return"Blend Equation";case"blendEquationAlpha":return"Blend Equation Alpha";case"blending":return"Blending";case"blendSrc":return"Blend Src";case"blendSrcAlpha":return"Blend Src Alpha";case"bumpMap":return"Bump Map";case"bumpScale":return"Bump Scale";case"clearcoat":return"Clearcoat";case"clearcoatMap":return"Clearcoat Map";case"clearcoatNormalMap":return"Clearcoat Normal Map";case"clearcoatNormalScale":return"Clearcoat Normal Scale";case"clearcoatRoughness":return"Clearcoat Roughness";case"clearcoatRoughnessMap":return"Clearcoat Roughness Map";case"color":return"Color";case"colorWrite":return"Color Write";case"defines":return"Defines";case"depthFunc":return"Depth Func";case"depthTest":return"Depth Test";case"depthWrite":return"Depth Write";case"dispersion":return"Dispersion";case"displacementBias":return"Displacement Bias";case"displacementMap":return"Displacement Map";case"displacementScale":return"Displacement Scale";case"dithering":return"Dithering";case"emissive":return"Emissive";case"emissiveMap":return"Emissive Map";case"emissiveIntensity":return"Emissive Intensity";case"envMap":return"Environment Map";case"envMapIntensity":return"Environment Map Intensity";case"envMapRotation":return"Environment Map Rotation";case"extensions":return"Extensions";case"flatShading":return"Flat Shading";case"fragmentShader":return"Fragment Shader";case"fog":return"Fog";case"glslVersion":return"GLSL Version";case"gradientMap":return"Gradient Map";case"ior":return"IOR";case"iridescence":return"Iridescence";case"iridescenceIOR":return"Iridescence IOR";case"iridescenceMap":return"Iridescence Map";case"iridescenceThicknessMap":return"Iridescence Thickness Map";case"iridescenceThicknessRange":return"Iridescence Thickness Range";case"lights":return"Lights";case"lightMap":return"Light Map";case"lightMapIntensity":return"Light Map Intensity";case"map":return"Map";case"matcap":return"Matcap";case"metalness":return"Metalness";case"metalnessMap":return"Metalness Map";case"name":return"Name";case"normalMap":return"Normal Map";case"normalScale":return"Normal Scale";case"premultipliedAlpha":return"Premultiplied Alpha";case"opacity":return"Opacity";case"reflectivity":return"Reflectivity";case"refractionRatio":return"Refraction Ratio";case"roughness":return"Roughness";case"roughnessMap":return"Roughness Map";case"sheen":return"Sheen";case"sheenColor":return"Sheen Color";case"sheenColorMap":return"Sheen Color Map";case"sheenRoughness":return"Sheen Roughness";case"sheenRoughnessMap":return"Sheen Roughness Map";case"shininess":return"Shininess";case"side":return"Side";case"size":return"Size";case"sizeAttenuation":return"Size Attenuation";case"specular":return"Specular";case"specularColor":return"Specular Color";case"specularColorMap":return"Specular Color Map";case"specularIntensity":return"Specular Intensity";case"specularIntensityMap":return"Specular Map Intensity";case"thickness":return"Thickness";case"thicknessMap":return"Thickness Map";case"toneMapped":return"Tone Mapped";case"transmission":return"Transmission";case"transmissionMap":return"Transmission Map";case"transparent":return"Transparent";case"type":return"Type";case"uuid":return"UUID";case"uniforms":return"Uniforms";case"vertexColors":return"Vertex Colors";case"vertexShader":return"Vertex Shader";case"visible":return"Visible";case"wireframe":return"Wireframe"}return i}function Os(i){const e=i.toLowerCase();return e.search("intensity")>-1||e==="anisotropyrotation"||e==="blendalpha"||e==="bumpscale"||e==="clearcoatroughness"||e==="displacementbias"||e==="displacementscale"||e==="metalness"||e==="opacity"||e==="reflectivity"||e==="refractionratio"||e==="roughness"||e==="sheenroughness"}function sa(){const i=document.createElement("input");return i.type="file",new Promise((e,t)=>{i.addEventListener("change",function(){if(i.files===null)t();else{const s=i.files[0],n=new FileReader;n.onload=function(a){e(a.target.result)},n.readAsDataURL(s)}}),i.click()})}const na=[{title:"Front",value:o.FrontSide},{title:"Back",value:o.BackSide},{title:"Double",value:o.DoubleSide}],aa=[{title:"No Blending",value:o.NoBlending},{title:"Normal",value:o.NormalBlending},{title:"Additive",value:o.AdditiveBlending},{title:"Subtractive",value:o.SubtractiveBlending},{title:"Multiply",value:o.MultiplyBlending},{title:"Custom",value:o.CustomBlending}],ra=[{title:"Add",value:o.AddEquation},{title:"Subtract",value:o.SubtractEquation},{title:"Reverse Subtract",value:o.ReverseSubtractEquation},{title:"Min",value:o.MinEquation},{title:"Max",value:o.MaxEquation}],oa=[{title:"Zero",value:o.ZeroFactor},{title:"One",value:o.OneFactor},{title:"Src Color",value:o.SrcColorFactor},{title:"One Minus Src Color",value:o.OneMinusSrcColorFactor},{title:"Src Alpha",value:o.SrcAlphaFactor},{title:"One Minus Src Alpha",value:o.OneMinusSrcAlphaFactor},{title:"Dst Alpha",value:o.DstAlphaFactor},{title:"One Minus Dst Alpha",value:o.OneMinusDstAlphaFactor},{title:"Dst Color",value:o.DstColorFactor},{title:"One Minus Dst Color",value:o.OneMinusDstColorFactor},{title:"Src Alpha Saturate",value:o.SrcAlphaSaturateFactor},{title:"Constant Color",value:o.ConstantColorFactor},{title:"One Minus Constant Color",value:o.OneMinusConstantColorFactor},{title:"Constant Alpha",value:o.ConstantAlphaFactor},{title:"One Minus Constant Alpha",value:o.OneMinusConstantAlphaFactor}],la=[{title:"Zero",value:o.ZeroFactor},{title:"One",value:o.OneFactor},{title:"Src Color",value:o.SrcColorFactor},{title:"One Minus Src Color",value:o.OneMinusSrcColorFactor},{title:"Src Alpha",value:o.SrcAlphaFactor},{title:"One Minus Src Alpha",value:o.OneMinusSrcAlphaFactor},{title:"Dst Alpha",value:o.DstAlphaFactor},{title:"One Minus Dst Alpha",value:o.OneMinusDstAlphaFactor},{title:"Dst Color",value:o.DstColorFactor},{title:"One Minus Dst Color",value:o.OneMinusDstColorFactor},{title:"Constant Color",value:o.ConstantColorFactor},{title:"One Minus Constant Color",value:o.OneMinusConstantColorFactor},{title:"Constant Alpha",value:o.ConstantAlphaFactor},{title:"One Minus Constant Alpha",value:o.OneMinusConstantAlphaFactor}];function rt(i,e){i.needsUpdate=!0,i.type="option",i.options=e}function ca(i,e,t,s){return{type:"boolean",title:Vt(i),prop:i,value:e,needsUpdate:!0,onChange:(n,a)=>{s.updateObject(t.uuid,`material.${i}`,a),s.updateObject(t.uuid,"material.needsUpdate",!0);const r=s.getScene(t.uuid);if(r!==null){const l=r.getObjectByProperty("uuid",t.uuid);ee(l,`material.${i}`,a)}}}}function ha(i,e,t,s){const n={type:"number",title:Vt(i),prop:i,value:e,min:void 0,max:void 0,step:.01,needsUpdate:!0,onChange:(a,r)=>{s.updateObject(t.uuid,`material.${i}`,r),s.updateObject(t.uuid,"material.needsUpdate",!0);const l=s.getScene(t.uuid);if(l!==null){const c=l.getObjectByProperty("uuid",t.uuid);ee(c,`material.${i}`,r)}}};switch(i){case"blending":rt(n,aa);break;case"blendDst":rt(n,la);break;case"blendEquation":rt(n,ra);break;case"blendSrc":rt(n,oa);break;case"side":rt(n,na);break}return Os(i)&&(n.value=Number(e),n.type="range",n.min=Math.min(0,n.value),n.max=Math.max(1,n.value),n.step=.01),n}function da(i,e,t,s){const n={type:"string",title:Vt(i),prop:i,value:e,needsUpdate:!0,onChange:(r,l)=>{s.updateObject(t.uuid,`material.${i}`,l),s.updateObject(t.uuid,"material.needsUpdate",!0);const c=s.getScene(t.uuid);if(c!==null){const h=c.getObjectByProperty("uuid",t.uuid);ee(h,`material.${i}`,l)}},onKeyDown:r=>{}};return(i==="vertexShader"||i==="fragmentShader")&&(n.disabled=!1,n.latest=n.value,n.onChange=(r,l)=>{n.latest=l,s.updateObject(t.uuid,`material.${i}`,l);const c=s.getScene(t.uuid);if(c!==null){const h=c.getObjectByProperty("uuid",t.uuid);ee(h,`material.${i}`,l)}},n.onKeyDown=r=>{if(r.key==="Enter"&&(r.altKey||r.metaKey)){s.updateObject(t.uuid,"material.needsUpdate",!0);const l=s.getScene(t.uuid);if(l!==null){const c=l.getObjectByProperty("uuid",t.uuid);ee(c,"material.needsUpdate",!0)}}}),n}function ua(i){return i.x!==void 0&&i.y!==void 0&&i.z===void 0}function pa(i){return i.x!==void 0&&i.y!==void 0&&i.z!==void 0&&i.w===void 0}function ma(i){return i.x!==void 0&&i.y!==void 0&&i.z!==void 0&&i.w!==void 0}function _i(i){i.sort((e,t)=>e.title<t.title?-1:e.title>t.title?1:0)}function ft(i,e,t,s,n="",a=!1){const r=Vt(i).split(".")[0].replaceAll("[","").replaceAll("]",""),l=n.length>0?`${n}.${i}`:i,c=typeof e;if(c==="boolean"||c==="string")return{title:r,prop:l,type:c,value:e,disabled:a,onChange:(h,d)=>{s.updateObject(t.uuid,`material.${l}`,d);const f=s.getScene(t.uuid);if(f!==null){const m=f.getObjectByProperty("uuid",t.uuid);ee(m,`material.${l}`,d)}}};if(c==="number"){const h={title:r,prop:l,type:"number",value:e,step:.01,disabled:a,onChange:(d,f)=>{s.updateObject(t.uuid,`material.${l}`,f);const m=s.getScene(t.uuid);if(m!==null){const g=m.getObjectByProperty("uuid",t.uuid);ee(g,`material.${l}`,f)}}};return Os(r)&&(h.type="range",h.min=0,h.max=1),h}else{if(e.isColor)return{title:r,prop:l,type:"color",value:e,disabled:a,onChange:(h,d)=>{const f=new o.Color(d);s.updateObject(t.uuid,`material.${l}`,f);const m=s.getScene(t.uuid);if(m!==null){const g=m.getObjectByProperty("uuid",t.uuid);ee(g,`material.${l}`,f)}}};if(Array.isArray(e)){const h=[];for(const d in e){const f=e[d],m=`[${d.toString()}]`;if(f.value!==void 0){const g=ft(`${m}.value`,f.value,t,s,l,a);g!==void 0&&h.push(g)}else{const g=ft(m,f,t,s,l,a);g!==void 0&&h.push(g)}}if(h.length>0)return _i(h),{title:r,items:h}}else{if(ua(e))return{title:r,prop:l,type:"vector2",value:e,disabled:a,onChange:(h,d)=>{s.updateObject(t.uuid,`material.${l}`,d);const f=s.getScene(t.uuid);if(f!==null){const m=f.getObjectByProperty("uuid",t.uuid);ee(m,`material.${l}`,d)}}};if(pa(e))return{title:r,prop:l,type:"grid3",value:e,disabled:a,onChange:(h,d)=>{s.updateObject(t.uuid,`material.${l}`,d);const f=s.getScene(t.uuid);if(f!==null){const m=f.getObjectByProperty("uuid",t.uuid);ee(m,`material.${l}`,d)}}};if(ma(e))return{title:r,prop:l,type:"grid4",value:e,disabled:a,onChange:(h,d)=>{s.updateObject(t.uuid,`material.${l}`,d);const f=s.getScene(t.uuid);if(f!==null){const m=f.getObjectByProperty("uuid",t.uuid);ee(m,`material.${l}`,d)}}};if(e.isEuler)return{title:r,prop:l,type:"euler",value:e,disabled:a,onChange:(h,d)=>{s.updateObject(t.uuid,`material.${l}`,d);const f=s.getScene(t.uuid);if(f!==null){const m=f.getObjectByProperty("uuid",t.uuid);ee(m,`material.${l}`,d)}}};if(e.src!==void 0)return{title:r,type:"image",value:e,disabled:a,onChange:(h,d)=>{const f=ia(i),m=n.length>0?`${n}.${f}`:f;s.createTexture(t.uuid,`material.${m}`,d);const g=s.getScene(t.uuid);if(g!==null){const E=g.getObjectByProperty("uuid",t.uuid);if(E!==void 0){const y=T=>{const _=E.material,C=m.split(".");switch(C.length){case 1:_[C[0]]=T;break;case 2:_[C[0]][C[1]]=T;break;case 3:_[C[0]][C[1]][C[2]]=T;break;case 4:_[C[0]][C[1]][C[2]][C[3]]=T;break;case 5:_[C[0]][C[1]][C[2]][C[3]][C[4]]=T;break}_.needsUpdate=!0};d.src.length>0?bs(d.src).then(T=>{T.offset.set(d.offset[0],d.offset[1]),T.repeat.set(d.repeat[0],d.repeat[1]),y(T)}):y(null)}}}};if(e.elements!==void 0)return{title:r,prop:l,type:e.elements.length>9?"grid4":"grid3",value:e,disabled:a,onChange:(h,d)=>{s.updateObject(t.uuid,`material.${l}`,d);const f=s.getScene(t.uuid);if(f!==null){const m=f.getObjectByProperty("uuid",t.uuid);ee(m,`material.${l}`,d)}}};{const h=[],d=i==="defines"||i==="extensions";try{for(const f in e){const m=e[f];if(m!==void 0)if(m.value!==void 0){const g=ft(`${f}.value`,m.value,t,s,l,d);g!==void 0&&h.push(g)}else{const g=ft(f,m,t,s,l,d);g!==void 0&&h.push(g)}}}catch{console.log("Issue cycling through material object:",i,e)}if(h.length>0)return _i(h),{title:r,items:h}}}}}function Gi(i,e,t){const s=[];for(const n in i){if(!ta(n))continue;const a=typeof i[n],r=i[n];if(a==="boolean")s.push(ca(n,r,e,t));else if(a==="number")s.push(ha(n,r,e,t));else if(a==="string")s.push(da(n,r,e,t));else if(a==="object"){const l=ft(n,r,e,t);l!==void 0&&s.push(l)}else r!==void 0&&console.log("other:",n,a,r)}return _i(s),s.push({title:"Update Material",type:"button",onChange:()=>{t.updateObject(e.uuid,"material.needsUpdate",!0);const n=t.getScene(e.uuid);if(n!==null){const a=n.getObjectByProperty("uuid",e.uuid);ee(a,"material.needsUpdate",!0)}}}),s}function fa(i,e,t){function s(){return`${t.app.appID}_material`}const n=localStorage.getItem(s()),a=n!==null?n==="open":!1;function r(c){localStorage.setItem(s(),c?"open":"closed")}const l=i.material;if(Array.isArray(l)){const c=[],h=l.length;for(let d=0;d<h;d++)c.push(p.jsx(Ce,{app:e,title:`Material ${d}`,items:Gi(l[d],i,t)},`Material ${d}`));return p.jsx(p.Fragment,{children:c})}else return p.jsx(Ce,{app:e,title:"Material",items:Gi(l,i,t),expanded:a,onToggle:c=>{r(c)}})}const Zi="data:image/gif;base64,R0lGODlhDgFkAIAAAP///wAAACH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4xLWMwMDIgNzkuZGJhM2RhM2I1LCAyMDIzLzEyLzE1LTEwOjQyOjM3ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjUuNiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDoyMDk3M0NEODAxQjQxMUVGODVGNENDMkUyMUExNDk1NSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDoyMDk3M0NEOTAxQjQxMUVGODVGNENDMkUyMUExNDk1NSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkE4ODc3Qzg5MDFCMzExRUY4NUY0Q0MyRTIxQTE0OTU1IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkE4ODc3QzhBMDFCMzExRUY4NUY0Q0MyRTIxQTE0OTU1Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+Af/+/fz7+vn49/b19PPy8fDv7u3s6+rp6Ofm5eTj4uHg397d3Nva2djX1tXU09LR0M/OzczLysnIx8bFxMPCwcC/vr28u7q5uLe2tbSzsrGwr66trKuqqainpqWko6KhoJ+enZybmpmYl5aVlJOSkZCPjo2Mi4qJiIeGhYSDgoGAf359fHt6eXh3dnV0c3JxcG9ubWxramloZ2ZlZGNiYWBfXl1cW1pZWFdWVVRTUlFQT05NTEtKSUhHRkVEQ0JBQD8+PTw7Ojk4NzY1NDMyMTAvLi0sKyopKCcmJSQjIiEgHx4dHBsaGRgXFhUUExIREA8ODQwLCgkIBwYFBAMCAQAAIfkEAAAAAAAsAAAAAA4BZAAAAv+Mj6nL7Q+jnLTai7PevPsPhuJIluaJpurKtu4Lx/JM1/aN5/rO9/4PDAqHxKLxiEwql8ym8wmNSqfUqvWKzWq33K73Cw6Lx+Sy+YxOq9fstvsNj8vn9Lr9js/r9/y+/w8YKDhIWGh4iJiouMjY6PgIGSk5SVlpeYmZqTkJAGDQ+dnpuekmGgAKejpKuiZqmprKqoZKGyrbOlqrejub6xvLGyw8TFzcprurGuvqybxq7ETbrItsCz0l7Zpc+6p9/cS967w9/S2FTF0u/mzehK4Oqz3eTl9vf4+fr7/P3+//DzCgwIEECxo8iDChwoUMGzp8CDGixIkUK1q8iDGjxo0XHDt6/AgypMiRJEuaPIkypcqVLFt+KwAAOw==";function ga(i){const e=i.step!==void 0?i.step:.01,t=O.useRef(null),s=O.useRef(null),n=O.useRef(null),a=O.useRef(null),r=O.useRef(null),[l]=O.useState(i.value),[c,h]=O.useState(i.value.offset[0]),[d,f]=O.useState(i.value.offset[1]),[m,g]=O.useState(i.value.repeat[0]),[E,y]=O.useState(i.value.repeat[1]);function T(C,S,w,x,M){if(i.onChange!==void 0){const D=i.prop!==void 0?i.prop:i.title;i.onChange(D,{src:C,offset:[S,w],repeat:[x,M]})}}function _(C){const S=t.current.src,w=C.target.value;switch(C.target){case s.current:h(w),T(S,w,d,m,E);break;case n.current:f(w),T(S,c,w,m,E);break;case a.current:g(w),T(S,c,d,w,E);break;case r.current:y(w),T(S,c,d,m,w);break}}return p.jsxs("div",{className:"imageField",children:[p.jsx("img",{alt:i.title,ref:t,onClick:()=>{sa().then(C=>{t.current.src=C,T(C,c,d,m,E)})},src:l.src.length>0?l.src:Zi}),p.jsxs("div",{className:"fields",children:[p.jsxs("div",{children:[p.jsx("label",{children:"Offset:"}),p.jsx("input",{ref:s,type:"number",value:c,step:e,onChange:_}),p.jsx("input",{ref:n,type:"number",value:d,step:e,onChange:_})]}),p.jsxs("div",{children:[p.jsx("label",{children:"Repeat:"}),p.jsx("input",{ref:a,type:"number",value:m,step:e,onChange:_}),p.jsx("input",{ref:r,type:"number",value:E,step:e,onChange:_})]}),p.jsx("button",{onClick:()=>{T("",c,d,m,E),t.current.src=Zi},children:"Clear"})]})]})}function Ut(i){let e=i.value;e!==void 0&&(e.isColor!==void 0?e=di(i.value):i.type==="color"&&(e=di(new o.Color().setStyle(i.value,o.LinearSRGBColorSpace))));const[t,s]=O.useState(e),n=O.useRef(null),a=h=>{let d=h.target.value;if(i.type==="boolean")d=h.target.checked;else if(i.type==="option"&&(typeof i.value=="number"?d=Number(d):typeof i.value=="boolean"?d=!!d:typeof i.value=="object"&&(d=JSON.parse(d)),i.options!==void 0)){const f=i.options.length;for(let m=0;m<f&&i.options[m].value!==d;m++);}s(d),i.onChange!==void 0&&i.onChange(i.prop!==void 0?i.prop:i.title,d)},r={};i.disabled&&(r.opacity=.8);const l=i.type==="string"&&(t.length>100||t.search(`
47
- `)>-1),c=l||i.type==="image"||i.type==="vector2";return p.jsxs("div",{className:`field ${c?"block":""}`,style:r,children:[i.type!=="button"&&p.jsx("label",{ref:n,children:Ct(i.title)},"fieldLabel"),i.type==="string"&&!l&&p.jsx("input",{type:"text",disabled:i.disabled,onChange:a,value:t}),i.type==="string"&&l&&p.jsx("textarea",{cols:50,rows:10,disabled:i.disabled!==void 0?i.disabled:!0,onChange:a,onKeyDown:h=>{i.onKeyDown!==void 0&&i.onKeyDown(h)},value:t}),i.type==="boolean"&&p.jsx("input",{type:"checkbox",disabled:i.disabled,onChange:a,checked:t}),i.type==="number"&&p.jsx(Ve,{value:t,type:i.type,prop:i.prop!==void 0?i.prop:i.title,min:i.min,max:i.max,step:i.step,disabled:i.disabled,labelRef:n,onChange:i.onChange}),i.type==="range"&&p.jsx(Ve,{value:t,type:i.type,prop:i.prop!==void 0?i.prop:i.title,min:i.min,max:i.max,step:i.step,disabled:i.disabled,labelRef:n,onChange:i.onChange}),i.type==="color"&&p.jsxs(p.Fragment,{children:[p.jsx("input",{type:"text",value:t.toString(),onChange:a,disabled:i.disabled,className:"color"}),p.jsx("input",{type:"color",value:t,onChange:a,disabled:i.disabled})]}),i.type==="button"&&p.jsx("button",{disabled:i.disabled,onClick:()=>{i.onChange!==void 0&&i.onChange(i.prop!==void 0?i.prop:i.title,!0)},children:i.title}),i.type==="image"&&p.jsx(ga,{title:i.title,prop:i.prop,value:i.value,onChange:i.onChange}),i.type==="option"&&p.jsx(p.Fragment,{children:p.jsx("select",{onChange:a,disabled:i.disabled,defaultValue:i.value,children:i.options?.map((h,d)=>p.jsx("option",{value:h.value,children:Ct(h.title)},d))})}),i.type==="vector2"&&p.jsx(Qn,{step:i.step,value:t,min:0,max:1,onChange:a}),i.type==="grid3"&&p.jsx(Yi,{step:i.step,value:t,onChange:a}),i.type==="grid4"&&p.jsx(ea,{step:i.step,value:t,onChange:a}),i.type==="euler"&&p.jsx(Yi,{step:i.step,value:t,onChange:a})]})}function _a(i){return"items"in i}class Ce extends O.Component{subgroupNames=[];subgroupElements=[];valueOverrides=new Map;app;constructor(e){super(e),this.app=e.app,this.state={lastUpdated:Date.now()}}addGroup(e){const t=[];e.items.forEach(a=>{t.push({type:a.type,prop:a.prop,title:a.title!==void 0?a.title:a.prop,value:a.value,min:a.min,max:a.max,step:a.step,options:a.options,disabled:a.disabled,onChange:(r,l)=>{e.onUpdate(r,l)}})});const s=O.createRef(),n=p.jsx(Ce,{app:this.app,ref:s,title:e.title,items:t},Math.random());return this.subgroupNames.push(e.title),this.subgroupElements.push(n),this.setState({lastUpdated:Date.now()}),s}removeGroup(e){const t=this.subgroupNames.length;for(let s=0;s<t;s++){const n=this.subgroupNames[s];if(e===n){this.subgroupNames.splice(s,1),this.subgroupElements.splice(s,1),this.setState({lastUpdated:Date.now()});return}}}setField(e,t){this.valueOverrides.set(e,t),this.setState({lastUpdated:Date.now()})}render(){const e=[];return this.props.items.forEach(t=>{if(_a(t))e.push(p.jsx(Ce,{app:this.app,title:Ct(t.title),items:t.items},Math.random()));else{const s=this.valueOverrides.get(t.title),n=s!==void 0?s:t.value;e.push(p.jsx(Ut,{title:t.title,prop:t.prop,value:n,type:t.type,min:t.min,max:t.max,step:t.step,disabled:t.disabled,options:t.options,onChange:(a,r)=>{t.onChange!==void 0&&(this.valueOverrides.delete(t.title),t.onChange(a,r))},onKeyDown:a=>{t.onKeyDown!==void 0&&t.onKeyDown(a)}},Math.random()))}}),this.subgroupElements.forEach(t=>e.push(t)),p.jsx(bt,{app:this.app,label:this.props.title,open:this.props.expanded===!0,onToggle:t=>{this.props.onToggle&&this.props?.onToggle(t)},children:e})}}class V extends O.Component{static instance;static groups=[];static groupsRefs=[];static groupTitles=[];static app;constructor(e){super(e),this.state={lastUpdate:Date.now()},V.app=e.app,V.instance=this,V.app.addEventListener(P.ADD_GROUP,this.addGroup),V.app.addEventListener(P.REMOVE_GROUP,this.removeGroup)}componentWillUnmount(){V.app.removeEventListener(P.ADD_GROUP,this.addGroup),V.app.removeEventListener(P.REMOVE_GROUP,this.removeGroup)}render(){return p.jsx("div",{className:"customGroups",children:V.groups},this.state.lastUpdate)}addGroup=e=>{const t=JSON.parse(e.value),s=[];t.items.forEach(n=>{s.push({type:n.type,prop:n.prop,title:n.title!==void 0?n.title:n.prop,value:n.value,min:n.min,max:n.max,step:n.step,options:n.options,disabled:n.disabled,onChange:(a,r)=>{this.props.three.updateGroup(t.title,a,r)}})}),V.groups.push(p.jsx(Ce,{app:V.app,title:t.title,items:s},Math.random())),V.groupTitles.push(t.title),this.setState({lastUpdate:Date.now()})};removeGroup=e=>{const t=e.value,s=V.groupTitles.length;for(let n=0;n<s;n++)if(t===V.groupTitles[n]){V.groups.splice(n,1),V.groupTitles.splice(n,1),this.setState({lastUpdate:Date.now()});return}};static addEditorGroup(e){const t=[];e.items.forEach(a=>{t.push({type:a.type,prop:a.prop,title:a.title!==void 0?a.title:a.prop,value:a.value,min:a.min,max:a.max,step:a.step,options:a.options,disabled:a.disabled,onChange:(r,l)=>{e.onUpdate(r,l)}})});const s=O.createRef(),n=p.jsx(Ce,{app:V.app,ref:s,title:e.title,items:t},Math.random());return V.groups.push(n),V.groupsRefs.push(s),V.groupTitles.push(e.title),s}static removeEditorGroup(e){const t=V.groupTitles.length;for(let s=0;s<t;s++)if(e===V.groupTitles[s]){V.groups.splice(s,1),V.groupTitles.splice(s,1),V.instance.setState({lastUpdate:Date.now()});return}}}function Wi(i){switch(i){case"fov":return"FOV";case"zoom":return"Zoom";case"near":return"Near";case"far":return"Far";case"focus":return"Focus";case"aspect":return"Aspect";case"filmGauge":return"Film Gauge";case"filmOffset":return"Film Offset";case"left":return"Left";case"right":return"Right";case"top":return"Top";case"bottom":return"Bottom"}return i}function va(i,e,t){function s(){return`${t.app.appID}_camera`}const n=localStorage.getItem(s()),a=n!==null?n==="open":!1;function r(c){localStorage.setItem(s(),c?"open":"closed")}const l=[];if(i.perspectiveCameraInfo!==void 0)for(const c in i.perspectiveCameraInfo)l.push({title:Wi(c),prop:c,type:"number",step:.01,value:i.perspectiveCameraInfo[c],onChange:(h,d)=>{t.updateObject(i.uuid,h,d),t.requestMethod(i.uuid,"updateProjectionMatrix");const f=t.getScene(i.uuid);if(f!==null){const m=f.getObjectByProperty("uuid",i.uuid);m!==void 0&&(ee(m,h,d),m.updateProjectionMatrix())}}});else if(i.orthographicCameraInfo!==void 0)for(const c in i.orthographicCameraInfo)l.push({title:Wi(c),prop:c,type:"number",step:.01,value:i.orthographicCameraInfo[c],onChange:(h,d)=>{t.updateObject(i.uuid,h,d),t.requestMethod(i.uuid,"updateProjectionMatrix");const f=t.getScene(i.uuid);if(f!==null){const m=f.getObjectByProperty("uuid",i.uuid);m!==void 0&&(ee(m,h,d),m.updateProjectionMatrix())}}});return p.jsx(Ce,{app:e,title:"Camera",items:l,expanded:a,onToggle:c=>{r(c)}})}class ya extends o.Line{constructor(e,t){const s=[1,1,0,-1,1,0,-1,-1,0,1,-1,0,1,1,0],n=new o.BufferGeometry;n.setAttribute("position",new o.Float32BufferAttribute(s,3)),n.computeBoundingSphere();const a=new o.LineBasicMaterial({fog:!1});super(n,a),this.light=e,this.color=t,this.type="RectAreaLightHelper";const r=[1,1,0,-1,1,0,-1,-1,0,1,1,0,-1,-1,0,1,-1,0],l=new o.BufferGeometry;l.setAttribute("position",new o.Float32BufferAttribute(r,3)),l.computeBoundingSphere(),this.add(new o.Mesh(l,new o.MeshBasicMaterial({side:o.BackSide,fog:!1})))}updateMatrixWorld(){if(this.scale.set(.5*this.light.width,.5*this.light.height,1),this.color!==void 0)this.material.color.set(this.color),this.children[0].material.color.set(this.color);else{this.material.color.copy(this.light.color).multiplyScalar(this.light.intensity);const e=this.material.color,t=Math.max(e.r,e.g,e.b);t>1&&e.multiplyScalar(1/t),this.children[0].material.color.copy(this.material.color)}this.matrixWorld.extractRotation(this.light.matrixWorld).scale(this.scale).copyPosition(this.light.matrixWorld),this.children[0].matrixWorld.copy(this.matrixWorld)}dispose(){this.geometry.dispose(),this.material.dispose(),this.children[0].geometry.dispose(),this.children[0].material.dispose()}}const Xi={type:"change"},wi={type:"start"},Ts={type:"end"},Tt=new o.Ray,qi=new o.Plane,Ca=Math.cos(70*o.MathUtils.DEG2RAD),ne=new o.Vector3,pe=2*Math.PI,Y={NONE:-1,ROTATE:0,DOLLY:1,PAN:2,TOUCH_ROTATE:3,TOUCH_PAN:4,TOUCH_DOLLY_PAN:5,TOUCH_DOLLY_ROTATE:6},ei=1e-6;class ba extends o.Controls{constructor(e,t=null){super(e,t),this.state=Y.NONE,this.enabled=!0,this.target=new o.Vector3,this.cursor=new o.Vector3,this.minDistance=0,this.maxDistance=1/0,this.minZoom=0,this.maxZoom=1/0,this.minTargetRadius=0,this.maxTargetRadius=1/0,this.minPolarAngle=0,this.maxPolarAngle=Math.PI,this.minAzimuthAngle=-1/0,this.maxAzimuthAngle=1/0,this.enableDamping=!1,this.dampingFactor=.05,this.enableZoom=!0,this.zoomSpeed=1,this.enableRotate=!0,this.rotateSpeed=1,this.enablePan=!0,this.panSpeed=1,this.screenSpacePanning=!0,this.keyPanSpeed=7,this.zoomToCursor=!1,this.autoRotate=!1,this.autoRotateSpeed=2,this.keys={LEFT:"ArrowLeft",UP:"ArrowUp",RIGHT:"ArrowRight",BOTTOM:"ArrowDown"},this.mouseButtons={LEFT:o.MOUSE.ROTATE,MIDDLE:o.MOUSE.DOLLY,RIGHT:o.MOUSE.PAN},this.touches={ONE:o.TOUCH.ROTATE,TWO:o.TOUCH.DOLLY_PAN},this.target0=this.target.clone(),this.position0=this.object.position.clone(),this.zoom0=this.object.zoom,this._domElementKeyEvents=null,this._lastPosition=new o.Vector3,this._lastQuaternion=new o.Quaternion,this._lastTargetPosition=new o.Vector3,this._quat=new o.Quaternion().setFromUnitVectors(e.up,new o.Vector3(0,1,0)),this._quatInverse=this._quat.clone().invert(),this._spherical=new o.Spherical,this._sphericalDelta=new o.Spherical,this._scale=1,this._panOffset=new o.Vector3,this._rotateStart=new o.Vector2,this._rotateEnd=new o.Vector2,this._rotateDelta=new o.Vector2,this._panStart=new o.Vector2,this._panEnd=new o.Vector2,this._panDelta=new o.Vector2,this._dollyStart=new o.Vector2,this._dollyEnd=new o.Vector2,this._dollyDelta=new o.Vector2,this._dollyDirection=new o.Vector3,this._mouse=new o.Vector2,this._performCursorZoom=!1,this._pointers=[],this._pointerPositions={},this._controlActive=!1,this._onPointerMove=Sa.bind(this),this._onPointerDown=Ea.bind(this),this._onPointerUp=wa.bind(this),this._onContextMenu=Ra.bind(this),this._onMouseWheel=Ta.bind(this),this._onKeyDown=Ma.bind(this),this._onTouchStart=Aa.bind(this),this._onTouchMove=Pa.bind(this),this._onMouseDown=xa.bind(this),this._onMouseMove=Oa.bind(this),this._interceptControlDown=Da.bind(this),this._interceptControlUp=Ia.bind(this),this.domElement!==null&&this.connect(),this.update()}connect(){this.domElement.addEventListener("pointerdown",this._onPointerDown),this.domElement.addEventListener("pointercancel",this._onPointerUp),this.domElement.addEventListener("contextmenu",this._onContextMenu),this.domElement.addEventListener("wheel",this._onMouseWheel,{passive:!1}),this.domElement.getRootNode().addEventListener("keydown",this._interceptControlDown,{passive:!0,capture:!0}),this.domElement.style.touchAction="none"}disconnect(){this.domElement.removeEventListener("pointerdown",this._onPointerDown),this.domElement.removeEventListener("pointermove",this._onPointerMove),this.domElement.removeEventListener("pointerup",this._onPointerUp),this.domElement.removeEventListener("pointercancel",this._onPointerUp),this.domElement.removeEventListener("wheel",this._onMouseWheel),this.domElement.removeEventListener("contextmenu",this._onContextMenu),this.stopListenToKeyEvents(),this.domElement.getRootNode().removeEventListener("keydown",this._interceptControlDown,{capture:!0}),this.domElement.style.touchAction="auto"}dispose(){this.disconnect()}getPolarAngle(){return this._spherical.phi}getAzimuthalAngle(){return this._spherical.theta}getDistance(){return this.object.position.distanceTo(this.target)}listenToKeyEvents(e){e.addEventListener("keydown",this._onKeyDown),this._domElementKeyEvents=e}stopListenToKeyEvents(){this._domElementKeyEvents!==null&&(this._domElementKeyEvents.removeEventListener("keydown",this._onKeyDown),this._domElementKeyEvents=null)}saveState(){this.target0.copy(this.target),this.position0.copy(this.object.position),this.zoom0=this.object.zoom}reset(){this.target.copy(this.target0),this.object.position.copy(this.position0),this.object.zoom=this.zoom0,this.object.updateProjectionMatrix(),this.dispatchEvent(Xi),this.update(),this.state=Y.NONE}update(e=null){const t=this.object.position;ne.copy(t).sub(this.target),ne.applyQuaternion(this._quat),this._spherical.setFromVector3(ne),this.autoRotate&&this.state===Y.NONE&&this._rotateLeft(this._getAutoRotationAngle(e)),this.enableDamping?(this._spherical.theta+=this._sphericalDelta.theta*this.dampingFactor,this._spherical.phi+=this._sphericalDelta.phi*this.dampingFactor):(this._spherical.theta+=this._sphericalDelta.theta,this._spherical.phi+=this._sphericalDelta.phi);let s=this.minAzimuthAngle,n=this.maxAzimuthAngle;isFinite(s)&&isFinite(n)&&(s<-Math.PI?s+=pe:s>Math.PI&&(s-=pe),n<-Math.PI?n+=pe:n>Math.PI&&(n-=pe),s<=n?this._spherical.theta=Math.max(s,Math.min(n,this._spherical.theta)):this._spherical.theta=this._spherical.theta>(s+n)/2?Math.max(s,this._spherical.theta):Math.min(n,this._spherical.theta)),this._spherical.phi=Math.max(this.minPolarAngle,Math.min(this.maxPolarAngle,this._spherical.phi)),this._spherical.makeSafe(),this.enableDamping===!0?this.target.addScaledVector(this._panOffset,this.dampingFactor):this.target.add(this._panOffset),this.target.sub(this.cursor),this.target.clampLength(this.minTargetRadius,this.maxTargetRadius),this.target.add(this.cursor);let a=!1;if(this.zoomToCursor&&this._performCursorZoom||this.object.isOrthographicCamera)this._spherical.radius=this._clampDistance(this._spherical.radius);else{const r=this._spherical.radius;this._spherical.radius=this._clampDistance(this._spherical.radius*this._scale),a=r!=this._spherical.radius}if(ne.setFromSpherical(this._spherical),ne.applyQuaternion(this._quatInverse),t.copy(this.target).add(ne),this.object.lookAt(this.target),this.enableDamping===!0?(this._sphericalDelta.theta*=1-this.dampingFactor,this._sphericalDelta.phi*=1-this.dampingFactor,this._panOffset.multiplyScalar(1-this.dampingFactor)):(this._sphericalDelta.set(0,0,0),this._panOffset.set(0,0,0)),this.zoomToCursor&&this._performCursorZoom){let r=null;if(this.object.isPerspectiveCamera){const l=ne.length();r=this._clampDistance(l*this._scale);const c=l-r;this.object.position.addScaledVector(this._dollyDirection,c),this.object.updateMatrixWorld(),a=!!c}else if(this.object.isOrthographicCamera){const l=new o.Vector3(this._mouse.x,this._mouse.y,0);l.unproject(this.object);const c=this.object.zoom;this.object.zoom=Math.max(this.minZoom,Math.min(this.maxZoom,this.object.zoom/this._scale)),this.object.updateProjectionMatrix(),a=c!==this.object.zoom;const h=new o.Vector3(this._mouse.x,this._mouse.y,0);h.unproject(this.object),this.object.position.sub(h).add(l),this.object.updateMatrixWorld(),r=ne.length()}else console.warn("WARNING: OrbitControls.js encountered an unknown camera type - zoom to cursor disabled."),this.zoomToCursor=!1;r!==null&&(this.screenSpacePanning?this.target.set(0,0,-1).transformDirection(this.object.matrix).multiplyScalar(r).add(this.object.position):(Tt.origin.copy(this.object.position),Tt.direction.set(0,0,-1).transformDirection(this.object.matrix),Math.abs(this.object.up.dot(Tt.direction))<Ca?this.object.lookAt(this.target):(qi.setFromNormalAndCoplanarPoint(this.object.up,this.target),Tt.intersectPlane(qi,this.target))))}else if(this.object.isOrthographicCamera){const r=this.object.zoom;this.object.zoom=Math.max(this.minZoom,Math.min(this.maxZoom,this.object.zoom/this._scale)),r!==this.object.zoom&&(this.object.updateProjectionMatrix(),a=!0)}return this._scale=1,this._performCursorZoom=!1,a||this._lastPosition.distanceToSquared(this.object.position)>ei||8*(1-this._lastQuaternion.dot(this.object.quaternion))>ei||this._lastTargetPosition.distanceToSquared(this.target)>ei?(this.dispatchEvent(Xi),this._lastPosition.copy(this.object.position),this._lastQuaternion.copy(this.object.quaternion),this._lastTargetPosition.copy(this.target),!0):!1}_getAutoRotationAngle(e){return e!==null?pe/60*this.autoRotateSpeed*e:pe/60/60*this.autoRotateSpeed}_getZoomScale(e){const t=Math.abs(e*.01);return Math.pow(.95,this.zoomSpeed*t)}_rotateLeft(e){this._sphericalDelta.theta-=e}_rotateUp(e){this._sphericalDelta.phi-=e}_panLeft(e,t){ne.setFromMatrixColumn(t,0),ne.multiplyScalar(-e),this._panOffset.add(ne)}_panUp(e,t){this.screenSpacePanning===!0?ne.setFromMatrixColumn(t,1):(ne.setFromMatrixColumn(t,0),ne.crossVectors(this.object.up,ne)),ne.multiplyScalar(e),this._panOffset.add(ne)}_pan(e,t){const s=this.domElement;if(this.object.isPerspectiveCamera){const n=this.object.position;ne.copy(n).sub(this.target);let a=ne.length();a*=Math.tan(this.object.fov/2*Math.PI/180),this._panLeft(2*e*a/s.clientHeight,this.object.matrix),this._panUp(2*t*a/s.clientHeight,this.object.matrix)}else this.object.isOrthographicCamera?(this._panLeft(e*(this.object.right-this.object.left)/this.object.zoom/s.clientWidth,this.object.matrix),this._panUp(t*(this.object.top-this.object.bottom)/this.object.zoom/s.clientHeight,this.object.matrix)):(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - pan disabled."),this.enablePan=!1)}_dollyOut(e){this.object.isPerspectiveCamera||this.object.isOrthographicCamera?this._scale/=e:(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled."),this.enableZoom=!1)}_dollyIn(e){this.object.isPerspectiveCamera||this.object.isOrthographicCamera?this._scale*=e:(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled."),this.enableZoom=!1)}_updateZoomParameters(e,t){if(!this.zoomToCursor)return;this._performCursorZoom=!0;const s=this.domElement.getBoundingClientRect(),n=e-s.left,a=t-s.top,r=s.width,l=s.height;this._mouse.x=n/r*2-1,this._mouse.y=-(a/l)*2+1,this._dollyDirection.set(this._mouse.x,this._mouse.y,1).unproject(this.object).sub(this.object.position).normalize()}_clampDistance(e){return Math.max(this.minDistance,Math.min(this.maxDistance,e))}_handleMouseDownRotate(e){this._rotateStart.set(e.clientX,e.clientY)}_handleMouseDownDolly(e){this._updateZoomParameters(e.clientX,e.clientX),this._dollyStart.set(e.clientX,e.clientY)}_handleMouseDownPan(e){this._panStart.set(e.clientX,e.clientY)}_handleMouseMoveRotate(e){this._rotateEnd.set(e.clientX,e.clientY),this._rotateDelta.subVectors(this._rotateEnd,this._rotateStart).multiplyScalar(this.rotateSpeed);const t=this.domElement;this._rotateLeft(pe*this._rotateDelta.x/t.clientHeight),this._rotateUp(pe*this._rotateDelta.y/t.clientHeight),this._rotateStart.copy(this._rotateEnd),this.update()}_handleMouseMoveDolly(e){this._dollyEnd.set(e.clientX,e.clientY),this._dollyDelta.subVectors(this._dollyEnd,this._dollyStart),this._dollyDelta.y>0?this._dollyOut(this._getZoomScale(this._dollyDelta.y)):this._dollyDelta.y<0&&this._dollyIn(this._getZoomScale(this._dollyDelta.y)),this._dollyStart.copy(this._dollyEnd),this.update()}_handleMouseMovePan(e){this._panEnd.set(e.clientX,e.clientY),this._panDelta.subVectors(this._panEnd,this._panStart).multiplyScalar(this.panSpeed),this._pan(this._panDelta.x,this._panDelta.y),this._panStart.copy(this._panEnd),this.update()}_handleMouseWheel(e){this._updateZoomParameters(e.clientX,e.clientY),e.deltaY<0?this._dollyIn(this._getZoomScale(e.deltaY)):e.deltaY>0&&this._dollyOut(this._getZoomScale(e.deltaY)),this.update()}_handleKeyDown(e){let t=!1;switch(e.code){case this.keys.UP:e.ctrlKey||e.metaKey||e.shiftKey?this._rotateUp(pe*this.rotateSpeed/this.domElement.clientHeight):this._pan(0,this.keyPanSpeed),t=!0;break;case this.keys.BOTTOM:e.ctrlKey||e.metaKey||e.shiftKey?this._rotateUp(-pe*this.rotateSpeed/this.domElement.clientHeight):this._pan(0,-this.keyPanSpeed),t=!0;break;case this.keys.LEFT:e.ctrlKey||e.metaKey||e.shiftKey?this._rotateLeft(pe*this.rotateSpeed/this.domElement.clientHeight):this._pan(this.keyPanSpeed,0),t=!0;break;case this.keys.RIGHT:e.ctrlKey||e.metaKey||e.shiftKey?this._rotateLeft(-pe*this.rotateSpeed/this.domElement.clientHeight):this._pan(-this.keyPanSpeed,0),t=!0;break}t&&(e.preventDefault(),this.update())}_handleTouchStartRotate(e){if(this._pointers.length===1)this._rotateStart.set(e.pageX,e.pageY);else{const t=this._getSecondPointerPosition(e),s=.5*(e.pageX+t.x),n=.5*(e.pageY+t.y);this._rotateStart.set(s,n)}}_handleTouchStartPan(e){if(this._pointers.length===1)this._panStart.set(e.pageX,e.pageY);else{const t=this._getSecondPointerPosition(e),s=.5*(e.pageX+t.x),n=.5*(e.pageY+t.y);this._panStart.set(s,n)}}_handleTouchStartDolly(e){const t=this._getSecondPointerPosition(e),s=e.pageX-t.x,n=e.pageY-t.y,a=Math.sqrt(s*s+n*n);this._dollyStart.set(0,a)}_handleTouchStartDollyPan(e){this.enableZoom&&this._handleTouchStartDolly(e),this.enablePan&&this._handleTouchStartPan(e)}_handleTouchStartDollyRotate(e){this.enableZoom&&this._handleTouchStartDolly(e),this.enableRotate&&this._handleTouchStartRotate(e)}_handleTouchMoveRotate(e){if(this._pointers.length==1)this._rotateEnd.set(e.pageX,e.pageY);else{const s=this._getSecondPointerPosition(e),n=.5*(e.pageX+s.x),a=.5*(e.pageY+s.y);this._rotateEnd.set(n,a)}this._rotateDelta.subVectors(this._rotateEnd,this._rotateStart).multiplyScalar(this.rotateSpeed);const t=this.domElement;this._rotateLeft(pe*this._rotateDelta.x/t.clientHeight),this._rotateUp(pe*this._rotateDelta.y/t.clientHeight),this._rotateStart.copy(this._rotateEnd)}_handleTouchMovePan(e){if(this._pointers.length===1)this._panEnd.set(e.pageX,e.pageY);else{const t=this._getSecondPointerPosition(e),s=.5*(e.pageX+t.x),n=.5*(e.pageY+t.y);this._panEnd.set(s,n)}this._panDelta.subVectors(this._panEnd,this._panStart).multiplyScalar(this.panSpeed),this._pan(this._panDelta.x,this._panDelta.y),this._panStart.copy(this._panEnd)}_handleTouchMoveDolly(e){const t=this._getSecondPointerPosition(e),s=e.pageX-t.x,n=e.pageY-t.y,a=Math.sqrt(s*s+n*n);this._dollyEnd.set(0,a),this._dollyDelta.set(0,Math.pow(this._dollyEnd.y/this._dollyStart.y,this.zoomSpeed)),this._dollyOut(this._dollyDelta.y),this._dollyStart.copy(this._dollyEnd);const r=(e.pageX+t.x)*.5,l=(e.pageY+t.y)*.5;this._updateZoomParameters(r,l)}_handleTouchMoveDollyPan(e){this.enableZoom&&this._handleTouchMoveDolly(e),this.enablePan&&this._handleTouchMovePan(e)}_handleTouchMoveDollyRotate(e){this.enableZoom&&this._handleTouchMoveDolly(e),this.enableRotate&&this._handleTouchMoveRotate(e)}_addPointer(e){this._pointers.push(e.pointerId)}_removePointer(e){delete this._pointerPositions[e.pointerId];for(let t=0;t<this._pointers.length;t++)if(this._pointers[t]==e.pointerId){this._pointers.splice(t,1);return}}_isTrackingPointer(e){for(let t=0;t<this._pointers.length;t++)if(this._pointers[t]==e.pointerId)return!0;return!1}_trackPointer(e){let t=this._pointerPositions[e.pointerId];t===void 0&&(t=new o.Vector2,this._pointerPositions[e.pointerId]=t),t.set(e.pageX,e.pageY)}_getSecondPointerPosition(e){const t=e.pointerId===this._pointers[0]?this._pointers[1]:this._pointers[0];return this._pointerPositions[t]}_customWheelEvent(e){const t=e.deltaMode,s={clientX:e.clientX,clientY:e.clientY,deltaY:e.deltaY};switch(t){case 1:s.deltaY*=16;break;case 2:s.deltaY*=100;break}return e.ctrlKey&&!this._controlActive&&(s.deltaY*=10),s}}function Ea(i){this.enabled!==!1&&(this._pointers.length===0&&(this.domElement.setPointerCapture(i.pointerId),this.domElement.addEventListener("pointermove",this._onPointerMove),this.domElement.addEventListener("pointerup",this._onPointerUp)),!this._isTrackingPointer(i)&&(this._addPointer(i),i.pointerType==="touch"?this._onTouchStart(i):this._onMouseDown(i)))}function Sa(i){this.enabled!==!1&&(i.pointerType==="touch"?this._onTouchMove(i):this._onMouseMove(i))}function wa(i){switch(this._removePointer(i),this._pointers.length){case 0:this.domElement.releasePointerCapture(i.pointerId),this.domElement.removeEventListener("pointermove",this._onPointerMove),this.domElement.removeEventListener("pointerup",this._onPointerUp),this.dispatchEvent(Ts),this.state=Y.NONE;break;case 1:const e=this._pointers[0],t=this._pointerPositions[e];this._onTouchStart({pointerId:e,pageX:t.x,pageY:t.y});break}}function xa(i){let e;switch(i.button){case 0:e=this.mouseButtons.LEFT;break;case 1:e=this.mouseButtons.MIDDLE;break;case 2:e=this.mouseButtons.RIGHT;break;default:e=-1}switch(e){case o.MOUSE.DOLLY:if(this.enableZoom===!1)return;this._handleMouseDownDolly(i),this.state=Y.DOLLY;break;case o.MOUSE.ROTATE:if(i.ctrlKey||i.metaKey||i.shiftKey){if(this.enablePan===!1)return;this._handleMouseDownPan(i),this.state=Y.PAN}else{if(this.enableRotate===!1)return;this._handleMouseDownRotate(i),this.state=Y.ROTATE}break;case o.MOUSE.PAN:if(i.ctrlKey||i.metaKey||i.shiftKey){if(this.enableRotate===!1)return;this._handleMouseDownRotate(i),this.state=Y.ROTATE}else{if(this.enablePan===!1)return;this._handleMouseDownPan(i),this.state=Y.PAN}break;default:this.state=Y.NONE}this.state!==Y.NONE&&this.dispatchEvent(wi)}function Oa(i){switch(this.state){case Y.ROTATE:if(this.enableRotate===!1)return;this._handleMouseMoveRotate(i);break;case Y.DOLLY:if(this.enableZoom===!1)return;this._handleMouseMoveDolly(i);break;case Y.PAN:if(this.enablePan===!1)return;this._handleMouseMovePan(i);break}}function Ta(i){this.enabled===!1||this.enableZoom===!1||this.state!==Y.NONE||(i.preventDefault(),this.dispatchEvent(wi),this._handleMouseWheel(this._customWheelEvent(i)),this.dispatchEvent(Ts))}function Ma(i){this.enabled===!1||this.enablePan===!1||this._handleKeyDown(i)}function Aa(i){switch(this._trackPointer(i),this._pointers.length){case 1:switch(this.touches.ONE){case o.TOUCH.ROTATE:if(this.enableRotate===!1)return;this._handleTouchStartRotate(i),this.state=Y.TOUCH_ROTATE;break;case o.TOUCH.PAN:if(this.enablePan===!1)return;this._handleTouchStartPan(i),this.state=Y.TOUCH_PAN;break;default:this.state=Y.NONE}break;case 2:switch(this.touches.TWO){case o.TOUCH.DOLLY_PAN:if(this.enableZoom===!1&&this.enablePan===!1)return;this._handleTouchStartDollyPan(i),this.state=Y.TOUCH_DOLLY_PAN;break;case o.TOUCH.DOLLY_ROTATE:if(this.enableZoom===!1&&this.enableRotate===!1)return;this._handleTouchStartDollyRotate(i),this.state=Y.TOUCH_DOLLY_ROTATE;break;default:this.state=Y.NONE}break;default:this.state=Y.NONE}this.state!==Y.NONE&&this.dispatchEvent(wi)}function Pa(i){switch(this._trackPointer(i),this.state){case Y.TOUCH_ROTATE:if(this.enableRotate===!1)return;this._handleTouchMoveRotate(i),this.update();break;case Y.TOUCH_PAN:if(this.enablePan===!1)return;this._handleTouchMovePan(i),this.update();break;case Y.TOUCH_DOLLY_PAN:if(this.enableZoom===!1&&this.enablePan===!1)return;this._handleTouchMoveDollyPan(i),this.update();break;case Y.TOUCH_DOLLY_ROTATE:if(this.enableZoom===!1&&this.enableRotate===!1)return;this._handleTouchMoveDollyRotate(i),this.update();break;default:this.state=Y.NONE}}function Ra(i){this.enabled!==!1&&i.preventDefault()}function Da(i){i.key==="Control"&&(this._controlActive=!0,this.domElement.getRootNode().addEventListener("keyup",this._interceptControlUp,{passive:!0,capture:!0}))}function Ia(i){i.key==="Control"&&(this._controlActive=!1,this.domElement.getRootNode().removeEventListener("keyup",this._interceptControlUp,{passive:!0,capture:!0}))}/*!
48
- * camera-controls
49
- * https://github.com/yomotsu/camera-controls
50
- * (c) 2017 @yomotsu
51
- * Released under the MIT License.
52
- */const $={LEFT:1,RIGHT:2,MIDDLE:4},v=Object.freeze({NONE:0,ROTATE:1,TRUCK:2,OFFSET:4,DOLLY:8,ZOOM:16,TOUCH_ROTATE:32,TOUCH_TRUCK:64,TOUCH_OFFSET:128,TOUCH_DOLLY:256,TOUCH_ZOOM:512,TOUCH_DOLLY_TRUCK:1024,TOUCH_DOLLY_OFFSET:2048,TOUCH_DOLLY_ROTATE:4096,TOUCH_ZOOM_TRUCK:8192,TOUCH_ZOOM_OFFSET:16384,TOUCH_ZOOM_ROTATE:32768}),Qe={NONE:0,IN:1,OUT:-1};function je(i){return i.isPerspectiveCamera}function ke(i){return i.isOrthographicCamera}const Ke=Math.PI*2,Qi=Math.PI/2,Ms=1e-5,ot=Math.PI/180;function Ee(i,e,t){return Math.max(e,Math.min(t,i))}function q(i,e=Ms){return Math.abs(i)<e}function H(i,e,t=Ms){return q(i-e,t)}function Ki(i,e){return Math.round(i/e)*e}function lt(i){return isFinite(i)?i:i<0?-Number.MAX_VALUE:Number.MAX_VALUE}function ct(i){return Math.abs(i)<Number.MAX_VALUE?i:i*(1/0)}function Mt(i,e,t,s,n=1/0,a){s=Math.max(1e-4,s);const r=2/s,l=r*a,c=1/(1+l+.48*l*l+.235*l*l*l);let h=i-e;const d=e,f=n*s;h=Ee(h,-f,f),e=i-h;const m=(t.value+r*h)*a;t.value=(t.value-r*m)*c;let g=e+(h+m)*c;return d-i>0==g>d&&(g=d,t.value=(g-d)/a),g}function $i(i,e,t,s,n=1/0,a,r){s=Math.max(1e-4,s);const l=2/s,c=l*a,h=1/(1+c+.48*c*c+.235*c*c*c);let d=e.x,f=e.y,m=e.z,g=i.x-d,E=i.y-f,y=i.z-m;const T=d,_=f,C=m,S=n*s,w=S*S,x=g*g+E*E+y*y;if(x>w){const X=Math.sqrt(x);g=g/X*S,E=E/X*S,y=y/X*S}d=i.x-g,f=i.y-E,m=i.z-y;const M=(t.x+l*g)*a,D=(t.y+l*E)*a,k=(t.z+l*y)*a;t.x=(t.x-l*M)*h,t.y=(t.y-l*D)*h,t.z=(t.z-l*k)*h,r.x=d+(g+M)*h,r.y=f+(E+D)*h,r.z=m+(y+k)*h;const R=T-i.x,B=_-i.y,ge=C-i.z,ue=r.x-T,se=r.y-_,Q=r.z-C;return R*ue+B*se+ge*Q>0&&(r.x=T,r.y=_,r.z=C,t.x=(r.x-T)/a,t.y=(r.y-_)/a,t.z=(r.z-C)/a),r}function ti(i,e){e.set(0,0),i.forEach(t=>{e.x+=t.clientX,e.y+=t.clientY}),e.x/=i.length,e.y/=i.length}function ii(i,e){return ke(i)?(console.warn(`${e} is not supported in OrthographicCamera`),!0):!1}class La{constructor(){this._listeners={}}addEventListener(e,t){const s=this._listeners;s[e]===void 0&&(s[e]=[]),s[e].indexOf(t)===-1&&s[e].push(t)}hasEventListener(e,t){const s=this._listeners;return s[e]!==void 0&&s[e].indexOf(t)!==-1}removeEventListener(e,t){const n=this._listeners[e];if(n!==void 0){const a=n.indexOf(t);a!==-1&&n.splice(a,1)}}removeAllEventListeners(e){if(!e){this._listeners={};return}Array.isArray(this._listeners[e])&&(this._listeners[e].length=0)}dispatchEvent(e){const s=this._listeners[e.type];if(s!==void 0){e.target=this;const n=s.slice(0);for(let a=0,r=n.length;a<r;a++)n[a].call(this,e)}}}var si;const ka="2.9.0",At=1/8,Ua=/Mac/.test((si=globalThis?.navigator)===null||si===void 0?void 0:si.platform);let I,Ji,Pt,ni,me,U,F,$e,ht,Se,we,Ne,es,ts,ve,dt,Je,is,ai,ss,ri,oi,Rt;class Te extends La{static install(e){I=e.THREE,Ji=Object.freeze(new I.Vector3(0,0,0)),Pt=Object.freeze(new I.Vector3(0,1,0)),ni=Object.freeze(new I.Vector3(0,0,1)),me=new I.Vector2,U=new I.Vector3,F=new I.Vector3,$e=new I.Vector3,ht=new I.Vector3,Se=new I.Vector3,we=new I.Vector3,Ne=new I.Vector3,es=new I.Vector3,ts=new I.Vector3,ve=new I.Spherical,dt=new I.Spherical,Je=new I.Box3,is=new I.Box3,ai=new I.Sphere,ss=new I.Quaternion,ri=new I.Quaternion,oi=new I.Matrix4,Rt=new I.Raycaster}static get ACTION(){return v}constructor(e,t){super(),this.minPolarAngle=0,this.maxPolarAngle=Math.PI,this.minAzimuthAngle=-1/0,this.maxAzimuthAngle=1/0,this.minDistance=Number.EPSILON,this.maxDistance=1/0,this.infinityDolly=!1,this.minZoom=.01,this.maxZoom=1/0,this.smoothTime=.25,this.draggingSmoothTime=.125,this.maxSpeed=1/0,this.azimuthRotateSpeed=1,this.polarRotateSpeed=1,this.dollySpeed=1,this.dollyDragInverted=!1,this.truckSpeed=2,this.dollyToCursor=!1,this.dragToOffset=!1,this.verticalDragToForward=!1,this.boundaryFriction=0,this.restThreshold=.01,this.colliderMeshes=[],this.cancel=()=>{},this._enabled=!0,this._state=v.NONE,this._viewport=null,this._changedDolly=0,this._changedZoom=0,this._hasRested=!0,this._boundaryEnclosesCamera=!1,this._needsUpdate=!0,this._updatedLastTime=!1,this._elementRect=new DOMRect,this._isDragging=!1,this._dragNeedsUpdate=!0,this._activePointers=[],this._lockedPointer=null,this._interactiveArea=new DOMRect(0,0,1,1),this._isUserControllingRotate=!1,this._isUserControllingDolly=!1,this._isUserControllingTruck=!1,this._isUserControllingOffset=!1,this._isUserControllingZoom=!1,this._lastDollyDirection=Qe.NONE,this._thetaVelocity={value:0},this._phiVelocity={value:0},this._radiusVelocity={value:0},this._targetVelocity=new I.Vector3,this._focalOffsetVelocity=new I.Vector3,this._zoomVelocity={value:0},this._truckInternal=(_,C,S)=>{let w,x;if(je(this._camera)){const M=U.copy(this._camera.position).sub(this._target),D=this._camera.getEffectiveFOV()*ot,k=M.length()*Math.tan(D*.5);w=this.truckSpeed*_*k/this._elementRect.height,x=this.truckSpeed*C*k/this._elementRect.height}else if(ke(this._camera)){const M=this._camera;w=_*(M.right-M.left)/M.zoom/this._elementRect.width,x=C*(M.top-M.bottom)/M.zoom/this._elementRect.height}else return;this.verticalDragToForward?(S?this.setFocalOffset(this._focalOffsetEnd.x+w,this._focalOffsetEnd.y,this._focalOffsetEnd.z,!0):this.truck(w,0,!0),this.forward(-x,!0)):S?this.setFocalOffset(this._focalOffsetEnd.x+w,this._focalOffsetEnd.y+x,this._focalOffsetEnd.z,!0):this.truck(w,x,!0)},this._rotateInternal=(_,C)=>{const S=Ke*this.azimuthRotateSpeed*_/this._elementRect.height,w=Ke*this.polarRotateSpeed*C/this._elementRect.height;this.rotate(S,w,!0)},this._dollyInternal=(_,C,S)=>{const w=Math.pow(.95,-_*this.dollySpeed),x=this._sphericalEnd.radius,M=this._sphericalEnd.radius*w,D=Ee(M,this.minDistance,this.maxDistance),k=D-M;this.infinityDolly&&this.dollyToCursor?this._dollyToNoClamp(M,!0):this.infinityDolly&&!this.dollyToCursor?(this.dollyInFixed(k,!0),this._dollyToNoClamp(D,!0)):this._dollyToNoClamp(D,!0),this.dollyToCursor&&(this._changedDolly+=(this.infinityDolly?M:D)-x,this._dollyControlCoord.set(C,S)),this._lastDollyDirection=Math.sign(-_)},this._zoomInternal=(_,C,S)=>{const w=Math.pow(.95,_*this.dollySpeed),x=this._zoom,M=this._zoom*w;this.zoomTo(M,!0),this.dollyToCursor&&(this._changedZoom+=M-x,this._dollyControlCoord.set(C,S))},typeof I>"u"&&console.error("camera-controls: `THREE` is undefined. You must first run `CameraControls.install( { THREE: THREE } )`. Check the docs for further information."),this._camera=e,this._yAxisUpSpace=new I.Quaternion().setFromUnitVectors(this._camera.up,Pt),this._yAxisUpSpaceInverse=this._yAxisUpSpace.clone().invert(),this._state=v.NONE,this._target=new I.Vector3,this._targetEnd=this._target.clone(),this._focalOffset=new I.Vector3,this._focalOffsetEnd=this._focalOffset.clone(),this._spherical=new I.Spherical().setFromVector3(U.copy(this._camera.position).applyQuaternion(this._yAxisUpSpace)),this._sphericalEnd=this._spherical.clone(),this._lastDistance=this._spherical.radius,this._zoom=this._camera.zoom,this._zoomEnd=this._zoom,this._lastZoom=this._zoom,this._nearPlaneCorners=[new I.Vector3,new I.Vector3,new I.Vector3,new I.Vector3],this._updateNearPlaneCorners(),this._boundary=new I.Box3(new I.Vector3(-1/0,-1/0,-1/0),new I.Vector3(1/0,1/0,1/0)),this._cameraUp0=this._camera.up.clone(),this._target0=this._target.clone(),this._position0=this._camera.position.clone(),this._zoom0=this._zoom,this._focalOffset0=this._focalOffset.clone(),this._dollyControlCoord=new I.Vector2,this.mouseButtons={left:v.ROTATE,middle:v.DOLLY,right:v.TRUCK,wheel:je(this._camera)?v.DOLLY:ke(this._camera)?v.ZOOM:v.NONE},this.touches={one:v.TOUCH_ROTATE,two:je(this._camera)?v.TOUCH_DOLLY_TRUCK:ke(this._camera)?v.TOUCH_ZOOM_TRUCK:v.NONE,three:v.TOUCH_TRUCK};const s=new I.Vector2,n=new I.Vector2,a=new I.Vector2,r=_=>{if(!this._enabled||!this._domElement)return;if(this._interactiveArea.left!==0||this._interactiveArea.top!==0||this._interactiveArea.width!==1||this._interactiveArea.height!==1){const w=this._domElement.getBoundingClientRect(),x=_.clientX/w.width,M=_.clientY/w.height;if(x<this._interactiveArea.left||x>this._interactiveArea.right||M<this._interactiveArea.top||M>this._interactiveArea.bottom)return}const C=_.pointerType!=="mouse"?null:(_.buttons&$.LEFT)===$.LEFT?$.LEFT:(_.buttons&$.MIDDLE)===$.MIDDLE?$.MIDDLE:(_.buttons&$.RIGHT)===$.RIGHT?$.RIGHT:null;if(C!==null){const w=this._findPointerByMouseButton(C);w&&this._disposePointer(w)}if((_.buttons&$.LEFT)===$.LEFT&&this._lockedPointer)return;const S={pointerId:_.pointerId,clientX:_.clientX,clientY:_.clientY,deltaX:0,deltaY:0,mouseButton:C};this._activePointers.push(S),this._domElement.ownerDocument.removeEventListener("pointermove",l,{passive:!1}),this._domElement.ownerDocument.removeEventListener("pointerup",c),this._domElement.ownerDocument.addEventListener("pointermove",l,{passive:!1}),this._domElement.ownerDocument.addEventListener("pointerup",c),this._isDragging=!0,m(_)},l=_=>{_.cancelable&&_.preventDefault();const C=_.pointerId,S=this._lockedPointer||this._findPointerById(C);if(S){if(S.clientX=_.clientX,S.clientY=_.clientY,S.deltaX=_.movementX,S.deltaY=_.movementY,this._state=0,_.pointerType==="touch")switch(this._activePointers.length){case 1:this._state=this.touches.one;break;case 2:this._state=this.touches.two;break;case 3:this._state=this.touches.three;break}else(!this._isDragging&&this._lockedPointer||this._isDragging&&(_.buttons&$.LEFT)===$.LEFT)&&(this._state=this._state|this.mouseButtons.left),this._isDragging&&(_.buttons&$.MIDDLE)===$.MIDDLE&&(this._state=this._state|this.mouseButtons.middle),this._isDragging&&(_.buttons&$.RIGHT)===$.RIGHT&&(this._state=this._state|this.mouseButtons.right);g()}},c=_=>{const C=this._findPointerById(_.pointerId);if(!(C&&C===this._lockedPointer)){if(C&&this._disposePointer(C),_.pointerType==="touch")switch(this._activePointers.length){case 0:this._state=v.NONE;break;case 1:this._state=this.touches.one;break;case 2:this._state=this.touches.two;break;case 3:this._state=this.touches.three;break}else this._state=v.NONE;E()}};let h=-1;const d=_=>{if(!this._domElement||!this._enabled||this.mouseButtons.wheel===v.NONE)return;if(this._interactiveArea.left!==0||this._interactiveArea.top!==0||this._interactiveArea.width!==1||this._interactiveArea.height!==1){const M=this._domElement.getBoundingClientRect(),D=_.clientX/M.width,k=_.clientY/M.height;if(D<this._interactiveArea.left||D>this._interactiveArea.right||k<this._interactiveArea.top||k>this._interactiveArea.bottom)return}if(_.preventDefault(),this.dollyToCursor||this.mouseButtons.wheel===v.ROTATE||this.mouseButtons.wheel===v.TRUCK){const M=performance.now();h-M<1e3&&this._getClientRect(this._elementRect),h=M}const C=Ua?-1:-3,S=_.deltaMode===1?_.deltaY/C:_.deltaY/(C*10),w=this.dollyToCursor?(_.clientX-this._elementRect.x)/this._elementRect.width*2-1:0,x=this.dollyToCursor?(_.clientY-this._elementRect.y)/this._elementRect.height*-2+1:0;switch(this.mouseButtons.wheel){case v.ROTATE:{this._rotateInternal(_.deltaX,_.deltaY),this._isUserControllingRotate=!0;break}case v.TRUCK:{this._truckInternal(_.deltaX,_.deltaY,!1),this._isUserControllingTruck=!0;break}case v.OFFSET:{this._truckInternal(_.deltaX,_.deltaY,!0),this._isUserControllingOffset=!0;break}case v.DOLLY:{this._dollyInternal(-S,w,x),this._isUserControllingDolly=!0;break}case v.ZOOM:{this._zoomInternal(-S,w,x),this._isUserControllingZoom=!0;break}}this.dispatchEvent({type:"control"})},f=_=>{if(!(!this._domElement||!this._enabled)){if(this.mouseButtons.right===Te.ACTION.NONE){const C=_ instanceof PointerEvent?_.pointerId:0,S=this._findPointerById(C);S&&this._disposePointer(S),this._domElement.ownerDocument.removeEventListener("pointermove",l,{passive:!1}),this._domElement.ownerDocument.removeEventListener("pointerup",c);return}_.preventDefault()}},m=_=>{if(!this._enabled)return;if(ti(this._activePointers,me),this._getClientRect(this._elementRect),s.copy(me),n.copy(me),this._activePointers.length>=2){const S=me.x-this._activePointers[1].clientX,w=me.y-this._activePointers[1].clientY,x=Math.sqrt(S*S+w*w);a.set(0,x);const M=(this._activePointers[0].clientX+this._activePointers[1].clientX)*.5,D=(this._activePointers[0].clientY+this._activePointers[1].clientY)*.5;n.set(M,D)}if(this._state=0,!_)this._lockedPointer&&(this._state=this._state|this.mouseButtons.left);else if("pointerType"in _&&_.pointerType==="touch")switch(this._activePointers.length){case 1:this._state=this.touches.one;break;case 2:this._state=this.touches.two;break;case 3:this._state=this.touches.three;break}else!this._lockedPointer&&(_.buttons&$.LEFT)===$.LEFT&&(this._state=this._state|this.mouseButtons.left),(_.buttons&$.MIDDLE)===$.MIDDLE&&(this._state=this._state|this.mouseButtons.middle),(_.buttons&$.RIGHT)===$.RIGHT&&(this._state=this._state|this.mouseButtons.right);((this._state&v.ROTATE)===v.ROTATE||(this._state&v.TOUCH_ROTATE)===v.TOUCH_ROTATE||(this._state&v.TOUCH_DOLLY_ROTATE)===v.TOUCH_DOLLY_ROTATE||(this._state&v.TOUCH_ZOOM_ROTATE)===v.TOUCH_ZOOM_ROTATE)&&(this._sphericalEnd.theta=this._spherical.theta,this._sphericalEnd.phi=this._spherical.phi,this._thetaVelocity.value=0,this._phiVelocity.value=0),((this._state&v.TRUCK)===v.TRUCK||(this._state&v.TOUCH_TRUCK)===v.TOUCH_TRUCK||(this._state&v.TOUCH_DOLLY_TRUCK)===v.TOUCH_DOLLY_TRUCK||(this._state&v.TOUCH_ZOOM_TRUCK)===v.TOUCH_ZOOM_TRUCK)&&(this._targetEnd.copy(this._target),this._targetVelocity.set(0,0,0)),((this._state&v.DOLLY)===v.DOLLY||(this._state&v.TOUCH_DOLLY)===v.TOUCH_DOLLY||(this._state&v.TOUCH_DOLLY_TRUCK)===v.TOUCH_DOLLY_TRUCK||(this._state&v.TOUCH_DOLLY_OFFSET)===v.TOUCH_DOLLY_OFFSET||(this._state&v.TOUCH_DOLLY_ROTATE)===v.TOUCH_DOLLY_ROTATE)&&(this._sphericalEnd.radius=this._spherical.radius,this._radiusVelocity.value=0),((this._state&v.ZOOM)===v.ZOOM||(this._state&v.TOUCH_ZOOM)===v.TOUCH_ZOOM||(this._state&v.TOUCH_ZOOM_TRUCK)===v.TOUCH_ZOOM_TRUCK||(this._state&v.TOUCH_ZOOM_OFFSET)===v.TOUCH_ZOOM_OFFSET||(this._state&v.TOUCH_ZOOM_ROTATE)===v.TOUCH_ZOOM_ROTATE)&&(this._zoomEnd=this._zoom,this._zoomVelocity.value=0),((this._state&v.OFFSET)===v.OFFSET||(this._state&v.TOUCH_OFFSET)===v.TOUCH_OFFSET||(this._state&v.TOUCH_DOLLY_OFFSET)===v.TOUCH_DOLLY_OFFSET||(this._state&v.TOUCH_ZOOM_OFFSET)===v.TOUCH_ZOOM_OFFSET)&&(this._focalOffsetEnd.copy(this._focalOffset),this._focalOffsetVelocity.set(0,0,0)),this.dispatchEvent({type:"controlstart"})},g=()=>{if(!this._enabled||!this._dragNeedsUpdate)return;this._dragNeedsUpdate=!1,ti(this._activePointers,me);const C=this._domElement&&this._domElement.ownerDocument.pointerLockElement===this._domElement?this._lockedPointer||this._activePointers[0]:null,S=C?-C.deltaX:n.x-me.x,w=C?-C.deltaY:n.y-me.y;if(n.copy(me),((this._state&v.ROTATE)===v.ROTATE||(this._state&v.TOUCH_ROTATE)===v.TOUCH_ROTATE||(this._state&v.TOUCH_DOLLY_ROTATE)===v.TOUCH_DOLLY_ROTATE||(this._state&v.TOUCH_ZOOM_ROTATE)===v.TOUCH_ZOOM_ROTATE)&&(this._rotateInternal(S,w),this._isUserControllingRotate=!0),(this._state&v.DOLLY)===v.DOLLY||(this._state&v.ZOOM)===v.ZOOM){const x=this.dollyToCursor?(s.x-this._elementRect.x)/this._elementRect.width*2-1:0,M=this.dollyToCursor?(s.y-this._elementRect.y)/this._elementRect.height*-2+1:0,D=this.dollyDragInverted?-1:1;(this._state&v.DOLLY)===v.DOLLY?(this._dollyInternal(D*w*At,x,M),this._isUserControllingDolly=!0):(this._zoomInternal(D*w*At,x,M),this._isUserControllingZoom=!0)}if((this._state&v.TOUCH_DOLLY)===v.TOUCH_DOLLY||(this._state&v.TOUCH_ZOOM)===v.TOUCH_ZOOM||(this._state&v.TOUCH_DOLLY_TRUCK)===v.TOUCH_DOLLY_TRUCK||(this._state&v.TOUCH_ZOOM_TRUCK)===v.TOUCH_ZOOM_TRUCK||(this._state&v.TOUCH_DOLLY_OFFSET)===v.TOUCH_DOLLY_OFFSET||(this._state&v.TOUCH_ZOOM_OFFSET)===v.TOUCH_ZOOM_OFFSET||(this._state&v.TOUCH_DOLLY_ROTATE)===v.TOUCH_DOLLY_ROTATE||(this._state&v.TOUCH_ZOOM_ROTATE)===v.TOUCH_ZOOM_ROTATE){const x=me.x-this._activePointers[1].clientX,M=me.y-this._activePointers[1].clientY,D=Math.sqrt(x*x+M*M),k=a.y-D;a.set(0,D);const R=this.dollyToCursor?(n.x-this._elementRect.x)/this._elementRect.width*2-1:0,B=this.dollyToCursor?(n.y-this._elementRect.y)/this._elementRect.height*-2+1:0;(this._state&v.TOUCH_DOLLY)===v.TOUCH_DOLLY||(this._state&v.TOUCH_DOLLY_ROTATE)===v.TOUCH_DOLLY_ROTATE||(this._state&v.TOUCH_DOLLY_TRUCK)===v.TOUCH_DOLLY_TRUCK||(this._state&v.TOUCH_DOLLY_OFFSET)===v.TOUCH_DOLLY_OFFSET?(this._dollyInternal(k*At,R,B),this._isUserControllingDolly=!0):(this._zoomInternal(k*At,R,B),this._isUserControllingZoom=!0)}((this._state&v.TRUCK)===v.TRUCK||(this._state&v.TOUCH_TRUCK)===v.TOUCH_TRUCK||(this._state&v.TOUCH_DOLLY_TRUCK)===v.TOUCH_DOLLY_TRUCK||(this._state&v.TOUCH_ZOOM_TRUCK)===v.TOUCH_ZOOM_TRUCK)&&(this._truckInternal(S,w,!1),this._isUserControllingTruck=!0),((this._state&v.OFFSET)===v.OFFSET||(this._state&v.TOUCH_OFFSET)===v.TOUCH_OFFSET||(this._state&v.TOUCH_DOLLY_OFFSET)===v.TOUCH_DOLLY_OFFSET||(this._state&v.TOUCH_ZOOM_OFFSET)===v.TOUCH_ZOOM_OFFSET)&&(this._truckInternal(S,w,!0),this._isUserControllingOffset=!0),this.dispatchEvent({type:"control"})},E=()=>{ti(this._activePointers,me),n.copy(me),this._dragNeedsUpdate=!1,(this._activePointers.length===0||this._activePointers.length===1&&this._activePointers[0]===this._lockedPointer)&&(this._isDragging=!1),this._activePointers.length===0&&this._domElement&&(this._domElement.ownerDocument.removeEventListener("pointermove",l,{passive:!1}),this._domElement.ownerDocument.removeEventListener("pointerup",c),this.dispatchEvent({type:"controlend"}))};this.lockPointer=()=>{!this._enabled||!this._domElement||(this.cancel(),this._lockedPointer={pointerId:-1,clientX:0,clientY:0,deltaX:0,deltaY:0,mouseButton:null},this._activePointers.push(this._lockedPointer),this._domElement.ownerDocument.removeEventListener("pointermove",l,{passive:!1}),this._domElement.ownerDocument.removeEventListener("pointerup",c),this._domElement.requestPointerLock(),this._domElement.ownerDocument.addEventListener("pointerlockchange",y),this._domElement.ownerDocument.addEventListener("pointerlockerror",T),this._domElement.ownerDocument.addEventListener("pointermove",l,{passive:!1}),this._domElement.ownerDocument.addEventListener("pointerup",c),m())},this.unlockPointer=()=>{var _,C,S;this._lockedPointer!==null&&(this._disposePointer(this._lockedPointer),this._lockedPointer=null),(_=this._domElement)===null||_===void 0||_.ownerDocument.exitPointerLock(),(C=this._domElement)===null||C===void 0||C.ownerDocument.removeEventListener("pointerlockchange",y),(S=this._domElement)===null||S===void 0||S.ownerDocument.removeEventListener("pointerlockerror",T),this.cancel()};const y=()=>{this._domElement&&this._domElement.ownerDocument.pointerLockElement===this._domElement||this.unlockPointer()},T=()=>{this.unlockPointer()};this._addAllEventListeners=_=>{this._domElement=_,this._domElement.style.touchAction="none",this._domElement.style.userSelect="none",this._domElement.style.webkitUserSelect="none",this._domElement.addEventListener("pointerdown",r),this._domElement.addEventListener("pointercancel",c),this._domElement.addEventListener("wheel",d,{passive:!1}),this._domElement.addEventListener("contextmenu",f)},this._removeAllEventListeners=()=>{this._domElement&&(this._domElement.style.touchAction="",this._domElement.style.userSelect="",this._domElement.style.webkitUserSelect="",this._domElement.removeEventListener("pointerdown",r),this._domElement.removeEventListener("pointercancel",c),this._domElement.removeEventListener("wheel",d,{passive:!1}),this._domElement.removeEventListener("contextmenu",f),this._domElement.ownerDocument.removeEventListener("pointermove",l,{passive:!1}),this._domElement.ownerDocument.removeEventListener("pointerup",c),this._domElement.ownerDocument.removeEventListener("pointerlockchange",y),this._domElement.ownerDocument.removeEventListener("pointerlockerror",T))},this.cancel=()=>{this._state!==v.NONE&&(this._state=v.NONE,this._activePointers.length=0,E())},t&&this.connect(t),this.update(0)}get camera(){return this._camera}set camera(e){this._camera=e,this.updateCameraUp(),this._camera.updateProjectionMatrix(),this._updateNearPlaneCorners(),this._needsUpdate=!0}get enabled(){return this._enabled}set enabled(e){this._enabled=e,this._domElement&&(e?(this._domElement.style.touchAction="none",this._domElement.style.userSelect="none",this._domElement.style.webkitUserSelect="none"):(this.cancel(),this._domElement.style.touchAction="",this._domElement.style.userSelect="",this._domElement.style.webkitUserSelect=""))}get active(){return!this._hasRested}get currentAction(){return this._state}get distance(){return this._spherical.radius}set distance(e){this._spherical.radius===e&&this._sphericalEnd.radius===e||(this._spherical.radius=e,this._sphericalEnd.radius=e,this._needsUpdate=!0)}get azimuthAngle(){return this._spherical.theta}set azimuthAngle(e){this._spherical.theta===e&&this._sphericalEnd.theta===e||(this._spherical.theta=e,this._sphericalEnd.theta=e,this._needsUpdate=!0)}get polarAngle(){return this._spherical.phi}set polarAngle(e){this._spherical.phi===e&&this._sphericalEnd.phi===e||(this._spherical.phi=e,this._sphericalEnd.phi=e,this._needsUpdate=!0)}get boundaryEnclosesCamera(){return this._boundaryEnclosesCamera}set boundaryEnclosesCamera(e){this._boundaryEnclosesCamera=e,this._needsUpdate=!0}set interactiveArea(e){this._interactiveArea.width=Ee(e.width,0,1),this._interactiveArea.height=Ee(e.height,0,1),this._interactiveArea.x=Ee(e.x,0,1-this._interactiveArea.width),this._interactiveArea.y=Ee(e.y,0,1-this._interactiveArea.height)}addEventListener(e,t){super.addEventListener(e,t)}removeEventListener(e,t){super.removeEventListener(e,t)}rotate(e,t,s=!1){return this.rotateTo(this._sphericalEnd.theta+e,this._sphericalEnd.phi+t,s)}rotateAzimuthTo(e,t=!1){return this.rotateTo(e,this._sphericalEnd.phi,t)}rotatePolarTo(e,t=!1){return this.rotateTo(this._sphericalEnd.theta,e,t)}rotateTo(e,t,s=!1){this._isUserControllingRotate=!1;const n=Ee(e,this.minAzimuthAngle,this.maxAzimuthAngle),a=Ee(t,this.minPolarAngle,this.maxPolarAngle);this._sphericalEnd.theta=n,this._sphericalEnd.phi=a,this._sphericalEnd.makeSafe(),this._needsUpdate=!0,s||(this._spherical.theta=this._sphericalEnd.theta,this._spherical.phi=this._sphericalEnd.phi);const r=!s||H(this._spherical.theta,this._sphericalEnd.theta,this.restThreshold)&&H(this._spherical.phi,this._sphericalEnd.phi,this.restThreshold);return this._createOnRestPromise(r)}dolly(e,t=!1){return this.dollyTo(this._sphericalEnd.radius-e,t)}dollyTo(e,t=!1){return this._isUserControllingDolly=!1,this._lastDollyDirection=Qe.NONE,this._changedDolly=0,this._dollyToNoClamp(Ee(e,this.minDistance,this.maxDistance),t)}_dollyToNoClamp(e,t=!1){const s=this._sphericalEnd.radius;if(this.colliderMeshes.length>=1){const r=this._collisionTest(),l=H(r,this._spherical.radius);if(!(s>e)&&l)return Promise.resolve();this._sphericalEnd.radius=Math.min(e,r)}else this._sphericalEnd.radius=e;this._needsUpdate=!0,t||(this._spherical.radius=this._sphericalEnd.radius);const a=!t||H(this._spherical.radius,this._sphericalEnd.radius,this.restThreshold);return this._createOnRestPromise(a)}dollyInFixed(e,t=!1){this._targetEnd.add(this._getCameraDirection(ht).multiplyScalar(e)),t||this._target.copy(this._targetEnd);const s=!t||H(this._target.x,this._targetEnd.x,this.restThreshold)&&H(this._target.y,this._targetEnd.y,this.restThreshold)&&H(this._target.z,this._targetEnd.z,this.restThreshold);return this._createOnRestPromise(s)}zoom(e,t=!1){return this.zoomTo(this._zoomEnd+e,t)}zoomTo(e,t=!1){this._isUserControllingZoom=!1,this._zoomEnd=Ee(e,this.minZoom,this.maxZoom),this._needsUpdate=!0,t||(this._zoom=this._zoomEnd);const s=!t||H(this._zoom,this._zoomEnd,this.restThreshold);return this._changedZoom=0,this._createOnRestPromise(s)}pan(e,t,s=!1){return console.warn("`pan` has been renamed to `truck`"),this.truck(e,t,s)}truck(e,t,s=!1){this._camera.updateMatrix(),Se.setFromMatrixColumn(this._camera.matrix,0),we.setFromMatrixColumn(this._camera.matrix,1),Se.multiplyScalar(e),we.multiplyScalar(-t);const n=U.copy(Se).add(we),a=F.copy(this._targetEnd).add(n);return this.moveTo(a.x,a.y,a.z,s)}forward(e,t=!1){U.setFromMatrixColumn(this._camera.matrix,0),U.crossVectors(this._camera.up,U),U.multiplyScalar(e);const s=F.copy(this._targetEnd).add(U);return this.moveTo(s.x,s.y,s.z,t)}elevate(e,t=!1){return U.copy(this._camera.up).multiplyScalar(e),this.moveTo(this._targetEnd.x+U.x,this._targetEnd.y+U.y,this._targetEnd.z+U.z,t)}moveTo(e,t,s,n=!1){this._isUserControllingTruck=!1;const a=U.set(e,t,s).sub(this._targetEnd);this._encloseToBoundary(this._targetEnd,a,this.boundaryFriction),this._needsUpdate=!0,n||this._target.copy(this._targetEnd);const r=!n||H(this._target.x,this._targetEnd.x,this.restThreshold)&&H(this._target.y,this._targetEnd.y,this.restThreshold)&&H(this._target.z,this._targetEnd.z,this.restThreshold);return this._createOnRestPromise(r)}lookInDirectionOf(e,t,s,n=!1){const l=U.set(e,t,s).sub(this._targetEnd).normalize().multiplyScalar(-this._sphericalEnd.radius).add(this._targetEnd);return this.setPosition(l.x,l.y,l.z,n)}fitToBox(e,t,{cover:s=!1,paddingLeft:n=0,paddingRight:a=0,paddingBottom:r=0,paddingTop:l=0}={}){const c=[],h=e.isBox3?Je.copy(e):Je.setFromObject(e);h.isEmpty()&&(console.warn("camera-controls: fitTo() cannot be used with an empty box. Aborting"),Promise.resolve());const d=Ki(this._sphericalEnd.theta,Qi),f=Ki(this._sphericalEnd.phi,Qi);c.push(this.rotateTo(d,f,t));const m=U.setFromSpherical(this._sphericalEnd).normalize(),g=ss.setFromUnitVectors(m,ni),E=H(Math.abs(m.y),1);E&&g.multiply(ri.setFromAxisAngle(Pt,d)),g.multiply(this._yAxisUpSpaceInverse);const y=is.makeEmpty();F.copy(h.min).applyQuaternion(g),y.expandByPoint(F),F.copy(h.min).setX(h.max.x).applyQuaternion(g),y.expandByPoint(F),F.copy(h.min).setY(h.max.y).applyQuaternion(g),y.expandByPoint(F),F.copy(h.max).setZ(h.min.z).applyQuaternion(g),y.expandByPoint(F),F.copy(h.min).setZ(h.max.z).applyQuaternion(g),y.expandByPoint(F),F.copy(h.max).setY(h.min.y).applyQuaternion(g),y.expandByPoint(F),F.copy(h.max).setX(h.min.x).applyQuaternion(g),y.expandByPoint(F),F.copy(h.max).applyQuaternion(g),y.expandByPoint(F),y.min.x-=n,y.min.y-=r,y.max.x+=a,y.max.y+=l,g.setFromUnitVectors(ni,m),E&&g.premultiply(ri.invert()),g.premultiply(this._yAxisUpSpace);const T=y.getSize(U),_=y.getCenter(F).applyQuaternion(g);if(je(this._camera)){const C=this.getDistanceToFitBox(T.x,T.y,T.z,s);c.push(this.moveTo(_.x,_.y,_.z,t)),c.push(this.dollyTo(C,t)),c.push(this.setFocalOffset(0,0,0,t))}else if(ke(this._camera)){const C=this._camera,S=C.right-C.left,w=C.top-C.bottom,x=s?Math.max(S/T.x,w/T.y):Math.min(S/T.x,w/T.y);c.push(this.moveTo(_.x,_.y,_.z,t)),c.push(this.zoomTo(x,t)),c.push(this.setFocalOffset(0,0,0,t))}return Promise.all(c)}fitToSphere(e,t){const s=[],a="isObject3D"in e?Te.createBoundingSphere(e,ai):ai.copy(e);if(s.push(this.moveTo(a.center.x,a.center.y,a.center.z,t)),je(this._camera)){const r=this.getDistanceToFitSphere(a.radius);s.push(this.dollyTo(r,t))}else if(ke(this._camera)){const r=this._camera.right-this._camera.left,l=this._camera.top-this._camera.bottom,c=2*a.radius,h=Math.min(r/c,l/c);s.push(this.zoomTo(h,t))}return s.push(this.setFocalOffset(0,0,0,t)),Promise.all(s)}setLookAt(e,t,s,n,a,r,l=!1){this._isUserControllingRotate=!1,this._isUserControllingDolly=!1,this._isUserControllingTruck=!1,this._lastDollyDirection=Qe.NONE,this._changedDolly=0;const c=F.set(n,a,r),h=U.set(e,t,s);this._targetEnd.copy(c),this._sphericalEnd.setFromVector3(h.sub(c).applyQuaternion(this._yAxisUpSpace)),this.normalizeRotations(),this._needsUpdate=!0,l||(this._target.copy(this._targetEnd),this._spherical.copy(this._sphericalEnd));const d=!l||H(this._target.x,this._targetEnd.x,this.restThreshold)&&H(this._target.y,this._targetEnd.y,this.restThreshold)&&H(this._target.z,this._targetEnd.z,this.restThreshold)&&H(this._spherical.theta,this._sphericalEnd.theta,this.restThreshold)&&H(this._spherical.phi,this._sphericalEnd.phi,this.restThreshold)&&H(this._spherical.radius,this._sphericalEnd.radius,this.restThreshold);return this._createOnRestPromise(d)}lerpLookAt(e,t,s,n,a,r,l,c,h,d,f,m,g,E=!1){this._isUserControllingRotate=!1,this._isUserControllingDolly=!1,this._isUserControllingTruck=!1,this._lastDollyDirection=Qe.NONE,this._changedDolly=0;const y=U.set(n,a,r),T=F.set(e,t,s);ve.setFromVector3(T.sub(y).applyQuaternion(this._yAxisUpSpace));const _=$e.set(d,f,m),C=F.set(l,c,h);dt.setFromVector3(C.sub(_).applyQuaternion(this._yAxisUpSpace)),this._targetEnd.copy(y.lerp(_,g));const S=dt.theta-ve.theta,w=dt.phi-ve.phi,x=dt.radius-ve.radius;this._sphericalEnd.set(ve.radius+x*g,ve.phi+w*g,ve.theta+S*g),this.normalizeRotations(),this._needsUpdate=!0,E||(this._target.copy(this._targetEnd),this._spherical.copy(this._sphericalEnd));const M=!E||H(this._target.x,this._targetEnd.x,this.restThreshold)&&H(this._target.y,this._targetEnd.y,this.restThreshold)&&H(this._target.z,this._targetEnd.z,this.restThreshold)&&H(this._spherical.theta,this._sphericalEnd.theta,this.restThreshold)&&H(this._spherical.phi,this._sphericalEnd.phi,this.restThreshold)&&H(this._spherical.radius,this._sphericalEnd.radius,this.restThreshold);return this._createOnRestPromise(M)}setPosition(e,t,s,n=!1){return this.setLookAt(e,t,s,this._targetEnd.x,this._targetEnd.y,this._targetEnd.z,n)}setTarget(e,t,s,n=!1){const a=this.getPosition(U),r=this.setLookAt(a.x,a.y,a.z,e,t,s,n);return this._sphericalEnd.phi=Ee(this._sphericalEnd.phi,this.minPolarAngle,this.maxPolarAngle),r}setFocalOffset(e,t,s,n=!1){this._isUserControllingOffset=!1,this._focalOffsetEnd.set(e,t,s),this._needsUpdate=!0,n||this._focalOffset.copy(this._focalOffsetEnd);const a=!n||H(this._focalOffset.x,this._focalOffsetEnd.x,this.restThreshold)&&H(this._focalOffset.y,this._focalOffsetEnd.y,this.restThreshold)&&H(this._focalOffset.z,this._focalOffsetEnd.z,this.restThreshold);return this._createOnRestPromise(a)}setOrbitPoint(e,t,s){this._camera.updateMatrixWorld(),Se.setFromMatrixColumn(this._camera.matrixWorldInverse,0),we.setFromMatrixColumn(this._camera.matrixWorldInverse,1),Ne.setFromMatrixColumn(this._camera.matrixWorldInverse,2);const n=U.set(e,t,s),a=n.distanceTo(this._camera.position),r=n.sub(this._camera.position);Se.multiplyScalar(r.x),we.multiplyScalar(r.y),Ne.multiplyScalar(r.z),U.copy(Se).add(we).add(Ne),U.z=U.z+a,this.dollyTo(a,!1),this.setFocalOffset(-U.x,U.y,-U.z,!1),this.moveTo(e,t,s,!1)}setBoundary(e){if(!e){this._boundary.min.set(-1/0,-1/0,-1/0),this._boundary.max.set(1/0,1/0,1/0),this._needsUpdate=!0;return}this._boundary.copy(e),this._boundary.clampPoint(this._targetEnd,this._targetEnd),this._needsUpdate=!0}setViewport(e,t,s,n){if(e===null){this._viewport=null;return}this._viewport=this._viewport||new I.Vector4,typeof e=="number"?this._viewport.set(e,t,s,n):this._viewport.copy(e)}getDistanceToFitBox(e,t,s,n=!1){if(ii(this._camera,"getDistanceToFitBox"))return this._spherical.radius;const a=e/t,r=this._camera.getEffectiveFOV()*ot,l=this._camera.aspect;return((n?a>l:a<l)?t:e/l)*.5/Math.tan(r*.5)+s*.5}getDistanceToFitSphere(e){if(ii(this._camera,"getDistanceToFitSphere"))return this._spherical.radius;const t=this._camera.getEffectiveFOV()*ot,s=Math.atan(Math.tan(t*.5)*this._camera.aspect)*2,n=1<this._camera.aspect?t:s;return e/Math.sin(n*.5)}getTarget(e,t=!0){return(e&&e.isVector3?e:new I.Vector3).copy(t?this._targetEnd:this._target)}getPosition(e,t=!0){return(e&&e.isVector3?e:new I.Vector3).setFromSpherical(t?this._sphericalEnd:this._spherical).applyQuaternion(this._yAxisUpSpaceInverse).add(t?this._targetEnd:this._target)}getSpherical(e,t=!0){return(e||new I.Spherical).copy(t?this._sphericalEnd:this._spherical)}getFocalOffset(e,t=!0){return(e&&e.isVector3?e:new I.Vector3).copy(t?this._focalOffsetEnd:this._focalOffset)}normalizeRotations(){this._sphericalEnd.theta=this._sphericalEnd.theta%Ke,this._sphericalEnd.theta<0&&(this._sphericalEnd.theta+=Ke),this._spherical.theta+=Ke*Math.round((this._sphericalEnd.theta-this._spherical.theta)/Ke)}stop(){this._focalOffset.copy(this._focalOffsetEnd),this._target.copy(this._targetEnd),this._spherical.copy(this._sphericalEnd),this._zoom=this._zoomEnd}reset(e=!1){if(!H(this._camera.up.x,this._cameraUp0.x)||!H(this._camera.up.y,this._cameraUp0.y)||!H(this._camera.up.z,this._cameraUp0.z)){this._camera.up.copy(this._cameraUp0);const s=this.getPosition(U);this.updateCameraUp(),this.setPosition(s.x,s.y,s.z)}const t=[this.setLookAt(this._position0.x,this._position0.y,this._position0.z,this._target0.x,this._target0.y,this._target0.z,e),this.setFocalOffset(this._focalOffset0.x,this._focalOffset0.y,this._focalOffset0.z,e),this.zoomTo(this._zoom0,e)];return Promise.all(t)}saveState(){this._cameraUp0.copy(this._camera.up),this.getTarget(this._target0),this.getPosition(this._position0),this._zoom0=this._zoom,this._focalOffset0.copy(this._focalOffset)}updateCameraUp(){this._yAxisUpSpace.setFromUnitVectors(this._camera.up,Pt),this._yAxisUpSpaceInverse.copy(this._yAxisUpSpace).invert()}applyCameraUp(){const e=U.subVectors(this._target,this._camera.position).normalize(),t=F.crossVectors(e,this._camera.up);this._camera.up.crossVectors(t,e).normalize(),this._camera.updateMatrixWorld();const s=this.getPosition(U);this.updateCameraUp(),this.setPosition(s.x,s.y,s.z)}update(e){const t=this._sphericalEnd.theta-this._spherical.theta,s=this._sphericalEnd.phi-this._spherical.phi,n=this._sphericalEnd.radius-this._spherical.radius,a=es.subVectors(this._targetEnd,this._target),r=ts.subVectors(this._focalOffsetEnd,this._focalOffset),l=this._zoomEnd-this._zoom;if(q(t))this._thetaVelocity.value=0,this._spherical.theta=this._sphericalEnd.theta;else{const f=this._isUserControllingRotate?this.draggingSmoothTime:this.smoothTime;this._spherical.theta=Mt(this._spherical.theta,this._sphericalEnd.theta,this._thetaVelocity,f,1/0,e),this._needsUpdate=!0}if(q(s))this._phiVelocity.value=0,this._spherical.phi=this._sphericalEnd.phi;else{const f=this._isUserControllingRotate?this.draggingSmoothTime:this.smoothTime;this._spherical.phi=Mt(this._spherical.phi,this._sphericalEnd.phi,this._phiVelocity,f,1/0,e),this._needsUpdate=!0}if(q(n))this._radiusVelocity.value=0,this._spherical.radius=this._sphericalEnd.radius;else{const f=this._isUserControllingDolly?this.draggingSmoothTime:this.smoothTime;this._spherical.radius=Mt(this._spherical.radius,this._sphericalEnd.radius,this._radiusVelocity,f,this.maxSpeed,e),this._needsUpdate=!0}if(q(a.x)&&q(a.y)&&q(a.z))this._targetVelocity.set(0,0,0),this._target.copy(this._targetEnd);else{const f=this._isUserControllingTruck?this.draggingSmoothTime:this.smoothTime;$i(this._target,this._targetEnd,this._targetVelocity,f,this.maxSpeed,e,this._target),this._needsUpdate=!0}if(q(r.x)&&q(r.y)&&q(r.z))this._focalOffsetVelocity.set(0,0,0),this._focalOffset.copy(this._focalOffsetEnd);else{const f=this._isUserControllingOffset?this.draggingSmoothTime:this.smoothTime;$i(this._focalOffset,this._focalOffsetEnd,this._focalOffsetVelocity,f,this.maxSpeed,e,this._focalOffset),this._needsUpdate=!0}if(q(l))this._zoomVelocity.value=0,this._zoom=this._zoomEnd;else{const f=this._isUserControllingZoom?this.draggingSmoothTime:this.smoothTime;this._zoom=Mt(this._zoom,this._zoomEnd,this._zoomVelocity,f,1/0,e)}if(this.dollyToCursor){if(je(this._camera)&&this._changedDolly!==0){const f=this._spherical.radius-this._lastDistance,m=this._camera,g=this._getCameraDirection(ht),E=U.copy(g).cross(m.up).normalize();E.lengthSq()===0&&(E.x=1);const y=F.crossVectors(E,g),T=this._sphericalEnd.radius*Math.tan(m.getEffectiveFOV()*ot*.5),C=(this._sphericalEnd.radius-f-this._sphericalEnd.radius)/this._sphericalEnd.radius,S=$e.copy(this._targetEnd).add(E.multiplyScalar(this._dollyControlCoord.x*T*m.aspect)).add(y.multiplyScalar(this._dollyControlCoord.y*T)),w=U.copy(this._targetEnd).lerp(S,C),x=this._lastDollyDirection===Qe.IN&&this._spherical.radius<=this.minDistance,M=this._lastDollyDirection===Qe.OUT&&this.maxDistance<=this._spherical.radius;if(this.infinityDolly&&(x||M)){this._sphericalEnd.radius-=f,this._spherical.radius-=f;const k=F.copy(g).multiplyScalar(-f);w.add(k)}this._boundary.clampPoint(w,w);const D=F.subVectors(w,this._targetEnd);this._targetEnd.copy(w),this._target.add(D),this._changedDolly-=f,q(this._changedDolly)&&(this._changedDolly=0)}else if(ke(this._camera)&&this._changedZoom!==0){const f=this._zoom-this._lastZoom,m=this._camera,g=U.set(this._dollyControlCoord.x,this._dollyControlCoord.y,(m.near+m.far)/(m.near-m.far)).unproject(m),E=F.set(0,0,-1).applyQuaternion(m.quaternion),y=$e.copy(g).add(E.multiplyScalar(-g.dot(m.up))),_=-(this._zoom-f-this._zoom)/this._zoom,C=this._getCameraDirection(ht),S=this._targetEnd.dot(C),w=U.copy(this._targetEnd).lerp(y,_),x=w.dot(C),M=C.multiplyScalar(x-S);w.sub(M),this._boundary.clampPoint(w,w);const D=F.subVectors(w,this._targetEnd);this._targetEnd.copy(w),this._target.add(D),this._changedZoom-=f,q(this._changedZoom)&&(this._changedZoom=0)}}this._camera.zoom!==this._zoom&&(this._camera.zoom=this._zoom,this._camera.updateProjectionMatrix(),this._updateNearPlaneCorners(),this._needsUpdate=!0),this._dragNeedsUpdate=!0;const c=this._collisionTest();this._spherical.radius=Math.min(this._spherical.radius,c),this._spherical.makeSafe(),this._camera.position.setFromSpherical(this._spherical).applyQuaternion(this._yAxisUpSpaceInverse).add(this._target),this._camera.lookAt(this._target),(!q(this._focalOffset.x)||!q(this._focalOffset.y)||!q(this._focalOffset.z))&&(this._camera.updateMatrixWorld(),Se.setFromMatrixColumn(this._camera.matrix,0),we.setFromMatrixColumn(this._camera.matrix,1),Ne.setFromMatrixColumn(this._camera.matrix,2),Se.multiplyScalar(this._focalOffset.x),we.multiplyScalar(-this._focalOffset.y),Ne.multiplyScalar(this._focalOffset.z),U.copy(Se).add(we).add(Ne),this._camera.position.add(U)),this._boundaryEnclosesCamera&&this._encloseToBoundary(this._camera.position.copy(this._target),U.setFromSpherical(this._spherical).applyQuaternion(this._yAxisUpSpaceInverse),1);const d=this._needsUpdate;return d&&!this._updatedLastTime?(this._hasRested=!1,this.dispatchEvent({type:"wake"}),this.dispatchEvent({type:"update"})):d?(this.dispatchEvent({type:"update"}),q(t,this.restThreshold)&&q(s,this.restThreshold)&&q(n,this.restThreshold)&&q(a.x,this.restThreshold)&&q(a.y,this.restThreshold)&&q(a.z,this.restThreshold)&&q(r.x,this.restThreshold)&&q(r.y,this.restThreshold)&&q(r.z,this.restThreshold)&&q(l,this.restThreshold)&&!this._hasRested&&(this._hasRested=!0,this.dispatchEvent({type:"rest"}))):!d&&this._updatedLastTime&&this.dispatchEvent({type:"sleep"}),this._lastDistance=this._spherical.radius,this._lastZoom=this._zoom,this._updatedLastTime=d,this._needsUpdate=!1,d}toJSON(){return JSON.stringify({enabled:this._enabled,minDistance:this.minDistance,maxDistance:lt(this.maxDistance),minZoom:this.minZoom,maxZoom:lt(this.maxZoom),minPolarAngle:this.minPolarAngle,maxPolarAngle:lt(this.maxPolarAngle),minAzimuthAngle:lt(this.minAzimuthAngle),maxAzimuthAngle:lt(this.maxAzimuthAngle),smoothTime:this.smoothTime,draggingSmoothTime:this.draggingSmoothTime,dollySpeed:this.dollySpeed,truckSpeed:this.truckSpeed,dollyToCursor:this.dollyToCursor,verticalDragToForward:this.verticalDragToForward,target:this._targetEnd.toArray(),position:U.setFromSpherical(this._sphericalEnd).add(this._targetEnd).toArray(),zoom:this._zoomEnd,focalOffset:this._focalOffsetEnd.toArray(),target0:this._target0.toArray(),position0:this._position0.toArray(),zoom0:this._zoom0,focalOffset0:this._focalOffset0.toArray()})}fromJSON(e,t=!1){const s=JSON.parse(e);this.enabled=s.enabled,this.minDistance=s.minDistance,this.maxDistance=ct(s.maxDistance),this.minZoom=s.minZoom,this.maxZoom=ct(s.maxZoom),this.minPolarAngle=s.minPolarAngle,this.maxPolarAngle=ct(s.maxPolarAngle),this.minAzimuthAngle=ct(s.minAzimuthAngle),this.maxAzimuthAngle=ct(s.maxAzimuthAngle),this.smoothTime=s.smoothTime,this.draggingSmoothTime=s.draggingSmoothTime,this.dollySpeed=s.dollySpeed,this.truckSpeed=s.truckSpeed,this.dollyToCursor=s.dollyToCursor,this.verticalDragToForward=s.verticalDragToForward,this._target0.fromArray(s.target0),this._position0.fromArray(s.position0),this._zoom0=s.zoom0,this._focalOffset0.fromArray(s.focalOffset0),this.moveTo(s.target[0],s.target[1],s.target[2],t),ve.setFromVector3(U.fromArray(s.position).sub(this._targetEnd).applyQuaternion(this._yAxisUpSpace)),this.rotateTo(ve.theta,ve.phi,t),this.dollyTo(ve.radius,t),this.zoomTo(s.zoom,t),this.setFocalOffset(s.focalOffset[0],s.focalOffset[1],s.focalOffset[2],t),this._needsUpdate=!0}connect(e){if(this._domElement){console.warn("camera-controls is already connected.");return}e.setAttribute("data-camera-controls-version",ka),this._addAllEventListeners(e),this._getClientRect(this._elementRect)}disconnect(){this.cancel(),this._removeAllEventListeners(),this._domElement&&(this._domElement.removeAttribute("data-camera-controls-version"),this._domElement=void 0)}dispose(){this.removeAllEventListeners(),this.disconnect()}_getTargetDirection(e){return e.setFromSpherical(this._spherical).divideScalar(this._spherical.radius).applyQuaternion(this._yAxisUpSpaceInverse)}_getCameraDirection(e){return this._getTargetDirection(e).negate()}_findPointerById(e){return this._activePointers.find(t=>t.pointerId===e)}_findPointerByMouseButton(e){return this._activePointers.find(t=>t.mouseButton===e)}_disposePointer(e){this._activePointers.splice(this._activePointers.indexOf(e),1)}_encloseToBoundary(e,t,s){const n=t.lengthSq();if(n===0)return e;const a=F.copy(t).add(e),l=this._boundary.clampPoint(a,$e).sub(a),c=l.lengthSq();if(c===0)return e.add(t);if(c===n)return e;if(s===0)return e.add(t).add(l);{const h=1+s*c/t.dot(l);return e.add(F.copy(t).multiplyScalar(h)).add(l.multiplyScalar(1-s))}}_updateNearPlaneCorners(){if(je(this._camera)){const e=this._camera,t=e.near,s=e.getEffectiveFOV()*ot,n=Math.tan(s*.5)*t,a=n*e.aspect;this._nearPlaneCorners[0].set(-a,-n,0),this._nearPlaneCorners[1].set(a,-n,0),this._nearPlaneCorners[2].set(a,n,0),this._nearPlaneCorners[3].set(-a,n,0)}else if(ke(this._camera)){const e=this._camera,t=1/e.zoom,s=e.left*t,n=e.right*t,a=e.top*t,r=e.bottom*t;this._nearPlaneCorners[0].set(s,a,0),this._nearPlaneCorners[1].set(n,a,0),this._nearPlaneCorners[2].set(n,r,0),this._nearPlaneCorners[3].set(s,r,0)}}_collisionTest(){let e=1/0;if(!(this.colliderMeshes.length>=1)||ii(this._camera,"_collisionTest"))return e;const s=this._getTargetDirection(ht);oi.lookAt(Ji,s,this._camera.up);for(let n=0;n<4;n++){const a=F.copy(this._nearPlaneCorners[n]);a.applyMatrix4(oi);const r=$e.addVectors(this._target,a);Rt.set(r,s),Rt.far=this._spherical.radius+1;const l=Rt.intersectObjects(this.colliderMeshes);l.length!==0&&l[0].distance<e&&(e=l[0].distance)}return e}_getClientRect(e){if(!this._domElement)return;const t=this._domElement.getBoundingClientRect();return e.x=t.left,e.y=t.top,this._viewport?(e.x+=this._viewport.x,e.y+=t.height-this._viewport.w-this._viewport.y,e.width=this._viewport.z,e.height=this._viewport.w):(e.width=t.width,e.height=t.height),e}_createOnRestPromise(e){return e?Promise.resolve():(this._hasRested=!1,this.dispatchEvent({type:"transitionstart"}),new Promise(t=>{const s=()=>{this.removeEventListener("rest",s),t()};this.addEventListener("rest",s)}))}_addAllEventListeners(e){}_removeAllEventListeners(){}get dampingFactor(){return console.warn(".dampingFactor has been deprecated. use smoothTime (in seconds) instead."),0}set dampingFactor(e){console.warn(".dampingFactor has been deprecated. use smoothTime (in seconds) instead.")}get draggingDampingFactor(){return console.warn(".draggingDampingFactor has been deprecated. use draggingSmoothTime (in seconds) instead."),0}set draggingDampingFactor(e){console.warn(".draggingDampingFactor has been deprecated. use draggingSmoothTime (in seconds) instead.")}static createBoundingSphere(e,t=new I.Sphere){const s=t,n=s.center;Je.makeEmpty(),e.traverseVisible(r=>{r.isMesh&&Je.expandByObject(r)}),Je.getCenter(n);let a=0;return e.traverseVisible(r=>{if(!r.isMesh)return;const l=r,c=l.geometry.clone();c.applyMatrix4(l.matrixWorld);const d=c.attributes.position;for(let f=0,m=d.count;f<m;f++)U.fromBufferAttribute(d,f),a=Math.max(a,n.distanceToSquared(U))}),s.radius=Math.sqrt(a),s}}const zt=i=>{const[e,t]=O.useState(i.options[i.index]),s=()=>{i.onToggle(!i.open)},n=a=>{a!==e&&(i.onSelect(a),t(a)),i.onToggle(!1)};return p.jsxs("div",{className:`dropdown ${i.up===!0?"up":""}`,children:[p.jsx("div",{className:"dropdown-toggle",onClick:s,children:`${i.title}: ${e}`}),i.open&&p.jsx("ul",{className:"dropdown-menu",children:i.options.map(a=>p.jsx("li",{onClick:()=>n(a),children:a},a))})]})},Fe=O.forwardRef(function(e,t){const s=["Renderer","Depth","Normals","UVs","Wireframe"],[n,a]=O.useState("Renderer"),[r,l]=O.useState(!1),[c,h]=O.useState(!1),[d,f]=O.useState(!1);return p.jsxs("div",{className:`CameraWindow ${e.name}`,children:[p.jsx("div",{ref:t,className:"clickable",onClick:()=>{d&&f(!1)}}),p.jsxs("div",{className:"options",children:[e.camera!==null&&p.jsx(zt,{title:"Camera",index:e.options.indexOf(e.camera.name),open:d,options:e.options,onSelect:e.onSelectCamera,onToggle:m=>{f(m)},up:!0}),p.jsx(zt,{title:"Mode",index:s.indexOf(n),open:c,options:s,onSelect:m=>{if(m===n)return;const g=m;e.onSelectRenderMode(g),a(g)},onToggle:m=>{r&&l(!1),h(m)},up:!0})]})]})}),ja=`out vec3 worldPosition;
53
- uniform float uDistance;
54
-
55
- void main() {
56
- // Scale the plane by the drawing distance
57
- worldPosition = position.xzy * uDistance;
58
- worldPosition.xz += cameraPosition.xz;
59
-
60
- gl_Position = projectionMatrix * modelViewMatrix * vec4(worldPosition, 1.0);
61
- }`,Na=`out vec4 fragColor;
62
- in vec3 worldPosition;
63
- uniform float uDivisions;
64
- uniform float uScale;
65
- uniform vec3 uColor;
66
- uniform float uDistance;
67
- uniform float uGridOpacity;
68
- uniform float uSubgridOpacity;
69
-
70
- float getGrid(float gapSize) {
71
- vec2 worldPositionByDivision = worldPosition.xz / gapSize;
72
-
73
- // Inverted, 0 where line, >1 where there's no line
74
- // We use the worldPosition (which in this case we use similarly to UVs) differential to control the anti-aliasing
75
- // We need to do the -0.5)-0.5 trick because the result fades out from 0 to 1, and we want both
76
- // worldPositionByDivision == 0.3 and worldPositionByDivision == 0.7 to result in the same fade, i.e. 0.3,
77
- // otherwise only one side of the line will be anti-aliased
78
- vec2 grid = abs(fract(worldPositionByDivision-0.5)-0.5) / fwidth(worldPositionByDivision) / 2.0;
79
- float gridLine = min(grid.x, grid.y);
80
-
81
- // Uninvert and clamp
82
- return 1.0 - min(gridLine, 1.0);
83
- }
84
-
85
- void main() {
86
- float cameraDistanceToGridPlane = max(200.0, distance(cameraPosition.y, worldPosition.y));
87
- float cameraDistanceToFragmentOnGridPlane = distance(cameraPosition.xyz, worldPosition.xyz);
88
-
89
- // The size of the grid and subgrid are powers of each other and they are determined based on camera distance.
90
- // The current grid will become the next subgrid when it becomes too small, and its next power becomes the new grid.
91
- float subGridPower = pow(uDivisions, floor(log(cameraDistanceToGridPlane) / log(uDivisions)));
92
- float gridPower = subGridPower * uDivisions;
93
-
94
- // If we want to fade both the grid and its subgrid, we need to displays 3 different opacities, with the next grid being the third
95
- float nextGridPower = gridPower * uDivisions;
96
-
97
- // 1 where grid, 0 where no grid
98
- float subgrid = getGrid(subGridPower * uScale);
99
- float grid = getGrid(gridPower * uScale);
100
- float nextGrid = getGrid(nextGridPower * uScale);
101
-
102
- // Where we are between the introduction of the current grid power and when we switch to the next grid power
103
- float stepPercentage = (cameraDistanceToGridPlane - subGridPower)/(gridPower - subGridPower);
104
-
105
- // The last x percentage of the current step over which we want to fade
106
- float fadeRange = 0.3;
107
-
108
- // We calculate the fade percentage from the step percentage and the fade range
109
- float fadePercentage = max(stepPercentage - 1.0 + fadeRange, 0.0) / fadeRange;
110
-
111
- // Set base opacity based on how close we are to the drawing distance, with a cubic falloff
112
- float baseOpacity = subgrid * pow(1.0 - min(cameraDistanceToFragmentOnGridPlane / uDistance, 1.0), 3.0);
113
-
114
- // Shade the subgrid
115
- fragColor = vec4(uColor.rgb, (baseOpacity - fadePercentage) * uSubgridOpacity);
116
-
117
- // Somewhat arbitrary additional fade coefficient to counter anti-aliasing popping when switching between grid powers
118
- float fadeCoefficient = 0.5;
119
-
120
- // Shade the grid
121
- fragColor.a = mix(fragColor.a, baseOpacity * uGridOpacity - fadePercentage * (uGridOpacity - uSubgridOpacity) * fadeCoefficient, grid);
122
-
123
- // Shade the next grid
124
- fragColor.a = mix(fragColor.a, baseOpacity * uGridOpacity, nextGrid);
125
-
126
- if (fragColor.a <= 0.0) discard;
127
- }`;class Fa extends o.ShaderMaterial{constructor(e){super({extensions:{derivatives:!0},uniforms:{uScale:{value:e?.scale!==void 0?e?.scale:.1},uDivisions:{value:e?.divisions!==void 0?e?.divisions:10},uColor:{value:e?.color!==void 0?e?.color:new o.Color(16777215)},uDistance:{value:e?.distance!==void 0?e?.distance:1e4},uSubgridOpacity:{value:e?.subgridOpacity!==void 0?e?.subgridOpacity:.15},uGridOpacity:{value:e?.gridOpacity!==void 0?e?.gridOpacity:.25}},glslVersion:o.GLSL3,side:o.DoubleSide,transparent:!0,name:"InfiniteGrid",vertexShader:ja,fragmentShader:Na})}}class za extends o.Mesh{gridMaterial;constructor(e){const t=new Fa(e);super(new o.PlaneGeometry,t),this.gridMaterial=t,this.frustumCulled=!1,this.name="InfiniteGridHelper"}update(){this.gridMaterial.needsUpdate=!0}}function ns(i){const[e,t]=O.useState(i.selected),s="toggle"+(e?" selected":"");return p.jsx("button",{className:s,onClick:()=>{const n=!e;t(n),i.onClick(n)},style:{backgroundImage:`url(${i.icon})`,backgroundPositionY:`${i.top}px`,backgroundSize:`26px ${i.height}px`}},i.name)}const Ha=`#include <common>
128
- #include <batching_pars_vertex>
129
- #include <uv_pars_vertex>
130
- #include <color_pars_vertex>
131
- #include <morphtarget_pars_vertex>
132
- #include <skinning_pars_vertex>
133
- #include <logdepthbuf_pars_vertex>
134
- #include <clipping_planes_pars_vertex>
135
-
136
- void main() {
137
- #include <uv_vertex>
138
- #include <color_vertex>
139
- #include <morphcolor_vertex>
140
- #include <batching_vertex>
141
-
142
- #if defined ( USE_SKINNING )
143
- #include <beginnormal_vertex>
144
- #include <morphnormal_vertex>
145
- #include <skinbase_vertex>
146
- #include <skinnormal_vertex>
147
- #include <defaultnormal_vertex>
148
- #endif
149
-
150
- #include <begin_vertex>
151
- #include <morphtarget_vertex>
152
- #include <skinning_vertex>
153
- #include <project_vertex>
154
- #include <logdepthbuf_vertex>
155
- #include <clipping_planes_vertex>
156
- #include <worldpos_vertex>
157
- }`,Va=`
158
- #include <common>
159
- #include <uv_pars_fragment>
160
- #include <clipping_planes_pars_fragment>
161
-
162
- void main() {
163
- #include <clipping_planes_fragment>
164
- gl_FragColor = vec4(vec3(vUv, 0.0), 1.0);
165
- }`;class Ba extends o.ShaderMaterial{constructor(){super({defines:{USE_UV:""},vertexShader:Ha,fragmentShader:Va})}}const ze=new o.Raycaster,ce=new o.Vector3,Le=new o.Vector3,K=new o.Quaternion,as={X:new o.Vector3(1,0,0),Y:new o.Vector3(0,1,0),Z:new o.Vector3(0,0,1)},li={type:"change"},rs={type:"mouseDown",mode:null},os={type:"mouseUp",mode:null},ls={type:"objectChange"};class Ya extends o.Controls{constructor(e,t=null){super(void 0,t);const s=new Qa(this);this._root=s;const n=new Ka;this._gizmo=n,s.add(n);const a=new $a;this._plane=a,s.add(a);const r=this;function l(S,w){let x=w;Object.defineProperty(r,S,{get:function(){return x!==void 0?x:w},set:function(M){x!==M&&(x=M,a[S]=M,n[S]=M,r.dispatchEvent({type:S+"-changed",value:M}),r.dispatchEvent(li))}}),r[S]=w,a[S]=w,n[S]=w}l("camera",e),l("object",void 0),l("enabled",!0),l("axis",null),l("mode","translate"),l("translationSnap",null),l("rotationSnap",null),l("scaleSnap",null),l("space","world"),l("size",1),l("dragging",!1),l("showX",!0),l("showY",!0),l("showZ",!0);const c=new o.Vector3,h=new o.Vector3,d=new o.Quaternion,f=new o.Quaternion,m=new o.Vector3,g=new o.Quaternion,E=new o.Vector3,y=new o.Vector3,T=new o.Vector3,_=0,C=new o.Vector3;l("worldPosition",c),l("worldPositionStart",h),l("worldQuaternion",d),l("worldQuaternionStart",f),l("cameraPosition",m),l("cameraQuaternion",g),l("pointStart",E),l("pointEnd",y),l("rotationAxis",T),l("rotationAngle",_),l("eye",C),this._offset=new o.Vector3,this._startNorm=new o.Vector3,this._endNorm=new o.Vector3,this._cameraScale=new o.Vector3,this._parentPosition=new o.Vector3,this._parentQuaternion=new o.Quaternion,this._parentQuaternionInv=new o.Quaternion,this._parentScale=new o.Vector3,this._worldScaleStart=new o.Vector3,this._worldQuaternionInv=new o.Quaternion,this._worldScale=new o.Vector3,this._positionStart=new o.Vector3,this._quaternionStart=new o.Quaternion,this._scaleStart=new o.Vector3,this._getPointer=Ga.bind(this),this._onPointerDown=Wa.bind(this),this._onPointerHover=Za.bind(this),this._onPointerMove=Xa.bind(this),this._onPointerUp=qa.bind(this),t!==null&&this.connect()}connect(){this.domElement.addEventListener("pointerdown",this._onPointerDown),this.domElement.addEventListener("pointermove",this._onPointerHover),this.domElement.addEventListener("pointerup",this._onPointerUp),this.domElement.style.touchAction="none"}disconnect(){this.domElement.removeEventListener("pointerdown",this._onPointerDown),this.domElement.removeEventListener("pointermove",this._onPointerHover),this.domElement.removeEventListener("pointermove",this._onPointerMove),this.domElement.removeEventListener("pointerup",this._onPointerUp),this.domElement.style.touchAction="auto"}getHelper(){return this._root}pointerHover(e){if(this.object===void 0||this.dragging===!0)return;e!==null&&ze.setFromCamera(e,this.camera);const t=ci(this._gizmo.picker[this.mode],ze);t?this.axis=t.object.name:this.axis=null}pointerDown(e){if(!(this.object===void 0||this.dragging===!0||e!=null&&e.button!==0)&&this.axis!==null){e!==null&&ze.setFromCamera(e,this.camera);const t=ci(this._plane,ze,!0);t&&(this.object.updateMatrixWorld(),this.object.parent.updateMatrixWorld(),this._positionStart.copy(this.object.position),this._quaternionStart.copy(this.object.quaternion),this._scaleStart.copy(this.object.scale),this.object.matrixWorld.decompose(this.worldPositionStart,this.worldQuaternionStart,this._worldScaleStart),this.pointStart.copy(t.point).sub(this.worldPositionStart)),this.dragging=!0,rs.mode=this.mode,this.dispatchEvent(rs)}}pointerMove(e){const t=this.axis,s=this.mode,n=this.object;let a=this.space;if(s==="scale"?a="local":(t==="E"||t==="XYZE"||t==="XYZ")&&(a="world"),n===void 0||t===null||this.dragging===!1||e!==null&&e.button!==-1)return;e!==null&&ze.setFromCamera(e,this.camera);const r=ci(this._plane,ze,!0);if(r){if(this.pointEnd.copy(r.point).sub(this.worldPositionStart),s==="translate")this._offset.copy(this.pointEnd).sub(this.pointStart),a==="local"&&t!=="XYZ"&&this._offset.applyQuaternion(this._worldQuaternionInv),t.indexOf("X")===-1&&(this._offset.x=0),t.indexOf("Y")===-1&&(this._offset.y=0),t.indexOf("Z")===-1&&(this._offset.z=0),a==="local"&&t!=="XYZ"?this._offset.applyQuaternion(this._quaternionStart).divide(this._parentScale):this._offset.applyQuaternion(this._parentQuaternionInv).divide(this._parentScale),n.position.copy(this._offset).add(this._positionStart),this.translationSnap&&(a==="local"&&(n.position.applyQuaternion(K.copy(this._quaternionStart).invert()),t.search("X")!==-1&&(n.position.x=Math.round(n.position.x/this.translationSnap)*this.translationSnap),t.search("Y")!==-1&&(n.position.y=Math.round(n.position.y/this.translationSnap)*this.translationSnap),t.search("Z")!==-1&&(n.position.z=Math.round(n.position.z/this.translationSnap)*this.translationSnap),n.position.applyQuaternion(this._quaternionStart)),a==="world"&&(n.parent&&n.position.add(ce.setFromMatrixPosition(n.parent.matrixWorld)),t.search("X")!==-1&&(n.position.x=Math.round(n.position.x/this.translationSnap)*this.translationSnap),t.search("Y")!==-1&&(n.position.y=Math.round(n.position.y/this.translationSnap)*this.translationSnap),t.search("Z")!==-1&&(n.position.z=Math.round(n.position.z/this.translationSnap)*this.translationSnap),n.parent&&n.position.sub(ce.setFromMatrixPosition(n.parent.matrixWorld))));else if(s==="scale"){if(t.search("XYZ")!==-1){let l=this.pointEnd.length()/this.pointStart.length();this.pointEnd.dot(this.pointStart)<0&&(l*=-1),Le.set(l,l,l)}else ce.copy(this.pointStart),Le.copy(this.pointEnd),ce.applyQuaternion(this._worldQuaternionInv),Le.applyQuaternion(this._worldQuaternionInv),Le.divide(ce),t.search("X")===-1&&(Le.x=1),t.search("Y")===-1&&(Le.y=1),t.search("Z")===-1&&(Le.z=1);n.scale.copy(this._scaleStart).multiply(Le),this.scaleSnap&&(t.search("X")!==-1&&(n.scale.x=Math.round(n.scale.x/this.scaleSnap)*this.scaleSnap||this.scaleSnap),t.search("Y")!==-1&&(n.scale.y=Math.round(n.scale.y/this.scaleSnap)*this.scaleSnap||this.scaleSnap),t.search("Z")!==-1&&(n.scale.z=Math.round(n.scale.z/this.scaleSnap)*this.scaleSnap||this.scaleSnap))}else if(s==="rotate"){this._offset.copy(this.pointEnd).sub(this.pointStart);const l=20/this.worldPosition.distanceTo(ce.setFromMatrixPosition(this.camera.matrixWorld));let c=!1;t==="XYZE"?(this.rotationAxis.copy(this._offset).cross(this.eye).normalize(),this.rotationAngle=this._offset.dot(ce.copy(this.rotationAxis).cross(this.eye))*l):(t==="X"||t==="Y"||t==="Z")&&(this.rotationAxis.copy(as[t]),ce.copy(as[t]),a==="local"&&ce.applyQuaternion(this.worldQuaternion),ce.cross(this.eye),ce.length()===0?c=!0:this.rotationAngle=this._offset.dot(ce.normalize())*l),(t==="E"||c)&&(this.rotationAxis.copy(this.eye),this.rotationAngle=this.pointEnd.angleTo(this.pointStart),this._startNorm.copy(this.pointStart).normalize(),this._endNorm.copy(this.pointEnd).normalize(),this.rotationAngle*=this._endNorm.cross(this._startNorm).dot(this.eye)<0?1:-1),this.rotationSnap&&(this.rotationAngle=Math.round(this.rotationAngle/this.rotationSnap)*this.rotationSnap),a==="local"&&t!=="E"&&t!=="XYZE"?(n.quaternion.copy(this._quaternionStart),n.quaternion.multiply(K.setFromAxisAngle(this.rotationAxis,this.rotationAngle)).normalize()):(this.rotationAxis.applyQuaternion(this._parentQuaternionInv),n.quaternion.copy(K.setFromAxisAngle(this.rotationAxis,this.rotationAngle)),n.quaternion.multiply(this._quaternionStart).normalize())}this.dispatchEvent(li),this.dispatchEvent(ls)}}pointerUp(e){e!==null&&e.button!==0||(this.dragging&&this.axis!==null&&(os.mode=this.mode,this.dispatchEvent(os)),this.dragging=!1,this.axis=null)}dispose(){this.disconnect(),this.traverse(function(e){e.geometry&&e.geometry.dispose(),e.material&&e.material.dispose()})}attach(e){return this.object=e,this._root.visible=!0,this}detach(){return this.object=void 0,this.axis=null,this._root.visible=!1,this}reset(){this.enabled&&this.dragging&&(this.object.position.copy(this._positionStart),this.object.quaternion.copy(this._quaternionStart),this.object.scale.copy(this._scaleStart),this.dispatchEvent(li),this.dispatchEvent(ls),this.pointStart.copy(this.pointEnd))}getRaycaster(){return ze}getMode(){return this.mode}setMode(e){this.mode=e}setTranslationSnap(e){this.translationSnap=e}setRotationSnap(e){this.rotationSnap=e}setScaleSnap(e){this.scaleSnap=e}setSize(e){this.size=e}setSpace(e){this.space=e}}function Ga(i){if(this.domElement.ownerDocument.pointerLockElement)return{x:0,y:0,button:i.button};{const e=this.domElement.getBoundingClientRect();return{x:(i.clientX-e.left)/e.width*2-1,y:-(i.clientY-e.top)/e.height*2+1,button:i.button}}}function Za(i){if(this.enabled)switch(i.pointerType){case"mouse":case"pen":this.pointerHover(this._getPointer(i));break}}function Wa(i){this.enabled&&(document.pointerLockElement||this.domElement.setPointerCapture(i.pointerId),this.domElement.addEventListener("pointermove",this._onPointerMove),this.pointerHover(this._getPointer(i)),this.pointerDown(this._getPointer(i)))}function Xa(i){this.enabled&&this.pointerMove(this._getPointer(i))}function qa(i){this.enabled&&(this.domElement.releasePointerCapture(i.pointerId),this.domElement.removeEventListener("pointermove",this._onPointerMove),this.pointerUp(this._getPointer(i)))}function ci(i,e,t){const s=e.intersectObject(i,!0);for(let n=0;n<s.length;n++)if(s[n].object.visible||t)return s[n];return!1}const Dt=new o.Euler,W=new o.Vector3(0,1,0),cs=new o.Vector3(0,0,0),hs=new o.Matrix4,It=new o.Quaternion,jt=new o.Quaternion,xe=new o.Vector3,ds=new o.Matrix4,gt=new o.Vector3(1,0,0),He=new o.Vector3(0,1,0),_t=new o.Vector3(0,0,1),Lt=new o.Vector3,ut=new o.Vector3,pt=new o.Vector3;class Qa extends o.Object3D{constructor(e){super(),this.isTransformControlsRoot=!0,this.controls=e,this.visible=!1}updateMatrixWorld(e){const t=this.controls;t.object!==void 0&&(t.object.updateMatrixWorld(),t.object.parent===null?console.error("TransformControls: The attached 3D object must be a part of the scene graph."):t.object.parent.matrixWorld.decompose(t._parentPosition,t._parentQuaternion,t._parentScale),t.object.matrixWorld.decompose(t.worldPosition,t.worldQuaternion,t._worldScale),t._parentQuaternionInv.copy(t._parentQuaternion).invert(),t._worldQuaternionInv.copy(t.worldQuaternion).invert()),t.camera.updateMatrixWorld(),t.camera.matrixWorld.decompose(t.cameraPosition,t.cameraQuaternion,t._cameraScale),t.camera.isOrthographicCamera?t.camera.getWorldDirection(t.eye).negate():t.eye.copy(t.cameraPosition).sub(t.worldPosition).normalize(),super.updateMatrixWorld(e)}}class Ka extends o.Object3D{constructor(){super(),this.isTransformControlsGizmo=!0,this.type="TransformControlsGizmo";const e=new o.MeshBasicMaterial({depthTest:!1,depthWrite:!1,fog:!1,toneMapped:!1,transparent:!0}),t=new o.LineBasicMaterial({depthTest:!1,depthWrite:!1,fog:!1,toneMapped:!1,transparent:!0}),s=e.clone();s.opacity=.15;const n=t.clone();n.opacity=.5;const a=e.clone();a.color.setHex(16711680);const r=e.clone();r.color.setHex(65280);const l=e.clone();l.color.setHex(255);const c=e.clone();c.color.setHex(16711680),c.opacity=.5;const h=e.clone();h.color.setHex(65280),h.opacity=.5;const d=e.clone();d.color.setHex(255),d.opacity=.5;const f=e.clone();f.opacity=.25;const m=e.clone();m.color.setHex(16776960),m.opacity=.25,e.clone().color.setHex(16776960);const E=e.clone();E.color.setHex(7895160);const y=new o.CylinderGeometry(0,.04,.1,12);y.translate(0,.05,0);const T=new o.BoxGeometry(.08,.08,.08);T.translate(0,.04,0);const _=new o.BufferGeometry;_.setAttribute("position",new o.Float32BufferAttribute([0,0,0,1,0,0],3));const C=new o.CylinderGeometry(.0075,.0075,.5,3);C.translate(0,.25,0);function S(X,Ae){const le=new o.TorusGeometry(X,.0075,3,64,Ae*Math.PI*2);return le.rotateY(Math.PI/2),le.rotateX(Math.PI/2),le}function w(){const X=new o.BufferGeometry;return X.setAttribute("position",new o.Float32BufferAttribute([0,0,0,1,1,1],3)),X}const x={X:[[new o.Mesh(y,a),[.5,0,0],[0,0,-Math.PI/2]],[new o.Mesh(y,a),[-.5,0,0],[0,0,Math.PI/2]],[new o.Mesh(C,a),[0,0,0],[0,0,-Math.PI/2]]],Y:[[new o.Mesh(y,r),[0,.5,0]],[new o.Mesh(y,r),[0,-.5,0],[Math.PI,0,0]],[new o.Mesh(C,r)]],Z:[[new o.Mesh(y,l),[0,0,.5],[Math.PI/2,0,0]],[new o.Mesh(y,l),[0,0,-.5],[-Math.PI/2,0,0]],[new o.Mesh(C,l),null,[Math.PI/2,0,0]]],XYZ:[[new o.Mesh(new o.OctahedronGeometry(.1,0),f.clone()),[0,0,0]]],XY:[[new o.Mesh(new o.BoxGeometry(.15,.15,.01),d.clone()),[.15,.15,0]]],YZ:[[new o.Mesh(new o.BoxGeometry(.15,.15,.01),c.clone()),[0,.15,.15],[0,Math.PI/2,0]]],XZ:[[new o.Mesh(new o.BoxGeometry(.15,.15,.01),h.clone()),[.15,0,.15],[-Math.PI/2,0,0]]]},M={X:[[new o.Mesh(new o.CylinderGeometry(.2,0,.6,4),s),[.3,0,0],[0,0,-Math.PI/2]],[new o.Mesh(new o.CylinderGeometry(.2,0,.6,4),s),[-.3,0,0],[0,0,Math.PI/2]]],Y:[[new o.Mesh(new o.CylinderGeometry(.2,0,.6,4),s),[0,.3,0]],[new o.Mesh(new o.CylinderGeometry(.2,0,.6,4),s),[0,-.3,0],[0,0,Math.PI]]],Z:[[new o.Mesh(new o.CylinderGeometry(.2,0,.6,4),s),[0,0,.3],[Math.PI/2,0,0]],[new o.Mesh(new o.CylinderGeometry(.2,0,.6,4),s),[0,0,-.3],[-Math.PI/2,0,0]]],XYZ:[[new o.Mesh(new o.OctahedronGeometry(.2,0),s)]],XY:[[new o.Mesh(new o.BoxGeometry(.2,.2,.01),s),[.15,.15,0]]],YZ:[[new o.Mesh(new o.BoxGeometry(.2,.2,.01),s),[0,.15,.15],[0,Math.PI/2,0]]],XZ:[[new o.Mesh(new o.BoxGeometry(.2,.2,.01),s),[.15,0,.15],[-Math.PI/2,0,0]]]},D={START:[[new o.Mesh(new o.OctahedronGeometry(.01,2),n),null,null,null,"helper"]],END:[[new o.Mesh(new o.OctahedronGeometry(.01,2),n),null,null,null,"helper"]],DELTA:[[new o.Line(w(),n),null,null,null,"helper"]],X:[[new o.Line(_,n.clone()),[-1e3,0,0],null,[1e6,1,1],"helper"]],Y:[[new o.Line(_,n.clone()),[0,-1e3,0],[0,0,Math.PI/2],[1e6,1,1],"helper"]],Z:[[new o.Line(_,n.clone()),[0,0,-1e3],[0,-Math.PI/2,0],[1e6,1,1],"helper"]]},k={XYZE:[[new o.Mesh(S(.5,1),E),null,[0,Math.PI/2,0]]],X:[[new o.Mesh(S(.5,.5),a)]],Y:[[new o.Mesh(S(.5,.5),r),null,[0,0,-Math.PI/2]]],Z:[[new o.Mesh(S(.5,.5),l),null,[0,Math.PI/2,0]]],E:[[new o.Mesh(S(.75,1),m),null,[0,Math.PI/2,0]]]},R={AXIS:[[new o.Line(_,n.clone()),[-1e3,0,0],null,[1e6,1,1],"helper"]]},B={XYZE:[[new o.Mesh(new o.SphereGeometry(.25,10,8),s)]],X:[[new o.Mesh(new o.TorusGeometry(.5,.1,4,24),s),[0,0,0],[0,-Math.PI/2,-Math.PI/2]]],Y:[[new o.Mesh(new o.TorusGeometry(.5,.1,4,24),s),[0,0,0],[Math.PI/2,0,0]]],Z:[[new o.Mesh(new o.TorusGeometry(.5,.1,4,24),s),[0,0,0],[0,0,-Math.PI/2]]],E:[[new o.Mesh(new o.TorusGeometry(.75,.1,2,24),s)]]},ge={X:[[new o.Mesh(T,a),[.5,0,0],[0,0,-Math.PI/2]],[new o.Mesh(C,a),[0,0,0],[0,0,-Math.PI/2]],[new o.Mesh(T,a),[-.5,0,0],[0,0,Math.PI/2]]],Y:[[new o.Mesh(T,r),[0,.5,0]],[new o.Mesh(C,r)],[new o.Mesh(T,r),[0,-.5,0],[0,0,Math.PI]]],Z:[[new o.Mesh(T,l),[0,0,.5],[Math.PI/2,0,0]],[new o.Mesh(C,l),[0,0,0],[Math.PI/2,0,0]],[new o.Mesh(T,l),[0,0,-.5],[-Math.PI/2,0,0]]],XY:[[new o.Mesh(new o.BoxGeometry(.15,.15,.01),d),[.15,.15,0]]],YZ:[[new o.Mesh(new o.BoxGeometry(.15,.15,.01),c),[0,.15,.15],[0,Math.PI/2,0]]],XZ:[[new o.Mesh(new o.BoxGeometry(.15,.15,.01),h),[.15,0,.15],[-Math.PI/2,0,0]]],XYZ:[[new o.Mesh(new o.BoxGeometry(.1,.1,.1),f.clone())]]},ue={X:[[new o.Mesh(new o.CylinderGeometry(.2,0,.6,4),s),[.3,0,0],[0,0,-Math.PI/2]],[new o.Mesh(new o.CylinderGeometry(.2,0,.6,4),s),[-.3,0,0],[0,0,Math.PI/2]]],Y:[[new o.Mesh(new o.CylinderGeometry(.2,0,.6,4),s),[0,.3,0]],[new o.Mesh(new o.CylinderGeometry(.2,0,.6,4),s),[0,-.3,0],[0,0,Math.PI]]],Z:[[new o.Mesh(new o.CylinderGeometry(.2,0,.6,4),s),[0,0,.3],[Math.PI/2,0,0]],[new o.Mesh(new o.CylinderGeometry(.2,0,.6,4),s),[0,0,-.3],[-Math.PI/2,0,0]]],XY:[[new o.Mesh(new o.BoxGeometry(.2,.2,.01),s),[.15,.15,0]]],YZ:[[new o.Mesh(new o.BoxGeometry(.2,.2,.01),s),[0,.15,.15],[0,Math.PI/2,0]]],XZ:[[new o.Mesh(new o.BoxGeometry(.2,.2,.01),s),[.15,0,.15],[-Math.PI/2,0,0]]],XYZ:[[new o.Mesh(new o.BoxGeometry(.2,.2,.2),s),[0,0,0]]]},se={X:[[new o.Line(_,n.clone()),[-1e3,0,0],null,[1e6,1,1],"helper"]],Y:[[new o.Line(_,n.clone()),[0,-1e3,0],[0,0,Math.PI/2],[1e6,1,1],"helper"]],Z:[[new o.Line(_,n.clone()),[0,0,-1e3],[0,-Math.PI/2,0],[1e6,1,1],"helper"]]};function Q(X){const Ae=new o.Object3D;for(const le in X)for(let fe=X[le].length;fe--;){const te=X[le][fe][0].clone(),Pe=X[le][fe][1],Re=X[le][fe][2],De=X[le][fe][3],G=X[le][fe][4];te.name=le,te.tag=G,Pe&&te.position.set(Pe[0],Pe[1],Pe[2]),Re&&te.rotation.set(Re[0],Re[1],Re[2]),De&&te.scale.set(De[0],De[1],De[2]),te.updateMatrix();const ae=te.geometry.clone();ae.applyMatrix4(te.matrix),te.geometry=ae,te.renderOrder=1/0,te.position.set(0,0,0),te.rotation.set(0,0,0),te.scale.set(1,1,1),Ae.add(te)}return Ae}this.gizmo={},this.picker={},this.helper={},this.add(this.gizmo.translate=Q(x)),this.add(this.gizmo.rotate=Q(k)),this.add(this.gizmo.scale=Q(ge)),this.add(this.picker.translate=Q(M)),this.add(this.picker.rotate=Q(B)),this.add(this.picker.scale=Q(ue)),this.add(this.helper.translate=Q(D)),this.add(this.helper.rotate=Q(R)),this.add(this.helper.scale=Q(se)),this.picker.translate.visible=!1,this.picker.rotate.visible=!1,this.picker.scale.visible=!1}updateMatrixWorld(e){const s=(this.mode==="scale"?"local":this.space)==="local"?this.worldQuaternion:jt;this.gizmo.translate.visible=this.mode==="translate",this.gizmo.rotate.visible=this.mode==="rotate",this.gizmo.scale.visible=this.mode==="scale",this.helper.translate.visible=this.mode==="translate",this.helper.rotate.visible=this.mode==="rotate",this.helper.scale.visible=this.mode==="scale";let n=[];n=n.concat(this.picker[this.mode].children),n=n.concat(this.gizmo[this.mode].children),n=n.concat(this.helper[this.mode].children);for(let a=0;a<n.length;a++){const r=n[a];r.visible=!0,r.rotation.set(0,0,0),r.position.copy(this.worldPosition);let l;if(this.camera.isOrthographicCamera?l=(this.camera.top-this.camera.bottom)/this.camera.zoom:l=this.worldPosition.distanceTo(this.cameraPosition)*Math.min(1.9*Math.tan(Math.PI*this.camera.fov/360)/this.camera.zoom,7),r.scale.set(1,1,1).multiplyScalar(l*this.size/4),r.tag==="helper"){r.visible=!1,r.name==="AXIS"?(r.visible=!!this.axis,this.axis==="X"&&(K.setFromEuler(Dt.set(0,0,0)),r.quaternion.copy(s).multiply(K),Math.abs(W.copy(gt).applyQuaternion(s).dot(this.eye))>.9&&(r.visible=!1)),this.axis==="Y"&&(K.setFromEuler(Dt.set(0,0,Math.PI/2)),r.quaternion.copy(s).multiply(K),Math.abs(W.copy(He).applyQuaternion(s).dot(this.eye))>.9&&(r.visible=!1)),this.axis==="Z"&&(K.setFromEuler(Dt.set(0,Math.PI/2,0)),r.quaternion.copy(s).multiply(K),Math.abs(W.copy(_t).applyQuaternion(s).dot(this.eye))>.9&&(r.visible=!1)),this.axis==="XYZE"&&(K.setFromEuler(Dt.set(0,Math.PI/2,0)),W.copy(this.rotationAxis),r.quaternion.setFromRotationMatrix(hs.lookAt(cs,W,He)),r.quaternion.multiply(K),r.visible=this.dragging),this.axis==="E"&&(r.visible=!1)):r.name==="START"?(r.position.copy(this.worldPositionStart),r.visible=this.dragging):r.name==="END"?(r.position.copy(this.worldPosition),r.visible=this.dragging):r.name==="DELTA"?(r.position.copy(this.worldPositionStart),r.quaternion.copy(this.worldQuaternionStart),ce.set(1e-10,1e-10,1e-10).add(this.worldPositionStart).sub(this.worldPosition).multiplyScalar(-1),ce.applyQuaternion(this.worldQuaternionStart.clone().invert()),r.scale.copy(ce),r.visible=this.dragging):(r.quaternion.copy(s),this.dragging?r.position.copy(this.worldPositionStart):r.position.copy(this.worldPosition),this.axis&&(r.visible=this.axis.search(r.name)!==-1));continue}r.quaternion.copy(s),this.mode==="translate"||this.mode==="scale"?(r.name==="X"&&Math.abs(W.copy(gt).applyQuaternion(s).dot(this.eye))>.99&&(r.scale.set(1e-10,1e-10,1e-10),r.visible=!1),r.name==="Y"&&Math.abs(W.copy(He).applyQuaternion(s).dot(this.eye))>.99&&(r.scale.set(1e-10,1e-10,1e-10),r.visible=!1),r.name==="Z"&&Math.abs(W.copy(_t).applyQuaternion(s).dot(this.eye))>.99&&(r.scale.set(1e-10,1e-10,1e-10),r.visible=!1),r.name==="XY"&&Math.abs(W.copy(_t).applyQuaternion(s).dot(this.eye))<.2&&(r.scale.set(1e-10,1e-10,1e-10),r.visible=!1),r.name==="YZ"&&Math.abs(W.copy(gt).applyQuaternion(s).dot(this.eye))<.2&&(r.scale.set(1e-10,1e-10,1e-10),r.visible=!1),r.name==="XZ"&&Math.abs(W.copy(He).applyQuaternion(s).dot(this.eye))<.2&&(r.scale.set(1e-10,1e-10,1e-10),r.visible=!1)):this.mode==="rotate"&&(It.copy(s),W.copy(this.eye).applyQuaternion(K.copy(s).invert()),r.name.search("E")!==-1&&r.quaternion.setFromRotationMatrix(hs.lookAt(this.eye,cs,He)),r.name==="X"&&(K.setFromAxisAngle(gt,Math.atan2(-W.y,W.z)),K.multiplyQuaternions(It,K),r.quaternion.copy(K)),r.name==="Y"&&(K.setFromAxisAngle(He,Math.atan2(W.x,W.z)),K.multiplyQuaternions(It,K),r.quaternion.copy(K)),r.name==="Z"&&(K.setFromAxisAngle(_t,Math.atan2(W.y,W.x)),K.multiplyQuaternions(It,K),r.quaternion.copy(K))),r.visible=r.visible&&(r.name.indexOf("X")===-1||this.showX),r.visible=r.visible&&(r.name.indexOf("Y")===-1||this.showY),r.visible=r.visible&&(r.name.indexOf("Z")===-1||this.showZ),r.visible=r.visible&&(r.name.indexOf("E")===-1||this.showX&&this.showY&&this.showZ),r.material._color=r.material._color||r.material.color.clone(),r.material._opacity=r.material._opacity||r.material.opacity,r.material.color.copy(r.material._color),r.material.opacity=r.material._opacity,this.enabled&&this.axis&&(r.name===this.axis||this.axis.split("").some(function(c){return r.name===c}))&&(r.material.color.setHex(16776960),r.material.opacity=1)}super.updateMatrixWorld(e)}}class $a extends o.Mesh{constructor(){super(new o.PlaneGeometry(1e5,1e5,2,2),new o.MeshBasicMaterial({visible:!1,wireframe:!0,side:o.DoubleSide,transparent:!0,opacity:.1,toneMapped:!1})),this.isTransformControlsPlane=!0,this.type="TransformControlsPlane"}updateMatrixWorld(e){let t=this.space;switch(this.position.copy(this.worldPosition),this.mode==="scale"&&(t="local"),Lt.copy(gt).applyQuaternion(t==="local"?this.worldQuaternion:jt),ut.copy(He).applyQuaternion(t==="local"?this.worldQuaternion:jt),pt.copy(_t).applyQuaternion(t==="local"?this.worldQuaternion:jt),W.copy(ut),this.mode){case"translate":case"scale":switch(this.axis){case"X":W.copy(this.eye).cross(Lt),xe.copy(Lt).cross(W);break;case"Y":W.copy(this.eye).cross(ut),xe.copy(ut).cross(W);break;case"Z":W.copy(this.eye).cross(pt),xe.copy(pt).cross(W);break;case"XY":xe.copy(pt);break;case"YZ":xe.copy(Lt);break;case"XZ":W.copy(pt),xe.copy(ut);break;case"XYZ":case"E":xe.set(0,0,0);break}break;case"rotate":default:xe.set(0,0,0)}xe.length()===0?this.quaternion.copy(this.cameraQuaternion):(ds.lookAt(ce.set(0,0,0),xe,W),this.quaternion.setFromRotationMatrix(ds)),super.updateMatrixWorld(e)}}class he extends o.EventDispatcher{static DRAG_START="Transform::dragStart";static DRAG_END="Transform::dragEnd";static _instance;app;three;activeCamera;controls=new Map;visibility=new Map;setApp(e,t){this.app=e,this.three=t,this.app.addEventListener(P.SET_SCENE,this.setScene)}clear(){for(const e of this.controls.values()){e.detach(),e.disconnect();const t=e.getHelper();Me(t)}this.controls=new Map,this.visibility=new Map}add(e){let t=this.controls.get(e);if(t===void 0){const s=document.querySelector(".clickable");t=new Ya(this.activeCamera,s),t.getHelper().name=e,t.setSpace("local"),this.controls.set(e,t),this.visibility.set(e,!0),t.addEventListener("mouseDown",()=>{this.dispatchEvent({type:he.DRAG_START})}),t.addEventListener("mouseUp",()=>{this.dispatchEvent({type:he.DRAG_END})}),t.addEventListener("dragging-changed",n=>{oe.instance?.toggleOrbitControls(n.value)})}return t}get(e){return this.controls.get(e)}remove(e){const t=this.get(e);return t===void 0?!1:(t.detach(),t.disconnect(),Me(t.getHelper()),this.controls.delete(e),!0)}enabled(e){this.controls.forEach(t=>{t.enabled=e})}updateCamera(e,t){this.activeCamera=e,this.controls.forEach(s=>{s.camera!==e&&(s.camera=e,e.getWorldPosition(s.cameraPosition),e.getWorldQuaternion(s.cameraQuaternion)),s.domElement!==t&&(s.disconnect(),s.domElement=t,s.connect())})}show(){this.controls.forEach(e=>{const t=e.getHelper(),s=this.visibility.get(t.name);s!==void 0&&(t.visible=s)})}hide(){this.controls.forEach(e=>{const t=e.getHelper();this.visibility.set(t.name,t.visible),t.visible=!1})}setScene=()=>{this.clear()};static get instance(){return he._instance||(he._instance=new he),he._instance}}const Ja=new o.BoxGeometry,hi=new o.Vector2;class vi extends o.Object3D{curve=new o.CatmullRomCurve3;line;draggable;curvePos;tension=.5;closed=!1;subdivide=50;curveType;offset=1;lineMaterial;_camera;_curvePercentage=0;_draggableScale=10;_transform;raycaster;draggedMat=new o.MeshBasicMaterial;parentGroup;group;constructor(e,t){const s=new o.Color(qe(.5,1,Math.random()),qe(.5,1,Math.random()),qe(.5,1,Math.random()));super(),this.name=e,this.lineMaterial=new o.LineBasicMaterial({color:s}),this.line=new o.Line(new o.BufferGeometry,this.lineMaterial),this.line.name="line",this.add(this.line),this._camera=t,this.curveType="catmullrom",this.draggedMat.color=s,this.draggable=new o.Object3D,this.draggable.name="draggablePoints",this.add(this.draggable),this.curvePos=new o.Mesh(new o.SphereGeometry(1.5),new o.MeshBasicMaterial({color:s})),this.curvePos.name="curvePos",this.curvePos.scale.setScalar(this._draggableScale),this.curvePos.visible=!1,this.add(this.curvePos),this.raycaster=new o.Raycaster,this.raycaster.params.Line.threshold=3,this.enable()}enable(){document.addEventListener("pointerdown",this.onMouseClick)}disable(){document.removeEventListener("pointerdown",this.onMouseClick)}dispose=()=>{this._transform&&(this._transform.removeEventListener("objectChange",this.updateSpline),he.instance.remove(this.name)),this.disable(),this.parentGroup.removeGroup(this.name)};hideTransform=()=>{this._transform?.detach()};exportSpline=()=>{const e=[];this.draggable.children.forEach(t=>{e.push([ye(t.position.x,3),ye(t.position.y,3),ye(t.position.z,3)])}),ms({name:this.name,points:e,tension:this.tension,closed:this.closed,subdivide:this.subdivide,type:this.curveType}),console.log("Spline copied!")};showPoints=(e=!0)=>{this.draggable.visible=e};addPoints=(e=[])=>{if(e.length>0){const t=e.length-1;for(let s=0;s<t;s++)this.addPoint(e[s],!1);this.addPoint(e[t])}else this.addPoint(new o.Vector3(-50,0,0),!1),this.addPoint(new o.Vector3(50,0,0))};addPoint=(e,t=!0)=>{const s=this.draggable.children.length,n=new o.Mesh(Ja,this.draggedMat);return n.name=`point_${s}`,n.position.copy(e),n.scale.setScalar(this._draggableScale),this.draggable.add(n),t&&this.updateSpline(),n};addNextPt=()=>{const e=this.draggable.children.length,t=new o.Vector3(qe(-this.offset,this.offset,Math.random()),qe(-this.offset,this.offset,Math.random()),qe(-this.offset,this.offset,Math.random()));e>0&&t.add(this.draggable.children[e-1].position);const s=this.addPoint(t);this._transform?.attach(s),this.group.current?.setField("Current Point",s.position)};removePoint=e=>{if(this._transform?.object===e){this._transform?.detach();const t=this.draggable.children[this.draggable.children.length-1];this._transform?.attach(t),this.group.current?.setField("Current Point",t.position)}Me(e),this.updateSpline()};removePointAt=e=>{const t=this.draggable.children[e];this.removePoint(t)};removeSelectedPt=()=>{this._transform?.object!==void 0&&this.removePoint(this._transform?.object)};updateSpline=()=>{this.curve=new o.CatmullRomCurve3(this.points,this.closed,this.curveType,this.tension),this.line.geometry.setFromPoints(this.getPoints()),this.curvePos.position.copy(this.getPointAt(this._curvePercentage))};onMouseClick=e=>{if(!oe.instance||this._transform&&!this._transform.getHelper().visible)return;const s=oe.instance.currentWindow.current.getBoundingClientRect();hi.x=(e.clientX-s.x)/s.width*2-1,hi.y=-((e.clientY-s.y)/s.height)*2+1,this.raycaster.setFromCamera(hi,this.camera);const n=this.raycaster.intersectObjects(this.draggable.children,!1);if(n.length>0){const a=n[0].object;a!==this._transform?.object&&(this._transform?.attach(a),this.group.current?.setField("Current Point",a.position))}};getPointAt(e){return this.curve.getPointAt(e)}getPoints(){return this.curve.getPoints(this.subdivide)}getTangentAt(e){return this.curve.getTangentAt(e)}get points(){const e=[];return this.draggable.children.forEach(t=>{e.push(t.position)}),e}get total(){return this.draggable.children.length}get draggableScale(){return this._draggableScale}set draggableScale(e){this._draggableScale=e,this.draggable.children.forEach(t=>t.scale.setScalar(e)),this.curvePos.scale.setScalar(e)}get camera(){return this._camera}set camera(e){this._camera=e,this._transform!==void 0&&(this._transform.camera=e)}get curvePercentage(){return this._curvePercentage}set curvePercentage(e){this._curvePercentage=e,this.curvePos.position.copy(this.getPointAt(e))}onUpdateTransform=()=>{if(this._transform?.object&&this.group){const e=this._transform?.object;e.name.search("point")>-1&&this.group.current?.setField("Current Point",e.position)}this.updateSpline()};initDebug(e){const t=this.draggable.children;this.parentGroup=e,this._transform=he.instance.add(this.name),this._transform.camera=this._camera,this._transform.addEventListener("objectChange",this.onUpdateTransform),this._transform.attach(t.length>0?t[t.length-1]:this),oe.instance?.scene.add(this._transform.getHelper());const s=t.length>0?t[t.length-1].position:{x:0,y:0,z:0};this.group=e.addGroup({title:this.name,items:[{prop:"Closed",type:"boolean",value:this.closed},{prop:"Visible",type:"boolean",value:this.visible},{prop:"Show Position",type:"boolean",value:this.curvePos.visible},{prop:"Show Points",type:"boolean",value:this.draggable.visible},{prop:"Color",type:"color",value:`#${this.draggedMat.color.getHexString()}`},{prop:"Curve",type:"option",options:[{title:"Catmullrom",value:"catmullrom"},{title:"Centripetal",value:"centripetal"},{title:"Chordal",value:"chordal"}]},{prop:"Draggable Scale",type:"range",min:.01,max:100,step:.01,value:this._draggableScale},{prop:"Subdivide",type:"range",min:1,max:100,step:1,value:this.subdivide},{prop:"Tension",type:"range",min:0,max:1,step:.01,value:this.tension},{prop:"New Pt Offset",type:"range",min:0,max:10,value:this.offset},{prop:"Curve At",type:"range",min:0,max:1,step:.01,value:0},{prop:"Toggle Transform",type:"button"},{prop:"Add Point",type:"button"},{prop:"Remove Point",type:"button"},{prop:"Export",type:"button"},{prop:"Delete",type:"button"},{prop:"Current Point",type:"grid3",value:s}],onUpdate:(n,a)=>{switch(n){case"Closed":this.closed=a,this.updateSpline();break;case"Visible":this.visible=a;break;case"Color":this.lineMaterial.color.setStyle(a),this.draggedMat.color.setStyle(a);break;case"Curve":this.curveType=a,this.updateSpline();break;case"Draggable Scale":this.draggableScale=a;break;case"Subdivide":this.subdivide=a,this.updateSpline();break;case"Tension":this.tension=a,this.updateSpline();break;case"New Pt Offset":this.offset=a;break;case"Curve At":this.curvePos.position.copy(this.getPointAt(a));break;case"Show Position":this.curvePos.visible=a;break;case"Show Points":this.draggable.visible=a;break;case"Toggle Transform":this._transform&&(this._transform.getHelper().visible=!this._transform.getHelper().visible);break;case"Add Point":this.addNextPt();break;case"Remove Point":this.removeSelectedPt();break;case"Export":this.exportSpline();break;case"Delete":Me(this);break;case"Current Point":if(this.group.current&&this._transform?.object){const r=this._transform?.object;r.name.search("point")>-1&&(r.position.copy(a),this.updateSpline())}break}}}),this.draggable.children.forEach(n=>{this.debugPoint(n)})}debugPoint=e=>{e.name,e.visible=this.draggable.visible}}let kt=0;class As extends o.Object3D{defaultScale=10;_camera;group=null;app;constructor(e,t){super(),this.name="Spline Editor",this._camera=e,this.app=t,this.app.addEventListener(P.ADD_SPLINE,this.onAddSpline)}initDebug(){this.group=V.addEditorGroup({title:this.name,items:[{type:"button",prop:"New Spline"},{type:"boolean",prop:"Show Points",value:!0},{type:"boolean",prop:"Visible",value:this.visible},{type:"range",prop:"Default Scale",min:0,max:50,step:.01,value:this.defaultScale}],onUpdate:(e,t)=>{switch(e){case"New Spline":this.createSpline();break;case"Show Points":this.showPoints(t);break;case"Visible":this.visible=t;break;case"Default Scale":this.defaultScale=t;break}}})}dispose(){this.app.removeEventListener(P.ADD_SPLINE,this.onAddSpline),V.removeEditorGroup(this.name)}addSpline(e){e.draggableScale=this.defaultScale,e.hideTransform(),this.group?.current!==null&&e.initDebug(this.group.current),this.add(e)}createSpline=(e=[])=>{const t=`Spline ${kt+1}`,s=new vi(t,this._camera);return s.addPoints(e),this.addSpline(s),kt++,s};createSplineFromArray=e=>{const t=[];return e.forEach(s=>{t.push(new o.Vector3(s[0],s[1],s[2]))}),this.createSpline(t)};createSplineFromCatmullRom=e=>this.createSpline(e.points);createSplineFromJSON=e=>{const t=this.createSplineFromArray(e.points);return t.name=e.name,t.closed=e.closed,t.subdivide=e.subdivide,t.tension=e.tension,t.type=e.type,t.updateSpline(),t};showPoints=(e=!0)=>{this.children.forEach(t=>{t.showPoints(e)})};onAddSpline=e=>{const t=JSON.parse(e.value),s=`Spline ${kt+1}`,n=[];t.points.forEach(r=>{n.push(new o.Vector3(r[0],r[1],r[2]))});const a=new vi(s,this.camera);a.addPoints(n),this.addSpline(a),kt++};get camera(){return this._camera}set camera(e){this._camera=e,this.children.forEach(t=>{const s=t;s.camera=e})}}const us=["Single","Side by Side","Stacked","Quad"],er="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAACXBIWXMAAAsTAAALEwEAmpwYAAAC60lEQVRYhe2YT4hNcRTHP48xpmYaNAvRyEQxEhnKQljYsRm9/EmSyJiMFAsMZWNhJYoNIUVJ2VGiyb9ZzIpMpkQSahbGv9GMYWrM+1rc2zjvzvvdd+99rzdvMd+6de75nd+5387vnN/v/G5KEuWMKRNNIB8mCRaKiiL5qQb2ApuBuUAV0Ad0AJeB3sSeJRX6LJbULTf6JTUn9Z+KWMUpPyp/Avoa4CNQZ3Sj/lNpdL/xottR7AjOkHRUUpekN5I6JbVLavDH75lIfZN0UFKTpCWS0pJem/HeJBEMG6yV1ONYtgFJbZJ+GF1jDh+zJb03NuliEuwMkMo4yErS2RA/LcbuYVyCrm1mA7Dal/8Cu4FG4JD/HsTTkCy6a+SVMTPQuc1sBKb78nHghi+/A+YBxwL2lbhRY+ThuARdEVxu5JdGFvACr0otdoZ8Y4+Rn0Sn5sFFsMvI6YB9MzA1YJ8mN8k1wAHzfj4uQVdyrpI0aJL7oqTtkq4FiqPLyCOSbktqlbRL0jlJQ2b8QdwCUZ4qvhRStZL0XFK1pMd57CRvq5mfhKBriRfiFUMY6oD7eOdwPlQAN4G10dfWg+uouwXsiOssAj4AC+JMcEWwvnAuOTEr7gTXPmg34zagOwkbIIOXAo9CbDYBrcBXYN+4UUdy2sRflyS5zVNlfPX7ugpJW5V9nI7mmh+lYU0lCZ2B3TOnAVuAk0BTwC5nuhWro46KauBOQJch5OpRaoIW34GreGf+YZdRqS9NAj4Bp4ClQDvwOWxCqSM4ADQEdKE5XvbXzlITrAVe4TW+M6NMKDXBFLAMuAD0ACfIc7pMZBXXA2cY3/xmodQRHAL2A2+NLtj8ZiEKwUL/z2WMPAJcAVYALWSf8dZuDFGWeBHwKxm3sWYhiGG8Tfo6sA2vSfiSy4GrH3wGrDcfKSSKKf6v1E9yF0XK9Q1XBPuMXMw8HXTonQFwETwNzMFr64v1jzgFHIk9ybHEZYPJo65QlD3Bf2/Q/eaHPiSWAAAAAElFTkSuQmCC",tr="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAACXBIWXMAAAsTAAALEwEAmpwYAAAETklEQVRYhe2YXYhVVRTHf3d0/JhyUrMpFbImM+whSa3Mynww+4AeIgiKoozooQ+KyMyXIAujF6OXqHyI6iEKKYgIP/owsjSFqCkprdDUTEcjbWZ0HHV+Pex1ucfb9Z57Z9REXHA4Z++99l7/s/ZZ/7X2KaiczNLwfwPIk9MA+yunNMAG4DHgV+BvoB3YFff2TPstYEyfrajVroI6Sr1GvahsbJC63HzZq04pmztSvU5tVRuqYRiYg78JeBR4HPg5ntdmxovz9wJfA3uAxuibDLQCA+IqynnAQuBuYCnwMLC1rx48U12U8cZqdWqMDcx4cI16qTpYbVKHqa+ovWUeHKsujn7VL9ULq2HI+wY7gVeBJdGeFu3J4ZUiy/cAXeHRRuAQsC/GC0B3eG4BcH/0tUV7czUAeVsMsBF4Kha9HZgCvAncAuwPnXHA0wFuGLANuDrGuoGDwFxgTqzzQ7RX5FrP2eLsdb76vnogtme6+nE8H1YPlQXHwbi3q9eqn0e7Tb25VrsF68vFY0lb1AGcDTwItGQ8tQM4AIwGmqP/EPAu8A0wElgJfFGzxTo8mKWXu9Rd4ZF96jvqjSbauEC9Sn1O3R463epLaku99voCsFXdkAH3kNpcQW+IiT/bQne3eufxBtioPqP2mKhioXpWzpxb1T8C5Ifh4ZptVoriRmAIKdrI3Lujf3bobAPeJpF0NVkKrAFuI9HTOBIxnxFrF4OgQKKr/dnJlQA+AcwABgOHA4zAamA5cE7orQL+zAEHiWI+A2bFC7aSguheYCgpqAphZz3wSB7AecCICv2TgH8oFRib4gVqka0k0h8CXAxMBW6ooDejFoCvA9OBQUAvKWM0kDz4XUZvNKXtyZMWUl7vBbaQXq457PeEziDgx/KJlQAuIPFdMcEXv5OdYWBP9M8k8VpnDQCvB4aTSrCNJB5cSdrW3tBpIJVnR0qdUTxAfdGUOVTnmwqEanNmqltC/9OgqePKg5eom8PgdvW+oJ9Kupera0O3U50TL3lcAaI+oHaF4R3qa6Z822wq0Saq89T1lmSxOrxeW/Xm4uGkiqQDmECKuKHxHW0HdpMiewSpvGqKeR8Ay0iBsYIjg6261PE2o9Q3Yqv+MqWxO9R1Hl12qs+q49Vlppy82pSr+5xJKsko4AXgHlJ0t5NIeg3wLXAlqZhtIUV8J6nmWwX8QiLjdhL5TwMWkY4R6/rrwYKlMr1Y321QZ/vfwBijPqm+rF4Wc7PjE9QllurGVeoV5gRNHsAm9fnMom3qrKPoTjKdMXaYyrFygEWQ72XWW24qhPu8xcUc2UU6O8wFPjmK7jhgPHAuMJGUGQ6U6WwE5sfzTXGvei7KA9hFOiR9D/wOfFVFt4dS2tpfRe83Ur7/CPiJakfOGgBCypubatArl2r8VfOax/LfzABKtePAzHO/5FgC7KBEzB2kOrDfUm8mOeFySv9+OyFyGmB/5aQH+C9BVKmVCNuMZgAAAABJRU5ErkJggg==";class oe extends O.Component{static instance=null;app;scene=new o.Scene;renderer;currentScene;cameras=new Map;controls=new Map;currentCamera;currentWindow;cameraHelpers=new Map;lightHelpers=new Map;helpersContainer=new o.Group;grid=new za;interactionHelper=new o.AxesHelper(25);currentTransform;splineEditor;depthMaterial=new o.MeshDepthMaterial;normalsMaterial=new o.MeshNormalMaterial;uvMaterial=new Ba;wireframeMaterial=new o.MeshBasicMaterial({opacity:.33,transparent:!0,wireframe:!0});playing=!1;rafID=-1;cameraControlsRafID=-1;width=0;height=0;sceneSet=!1;tlCam=null;trCam=null;blCam=null;brCam=null;tlRender="Renderer";trRender="Renderer";blRender="Renderer";brRender="Renderer";cameraVisibility=!0;lightVisibility=!0;selectedItem=void 0;debugCamera;raycaster=new o.Raycaster;pointer=new o.Vector2;cameraControls=void 0;canvasRef;containerRef;tlWindow;trWindow;blWindow;brWindow;constructor(e){super(e),this.app=e.app,this.canvasRef=O.createRef(),this.containerRef=O.createRef(),this.tlWindow=O.createRef(),this.trWindow=O.createRef(),this.blWindow=O.createRef(),this.brWindow=O.createRef();const t=e.three.app.appID,s=localStorage,n=s.getItem(`${t}_mode`);this.state={mode:n!==null?n:"Single",modeOpen:!1,renderModeOpen:!1,interactionMode:"Orbit",interactionModeOpen:!1,lastUpdate:Date.now()},s.setItem(`${t}_mode`,this.state.mode),s.setItem(`${t}_tlCam`,s.getItem(`${t}_tlCam`)!==null?s.getItem(`${t}_tlCam`):"Debug"),s.setItem(`${t}_trCam`,s.getItem(`${t}_trCam`)!==null?s.getItem(`${t}_trCam`):"Orthographic"),s.setItem(`${t}_blCam`,s.getItem(`${t}_blCam`)!==null?s.getItem(`${t}_blCam`):"Front"),s.setItem(`${t}_brCam`,s.getItem(`${t}_brCam`)!==null?s.getItem(`${t}_brCam`):"Top"),s.setItem(`${t}_tlRender`,s.getItem(`${t}_tlRender`)!==null?s.getItem(`${t}_tlRender`):"Renderer"),s.setItem(`${t}_trRender`,s.getItem(`${t}_trRender`)!==null?s.getItem(`${t}_trRender`):"Renderer"),s.setItem(`${t}_blRender`,s.getItem(`${t}_blRender`)!==null?s.getItem(`${t}_blRender`):"Renderer"),s.setItem(`${t}_brRender`,s.getItem(`${t}_brRender`)!==null?s.getItem(`${t}_brRender`):"Renderer");const a={Vector2:o.Vector2,Vector3:o.Vector3,Vector4:o.Vector4,Quaternion:o.Quaternion,Matrix4:o.Matrix4,Spherical:o.Spherical,Box3:o.Box3,Sphere:o.Sphere,Raycaster:o.Raycaster};Te.install({THREE:a}),this.setupScene(),this.setupTools();const r=localStorage.getItem(this.expandedCameraVisibility);this.cameraVisibility=r!==null?r==="open":!1,this.saveExpandedCameraVisibility();const l=localStorage.getItem(this.expandedLightVisibility);this.lightVisibility=l!==null?l==="open":!1,this.saveExpandedLightVisibility(),oe.instance=this}componentDidMount(){this.setupRenderer(),this.enable(),this.assignControls(),this.resize(),this.play(),he.instance.setApp(this.props.app,this.props.three),he.instance.activeCamera=this.debugCamera}componentDidUpdate(e,t,s){t.mode!==this.state.mode&&(this.assignControls(),this.resize())}componentWillUnmount(){this.disable(),V.removeEditorGroup("View Settings")}render(){const e=[];return this.cameras.forEach((t,s)=>{e.push(s)}),p.jsxs("div",{className:"multiview",children:[p.jsx("canvas",{ref:this.canvasRef}),p.jsxs("div",{className:`cameras ${this.state.mode==="Single"||this.state.mode==="Stacked"?"single":""}`,ref:this.containerRef,children:[this.state.mode==="Single"&&p.jsx(p.Fragment,{children:p.jsx(Fe,{name:"tl",camera:this.tlCam,options:e,ref:this.tlWindow,onSelectCamera:t=>{this.controls.get(this.tlCam.name)?.dispose();const s=this.cameras.get(t);s!==void 0&&(this.clearCamera(this.tlCam),this.tlCam=s,localStorage.setItem(`${this.appID}_tlCam`,s.name),this.createControls(s,this.tlWindow.current))},onSelectRenderMode:t=>{this.tlRender=t,localStorage.setItem(`${this.appID}_tlRender`,t)}})}),(this.state.mode==="Side by Side"||this.state.mode==="Stacked")&&p.jsxs(p.Fragment,{children:[p.jsx(Fe,{name:"tl",camera:this.tlCam,options:e,ref:this.tlWindow,onSelectCamera:t=>{this.controls.get(this.tlCam.name)?.dispose();const s=this.cameras.get(t);s!==void 0&&(this.clearCamera(this.tlCam),this.tlCam=s,localStorage.setItem(`${this.appID}_tlCam`,s.name),this.createControls(s,this.tlWindow.current))},onSelectRenderMode:t=>{this.tlRender=t,localStorage.setItem(`${this.appID}_tlRender`,t)}}),p.jsx(Fe,{name:"tr",camera:this.trCam,options:e,ref:this.trWindow,onSelectCamera:t=>{this.controls.get(this.trCam.name)?.dispose();const s=this.cameras.get(t);s!==void 0&&(this.clearCamera(this.trCam),this.trCam=s,localStorage.setItem(`${this.appID}_trCam`,s.name),this.createControls(s,this.trWindow.current))},onSelectRenderMode:t=>{this.trRender=t,localStorage.setItem(`${this.appID}_trRender`,t)}})]}),this.state.mode==="Quad"&&p.jsxs(p.Fragment,{children:[p.jsx(Fe,{name:"tl",camera:this.tlCam,options:e,ref:this.tlWindow,onSelectCamera:t=>{this.controls.get(this.tlCam.name)?.dispose();const s=this.cameras.get(t);s!==void 0&&(this.clearCamera(this.tlCam),this.tlCam=s,localStorage.setItem(`${this.appID}_tlCam`,s.name),this.createControls(s,this.tlWindow.current))},onSelectRenderMode:t=>{this.tlRender=t,localStorage.setItem(`${this.appID}_tlRender`,t)}}),p.jsx(Fe,{name:"tr",camera:this.trCam,options:e,ref:this.trWindow,onSelectCamera:t=>{this.controls.get(this.trCam.name)?.dispose();const s=this.cameras.get(t);s!==void 0&&(this.clearCamera(this.trCam),this.trCam=s,localStorage.setItem(`${this.appID}_trCam`,s.name),this.createControls(s,this.trWindow.current))},onSelectRenderMode:t=>{this.trRender=t,localStorage.setItem(`${this.appID}_trRender`,t)}}),p.jsx(Fe,{name:"bl",camera:this.blCam,options:e,ref:this.blWindow,onSelectCamera:t=>{this.controls.get(this.blCam.name)?.dispose();const s=this.cameras.get(t);s!==void 0&&(this.clearCamera(this.blCam),this.blCam=s,localStorage.setItem(`${this.appID}_blCam`,s.name),this.createControls(s,this.blWindow.current))},onSelectRenderMode:t=>{this.blRender=t,localStorage.setItem(`${this.appID}_blRender`,t)}}),p.jsx(Fe,{name:"br",camera:this.brCam,options:e,ref:this.brWindow,onSelectCamera:t=>{this.controls.get(this.brCam.name)?.dispose();const s=this.cameras.get(t);s!==void 0&&(this.clearCamera(this.brCam),this.brCam=s,localStorage.setItem(`${this.appID}_brCam`,s.name),this.createControls(s,this.brWindow.current))},onSelectRenderMode:t=>{this.brRender=t,localStorage.setItem(`${this.appID}_brRender`,t)}})]})]}),p.jsxs("div",{className:"settings",children:[p.jsx(zt,{title:"View",index:us.indexOf(this.state.mode),options:us,onSelect:t=>{t!==this.state.mode&&(this.killControls(),this.setState({mode:t}),localStorage.setItem(`${this.appID}_mode`,t))},open:this.state.modeOpen,onToggle:t=>{this.setState({modeOpen:t,renderModeOpen:!1,interactionModeOpen:!1})}}),p.jsx(zt,{title:"Interact",index:this.state.interactionMode==="Orbit"?0:1,options:["Orbit Mode","Selection Mode"],onSelect:t=>{this.interactionHelper.visible=t==="Selection Mode",this.setState({interactionMode:this.interactionHelper.visible?"Selection":"Orbit"})},open:this.state.interactionModeOpen,onToggle:t=>{this.setState({modeOpen:!1,renderModeOpen:!1,interactionModeOpen:t})}}),p.jsx(ns,{name:"cameraHelper",icon:er,selected:this.cameraVisibility,height:24,top:2,onClick:t=>{if(this.cameraVisibility=t,this.saveExpandedCameraVisibility(),this.cameraHelpers.forEach(s=>{s.visible=t}),this.selectedItem!==void 0&&!t){const s=this.cameraHelpers.get(this.selectedItem.name);s!==void 0&&(s.visible=!0)}}}),p.jsx(ns,{name:"lightHelper",icon:tr,selected:this.lightVisibility,height:24,top:4,onClick:t=>{if(this.lightVisibility=t,this.saveExpandedLightVisibility(),this.lightHelpers.forEach(s=>{s.visible=t}),this.selectedItem!==void 0&&!t&&this.selectedItem.isLight===!0){const s=this.lightHelpers.get(this.selectedItem.name);s!==void 0&&(s.visible=!0)}}})]},this.state.lastUpdate)]})}setupRenderer(){this.renderer=new o.WebGLRenderer({canvas:this.canvasRef.current,stencil:!1}),this.renderer.autoClear=!1,this.renderer.shadowMap.enabled=!0,this.renderer.setPixelRatio(devicePixelRatio),this.renderer.setClearColor(0),this.props.three.renderer=this.renderer}setupScene(){this.scene.name="Debug Scene",this.scene.uuid="",this.helpersContainer.name="helpers",this.scene.add(this.helpersContainer),this.grid.position.y=-1,this.helpersContainer.add(this.grid),this.interactionHelper.name="interactionHelper",this.interactionHelper.visible=!1,this.helpersContainer.add(this.interactionHelper);const e=(a,r)=>{const l=new o.OrthographicCamera(-100,100,100,-100,0,3e3);return l.name=a,l.position.copy(r),l.lookAt(0,0,0),this.cameras.set(a,l),l},t=1e3;e("Top",new o.Vector3(0,t,0)),e("Bottom",new o.Vector3(0,-t,0)),e("Left",new o.Vector3(-t,0,0)),e("Right",new o.Vector3(t,0,0)),e("Front",new o.Vector3(0,0,t)),e("Back",new o.Vector3(0,0,-t)),e("Orthographic",new o.Vector3(t,t,t)),e("UI",new o.Vector3),this.debugCamera=new o.PerspectiveCamera(60,1,50,5e3),this.debugCamera.name="Debug",this.debugCamera.position.set(500,500,500),this.debugCamera.lookAt(0,0,0),this.cameras.set("Debug",this.debugCamera),this.currentCamera=this.debugCamera;const s=localStorage,n=this.props.three.app.appID;this.tlCam=this.cameras.get(s.getItem(`${n}_tlCam`)),this.trCam=this.cameras.get(s.getItem(`${n}_trCam`)),this.blCam=this.cameras.get(s.getItem(`${n}_blCam`)),this.brCam=this.cameras.get(s.getItem(`${n}_brCam`)),this.tlCam===void 0&&(this.tlCam=this.cameras.get("Debug")),this.trCam===void 0&&(this.trCam=this.cameras.get("Orthographic")),this.blCam===void 0&&(this.blCam=this.cameras.get("Front")),this.brCam===void 0&&(this.brCam=this.cameras.get("Top"))}setupTools(){V.addEditorGroup({title:"View Settings",items:[{type:"boolean",prop:"Show Grid",value:this.grid.visible}],onUpdate:(e,t)=>{switch(e){case"Show Grid":this.grid.visible=t;break}}}),this.splineEditor=new As(this.currentCamera,this.app),this.splineEditor.initDebug(),this.scene.add(this.splineEditor)}play(){this.playing=!0,this.onUpdate()}pause(){this.playing=!1,cancelAnimationFrame(this.rafID),this.rafID=-1}toggleOrbitControls(e){this.controls.forEach(t=>{t.enabled=!e})}update(){this.controls.forEach(e=>e.update()),this.cameraHelpers.forEach(e=>e.update()),this.lightHelpers.forEach(e=>{e.update!==void 0&&e.update()}),this.props.onSceneUpdate!==void 0&&this.sceneSet&&this.props.onSceneUpdate(this.currentScene)}draw(){switch(this.renderer?.clear(),this.state.mode){case"Single":this.drawSingle();break;case"Side by Side":case"Stacked":this.drawDouble();break;case"Quad":this.drawQuad();break}}onUpdate=()=>{this.playing&&(this.update(),this.draw(),this.rafID=requestAnimationFrame(this.onUpdate))};enable(){const e=this.containerRef.current;e.addEventListener("mousemove",this.onMouseMove),e.addEventListener("click",this.onClick),window.addEventListener("keydown",this.onKey),window.addEventListener("resize",this.resize),this.app.addEventListener(P.SET_SCENE,this.sceneUpdate),this.app.addEventListener(P.ADD_CAMERA,this.addCamera),this.app.addEventListener(P.REMOVE_CAMERA,this.removeCamera),this.app.addEventListener(P.SET_OBJECT,this.onSetSelectedItem)}disable(){const e=this.containerRef.current;e.removeEventListener("mousemove",this.onMouseMove),e.removeEventListener("click",this.onClick),window.removeEventListener("keydown",this.onKey),window.removeEventListener("resize",this.resize),this.app.removeEventListener(P.SET_SCENE,this.sceneUpdate),this.app.removeEventListener(P.ADD_CAMERA,this.addCamera),this.app.removeEventListener(P.REMOVE_CAMERA,this.removeCamera),this.app.removeEventListener(P.SET_OBJECT,this.onSetSelectedItem)}resize=()=>{this.width=window.innerWidth-300,this.height=window.innerHeight;const e=Math.floor(this.width/2),t=Math.floor(this.height/2);this.props.three.resize(this.width,this.height),this.props.onSceneResize!==void 0&&this.sceneSet&&this.currentScene!==void 0&&this.props.onSceneResize(this.currentScene,this.width,this.height);let s=this.width,n=this.height;switch(this.state.mode){case"Side by Side":s=e,n=this.height;break;case"Stacked":s=this.width,n=t;break;case"Quad":s=e,n=t;break}const a=s/n;this.cameras.forEach(r=>{r instanceof o.OrthographicCamera?(r.left=s/-2,r.right=s/2,r.top=n/2,r.bottom=n/-2,r.name==="UI"&&(r.position.x=this.width/2,r.position.y=this.height/-2,r.position.z=100),r.updateProjectionMatrix()):r instanceof o.PerspectiveCamera&&(r.aspect=a,r.updateProjectionMatrix()),this.cameraHelpers.get(r.name)?.update()})};sceneUpdate=e=>{this.clearLightHelpers(),this.scene.remove(this.currentScene),Me(this.currentScene);const t=this.props.scenes.get(e.value.name);if(t!==void 0){const s=new t;this.props.onSceneSet!==void 0&&this.props.onSceneSet(s),this.currentScene=s,this.props.three.scene=this.currentScene,this.scene.add(this.currentScene),this.sceneSet=!0,this.addLightHelpers()}};addCamera=e=>{const t=e.value,s=this.props.three.scene?.getObjectByProperty("uuid",t.uuid);if(s!==void 0){const n=s;this.cameras.set(t.name,n);const a=new o.CameraHelper(n);a.visible=this.cameraVisibility,this.cameraHelpers.set(n.name,a),this.scene.add(a),this.setState({lastUpdate:Date.now()})}};removeCamera=e=>{const t=this.cameraHelpers.get(e.value.name);t!==void 0&&(this.scene.remove(t),t.dispose()),this.cameras.delete(e.value.name),this.setState({lastUpdate:Date.now()})};onMouseMove=e=>{const t=new o.Vector2;this.renderer.getSize(t);const s=Math.min(e.clientX,t.x),n=Math.min(e.clientY,t.y);this.pointer.x=Xe(s,0,t.x,-1,1),this.pointer.y=Xe(n,0,t.y,1,-1);const a=t.x/2,r=t.y/2,l=()=>{s<a?this.pointer.x=Xe(s,0,a,-1,1):this.pointer.x=Xe(s,a,t.x,-1,1)},c=()=>{n<r?this.pointer.y=Xe(n,0,r,1,-1):this.pointer.y=Xe(n,r,t.y,1,-1)};switch(this.state.mode){case"Quad":l(),c();break;case"Side by Side":l();break;case"Stacked":c(),c();break}if(this.updateCamera(s,n,a,r),this.state.interactionMode==="Orbit")return;const h=this.raycaster.intersectObjects(this.currentScene.children);h.length>0&&this.interactionHelper.position.copy(h[0].point)};onClick=e=>{if(this.state.interactionMode==="Orbit")return;const t=new o.Vector2;if(this.renderer.getSize(t),e.clientX>=t.x)return;this.onMouseMove(e);const s=this.raycaster.intersectObjects(this.currentScene.children);s.length>0&&(this.props.three.getObject(s[0].object.uuid),this.interactionHelper.visible=!1,this.setState({interactionMode:"Orbit",lastUpdate:Date.now()}))};onKey=e=>{if(this.selectedItem!==void 0){if(e.ctrlKey){if(this.currentCamera.name==="UI")return;const t=this.controls.get(this.currentCamera.name);e.key==="0"?(e.preventDefault(),this.clearControls(),this.cameraControls=new Te(this.currentCamera,this.currentWindow.current),this.selectedItem instanceof o.Mesh||this.selectedItem instanceof o.SkinnedMesh?(this.selectedItem.geometry.computeBoundingBox(),this.cameraControls.fitToBox(this.selectedItem.geometry.boundingBox,!0)):this.cameraControls.fitToSphere(this.selectedItem,!0),this.updateCameraControls(t,!0)):e.key==="1"?(e.preventDefault(),this.clearControls(),this.cameraControls=new Te(this.currentCamera,this.currentWindow.current),this.cameraControls.rotateTo(0,Math.PI*.5,!0),this.cameraControls.moveTo(this.selectedItem.position.x,this.selectedItem.position.y,0,!0),this.updateCameraControls(t)):e.key==="2"?(e.preventDefault(),this.clearControls(),this.cameraControls=new Te(this.currentCamera,this.currentWindow.current),this.cameraControls.rotateTo(0,0,!0),this.cameraControls.moveTo(this.selectedItem.position.x,0,this.selectedItem.position.z,!0),this.updateCameraControls(t)):e.key==="3"?(e.preventDefault(),this.clearControls(),this.cameraControls=new Te(this.currentCamera,this.currentWindow.current),this.cameraControls.rotateTo(Math.PI/2,Math.PI/2,!0),this.cameraControls.moveTo(0,this.selectedItem.position.y,this.selectedItem.position.z,!0),this.updateCameraControls(t)):e.key==="4"?(e.preventDefault(),this.clearControls(),this.cameraControls=new Te(this.currentCamera,this.currentWindow.current),this.cameraControls.rotateTo(Math.PI,Math.PI/2,!0),this.cameraControls.moveTo(this.selectedItem.position.x,this.selectedItem.position.y,0,!0),this.updateCameraControls(t)):e.key==="5"&&(e.preventDefault(),this.clearControls(),this.cameraControls=new Te(this.currentCamera,this.currentWindow.current),this.cameraControls.rotateTo(gi(45),gi(45),!0),this.updateCameraControls(t))}else if(this.currentTransform!==void 0)switch(e.key){case"r":this.currentTransform.setMode("rotate");break;case"s":this.currentTransform.setMode("scale");break;case"t":this.currentTransform.setMode("translate");break;case"q":this.currentTransform.setSpace(this.currentTransform.space==="local"?"world":"local");break}}};onSetSelectedItem=e=>{this.selectedItem!==void 0&&this.updateSelectedItemHelper(!1),this.selectedItem=this.currentScene.getObjectByProperty("uuid",e.value.uuid),this.selectedItem!==void 0&&(this.currentTransform!==void 0&&(this.currentTransform.removeEventListener("objectChange",this.onUpdateTransform),he.instance.remove(this.currentTransform.getHelper().name)),this.currentTransform=he.instance.add(e.value.name),this.currentTransform.attach(this.selectedItem),this.scene.add(this.currentTransform.getHelper()),this.currentTransform.addEventListener("objectChange",this.onUpdateTransform),this.updateSelectedItemHelper(!0))};updateSelectedItemHelper(e){if(this.selectedItem!==void 0)if(this.cameraVisibility){if(this.selectedItem.isLight===!0&&!this.lightVisibility){const t=this.lightHelpers.get(this.selectedItem.name);t!==void 0&&(t.visible=e)}}else{const t=this.cameraHelpers.get(this.selectedItem.name);t!==void 0&&(t.visible=e)}}onUpdateTransform=()=>{this.selectedItem!==void 0&&(this.props.three.updateObject(this.selectedItem.uuid,"position",this.selectedItem.position),this.props.three.updateObject(this.selectedItem.uuid,"rotation",{x:this.selectedItem.rotation.x,y:this.selectedItem.rotation.y,z:this.selectedItem.rotation.z}),this.props.three.updateObject(this.selectedItem.uuid,"scale",this.selectedItem.scale),Bt.instance.update())};clearLightHelpers=()=>{this.lightHelpers.forEach(e=>{this.helpersContainer.remove(e),e.dispose()}),this.lightHelpers.clear()};addLightHelpers=()=>{this.currentScene!==void 0&&this.currentScene.traverse(e=>{if(e.type.search("Light")>-1){let t;switch(e.type){case"DirectionalLight":t=new o.DirectionalLightHelper(e,100),t.name=`${e.name}Helper`,t.visible=this.lightVisibility,this.lightHelpers.set(e.name,t),this.helpersContainer.add(t);break;case"HemisphereLight":t=new o.HemisphereLightHelper(e,250),t.name=`${e.name}Helper`,t.visible=this.lightVisibility,this.lightHelpers.set(e.name,t),this.helpersContainer.add(t);break;case"RectAreaLight":t=new ya(e),t.name=`${e.name}Helper`,t.visible=this.lightVisibility,this.lightHelpers.set(e.name,t),this.helpersContainer.add(t);break;case"PointLight":t=new o.PointLightHelper(e,100),t.name=`${e.name}Helper`,t.visible=this.lightVisibility,this.lightHelpers.set(e.name,t),this.helpersContainer.add(t);break;case"SpotLight":t=new o.SpotLightHelper(e),t.name=`${e.name}Helper`,t.visible=this.lightVisibility,this.lightHelpers.set(e.name,t),this.helpersContainer.add(t);break}}})};createControls(e,t){const s=this.controls.get(e.name);if(s!==void 0&&s.dispose(),this.controls.delete(e.name),e.name==="UI")return;const n=new ba(e,t);switch(n.enableDamping=!0,n.dampingFactor=.05,e.name){case"Top":case"Bottom":case"Left":case"Right":case"Front":case"Back":n.enableRotate=!1;break}this.controls.set(e.name,n)}clearCamera(e){const t=this.cameraHelpers.get(e.name);t!==void 0&&(this.scene.remove(t),t.dispose(),this.cameraHelpers.delete(e.name));const s=this.controls.get(e.name);s!==void 0&&(s.dispose(),this.controls.delete(e.name))}killControls(){this.controls.forEach((e,t)=>{e.dispose();const s=this.cameraHelpers.get(t);s!==void 0&&(this.scene.remove(s),s.dispose()),this.cameraHelpers.delete(t),this.controls.delete(t)}),this.controls.clear(),this.cameraHelpers.clear()}assignControls(){switch(this.state.mode){case"Single":this.createControls(this.tlCam,this.tlWindow.current);break;case"Side by Side":case"Stacked":this.createControls(this.tlCam,this.tlWindow.current),this.createControls(this.trCam,this.trWindow.current);break;case"Quad":this.createControls(this.tlCam,this.tlWindow.current),this.createControls(this.trCam,this.trWindow.current),this.createControls(this.blCam,this.blWindow.current),this.createControls(this.brCam,this.brWindow.current);break}}updateCamera=(e,t,s,n)=>{switch(this.state.mode){case"Quad":t<n?e<s?this.currentCamera=this.tlCam:this.currentCamera=this.trCam:e<s?this.currentCamera=this.blCam:this.currentCamera=this.brCam;break;case"Side by Side":e<s?this.currentCamera=this.tlCam:this.currentCamera=this.trCam;break;case"Single":this.currentCamera=this.tlCam;break;case"Stacked":t<n?this.currentCamera=this.tlCam:this.currentCamera=this.trCam;break}this.splineEditor.camera=this.currentCamera,this.raycaster.setFromCamera(this.pointer,this.currentCamera),this.currentCamera===this.tlCam?this.currentWindow=this.tlWindow:this.currentCamera===this.trCam?this.currentWindow=this.trWindow:this.currentCamera===this.blCam?this.currentWindow=this.blWindow:this.currentCamera===this.brCam&&(this.currentWindow=this.brWindow),he.instance.updateCamera(this.currentCamera,this.currentWindow.current)};updateCameraControls=(e,t=!1)=>{if(this.selectedItem===void 0)return;cancelAnimationFrame(this.cameraControlsRafID),this.cameraControlsRafID=-1,this.cameraControls&&(this.cameraControls.smoothTime=.1);const s=.15,n=new o.Clock;n.start(),this.selectedItem.getWorldPosition(e.target0);const a=()=>{const r=n.getDelta();this.cameraControls&&this.cameraControls.update(r),t&&(e.target.lerp(e.target0,s),e.object.position.lerp(e.position0,s),e.object.zoom=tt(e.object.zoom,e.zoom0,s),e.object.updateProjectionMatrix(),e.dispatchEvent({type:"change"})),n.getElapsedTime()>=.5?(cancelAnimationFrame(this.cameraControlsRafID),this.cameraControlsRafID=-1,this.clearControls()):this.cameraControlsRafID=requestAnimationFrame(a)};a()};clearControls=()=>{this.cameraControls!==void 0&&(this.cameraControls.disconnect(),this.cameraControls.dispose(),this.cameraControls=void 0)};saveExpandedCameraVisibility(){localStorage.setItem(this.expandedCameraVisibility,this.cameraVisibility?"open":"closed")}saveExpandedLightVisibility(){localStorage.setItem(this.expandedLightVisibility,this.lightVisibility?"open":"closed")}getSceneOverride(e){switch(e){case"Depth":return this.depthMaterial;case"Normals":return this.normalsMaterial;case"Renderer":return null;case"UVs":return this.uvMaterial;case"Wireframe":return this.wireframeMaterial}return null}drawTo(e,t,s,n,a,r){switch(a.name){case"Left":case"Right":this.grid.rotation.z=Math.PI/2;break;case"Front":case"Back":this.grid.rotation.x=Math.PI/2;break}this.scene.overrideMaterial=r,this.renderer?.setViewport(e,t,s,n),this.renderer?.setScissor(e,t,s,n),this.renderer?.render(this.scene,a),this.grid.rotation.set(0,0,0)}drawSingle(){const e=this.getSceneOverride(this.tlRender);this.drawTo(0,0,this.width,this.height,this.tlCam,e)}drawDouble=()=>{const e=this.getSceneOverride(this.tlRender),t=this.getSceneOverride(this.trRender),s=Math.floor(this.width/2),n=Math.floor(this.height/2);if(this.state.mode==="Side by Side")this.drawTo(0,0,s,this.height,this.tlCam,e),this.drawTo(s,0,s,this.height,this.trCam,t);else{const a=this.height-n;this.drawTo(0,a,this.width,n,this.tlCam,e),this.drawTo(0,0,this.width,n,this.trCam,t)}};drawQuad=()=>{const e=this.getSceneOverride(this.tlRender),t=this.getSceneOverride(this.trRender),s=this.getSceneOverride(this.blRender),n=this.getSceneOverride(this.brRender),a=Math.floor(this.width/2),r=Math.floor(this.height/2);let l=0,c=0;c=this.height-r,l=0,this.drawTo(l,c,a,r,this.tlCam,e),l=a,this.drawTo(l,c,a,r,this.trCam,t),c=0,l=0,this.scene.overrideMaterial=s,this.drawTo(l,c,a,r,this.blCam,s),l=a,this.drawTo(l,c,a,r,this.brCam,n)};get appID(){return this.props.three.app.appID}get mode(){return this.state.mode}get three(){return this.props.three}get expandedCameraVisibility(){return`${this.appID}_multiviewCameraVisibility`}get expandedLightVisibility(){return`${this.appID}_multiviewLightVisibility`}}class Bt extends O.Component{static instance;app;matrix=new o.Matrix4;position=new o.Vector3;rotation=new o.Euler;scale=new o.Vector3;open=!1;constructor(e){super(e),this.app=e.app;const t=localStorage.getItem(this.expandedName),s=t!==null?t==="open":!1;this.open=s,this.saveExpanded(),this.state={lastUpdated:0,expanded:s},this.matrix.elements=e.object.matrix,e.object.uuid.length>0&&(this.position.setFromMatrixPosition(this.matrix),this.rotation.setFromRotationMatrix(this.matrix),this.scale.setFromMatrixScale(this.matrix)),Bt.instance=this}update(){if(oe.instance){const e=oe.instance.selectedItem;if(e===void 0)return;this.position.x=ye(e.position.x,3),this.position.y=ye(e.position.y,3),this.position.z=ye(e.position.z,3),this.rotation.copy(e.rotation),this.scale.x=ye(e.scale.x,3),this.scale.y=ye(e.scale.y,3),this.scale.z=ye(e.scale.z,3),this.setState({lastUpdated:Date.now()})}}render(){return p.jsx(Ce,{app:this.app,title:"Transform",expanded:this.open,items:[{title:"Position",prop:"position",type:"grid3",step:.1,value:this.position,onChange:this.updateTransform},{title:"Rotation",prop:"rotation",type:"euler",value:this.rotation,onChange:this.updateTransform},{title:"Scale",prop:"scale",type:"grid3",value:this.scale,onChange:this.updateTransform},{title:"Visible",prop:"visible",type:"boolean",value:this.props.object.visible,onChange:this.updateTransform}],onToggle:e=>{this.open=e,this.saveExpanded()}},this.state.lastUpdated)}updateTransform=(e,t)=>{const s=e==="rotation"?{x:t._x,y:t._y,z:t._z}:t;this.props.three.updateObject(this.props.object.uuid,e,s);const n=this.props.three.getScene(this.props.object.uuid);if(n){const a=n.getObjectByProperty("uuid",this.props.object.uuid);ee(a,e,s)}};saveExpanded(){localStorage.setItem(this.expandedName,this.open?"open":"closed")}get expandedName(){return`${this.props.three.app.appID}_transform`}}function ps(i){switch(i){case"color":return"Color";case"intensity":return"Intensity";case"decay":return"Decay";case"distance":return"Distance";case"angle":return"Angle";case"penumbra":return"Penumbra";case"groundColor":return"Ground Color";case"width":return"Width";case"height":return"Height"}return i}function ir(i,e,t){function s(){return`${t.app.appID}_light`}const n=localStorage.getItem(s()),a=n!==null?n==="open":!1;function r(c){localStorage.setItem(s(),c?"open":"closed")}const l=[];if(i.lightInfo!==void 0)for(const c in i.lightInfo){const h=i.lightInfo[c];h!==void 0&&(h.isColor!==void 0?l.push({title:ps(c),prop:c,type:"color",value:h,onChange:(d,f)=>{const m=new o.Color(f);t.updateObject(i.uuid,d,m);const g=t.getScene(i.uuid);if(g!==null){const E=g.getObjectByProperty("uuid",i.uuid);ee(E,d,m)}}}):l.push({title:ps(c),prop:c,type:typeof h,value:h,step:typeof h=="number"?.01:void 0,onChange:(d,f)=>{t.updateObject(i.uuid,d,f);const m=t.getScene(i.uuid);if(m!==null){const g=m.getObjectByProperty("uuid",i.uuid);ee(g,d,f)}}}))}return p.jsx(Ce,{app:e,title:"Light",items:l,expanded:a,onToggle:c=>{r(c)}})}function sr(i){const e=i.object,t=i.three;function s(){return`${t.app.appID}_animation`}const n=localStorage.getItem(s()),a=n!==null?n==="open":!1;function r(m){localStorage.setItem(s(),m?"open":"closed")}const l=[],c=[];let h=0;e.animations.forEach(m=>{h=Math.max(h,m.duration),m.duration>0&&c.push({title:m.name,items:[{title:"Duration",type:"number",value:m.duration,disabled:!0},{title:"Blend Mode",type:"option",disabled:!0,options:[{title:"Normal",value:2500},{title:"Additive",value:2501}]}]})}),l.push({title:"Animations",items:c});let d;const f=t.getScene(e.uuid);if(f!==null){const m=f.getObjectByProperty("uuid",e.uuid);if(m!==void 0){const g=m.mixer;if(g!==void 0){const y=[{title:"Time Scale",type:"range",value:g.timeScale,step:.01,min:-1,max:2,onChange:(T,_)=>{g.timeScale=_,t.updateObject(e.uuid,"mixer.timeScale",_)}}];y.push({title:"Stop All",type:"button",onChange:()=>{g.stopAllAction(),t.requestMethod(e.uuid,"stopAllAction",void 0,"mixer")}}),l.push({title:"Mixer",items:y}),d=new o.SkeletonHelper(m),oe.instance?.scene.add(d)}}}return O.useEffect(()=>()=>{d!==void 0&&Me(d)},[]),p.jsx(Ce,{app:i.app,title:"Animation",items:l,expanded:a,onToggle:m=>{r(m)}})}const yi={name:"",uuid:"",type:"",visible:!1,matrix:[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],animations:[],material:void 0,perspectiveCameraInfo:void 0,orthographicCameraInfo:void 0,lightInfo:void 0,children:[]};let re={...yi};function Ps(i){const[e,t]=O.useState(-1);O.useEffect(()=>{function r(c){re={...c.value},t(Date.now())}function l(){re={...yi},t(Date.now())}return i.app.addEventListener(P.SET_SCENE,l),i.app.addEventListener(P.SET_OBJECT,r),()=>{i.app.removeEventListener(P.SET_SCENE,l),i.app.removeEventListener(P.SET_OBJECT,r)}},[]);const s=re.type.toLowerCase(),n=re.animations.length>0||re.mixer!==void 0,a=s.search("mesh")>-1||s.search("line")>-1||s.search("points")>-1;return p.jsx(bt,{app:i.app,label:"Inspector",button:re.uuid.length>0?p.jsx("button",{className:"remove",onClick:()=>{he.instance.remove(re.name),re={...yi},t(Date.now())}}):void 0,children:p.jsx("div",{id:"Inspector",className:i.class,children:re.uuid.length>0&&p.jsxs(p.Fragment,{children:[p.jsxs(p.Fragment,{children:[p.jsx(Ut,{type:"string",title:"Name",prop:"name",value:re.name,disabled:!0}),p.jsx(Ut,{type:"string",title:"Type",prop:"type",value:re.type,disabled:!0}),p.jsx(Ut,{type:"string",title:"UUID",prop:"uuid",value:re.uuid,disabled:!0})]}),p.jsxs(p.Fragment,{children:[p.jsx(Bt,{object:re,app:i.app,three:i.three}),n?p.jsx(sr,{app:i.app,object:re,three:i.three}):null,s.search("camera")>-1?va(re,i.app,i.three):null,s.search("light")>-1?ir(re,i.app,i.three):null,a?fa(re,i.app,i.three):null]})]})},e)},"Inspector")}class nr extends O.Component{app;autoClear=!0;autoClearColor=!0;autoClearDepth=!0;autoClearStencil=!0;outputColorSpace=o.SRGBColorSpace;localClippingEnabled=!1;clearColor=new o.Color(0);clearAlpha=1;toneMapping=o.NoToneMapping;toneMappingExposure=1;constructor(e){super(e),this.app=e.app;const t=localStorage.getItem(this.expandedName),s=t!==null?t==="open":!1;if(this.state={expanded:s,lastUpdated:Date.now()},this.saveExpanded(s),oe.instance){const n=oe.instance.renderer;n&&(this.autoClear=n.autoClear,this.autoClearColor=n.autoClearColor,this.autoClearDepth=n.autoClearDepth,this.autoClearStencil=n.autoClearStencil,this.outputColorSpace=n.outputColorSpace,this.localClippingEnabled=n.localClippingEnabled,this.clearAlpha=n.getClearAlpha(),this.toneMapping=n.toneMapping,this.toneMappingExposure=n.toneMappingExposure,n.getClearColor(this.clearColor))}this.app.addEventListener(P.ADD_RENDERER,this.onAddRenderer)}componentwillunmount(){this.app.removeEventListener(P.ADD_RENDERER,this.onAddRenderer)}onAddRenderer=e=>{const t=e.value;if(this.autoClear=t.autoClear,this.autoClearColor=t.autoClearColor,this.autoClearDepth=t.autoClearDepth,this.autoClearStencil=t.autoClearStencil,this.outputColorSpace=t.outputColorSpace,this.localClippingEnabled=t.localClippingEnabled,this.clearAlpha=t.clearAlpha,this.toneMapping=t.toneMapping,this.toneMappingExposure=t.toneMappingExposure,this.clearColor.setStyle(t.clearColor,o.LinearSRGBColorSpace),o.ColorManagement.enabled=t.colorManagement,oe.instance){const s=oe.instance.renderer;s&&(s.autoClear=this.autoClear,s.autoClearColor=this.autoClearColor,s.autoClearDepth=this.autoClearDepth,s.autoClearStencil=this.autoClearStencil,s.outputColorSpace=this.outputColorSpace,s.localClippingEnabled=this.localClippingEnabled,s.toneMapping=this.toneMapping,s.toneMappingExposure=this.toneMappingExposure,s.setClearColor(t.clearColor,this.clearAlpha))}this.setState({lastUpdated:Date.now()})};render(){const e=()=>{if(oe.instance){const t=oe.instance.renderer;t&&(t.autoClear=this.autoClear,t.autoClearColor=this.autoClearColor,t.autoClearDepth=this.autoClearDepth,t.autoClearStencil=this.autoClearStencil,t.outputColorSpace=this.outputColorSpace,t.localClippingEnabled=this.localClippingEnabled,t.toneMapping=this.toneMapping,t.toneMappingExposure=this.toneMappingExposure,t.setClearColor(this.clearColor.getStyle(),this.clearAlpha),this.props.three.updateRenderer({autoClear:this.autoClear,autoClearColor:this.autoClearColor,autoClearDepth:this.autoClearDepth,autoClearStencil:this.autoClearStencil,outputColorSpace:this.outputColorSpace,localClippingEnabled:this.localClippingEnabled,clearAlpha:this.clearAlpha,clearColor:this.clearColor.getStyle(),colorManagement:o.ColorManagement.enabled,toneMapping:this.toneMapping,toneMappingExposure:this.toneMappingExposure}))}};return p.jsx(Ce,{app:this.app,title:"Renderer",expanded:this.state.expanded,items:[{type:"boolean",title:"Auto Clear",value:this.autoClear,onChange:(t,s)=>{this.autoClear=s}},{type:"boolean",title:"Auto Clear Color",value:this.autoClearColor,onChange:(t,s)=>{this.autoClearColor=s,e()}},{type:"boolean",title:"Auto Clear Depth",value:this.autoClearDepth,onChange:(t,s)=>{this.autoClearDepth=s,e()}},{type:"boolean",title:"Auto Clear Stencil",value:this.autoClearStencil,onChange:(t,s)=>{this.autoClearStencil=s,e()}},{type:"boolean",title:"Local Clipping",value:this.localClippingEnabled,onChange:(t,s)=>{this.localClippingEnabled=s,e()}},{type:"color",title:"Clear Color",value:`#${this.clearColor.getHexString()}`,onChange:(t,s)=>{this.clearColor.setStyle(s),e()}},{type:"range",title:"Clear Alpha",min:0,max:1,step:.01,value:this.clearAlpha,onChange:(t,s)=>{this.clearAlpha=s,e()}},{type:"boolean",title:"Clear Management",value:o.ColorManagement.enabled,onChange:(t,s)=>{o.ColorManagement.enabled=s,e()}},{type:"option",title:"Color Space",value:this.outputColorSpace,options:[{title:"No Color Space",value:o.NoColorSpace},{title:"SRB Color Space",value:o.SRGBColorSpace},{title:"Linear SRB Color Space",value:o.LinearSRGBColorSpace}],onChange:(t,s)=>{this.outputColorSpace=s,e()}},{type:"option",title:"Tone Mapping",value:this.toneMapping,options:[{title:"None ",value:o.NoToneMapping},{title:"Linear ",value:o.LinearToneMapping},{title:"Reinhard",value:o.ReinhardToneMapping},{title:"Cineon ",value:o.CineonToneMapping},{title:"ACES Filmic",value:o.ACESFilmicToneMapping},{title:"AgX",value:o.AgXToneMapping},{title:"Neutral",value:o.NeutralToneMapping},{title:"Custom",value:o.CustomToneMapping}],onChange:(t,s)=>{this.toneMapping=s,e()}},{type:"range",title:"Tone Mapping Exposure",value:this.toneMappingExposure,min:0,max:2,step:.01,onChange:(t,s)=>{this.toneMappingExposure=s,e()}}],onToggle:t=>{this.setState({expanded:t}),this.saveExpanded(t)}},Math.random())}saveExpanded(e){localStorage.setItem(this.expandedName,e?"open":"closed")}get expandedName(){return`${this.props.three.app.appID}_renderer`}}function Rs(i){const[e]=O.useState([]),[t]=O.useState([]),[s,n]=O.useState(0),a=c=>{const h=c.value;e.push(h),t.push(p.jsx(bt,{app:i.app,label:`Scene: ${h.name}`,scene:h,open:!0,onRefresh:()=>{i.three.refreshScene(h.name)},children:p.jsx(fi,{app:i.app,child:h,scene:h,three:i.three})},Math.random())),n(Date.now())},r=c=>{const h=c.value;for(let d=0;d<e.length;d++)if(h.uuid===e[d].uuid){e[d]=h,t[d]=p.jsx(bt,{app:i.app,label:`Scene: ${h.name}`,scene:h,open:!0,onRefresh:()=>{i.three.refreshScene(h.name)},children:p.jsx(fi,{app:i.app,child:h,scene:h,three:i.three})},Math.random()),n(Date.now());return}},l=c=>{const h=c.value;for(let d=0;d<e.length;d++)if(h.uuid===e[d].uuid){e.splice(d,1),t.splice(d,1),n(Date.now());return}};return O.useEffect(()=>(i.app.addEventListener(P.ADD_SCENE,a),i.app.addEventListener(P.REFRESH_SCENE,r),i.app.addEventListener(P.REMOVE_SCENE,l),()=>{i.app.removeEventListener(P.ADD_SCENE,a),i.app.removeEventListener(P.REFRESH_SCENE,r),i.app.removeEventListener(P.REMOVE_SCENE,l)}),[]),p.jsxs("div",{id:"SidePanel",children:[p.jsx("div",{className:"scenes",children:t},s),p.jsx(Ps,{app:i.app,three:i.three}),p.jsx(nr,{app:i.app,three:i.three}),p.jsx(V,{app:i.app,three:i.three})]})}function ar(i){return O.useEffect(()=>{function e(l){let c=null;return i.three.scenes.forEach(h=>{l.search(h.uuid)>-1&&(c=h)}),c}const t=l=>{const c=l.value,d=e(c)?.getObjectByProperty("uuid",c);d!==void 0&&i.three.setObject(d)},s=(l,c,h)=>{const f=e(l)?.getObjectByProperty("uuid",l);f!==void 0&&ee(f,c,h)},n=l=>{const c=l.value,{key:h,value:d,uuid:f}=c;s(f,h,d)},a=l=>{const c=l.value,d=e(c.uuid)?.getObjectByProperty("uuid",c.uuid);if(d!==void 0){const f=m=>{const g=c.key.split(".");switch(g.length){case 1:d[g[0]]=m;break;case 2:d[g[0]][g[1]]=m;break;case 3:d[g[0]][g[1]][g[2]]=m;break;case 4:d[g[0]][g[1]][g[2]][g[3]]=m;break;case 5:d[g[0]][g[1]][g[2]][g[3]][g[4]]=m;break}d.material.needsUpdate=!0};c.value.src.length>0?bs(c.value.src).then(m=>{m.offset.set(c.value.offset[0],c.value.offset[1]),m.repeat.set(c.value.repeat[0],c.value.repeat[1]),f(m)}):f(null)}},r=l=>{const{key:c,uuid:h,value:d,subitem:f}=l.value,g=e(h)?.getObjectByProperty("uuid",h);if(g!==void 0)try{f!==void 0?Bn(g,f)[c](d):g[c](d)}catch(E){console.log("Error requesting method:"),console.log(E),console.log(c),console.log(d)}};return i.app.addEventListener(P.GET_OBJECT,t),i.app.addEventListener(P.UPDATE_OBJECT,n),i.app.addEventListener(P.CREATE_TEXTURE,a),i.app.addEventListener(P.REQUEST_METHOD,r),()=>{i.app.removeEventListener(P.GET_OBJECT,t),i.app.removeEventListener(P.UPDATE_OBJECT,n),i.app.removeEventListener(P.CREATE_TEXTURE,a),i.app.removeEventListener(P.REQUEST_METHOD,r)}},[]),null}function Ds(i){return p.jsxs("div",{className:"editor",ref:i.ref,style:i.style,children:[p.jsx("div",{className:"header",children:i.header}),i.children,p.jsx("div",{className:"footer",children:i.footer})]})}function rr(i){return p.jsx(Ds,{children:p.jsxs(p.Fragment,{children:[p.jsx(oe,{app:i.app,three:i.three,scenes:i.scenes,onSceneResize:i.onSceneResize,onSceneSet:i.onSceneSet,onSceneUpdate:i.onSceneUpdate}),p.jsx(Rs,{app:i.app,three:i.three})]})})}exports.Accordion=bt;exports.AppRunner=Dn;exports.Application=Rn;exports.BaseRemote=Ht;exports.BaseScene=In;exports.ChildObject=Si;exports.ContainerObject=fi;exports.Draggable=Ss;exports.DraggableItem=Es;exports.Dropdown=ws;exports.DropdownItem=xs;exports.Editor=Ds;exports.ElementProxy=An;exports.ElementProxyReceiver=Cs;exports.ExportTexture=vt;exports.Inspector=Ps;exports.MultiView=oe;exports.NavButton=Ei;exports.ProxyManager=Pn;exports.QualityType=vs;exports.RemoteComponents=Ln;exports.RemoteTheatre=Fn;exports.RemoteThree=Gn;exports.SceneInspector=ar;exports.SidePanel=Rs;exports.Spline=vi;exports.SplineEditor=As;exports.ThreeEditor=rr;exports.ToolEvents=P;exports.Transform=he;exports.WebworkerEventHandlers=Tn;exports.capitalize=Ct;exports.clamp=Ue;exports.colorToHex=di;exports.copyToClipboard=ms;exports.cubicBezier=vn;exports.customizeTheatreElements=Un;exports.damp=un;exports.defaultTheatreCallback=sn;exports.detectMaxFrameRate=ys;exports.detectSettings=cn;exports.dispose=Me;exports.disposeMaterial=Ci;exports.disposeTexture=ui;exports.distance=dn;exports.hierarchyUUID=Ft;exports.isColor=gs;exports.map=hn;exports.mix=tt;exports.noop=yt;exports.normalize=Nt;exports.parseModelLite=yn;exports.randomID=fs;exports.resetThreeObjects=pi;exports.round=ye;exports.roundTo=pn;exports.theatreEditorApp=kn;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o=require("three"),T=require("react"),yt=()=>{},sn=()=>{};function bt(i){return i.substring(0,1).toUpperCase()+i.substring(1)}function ms(i){const e=JSON.stringify(i);return navigator.clipboard.writeText(e),e}function fs(){return Math.round(Math.random()*1e6).toString()}function gs(i){return i.r!==void 0&&i.g!==void 0&&i.b!==void 0}function ui(i){const e=Math.round(i.r*255),t=Math.round(i.g*255),s=Math.round(i.b*255),n=c=>{const h=c.toString(16);return h.length===1?"0"+h:h},r=n(e),a=n(t),l=n(s);return"#"+r+a+l}function Qt(i,e,t,s){return new(t||(t=Promise))(function(n,r){function a(h){try{c(s.next(h))}catch(u){r(u)}}function l(h){try{c(s.throw(h))}catch(u){r(u)}}function c(h){var u;h.done?n(h.value):(u=h.value,u instanceof t?u:new t(function(f){f(u)})).then(a,l)}c((s=s.apply(i,e||[])).next())})}const nn=["geforce 320m","geforce 8600","geforce 8600m gt","geforce 8800 gs","geforce 8800 gt","geforce 9400","geforce 9400m g","geforce 9400m","geforce 9600m gt","geforce 9600m","geforce fx go5200","geforce gt 120","geforce gt 130","geforce gt 330m","geforce gtx 285","google swiftshader","intel g41","intel g45","intel gma 4500mhd","intel gma x3100","intel hd 3000","intel q45","legacy","mali-2","mali-3","mali-4","quadro fx 1500","quadro fx 4","quadro fx 5","radeon hd 2400","radeon hd 2600","radeon hd 4670","radeon hd 4850","radeon hd 4870","radeon hd 5670","radeon hd 5750","radeon hd 6290","radeon hd 6300","radeon hd 6310","radeon hd 6320","radeon hd 6490m","radeon hd 6630m","radeon hd 6750m","radeon hd 6770m","radeon hd 6970m","sgx 543","sgx543"];function zi(i){return i=i.toLowerCase().replace(/.*angle ?\((.+)\)(?: on vulkan [0-9.]+)?$/i,"$1").replace(/\s(\d{1,2}gb|direct3d.+$)|\(r\)| \([^)]+\)$/g,"").replace(/(?:vulkan|opengl) \d+\.\d+(?:\.\d+)?(?: \((.*)\))?/,"$1")}const _s=typeof window>"u",Te=(()=>{if(_s)return;const{userAgent:i,platform:e,maxTouchPoints:t}=window.navigator,s=/(iphone|ipod|ipad)/i.test(i),n=e==="iPad"||e==="MacIntel"&&t>0&&!window.MSStream;return{isIpad:n,isMobile:/android/i.test(i)||s||n,isSafari12:/Version\/12.+Safari/.test(i),isFirefox:/Firefox/.test(i)}})();function an(i,e,t){if(!t)return[e];const s=function(h){const u=`
2
+ precision highp float;
3
+ attribute vec3 aPosition;
4
+ varying float vvv;
5
+ void main() {
6
+ vvv = 0.31622776601683794;
7
+ gl_Position = vec4(aPosition, 1.0);
8
+ }
9
+ `,f=`
10
+ precision highp float;
11
+ varying float vvv;
12
+ void main() {
13
+ vec4 enc = vec4(1.0, 255.0, 65025.0, 16581375.0) * vvv;
14
+ enc = fract(enc);
15
+ enc -= enc.yzww * vec4(1.0 / 255.0, 1.0 / 255.0, 1.0 / 255.0, 0.0);
16
+ gl_FragColor = enc;
17
+ }
18
+ `,m=h.createShader(35633),g=h.createShader(35632),E=h.createProgram();if(!(g&&m&&E))return;h.shaderSource(m,u),h.shaderSource(g,f),h.compileShader(m),h.compileShader(g),h.attachShader(E,m),h.attachShader(E,g),h.linkProgram(E),h.detachShader(E,m),h.detachShader(E,g),h.deleteShader(m),h.deleteShader(g),h.useProgram(E);const y=h.createBuffer();h.bindBuffer(34962,y),h.bufferData(34962,new Float32Array([-1,-1,0,3,-1,0,-1,3,0]),35044);const O=h.getAttribLocation(E,"aPosition");h.vertexAttribPointer(O,3,5126,!1,0,0),h.enableVertexAttribArray(O),h.clearColor(1,1,1,1),h.clear(16384),h.viewport(0,0,1,1),h.drawArrays(4,0,3);const _=new Uint8Array(4);return h.readPixels(0,0,1,1,6408,5121,_),h.deleteProgram(E),h.deleteBuffer(y),_.join("")}(i),n="801621810",r="8016218135",a="80162181161",l=Te?.isIpad?[["a7",a,12],["a8",r,15],["a8x",r,15],["a9",r,15],["a9x",r,15],["a10",r,15],["a10x",r,15],["a12",n,15],["a12x",n,15],["a12z",n,15],["a14",n,15],["a15",n,15],["m1",n,15],["m2",n,15]]:[["a7",a,12],["a8",r,12],["a9",r,15],["a10",r,15],["a11",n,15],["a12",n,15],["a13",n,15],["a14",n,15],["a15",n,15],["a16",n,15],["a17",n,15]];let c;return s==="80162181255"?c=l.filter(([,,h])=>h>=14):(c=l.filter(([,h])=>h===s),c.length||(c=l)),c.map(([h])=>`apple ${h} gpu`)}class Hi extends Error{constructor(e){super(e),Object.setPrototypeOf(this,new.target.prototype)}}const Kt=[],Vi=[];function rn(i,e){if(i===e)return 0;const t=i;i.length>e.length&&(i=e,e=t);let s=i.length,n=e.length;for(;s>0&&i.charCodeAt(~-s)===e.charCodeAt(~-n);)s--,n--;let r,a=0;for(;a<s&&i.charCodeAt(a)===e.charCodeAt(a);)a++;if(s-=a,n-=a,s===0)return n;let l,c,h=0,u=0,f=0;for(;u<s;)Vi[u]=i.charCodeAt(a+u),Kt[u]=++u;for(;f<n;)for(r=e.charCodeAt(a+f),l=f++,h=f,u=0;u<s;u++)c=r===Vi[u]?l:l+1,l=Kt[u],h=Kt[u]=l>h?c>h?h+1:c:c>l?l+1:c;return h}function on(i){return i!=null}const ln=({mobileTiers:i=[0,15,30,60],desktopTiers:e=[0,15,30,60],override:t={},glContext:s,failIfMajorPerformanceCaveat:n=!1,benchmarksURL:r="https://unpkg.com/detect-gpu@5.0.57/dist/benchmarks"}={})=>Qt(void 0,void 0,void 0,function*(){const a={};if(_s)return{tier:0,type:"SSR"};const{isIpad:l=!!Te?.isIpad,isMobile:c=!!Te?.isMobile,screenSize:h=window.screen,loadBenchmarks:u=x=>Qt(void 0,void 0,void 0,function*(){const M=yield fetch(`${r}/${x}`).then(D=>D.json());if(parseInt(M.shift().split(".")[0],10)<4)throw new Hi("Detect GPU benchmark data is out of date. Please update to version 4x");return M})}=t;let{renderer:f}=t;const m=(x,M,D,k,R)=>({device:R,fps:k,gpu:D,isMobile:c,tier:x,type:M});let g,E="";if(f)f=zi(f),g=[f];else{const x=s||function(D,k=!1){const R={alpha:!1,antialias:!1,depth:!1,failIfMajorPerformanceCaveat:k,powerPreference:"high-performance",stencil:!1};D&&delete R.powerPreference;const V=window.document.createElement("canvas"),ge=V.getContext("webgl",R)||V.getContext("experimental-webgl",R);return ge??void 0}(Te?.isSafari12,n);if(!x)return m(0,"WEBGL_UNSUPPORTED");const M=Te?.isFirefox?null:x.getExtension("WEBGL_debug_renderer_info");if(f=M?x.getParameter(M.UNMASKED_RENDERER_WEBGL):x.getParameter(x.RENDERER),!f)return m(1,"FALLBACK");E=f,f=zi(f),g=function(D,k,R){return k==="apple gpu"?an(D,k,R):[k]}(x,f,c)}const y=(yield Promise.all(g.map(function(x){var M;return Qt(this,void 0,void 0,function*(){const D=(G=>{const ae=c?["adreno","apple","mali-t","mali","nvidia","powervr","samsung"]:["intel","apple","amd","radeon","nvidia","geforce","adreno"];for(const Ce of ae)if(G.includes(Ce))return Ce})(x);if(!D)return;const k=`${c?"m":"d"}-${D}${l?"-ipad":""}.json`,R=a[k]=(M=a[k])!==null&&M!==void 0?M:u(k);let V;try{V=yield R}catch(G){if(G instanceof Hi)throw G;return}const ge=function(G){var ae;const Ce=(G=G.replace(/\([^)]+\)/,"")).match(/\d+/)||G.match(/(\W|^)([A-Za-z]{1,3})(\W|$)/g);return(ae=Ce?.join("").replace(/\W|amd/g,""))!==null&&ae!==void 0?ae:""}(x);let ue=V.filter(([,G])=>G===ge);ue.length||(ue=V.filter(([G])=>G.includes(x)));const se=ue.length;if(se===0)return;const Q=x.split(/[.,()\[\]/\s]/g).sort().filter((G,ae,Ce)=>ae===0||G!==Ce[ae-1]).join(" ");let X,[Ae,,,,le]=se>1?ue.map(G=>[G,rn(Q,G[2])]).sort(([,G],[,ae])=>G-ae)[0][0]:ue[0],fe=Number.MAX_VALUE;const{devicePixelRatio:te}=window,Pe=h.width*te*h.height*te;for(const G of le){const[ae,Ce]=G,it=ae*Ce,Be=Math.abs(Pe-it);Be<fe&&(fe=Be,X=G)}if(!X)return;const[,,Re,De]=X;return[fe,Re,Ae,De]})}))).filter(on).sort(([x=Number.MAX_VALUE,M],[D=Number.MAX_VALUE,k])=>x===D?M-k:x-D);if(!y.length){const x=nn.find(M=>f.includes(M));return x?m(0,"BLOCKLISTED",x):m(1,"FALLBACK",`${f} (${E})`)}const[,O,_,b]=y[0];if(O===-1)return m(0,"BLOCKLISTED",_,O,b);const S=c?i:e;let w=0;for(let x=0;x<S.length;x++)O>=S[x]&&(w=x);return m(w,"BENCHMARK",_,O,b)});var vs=(i=>(i[i.High=0]="High",i[i.Medium=1]="Medium",i[i.Low=2]="Low",i))(vs||{});function ys(i){let e=0;const t=performance.now();function s(){e++;const n=performance.now();if(n-t>=100){const r=e/((n-t)/1e3),a=Math.round(r/30)*30;i(a)}else requestAnimationFrame(s)}requestAnimationFrame(s)}function cn(i,e,t){return new Promise(s=>{ln().then(n=>{let r=!1;const a=/^((?!chrome|android).)*safari/i.test(navigator.userAgent);if(r="transferControlToOffscreen"in i,a){const c=navigator.userAgent.match(/version\/(\d+)/i);r=(c?parseInt(c[1]):0)>=17}const l={dpr:devicePixelRatio,fps:30,width:innerWidth,height:innerHeight,mobile:n.isMobile!==void 0?n.isMobile:!1,supportOffScreenCanvas:r,quality:2,dev:e,editor:t};n.tier===3?l.quality=0:n.tier===2&&(l.quality=1),ys(c=>{l.fps=c,s(l)}),s(l)})})}function Ue(i,e,t){return Math.min(e,Math.max(i,t))}function Nt(i,e,t){return(t-i)/(e-i)}function tt(i,e,t){return i*(1-t)+e*t}function hn(i,e,t,s,n){return tt(t,s,Nt(i,e,n))}function dn(i,e){const t=i-e;return Math.sqrt(t*t)}function ye(i,e=1){return Number(i.toFixed(e))}function un(i,e,t,s){return tt(i,e,1-Math.exp(-t*s))}function pn(i,e=1){return Number(i.toFixed(e))}function mn(i,e,t,s){return i===e&&t===s}function fn(i,e,t,s){return 1/(3*e*i*i+2*t*i+s)}function gn(i,e,t,s,n){return e*(i*i*i)+t*(i*i)+s*i+n}function _n(i,e,t,s,n){const r=i*i;return e*(r*i)+t*r+s*i+n}function vn(i,e,t,s,n){if(i<=0)return 0;if(i>=1)return 1;if(mn(e,t,s,n))return i;const r=0,a=0,l=e,c=t,h=s,u=n,f=1,m=1,g=f-3*h+3*l-r,E=3*h-6*l+3*r,y=3*l-3*r,O=r,_=m-3*u+3*c-a,b=3*u-6*c+3*a,S=3*c-3*a,w=a;let x=i;for(let M=0;M<5;M++){const D=gn(x,g,E,y,O);let k=fn(x,g,E,y);k===1/0&&(k=i),x-=(D-i)*k,x=Math.min(Math.max(x,0),1)}return _n(x,_,b,S,w)}const pi=i=>{i?.dispose()},Ci=i=>{if(i)if(Array.isArray(i))i.forEach(e=>Ci(e));else{for(const e in i){const t=i[e];t!==null&&t instanceof o.Texture&&pi(t)}if(i.isShaderMaterial===!0){const e=i;for(const t in e.uniforms){const s=e.uniforms[t];s.value!==null&&s.value instanceof o.Texture&&pi(s.value)}}i.dispose()}},Me=i=>{if(i){for(;i.children.length>0;){const e=i.children[0];e.type==="Audio"?(e.pause(),e.parent&&e.parent.remove(e)):Me(e)}if(i.parent&&i.parent.remove(i),i.isMesh){const e=i;e.geometry?.dispose(),Ci(e.material)}i.dispose!==void 0&&i.dispose()}};exports.totalThreeObjects=0;const mi=()=>{exports.totalThreeObjects=0},Ft=i=>{if(!i)return;let e=i.name.replaceAll(" ","").replaceAll("/",".");if(e.length===0&&(e=`obj_${exports.totalThreeObjects}`,exports.totalThreeObjects++),i.parent!==null&&i.parent.uuid.length>0&&(e=`${i.parent.uuid}.${e}`),i.uuid=e,i.isMesh!==void 0){const t=i;if(Array.isArray(t.material))t.material.forEach((s,n)=>{s.uuid=`${e}.material.${n}`});else{const s=t.material;s.uuid=`${e}.material`}}i.children.forEach(t=>Ft(t))};class vt{static renderer;static canvas;static context=null;static scene=null;static camera=null;static material=null;static inited=!1;static width=100;static height=100;static init(){this.inited||(this.canvas=document.createElement("canvas"),this.canvas.width=this.width,this.canvas.height=this.height,this.context=this.canvas.getContext("2d"),this.inited=!0)}static renderToBlob(e){this.init();const t=e.repeat.clone(),s=e.offset.clone();if(e.repeat.set(1,1),e.offset.set(0,0),this.context!==null){this.context.clearRect(0,0,this.width,this.height);const n=e.image;if(n!=null&&n.width>0){this.canvas.title=e.sourceFile;const r=this.canvas.width/n.width,a=this.renderToCanvas(e);this.context.drawImage(a,0,0,n.width*r,n.height*r)}}return e.repeat.copy(t),e.offset.copy(s),this.canvas.toDataURL("image/png")}static renderToCanvas(e){if(this.material===null){this.camera=new o.OrthographicCamera(-.5,.5,.5,-.5,0,100),this.scene=new o.Scene,this.material=new o.MeshBasicMaterial;const t=new o.BufferGeometry;t.setAttribute("position",new o.Float32BufferAttribute([-.5,-.5,0,1.5,-.5,0,-.5,1.5,0],3)),t.setAttribute("normal",new o.Float32BufferAttribute([0,0,1,0,0,1],3)),t.setAttribute("uv",new o.Float32BufferAttribute([0,0,2,0,0,2],2));const s=new o.Mesh(t,this.material);this.scene.add(s)}if(e.isRenderTargetTexture)this.material.map=e,this.renderer.render(this.scene,this.camera);else{const t=this.renderer.outputColorSpace,s=e.colorSpace;this.renderer.outputColorSpace=o.LinearSRGBColorSpace,e.colorSpace=o.LinearSRGBColorSpace,this.material.map=e,this.renderer.render(this.scene,this.camera),this.renderer.outputColorSpace=t,e.colorSpace=s}return this.renderer.domElement}}function yn(i){return new Promise(e=>{const t=new o.ObjectLoader;t.parseAsync(i.scene).then(s=>{const n=new o.AnimationMixer(s);if(i.animations.length>0){const a=i.animations.map(c=>o.AnimationClip.parse(c));n.clipAction(a[0]).play(),n.getRoot().animations=i.animations,n.getRoot().mixer=n}const r=[];i.cameras&&i.cameras.length>0&&i.cameras.forEach(a=>{const l=t.parse(a);r.push(l)}),e({animations:i.animations,model:s,mixer:n,cameras:r})})})}const We=Ei(["ctrlKey","metaKey","shiftKey","button","pointerId","pointerType","clientX","clientY","pageX","pageY"]),bn=Ei(["clientX","clientY","deltaX","deltaY","deltaMode"]),Cn=Ei(["ctrlKey","metaKey","shiftKey","keyCode"]);function En(i,e){i.preventDefault(),bn(i,e)}function Sn(i){i.preventDefault()}function wn(i,e,t){for(const s of e)t[s]=i[s]}function Ei(i){return function(t,s){const n={type:t.type};wn(t,i,n),s(n)}}function $t(i,e){const t=[],s={type:i.type,touches:t};for(let n=0;n<i.touches.length;++n){const r=i.touches[n];t.push({pageX:r.pageX,pageY:r.pageY})}e(s)}const xn={37:!0,38:!0,39:!0,40:!0};function Tn(i,e){const{keyCode:t}=i;xn[t]&&(i.preventDefault(),Cn(i,e))}const On={contextmenu:Sn,mousedown:We,mousemove:We,mouseup:We,pointerdown:We,pointermove:We,pointerup:We,touchstart:$t,touchmove:$t,touchend:$t,wheel:En,keydown:Tn};let Mn=0;class An{id;worker;constructor(e,t,s){this.id=Mn++,this.worker=t;const n=a=>{this.worker.postMessage({type:"event",id:this.id,data:a})};t.postMessage({type:"makeProxy",id:this.id});for(const[a,l]of Object.entries(s))e.addEventListener(a,c=>{l(c,n)});function r(){n({type:"resize",left:0,top:0,width:innerWidth,height:innerHeight})}window.addEventListener("resize",r),r()}}class bs extends o.EventDispatcher{style={};left=0;top=0;width=0;height=0;ownerDocument=void 0;constructor(){super(),this.ownerDocument=this}get clientWidth(){return this.width}set clientWidth(e){this.width=e}get clientHeight(){return this.height}set clientHeight(e){this.height=e}setPointerCapture(){}releasePointerCapture(){}getBoundingClientRect(){return{x:this.left,y:this.top,left:this.left,top:this.top,width:this.width,height:this.height,right:this.left+this.width,bottom:this.top+this.height,toJSON:()=>({})}}handleEvent(e){if(e.type==="size"){this.left=e.left,this.top=e.top,this.width=e.width,this.height=e.height;return}e.preventDefault=yt,e.stopPropagation=yt,this.dispatchEvent(e)}focus(){}getRootNode(){return this}}class Pn{targets={};constructor(){this.handleEvent=this.handleEvent.bind(this)}makeProxy(e){const{id:t}=e,s=new bs;this.targets[t]=s}getProxy(e){return this.targets[e]}handleEvent(e){this.targets[e.id]?.handleEvent(e.data)}}var P=(i=>(i.CUSTOM="ToolEvents::custom",i.SELECT_DROPDOWN="ToolEvents::selectDropdown",i.DRAG_UPDATE="ToolEvents::dragUpdate",i.ADD_SCENE="ToolEvents::addScene",i.REFRESH_SCENE="ToolEvents::refreshScene",i.REMOVE_SCENE="ToolEvents::removeScene",i.SET_SCENE="ToolEvents::setScene",i.GET_OBJECT="ToolEvents::getObject",i.SET_OBJECT="ToolEvents::setObject",i.UPDATE_OBJECT="ToolEvents::updateObject",i.CREATE_TEXTURE="ToolEvents::createTexture",i.REQUEST_METHOD="ToolEvents::requestMethod",i.ADD_CAMERA="ToolEvents::addCamera",i.REMOVE_CAMERA="ToolEvents::removeCamera",i.ADD_GROUP="ToolEvents::addGroup",i.REMOVE_GROUP="ToolEvents::removeGroup",i.ADD_SPLINE="ToolEvents::addSpline",i.ADD_RENDERER="ToolEvents::addRenderer",i.UPDATE_RENDERER="ToolEvents::updateRenderer",i))(P||{});class Rn extends o.EventDispatcher{components=new Map;appHandlers=[];editorHandlers=[];_appID="";_debugEnabled;_broadcastChannel=void 0;_webSocket=void 0;_mode="app";_connected=!1;_useBC=!1;constructor(e,t,s,n=!0){super(),this._appID=e,this._debugEnabled=t,this.editor=s,t&&(this._useBC=n,n?(this._broadcastChannel=new BroadcastChannel(e),this._broadcastChannel.addEventListener("message",this.messageHandler)):(this._webSocket=new WebSocket(e),this._webSocket.addEventListener("open",this.openHandler),this._webSocket.addEventListener("close",this.closeHandler),this._webSocket.addEventListener("message",this.messageHandler)))}addComponent(e,t){this.components.set(e,t)}dispose(){this._broadcastChannel!==void 0&&this._broadcastChannel.removeEventListener("message",this.messageHandler),this._webSocket!==void 0&&(this._webSocket.removeEventListener("open",this.openHandler),this._webSocket.removeEventListener("close",this.closeHandler),this._webSocket.removeEventListener("message",this.messageHandler)),this.components.forEach(e=>{e.dispose()}),this.components.clear()}send(e){this._mode!==e.target&&(this._useBC?this._broadcastChannel?.postMessage(e):this._connected&&this._webSocket?.send(JSON.stringify(e)))}messageHandler=e=>{let t=e.data;this._useBC||(t=JSON.parse(e.data)),t.target==="editor"?this.handleEditorBroadcast(t):this.handleAppBroadcast(t)};handleAppBroadcast(e){switch(this.appHandlers.forEach(t=>{t.callback(e)}),e.event){case"custom":this.dispatchEvent({type:"ToolEvents::custom",value:e.data});break}}handleEditorBroadcast(e){switch(this.editorHandlers.forEach(t=>{t.callback(e)}),e.event){case"custom":this.dispatchEvent({type:"ToolEvents::custom",value:e.data});break}}openHandler=()=>{this._connected=!0};closeHandler=()=>{this._connected=!1};get appID(){return this._appID}get connected(){return this._connected}get debugEnabled(){return this._debugEnabled}get mode(){return this._mode}get isApp(){return this._mode==="app"}get editor(){return this._mode==="editor"}set editor(e){e&&(this._mode="editor")}}class Dn{canvas;inputElement;settings;playing=!1;rafID=-1;constructor(e,t,s){this.canvas=e,this.inputElement=t,this.settings=s}dispose(){this.stop()}play(){this.playing||(this.playing=!0,this.onUpdate())}stop(){this.playing&&(this.playing=!1,cancelAnimationFrame(this.rafID),this.rafID=-1)}update(){}draw(){}resize(e,t){this.settings.supportOffScreenCanvas&&(this.inputElement.clientWidth=e,this.inputElement.clientHeight=t,this.inputElement.width=e,this.inputElement.height=t)}onResize=e=>{this.resize(e.width,e.height)};onUpdate=()=>{this.update(),this.draw(),this.rafID=requestAnimationFrame(this.onUpdate)}}class In extends o.Scene{clock;cameras;lights;world;constructor(e){super(),this.name=e,this.clock=new o.Clock,this.lights=new o.Group,this.lights.name="lights",this.add(this.lights),this.cameras=new o.Group,this.cameras.name="cameras",this.add(this.cameras),this.world=new o.Group,this.world.name="world",this.add(this.world)}init(){return new Promise(e=>{this.setupLights().then(()=>this.setupCameras()).then(()=>this.setupWorld()).then(()=>this.setupPost()).then(()=>this.setupAnimation()).then(()=>this.setupDebug()).then(()=>e())})}setupLights(){return new Promise(e=>{e()})}setupCameras(){return new Promise(e=>{e()})}setupWorld(){return new Promise(e=>{e()})}setupPost(){return new Promise(e=>{e()})}setupAnimation(){return new Promise(e=>{e()})}setupDebug(){return new Promise(e=>{e()})}dispose(){}update(){}draw(e){}postDraw(){}resize(e,t,s){}show(){this.clock.start(),this.showComplete()}showComplete(){this.enable()}hide(){this.disable(),this.hideComplete()}hideComplete(){this.clock.stop()}enable(){}disable(){}get deltaTime(){return Math.min(this.clock.getDelta(),1/30)}}class Ht{app;constructor(e){this.app=e,this.app.appHandlers.push({remote:this,callback:this.handleApp.bind(this)}),this.app.editorHandlers.push({remote:this,callback:this.handleEditor.bind(this)})}dispose(){const e=this.app.appHandlers.findIndex(t=>t.remote===this);e>-1&&(this.app.appHandlers.splice(e,1),this.app.editorHandlers.splice(e,1))}handleApp(e){}handleEditor(e){}}class Ln extends Ht{selectDropdown(e,t){this.app.send({event:"selectComponent",target:"app",data:{dropdown:e,value:t}})}updateDropdown(e,t){this.app.send({event:"draggableListUpdate",target:"app",data:{dropdown:e,value:t}})}handleApp(e){switch(e.event){case"selectComponent":this.app.dispatchEvent({type:P.SELECT_DROPDOWN,value:e.data});break;case"draggableListUpdate":this.app.dispatchEvent({type:P.DRAG_UPDATE,value:e.data});break}}}function kn(i,e,t){if(i.editor){t.ui.restore(),t.onSelectionChange(a=>{a.length<1||a.forEach(l=>{let c=l.address.sheetId,h="setSheet",u={};switch(l.type){case"Theatre_Sheet_PublicAPI":h="setSheet",u={sheet:l.address.sheetId},e.activeSheet=e.sheets.get(l.address.sheetId);break;case"Theatre_SheetObject_PublicAPI":h="setSheetObject",c+=`_${l.address.objectKey}`,u={id:c,sheet:l.address.sheetId,key:l.address.objectKey},e.activeSheet=e.sheets.get(l.address.sheetId);break}i.send({event:h,target:"app",data:u})})});let s=-1;const n=()=>{if(e.activeSheet!==void 0&&s!==e.activeSheet.sequence.position){s=e.activeSheet.sequence.position;const a=e.activeSheet;i.send({event:"updateTimeline",target:"app",data:{position:s,sheet:a.address.sheetId}})}},r=()=>{n(),requestAnimationFrame(r)};n(),r()}else t.ui.hide()}function Un(){setTimeout(()=>{const i=document.getElementById("theatrejs-studio-root");if(i===null||i.shadowRoot===null)return;const e=i.shadowRoot.getElementById("pointer-root");if(e===null)return;const t=e.children[0];if(t===null)return;const s=t.children[1];s.style.justifyContent="left";try{const n=s.children[1];for(n.style.transform="translateX(10px)";n.children.length>1;)n.removeChild(n.children[0])}catch{}try{const n=t.children[3];n.style.top="0",n.style.right="300px"}catch{}},1e3)}function jn(i,e,t,s,n){const r=1-i;return r*r*r*e+3*r*r*i*t+3*r*i*i*s+i*i*i*n}function Nn(i,e,t){if(i.type!=="bezier"||i.handles.length!==4)throw new Error("Invalid keyframe data for Bézier interpolation.");const[s,n]=i.handles,r=(t-i.position)/(e.position-i.position);return jn(r,i.value,i.value+s,e.value+n,e.value)}class Fn extends Ht{project;sheets=new Map;sheetObjects=new Map;sheetObjectCBs=new Map;sheetObjectUnsubscribe=new Map;activeSheet;studio=void 0;dispose(){this.project=void 0,this.sheets=new Map,this.sheetObjects=new Map,this.sheetObjectCBs=new Map,this.sheetObjectUnsubscribe=new Map}getSheetInstance(e,t){return t!==void 0?`${e}-${t}`:e}sheet(e,t){if(this.project===void 0){console.error("Theatre Project hasn't been created yet.");return}const s=this.getSheetInstance(e,t);let n=this.sheets.get(s);return n!==void 0||(n=this.project?.sheet(e,t),this.sheets.set(s,n)),n}playSheet(e,t,s){return new Promise(n=>{const r=t!==void 0?{...t}:{};this.sheet(e,s)?.sequence.play(r).then(a=>n(a)),this.app.send({event:"playSheet",target:"editor",data:{sheet:e,instance:s,value:t}})})}pauseSheet(e,t){this.sheet(e,t)?.sequence.pause(),this.app.send({event:"pauseSheet",target:"editor",data:{sheet:e,instance:t}})}clearSheetObjects(e){this.sheetObjects.forEach((t,s)=>{s.search(`${e}_`)>-1&&this.unsubscribe(t)})}sheetObject(e,t,s,n,r){if(this.project===void 0){console.error("Theatre Project hasn't been created yet.");return}const a=this.sheet(e,r);if(a===void 0)return;const c=`${this.getSheetInstance(e,r)}_${t}`;let h=this.sheetObjects.get(c),u=s;h!==void 0&&(u={...s,...h.value}),h=a.object(t,u),this.sheetObjects.set(c,h),this.sheetObjectCBs.set(c,n!==void 0?n:yt);const f=h.onValuesChange(m=>{if(this.app.editor){for(const E in m){const y=m[E];typeof y=="object"&&gs(y)&&(m[E]={r:y.r,g:y.g,b:y.b,a:y.a})}this.app.send({event:"updateSheetObject",target:"app",data:{sheet:e,sheetObject:c,values:m}})}const g=this.sheetObjectCBs.get(c);g!==void 0&&g(m)});return this.sheetObjectUnsubscribe.set(c,f),h}getSheetObjectKeyframes(e,t,s){const n=this.sheet(e);if(n===void 0)return[];const r=`${e}_${t}`,a=this.sheetObjects.get(r);return a===void 0?[]:n.sequence.__experimental_getKeyframes(a.props[s])}getSheetObjectVectors(e,t){const s=this.sheet(e);if(s===void 0)return[];const n=`${e}_${t}`,r=this.sheetObjects.get(n);if(r===void 0)return[];const a=[],l=s.sequence.__experimental_getKeyframes(r.props.x),c=s.sequence.__experimental_getKeyframes(r.props.y),h=s.sequence.__experimental_getKeyframes(r.props.z),u=new Set;return l.forEach(m=>u.add(m.position)),c.forEach(m=>u.add(m.position)),h.forEach(m=>u.add(m.position)),Array.from(u).sort((m,g)=>m-g).forEach(m=>{const g=(E,y)=>{const O=E.find((S,w)=>S.position<=y&&(E[w+1]?.position||1/0)>y),_=E.find(S=>S.position>y);if(!O)return _?.value||0;if(!_||O.position===y)return O.value;if(O.type==="bezier")return Nn(O,_,y);const b=(y-O.position)/(_.position-O.position);return O.value+b*(_.value-O.value)};a.push({position:m,x:g(l,m),y:g(c,m),z:g(h,m)})}),a}unsubscribe(e){if(this.project===void 0){console.error("Theatre Project hasn't been created yet.");return}const t=e.address.sheetId,s=e.address.objectKey;this.sheets.get(t)?.detachObject(s);const r=`${t}_${s}`,a=this.sheetObjectUnsubscribe.get(r);a!==void 0&&(this.sheetObjects.delete(r),this.sheetObjectCBs.delete(r),this.sheetObjectUnsubscribe.delete(r),a())}handleApp(e){let t;switch(e.event){case"setSheet":t=this.sheets.get(e.data.sheet),t!==void 0&&(this.activeSheet=t,this.studio?.setSelection([t]));break;case"setSheetObject":t=this.sheetObjects.get(`${e.data.sheet}_${e.data.key}`),t!==void 0&&this.studio?.setSelection([t]);break;case"updateSheetObject":t=this.sheets.get(e.data.sheet),t!==void 0&&t.sequence.pause(),t=this.sheetObjectCBs.get(e.data.sheetObject),t!==void 0&&t(e.data.values);break;case"updateTimeline":t=this.sheets.get(e.data.sheet),this.activeSheet!==void 0&&(this.activeSheet.sequence.position=e.data.position);break}}handleEditor(e){if(this.app.editor)switch(e.event){case"playSheet":this.sheet(e.data.sheet,e.data.instance)?.sequence.play(e.data.value);break;case"pauseSheet":this.sheet(e.data.sheet,e.data.instance)?.sequence.pause();break}}handleEditorApp(){if(this.app.editor){this.studio?.ui.restore(),this.studio?.onSelectionChange(n=>{n.length<1||n.forEach(r=>{let a=r.address.sheetId,l="setSheet",c={};switch(r.type){case"Theatre_Sheet_PublicAPI":l="setSheet",c={sheet:r.address.sheetId},this.activeSheet=this.sheets.get(r.address.sheetId);break;case"Theatre_SheetObject_PublicAPI":l="setSheetObject",a+=`_${r.address.objectKey}`,c={id:a,sheet:r.address.sheetId,key:r.address.objectKey},this.activeSheet=this.sheets.get(r.address.sheetId);break}this.app.send({event:l,target:"app",data:c})})});let e=-1;const t=()=>{if(this.activeSheet!==void 0&&e!==this.activeSheet.sequence.position){e=this.activeSheet.sequence.position;const n=this.activeSheet;this.app.send({event:"updateTimeline",target:"app",data:{position:e,sheet:n.address.sheetId}})}},s=()=>{t(),requestAnimationFrame(s)};t(),s()}else this.studio?.ui.hide()}}function zn(i){if(i.name==="cameras")return"camera";if(i.name==="interactive")return"interactive";if(i.name==="lights")return"light";if(i.name==="ui")return"ui";if(i.name==="utils")return"utils";const e=i.type;return e.search("Helper")>-1?"icon_utils":e.search("Camera")>-1?"camera":e.search("Light")>-1?"light":"obj3D"}function et(i){const e={name:i.name,type:i.type,uuid:i.uuid,children:[]};return i.children.forEach(t=>{e.children.push(et(t))}),e}function Hn(i){const e={};for(const t in i){const s=i[t].value;e[t]={value:s},s===null?e[t].value={src:"",offset:[0,0],repeat:[1,1]}:s!==void 0&&s.isTexture&&(e[t].value={src:s.image.src,offset:[s.offset.x,s.offset.y],repeat:[s.repeat.x,s.repeat.y]})}return e}function Vn(i){switch(i){case"blendSrcAlpha":case"blendDstAlpha":case"blendEquationAlpha":case"clippingPlanes":case"shadowSide":case"precision":return!0}return!1}function Ze(i){const e={};for(const t in i){if(t.substring(0,1)==="_"||t.substring(0,2)==="is"||Vn(t))continue;const s=typeof i[t],n=i[t];switch(s){case"boolean":case"number":case"string":e[t]=n;break;case"object":n!==null?(e[t]=n,n.isTexture?e[t]={src:vt.renderToBlob(n),offset:[n.offset.x,n.offset.y],repeat:[n.repeat.x,n.repeat.y]}:t==="uniforms"&&(e[t]=Hn(e[t]))):t==="glslVersion"?e[t]="":e[t]={src:"",offset:[0,0],repeat:[1,1]};break}}return i.anisotropy!==void 0&&(e.anisotropy=i.anisotropy),i.clearcoat!==void 0&&(e.clearcoat=i.clearcoat),i.iridescence!==void 0&&(e.iridescence=i.iridescence),i.dispersion!==void 0&&(e.dispersion=i.dispersion),i.sheen!==void 0&&(e.sheen=i.sheen),i.transmission!==void 0&&(e.transmission=i.transmission),i.transmission!==void 0&&(e.transmission=i.transmission),e}function Jt(i){i.updateMatrix();const e={name:i.name,type:i.type,uuid:i.uuid,visible:i.visible,matrix:i.matrix.elements,animations:[],material:void 0,perspectiveCameraInfo:void 0,orthographicCameraInfo:void 0,lightInfo:void 0,children:[]};i.animations.forEach(s=>{e.animations.push({name:s.name,duration:s.duration,blendMode:s.blendMode})});const t=i.type.toLowerCase();if(t.search("mesh")>-1){const s=i;if(Array.isArray(s.material)){const n=[];s.material.forEach(r=>{n.push(Ze(r))}),e.material=n}else e.material=Ze(s.material)}else if(t.search("points")>-1){const s=i;if(Array.isArray(s.material)){const n=[];s.material.forEach(r=>{n.push(Ze(r))}),e.material=n}else e.material=Ze(s.material)}else if(t.search("line")>-1){const s=i;if(Array.isArray(s.material)){const n=[];s.material.forEach(r=>{n.push(Ze(r))}),e.material=n}else e.material=Ze(s.material)}else t.search("camera")>-1?i.type==="PerspectiveCamera"?e.perspectiveCameraInfo={fov:i.fov,zoom:i.zoom,near:i.near,far:i.far,focus:i.focus,aspect:i.aspect,filmGauge:i.filmGauge,filmOffset:i.filmOffset}:i.type==="OrthographicCamera"&&(e.orthographicCameraInfo={zoom:i.zoom,near:i.near,far:i.far,left:i.left,right:i.right,top:i.top,bottom:i.bottom}):t.search("light")>-1&&(e.lightInfo={color:i.color,intensity:i.intensity,decay:i.decay,distance:i.distance,angle:i.angle,penumbra:i.penumbra,groundColor:i.groundColor,width:i.width,height:i.height});return e}function Bn(i,e){const t=e.split(".");switch(t.length){case 1:return i[t[0]];case 2:return i[t[0]][t[1]];case 3:return i[t[0]][t[1]][t[2]];case 4:return i[t[0]][t[1]][t[2]][t[3]];case 5:return i[t[0]][t[1]][t[2]][t[3]][t[4]];case 6:return i[t[0]][t[1]][t[2]][t[3]][t[4]][t[5]]}}function Yn(i,e){for(const t in e)i[t]=e[t]}function ee(i,e,t){if(i===void 0)return;const s=e.split("."),n=s.length;if(typeof t!="object")switch(n){case 1:i[s[0]]=t;break;case 2:i[s[0]][s[1]]=t;break;case 3:i[s[0]][s[1]][s[2]]=t;break;case 4:i[s[0]][s[1]][s[2]][s[3]]=t;break;case 5:i[s[0]][s[1]][s[2]][s[3]][s[4]]=t;break}else{let a;switch(n){case 1:a=i[s[0]];break;case 2:a=i[s[0]][s[1]];break;case 3:a=i[s[0]][s[1]][s[2]];break;case 4:a=i[s[0]][s[1]][s[2]][s[3]];break;case 5:a=i[s[0]][s[1]][s[2]][s[3]][s[4]];break}a!=null&&Yn(a,t)}}function Cs(i){return new Promise((e,t)=>{const s=new Image;s.onload=()=>{const n=new o.Texture(s);n.wrapS=o.RepeatWrapping,n.wrapT=o.RepeatWrapping,n.needsUpdate=!0,e(n)},s.onerror=t,s.src=i})}class Gn extends Ht{canvas=null;inputElement=null;scene=void 0;scenes=new Map;renderer=void 0;renderTargets=new Map;groups=new Map;dispose(){this.scenes.forEach(e=>{Me(e)}),this.scenes.clear(),this.scene&&Me(this.scene),this.renderTargets.forEach(e=>{e.dispose()}),this.renderTargets.clear(),this.renderer?.dispose()}getObject(e){this.app.debugEnabled&&(this.renderer!==void 0&&(vt.renderer=this.renderer),this.app.send({event:"getObject",target:"app",data:e}))}setObject(e){this.renderer!==void 0&&(vt.renderer=this.renderer);const t=Jt(e);this.app.send({event:"setObject",target:"editor",data:t})}requestMethod(e,t,s,n){this.app.send({event:"requestMethod",target:"app",data:{uuid:e,key:t,value:s,subitem:n}})}updateObject(e,t,s){this.app.send({event:"updateObject",target:"app",data:{uuid:e,key:t,value:s}})}createTexture(e,t,s){this.app.send({event:"createTexture",target:"app",data:{uuid:e,key:t,value:s}})}addGroup(e){this.groups.get(e.title)===void 0&&(this.groups.set(e.title,{title:e.title,onUpdate:e.onUpdate}),this.app.send({event:"addGroup",target:"editor",data:JSON.stringify(e)}))}removeGroup(e){this.groups.get(e)!==void 0&&(this.groups.delete(e),this.app.send({event:"removeGroup",target:"editor",data:e}))}updateGroup(e,t,s){this.app.send({event:"updateGroup",target:"app",data:JSON.stringify({group:e,prop:t,value:s})})}removeAllGroups(){this.groups.forEach(e=>{const t=e.title;this.groups.delete(t),this.app.send({event:"removeGroup",target:"editor",data:t})}),this.groups.clear()}addSpline(e){setTimeout(()=>{this.app.send({event:"addSpline",target:"editor",data:JSON.stringify(e.toJSON())})},1)}setRenderer(e,t=null){if(this.renderer=e,this.canvas=e.domElement,this.inputElement=t!==null?t:this.canvas,!this.app.debugEnabled)return;const s=`#${e.getClearColor(new o.Color).getHexString()}`;this.app.send({event:"addRenderer",target:"editor",data:{autoClear:e.autoClear,autoClearColor:e.autoClearColor,autoClearDepth:e.autoClearDepth,autoClearStencil:e.autoClearStencil,outputColorSpace:e.outputColorSpace,localClippingEnabled:e.localClippingEnabled,clearColor:s,clearAlpha:e.getClearAlpha(),colorManagement:o.ColorManagement.enabled,toneMapping:e.toneMapping,toneMappingExposure:e.toneMappingExposure}})}updateRenderer(e){this.app.send({event:"updateRenderer",target:"app",data:e})}addScene(e){if(e===void 0||(this.scenes.set(e.name,e),!this.app.debugEnabled))return;mi(),Ft(e);const t=et(e);this.app.send({event:"addScene",target:"editor",data:t})}refreshScene(e){if(!this.app.debugEnabled)return;const t=this.scenes.get(e);if(t!==void 0){const s=et(t);this.app.send({event:"refreshScene",target:"app",data:s})}}removeScene(e){if(e===void 0||(this.scenes.delete(e.name),!this.app.debugEnabled))return;const t=et(e);this.app.send({event:"removeScene",target:"editor",data:t})}removeAllScenes(){this.scenes.forEach(e=>this.removeScene(e))}getScene(e){let t=null;return this.scenes.forEach((s,n)=>{e.search(n)>-1&&(t=s)}),t}setScene(e){if(e===void 0||(this.scene=e,!this.app.debugEnabled))return;this.renderer!==void 0&&(vt.renderer=this.renderer),mi(),Ft(e);const t=et(e);this.app.send({event:"setScene",target:"editor",data:t})}addCamera(e){if(!this.app.debugEnabled)return;const t=Jt(e);this.app.send({event:"addCamera",target:"editor",data:t})}removeCamera(e){if(!this.app.debugEnabled)return;const t=Jt(e);this.app.send({event:"removeCamera",target:"editor",data:t})}handleApp(e){switch(e.event){case"getObject":this.app.dispatchEvent({type:P.GET_OBJECT,value:e.data});break;case"updateObject":this.app.dispatchEvent({type:P.UPDATE_OBJECT,value:e.data});break;case"createTexture":this.app.dispatchEvent({type:P.CREATE_TEXTURE,value:e.data});break;case"requestMethod":this.app.dispatchEvent({type:P.REQUEST_METHOD,value:e.data});break;case"refreshScene":this.app.send({event:"refreshScene",target:"editor",data:et(this.scenes.get(e.data.name))});break;case"updateRenderer":this.renderer&&(this.renderer.autoClear=e.data.autoClear,this.renderer.autoClearColor=e.data.autoClearColor,this.renderer.autoClearDepth=e.data.autoClearDepth,this.renderer.autoClearStencil=e.data.autoClearStencil,this.renderer.outputColorSpace=e.data.outputColorSpace,this.renderer.localClippingEnabled=e.data.localClippingEnabled,this.renderer.setClearColor(e.data.clearColor,e.data.clearAlpha),this.renderer.toneMapping=e.data.toneMapping,this.renderer.toneMappingExposure=e.data.toneMappingExposure,o.ColorManagement.enabled=e.data.colorManagement);break}if(e.event==="updateGroup"){const t=JSON.parse(e.data);this.groups.get(t.group)?.onUpdate(t.prop,t.value)}}handleEditor(e){switch(e.event){case"setObject":this.app.dispatchEvent({type:P.SET_OBJECT,value:e.data});break;case"addScene":this.app.dispatchEvent({type:P.ADD_SCENE,value:e.data});break;case"refreshScene":this.app.dispatchEvent({type:P.REFRESH_SCENE,value:e.data});break;case"removeScene":this.app.dispatchEvent({type:P.REMOVE_SCENE,value:e.data});break;case"setScene":this.app.dispatchEvent({type:P.SET_SCENE,value:e.data});break;case"addCamera":this.app.dispatchEvent({type:P.ADD_CAMERA,value:e.data});break;case"removeCamera":this.app.dispatchEvent({type:P.REMOVE_CAMERA,value:e.data});break;case"addGroup":this.app.dispatchEvent({type:P.ADD_GROUP,value:e.data});break;case"removeGroup":this.app.dispatchEvent({type:P.REMOVE_GROUP,value:e.data});break;case"addSpline":this.app.dispatchEvent({type:P.ADD_SPLINE,value:e.data});break;case"addRenderer":this.app.dispatchEvent({type:P.ADD_RENDERER,value:e.data})}}addRT(e,t){const s=new o.WebGLRenderTarget(32,32,t);s.texture.name=e,this.renderTargets.set(e,s)}resize(e,t){const s=this.dpr;this.renderTargets.forEach(r=>{r.setSize(e*s,t*s)});const n=!(this.renderer?.domElement instanceof OffscreenCanvas);this.renderer?.setSize(e,t,n)}set dpr(e){this.renderer?.setPixelRatio(Ue(1,2,e))}get dpr(){return this.renderer!==void 0?this.renderer?.getPixelRatio():1}get width(){return this.renderer!==void 0?this.renderer.domElement.width/this.dpr:0}get height(){return this.renderer!==void 0?this.renderer.domElement.height/this.dpr:0}}var fi={exports:{}},nt={};/**
19
+ * @license React
20
+ * react-jsx-runtime.production.min.js
21
+ *
22
+ * Copyright (c) Facebook, Inc. and its affiliates.
23
+ *
24
+ * This source code is licensed under the MIT license found in the
25
+ * LICENSE file in the root directory of this source tree.
26
+ */var Bi;function Wn(){if(Bi)return nt;Bi=1;var i=T,e=Symbol.for("react.element"),t=Symbol.for("react.fragment"),s=Object.prototype.hasOwnProperty,n=i.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,r={key:!0,ref:!0,__self:!0,__source:!0};function a(l,c,h){var u,f={},m=null,g=null;h!==void 0&&(m=""+h),c.key!==void 0&&(m=""+c.key),c.ref!==void 0&&(g=c.ref);for(u in c)s.call(c,u)&&!r.hasOwnProperty(u)&&(f[u]=c[u]);if(l&&l.defaultProps)for(u in c=l.defaultProps,c)f[u]===void 0&&(f[u]=c[u]);return{$$typeof:e,type:l,key:m,ref:g,props:f,_owner:n.current}}return nt.Fragment=t,nt.jsx=a,nt.jsxs=a,nt}var at={};/**
27
+ * @license React
28
+ * react-jsx-runtime.development.js
29
+ *
30
+ * Copyright (c) Facebook, Inc. and its affiliates.
31
+ *
32
+ * This source code is licensed under the MIT license found in the
33
+ * LICENSE file in the root directory of this source tree.
34
+ */var Yi;function Zn(){return Yi||(Yi=1,process.env.NODE_ENV!=="production"&&function(){var i=T,e=Symbol.for("react.element"),t=Symbol.for("react.portal"),s=Symbol.for("react.fragment"),n=Symbol.for("react.strict_mode"),r=Symbol.for("react.profiler"),a=Symbol.for("react.provider"),l=Symbol.for("react.context"),c=Symbol.for("react.forward_ref"),h=Symbol.for("react.suspense"),u=Symbol.for("react.suspense_list"),f=Symbol.for("react.memo"),m=Symbol.for("react.lazy"),g=Symbol.for("react.offscreen"),E=Symbol.iterator,y="@@iterator";function O(d){if(d===null||typeof d!="object")return null;var C=E&&d[E]||d[y];return typeof C=="function"?C:null}var _=i.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED;function b(d){{for(var C=arguments.length,A=new Array(C>1?C-1:0),L=1;L<C;L++)A[L-1]=arguments[L];S("error",d,A)}}function S(d,C,A){{var L=_.ReactDebugCurrentFrame,z=L.getStackAddendum();z!==""&&(C+="%s",A=A.concat([z]));var W=A.map(function(N){return String(N)});W.unshift("Warning: "+C),Function.prototype.apply.call(console[d],console,W)}}var w=!1,x=!1,M=!1,D=!1,k=!1,R;R=Symbol.for("react.module.reference");function V(d){return!!(typeof d=="string"||typeof d=="function"||d===s||d===r||k||d===n||d===h||d===u||D||d===g||w||x||M||typeof d=="object"&&d!==null&&(d.$$typeof===m||d.$$typeof===f||d.$$typeof===a||d.$$typeof===l||d.$$typeof===c||d.$$typeof===R||d.getModuleId!==void 0))}function ge(d,C,A){var L=d.displayName;if(L)return L;var z=C.displayName||C.name||"";return z!==""?A+"("+z+")":A}function ue(d){return d.displayName||"Context"}function se(d){if(d==null)return null;if(typeof d.tag=="number"&&b("Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue."),typeof d=="function")return d.displayName||d.name||null;if(typeof d=="string")return d;switch(d){case s:return"Fragment";case t:return"Portal";case r:return"Profiler";case n:return"StrictMode";case h:return"Suspense";case u:return"SuspenseList"}if(typeof d=="object")switch(d.$$typeof){case l:var C=d;return ue(C)+".Consumer";case a:var A=d;return ue(A._context)+".Provider";case c:return ge(d,d.render,"ForwardRef");case f:var L=d.displayName||null;return L!==null?L:se(d.type)||"Memo";case m:{var z=d,W=z._payload,N=z._init;try{return se(N(W))}catch{return null}}}return null}var Q=Object.assign,X=0,Ae,le,fe,te,Pe,Re,De;function G(){}G.__reactDisabledLog=!0;function ae(){{if(X===0){Ae=console.log,le=console.info,fe=console.warn,te=console.error,Pe=console.group,Re=console.groupCollapsed,De=console.groupEnd;var d={configurable:!0,enumerable:!0,value:G,writable:!0};Object.defineProperties(console,{info:d,log:d,warn:d,error:d,group:d,groupCollapsed:d,groupEnd:d})}X++}}function Ce(){{if(X--,X===0){var d={configurable:!0,enumerable:!0,writable:!0};Object.defineProperties(console,{log:Q({},d,{value:Ae}),info:Q({},d,{value:le}),warn:Q({},d,{value:fe}),error:Q({},d,{value:te}),group:Q({},d,{value:Pe}),groupCollapsed:Q({},d,{value:Re}),groupEnd:Q({},d,{value:De})})}X<0&&b("disabledDepth fell below zero. This is a bug in React. Please file an issue.")}}var it=_.ReactCurrentDispatcher,Be;function Et(d,C,A){{if(Be===void 0)try{throw Error()}catch(z){var L=z.stack.trim().match(/\n( *(at )?)/);Be=L&&L[1]||""}return`
35
+ `+Be+d}}var Yt=!1,St;{var Is=typeof WeakMap=="function"?WeakMap:Map;St=new Is}function Ti(d,C){if(!d||Yt)return"";{var A=St.get(d);if(A!==void 0)return A}var L;Yt=!0;var z=Error.prepareStackTrace;Error.prepareStackTrace=void 0;var W;W=it.current,it.current=null,ae();try{if(C){var N=function(){throw Error()};if(Object.defineProperty(N.prototype,"props",{set:function(){throw Error()}}),typeof Reflect=="object"&&Reflect.construct){try{Reflect.construct(N,[])}catch(Ie){L=Ie}Reflect.construct(d,[],N)}else{try{N.call()}catch(Ie){L=Ie}d.call(N.prototype)}}else{try{throw Error()}catch(Ie){L=Ie}d()}}catch(Ie){if(Ie&&L&&typeof Ie.stack=="string"){for(var j=Ie.stack.split(`
36
+ `),de=L.stack.split(`
37
+ `),J=j.length-1,ie=de.length-1;J>=1&&ie>=0&&j[J]!==de[ie];)ie--;for(;J>=1&&ie>=0;J--,ie--)if(j[J]!==de[ie]){if(J!==1||ie!==1)do if(J--,ie--,ie<0||j[J]!==de[ie]){var _e=`
38
+ `+j[J].replace(" at new "," at ");return d.displayName&&_e.includes("<anonymous>")&&(_e=_e.replace("<anonymous>",d.displayName)),typeof d=="function"&&St.set(d,_e),_e}while(J>=1&&ie>=0);break}}}finally{Yt=!1,it.current=W,Ce(),Error.prepareStackTrace=z}var Ge=d?d.displayName||d.name:"",Fi=Ge?Et(Ge):"";return typeof d=="function"&&St.set(d,Fi),Fi}function Ls(d,C,A){return Ti(d,!1)}function ks(d){var C=d.prototype;return!!(C&&C.isReactComponent)}function wt(d,C,A){if(d==null)return"";if(typeof d=="function")return Ti(d,ks(d));if(typeof d=="string")return Et(d);switch(d){case h:return Et("Suspense");case u:return Et("SuspenseList")}if(typeof d=="object")switch(d.$$typeof){case c:return Ls(d.render);case f:return wt(d.type,C,A);case m:{var L=d,z=L._payload,W=L._init;try{return wt(W(z),C,A)}catch{}}}return""}var xt=Object.prototype.hasOwnProperty,Oi={},Mi=_.ReactDebugCurrentFrame;function Tt(d){if(d){var C=d._owner,A=wt(d.type,d._source,C?C.type:null);Mi.setExtraStackFrame(A)}else Mi.setExtraStackFrame(null)}function Us(d,C,A,L,z){{var W=Function.call.bind(xt);for(var N in d)if(W(d,N)){var j=void 0;try{if(typeof d[N]!="function"){var de=Error((L||"React class")+": "+A+" type `"+N+"` is invalid; it must be a function, usually from the `prop-types` package, but received `"+typeof d[N]+"`.This often happens because of typos such as `PropTypes.function` instead of `PropTypes.func`.");throw de.name="Invariant Violation",de}j=d[N](C,N,L,A,null,"SECRET_DO_NOT_PASS_THIS_OR_YOU_WILL_BE_FIRED")}catch(J){j=J}j&&!(j instanceof Error)&&(Tt(z),b("%s: type specification of %s `%s` is invalid; the type checker function must return `null` or an `Error` but returned a %s. You may have forgotten to pass an argument to the type checker creator (arrayOf, instanceOf, objectOf, oneOf, oneOfType, and shape all require an argument).",L||"React class",A,N,typeof j),Tt(null)),j instanceof Error&&!(j.message in Oi)&&(Oi[j.message]=!0,Tt(z),b("Failed %s type: %s",A,j.message),Tt(null))}}}var js=Array.isArray;function Gt(d){return js(d)}function Ns(d){{var C=typeof Symbol=="function"&&Symbol.toStringTag,A=C&&d[Symbol.toStringTag]||d.constructor.name||"Object";return A}}function Fs(d){try{return Ai(d),!1}catch{return!0}}function Ai(d){return""+d}function Pi(d){if(Fs(d))return b("The provided key is an unsupported type %s. This value must be coerced to a string before before using it here.",Ns(d)),Ai(d)}var st=_.ReactCurrentOwner,zs={key:!0,ref:!0,__self:!0,__source:!0},Ri,Di,Wt;Wt={};function Hs(d){if(xt.call(d,"ref")){var C=Object.getOwnPropertyDescriptor(d,"ref").get;if(C&&C.isReactWarning)return!1}return d.ref!==void 0}function Vs(d){if(xt.call(d,"key")){var C=Object.getOwnPropertyDescriptor(d,"key").get;if(C&&C.isReactWarning)return!1}return d.key!==void 0}function Bs(d,C){if(typeof d.ref=="string"&&st.current&&C&&st.current.stateNode!==C){var A=se(st.current.type);Wt[A]||(b('Component "%s" contains the string ref "%s". Support for string refs will be removed in a future major release. This case cannot be automatically converted to an arrow function. We ask you to manually fix this case by using useRef() or createRef() instead. Learn more about using refs safely here: https://reactjs.org/link/strict-mode-string-ref',se(st.current.type),d.ref),Wt[A]=!0)}}function Ys(d,C){{var A=function(){Ri||(Ri=!0,b("%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://reactjs.org/link/special-props)",C))};A.isReactWarning=!0,Object.defineProperty(d,"key",{get:A,configurable:!0})}}function Gs(d,C){{var A=function(){Di||(Di=!0,b("%s: `ref` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://reactjs.org/link/special-props)",C))};A.isReactWarning=!0,Object.defineProperty(d,"ref",{get:A,configurable:!0})}}var Ws=function(d,C,A,L,z,W,N){var j={$$typeof:e,type:d,key:C,ref:A,props:N,_owner:W};return j._store={},Object.defineProperty(j._store,"validated",{configurable:!1,enumerable:!1,writable:!0,value:!1}),Object.defineProperty(j,"_self",{configurable:!1,enumerable:!1,writable:!1,value:L}),Object.defineProperty(j,"_source",{configurable:!1,enumerable:!1,writable:!1,value:z}),Object.freeze&&(Object.freeze(j.props),Object.freeze(j)),j};function Zs(d,C,A,L,z){{var W,N={},j=null,de=null;A!==void 0&&(Pi(A),j=""+A),Vs(C)&&(Pi(C.key),j=""+C.key),Hs(C)&&(de=C.ref,Bs(C,z));for(W in C)xt.call(C,W)&&!zs.hasOwnProperty(W)&&(N[W]=C[W]);if(d&&d.defaultProps){var J=d.defaultProps;for(W in J)N[W]===void 0&&(N[W]=J[W])}if(j||de){var ie=typeof d=="function"?d.displayName||d.name||"Unknown":d;j&&Ys(N,ie),de&&Gs(N,ie)}return Ws(d,j,de,z,L,st.current,N)}}var Zt=_.ReactCurrentOwner,Ii=_.ReactDebugCurrentFrame;function Ye(d){if(d){var C=d._owner,A=wt(d.type,d._source,C?C.type:null);Ii.setExtraStackFrame(A)}else Ii.setExtraStackFrame(null)}var Xt;Xt=!1;function qt(d){return typeof d=="object"&&d!==null&&d.$$typeof===e}function Li(){{if(Zt.current){var d=se(Zt.current.type);if(d)return`
39
+
40
+ Check the render method of \``+d+"`."}return""}}function Xs(d){{if(d!==void 0){var C=d.fileName.replace(/^.*[\\\/]/,""),A=d.lineNumber;return`
41
+
42
+ Check your code at `+C+":"+A+"."}return""}}var ki={};function qs(d){{var C=Li();if(!C){var A=typeof d=="string"?d:d.displayName||d.name;A&&(C=`
43
+
44
+ Check the top-level render call using <`+A+">.")}return C}}function Ui(d,C){{if(!d._store||d._store.validated||d.key!=null)return;d._store.validated=!0;var A=qs(C);if(ki[A])return;ki[A]=!0;var L="";d&&d._owner&&d._owner!==Zt.current&&(L=" It was passed a child from "+se(d._owner.type)+"."),Ye(d),b('Each child in a list should have a unique "key" prop.%s%s See https://reactjs.org/link/warning-keys for more information.',A,L),Ye(null)}}function ji(d,C){{if(typeof d!="object")return;if(Gt(d))for(var A=0;A<d.length;A++){var L=d[A];qt(L)&&Ui(L,C)}else if(qt(d))d._store&&(d._store.validated=!0);else if(d){var z=O(d);if(typeof z=="function"&&z!==d.entries)for(var W=z.call(d),N;!(N=W.next()).done;)qt(N.value)&&Ui(N.value,C)}}}function Qs(d){{var C=d.type;if(C==null||typeof C=="string")return;var A;if(typeof C=="function")A=C.propTypes;else if(typeof C=="object"&&(C.$$typeof===c||C.$$typeof===f))A=C.propTypes;else return;if(A){var L=se(C);Us(A,d.props,"prop",L,d)}else if(C.PropTypes!==void 0&&!Xt){Xt=!0;var z=se(C);b("Component %s declared `PropTypes` instead of `propTypes`. Did you misspell the property assignment?",z||"Unknown")}typeof C.getDefaultProps=="function"&&!C.getDefaultProps.isReactClassApproved&&b("getDefaultProps is only used on classic React.createClass definitions. Use a static property named `defaultProps` instead.")}}function Ks(d){{for(var C=Object.keys(d.props),A=0;A<C.length;A++){var L=C[A];if(L!=="children"&&L!=="key"){Ye(d),b("Invalid prop `%s` supplied to `React.Fragment`. React.Fragment can only have `key` and `children` props.",L),Ye(null);break}}d.ref!==null&&(Ye(d),b("Invalid attribute `ref` supplied to `React.Fragment`."),Ye(null))}}function Ni(d,C,A,L,z,W){{var N=V(d);if(!N){var j="";(d===void 0||typeof d=="object"&&d!==null&&Object.keys(d).length===0)&&(j+=" You likely forgot to export your component from the file it's defined in, or you might have mixed up default and named imports.");var de=Xs(z);de?j+=de:j+=Li();var J;d===null?J="null":Gt(d)?J="array":d!==void 0&&d.$$typeof===e?(J="<"+(se(d.type)||"Unknown")+" />",j=" Did you accidentally export a JSX literal instead of a component?"):J=typeof d,b("React.jsx: type is invalid -- expected a string (for built-in components) or a class/function (for composite components) but got: %s.%s",J,j)}var ie=Zs(d,C,A,z,W);if(ie==null)return ie;if(N){var _e=C.children;if(_e!==void 0)if(L)if(Gt(_e)){for(var Ge=0;Ge<_e.length;Ge++)ji(_e[Ge],d);Object.freeze&&Object.freeze(_e)}else b("React.jsx: Static children should always be an array. You are likely explicitly calling React.jsxs or React.jsxDEV. Use the Babel transform instead.");else ji(_e,d)}return d===s?Ks(ie):Qs(ie),ie}}function $s(d,C,A){return Ni(d,C,A,!0)}function Js(d,C,A){return Ni(d,C,A,!1)}var en=Js,tn=$s;at.Fragment=s,at.jsx=en,at.jsxs=tn}()),at}process.env.NODE_ENV==="production"?fi.exports=Wn():fi.exports=Zn();var p=fi.exports;function Si(i){return i.title.search("<")>-1?p.jsx("button",{className:"svg",dangerouslySetInnerHTML:{__html:i.title}}):p.jsx("button",{children:i.title})}const Xn=p.jsxs("svg",{className:"closeIcon",width:"14",height:"14",fill:"none",stroke:"#666666",strokeMiterlimit:"10",children:[p.jsx("circle",{cx:"7",cy:"7",r:"6"}),p.jsx("line",{x1:"4",y1:"4",x2:"10",y2:"10"}),p.jsx("line",{x1:"4",y1:"10",x2:"10",y2:"4"})]}),qn=p.jsx("svg",{className:"dragIcon",width:"14",height:"14",fill:"#666666",stroke:"none",children:p.jsx("path",{d:`M10.43,4H3.57C3.26,4,3,4.22,3,4.5v1C3,5.78,3.26,6,3.57,6h6.86C10.74,6,11,5.78,11,5.5v-1\r
45
+ C11,4.22,10.74,4,10.43,4z M10.43,8H3.57C3.26,8,3,8.22,3,8.5v1C3,9.78,3.26,10,3.57,10h6.86C10.74,10,11,9.78,11,9.5v-1\r
46
+ C11,8.22,10.74,8,10.43,8z`})});function Es(i){return p.jsx("li",{className:`reorder-item ${i.draggingIndex===i.index?"dragging":""}`,draggable:!0,onDragStart:()=>i.onDragStart(i.index),onDragOver:e=>{e.preventDefault(),i.onDragOver(i.index)},onDragEnd:i.onDragEnd,children:p.jsxs("div",{children:[qn,p.jsx("span",{children:i.title}),p.jsx("button",{className:"closeIcon",onClick:()=>i.onDelete(i.index),children:Xn})]})})}function Ss(i){const[e,t]=T.useState(!1),[s,n]=T.useState(i.options),[r,a]=T.useState(null),l=g=>{i.onDragComplete(g),n(g)},c=g=>{const E=[...s];E.splice(g,1),l(E)},h=g=>{a(g)},u=g=>{if(r===g||r===null)return;const E=[...s],y=E.splice(r,1)[0];E.splice(g,0,y),a(g),n(E)},f=()=>{i.onDragComplete(s),a(null)};let m="dropdown draggable";return i.subdropdown&&(m+=" subdropdown"),p.jsxs("div",{className:m,onMouseEnter:()=>t(!0),onMouseLeave:()=>t(!1),children:[p.jsx(Si,{title:i.title}),p.jsx("ul",{className:"reorder-list",style:{display:e?"block":"none"},children:s.map((g,E)=>p.jsx(Es,{title:g,index:E,draggingIndex:r,onDelete:c,onDragStart:h,onDragOver:u,onDragEnd:f},g))})]})}function ws(i){const[e,t]=T.useState(!1),s=[];i.options.map((r,a)=>{i.onSelect!==void 0&&(r.onSelect=i.onSelect),s.push(p.jsx(xs,{option:r},a))});let n="dropdown";return i.subdropdown&&(n+=" subdropdown"),p.jsxs("div",{className:n,onMouseEnter:()=>t(!0),onMouseLeave:()=>t(!1),children:[p.jsx(Si,{title:i.title}),p.jsx("ul",{style:{visibility:e?"visible":"hidden"},children:s})]})}function xs(i){const{option:e}=i,[t,s]=T.useState("");let n;switch(e.type){case"draggable":n=p.jsx(Ss,{title:e.title,options:e.value,onDragComplete:r=>{e.onDragComplete!==void 0&&e.onDragComplete(r)},subdropdown:!0});break;case"dropdown":n=p.jsx(ws,{title:e.title,options:e.value,onSelect:e.onSelect,subdropdown:!0});break;case"option":n=p.jsx("button",{onClick:()=>{e.onSelect!==void 0&&e.onSelect(e.value),e.selectable&&(t!==e.title?s(e.title):s(""))},children:e.title});break}return p.jsx("li",{className:t===e.title?"selected":"",children:n},fs())}function Ct(i){const[e,t]=T.useState(i.open!==void 0?i.open:!0),s=!e||i.children===void 0,n=()=>{i.app.dispatchEvent({type:P.REMOVE_SCENE,value:i.scene})};return p.jsxs("div",{className:`accordion ${s?"hide":""}`,children:[p.jsxs("button",{className:"toggle",onClick:()=>{const r=!e;i.onToggle!==void 0&&i.onToggle(r),t(r)},children:[p.jsx("p",{className:`status ${e?"open":""}`,children:"Toggle"}),p.jsx("p",{className:"label",children:bt(i.label)})]}),i.onRefresh?p.jsxs(p.Fragment,{children:[p.jsx("button",{className:"refresh",onClick:i.onRefresh}),p.jsx("button",{className:"remove",onClick:n})]}):null,i.button,p.jsx("div",{className:e?"open":"",children:p.jsx("div",{children:i.children})},Math.random())]})}function wi(i){const e=T.useRef(null),[t,s]=T.useState(!1),n=i.child!==void 0&&i.child.children.length>0,r=[];return i.child!==void 0&&i.child.children.length>0&&i.child.children.map((a,l)=>{r.push(p.jsx(wi,{app:i.app,child:a,three:i.three},l))}),T.useEffect(()=>{if(i.child){const a=i.three.getScene(i.child.uuid);if(a!==null){const l=a.getObjectByProperty("uuid",i.child.uuid);l!==void 0&&(e.current.style.opacity=l.visible?"1":"0.25")}}},[t]),p.jsx(p.Fragment,{children:i.child!==void 0&&p.jsxs("div",{className:"childObject",children:[p.jsxs("div",{className:"child",children:[n?p.jsx("button",{className:"status",style:{backgroundPositionX:t?"-14px":"2px"},onClick:()=>{s(!t)}}):null,p.jsx("button",{className:"name",style:{left:n?"20px":"5px"},onClick:()=>{i.child!==void 0&&(i.three.getObject(i.child.uuid),t||s(!0))},children:i.child.name.length>0?`${i.child.name} (${i.child.type})`:`${i.child.type}::${i.child.uuid}`}),p.jsx("button",{className:"visibility",ref:e,onClick:()=>{if(i.child){const a=i.three.getScene(i.child.uuid);if(a!==null){const l=a.getObjectByProperty("uuid",i.child.uuid);if(l!==void 0){const c="visible",h=!l.visible;e.current.style.opacity=h?"1":"0.25",i.three.updateObject(i.child.uuid,c,h),ee(l,c,h)}}}}}),p.jsx("div",{className:`icon ${zn(i.child)}`})]}),p.jsx("div",{className:t?"open":"",children:p.jsx("div",{className:"container",children:r})})]},Math.random())})}function gi(i){const e=[];return i.child?.children.map((t,s)=>{e.push(p.jsx(wi,{app:i.app,child:t,scene:i.scene,three:i.three},s))}),p.jsx("div",{className:`scene ${i.class!==void 0?i.class:""}`,children:e})}function mt(i){const[e,t]=T.useState(i.defaultValue);return T.useEffect(()=>{let s=!1,n=-1,r=0,a=i.defaultValue,l=!1;const c=g=>{l=g.ctrlKey},h=g=>{s=!0,r=Number(i.input.current?.value),n=g.clientX,document.addEventListener("mouseup",f,!1),document.addEventListener("mousemove",u,!1),document.addEventListener("contextmenu",f,!1)},u=g=>{if(!s)return;const E=i.step!==void 0?i.step:1,y=(g.clientX-n)*E*(l?10:1);a=Number((r+y).toFixed(4)),i.min!==void 0&&(a=Math.max(a,i.min)),i.max!==void 0&&(a=Math.min(a,i.max)),i.onChange!==void 0&&i.onChange(a),t(a)},f=()=>{s=!1,document.removeEventListener("mouseup",f),document.removeEventListener("mousemove",u),document.removeEventListener("contextmenu",f)},m=g=>{const E=Number(g.target.value);i.onChange!==void 0&&i.onChange(E),t(E)};return i.label.current?.addEventListener("mousedown",h,!1),i.sliderRef!==void 0&&i.sliderRef.current?.addEventListener("input",m),document.addEventListener("keydown",c,!1),document.addEventListener("keyup",c,!1),()=>{i.label.current?.removeEventListener("mousedown",h),i.sliderRef!==void 0&&i.sliderRef.current?.removeEventListener("input",m),document.removeEventListener("mouseup",f),document.removeEventListener("mousemove",u),document.removeEventListener("contextmenu",f),document.removeEventListener("keydown",c),document.addEventListener("keyup",c,!1)}},[]),e}function Ve(i){const e=T.useRef(null),t=T.useRef(null),[s,n]=T.useState(i.value);return mt({label:i.labelRef,input:e,sliderRef:t,defaultValue:s,min:i.min,max:i.max,step:i.step,onChange:r=>{n(r),i.onChange!==void 0&&i.onChange(i.prop,r)}}),p.jsxs(p.Fragment,{children:[i.type==="number"&&p.jsx("input",{alt:i.alt,className:i.className,ref:e,type:"number",value:s,min:i.min,max:i.max,step:i.step,disabled:i.disabled,onChange:r=>{if(n(r.target.value),r.target.value.length===0)return;const a=Number(r.target.value);isNaN(a)||i.onChange!==void 0&&i.onChange(i.prop,a)}}),i.type==="range"&&p.jsxs(p.Fragment,{children:[p.jsx("input",{type:"text",value:s.toString(),disabled:i.disabled,ref:e,className:"min",onChange:r=>{if(r.target.value.length===0)return;const a=Number(r.target.value);isNaN(a)||i.onChange!==void 0&&i.onChange(i.prop,a)}}),p.jsx("input",{disabled:i.disabled,type:"range",value:s,min:i.min,max:i.max,step:i.step,ref:t,onChange:yt})]})]})}function Qn(i){const e=T.useRef(null),t=T.useRef(null),s=T.useRef(null),n=T.useRef(null),r=T.useRef(null),a=T.useRef(null),l=T.useRef(null),c=T.useRef(null),h=T.useRef(null),u=T.useRef(null),[f,m]=T.useState(i.value.x),[g,E]=T.useState(i.value.y),[y,O]=T.useState({min:Math.min(i.min,Math.min(i.value.x,i.value.y)),max:Math.max(i.max,Math.max(i.value.x,i.value.y))}),[_,b]=T.useState(!1);mt({label:l,input:e,defaultValue:f,min:y.min,max:y.max,step:.01,onChange:R=>{m(R),i.onChange({target:{value:{x:R,y:g}}})}}),mt({label:c,input:t,defaultValue:g,min:y.min,max:y.max,step:.01,onChange:R=>{E(R),i.onChange({target:{value:{x:f,y:R}}})}}),mt({label:h,input:s,defaultValue:y.min,min:y.min-1,max:y.max+1,step:.01,onChange:R=>{O({min:R,max:y.max})}}),mt({label:u,input:n,defaultValue:y.max,min:y.min-1,max:y.max+1,step:.01,onChange:R=>{O({min:y.min,max:R})}});function S(){_||(window.addEventListener("mousemove",x),window.addEventListener("mouseup",w),b(!0))}function w(){window.removeEventListener("mousemove",x),window.removeEventListener("mouseup",w),b(!1)}function x(R){const V=r.current.getBoundingClientRect(),ge=Ue(0,99,R.clientX-V.left)/99,ue=1-Ue(0,99,R.clientY-V.top)/99,se=ye(tt(y.min,y.max,ge),3),Q=ye(tt(y.min,y.max,ue),3);i.onChange({target:{value:{x:se,y:Q}}}),m(se),E(Q)}function M(){const R=Number(s.current.value);O({min:R,max:y.max}),f<R&&m(Ue(R,y.max,f)),g<R&&E(Ue(R,y.max,g))}function D(){const R=Number(n.current.value);O({min:y.min,max:R}),f>R&&m(Ue(y.min,R,f)),g>R&&E(Ue(y.min,R,g))}T.useEffect(()=>{a.current.style.left=`${Nt(y.min,y.max,f)*100}%`,a.current.style.top=`${(1-Nt(y.min,y.max,g))*100}%`},[y,f,g]);const k=i.step!==void 0?i.step:.01;return p.jsxs("div",{className:"vector2",children:[p.jsxs("div",{className:"fields",children:[p.jsxs("div",{children:[p.jsx("label",{ref:l,children:"X"}),p.jsx("input",{ref:e,type:"number",value:f,min:y.min,max:y.max,step:k,onChange:R=>{if(m(R.target.value),R.target.value.length===0)return;const V=Number(R.target.value);isNaN(V)||(i.onChange({target:{value:{x:V,y:g}}}),V<y.min&&O({min:V,max:y.max}))}})]}),p.jsxs("div",{children:[p.jsx("label",{ref:c,children:"Y"}),p.jsx("input",{ref:t,type:"number",value:g,min:y.min,max:y.max,step:k,onChange:R=>{if(E(R.target.value),R.target.value.length===0)return;const V=Number(R.target.value);isNaN(V)||(i.onChange({target:{value:{x:f,y:V}}}),V>y.max&&O({min:y.min,max:V}))}})]}),p.jsxs("div",{children:[p.jsx("label",{ref:h,children:"Min"}),p.jsx("input",{ref:s,type:"number",value:y.min,step:k,onChange:M})]}),p.jsxs("div",{children:[p.jsx("label",{ref:u,children:"Max"}),p.jsx("input",{ref:n,type:"number",value:y.max,step:k,onChange:D})]})]}),p.jsxs("div",{className:"input",ref:r,onMouseDown:S,onMouseUp:w,children:[p.jsx("div",{className:"x"}),p.jsx("div",{className:"y"}),p.jsx("div",{className:"pt",ref:a})]})]})}const Kn=Math.PI/180,$n=180/Math.PI;function Xe(i,e,t,s,n){return s+(i-e)*(n-s)/(t-e)}function qe(i,e,t){return(1-t)*i+t*e}function _i(i){return i*Kn}function Jn(i){return i*$n}function Gi(i){const e=i.value.x!==void 0&&i.value.y!==void 0&&i.value.z!==void 0,t=i.value.isEuler!==void 0,s=i.value.elements!==void 0,n=i.step!==void 0?i.step:.01,r=[];if(t){const a=T.useMemo(()=>i.value,[]);["_x","_y","_z"].forEach(c=>{const h=T.useRef(null);r.push(p.jsxs("div",{children:[p.jsx("label",{ref:h,children:c.substring(1).toUpperCase()}),p.jsx(Ve,{value:Jn(a[c]),type:"number",prop:c,step:.1,labelRef:h,onChange:(u,f)=>{a[u]=_i(f),i.onChange({target:{value:a}})}})]},c))})}else if(e){const a=T.useMemo(()=>i.value,[]),l=(h,u)=>{a[h]=u,i.onChange({target:{value:a}})};["x","y","z"].forEach(h=>{const u=T.useRef(null);r.push(p.jsxs("div",{children:[p.jsx("label",{ref:u,children:h.toUpperCase()}),p.jsx(Ve,{value:a[h],type:"number",prop:h,step:n,labelRef:u,onChange:l})]},h))})}else if(s){const a=T.useMemo(()=>i.value,[]),l=(c,h)=>{const u=Number(c);a.elements[u]=h,i.onChange({target:{value:a}})};for(let c=0;c<9;c++){const h=T.useRef(null);r.push(p.jsxs("div",{children:[p.jsx("label",{ref:h,children:c+1}),p.jsx(Ve,{value:a.elements[c],type:"number",prop:c.toString(),step:n,labelRef:h,onChange:l})]},c.toString()))}}return p.jsx("div",{className:"grid3",children:r},Math.random().toString())}function ea(i){const e=i.value.x!==void 0,t=i.step!==void 0?i.step:.01,s=[];if(e){const n=T.useMemo(()=>i.value,[]),r=(l,c)=>{n[l]=c,i.onChange({target:{value:n}})};["x","y","z","w"].forEach(l=>{const c=T.useRef(null);s.push(p.jsxs("div",{children:[p.jsx("label",{ref:c,children:l.toUpperCase()}),p.jsx(Ve,{value:n[l],type:"number",prop:l,step:t,labelRef:c,onChange:r})]},l))})}else{const n=T.useMemo(()=>i.value,[]),r=(a,l)=>{const c=Number(a);n.elements[c]=l,i.onChange({target:{value:n}})};for(let a=0;a<16;a++){const l=T.useRef(null);s.push(p.jsxs("div",{children:[p.jsx("label",{ref:l,children:a+1}),p.jsx(Ve,{value:n.elements[a],type:"number",prop:a.toString(),step:t,labelRef:l,onChange:r})]},a.toString()))}}return p.jsx("div",{className:"grid4",children:s})}function ta(i){return!(i==="defaultAttributeValues"||i==="forceSinglePass"||i==="linecap"||i==="linejoin"||i==="linewidth"||i==="normalMapType"||i==="precision"||i==="shadowSide"||i==="uniformsGroups"||i==="uniformsNeedUpdate"||i==="userData"||i==="version"||i==="wireframeLinecap"||i==="wireframeLinejoin"||i==="wireframeLinewidth"||i.slice(0,4)==="clip"||i.slice(0,7)==="polygon"||i.slice(0,7)==="stencil"||i.slice(0,2)==="is")}function ia(i){switch(i){case"Alpha Map":return"alphaMap";case"Anisotropy Map":return"anisotropyMap";case"AO Map":return"aoMap";case"Bump Map":return"bumpMap";case"Clearcoat Map":return"clearcoatMap";case"Clearcoat Normal Map":return"clearcoatNormalMap";case"Clearcoat Roughness Map":return"clearcoatRoughnessMap";case"Displacement Map":return"displacementMap";case"Emissive Map":return"emissiveMap";case"Gradient Map":return"gradientMap";case"Iridescence Map":return"iridescenceMap";case"Iridescence Thickness Map":return"iridescenceThicknessMap";case"Map":return"map";case"Matcap":return"matcap";case"Normal Map":return"normalMap";case"Roughness Map":return"roughnessMap";case"Sheen Color Map":return"sheenColorMap";case"Sheen Roughness Map":return"sheenRoughnessMap";case"Specular Color Map":return"specularColorMap";case"Specular Map Intensity":return"specularIntensityMap";case"Thickness Map":return"thicknessMap";case"Transmission Map":return"transmissionMap"}return i}function Vt(i){switch(i){case"alphaHash":return"Alpha Hash";case"alphaMap":return"Alpha Map";case"alphaToCoverage":return"Alpha To Coverage";case"anisotropy":return"Anisotropy";case"anisotropyMap":return"Anisotropy Map";case"anisotropyRotation":return"Anisotropy Rotation";case"aoMap":return"AO Map";case"aoMapIntensity":return"AO Map Intensity";case"attenuationColor":return"Attenuation Color";case"attenuationDistance":return"Attenuation Distance";case"blendAlpha":return"Blend Alpha";case"blendColor":return"Blend Color";case"blendDst":return"Blend Dst";case"blendDstAlpha":return"Blend Dst Alha";case"blendEquation":return"Blend Equation";case"blendEquationAlpha":return"Blend Equation Alpha";case"blending":return"Blending";case"blendSrc":return"Blend Src";case"blendSrcAlpha":return"Blend Src Alpha";case"bumpMap":return"Bump Map";case"bumpScale":return"Bump Scale";case"clearcoat":return"Clearcoat";case"clearcoatMap":return"Clearcoat Map";case"clearcoatNormalMap":return"Clearcoat Normal Map";case"clearcoatNormalScale":return"Clearcoat Normal Scale";case"clearcoatRoughness":return"Clearcoat Roughness";case"clearcoatRoughnessMap":return"Clearcoat Roughness Map";case"color":return"Color";case"colorWrite":return"Color Write";case"defines":return"Defines";case"depthFunc":return"Depth Func";case"depthTest":return"Depth Test";case"depthWrite":return"Depth Write";case"dispersion":return"Dispersion";case"displacementBias":return"Displacement Bias";case"displacementMap":return"Displacement Map";case"displacementScale":return"Displacement Scale";case"dithering":return"Dithering";case"emissive":return"Emissive";case"emissiveMap":return"Emissive Map";case"emissiveIntensity":return"Emissive Intensity";case"envMap":return"Environment Map";case"envMapIntensity":return"Environment Map Intensity";case"envMapRotation":return"Environment Map Rotation";case"extensions":return"Extensions";case"flatShading":return"Flat Shading";case"fragmentShader":return"Fragment Shader";case"fog":return"Fog";case"glslVersion":return"GLSL Version";case"gradientMap":return"Gradient Map";case"ior":return"IOR";case"iridescence":return"Iridescence";case"iridescenceIOR":return"Iridescence IOR";case"iridescenceMap":return"Iridescence Map";case"iridescenceThicknessMap":return"Iridescence Thickness Map";case"iridescenceThicknessRange":return"Iridescence Thickness Range";case"lights":return"Lights";case"lightMap":return"Light Map";case"lightMapIntensity":return"Light Map Intensity";case"map":return"Map";case"matcap":return"Matcap";case"metalness":return"Metalness";case"metalnessMap":return"Metalness Map";case"name":return"Name";case"normalMap":return"Normal Map";case"normalScale":return"Normal Scale";case"premultipliedAlpha":return"Premultiplied Alpha";case"opacity":return"Opacity";case"reflectivity":return"Reflectivity";case"refractionRatio":return"Refraction Ratio";case"roughness":return"Roughness";case"roughnessMap":return"Roughness Map";case"sheen":return"Sheen";case"sheenColor":return"Sheen Color";case"sheenColorMap":return"Sheen Color Map";case"sheenRoughness":return"Sheen Roughness";case"sheenRoughnessMap":return"Sheen Roughness Map";case"shininess":return"Shininess";case"side":return"Side";case"size":return"Size";case"sizeAttenuation":return"Size Attenuation";case"specular":return"Specular";case"specularColor":return"Specular Color";case"specularColorMap":return"Specular Color Map";case"specularIntensity":return"Specular Intensity";case"specularIntensityMap":return"Specular Map Intensity";case"thickness":return"Thickness";case"thicknessMap":return"Thickness Map";case"toneMapped":return"Tone Mapped";case"transmission":return"Transmission";case"transmissionMap":return"Transmission Map";case"transparent":return"Transparent";case"type":return"Type";case"uuid":return"UUID";case"uniforms":return"Uniforms";case"vertexColors":return"Vertex Colors";case"vertexShader":return"Vertex Shader";case"visible":return"Visible";case"wireframe":return"Wireframe"}return i}function Ts(i){const e=i.toLowerCase();return e.search("intensity")>-1||e==="anisotropyrotation"||e==="blendalpha"||e==="bumpscale"||e==="clearcoatroughness"||e==="displacementbias"||e==="displacementscale"||e==="metalness"||e==="opacity"||e==="reflectivity"||e==="refractionratio"||e==="roughness"||e==="sheenroughness"}function sa(){const i=document.createElement("input");return i.type="file",new Promise((e,t)=>{i.addEventListener("change",function(){if(i.files===null)t();else{const s=i.files[0],n=new FileReader;n.onload=function(r){e(r.target.result)},n.readAsDataURL(s)}}),i.click()})}const na=[{title:"Front",value:o.FrontSide},{title:"Back",value:o.BackSide},{title:"Double",value:o.DoubleSide}],aa=[{title:"No Blending",value:o.NoBlending},{title:"Normal",value:o.NormalBlending},{title:"Additive",value:o.AdditiveBlending},{title:"Subtractive",value:o.SubtractiveBlending},{title:"Multiply",value:o.MultiplyBlending},{title:"Custom",value:o.CustomBlending}],ra=[{title:"Add",value:o.AddEquation},{title:"Subtract",value:o.SubtractEquation},{title:"Reverse Subtract",value:o.ReverseSubtractEquation},{title:"Min",value:o.MinEquation},{title:"Max",value:o.MaxEquation}],oa=[{title:"Zero",value:o.ZeroFactor},{title:"One",value:o.OneFactor},{title:"Src Color",value:o.SrcColorFactor},{title:"One Minus Src Color",value:o.OneMinusSrcColorFactor},{title:"Src Alpha",value:o.SrcAlphaFactor},{title:"One Minus Src Alpha",value:o.OneMinusSrcAlphaFactor},{title:"Dst Alpha",value:o.DstAlphaFactor},{title:"One Minus Dst Alpha",value:o.OneMinusDstAlphaFactor},{title:"Dst Color",value:o.DstColorFactor},{title:"One Minus Dst Color",value:o.OneMinusDstColorFactor},{title:"Src Alpha Saturate",value:o.SrcAlphaSaturateFactor},{title:"Constant Color",value:o.ConstantColorFactor},{title:"One Minus Constant Color",value:o.OneMinusConstantColorFactor},{title:"Constant Alpha",value:o.ConstantAlphaFactor},{title:"One Minus Constant Alpha",value:o.OneMinusConstantAlphaFactor}],la=[{title:"Zero",value:o.ZeroFactor},{title:"One",value:o.OneFactor},{title:"Src Color",value:o.SrcColorFactor},{title:"One Minus Src Color",value:o.OneMinusSrcColorFactor},{title:"Src Alpha",value:o.SrcAlphaFactor},{title:"One Minus Src Alpha",value:o.OneMinusSrcAlphaFactor},{title:"Dst Alpha",value:o.DstAlphaFactor},{title:"One Minus Dst Alpha",value:o.OneMinusDstAlphaFactor},{title:"Dst Color",value:o.DstColorFactor},{title:"One Minus Dst Color",value:o.OneMinusDstColorFactor},{title:"Constant Color",value:o.ConstantColorFactor},{title:"One Minus Constant Color",value:o.OneMinusConstantColorFactor},{title:"Constant Alpha",value:o.ConstantAlphaFactor},{title:"One Minus Constant Alpha",value:o.OneMinusConstantAlphaFactor}];function rt(i,e){i.needsUpdate=!0,i.type="option",i.options=e}function ca(i,e,t,s){return{type:"boolean",title:Vt(i),prop:i,value:e,needsUpdate:!0,onChange:(n,r)=>{s.updateObject(t.uuid,`material.${i}`,r),s.updateObject(t.uuid,"material.needsUpdate",!0);const a=s.getScene(t.uuid);if(a!==null){const l=a.getObjectByProperty("uuid",t.uuid);ee(l,`material.${i}`,r)}}}}function ha(i,e,t,s){const n={type:"number",title:Vt(i),prop:i,value:e,min:void 0,max:void 0,step:.01,needsUpdate:!0,onChange:(r,a)=>{s.updateObject(t.uuid,`material.${i}`,a),s.updateObject(t.uuid,"material.needsUpdate",!0);const l=s.getScene(t.uuid);if(l!==null){const c=l.getObjectByProperty("uuid",t.uuid);ee(c,`material.${i}`,a)}}};switch(i){case"blending":rt(n,aa);break;case"blendDst":rt(n,la);break;case"blendEquation":rt(n,ra);break;case"blendSrc":rt(n,oa);break;case"side":rt(n,na);break}return Ts(i)&&(n.value=Number(e),n.type="range",n.min=Math.min(0,n.value),n.max=Math.max(1,n.value),n.step=.01),n}function da(i,e,t,s){const n={type:"string",title:Vt(i),prop:i,value:e,needsUpdate:!0,onChange:(a,l)=>{s.updateObject(t.uuid,`material.${i}`,l),s.updateObject(t.uuid,"material.needsUpdate",!0);const c=s.getScene(t.uuid);if(c!==null){const h=c.getObjectByProperty("uuid",t.uuid);ee(h,`material.${i}`,l)}},onKeyDown:a=>{}};return(i==="vertexShader"||i==="fragmentShader")&&(n.disabled=!1,n.latest=n.value,n.onChange=(a,l)=>{n.latest=l,s.updateObject(t.uuid,`material.${i}`,l);const c=s.getScene(t.uuid);if(c!==null){const h=c.getObjectByProperty("uuid",t.uuid);ee(h,`material.${i}`,l)}},n.onKeyDown=a=>{if(a.key==="Enter"&&(a.altKey||a.metaKey)){s.updateObject(t.uuid,"material.needsUpdate",!0);const l=s.getScene(t.uuid);if(l!==null){const c=l.getObjectByProperty("uuid",t.uuid);ee(c,"material.needsUpdate",!0)}}}),n}function ua(i){return i.x!==void 0&&i.y!==void 0&&i.z===void 0}function pa(i){return i.x!==void 0&&i.y!==void 0&&i.z!==void 0&&i.w===void 0}function ma(i){return i.x!==void 0&&i.y!==void 0&&i.z!==void 0&&i.w!==void 0}function vi(i){i.sort((e,t)=>e.title<t.title?-1:e.title>t.title?1:0)}function ft(i,e,t,s,n="",r=!1){const a=Vt(i).split(".")[0].replaceAll("[","").replaceAll("]",""),l=n.length>0?`${n}.${i}`:i,c=typeof e;if(c==="boolean"||c==="string")return{title:a,prop:l,type:c,value:e,disabled:r,onChange:(h,u)=>{s.updateObject(t.uuid,`material.${l}`,u);const f=s.getScene(t.uuid);if(f!==null){const m=f.getObjectByProperty("uuid",t.uuid);ee(m,`material.${l}`,u)}}};if(c==="number"){const h={title:a,prop:l,type:"number",value:e,step:.01,disabled:r,onChange:(u,f)=>{s.updateObject(t.uuid,`material.${l}`,f);const m=s.getScene(t.uuid);if(m!==null){const g=m.getObjectByProperty("uuid",t.uuid);ee(g,`material.${l}`,f)}}};return Ts(a)&&(h.type="range",h.min=0,h.max=1),h}else{if(e.isColor)return{title:a,prop:l,type:"color",value:e,disabled:r,onChange:(h,u)=>{const f=new o.Color(u);s.updateObject(t.uuid,`material.${l}`,f);const m=s.getScene(t.uuid);if(m!==null){const g=m.getObjectByProperty("uuid",t.uuid);ee(g,`material.${l}`,f)}}};if(Array.isArray(e)){const h=[];for(const u in e){const f=e[u],m=`[${u.toString()}]`;if(f.value!==void 0){const g=ft(`${m}.value`,f.value,t,s,l,r);g!==void 0&&h.push(g)}else{const g=ft(m,f,t,s,l,r);g!==void 0&&h.push(g)}}if(h.length>0)return vi(h),{title:a,items:h}}else{if(ua(e))return{title:a,prop:l,type:"vector2",value:e,disabled:r,onChange:(h,u)=>{s.updateObject(t.uuid,`material.${l}`,u);const f=s.getScene(t.uuid);if(f!==null){const m=f.getObjectByProperty("uuid",t.uuid);ee(m,`material.${l}`,u)}}};if(pa(e))return{title:a,prop:l,type:"grid3",value:e,disabled:r,onChange:(h,u)=>{s.updateObject(t.uuid,`material.${l}`,u);const f=s.getScene(t.uuid);if(f!==null){const m=f.getObjectByProperty("uuid",t.uuid);ee(m,`material.${l}`,u)}}};if(ma(e))return{title:a,prop:l,type:"grid4",value:e,disabled:r,onChange:(h,u)=>{s.updateObject(t.uuid,`material.${l}`,u);const f=s.getScene(t.uuid);if(f!==null){const m=f.getObjectByProperty("uuid",t.uuid);ee(m,`material.${l}`,u)}}};if(e.isEuler)return{title:a,prop:l,type:"euler",value:e,disabled:r,onChange:(h,u)=>{s.updateObject(t.uuid,`material.${l}`,u);const f=s.getScene(t.uuid);if(f!==null){const m=f.getObjectByProperty("uuid",t.uuid);ee(m,`material.${l}`,u)}}};if(e.src!==void 0)return{title:a,type:"image",value:e,disabled:r,onChange:(h,u)=>{const f=ia(i),m=n.length>0?`${n}.${f}`:f;s.createTexture(t.uuid,`material.${m}`,u);const g=s.getScene(t.uuid);if(g!==null){const E=g.getObjectByProperty("uuid",t.uuid);if(E!==void 0){const y=O=>{const _=E.material,b=m.split(".");switch(b.length){case 1:_[b[0]]=O;break;case 2:_[b[0]][b[1]]=O;break;case 3:_[b[0]][b[1]][b[2]]=O;break;case 4:_[b[0]][b[1]][b[2]][b[3]]=O;break;case 5:_[b[0]][b[1]][b[2]][b[3]][b[4]]=O;break}_.needsUpdate=!0};u.src.length>0?Cs(u.src).then(O=>{O.offset.set(u.offset[0],u.offset[1]),O.repeat.set(u.repeat[0],u.repeat[1]),y(O)}):y(null)}}}};if(e.elements!==void 0)return{title:a,prop:l,type:e.elements.length>9?"grid4":"grid3",value:e,disabled:r,onChange:(h,u)=>{s.updateObject(t.uuid,`material.${l}`,u);const f=s.getScene(t.uuid);if(f!==null){const m=f.getObjectByProperty("uuid",t.uuid);ee(m,`material.${l}`,u)}}};{const h=[],u=i==="defines"||i==="extensions";try{for(const f in e){const m=e[f];if(m!==void 0)if(m.value!==void 0){const g=ft(`${f}.value`,m.value,t,s,l,u);g!==void 0&&h.push(g)}else{const g=ft(f,m,t,s,l,u);g!==void 0&&h.push(g)}}}catch{console.log("Issue cycling through material object:",i,e)}if(h.length>0)return vi(h),{title:a,items:h}}}}}function Wi(i,e,t){const s=[];for(const n in i){if(!ta(n))continue;const r=typeof i[n],a=i[n];if(r==="boolean")s.push(ca(n,a,e,t));else if(r==="number")s.push(ha(n,a,e,t));else if(r==="string")s.push(da(n,a,e,t));else if(r==="object"){const l=ft(n,a,e,t);l!==void 0&&s.push(l)}else a!==void 0&&console.log("other:",n,r,a)}return vi(s),s.push({title:"Update Material",type:"button",onChange:()=>{t.updateObject(e.uuid,"material.needsUpdate",!0);const n=t.getScene(e.uuid);if(n!==null){const r=n.getObjectByProperty("uuid",e.uuid);ee(r,"material.needsUpdate",!0)}}}),s}function fa(i,e,t){function s(){return`${t.app.appID}_material`}const n=localStorage.getItem(s()),r=n!==null?n==="open":!1;function a(c){localStorage.setItem(s(),c?"open":"closed")}const l=i.material;if(Array.isArray(l)){const c=[],h=l.length;for(let u=0;u<h;u++)c.push(p.jsx(be,{app:e,title:`Material ${u}`,items:Wi(l[u],i,t)},`Material ${u}`));return p.jsx(p.Fragment,{children:c})}else return p.jsx(be,{app:e,title:"Material",items:Wi(l,i,t),expanded:r,onToggle:c=>{a(c)}})}const Zi="data:image/gif;base64,R0lGODlhDgFkAIAAAP///wAAACH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4xLWMwMDIgNzkuZGJhM2RhM2I1LCAyMDIzLzEyLzE1LTEwOjQyOjM3ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjUuNiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDoyMDk3M0NEODAxQjQxMUVGODVGNENDMkUyMUExNDk1NSIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDoyMDk3M0NEOTAxQjQxMUVGODVGNENDMkUyMUExNDk1NSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkE4ODc3Qzg5MDFCMzExRUY4NUY0Q0MyRTIxQTE0OTU1IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkE4ODc3QzhBMDFCMzExRUY4NUY0Q0MyRTIxQTE0OTU1Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+Af/+/fz7+vn49/b19PPy8fDv7u3s6+rp6Ofm5eTj4uHg397d3Nva2djX1tXU09LR0M/OzczLysnIx8bFxMPCwcC/vr28u7q5uLe2tbSzsrGwr66trKuqqainpqWko6KhoJ+enZybmpmYl5aVlJOSkZCPjo2Mi4qJiIeGhYSDgoGAf359fHt6eXh3dnV0c3JxcG9ubWxramloZ2ZlZGNiYWBfXl1cW1pZWFdWVVRTUlFQT05NTEtKSUhHRkVEQ0JBQD8+PTw7Ojk4NzY1NDMyMTAvLi0sKyopKCcmJSQjIiEgHx4dHBsaGRgXFhUUExIREA8ODQwLCgkIBwYFBAMCAQAAIfkEAAAAAAAsAAAAAA4BZAAAAv+Mj6nL7Q+jnLTai7PevPsPhuJIluaJpurKtu4Lx/JM1/aN5/rO9/4PDAqHxKLxiEwql8ym8wmNSqfUqvWKzWq33K73Cw6Lx+Sy+YxOq9fstvsNj8vn9Lr9js/r9/y+/w8YKDhIWGh4iJiouMjY6PgIGSk5SVlpeYmZqTkJAGDQ+dnpuekmGgAKejpKuiZqmprKqoZKGyrbOlqrejub6xvLGyw8TFzcprurGuvqybxq7ETbrItsCz0l7Zpc+6p9/cS967w9/S2FTF0u/mzehK4Oqz3eTl9vf4+fr7/P3+//DzCgwIEECxo8iDChwoUMGzp8CDGixIkUK1q8iDGjxo0XHDt6/AgypMiRJEuaPIkypcqVLFt+KwAAOw==";function ga(i){const e=i.step!==void 0?i.step:.01,t=T.useRef(null),s=T.useRef(null),n=T.useRef(null),r=T.useRef(null),a=T.useRef(null),[l]=T.useState(i.value),[c,h]=T.useState(i.value.offset[0]),[u,f]=T.useState(i.value.offset[1]),[m,g]=T.useState(i.value.repeat[0]),[E,y]=T.useState(i.value.repeat[1]);function O(b,S,w,x,M){if(i.onChange!==void 0){const D=i.prop!==void 0?i.prop:i.title;i.onChange(D,{src:b,offset:[S,w],repeat:[x,M]})}}function _(b){const S=t.current.src,w=b.target.value;switch(b.target){case s.current:h(w),O(S,w,u,m,E);break;case n.current:f(w),O(S,c,w,m,E);break;case r.current:g(w),O(S,c,u,w,E);break;case a.current:y(w),O(S,c,u,m,w);break}}return p.jsxs("div",{className:"imageField",children:[p.jsx("img",{alt:i.title,ref:t,onClick:()=>{sa().then(b=>{t.current.src=b,O(b,c,u,m,E)})},src:l.src.length>0?l.src:Zi}),p.jsxs("div",{className:"fields",children:[p.jsxs("div",{children:[p.jsx("label",{children:"Offset:"}),p.jsx("input",{ref:s,type:"number",value:c,step:e,onChange:_}),p.jsx("input",{ref:n,type:"number",value:u,step:e,onChange:_})]}),p.jsxs("div",{children:[p.jsx("label",{children:"Repeat:"}),p.jsx("input",{ref:r,type:"number",value:m,step:e,onChange:_}),p.jsx("input",{ref:a,type:"number",value:E,step:e,onChange:_})]}),p.jsx("button",{onClick:()=>{O("",c,u,m,E),t.current.src=Zi},children:"Clear"})]})]})}function Ut(i){let e=i.value;e!==void 0&&(e.isColor!==void 0?e=ui(i.value):i.type==="color"&&(e=ui(new o.Color().setStyle(i.value,o.LinearSRGBColorSpace))));const[t,s]=T.useState(e),n=T.useRef(null),r=h=>{let u=h.target.value;if(i.type==="boolean")u=h.target.checked;else if(i.type==="option"&&(typeof i.value=="number"?u=Number(u):typeof i.value=="boolean"?u=!!u:typeof i.value=="object"&&(u=JSON.parse(u)),i.options!==void 0)){const f=i.options.length;for(let m=0;m<f&&i.options[m].value!==u;m++);}s(u),i.onChange!==void 0&&i.onChange(i.prop!==void 0?i.prop:i.title,u)},a={};i.disabled&&(a.opacity=.8);const l=i.type==="string"&&(t.length>100||t.search(`
47
+ `)>-1),c=l||i.type==="image"||i.type==="vector2";return p.jsxs("div",{className:`field ${c?"block":""}`,style:a,children:[i.type!=="button"&&p.jsx("label",{ref:n,children:bt(i.title)},"fieldLabel"),i.type==="string"&&!l&&p.jsx("input",{type:"text",disabled:i.disabled,onChange:r,value:t}),i.type==="string"&&l&&p.jsx("textarea",{cols:50,rows:10,disabled:i.disabled!==void 0?i.disabled:!0,onChange:r,onKeyDown:h=>{i.onKeyDown!==void 0&&i.onKeyDown(h)},value:t}),i.type==="boolean"&&p.jsx("input",{type:"checkbox",disabled:i.disabled,onChange:r,checked:t}),i.type==="number"&&p.jsx(Ve,{value:t,type:i.type,prop:i.prop!==void 0?i.prop:i.title,min:i.min,max:i.max,step:i.step,disabled:i.disabled,labelRef:n,onChange:i.onChange}),i.type==="range"&&p.jsx(Ve,{value:t,type:i.type,prop:i.prop!==void 0?i.prop:i.title,min:i.min,max:i.max,step:i.step,disabled:i.disabled,labelRef:n,onChange:i.onChange}),i.type==="color"&&p.jsxs(p.Fragment,{children:[p.jsx("input",{type:"text",value:t.toString(),onChange:r,disabled:i.disabled,className:"color"}),p.jsx("input",{type:"color",value:t,onChange:r,disabled:i.disabled})]}),i.type==="button"&&p.jsx("button",{disabled:i.disabled,onClick:()=>{i.onChange!==void 0&&i.onChange(i.prop!==void 0?i.prop:i.title,!0)},children:i.title}),i.type==="image"&&p.jsx(ga,{title:i.title,prop:i.prop,value:i.value,onChange:i.onChange}),i.type==="option"&&p.jsx(p.Fragment,{children:p.jsx("select",{onChange:r,disabled:i.disabled,defaultValue:i.value,children:i.options?.map((h,u)=>p.jsx("option",{value:h.value,children:bt(h.title)},u))})}),i.type==="vector2"&&p.jsx(Qn,{step:i.step,value:t,min:0,max:1,onChange:r}),i.type==="grid3"&&p.jsx(Gi,{step:i.step,value:t,onChange:r}),i.type==="grid4"&&p.jsx(ea,{step:i.step,value:t,onChange:r}),i.type==="euler"&&p.jsx(Gi,{step:i.step,value:t,onChange:r})]})}function _a(i){return"items"in i}class be extends T.Component{subgroupNames=[];subgroupElements=[];valueOverrides=new Map;app;constructor(e){super(e),this.app=e.app,this.state={lastUpdated:Date.now()}}addGroup(e){const t=[];e.items.forEach(r=>{t.push({type:r.type,prop:r.prop,title:r.title!==void 0?r.title:r.prop,value:r.value,min:r.min,max:r.max,step:r.step,options:r.options,disabled:r.disabled,onChange:(a,l)=>{e.onUpdate(a,l)}})});const s=T.createRef(),n=p.jsx(be,{app:this.app,ref:s,title:e.title,items:t},Math.random());return this.subgroupNames.push(e.title),this.subgroupElements.push(n),this.setState({lastUpdated:Date.now()}),s}removeGroup(e){const t=this.subgroupNames.length;for(let s=0;s<t;s++){const n=this.subgroupNames[s];if(e===n){this.subgroupNames.splice(s,1),this.subgroupElements.splice(s,1),this.setState({lastUpdated:Date.now()});return}}}setField(e,t){this.valueOverrides.set(e,t),this.setState({lastUpdated:Date.now()})}render(){const e=[];return this.props.items.forEach(t=>{if(_a(t))e.push(p.jsx(be,{app:this.app,title:bt(t.title),items:t.items},Math.random()));else{const s=this.valueOverrides.get(t.title),n=s!==void 0?s:t.value;e.push(p.jsx(Ut,{title:t.title,prop:t.prop,value:n,type:t.type,min:t.min,max:t.max,step:t.step,disabled:t.disabled,options:t.options,onChange:(r,a)=>{t.onChange!==void 0&&(this.valueOverrides.delete(t.title),t.onChange(r,a))},onKeyDown:r=>{t.onKeyDown!==void 0&&t.onKeyDown(r)}},Math.random()))}}),this.subgroupElements.forEach(t=>e.push(t)),p.jsx(Ct,{app:this.app,label:this.props.title,open:this.props.expanded===!0,onToggle:t=>{this.props.onToggle&&this.props?.onToggle(t)},children:e})}}class B extends T.Component{static instance;static groups=[];static groupsRefs=[];static groupTitles=[];static app;constructor(e){super(e),this.state={lastUpdate:Date.now()},B.app=e.app,B.instance=this,B.app.addEventListener(P.ADD_GROUP,this.addGroup),B.app.addEventListener(P.REMOVE_GROUP,this.removeGroup)}componentWillUnmount(){B.app.removeEventListener(P.ADD_GROUP,this.addGroup),B.app.removeEventListener(P.REMOVE_GROUP,this.removeGroup)}render(){return p.jsx("div",{className:"customGroups",children:B.groups},this.state.lastUpdate)}addGroup=e=>{const t=JSON.parse(e.value),s=[];t.items.forEach(n=>{s.push({type:n.type,prop:n.prop,title:n.title!==void 0?n.title:n.prop,value:n.value,min:n.min,max:n.max,step:n.step,options:n.options,disabled:n.disabled,onChange:(r,a)=>{this.props.three.updateGroup(t.title,r,a)}})}),B.groups.push(p.jsx(be,{app:B.app,title:t.title,items:s},Math.random())),B.groupTitles.push(t.title),this.setState({lastUpdate:Date.now()})};removeGroup=e=>{const t=e.value,s=B.groupTitles.length;for(let n=0;n<s;n++)if(t===B.groupTitles[n]){B.groups.splice(n,1),B.groupTitles.splice(n,1),this.setState({lastUpdate:Date.now()});return}};static addEditorGroup(e){const t=[];e.items.forEach(r=>{t.push({type:r.type,prop:r.prop,title:r.title!==void 0?r.title:r.prop,value:r.value,min:r.min,max:r.max,step:r.step,options:r.options,disabled:r.disabled,onChange:(a,l)=>{e.onUpdate(a,l)}})});const s=T.createRef(),n=p.jsx(be,{app:B.app,ref:s,title:e.title,items:t},Math.random());return B.groups.push(n),B.groupsRefs.push(s),B.groupTitles.push(e.title),s}static removeEditorGroup(e){const t=B.groupTitles.length;for(let s=0;s<t;s++)if(e===B.groupTitles[s]){B.groups.splice(s,1),B.groupTitles.splice(s,1),B.instance.setState({lastUpdate:Date.now()});return}}}function Xi(i){switch(i){case"fov":return"FOV";case"zoom":return"Zoom";case"near":return"Near";case"far":return"Far";case"focus":return"Focus";case"aspect":return"Aspect";case"filmGauge":return"Film Gauge";case"filmOffset":return"Film Offset";case"left":return"Left";case"right":return"Right";case"top":return"Top";case"bottom":return"Bottom"}return i}function va(i,e,t){function s(){return`${t.app.appID}_camera`}const n=localStorage.getItem(s()),r=n!==null?n==="open":!1;function a(c){localStorage.setItem(s(),c?"open":"closed")}const l=[];if(i.perspectiveCameraInfo!==void 0)for(const c in i.perspectiveCameraInfo)l.push({title:Xi(c),prop:c,type:"number",step:.01,value:i.perspectiveCameraInfo[c],onChange:(h,u)=>{t.updateObject(i.uuid,h,u),t.requestMethod(i.uuid,"updateProjectionMatrix");const f=t.getScene(i.uuid);if(f!==null){const m=f.getObjectByProperty("uuid",i.uuid);m!==void 0&&(ee(m,h,u),m.updateProjectionMatrix())}}});else if(i.orthographicCameraInfo!==void 0)for(const c in i.orthographicCameraInfo)l.push({title:Xi(c),prop:c,type:"number",step:.01,value:i.orthographicCameraInfo[c],onChange:(h,u)=>{t.updateObject(i.uuid,h,u),t.requestMethod(i.uuid,"updateProjectionMatrix");const f=t.getScene(i.uuid);if(f!==null){const m=f.getObjectByProperty("uuid",i.uuid);m!==void 0&&(ee(m,h,u),m.updateProjectionMatrix())}}});return p.jsx(be,{app:e,title:"Camera",items:l,expanded:r,onToggle:c=>{a(c)}})}class ya extends o.Line{constructor(e,t){const s=[1,1,0,-1,1,0,-1,-1,0,1,-1,0,1,1,0],n=new o.BufferGeometry;n.setAttribute("position",new o.Float32BufferAttribute(s,3)),n.computeBoundingSphere();const r=new o.LineBasicMaterial({fog:!1});super(n,r),this.light=e,this.color=t,this.type="RectAreaLightHelper";const a=[1,1,0,-1,1,0,-1,-1,0,1,1,0,-1,-1,0,1,-1,0],l=new o.BufferGeometry;l.setAttribute("position",new o.Float32BufferAttribute(a,3)),l.computeBoundingSphere(),this.add(new o.Mesh(l,new o.MeshBasicMaterial({side:o.BackSide,fog:!1})))}updateMatrixWorld(){if(this.scale.set(.5*this.light.width,.5*this.light.height,1),this.color!==void 0)this.material.color.set(this.color),this.children[0].material.color.set(this.color);else{this.material.color.copy(this.light.color).multiplyScalar(this.light.intensity);const e=this.material.color,t=Math.max(e.r,e.g,e.b);t>1&&e.multiplyScalar(1/t),this.children[0].material.color.copy(this.material.color)}this.matrixWorld.extractRotation(this.light.matrixWorld).scale(this.scale).copyPosition(this.light.matrixWorld),this.children[0].matrixWorld.copy(this.matrixWorld)}dispose(){this.geometry.dispose(),this.material.dispose(),this.children[0].geometry.dispose(),this.children[0].material.dispose()}}const qi={type:"change"},xi={type:"start"},Os={type:"end"},Ot=new o.Ray,Qi=new o.Plane,ba=Math.cos(70*o.MathUtils.DEG2RAD),ne=new o.Vector3,pe=2*Math.PI,Y={NONE:-1,ROTATE:0,DOLLY:1,PAN:2,TOUCH_ROTATE:3,TOUCH_PAN:4,TOUCH_DOLLY_PAN:5,TOUCH_DOLLY_ROTATE:6},ei=1e-6;class Ca extends o.Controls{constructor(e,t=null){super(e,t),this.state=Y.NONE,this.enabled=!0,this.target=new o.Vector3,this.cursor=new o.Vector3,this.minDistance=0,this.maxDistance=1/0,this.minZoom=0,this.maxZoom=1/0,this.minTargetRadius=0,this.maxTargetRadius=1/0,this.minPolarAngle=0,this.maxPolarAngle=Math.PI,this.minAzimuthAngle=-1/0,this.maxAzimuthAngle=1/0,this.enableDamping=!1,this.dampingFactor=.05,this.enableZoom=!0,this.zoomSpeed=1,this.enableRotate=!0,this.rotateSpeed=1,this.enablePan=!0,this.panSpeed=1,this.screenSpacePanning=!0,this.keyPanSpeed=7,this.zoomToCursor=!1,this.autoRotate=!1,this.autoRotateSpeed=2,this.keys={LEFT:"ArrowLeft",UP:"ArrowUp",RIGHT:"ArrowRight",BOTTOM:"ArrowDown"},this.mouseButtons={LEFT:o.MOUSE.ROTATE,MIDDLE:o.MOUSE.DOLLY,RIGHT:o.MOUSE.PAN},this.touches={ONE:o.TOUCH.ROTATE,TWO:o.TOUCH.DOLLY_PAN},this.target0=this.target.clone(),this.position0=this.object.position.clone(),this.zoom0=this.object.zoom,this._domElementKeyEvents=null,this._lastPosition=new o.Vector3,this._lastQuaternion=new o.Quaternion,this._lastTargetPosition=new o.Vector3,this._quat=new o.Quaternion().setFromUnitVectors(e.up,new o.Vector3(0,1,0)),this._quatInverse=this._quat.clone().invert(),this._spherical=new o.Spherical,this._sphericalDelta=new o.Spherical,this._scale=1,this._panOffset=new o.Vector3,this._rotateStart=new o.Vector2,this._rotateEnd=new o.Vector2,this._rotateDelta=new o.Vector2,this._panStart=new o.Vector2,this._panEnd=new o.Vector2,this._panDelta=new o.Vector2,this._dollyStart=new o.Vector2,this._dollyEnd=new o.Vector2,this._dollyDelta=new o.Vector2,this._dollyDirection=new o.Vector3,this._mouse=new o.Vector2,this._performCursorZoom=!1,this._pointers=[],this._pointerPositions={},this._controlActive=!1,this._onPointerMove=Sa.bind(this),this._onPointerDown=Ea.bind(this),this._onPointerUp=wa.bind(this),this._onContextMenu=Ra.bind(this),this._onMouseWheel=Oa.bind(this),this._onKeyDown=Ma.bind(this),this._onTouchStart=Aa.bind(this),this._onTouchMove=Pa.bind(this),this._onMouseDown=xa.bind(this),this._onMouseMove=Ta.bind(this),this._interceptControlDown=Da.bind(this),this._interceptControlUp=Ia.bind(this),this.domElement!==null&&this.connect(),this.update()}connect(){this.domElement.addEventListener("pointerdown",this._onPointerDown),this.domElement.addEventListener("pointercancel",this._onPointerUp),this.domElement.addEventListener("contextmenu",this._onContextMenu),this.domElement.addEventListener("wheel",this._onMouseWheel,{passive:!1}),this.domElement.getRootNode().addEventListener("keydown",this._interceptControlDown,{passive:!0,capture:!0}),this.domElement.style.touchAction="none"}disconnect(){this.domElement.removeEventListener("pointerdown",this._onPointerDown),this.domElement.removeEventListener("pointermove",this._onPointerMove),this.domElement.removeEventListener("pointerup",this._onPointerUp),this.domElement.removeEventListener("pointercancel",this._onPointerUp),this.domElement.removeEventListener("wheel",this._onMouseWheel),this.domElement.removeEventListener("contextmenu",this._onContextMenu),this.stopListenToKeyEvents(),this.domElement.getRootNode().removeEventListener("keydown",this._interceptControlDown,{capture:!0}),this.domElement.style.touchAction="auto"}dispose(){this.disconnect()}getPolarAngle(){return this._spherical.phi}getAzimuthalAngle(){return this._spherical.theta}getDistance(){return this.object.position.distanceTo(this.target)}listenToKeyEvents(e){e.addEventListener("keydown",this._onKeyDown),this._domElementKeyEvents=e}stopListenToKeyEvents(){this._domElementKeyEvents!==null&&(this._domElementKeyEvents.removeEventListener("keydown",this._onKeyDown),this._domElementKeyEvents=null)}saveState(){this.target0.copy(this.target),this.position0.copy(this.object.position),this.zoom0=this.object.zoom}reset(){this.target.copy(this.target0),this.object.position.copy(this.position0),this.object.zoom=this.zoom0,this.object.updateProjectionMatrix(),this.dispatchEvent(qi),this.update(),this.state=Y.NONE}update(e=null){const t=this.object.position;ne.copy(t).sub(this.target),ne.applyQuaternion(this._quat),this._spherical.setFromVector3(ne),this.autoRotate&&this.state===Y.NONE&&this._rotateLeft(this._getAutoRotationAngle(e)),this.enableDamping?(this._spherical.theta+=this._sphericalDelta.theta*this.dampingFactor,this._spherical.phi+=this._sphericalDelta.phi*this.dampingFactor):(this._spherical.theta+=this._sphericalDelta.theta,this._spherical.phi+=this._sphericalDelta.phi);let s=this.minAzimuthAngle,n=this.maxAzimuthAngle;isFinite(s)&&isFinite(n)&&(s<-Math.PI?s+=pe:s>Math.PI&&(s-=pe),n<-Math.PI?n+=pe:n>Math.PI&&(n-=pe),s<=n?this._spherical.theta=Math.max(s,Math.min(n,this._spherical.theta)):this._spherical.theta=this._spherical.theta>(s+n)/2?Math.max(s,this._spherical.theta):Math.min(n,this._spherical.theta)),this._spherical.phi=Math.max(this.minPolarAngle,Math.min(this.maxPolarAngle,this._spherical.phi)),this._spherical.makeSafe(),this.enableDamping===!0?this.target.addScaledVector(this._panOffset,this.dampingFactor):this.target.add(this._panOffset),this.target.sub(this.cursor),this.target.clampLength(this.minTargetRadius,this.maxTargetRadius),this.target.add(this.cursor);let r=!1;if(this.zoomToCursor&&this._performCursorZoom||this.object.isOrthographicCamera)this._spherical.radius=this._clampDistance(this._spherical.radius);else{const a=this._spherical.radius;this._spherical.radius=this._clampDistance(this._spherical.radius*this._scale),r=a!=this._spherical.radius}if(ne.setFromSpherical(this._spherical),ne.applyQuaternion(this._quatInverse),t.copy(this.target).add(ne),this.object.lookAt(this.target),this.enableDamping===!0?(this._sphericalDelta.theta*=1-this.dampingFactor,this._sphericalDelta.phi*=1-this.dampingFactor,this._panOffset.multiplyScalar(1-this.dampingFactor)):(this._sphericalDelta.set(0,0,0),this._panOffset.set(0,0,0)),this.zoomToCursor&&this._performCursorZoom){let a=null;if(this.object.isPerspectiveCamera){const l=ne.length();a=this._clampDistance(l*this._scale);const c=l-a;this.object.position.addScaledVector(this._dollyDirection,c),this.object.updateMatrixWorld(),r=!!c}else if(this.object.isOrthographicCamera){const l=new o.Vector3(this._mouse.x,this._mouse.y,0);l.unproject(this.object);const c=this.object.zoom;this.object.zoom=Math.max(this.minZoom,Math.min(this.maxZoom,this.object.zoom/this._scale)),this.object.updateProjectionMatrix(),r=c!==this.object.zoom;const h=new o.Vector3(this._mouse.x,this._mouse.y,0);h.unproject(this.object),this.object.position.sub(h).add(l),this.object.updateMatrixWorld(),a=ne.length()}else console.warn("WARNING: OrbitControls.js encountered an unknown camera type - zoom to cursor disabled."),this.zoomToCursor=!1;a!==null&&(this.screenSpacePanning?this.target.set(0,0,-1).transformDirection(this.object.matrix).multiplyScalar(a).add(this.object.position):(Ot.origin.copy(this.object.position),Ot.direction.set(0,0,-1).transformDirection(this.object.matrix),Math.abs(this.object.up.dot(Ot.direction))<ba?this.object.lookAt(this.target):(Qi.setFromNormalAndCoplanarPoint(this.object.up,this.target),Ot.intersectPlane(Qi,this.target))))}else if(this.object.isOrthographicCamera){const a=this.object.zoom;this.object.zoom=Math.max(this.minZoom,Math.min(this.maxZoom,this.object.zoom/this._scale)),a!==this.object.zoom&&(this.object.updateProjectionMatrix(),r=!0)}return this._scale=1,this._performCursorZoom=!1,r||this._lastPosition.distanceToSquared(this.object.position)>ei||8*(1-this._lastQuaternion.dot(this.object.quaternion))>ei||this._lastTargetPosition.distanceToSquared(this.target)>ei?(this.dispatchEvent(qi),this._lastPosition.copy(this.object.position),this._lastQuaternion.copy(this.object.quaternion),this._lastTargetPosition.copy(this.target),!0):!1}_getAutoRotationAngle(e){return e!==null?pe/60*this.autoRotateSpeed*e:pe/60/60*this.autoRotateSpeed}_getZoomScale(e){const t=Math.abs(e*.01);return Math.pow(.95,this.zoomSpeed*t)}_rotateLeft(e){this._sphericalDelta.theta-=e}_rotateUp(e){this._sphericalDelta.phi-=e}_panLeft(e,t){ne.setFromMatrixColumn(t,0),ne.multiplyScalar(-e),this._panOffset.add(ne)}_panUp(e,t){this.screenSpacePanning===!0?ne.setFromMatrixColumn(t,1):(ne.setFromMatrixColumn(t,0),ne.crossVectors(this.object.up,ne)),ne.multiplyScalar(e),this._panOffset.add(ne)}_pan(e,t){const s=this.domElement;if(this.object.isPerspectiveCamera){const n=this.object.position;ne.copy(n).sub(this.target);let r=ne.length();r*=Math.tan(this.object.fov/2*Math.PI/180),this._panLeft(2*e*r/s.clientHeight,this.object.matrix),this._panUp(2*t*r/s.clientHeight,this.object.matrix)}else this.object.isOrthographicCamera?(this._panLeft(e*(this.object.right-this.object.left)/this.object.zoom/s.clientWidth,this.object.matrix),this._panUp(t*(this.object.top-this.object.bottom)/this.object.zoom/s.clientHeight,this.object.matrix)):(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - pan disabled."),this.enablePan=!1)}_dollyOut(e){this.object.isPerspectiveCamera||this.object.isOrthographicCamera?this._scale/=e:(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled."),this.enableZoom=!1)}_dollyIn(e){this.object.isPerspectiveCamera||this.object.isOrthographicCamera?this._scale*=e:(console.warn("WARNING: OrbitControls.js encountered an unknown camera type - dolly/zoom disabled."),this.enableZoom=!1)}_updateZoomParameters(e,t){if(!this.zoomToCursor)return;this._performCursorZoom=!0;const s=this.domElement.getBoundingClientRect(),n=e-s.left,r=t-s.top,a=s.width,l=s.height;this._mouse.x=n/a*2-1,this._mouse.y=-(r/l)*2+1,this._dollyDirection.set(this._mouse.x,this._mouse.y,1).unproject(this.object).sub(this.object.position).normalize()}_clampDistance(e){return Math.max(this.minDistance,Math.min(this.maxDistance,e))}_handleMouseDownRotate(e){this._rotateStart.set(e.clientX,e.clientY)}_handleMouseDownDolly(e){this._updateZoomParameters(e.clientX,e.clientX),this._dollyStart.set(e.clientX,e.clientY)}_handleMouseDownPan(e){this._panStart.set(e.clientX,e.clientY)}_handleMouseMoveRotate(e){this._rotateEnd.set(e.clientX,e.clientY),this._rotateDelta.subVectors(this._rotateEnd,this._rotateStart).multiplyScalar(this.rotateSpeed);const t=this.domElement;this._rotateLeft(pe*this._rotateDelta.x/t.clientHeight),this._rotateUp(pe*this._rotateDelta.y/t.clientHeight),this._rotateStart.copy(this._rotateEnd),this.update()}_handleMouseMoveDolly(e){this._dollyEnd.set(e.clientX,e.clientY),this._dollyDelta.subVectors(this._dollyEnd,this._dollyStart),this._dollyDelta.y>0?this._dollyOut(this._getZoomScale(this._dollyDelta.y)):this._dollyDelta.y<0&&this._dollyIn(this._getZoomScale(this._dollyDelta.y)),this._dollyStart.copy(this._dollyEnd),this.update()}_handleMouseMovePan(e){this._panEnd.set(e.clientX,e.clientY),this._panDelta.subVectors(this._panEnd,this._panStart).multiplyScalar(this.panSpeed),this._pan(this._panDelta.x,this._panDelta.y),this._panStart.copy(this._panEnd),this.update()}_handleMouseWheel(e){this._updateZoomParameters(e.clientX,e.clientY),e.deltaY<0?this._dollyIn(this._getZoomScale(e.deltaY)):e.deltaY>0&&this._dollyOut(this._getZoomScale(e.deltaY)),this.update()}_handleKeyDown(e){let t=!1;switch(e.code){case this.keys.UP:e.ctrlKey||e.metaKey||e.shiftKey?this._rotateUp(pe*this.rotateSpeed/this.domElement.clientHeight):this._pan(0,this.keyPanSpeed),t=!0;break;case this.keys.BOTTOM:e.ctrlKey||e.metaKey||e.shiftKey?this._rotateUp(-pe*this.rotateSpeed/this.domElement.clientHeight):this._pan(0,-this.keyPanSpeed),t=!0;break;case this.keys.LEFT:e.ctrlKey||e.metaKey||e.shiftKey?this._rotateLeft(pe*this.rotateSpeed/this.domElement.clientHeight):this._pan(this.keyPanSpeed,0),t=!0;break;case this.keys.RIGHT:e.ctrlKey||e.metaKey||e.shiftKey?this._rotateLeft(-pe*this.rotateSpeed/this.domElement.clientHeight):this._pan(-this.keyPanSpeed,0),t=!0;break}t&&(e.preventDefault(),this.update())}_handleTouchStartRotate(e){if(this._pointers.length===1)this._rotateStart.set(e.pageX,e.pageY);else{const t=this._getSecondPointerPosition(e),s=.5*(e.pageX+t.x),n=.5*(e.pageY+t.y);this._rotateStart.set(s,n)}}_handleTouchStartPan(e){if(this._pointers.length===1)this._panStart.set(e.pageX,e.pageY);else{const t=this._getSecondPointerPosition(e),s=.5*(e.pageX+t.x),n=.5*(e.pageY+t.y);this._panStart.set(s,n)}}_handleTouchStartDolly(e){const t=this._getSecondPointerPosition(e),s=e.pageX-t.x,n=e.pageY-t.y,r=Math.sqrt(s*s+n*n);this._dollyStart.set(0,r)}_handleTouchStartDollyPan(e){this.enableZoom&&this._handleTouchStartDolly(e),this.enablePan&&this._handleTouchStartPan(e)}_handleTouchStartDollyRotate(e){this.enableZoom&&this._handleTouchStartDolly(e),this.enableRotate&&this._handleTouchStartRotate(e)}_handleTouchMoveRotate(e){if(this._pointers.length==1)this._rotateEnd.set(e.pageX,e.pageY);else{const s=this._getSecondPointerPosition(e),n=.5*(e.pageX+s.x),r=.5*(e.pageY+s.y);this._rotateEnd.set(n,r)}this._rotateDelta.subVectors(this._rotateEnd,this._rotateStart).multiplyScalar(this.rotateSpeed);const t=this.domElement;this._rotateLeft(pe*this._rotateDelta.x/t.clientHeight),this._rotateUp(pe*this._rotateDelta.y/t.clientHeight),this._rotateStart.copy(this._rotateEnd)}_handleTouchMovePan(e){if(this._pointers.length===1)this._panEnd.set(e.pageX,e.pageY);else{const t=this._getSecondPointerPosition(e),s=.5*(e.pageX+t.x),n=.5*(e.pageY+t.y);this._panEnd.set(s,n)}this._panDelta.subVectors(this._panEnd,this._panStart).multiplyScalar(this.panSpeed),this._pan(this._panDelta.x,this._panDelta.y),this._panStart.copy(this._panEnd)}_handleTouchMoveDolly(e){const t=this._getSecondPointerPosition(e),s=e.pageX-t.x,n=e.pageY-t.y,r=Math.sqrt(s*s+n*n);this._dollyEnd.set(0,r),this._dollyDelta.set(0,Math.pow(this._dollyEnd.y/this._dollyStart.y,this.zoomSpeed)),this._dollyOut(this._dollyDelta.y),this._dollyStart.copy(this._dollyEnd);const a=(e.pageX+t.x)*.5,l=(e.pageY+t.y)*.5;this._updateZoomParameters(a,l)}_handleTouchMoveDollyPan(e){this.enableZoom&&this._handleTouchMoveDolly(e),this.enablePan&&this._handleTouchMovePan(e)}_handleTouchMoveDollyRotate(e){this.enableZoom&&this._handleTouchMoveDolly(e),this.enableRotate&&this._handleTouchMoveRotate(e)}_addPointer(e){this._pointers.push(e.pointerId)}_removePointer(e){delete this._pointerPositions[e.pointerId];for(let t=0;t<this._pointers.length;t++)if(this._pointers[t]==e.pointerId){this._pointers.splice(t,1);return}}_isTrackingPointer(e){for(let t=0;t<this._pointers.length;t++)if(this._pointers[t]==e.pointerId)return!0;return!1}_trackPointer(e){let t=this._pointerPositions[e.pointerId];t===void 0&&(t=new o.Vector2,this._pointerPositions[e.pointerId]=t),t.set(e.pageX,e.pageY)}_getSecondPointerPosition(e){const t=e.pointerId===this._pointers[0]?this._pointers[1]:this._pointers[0];return this._pointerPositions[t]}_customWheelEvent(e){const t=e.deltaMode,s={clientX:e.clientX,clientY:e.clientY,deltaY:e.deltaY};switch(t){case 1:s.deltaY*=16;break;case 2:s.deltaY*=100;break}return e.ctrlKey&&!this._controlActive&&(s.deltaY*=10),s}}function Ea(i){this.enabled!==!1&&(this._pointers.length===0&&(this.domElement.setPointerCapture(i.pointerId),this.domElement.addEventListener("pointermove",this._onPointerMove),this.domElement.addEventListener("pointerup",this._onPointerUp)),!this._isTrackingPointer(i)&&(this._addPointer(i),i.pointerType==="touch"?this._onTouchStart(i):this._onMouseDown(i)))}function Sa(i){this.enabled!==!1&&(i.pointerType==="touch"?this._onTouchMove(i):this._onMouseMove(i))}function wa(i){switch(this._removePointer(i),this._pointers.length){case 0:this.domElement.releasePointerCapture(i.pointerId),this.domElement.removeEventListener("pointermove",this._onPointerMove),this.domElement.removeEventListener("pointerup",this._onPointerUp),this.dispatchEvent(Os),this.state=Y.NONE;break;case 1:const e=this._pointers[0],t=this._pointerPositions[e];this._onTouchStart({pointerId:e,pageX:t.x,pageY:t.y});break}}function xa(i){let e;switch(i.button){case 0:e=this.mouseButtons.LEFT;break;case 1:e=this.mouseButtons.MIDDLE;break;case 2:e=this.mouseButtons.RIGHT;break;default:e=-1}switch(e){case o.MOUSE.DOLLY:if(this.enableZoom===!1)return;this._handleMouseDownDolly(i),this.state=Y.DOLLY;break;case o.MOUSE.ROTATE:if(i.ctrlKey||i.metaKey||i.shiftKey){if(this.enablePan===!1)return;this._handleMouseDownPan(i),this.state=Y.PAN}else{if(this.enableRotate===!1)return;this._handleMouseDownRotate(i),this.state=Y.ROTATE}break;case o.MOUSE.PAN:if(i.ctrlKey||i.metaKey||i.shiftKey){if(this.enableRotate===!1)return;this._handleMouseDownRotate(i),this.state=Y.ROTATE}else{if(this.enablePan===!1)return;this._handleMouseDownPan(i),this.state=Y.PAN}break;default:this.state=Y.NONE}this.state!==Y.NONE&&this.dispatchEvent(xi)}function Ta(i){switch(this.state){case Y.ROTATE:if(this.enableRotate===!1)return;this._handleMouseMoveRotate(i);break;case Y.DOLLY:if(this.enableZoom===!1)return;this._handleMouseMoveDolly(i);break;case Y.PAN:if(this.enablePan===!1)return;this._handleMouseMovePan(i);break}}function Oa(i){this.enabled===!1||this.enableZoom===!1||this.state!==Y.NONE||(i.preventDefault(),this.dispatchEvent(xi),this._handleMouseWheel(this._customWheelEvent(i)),this.dispatchEvent(Os))}function Ma(i){this.enabled===!1||this.enablePan===!1||this._handleKeyDown(i)}function Aa(i){switch(this._trackPointer(i),this._pointers.length){case 1:switch(this.touches.ONE){case o.TOUCH.ROTATE:if(this.enableRotate===!1)return;this._handleTouchStartRotate(i),this.state=Y.TOUCH_ROTATE;break;case o.TOUCH.PAN:if(this.enablePan===!1)return;this._handleTouchStartPan(i),this.state=Y.TOUCH_PAN;break;default:this.state=Y.NONE}break;case 2:switch(this.touches.TWO){case o.TOUCH.DOLLY_PAN:if(this.enableZoom===!1&&this.enablePan===!1)return;this._handleTouchStartDollyPan(i),this.state=Y.TOUCH_DOLLY_PAN;break;case o.TOUCH.DOLLY_ROTATE:if(this.enableZoom===!1&&this.enableRotate===!1)return;this._handleTouchStartDollyRotate(i),this.state=Y.TOUCH_DOLLY_ROTATE;break;default:this.state=Y.NONE}break;default:this.state=Y.NONE}this.state!==Y.NONE&&this.dispatchEvent(xi)}function Pa(i){switch(this._trackPointer(i),this.state){case Y.TOUCH_ROTATE:if(this.enableRotate===!1)return;this._handleTouchMoveRotate(i),this.update();break;case Y.TOUCH_PAN:if(this.enablePan===!1)return;this._handleTouchMovePan(i),this.update();break;case Y.TOUCH_DOLLY_PAN:if(this.enableZoom===!1&&this.enablePan===!1)return;this._handleTouchMoveDollyPan(i),this.update();break;case Y.TOUCH_DOLLY_ROTATE:if(this.enableZoom===!1&&this.enableRotate===!1)return;this._handleTouchMoveDollyRotate(i),this.update();break;default:this.state=Y.NONE}}function Ra(i){this.enabled!==!1&&i.preventDefault()}function Da(i){i.key==="Control"&&(this._controlActive=!0,this.domElement.getRootNode().addEventListener("keyup",this._interceptControlUp,{passive:!0,capture:!0}))}function Ia(i){i.key==="Control"&&(this._controlActive=!1,this.domElement.getRootNode().removeEventListener("keyup",this._interceptControlUp,{passive:!0,capture:!0}))}/*!
48
+ * camera-controls
49
+ * https://github.com/yomotsu/camera-controls
50
+ * (c) 2017 @yomotsu
51
+ * Released under the MIT License.
52
+ */const $={LEFT:1,RIGHT:2,MIDDLE:4},v=Object.freeze({NONE:0,ROTATE:1,TRUCK:2,OFFSET:4,DOLLY:8,ZOOM:16,TOUCH_ROTATE:32,TOUCH_TRUCK:64,TOUCH_OFFSET:128,TOUCH_DOLLY:256,TOUCH_ZOOM:512,TOUCH_DOLLY_TRUCK:1024,TOUCH_DOLLY_OFFSET:2048,TOUCH_DOLLY_ROTATE:4096,TOUCH_ZOOM_TRUCK:8192,TOUCH_ZOOM_OFFSET:16384,TOUCH_ZOOM_ROTATE:32768}),Qe={NONE:0,IN:1,OUT:-1};function je(i){return i.isPerspectiveCamera}function ke(i){return i.isOrthographicCamera}const Ke=Math.PI*2,Ki=Math.PI/2,Ms=1e-5,ot=Math.PI/180;function Ee(i,e,t){return Math.max(e,Math.min(t,i))}function q(i,e=Ms){return Math.abs(i)<e}function H(i,e,t=Ms){return q(i-e,t)}function $i(i,e){return Math.round(i/e)*e}function lt(i){return isFinite(i)?i:i<0?-Number.MAX_VALUE:Number.MAX_VALUE}function ct(i){return Math.abs(i)<Number.MAX_VALUE?i:i*(1/0)}function Mt(i,e,t,s,n=1/0,r){s=Math.max(1e-4,s);const a=2/s,l=a*r,c=1/(1+l+.48*l*l+.235*l*l*l);let h=i-e;const u=e,f=n*s;h=Ee(h,-f,f),e=i-h;const m=(t.value+a*h)*r;t.value=(t.value-a*m)*c;let g=e+(h+m)*c;return u-i>0==g>u&&(g=u,t.value=(g-u)/r),g}function Ji(i,e,t,s,n=1/0,r,a){s=Math.max(1e-4,s);const l=2/s,c=l*r,h=1/(1+c+.48*c*c+.235*c*c*c);let u=e.x,f=e.y,m=e.z,g=i.x-u,E=i.y-f,y=i.z-m;const O=u,_=f,b=m,S=n*s,w=S*S,x=g*g+E*E+y*y;if(x>w){const X=Math.sqrt(x);g=g/X*S,E=E/X*S,y=y/X*S}u=i.x-g,f=i.y-E,m=i.z-y;const M=(t.x+l*g)*r,D=(t.y+l*E)*r,k=(t.z+l*y)*r;t.x=(t.x-l*M)*h,t.y=(t.y-l*D)*h,t.z=(t.z-l*k)*h,a.x=u+(g+M)*h,a.y=f+(E+D)*h,a.z=m+(y+k)*h;const R=O-i.x,V=_-i.y,ge=b-i.z,ue=a.x-O,se=a.y-_,Q=a.z-b;return R*ue+V*se+ge*Q>0&&(a.x=O,a.y=_,a.z=b,t.x=(a.x-O)/r,t.y=(a.y-_)/r,t.z=(a.z-b)/r),a}function ti(i,e){e.set(0,0),i.forEach(t=>{e.x+=t.clientX,e.y+=t.clientY}),e.x/=i.length,e.y/=i.length}function ii(i,e){return ke(i)?(console.warn(`${e} is not supported in OrthographicCamera`),!0):!1}class La{constructor(){this._listeners={}}addEventListener(e,t){const s=this._listeners;s[e]===void 0&&(s[e]=[]),s[e].indexOf(t)===-1&&s[e].push(t)}hasEventListener(e,t){const s=this._listeners;return s[e]!==void 0&&s[e].indexOf(t)!==-1}removeEventListener(e,t){const n=this._listeners[e];if(n!==void 0){const r=n.indexOf(t);r!==-1&&n.splice(r,1)}}removeAllEventListeners(e){if(!e){this._listeners={};return}Array.isArray(this._listeners[e])&&(this._listeners[e].length=0)}dispatchEvent(e){const s=this._listeners[e.type];if(s!==void 0){e.target=this;const n=s.slice(0);for(let r=0,a=n.length;r<a;r++)n[r].call(this,e)}}}var si;const ka="2.9.0",At=1/8,Ua=/Mac/.test((si=globalThis?.navigator)===null||si===void 0?void 0:si.platform);let I,es,Pt,ni,me,U,F,$e,ht,Se,we,Ne,ts,is,ve,dt,Je,ss,ai,ns,ri,oi,Rt;class Oe extends La{static install(e){I=e.THREE,es=Object.freeze(new I.Vector3(0,0,0)),Pt=Object.freeze(new I.Vector3(0,1,0)),ni=Object.freeze(new I.Vector3(0,0,1)),me=new I.Vector2,U=new I.Vector3,F=new I.Vector3,$e=new I.Vector3,ht=new I.Vector3,Se=new I.Vector3,we=new I.Vector3,Ne=new I.Vector3,ts=new I.Vector3,is=new I.Vector3,ve=new I.Spherical,dt=new I.Spherical,Je=new I.Box3,ss=new I.Box3,ai=new I.Sphere,ns=new I.Quaternion,ri=new I.Quaternion,oi=new I.Matrix4,Rt=new I.Raycaster}static get ACTION(){return v}constructor(e,t){super(),this.minPolarAngle=0,this.maxPolarAngle=Math.PI,this.minAzimuthAngle=-1/0,this.maxAzimuthAngle=1/0,this.minDistance=Number.EPSILON,this.maxDistance=1/0,this.infinityDolly=!1,this.minZoom=.01,this.maxZoom=1/0,this.smoothTime=.25,this.draggingSmoothTime=.125,this.maxSpeed=1/0,this.azimuthRotateSpeed=1,this.polarRotateSpeed=1,this.dollySpeed=1,this.dollyDragInverted=!1,this.truckSpeed=2,this.dollyToCursor=!1,this.dragToOffset=!1,this.verticalDragToForward=!1,this.boundaryFriction=0,this.restThreshold=.01,this.colliderMeshes=[],this.cancel=()=>{},this._enabled=!0,this._state=v.NONE,this._viewport=null,this._changedDolly=0,this._changedZoom=0,this._hasRested=!0,this._boundaryEnclosesCamera=!1,this._needsUpdate=!0,this._updatedLastTime=!1,this._elementRect=new DOMRect,this._isDragging=!1,this._dragNeedsUpdate=!0,this._activePointers=[],this._lockedPointer=null,this._interactiveArea=new DOMRect(0,0,1,1),this._isUserControllingRotate=!1,this._isUserControllingDolly=!1,this._isUserControllingTruck=!1,this._isUserControllingOffset=!1,this._isUserControllingZoom=!1,this._lastDollyDirection=Qe.NONE,this._thetaVelocity={value:0},this._phiVelocity={value:0},this._radiusVelocity={value:0},this._targetVelocity=new I.Vector3,this._focalOffsetVelocity=new I.Vector3,this._zoomVelocity={value:0},this._truckInternal=(_,b,S)=>{let w,x;if(je(this._camera)){const M=U.copy(this._camera.position).sub(this._target),D=this._camera.getEffectiveFOV()*ot,k=M.length()*Math.tan(D*.5);w=this.truckSpeed*_*k/this._elementRect.height,x=this.truckSpeed*b*k/this._elementRect.height}else if(ke(this._camera)){const M=this._camera;w=_*(M.right-M.left)/M.zoom/this._elementRect.width,x=b*(M.top-M.bottom)/M.zoom/this._elementRect.height}else return;this.verticalDragToForward?(S?this.setFocalOffset(this._focalOffsetEnd.x+w,this._focalOffsetEnd.y,this._focalOffsetEnd.z,!0):this.truck(w,0,!0),this.forward(-x,!0)):S?this.setFocalOffset(this._focalOffsetEnd.x+w,this._focalOffsetEnd.y+x,this._focalOffsetEnd.z,!0):this.truck(w,x,!0)},this._rotateInternal=(_,b)=>{const S=Ke*this.azimuthRotateSpeed*_/this._elementRect.height,w=Ke*this.polarRotateSpeed*b/this._elementRect.height;this.rotate(S,w,!0)},this._dollyInternal=(_,b,S)=>{const w=Math.pow(.95,-_*this.dollySpeed),x=this._sphericalEnd.radius,M=this._sphericalEnd.radius*w,D=Ee(M,this.minDistance,this.maxDistance),k=D-M;this.infinityDolly&&this.dollyToCursor?this._dollyToNoClamp(M,!0):this.infinityDolly&&!this.dollyToCursor?(this.dollyInFixed(k,!0),this._dollyToNoClamp(D,!0)):this._dollyToNoClamp(D,!0),this.dollyToCursor&&(this._changedDolly+=(this.infinityDolly?M:D)-x,this._dollyControlCoord.set(b,S)),this._lastDollyDirection=Math.sign(-_)},this._zoomInternal=(_,b,S)=>{const w=Math.pow(.95,_*this.dollySpeed),x=this._zoom,M=this._zoom*w;this.zoomTo(M,!0),this.dollyToCursor&&(this._changedZoom+=M-x,this._dollyControlCoord.set(b,S))},typeof I>"u"&&console.error("camera-controls: `THREE` is undefined. You must first run `CameraControls.install( { THREE: THREE } )`. Check the docs for further information."),this._camera=e,this._yAxisUpSpace=new I.Quaternion().setFromUnitVectors(this._camera.up,Pt),this._yAxisUpSpaceInverse=this._yAxisUpSpace.clone().invert(),this._state=v.NONE,this._target=new I.Vector3,this._targetEnd=this._target.clone(),this._focalOffset=new I.Vector3,this._focalOffsetEnd=this._focalOffset.clone(),this._spherical=new I.Spherical().setFromVector3(U.copy(this._camera.position).applyQuaternion(this._yAxisUpSpace)),this._sphericalEnd=this._spherical.clone(),this._lastDistance=this._spherical.radius,this._zoom=this._camera.zoom,this._zoomEnd=this._zoom,this._lastZoom=this._zoom,this._nearPlaneCorners=[new I.Vector3,new I.Vector3,new I.Vector3,new I.Vector3],this._updateNearPlaneCorners(),this._boundary=new I.Box3(new I.Vector3(-1/0,-1/0,-1/0),new I.Vector3(1/0,1/0,1/0)),this._cameraUp0=this._camera.up.clone(),this._target0=this._target.clone(),this._position0=this._camera.position.clone(),this._zoom0=this._zoom,this._focalOffset0=this._focalOffset.clone(),this._dollyControlCoord=new I.Vector2,this.mouseButtons={left:v.ROTATE,middle:v.DOLLY,right:v.TRUCK,wheel:je(this._camera)?v.DOLLY:ke(this._camera)?v.ZOOM:v.NONE},this.touches={one:v.TOUCH_ROTATE,two:je(this._camera)?v.TOUCH_DOLLY_TRUCK:ke(this._camera)?v.TOUCH_ZOOM_TRUCK:v.NONE,three:v.TOUCH_TRUCK};const s=new I.Vector2,n=new I.Vector2,r=new I.Vector2,a=_=>{if(!this._enabled||!this._domElement)return;if(this._interactiveArea.left!==0||this._interactiveArea.top!==0||this._interactiveArea.width!==1||this._interactiveArea.height!==1){const w=this._domElement.getBoundingClientRect(),x=_.clientX/w.width,M=_.clientY/w.height;if(x<this._interactiveArea.left||x>this._interactiveArea.right||M<this._interactiveArea.top||M>this._interactiveArea.bottom)return}const b=_.pointerType!=="mouse"?null:(_.buttons&$.LEFT)===$.LEFT?$.LEFT:(_.buttons&$.MIDDLE)===$.MIDDLE?$.MIDDLE:(_.buttons&$.RIGHT)===$.RIGHT?$.RIGHT:null;if(b!==null){const w=this._findPointerByMouseButton(b);w&&this._disposePointer(w)}if((_.buttons&$.LEFT)===$.LEFT&&this._lockedPointer)return;const S={pointerId:_.pointerId,clientX:_.clientX,clientY:_.clientY,deltaX:0,deltaY:0,mouseButton:b};this._activePointers.push(S),this._domElement.ownerDocument.removeEventListener("pointermove",l,{passive:!1}),this._domElement.ownerDocument.removeEventListener("pointerup",c),this._domElement.ownerDocument.addEventListener("pointermove",l,{passive:!1}),this._domElement.ownerDocument.addEventListener("pointerup",c),this._isDragging=!0,m(_)},l=_=>{_.cancelable&&_.preventDefault();const b=_.pointerId,S=this._lockedPointer||this._findPointerById(b);if(S){if(S.clientX=_.clientX,S.clientY=_.clientY,S.deltaX=_.movementX,S.deltaY=_.movementY,this._state=0,_.pointerType==="touch")switch(this._activePointers.length){case 1:this._state=this.touches.one;break;case 2:this._state=this.touches.two;break;case 3:this._state=this.touches.three;break}else(!this._isDragging&&this._lockedPointer||this._isDragging&&(_.buttons&$.LEFT)===$.LEFT)&&(this._state=this._state|this.mouseButtons.left),this._isDragging&&(_.buttons&$.MIDDLE)===$.MIDDLE&&(this._state=this._state|this.mouseButtons.middle),this._isDragging&&(_.buttons&$.RIGHT)===$.RIGHT&&(this._state=this._state|this.mouseButtons.right);g()}},c=_=>{const b=this._findPointerById(_.pointerId);if(!(b&&b===this._lockedPointer)){if(b&&this._disposePointer(b),_.pointerType==="touch")switch(this._activePointers.length){case 0:this._state=v.NONE;break;case 1:this._state=this.touches.one;break;case 2:this._state=this.touches.two;break;case 3:this._state=this.touches.three;break}else this._state=v.NONE;E()}};let h=-1;const u=_=>{if(!this._domElement||!this._enabled||this.mouseButtons.wheel===v.NONE)return;if(this._interactiveArea.left!==0||this._interactiveArea.top!==0||this._interactiveArea.width!==1||this._interactiveArea.height!==1){const M=this._domElement.getBoundingClientRect(),D=_.clientX/M.width,k=_.clientY/M.height;if(D<this._interactiveArea.left||D>this._interactiveArea.right||k<this._interactiveArea.top||k>this._interactiveArea.bottom)return}if(_.preventDefault(),this.dollyToCursor||this.mouseButtons.wheel===v.ROTATE||this.mouseButtons.wheel===v.TRUCK){const M=performance.now();h-M<1e3&&this._getClientRect(this._elementRect),h=M}const b=Ua?-1:-3,S=_.deltaMode===1?_.deltaY/b:_.deltaY/(b*10),w=this.dollyToCursor?(_.clientX-this._elementRect.x)/this._elementRect.width*2-1:0,x=this.dollyToCursor?(_.clientY-this._elementRect.y)/this._elementRect.height*-2+1:0;switch(this.mouseButtons.wheel){case v.ROTATE:{this._rotateInternal(_.deltaX,_.deltaY),this._isUserControllingRotate=!0;break}case v.TRUCK:{this._truckInternal(_.deltaX,_.deltaY,!1),this._isUserControllingTruck=!0;break}case v.OFFSET:{this._truckInternal(_.deltaX,_.deltaY,!0),this._isUserControllingOffset=!0;break}case v.DOLLY:{this._dollyInternal(-S,w,x),this._isUserControllingDolly=!0;break}case v.ZOOM:{this._zoomInternal(-S,w,x),this._isUserControllingZoom=!0;break}}this.dispatchEvent({type:"control"})},f=_=>{if(!(!this._domElement||!this._enabled)){if(this.mouseButtons.right===Oe.ACTION.NONE){const b=_ instanceof PointerEvent?_.pointerId:0,S=this._findPointerById(b);S&&this._disposePointer(S),this._domElement.ownerDocument.removeEventListener("pointermove",l,{passive:!1}),this._domElement.ownerDocument.removeEventListener("pointerup",c);return}_.preventDefault()}},m=_=>{if(!this._enabled)return;if(ti(this._activePointers,me),this._getClientRect(this._elementRect),s.copy(me),n.copy(me),this._activePointers.length>=2){const S=me.x-this._activePointers[1].clientX,w=me.y-this._activePointers[1].clientY,x=Math.sqrt(S*S+w*w);r.set(0,x);const M=(this._activePointers[0].clientX+this._activePointers[1].clientX)*.5,D=(this._activePointers[0].clientY+this._activePointers[1].clientY)*.5;n.set(M,D)}if(this._state=0,!_)this._lockedPointer&&(this._state=this._state|this.mouseButtons.left);else if("pointerType"in _&&_.pointerType==="touch")switch(this._activePointers.length){case 1:this._state=this.touches.one;break;case 2:this._state=this.touches.two;break;case 3:this._state=this.touches.three;break}else!this._lockedPointer&&(_.buttons&$.LEFT)===$.LEFT&&(this._state=this._state|this.mouseButtons.left),(_.buttons&$.MIDDLE)===$.MIDDLE&&(this._state=this._state|this.mouseButtons.middle),(_.buttons&$.RIGHT)===$.RIGHT&&(this._state=this._state|this.mouseButtons.right);((this._state&v.ROTATE)===v.ROTATE||(this._state&v.TOUCH_ROTATE)===v.TOUCH_ROTATE||(this._state&v.TOUCH_DOLLY_ROTATE)===v.TOUCH_DOLLY_ROTATE||(this._state&v.TOUCH_ZOOM_ROTATE)===v.TOUCH_ZOOM_ROTATE)&&(this._sphericalEnd.theta=this._spherical.theta,this._sphericalEnd.phi=this._spherical.phi,this._thetaVelocity.value=0,this._phiVelocity.value=0),((this._state&v.TRUCK)===v.TRUCK||(this._state&v.TOUCH_TRUCK)===v.TOUCH_TRUCK||(this._state&v.TOUCH_DOLLY_TRUCK)===v.TOUCH_DOLLY_TRUCK||(this._state&v.TOUCH_ZOOM_TRUCK)===v.TOUCH_ZOOM_TRUCK)&&(this._targetEnd.copy(this._target),this._targetVelocity.set(0,0,0)),((this._state&v.DOLLY)===v.DOLLY||(this._state&v.TOUCH_DOLLY)===v.TOUCH_DOLLY||(this._state&v.TOUCH_DOLLY_TRUCK)===v.TOUCH_DOLLY_TRUCK||(this._state&v.TOUCH_DOLLY_OFFSET)===v.TOUCH_DOLLY_OFFSET||(this._state&v.TOUCH_DOLLY_ROTATE)===v.TOUCH_DOLLY_ROTATE)&&(this._sphericalEnd.radius=this._spherical.radius,this._radiusVelocity.value=0),((this._state&v.ZOOM)===v.ZOOM||(this._state&v.TOUCH_ZOOM)===v.TOUCH_ZOOM||(this._state&v.TOUCH_ZOOM_TRUCK)===v.TOUCH_ZOOM_TRUCK||(this._state&v.TOUCH_ZOOM_OFFSET)===v.TOUCH_ZOOM_OFFSET||(this._state&v.TOUCH_ZOOM_ROTATE)===v.TOUCH_ZOOM_ROTATE)&&(this._zoomEnd=this._zoom,this._zoomVelocity.value=0),((this._state&v.OFFSET)===v.OFFSET||(this._state&v.TOUCH_OFFSET)===v.TOUCH_OFFSET||(this._state&v.TOUCH_DOLLY_OFFSET)===v.TOUCH_DOLLY_OFFSET||(this._state&v.TOUCH_ZOOM_OFFSET)===v.TOUCH_ZOOM_OFFSET)&&(this._focalOffsetEnd.copy(this._focalOffset),this._focalOffsetVelocity.set(0,0,0)),this.dispatchEvent({type:"controlstart"})},g=()=>{if(!this._enabled||!this._dragNeedsUpdate)return;this._dragNeedsUpdate=!1,ti(this._activePointers,me);const b=this._domElement&&this._domElement.ownerDocument.pointerLockElement===this._domElement?this._lockedPointer||this._activePointers[0]:null,S=b?-b.deltaX:n.x-me.x,w=b?-b.deltaY:n.y-me.y;if(n.copy(me),((this._state&v.ROTATE)===v.ROTATE||(this._state&v.TOUCH_ROTATE)===v.TOUCH_ROTATE||(this._state&v.TOUCH_DOLLY_ROTATE)===v.TOUCH_DOLLY_ROTATE||(this._state&v.TOUCH_ZOOM_ROTATE)===v.TOUCH_ZOOM_ROTATE)&&(this._rotateInternal(S,w),this._isUserControllingRotate=!0),(this._state&v.DOLLY)===v.DOLLY||(this._state&v.ZOOM)===v.ZOOM){const x=this.dollyToCursor?(s.x-this._elementRect.x)/this._elementRect.width*2-1:0,M=this.dollyToCursor?(s.y-this._elementRect.y)/this._elementRect.height*-2+1:0,D=this.dollyDragInverted?-1:1;(this._state&v.DOLLY)===v.DOLLY?(this._dollyInternal(D*w*At,x,M),this._isUserControllingDolly=!0):(this._zoomInternal(D*w*At,x,M),this._isUserControllingZoom=!0)}if((this._state&v.TOUCH_DOLLY)===v.TOUCH_DOLLY||(this._state&v.TOUCH_ZOOM)===v.TOUCH_ZOOM||(this._state&v.TOUCH_DOLLY_TRUCK)===v.TOUCH_DOLLY_TRUCK||(this._state&v.TOUCH_ZOOM_TRUCK)===v.TOUCH_ZOOM_TRUCK||(this._state&v.TOUCH_DOLLY_OFFSET)===v.TOUCH_DOLLY_OFFSET||(this._state&v.TOUCH_ZOOM_OFFSET)===v.TOUCH_ZOOM_OFFSET||(this._state&v.TOUCH_DOLLY_ROTATE)===v.TOUCH_DOLLY_ROTATE||(this._state&v.TOUCH_ZOOM_ROTATE)===v.TOUCH_ZOOM_ROTATE){const x=me.x-this._activePointers[1].clientX,M=me.y-this._activePointers[1].clientY,D=Math.sqrt(x*x+M*M),k=r.y-D;r.set(0,D);const R=this.dollyToCursor?(n.x-this._elementRect.x)/this._elementRect.width*2-1:0,V=this.dollyToCursor?(n.y-this._elementRect.y)/this._elementRect.height*-2+1:0;(this._state&v.TOUCH_DOLLY)===v.TOUCH_DOLLY||(this._state&v.TOUCH_DOLLY_ROTATE)===v.TOUCH_DOLLY_ROTATE||(this._state&v.TOUCH_DOLLY_TRUCK)===v.TOUCH_DOLLY_TRUCK||(this._state&v.TOUCH_DOLLY_OFFSET)===v.TOUCH_DOLLY_OFFSET?(this._dollyInternal(k*At,R,V),this._isUserControllingDolly=!0):(this._zoomInternal(k*At,R,V),this._isUserControllingZoom=!0)}((this._state&v.TRUCK)===v.TRUCK||(this._state&v.TOUCH_TRUCK)===v.TOUCH_TRUCK||(this._state&v.TOUCH_DOLLY_TRUCK)===v.TOUCH_DOLLY_TRUCK||(this._state&v.TOUCH_ZOOM_TRUCK)===v.TOUCH_ZOOM_TRUCK)&&(this._truckInternal(S,w,!1),this._isUserControllingTruck=!0),((this._state&v.OFFSET)===v.OFFSET||(this._state&v.TOUCH_OFFSET)===v.TOUCH_OFFSET||(this._state&v.TOUCH_DOLLY_OFFSET)===v.TOUCH_DOLLY_OFFSET||(this._state&v.TOUCH_ZOOM_OFFSET)===v.TOUCH_ZOOM_OFFSET)&&(this._truckInternal(S,w,!0),this._isUserControllingOffset=!0),this.dispatchEvent({type:"control"})},E=()=>{ti(this._activePointers,me),n.copy(me),this._dragNeedsUpdate=!1,(this._activePointers.length===0||this._activePointers.length===1&&this._activePointers[0]===this._lockedPointer)&&(this._isDragging=!1),this._activePointers.length===0&&this._domElement&&(this._domElement.ownerDocument.removeEventListener("pointermove",l,{passive:!1}),this._domElement.ownerDocument.removeEventListener("pointerup",c),this.dispatchEvent({type:"controlend"}))};this.lockPointer=()=>{!this._enabled||!this._domElement||(this.cancel(),this._lockedPointer={pointerId:-1,clientX:0,clientY:0,deltaX:0,deltaY:0,mouseButton:null},this._activePointers.push(this._lockedPointer),this._domElement.ownerDocument.removeEventListener("pointermove",l,{passive:!1}),this._domElement.ownerDocument.removeEventListener("pointerup",c),this._domElement.requestPointerLock(),this._domElement.ownerDocument.addEventListener("pointerlockchange",y),this._domElement.ownerDocument.addEventListener("pointerlockerror",O),this._domElement.ownerDocument.addEventListener("pointermove",l,{passive:!1}),this._domElement.ownerDocument.addEventListener("pointerup",c),m())},this.unlockPointer=()=>{var _,b,S;this._lockedPointer!==null&&(this._disposePointer(this._lockedPointer),this._lockedPointer=null),(_=this._domElement)===null||_===void 0||_.ownerDocument.exitPointerLock(),(b=this._domElement)===null||b===void 0||b.ownerDocument.removeEventListener("pointerlockchange",y),(S=this._domElement)===null||S===void 0||S.ownerDocument.removeEventListener("pointerlockerror",O),this.cancel()};const y=()=>{this._domElement&&this._domElement.ownerDocument.pointerLockElement===this._domElement||this.unlockPointer()},O=()=>{this.unlockPointer()};this._addAllEventListeners=_=>{this._domElement=_,this._domElement.style.touchAction="none",this._domElement.style.userSelect="none",this._domElement.style.webkitUserSelect="none",this._domElement.addEventListener("pointerdown",a),this._domElement.addEventListener("pointercancel",c),this._domElement.addEventListener("wheel",u,{passive:!1}),this._domElement.addEventListener("contextmenu",f)},this._removeAllEventListeners=()=>{this._domElement&&(this._domElement.style.touchAction="",this._domElement.style.userSelect="",this._domElement.style.webkitUserSelect="",this._domElement.removeEventListener("pointerdown",a),this._domElement.removeEventListener("pointercancel",c),this._domElement.removeEventListener("wheel",u,{passive:!1}),this._domElement.removeEventListener("contextmenu",f),this._domElement.ownerDocument.removeEventListener("pointermove",l,{passive:!1}),this._domElement.ownerDocument.removeEventListener("pointerup",c),this._domElement.ownerDocument.removeEventListener("pointerlockchange",y),this._domElement.ownerDocument.removeEventListener("pointerlockerror",O))},this.cancel=()=>{this._state!==v.NONE&&(this._state=v.NONE,this._activePointers.length=0,E())},t&&this.connect(t),this.update(0)}get camera(){return this._camera}set camera(e){this._camera=e,this.updateCameraUp(),this._camera.updateProjectionMatrix(),this._updateNearPlaneCorners(),this._needsUpdate=!0}get enabled(){return this._enabled}set enabled(e){this._enabled=e,this._domElement&&(e?(this._domElement.style.touchAction="none",this._domElement.style.userSelect="none",this._domElement.style.webkitUserSelect="none"):(this.cancel(),this._domElement.style.touchAction="",this._domElement.style.userSelect="",this._domElement.style.webkitUserSelect=""))}get active(){return!this._hasRested}get currentAction(){return this._state}get distance(){return this._spherical.radius}set distance(e){this._spherical.radius===e&&this._sphericalEnd.radius===e||(this._spherical.radius=e,this._sphericalEnd.radius=e,this._needsUpdate=!0)}get azimuthAngle(){return this._spherical.theta}set azimuthAngle(e){this._spherical.theta===e&&this._sphericalEnd.theta===e||(this._spherical.theta=e,this._sphericalEnd.theta=e,this._needsUpdate=!0)}get polarAngle(){return this._spherical.phi}set polarAngle(e){this._spherical.phi===e&&this._sphericalEnd.phi===e||(this._spherical.phi=e,this._sphericalEnd.phi=e,this._needsUpdate=!0)}get boundaryEnclosesCamera(){return this._boundaryEnclosesCamera}set boundaryEnclosesCamera(e){this._boundaryEnclosesCamera=e,this._needsUpdate=!0}set interactiveArea(e){this._interactiveArea.width=Ee(e.width,0,1),this._interactiveArea.height=Ee(e.height,0,1),this._interactiveArea.x=Ee(e.x,0,1-this._interactiveArea.width),this._interactiveArea.y=Ee(e.y,0,1-this._interactiveArea.height)}addEventListener(e,t){super.addEventListener(e,t)}removeEventListener(e,t){super.removeEventListener(e,t)}rotate(e,t,s=!1){return this.rotateTo(this._sphericalEnd.theta+e,this._sphericalEnd.phi+t,s)}rotateAzimuthTo(e,t=!1){return this.rotateTo(e,this._sphericalEnd.phi,t)}rotatePolarTo(e,t=!1){return this.rotateTo(this._sphericalEnd.theta,e,t)}rotateTo(e,t,s=!1){this._isUserControllingRotate=!1;const n=Ee(e,this.minAzimuthAngle,this.maxAzimuthAngle),r=Ee(t,this.minPolarAngle,this.maxPolarAngle);this._sphericalEnd.theta=n,this._sphericalEnd.phi=r,this._sphericalEnd.makeSafe(),this._needsUpdate=!0,s||(this._spherical.theta=this._sphericalEnd.theta,this._spherical.phi=this._sphericalEnd.phi);const a=!s||H(this._spherical.theta,this._sphericalEnd.theta,this.restThreshold)&&H(this._spherical.phi,this._sphericalEnd.phi,this.restThreshold);return this._createOnRestPromise(a)}dolly(e,t=!1){return this.dollyTo(this._sphericalEnd.radius-e,t)}dollyTo(e,t=!1){return this._isUserControllingDolly=!1,this._lastDollyDirection=Qe.NONE,this._changedDolly=0,this._dollyToNoClamp(Ee(e,this.minDistance,this.maxDistance),t)}_dollyToNoClamp(e,t=!1){const s=this._sphericalEnd.radius;if(this.colliderMeshes.length>=1){const a=this._collisionTest(),l=H(a,this._spherical.radius);if(!(s>e)&&l)return Promise.resolve();this._sphericalEnd.radius=Math.min(e,a)}else this._sphericalEnd.radius=e;this._needsUpdate=!0,t||(this._spherical.radius=this._sphericalEnd.radius);const r=!t||H(this._spherical.radius,this._sphericalEnd.radius,this.restThreshold);return this._createOnRestPromise(r)}dollyInFixed(e,t=!1){this._targetEnd.add(this._getCameraDirection(ht).multiplyScalar(e)),t||this._target.copy(this._targetEnd);const s=!t||H(this._target.x,this._targetEnd.x,this.restThreshold)&&H(this._target.y,this._targetEnd.y,this.restThreshold)&&H(this._target.z,this._targetEnd.z,this.restThreshold);return this._createOnRestPromise(s)}zoom(e,t=!1){return this.zoomTo(this._zoomEnd+e,t)}zoomTo(e,t=!1){this._isUserControllingZoom=!1,this._zoomEnd=Ee(e,this.minZoom,this.maxZoom),this._needsUpdate=!0,t||(this._zoom=this._zoomEnd);const s=!t||H(this._zoom,this._zoomEnd,this.restThreshold);return this._changedZoom=0,this._createOnRestPromise(s)}pan(e,t,s=!1){return console.warn("`pan` has been renamed to `truck`"),this.truck(e,t,s)}truck(e,t,s=!1){this._camera.updateMatrix(),Se.setFromMatrixColumn(this._camera.matrix,0),we.setFromMatrixColumn(this._camera.matrix,1),Se.multiplyScalar(e),we.multiplyScalar(-t);const n=U.copy(Se).add(we),r=F.copy(this._targetEnd).add(n);return this.moveTo(r.x,r.y,r.z,s)}forward(e,t=!1){U.setFromMatrixColumn(this._camera.matrix,0),U.crossVectors(this._camera.up,U),U.multiplyScalar(e);const s=F.copy(this._targetEnd).add(U);return this.moveTo(s.x,s.y,s.z,t)}elevate(e,t=!1){return U.copy(this._camera.up).multiplyScalar(e),this.moveTo(this._targetEnd.x+U.x,this._targetEnd.y+U.y,this._targetEnd.z+U.z,t)}moveTo(e,t,s,n=!1){this._isUserControllingTruck=!1;const r=U.set(e,t,s).sub(this._targetEnd);this._encloseToBoundary(this._targetEnd,r,this.boundaryFriction),this._needsUpdate=!0,n||this._target.copy(this._targetEnd);const a=!n||H(this._target.x,this._targetEnd.x,this.restThreshold)&&H(this._target.y,this._targetEnd.y,this.restThreshold)&&H(this._target.z,this._targetEnd.z,this.restThreshold);return this._createOnRestPromise(a)}lookInDirectionOf(e,t,s,n=!1){const l=U.set(e,t,s).sub(this._targetEnd).normalize().multiplyScalar(-this._sphericalEnd.radius).add(this._targetEnd);return this.setPosition(l.x,l.y,l.z,n)}fitToBox(e,t,{cover:s=!1,paddingLeft:n=0,paddingRight:r=0,paddingBottom:a=0,paddingTop:l=0}={}){const c=[],h=e.isBox3?Je.copy(e):Je.setFromObject(e);h.isEmpty()&&(console.warn("camera-controls: fitTo() cannot be used with an empty box. Aborting"),Promise.resolve());const u=$i(this._sphericalEnd.theta,Ki),f=$i(this._sphericalEnd.phi,Ki);c.push(this.rotateTo(u,f,t));const m=U.setFromSpherical(this._sphericalEnd).normalize(),g=ns.setFromUnitVectors(m,ni),E=H(Math.abs(m.y),1);E&&g.multiply(ri.setFromAxisAngle(Pt,u)),g.multiply(this._yAxisUpSpaceInverse);const y=ss.makeEmpty();F.copy(h.min).applyQuaternion(g),y.expandByPoint(F),F.copy(h.min).setX(h.max.x).applyQuaternion(g),y.expandByPoint(F),F.copy(h.min).setY(h.max.y).applyQuaternion(g),y.expandByPoint(F),F.copy(h.max).setZ(h.min.z).applyQuaternion(g),y.expandByPoint(F),F.copy(h.min).setZ(h.max.z).applyQuaternion(g),y.expandByPoint(F),F.copy(h.max).setY(h.min.y).applyQuaternion(g),y.expandByPoint(F),F.copy(h.max).setX(h.min.x).applyQuaternion(g),y.expandByPoint(F),F.copy(h.max).applyQuaternion(g),y.expandByPoint(F),y.min.x-=n,y.min.y-=a,y.max.x+=r,y.max.y+=l,g.setFromUnitVectors(ni,m),E&&g.premultiply(ri.invert()),g.premultiply(this._yAxisUpSpace);const O=y.getSize(U),_=y.getCenter(F).applyQuaternion(g);if(je(this._camera)){const b=this.getDistanceToFitBox(O.x,O.y,O.z,s);c.push(this.moveTo(_.x,_.y,_.z,t)),c.push(this.dollyTo(b,t)),c.push(this.setFocalOffset(0,0,0,t))}else if(ke(this._camera)){const b=this._camera,S=b.right-b.left,w=b.top-b.bottom,x=s?Math.max(S/O.x,w/O.y):Math.min(S/O.x,w/O.y);c.push(this.moveTo(_.x,_.y,_.z,t)),c.push(this.zoomTo(x,t)),c.push(this.setFocalOffset(0,0,0,t))}return Promise.all(c)}fitToSphere(e,t){const s=[],r="isObject3D"in e?Oe.createBoundingSphere(e,ai):ai.copy(e);if(s.push(this.moveTo(r.center.x,r.center.y,r.center.z,t)),je(this._camera)){const a=this.getDistanceToFitSphere(r.radius);s.push(this.dollyTo(a,t))}else if(ke(this._camera)){const a=this._camera.right-this._camera.left,l=this._camera.top-this._camera.bottom,c=2*r.radius,h=Math.min(a/c,l/c);s.push(this.zoomTo(h,t))}return s.push(this.setFocalOffset(0,0,0,t)),Promise.all(s)}setLookAt(e,t,s,n,r,a,l=!1){this._isUserControllingRotate=!1,this._isUserControllingDolly=!1,this._isUserControllingTruck=!1,this._lastDollyDirection=Qe.NONE,this._changedDolly=0;const c=F.set(n,r,a),h=U.set(e,t,s);this._targetEnd.copy(c),this._sphericalEnd.setFromVector3(h.sub(c).applyQuaternion(this._yAxisUpSpace)),this.normalizeRotations(),this._needsUpdate=!0,l||(this._target.copy(this._targetEnd),this._spherical.copy(this._sphericalEnd));const u=!l||H(this._target.x,this._targetEnd.x,this.restThreshold)&&H(this._target.y,this._targetEnd.y,this.restThreshold)&&H(this._target.z,this._targetEnd.z,this.restThreshold)&&H(this._spherical.theta,this._sphericalEnd.theta,this.restThreshold)&&H(this._spherical.phi,this._sphericalEnd.phi,this.restThreshold)&&H(this._spherical.radius,this._sphericalEnd.radius,this.restThreshold);return this._createOnRestPromise(u)}lerpLookAt(e,t,s,n,r,a,l,c,h,u,f,m,g,E=!1){this._isUserControllingRotate=!1,this._isUserControllingDolly=!1,this._isUserControllingTruck=!1,this._lastDollyDirection=Qe.NONE,this._changedDolly=0;const y=U.set(n,r,a),O=F.set(e,t,s);ve.setFromVector3(O.sub(y).applyQuaternion(this._yAxisUpSpace));const _=$e.set(u,f,m),b=F.set(l,c,h);dt.setFromVector3(b.sub(_).applyQuaternion(this._yAxisUpSpace)),this._targetEnd.copy(y.lerp(_,g));const S=dt.theta-ve.theta,w=dt.phi-ve.phi,x=dt.radius-ve.radius;this._sphericalEnd.set(ve.radius+x*g,ve.phi+w*g,ve.theta+S*g),this.normalizeRotations(),this._needsUpdate=!0,E||(this._target.copy(this._targetEnd),this._spherical.copy(this._sphericalEnd));const M=!E||H(this._target.x,this._targetEnd.x,this.restThreshold)&&H(this._target.y,this._targetEnd.y,this.restThreshold)&&H(this._target.z,this._targetEnd.z,this.restThreshold)&&H(this._spherical.theta,this._sphericalEnd.theta,this.restThreshold)&&H(this._spherical.phi,this._sphericalEnd.phi,this.restThreshold)&&H(this._spherical.radius,this._sphericalEnd.radius,this.restThreshold);return this._createOnRestPromise(M)}setPosition(e,t,s,n=!1){return this.setLookAt(e,t,s,this._targetEnd.x,this._targetEnd.y,this._targetEnd.z,n)}setTarget(e,t,s,n=!1){const r=this.getPosition(U),a=this.setLookAt(r.x,r.y,r.z,e,t,s,n);return this._sphericalEnd.phi=Ee(this._sphericalEnd.phi,this.minPolarAngle,this.maxPolarAngle),a}setFocalOffset(e,t,s,n=!1){this._isUserControllingOffset=!1,this._focalOffsetEnd.set(e,t,s),this._needsUpdate=!0,n||this._focalOffset.copy(this._focalOffsetEnd);const r=!n||H(this._focalOffset.x,this._focalOffsetEnd.x,this.restThreshold)&&H(this._focalOffset.y,this._focalOffsetEnd.y,this.restThreshold)&&H(this._focalOffset.z,this._focalOffsetEnd.z,this.restThreshold);return this._createOnRestPromise(r)}setOrbitPoint(e,t,s){this._camera.updateMatrixWorld(),Se.setFromMatrixColumn(this._camera.matrixWorldInverse,0),we.setFromMatrixColumn(this._camera.matrixWorldInverse,1),Ne.setFromMatrixColumn(this._camera.matrixWorldInverse,2);const n=U.set(e,t,s),r=n.distanceTo(this._camera.position),a=n.sub(this._camera.position);Se.multiplyScalar(a.x),we.multiplyScalar(a.y),Ne.multiplyScalar(a.z),U.copy(Se).add(we).add(Ne),U.z=U.z+r,this.dollyTo(r,!1),this.setFocalOffset(-U.x,U.y,-U.z,!1),this.moveTo(e,t,s,!1)}setBoundary(e){if(!e){this._boundary.min.set(-1/0,-1/0,-1/0),this._boundary.max.set(1/0,1/0,1/0),this._needsUpdate=!0;return}this._boundary.copy(e),this._boundary.clampPoint(this._targetEnd,this._targetEnd),this._needsUpdate=!0}setViewport(e,t,s,n){if(e===null){this._viewport=null;return}this._viewport=this._viewport||new I.Vector4,typeof e=="number"?this._viewport.set(e,t,s,n):this._viewport.copy(e)}getDistanceToFitBox(e,t,s,n=!1){if(ii(this._camera,"getDistanceToFitBox"))return this._spherical.radius;const r=e/t,a=this._camera.getEffectiveFOV()*ot,l=this._camera.aspect;return((n?r>l:r<l)?t:e/l)*.5/Math.tan(a*.5)+s*.5}getDistanceToFitSphere(e){if(ii(this._camera,"getDistanceToFitSphere"))return this._spherical.radius;const t=this._camera.getEffectiveFOV()*ot,s=Math.atan(Math.tan(t*.5)*this._camera.aspect)*2,n=1<this._camera.aspect?t:s;return e/Math.sin(n*.5)}getTarget(e,t=!0){return(e&&e.isVector3?e:new I.Vector3).copy(t?this._targetEnd:this._target)}getPosition(e,t=!0){return(e&&e.isVector3?e:new I.Vector3).setFromSpherical(t?this._sphericalEnd:this._spherical).applyQuaternion(this._yAxisUpSpaceInverse).add(t?this._targetEnd:this._target)}getSpherical(e,t=!0){return(e||new I.Spherical).copy(t?this._sphericalEnd:this._spherical)}getFocalOffset(e,t=!0){return(e&&e.isVector3?e:new I.Vector3).copy(t?this._focalOffsetEnd:this._focalOffset)}normalizeRotations(){this._sphericalEnd.theta=this._sphericalEnd.theta%Ke,this._sphericalEnd.theta<0&&(this._sphericalEnd.theta+=Ke),this._spherical.theta+=Ke*Math.round((this._sphericalEnd.theta-this._spherical.theta)/Ke)}stop(){this._focalOffset.copy(this._focalOffsetEnd),this._target.copy(this._targetEnd),this._spherical.copy(this._sphericalEnd),this._zoom=this._zoomEnd}reset(e=!1){if(!H(this._camera.up.x,this._cameraUp0.x)||!H(this._camera.up.y,this._cameraUp0.y)||!H(this._camera.up.z,this._cameraUp0.z)){this._camera.up.copy(this._cameraUp0);const s=this.getPosition(U);this.updateCameraUp(),this.setPosition(s.x,s.y,s.z)}const t=[this.setLookAt(this._position0.x,this._position0.y,this._position0.z,this._target0.x,this._target0.y,this._target0.z,e),this.setFocalOffset(this._focalOffset0.x,this._focalOffset0.y,this._focalOffset0.z,e),this.zoomTo(this._zoom0,e)];return Promise.all(t)}saveState(){this._cameraUp0.copy(this._camera.up),this.getTarget(this._target0),this.getPosition(this._position0),this._zoom0=this._zoom,this._focalOffset0.copy(this._focalOffset)}updateCameraUp(){this._yAxisUpSpace.setFromUnitVectors(this._camera.up,Pt),this._yAxisUpSpaceInverse.copy(this._yAxisUpSpace).invert()}applyCameraUp(){const e=U.subVectors(this._target,this._camera.position).normalize(),t=F.crossVectors(e,this._camera.up);this._camera.up.crossVectors(t,e).normalize(),this._camera.updateMatrixWorld();const s=this.getPosition(U);this.updateCameraUp(),this.setPosition(s.x,s.y,s.z)}update(e){const t=this._sphericalEnd.theta-this._spherical.theta,s=this._sphericalEnd.phi-this._spherical.phi,n=this._sphericalEnd.radius-this._spherical.radius,r=ts.subVectors(this._targetEnd,this._target),a=is.subVectors(this._focalOffsetEnd,this._focalOffset),l=this._zoomEnd-this._zoom;if(q(t))this._thetaVelocity.value=0,this._spherical.theta=this._sphericalEnd.theta;else{const f=this._isUserControllingRotate?this.draggingSmoothTime:this.smoothTime;this._spherical.theta=Mt(this._spherical.theta,this._sphericalEnd.theta,this._thetaVelocity,f,1/0,e),this._needsUpdate=!0}if(q(s))this._phiVelocity.value=0,this._spherical.phi=this._sphericalEnd.phi;else{const f=this._isUserControllingRotate?this.draggingSmoothTime:this.smoothTime;this._spherical.phi=Mt(this._spherical.phi,this._sphericalEnd.phi,this._phiVelocity,f,1/0,e),this._needsUpdate=!0}if(q(n))this._radiusVelocity.value=0,this._spherical.radius=this._sphericalEnd.radius;else{const f=this._isUserControllingDolly?this.draggingSmoothTime:this.smoothTime;this._spherical.radius=Mt(this._spherical.radius,this._sphericalEnd.radius,this._radiusVelocity,f,this.maxSpeed,e),this._needsUpdate=!0}if(q(r.x)&&q(r.y)&&q(r.z))this._targetVelocity.set(0,0,0),this._target.copy(this._targetEnd);else{const f=this._isUserControllingTruck?this.draggingSmoothTime:this.smoothTime;Ji(this._target,this._targetEnd,this._targetVelocity,f,this.maxSpeed,e,this._target),this._needsUpdate=!0}if(q(a.x)&&q(a.y)&&q(a.z))this._focalOffsetVelocity.set(0,0,0),this._focalOffset.copy(this._focalOffsetEnd);else{const f=this._isUserControllingOffset?this.draggingSmoothTime:this.smoothTime;Ji(this._focalOffset,this._focalOffsetEnd,this._focalOffsetVelocity,f,this.maxSpeed,e,this._focalOffset),this._needsUpdate=!0}if(q(l))this._zoomVelocity.value=0,this._zoom=this._zoomEnd;else{const f=this._isUserControllingZoom?this.draggingSmoothTime:this.smoothTime;this._zoom=Mt(this._zoom,this._zoomEnd,this._zoomVelocity,f,1/0,e)}if(this.dollyToCursor){if(je(this._camera)&&this._changedDolly!==0){const f=this._spherical.radius-this._lastDistance,m=this._camera,g=this._getCameraDirection(ht),E=U.copy(g).cross(m.up).normalize();E.lengthSq()===0&&(E.x=1);const y=F.crossVectors(E,g),O=this._sphericalEnd.radius*Math.tan(m.getEffectiveFOV()*ot*.5),b=(this._sphericalEnd.radius-f-this._sphericalEnd.radius)/this._sphericalEnd.radius,S=$e.copy(this._targetEnd).add(E.multiplyScalar(this._dollyControlCoord.x*O*m.aspect)).add(y.multiplyScalar(this._dollyControlCoord.y*O)),w=U.copy(this._targetEnd).lerp(S,b),x=this._lastDollyDirection===Qe.IN&&this._spherical.radius<=this.minDistance,M=this._lastDollyDirection===Qe.OUT&&this.maxDistance<=this._spherical.radius;if(this.infinityDolly&&(x||M)){this._sphericalEnd.radius-=f,this._spherical.radius-=f;const k=F.copy(g).multiplyScalar(-f);w.add(k)}this._boundary.clampPoint(w,w);const D=F.subVectors(w,this._targetEnd);this._targetEnd.copy(w),this._target.add(D),this._changedDolly-=f,q(this._changedDolly)&&(this._changedDolly=0)}else if(ke(this._camera)&&this._changedZoom!==0){const f=this._zoom-this._lastZoom,m=this._camera,g=U.set(this._dollyControlCoord.x,this._dollyControlCoord.y,(m.near+m.far)/(m.near-m.far)).unproject(m),E=F.set(0,0,-1).applyQuaternion(m.quaternion),y=$e.copy(g).add(E.multiplyScalar(-g.dot(m.up))),_=-(this._zoom-f-this._zoom)/this._zoom,b=this._getCameraDirection(ht),S=this._targetEnd.dot(b),w=U.copy(this._targetEnd).lerp(y,_),x=w.dot(b),M=b.multiplyScalar(x-S);w.sub(M),this._boundary.clampPoint(w,w);const D=F.subVectors(w,this._targetEnd);this._targetEnd.copy(w),this._target.add(D),this._changedZoom-=f,q(this._changedZoom)&&(this._changedZoom=0)}}this._camera.zoom!==this._zoom&&(this._camera.zoom=this._zoom,this._camera.updateProjectionMatrix(),this._updateNearPlaneCorners(),this._needsUpdate=!0),this._dragNeedsUpdate=!0;const c=this._collisionTest();this._spherical.radius=Math.min(this._spherical.radius,c),this._spherical.makeSafe(),this._camera.position.setFromSpherical(this._spherical).applyQuaternion(this._yAxisUpSpaceInverse).add(this._target),this._camera.lookAt(this._target),(!q(this._focalOffset.x)||!q(this._focalOffset.y)||!q(this._focalOffset.z))&&(this._camera.updateMatrixWorld(),Se.setFromMatrixColumn(this._camera.matrix,0),we.setFromMatrixColumn(this._camera.matrix,1),Ne.setFromMatrixColumn(this._camera.matrix,2),Se.multiplyScalar(this._focalOffset.x),we.multiplyScalar(-this._focalOffset.y),Ne.multiplyScalar(this._focalOffset.z),U.copy(Se).add(we).add(Ne),this._camera.position.add(U)),this._boundaryEnclosesCamera&&this._encloseToBoundary(this._camera.position.copy(this._target),U.setFromSpherical(this._spherical).applyQuaternion(this._yAxisUpSpaceInverse),1);const u=this._needsUpdate;return u&&!this._updatedLastTime?(this._hasRested=!1,this.dispatchEvent({type:"wake"}),this.dispatchEvent({type:"update"})):u?(this.dispatchEvent({type:"update"}),q(t,this.restThreshold)&&q(s,this.restThreshold)&&q(n,this.restThreshold)&&q(r.x,this.restThreshold)&&q(r.y,this.restThreshold)&&q(r.z,this.restThreshold)&&q(a.x,this.restThreshold)&&q(a.y,this.restThreshold)&&q(a.z,this.restThreshold)&&q(l,this.restThreshold)&&!this._hasRested&&(this._hasRested=!0,this.dispatchEvent({type:"rest"}))):!u&&this._updatedLastTime&&this.dispatchEvent({type:"sleep"}),this._lastDistance=this._spherical.radius,this._lastZoom=this._zoom,this._updatedLastTime=u,this._needsUpdate=!1,u}toJSON(){return JSON.stringify({enabled:this._enabled,minDistance:this.minDistance,maxDistance:lt(this.maxDistance),minZoom:this.minZoom,maxZoom:lt(this.maxZoom),minPolarAngle:this.minPolarAngle,maxPolarAngle:lt(this.maxPolarAngle),minAzimuthAngle:lt(this.minAzimuthAngle),maxAzimuthAngle:lt(this.maxAzimuthAngle),smoothTime:this.smoothTime,draggingSmoothTime:this.draggingSmoothTime,dollySpeed:this.dollySpeed,truckSpeed:this.truckSpeed,dollyToCursor:this.dollyToCursor,verticalDragToForward:this.verticalDragToForward,target:this._targetEnd.toArray(),position:U.setFromSpherical(this._sphericalEnd).add(this._targetEnd).toArray(),zoom:this._zoomEnd,focalOffset:this._focalOffsetEnd.toArray(),target0:this._target0.toArray(),position0:this._position0.toArray(),zoom0:this._zoom0,focalOffset0:this._focalOffset0.toArray()})}fromJSON(e,t=!1){const s=JSON.parse(e);this.enabled=s.enabled,this.minDistance=s.minDistance,this.maxDistance=ct(s.maxDistance),this.minZoom=s.minZoom,this.maxZoom=ct(s.maxZoom),this.minPolarAngle=s.minPolarAngle,this.maxPolarAngle=ct(s.maxPolarAngle),this.minAzimuthAngle=ct(s.minAzimuthAngle),this.maxAzimuthAngle=ct(s.maxAzimuthAngle),this.smoothTime=s.smoothTime,this.draggingSmoothTime=s.draggingSmoothTime,this.dollySpeed=s.dollySpeed,this.truckSpeed=s.truckSpeed,this.dollyToCursor=s.dollyToCursor,this.verticalDragToForward=s.verticalDragToForward,this._target0.fromArray(s.target0),this._position0.fromArray(s.position0),this._zoom0=s.zoom0,this._focalOffset0.fromArray(s.focalOffset0),this.moveTo(s.target[0],s.target[1],s.target[2],t),ve.setFromVector3(U.fromArray(s.position).sub(this._targetEnd).applyQuaternion(this._yAxisUpSpace)),this.rotateTo(ve.theta,ve.phi,t),this.dollyTo(ve.radius,t),this.zoomTo(s.zoom,t),this.setFocalOffset(s.focalOffset[0],s.focalOffset[1],s.focalOffset[2],t),this._needsUpdate=!0}connect(e){if(this._domElement){console.warn("camera-controls is already connected.");return}e.setAttribute("data-camera-controls-version",ka),this._addAllEventListeners(e),this._getClientRect(this._elementRect)}disconnect(){this.cancel(),this._removeAllEventListeners(),this._domElement&&(this._domElement.removeAttribute("data-camera-controls-version"),this._domElement=void 0)}dispose(){this.removeAllEventListeners(),this.disconnect()}_getTargetDirection(e){return e.setFromSpherical(this._spherical).divideScalar(this._spherical.radius).applyQuaternion(this._yAxisUpSpaceInverse)}_getCameraDirection(e){return this._getTargetDirection(e).negate()}_findPointerById(e){return this._activePointers.find(t=>t.pointerId===e)}_findPointerByMouseButton(e){return this._activePointers.find(t=>t.mouseButton===e)}_disposePointer(e){this._activePointers.splice(this._activePointers.indexOf(e),1)}_encloseToBoundary(e,t,s){const n=t.lengthSq();if(n===0)return e;const r=F.copy(t).add(e),l=this._boundary.clampPoint(r,$e).sub(r),c=l.lengthSq();if(c===0)return e.add(t);if(c===n)return e;if(s===0)return e.add(t).add(l);{const h=1+s*c/t.dot(l);return e.add(F.copy(t).multiplyScalar(h)).add(l.multiplyScalar(1-s))}}_updateNearPlaneCorners(){if(je(this._camera)){const e=this._camera,t=e.near,s=e.getEffectiveFOV()*ot,n=Math.tan(s*.5)*t,r=n*e.aspect;this._nearPlaneCorners[0].set(-r,-n,0),this._nearPlaneCorners[1].set(r,-n,0),this._nearPlaneCorners[2].set(r,n,0),this._nearPlaneCorners[3].set(-r,n,0)}else if(ke(this._camera)){const e=this._camera,t=1/e.zoom,s=e.left*t,n=e.right*t,r=e.top*t,a=e.bottom*t;this._nearPlaneCorners[0].set(s,r,0),this._nearPlaneCorners[1].set(n,r,0),this._nearPlaneCorners[2].set(n,a,0),this._nearPlaneCorners[3].set(s,a,0)}}_collisionTest(){let e=1/0;if(!(this.colliderMeshes.length>=1)||ii(this._camera,"_collisionTest"))return e;const s=this._getTargetDirection(ht);oi.lookAt(es,s,this._camera.up);for(let n=0;n<4;n++){const r=F.copy(this._nearPlaneCorners[n]);r.applyMatrix4(oi);const a=$e.addVectors(this._target,r);Rt.set(a,s),Rt.far=this._spherical.radius+1;const l=Rt.intersectObjects(this.colliderMeshes);l.length!==0&&l[0].distance<e&&(e=l[0].distance)}return e}_getClientRect(e){if(!this._domElement)return;const t=this._domElement.getBoundingClientRect();return e.x=t.left,e.y=t.top,this._viewport?(e.x+=this._viewport.x,e.y+=t.height-this._viewport.w-this._viewport.y,e.width=this._viewport.z,e.height=this._viewport.w):(e.width=t.width,e.height=t.height),e}_createOnRestPromise(e){return e?Promise.resolve():(this._hasRested=!1,this.dispatchEvent({type:"transitionstart"}),new Promise(t=>{const s=()=>{this.removeEventListener("rest",s),t()};this.addEventListener("rest",s)}))}_addAllEventListeners(e){}_removeAllEventListeners(){}get dampingFactor(){return console.warn(".dampingFactor has been deprecated. use smoothTime (in seconds) instead."),0}set dampingFactor(e){console.warn(".dampingFactor has been deprecated. use smoothTime (in seconds) instead.")}get draggingDampingFactor(){return console.warn(".draggingDampingFactor has been deprecated. use draggingSmoothTime (in seconds) instead."),0}set draggingDampingFactor(e){console.warn(".draggingDampingFactor has been deprecated. use draggingSmoothTime (in seconds) instead.")}static createBoundingSphere(e,t=new I.Sphere){const s=t,n=s.center;Je.makeEmpty(),e.traverseVisible(a=>{a.isMesh&&Je.expandByObject(a)}),Je.getCenter(n);let r=0;return e.traverseVisible(a=>{if(!a.isMesh)return;const l=a,c=l.geometry.clone();c.applyMatrix4(l.matrixWorld);const u=c.attributes.position;for(let f=0,m=u.count;f<m;f++)U.fromBufferAttribute(u,f),r=Math.max(r,n.distanceToSquared(U))}),s.radius=Math.sqrt(r),s}}const zt=i=>{const[e,t]=T.useState(i.options[i.index]),s=()=>{i.onToggle(!i.open)},n=r=>{r!==e&&(i.onSelect(r),t(r)),i.onToggle(!1)};return p.jsxs("div",{className:`dropdown ${i.up===!0?"up":""}`,children:[p.jsx("div",{className:"dropdown-toggle",onClick:s,children:`${i.title}: ${e}`}),i.open&&p.jsx("ul",{className:"dropdown-menu",children:i.options.map(r=>p.jsx("li",{onClick:()=>n(r),children:r},r))})]})},Fe=T.forwardRef(function(e,t){const s=["Renderer","Depth","Normals","UVs","Wireframe"],[n,r]=T.useState("Renderer"),[a,l]=T.useState(!1),[c,h]=T.useState(!1),[u,f]=T.useState(!1);return p.jsxs("div",{className:`CameraWindow ${e.name}`,children:[p.jsx("div",{ref:t,className:"clickable",onClick:()=>{u&&f(!1)}}),p.jsxs("div",{className:"options",children:[e.camera!==null&&p.jsx(zt,{title:"Camera",index:e.options.indexOf(e.camera.name),open:u,options:e.options,onSelect:e.onSelectCamera,onToggle:m=>{f(m)},up:!0}),p.jsx(zt,{title:"Mode",index:s.indexOf(n),open:c,options:s,onSelect:m=>{if(m===n)return;const g=m;e.onSelectRenderMode(g),r(g)},onToggle:m=>{a&&l(!1),h(m)},up:!0})]})]})}),ja=`out vec3 worldPosition;
53
+ uniform float uDistance;
54
+
55
+ void main() {
56
+ // Scale the plane by the drawing distance
57
+ worldPosition = position.xzy * uDistance;
58
+ worldPosition.xz += cameraPosition.xz;
59
+
60
+ gl_Position = projectionMatrix * modelViewMatrix * vec4(worldPosition, 1.0);
61
+ }`,Na=`out vec4 fragColor;
62
+ in vec3 worldPosition;
63
+ uniform float uDivisions;
64
+ uniform float uScale;
65
+ uniform vec3 uColor;
66
+ uniform float uDistance;
67
+ uniform float uGridOpacity;
68
+ uniform float uSubgridOpacity;
69
+
70
+ float getGrid(float gapSize) {
71
+ vec2 worldPositionByDivision = worldPosition.xz / gapSize;
72
+
73
+ // Inverted, 0 where line, >1 where there's no line
74
+ // We use the worldPosition (which in this case we use similarly to UVs) differential to control the anti-aliasing
75
+ // We need to do the -0.5)-0.5 trick because the result fades out from 0 to 1, and we want both
76
+ // worldPositionByDivision == 0.3 and worldPositionByDivision == 0.7 to result in the same fade, i.e. 0.3,
77
+ // otherwise only one side of the line will be anti-aliased
78
+ vec2 grid = abs(fract(worldPositionByDivision-0.5)-0.5) / fwidth(worldPositionByDivision) / 2.0;
79
+ float gridLine = min(grid.x, grid.y);
80
+
81
+ // Uninvert and clamp
82
+ return 1.0 - min(gridLine, 1.0);
83
+ }
84
+
85
+ void main() {
86
+ float cameraDistanceToGridPlane = max(200.0, distance(cameraPosition.y, worldPosition.y));
87
+ float cameraDistanceToFragmentOnGridPlane = distance(cameraPosition.xyz, worldPosition.xyz);
88
+
89
+ // The size of the grid and subgrid are powers of each other and they are determined based on camera distance.
90
+ // The current grid will become the next subgrid when it becomes too small, and its next power becomes the new grid.
91
+ float subGridPower = pow(uDivisions, floor(log(cameraDistanceToGridPlane) / log(uDivisions)));
92
+ float gridPower = subGridPower * uDivisions;
93
+
94
+ // If we want to fade both the grid and its subgrid, we need to displays 3 different opacities, with the next grid being the third
95
+ float nextGridPower = gridPower * uDivisions;
96
+
97
+ // 1 where grid, 0 where no grid
98
+ float subgrid = getGrid(subGridPower * uScale);
99
+ float grid = getGrid(gridPower * uScale);
100
+ float nextGrid = getGrid(nextGridPower * uScale);
101
+
102
+ // Where we are between the introduction of the current grid power and when we switch to the next grid power
103
+ float stepPercentage = (cameraDistanceToGridPlane - subGridPower)/(gridPower - subGridPower);
104
+
105
+ // The last x percentage of the current step over which we want to fade
106
+ float fadeRange = 0.3;
107
+
108
+ // We calculate the fade percentage from the step percentage and the fade range
109
+ float fadePercentage = max(stepPercentage - 1.0 + fadeRange, 0.0) / fadeRange;
110
+
111
+ // Set base opacity based on how close we are to the drawing distance, with a cubic falloff
112
+ float baseOpacity = subgrid * pow(1.0 - min(cameraDistanceToFragmentOnGridPlane / uDistance, 1.0), 3.0);
113
+
114
+ // Shade the subgrid
115
+ fragColor = vec4(uColor.rgb, (baseOpacity - fadePercentage) * uSubgridOpacity);
116
+
117
+ // Somewhat arbitrary additional fade coefficient to counter anti-aliasing popping when switching between grid powers
118
+ float fadeCoefficient = 0.5;
119
+
120
+ // Shade the grid
121
+ fragColor.a = mix(fragColor.a, baseOpacity * uGridOpacity - fadePercentage * (uGridOpacity - uSubgridOpacity) * fadeCoefficient, grid);
122
+
123
+ // Shade the next grid
124
+ fragColor.a = mix(fragColor.a, baseOpacity * uGridOpacity, nextGrid);
125
+
126
+ if (fragColor.a <= 0.0) discard;
127
+ }`;class Fa extends o.ShaderMaterial{constructor(e){super({extensions:{derivatives:!0},uniforms:{uScale:{value:e?.scale!==void 0?e?.scale:.1},uDivisions:{value:e?.divisions!==void 0?e?.divisions:10},uColor:{value:e?.color!==void 0?e?.color:new o.Color(16777215)},uDistance:{value:e?.distance!==void 0?e?.distance:1e4},uSubgridOpacity:{value:e?.subgridOpacity!==void 0?e?.subgridOpacity:.15},uGridOpacity:{value:e?.gridOpacity!==void 0?e?.gridOpacity:.25}},glslVersion:o.GLSL3,side:o.DoubleSide,transparent:!0,name:"InfiniteGrid",vertexShader:ja,fragmentShader:Na})}}class za extends o.Mesh{gridMaterial;constructor(e){const t=new Fa(e);super(new o.PlaneGeometry,t),this.gridMaterial=t,this.frustumCulled=!1,this.name="InfiniteGridHelper"}update(){this.gridMaterial.needsUpdate=!0}}function li(i){const[e,t]=T.useState(i.selected),s="toggle"+(e?" selected":"");return p.jsx("button",{className:s,onClick:()=>{const n=!e;t(n),i.onClick(n)},style:{backgroundImage:`url(${i.icon})`,backgroundPositionX:"center",backgroundPositionY:i.top!==void 0?`${i.top}px`:"center",backgroundSize:`${i.width!==void 0?`${i.width}px`:"26px"} ${i.height}px`}},i.name)}const Ha=`#include <common>
128
+ #include <batching_pars_vertex>
129
+ #include <uv_pars_vertex>
130
+ #include <color_pars_vertex>
131
+ #include <morphtarget_pars_vertex>
132
+ #include <skinning_pars_vertex>
133
+ #include <logdepthbuf_pars_vertex>
134
+ #include <clipping_planes_pars_vertex>
135
+
136
+ void main() {
137
+ #include <uv_vertex>
138
+ #include <color_vertex>
139
+ #include <morphcolor_vertex>
140
+ #include <batching_vertex>
141
+
142
+ #if defined ( USE_SKINNING )
143
+ #include <beginnormal_vertex>
144
+ #include <morphnormal_vertex>
145
+ #include <skinbase_vertex>
146
+ #include <skinnormal_vertex>
147
+ #include <defaultnormal_vertex>
148
+ #endif
149
+
150
+ #include <begin_vertex>
151
+ #include <morphtarget_vertex>
152
+ #include <skinning_vertex>
153
+ #include <project_vertex>
154
+ #include <logdepthbuf_vertex>
155
+ #include <clipping_planes_vertex>
156
+ #include <worldpos_vertex>
157
+ }`,Va=`
158
+ #include <common>
159
+ #include <uv_pars_fragment>
160
+ #include <clipping_planes_pars_fragment>
161
+
162
+ void main() {
163
+ #include <clipping_planes_fragment>
164
+ gl_FragColor = vec4(vec3(vUv, 0.0), 1.0);
165
+ }`;class Ba extends o.ShaderMaterial{constructor(){super({defines:{USE_UV:""},vertexShader:Ha,fragmentShader:Va})}}const ze=new o.Raycaster,ce=new o.Vector3,Le=new o.Vector3,K=new o.Quaternion,as={X:new o.Vector3(1,0,0),Y:new o.Vector3(0,1,0),Z:new o.Vector3(0,0,1)},ci={type:"change"},rs={type:"mouseDown",mode:null},os={type:"mouseUp",mode:null},ls={type:"objectChange"};class Ya extends o.Controls{constructor(e,t=null){super(void 0,t);const s=new Qa(this);this._root=s;const n=new Ka;this._gizmo=n,s.add(n);const r=new $a;this._plane=r,s.add(r);const a=this;function l(S,w){let x=w;Object.defineProperty(a,S,{get:function(){return x!==void 0?x:w},set:function(M){x!==M&&(x=M,r[S]=M,n[S]=M,a.dispatchEvent({type:S+"-changed",value:M}),a.dispatchEvent(ci))}}),a[S]=w,r[S]=w,n[S]=w}l("camera",e),l("object",void 0),l("enabled",!0),l("axis",null),l("mode","translate"),l("translationSnap",null),l("rotationSnap",null),l("scaleSnap",null),l("space","world"),l("size",1),l("dragging",!1),l("showX",!0),l("showY",!0),l("showZ",!0);const c=new o.Vector3,h=new o.Vector3,u=new o.Quaternion,f=new o.Quaternion,m=new o.Vector3,g=new o.Quaternion,E=new o.Vector3,y=new o.Vector3,O=new o.Vector3,_=0,b=new o.Vector3;l("worldPosition",c),l("worldPositionStart",h),l("worldQuaternion",u),l("worldQuaternionStart",f),l("cameraPosition",m),l("cameraQuaternion",g),l("pointStart",E),l("pointEnd",y),l("rotationAxis",O),l("rotationAngle",_),l("eye",b),this._offset=new o.Vector3,this._startNorm=new o.Vector3,this._endNorm=new o.Vector3,this._cameraScale=new o.Vector3,this._parentPosition=new o.Vector3,this._parentQuaternion=new o.Quaternion,this._parentQuaternionInv=new o.Quaternion,this._parentScale=new o.Vector3,this._worldScaleStart=new o.Vector3,this._worldQuaternionInv=new o.Quaternion,this._worldScale=new o.Vector3,this._positionStart=new o.Vector3,this._quaternionStart=new o.Quaternion,this._scaleStart=new o.Vector3,this._getPointer=Ga.bind(this),this._onPointerDown=Za.bind(this),this._onPointerHover=Wa.bind(this),this._onPointerMove=Xa.bind(this),this._onPointerUp=qa.bind(this),t!==null&&this.connect()}connect(){this.domElement.addEventListener("pointerdown",this._onPointerDown),this.domElement.addEventListener("pointermove",this._onPointerHover),this.domElement.addEventListener("pointerup",this._onPointerUp),this.domElement.style.touchAction="none"}disconnect(){this.domElement.removeEventListener("pointerdown",this._onPointerDown),this.domElement.removeEventListener("pointermove",this._onPointerHover),this.domElement.removeEventListener("pointermove",this._onPointerMove),this.domElement.removeEventListener("pointerup",this._onPointerUp),this.domElement.style.touchAction="auto"}getHelper(){return this._root}pointerHover(e){if(this.object===void 0||this.dragging===!0)return;e!==null&&ze.setFromCamera(e,this.camera);const t=hi(this._gizmo.picker[this.mode],ze);t?this.axis=t.object.name:this.axis=null}pointerDown(e){if(!(this.object===void 0||this.dragging===!0||e!=null&&e.button!==0)&&this.axis!==null){e!==null&&ze.setFromCamera(e,this.camera);const t=hi(this._plane,ze,!0);t&&(this.object.updateMatrixWorld(),this.object.parent.updateMatrixWorld(),this._positionStart.copy(this.object.position),this._quaternionStart.copy(this.object.quaternion),this._scaleStart.copy(this.object.scale),this.object.matrixWorld.decompose(this.worldPositionStart,this.worldQuaternionStart,this._worldScaleStart),this.pointStart.copy(t.point).sub(this.worldPositionStart)),this.dragging=!0,rs.mode=this.mode,this.dispatchEvent(rs)}}pointerMove(e){const t=this.axis,s=this.mode,n=this.object;let r=this.space;if(s==="scale"?r="local":(t==="E"||t==="XYZE"||t==="XYZ")&&(r="world"),n===void 0||t===null||this.dragging===!1||e!==null&&e.button!==-1)return;e!==null&&ze.setFromCamera(e,this.camera);const a=hi(this._plane,ze,!0);if(a){if(this.pointEnd.copy(a.point).sub(this.worldPositionStart),s==="translate")this._offset.copy(this.pointEnd).sub(this.pointStart),r==="local"&&t!=="XYZ"&&this._offset.applyQuaternion(this._worldQuaternionInv),t.indexOf("X")===-1&&(this._offset.x=0),t.indexOf("Y")===-1&&(this._offset.y=0),t.indexOf("Z")===-1&&(this._offset.z=0),r==="local"&&t!=="XYZ"?this._offset.applyQuaternion(this._quaternionStart).divide(this._parentScale):this._offset.applyQuaternion(this._parentQuaternionInv).divide(this._parentScale),n.position.copy(this._offset).add(this._positionStart),this.translationSnap&&(r==="local"&&(n.position.applyQuaternion(K.copy(this._quaternionStart).invert()),t.search("X")!==-1&&(n.position.x=Math.round(n.position.x/this.translationSnap)*this.translationSnap),t.search("Y")!==-1&&(n.position.y=Math.round(n.position.y/this.translationSnap)*this.translationSnap),t.search("Z")!==-1&&(n.position.z=Math.round(n.position.z/this.translationSnap)*this.translationSnap),n.position.applyQuaternion(this._quaternionStart)),r==="world"&&(n.parent&&n.position.add(ce.setFromMatrixPosition(n.parent.matrixWorld)),t.search("X")!==-1&&(n.position.x=Math.round(n.position.x/this.translationSnap)*this.translationSnap),t.search("Y")!==-1&&(n.position.y=Math.round(n.position.y/this.translationSnap)*this.translationSnap),t.search("Z")!==-1&&(n.position.z=Math.round(n.position.z/this.translationSnap)*this.translationSnap),n.parent&&n.position.sub(ce.setFromMatrixPosition(n.parent.matrixWorld))));else if(s==="scale"){if(t.search("XYZ")!==-1){let l=this.pointEnd.length()/this.pointStart.length();this.pointEnd.dot(this.pointStart)<0&&(l*=-1),Le.set(l,l,l)}else ce.copy(this.pointStart),Le.copy(this.pointEnd),ce.applyQuaternion(this._worldQuaternionInv),Le.applyQuaternion(this._worldQuaternionInv),Le.divide(ce),t.search("X")===-1&&(Le.x=1),t.search("Y")===-1&&(Le.y=1),t.search("Z")===-1&&(Le.z=1);n.scale.copy(this._scaleStart).multiply(Le),this.scaleSnap&&(t.search("X")!==-1&&(n.scale.x=Math.round(n.scale.x/this.scaleSnap)*this.scaleSnap||this.scaleSnap),t.search("Y")!==-1&&(n.scale.y=Math.round(n.scale.y/this.scaleSnap)*this.scaleSnap||this.scaleSnap),t.search("Z")!==-1&&(n.scale.z=Math.round(n.scale.z/this.scaleSnap)*this.scaleSnap||this.scaleSnap))}else if(s==="rotate"){this._offset.copy(this.pointEnd).sub(this.pointStart);const l=20/this.worldPosition.distanceTo(ce.setFromMatrixPosition(this.camera.matrixWorld));let c=!1;t==="XYZE"?(this.rotationAxis.copy(this._offset).cross(this.eye).normalize(),this.rotationAngle=this._offset.dot(ce.copy(this.rotationAxis).cross(this.eye))*l):(t==="X"||t==="Y"||t==="Z")&&(this.rotationAxis.copy(as[t]),ce.copy(as[t]),r==="local"&&ce.applyQuaternion(this.worldQuaternion),ce.cross(this.eye),ce.length()===0?c=!0:this.rotationAngle=this._offset.dot(ce.normalize())*l),(t==="E"||c)&&(this.rotationAxis.copy(this.eye),this.rotationAngle=this.pointEnd.angleTo(this.pointStart),this._startNorm.copy(this.pointStart).normalize(),this._endNorm.copy(this.pointEnd).normalize(),this.rotationAngle*=this._endNorm.cross(this._startNorm).dot(this.eye)<0?1:-1),this.rotationSnap&&(this.rotationAngle=Math.round(this.rotationAngle/this.rotationSnap)*this.rotationSnap),r==="local"&&t!=="E"&&t!=="XYZE"?(n.quaternion.copy(this._quaternionStart),n.quaternion.multiply(K.setFromAxisAngle(this.rotationAxis,this.rotationAngle)).normalize()):(this.rotationAxis.applyQuaternion(this._parentQuaternionInv),n.quaternion.copy(K.setFromAxisAngle(this.rotationAxis,this.rotationAngle)),n.quaternion.multiply(this._quaternionStart).normalize())}this.dispatchEvent(ci),this.dispatchEvent(ls)}}pointerUp(e){e!==null&&e.button!==0||(this.dragging&&this.axis!==null&&(os.mode=this.mode,this.dispatchEvent(os)),this.dragging=!1,this.axis=null)}dispose(){this.disconnect(),this.traverse(function(e){e.geometry&&e.geometry.dispose(),e.material&&e.material.dispose()})}attach(e){return this.object=e,this._root.visible=!0,this}detach(){return this.object=void 0,this.axis=null,this._root.visible=!1,this}reset(){this.enabled&&this.dragging&&(this.object.position.copy(this._positionStart),this.object.quaternion.copy(this._quaternionStart),this.object.scale.copy(this._scaleStart),this.dispatchEvent(ci),this.dispatchEvent(ls),this.pointStart.copy(this.pointEnd))}getRaycaster(){return ze}getMode(){return this.mode}setMode(e){this.mode=e}setTranslationSnap(e){this.translationSnap=e}setRotationSnap(e){this.rotationSnap=e}setScaleSnap(e){this.scaleSnap=e}setSize(e){this.size=e}setSpace(e){this.space=e}}function Ga(i){if(this.domElement.ownerDocument.pointerLockElement)return{x:0,y:0,button:i.button};{const e=this.domElement.getBoundingClientRect();return{x:(i.clientX-e.left)/e.width*2-1,y:-(i.clientY-e.top)/e.height*2+1,button:i.button}}}function Wa(i){if(this.enabled)switch(i.pointerType){case"mouse":case"pen":this.pointerHover(this._getPointer(i));break}}function Za(i){this.enabled&&(document.pointerLockElement||this.domElement.setPointerCapture(i.pointerId),this.domElement.addEventListener("pointermove",this._onPointerMove),this.pointerHover(this._getPointer(i)),this.pointerDown(this._getPointer(i)))}function Xa(i){this.enabled&&this.pointerMove(this._getPointer(i))}function qa(i){this.enabled&&(this.domElement.releasePointerCapture(i.pointerId),this.domElement.removeEventListener("pointermove",this._onPointerMove),this.pointerUp(this._getPointer(i)))}function hi(i,e,t){const s=e.intersectObject(i,!0);for(let n=0;n<s.length;n++)if(s[n].object.visible||t)return s[n];return!1}const Dt=new o.Euler,Z=new o.Vector3(0,1,0),cs=new o.Vector3(0,0,0),hs=new o.Matrix4,It=new o.Quaternion,jt=new o.Quaternion,xe=new o.Vector3,ds=new o.Matrix4,gt=new o.Vector3(1,0,0),He=new o.Vector3(0,1,0),_t=new o.Vector3(0,0,1),Lt=new o.Vector3,ut=new o.Vector3,pt=new o.Vector3;class Qa extends o.Object3D{constructor(e){super(),this.isTransformControlsRoot=!0,this.controls=e,this.visible=!1}updateMatrixWorld(e){const t=this.controls;t.object!==void 0&&(t.object.updateMatrixWorld(),t.object.parent===null?console.error("TransformControls: The attached 3D object must be a part of the scene graph."):t.object.parent.matrixWorld.decompose(t._parentPosition,t._parentQuaternion,t._parentScale),t.object.matrixWorld.decompose(t.worldPosition,t.worldQuaternion,t._worldScale),t._parentQuaternionInv.copy(t._parentQuaternion).invert(),t._worldQuaternionInv.copy(t.worldQuaternion).invert()),t.camera.updateMatrixWorld(),t.camera.matrixWorld.decompose(t.cameraPosition,t.cameraQuaternion,t._cameraScale),t.camera.isOrthographicCamera?t.camera.getWorldDirection(t.eye).negate():t.eye.copy(t.cameraPosition).sub(t.worldPosition).normalize(),super.updateMatrixWorld(e)}}class Ka extends o.Object3D{constructor(){super(),this.isTransformControlsGizmo=!0,this.type="TransformControlsGizmo";const e=new o.MeshBasicMaterial({depthTest:!1,depthWrite:!1,fog:!1,toneMapped:!1,transparent:!0}),t=new o.LineBasicMaterial({depthTest:!1,depthWrite:!1,fog:!1,toneMapped:!1,transparent:!0}),s=e.clone();s.opacity=.15;const n=t.clone();n.opacity=.5;const r=e.clone();r.color.setHex(16711680);const a=e.clone();a.color.setHex(65280);const l=e.clone();l.color.setHex(255);const c=e.clone();c.color.setHex(16711680),c.opacity=.5;const h=e.clone();h.color.setHex(65280),h.opacity=.5;const u=e.clone();u.color.setHex(255),u.opacity=.5;const f=e.clone();f.opacity=.25;const m=e.clone();m.color.setHex(16776960),m.opacity=.25,e.clone().color.setHex(16776960);const E=e.clone();E.color.setHex(7895160);const y=new o.CylinderGeometry(0,.04,.1,12);y.translate(0,.05,0);const O=new o.BoxGeometry(.08,.08,.08);O.translate(0,.04,0);const _=new o.BufferGeometry;_.setAttribute("position",new o.Float32BufferAttribute([0,0,0,1,0,0],3));const b=new o.CylinderGeometry(.0075,.0075,.5,3);b.translate(0,.25,0);function S(X,Ae){const le=new o.TorusGeometry(X,.0075,3,64,Ae*Math.PI*2);return le.rotateY(Math.PI/2),le.rotateX(Math.PI/2),le}function w(){const X=new o.BufferGeometry;return X.setAttribute("position",new o.Float32BufferAttribute([0,0,0,1,1,1],3)),X}const x={X:[[new o.Mesh(y,r),[.5,0,0],[0,0,-Math.PI/2]],[new o.Mesh(y,r),[-.5,0,0],[0,0,Math.PI/2]],[new o.Mesh(b,r),[0,0,0],[0,0,-Math.PI/2]]],Y:[[new o.Mesh(y,a),[0,.5,0]],[new o.Mesh(y,a),[0,-.5,0],[Math.PI,0,0]],[new o.Mesh(b,a)]],Z:[[new o.Mesh(y,l),[0,0,.5],[Math.PI/2,0,0]],[new o.Mesh(y,l),[0,0,-.5],[-Math.PI/2,0,0]],[new o.Mesh(b,l),null,[Math.PI/2,0,0]]],XYZ:[[new o.Mesh(new o.OctahedronGeometry(.1,0),f.clone()),[0,0,0]]],XY:[[new o.Mesh(new o.BoxGeometry(.15,.15,.01),u.clone()),[.15,.15,0]]],YZ:[[new o.Mesh(new o.BoxGeometry(.15,.15,.01),c.clone()),[0,.15,.15],[0,Math.PI/2,0]]],XZ:[[new o.Mesh(new o.BoxGeometry(.15,.15,.01),h.clone()),[.15,0,.15],[-Math.PI/2,0,0]]]},M={X:[[new o.Mesh(new o.CylinderGeometry(.2,0,.6,4),s),[.3,0,0],[0,0,-Math.PI/2]],[new o.Mesh(new o.CylinderGeometry(.2,0,.6,4),s),[-.3,0,0],[0,0,Math.PI/2]]],Y:[[new o.Mesh(new o.CylinderGeometry(.2,0,.6,4),s),[0,.3,0]],[new o.Mesh(new o.CylinderGeometry(.2,0,.6,4),s),[0,-.3,0],[0,0,Math.PI]]],Z:[[new o.Mesh(new o.CylinderGeometry(.2,0,.6,4),s),[0,0,.3],[Math.PI/2,0,0]],[new o.Mesh(new o.CylinderGeometry(.2,0,.6,4),s),[0,0,-.3],[-Math.PI/2,0,0]]],XYZ:[[new o.Mesh(new o.OctahedronGeometry(.2,0),s)]],XY:[[new o.Mesh(new o.BoxGeometry(.2,.2,.01),s),[.15,.15,0]]],YZ:[[new o.Mesh(new o.BoxGeometry(.2,.2,.01),s),[0,.15,.15],[0,Math.PI/2,0]]],XZ:[[new o.Mesh(new o.BoxGeometry(.2,.2,.01),s),[.15,0,.15],[-Math.PI/2,0,0]]]},D={START:[[new o.Mesh(new o.OctahedronGeometry(.01,2),n),null,null,null,"helper"]],END:[[new o.Mesh(new o.OctahedronGeometry(.01,2),n),null,null,null,"helper"]],DELTA:[[new o.Line(w(),n),null,null,null,"helper"]],X:[[new o.Line(_,n.clone()),[-1e3,0,0],null,[1e6,1,1],"helper"]],Y:[[new o.Line(_,n.clone()),[0,-1e3,0],[0,0,Math.PI/2],[1e6,1,1],"helper"]],Z:[[new o.Line(_,n.clone()),[0,0,-1e3],[0,-Math.PI/2,0],[1e6,1,1],"helper"]]},k={XYZE:[[new o.Mesh(S(.5,1),E),null,[0,Math.PI/2,0]]],X:[[new o.Mesh(S(.5,.5),r)]],Y:[[new o.Mesh(S(.5,.5),a),null,[0,0,-Math.PI/2]]],Z:[[new o.Mesh(S(.5,.5),l),null,[0,Math.PI/2,0]]],E:[[new o.Mesh(S(.75,1),m),null,[0,Math.PI/2,0]]]},R={AXIS:[[new o.Line(_,n.clone()),[-1e3,0,0],null,[1e6,1,1],"helper"]]},V={XYZE:[[new o.Mesh(new o.SphereGeometry(.25,10,8),s)]],X:[[new o.Mesh(new o.TorusGeometry(.5,.1,4,24),s),[0,0,0],[0,-Math.PI/2,-Math.PI/2]]],Y:[[new o.Mesh(new o.TorusGeometry(.5,.1,4,24),s),[0,0,0],[Math.PI/2,0,0]]],Z:[[new o.Mesh(new o.TorusGeometry(.5,.1,4,24),s),[0,0,0],[0,0,-Math.PI/2]]],E:[[new o.Mesh(new o.TorusGeometry(.75,.1,2,24),s)]]},ge={X:[[new o.Mesh(O,r),[.5,0,0],[0,0,-Math.PI/2]],[new o.Mesh(b,r),[0,0,0],[0,0,-Math.PI/2]],[new o.Mesh(O,r),[-.5,0,0],[0,0,Math.PI/2]]],Y:[[new o.Mesh(O,a),[0,.5,0]],[new o.Mesh(b,a)],[new o.Mesh(O,a),[0,-.5,0],[0,0,Math.PI]]],Z:[[new o.Mesh(O,l),[0,0,.5],[Math.PI/2,0,0]],[new o.Mesh(b,l),[0,0,0],[Math.PI/2,0,0]],[new o.Mesh(O,l),[0,0,-.5],[-Math.PI/2,0,0]]],XY:[[new o.Mesh(new o.BoxGeometry(.15,.15,.01),u),[.15,.15,0]]],YZ:[[new o.Mesh(new o.BoxGeometry(.15,.15,.01),c),[0,.15,.15],[0,Math.PI/2,0]]],XZ:[[new o.Mesh(new o.BoxGeometry(.15,.15,.01),h),[.15,0,.15],[-Math.PI/2,0,0]]],XYZ:[[new o.Mesh(new o.BoxGeometry(.1,.1,.1),f.clone())]]},ue={X:[[new o.Mesh(new o.CylinderGeometry(.2,0,.6,4),s),[.3,0,0],[0,0,-Math.PI/2]],[new o.Mesh(new o.CylinderGeometry(.2,0,.6,4),s),[-.3,0,0],[0,0,Math.PI/2]]],Y:[[new o.Mesh(new o.CylinderGeometry(.2,0,.6,4),s),[0,.3,0]],[new o.Mesh(new o.CylinderGeometry(.2,0,.6,4),s),[0,-.3,0],[0,0,Math.PI]]],Z:[[new o.Mesh(new o.CylinderGeometry(.2,0,.6,4),s),[0,0,.3],[Math.PI/2,0,0]],[new o.Mesh(new o.CylinderGeometry(.2,0,.6,4),s),[0,0,-.3],[-Math.PI/2,0,0]]],XY:[[new o.Mesh(new o.BoxGeometry(.2,.2,.01),s),[.15,.15,0]]],YZ:[[new o.Mesh(new o.BoxGeometry(.2,.2,.01),s),[0,.15,.15],[0,Math.PI/2,0]]],XZ:[[new o.Mesh(new o.BoxGeometry(.2,.2,.01),s),[.15,0,.15],[-Math.PI/2,0,0]]],XYZ:[[new o.Mesh(new o.BoxGeometry(.2,.2,.2),s),[0,0,0]]]},se={X:[[new o.Line(_,n.clone()),[-1e3,0,0],null,[1e6,1,1],"helper"]],Y:[[new o.Line(_,n.clone()),[0,-1e3,0],[0,0,Math.PI/2],[1e6,1,1],"helper"]],Z:[[new o.Line(_,n.clone()),[0,0,-1e3],[0,-Math.PI/2,0],[1e6,1,1],"helper"]]};function Q(X){const Ae=new o.Object3D;for(const le in X)for(let fe=X[le].length;fe--;){const te=X[le][fe][0].clone(),Pe=X[le][fe][1],Re=X[le][fe][2],De=X[le][fe][3],G=X[le][fe][4];te.name=le,te.tag=G,Pe&&te.position.set(Pe[0],Pe[1],Pe[2]),Re&&te.rotation.set(Re[0],Re[1],Re[2]),De&&te.scale.set(De[0],De[1],De[2]),te.updateMatrix();const ae=te.geometry.clone();ae.applyMatrix4(te.matrix),te.geometry=ae,te.renderOrder=1/0,te.position.set(0,0,0),te.rotation.set(0,0,0),te.scale.set(1,1,1),Ae.add(te)}return Ae}this.gizmo={},this.picker={},this.helper={},this.add(this.gizmo.translate=Q(x)),this.add(this.gizmo.rotate=Q(k)),this.add(this.gizmo.scale=Q(ge)),this.add(this.picker.translate=Q(M)),this.add(this.picker.rotate=Q(V)),this.add(this.picker.scale=Q(ue)),this.add(this.helper.translate=Q(D)),this.add(this.helper.rotate=Q(R)),this.add(this.helper.scale=Q(se)),this.picker.translate.visible=!1,this.picker.rotate.visible=!1,this.picker.scale.visible=!1}updateMatrixWorld(e){const s=(this.mode==="scale"?"local":this.space)==="local"?this.worldQuaternion:jt;this.gizmo.translate.visible=this.mode==="translate",this.gizmo.rotate.visible=this.mode==="rotate",this.gizmo.scale.visible=this.mode==="scale",this.helper.translate.visible=this.mode==="translate",this.helper.rotate.visible=this.mode==="rotate",this.helper.scale.visible=this.mode==="scale";let n=[];n=n.concat(this.picker[this.mode].children),n=n.concat(this.gizmo[this.mode].children),n=n.concat(this.helper[this.mode].children);for(let r=0;r<n.length;r++){const a=n[r];a.visible=!0,a.rotation.set(0,0,0),a.position.copy(this.worldPosition);let l;if(this.camera.isOrthographicCamera?l=(this.camera.top-this.camera.bottom)/this.camera.zoom:l=this.worldPosition.distanceTo(this.cameraPosition)*Math.min(1.9*Math.tan(Math.PI*this.camera.fov/360)/this.camera.zoom,7),a.scale.set(1,1,1).multiplyScalar(l*this.size/4),a.tag==="helper"){a.visible=!1,a.name==="AXIS"?(a.visible=!!this.axis,this.axis==="X"&&(K.setFromEuler(Dt.set(0,0,0)),a.quaternion.copy(s).multiply(K),Math.abs(Z.copy(gt).applyQuaternion(s).dot(this.eye))>.9&&(a.visible=!1)),this.axis==="Y"&&(K.setFromEuler(Dt.set(0,0,Math.PI/2)),a.quaternion.copy(s).multiply(K),Math.abs(Z.copy(He).applyQuaternion(s).dot(this.eye))>.9&&(a.visible=!1)),this.axis==="Z"&&(K.setFromEuler(Dt.set(0,Math.PI/2,0)),a.quaternion.copy(s).multiply(K),Math.abs(Z.copy(_t).applyQuaternion(s).dot(this.eye))>.9&&(a.visible=!1)),this.axis==="XYZE"&&(K.setFromEuler(Dt.set(0,Math.PI/2,0)),Z.copy(this.rotationAxis),a.quaternion.setFromRotationMatrix(hs.lookAt(cs,Z,He)),a.quaternion.multiply(K),a.visible=this.dragging),this.axis==="E"&&(a.visible=!1)):a.name==="START"?(a.position.copy(this.worldPositionStart),a.visible=this.dragging):a.name==="END"?(a.position.copy(this.worldPosition),a.visible=this.dragging):a.name==="DELTA"?(a.position.copy(this.worldPositionStart),a.quaternion.copy(this.worldQuaternionStart),ce.set(1e-10,1e-10,1e-10).add(this.worldPositionStart).sub(this.worldPosition).multiplyScalar(-1),ce.applyQuaternion(this.worldQuaternionStart.clone().invert()),a.scale.copy(ce),a.visible=this.dragging):(a.quaternion.copy(s),this.dragging?a.position.copy(this.worldPositionStart):a.position.copy(this.worldPosition),this.axis&&(a.visible=this.axis.search(a.name)!==-1));continue}a.quaternion.copy(s),this.mode==="translate"||this.mode==="scale"?(a.name==="X"&&Math.abs(Z.copy(gt).applyQuaternion(s).dot(this.eye))>.99&&(a.scale.set(1e-10,1e-10,1e-10),a.visible=!1),a.name==="Y"&&Math.abs(Z.copy(He).applyQuaternion(s).dot(this.eye))>.99&&(a.scale.set(1e-10,1e-10,1e-10),a.visible=!1),a.name==="Z"&&Math.abs(Z.copy(_t).applyQuaternion(s).dot(this.eye))>.99&&(a.scale.set(1e-10,1e-10,1e-10),a.visible=!1),a.name==="XY"&&Math.abs(Z.copy(_t).applyQuaternion(s).dot(this.eye))<.2&&(a.scale.set(1e-10,1e-10,1e-10),a.visible=!1),a.name==="YZ"&&Math.abs(Z.copy(gt).applyQuaternion(s).dot(this.eye))<.2&&(a.scale.set(1e-10,1e-10,1e-10),a.visible=!1),a.name==="XZ"&&Math.abs(Z.copy(He).applyQuaternion(s).dot(this.eye))<.2&&(a.scale.set(1e-10,1e-10,1e-10),a.visible=!1)):this.mode==="rotate"&&(It.copy(s),Z.copy(this.eye).applyQuaternion(K.copy(s).invert()),a.name.search("E")!==-1&&a.quaternion.setFromRotationMatrix(hs.lookAt(this.eye,cs,He)),a.name==="X"&&(K.setFromAxisAngle(gt,Math.atan2(-Z.y,Z.z)),K.multiplyQuaternions(It,K),a.quaternion.copy(K)),a.name==="Y"&&(K.setFromAxisAngle(He,Math.atan2(Z.x,Z.z)),K.multiplyQuaternions(It,K),a.quaternion.copy(K)),a.name==="Z"&&(K.setFromAxisAngle(_t,Math.atan2(Z.y,Z.x)),K.multiplyQuaternions(It,K),a.quaternion.copy(K))),a.visible=a.visible&&(a.name.indexOf("X")===-1||this.showX),a.visible=a.visible&&(a.name.indexOf("Y")===-1||this.showY),a.visible=a.visible&&(a.name.indexOf("Z")===-1||this.showZ),a.visible=a.visible&&(a.name.indexOf("E")===-1||this.showX&&this.showY&&this.showZ),a.material._color=a.material._color||a.material.color.clone(),a.material._opacity=a.material._opacity||a.material.opacity,a.material.color.copy(a.material._color),a.material.opacity=a.material._opacity,this.enabled&&this.axis&&(a.name===this.axis||this.axis.split("").some(function(c){return a.name===c}))&&(a.material.color.setHex(16776960),a.material.opacity=1)}super.updateMatrixWorld(e)}}class $a extends o.Mesh{constructor(){super(new o.PlaneGeometry(1e5,1e5,2,2),new o.MeshBasicMaterial({visible:!1,wireframe:!0,side:o.DoubleSide,transparent:!0,opacity:.1,toneMapped:!1})),this.isTransformControlsPlane=!0,this.type="TransformControlsPlane"}updateMatrixWorld(e){let t=this.space;switch(this.position.copy(this.worldPosition),this.mode==="scale"&&(t="local"),Lt.copy(gt).applyQuaternion(t==="local"?this.worldQuaternion:jt),ut.copy(He).applyQuaternion(t==="local"?this.worldQuaternion:jt),pt.copy(_t).applyQuaternion(t==="local"?this.worldQuaternion:jt),Z.copy(ut),this.mode){case"translate":case"scale":switch(this.axis){case"X":Z.copy(this.eye).cross(Lt),xe.copy(Lt).cross(Z);break;case"Y":Z.copy(this.eye).cross(ut),xe.copy(ut).cross(Z);break;case"Z":Z.copy(this.eye).cross(pt),xe.copy(pt).cross(Z);break;case"XY":xe.copy(pt);break;case"YZ":xe.copy(Lt);break;case"XZ":Z.copy(pt),xe.copy(ut);break;case"XYZ":case"E":xe.set(0,0,0);break}break;case"rotate":default:xe.set(0,0,0)}xe.length()===0?this.quaternion.copy(this.cameraQuaternion):(ds.lookAt(ce.set(0,0,0),xe,Z),this.quaternion.setFromRotationMatrix(ds)),super.updateMatrixWorld(e)}}class he extends o.EventDispatcher{static DRAG_START="Transform::dragStart";static DRAG_END="Transform::dragEnd";static _instance;app;three;activeCamera;controls=new Map;visibility=new Map;setApp(e,t){this.app=e,this.three=t,this.app.addEventListener(P.SET_SCENE,this.setScene)}clear(){for(const e of this.controls.values()){e.detach(),e.disconnect();const t=e.getHelper();Me(t)}this.controls=new Map,this.visibility=new Map}add(e){let t=this.controls.get(e);if(t===void 0){const s=document.querySelector(".clickable");t=new Ya(this.activeCamera,s),t.getHelper().name=e,t.setSpace("local"),this.controls.set(e,t),this.visibility.set(e,!0),t.addEventListener("mouseDown",()=>{this.dispatchEvent({type:he.DRAG_START})}),t.addEventListener("mouseUp",()=>{this.dispatchEvent({type:he.DRAG_END})}),t.addEventListener("dragging-changed",n=>{oe.instance?.toggleOrbitControls(n.value)})}return t}get(e){return this.controls.get(e)}remove(e){const t=this.get(e);return t===void 0?!1:(t.detach(),t.disconnect(),Me(t.getHelper()),this.controls.delete(e),!0)}enabled(e){this.controls.forEach(t=>{t.enabled=e})}updateCamera(e,t){this.activeCamera=e,this.controls.forEach(s=>{s.camera!==e&&(s.camera=e,e.getWorldPosition(s.cameraPosition),e.getWorldQuaternion(s.cameraQuaternion)),s.domElement!==t&&(s.disconnect(),s.domElement=t,s.connect())})}show(){this.controls.forEach(e=>{const t=e.getHelper(),s=this.visibility.get(t.name);s!==void 0&&(t.visible=s)})}hide(){this.controls.forEach(e=>{const t=e.getHelper();this.visibility.set(t.name,t.visible),t.visible=!1})}setScene=()=>{this.clear()};static get instance(){return he._instance||(he._instance=new he),he._instance}}const Ja=new o.BoxGeometry,di=new o.Vector2;class yi extends o.Object3D{curve=new o.CatmullRomCurve3;line;draggable;curvePos;tension=.5;closed=!1;subdivide=50;curveType;offset=1;lineMaterial;_camera;_curvePercentage=0;_draggableScale=10;_transform;raycaster;draggedMat=new o.MeshBasicMaterial;parentGroup;group;constructor(e,t){const s=new o.Color(qe(.5,1,Math.random()),qe(.5,1,Math.random()),qe(.5,1,Math.random()));super(),this.name=e,this.lineMaterial=new o.LineBasicMaterial({color:s}),this.line=new o.Line(new o.BufferGeometry,this.lineMaterial),this.line.name="line",this.add(this.line),this._camera=t,this.curveType="catmullrom",this.draggedMat.color=s,this.draggable=new o.Object3D,this.draggable.name="draggablePoints",this.add(this.draggable),this.curvePos=new o.Mesh(new o.SphereGeometry(1.5),new o.MeshBasicMaterial({color:s})),this.curvePos.name="curvePos",this.curvePos.scale.setScalar(this._draggableScale),this.curvePos.visible=!1,this.add(this.curvePos),this.raycaster=new o.Raycaster,this.raycaster.params.Line.threshold=3,this.enable()}enable(){document.addEventListener("pointerdown",this.onMouseClick)}disable(){document.removeEventListener("pointerdown",this.onMouseClick)}dispose=()=>{this._transform&&(this._transform.removeEventListener("objectChange",this.updateSpline),he.instance.remove(this.name)),this.disable(),this.parentGroup.removeGroup(this.name)};hideTransform=()=>{this._transform?.detach()};exportSpline=()=>{const e=[];this.draggable.children.forEach(t=>{e.push([ye(t.position.x,3),ye(t.position.y,3),ye(t.position.z,3)])}),ms({name:this.name,points:e,tension:this.tension,closed:this.closed,subdivide:this.subdivide,type:this.curveType}),console.log("Spline copied!")};showPoints=(e=!0)=>{this.draggable.visible=e};addPoints=(e=[])=>{if(e.length>0){const t=e.length-1;for(let s=0;s<t;s++)this.addPoint(e[s],!1);this.addPoint(e[t])}else this.addPoint(new o.Vector3(-50,0,0),!1),this.addPoint(new o.Vector3(50,0,0))};addPoint=(e,t=!0)=>{const s=this.draggable.children.length,n=new o.Mesh(Ja,this.draggedMat);return n.name=`point_${s}`,n.position.copy(e),n.scale.setScalar(this._draggableScale),this.draggable.add(n),t&&this.updateSpline(),n};addNextPt=()=>{const e=this.draggable.children.length,t=new o.Vector3(qe(-this.offset,this.offset,Math.random()),qe(-this.offset,this.offset,Math.random()),qe(-this.offset,this.offset,Math.random()));e>0&&t.add(this.draggable.children[e-1].position);const s=this.addPoint(t);this._transform?.attach(s),this.group.current?.setField("Current Point",s.position)};removePoint=e=>{if(this._transform?.object===e){this._transform?.detach();const t=this.draggable.children[this.draggable.children.length-1];this._transform?.attach(t),this.group.current?.setField("Current Point",t.position)}Me(e),this.updateSpline()};removePointAt=e=>{const t=this.draggable.children[e];this.removePoint(t)};removeSelectedPt=()=>{this._transform?.object!==void 0&&this.removePoint(this._transform?.object)};updateSpline=()=>{this.curve=new o.CatmullRomCurve3(this.points,this.closed,this.curveType,this.tension),this.line.geometry.setFromPoints(this.getPoints()),this.curvePos.position.copy(this.getPointAt(this._curvePercentage))};onMouseClick=e=>{if(!oe.instance||this._transform&&!this._transform.getHelper().visible)return;const s=oe.instance.currentWindow.current.getBoundingClientRect();di.x=(e.clientX-s.x)/s.width*2-1,di.y=-((e.clientY-s.y)/s.height)*2+1,this.raycaster.setFromCamera(di,this.camera);const n=this.raycaster.intersectObjects(this.draggable.children,!1);if(n.length>0){const r=n[0].object;r!==this._transform?.object&&(this._transform?.attach(r),this.group.current?.setField("Current Point",r.position))}};getPointAt(e){return this.curve.getPointAt(e)}getPoints(){return this.curve.getPoints(this.subdivide)}getTangentAt(e){return this.curve.getTangentAt(e)}get points(){const e=[];return this.draggable.children.forEach(t=>{e.push(t.position)}),e}get total(){return this.draggable.children.length}get draggableScale(){return this._draggableScale}set draggableScale(e){this._draggableScale=e,this.draggable.children.forEach(t=>t.scale.setScalar(e)),this.curvePos.scale.setScalar(e)}get camera(){return this._camera}set camera(e){this._camera=e,this._transform!==void 0&&(this._transform.camera=e)}get curvePercentage(){return this._curvePercentage}set curvePercentage(e){this._curvePercentage=e,this.curvePos.position.copy(this.getPointAt(e))}onUpdateTransform=()=>{if(this._transform?.object&&this.group){const e=this._transform?.object;e.name.search("point")>-1&&this.group.current?.setField("Current Point",e.position)}this.updateSpline()};initDebug(e){const t=this.draggable.children;this.parentGroup=e,this._transform=he.instance.add(this.name),this._transform.camera=this._camera,this._transform.addEventListener("objectChange",this.onUpdateTransform),this._transform.attach(t.length>0?t[t.length-1]:this),oe.instance?.scene.add(this._transform.getHelper());const s=t.length>0?t[t.length-1].position:{x:0,y:0,z:0};this.group=e.addGroup({title:this.name,items:[{prop:"Closed",type:"boolean",value:this.closed},{prop:"Visible",type:"boolean",value:this.visible},{prop:"Show Position",type:"boolean",value:this.curvePos.visible},{prop:"Show Points",type:"boolean",value:this.draggable.visible},{prop:"Color",type:"color",value:`#${this.draggedMat.color.getHexString()}`},{prop:"Curve",type:"option",options:[{title:"Catmullrom",value:"catmullrom"},{title:"Centripetal",value:"centripetal"},{title:"Chordal",value:"chordal"}]},{prop:"Draggable Scale",type:"range",min:.01,max:100,step:.01,value:this._draggableScale},{prop:"Subdivide",type:"range",min:1,max:100,step:1,value:this.subdivide},{prop:"Tension",type:"range",min:0,max:1,step:.01,value:this.tension},{prop:"New Pt Offset",type:"range",min:0,max:10,value:this.offset},{prop:"Curve At",type:"range",min:0,max:1,step:.01,value:0},{prop:"Toggle Transform",type:"button"},{prop:"Add Point",type:"button"},{prop:"Remove Point",type:"button"},{prop:"Export",type:"button"},{prop:"Delete",type:"button"},{prop:"Current Point",type:"grid3",value:s}],onUpdate:(n,r)=>{switch(n){case"Closed":this.closed=r,this.updateSpline();break;case"Visible":this.visible=r;break;case"Color":this.lineMaterial.color.setStyle(r),this.draggedMat.color.setStyle(r);break;case"Curve":this.curveType=r,this.updateSpline();break;case"Draggable Scale":this.draggableScale=r;break;case"Subdivide":this.subdivide=r,this.updateSpline();break;case"Tension":this.tension=r,this.updateSpline();break;case"New Pt Offset":this.offset=r;break;case"Curve At":this.curvePos.position.copy(this.getPointAt(r));break;case"Show Position":this.curvePos.visible=r;break;case"Show Points":this.draggable.visible=r;break;case"Toggle Transform":this._transform&&(this._transform.getHelper().visible=!this._transform.getHelper().visible);break;case"Add Point":this.addNextPt();break;case"Remove Point":this.removeSelectedPt();break;case"Export":this.exportSpline();break;case"Delete":Me(this);break;case"Current Point":if(this.group.current&&this._transform?.object){const a=this._transform?.object;a.name.search("point")>-1&&(a.position.copy(r),this.updateSpline())}break}}}),this.draggable.children.forEach(n=>{this.debugPoint(n)})}debugPoint=e=>{e.name,e.visible=this.draggable.visible}}let kt=0;class As extends o.Object3D{defaultScale=10;_camera;group=null;app;constructor(e,t){super(),this.name="Spline Editor",this._camera=e,this.app=t,this.app.addEventListener(P.ADD_SPLINE,this.onAddSpline)}initDebug(){this.group=B.addEditorGroup({title:this.name,items:[{type:"button",prop:"New Spline"},{type:"boolean",prop:"Show Points",value:!0},{type:"boolean",prop:"Visible",value:this.visible},{type:"range",prop:"Default Scale",min:0,max:50,step:.01,value:this.defaultScale}],onUpdate:(e,t)=>{switch(e){case"New Spline":this.createSpline();break;case"Show Points":this.showPoints(t);break;case"Visible":this.visible=t;break;case"Default Scale":this.defaultScale=t;break}}})}dispose(){this.app.removeEventListener(P.ADD_SPLINE,this.onAddSpline),B.removeEditorGroup(this.name)}addSpline(e){e.draggableScale=this.defaultScale,e.hideTransform(),this.group?.current!==null&&e.initDebug(this.group.current),this.add(e)}createSpline=(e=[])=>{const t=`Spline ${kt+1}`,s=new yi(t,this._camera);return s.addPoints(e),this.addSpline(s),kt++,s};createSplineFromArray=e=>{const t=[];return e.forEach(s=>{t.push(new o.Vector3(s[0],s[1],s[2]))}),this.createSpline(t)};createSplineFromCatmullRom=e=>this.createSpline(e.points);createSplineFromJSON=e=>{const t=this.createSplineFromArray(e.points);return t.name=e.name,t.closed=e.closed,t.subdivide=e.subdivide,t.tension=e.tension,t.type=e.type,t.updateSpline(),t};showPoints=(e=!0)=>{this.children.forEach(t=>{t.showPoints(e)})};onAddSpline=e=>{const t=JSON.parse(e.value),s=`Spline ${kt+1}`,n=[];t.points.forEach(a=>{n.push(new o.Vector3(a[0],a[1],a[2]))});const r=new yi(s,this.camera);r.addPoints(n),this.addSpline(r),kt++};get camera(){return this._camera}set camera(e){this._camera=e,this.children.forEach(t=>{const s=t;s.camera=e})}}const us=["Single","Side by Side","Stacked","Quad"],er="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAACXBIWXMAAAsTAAALEwEAmpwYAAAC60lEQVRYhe2YT4hNcRTHP48xpmYaNAvRyEQxEhnKQljYsRm9/EmSyJiMFAsMZWNhJYoNIUVJ2VGiyb9ZzIpMpkQSahbGv9GMYWrM+1rc2zjvzvvdd+99rzdvMd+6de75nd+5387vnN/v/G5KEuWMKRNNIB8mCRaKiiL5qQb2ApuBuUAV0Ad0AJeB3sSeJRX6LJbULTf6JTUn9Z+KWMUpPyp/Avoa4CNQZ3Sj/lNpdL/xottR7AjOkHRUUpekN5I6JbVLavDH75lIfZN0UFKTpCWS0pJem/HeJBEMG6yV1ONYtgFJbZJ+GF1jDh+zJb03NuliEuwMkMo4yErS2RA/LcbuYVyCrm1mA7Dal/8Cu4FG4JD/HsTTkCy6a+SVMTPQuc1sBKb78nHghi+/A+YBxwL2lbhRY+ThuARdEVxu5JdGFvACr0otdoZ8Y4+Rn0Sn5sFFsMvI6YB9MzA1YJ8mN8k1wAHzfj4uQVdyrpI0aJL7oqTtkq4FiqPLyCOSbktqlbRL0jlJQ2b8QdwCUZ4qvhRStZL0XFK1pMd57CRvq5mfhKBriRfiFUMY6oD7eOdwPlQAN4G10dfWg+uouwXsiOssAj4AC+JMcEWwvnAuOTEr7gTXPmg34zagOwkbIIOXAo9CbDYBrcBXYN+4UUdy2sRflyS5zVNlfPX7ugpJW5V9nI7mmh+lYU0lCZ2B3TOnAVuAk0BTwC5nuhWro46KauBOQJch5OpRaoIW34GreGf+YZdRqS9NAj4Bp4ClQDvwOWxCqSM4ADQEdKE5XvbXzlITrAVe4TW+M6NMKDXBFLAMuAD0ACfIc7pMZBXXA2cY3/xmodQRHAL2A2+NLtj8ZiEKwUL/z2WMPAJcAVYALWSf8dZuDFGWeBHwKxm3sWYhiGG8Tfo6sA2vSfiSy4GrH3wGrDcfKSSKKf6v1E9yF0XK9Q1XBPuMXMw8HXTonQFwETwNzMFr64v1jzgFHIk9ybHEZYPJo65QlD3Bf2/Q/eaHPiSWAAAAAElFTkSuQmCC",tr="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAACXBIWXMAAAsTAAALEwEAmpwYAAAETklEQVRYhe2YXYhVVRTHf3d0/JhyUrMpFbImM+whSa3Mynww+4AeIgiKoozooQ+KyMyXIAujF6OXqHyI6iEKKYgIP/owsjSFqCkprdDUTEcjbWZ0HHV+Pex1ucfb9Z57Z9REXHA4Z++99l7/s/ZZ/7X2KaiczNLwfwPIk9MA+yunNMAG4DHgV+BvoB3YFff2TPstYEyfrajVroI6Sr1GvahsbJC63HzZq04pmztSvU5tVRuqYRiYg78JeBR4HPg5ntdmxovz9wJfA3uAxuibDLQCA+IqynnAQuBuYCnwMLC1rx48U12U8cZqdWqMDcx4cI16qTpYbVKHqa+ovWUeHKsujn7VL9ULq2HI+wY7gVeBJdGeFu3J4ZUiy/cAXeHRRuAQsC/GC0B3eG4BcH/0tUV7czUAeVsMsBF4Kha9HZgCvAncAuwPnXHA0wFuGLANuDrGuoGDwFxgTqzzQ7RX5FrP2eLsdb76vnogtme6+nE8H1YPlQXHwbi3q9eqn0e7Tb25VrsF68vFY0lb1AGcDTwItGQ8tQM4AIwGmqP/EPAu8A0wElgJfFGzxTo8mKWXu9Rd4ZF96jvqjSbauEC9Sn1O3R463epLaku99voCsFXdkAH3kNpcQW+IiT/bQne3eufxBtioPqP2mKhioXpWzpxb1T8C5Ifh4ZptVoriRmAIKdrI3Lujf3bobAPeJpF0NVkKrAFuI9HTOBIxnxFrF4OgQKKr/dnJlQA+AcwABgOHA4zAamA5cE7orQL+zAEHiWI+A2bFC7aSguheYCgpqAphZz3wSB7AecCICv2TgH8oFRib4gVqka0k0h8CXAxMBW6ooDejFoCvA9OBQUAvKWM0kDz4XUZvNKXtyZMWUl7vBbaQXq457PeEziDgx/KJlQAuIPFdMcEXv5OdYWBP9M8k8VpnDQCvB4aTSrCNJB5cSdrW3tBpIJVnR0qdUTxAfdGUOVTnmwqEanNmqltC/9OgqePKg5eom8PgdvW+oJ9Kupera0O3U50TL3lcAaI+oHaF4R3qa6Z822wq0Saq89T1lmSxOrxeW/Xm4uGkiqQDmECKuKHxHW0HdpMiewSpvGqKeR8Ay0iBsYIjg6261PE2o9Q3Yqv+MqWxO9R1Hl12qs+q49Vlppy82pSr+5xJKsko4AXgHlJ0t5NIeg3wLXAlqZhtIUV8J6nmWwX8QiLjdhL5TwMWkY4R6/rrwYKlMr1Y321QZ/vfwBijPqm+rF4Wc7PjE9QllurGVeoV5gRNHsAm9fnMom3qrKPoTjKdMXaYyrFygEWQ72XWW24qhPu8xcUc2UU6O8wFPjmK7jhgPHAuMJGUGQ6U6WwE5sfzTXGvei7KA9hFOiR9D/wOfFVFt4dS2tpfRe83Ur7/CPiJakfOGgBCypubatArl2r8VfOax/LfzABKtePAzHO/5FgC7KBEzB2kOrDfUm8mOeFySv9+OyFyGmB/5aQH+C9BVKmVCNuMZgAAAABJRU5ErkJggg==",ir="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAVCAYAAACpF6WWAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAQ0lEQVQ4jWP8////fwYqAxYozUhFM/8zkaKYWIWkGEq0b0ZdSjQY5i79TyWagRGaTUdzFEEw6lLqGzqwLoVVJ1StpwA9sBwbUqAh5gAAAABJRU5ErkJggg==";class oe extends T.Component{static instance=null;app;scene=new o.Scene;renderer;currentScene;cameras=new Map;controls=new Map;currentCamera;currentWindow;cameraHelpers=new Map;lightHelpers=new Map;helpersContainer=new o.Group;grid=new za;interactionHelper=new o.AxesHelper(25);currentTransform;splineEditor;depthMaterial=new o.MeshDepthMaterial;normalsMaterial=new o.MeshNormalMaterial;uvMaterial=new Ba;wireframeMaterial=new o.MeshBasicMaterial({opacity:.33,transparent:!0,wireframe:!0});playing=!1;rafID=-1;cameraControlsRafID=-1;width=0;height=0;sceneSet=!1;tlCam=null;trCam=null;blCam=null;brCam=null;tlRender="Renderer";trRender="Renderer";blRender="Renderer";brRender="Renderer";cameraVisibility=!0;lightVisibility=!0;gridVisibility=!0;selectedItem=void 0;debugCamera;raycaster=new o.Raycaster;pointer=new o.Vector2;cameraControls=void 0;canvasRef;containerRef;tlWindow;trWindow;blWindow;brWindow;constructor(e){super(e),this.app=e.app,this.canvasRef=T.createRef(),this.containerRef=T.createRef(),this.tlWindow=T.createRef(),this.trWindow=T.createRef(),this.blWindow=T.createRef(),this.brWindow=T.createRef();const t=e.three.app.appID,s=localStorage,n=s.getItem(`${t}_mode`);this.state={mode:n!==null?n:"Single",modeOpen:!1,renderModeOpen:!1,interactionMode:"Orbit",interactionModeOpen:!1,lastUpdate:Date.now()},s.setItem(`${t}_mode`,this.state.mode),s.setItem(`${t}_tlCam`,s.getItem(`${t}_tlCam`)!==null?s.getItem(`${t}_tlCam`):"Debug"),s.setItem(`${t}_trCam`,s.getItem(`${t}_trCam`)!==null?s.getItem(`${t}_trCam`):"Orthographic"),s.setItem(`${t}_blCam`,s.getItem(`${t}_blCam`)!==null?s.getItem(`${t}_blCam`):"Front"),s.setItem(`${t}_brCam`,s.getItem(`${t}_brCam`)!==null?s.getItem(`${t}_brCam`):"Top"),s.setItem(`${t}_tlRender`,s.getItem(`${t}_tlRender`)!==null?s.getItem(`${t}_tlRender`):"Renderer"),s.setItem(`${t}_trRender`,s.getItem(`${t}_trRender`)!==null?s.getItem(`${t}_trRender`):"Renderer"),s.setItem(`${t}_blRender`,s.getItem(`${t}_blRender`)!==null?s.getItem(`${t}_blRender`):"Renderer"),s.setItem(`${t}_brRender`,s.getItem(`${t}_brRender`)!==null?s.getItem(`${t}_brRender`):"Renderer");const r={Vector2:o.Vector2,Vector3:o.Vector3,Vector4:o.Vector4,Quaternion:o.Quaternion,Matrix4:o.Matrix4,Spherical:o.Spherical,Box3:o.Box3,Sphere:o.Sphere,Raycaster:o.Raycaster};Oe.install({THREE:r}),this.setupScene(),this.setupTools();const a=localStorage.getItem(this.expandedCameraVisibility);a!==null&&(this.cameraVisibility=a==="open"),this.saveExpandedCameraVisibility();const l=localStorage.getItem(this.expandedLightVisibility);l!==null&&(this.lightVisibility=l==="open"),this.saveExpandedLightVisibility();const c=localStorage.getItem(this.expandedGridVisibility);c!==null&&(this.gridVisibility=c==="open"),this.grid.visible=this.gridVisibility,this.saveExpandedGridVisibility(),oe.instance=this}componentDidMount(){this.setupRenderer(),this.enable(),this.assignControls(),this.resize(),this.play(),he.instance.setApp(this.props.app,this.props.three),he.instance.activeCamera=this.debugCamera}componentDidUpdate(e,t,s){t.mode!==this.state.mode&&(this.assignControls(),this.resize())}componentWillUnmount(){this.disable(),B.removeEditorGroup("View Settings")}render(){const e=[];return this.cameras.forEach((t,s)=>{e.push(s)}),p.jsxs("div",{className:"multiview",children:[p.jsx("canvas",{ref:this.canvasRef}),p.jsxs("div",{className:`cameras ${this.state.mode==="Single"||this.state.mode==="Stacked"?"single":""}`,ref:this.containerRef,children:[this.state.mode==="Single"&&p.jsx(p.Fragment,{children:p.jsx(Fe,{name:"tl",camera:this.tlCam,options:e,ref:this.tlWindow,onSelectCamera:t=>{this.controls.get(this.tlCam.name)?.dispose();const s=this.cameras.get(t);s!==void 0&&(this.clearCamera(this.tlCam),this.tlCam=s,localStorage.setItem(`${this.appID}_tlCam`,s.name),this.createControls(s,this.tlWindow.current))},onSelectRenderMode:t=>{this.tlRender=t,localStorage.setItem(`${this.appID}_tlRender`,t)}})}),(this.state.mode==="Side by Side"||this.state.mode==="Stacked")&&p.jsxs(p.Fragment,{children:[p.jsx(Fe,{name:"tl",camera:this.tlCam,options:e,ref:this.tlWindow,onSelectCamera:t=>{this.controls.get(this.tlCam.name)?.dispose();const s=this.cameras.get(t);s!==void 0&&(this.clearCamera(this.tlCam),this.tlCam=s,localStorage.setItem(`${this.appID}_tlCam`,s.name),this.createControls(s,this.tlWindow.current))},onSelectRenderMode:t=>{this.tlRender=t,localStorage.setItem(`${this.appID}_tlRender`,t)}}),p.jsx(Fe,{name:"tr",camera:this.trCam,options:e,ref:this.trWindow,onSelectCamera:t=>{this.controls.get(this.trCam.name)?.dispose();const s=this.cameras.get(t);s!==void 0&&(this.clearCamera(this.trCam),this.trCam=s,localStorage.setItem(`${this.appID}_trCam`,s.name),this.createControls(s,this.trWindow.current))},onSelectRenderMode:t=>{this.trRender=t,localStorage.setItem(`${this.appID}_trRender`,t)}})]}),this.state.mode==="Quad"&&p.jsxs(p.Fragment,{children:[p.jsx(Fe,{name:"tl",camera:this.tlCam,options:e,ref:this.tlWindow,onSelectCamera:t=>{this.controls.get(this.tlCam.name)?.dispose();const s=this.cameras.get(t);s!==void 0&&(this.clearCamera(this.tlCam),this.tlCam=s,localStorage.setItem(`${this.appID}_tlCam`,s.name),this.createControls(s,this.tlWindow.current))},onSelectRenderMode:t=>{this.tlRender=t,localStorage.setItem(`${this.appID}_tlRender`,t)}}),p.jsx(Fe,{name:"tr",camera:this.trCam,options:e,ref:this.trWindow,onSelectCamera:t=>{this.controls.get(this.trCam.name)?.dispose();const s=this.cameras.get(t);s!==void 0&&(this.clearCamera(this.trCam),this.trCam=s,localStorage.setItem(`${this.appID}_trCam`,s.name),this.createControls(s,this.trWindow.current))},onSelectRenderMode:t=>{this.trRender=t,localStorage.setItem(`${this.appID}_trRender`,t)}}),p.jsx(Fe,{name:"bl",camera:this.blCam,options:e,ref:this.blWindow,onSelectCamera:t=>{this.controls.get(this.blCam.name)?.dispose();const s=this.cameras.get(t);s!==void 0&&(this.clearCamera(this.blCam),this.blCam=s,localStorage.setItem(`${this.appID}_blCam`,s.name),this.createControls(s,this.blWindow.current))},onSelectRenderMode:t=>{this.blRender=t,localStorage.setItem(`${this.appID}_blRender`,t)}}),p.jsx(Fe,{name:"br",camera:this.brCam,options:e,ref:this.brWindow,onSelectCamera:t=>{this.controls.get(this.brCam.name)?.dispose();const s=this.cameras.get(t);s!==void 0&&(this.clearCamera(this.brCam),this.brCam=s,localStorage.setItem(`${this.appID}_brCam`,s.name),this.createControls(s,this.brWindow.current))},onSelectRenderMode:t=>{this.brRender=t,localStorage.setItem(`${this.appID}_brRender`,t)}})]})]}),p.jsxs("div",{className:"settings",children:[p.jsx(zt,{title:"View",index:us.indexOf(this.state.mode),options:us,onSelect:t=>{t!==this.state.mode&&(this.killControls(),this.setState({mode:t}),localStorage.setItem(`${this.appID}_mode`,t))},open:this.state.modeOpen,onToggle:t=>{this.setState({modeOpen:t,renderModeOpen:!1,interactionModeOpen:!1})}}),p.jsx(zt,{title:"Interact",index:this.state.interactionMode==="Orbit"?0:1,options:["Orbit Mode","Selection Mode"],onSelect:t=>{this.interactionHelper.visible=t==="Selection Mode",this.setState({interactionMode:this.interactionHelper.visible?"Selection":"Orbit"})},open:this.state.interactionModeOpen,onToggle:t=>{this.setState({modeOpen:!1,renderModeOpen:!1,interactionModeOpen:t})}}),p.jsx(li,{name:"cameraHelper",icon:er,selected:this.cameraVisibility,height:24,top:2,onClick:t=>{if(this.cameraVisibility=t,this.saveExpandedCameraVisibility(),this.cameraHelpers.forEach(s=>{s.visible=t}),this.selectedItem!==void 0&&!t){const s=this.cameraHelpers.get(this.selectedItem.name);s!==void 0&&(s.visible=!0)}}}),p.jsx(li,{name:"lightHelper",icon:tr,selected:this.lightVisibility,height:24,top:4,onClick:t=>{if(this.lightVisibility=t,this.saveExpandedLightVisibility(),this.lightHelpers.forEach(s=>{s.visible=t}),this.selectedItem!==void 0&&!t&&this.selectedItem.isLight===!0){const s=this.lightHelpers.get(this.selectedItem.name);s!==void 0&&(s.visible=!0)}}}),p.jsx(li,{name:"gridHelper",icon:ir,selected:this.gridVisibility,height:21,width:21,onClick:t=>{this.gridVisibility=t,this.saveExpandedGridVisibility(),this.grid.visible=t}})]},this.state.lastUpdate)]})}setupRenderer(){this.renderer=new o.WebGLRenderer({canvas:this.canvasRef.current,stencil:!1}),this.renderer.autoClear=!1,this.renderer.shadowMap.enabled=!0,this.renderer.setPixelRatio(devicePixelRatio),this.renderer.setClearColor(0),this.props.three.renderer=this.renderer}setupScene(){this.scene.name="Debug Scene",this.scene.uuid="",this.helpersContainer.name="helpers",this.scene.add(this.helpersContainer),this.grid.position.y=-1,this.helpersContainer.add(this.grid),this.interactionHelper.name="interactionHelper",this.interactionHelper.visible=!1,this.helpersContainer.add(this.interactionHelper);const e=(r,a)=>{const l=new o.OrthographicCamera(-100,100,100,-100,0,3e3);return l.name=r,l.position.copy(a),l.lookAt(0,0,0),this.cameras.set(r,l),l},t=1e3;e("Top",new o.Vector3(0,t,0)),e("Bottom",new o.Vector3(0,-t,0)),e("Left",new o.Vector3(-t,0,0)),e("Right",new o.Vector3(t,0,0)),e("Front",new o.Vector3(0,0,t)),e("Back",new o.Vector3(0,0,-t)),e("Orthographic",new o.Vector3(t,t,t)),e("UI",new o.Vector3),this.debugCamera=new o.PerspectiveCamera(60,1,50,5e3),this.debugCamera.name="Debug",this.debugCamera.position.set(500,500,500),this.debugCamera.lookAt(0,0,0),this.cameras.set("Debug",this.debugCamera),this.currentCamera=this.debugCamera;const s=localStorage,n=this.props.three.app.appID;this.tlCam=this.cameras.get(s.getItem(`${n}_tlCam`)),this.trCam=this.cameras.get(s.getItem(`${n}_trCam`)),this.blCam=this.cameras.get(s.getItem(`${n}_blCam`)),this.brCam=this.cameras.get(s.getItem(`${n}_brCam`)),this.tlCam===void 0&&(this.tlCam=this.cameras.get("Debug")),this.trCam===void 0&&(this.trCam=this.cameras.get("Orthographic")),this.blCam===void 0&&(this.blCam=this.cameras.get("Front")),this.brCam===void 0&&(this.brCam=this.cameras.get("Top"))}setupTools(){this.splineEditor=new As(this.currentCamera,this.app),this.splineEditor.initDebug(),this.scene.add(this.splineEditor)}play(){this.playing=!0,this.onUpdate()}pause(){this.playing=!1,cancelAnimationFrame(this.rafID),this.rafID=-1}toggleOrbitControls(e){this.controls.forEach(t=>{t.enabled=!e})}update(){this.controls.forEach(e=>e.update()),this.cameraHelpers.forEach(e=>e.update()),this.lightHelpers.forEach(e=>{e.update!==void 0&&e.update()}),this.props.onSceneUpdate!==void 0&&this.sceneSet&&this.props.onSceneUpdate(this.currentScene)}draw(){switch(this.renderer?.clear(),this.state.mode){case"Single":this.drawSingle();break;case"Side by Side":case"Stacked":this.drawDouble();break;case"Quad":this.drawQuad();break}}onUpdate=()=>{this.playing&&(this.update(),this.draw(),this.rafID=requestAnimationFrame(this.onUpdate))};enable(){const e=this.containerRef.current;e.addEventListener("mousemove",this.onMouseMove),e.addEventListener("click",this.onClick),window.addEventListener("keydown",this.onKey),window.addEventListener("resize",this.resize),this.app.addEventListener(P.SET_SCENE,this.sceneUpdate),this.app.addEventListener(P.ADD_CAMERA,this.addCamera),this.app.addEventListener(P.REMOVE_CAMERA,this.removeCamera),this.app.addEventListener(P.SET_OBJECT,this.onSetSelectedItem)}disable(){const e=this.containerRef.current;e.removeEventListener("mousemove",this.onMouseMove),e.removeEventListener("click",this.onClick),window.removeEventListener("keydown",this.onKey),window.removeEventListener("resize",this.resize),this.app.removeEventListener(P.SET_SCENE,this.sceneUpdate),this.app.removeEventListener(P.ADD_CAMERA,this.addCamera),this.app.removeEventListener(P.REMOVE_CAMERA,this.removeCamera),this.app.removeEventListener(P.SET_OBJECT,this.onSetSelectedItem)}resize=()=>{this.width=window.innerWidth-300,this.height=window.innerHeight;const e=Math.floor(this.width/2),t=Math.floor(this.height/2);this.props.three.resize(this.width,this.height),this.props.onSceneResize!==void 0&&this.sceneSet&&this.currentScene!==void 0&&this.props.onSceneResize(this.currentScene,this.width,this.height);let s=this.width,n=this.height;switch(this.state.mode){case"Side by Side":s=e,n=this.height;break;case"Stacked":s=this.width,n=t;break;case"Quad":s=e,n=t;break}const r=s/n;this.cameras.forEach(a=>{a instanceof o.OrthographicCamera?(a.left=s/-2,a.right=s/2,a.top=n/2,a.bottom=n/-2,a.name==="UI"&&(a.position.x=this.width/2,a.position.y=this.height/-2,a.position.z=100),a.updateProjectionMatrix()):a instanceof o.PerspectiveCamera&&(a.aspect=r,a.updateProjectionMatrix()),this.cameraHelpers.get(a.name)?.update()})};sceneUpdate=e=>{this.clearLightHelpers(),this.scene.remove(this.currentScene),Me(this.currentScene);const t=this.props.scenes.get(e.value.name);if(t!==void 0){const s=new t;this.props.onSceneSet!==void 0&&this.props.onSceneSet(s),this.currentScene=s,this.props.three.scene=this.currentScene,this.scene.add(this.currentScene),this.sceneSet=!0,this.addLightHelpers()}};addCamera=e=>{const t=e.value,s=this.props.three.scene?.getObjectByProperty("uuid",t.uuid);if(s!==void 0){const n=s;this.cameras.set(t.name,n);const r=new o.CameraHelper(n);r.visible=this.cameraVisibility,this.cameraHelpers.set(n.name,r),this.scene.add(r),this.setState({lastUpdate:Date.now()})}};removeCamera=e=>{const t=this.cameraHelpers.get(e.value.name);t!==void 0&&(this.scene.remove(t),t.dispose()),this.cameras.delete(e.value.name),this.setState({lastUpdate:Date.now()})};onMouseMove=e=>{const t=new o.Vector2;this.renderer.getSize(t);const s=Math.min(e.clientX,t.x),n=Math.min(e.clientY,t.y);this.pointer.x=Xe(s,0,t.x,-1,1),this.pointer.y=Xe(n,0,t.y,1,-1);const r=t.x/2,a=t.y/2,l=()=>{s<r?this.pointer.x=Xe(s,0,r,-1,1):this.pointer.x=Xe(s,r,t.x,-1,1)},c=()=>{n<a?this.pointer.y=Xe(n,0,a,1,-1):this.pointer.y=Xe(n,a,t.y,1,-1)};switch(this.state.mode){case"Quad":l(),c();break;case"Side by Side":l();break;case"Stacked":c(),c();break}if(this.updateCamera(s,n,r,a),this.state.interactionMode==="Orbit")return;const h=this.raycaster.intersectObjects(this.currentScene.children);h.length>0&&this.interactionHelper.position.copy(h[0].point)};onClick=e=>{if(this.state.interactionMode==="Orbit")return;const t=new o.Vector2;if(this.renderer.getSize(t),e.clientX>=t.x)return;this.onMouseMove(e);const s=this.raycaster.intersectObjects(this.currentScene.children);s.length>0&&(this.props.three.getObject(s[0].object.uuid),this.interactionHelper.visible=!1,this.setState({interactionMode:"Orbit",lastUpdate:Date.now()}))};onKey=e=>{if(this.selectedItem!==void 0){if(e.ctrlKey){if(this.currentCamera.name==="UI")return;const t=this.controls.get(this.currentCamera.name);e.key==="0"?(e.preventDefault(),this.clearControls(),this.cameraControls=new Oe(this.currentCamera,this.currentWindow.current),this.selectedItem instanceof o.Mesh||this.selectedItem instanceof o.SkinnedMesh?(this.selectedItem.geometry.computeBoundingBox(),this.cameraControls.fitToBox(this.selectedItem.geometry.boundingBox,!0)):this.cameraControls.fitToSphere(this.selectedItem,!0),this.updateCameraControls(t,!0)):e.key==="1"?(e.preventDefault(),this.clearControls(),this.cameraControls=new Oe(this.currentCamera,this.currentWindow.current),this.cameraControls.rotateTo(0,Math.PI*.5,!0),this.cameraControls.moveTo(this.selectedItem.position.x,this.selectedItem.position.y,0,!0),this.updateCameraControls(t)):e.key==="2"?(e.preventDefault(),this.clearControls(),this.cameraControls=new Oe(this.currentCamera,this.currentWindow.current),this.cameraControls.rotateTo(0,0,!0),this.cameraControls.moveTo(this.selectedItem.position.x,0,this.selectedItem.position.z,!0),this.updateCameraControls(t)):e.key==="3"?(e.preventDefault(),this.clearControls(),this.cameraControls=new Oe(this.currentCamera,this.currentWindow.current),this.cameraControls.rotateTo(Math.PI/2,Math.PI/2,!0),this.cameraControls.moveTo(0,this.selectedItem.position.y,this.selectedItem.position.z,!0),this.updateCameraControls(t)):e.key==="4"?(e.preventDefault(),this.clearControls(),this.cameraControls=new Oe(this.currentCamera,this.currentWindow.current),this.cameraControls.rotateTo(Math.PI,Math.PI/2,!0),this.cameraControls.moveTo(this.selectedItem.position.x,this.selectedItem.position.y,0,!0),this.updateCameraControls(t)):e.key==="5"&&(e.preventDefault(),this.clearControls(),this.cameraControls=new Oe(this.currentCamera,this.currentWindow.current),this.cameraControls.rotateTo(_i(45),_i(45),!0),this.updateCameraControls(t))}else if(this.currentTransform!==void 0)switch(e.key){case"r":this.currentTransform.setMode("rotate");break;case"s":this.currentTransform.setMode("scale");break;case"t":this.currentTransform.setMode("translate");break;case"q":this.currentTransform.setSpace(this.currentTransform.space==="local"?"world":"local");break}}};onSetSelectedItem=e=>{this.selectedItem!==void 0&&this.updateSelectedItemHelper(!1),this.selectedItem=this.currentScene.getObjectByProperty("uuid",e.value.uuid),this.selectedItem!==void 0&&(this.currentTransform!==void 0&&(this.currentTransform.removeEventListener("objectChange",this.onUpdateTransform),he.instance.remove(this.currentTransform.getHelper().name)),this.currentTransform=he.instance.add(e.value.name),this.currentTransform.attach(this.selectedItem),this.scene.add(this.currentTransform.getHelper()),this.currentTransform.addEventListener("objectChange",this.onUpdateTransform),this.updateSelectedItemHelper(!0))};updateSelectedItemHelper(e){if(this.selectedItem!==void 0)if(this.cameraVisibility){if(this.selectedItem.isLight===!0&&!this.lightVisibility){const t=this.lightHelpers.get(this.selectedItem.name);t!==void 0&&(t.visible=e)}}else{const t=this.cameraHelpers.get(this.selectedItem.name);t!==void 0&&(t.visible=e)}}onUpdateTransform=()=>{this.selectedItem!==void 0&&(this.props.three.updateObject(this.selectedItem.uuid,"position",this.selectedItem.position),this.props.three.updateObject(this.selectedItem.uuid,"rotation",{x:this.selectedItem.rotation.x,y:this.selectedItem.rotation.y,z:this.selectedItem.rotation.z}),this.props.three.updateObject(this.selectedItem.uuid,"scale",this.selectedItem.scale),Bt.instance.update())};clearLightHelpers=()=>{this.lightHelpers.forEach(e=>{this.helpersContainer.remove(e),e.dispose()}),this.lightHelpers.clear()};addLightHelpers=()=>{this.currentScene!==void 0&&this.currentScene.traverse(e=>{if(e.type.search("Light")>-1){let t;switch(e.type){case"DirectionalLight":t=new o.DirectionalLightHelper(e,100),t.name=`${e.name}Helper`,t.visible=this.lightVisibility,this.lightHelpers.set(e.name,t),this.helpersContainer.add(t);break;case"HemisphereLight":t=new o.HemisphereLightHelper(e,250),t.name=`${e.name}Helper`,t.visible=this.lightVisibility,this.lightHelpers.set(e.name,t),this.helpersContainer.add(t);break;case"RectAreaLight":t=new ya(e),t.name=`${e.name}Helper`,t.visible=this.lightVisibility,this.lightHelpers.set(e.name,t),this.helpersContainer.add(t);break;case"PointLight":t=new o.PointLightHelper(e,100),t.name=`${e.name}Helper`,t.visible=this.lightVisibility,this.lightHelpers.set(e.name,t),this.helpersContainer.add(t);break;case"SpotLight":t=new o.SpotLightHelper(e),t.name=`${e.name}Helper`,t.visible=this.lightVisibility,this.lightHelpers.set(e.name,t),this.helpersContainer.add(t);break}}})};createControls(e,t){const s=this.controls.get(e.name);if(s!==void 0&&s.dispose(),this.controls.delete(e.name),e.name==="UI")return;const n=new Ca(e,t);switch(n.enableDamping=!0,n.dampingFactor=.05,e.name){case"Top":case"Bottom":case"Left":case"Right":case"Front":case"Back":n.enableRotate=!1;break}this.controls.set(e.name,n)}clearCamera(e){const t=this.cameraHelpers.get(e.name);t!==void 0&&(this.scene.remove(t),t.dispose(),this.cameraHelpers.delete(e.name));const s=this.controls.get(e.name);s!==void 0&&(s.dispose(),this.controls.delete(e.name))}killControls(){this.controls.forEach((e,t)=>{e.dispose();const s=this.cameraHelpers.get(t);s!==void 0&&(this.scene.remove(s),s.dispose()),this.cameraHelpers.delete(t),this.controls.delete(t)}),this.controls.clear(),this.cameraHelpers.clear()}assignControls(){switch(this.state.mode){case"Single":this.createControls(this.tlCam,this.tlWindow.current);break;case"Side by Side":case"Stacked":this.createControls(this.tlCam,this.tlWindow.current),this.createControls(this.trCam,this.trWindow.current);break;case"Quad":this.createControls(this.tlCam,this.tlWindow.current),this.createControls(this.trCam,this.trWindow.current),this.createControls(this.blCam,this.blWindow.current),this.createControls(this.brCam,this.brWindow.current);break}}updateCamera=(e,t,s,n)=>{switch(this.state.mode){case"Quad":t<n?e<s?this.currentCamera=this.tlCam:this.currentCamera=this.trCam:e<s?this.currentCamera=this.blCam:this.currentCamera=this.brCam;break;case"Side by Side":e<s?this.currentCamera=this.tlCam:this.currentCamera=this.trCam;break;case"Single":this.currentCamera=this.tlCam;break;case"Stacked":t<n?this.currentCamera=this.tlCam:this.currentCamera=this.trCam;break}this.splineEditor.camera=this.currentCamera,this.raycaster.setFromCamera(this.pointer,this.currentCamera),this.currentCamera===this.tlCam?this.currentWindow=this.tlWindow:this.currentCamera===this.trCam?this.currentWindow=this.trWindow:this.currentCamera===this.blCam?this.currentWindow=this.blWindow:this.currentCamera===this.brCam&&(this.currentWindow=this.brWindow),he.instance.updateCamera(this.currentCamera,this.currentWindow.current)};updateCameraControls=(e,t=!1)=>{if(this.selectedItem===void 0)return;cancelAnimationFrame(this.cameraControlsRafID),this.cameraControlsRafID=-1,this.cameraControls&&(this.cameraControls.smoothTime=.1);const s=.15,n=new o.Clock;n.start(),this.selectedItem.getWorldPosition(e.target0);const r=()=>{const a=n.getDelta();this.cameraControls&&this.cameraControls.update(a),t&&(e.target.lerp(e.target0,s),e.object.position.lerp(e.position0,s),e.object.zoom=tt(e.object.zoom,e.zoom0,s),e.object.updateProjectionMatrix(),e.dispatchEvent({type:"change"})),n.getElapsedTime()>=.5?(cancelAnimationFrame(this.cameraControlsRafID),this.cameraControlsRafID=-1,this.clearControls()):this.cameraControlsRafID=requestAnimationFrame(r)};r()};clearControls=()=>{this.cameraControls!==void 0&&(this.cameraControls.disconnect(),this.cameraControls.dispose(),this.cameraControls=void 0)};saveExpandedCameraVisibility(){localStorage.setItem(this.expandedCameraVisibility,this.cameraVisibility?"open":"closed")}saveExpandedLightVisibility(){localStorage.setItem(this.expandedLightVisibility,this.lightVisibility?"open":"closed")}saveExpandedGridVisibility(){localStorage.setItem(this.expandedGridVisibility,this.gridVisibility?"open":"closed")}getSceneOverride(e){switch(e){case"Depth":return this.depthMaterial;case"Normals":return this.normalsMaterial;case"Renderer":return null;case"UVs":return this.uvMaterial;case"Wireframe":return this.wireframeMaterial}return null}drawTo(e,t,s,n,r,a){switch(r.name){case"Left":case"Right":this.grid.rotation.z=Math.PI/2;break;case"Front":case"Back":this.grid.rotation.x=Math.PI/2;break}this.scene.overrideMaterial=a,this.renderer?.setViewport(e,t,s,n),this.renderer?.setScissor(e,t,s,n),this.renderer?.render(this.scene,r),this.grid.rotation.set(0,0,0)}drawSingle(){const e=this.getSceneOverride(this.tlRender);this.drawTo(0,0,this.width,this.height,this.tlCam,e)}drawDouble=()=>{const e=this.getSceneOverride(this.tlRender),t=this.getSceneOverride(this.trRender),s=Math.floor(this.width/2),n=Math.floor(this.height/2);if(this.state.mode==="Side by Side")this.drawTo(0,0,s,this.height,this.tlCam,e),this.drawTo(s,0,s,this.height,this.trCam,t);else{const r=this.height-n;this.drawTo(0,r,this.width,n,this.tlCam,e),this.drawTo(0,0,this.width,n,this.trCam,t)}};drawQuad=()=>{const e=this.getSceneOverride(this.tlRender),t=this.getSceneOverride(this.trRender),s=this.getSceneOverride(this.blRender),n=this.getSceneOverride(this.brRender),r=Math.floor(this.width/2),a=Math.floor(this.height/2);let l=0,c=0;c=this.height-a,l=0,this.drawTo(l,c,r,a,this.tlCam,e),l=r,this.drawTo(l,c,r,a,this.trCam,t),c=0,l=0,this.scene.overrideMaterial=s,this.drawTo(l,c,r,a,this.blCam,s),l=r,this.drawTo(l,c,r,a,this.brCam,n)};get appID(){return this.props.three.app.appID}get mode(){return this.state.mode}get three(){return this.props.three}get expandedCameraVisibility(){return`${this.appID}_multiviewCameraVisibility`}get expandedLightVisibility(){return`${this.appID}_multiviewLightVisibility`}get expandedGridVisibility(){return`${this.appID}_multiviewGridVisibility`}}class Bt extends T.Component{static instance;app;matrix=new o.Matrix4;position=new o.Vector3;rotation=new o.Euler;scale=new o.Vector3;open=!1;constructor(e){super(e),this.app=e.app;const t=localStorage.getItem(this.expandedName),s=t!==null?t==="open":!1;this.open=s,this.saveExpanded(),this.state={lastUpdated:0,expanded:s},this.matrix.elements=e.object.matrix,e.object.uuid.length>0&&(this.position.setFromMatrixPosition(this.matrix),this.rotation.setFromRotationMatrix(this.matrix),this.scale.setFromMatrixScale(this.matrix)),Bt.instance=this}update(){if(oe.instance){const e=oe.instance.selectedItem;if(e===void 0)return;this.position.x=ye(e.position.x,3),this.position.y=ye(e.position.y,3),this.position.z=ye(e.position.z,3),this.rotation.copy(e.rotation),this.scale.x=ye(e.scale.x,3),this.scale.y=ye(e.scale.y,3),this.scale.z=ye(e.scale.z,3),this.setState({lastUpdated:Date.now()})}}render(){return p.jsx(be,{app:this.app,title:"Transform",expanded:this.open,items:[{title:"Position",prop:"position",type:"grid3",step:.1,value:this.position,onChange:this.updateTransform},{title:"Rotation",prop:"rotation",type:"euler",value:this.rotation,onChange:this.updateTransform},{title:"Scale",prop:"scale",type:"grid3",value:this.scale,onChange:this.updateTransform},{title:"Visible",prop:"visible",type:"boolean",value:this.props.object.visible,onChange:this.updateTransform}],onToggle:e=>{this.open=e,this.saveExpanded()}},this.state.lastUpdated)}updateTransform=(e,t)=>{const s=e==="rotation"?{x:t._x,y:t._y,z:t._z}:t;this.props.three.updateObject(this.props.object.uuid,e,s);const n=this.props.three.getScene(this.props.object.uuid);if(n){const r=n.getObjectByProperty("uuid",this.props.object.uuid);ee(r,e,s)}};saveExpanded(){localStorage.setItem(this.expandedName,this.open?"open":"closed")}get expandedName(){return`${this.props.three.app.appID}_transform`}}function ps(i){switch(i){case"color":return"Color";case"intensity":return"Intensity";case"decay":return"Decay";case"distance":return"Distance";case"angle":return"Angle";case"penumbra":return"Penumbra";case"groundColor":return"Ground Color";case"width":return"Width";case"height":return"Height"}return i}function sr(i,e,t){function s(){return`${t.app.appID}_light`}const n=localStorage.getItem(s()),r=n!==null?n==="open":!1;function a(c){localStorage.setItem(s(),c?"open":"closed")}const l=[];if(i.lightInfo!==void 0)for(const c in i.lightInfo){const h=i.lightInfo[c];h!==void 0&&(h.isColor!==void 0?l.push({title:ps(c),prop:c,type:"color",value:h,onChange:(u,f)=>{const m=new o.Color(f);t.updateObject(i.uuid,u,m);const g=t.getScene(i.uuid);if(g!==null){const E=g.getObjectByProperty("uuid",i.uuid);ee(E,u,m)}}}):l.push({title:ps(c),prop:c,type:typeof h,value:h,step:typeof h=="number"?.01:void 0,onChange:(u,f)=>{t.updateObject(i.uuid,u,f);const m=t.getScene(i.uuid);if(m!==null){const g=m.getObjectByProperty("uuid",i.uuid);ee(g,u,f)}}}))}return p.jsx(be,{app:e,title:"Light",items:l,expanded:r,onToggle:c=>{a(c)}})}function nr(i){const e=i.object,t=i.three;function s(){return`${t.app.appID}_animation`}const n=localStorage.getItem(s()),r=n!==null?n==="open":!1;function a(m){localStorage.setItem(s(),m?"open":"closed")}const l=[],c=[];let h=0;e.animations.forEach(m=>{h=Math.max(h,m.duration),m.duration>0&&c.push({title:m.name,items:[{title:"Duration",type:"number",value:m.duration,disabled:!0},{title:"Blend Mode",type:"option",disabled:!0,options:[{title:"Normal",value:2500},{title:"Additive",value:2501}]}]})}),l.push({title:"Animations",items:c});let u;const f=t.getScene(e.uuid);if(f!==null){const m=f.getObjectByProperty("uuid",e.uuid);if(m!==void 0){const g=m.mixer;if(g!==void 0){const y=[{title:"Time Scale",type:"range",value:g.timeScale,step:.01,min:-1,max:2,onChange:(O,_)=>{g.timeScale=_,t.updateObject(e.uuid,"mixer.timeScale",_)}}];y.push({title:"Stop All",type:"button",onChange:()=>{g.stopAllAction(),t.requestMethod(e.uuid,"stopAllAction",void 0,"mixer")}}),l.push({title:"Mixer",items:y}),u=new o.SkeletonHelper(m),oe.instance?.scene.add(u)}}}return T.useEffect(()=>()=>{u!==void 0&&Me(u)},[]),p.jsx(be,{app:i.app,title:"Animation",items:l,expanded:r,onToggle:m=>{a(m)}})}const bi={name:"",uuid:"",type:"",visible:!1,matrix:[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],animations:[],material:void 0,perspectiveCameraInfo:void 0,orthographicCameraInfo:void 0,lightInfo:void 0,children:[]};let re={...bi};function Ps(i){const[e,t]=T.useState(-1);T.useEffect(()=>{function a(c){re={...c.value},t(Date.now())}function l(){re={...bi},t(Date.now())}return i.app.addEventListener(P.SET_SCENE,l),i.app.addEventListener(P.SET_OBJECT,a),()=>{i.app.removeEventListener(P.SET_SCENE,l),i.app.removeEventListener(P.SET_OBJECT,a)}},[]);const s=re.type.toLowerCase(),n=re.animations.length>0||re.mixer!==void 0,r=s.search("mesh")>-1||s.search("line")>-1||s.search("points")>-1;return p.jsx(Ct,{app:i.app,label:"Inspector",button:re.uuid.length>0?p.jsx("button",{className:"remove",onClick:()=>{he.instance.remove(re.name),re={...bi},t(Date.now())}}):void 0,children:p.jsx("div",{id:"Inspector",className:i.class,children:re.uuid.length>0&&p.jsxs(p.Fragment,{children:[p.jsxs(p.Fragment,{children:[p.jsx(Ut,{type:"string",title:"Name",prop:"name",value:re.name,disabled:!0}),p.jsx(Ut,{type:"string",title:"Type",prop:"type",value:re.type,disabled:!0}),p.jsx(Ut,{type:"string",title:"UUID",prop:"uuid",value:re.uuid,disabled:!0})]}),p.jsxs(p.Fragment,{children:[p.jsx(Bt,{object:re,app:i.app,three:i.three}),n?p.jsx(nr,{app:i.app,object:re,three:i.three}):null,s.search("camera")>-1?va(re,i.app,i.three):null,s.search("light")>-1?sr(re,i.app,i.three):null,r?fa(re,i.app,i.three):null]})]})},e)},"Inspector")}class ar extends T.Component{app;autoClear=!0;autoClearColor=!0;autoClearDepth=!0;autoClearStencil=!0;outputColorSpace=o.SRGBColorSpace;localClippingEnabled=!1;clearColor=new o.Color(0);clearAlpha=1;toneMapping=o.NoToneMapping;toneMappingExposure=1;constructor(e){super(e),this.app=e.app;const t=localStorage.getItem(this.expandedName),s=t!==null?t==="open":!1;if(this.state={expanded:s,lastUpdated:Date.now()},this.saveExpanded(s),oe.instance){const n=oe.instance.renderer;n&&(this.autoClear=n.autoClear,this.autoClearColor=n.autoClearColor,this.autoClearDepth=n.autoClearDepth,this.autoClearStencil=n.autoClearStencil,this.outputColorSpace=n.outputColorSpace,this.localClippingEnabled=n.localClippingEnabled,this.clearAlpha=n.getClearAlpha(),this.toneMapping=n.toneMapping,this.toneMappingExposure=n.toneMappingExposure,n.getClearColor(this.clearColor))}this.app.addEventListener(P.ADD_RENDERER,this.onAddRenderer)}componentwillunmount(){this.app.removeEventListener(P.ADD_RENDERER,this.onAddRenderer)}onAddRenderer=e=>{const t=e.value;if(this.autoClear=t.autoClear,this.autoClearColor=t.autoClearColor,this.autoClearDepth=t.autoClearDepth,this.autoClearStencil=t.autoClearStencil,this.outputColorSpace=t.outputColorSpace,this.localClippingEnabled=t.localClippingEnabled,this.clearAlpha=t.clearAlpha,this.toneMapping=t.toneMapping,this.toneMappingExposure=t.toneMappingExposure,this.clearColor.setStyle(t.clearColor,o.LinearSRGBColorSpace),o.ColorManagement.enabled=t.colorManagement,oe.instance){const s=oe.instance.renderer;s&&(s.autoClear=this.autoClear,s.autoClearColor=this.autoClearColor,s.autoClearDepth=this.autoClearDepth,s.autoClearStencil=this.autoClearStencil,s.outputColorSpace=this.outputColorSpace,s.localClippingEnabled=this.localClippingEnabled,s.toneMapping=this.toneMapping,s.toneMappingExposure=this.toneMappingExposure,s.setClearColor(t.clearColor,this.clearAlpha))}this.setState({lastUpdated:Date.now()})};render(){const e=()=>{if(oe.instance){const t=oe.instance.renderer;t&&(t.autoClear=this.autoClear,t.autoClearColor=this.autoClearColor,t.autoClearDepth=this.autoClearDepth,t.autoClearStencil=this.autoClearStencil,t.outputColorSpace=this.outputColorSpace,t.localClippingEnabled=this.localClippingEnabled,t.toneMapping=this.toneMapping,t.toneMappingExposure=this.toneMappingExposure,t.setClearColor(this.clearColor.getStyle(),this.clearAlpha),this.props.three.updateRenderer({autoClear:this.autoClear,autoClearColor:this.autoClearColor,autoClearDepth:this.autoClearDepth,autoClearStencil:this.autoClearStencil,outputColorSpace:this.outputColorSpace,localClippingEnabled:this.localClippingEnabled,clearAlpha:this.clearAlpha,clearColor:this.clearColor.getStyle(),colorManagement:o.ColorManagement.enabled,toneMapping:this.toneMapping,toneMappingExposure:this.toneMappingExposure}))}};return p.jsx(be,{app:this.app,title:"Renderer",expanded:this.state.expanded,items:[{type:"boolean",title:"Auto Clear",value:this.autoClear,onChange:(t,s)=>{this.autoClear=s}},{type:"boolean",title:"Auto Clear Color",value:this.autoClearColor,onChange:(t,s)=>{this.autoClearColor=s,e()}},{type:"boolean",title:"Auto Clear Depth",value:this.autoClearDepth,onChange:(t,s)=>{this.autoClearDepth=s,e()}},{type:"boolean",title:"Auto Clear Stencil",value:this.autoClearStencil,onChange:(t,s)=>{this.autoClearStencil=s,e()}},{type:"boolean",title:"Local Clipping",value:this.localClippingEnabled,onChange:(t,s)=>{this.localClippingEnabled=s,e()}},{type:"color",title:"Clear Color",value:`#${this.clearColor.getHexString()}`,onChange:(t,s)=>{this.clearColor.setStyle(s),e()}},{type:"range",title:"Clear Alpha",min:0,max:1,step:.01,value:this.clearAlpha,onChange:(t,s)=>{this.clearAlpha=s,e()}},{type:"boolean",title:"Clear Management",value:o.ColorManagement.enabled,onChange:(t,s)=>{o.ColorManagement.enabled=s,e()}},{type:"option",title:"Color Space",value:this.outputColorSpace,options:[{title:"No Color Space",value:o.NoColorSpace},{title:"SRB Color Space",value:o.SRGBColorSpace},{title:"Linear SRB Color Space",value:o.LinearSRGBColorSpace}],onChange:(t,s)=>{this.outputColorSpace=s,e()}},{type:"option",title:"Tone Mapping",value:this.toneMapping,options:[{title:"None ",value:o.NoToneMapping},{title:"Linear ",value:o.LinearToneMapping},{title:"Reinhard",value:o.ReinhardToneMapping},{title:"Cineon ",value:o.CineonToneMapping},{title:"ACES Filmic",value:o.ACESFilmicToneMapping},{title:"AgX",value:o.AgXToneMapping},{title:"Neutral",value:o.NeutralToneMapping},{title:"Custom",value:o.CustomToneMapping}],onChange:(t,s)=>{this.toneMapping=s,e()}},{type:"range",title:"Tone Mapping Exposure",value:this.toneMappingExposure,min:0,max:2,step:.01,onChange:(t,s)=>{this.toneMappingExposure=s,e()}}],onToggle:t=>{this.setState({expanded:t}),this.saveExpanded(t)}},Math.random())}saveExpanded(e){localStorage.setItem(this.expandedName,e?"open":"closed")}get expandedName(){return`${this.props.three.app.appID}_renderer`}}function Rs(i){const[e]=T.useState([]),[t]=T.useState([]),[s,n]=T.useState(0),r=c=>{const h=c.value;e.push(h),t.push(p.jsx(Ct,{app:i.app,label:`Scene: ${h.name}`,scene:h,open:!0,onRefresh:()=>{i.three.refreshScene(h.name)},children:p.jsx(gi,{app:i.app,child:h,scene:h,three:i.three})},Math.random())),n(Date.now())},a=c=>{const h=c.value;for(let u=0;u<e.length;u++)if(h.uuid===e[u].uuid){e[u]=h,t[u]=p.jsx(Ct,{app:i.app,label:`Scene: ${h.name}`,scene:h,open:!0,onRefresh:()=>{i.three.refreshScene(h.name)},children:p.jsx(gi,{app:i.app,child:h,scene:h,three:i.three})},Math.random()),n(Date.now());return}},l=c=>{const h=c.value;for(let u=0;u<e.length;u++)if(h.uuid===e[u].uuid){e.splice(u,1),t.splice(u,1),n(Date.now());return}};return T.useEffect(()=>(i.app.addEventListener(P.ADD_SCENE,r),i.app.addEventListener(P.REFRESH_SCENE,a),i.app.addEventListener(P.REMOVE_SCENE,l),()=>{i.app.removeEventListener(P.ADD_SCENE,r),i.app.removeEventListener(P.REFRESH_SCENE,a),i.app.removeEventListener(P.REMOVE_SCENE,l)}),[]),p.jsxs("div",{id:"SidePanel",children:[p.jsx("div",{className:"scenes",children:t},s),p.jsx(Ps,{app:i.app,three:i.three}),p.jsx(ar,{app:i.app,three:i.three}),p.jsx(B,{app:i.app,three:i.three})]})}function rr(i){return T.useEffect(()=>{function e(l){let c=null;return i.three.scenes.forEach(h=>{l.search(h.uuid)>-1&&(c=h)}),c}const t=l=>{const c=l.value,u=e(c)?.getObjectByProperty("uuid",c);u!==void 0&&i.three.setObject(u)},s=(l,c,h)=>{const f=e(l)?.getObjectByProperty("uuid",l);f!==void 0&&ee(f,c,h)},n=l=>{const c=l.value,{key:h,value:u,uuid:f}=c;s(f,h,u)},r=l=>{const c=l.value,u=e(c.uuid)?.getObjectByProperty("uuid",c.uuid);if(u!==void 0){const f=m=>{const g=c.key.split(".");switch(g.length){case 1:u[g[0]]=m;break;case 2:u[g[0]][g[1]]=m;break;case 3:u[g[0]][g[1]][g[2]]=m;break;case 4:u[g[0]][g[1]][g[2]][g[3]]=m;break;case 5:u[g[0]][g[1]][g[2]][g[3]][g[4]]=m;break}u.material.needsUpdate=!0};c.value.src.length>0?Cs(c.value.src).then(m=>{m.offset.set(c.value.offset[0],c.value.offset[1]),m.repeat.set(c.value.repeat[0],c.value.repeat[1]),f(m)}):f(null)}},a=l=>{const{key:c,uuid:h,value:u,subitem:f}=l.value,g=e(h)?.getObjectByProperty("uuid",h);if(g!==void 0)try{f!==void 0?Bn(g,f)[c](u):g[c](u)}catch(E){console.log("Error requesting method:"),console.log(E),console.log(c),console.log(u)}};return i.app.addEventListener(P.GET_OBJECT,t),i.app.addEventListener(P.UPDATE_OBJECT,n),i.app.addEventListener(P.CREATE_TEXTURE,r),i.app.addEventListener(P.REQUEST_METHOD,a),()=>{i.app.removeEventListener(P.GET_OBJECT,t),i.app.removeEventListener(P.UPDATE_OBJECT,n),i.app.removeEventListener(P.CREATE_TEXTURE,r),i.app.removeEventListener(P.REQUEST_METHOD,a)}},[]),null}function Ds(i){return p.jsxs("div",{className:"editor",ref:i.ref,style:i.style,children:[p.jsx("div",{className:"header",children:i.header}),i.children,p.jsx("div",{className:"footer",children:i.footer})]})}function or(i){return p.jsx(Ds,{children:p.jsxs(p.Fragment,{children:[p.jsx(oe,{app:i.app,three:i.three,scenes:i.scenes,onSceneResize:i.onSceneResize,onSceneSet:i.onSceneSet,onSceneUpdate:i.onSceneUpdate}),p.jsx(Rs,{app:i.app,three:i.three})]})})}exports.Accordion=Ct;exports.AppRunner=Dn;exports.Application=Rn;exports.BaseRemote=Ht;exports.BaseScene=In;exports.ChildObject=wi;exports.ContainerObject=gi;exports.Draggable=Ss;exports.DraggableItem=Es;exports.Dropdown=ws;exports.DropdownItem=xs;exports.Editor=Ds;exports.ElementProxy=An;exports.ElementProxyReceiver=bs;exports.ExportTexture=vt;exports.Inspector=Ps;exports.MultiView=oe;exports.NavButton=Si;exports.ProxyManager=Pn;exports.QualityType=vs;exports.RemoteComponents=Ln;exports.RemoteTheatre=Fn;exports.RemoteThree=Gn;exports.SceneInspector=rr;exports.SidePanel=Rs;exports.Spline=yi;exports.SplineEditor=As;exports.ThreeEditor=or;exports.ToolEvents=P;exports.Transform=he;exports.WebworkerEventHandlers=On;exports.capitalize=bt;exports.clamp=Ue;exports.colorToHex=ui;exports.copyToClipboard=ms;exports.cubicBezier=vn;exports.customizeTheatreElements=Un;exports.damp=un;exports.defaultTheatreCallback=sn;exports.detectMaxFrameRate=ys;exports.detectSettings=cn;exports.dispose=Me;exports.disposeMaterial=Ci;exports.disposeTexture=pi;exports.distance=dn;exports.hierarchyUUID=Ft;exports.isColor=gs;exports.map=hn;exports.mix=tt;exports.noop=yt;exports.normalize=Nt;exports.parseModelLite=yn;exports.randomID=fs;exports.resetThreeObjects=mi;exports.round=ye;exports.roundTo=pn;exports.theatreEditorApp=kn;