@tomorrowevening/hermes 0.0.171 → 0.0.172
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/hermes.cjs.js +1 -1
- package/dist/hermes.css +1 -1
- package/dist/hermes.es.js +77 -80
- package/package.json +1 -1
package/dist/hermes.cjs.js
CHANGED
|
@@ -597,4 +597,4 @@ void main() {
|
|
|
597
597
|
void main() {
|
|
598
598
|
#include <clipping_planes_fragment>
|
|
599
599
|
gl_FragColor = vec4(vec3(vUv, 0.0), 1.0);
|
|
600
|
-
}`;class rN extends x.ShaderMaterial{constructor(){super({defines:{USE_UV:""},vertexShader:iN,fragmentShader:nN})}}const Qi=new x.Raycaster,xt=new x.Vector3,_i=new x.Vector3,Ve=new x.Quaternion,Vf={X:new x.Vector3(1,0,0),Y:new x.Vector3(0,1,0),Z:new x.Vector3(0,0,1)},ih={type:"change"},Hf={type:"mouseDown",mode:null},Wf={type:"mouseUp",mode:null},$f={type:"objectChange"};class aN extends x.Controls{constructor(e,t=null){super(void 0,t);const s=new dN(this);this._root=s;const i=new pN;this._gizmo=i,s.add(i);const n=new fN;this._plane=n,s.add(n);const r=this;function o(b,T){let S=T;Object.defineProperty(r,b,{get:function(){return S!==void 0?S:T},set:function(C){S!==C&&(S=C,n[b]=C,i[b]=C,r.dispatchEvent({type:b+"-changed",value:C}),r.dispatchEvent(ih))}}),r[b]=T,n[b]=T,i[b]=T}o("camera",e),o("object",void 0),o("enabled",!0),o("axis",null),o("mode","translate"),o("translationSnap",null),o("rotationSnap",null),o("scaleSnap",null),o("space","world"),o("size",1),o("dragging",!1),o("showX",!0),o("showY",!0),o("showZ",!0),o("minX",-1/0),o("maxX",1/0),o("minY",-1/0),o("maxY",1/0),o("minZ",-1/0),o("maxZ",1/0);const l=new x.Vector3,c=new x.Vector3,h=new x.Quaternion,u=new x.Quaternion,d=new x.Vector3,p=new x.Quaternion,f=new x.Vector3,m=new x.Vector3,y=new x.Vector3,g=0,_=new x.Vector3;o("worldPosition",l),o("worldPositionStart",c),o("worldQuaternion",h),o("worldQuaternionStart",u),o("cameraPosition",d),o("cameraQuaternion",p),o("pointStart",f),o("pointEnd",m),o("rotationAxis",y),o("rotationAngle",g),o("eye",_),this._offset=new x.Vector3,this._startNorm=new x.Vector3,this._endNorm=new x.Vector3,this._cameraScale=new x.Vector3,this._parentPosition=new x.Vector3,this._parentQuaternion=new x.Quaternion,this._parentQuaternionInv=new x.Quaternion,this._parentScale=new x.Vector3,this._worldScaleStart=new x.Vector3,this._worldQuaternionInv=new x.Quaternion,this._worldScale=new x.Vector3,this._positionStart=new x.Vector3,this._quaternionStart=new x.Quaternion,this._scaleStart=new x.Vector3,this._getPointer=oN.bind(this),this._onPointerDown=cN.bind(this),this._onPointerHover=lN.bind(this),this._onPointerMove=hN.bind(this),this._onPointerUp=uN.bind(this),t!==null&&this.connect(t)}connect(e){super.connect(e),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&&Qi.setFromCamera(e,this.camera);const t=nh(this._gizmo.picker[this.mode],Qi);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&&Qi.setFromCamera(e,this.camera);const t=nh(this._plane,Qi,!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,Hf.mode=this.mode,this.dispatchEvent(Hf)}}pointerMove(e){const t=this.axis,s=this.mode,i=this.object;let n=this.space;if(s==="scale"?n="local":(t==="E"||t==="XYZE"||t==="XYZ")&&(n="world"),i===void 0||t===null||this.dragging===!1||e!==null&&e.button!==-1)return;e!==null&&Qi.setFromCamera(e,this.camera);const r=nh(this._plane,Qi,!0);if(r){if(this.pointEnd.copy(r.point).sub(this.worldPositionStart),s==="translate")this._offset.copy(this.pointEnd).sub(this.pointStart),n==="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),n==="local"&&t!=="XYZ"?this._offset.applyQuaternion(this._quaternionStart).divide(this._parentScale):this._offset.applyQuaternion(this._parentQuaternionInv).divide(this._parentScale),i.position.copy(this._offset).add(this._positionStart),this.translationSnap&&(n==="local"&&(i.position.applyQuaternion(Ve.copy(this._quaternionStart).invert()),t.search("X")!==-1&&(i.position.x=Math.round(i.position.x/this.translationSnap)*this.translationSnap),t.search("Y")!==-1&&(i.position.y=Math.round(i.position.y/this.translationSnap)*this.translationSnap),t.search("Z")!==-1&&(i.position.z=Math.round(i.position.z/this.translationSnap)*this.translationSnap),i.position.applyQuaternion(this._quaternionStart)),n==="world"&&(i.parent&&i.position.add(xt.setFromMatrixPosition(i.parent.matrixWorld)),t.search("X")!==-1&&(i.position.x=Math.round(i.position.x/this.translationSnap)*this.translationSnap),t.search("Y")!==-1&&(i.position.y=Math.round(i.position.y/this.translationSnap)*this.translationSnap),t.search("Z")!==-1&&(i.position.z=Math.round(i.position.z/this.translationSnap)*this.translationSnap),i.parent&&i.position.sub(xt.setFromMatrixPosition(i.parent.matrixWorld)))),i.position.x=Math.max(this.minX,Math.min(this.maxX,i.position.x)),i.position.y=Math.max(this.minY,Math.min(this.maxY,i.position.y)),i.position.z=Math.max(this.minZ,Math.min(this.maxZ,i.position.z));else if(s==="scale"){if(t.search("XYZ")!==-1){let o=this.pointEnd.length()/this.pointStart.length();this.pointEnd.dot(this.pointStart)<0&&(o*=-1),_i.set(o,o,o)}else xt.copy(this.pointStart),_i.copy(this.pointEnd),xt.applyQuaternion(this._worldQuaternionInv),_i.applyQuaternion(this._worldQuaternionInv),_i.divide(xt),t.search("X")===-1&&(_i.x=1),t.search("Y")===-1&&(_i.y=1),t.search("Z")===-1&&(_i.z=1);i.scale.copy(this._scaleStart).multiply(_i),this.scaleSnap&&(t.search("X")!==-1&&(i.scale.x=Math.round(i.scale.x/this.scaleSnap)*this.scaleSnap||this.scaleSnap),t.search("Y")!==-1&&(i.scale.y=Math.round(i.scale.y/this.scaleSnap)*this.scaleSnap||this.scaleSnap),t.search("Z")!==-1&&(i.scale.z=Math.round(i.scale.z/this.scaleSnap)*this.scaleSnap||this.scaleSnap))}else if(s==="rotate"){this._offset.copy(this.pointEnd).sub(this.pointStart);const o=20/this.worldPosition.distanceTo(xt.setFromMatrixPosition(this.camera.matrixWorld));let l=!1;t==="XYZE"?(this.rotationAxis.copy(this._offset).cross(this.eye).normalize(),this.rotationAngle=this._offset.dot(xt.copy(this.rotationAxis).cross(this.eye))*o):(t==="X"||t==="Y"||t==="Z")&&(this.rotationAxis.copy(Vf[t]),xt.copy(Vf[t]),n==="local"&&xt.applyQuaternion(this.worldQuaternion),xt.cross(this.eye),xt.length()===0?l=!0:this.rotationAngle=this._offset.dot(xt.normalize())*o),(t==="E"||l)&&(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),n==="local"&&t!=="E"&&t!=="XYZE"?(i.quaternion.copy(this._quaternionStart),i.quaternion.multiply(Ve.setFromAxisAngle(this.rotationAxis,this.rotationAngle)).normalize()):(this.rotationAxis.applyQuaternion(this._parentQuaternionInv),i.quaternion.copy(Ve.setFromAxisAngle(this.rotationAxis,this.rotationAngle)),i.quaternion.multiply(this._quaternionStart).normalize())}this.dispatchEvent(ih),this.dispatchEvent($f)}}pointerUp(e){e!==null&&e.button!==0||(this.dragging&&this.axis!==null&&(Wf.mode=this.mode,this.dispatchEvent(Wf)),this.dragging=!1,this.axis=null)}dispose(){this.disconnect(),this._root.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(ih),this.dispatchEvent($f),this.pointStart.copy(this.pointEnd))}getRaycaster(){return Qi}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 oN(a){if(this.domElement.ownerDocument.pointerLockElement)return{x:0,y:0,button:a.button};{const e=this.domElement.getBoundingClientRect();return{x:(a.clientX-e.left)/e.width*2-1,y:-(a.clientY-e.top)/e.height*2+1,button:a.button}}}function lN(a){if(this.enabled)switch(a.pointerType){case"mouse":case"pen":this.pointerHover(this._getPointer(a));break}}function cN(a){this.enabled&&(document.pointerLockElement||this.domElement.setPointerCapture(a.pointerId),this.domElement.addEventListener("pointermove",this._onPointerMove),this.pointerHover(this._getPointer(a)),this.pointerDown(this._getPointer(a)))}function hN(a){this.enabled&&this.pointerMove(this._getPointer(a))}function uN(a){this.enabled&&(this.domElement.releasePointerCapture(a.pointerId),this.domElement.removeEventListener("pointermove",this._onPointerMove),this.pointerUp(this._getPointer(a)))}function nh(a,e,t){const s=e.intersectObject(a,!0);for(let i=0;i<s.length;i++)if(s[i].object.visible||t)return s[i];return!1}const To=new x.Euler,Fe=new x.Vector3(0,1,0),jf=new x.Vector3(0,0,0),qf=new x.Matrix4,So=new x.Quaternion,Io=new x.Quaternion,Rs=new x.Vector3,Yf=new x.Matrix4,sa=new x.Vector3(1,0,0),sn=new x.Vector3(0,1,0),ia=new x.Vector3(0,0,1),vo=new x.Vector3,qr=new x.Vector3,Yr=new x.Vector3;class dN extends x.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)}dispose(){this.traverse(function(e){e.geometry&&e.geometry.dispose(),e.material&&e.material.dispose()})}}class pN extends x.Object3D{constructor(){super(),this.isTransformControlsGizmo=!0,this.type="TransformControlsGizmo";const e=new x.MeshBasicMaterial({depthTest:!1,depthWrite:!1,fog:!1,toneMapped:!1,transparent:!0}),t=new x.LineBasicMaterial({depthTest:!1,depthWrite:!1,fog:!1,toneMapped:!1,transparent:!0}),s=e.clone();s.opacity=.15;const i=t.clone();i.opacity=.5;const n=e.clone();n.color.setHex(16711680);const r=e.clone();r.color.setHex(65280);const o=e.clone();o.color.setHex(255);const l=e.clone();l.color.setHex(16711680),l.opacity=.5;const c=e.clone();c.color.setHex(65280),c.opacity=.5;const h=e.clone();h.color.setHex(255),h.opacity=.5;const u=e.clone();u.opacity=.25;const d=e.clone();d.color.setHex(16776960),d.opacity=.25,e.clone().color.setHex(16776960);const f=e.clone();f.color.setHex(7895160);const m=new x.CylinderGeometry(0,.04,.1,12);m.translate(0,.05,0);const y=new x.BoxGeometry(.08,.08,.08);y.translate(0,.04,0);const g=new x.BufferGeometry;g.setAttribute("position",new x.Float32BufferAttribute([0,0,0,1,0,0],3));const _=new x.CylinderGeometry(.0075,.0075,.5,3);_.translate(0,.25,0);function b(Q,we){const ue=new x.TorusGeometry(Q,.0075,3,64,we*Math.PI*2);return ue.rotateY(Math.PI/2),ue.rotateX(Math.PI/2),ue}function T(){const Q=new x.BufferGeometry;return Q.setAttribute("position",new x.Float32BufferAttribute([0,0,0,1,1,1],3)),Q}const S={X:[[new x.Mesh(m,n),[.5,0,0],[0,0,-Math.PI/2]],[new x.Mesh(m,n),[-.5,0,0],[0,0,Math.PI/2]],[new x.Mesh(_,n),[0,0,0],[0,0,-Math.PI/2]]],Y:[[new x.Mesh(m,r),[0,.5,0]],[new x.Mesh(m,r),[0,-.5,0],[Math.PI,0,0]],[new x.Mesh(_,r)]],Z:[[new x.Mesh(m,o),[0,0,.5],[Math.PI/2,0,0]],[new x.Mesh(m,o),[0,0,-.5],[-Math.PI/2,0,0]],[new x.Mesh(_,o),null,[Math.PI/2,0,0]]],XYZ:[[new x.Mesh(new x.OctahedronGeometry(.1,0),u.clone()),[0,0,0]]],XY:[[new x.Mesh(new x.BoxGeometry(.15,.15,.01),h.clone()),[.15,.15,0]]],YZ:[[new x.Mesh(new x.BoxGeometry(.15,.15,.01),l.clone()),[0,.15,.15],[0,Math.PI/2,0]]],XZ:[[new x.Mesh(new x.BoxGeometry(.15,.15,.01),c.clone()),[.15,0,.15],[-Math.PI/2,0,0]]]},C={X:[[new x.Mesh(new x.CylinderGeometry(.2,0,.6,4),s),[.3,0,0],[0,0,-Math.PI/2]],[new x.Mesh(new x.CylinderGeometry(.2,0,.6,4),s),[-.3,0,0],[0,0,Math.PI/2]]],Y:[[new x.Mesh(new x.CylinderGeometry(.2,0,.6,4),s),[0,.3,0]],[new x.Mesh(new x.CylinderGeometry(.2,0,.6,4),s),[0,-.3,0],[0,0,Math.PI]]],Z:[[new x.Mesh(new x.CylinderGeometry(.2,0,.6,4),s),[0,0,.3],[Math.PI/2,0,0]],[new x.Mesh(new x.CylinderGeometry(.2,0,.6,4),s),[0,0,-.3],[-Math.PI/2,0,0]]],XYZ:[[new x.Mesh(new x.OctahedronGeometry(.2,0),s)]],XY:[[new x.Mesh(new x.BoxGeometry(.2,.2,.01),s),[.15,.15,0]]],YZ:[[new x.Mesh(new x.BoxGeometry(.2,.2,.01),s),[0,.15,.15],[0,Math.PI/2,0]]],XZ:[[new x.Mesh(new x.BoxGeometry(.2,.2,.01),s),[.15,0,.15],[-Math.PI/2,0,0]]]},w={START:[[new x.Mesh(new x.OctahedronGeometry(.01,2),i),null,null,null,"helper"]],END:[[new x.Mesh(new x.OctahedronGeometry(.01,2),i),null,null,null,"helper"]],DELTA:[[new x.Line(T(),i),null,null,null,"helper"]],X:[[new x.Line(g,i.clone()),[-1e3,0,0],null,[1e6,1,1],"helper"]],Y:[[new x.Line(g,i.clone()),[0,-1e3,0],[0,0,Math.PI/2],[1e6,1,1],"helper"]],Z:[[new x.Line(g,i.clone()),[0,0,-1e3],[0,-Math.PI/2,0],[1e6,1,1],"helper"]]},R={XYZE:[[new x.Mesh(b(.5,1),f),null,[0,Math.PI/2,0]]],X:[[new x.Mesh(b(.5,.5),n)]],Y:[[new x.Mesh(b(.5,.5),r),null,[0,0,-Math.PI/2]]],Z:[[new x.Mesh(b(.5,.5),o),null,[0,Math.PI/2,0]]],E:[[new x.Mesh(b(.75,1),d),null,[0,Math.PI/2,0]]]},P={AXIS:[[new x.Line(g,i.clone()),[-1e3,0,0],null,[1e6,1,1],"helper"]]},z={XYZE:[[new x.Mesh(new x.SphereGeometry(.25,10,8),s)]],X:[[new x.Mesh(new x.TorusGeometry(.5,.1,4,24),s),[0,0,0],[0,-Math.PI/2,-Math.PI/2]]],Y:[[new x.Mesh(new x.TorusGeometry(.5,.1,4,24),s),[0,0,0],[Math.PI/2,0,0]]],Z:[[new x.Mesh(new x.TorusGeometry(.5,.1,4,24),s),[0,0,0],[0,0,-Math.PI/2]]],E:[[new x.Mesh(new x.TorusGeometry(.75,.1,2,24),s)]]},$={X:[[new x.Mesh(y,n),[.5,0,0],[0,0,-Math.PI/2]],[new x.Mesh(_,n),[0,0,0],[0,0,-Math.PI/2]],[new x.Mesh(y,n),[-.5,0,0],[0,0,Math.PI/2]]],Y:[[new x.Mesh(y,r),[0,.5,0]],[new x.Mesh(_,r)],[new x.Mesh(y,r),[0,-.5,0],[0,0,Math.PI]]],Z:[[new x.Mesh(y,o),[0,0,.5],[Math.PI/2,0,0]],[new x.Mesh(_,o),[0,0,0],[Math.PI/2,0,0]],[new x.Mesh(y,o),[0,0,-.5],[-Math.PI/2,0,0]]],XY:[[new x.Mesh(new x.BoxGeometry(.15,.15,.01),h),[.15,.15,0]]],YZ:[[new x.Mesh(new x.BoxGeometry(.15,.15,.01),l),[0,.15,.15],[0,Math.PI/2,0]]],XZ:[[new x.Mesh(new x.BoxGeometry(.15,.15,.01),c),[.15,0,.15],[-Math.PI/2,0,0]]],XYZ:[[new x.Mesh(new x.BoxGeometry(.1,.1,.1),u.clone())]]},q={X:[[new x.Mesh(new x.CylinderGeometry(.2,0,.6,4),s),[.3,0,0],[0,0,-Math.PI/2]],[new x.Mesh(new x.CylinderGeometry(.2,0,.6,4),s),[-.3,0,0],[0,0,Math.PI/2]]],Y:[[new x.Mesh(new x.CylinderGeometry(.2,0,.6,4),s),[0,.3,0]],[new x.Mesh(new x.CylinderGeometry(.2,0,.6,4),s),[0,-.3,0],[0,0,Math.PI]]],Z:[[new x.Mesh(new x.CylinderGeometry(.2,0,.6,4),s),[0,0,.3],[Math.PI/2,0,0]],[new x.Mesh(new x.CylinderGeometry(.2,0,.6,4),s),[0,0,-.3],[-Math.PI/2,0,0]]],XY:[[new x.Mesh(new x.BoxGeometry(.2,.2,.01),s),[.15,.15,0]]],YZ:[[new x.Mesh(new x.BoxGeometry(.2,.2,.01),s),[0,.15,.15],[0,Math.PI/2,0]]],XZ:[[new x.Mesh(new x.BoxGeometry(.2,.2,.01),s),[.15,0,.15],[-Math.PI/2,0,0]]],XYZ:[[new x.Mesh(new x.BoxGeometry(.2,.2,.2),s),[0,0,0]]]},j={X:[[new x.Line(g,i.clone()),[-1e3,0,0],null,[1e6,1,1],"helper"]],Y:[[new x.Line(g,i.clone()),[0,-1e3,0],[0,0,Math.PI/2],[1e6,1,1],"helper"]],Z:[[new x.Line(g,i.clone()),[0,0,-1e3],[0,-Math.PI/2,0],[1e6,1,1],"helper"]]};function Z(Q){const we=new x.Object3D;for(const ue in Q)for(let ge=Q[ue].length;ge--;){const ie=Q[ue][ge][0].clone(),Ee=Q[ue][ge][1],ke=Q[ue][ge][2],rt=Q[ue][ge][3],be=Q[ue][ge][4];ie.name=ue,ie.tag=be,Ee&&ie.position.set(Ee[0],Ee[1],Ee[2]),ke&&ie.rotation.set(ke[0],ke[1],ke[2]),rt&&ie.scale.set(rt[0],rt[1],rt[2]),ie.updateMatrix();const at=ie.geometry.clone();at.applyMatrix4(ie.matrix),ie.geometry=at,ie.renderOrder=1/0,ie.position.set(0,0,0),ie.rotation.set(0,0,0),ie.scale.set(1,1,1),we.add(ie)}return we}this.gizmo={},this.picker={},this.helper={},this.add(this.gizmo.translate=Z(S)),this.add(this.gizmo.rotate=Z(R)),this.add(this.gizmo.scale=Z($)),this.add(this.picker.translate=Z(C)),this.add(this.picker.rotate=Z(z)),this.add(this.picker.scale=Z(q)),this.add(this.helper.translate=Z(w)),this.add(this.helper.rotate=Z(P)),this.add(this.helper.scale=Z(j)),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:Io;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 i=[];i=i.concat(this.picker[this.mode].children),i=i.concat(this.gizmo[this.mode].children),i=i.concat(this.helper[this.mode].children);for(let n=0;n<i.length;n++){const r=i[n];r.visible=!0,r.rotation.set(0,0,0),r.position.copy(this.worldPosition);let o;if(this.camera.isOrthographicCamera?o=(this.camera.top-this.camera.bottom)/this.camera.zoom:o=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(o*this.size/4),r.tag==="helper"){r.visible=!1,r.name==="AXIS"?(r.visible=!!this.axis,this.axis==="X"&&(Ve.setFromEuler(To.set(0,0,0)),r.quaternion.copy(s).multiply(Ve),Math.abs(Fe.copy(sa).applyQuaternion(s).dot(this.eye))>.9&&(r.visible=!1)),this.axis==="Y"&&(Ve.setFromEuler(To.set(0,0,Math.PI/2)),r.quaternion.copy(s).multiply(Ve),Math.abs(Fe.copy(sn).applyQuaternion(s).dot(this.eye))>.9&&(r.visible=!1)),this.axis==="Z"&&(Ve.setFromEuler(To.set(0,Math.PI/2,0)),r.quaternion.copy(s).multiply(Ve),Math.abs(Fe.copy(ia).applyQuaternion(s).dot(this.eye))>.9&&(r.visible=!1)),this.axis==="XYZE"&&(Ve.setFromEuler(To.set(0,Math.PI/2,0)),Fe.copy(this.rotationAxis),r.quaternion.setFromRotationMatrix(qf.lookAt(jf,Fe,sn)),r.quaternion.multiply(Ve),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),xt.set(1e-10,1e-10,1e-10).add(this.worldPositionStart).sub(this.worldPosition).multiplyScalar(-1),xt.applyQuaternion(this.worldQuaternionStart.clone().invert()),r.scale.copy(xt),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(Fe.copy(sa).applyQuaternion(s).dot(this.eye))>.99&&(r.scale.set(1e-10,1e-10,1e-10),r.visible=!1),r.name==="Y"&&Math.abs(Fe.copy(sn).applyQuaternion(s).dot(this.eye))>.99&&(r.scale.set(1e-10,1e-10,1e-10),r.visible=!1),r.name==="Z"&&Math.abs(Fe.copy(ia).applyQuaternion(s).dot(this.eye))>.99&&(r.scale.set(1e-10,1e-10,1e-10),r.visible=!1),r.name==="XY"&&Math.abs(Fe.copy(ia).applyQuaternion(s).dot(this.eye))<.2&&(r.scale.set(1e-10,1e-10,1e-10),r.visible=!1),r.name==="YZ"&&Math.abs(Fe.copy(sa).applyQuaternion(s).dot(this.eye))<.2&&(r.scale.set(1e-10,1e-10,1e-10),r.visible=!1),r.name==="XZ"&&Math.abs(Fe.copy(sn).applyQuaternion(s).dot(this.eye))<.2&&(r.scale.set(1e-10,1e-10,1e-10),r.visible=!1)):this.mode==="rotate"&&(So.copy(s),Fe.copy(this.eye).applyQuaternion(Ve.copy(s).invert()),r.name.search("E")!==-1&&r.quaternion.setFromRotationMatrix(qf.lookAt(this.eye,jf,sn)),r.name==="X"&&(Ve.setFromAxisAngle(sa,Math.atan2(-Fe.y,Fe.z)),Ve.multiplyQuaternions(So,Ve),r.quaternion.copy(Ve)),r.name==="Y"&&(Ve.setFromAxisAngle(sn,Math.atan2(Fe.x,Fe.z)),Ve.multiplyQuaternions(So,Ve),r.quaternion.copy(Ve)),r.name==="Z"&&(Ve.setFromAxisAngle(ia,Math.atan2(Fe.y,Fe.x)),Ve.multiplyQuaternions(So,Ve),r.quaternion.copy(Ve))),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(l){return r.name===l}))&&(r.material.color.setHex(16776960),r.material.opacity=1)}super.updateMatrixWorld(e)}}class fN extends x.Mesh{constructor(){super(new x.PlaneGeometry(1e5,1e5,2,2),new x.MeshBasicMaterial({visible:!1,wireframe:!0,side:x.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"),vo.copy(sa).applyQuaternion(t==="local"?this.worldQuaternion:Io),qr.copy(sn).applyQuaternion(t==="local"?this.worldQuaternion:Io),Yr.copy(ia).applyQuaternion(t==="local"?this.worldQuaternion:Io),Fe.copy(qr),this.mode){case"translate":case"scale":switch(this.axis){case"X":Fe.copy(this.eye).cross(vo),Rs.copy(vo).cross(Fe);break;case"Y":Fe.copy(this.eye).cross(qr),Rs.copy(qr).cross(Fe);break;case"Z":Fe.copy(this.eye).cross(Yr),Rs.copy(Yr).cross(Fe);break;case"XY":Rs.copy(Yr);break;case"YZ":Rs.copy(vo);break;case"XZ":Fe.copy(Yr),Rs.copy(qr);break;case"XYZ":case"E":Rs.set(0,0,0);break}break;case"rotate":default:Rs.set(0,0,0)}Rs.length()===0?this.quaternion.copy(this.cameraQuaternion):(Yf.lookAt(xt.set(0,0,0),Rs,Fe),this.quaternion.setFromRotationMatrix(Yf)),super.updateMatrixWorld(e)}}class ft extends x.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(X.SET_SCENE,this.setScene)}clear(){for(const e of this.controls.values()){e.detach(),e.disconnect();const t=e.getHelper();Is(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 aN(this.activeCamera,s),t.getHelper().name=e,t.setSize(.5),t.setSpace("local"),this.controls.set(e,t),this.visibility.set(e,!0),t.addEventListener("mouseDown",()=>{this.dispatchEvent({type:ft.DRAG_START})}),t.addEventListener("mouseUp",()=>{this.dispatchEvent({type:ft.DRAG_END})}),t.addEventListener("dragging-changed",i=>{et.instance?.toggleOrbitControls(i.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(),Is(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(t))})}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 ft._instance||(ft._instance=new ft),ft._instance}}const mN=new x.BoxGeometry,rh=new x.Vector2;class Lo extends x.Object3D{curve=new x.CatmullRomCurve3;line;draggable;curvePos;tension=.5;closed=!1;subdivide=50;curveType;offset=1;lineMaterial;_camera;_curvePercentage=0;_draggableScale=10;_transform;raycaster;draggedMat=new x.MeshBasicMaterial;parentGroup;group;constructor(e,t){const s=new x.Color(Ni(.5,1,Math.random()),Ni(.5,1,Math.random()),Ni(.5,1,Math.random()));super(),this.name=e,this.lineMaterial=new x.LineBasicMaterial({color:s}),this.line=new x.Line(new x.BufferGeometry,this.lineMaterial),this.line.name="line",this.line.visible=!1,this.add(this.line),this._camera=t,this.curveType="catmullrom",this.draggedMat.color=s,this.draggable=new x.Object3D,this.draggable.name="draggablePoints",this.add(this.draggable),this.curvePos=new x.Mesh(new x.SphereGeometry(1.5),new x.MeshBasicMaterial({color:s})),this.curvePos.name="curvePos",this.curvePos.scale.setScalar(this._draggableScale),this.curvePos.visible=!1,this.add(this.curvePos),this.raycaster=new x.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),ft.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([ss(t.position.x,3),ss(t.position.y,3),ss(t.position.z,3)])}),Qf({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])}};addPoint=(e,t=!0)=>{const s=this.draggable.children.length,i=new x.Mesh(mN,this.draggedMat);i.name=`point_${s}`,i.position.copy(e),i.scale.setScalar(this._draggableScale),this.draggable.add(i),this._transform?.attach(i);const n=this.points.length>1;return n&&t&&this.updateSpline(),this.line.visible=n,this.updateCurrentPoint(),i};addNextPt=()=>{const e=this.draggable.children.length,t=e>1?this.draggable.children[e-1].position.clone():new x.Vector3,s=this.addPoint(t);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)}Is(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)};updateLastPoint(e){const t=this.draggable.children.length;t>0&&(this.draggable.children[t-1].position.copy(e),this.updateSpline())}updateSpline=()=>{this.points.length<2||(this.curve=new x.CatmullRomCurve3(this.points,this.closed,this.curveType,this.tension),this.line.geometry.dispose(),this.line.geometry=new x.BufferGeometry().setFromPoints(this.curve.getPoints(this.subdivide)),this.curvePos.position.copy(this.getPointAt(this._curvePercentage)))};onMouseClick=e=>{if(!et.instance||!et.instance.currentWindow||this._transform&&!this._transform.getHelper().visible)return;const s=et.instance.currentWindow.current.getBoundingClientRect();rh.x=(e.clientX-s.x)/s.width*2-1,rh.y=-((e.clientY-s.y)/s.height)*2+1,this.raycaster.setFromCamera(rh,this.camera);const i=this.raycaster.intersectObjects(this.draggable.children,!1);if(i.length>0){const n=i[0].object;n!==this._transform?.object&&(this._transform?.attach(n),this.group.current?.setField("Current Point",n.position))}};getPointAt(e){return this.curve.points.length>1?this.curve.getPointAt(e):this.curve.points.length===1?this.curve.points[0]:new x.Vector3}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))}updateCurrentPoint(){if(this._transform?.object&&this.group){const e=this._transform?.object;e.name.search("point")>-1&&this.group.current?.setField("Current Point",e.position)}}onUpdateTransform=()=>{this.updateCurrentPoint(),this.updateSpline()};initDebug(e){const t=this.draggable.children;this.parentGroup=e,this._transform=ft.instance.add(this.name),this._transform.camera=this._camera,this._transform.addEventListener("objectChange",this.onUpdateTransform),t.length>0&&this._transform.attach(t[t.length-1]),et.instance?.helpersContainer.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,expanded:!0,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:1e3,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:(i,n)=>{switch(i){case"Closed":this.closed=n,this.updateSpline();break;case"Visible":this.visible=n;break;case"Color":this.lineMaterial.color.setStyle(n),this.draggedMat.color.setStyle(n);break;case"Curve":this.curveType=n,this.updateSpline();break;case"Draggable Scale":this.draggableScale=n;break;case"Subdivide":this.subdivide=n,this.updateSpline();break;case"Tension":this.tension=n,this.updateSpline();break;case"New Pt Offset":this.offset=n;break;case"Curve At":this.curvePos.position.copy(this.getPointAt(n));break;case"Show Position":this.curvePos.visible=n;break;case"Show Points":this.draggable.visible=n;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":this.parent.currentSpline=null,Is(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(n),this.updateSpline())}break}}}),this.draggable.children.forEach(i=>{this.debugPoint(i)})}debugPoint=e=>{e.name,e.visible=this.draggable.visible}}let wo=0;class Uy extends x.Object3D{defaultScale=10;currentSpline=null;_camera;group=null;app;splineDataText="";constructor(e,t){super(),this.name="Spline Editor",this._camera=e,this.app=t,this.app.addEventListener(X.ADD_SPLINE,this.onAddSpline)}initDebug(){this.group=xe.addEditorGroup({title:this.name,items:[{type:"field",prop:"Spline Data",value:"",disabled:!1},{type:"button",prop:"Import Spline"},{type:"button",prop:"New Spline"},{type:"boolean",prop:"Show Points",value:!0},{type:"boolean",prop:"Draw Mode",value:!1},{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"Spline Data":this.splineDataText=t;break;case"Import Spline":this.createSplineFromJSON(JSON.parse(this.splineDataText));break;case"Show Points":this.showPoints(t);break;case"Visible":this.visible=t;break;case"Default Scale":this.defaultScale=t;break;case"Draw Mode":t?this.enableClickToDraw():this.disableClickToDraw();break}}})}dispose(){this.app.removeEventListener(X.ADD_SPLINE,this.onAddSpline),xe.removeEditorGroup(this.name)}addSpline(e){e.draggableScale=this.defaultScale,e.hideTransform(),this.group?.current!==null&&e.initDebug(this.group.current),this.add(e),this.currentSpline=e}createSpline=(e=[])=>{const t=`Spline ${wo+1}`,s=new Lo(t,this._camera);return s.addPoints(e),this.addSpline(s),wo++,s};createSplineFromArray=e=>{const t=[];return e.forEach(s=>{t.push(new x.Vector3(s[0],s[1],s[2]))}),this.createSpline(t)};createSplineFromCatmullRom=e=>this.createSpline(e.points);createSplineFromJSON=e=>{const t=[];e.points.forEach(i=>{t.push(new x.Vector3(i[0],i[1],i[2]))});const s=new Lo(e.name,this._camera);return s.closed=e.closed,s.subdivide=e.subdivide,s.tension=e.tension,s.type=e.type,s.addPoints(t),s.updateSpline(),this.addSpline(s),s};showPoints=(e=!0)=>{this.children.forEach(t=>{t.showPoints(e)})};onAddSpline=e=>{const t=JSON.parse(e.value),s=`Spline ${wo+1}`,i=[];t.points.forEach(r=>{i.push(new x.Vector3(r[0],r[1],r[2]))});const n=new Lo(s,this.camera);n.addPoints(i),this.addSpline(n),wo++};isMouseDown=!1;enableClickToDraw(){document.querySelectorAll(".clickable").forEach(e=>{e.addEventListener("mousedown",this.onClickCanvas),e.addEventListener("mousemove",this.onMouseMove),e.addEventListener("mouseup",this.onMouseUp)})}disableClickToDraw(){document.querySelectorAll(".clickable").forEach(e=>{e.removeEventListener("mousedown",this.onClickCanvas),e.removeEventListener("mousemove",this.onMouseMove),e.removeEventListener("mouseup",this.onMouseUp)})}onClickCanvas=e=>{if(e.button!==0)return;if(this._camera.type!=="OrthographicCamera"){console.warn("Spline Editor - 3D Camera not supported in Draw Mode");return}const s=e.target.getBoundingClientRect(),i=(e.clientX-s.left)/s.width*2-1,n=-((e.clientY-s.top)/s.height)*2+1;if(et.instance){const o=new x.Raycaster;o.setFromCamera(new x.Vector2(i,n),this._camera);const l=o.intersectObjects(et.instance.helpersContainer.children,!0);for(let c=0;c<l.length;c++){const h=l[c];if(!(h.object.isLine||h.object.isTransformControlsPlane)&&h.object.isObject3D)return}}this.currentSpline===null&&(this.currentSpline=this.createSpline());const r=this.mouseToSplinePos(i,n,s.width,s.height);this.currentSpline?.addPoint(r),this.isMouseDown=!0};onMouseMove=e=>{if(!this.isMouseDown)return;const s=e.target.getBoundingClientRect(),i=(e.clientX-s.left)/s.width*2-1,n=-((e.clientY-s.top)/s.height)*2+1,r=this.mouseToSplinePos(i,n,s.width,s.height);this.currentSpline?.updateLastPoint(r)};onMouseUp=()=>{this.isMouseDown=!1};mouseToSplinePos(e,t,s,i){const n=new x.Vector3,r=Math.PI/2,o=this._camera,l=o.zoom,c=o.rotation.x===-6123233995736766e-32&&o.rotation.y===0&&o.rotation.z===0,h=o.rotation.x===-Math.PI&&o.rotation.y===12246467991473532e-32&&o.rotation.z===Math.PI,u=o.rotation.x===-6162975822039155e-48&&o.rotation.y===-r&&o.rotation.z===0,d=o.rotation.x===-6162975822039155e-48&&o.rotation.y===r&&o.rotation.z===0,p=o.rotation.x===-1.5707953264174506&&o.rotation.y===0&&o.rotation.z===0,f=o.rotation.x===1.5707953264174506&&o.rotation.y===0&&o.rotation.z===0;let m=e,y=t;h||d?m*=-1:p&&(y*=-1);const g=s/2/l,_=i/2/l;if(this.currentSpline===null&&(this.currentSpline=this.createSpline()),c||h){const b=m*g+o.position.x,T=y*_+o.position.y;n.set(b,T,0)}else if(u||d){const b=m*g+o.position.z,T=y*_+o.position.y;n.set(0,T,b)}else if(p||f){const b=m*g+o.position.x,T=y*_+o.position.z;n.set(b,0,T)}return n}get camera(){return this._camera}set camera(e){this._camera=e,this.children.forEach(t=>{const s=t;s.camera=e})}}const Xf=["Single","Side by Side","Stacked","Quad"],gN="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",yN="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==",xN="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAVCAYAAACpF6WWAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAQ0lEQVQ4jWP8////fwYqAxYozUhFM/8zkaKYWIWkGEq0b0ZdSjQY5i79TyWagRGaTUdzFEEw6lLqGzqwLoVVJ1StpwA9sBwbUqAh5gAAAABJRU5ErkJggg==";class et extends W.Component{static instance=null;app;scene;renderer;currentScene;scenes=new Map;cameras=new Map;controls=new Map;currentCamera;currentWindow;helpersContainer=new x.Group;cameraHelpers=new Map;lightHelpers=new Map;grid=new sN;interactionHelper=new x.AxesHelper(25);currentTransform;splineEditor;depthMaterial=new x.MeshDepthMaterial;normalsMaterial=new x.MeshNormalMaterial;uvMaterial=new rN;wireframeMaterial=new x.MeshBasicMaterial({opacity:.33,transparent:!0,wireframe:!0});playing=!1;rafID=-1;cameraControlsRafID=-1;width=0;height=0;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 x.Raycaster;pointer=new x.Vector2;cameraControls=void 0;canvasRef;containerRef;tlWindow;trWindow;blWindow;brWindow;editorCameras=["Top","Bottom","Left","Right","Front","Back","Orthographic","UI","Debug"];constructor(e){super(e),this.app=e.app,this.app.addEventListener(X.ADD_RENDERER,this.setupRenderer),this.scene=new x.Scene,this.scene.name=this.scene.uuid="",this.canvasRef=W.createRef(),this.containerRef=W.createRef(),this.tlWindow=W.createRef(),this.trWindow=W.createRef(),this.blWindow=W.createRef(),this.brWindow=W.createRef();const t=e.three.app.appID,s=localStorage,i=s.getItem(`${t}_mode`);this.state={mode:i!==null?i:"Single",modeOpen:!1,renderModeOpen:!1,interactionMode:"Orbit",interactionModeOpen:!1,lastUpdate:Date.now(),connected:!1},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 n={Vector2:x.Vector2,Vector3:x.Vector3,Vector4:x.Vector4,Quaternion:x.Quaternion,Matrix4:x.Matrix4,Spherical:x.Spherical,Box3:x.Box3,Sphere:x.Sphere,Raycaster:x.Raycaster};Ds.install({THREE:n}),this.setupScene(),this.setupTools();const r=localStorage.getItem(this.expandedCameraVisibility);r!==null&&(this.cameraVisibility=r==="open"),this.saveExpandedCameraVisibility();const o=localStorage.getItem(this.expandedLightVisibility);o!==null&&(this.lightVisibility=o==="open"),this.saveExpandedLightVisibility();const l=localStorage.getItem(this.expandedGridVisibility);l!==null&&(this.gridVisibility=l==="open"),this.grid.visible=this.gridVisibility,this.saveExpandedGridVisibility(),et.instance=this}componentDidMount(){this.enable(),this.assignControls(),this.resize(),this.play(),ft.instance.setApp(this.props.app,this.props.three),ft.instance.activeCamera=this.debugCamera}componentDidUpdate(e,t,s){t.mode!==this.state.mode&&(this.assignControls(),this.resize())}componentWillUnmount(){this.disable(),this.clear(),xe.removeEditorGroup("View Settings")}render(){const e=[];return this.cameras.forEach((t,s)=>{e.push(s)}),M.jsxs("div",{className:"multiview",children:[M.jsx("canvas",{ref:this.canvasRef}),M.jsxs("div",{className:`cameras ${this.state.mode==="Single"||this.state.mode==="Stacked"?"single":""}`,ref:this.containerRef,children:[this.state.mode==="Single"&&M.jsx(M.Fragment,{children:M.jsx(Zi,{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")&&M.jsxs(M.Fragment,{children:[M.jsx(Zi,{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)}}),M.jsx(Zi,{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"&&M.jsxs(M.Fragment,{children:[M.jsx(Zi,{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)}}),M.jsx(Zi,{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)}}),M.jsx(Zi,{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)}}),M.jsx(Zi,{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)}})]})]}),M.jsxs("div",{className:"settings",children:[M.jsx(al,{title:"View",index:Xf.indexOf(this.state.mode),options:Xf,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})}}),M.jsx(al,{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})}}),M.jsx(sh,{name:"cameraHelper",icon:gN,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)}}}),M.jsx(sh,{name:"lightHelper",icon:yN,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)}}}),M.jsx(sh,{name:"gridHelper",icon:xN,selected:this.gridVisibility,height:21,width:21,onClick:t=>{this.gridVisibility=t,this.saveExpandedGridVisibility(),this.grid.visible=t}})]},this.state.lastUpdate),!this.state.connected&&M.jsx("div",{className:"connectionStatus",children:"Not Connected"})]})}setupRenderer=e=>{this.renderer&&this.renderer.dispose();const t=this.canvasRef.current;this.props.three.canvas=t;const s=e.value;s.type==="WebGLRenderer"?(this.renderer=new x.WebGLRenderer({canvas:t,stencil:!1}),this.grid.visible=!0):s.type==="WebGPURenderer"&&(this.renderer=new mo({canvas:t,stencil:!1}),this.grid.visible=!1),this.renderer&&(this.renderer.autoClear=!1,this.renderer.shadowMap.enabled=!0,this.renderer.setPixelRatio(devicePixelRatio),this.renderer.setClearColor(0),this.resize(),this.props.three.renderer=this.renderer,this.onRemoteConnected())};setupScene(){this.helpersContainer.name="helpers",this.scene.add(this.helpersContainer),this.grid.position.y=-1,this.scene.add(this.grid),this.interactionHelper.name="interactionHelper",this.interactionHelper.visible=!1,this.helpersContainer.add(this.interactionHelper);const e=(n,r)=>{const o=new x.OrthographicCamera(-100,100,100,-100,0,3e3);return o.name=n,o.position.copy(r),o.lookAt(0,0,0),this.cameras.set(n,o),o},t=1e3;e("Top",new x.Vector3(0,t,0)),e("Bottom",new x.Vector3(0,-t,0)),e("Left",new x.Vector3(-t,0,0)),e("Right",new x.Vector3(t,0,0)),e("Front",new x.Vector3(0,0,t)),e("Back",new x.Vector3(0,0,-t)),e("Orthographic",new x.Vector3(t,t,t)),e("UI",new x.Vector3),this.debugCamera=new x.PerspectiveCamera(60,1,.01,3e3),this.debugCamera.name="Debug",this.debugCamera.position.set(300,300,300),this.debugCamera.lookAt(0,0,0),this.cameras.set("Debug",this.debugCamera),this.currentCamera=this.debugCamera;const s=localStorage,i=this.props.three.app.appID;this.tlCam=this.cameras.get(s.getItem(`${i}_tlCam`)),this.trCam=this.cameras.get(s.getItem(`${i}_trCam`)),this.blCam=this.cameras.get(s.getItem(`${i}_blCam`)),this.brCam=this.cameras.get(s.getItem(`${i}_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 Uy(this.currentCamera,this.app),this.splineEditor.initDebug(),this.helpersContainer.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})}clear(){this.app.dispatchEvent({type:X.CLEAR_OBJECT}),xe.removeAllGroups(),this.clearLightHelpers(),this.clearControls(),this.currentTransform!==void 0&&(this.currentTransform.removeEventListener("objectChange",this.onUpdateTransform),ft.instance.remove(this.currentTransform.getHelper().name)),this.currentTransform=void 0,ft.instance.clear(),this.cameras.forEach(e=>{if(this.editorCameras.indexOf(e.name)<0){const s=this.cameraHelpers.get(e.uuid);s&&(s.parent?.remove(s),this.helpersContainer.remove(s),s.dispose()),this.cameraHelpers.delete(e.uuid)}}),this.currentCamera=this.debugCamera,this.currentScene=void 0,this.scenes.forEach(e=>{this.app.dispatchEvent({type:X.REMOVE_SCENE,value:e})}),this.scenes.clear()}update(){this.renderer&&(this.renderer instanceof x.WebGLRenderer?this.renderer?.clear():this.renderer instanceof mo&&this.renderer?.clearAsync()),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.currentScene!==void 0&&this.props.onSceneUpdate(this.currentScene)}draw(){switch(this.renderer&&(this.renderer instanceof x.WebGLRenderer?this.renderer?.clear():this.renderer instanceof mo&&this.renderer?.clearAsync()),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(X.ADD_SCENE,this.addScene),this.app.addEventListener(X.SET_SCENE,this.sceneUpdate),this.app.addEventListener(X.REMOVE_SCENE,this.removeScene),this.app.addEventListener(X.ADD_CAMERA,this.addCamera),this.app.addEventListener(X.REMOVE_CAMERA,this.removeCamera),this.app.addEventListener(X.SET_OBJECT,this.onSetSelectedItem),this.app.addEventListener(X.REMOTE_CONNECTED,this.onRemoteConnected),this.app.addEventListener(X.REMOTE_DISCONNECTED,this.onRemoteDisconnected)}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(X.ADD_SCENE,this.addScene),this.app.removeEventListener(X.SET_SCENE,this.sceneUpdate),this.app.removeEventListener(X.ADD_CAMERA,this.addCamera),this.app.removeEventListener(X.REMOVE_CAMERA,this.removeCamera),this.app.removeEventListener(X.SET_OBJECT,this.onSetSelectedItem),this.app.removeEventListener(X.REMOTE_CONNECTED,this.onRemoteConnected),this.app.removeEventListener(X.REMOTE_DISCONNECTED,this.onRemoteDisconnected)}resize=()=>{this.width=window.innerWidth-300,this.height=window.innerHeight,this.renderer?.setSize(this.width,this.height);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.currentScene!==void 0&&this.props.onSceneResize(this.currentScene,this.width,this.height);let s=this.width,i=this.height;switch(this.state.mode){case"Side by Side":s=e,i=this.height;break;case"Stacked":s=this.width,i=t;break;case"Quad":s=e,i=t;break}const n=s/i;this.cameras.forEach(r=>{r instanceof x.OrthographicCamera?(r.left=s/-2,r.right=s/2,r.top=i/2,r.bottom=i/-2,r.name==="UI"&&(r.position.x=this.width/2,r.position.y=this.height/-2,r.position.z=100),r.updateProjectionMatrix()):r instanceof x.PerspectiveCamera&&(r.aspect=n,r.updateProjectionMatrix()),this.cameraHelpers.get(r.name)?.update()})};addScene=e=>{const t=this.props.scenes.get(e.value.name);if(t!==void 0){const s=new t;s.visible=!1,this.props.onSceneSet!==void 0&&this.props.onSceneSet(s),this.props.three.scene=s,this.scenes.set(e.value.name,s),this.scene.add(s)}};sceneUpdate=e=>{this.currentScene!==void 0&&(this.currentScene.visible=!1,this.clearLightHelpers());const t=this.scene.getObjectByName(e.value.name);t!==void 0&&(this.currentScene=t,this.currentScene.visible=!0,this.addLightHelpers(this.currentScene))};removeScene=e=>{const t=e.value.name;this.scenes.delete(t);const s=this.scene.getObjectByName(t);s&&setTimeout(()=>{Is(s)},100),this.clearLightHelpers()};addCamera=e=>{const t=e.value,s=t.uuid,i=this.props.three.scene?.getObjectByProperty("uuid",t.uuid);if(i!==void 0){const n=i;this.cameras.set(s,n);const r=new x.CameraHelper(n);r.visible=this.cameraVisibility,this.cameraHelpers.set(s,r),this.helpersContainer.add(r),this.setState({lastUpdate:Date.now()})}};removeCamera=e=>{const s=e.value.uuid,i=this.cameraHelpers.get(s);i!==void 0&&(this.helpersContainer.remove(i),i.dispose()),this.cameras.delete(s),this.setState({lastUpdate:Date.now()})};onMouseMove=e=>{const t=new x.Vector2;this.renderer?.getSize(t);const s=Math.min(e.clientX,t.x),i=Math.min(e.clientY,t.y);this.pointer.x=Ki(s,0,t.x,-1,1),this.pointer.y=Ki(i,0,t.y,1,-1);const n=t.x/2,r=t.y/2,o=()=>{s<n?this.pointer.x=Ki(s,0,n,-1,1):this.pointer.x=Ki(s,n,t.x,-1,1)},l=()=>{i<r?this.pointer.y=Ki(i,0,r,1,-1):this.pointer.y=Ki(i,r,t.y,1,-1)};switch(this.state.mode){case"Quad":o(),l();break;case"Side by Side":o();break;case"Stacked":l(),l();break}if(this.updateCamera(s,i,n,r),this.state.interactionMode==="Orbit"||this.currentScene===void 0)return;const c=this.raycaster.intersectObjects(this.currentScene.children);c.length>0&&this.interactionHelper.position.copy(c[0].point)};onClick=e=>{if(this.state.interactionMode==="Orbit"||this.currentScene===void 0)return;const t=new x.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 Ds(this.currentCamera,this.currentWindow.current),this.selectedItem instanceof x.Mesh||this.selectedItem instanceof x.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 Ds(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 Ds(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 Ds(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 Ds(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 Ds(this.currentCamera,this.currentWindow.current),this.cameraControls.rotateTo(zo(45),zo(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=void 0;const t=e.value.uuid;if(this.scenes.forEach(s=>{t.search(s.uuid)>-1&&(this.selectedItem=s.getObjectByProperty("uuid",t))}),this.selectedItem===void 0){console.log(`Hermes - Can't find selected item: ${e.value.uuid}, ${e.value.name}`);return}this.currentTransform!==void 0&&(this.currentTransform.removeEventListener("objectChange",this.onUpdateTransform),ft.instance.remove(this.currentTransform.getHelper().name)),this.currentTransform=ft.instance.add(e.value.name),this.currentTransform.attach(this.selectedItem),this.helpersContainer.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),Al.instance.update())};onRemoteConnected=()=>{this.setState({connected:!0})};onRemoteDisconnected=()=>{this.clear(),this.setState({connected:!1})};clearLightHelpers=()=>{this.lightHelpers.forEach(e=>{this.helpersContainer.remove(e),e.dispose()}),this.lightHelpers.clear()};addLightHelpers=e=>{e.traverse(t=>{if(t.type.search("Light")>-1){let s;switch(t.type){case"DirectionalLight":s=new x.DirectionalLightHelper(t,100),s.name=`${t.name}Helper`,s.visible=this.lightVisibility,this.lightHelpers.set(t.name,s),this.helpersContainer.add(s);break;case"HemisphereLight":s=new x.HemisphereLightHelper(t,250),s.name=`${t.name}Helper`,s.visible=this.lightVisibility,this.lightHelpers.set(t.name,s),this.helpersContainer.add(s);break;case"RectAreaLight":s=new BR(t),s.name=`${t.name}Helper`,s.visible=this.lightVisibility,this.lightHelpers.set(t.name,s),this.helpersContainer.add(s);break;case"PointLight":s=new x.PointLightHelper(t,100),s.name=`${t.name}Helper`,s.visible=this.lightVisibility,this.lightHelpers.set(t.name,s),this.helpersContainer.add(s);break;case"SpotLight":s=new x.SpotLightHelper(t),s.name=`${t.name}Helper`,s.visible=this.lightVisibility,this.lightHelpers.set(t.name,s),this.helpersContainer.add(s);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 i=new LR(e,t);switch(i.enableDamping=!0,i.dampingFactor=.1,e.name){case"Top":case"Bottom":case"Left":case"Right":case"Front":case"Back":i.enableRotate=!1;break}this.controls.set(e.name,i)}clearCamera(e){const t=this.cameraHelpers.get(e.name);t!==void 0&&(this.helpersContainer.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.helpersContainer.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,i)=>{switch(this.state.mode){case"Quad":t<i?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<i?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),ft.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,i=new x.Clock;i.start(),this.selectedItem.getWorldPosition(e.target0);const n=()=>{const r=i.getDelta();this.cameraControls&&this.cameraControls.update(r),t&&(e.target.lerp(e.target0,s),e.object.position.lerp(e.position0,s),e.object.zoom=rr(e.object.zoom,e.zoom0,s),e.object.updateProjectionMatrix(),e.dispatchEvent({type:"change"})),i.getElapsedTime()>=.5?(cancelAnimationFrame(this.cameraControlsRafID),this.cameraControlsRafID=-1,this.clearControls()):this.cameraControlsRafID=requestAnimationFrame(n)};n()};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,i,n,r){switch(n.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&&(this.renderer?.setViewport(e,t,s,i),this.renderer?.setScissor(e,t,s,i),this.renderer instanceof x.WebGLRenderer?this.renderer?.render(this.scene,n):this.renderer instanceof mo&&this.renderer?.renderAsync(this.scene,n)),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),i=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 n=this.height-i;this.drawTo(0,n,this.width,i,this.tlCam,e),this.drawTo(0,0,this.width,i,this.trCam,t)}};drawQuad=()=>{const e=this.getSceneOverride(this.tlRender),t=this.getSceneOverride(this.trRender),s=this.getSceneOverride(this.blRender),i=this.getSceneOverride(this.brRender),n=Math.floor(this.width/2),r=Math.floor(this.height/2);let o=0,l=0;l=this.height-r,o=0,this.drawTo(o,l,n,r,this.tlCam,e),o=n,this.drawTo(o,l,n,r,this.trCam,t),l=0,o=0,this.scene.overrideMaterial=s,this.drawTo(o,l,n,r,this.blCam,s),o=n,this.drawTo(o,l,n,r,this.brCam,i)};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 Al extends W.Component{static instance;app;matrix=new x.Matrix4;position=new x.Vector3;rotation=new x.Euler;scale=new x.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)),Al.instance=this}update(){if(et.instance){const e=et.instance.selectedItem;if(e===void 0)return;this.position.x=ss(e.position.x,3),this.position.y=ss(e.position.y,3),this.position.z=ss(e.position.z,3),this.rotation.copy(e.rotation),this.scale.x=ss(e.scale.x,3),this.scale.y=ss(e.scale.y,3),this.scale.z=ss(e.scale.z,3),this.setState({lastUpdated:Date.now()})}}render(){return M.jsx(cs,{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 i=this.props.three.getScene(this.props.object.uuid);if(i){const n=i.getObjectByProperty("uuid",this.props.object.uuid);qe(n,e,s)}};saveExpanded(){localStorage.setItem(this.expandedName,this.open?"open":"closed")}get expandedName(){return`${this.props.three.app.appID}_transform`}}function Zf(a){switch(a){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 a}function _N(a,e,t){function s(){return`${t.app.appID}_light`}const i=localStorage.getItem(s()),n=i!==null?i==="open":!1;function r(l){localStorage.setItem(s(),l?"open":"closed")}const o=[];if(a.lightInfo!==void 0)for(const l in a.lightInfo){const c=a.lightInfo[l];c!==void 0&&(c.isColor!==void 0?o.push({title:Zf(l),prop:l,type:"color",value:c,onChange:(h,u)=>{const d=new x.Color(u);t.updateObject(a.uuid,h,d);const p=t.getScene(a.uuid);if(p!==null){const f=p.getObjectByProperty("uuid",a.uuid);qe(f,h,d)}}}):o.push({title:Zf(l),prop:l,type:typeof c,value:c,step:typeof c=="number"?.01:void 0,onChange:(h,u)=>{t.updateObject(a.uuid,h,u);const d=t.getScene(a.uuid);if(d!==null){const p=d.getObjectByProperty("uuid",a.uuid);qe(p,h,u)}}}))}return M.jsx(cs,{app:e,title:"Light",items:o,expanded:n,onToggle:l=>{r(l)}})}function bN(a){const e=a.object,t=a.three;function s(){return`${t.app.appID}_animation`}const i=localStorage.getItem(s()),n=i!==null?i==="open":!1;function r(d){localStorage.setItem(s(),d?"open":"closed")}const o=[],l=[];let c=0;e.animations.forEach(d=>{c=Math.max(c,d.duration),d.duration>0&&l.push({title:d.name,items:[{title:"Duration",type:"number",value:d.duration,disabled:!0},{title:"Blend Mode",type:"option",disabled:!0,options:[{title:"Normal",value:2500},{title:"Additive",value:2501}]}]})}),o.push({title:"Animations",items:l});let h;const u=t.getScene(e.uuid);if(u!==null){const d=u.getObjectByProperty("uuid",e.uuid);if(d!==void 0){const p=d.mixer;if(p!==void 0){const m=[{title:"Time Scale",type:"range",value:p.timeScale,step:.01,min:-1,max:2,onChange:(y,g)=>{p.timeScale=g,t.updateObject(e.uuid,"mixer.timeScale",g)}}];m.push({title:"Stop All",type:"button",onChange:()=>{p.stopAllAction(),t.requestMethod(e.uuid,"stopAllAction",void 0,"mixer")}}),o.push({title:"Mixer",items:m}),h=new x.SkeletonHelper(d),et.instance?.scene.add(h)}}}return W.useEffect(()=>()=>{h!==void 0&&Is(h)},[]),M.jsx(cs,{app:a.app,title:"Animation",items:o,expanded:n,onToggle:d=>{r(d)}})}const ah={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:[]};function ky(a){const[e,t]=W.useState(ah);W.useEffect(()=>{function r(l){t(l.value)}function o(){t(ah)}return a.app.addEventListener(X.CLEAR_OBJECT,o),a.app.addEventListener(X.SET_SCENE,o),a.app.addEventListener(X.SET_OBJECT,r),()=>{a.app.removeEventListener(X.CLEAR_OBJECT,o),a.app.removeEventListener(X.SET_SCENE,o),a.app.removeEventListener(X.SET_OBJECT,r)}},[]);const s=e.type.toLowerCase(),i=e.animations.length>0||e.mixer!==void 0,n=s.search("mesh")>-1||s.search("line")>-1||s.search("points")>-1;return M.jsx(fa,{app:a.app,label:"Inspector",button:e.uuid.length>0?M.jsx("button",{className:"remove",onClick:()=>{ft.instance.remove(e.name),t(ah)}}):void 0,children:M.jsx("div",{id:"Inspector",className:a.class,children:e.uuid.length>0&&M.jsxs(M.Fragment,{children:[M.jsxs(M.Fragment,{children:[M.jsx(Eo,{type:"string",title:"Name",prop:"name",value:e.name,disabled:!0}),M.jsx(Eo,{type:"string",title:"Type",prop:"type",value:e.type,disabled:!0}),M.jsx(Eo,{type:"string",title:"UUID",prop:"uuid",value:e.uuid,disabled:!0})]}),M.jsxs(M.Fragment,{children:[M.jsx(Al,{object:e,app:a.app,three:a.three}),i?M.jsx(bN,{app:a.app,object:e,three:a.three}):null,s.search("camera")>-1?Vx(e,a.app,a.three):null,s.search("light")>-1?_N(e,a.app,a.three):null,n?kx(e,a.app,a.three):null]})]})})},"Inspector")}class TN extends W.Component{app;autoClear=!0;autoClearColor=!0;autoClearDepth=!0;autoClearStencil=!0;outputColorSpace=x.SRGBColorSpace;localClippingEnabled=!1;clearColor=new x.Color(0);clearAlpha=1;toneMapping=x.NoToneMapping;toneMappingExposure=1;type="";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),et.instance){const i=et.instance.renderer;i&&(this.autoClear=i.autoClear,this.autoClearColor=i.autoClearColor,this.autoClearDepth=i.autoClearDepth,this.autoClearStencil=i.autoClearStencil,this.clearAlpha=i.getClearAlpha(),this.toneMapping=i.toneMapping,this.toneMappingExposure=i.toneMappingExposure,i instanceof x.WebGLRenderer&&(this.localClippingEnabled=i.localClippingEnabled,i.getClearColor(this.clearColor)))}this.app.addEventListener(X.ADD_RENDERER,this.onAddRenderer)}componentwillunmount(){this.app.removeEventListener(X.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.type=t.type,this.toneMapping=t.toneMapping,this.toneMappingExposure=t.toneMappingExposure,this.clearColor.setStyle(t.clearColor,x.LinearSRGBColorSpace),x.ColorManagement.enabled=t.colorManagement,et.instance){const s=et.instance.renderer;s&&(s.autoClearColor=this.autoClearColor,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(et.instance){const t=et.instance.renderer;t&&(t.autoClearColor=this.autoClearColor,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:x.ColorManagement.enabled,toneMapping:this.toneMapping,toneMappingExposure:this.toneMappingExposure}))}};return M.jsx(cs,{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:x.ColorManagement.enabled,onChange:(t,s)=>{x.ColorManagement.enabled=s,e()}},{type:"option",title:"Color Space",value:this.outputColorSpace,options:[{title:"No Color Space",value:x.NoColorSpace},{title:"SRB Color Space",value:x.SRGBColorSpace},{title:"Linear SRB Color Space",value:x.LinearSRGBColorSpace}],onChange:(t,s)=>{this.outputColorSpace=s,e()}},{type:"option",title:"Tone Mapping",value:this.toneMapping,options:[{title:"None ",value:x.NoToneMapping},{title:"Linear ",value:x.LinearToneMapping},{title:"Reinhard",value:x.ReinhardToneMapping},{title:"Cineon ",value:x.CineonToneMapping},{title:"ACES Filmic",value:x.ACESFilmicToneMapping},{title:"AgX",value:x.AgXToneMapping},{title:"Neutral",value:x.NeutralToneMapping},{title:"Custom",value:x.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()}},{type:"string",title:"Type",value:this.type,disabled:!0}],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 zy(a){const[e]=W.useState([]),[t]=W.useState([]),[s,i]=W.useState(0),n=l=>{const c=l.value;e.push(c),t.push(M.jsx(fa,{app:a.app,label:`Scene: ${c.name}`,scene:c,open:!0,onRefresh:()=>{a.three.refreshScene(c.name)},children:M.jsx(uh,{app:a.app,child:c,scene:c,three:a.three})},Math.random())),i(Date.now())},r=l=>{const c=l.value;for(let h=0;h<e.length;h++)if(c.uuid===e[h].uuid){e[h]=c,t[h]=M.jsx(fa,{app:a.app,label:`Scene: ${c.name}`,scene:c,open:!0,onRefresh:()=>{a.three.refreshScene(c.name)},children:M.jsx(uh,{app:a.app,child:c,scene:c,three:a.three})},Math.random()),i(Date.now());return}},o=l=>{const c=l.value;for(let h=0;h<e.length;h++)if(c.uuid===e[h].uuid){e.splice(h,1),t.splice(h,1),i(Date.now());return}};return W.useEffect(()=>(a.app.addEventListener(X.ADD_SCENE,n),a.app.addEventListener(X.REFRESH_SCENE,r),a.app.addEventListener(X.REMOVE_SCENE,o),()=>{a.app.removeEventListener(X.ADD_SCENE,n),a.app.removeEventListener(X.REFRESH_SCENE,r),a.app.removeEventListener(X.REMOVE_SCENE,o)}),[]),M.jsxs("div",{id:"SidePanel",children:[M.jsx("div",{className:"scenes",children:t},s),M.jsx(ky,{app:a.app,three:a.three}),M.jsx(TN,{app:a.app,three:a.three}),M.jsx(xe,{app:a.app,three:a.three})]})}function SN(a){return W.useEffect(()=>{function e(o){let l=null;return a.three.scenes.forEach(c=>{o.search(c.uuid)>-1&&(l=c)}),l}const t=o=>{const l=o.value,c=e(l);if(!c){console.log(`Hermes - can't find scene for object: ${l}`,a.three.scenes);return}const h=c.getObjectByProperty("uuid",l);h!==void 0?a.three.setObject(h):console.log(`Hermes - can't find object: ${l}`,c)},s=(o,l,c)=>{const h=e(o);if(!h){console.log(`Hermes - can't find scene to set object: ${o}, ${l}`,a.three.scenes);return}const u=h?.getObjectByProperty("uuid",o);u!==void 0?qe(u,l,c):console.log(`Hermes - can't set object: ${o}`,h)},i=o=>{const l=o.value,{key:c,value:h,uuid:u}=l;s(u,c,h)},n=o=>{const l=o.value,c=e(l.uuid);if(!c){console.log(`Hermes - can't create texture, can't find scene: ${l.uuid}`);return}const h=c?.getObjectByProperty("uuid",l.uuid);if(h!==void 0){const u=d=>{const p=l.key.split(".");switch(p.length){case 1:h[p[0]]=d;break;case 2:h[p[0]][p[1]]=d;break;case 3:h[p[0]][p[1]][p[2]]=d;break;case 4:h[p[0]][p[1]][p[2]][p[3]]=d;break;case 5:h[p[0]][p[1]][p[2]][p[3]][p[4]]=d;break}h.material.needsUpdate=!0};l.value.src.length>0?im(l.value.src).then(d=>{d.offset.set(l.value.offset[0],l.value.offset[1]),d.repeat.set(l.value.repeat[0],l.value.repeat[1]),u(d)}):u(null)}},r=o=>{const{key:l,uuid:c,value:h,subitem:u}=o.value,p=e(c)?.getObjectByProperty("uuid",c);if(p!==void 0)try{u!==void 0?tx(p,u)[l](h):p[l](h)}catch(f){console.log("Error requesting method:"),console.log(f),console.log(l),console.log(h)}};return a.app.addEventListener(X.GET_OBJECT,t),a.app.addEventListener(X.UPDATE_OBJECT,i),a.app.addEventListener(X.CREATE_TEXTURE,n),a.app.addEventListener(X.REQUEST_METHOD,r),()=>{a.app.removeEventListener(X.GET_OBJECT,t),a.app.removeEventListener(X.UPDATE_OBJECT,i),a.app.removeEventListener(X.CREATE_TEXTURE,n),a.app.removeEventListener(X.REQUEST_METHOD,r)}},[]),null}function Gy(a){return M.jsxs("div",{className:"editor",ref:a.ref,style:a.style,children:[M.jsx("div",{className:"header",children:a.header}),a.children,M.jsx("div",{className:"footer",children:a.footer})]})}function vN(a){return M.jsx(Gy,{children:M.jsxs(M.Fragment,{children:[M.jsx(et,{app:a.app,three:a.three,scenes:a.scenes,onSceneResize:a.onSceneResize,onSceneSet:a.onSceneSet,onSceneUpdate:a.onSceneUpdate}),M.jsx(zy,{app:a.app,three:a.three})]})})}exports.Accordion=fa;exports.AppRunner=W0;exports.Application=H0;exports.BaseRemote=ol;exports.BaseScene=$0;exports.ChildObject=Xh;exports.ContainerObject=uh;exports.Draggable=rm;exports.DraggableItem=nm;exports.Dropdown=am;exports.DropdownItem=om;exports.Editor=Gy;exports.ElementProxy=G0;exports.ElementProxyReceiver=sm;exports.ExportTexture=Ri;exports.Inspector=ky;exports.MultiView=et;exports.NavButton=Yh;exports.ProxyManager=V0;exports.RemoteComponents=j0;exports.RemoteTheatre=Q0;exports.RemoteThree=ix;exports.SceneInspector=SN;exports.SidePanel=zy;exports.Spline=Lo;exports.SplineEditor=Uy;exports.ThreeEditor=vN;exports.ToolEvents=X;exports.Transform=ft;exports.WebworkerEventHandlers=k0;exports.capitalize=pa;exports.clamp=Ti;exports.clearComposerGroups=N0;exports.colorToHex=oh;exports.copyToClipboard=Qf;exports.cubicBezier=M0;exports.customizeTheatreElements=Y0;exports.damp=T0;exports.defaultTheatreCallback=p0;exports.detectMaxFrameRate=em;exports.detectSettings=tm;exports.dispose=Is;exports.disposeMaterial=jh;exports.disposeTexture=lh;exports.distance=b0;exports.generateCubemap=P0;exports.hierarchyUUID=ko;exports.inspectComposer=R0;exports.isColor=Kf;exports.map=_0;exports.mix=rr;exports.noop=da;exports.normalize=Uo;exports.parseModelLite=A0;exports.randomID=ct;exports.resetThreeObjects=ch;exports.round=ss;exports.roundTo=S0;exports.theatreEditorApp=q0;
|
|
600
|
+
}`;class rN extends x.ShaderMaterial{constructor(){super({defines:{USE_UV:""},vertexShader:iN,fragmentShader:nN})}}const Qi=new x.Raycaster,xt=new x.Vector3,_i=new x.Vector3,Ve=new x.Quaternion,Vf={X:new x.Vector3(1,0,0),Y:new x.Vector3(0,1,0),Z:new x.Vector3(0,0,1)},ih={type:"change"},Hf={type:"mouseDown",mode:null},Wf={type:"mouseUp",mode:null},$f={type:"objectChange"};class aN extends x.Controls{constructor(e,t=null){super(void 0,t);const s=new dN(this);this._root=s;const i=new pN;this._gizmo=i,s.add(i);const n=new fN;this._plane=n,s.add(n);const r=this;function o(b,T){let S=T;Object.defineProperty(r,b,{get:function(){return S!==void 0?S:T},set:function(C){S!==C&&(S=C,n[b]=C,i[b]=C,r.dispatchEvent({type:b+"-changed",value:C}),r.dispatchEvent(ih))}}),r[b]=T,n[b]=T,i[b]=T}o("camera",e),o("object",void 0),o("enabled",!0),o("axis",null),o("mode","translate"),o("translationSnap",null),o("rotationSnap",null),o("scaleSnap",null),o("space","world"),o("size",1),o("dragging",!1),o("showX",!0),o("showY",!0),o("showZ",!0),o("minX",-1/0),o("maxX",1/0),o("minY",-1/0),o("maxY",1/0),o("minZ",-1/0),o("maxZ",1/0);const l=new x.Vector3,c=new x.Vector3,h=new x.Quaternion,u=new x.Quaternion,d=new x.Vector3,p=new x.Quaternion,f=new x.Vector3,m=new x.Vector3,y=new x.Vector3,g=0,_=new x.Vector3;o("worldPosition",l),o("worldPositionStart",c),o("worldQuaternion",h),o("worldQuaternionStart",u),o("cameraPosition",d),o("cameraQuaternion",p),o("pointStart",f),o("pointEnd",m),o("rotationAxis",y),o("rotationAngle",g),o("eye",_),this._offset=new x.Vector3,this._startNorm=new x.Vector3,this._endNorm=new x.Vector3,this._cameraScale=new x.Vector3,this._parentPosition=new x.Vector3,this._parentQuaternion=new x.Quaternion,this._parentQuaternionInv=new x.Quaternion,this._parentScale=new x.Vector3,this._worldScaleStart=new x.Vector3,this._worldQuaternionInv=new x.Quaternion,this._worldScale=new x.Vector3,this._positionStart=new x.Vector3,this._quaternionStart=new x.Quaternion,this._scaleStart=new x.Vector3,this._getPointer=oN.bind(this),this._onPointerDown=cN.bind(this),this._onPointerHover=lN.bind(this),this._onPointerMove=hN.bind(this),this._onPointerUp=uN.bind(this),t!==null&&this.connect(t)}connect(e){super.connect(e),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&&Qi.setFromCamera(e,this.camera);const t=nh(this._gizmo.picker[this.mode],Qi);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&&Qi.setFromCamera(e,this.camera);const t=nh(this._plane,Qi,!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,Hf.mode=this.mode,this.dispatchEvent(Hf)}}pointerMove(e){const t=this.axis,s=this.mode,i=this.object;let n=this.space;if(s==="scale"?n="local":(t==="E"||t==="XYZE"||t==="XYZ")&&(n="world"),i===void 0||t===null||this.dragging===!1||e!==null&&e.button!==-1)return;e!==null&&Qi.setFromCamera(e,this.camera);const r=nh(this._plane,Qi,!0);if(r){if(this.pointEnd.copy(r.point).sub(this.worldPositionStart),s==="translate")this._offset.copy(this.pointEnd).sub(this.pointStart),n==="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),n==="local"&&t!=="XYZ"?this._offset.applyQuaternion(this._quaternionStart).divide(this._parentScale):this._offset.applyQuaternion(this._parentQuaternionInv).divide(this._parentScale),i.position.copy(this._offset).add(this._positionStart),this.translationSnap&&(n==="local"&&(i.position.applyQuaternion(Ve.copy(this._quaternionStart).invert()),t.search("X")!==-1&&(i.position.x=Math.round(i.position.x/this.translationSnap)*this.translationSnap),t.search("Y")!==-1&&(i.position.y=Math.round(i.position.y/this.translationSnap)*this.translationSnap),t.search("Z")!==-1&&(i.position.z=Math.round(i.position.z/this.translationSnap)*this.translationSnap),i.position.applyQuaternion(this._quaternionStart)),n==="world"&&(i.parent&&i.position.add(xt.setFromMatrixPosition(i.parent.matrixWorld)),t.search("X")!==-1&&(i.position.x=Math.round(i.position.x/this.translationSnap)*this.translationSnap),t.search("Y")!==-1&&(i.position.y=Math.round(i.position.y/this.translationSnap)*this.translationSnap),t.search("Z")!==-1&&(i.position.z=Math.round(i.position.z/this.translationSnap)*this.translationSnap),i.parent&&i.position.sub(xt.setFromMatrixPosition(i.parent.matrixWorld)))),i.position.x=Math.max(this.minX,Math.min(this.maxX,i.position.x)),i.position.y=Math.max(this.minY,Math.min(this.maxY,i.position.y)),i.position.z=Math.max(this.minZ,Math.min(this.maxZ,i.position.z));else if(s==="scale"){if(t.search("XYZ")!==-1){let o=this.pointEnd.length()/this.pointStart.length();this.pointEnd.dot(this.pointStart)<0&&(o*=-1),_i.set(o,o,o)}else xt.copy(this.pointStart),_i.copy(this.pointEnd),xt.applyQuaternion(this._worldQuaternionInv),_i.applyQuaternion(this._worldQuaternionInv),_i.divide(xt),t.search("X")===-1&&(_i.x=1),t.search("Y")===-1&&(_i.y=1),t.search("Z")===-1&&(_i.z=1);i.scale.copy(this._scaleStart).multiply(_i),this.scaleSnap&&(t.search("X")!==-1&&(i.scale.x=Math.round(i.scale.x/this.scaleSnap)*this.scaleSnap||this.scaleSnap),t.search("Y")!==-1&&(i.scale.y=Math.round(i.scale.y/this.scaleSnap)*this.scaleSnap||this.scaleSnap),t.search("Z")!==-1&&(i.scale.z=Math.round(i.scale.z/this.scaleSnap)*this.scaleSnap||this.scaleSnap))}else if(s==="rotate"){this._offset.copy(this.pointEnd).sub(this.pointStart);const o=20/this.worldPosition.distanceTo(xt.setFromMatrixPosition(this.camera.matrixWorld));let l=!1;t==="XYZE"?(this.rotationAxis.copy(this._offset).cross(this.eye).normalize(),this.rotationAngle=this._offset.dot(xt.copy(this.rotationAxis).cross(this.eye))*o):(t==="X"||t==="Y"||t==="Z")&&(this.rotationAxis.copy(Vf[t]),xt.copy(Vf[t]),n==="local"&&xt.applyQuaternion(this.worldQuaternion),xt.cross(this.eye),xt.length()===0?l=!0:this.rotationAngle=this._offset.dot(xt.normalize())*o),(t==="E"||l)&&(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),n==="local"&&t!=="E"&&t!=="XYZE"?(i.quaternion.copy(this._quaternionStart),i.quaternion.multiply(Ve.setFromAxisAngle(this.rotationAxis,this.rotationAngle)).normalize()):(this.rotationAxis.applyQuaternion(this._parentQuaternionInv),i.quaternion.copy(Ve.setFromAxisAngle(this.rotationAxis,this.rotationAngle)),i.quaternion.multiply(this._quaternionStart).normalize())}this.dispatchEvent(ih),this.dispatchEvent($f)}}pointerUp(e){e!==null&&e.button!==0||(this.dragging&&this.axis!==null&&(Wf.mode=this.mode,this.dispatchEvent(Wf)),this.dragging=!1,this.axis=null)}dispose(){this.disconnect(),this._root.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(ih),this.dispatchEvent($f),this.pointStart.copy(this.pointEnd))}getRaycaster(){return Qi}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 oN(a){if(this.domElement.ownerDocument.pointerLockElement)return{x:0,y:0,button:a.button};{const e=this.domElement.getBoundingClientRect();return{x:(a.clientX-e.left)/e.width*2-1,y:-(a.clientY-e.top)/e.height*2+1,button:a.button}}}function lN(a){if(this.enabled)switch(a.pointerType){case"mouse":case"pen":this.pointerHover(this._getPointer(a));break}}function cN(a){this.enabled&&(document.pointerLockElement||this.domElement.setPointerCapture(a.pointerId),this.domElement.addEventListener("pointermove",this._onPointerMove),this.pointerHover(this._getPointer(a)),this.pointerDown(this._getPointer(a)))}function hN(a){this.enabled&&this.pointerMove(this._getPointer(a))}function uN(a){this.enabled&&(this.domElement.releasePointerCapture(a.pointerId),this.domElement.removeEventListener("pointermove",this._onPointerMove),this.pointerUp(this._getPointer(a)))}function nh(a,e,t){const s=e.intersectObject(a,!0);for(let i=0;i<s.length;i++)if(s[i].object.visible||t)return s[i];return!1}const To=new x.Euler,Fe=new x.Vector3(0,1,0),jf=new x.Vector3(0,0,0),qf=new x.Matrix4,So=new x.Quaternion,Io=new x.Quaternion,Rs=new x.Vector3,Yf=new x.Matrix4,sa=new x.Vector3(1,0,0),sn=new x.Vector3(0,1,0),ia=new x.Vector3(0,0,1),vo=new x.Vector3,qr=new x.Vector3,Yr=new x.Vector3;class dN extends x.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)}dispose(){this.traverse(function(e){e.geometry&&e.geometry.dispose(),e.material&&e.material.dispose()})}}class pN extends x.Object3D{constructor(){super(),this.isTransformControlsGizmo=!0,this.type="TransformControlsGizmo";const e=new x.MeshBasicMaterial({depthTest:!1,depthWrite:!1,fog:!1,toneMapped:!1,transparent:!0}),t=new x.LineBasicMaterial({depthTest:!1,depthWrite:!1,fog:!1,toneMapped:!1,transparent:!0}),s=e.clone();s.opacity=.15;const i=t.clone();i.opacity=.5;const n=e.clone();n.color.setHex(16711680);const r=e.clone();r.color.setHex(65280);const o=e.clone();o.color.setHex(255);const l=e.clone();l.color.setHex(16711680),l.opacity=.5;const c=e.clone();c.color.setHex(65280),c.opacity=.5;const h=e.clone();h.color.setHex(255),h.opacity=.5;const u=e.clone();u.opacity=.25;const d=e.clone();d.color.setHex(16776960),d.opacity=.25,e.clone().color.setHex(16776960);const f=e.clone();f.color.setHex(7895160);const m=new x.CylinderGeometry(0,.04,.1,12);m.translate(0,.05,0);const y=new x.BoxGeometry(.08,.08,.08);y.translate(0,.04,0);const g=new x.BufferGeometry;g.setAttribute("position",new x.Float32BufferAttribute([0,0,0,1,0,0],3));const _=new x.CylinderGeometry(.0075,.0075,.5,3);_.translate(0,.25,0);function b(Q,we){const ue=new x.TorusGeometry(Q,.0075,3,64,we*Math.PI*2);return ue.rotateY(Math.PI/2),ue.rotateX(Math.PI/2),ue}function T(){const Q=new x.BufferGeometry;return Q.setAttribute("position",new x.Float32BufferAttribute([0,0,0,1,1,1],3)),Q}const S={X:[[new x.Mesh(m,n),[.5,0,0],[0,0,-Math.PI/2]],[new x.Mesh(m,n),[-.5,0,0],[0,0,Math.PI/2]],[new x.Mesh(_,n),[0,0,0],[0,0,-Math.PI/2]]],Y:[[new x.Mesh(m,r),[0,.5,0]],[new x.Mesh(m,r),[0,-.5,0],[Math.PI,0,0]],[new x.Mesh(_,r)]],Z:[[new x.Mesh(m,o),[0,0,.5],[Math.PI/2,0,0]],[new x.Mesh(m,o),[0,0,-.5],[-Math.PI/2,0,0]],[new x.Mesh(_,o),null,[Math.PI/2,0,0]]],XYZ:[[new x.Mesh(new x.OctahedronGeometry(.1,0),u.clone()),[0,0,0]]],XY:[[new x.Mesh(new x.BoxGeometry(.15,.15,.01),h.clone()),[.15,.15,0]]],YZ:[[new x.Mesh(new x.BoxGeometry(.15,.15,.01),l.clone()),[0,.15,.15],[0,Math.PI/2,0]]],XZ:[[new x.Mesh(new x.BoxGeometry(.15,.15,.01),c.clone()),[.15,0,.15],[-Math.PI/2,0,0]]]},C={X:[[new x.Mesh(new x.CylinderGeometry(.2,0,.6,4),s),[.3,0,0],[0,0,-Math.PI/2]],[new x.Mesh(new x.CylinderGeometry(.2,0,.6,4),s),[-.3,0,0],[0,0,Math.PI/2]]],Y:[[new x.Mesh(new x.CylinderGeometry(.2,0,.6,4),s),[0,.3,0]],[new x.Mesh(new x.CylinderGeometry(.2,0,.6,4),s),[0,-.3,0],[0,0,Math.PI]]],Z:[[new x.Mesh(new x.CylinderGeometry(.2,0,.6,4),s),[0,0,.3],[Math.PI/2,0,0]],[new x.Mesh(new x.CylinderGeometry(.2,0,.6,4),s),[0,0,-.3],[-Math.PI/2,0,0]]],XYZ:[[new x.Mesh(new x.OctahedronGeometry(.2,0),s)]],XY:[[new x.Mesh(new x.BoxGeometry(.2,.2,.01),s),[.15,.15,0]]],YZ:[[new x.Mesh(new x.BoxGeometry(.2,.2,.01),s),[0,.15,.15],[0,Math.PI/2,0]]],XZ:[[new x.Mesh(new x.BoxGeometry(.2,.2,.01),s),[.15,0,.15],[-Math.PI/2,0,0]]]},w={START:[[new x.Mesh(new x.OctahedronGeometry(.01,2),i),null,null,null,"helper"]],END:[[new x.Mesh(new x.OctahedronGeometry(.01,2),i),null,null,null,"helper"]],DELTA:[[new x.Line(T(),i),null,null,null,"helper"]],X:[[new x.Line(g,i.clone()),[-1e3,0,0],null,[1e6,1,1],"helper"]],Y:[[new x.Line(g,i.clone()),[0,-1e3,0],[0,0,Math.PI/2],[1e6,1,1],"helper"]],Z:[[new x.Line(g,i.clone()),[0,0,-1e3],[0,-Math.PI/2,0],[1e6,1,1],"helper"]]},R={XYZE:[[new x.Mesh(b(.5,1),f),null,[0,Math.PI/2,0]]],X:[[new x.Mesh(b(.5,.5),n)]],Y:[[new x.Mesh(b(.5,.5),r),null,[0,0,-Math.PI/2]]],Z:[[new x.Mesh(b(.5,.5),o),null,[0,Math.PI/2,0]]],E:[[new x.Mesh(b(.75,1),d),null,[0,Math.PI/2,0]]]},P={AXIS:[[new x.Line(g,i.clone()),[-1e3,0,0],null,[1e6,1,1],"helper"]]},z={XYZE:[[new x.Mesh(new x.SphereGeometry(.25,10,8),s)]],X:[[new x.Mesh(new x.TorusGeometry(.5,.1,4,24),s),[0,0,0],[0,-Math.PI/2,-Math.PI/2]]],Y:[[new x.Mesh(new x.TorusGeometry(.5,.1,4,24),s),[0,0,0],[Math.PI/2,0,0]]],Z:[[new x.Mesh(new x.TorusGeometry(.5,.1,4,24),s),[0,0,0],[0,0,-Math.PI/2]]],E:[[new x.Mesh(new x.TorusGeometry(.75,.1,2,24),s)]]},$={X:[[new x.Mesh(y,n),[.5,0,0],[0,0,-Math.PI/2]],[new x.Mesh(_,n),[0,0,0],[0,0,-Math.PI/2]],[new x.Mesh(y,n),[-.5,0,0],[0,0,Math.PI/2]]],Y:[[new x.Mesh(y,r),[0,.5,0]],[new x.Mesh(_,r)],[new x.Mesh(y,r),[0,-.5,0],[0,0,Math.PI]]],Z:[[new x.Mesh(y,o),[0,0,.5],[Math.PI/2,0,0]],[new x.Mesh(_,o),[0,0,0],[Math.PI/2,0,0]],[new x.Mesh(y,o),[0,0,-.5],[-Math.PI/2,0,0]]],XY:[[new x.Mesh(new x.BoxGeometry(.15,.15,.01),h),[.15,.15,0]]],YZ:[[new x.Mesh(new x.BoxGeometry(.15,.15,.01),l),[0,.15,.15],[0,Math.PI/2,0]]],XZ:[[new x.Mesh(new x.BoxGeometry(.15,.15,.01),c),[.15,0,.15],[-Math.PI/2,0,0]]],XYZ:[[new x.Mesh(new x.BoxGeometry(.1,.1,.1),u.clone())]]},q={X:[[new x.Mesh(new x.CylinderGeometry(.2,0,.6,4),s),[.3,0,0],[0,0,-Math.PI/2]],[new x.Mesh(new x.CylinderGeometry(.2,0,.6,4),s),[-.3,0,0],[0,0,Math.PI/2]]],Y:[[new x.Mesh(new x.CylinderGeometry(.2,0,.6,4),s),[0,.3,0]],[new x.Mesh(new x.CylinderGeometry(.2,0,.6,4),s),[0,-.3,0],[0,0,Math.PI]]],Z:[[new x.Mesh(new x.CylinderGeometry(.2,0,.6,4),s),[0,0,.3],[Math.PI/2,0,0]],[new x.Mesh(new x.CylinderGeometry(.2,0,.6,4),s),[0,0,-.3],[-Math.PI/2,0,0]]],XY:[[new x.Mesh(new x.BoxGeometry(.2,.2,.01),s),[.15,.15,0]]],YZ:[[new x.Mesh(new x.BoxGeometry(.2,.2,.01),s),[0,.15,.15],[0,Math.PI/2,0]]],XZ:[[new x.Mesh(new x.BoxGeometry(.2,.2,.01),s),[.15,0,.15],[-Math.PI/2,0,0]]],XYZ:[[new x.Mesh(new x.BoxGeometry(.2,.2,.2),s),[0,0,0]]]},j={X:[[new x.Line(g,i.clone()),[-1e3,0,0],null,[1e6,1,1],"helper"]],Y:[[new x.Line(g,i.clone()),[0,-1e3,0],[0,0,Math.PI/2],[1e6,1,1],"helper"]],Z:[[new x.Line(g,i.clone()),[0,0,-1e3],[0,-Math.PI/2,0],[1e6,1,1],"helper"]]};function Z(Q){const we=new x.Object3D;for(const ue in Q)for(let ge=Q[ue].length;ge--;){const ie=Q[ue][ge][0].clone(),Ee=Q[ue][ge][1],ke=Q[ue][ge][2],rt=Q[ue][ge][3],be=Q[ue][ge][4];ie.name=ue,ie.tag=be,Ee&&ie.position.set(Ee[0],Ee[1],Ee[2]),ke&&ie.rotation.set(ke[0],ke[1],ke[2]),rt&&ie.scale.set(rt[0],rt[1],rt[2]),ie.updateMatrix();const at=ie.geometry.clone();at.applyMatrix4(ie.matrix),ie.geometry=at,ie.renderOrder=1/0,ie.position.set(0,0,0),ie.rotation.set(0,0,0),ie.scale.set(1,1,1),we.add(ie)}return we}this.gizmo={},this.picker={},this.helper={},this.add(this.gizmo.translate=Z(S)),this.add(this.gizmo.rotate=Z(R)),this.add(this.gizmo.scale=Z($)),this.add(this.picker.translate=Z(C)),this.add(this.picker.rotate=Z(z)),this.add(this.picker.scale=Z(q)),this.add(this.helper.translate=Z(w)),this.add(this.helper.rotate=Z(P)),this.add(this.helper.scale=Z(j)),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:Io;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 i=[];i=i.concat(this.picker[this.mode].children),i=i.concat(this.gizmo[this.mode].children),i=i.concat(this.helper[this.mode].children);for(let n=0;n<i.length;n++){const r=i[n];r.visible=!0,r.rotation.set(0,0,0),r.position.copy(this.worldPosition);let o;if(this.camera.isOrthographicCamera?o=(this.camera.top-this.camera.bottom)/this.camera.zoom:o=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(o*this.size/4),r.tag==="helper"){r.visible=!1,r.name==="AXIS"?(r.visible=!!this.axis,this.axis==="X"&&(Ve.setFromEuler(To.set(0,0,0)),r.quaternion.copy(s).multiply(Ve),Math.abs(Fe.copy(sa).applyQuaternion(s).dot(this.eye))>.9&&(r.visible=!1)),this.axis==="Y"&&(Ve.setFromEuler(To.set(0,0,Math.PI/2)),r.quaternion.copy(s).multiply(Ve),Math.abs(Fe.copy(sn).applyQuaternion(s).dot(this.eye))>.9&&(r.visible=!1)),this.axis==="Z"&&(Ve.setFromEuler(To.set(0,Math.PI/2,0)),r.quaternion.copy(s).multiply(Ve),Math.abs(Fe.copy(ia).applyQuaternion(s).dot(this.eye))>.9&&(r.visible=!1)),this.axis==="XYZE"&&(Ve.setFromEuler(To.set(0,Math.PI/2,0)),Fe.copy(this.rotationAxis),r.quaternion.setFromRotationMatrix(qf.lookAt(jf,Fe,sn)),r.quaternion.multiply(Ve),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),xt.set(1e-10,1e-10,1e-10).add(this.worldPositionStart).sub(this.worldPosition).multiplyScalar(-1),xt.applyQuaternion(this.worldQuaternionStart.clone().invert()),r.scale.copy(xt),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(Fe.copy(sa).applyQuaternion(s).dot(this.eye))>.99&&(r.scale.set(1e-10,1e-10,1e-10),r.visible=!1),r.name==="Y"&&Math.abs(Fe.copy(sn).applyQuaternion(s).dot(this.eye))>.99&&(r.scale.set(1e-10,1e-10,1e-10),r.visible=!1),r.name==="Z"&&Math.abs(Fe.copy(ia).applyQuaternion(s).dot(this.eye))>.99&&(r.scale.set(1e-10,1e-10,1e-10),r.visible=!1),r.name==="XY"&&Math.abs(Fe.copy(ia).applyQuaternion(s).dot(this.eye))<.2&&(r.scale.set(1e-10,1e-10,1e-10),r.visible=!1),r.name==="YZ"&&Math.abs(Fe.copy(sa).applyQuaternion(s).dot(this.eye))<.2&&(r.scale.set(1e-10,1e-10,1e-10),r.visible=!1),r.name==="XZ"&&Math.abs(Fe.copy(sn).applyQuaternion(s).dot(this.eye))<.2&&(r.scale.set(1e-10,1e-10,1e-10),r.visible=!1)):this.mode==="rotate"&&(So.copy(s),Fe.copy(this.eye).applyQuaternion(Ve.copy(s).invert()),r.name.search("E")!==-1&&r.quaternion.setFromRotationMatrix(qf.lookAt(this.eye,jf,sn)),r.name==="X"&&(Ve.setFromAxisAngle(sa,Math.atan2(-Fe.y,Fe.z)),Ve.multiplyQuaternions(So,Ve),r.quaternion.copy(Ve)),r.name==="Y"&&(Ve.setFromAxisAngle(sn,Math.atan2(Fe.x,Fe.z)),Ve.multiplyQuaternions(So,Ve),r.quaternion.copy(Ve)),r.name==="Z"&&(Ve.setFromAxisAngle(ia,Math.atan2(Fe.y,Fe.x)),Ve.multiplyQuaternions(So,Ve),r.quaternion.copy(Ve))),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(l){return r.name===l}))&&(r.material.color.setHex(16776960),r.material.opacity=1)}super.updateMatrixWorld(e)}}class fN extends x.Mesh{constructor(){super(new x.PlaneGeometry(1e5,1e5,2,2),new x.MeshBasicMaterial({visible:!1,wireframe:!0,side:x.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"),vo.copy(sa).applyQuaternion(t==="local"?this.worldQuaternion:Io),qr.copy(sn).applyQuaternion(t==="local"?this.worldQuaternion:Io),Yr.copy(ia).applyQuaternion(t==="local"?this.worldQuaternion:Io),Fe.copy(qr),this.mode){case"translate":case"scale":switch(this.axis){case"X":Fe.copy(this.eye).cross(vo),Rs.copy(vo).cross(Fe);break;case"Y":Fe.copy(this.eye).cross(qr),Rs.copy(qr).cross(Fe);break;case"Z":Fe.copy(this.eye).cross(Yr),Rs.copy(Yr).cross(Fe);break;case"XY":Rs.copy(Yr);break;case"YZ":Rs.copy(vo);break;case"XZ":Fe.copy(Yr),Rs.copy(qr);break;case"XYZ":case"E":Rs.set(0,0,0);break}break;case"rotate":default:Rs.set(0,0,0)}Rs.length()===0?this.quaternion.copy(this.cameraQuaternion):(Yf.lookAt(xt.set(0,0,0),Rs,Fe),this.quaternion.setFromRotationMatrix(Yf)),super.updateMatrixWorld(e)}}class ft extends x.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(X.SET_SCENE,this.setScene)}clear(){for(const e of this.controls.values()){e.detach(),e.disconnect();const t=e.getHelper();Is(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 aN(this.activeCamera,s),t.getHelper().name=e,t.setSize(.5),t.setSpace("local"),this.controls.set(e,t),this.visibility.set(e,!0),t.addEventListener("mouseDown",()=>{this.dispatchEvent({type:ft.DRAG_START})}),t.addEventListener("mouseUp",()=>{this.dispatchEvent({type:ft.DRAG_END})}),t.addEventListener("dragging-changed",i=>{et.instance?.toggleOrbitControls(i.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(),Is(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(t))})}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 ft._instance||(ft._instance=new ft),ft._instance}}const mN=new x.BoxGeometry,rh=new x.Vector2;class Lo extends x.Object3D{curve=new x.CatmullRomCurve3;line;draggable;curvePos;tension=.5;closed=!1;subdivide=50;curveType;offset=1;lineMaterial;_camera;_curvePercentage=0;_draggableScale=10;_transform;raycaster;draggedMat=new x.MeshBasicMaterial;parentGroup;group;constructor(e,t){const s=new x.Color(Ni(.5,1,Math.random()),Ni(.5,1,Math.random()),Ni(.5,1,Math.random()));super(),this.name=e,this.lineMaterial=new x.LineBasicMaterial({color:s}),this.line=new x.Line(new x.BufferGeometry,this.lineMaterial),this.line.name="line",this.line.visible=!1,this.add(this.line),this._camera=t,this.curveType="catmullrom",this.draggedMat.color=s,this.draggable=new x.Object3D,this.draggable.name="draggablePoints",this.add(this.draggable),this.curvePos=new x.Mesh(new x.SphereGeometry(1.5),new x.MeshBasicMaterial({color:s})),this.curvePos.name="curvePos",this.curvePos.scale.setScalar(this._draggableScale),this.curvePos.visible=!1,this.add(this.curvePos),this.raycaster=new x.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),ft.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([ss(t.position.x,3),ss(t.position.y,3),ss(t.position.z,3)])}),Qf({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])}};addPoint=(e,t=!0)=>{const s=this.draggable.children.length,i=new x.Mesh(mN,this.draggedMat);i.name=`point_${s}`,i.position.copy(e),i.scale.setScalar(this._draggableScale),this.draggable.add(i),this._transform?.attach(i);const n=this.points.length>1;return n&&t&&this.updateSpline(),this.line.visible=n,this.updateCurrentPoint(),i};addNextPt=()=>{const e=this.draggable.children.length,t=e>1?this.draggable.children[e-1].position.clone():new x.Vector3,s=this.addPoint(t);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)}Is(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)};updateLastPoint(e){const t=this.draggable.children.length;t>0&&(this.draggable.children[t-1].position.copy(e),this.updateSpline())}updateSpline=()=>{this.points.length<2||(this.curve=new x.CatmullRomCurve3(this.points,this.closed,this.curveType,this.tension),this.line.geometry.dispose(),this.line.geometry=new x.BufferGeometry().setFromPoints(this.curve.getPoints(this.subdivide)),this.curvePos.position.copy(this.getPointAt(this._curvePercentage)))};onMouseClick=e=>{if(!et.instance||!et.instance.currentWindow||this._transform&&!this._transform.getHelper().visible)return;const s=et.instance.currentWindow.current.getBoundingClientRect();rh.x=(e.clientX-s.x)/s.width*2-1,rh.y=-((e.clientY-s.y)/s.height)*2+1,this.raycaster.setFromCamera(rh,this.camera);const i=this.raycaster.intersectObjects(this.draggable.children,!1);if(i.length>0){const n=i[0].object;n!==this._transform?.object&&(this._transform?.attach(n),this.group.current?.setField("Current Point",n.position))}};getPointAt(e){return this.curve.points.length>1?this.curve.getPointAt(e):this.curve.points.length===1?this.curve.points[0]:new x.Vector3}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))}updateCurrentPoint(){if(this._transform?.object&&this.group){const e=this._transform?.object;e.name.search("point")>-1&&this.group.current?.setField("Current Point",e.position)}}onUpdateTransform=()=>{this.updateCurrentPoint(),this.updateSpline()};initDebug(e){const t=this.draggable.children;this.parentGroup=e,this._transform=ft.instance.add(this.name),this._transform.camera=this._camera,this._transform.addEventListener("objectChange",this.onUpdateTransform),t.length>0&&this._transform.attach(t[t.length-1]),et.instance?.helpersContainer.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,expanded:!0,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:1e3,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:(i,n)=>{switch(i){case"Closed":this.closed=n,this.updateSpline();break;case"Visible":this.visible=n;break;case"Color":this.lineMaterial.color.setStyle(n),this.draggedMat.color.setStyle(n);break;case"Curve":this.curveType=n,this.updateSpline();break;case"Draggable Scale":this.draggableScale=n;break;case"Subdivide":this.subdivide=n,this.updateSpline();break;case"Tension":this.tension=n,this.updateSpline();break;case"New Pt Offset":this.offset=n;break;case"Curve At":this.curvePos.position.copy(this.getPointAt(n));break;case"Show Position":this.curvePos.visible=n;break;case"Show Points":this.draggable.visible=n;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":this.parent.currentSpline=null,Is(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(n),this.updateSpline())}break}}}),this.draggable.children.forEach(i=>{this.debugPoint(i)})}debugPoint=e=>{e.name,e.visible=this.draggable.visible}}let wo=0;class Uy extends x.Object3D{defaultScale=10;currentSpline=null;_camera;group=null;app;splineDataText="";constructor(e,t){super(),this.name="Spline Editor",this._camera=e,this.app=t,this.app.addEventListener(X.ADD_SPLINE,this.onAddSpline)}initDebug(){this.group=xe.addEditorGroup({title:this.name,items:[{type:"field",prop:"Spline Data",value:"",disabled:!1},{type:"button",prop:"Import Spline"},{type:"button",prop:"New Spline"},{type:"boolean",prop:"Show Points",value:!0},{type:"boolean",prop:"Draw Mode",value:!1},{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"Spline Data":this.splineDataText=t;break;case"Import Spline":this.createSplineFromJSON(JSON.parse(this.splineDataText));break;case"Show Points":this.showPoints(t);break;case"Visible":this.visible=t;break;case"Default Scale":this.defaultScale=t;break;case"Draw Mode":t?this.enableClickToDraw():this.disableClickToDraw();break}}})}dispose(){this.app.removeEventListener(X.ADD_SPLINE,this.onAddSpline),xe.removeEditorGroup(this.name)}addSpline(e){e.draggableScale=this.defaultScale,e.hideTransform(),this.group?.current!==null&&e.initDebug(this.group.current),this.add(e),this.currentSpline=e}createSpline=(e=[])=>{const t=`Spline ${wo+1}`,s=new Lo(t,this._camera);return s.addPoints(e),this.addSpline(s),wo++,s};createSplineFromArray=e=>{const t=[];return e.forEach(s=>{t.push(new x.Vector3(s[0],s[1],s[2]))}),this.createSpline(t)};createSplineFromCatmullRom=e=>this.createSpline(e.points);createSplineFromJSON=e=>{const t=[];e.points.forEach(i=>{t.push(new x.Vector3(i[0],i[1],i[2]))});const s=new Lo(e.name,this._camera);return s.closed=e.closed,s.subdivide=e.subdivide,s.tension=e.tension,s.type=e.type,s.addPoints(t),s.updateSpline(),this.addSpline(s),s};showPoints=(e=!0)=>{this.children.forEach(t=>{t.showPoints(e)})};onAddSpline=e=>{const t=JSON.parse(e.value),s=`Spline ${wo+1}`,i=[];t.points.forEach(r=>{i.push(new x.Vector3(r[0],r[1],r[2]))});const n=new Lo(s,this.camera);n.addPoints(i),this.addSpline(n),wo++};isMouseDown=!1;enableClickToDraw(){document.querySelectorAll(".clickable").forEach(e=>{e.addEventListener("mousedown",this.onClickCanvas),e.addEventListener("mousemove",this.onMouseMove),e.addEventListener("mouseup",this.onMouseUp)})}disableClickToDraw(){document.querySelectorAll(".clickable").forEach(e=>{e.removeEventListener("mousedown",this.onClickCanvas),e.removeEventListener("mousemove",this.onMouseMove),e.removeEventListener("mouseup",this.onMouseUp)})}onClickCanvas=e=>{if(e.button!==0)return;if(this._camera.type!=="OrthographicCamera"){console.warn("Spline Editor - 3D Camera not supported in Draw Mode");return}const s=e.target.getBoundingClientRect(),i=(e.clientX-s.left)/s.width*2-1,n=-((e.clientY-s.top)/s.height)*2+1;if(et.instance){const o=new x.Raycaster;o.setFromCamera(new x.Vector2(i,n),this._camera);const l=o.intersectObjects(et.instance.helpersContainer.children,!0);for(let c=0;c<l.length;c++){const h=l[c];if(!(h.object.isLine||h.object.isTransformControlsPlane)&&h.object.isObject3D)return}}this.currentSpline===null&&(this.currentSpline=this.createSpline());const r=this.mouseToSplinePos(i,n,s.width,s.height);this.currentSpline?.addPoint(r),this.isMouseDown=!0};onMouseMove=e=>{if(!this.isMouseDown)return;const s=e.target.getBoundingClientRect(),i=(e.clientX-s.left)/s.width*2-1,n=-((e.clientY-s.top)/s.height)*2+1,r=this.mouseToSplinePos(i,n,s.width,s.height);this.currentSpline?.updateLastPoint(r)};onMouseUp=()=>{this.isMouseDown=!1};mouseToSplinePos(e,t,s,i){const n=new x.Vector3,r=Math.PI/2,o=this._camera,l=o.zoom,c=o.rotation.x===-6123233995736766e-32&&o.rotation.y===0&&o.rotation.z===0,h=o.rotation.x===-Math.PI&&o.rotation.y===12246467991473532e-32&&o.rotation.z===Math.PI,u=o.rotation.x===-6162975822039155e-48&&o.rotation.y===-r&&o.rotation.z===0,d=o.rotation.x===-6162975822039155e-48&&o.rotation.y===r&&o.rotation.z===0,p=o.rotation.x===-1.5707953264174506&&o.rotation.y===0&&o.rotation.z===0,f=o.rotation.x===1.5707953264174506&&o.rotation.y===0&&o.rotation.z===0;let m=e,y=t;h||d?m*=-1:p&&(y*=-1);const g=s/2/l,_=i/2/l;if(this.currentSpline===null&&(this.currentSpline=this.createSpline()),c||h){const b=m*g+o.position.x,T=y*_+o.position.y;n.set(b,T,0)}else if(u||d){const b=m*g+o.position.z,T=y*_+o.position.y;n.set(0,T,b)}else if(p||f){const b=m*g+o.position.x,T=y*_+o.position.z;n.set(b,0,T)}return n}get camera(){return this._camera}set camera(e){this._camera=e,this.children.forEach(t=>{const s=t;s.camera=e})}}const Xf=["Single","Side by Side","Stacked","Quad"],gN="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",yN="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==",xN="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAVCAYAAACpF6WWAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAQ0lEQVQ4jWP8////fwYqAxYozUhFM/8zkaKYWIWkGEq0b0ZdSjQY5i79TyWagRGaTUdzFEEw6lLqGzqwLoVVJ1StpwA9sBwbUqAh5gAAAABJRU5ErkJggg==";class et extends W.Component{static instance=null;app;scene;renderer;currentScene;scenes=new Map;cameras=new Map;controls=new Map;currentCamera;currentWindow;helpersContainer=new x.Group;cameraHelpers=new Map;lightHelpers=new Map;grid=new sN;interactionHelper=new x.AxesHelper(25);currentTransform;splineEditor;depthMaterial=new x.MeshDepthMaterial;normalsMaterial=new x.MeshNormalMaterial;uvMaterial=new rN;wireframeMaterial=new x.MeshBasicMaterial({opacity:.33,transparent:!0,wireframe:!0});playing=!1;rafID=-1;cameraControlsRafID=-1;width=0;height=0;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 x.Raycaster;pointer=new x.Vector2;cameraControls=void 0;canvasRef;containerRef;tlWindow;trWindow;blWindow;brWindow;editorCameras=["Top","Bottom","Left","Right","Front","Back","Orthographic","UI","Debug"];constructor(e){super(e),this.app=e.app,this.app.addEventListener(X.ADD_RENDERER,this.setupRenderer),this.scene=new x.Scene,this.scene.name=this.scene.uuid="",this.canvasRef=W.createRef(),this.containerRef=W.createRef(),this.tlWindow=W.createRef(),this.trWindow=W.createRef(),this.blWindow=W.createRef(),this.brWindow=W.createRef();const t=e.three.app.appID,s=localStorage,i=s.getItem(`${t}_mode`);this.state={mode:i!==null?i:"Single",modeOpen:!1,renderModeOpen:!1,interactionMode:"Orbit",interactionModeOpen:!1,lastUpdate:Date.now(),connected:!1},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 n={Vector2:x.Vector2,Vector3:x.Vector3,Vector4:x.Vector4,Quaternion:x.Quaternion,Matrix4:x.Matrix4,Spherical:x.Spherical,Box3:x.Box3,Sphere:x.Sphere,Raycaster:x.Raycaster};Ds.install({THREE:n}),this.setupScene(),this.setupTools();const r=localStorage.getItem(this.expandedCameraVisibility);r!==null&&(this.cameraVisibility=r==="open"),this.saveExpandedCameraVisibility();const o=localStorage.getItem(this.expandedLightVisibility);o!==null&&(this.lightVisibility=o==="open"),this.saveExpandedLightVisibility();const l=localStorage.getItem(this.expandedGridVisibility);l!==null&&(this.gridVisibility=l==="open"),this.grid.visible=this.gridVisibility,this.saveExpandedGridVisibility(),et.instance=this}componentDidMount(){this.enable(),this.assignControls(),this.resize(),this.play(),ft.instance.setApp(this.props.app,this.props.three),ft.instance.activeCamera=this.debugCamera}componentDidUpdate(e,t,s){t.mode!==this.state.mode&&(this.assignControls(),this.resize())}componentWillUnmount(){this.disable(),this.clear(),xe.removeEditorGroup("View Settings")}render(){const e=[];return this.cameras.forEach((t,s)=>{e.push(s)}),M.jsxs("div",{className:"multiview",children:[M.jsx("canvas",{ref:this.canvasRef}),M.jsxs("div",{className:`cameras ${this.state.mode==="Single"||this.state.mode==="Stacked"?"single":""}`,ref:this.containerRef,children:[this.state.mode==="Single"&&M.jsx(M.Fragment,{children:M.jsx(Zi,{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")&&M.jsxs(M.Fragment,{children:[M.jsx(Zi,{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)}}),M.jsx(Zi,{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"&&M.jsxs(M.Fragment,{children:[M.jsx(Zi,{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)}}),M.jsx(Zi,{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)}}),M.jsx(Zi,{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)}}),M.jsx(Zi,{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)}})]})]}),M.jsxs("div",{className:"settings",children:[M.jsx(al,{title:"View",index:Xf.indexOf(this.state.mode),options:Xf,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})}}),M.jsx(al,{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})}}),M.jsx(sh,{name:"cameraHelper",icon:gN,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)}}}),M.jsx(sh,{name:"lightHelper",icon:yN,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)}}}),M.jsx(sh,{name:"gridHelper",icon:xN,selected:this.gridVisibility,height:21,width:21,onClick:t=>{this.gridVisibility=t,this.saveExpandedGridVisibility(),this.grid.visible=t}})]},this.state.lastUpdate),!this.state.connected&&M.jsx("div",{className:"connectionStatus",children:"Not Connected"})]})}setupRenderer=e=>{this.renderer&&this.renderer.dispose();const t=this.canvasRef.current;this.props.three.canvas=t;const s=e.value;s.type==="WebGLRenderer"?(this.renderer=new x.WebGLRenderer({canvas:t,stencil:!1}),this.grid.visible=!0):s.type==="WebGPURenderer"&&(this.renderer=new mo({canvas:t,stencil:!1}),this.grid.visible=!1),this.renderer&&(this.renderer.autoClear=!1,this.renderer.shadowMap.enabled=!0,this.renderer.setPixelRatio(devicePixelRatio),this.renderer.setClearColor(0),this.resize(),this.props.three.renderer=this.renderer,this.onRemoteConnected())};setupScene(){this.helpersContainer.name="helpers",this.scene.add(this.helpersContainer),this.grid.position.y=-1,this.scene.add(this.grid),this.interactionHelper.name="interactionHelper",this.interactionHelper.visible=!1,this.helpersContainer.add(this.interactionHelper);const e=(n,r)=>{const o=new x.OrthographicCamera(-100,100,100,-100,0,3e3);return o.name=n,o.position.copy(r),o.lookAt(0,0,0),this.cameras.set(n,o),o},t=1e3;e("Top",new x.Vector3(0,t,0)),e("Bottom",new x.Vector3(0,-t,0)),e("Left",new x.Vector3(-t,0,0)),e("Right",new x.Vector3(t,0,0)),e("Front",new x.Vector3(0,0,t)),e("Back",new x.Vector3(0,0,-t)),e("Orthographic",new x.Vector3(t,t,t)),e("UI",new x.Vector3),this.debugCamera=new x.PerspectiveCamera(60,1,.01,3e3),this.debugCamera.name="Debug",this.debugCamera.position.set(300,300,300),this.debugCamera.lookAt(0,0,0),this.cameras.set("Debug",this.debugCamera),this.currentCamera=this.debugCamera;const s=localStorage,i=this.props.three.app.appID;this.tlCam=this.cameras.get(s.getItem(`${i}_tlCam`)),this.trCam=this.cameras.get(s.getItem(`${i}_trCam`)),this.blCam=this.cameras.get(s.getItem(`${i}_blCam`)),this.brCam=this.cameras.get(s.getItem(`${i}_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 Uy(this.currentCamera,this.app),this.splineEditor.initDebug(),this.helpersContainer.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})}clear(){this.app.dispatchEvent({type:X.CLEAR_OBJECT}),xe.removeAllGroups(),this.clearLightHelpers(),this.clearControls(),this.currentTransform!==void 0&&(this.currentTransform.removeEventListener("objectChange",this.onUpdateTransform),ft.instance.remove(this.currentTransform.getHelper().name)),this.currentTransform=void 0,ft.instance.clear(),this.cameras.forEach(e=>{this.editorCameras.indexOf(e.name)<0&&this.app.dispatchEvent({type:X.REMOVE_CAMERA,value:e})}),this.currentCamera=this.debugCamera,this.currentScene=void 0,this.scenes.forEach(e=>{this.app.dispatchEvent({type:X.REMOVE_SCENE,value:e})}),this.scenes.clear()}update(){this.renderer&&(this.renderer instanceof x.WebGLRenderer?this.renderer?.clear():this.renderer instanceof mo&&this.renderer?.clearAsync()),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.currentScene!==void 0&&this.props.onSceneUpdate(this.currentScene)}draw(){switch(this.renderer&&(this.renderer instanceof x.WebGLRenderer?this.renderer?.clear():this.renderer instanceof mo&&this.renderer?.clearAsync()),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(X.ADD_SCENE,this.addScene),this.app.addEventListener(X.SET_SCENE,this.sceneUpdate),this.app.addEventListener(X.REMOVE_SCENE,this.removeScene),this.app.addEventListener(X.ADD_CAMERA,this.addCamera),this.app.addEventListener(X.REMOVE_CAMERA,this.removeCamera),this.app.addEventListener(X.SET_OBJECT,this.onSetSelectedItem),this.app.addEventListener(X.REMOTE_CONNECTED,this.onRemoteConnected),this.app.addEventListener(X.REMOTE_DISCONNECTED,this.onRemoteDisconnected)}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(X.ADD_SCENE,this.addScene),this.app.removeEventListener(X.SET_SCENE,this.sceneUpdate),this.app.removeEventListener(X.ADD_CAMERA,this.addCamera),this.app.removeEventListener(X.REMOVE_CAMERA,this.removeCamera),this.app.removeEventListener(X.SET_OBJECT,this.onSetSelectedItem),this.app.removeEventListener(X.REMOTE_CONNECTED,this.onRemoteConnected),this.app.removeEventListener(X.REMOTE_DISCONNECTED,this.onRemoteDisconnected)}resize=()=>{this.width=window.innerWidth-300,this.height=window.innerHeight,this.renderer?.setSize(this.width,this.height);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.currentScene!==void 0&&this.props.onSceneResize(this.currentScene,this.width,this.height);let s=this.width,i=this.height;switch(this.state.mode){case"Side by Side":s=e,i=this.height;break;case"Stacked":s=this.width,i=t;break;case"Quad":s=e,i=t;break}const n=s/i;this.cameras.forEach(r=>{r instanceof x.OrthographicCamera?(r.left=s/-2,r.right=s/2,r.top=i/2,r.bottom=i/-2,r.name==="UI"&&(r.position.x=this.width/2,r.position.y=this.height/-2,r.position.z=100),r.updateProjectionMatrix()):r instanceof x.PerspectiveCamera&&(r.aspect=n,r.updateProjectionMatrix()),this.cameraHelpers.get(r.name)?.update()})};addScene=e=>{const t=this.props.scenes.get(e.value.name);if(t!==void 0){const s=new t;s.visible=!1,this.props.onSceneSet!==void 0&&this.props.onSceneSet(s),this.props.three.scene=s,this.scenes.set(e.value.name,s),this.scene.add(s)}};sceneUpdate=e=>{this.currentScene!==void 0&&(this.currentScene.visible=!1,this.clearLightHelpers());const t=this.scene.getObjectByName(e.value.name);t!==void 0&&(this.currentScene=t,this.currentScene.visible=!0,this.addLightHelpers(this.currentScene))};removeScene=e=>{const t=e.value.name;this.scenes.delete(t);const s=this.scene.getObjectByName(t);s&&setTimeout(()=>{Is(s)},100),this.clearLightHelpers()};addCamera=e=>{const t=e.value,s=t.uuid,i=this.props.three.scene?.getObjectByProperty("uuid",t.uuid);if(i!==void 0){const n=i;this.cameras.set(s,n);const r=new x.CameraHelper(n);r.visible=this.cameraVisibility,this.cameraHelpers.set(s,r),this.helpersContainer.add(r),this.setState({lastUpdate:Date.now()})}};removeCamera=e=>{const s=e.value.uuid,i=this.cameraHelpers.get(s);i!==void 0&&(this.helpersContainer.remove(i),i.dispose()),this.cameras.delete(s),this.setState({lastUpdate:Date.now()})};onMouseMove=e=>{const t=new x.Vector2;this.renderer?.getSize(t);const s=Math.min(e.clientX,t.x),i=Math.min(e.clientY,t.y);this.pointer.x=Ki(s,0,t.x,-1,1),this.pointer.y=Ki(i,0,t.y,1,-1);const n=t.x/2,r=t.y/2,o=()=>{s<n?this.pointer.x=Ki(s,0,n,-1,1):this.pointer.x=Ki(s,n,t.x,-1,1)},l=()=>{i<r?this.pointer.y=Ki(i,0,r,1,-1):this.pointer.y=Ki(i,r,t.y,1,-1)};switch(this.state.mode){case"Quad":o(),l();break;case"Side by Side":o();break;case"Stacked":l(),l();break}if(this.updateCamera(s,i,n,r),this.state.interactionMode==="Orbit"||this.currentScene===void 0)return;const c=this.raycaster.intersectObjects(this.currentScene.children);c.length>0&&this.interactionHelper.position.copy(c[0].point)};onClick=e=>{if(this.state.interactionMode==="Orbit"||this.currentScene===void 0)return;const t=new x.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 Ds(this.currentCamera,this.currentWindow.current),this.selectedItem instanceof x.Mesh||this.selectedItem instanceof x.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 Ds(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 Ds(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 Ds(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 Ds(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 Ds(this.currentCamera,this.currentWindow.current),this.cameraControls.rotateTo(zo(45),zo(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=void 0;const t=e.value.uuid;if(this.scenes.forEach(s=>{t.search(s.uuid)>-1&&(this.selectedItem=s.getObjectByProperty("uuid",t))}),this.selectedItem===void 0){console.log(`Hermes - Can't find selected item: ${e.value.uuid}, ${e.value.name}`);return}this.currentTransform!==void 0&&(this.currentTransform.removeEventListener("objectChange",this.onUpdateTransform),ft.instance.remove(this.currentTransform.getHelper().name)),this.currentTransform=ft.instance.add(e.value.name),this.currentTransform.attach(this.selectedItem),this.helpersContainer.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),Al.instance.update())};onRemoteConnected=()=>{this.setState({connected:!0})};onRemoteDisconnected=()=>{this.clear(),this.setState({connected:!1})};clearLightHelpers=()=>{this.lightHelpers.forEach(e=>{this.helpersContainer.remove(e),e.dispose()}),this.lightHelpers.clear()};addLightHelpers=e=>{e.traverse(t=>{if(t.type.search("Light")>-1){let s;switch(t.type){case"DirectionalLight":s=new x.DirectionalLightHelper(t,100),s.name=`${t.name}Helper`,s.visible=this.lightVisibility,this.lightHelpers.set(t.name,s),this.helpersContainer.add(s);break;case"HemisphereLight":s=new x.HemisphereLightHelper(t,250),s.name=`${t.name}Helper`,s.visible=this.lightVisibility,this.lightHelpers.set(t.name,s),this.helpersContainer.add(s);break;case"RectAreaLight":s=new BR(t),s.name=`${t.name}Helper`,s.visible=this.lightVisibility,this.lightHelpers.set(t.name,s),this.helpersContainer.add(s);break;case"PointLight":s=new x.PointLightHelper(t,100),s.name=`${t.name}Helper`,s.visible=this.lightVisibility,this.lightHelpers.set(t.name,s),this.helpersContainer.add(s);break;case"SpotLight":s=new x.SpotLightHelper(t),s.name=`${t.name}Helper`,s.visible=this.lightVisibility,this.lightHelpers.set(t.name,s),this.helpersContainer.add(s);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 i=new LR(e,t);switch(i.enableDamping=!0,i.dampingFactor=.1,e.name){case"Top":case"Bottom":case"Left":case"Right":case"Front":case"Back":i.enableRotate=!1;break}this.controls.set(e.name,i)}clearCamera(e){const t=this.cameraHelpers.get(e.name);t!==void 0&&(this.helpersContainer.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.helpersContainer.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,i)=>{switch(this.state.mode){case"Quad":t<i?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<i?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),ft.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,i=new x.Clock;i.start(),this.selectedItem.getWorldPosition(e.target0);const n=()=>{const r=i.getDelta();this.cameraControls&&this.cameraControls.update(r),t&&(e.target.lerp(e.target0,s),e.object.position.lerp(e.position0,s),e.object.zoom=rr(e.object.zoom,e.zoom0,s),e.object.updateProjectionMatrix(),e.dispatchEvent({type:"change"})),i.getElapsedTime()>=.5?(cancelAnimationFrame(this.cameraControlsRafID),this.cameraControlsRafID=-1,this.clearControls()):this.cameraControlsRafID=requestAnimationFrame(n)};n()};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,i,n,r){switch(n.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&&(this.renderer?.setViewport(e,t,s,i),this.renderer?.setScissor(e,t,s,i),this.renderer instanceof x.WebGLRenderer?this.renderer?.render(this.scene,n):this.renderer instanceof mo&&this.renderer?.renderAsync(this.scene,n)),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),i=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 n=this.height-i;this.drawTo(0,n,this.width,i,this.tlCam,e),this.drawTo(0,0,this.width,i,this.trCam,t)}};drawQuad=()=>{const e=this.getSceneOverride(this.tlRender),t=this.getSceneOverride(this.trRender),s=this.getSceneOverride(this.blRender),i=this.getSceneOverride(this.brRender),n=Math.floor(this.width/2),r=Math.floor(this.height/2);let o=0,l=0;l=this.height-r,o=0,this.drawTo(o,l,n,r,this.tlCam,e),o=n,this.drawTo(o,l,n,r,this.trCam,t),l=0,o=0,this.scene.overrideMaterial=s,this.drawTo(o,l,n,r,this.blCam,s),o=n,this.drawTo(o,l,n,r,this.brCam,i)};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 Al extends W.Component{static instance;app;matrix=new x.Matrix4;position=new x.Vector3;rotation=new x.Euler;scale=new x.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)),Al.instance=this}update(){if(et.instance){const e=et.instance.selectedItem;if(e===void 0)return;this.position.x=ss(e.position.x,3),this.position.y=ss(e.position.y,3),this.position.z=ss(e.position.z,3),this.rotation.copy(e.rotation),this.scale.x=ss(e.scale.x,3),this.scale.y=ss(e.scale.y,3),this.scale.z=ss(e.scale.z,3),this.setState({lastUpdated:Date.now()})}}render(){return M.jsx(cs,{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 i=this.props.three.getScene(this.props.object.uuid);if(i){const n=i.getObjectByProperty("uuid",this.props.object.uuid);qe(n,e,s)}};saveExpanded(){localStorage.setItem(this.expandedName,this.open?"open":"closed")}get expandedName(){return`${this.props.three.app.appID}_transform`}}function Zf(a){switch(a){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 a}function _N(a,e,t){function s(){return`${t.app.appID}_light`}const i=localStorage.getItem(s()),n=i!==null?i==="open":!1;function r(l){localStorage.setItem(s(),l?"open":"closed")}const o=[];if(a.lightInfo!==void 0)for(const l in a.lightInfo){const c=a.lightInfo[l];c!==void 0&&(c.isColor!==void 0?o.push({title:Zf(l),prop:l,type:"color",value:c,onChange:(h,u)=>{const d=new x.Color(u);t.updateObject(a.uuid,h,d);const p=t.getScene(a.uuid);if(p!==null){const f=p.getObjectByProperty("uuid",a.uuid);qe(f,h,d)}}}):o.push({title:Zf(l),prop:l,type:typeof c,value:c,step:typeof c=="number"?.01:void 0,onChange:(h,u)=>{t.updateObject(a.uuid,h,u);const d=t.getScene(a.uuid);if(d!==null){const p=d.getObjectByProperty("uuid",a.uuid);qe(p,h,u)}}}))}return M.jsx(cs,{app:e,title:"Light",items:o,expanded:n,onToggle:l=>{r(l)}})}function bN(a){const e=a.object,t=a.three;function s(){return`${t.app.appID}_animation`}const i=localStorage.getItem(s()),n=i!==null?i==="open":!1;function r(d){localStorage.setItem(s(),d?"open":"closed")}const o=[],l=[];let c=0;e.animations.forEach(d=>{c=Math.max(c,d.duration),d.duration>0&&l.push({title:d.name,items:[{title:"Duration",type:"number",value:d.duration,disabled:!0},{title:"Blend Mode",type:"option",disabled:!0,options:[{title:"Normal",value:2500},{title:"Additive",value:2501}]}]})}),o.push({title:"Animations",items:l});let h;const u=t.getScene(e.uuid);if(u!==null){const d=u.getObjectByProperty("uuid",e.uuid);if(d!==void 0){const p=d.mixer;if(p!==void 0){const m=[{title:"Time Scale",type:"range",value:p.timeScale,step:.01,min:-1,max:2,onChange:(y,g)=>{p.timeScale=g,t.updateObject(e.uuid,"mixer.timeScale",g)}}];m.push({title:"Stop All",type:"button",onChange:()=>{p.stopAllAction(),t.requestMethod(e.uuid,"stopAllAction",void 0,"mixer")}}),o.push({title:"Mixer",items:m}),h=new x.SkeletonHelper(d),et.instance?.scene.add(h)}}}return W.useEffect(()=>()=>{h!==void 0&&Is(h)},[]),M.jsx(cs,{app:a.app,title:"Animation",items:o,expanded:n,onToggle:d=>{r(d)}})}const ah={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:[]};function ky(a){const[e,t]=W.useState(ah);W.useEffect(()=>{function r(l){t(l.value)}function o(){t(ah)}return a.app.addEventListener(X.CLEAR_OBJECT,o),a.app.addEventListener(X.SET_SCENE,o),a.app.addEventListener(X.SET_OBJECT,r),()=>{a.app.removeEventListener(X.CLEAR_OBJECT,o),a.app.removeEventListener(X.SET_SCENE,o),a.app.removeEventListener(X.SET_OBJECT,r)}},[]);const s=e.type.toLowerCase(),i=e.animations.length>0||e.mixer!==void 0,n=s.search("mesh")>-1||s.search("line")>-1||s.search("points")>-1;return M.jsx(fa,{app:a.app,label:"Inspector",button:e.uuid.length>0?M.jsx("button",{className:"remove",onClick:()=>{ft.instance.remove(e.name),t(ah)}}):void 0,children:M.jsx("div",{id:"Inspector",className:a.class,children:e.uuid.length>0&&M.jsxs(M.Fragment,{children:[M.jsxs(M.Fragment,{children:[M.jsx(Eo,{type:"string",title:"Name",prop:"name",value:e.name,disabled:!0}),M.jsx(Eo,{type:"string",title:"Type",prop:"type",value:e.type,disabled:!0}),M.jsx(Eo,{type:"string",title:"UUID",prop:"uuid",value:e.uuid,disabled:!0})]}),M.jsxs(M.Fragment,{children:[M.jsx(Al,{object:e,app:a.app,three:a.three}),i?M.jsx(bN,{app:a.app,object:e,three:a.three}):null,s.search("camera")>-1?Vx(e,a.app,a.three):null,s.search("light")>-1?_N(e,a.app,a.three):null,n?kx(e,a.app,a.three):null]})]})})},"Inspector")}class TN extends W.Component{app;autoClear=!0;autoClearColor=!0;autoClearDepth=!0;autoClearStencil=!0;outputColorSpace=x.SRGBColorSpace;localClippingEnabled=!1;clearColor=new x.Color(0);clearAlpha=1;toneMapping=x.NoToneMapping;toneMappingExposure=1;type="";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),et.instance){const i=et.instance.renderer;i&&(this.autoClear=i.autoClear,this.autoClearColor=i.autoClearColor,this.autoClearDepth=i.autoClearDepth,this.autoClearStencil=i.autoClearStencil,this.clearAlpha=i.getClearAlpha(),this.toneMapping=i.toneMapping,this.toneMappingExposure=i.toneMappingExposure,i instanceof x.WebGLRenderer&&(this.localClippingEnabled=i.localClippingEnabled,i.getClearColor(this.clearColor)))}this.app.addEventListener(X.ADD_RENDERER,this.onAddRenderer)}componentwillunmount(){this.app.removeEventListener(X.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.type=t.type,this.toneMapping=t.toneMapping,this.toneMappingExposure=t.toneMappingExposure,this.clearColor.setStyle(t.clearColor,x.LinearSRGBColorSpace),x.ColorManagement.enabled=t.colorManagement,et.instance){const s=et.instance.renderer;s&&(s.autoClearColor=this.autoClearColor,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(et.instance){const t=et.instance.renderer;t&&(t.autoClearColor=this.autoClearColor,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:x.ColorManagement.enabled,toneMapping:this.toneMapping,toneMappingExposure:this.toneMappingExposure}))}};return M.jsx(cs,{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:x.ColorManagement.enabled,onChange:(t,s)=>{x.ColorManagement.enabled=s,e()}},{type:"option",title:"Color Space",value:this.outputColorSpace,options:[{title:"No Color Space",value:x.NoColorSpace},{title:"SRB Color Space",value:x.SRGBColorSpace},{title:"Linear SRB Color Space",value:x.LinearSRGBColorSpace}],onChange:(t,s)=>{this.outputColorSpace=s,e()}},{type:"option",title:"Tone Mapping",value:this.toneMapping,options:[{title:"None ",value:x.NoToneMapping},{title:"Linear ",value:x.LinearToneMapping},{title:"Reinhard",value:x.ReinhardToneMapping},{title:"Cineon ",value:x.CineonToneMapping},{title:"ACES Filmic",value:x.ACESFilmicToneMapping},{title:"AgX",value:x.AgXToneMapping},{title:"Neutral",value:x.NeutralToneMapping},{title:"Custom",value:x.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()}},{type:"string",title:"Type",value:this.type,disabled:!0}],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 zy(a){const[e]=W.useState([]),[t]=W.useState([]),[s,i]=W.useState(0),n=l=>{const c=l.value;e.push(c),t.push(M.jsx(fa,{app:a.app,label:`Scene: ${c.name}`,scene:c,open:!0,onRefresh:()=>{a.three.refreshScene(c.name)},children:M.jsx(uh,{app:a.app,child:c,scene:c,three:a.three})},Math.random())),i(Date.now())},r=l=>{const c=l.value;for(let h=0;h<e.length;h++)if(c.uuid===e[h].uuid){e[h]=c,t[h]=M.jsx(fa,{app:a.app,label:`Scene: ${c.name}`,scene:c,open:!0,onRefresh:()=>{a.three.refreshScene(c.name)},children:M.jsx(uh,{app:a.app,child:c,scene:c,three:a.three})},Math.random()),i(Date.now());return}},o=l=>{const c=l.value;for(let h=0;h<e.length;h++)if(c.uuid===e[h].uuid){e.splice(h,1),t.splice(h,1),i(Date.now());return}};return W.useEffect(()=>(a.app.addEventListener(X.ADD_SCENE,n),a.app.addEventListener(X.REFRESH_SCENE,r),a.app.addEventListener(X.REMOVE_SCENE,o),()=>{a.app.removeEventListener(X.ADD_SCENE,n),a.app.removeEventListener(X.REFRESH_SCENE,r),a.app.removeEventListener(X.REMOVE_SCENE,o)}),[]),M.jsxs("div",{id:"SidePanel",children:[M.jsx("div",{className:"scenes",children:t},s),M.jsx(ky,{app:a.app,three:a.three}),M.jsx(TN,{app:a.app,three:a.three}),M.jsx(xe,{app:a.app,three:a.three})]})}function SN(a){return W.useEffect(()=>{function e(o){let l=null;return a.three.scenes.forEach(c=>{o.search(c.uuid)>-1&&(l=c)}),l}const t=o=>{const l=o.value,c=e(l);if(!c){console.log(`Hermes - can't find scene for object: ${l}`,a.three.scenes);return}const h=c.getObjectByProperty("uuid",l);h!==void 0?a.three.setObject(h):console.log(`Hermes - can't find object: ${l}`,c)},s=(o,l,c)=>{const h=e(o);if(!h){console.log(`Hermes - can't find scene to set object: ${o}, ${l}`,a.three.scenes);return}const u=h?.getObjectByProperty("uuid",o);u!==void 0?qe(u,l,c):console.log(`Hermes - can't set object: ${o}`,h)},i=o=>{const l=o.value,{key:c,value:h,uuid:u}=l;s(u,c,h)},n=o=>{const l=o.value,c=e(l.uuid);if(!c){console.log(`Hermes - can't create texture, can't find scene: ${l.uuid}`);return}const h=c?.getObjectByProperty("uuid",l.uuid);if(h!==void 0){const u=d=>{const p=l.key.split(".");switch(p.length){case 1:h[p[0]]=d;break;case 2:h[p[0]][p[1]]=d;break;case 3:h[p[0]][p[1]][p[2]]=d;break;case 4:h[p[0]][p[1]][p[2]][p[3]]=d;break;case 5:h[p[0]][p[1]][p[2]][p[3]][p[4]]=d;break}h.material.needsUpdate=!0};l.value.src.length>0?im(l.value.src).then(d=>{d.offset.set(l.value.offset[0],l.value.offset[1]),d.repeat.set(l.value.repeat[0],l.value.repeat[1]),u(d)}):u(null)}},r=o=>{const{key:l,uuid:c,value:h,subitem:u}=o.value,p=e(c)?.getObjectByProperty("uuid",c);if(p!==void 0)try{u!==void 0?tx(p,u)[l](h):p[l](h)}catch(f){console.log("Error requesting method:"),console.log(f),console.log(l),console.log(h)}};return a.app.addEventListener(X.GET_OBJECT,t),a.app.addEventListener(X.UPDATE_OBJECT,i),a.app.addEventListener(X.CREATE_TEXTURE,n),a.app.addEventListener(X.REQUEST_METHOD,r),()=>{a.app.removeEventListener(X.GET_OBJECT,t),a.app.removeEventListener(X.UPDATE_OBJECT,i),a.app.removeEventListener(X.CREATE_TEXTURE,n),a.app.removeEventListener(X.REQUEST_METHOD,r)}},[]),null}function Gy(a){return M.jsxs("div",{className:"editor",ref:a.ref,style:a.style,children:[M.jsx("div",{className:"header",children:a.header}),a.children,M.jsx("div",{className:"footer",children:a.footer})]})}function vN(a){return M.jsx(Gy,{children:M.jsxs(M.Fragment,{children:[M.jsx(et,{app:a.app,three:a.three,scenes:a.scenes,onSceneResize:a.onSceneResize,onSceneSet:a.onSceneSet,onSceneUpdate:a.onSceneUpdate}),M.jsx(zy,{app:a.app,three:a.three})]})})}exports.Accordion=fa;exports.AppRunner=W0;exports.Application=H0;exports.BaseRemote=ol;exports.BaseScene=$0;exports.ChildObject=Xh;exports.ContainerObject=uh;exports.Draggable=rm;exports.DraggableItem=nm;exports.Dropdown=am;exports.DropdownItem=om;exports.Editor=Gy;exports.ElementProxy=G0;exports.ElementProxyReceiver=sm;exports.ExportTexture=Ri;exports.Inspector=ky;exports.MultiView=et;exports.NavButton=Yh;exports.ProxyManager=V0;exports.RemoteComponents=j0;exports.RemoteTheatre=Q0;exports.RemoteThree=ix;exports.SceneInspector=SN;exports.SidePanel=zy;exports.Spline=Lo;exports.SplineEditor=Uy;exports.ThreeEditor=vN;exports.ToolEvents=X;exports.Transform=ft;exports.WebworkerEventHandlers=k0;exports.capitalize=pa;exports.clamp=Ti;exports.clearComposerGroups=N0;exports.colorToHex=oh;exports.copyToClipboard=Qf;exports.cubicBezier=M0;exports.customizeTheatreElements=Y0;exports.damp=T0;exports.defaultTheatreCallback=p0;exports.detectMaxFrameRate=em;exports.detectSettings=tm;exports.dispose=Is;exports.disposeMaterial=jh;exports.disposeTexture=lh;exports.distance=b0;exports.generateCubemap=P0;exports.hierarchyUUID=ko;exports.inspectComposer=R0;exports.isColor=Kf;exports.map=_0;exports.mix=rr;exports.noop=da;exports.normalize=Uo;exports.parseModelLite=A0;exports.randomID=ct;exports.resetThreeObjects=ch;exports.round=ss;exports.roundTo=S0;exports.theatreEditorApp=q0;
|
package/dist/hermes.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
.editor #SidePanel .status{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHgAAAA8CAYAAACtrX6oAAAACXBIWXMAABYlAAAWJQFJUiTwAAAB90lEQVR4nO2cXWoCQRCEy+R0+6QguCE5XwLJtYToIZTOgxFlWd1Vd7p7yvpgXoLJ1NQ3a/wZnZkZBC8v0QFEWSSYHAkmR4LJkWByJJgcCSZHgsmRYHIkmBwJJkeCyZFgciSYHAkmR4LJkWByxghuAKwBbAEsiqa5jzlO+ZrgLH3MAWxwyLd0n93MhsbaTuzMrB3xO15j9Z/pyG+CTNfyufd36130K4BPAG2BvXYrKwBfOGTKSF8+//5G7IJFZxeG7MTOaC9kWgRmunbldnHr79FCIyRnyjJW7i4qc23FZshwj9zWzN4istdUcM1yj7dxl1xL0QxyQyTXUDiTXHfJ2YtnlOu6tswCmOW6rXGKP1Ii5DPIdVnr0y14glHVhp5y4VXcZT04qvuXNHUB6R90ZBNQeo4SRaR+2pCleK+5ShWS9ol/dOHec5YsJuVLd1FFR81dOmS6F9+9C47O4BEy1dtnXsVmyeIVMs0b4CPG4pFCC427Dzh4hrwkObq87jg/g5YpX19/g2fQPI/N/gB4B7A/+9kewAeAb8cct5ApX19/wwTsxLmZbcxsa2bLBFdGdzR2uIq3lueMV7e/Y75m6PYzM33THTP6ZAM5EkyOBJMjweRIMDkSTI4EkyPB5EgwORJMjgSTI8HkSDA5EkyOBJMjweRIMDl/5nU6ICCWVGoAAAAASUVORK5CYII=);background-position-x:2px;background-position-y:2px;background-size:32px 16px}.editor #SidePanel .refresh{background-color:transparent;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAACXBIWXMAAAsTAAALEwEAmpwYAAAE1UlEQVRoge2aW2gdRRzGf5vGWMSTVBpNUjWNijHgg6KIRqmtD0UpqA9iFeulijWkllIsKOKb+lbxgr6oLQUFtc2LPgjaImILSq36oKLWkpZC7C1p6zkNXkqSz4c5x2zH3T27s7vnnMR8MBxmzsx/vm/2P/fxJPF/QlO9CdQac4JnO+YEz3Y052y/C7gV6Af6gCuAhUABEDAOnASGgX3AV8Au4Le8CHk5TEttwMPA/cBNuHnR18D7wLvAieyoAZKyChdJelXSaWWHcUmvS1qUFc8sjDRLeiZjoTZOS3pOUktavmld+irgPeC6MAcC9gBfYNx0P6Z/lsr/FzD9vBe4HlgK3AzMC7H3HfAQ8JMz4xSttUJSMeSLnJT0vKRLHex2SNogaTjia9/lyttV7IIQsWOSnpZUSNGQldAkabWkkYB6JiUN1lJwTwCJT5Xh4OILBUmbA+qbkjRQK8FI2lquuCjjgl4OYv1hlaQ/LdGTku5MYiftoNUD/F4OtcAS4GPMYFdBCbgR+CWOgTwWHnljCbADmO9L24sZ3SeqFZ6Ja+ndwONW2g3Axlilq/i8J2mLzKicZ/90CVus/lyS1FmtXDWjT5SNvdkAAu3QKumwJfqVNIK7NT3XTkla3gAi7fCYJbhUbojEgj1JOyxjh6oZq0NolnTQ4rkuqkzYoLUGWG6ldQObkowuNcAE8IaVtjKqQNC01A38ALQG5BdwO7DTkWAe6AJGmJ5xpsppx4My21/YAzYTLDbO//XAEcxJSQVNwC1hmW3BQa5soxFde5cV7w/L6BecREichqkl9lrxvrCMFcEe8BbxXdUDtgILkjLLCfut+OWhOcvD9YDcUI8FyXZHrpK0zZO0GPget4FIwArgE4eyrmgHfgQ6EpYbA66O2i39DbT44ucCZxLTywd3Ax8mLLMSGIraLY1b8fMTVpAnPgKGEuTfXskfJfiUFe9MSCpvPAmMxsg3CqyrRKIED1vxXgdSeWIUMz1Ww1kNEyXYPjIJO3uuJ6q59pD9f5TgPVZ8mRun3LEWOBaQPobPlSuIEvwZZtqpoJ/G68dghA0EpK8lYAMRJfgY8K0v3oy5EWxE2K79H1f+F1VWNeutlcqwzKa73hv/oNAu6aikUZmbzMB81Y5p24FDwHm+tEeAd9J9kNxwb/k3dCCLcy79GrDeFz+K2Y0UU1GrE+KcS28C/vDFO2m8/XBsxBE8Arxgpa0BHsieTv6Ie9XSgrnQvsaX9hdwB+aye8Yg7lXLGeA+zt5QzMdMB0uzJhWBCzAXeM5Icre0D1iNORWsoA2zF16VhkQMeMAGzIxxEHPa4gaH+W4w5DThbUltOcyvF0vaGVBfj4s9VxKDkiYCSByR9KiyWZy0SnpW0omAeoqujZuG0D0ydzlBOCDpKUldDnYXS3pR0qkQ20WZBzVOvNNeiPcC24BrQ/6fxOy6Psc8OfoVOMz04FcALgGuxLzaW4bZhnoh9r7BTIf2KWV8pPjClXCOzMud8ZAvkgWKkjZKmpeWbxaCK2GRpJczFl6S9JLMxiATnnm88ViIcbsHMU8RwtwzDFPAl8AHmMelpejsyZD3o5YO4DbMK5s+4DLgQswJqIfpy8eBA8DPmEux3QSfYGSCmfiKJxVm4iueVJgTPNsxJ3i24x9qO45nn/sZdwAAAABJRU5ErkJggg==);background-position:2px 2px;background-repeat:no-repeat;background-size:16px 16px;position:absolute;right:25px}.editor #SidePanel .remove{background-color:transparent;background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDIwIDIwIj4KICA8ZGVmcz4KICAgIDxzdHlsZT4KICAgICAgLmNscy0xIHsKICAgICAgICBmaWxsOiAjZmZmOwogICAgICAgIHN0cm9rZS13aWR0aDogMHB4OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvZGVmcz4KICA8ZyBpZD0iTGF5ZXJfMyIgZGF0YS1uYW1lPSJMYXllciAzIj4KICAgIDxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTE2LDdINGMtLjYsMC0xLC40LTEsMXYxMGMwLC42LjQsMSwxLDFoMTJjLjYsMCwxLS40LDEtMXYtMTBjMC0uNi0uNC0xLTEtMVpNOCwxNS41YzAsLjYtLjQsMS0xLDFoLTFjLS42LDAtMS0uNC0xLTF2LTVjMC0uNi40LTEsMS0xaDFjLjYsMCwxLC40LDEsMXY1Wk0xNSwxNS41YzAsLjYtLjQsMS0xLDFoLTFjLS42LDAtMS0uNC0xLTF2LTVjMC0uNi40LTEsMS0xaDFjLjYsMCwxLC40LDEsMXY1WiIvPgogIDwvZz4KICA8ZyBpZD0iTGF5ZXJfMiIgZGF0YS1uYW1lPSJMYXllciAyIj4KICAgIDxwb2x5Z29uIGNsYXNzPSJjbHMtMSIgcG9pbnRzPSIxIDUgMSAzIDMgMyAzIDEgMTcgMSAxNyAzIDE5IDMgMTkgNSAxIDUiLz4KICA8L2c+Cjwvc3ZnPg==);background-position:2px 2px;background-repeat:no-repeat;background-size:16px 16px;position:absolute;right:5px}.editor #SidePanel .visibility{background-color:transparent;background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyBpZD0iTGF5ZXJfMSIgZGF0YS1uYW1lPSJMYXllciAxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDgwMCA4MDAiPgogIDxkZWZzPgogICAgPHN0eWxlPgogICAgICAuY2xzLTEgewogICAgICAgIGZpbGw6IG5vbmU7CiAgICAgICAgc3Ryb2tlOiAjZmZmOwogICAgICAgIHN0cm9rZS1saW5lY2FwOiByb3VuZDsKICAgICAgICBzdHJva2UtbGluZWpvaW46IHJvdW5kOwogICAgICAgIHN0cm9rZS13aWR0aDogNjYuN3B4OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvZGVmcz4KICA8cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik01MDAsNDAwYzAsNTUuMi00NC44LDEwMC0xMDAsMTAwcy0xMDAtNDQuOC0xMDAtMTAwLDQ0LjgtMTAwLDEwMC0xMDAsMTAwLDQ0LjgsMTAwLDEwMFoiLz4KICA8cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik00MDAsMTY2LjdjLTE0OS4zLDAtMjc1LjYsOTguMS0zMTguMSwyMzMuMyw0Mi41LDEzNS4yLDE2OC44LDIzMy4zLDMxOC4xLDIzMy4zczI3NS42LTk4LjEsMzE4LjEtMjMzLjNjLTQyLjUtMTM1LjItMTY4LjgtMjMzLjMtMzE4LjEtMjMzLjNaIi8+Cjwvc3ZnPg==);background-position:2px 2px;background-repeat:no-repeat;background-size:16px 16px;position:absolute;right:45px}.editor #SidePanel .childObject .visibility{background-color:transparent;background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyBpZD0iTGF5ZXJfMSIgZGF0YS1uYW1lPSJMYXllciAxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDgwMCA4MDAiPgogIDxkZWZzPgogICAgPHN0eWxlPgogICAgICAuY2xzLTEgewogICAgICAgIGZpbGw6IG5vbmU7CiAgICAgICAgc3Ryb2tlOiAjZmZmOwogICAgICAgIHN0cm9rZS1saW5lY2FwOiByb3VuZDsKICAgICAgICBzdHJva2UtbGluZWpvaW46IHJvdW5kOwogICAgICAgIHN0cm9rZS13aWR0aDogNjYuN3B4OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvZGVmcz4KICA8cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik01MDAsNDAwYzAsNTUuMi00NC44LDEwMC0xMDAsMTAwcy0xMDAtNDQuOC0xMDAtMTAwLDQ0LjgtMTAwLDEwMC0xMDAsMTAwLDQ0LjgsMTAwLDEwMFoiLz4KICA8cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik00MDAsMTY2LjdjLTE0OS4zLDAtMjc1LjYsOTguMS0zMTguMSwyMzMuMyw0Mi41LDEzNS4yLDE2OC44LDIzMy4zLDMxOC4xLDIzMy4zczI3NS42LTk4LjEsMzE4LjEtMjMzLjNjLTQyLjUtMTM1LjItMTY4LjgtMjMzLjMtMzE4LjEtMjMzLjNaIi8+Cjwvc3ZnPg==);background-position:0;background-size:contain;height:16px;overflow:hidden;position:absolute;right:25px;top:50%;transform:translateY(-50%);width:16px;white-space:nowrap}.editor #SidePanel .childObject .icon{background-color:transparent;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAACXBIWXMAAAsTAAALEwEAmpwYAAAEZklEQVRYhe2YW4iVVRTHf4465oSaUNlUjo7SmCBEPVipTWYXoV7qoejykhRCEVQP9pAFSWVBPdRTMNRLWGRaFr2FSShmEQ1KzQymUhpeMky6ONbcfj3sdZpvvvnO8Zy5lA/+YcP51jpr7bVv/7X2nqByNqPu/w7gTDgX4GgxaYR2DcDlwC3AUmAh0ARMDf1fwGGgE9gFfAb8AJyquSe1ljZFXa6+o/Y4FD3qvmh5neomdYXaUEuftQQ3T31d7Y8O96tdal98P69eos5SXwhZn7pb7cgE2qa2jHWAy9Svo4Nf1VfUG9VPQvauWp/5f726MXSb1WvVF9XjIftWvXWsArxdPRSOt5uWCfV+dUDtVJsL7K5Q98aM3xuyVnVr+Dqi3jHaAJepx8Lhe2pTyJvVn6PzVRXsHw7bw+rckDWqb4b8mHrbSAOcp7aHozZ1Wka3NuQfqHUVfExUt8R/n8rI69XXQt6lLijnoxzNTAEeA64GeoDzgbVBI5OBu+J/FwPrg3aK0A1cGL8fB+YAfUFDF4T+SmAN8ATwZ97BBC3MxdeTuGtqOBSYkGklgu/NyIpgtMnxPRDfpd9kdCuBT/MOimawHlgdwW0DPs918AAwH9gK7MjoyqEHWA6sAPYBGzMD6gWWRHCPhL/TQ4dYfPpOxSFYXKDvVE+YaKZamrpZPWmil7xuoXrQxAiL8vqiXHwTaU99BbTndItJe+Zoga4S2oFjpJR4TU7XBXwZs7oyb1gU4DKgH/iCtP+yaAlH+4E/agjwJCkXTwwfeewgLXdrNQEuAn6neIYaSfvwQA3BlXCAdEAaC3TtpEFclVcUHZIm0sauC2f1Ie8lLZGkmbiI8vSSR3fYDYSPyzJ990YfvQxS0r8oopkTJI76jbTUpRMnMI3Ekd2k0qnaenKAxKUNwN+k7ZH1Wxd9nswHWWvBWo7vxg1FSyzwC/AgsIfBJe4DngNWAW1UziB5dAPPAo8CbwPrGLrELcAGYEY1AR4C5pKW5WhOt5c0iwMxiFpQykBdpGo7i7kkwj+eNypa4g5gOsP5ChKX1ZG4sFbMjyDzgyb6mgl8V02AO0mndAnDZ/h70hZoJg2iWswMm37SKuRxA2kGtw/TFKSelipTXesIUt3uWlNd0R78EXifdEheYnixMDlm5BlqKxZmkChqHcOLhdnAxxQkgErl1jbgPM7CcgtS6nkDeDIcbQZ+IpVgk4A7gUtJBcVOKhesS0n5/QjwEYMF6yzg7gjwLVLuLxhi+X3TrH4TZXmbOj2jezrkZyr5JzlY8q/JyKsu+UdzaToaG/uhCvarw/agOscxvjSVWvbaucPBa+d9plvdXlORm7dbELo+9Z6Qjfm1MzuT2Yv7q9HZlpBtdOjFfar6Yeg2qdep6x2ni3upFT19dDj49PGy6emjMQZg6PaY9lkJ4/L0UWqlx6MNDn8g6o2g98fvPEb0eFSOB8+Eoue32Rm6OR200hn0sY0RPr+NNMD/DGf9C+u5AEeLfwBkrdN1844nCgAAAABJRU5ErkJggg==);background-size:20px 20px;display:inline-block;position:absolute;right:5px;top:0;width:20px;height:20px;transform:scale(.8)}.editor #SidePanel .childObject .obj3D{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAACXBIWXMAAAsTAAALEwEAmpwYAAAEZklEQVRYhe2YW4iVVRTHf4465oSaUNlUjo7SmCBEPVipTWYXoV7qoejykhRCEVQP9pAFSWVBPdRTMNRLWGRaFr2FSShmEQ1KzQymUhpeMky6ONbcfj3sdZpvvvnO8Zy5lA/+YcP51jpr7bVv/7X2nqByNqPu/w7gTDgX4GgxaYR2DcDlwC3AUmAh0ARMDf1fwGGgE9gFfAb8AJyquSe1ljZFXa6+o/Y4FD3qvmh5neomdYXaUEuftQQ3T31d7Y8O96tdal98P69eos5SXwhZn7pb7cgE2qa2jHWAy9Svo4Nf1VfUG9VPQvauWp/5f726MXSb1WvVF9XjIftWvXWsArxdPRSOt5uWCfV+dUDtVJsL7K5Q98aM3xuyVnVr+Dqi3jHaAJepx8Lhe2pTyJvVn6PzVRXsHw7bw+rckDWqb4b8mHrbSAOcp7aHozZ1Wka3NuQfqHUVfExUt8R/n8rI69XXQt6lLijnoxzNTAEeA64GeoDzgbVBI5OBu+J/FwPrg3aK0A1cGL8fB+YAfUFDF4T+SmAN8ATwZ97BBC3MxdeTuGtqOBSYkGklgu/NyIpgtMnxPRDfpd9kdCuBT/MOimawHlgdwW0DPs918AAwH9gK7MjoyqEHWA6sAPYBGzMD6gWWRHCPhL/TQ4dYfPpOxSFYXKDvVE+YaKZamrpZPWmil7xuoXrQxAiL8vqiXHwTaU99BbTndItJe+Zoga4S2oFjpJR4TU7XBXwZs7oyb1gU4DKgH/iCtP+yaAlH+4E/agjwJCkXTwwfeewgLXdrNQEuAn6neIYaSfvwQA3BlXCAdEAaC3TtpEFclVcUHZIm0sauC2f1Ie8lLZGkmbiI8vSSR3fYDYSPyzJ990YfvQxS0r8oopkTJI76jbTUpRMnMI3Ekd2k0qnaenKAxKUNwN+k7ZH1Wxd9nswHWWvBWo7vxg1FSyzwC/AgsIfBJe4DngNWAW1UziB5dAPPAo8CbwPrGLrELcAGYEY1AR4C5pKW5WhOt5c0iwMxiFpQykBdpGo7i7kkwj+eNypa4g5gOsP5ChKX1ZG4sFbMjyDzgyb6mgl8V02AO0mndAnDZ/h70hZoJg2iWswMm37SKuRxA2kGtw/TFKSelipTXesIUt3uWlNd0R78EXifdEheYnixMDlm5BlqKxZmkChqHcOLhdnAxxQkgErl1jbgPM7CcgtS6nkDeDIcbQZ+IpVgk4A7gUtJBcVOKhesS0n5/QjwEYMF6yzg7gjwLVLuLxhi+X3TrH4TZXmbOj2jezrkZyr5JzlY8q/JyKsu+UdzaToaG/uhCvarw/agOscxvjSVWvbaucPBa+d9plvdXlORm7dbELo+9Z6Qjfm1MzuT2Yv7q9HZlpBtdOjFfar6Yeg2qdep6x2ni3upFT19dDj49PGy6emjMQZg6PaY9lkJ4/L0UWqlx6MNDn8g6o2g98fvPEb0eFSOB8+Eoue32Rm6OR200hn0sY0RPr+NNMD/DGf9C+u5AEeLfwBkrdN1844nCgAAAABJRU5ErkJggg==)}.editor #SidePanel .childObject .camera{background-image:url(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)}.editor #SidePanel .childObject .interactive{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAACXBIWXMAAAsTAAALEwEAmpwYAAADA0lEQVRYhe2Yu2sUURTGf5uYSJ4EsgqJIkRMEYOFYMBCQcTe57/hs9AqlVpYiChYqREsFBRF8AF2KgpqErQQRKIRi6ghRozEhcSYz+Le1bPD7MzOzm5MkQ+Gc+/Z79z7cfY+5kxGEosZNf9bQByWBKbFsjJiGoEuYC3QAUwC74EPwFTlpHlIKvVplHRS0rSK47KktgRjxj6lEtdJ+hIhzGJO0raFFNghaTYg4oKkPkmdknrlMvsjwNm8EAJrJI2YSZ9IyhbhNkkaMNwZSS3VFrjbTPhC0nLzW6ekDZK6jC8j6ZqJOV9tgTZ7eSF1ks6oEHd9BpHULGnS+2flNldVBK4wAu4Z/0GF47bhHDP+njQCow7qbtO+4209cNy3p4ETwCff34k7FwEGTWw2zTFY6k0y4W2LfwAeA/3AdcNr9PZzGXOEIuomeYbL0BrgvvdlzO8z3tYa37y3b33sKuB5tQTO4zJUDLUhvrkSY0tGOXdxHgpYgNPAU9yaHQP6gB3AS+AB0Ars8fYW8C5+lmS7Khuya88W2dXBmyUXwjmXZhenRUug3xDC2Q9sjRokqcBMSNv6DgH7TH8M2AQMBTh7Tf9o1IRJ16BC2tZ3Ffhp+oPAMPDICw3jRCJNBsNQR+HurjF+y7GJiazakgoMGyxOdJBTCv8vKrEG6yPGawrhBAVWLYP59kVvp4DvuDs6vyluenvJcL6RIKNpDup87BCwEsjxb/FvAdqAcd8fNJwc0G7GicxgUoEzpm3PuYkQ3njAZzl2I0VmMOlfnAM++vZ6CtdWEthXsNEoYlKBv3F3aH6S7ghuFA6Y9pVIZhlvuRvNXTosV4ckiV8duJ/ro/jlCKxVYa3SnyC2SdIrE3skLqbcWqFLhTglqSEmpkPSGxMzGpe9NAKRtCsg8qukw3LlaLPPVqtcYT8Q4OY8L3aeNAKRtF3F8auI/7Wk9lLnSCsQufL0RoTQPKblSta6JONnpIp9As4Cvbjyswd3Rk7hXrUeAiO4czQRKimwKlj0X1iXBKbFH8wWbNSnU+tzAAAAAElFTkSuQmCC)}.editor #SidePanel .childObject .light{background-image:url(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==)}.editor #SidePanel .childObject .ui{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAACXBIWXMAAAsTAAALEwEAmpwYAAADjElEQVRYhe2YTWhdRRTHf+lLTFRCkjaLILgIKoIBRRfaSmMFQSsoIrrRuhEqfnTTtV20qHUllIBWcKNQxG4EJWoVEUxKqV8blXYlYv0utr7UtkaN9dfFTMzNfXM/8hJeI/iHYV7OOTP3d+89M3NuulRWs9ZcaIAq/Q+4XJUB3gDsA74BZoDPgaeAdStw3SHgdeD2ykg11baoZ03rS/XKgnGD6niBLxszFedqqpvK4lPG69U/4gTvqneo16lb1e+j/SO1LzF2SD2pbqsBN69SyJTxtTjwPbU75xuLAKr3Zy46FNuoeib6n6kBVwmZAvwuDrqt4K72Rv8LakP9Wv01tqb6T+bCr6rD6og6XQA3rxl1c/56qUXSH/ufCtL229gPxH40Jv0QMAh0ZWIfBG4CNgLjFcthANiWN3YnAn+IweuBown/xtgfAwReAS6NtouAO2P/O/AY8Hb07YqtSNPAwy3WxCt8Oj7yY+q1Od+j6rnovzExtqH+qR5Xb034dxW83ilDjtbKwXXqkTiwqb6o7lDfykw4kZosk2tjBX7UnTm4D4vgigBRr1APFtzthNpTMK5P7S+By0MeLINT6dLCaqYHuAfYFHPsR2AS+Lgkj5aih4ADwMmyoDLAeTUIR9KBleEC4BJgDugFzhIWW1J1ioV9wDuEO14pPQ8cB75gYbtKqgpwN/BA/P0ScMuy0YIGCPvmMIv3zRaVAT4OPJn5+2JCBTK2XDrC6wX4O7ZCFQGOAzuBUyzkx19AH7AXWNsGVC8wQnhyfdHWRXiKw4RTqFUFy3vQcIaOxr1Q9Q1DQTCi9tbYSvJtbdzzThs2cw3n9oz6swVlWtWk/YYiQHV/G1D5do36S+vW6hNFY6oWSTcL53VPG681r6PAfcBsxvYsIW2SqgIUOAE0Cfm4EpoGHom/9wM7yoLrbNRrCMl8btloi7UZeL9q3hTgyyyUTxC2AQmgjYz9MLCnDbANwF3AZYRTZAp4k7BLtCqRmHOJJE5pcokLpNdQGaV0SL2q7iI5XfNJzFaHLNIeQgGb0s2EQmQ47+jUh/t6wslUpquB7XljpwDvbTeuU4CjNeNG8oZOATZrxp3JGzoF+EHNuMN5Q6cAJ4FPKmLmgOfyxhRg6ls5pUZ1yL+aBbYAR0r8W4HP6sCcoKKIjFrq2fwV4QNsO3A3cDnwG3AImAA+TQ2qcxZfUP2n/8O6KrTqAc8D9emWHC8oT9IAAAAASUVORK5CYII=)}.editor #SidePanel .childObject .utils{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAACXBIWXMAAAsTAAALEwEAmpwYAAADFElEQVRYhe2YT0hVQRSHf7YwsUVoakFtKmhdUfhUeLSrrFVQEES72rip1EoscFlLK2jRpl21tT8QhFkLq13gIotqlaRPQ8SkgvRrcefiOO/eufN8LzPwwMV375w5893fnHPm+aoArWZb968BsmwNsFz7rwHzkgYltVdgnRpJZyU9lTQm6ZukUUl9GQwSkHS1AgUimwduAHUpvlnXLmCYYpsFDmXNT3p4AJhICDgC7C0RbgvwISHWGNASEiPpYdLbxvYJ2FQC4F1rbj/w1nx+ERoj6WE78NsDeSIw+E7gh5kzYJ5dM/dzwFbH/yDQ58ZJStAnkm570rY+sDDaTHEgqd88GzJ/ayWdk7Td3Ock3Zd0OrRINgKjKQq+ApoCFOw0/j8tteqAaSvWd6LtjgtyKkRBSZqRdFLS+4SxnKQBSU0ZCsaHfLXlOy3plqRxc79BUTtrNPe/QhWU9cbHgQ7gTYKSm1Pm5YAvlm+bM15PlOvXWSwcgGdurFJaRpOBsu010Oj4tVhbBtAFVHni3rR8z5QDKKNYEmSsZI6lPbTbmZ8HdgPbgMNE1R3bMFBbLqCABgNl20vgmAN30ZnXRXQqzbPYfmIbAXYkrbccwLTtts1VrjvFbxa4Q3GalA0Yb/fzALgua2zcjHcDp0hRrVKAAo4CCx64XmtsksDzt1KAbitx4a5YY1+BPctZZ7lwzfgLwlZuxQFb8LcSW7k5FlNgRbY4R5ToIXATREp3OM9a/xZgjqUnhG9bZ4D91linNTZpYlUU0IVzlbMBIGrE5z0+hVAlQ3POt63uwnZ+XvL4ThCQk5VUbhLYR1StNmSPM+eCM8erZBacr1rtE8JVw21Dlz0vVsCTk2lwDcBnE2CB4oKwz9YCyVvltqOkLw9xC/pIyj9jaYBHrMC9Hris3pYzPmmQPdZYeymAeWviPaAmAS4oyT1KrjexY8uXAlgNPLImP2BpnwtuExakXWxXHbjHZs2SiqQeGKTYpgKVy9ru2IbMWiVXcQxpfy1/t0y4+Go2MWJ7SMYvFVWw9hNwWbYGWK6tesA/ap/6uHJWeiAAAAAASUVORK5CYII=)}.editor #SidePanel .field{align-items:center;background-color:#222;display:flex;flex-direction:row;flex-wrap:wrap;min-height:21px;overflow:hidden;padding:1px;position:relative}.editor #SidePanel .field span{font-family:Arial;font-weight:700;line-height:20px;height:20px;padding:0 5px;max-width:180px;user-select:none;width:fit-content;min-width:20px;text-align:center}.editor #SidePanel .field input{background-color:#191919;block-size:11px;color:#fff;flex:1%;font-family:Arial;min-height:20px;margin:0;padding:4px;outline:none}.editor #SidePanel .field input.min{height:11px;width:30px;margin-right:1px}.editor #SidePanel .field input.color{flex:none;width:60px}.editor #SidePanel .field input[type=checkbox]{appearance:none;background-color:#191919;border:4px solid #191919;cursor:pointer;display:inline-block;flex:none;min-height:16px;width:16px;height:16px;transition:background-color .25s linear}.editor #SidePanel .field input[type=checkbox]:checked{background-color:#ccc}.editor #SidePanel .field input[type=color]{appearance:none;border:none;block-size:revert;cursor:pointer;height:28px;padding-block:revert;padding:0;margin:0}.editor #SidePanel .field input[type=number],.editor #SidePanel .field input[type=range]{appearance:none;height:20px}.editor #SidePanel .field input[type=range]::-webkit-slider-runnable-track{border:none}.editor #SidePanel .field input[type=range]::-webkit-slider-thumb{appearance:none;background-color:#666;cursor:pointer;height:17px;width:17px;transition:.2s linear background-color}.editor #SidePanel .field input[type=range]::-webkit-slider-thumb:hover{background-color:#999}.editor #SidePanel .field textarea{background-color:#191919;color:#fff;font-size:12px;line-height:12px}.editor #SidePanel .field img{border:1px dotted #333;cursor:pointer;object-fit:cover;width:100px;height:100px}.editor #SidePanel .field button{background-color:#333;border-top:1px dotted #444;height:16px;margin:0;padding:0 0 0 5px;text-align:center;transition:.2s background-color linear;width:100%}.editor #SidePanel .field button:hover{background-color:#444}.editor #SidePanel .field.block label{display:inline;line-height:21px;max-width:100%;text-align:left;width:100%}.editor #SidePanel .field select{background-color:#222;border:1px solid #333;color:#fff;cursor:pointer;font-family:Arial;font-size:12px;padding:1px 5px;position:absolute;right:4px}.editor #SidePanel .field option{cursor:pointer}.editor #SidePanel .field .vector2{position:relative;width:100%}.editor #SidePanel .field .vector2 .fields{display:inline-block;margin-bottom:2px;position:relative;overflow:hidden;width:60%}.editor #SidePanel .field .vector2 .fields div{display:block;margin:3px 0}.editor #SidePanel .field .vector2 .fields label{background:none;display:inline-block;width:30px}.editor #SidePanel .field .vector2 .fields input{width:66%}.editor #SidePanel .field .vector2 .input{background-image:url(data:image/gif;base64,R0lGODlhYwBjAIAAABoaGgAAACH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4xLWMwMDIgNzkuZGJhM2RhM2I1LCAyMDIzLzEyLzE1LTEwOjQyOjM3ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjUuNiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpCNzgwMTU3OUUxOTcxMUVFOTkyNURCNkFCMTUwREUwNyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpCNzgwMTU3QUUxOTcxMUVFOTkyNURCNkFCMTUwREUwNyI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkI3ODAxNTc3RTE5NzExRUU5OTI1REI2QUIxNTBERTA3IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkI3ODAxNTc4RTE5NzExRUU5OTI1REI2QUIxNTBERTA3Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+Af/+/fz7+vn49/b19PPy8fDv7u3s6+rp6Ofm5eTj4uHg397d3Nva2djX1tXU09LR0M/OzczLysnIx8bFxMPCwcC/vr28u7q5uLe2tbSzsrGwr66trKuqqainpqWko6KhoJ+enZybmpmYl5aVlJOSkZCPjo2Mi4qJiIeGhYSDgoGAf359fHt6eXh3dnV0c3JxcG9ubWxramloZ2ZlZGNiYWBfXl1cW1pZWFdWVVRTUlFQT05NTEtKSUhHRkVEQ0JBQD8+PTw7Ojk4NzY1NDMyMTAvLi0sKyopKCcmJSQjIiEgHx4dHBsaGRgXFhUUExIREA8ODQwLCgkIBwYFBAMCAQAAIfkEAAAAAAAsAAAAAGMAYwAAAv+Mf4Crm/5gaJA6y+TUGiMfVd0ogYa5cWJJru7Vwqwqv9lsf/Gd0+i/0+FqRB4tVBT2TkGk8XkEDqFOZbKKVUmXKe72yjxaqWFvswzuXgDstvsNj8vn9Lr9Hj+ryfuxP9sHqPfFR/iHxjeoOHUYiNi4aMYIaCg4+UgZmVappVno2YgCmnnpaMrJgao6itmaynoKq4pHW2t7eyurW4q6K/m7KRbqG8wrTAr8aVxKrJw8fBy7/Iyc1gxN7So6XZwtzXVd7dy9hmt+jk4brr1u2r7KnRiPTT4u7w2Pr/fOzzwvTs8epH/sCH6zZjBfvYBR+unjlS6ixIkOFwK09DCjRVfXFQVe5JiwI0MfIj8eFKPQY0FvJVdudBcypkaULU+OPDExp05bNVPefCXzpU+SQVXaxCi0576iP4eCnNm0nVKmSI06PeqSJtWsUUvs/ApWzlSoVbuS5VrW5NW10bC6Zevv7FupW+fWHZs0bl65V/FaHRQ2cGC/ZhHyJUz0cN1tihsb3gv5bzS4ju9FLiz5GOXLJhGj/TxBsOidnu2CW1y69GatlTEPbK0Wlmq6sEH3RY37dG3TQkf7ljj7bm7OoIPLNU4c6O7VDYdnfvw8uuvEyZmntY18QQEAOw==);border:1px solid #333;display:inline-block;width:99px;height:99px;position:absolute;top:50%;transform:translateY(-50%)}.editor #SidePanel .field .vector2 .input .x{background-color:#333;height:.5px;width:100%;position:absolute;top:50%;transform:translateY(-50%)}.editor #SidePanel .field .vector2 .input .y{background-color:#333;height:100%;width:.5px;position:absolute;left:50%;transform:translate(-50%)}.editor #SidePanel .field .vector2 .input .pt{background-color:#fff;border-radius:5px;width:5px;height:5px;position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);z-index:10}.editor #SidePanel .field .grid3{grid-template-columns:repeat(3,1fr)}.editor #SidePanel .field .grid4{grid-template-columns:repeat(4,1fr)}.editor #SidePanel .field .grid3,.editor #SidePanel .field .grid4{display:grid;margin-top:4px}.editor #SidePanel .field .grid3 div,.editor #SidePanel .field .grid4 div{display:flex;overflow:hidden}.editor #SidePanel .field .grid3 div label,.editor #SidePanel .field .grid4 div label{padding:0 10px;line-height:30px;min-width:inherit}.editor #SidePanel .field .grid3 div input,.editor #SidePanel .field .grid4 div input{width:100%}.editor #SidePanel .field .imageField{display:block;height:120px;position:relative}.editor #SidePanel .field .imageField img{display:inline-block}.editor #SidePanel .field .imageField .fields{display:inline-block;position:absolute;top:0;width:170px}.editor #SidePanel .field .imageField .fields div{display:inline-block;width:100%}.editor #SidePanel .field .imageField .fields div label{background:none;display:block;padding:0 5px}.editor #SidePanel .field .imageField .fields div input{width:calc(50% - 10px)}.editor #SidePanel .group{background-color:#191919;margin:2px 0}.editor #SidePanel .group h4{display:inline;font-weight:700;pointer-events:none;width:fit-content}.editor #SidePanel .group .toggleBtn{background-color:#191919;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACcAAAB1CAYAAADN5fjJAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAzklEQVR4nO3bwQqCUBBA0Yz+/5dt1eYRkVfKWZyzUgi5zEJSxm3f99tU96sDPhFXiavEVeIqcZW4anTcYzmf8P9pex2Mnpy4Slwlrhodt96Et7e/usjoyYmrxFXiKnGVuEpcJa4SV4mrxFXiKnGVuEpcJa4SV4mrxFXiKnGVuEpcJa4SV4mrxFXiqtFx69LLUd9sKuZFmtGTE1eJq8RV4ipx1T+2+o9e01b/aeIqcZW46uxWvweckcRV4ipxlbhqdNzZl4c//cJu9ORGxz0BUl8I9T4qXncAAAAASUVORK5CYII=);background-position:1px 1px;background-repeat:no-repeat;background-size:15px 45px;display:inline-block;height:15px;opacity:.8;overflow:hidden;margin:0 0 0 5px;padding-left:20px;width:calc(100% - 7px);transition:all .15s linear}.editor #SidePanel .group .toggleBtn:hover{background-color:#222;opacity:1}.editor #SidePanel .group .fieldItems{border-top:1px dotted #333;overflow-y:auto;user-select:none}.editor .multiview{display:grid;font-family:Arial,Helvetica,sans-serif;font-size:10px;grid-template-columns:auto;position:absolute;overflow:hidden;inset:0 300px 0 0;z-index:1}.editor .multiview canvas{pointer-events:none}.editor .multiview .dropdown{background-color:#222;display:inline-block;font-size:10px;text-align:center}.editor .multiview .dropdown .dropdown-toggle{cursor:pointer;padding:0 10px;height:30px;line-height:30px;overflow:hidden}.editor .multiview .dropdown .dropdown-toggle:hover{background-color:#333}.editor .multiview .dropdown .dropdown-menu{overflow:hidden;position:absolute;top:30px;left:50%;z-index:1;list-style:none;padding:0;margin:0;min-width:100%;width:auto;transform:translate(-50%);transition:all .33s cubic-bezier(.75,0,.25,1)}.editor .multiview .dropdown .dropdown-menu li{background-color:#222;border-top:1px solid #191919;cursor:pointer;height:30px;line-height:30px;padding:0 10px;transition:.2s linear background-color}.editor .multiview .dropdown .dropdown-menu li:hover{background-color:#333}.editor .multiview .cameras{display:grid;grid-template-columns:repeat(2,1fr);pointer-events:visible;position:absolute;width:100%;height:100%}.editor .multiview .cameras.single{grid-template-columns:repeat(1,1fr)}.editor .multiview .cameras .CameraWindow{border:1px dotted #333;border-top:none;border-left:none;pointer-events:visible;position:relative}.editor .multiview .cameras .CameraWindow .clickable{display:inline-block;width:100%;height:100%}.editor .multiview .cameras .CameraWindow .options{position:absolute;height:30px;top:initial;bottom:-1px;left:50%;transform:translate(-50%);width:max-content}.editor .multiview .cameras .CameraWindow .options .dropdown{position:relative;top:0;transition:background-color .25s linear}.editor .multiview .cameras .CameraWindow .options .dropdown.up{background-color:#333;bottom:0;top:initial}.editor .multiview .cameras .CameraWindow .options .dropdown.up .dropdown-menu{top:initial;bottom:100%}.editor .multiview .settings{filter:drop-shadow(0px 5px 5px rgba(0,0,0,.33));pointer-events:visible;position:absolute;left:50%;transform:translate(-50%)}.editor .multiview .settings .toggle{background-blend-mode:overlay;background-color:#222;background-position:2px 2px;background-repeat:no-repeat;background-size:26px 26px;display:inline-block;position:relative;left:0;transform:none;width:30px;height:30px;overflow:hidden}.editor .multiview .settings .toggle.selected{background-blend-mode:normal}.editor .multiview .connectionStatus{background-color:red;font-weight:700;line-height:30px;padding:0 10px;text-transform:uppercase;position:absolute;left:0;bottom:0;z-index:10}body .tp-dfwv,body .tp-dfwv button,body .tp-dfwv input{text-transform:none}.tp-ckbv{float:right}.tp-dfwv{left:50%;top:0;max-height:100%;overflow-x:hidden;overflow-y:auto;transform:translate(-50%);width:400px;z-index:100}.tp-dfwv .tp-lblv{position:relative}.tp-dfwv .tp-lblv_v{display:inline-block}.tp-dfwv .tp-lblv_v .tp-ckbv{width:20px}.tp-dfwv .tp-lblv_v .tp-fpsv{width:280px}.tp-dfwv .tp-btnv_b{padding:0 5px}.tp-dfwv .tp-btngridv{max-height:100px;overflow-x:hidden;overflow-y:auto}.tp-dfwv .tp-tabv{max-height:90vh;overflow:hidden auto}.tp-dfwv{font-family:Roboto Mono,Source Code Pro,Menlo,Courier,monospace;font-size:10px}.editor #SidePanel{background-color:#0d0d0d;border:1px solid #111;max-height:100%;min-height:20px;overflow-y:auto;pointer-events:visible;position:absolute;right:0;top:0;bottom:0;width:300px}.editor #SidePanel .accordion{border-bottom:1px dotted #333;background-color:#111;line-height:0;resize:vertical;overflow-y:auto}.editor #SidePanel .accordion.hide{resize:none;overflow-y:hidden}.editor #SidePanel .accordion>div{display:grid;grid-template-rows:0fr;margin-left:5px;transition:.33s grid-template-rows cubic-bezier(.645,.045,.355,1)}.editor #SidePanel .accordion>div>div{overflow:hidden}.editor #SidePanel .accordion>div.open{border-top:1px solid #222;grid-template-rows:1fr}.editor #SidePanel .accordion .icon{height:20px;width:20px}.editor #SidePanel .accordion .icon button{text-indent:-9999px;white-space:nowrap}.editor #SidePanel .accordion .toggle{background-color:#333;display:inline-block;font-size:12px;font-weight:700;margin:0;padding:0;position:relative;user-select:none;width:100%;height:20px;transition:background-color .2s linear}.editor #SidePanel .accordion .toggle:hover{background-color:#444}.editor #SidePanel .accordion .toggle p{margin:0;padding:0}.editor #SidePanel .accordion .toggle .label{display:inline;position:absolute;left:25px;top:3px;height:15px;line-height:15px}.editor #SidePanel input{background-color:#222;border:1px dotted #333;font-family:Arial,Helvetica,sans-serif;font-size:12px;padding:4px}.editor #SidePanel button{background-color:transparent;border:none;color:#fff;cursor:pointer;font-family:Arial;font-size:12px;margin:0;padding:0;text-align:left}.editor #SidePanel #options{border-bottom:1px solid #111;display:flex;margin:0;padding:0;list-style-type:none;width:100%}.editor #SidePanel #options .selected{background-color:#222}.editor #SidePanel #options .selected button{pointer-events:none}.editor #SidePanel #options button{min-width:20px;height:20px;text-align:center;width:100%}.editor #SidePanel #options button:hover{background-color:#333}.editor #SidePanel #options li{border-right:1px solid #111;font-size:12px;line-height:20px;min-height:20px;min-width:20px;text-align:center;width:100%}.editor #SidePanel #options li:first-child{border-left:1px solid #111}.editor #SidePanel .status,.editor #SidePanel .refresh,.editor #SidePanel .remove,.editor #SidePanel .visibility{display:inline-block;margin:0;padding:0;overflow:hidden;width:20px;height:20px;text-indent:-9999px;white-space:nowrap}.editor #SidePanel .status{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHgAAAA8CAYAAACtrX6oAAAACXBIWXMAABYlAAAWJQFJUiTwAAAB90lEQVR4nO2cXWoCQRCEy+R0+6QguCE5XwLJtYToIZTOgxFlWd1Vd7p7yvpgXoLJ1NQ3a/wZnZkZBC8v0QFEWSSYHAkmR4LJkWByJJgcCSZHgsmRYHIkmBwJJkeCyZFgciSYHAkmR4LJkWByxghuAKwBbAEsiqa5jzlO+ZrgLH3MAWxwyLd0n93MhsbaTuzMrB3xO15j9Z/pyG+CTNfyufd36130K4BPAG2BvXYrKwBfOGTKSF8+//5G7IJFZxeG7MTOaC9kWgRmunbldnHr79FCIyRnyjJW7i4qc23FZshwj9zWzN4istdUcM1yj7dxl1xL0QxyQyTXUDiTXHfJ2YtnlOu6tswCmOW6rXGKP1Ii5DPIdVnr0y14glHVhp5y4VXcZT04qvuXNHUB6R90ZBNQeo4SRaR+2pCleK+5ShWS9ol/dOHec5YsJuVLd1FFR81dOmS6F9+9C47O4BEy1dtnXsVmyeIVMs0b4CPG4pFCC427Dzh4hrwkObq87jg/g5YpX19/g2fQPI/N/gB4B7A/+9kewAeAb8cct5ApX19/wwTsxLmZbcxsa2bLBFdGdzR2uIq3lueMV7e/Y75m6PYzM33THTP6ZAM5EkyOBJMjweRIMDkSTI4EkyPB5EgwORJMjgSTI8HkSDA5EkyOBJMjweRIMDl/5nU6ICCWVGoAAAAASUVORK5CYII=);background-position-x:2px;background-position-y:2px;background-size:32px 16px}.editor #SidePanel .status.open{background-position-x:18px}.editor #SidePanel .refresh{background-color:transparent;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAACXBIWXMAAAsTAAALEwEAmpwYAAAE1UlEQVRoge2aW2gdRRzGf5vGWMSTVBpNUjWNijHgg6KIRqmtD0UpqA9iFeulijWkllIsKOKb+lbxgr6oLQUFtc2LPgjaImILSq36oKLWkpZC7C1p6zkNXkqSz4c5x2zH3T27s7vnnMR8MBxmzsx/vm/2P/fxJPF/QlO9CdQac4JnO+YEz3Y052y/C7gV6Af6gCuAhUABEDAOnASGgX3AV8Au4Le8CHk5TEttwMPA/cBNuHnR18D7wLvAieyoAZKyChdJelXSaWWHcUmvS1qUFc8sjDRLeiZjoTZOS3pOUktavmld+irgPeC6MAcC9gBfYNx0P6Z/lsr/FzD9vBe4HlgK3AzMC7H3HfAQ8JMz4xSttUJSMeSLnJT0vKRLHex2SNogaTjia9/lyttV7IIQsWOSnpZUSNGQldAkabWkkYB6JiUN1lJwTwCJT5Xh4OILBUmbA+qbkjRQK8FI2lquuCjjgl4OYv1hlaQ/LdGTku5MYiftoNUD/F4OtcAS4GPMYFdBCbgR+CWOgTwWHnljCbADmO9L24sZ3SeqFZ6Ja+ndwONW2g3Axlilq/i8J2mLzKicZ/90CVus/lyS1FmtXDWjT5SNvdkAAu3QKumwJfqVNIK7NT3XTkla3gAi7fCYJbhUbojEgj1JOyxjh6oZq0NolnTQ4rkuqkzYoLUGWG6ldQObkowuNcAE8IaVtjKqQNC01A38ALQG5BdwO7DTkWAe6AJGmJ5xpsppx4My21/YAzYTLDbO//XAEcxJSQVNwC1hmW3BQa5soxFde5cV7w/L6BecREichqkl9lrxvrCMFcEe8BbxXdUDtgILkjLLCfut+OWhOcvD9YDcUI8FyXZHrpK0zZO0GPget4FIwArgE4eyrmgHfgQ6EpYbA66O2i39DbT44ucCZxLTywd3Ax8mLLMSGIraLY1b8fMTVpAnPgKGEuTfXskfJfiUFe9MSCpvPAmMxsg3CqyrRKIED1vxXgdSeWIUMz1Ww1kNEyXYPjIJO3uuJ6q59pD9f5TgPVZ8mRun3LEWOBaQPobPlSuIEvwZZtqpoJ/G68dghA0EpK8lYAMRJfgY8K0v3oy5EWxE2K79H1f+F1VWNeutlcqwzKa73hv/oNAu6aikUZmbzMB81Y5p24FDwHm+tEeAd9J9kNxwb/k3dCCLcy79GrDeFz+K2Y0UU1GrE+KcS28C/vDFO2m8/XBsxBE8Arxgpa0BHsieTv6Ie9XSgrnQvsaX9hdwB+aye8Yg7lXLGeA+zt5QzMdMB0uzJhWBCzAXeM5Icre0D1iNORWsoA2zF16VhkQMeMAGzIxxEHPa4gaH+W4w5DThbUltOcyvF0vaGVBfj4s9VxKDkiYCSByR9KiyWZy0SnpW0omAeoqujZuG0D0ydzlBOCDpKUldDnYXS3pR0qkQ20WZBzVOvNNeiPcC24BrQ/6fxOy6Psc8OfoVOMz04FcALgGuxLzaW4bZhnoh9r7BTIf2KWV8pPjClXCOzMud8ZAvkgWKkjZKmpeWbxaCK2GRpJczFl6S9JLMxiATnnm88ViIcbsHMU8RwtwzDFPAl8AHmMelpejsyZD3o5YO4DbMK5s+4DLgQswJqIfpy8eBA8DPmEux3QSfYGSCmfiKJxVm4iueVJgTPNsxJ3i24x9qO45nn/sZdwAAAABJRU5ErkJggg==);background-position:2px 2px;background-repeat:no-repeat;background-size:16px 16px;position:absolute;right:25px}.editor #SidePanel .remove{background-color:transparent;background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDIwIDIwIj4KICA8ZGVmcz4KICAgIDxzdHlsZT4KICAgICAgLmNscy0xIHsKICAgICAgICBmaWxsOiAjZmZmOwogICAgICAgIHN0cm9rZS13aWR0aDogMHB4OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvZGVmcz4KICA8ZyBpZD0iTGF5ZXJfMyIgZGF0YS1uYW1lPSJMYXllciAzIj4KICAgIDxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTE2LDdINGMtLjYsMC0xLC40LTEsMXYxMGMwLC42LjQsMSwxLDFoMTJjLjYsMCwxLS40LDEtMXYtMTBjMC0uNi0uNC0xLTEtMVpNOCwxNS41YzAsLjYtLjQsMS0xLDFoLTFjLS42LDAtMS0uNC0xLTF2LTVjMC0uNi40LTEsMS0xaDFjLjYsMCwxLC40LDEsMXY1Wk0xNSwxNS41YzAsLjYtLjQsMS0xLDFoLTFjLS42LDAtMS0uNC0xLTF2LTVjMC0uNi40LTEsMS0xaDFjLjYsMCwxLC40LDEsMXY1WiIvPgogIDwvZz4KICA8ZyBpZD0iTGF5ZXJfMiIgZGF0YS1uYW1lPSJMYXllciAyIj4KICAgIDxwb2x5Z29uIGNsYXNzPSJjbHMtMSIgcG9pbnRzPSIxIDUgMSAzIDMgMyAzIDEgMTcgMSAxNyAzIDE5IDMgMTkgNSAxIDUiLz4KICA8L2c+Cjwvc3ZnPg==);background-position:2px 2px;background-repeat:no-repeat;background-size:16px 16px;position:absolute;right:5px}.editor #SidePanel .visibility{background-color:transparent;background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyBpZD0iTGF5ZXJfMSIgZGF0YS1uYW1lPSJMYXllciAxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDgwMCA4MDAiPgogIDxkZWZzPgogICAgPHN0eWxlPgogICAgICAuY2xzLTEgewogICAgICAgIGZpbGw6IG5vbmU7CiAgICAgICAgc3Ryb2tlOiAjZmZmOwogICAgICAgIHN0cm9rZS1saW5lY2FwOiByb3VuZDsKICAgICAgICBzdHJva2UtbGluZWpvaW46IHJvdW5kOwogICAgICAgIHN0cm9rZS13aWR0aDogNjYuN3B4OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvZGVmcz4KICA8cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik01MDAsNDAwYzAsNTUuMi00NC44LDEwMC0xMDAsMTAwcy0xMDAtNDQuOC0xMDAtMTAwLDQ0LjgtMTAwLDEwMC0xMDAsMTAwLDQ0LjgsMTAwLDEwMFoiLz4KICA8cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik00MDAsMTY2LjdjLTE0OS4zLDAtMjc1LjYsOTguMS0zMTguMSwyMzMuMyw0Mi41LDEzNS4yLDE2OC44LDIzMy4zLDMxOC4xLDIzMy4zczI3NS42LTk4LjEsMzE4LjEtMjMzLjNjLTQyLjUtMTM1LjItMTY4LjgtMjMzLjMtMzE4LjEtMjMzLjNaIi8+Cjwvc3ZnPg==);background-position:2px 2px;background-repeat:no-repeat;background-size:16px 16px;position:absolute;right:45px}.editor #SidePanel .childObject{background-color:#111;min-height:20px;overflow:hidden}.editor #SidePanel .childObject ::-webkit-scrollbar{width:10px}.editor #SidePanel .childObject ::-webkit-scrollbar-track{background:#0d0d0d}.editor #SidePanel .childObject ::-webkit-scrollbar-thumb{background:#666}.editor #SidePanel .childObject ::-webkit-scrollbar-thumb:hover{background:#999}.editor #SidePanel .childObject .child{background-color:#222;border:none;border-bottom:1px solid #111;height:20px;position:relative}.editor #SidePanel .childObject .child:hover{background-color:#333}.editor #SidePanel .childObject .name{background-color:transparent;font-family:Arial;height:20px;overflow:hidden;position:absolute;left:5px;right:50px;top:50%;transform:translateY(-50%);white-space:nowrap}.editor #SidePanel .childObject .visibility{background-color:transparent;background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyBpZD0iTGF5ZXJfMSIgZGF0YS1uYW1lPSJMYXllciAxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDgwMCA4MDAiPgogIDxkZWZzPgogICAgPHN0eWxlPgogICAgICAuY2xzLTEgewogICAgICAgIGZpbGw6IG5vbmU7CiAgICAgICAgc3Ryb2tlOiAjZmZmOwogICAgICAgIHN0cm9rZS1saW5lY2FwOiByb3VuZDsKICAgICAgICBzdHJva2UtbGluZWpvaW46IHJvdW5kOwogICAgICAgIHN0cm9rZS13aWR0aDogNjYuN3B4OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvZGVmcz4KICA8cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik01MDAsNDAwYzAsNTUuMi00NC44LDEwMC0xMDAsMTAwcy0xMDAtNDQuOC0xMDAtMTAwLDQ0LjgtMTAwLDEwMC0xMDAsMTAwLDQ0LjgsMTAwLDEwMFoiLz4KICA8cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik00MDAsMTY2LjdjLTE0OS4zLDAtMjc1LjYsOTguMS0zMTguMSwyMzMuMyw0Mi41LDEzNS4yLDE2OC44LDIzMy4zLDMxOC4xLDIzMy4zczI3NS42LTk4LjEsMzE4LjEtMjMzLjNjLTQyLjUtMTM1LjItMTY4LjgtMjMzLjMtMzE4LjEtMjMzLjNaIi8+Cjwvc3ZnPg==);background-position:0;background-size:contain;height:16px;overflow:hidden;position:absolute;right:25px;top:50%;transform:translateY(-50%);width:16px;white-space:nowrap}.editor #SidePanel .childObject>div{display:grid;grid-template-rows:0fr;transition:.33s grid-template-rows cubic-bezier(.645,.045,.355,1)}.editor #SidePanel .childObject>div.open{grid-template-rows:1fr}.editor #SidePanel .childObject>div .container{padding-left:5px;height:auto;overflow-x:hidden;overflow-y:auto;max-height:200px}.editor #SidePanel .childObject>div .container.closed{height:0;overflow:hidden}.editor #SidePanel .childObject .icon{background-color:transparent;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAACXBIWXMAAAsTAAALEwEAmpwYAAAEZklEQVRYhe2YW4iVVRTHf4465oSaUNlUjo7SmCBEPVipTWYXoV7qoejykhRCEVQP9pAFSWVBPdRTMNRLWGRaFr2FSShmEQ1KzQymUhpeMky6ONbcfj3sdZpvvvnO8Zy5lA/+YcP51jpr7bVv/7X2nqByNqPu/w7gTDgX4GgxaYR2DcDlwC3AUmAh0ARMDf1fwGGgE9gFfAb8AJyquSe1ljZFXa6+o/Y4FD3qvmh5neomdYXaUEuftQQ3T31d7Y8O96tdal98P69eos5SXwhZn7pb7cgE2qa2jHWAy9Svo4Nf1VfUG9VPQvauWp/5f726MXSb1WvVF9XjIftWvXWsArxdPRSOt5uWCfV+dUDtVJsL7K5Q98aM3xuyVnVr+Dqi3jHaAJepx8Lhe2pTyJvVn6PzVRXsHw7bw+rckDWqb4b8mHrbSAOcp7aHozZ1Wka3NuQfqHUVfExUt8R/n8rI69XXQt6lLijnoxzNTAEeA64GeoDzgbVBI5OBu+J/FwPrg3aK0A1cGL8fB+YAfUFDF4T+SmAN8ATwZ97BBC3MxdeTuGtqOBSYkGklgu/NyIpgtMnxPRDfpd9kdCuBT/MOimawHlgdwW0DPs918AAwH9gK7MjoyqEHWA6sAPYBGzMD6gWWRHCPhL/TQ4dYfPpOxSFYXKDvVE+YaKZamrpZPWmil7xuoXrQxAiL8vqiXHwTaU99BbTndItJe+Zoga4S2oFjpJR4TU7XBXwZs7oyb1gU4DKgH/iCtP+yaAlH+4E/agjwJCkXTwwfeewgLXdrNQEuAn6neIYaSfvwQA3BlXCAdEAaC3TtpEFclVcUHZIm0sauC2f1Ie8lLZGkmbiI8vSSR3fYDYSPyzJ990YfvQxS0r8oopkTJI76jbTUpRMnMI3Ekd2k0qnaenKAxKUNwN+k7ZH1Wxd9nswHWWvBWo7vxg1FSyzwC/AgsIfBJe4DngNWAW1UziB5dAPPAo8CbwPrGLrELcAGYEY1AR4C5pKW5WhOt5c0iwMxiFpQykBdpGo7i7kkwj+eNypa4g5gOsP5ChKX1ZG4sFbMjyDzgyb6mgl8V02AO0mndAnDZ/h70hZoJg2iWswMm37SKuRxA2kGtw/TFKSelipTXesIUt3uWlNd0R78EXifdEheYnixMDlm5BlqKxZmkChqHcOLhdnAxxQkgErl1jbgPM7CcgtS6nkDeDIcbQZ+IpVgk4A7gUtJBcVOKhesS0n5/QjwEYMF6yzg7gjwLVLuLxhi+X3TrH4TZXmbOj2jezrkZyr5JzlY8q/JyKsu+UdzaToaG/uhCvarw/agOscxvjSVWvbaucPBa+d9plvdXlORm7dbELo+9Z6Qjfm1MzuT2Yv7q9HZlpBtdOjFfar6Yeg2qdep6x2ni3upFT19dDj49PGy6emjMQZg6PaY9lkJ4/L0UWqlx6MNDn8g6o2g98fvPEb0eFSOB8+Eoue32Rm6OR200hn0sY0RPr+NNMD/DGf9C+u5AEeLfwBkrdN1844nCgAAAABJRU5ErkJggg==);background-size:20px 20px;display:inline-block;position:absolute;right:5px;top:0;width:20px;height:20px;transform:scale(.8)}.editor #SidePanel .childObject .obj3D{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAACXBIWXMAAAsTAAALEwEAmpwYAAAEZklEQVRYhe2YW4iVVRTHf4465oSaUNlUjo7SmCBEPVipTWYXoV7qoejykhRCEVQP9pAFSWVBPdRTMNRLWGRaFr2FSShmEQ1KzQymUhpeMky6ONbcfj3sdZpvvvnO8Zy5lA/+YcP51jpr7bVv/7X2nqByNqPu/w7gTDgX4GgxaYR2DcDlwC3AUmAh0ARMDf1fwGGgE9gFfAb8AJyquSe1ljZFXa6+o/Y4FD3qvmh5neomdYXaUEuftQQ3T31d7Y8O96tdal98P69eos5SXwhZn7pb7cgE2qa2jHWAy9Svo4Nf1VfUG9VPQvauWp/5f726MXSb1WvVF9XjIftWvXWsArxdPRSOt5uWCfV+dUDtVJsL7K5Q98aM3xuyVnVr+Dqi3jHaAJepx8Lhe2pTyJvVn6PzVRXsHw7bw+rckDWqb4b8mHrbSAOcp7aHozZ1Wka3NuQfqHUVfExUt8R/n8rI69XXQt6lLijnoxzNTAEeA64GeoDzgbVBI5OBu+J/FwPrg3aK0A1cGL8fB+YAfUFDF4T+SmAN8ATwZ97BBC3MxdeTuGtqOBSYkGklgu/NyIpgtMnxPRDfpd9kdCuBT/MOimawHlgdwW0DPs918AAwH9gK7MjoyqEHWA6sAPYBGzMD6gWWRHCPhL/TQ4dYfPpOxSFYXKDvVE+YaKZamrpZPWmil7xuoXrQxAiL8vqiXHwTaU99BbTndItJe+Zoga4S2oFjpJR4TU7XBXwZs7oyb1gU4DKgH/iCtP+yaAlH+4E/agjwJCkXTwwfeewgLXdrNQEuAn6neIYaSfvwQA3BlXCAdEAaC3TtpEFclVcUHZIm0sauC2f1Ie8lLZGkmbiI8vSSR3fYDYSPyzJ990YfvQxS0r8oopkTJI76jbTUpRMnMI3Ekd2k0qnaenKAxKUNwN+k7ZH1Wxd9nswHWWvBWo7vxg1FSyzwC/AgsIfBJe4DngNWAW1UziB5dAPPAo8CbwPrGLrELcAGYEY1AR4C5pKW5WhOt5c0iwMxiFpQykBdpGo7i7kkwj+eNypa4g5gOsP5ChKX1ZG4sFbMjyDzgyb6mgl8V02AO0mndAnDZ/h70hZoJg2iWswMm37SKuRxA2kGtw/TFKSelipTXesIUt3uWlNd0R78EXifdEheYnixMDlm5BlqKxZmkChqHcOLhdnAxxQkgErl1jbgPM7CcgtS6nkDeDIcbQZ+IpVgk4A7gUtJBcVOKhesS0n5/QjwEYMF6yzg7gjwLVLuLxhi+X3TrH4TZXmbOj2jezrkZyr5JzlY8q/JyKsu+UdzaToaG/uhCvarw/agOscxvjSVWvbaucPBa+d9plvdXlORm7dbELo+9Z6Qjfm1MzuT2Yv7q9HZlpBtdOjFfar6Yeg2qdep6x2ni3upFT19dDj49PGy6emjMQZg6PaY9lkJ4/L0UWqlx6MNDn8g6o2g98fvPEb0eFSOB8+Eoue32Rm6OR200hn0sY0RPr+NNMD/DGf9C+u5AEeLfwBkrdN1844nCgAAAABJRU5ErkJggg==)}.editor #SidePanel .childObject .camera{background-image:url(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)}.editor #SidePanel .childObject .interactive{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAACXBIWXMAAAsTAAALEwEAmpwYAAADA0lEQVRYhe2Yu2sUURTGf5uYSJ4EsgqJIkRMEYOFYMBCQcTe57/hs9AqlVpYiChYqREsFBRF8AF2KgpqErQQRKIRi6ghRozEhcSYz+Le1bPD7MzOzm5MkQ+Gc+/Z79z7cfY+5kxGEosZNf9bQByWBKbFsjJiGoEuYC3QAUwC74EPwFTlpHlIKvVplHRS0rSK47KktgRjxj6lEtdJ+hIhzGJO0raFFNghaTYg4oKkPkmdknrlMvsjwNm8EAJrJI2YSZ9IyhbhNkkaMNwZSS3VFrjbTPhC0nLzW6ekDZK6jC8j6ZqJOV9tgTZ7eSF1ks6oEHd9BpHULGnS+2flNldVBK4wAu4Z/0GF47bhHDP+njQCow7qbtO+4209cNy3p4ETwCff34k7FwEGTWw2zTFY6k0y4W2LfwAeA/3AdcNr9PZzGXOEIuomeYbL0BrgvvdlzO8z3tYa37y3b33sKuB5tQTO4zJUDLUhvrkSY0tGOXdxHgpYgNPAU9yaHQP6gB3AS+AB0Ars8fYW8C5+lmS7Khuya88W2dXBmyUXwjmXZhenRUug3xDC2Q9sjRokqcBMSNv6DgH7TH8M2AQMBTh7Tf9o1IRJ16BC2tZ3Ffhp+oPAMPDICw3jRCJNBsNQR+HurjF+y7GJiazakgoMGyxOdJBTCv8vKrEG6yPGawrhBAVWLYP59kVvp4DvuDs6vyluenvJcL6RIKNpDup87BCwEsjxb/FvAdqAcd8fNJwc0G7GicxgUoEzpm3PuYkQ3njAZzl2I0VmMOlfnAM++vZ6CtdWEthXsNEoYlKBv3F3aH6S7ghuFA6Y9pVIZhlvuRvNXTosV4ckiV8duJ/ro/jlCKxVYa3SnyC2SdIrE3skLqbcWqFLhTglqSEmpkPSGxMzGpe9NAKRtCsg8qukw3LlaLPPVqtcYT8Q4OY8L3aeNAKRtF3F8auI/7Wk9lLnSCsQufL0RoTQPKblSta6JONnpIp9As4Cvbjyswd3Rk7hXrUeAiO4czQRKimwKlj0X1iXBKbFH8wWbNSnU+tzAAAAAElFTkSuQmCC)}.editor #SidePanel .childObject .light{background-image:url(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==)}.editor #SidePanel .childObject .ui{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAACXBIWXMAAAsTAAALEwEAmpwYAAADjElEQVRYhe2YTWhdRRTHf+lLTFRCkjaLILgIKoIBRRfaSmMFQSsoIrrRuhEqfnTTtV20qHUllIBWcKNQxG4EJWoVEUxKqV8blXYlYv0utr7UtkaN9dfFTMzNfXM/8hJeI/iHYV7OOTP3d+89M3NuulRWs9ZcaIAq/Q+4XJUB3gDsA74BZoDPgaeAdStw3SHgdeD2ykg11baoZ03rS/XKgnGD6niBLxszFedqqpvK4lPG69U/4gTvqneo16lb1e+j/SO1LzF2SD2pbqsBN69SyJTxtTjwPbU75xuLAKr3Zy46FNuoeib6n6kBVwmZAvwuDrqt4K72Rv8LakP9Wv01tqb6T+bCr6rD6og6XQA3rxl1c/56qUXSH/ufCtL229gPxH40Jv0QMAh0ZWIfBG4CNgLjFcthANiWN3YnAn+IweuBown/xtgfAwReAS6NtouAO2P/O/AY8Hb07YqtSNPAwy3WxCt8Oj7yY+q1Od+j6rnovzExtqH+qR5Xb034dxW83ilDjtbKwXXqkTiwqb6o7lDfykw4kZosk2tjBX7UnTm4D4vgigBRr1APFtzthNpTMK5P7S+By0MeLINT6dLCaqYHuAfYFHPsR2AS+Lgkj5aih4ADwMmyoDLAeTUIR9KBleEC4BJgDugFzhIWW1J1ioV9wDuEO14pPQ8cB75gYbtKqgpwN/BA/P0ScMuy0YIGCPvmMIv3zRaVAT4OPJn5+2JCBTK2XDrC6wX4O7ZCFQGOAzuBUyzkx19AH7AXWNsGVC8wQnhyfdHWRXiKw4RTqFUFy3vQcIaOxr1Q9Q1DQTCi9tbYSvJtbdzzThs2cw3n9oz6swVlWtWk/YYiQHV/G1D5do36S+vW6hNFY6oWSTcL53VPG681r6PAfcBsxvYsIW2SqgIUOAE0Cfm4EpoGHom/9wM7yoLrbNRrCMl8btloi7UZeL9q3hTgyyyUTxC2AQmgjYz9MLCnDbANwF3AZYRTZAp4k7BLtCqRmHOJJE5pcokLpNdQGaV0SL2q7iI5XfNJzFaHLNIeQgGb0s2EQmQ47+jUh/t6wslUpquB7XljpwDvbTeuU4CjNeNG8oZOATZrxp3JGzoF+EHNuMN5Q6cAJ4FPKmLmgOfyxhRg6ls5pUZ1yL+aBbYAR0r8W4HP6sCcoKKIjFrq2fwV4QNsO3A3cDnwG3AImAA+TQ2qcxZfUP2n/8O6KrTqAc8D9emWHC8oT9IAAAAASUVORK5CYII=)}.editor #SidePanel .childObject .utils{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAACXBIWXMAAAsTAAALEwEAmpwYAAADFElEQVRYhe2YT0hVQRSHf7YwsUVoakFtKmhdUfhUeLSrrFVQEES72rip1EoscFlLK2jRpl21tT8QhFkLq13gIotqlaRPQ8SkgvRrcefiOO/eufN8LzPwwMV375w5893fnHPm+aoArWZb968BsmwNsFz7rwHzkgYltVdgnRpJZyU9lTQm6ZukUUl9GQwSkHS1AgUimwduAHUpvlnXLmCYYpsFDmXNT3p4AJhICDgC7C0RbgvwISHWGNASEiPpYdLbxvYJ2FQC4F1rbj/w1nx+ERoj6WE78NsDeSIw+E7gh5kzYJ5dM/dzwFbH/yDQ58ZJStAnkm570rY+sDDaTHEgqd88GzJ/ayWdk7Td3Ock3Zd0OrRINgKjKQq+ApoCFOw0/j8tteqAaSvWd6LtjgtyKkRBSZqRdFLS+4SxnKQBSU0ZCsaHfLXlOy3plqRxc79BUTtrNPe/QhWU9cbHgQ7gTYKSm1Pm5YAvlm+bM15PlOvXWSwcgGdurFJaRpOBsu010Oj4tVhbBtAFVHni3rR8z5QDKKNYEmSsZI6lPbTbmZ8HdgPbgMNE1R3bMFBbLqCABgNl20vgmAN30ZnXRXQqzbPYfmIbAXYkrbccwLTtts1VrjvFbxa4Q3GalA0Yb/fzALgua2zcjHcDp0hRrVKAAo4CCx64XmtsksDzt1KAbitx4a5YY1+BPctZZ7lwzfgLwlZuxQFb8LcSW7k5FlNgRbY4R5ToIXATREp3OM9a/xZgjqUnhG9bZ4D91linNTZpYlUU0IVzlbMBIGrE5z0+hVAlQ3POt63uwnZ+XvL4ThCQk5VUbhLYR1StNmSPM+eCM8erZBacr1rtE8JVw21Dlz0vVsCTk2lwDcBnE2CB4oKwz9YCyVvltqOkLw9xC/pIyj9jaYBHrMC9Hris3pYzPmmQPdZYeymAeWviPaAmAS4oyT1KrjexY8uXAlgNPLImP2BpnwtuExakXWxXHbjHZs2SiqQeGKTYpgKVy9ru2IbMWiVXcQxpfy1/t0y4+Go2MWJ7SMYvFVWw9hNwWbYGWK6tesA/ap/6uHJWeiAAAAAASUVORK5CYII=)}.editor .header .dropdown{color:#fff;display:inline-block;margin-right:1px;text-align:left;height:fit-content;min-width:auto;width:max-content}.editor .header .dropdown button{backdrop-filter:blur(2px);background-color:#222c;border:none;color:#ffffff80;font-size:12px;padding:5px 10px;position:relative;text-align:left;min-width:22px;width:100%;height:32px;transition:all .2s linear}.editor .header .dropdown button:hover{background-color:#333c;color:#fff}.editor .header .dropdown button.svg{line-height:0;width:32px}.editor .header .dropdown p{background-color:#222c;display:inline-block;height:22px;margin:0;min-width:22px;padding:5px}.editor .header .dropdown svg{position:relative;left:50%;transform:translate(-50%)}.editor .header .dropdown ul{list-style:none;margin:0;margin-block:0;padding-inline:0;position:absolute;width:max-content}.editor .header .dropdown ul li{border-top:1px solid rgba(17,17,17,.9);display:block;position:relative}.editor .header .dropdown ul li.selected button{background-color:#444c}.editor .header .dropdown ul li.selected button:hover{background-color:#555c}.editor .header .dropdown.subdropdown{min-width:100%}.editor .header .dropdown.subdropdown ul{border-left:1px solid rgba(17,17,17,.9);left:100%;top:-1px}.editor .header .draggable li{cursor:grab;transition:transform .25s ease-out}.editor .header .draggable li.dragging{transform:scale(1.1)}.editor .header .draggable li.dragging div{background-color:#404040}.editor .header .draggable li div{background-color:#222c;line-height:14px;padding:5px 10px;transition:background-color .25s linear}.editor .header .draggable li div:hover{background-color:#333c}.editor .header .draggable li div span{font-size:12px;margin:0 15px 0 10px;padding:0 5px}.editor .header .draggable li div .dragIcon{position:absolute;left:10px}.editor .header .draggable li div .closeIcon{background-color:transparent;padding:0;position:absolute;right:5px;top:50%;min-width:14px;width:14px;height:14px;transform:translateY(-50%);visibility:inherit}.editor .header .draggable li div .closeIcon svg{background-color:transparent;left:0;position:relative}.editor{background:linear-gradient(45deg,#000,#333);font-family:Arial,Helvetica,sans-serif;font-size:12px;left:0;pointer-events:none;position:absolute;top:0;width:100%;height:100%;z-index:100}.editor button{background:none;border:none;color:#fff;display:inline-block;margin:0;padding:0;text-align:left}.editor .header{display:inline-block;pointer-events:visible;position:relative;left:130px;z-index:101}.editor .footer{position:absolute;right:5px;bottom:0}.fsAbsolute{position:absolute;inset:0}.absoluteCenter{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%)}.hidden{display:none;visibility:hidden}.hideText{text-indent:-9999px;white-space:nowrap}
|
|
1
|
+
.editor #SidePanel .status{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHgAAAA8CAYAAACtrX6oAAAACXBIWXMAABYlAAAWJQFJUiTwAAAB90lEQVR4nO2cXWoCQRCEy+R0+6QguCE5XwLJtYToIZTOgxFlWd1Vd7p7yvpgXoLJ1NQ3a/wZnZkZBC8v0QFEWSSYHAkmR4LJkWByJJgcCSZHgsmRYHIkmBwJJkeCyZFgciSYHAkmR4LJkWByxghuAKwBbAEsiqa5jzlO+ZrgLH3MAWxwyLd0n93MhsbaTuzMrB3xO15j9Z/pyG+CTNfyufd36130K4BPAG2BvXYrKwBfOGTKSF8+//5G7IJFZxeG7MTOaC9kWgRmunbldnHr79FCIyRnyjJW7i4qc23FZshwj9zWzN4istdUcM1yj7dxl1xL0QxyQyTXUDiTXHfJ2YtnlOu6tswCmOW6rXGKP1Ii5DPIdVnr0y14glHVhp5y4VXcZT04qvuXNHUB6R90ZBNQeo4SRaR+2pCleK+5ShWS9ol/dOHec5YsJuVLd1FFR81dOmS6F9+9C47O4BEy1dtnXsVmyeIVMs0b4CPG4pFCC427Dzh4hrwkObq87jg/g5YpX19/g2fQPI/N/gB4B7A/+9kewAeAb8cct5ApX19/wwTsxLmZbcxsa2bLBFdGdzR2uIq3lueMV7e/Y75m6PYzM33THTP6ZAM5EkyOBJMjweRIMDkSTI4EkyPB5EgwORJMjgSTI8HkSDA5EkyOBJMjweRIMDl/5nU6ICCWVGoAAAAASUVORK5CYII=);background-position-x:2px;background-position-y:2px;background-size:32px 16px}.editor #SidePanel .refresh{background-color:transparent;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAACXBIWXMAAAsTAAALEwEAmpwYAAAE1UlEQVRoge2aW2gdRRzGf5vGWMSTVBpNUjWNijHgg6KIRqmtD0UpqA9iFeulijWkllIsKOKb+lbxgr6oLQUFtc2LPgjaImILSq36oKLWkpZC7C1p6zkNXkqSz4c5x2zH3T27s7vnnMR8MBxmzsx/vm/2P/fxJPF/QlO9CdQac4JnO+YEz3Y052y/C7gV6Af6gCuAhUABEDAOnASGgX3AV8Au4Le8CHk5TEttwMPA/cBNuHnR18D7wLvAieyoAZKyChdJelXSaWWHcUmvS1qUFc8sjDRLeiZjoTZOS3pOUktavmld+irgPeC6MAcC9gBfYNx0P6Z/lsr/FzD9vBe4HlgK3AzMC7H3HfAQ8JMz4xSttUJSMeSLnJT0vKRLHex2SNogaTjia9/lyttV7IIQsWOSnpZUSNGQldAkabWkkYB6JiUN1lJwTwCJT5Xh4OILBUmbA+qbkjRQK8FI2lquuCjjgl4OYv1hlaQ/LdGTku5MYiftoNUD/F4OtcAS4GPMYFdBCbgR+CWOgTwWHnljCbADmO9L24sZ3SeqFZ6Ja+ndwONW2g3Axlilq/i8J2mLzKicZ/90CVus/lyS1FmtXDWjT5SNvdkAAu3QKumwJfqVNIK7NT3XTkla3gAi7fCYJbhUbojEgj1JOyxjh6oZq0NolnTQ4rkuqkzYoLUGWG6ldQObkowuNcAE8IaVtjKqQNC01A38ALQG5BdwO7DTkWAe6AJGmJ5xpsppx4My21/YAzYTLDbO//XAEcxJSQVNwC1hmW3BQa5soxFde5cV7w/L6BecREichqkl9lrxvrCMFcEe8BbxXdUDtgILkjLLCfut+OWhOcvD9YDcUI8FyXZHrpK0zZO0GPget4FIwArgE4eyrmgHfgQ6EpYbA66O2i39DbT44ucCZxLTywd3Ax8mLLMSGIraLY1b8fMTVpAnPgKGEuTfXskfJfiUFe9MSCpvPAmMxsg3CqyrRKIED1vxXgdSeWIUMz1Ww1kNEyXYPjIJO3uuJ6q59pD9f5TgPVZ8mRun3LEWOBaQPobPlSuIEvwZZtqpoJ/G68dghA0EpK8lYAMRJfgY8K0v3oy5EWxE2K79H1f+F1VWNeutlcqwzKa73hv/oNAu6aikUZmbzMB81Y5p24FDwHm+tEeAd9J9kNxwb/k3dCCLcy79GrDeFz+K2Y0UU1GrE+KcS28C/vDFO2m8/XBsxBE8Arxgpa0BHsieTv6Ie9XSgrnQvsaX9hdwB+aye8Yg7lXLGeA+zt5QzMdMB0uzJhWBCzAXeM5Icre0D1iNORWsoA2zF16VhkQMeMAGzIxxEHPa4gaH+W4w5DThbUltOcyvF0vaGVBfj4s9VxKDkiYCSByR9KiyWZy0SnpW0omAeoqujZuG0D0ydzlBOCDpKUldDnYXS3pR0qkQ20WZBzVOvNNeiPcC24BrQ/6fxOy6Psc8OfoVOMz04FcALgGuxLzaW4bZhnoh9r7BTIf2KWV8pPjClXCOzMud8ZAvkgWKkjZKmpeWbxaCK2GRpJczFl6S9JLMxiATnnm88ViIcbsHMU8RwtwzDFPAl8AHmMelpejsyZD3o5YO4DbMK5s+4DLgQswJqIfpy8eBA8DPmEux3QSfYGSCmfiKJxVm4iueVJgTPNsxJ3i24x9qO45nn/sZdwAAAABJRU5ErkJggg==);background-position:2px 2px;background-repeat:no-repeat;background-size:16px 16px;position:absolute;right:25px}.editor #SidePanel .remove{background-color:transparent;background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDIwIDIwIj4KICA8ZGVmcz4KICAgIDxzdHlsZT4KICAgICAgLmNscy0xIHsKICAgICAgICBmaWxsOiAjZmZmOwogICAgICAgIHN0cm9rZS13aWR0aDogMHB4OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvZGVmcz4KICA8ZyBpZD0iTGF5ZXJfMyIgZGF0YS1uYW1lPSJMYXllciAzIj4KICAgIDxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTE2LDdINGMtLjYsMC0xLC40LTEsMXYxMGMwLC42LjQsMSwxLDFoMTJjLjYsMCwxLS40LDEtMXYtMTBjMC0uNi0uNC0xLTEtMVpNOCwxNS41YzAsLjYtLjQsMS0xLDFoLTFjLS42LDAtMS0uNC0xLTF2LTVjMC0uNi40LTEsMS0xaDFjLjYsMCwxLC40LDEsMXY1Wk0xNSwxNS41YzAsLjYtLjQsMS0xLDFoLTFjLS42LDAtMS0uNC0xLTF2LTVjMC0uNi40LTEsMS0xaDFjLjYsMCwxLC40LDEsMXY1WiIvPgogIDwvZz4KICA8ZyBpZD0iTGF5ZXJfMiIgZGF0YS1uYW1lPSJMYXllciAyIj4KICAgIDxwb2x5Z29uIGNsYXNzPSJjbHMtMSIgcG9pbnRzPSIxIDUgMSAzIDMgMyAzIDEgMTcgMSAxNyAzIDE5IDMgMTkgNSAxIDUiLz4KICA8L2c+Cjwvc3ZnPg==);background-position:2px 2px;background-repeat:no-repeat;background-size:16px 16px;position:absolute;right:5px}.editor #SidePanel .visibility{background-color:transparent;background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyBpZD0iTGF5ZXJfMSIgZGF0YS1uYW1lPSJMYXllciAxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDgwMCA4MDAiPgogIDxkZWZzPgogICAgPHN0eWxlPgogICAgICAuY2xzLTEgewogICAgICAgIGZpbGw6IG5vbmU7CiAgICAgICAgc3Ryb2tlOiAjZmZmOwogICAgICAgIHN0cm9rZS1saW5lY2FwOiByb3VuZDsKICAgICAgICBzdHJva2UtbGluZWpvaW46IHJvdW5kOwogICAgICAgIHN0cm9rZS13aWR0aDogNjYuN3B4OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvZGVmcz4KICA8cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik01MDAsNDAwYzAsNTUuMi00NC44LDEwMC0xMDAsMTAwcy0xMDAtNDQuOC0xMDAtMTAwLDQ0LjgtMTAwLDEwMC0xMDAsMTAwLDQ0LjgsMTAwLDEwMFoiLz4KICA8cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik00MDAsMTY2LjdjLTE0OS4zLDAtMjc1LjYsOTguMS0zMTguMSwyMzMuMyw0Mi41LDEzNS4yLDE2OC44LDIzMy4zLDMxOC4xLDIzMy4zczI3NS42LTk4LjEsMzE4LjEtMjMzLjNjLTQyLjUtMTM1LjItMTY4LjgtMjMzLjMtMzE4LjEtMjMzLjNaIi8+Cjwvc3ZnPg==);background-position:2px 2px;background-repeat:no-repeat;background-size:16px 16px;position:absolute;right:45px}.editor #SidePanel .childObject .visibility{background-color:transparent;background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyBpZD0iTGF5ZXJfMSIgZGF0YS1uYW1lPSJMYXllciAxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDgwMCA4MDAiPgogIDxkZWZzPgogICAgPHN0eWxlPgogICAgICAuY2xzLTEgewogICAgICAgIGZpbGw6IG5vbmU7CiAgICAgICAgc3Ryb2tlOiAjZmZmOwogICAgICAgIHN0cm9rZS1saW5lY2FwOiByb3VuZDsKICAgICAgICBzdHJva2UtbGluZWpvaW46IHJvdW5kOwogICAgICAgIHN0cm9rZS13aWR0aDogNjYuN3B4OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvZGVmcz4KICA8cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik01MDAsNDAwYzAsNTUuMi00NC44LDEwMC0xMDAsMTAwcy0xMDAtNDQuOC0xMDAtMTAwLDQ0LjgtMTAwLDEwMC0xMDAsMTAwLDQ0LjgsMTAwLDEwMFoiLz4KICA8cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik00MDAsMTY2LjdjLTE0OS4zLDAtMjc1LjYsOTguMS0zMTguMSwyMzMuMyw0Mi41LDEzNS4yLDE2OC44LDIzMy4zLDMxOC4xLDIzMy4zczI3NS42LTk4LjEsMzE4LjEtMjMzLjNjLTQyLjUtMTM1LjItMTY4LjgtMjMzLjMtMzE4LjEtMjMzLjNaIi8+Cjwvc3ZnPg==);background-position:0;background-size:contain;height:16px;overflow:hidden;position:absolute;right:25px;top:50%;transform:translateY(-50%);width:16px;white-space:nowrap}.editor #SidePanel .childObject .icon{background-color:transparent;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAACXBIWXMAAAsTAAALEwEAmpwYAAAEZklEQVRYhe2YW4iVVRTHf4465oSaUNlUjo7SmCBEPVipTWYXoV7qoejykhRCEVQP9pAFSWVBPdRTMNRLWGRaFr2FSShmEQ1KzQymUhpeMky6ONbcfj3sdZpvvvnO8Zy5lA/+YcP51jpr7bVv/7X2nqByNqPu/w7gTDgX4GgxaYR2DcDlwC3AUmAh0ARMDf1fwGGgE9gFfAb8AJyquSe1ljZFXa6+o/Y4FD3qvmh5neomdYXaUEuftQQ3T31d7Y8O96tdal98P69eos5SXwhZn7pb7cgE2qa2jHWAy9Svo4Nf1VfUG9VPQvauWp/5f726MXSb1WvVF9XjIftWvXWsArxdPRSOt5uWCfV+dUDtVJsL7K5Q98aM3xuyVnVr+Dqi3jHaAJepx8Lhe2pTyJvVn6PzVRXsHw7bw+rckDWqb4b8mHrbSAOcp7aHozZ1Wka3NuQfqHUVfExUt8R/n8rI69XXQt6lLijnoxzNTAEeA64GeoDzgbVBI5OBu+J/FwPrg3aK0A1cGL8fB+YAfUFDF4T+SmAN8ATwZ97BBC3MxdeTuGtqOBSYkGklgu/NyIpgtMnxPRDfpd9kdCuBT/MOimawHlgdwW0DPs918AAwH9gK7MjoyqEHWA6sAPYBGzMD6gWWRHCPhL/TQ4dYfPpOxSFYXKDvVE+YaKZamrpZPWmil7xuoXrQxAiL8vqiXHwTaU99BbTndItJe+Zoga4S2oFjpJR4TU7XBXwZs7oyb1gU4DKgH/iCtP+yaAlH+4E/agjwJCkXTwwfeewgLXdrNQEuAn6neIYaSfvwQA3BlXCAdEAaC3TtpEFclVcUHZIm0sauC2f1Ie8lLZGkmbiI8vSSR3fYDYSPyzJ990YfvQxS0r8oopkTJI76jbTUpRMnMI3Ekd2k0qnaenKAxKUNwN+k7ZH1Wxd9nswHWWvBWo7vxg1FSyzwC/AgsIfBJe4DngNWAW1UziB5dAPPAo8CbwPrGLrELcAGYEY1AR4C5pKW5WhOt5c0iwMxiFpQykBdpGo7i7kkwj+eNypa4g5gOsP5ChKX1ZG4sFbMjyDzgyb6mgl8V02AO0mndAnDZ/h70hZoJg2iWswMm37SKuRxA2kGtw/TFKSelipTXesIUt3uWlNd0R78EXifdEheYnixMDlm5BlqKxZmkChqHcOLhdnAxxQkgErl1jbgPM7CcgtS6nkDeDIcbQZ+IpVgk4A7gUtJBcVOKhesS0n5/QjwEYMF6yzg7gjwLVLuLxhi+X3TrH4TZXmbOj2jezrkZyr5JzlY8q/JyKsu+UdzaToaG/uhCvarw/agOscxvjSVWvbaucPBa+d9plvdXlORm7dbELo+9Z6Qjfm1MzuT2Yv7q9HZlpBtdOjFfar6Yeg2qdep6x2ni3upFT19dDj49PGy6emjMQZg6PaY9lkJ4/L0UWqlx6MNDn8g6o2g98fvPEb0eFSOB8+Eoue32Rm6OR200hn0sY0RPr+NNMD/DGf9C+u5AEeLfwBkrdN1844nCgAAAABJRU5ErkJggg==);background-size:20px 20px;display:inline-block;position:absolute;right:5px;top:0;width:20px;height:20px;transform:scale(.8)}.editor #SidePanel .childObject .obj3D{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAACXBIWXMAAAsTAAALEwEAmpwYAAAEZklEQVRYhe2YW4iVVRTHf4465oSaUNlUjo7SmCBEPVipTWYXoV7qoejykhRCEVQP9pAFSWVBPdRTMNRLWGRaFr2FSShmEQ1KzQymUhpeMky6ONbcfj3sdZpvvvnO8Zy5lA/+YcP51jpr7bVv/7X2nqByNqPu/w7gTDgX4GgxaYR2DcDlwC3AUmAh0ARMDf1fwGGgE9gFfAb8AJyquSe1ljZFXa6+o/Y4FD3qvmh5neomdYXaUEuftQQ3T31d7Y8O96tdal98P69eos5SXwhZn7pb7cgE2qa2jHWAy9Svo4Nf1VfUG9VPQvauWp/5f726MXSb1WvVF9XjIftWvXWsArxdPRSOt5uWCfV+dUDtVJsL7K5Q98aM3xuyVnVr+Dqi3jHaAJepx8Lhe2pTyJvVn6PzVRXsHw7bw+rckDWqb4b8mHrbSAOcp7aHozZ1Wka3NuQfqHUVfExUt8R/n8rI69XXQt6lLijnoxzNTAEeA64GeoDzgbVBI5OBu+J/FwPrg3aK0A1cGL8fB+YAfUFDF4T+SmAN8ATwZ97BBC3MxdeTuGtqOBSYkGklgu/NyIpgtMnxPRDfpd9kdCuBT/MOimawHlgdwW0DPs918AAwH9gK7MjoyqEHWA6sAPYBGzMD6gWWRHCPhL/TQ4dYfPpOxSFYXKDvVE+YaKZamrpZPWmil7xuoXrQxAiL8vqiXHwTaU99BbTndItJe+Zoga4S2oFjpJR4TU7XBXwZs7oyb1gU4DKgH/iCtP+yaAlH+4E/agjwJCkXTwwfeewgLXdrNQEuAn6neIYaSfvwQA3BlXCAdEAaC3TtpEFclVcUHZIm0sauC2f1Ie8lLZGkmbiI8vSSR3fYDYSPyzJ990YfvQxS0r8oopkTJI76jbTUpRMnMI3Ekd2k0qnaenKAxKUNwN+k7ZH1Wxd9nswHWWvBWo7vxg1FSyzwC/AgsIfBJe4DngNWAW1UziB5dAPPAo8CbwPrGLrELcAGYEY1AR4C5pKW5WhOt5c0iwMxiFpQykBdpGo7i7kkwj+eNypa4g5gOsP5ChKX1ZG4sFbMjyDzgyb6mgl8V02AO0mndAnDZ/h70hZoJg2iWswMm37SKuRxA2kGtw/TFKSelipTXesIUt3uWlNd0R78EXifdEheYnixMDlm5BlqKxZmkChqHcOLhdnAxxQkgErl1jbgPM7CcgtS6nkDeDIcbQZ+IpVgk4A7gUtJBcVOKhesS0n5/QjwEYMF6yzg7gjwLVLuLxhi+X3TrH4TZXmbOj2jezrkZyr5JzlY8q/JyKsu+UdzaToaG/uhCvarw/agOscxvjSVWvbaucPBa+d9plvdXlORm7dbELo+9Z6Qjfm1MzuT2Yv7q9HZlpBtdOjFfar6Yeg2qdep6x2ni3upFT19dDj49PGy6emjMQZg6PaY9lkJ4/L0UWqlx6MNDn8g6o2g98fvPEb0eFSOB8+Eoue32Rm6OR200hn0sY0RPr+NNMD/DGf9C+u5AEeLfwBkrdN1844nCgAAAABJRU5ErkJggg==)}.editor #SidePanel .childObject .camera{background-image:url(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)}.editor #SidePanel .childObject .interactive{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAACXBIWXMAAAsTAAALEwEAmpwYAAADA0lEQVRYhe2Yu2sUURTGf5uYSJ4EsgqJIkRMEYOFYMBCQcTe57/hs9AqlVpYiChYqREsFBRF8AF2KgpqErQQRKIRi6ghRozEhcSYz+Le1bPD7MzOzm5MkQ+Gc+/Z79z7cfY+5kxGEosZNf9bQByWBKbFsjJiGoEuYC3QAUwC74EPwFTlpHlIKvVplHRS0rSK47KktgRjxj6lEtdJ+hIhzGJO0raFFNghaTYg4oKkPkmdknrlMvsjwNm8EAJrJI2YSZ9IyhbhNkkaMNwZSS3VFrjbTPhC0nLzW6ekDZK6jC8j6ZqJOV9tgTZ7eSF1ks6oEHd9BpHULGnS+2flNldVBK4wAu4Z/0GF47bhHDP+njQCow7qbtO+4209cNy3p4ETwCff34k7FwEGTWw2zTFY6k0y4W2LfwAeA/3AdcNr9PZzGXOEIuomeYbL0BrgvvdlzO8z3tYa37y3b33sKuB5tQTO4zJUDLUhvrkSY0tGOXdxHgpYgNPAU9yaHQP6gB3AS+AB0Ars8fYW8C5+lmS7Khuya88W2dXBmyUXwjmXZhenRUug3xDC2Q9sjRokqcBMSNv6DgH7TH8M2AQMBTh7Tf9o1IRJ16BC2tZ3Ffhp+oPAMPDICw3jRCJNBsNQR+HurjF+y7GJiazakgoMGyxOdJBTCv8vKrEG6yPGawrhBAVWLYP59kVvp4DvuDs6vyluenvJcL6RIKNpDup87BCwEsjxb/FvAdqAcd8fNJwc0G7GicxgUoEzpm3PuYkQ3njAZzl2I0VmMOlfnAM++vZ6CtdWEthXsNEoYlKBv3F3aH6S7ghuFA6Y9pVIZhlvuRvNXTosV4ckiV8duJ/ro/jlCKxVYa3SnyC2SdIrE3skLqbcWqFLhTglqSEmpkPSGxMzGpe9NAKRtCsg8qukw3LlaLPPVqtcYT8Q4OY8L3aeNAKRtF3F8auI/7Wk9lLnSCsQufL0RoTQPKblSta6JONnpIp9As4Cvbjyswd3Rk7hXrUeAiO4czQRKimwKlj0X1iXBKbFH8wWbNSnU+tzAAAAAElFTkSuQmCC)}.editor #SidePanel .childObject .light{background-image:url(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==)}.editor #SidePanel .childObject .ui{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAACXBIWXMAAAsTAAALEwEAmpwYAAADjElEQVRYhe2YTWhdRRTHf+lLTFRCkjaLILgIKoIBRRfaSmMFQSsoIrrRuhEqfnTTtV20qHUllIBWcKNQxG4EJWoVEUxKqV8blXYlYv0utr7UtkaN9dfFTMzNfXM/8hJeI/iHYV7OOTP3d+89M3NuulRWs9ZcaIAq/Q+4XJUB3gDsA74BZoDPgaeAdStw3SHgdeD2ykg11baoZ03rS/XKgnGD6niBLxszFedqqpvK4lPG69U/4gTvqneo16lb1e+j/SO1LzF2SD2pbqsBN69SyJTxtTjwPbU75xuLAKr3Zy46FNuoeib6n6kBVwmZAvwuDrqt4K72Rv8LakP9Wv01tqb6T+bCr6rD6og6XQA3rxl1c/56qUXSH/ufCtL229gPxH40Jv0QMAh0ZWIfBG4CNgLjFcthANiWN3YnAn+IweuBown/xtgfAwReAS6NtouAO2P/O/AY8Hb07YqtSNPAwy3WxCt8Oj7yY+q1Od+j6rnovzExtqH+qR5Xb034dxW83ilDjtbKwXXqkTiwqb6o7lDfykw4kZosk2tjBX7UnTm4D4vgigBRr1APFtzthNpTMK5P7S+By0MeLINT6dLCaqYHuAfYFHPsR2AS+Lgkj5aih4ADwMmyoDLAeTUIR9KBleEC4BJgDugFzhIWW1J1ioV9wDuEO14pPQ8cB75gYbtKqgpwN/BA/P0ScMuy0YIGCPvmMIv3zRaVAT4OPJn5+2JCBTK2XDrC6wX4O7ZCFQGOAzuBUyzkx19AH7AXWNsGVC8wQnhyfdHWRXiKw4RTqFUFy3vQcIaOxr1Q9Q1DQTCi9tbYSvJtbdzzThs2cw3n9oz6swVlWtWk/YYiQHV/G1D5do36S+vW6hNFY6oWSTcL53VPG681r6PAfcBsxvYsIW2SqgIUOAE0Cfm4EpoGHom/9wM7yoLrbNRrCMl8btloi7UZeL9q3hTgyyyUTxC2AQmgjYz9MLCnDbANwF3AZYRTZAp4k7BLtCqRmHOJJE5pcokLpNdQGaV0SL2q7iI5XfNJzFaHLNIeQgGb0s2EQmQ47+jUh/t6wslUpquB7XljpwDvbTeuU4CjNeNG8oZOATZrxp3JGzoF+EHNuMN5Q6cAJ4FPKmLmgOfyxhRg6ls5pUZ1yL+aBbYAR0r8W4HP6sCcoKKIjFrq2fwV4QNsO3A3cDnwG3AImAA+TQ2qcxZfUP2n/8O6KrTqAc8D9emWHC8oT9IAAAAASUVORK5CYII=)}.editor #SidePanel .childObject .utils{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAACXBIWXMAAAsTAAALEwEAmpwYAAADFElEQVRYhe2YT0hVQRSHf7YwsUVoakFtKmhdUfhUeLSrrFVQEES72rip1EoscFlLK2jRpl21tT8QhFkLq13gIotqlaRPQ8SkgvRrcefiOO/eufN8LzPwwMV375w5893fnHPm+aoArWZb968BsmwNsFz7rwHzkgYltVdgnRpJZyU9lTQm6ZukUUl9GQwSkHS1AgUimwduAHUpvlnXLmCYYpsFDmXNT3p4AJhICDgC7C0RbgvwISHWGNASEiPpYdLbxvYJ2FQC4F1rbj/w1nx+ERoj6WE78NsDeSIw+E7gh5kzYJ5dM/dzwFbH/yDQ58ZJStAnkm570rY+sDDaTHEgqd88GzJ/ayWdk7Td3Ock3Zd0OrRINgKjKQq+ApoCFOw0/j8tteqAaSvWd6LtjgtyKkRBSZqRdFLS+4SxnKQBSU0ZCsaHfLXlOy3plqRxc79BUTtrNPe/QhWU9cbHgQ7gTYKSm1Pm5YAvlm+bM15PlOvXWSwcgGdurFJaRpOBsu010Oj4tVhbBtAFVHni3rR8z5QDKKNYEmSsZI6lPbTbmZ8HdgPbgMNE1R3bMFBbLqCABgNl20vgmAN30ZnXRXQqzbPYfmIbAXYkrbccwLTtts1VrjvFbxa4Q3GalA0Yb/fzALgua2zcjHcDp0hRrVKAAo4CCx64XmtsksDzt1KAbitx4a5YY1+BPctZZ7lwzfgLwlZuxQFb8LcSW7k5FlNgRbY4R5ToIXATREp3OM9a/xZgjqUnhG9bZ4D91linNTZpYlUU0IVzlbMBIGrE5z0+hVAlQ3POt63uwnZ+XvL4ThCQk5VUbhLYR1StNmSPM+eCM8erZBacr1rtE8JVw21Dlz0vVsCTk2lwDcBnE2CB4oKwz9YCyVvltqOkLw9xC/pIyj9jaYBHrMC9Hris3pYzPmmQPdZYeymAeWviPaAmAS4oyT1KrjexY8uXAlgNPLImP2BpnwtuExakXWxXHbjHZs2SiqQeGKTYpgKVy9ru2IbMWiVXcQxpfy1/t0y4+Go2MWJ7SMYvFVWw9hNwWbYGWK6tesA/ap/6uHJWeiAAAAAASUVORK5CYII=)}.editor #SidePanel .field{align-items:center;background-color:#222;display:flex;flex-direction:row;flex-wrap:wrap;min-height:21px;overflow:hidden;padding:1px;position:relative}.editor #SidePanel .field span{font-family:Arial;font-weight:700;line-height:20px;height:20px;padding:0 5px;max-width:180px;user-select:none;width:fit-content;min-width:20px;text-align:center}.editor #SidePanel .field input{background-color:#191919;block-size:11px;color:#fff;flex:1%;font-family:Arial;min-height:20px;margin:0;padding:4px;outline:none}.editor #SidePanel .field input.min{height:11px;width:30px;margin-right:1px}.editor #SidePanel .field input.color{flex:none;width:60px}.editor #SidePanel .field input[type=checkbox]{appearance:none;background-color:#191919;border:4px solid #191919;cursor:pointer;display:inline-block;flex:none;min-height:16px;width:16px;height:16px;transition:background-color .25s linear}.editor #SidePanel .field input[type=checkbox]:checked{background-color:#ccc}.editor #SidePanel .field input[type=color]{appearance:none;border:none;block-size:revert;cursor:pointer;height:28px;padding-block:revert;padding:0;margin:0}.editor #SidePanel .field input[type=number],.editor #SidePanel .field input[type=range]{appearance:none;height:20px}.editor #SidePanel .field input[type=range]::-webkit-slider-runnable-track{border:none}.editor #SidePanel .field input[type=range]::-webkit-slider-thumb{appearance:none;background-color:#666;cursor:pointer;height:17px;width:17px;transition:.2s linear background-color}.editor #SidePanel .field input[type=range]::-webkit-slider-thumb:hover{background-color:#999}.editor #SidePanel .field textarea{background-color:#191919;color:#fff;font-size:12px;line-height:12px}.editor #SidePanel .field img{border:1px dotted #333;cursor:pointer;object-fit:cover;width:100px;height:100px}.editor #SidePanel .field button{background-color:#333;border-top:1px dotted #444;height:16px;margin:0;padding:0 0 0 5px;text-align:center;transition:.2s background-color linear;width:100%}.editor #SidePanel .field button:hover{background-color:#444}.editor #SidePanel .field.block label{display:inline;line-height:21px;max-width:100%;text-align:left;width:100%}.editor #SidePanel .field select{background-color:#222;border:1px solid #333;color:#fff;cursor:pointer;font-family:Arial;font-size:12px;padding:1px 5px;position:absolute;right:4px}.editor #SidePanel .field option{cursor:pointer}.editor #SidePanel .field .vector2{position:relative;width:100%}.editor #SidePanel .field .vector2 .fields{display:inline-block;margin-bottom:2px;position:relative;overflow:hidden;width:60%}.editor #SidePanel .field .vector2 .fields div{display:block;margin:3px 0}.editor #SidePanel .field .vector2 .fields label{background:none;display:inline-block;width:30px}.editor #SidePanel .field .vector2 .fields input{width:66%}.editor #SidePanel .field .vector2 .input{background-image:url(data:image/gif;base64,R0lGODlhYwBjAIAAABoaGgAAACH/C1hNUCBEYXRhWE1QPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4gPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgOS4xLWMwMDIgNzkuZGJhM2RhM2I1LCAyMDIzLzEyLzE1LTEwOjQyOjM3ICAgICAgICAiPiA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPiA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtbG5zOnhtcE1NPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvbW0vIiB4bWxuczpzdFJlZj0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL3NUeXBlL1Jlc291cmNlUmVmIyIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgMjUuNiAoTWFjaW50b3NoKSIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpCNzgwMTU3OUUxOTcxMUVFOTkyNURCNkFCMTUwREUwNyIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpCNzgwMTU3QUUxOTcxMUVFOTkyNURCNkFCMTUwREUwNyI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOkI3ODAxNTc3RTE5NzExRUU5OTI1REI2QUIxNTBERTA3IiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOkI3ODAxNTc4RTE5NzExRUU5OTI1REI2QUIxNTBERTA3Ii8+IDwvcmRmOkRlc2NyaXB0aW9uPiA8L3JkZjpSREY+IDwveDp4bXBtZXRhPiA8P3hwYWNrZXQgZW5kPSJyIj8+Af/+/fz7+vn49/b19PPy8fDv7u3s6+rp6Ofm5eTj4uHg397d3Nva2djX1tXU09LR0M/OzczLysnIx8bFxMPCwcC/vr28u7q5uLe2tbSzsrGwr66trKuqqainpqWko6KhoJ+enZybmpmYl5aVlJOSkZCPjo2Mi4qJiIeGhYSDgoGAf359fHt6eXh3dnV0c3JxcG9ubWxramloZ2ZlZGNiYWBfXl1cW1pZWFdWVVRTUlFQT05NTEtKSUhHRkVEQ0JBQD8+PTw7Ojk4NzY1NDMyMTAvLi0sKyopKCcmJSQjIiEgHx4dHBsaGRgXFhUUExIREA8ODQwLCgkIBwYFBAMCAQAAIfkEAAAAAAAsAAAAAGMAYwAAAv+Mf4Crm/5gaJA6y+TUGiMfVd0ogYa5cWJJru7Vwqwqv9lsf/Gd0+i/0+FqRB4tVBT2TkGk8XkEDqFOZbKKVUmXKe72yjxaqWFvswzuXgDstvsNj8vn9Lr9Hj+ryfuxP9sHqPfFR/iHxjeoOHUYiNi4aMYIaCg4+UgZmVappVno2YgCmnnpaMrJgao6itmaynoKq4pHW2t7eyurW4q6K/m7KRbqG8wrTAr8aVxKrJw8fBy7/Iyc1gxN7So6XZwtzXVd7dy9hmt+jk4brr1u2r7KnRiPTT4u7w2Pr/fOzzwvTs8epH/sCH6zZjBfvYBR+unjlS6ixIkOFwK09DCjRVfXFQVe5JiwI0MfIj8eFKPQY0FvJVdudBcypkaULU+OPDExp05bNVPefCXzpU+SQVXaxCi0576iP4eCnNm0nVKmSI06PeqSJtWsUUvs/ApWzlSoVbuS5VrW5NW10bC6Zevv7FupW+fWHZs0bl65V/FaHRQ2cGC/ZhHyJUz0cN1tihsb3gv5bzS4ju9FLiz5GOXLJhGj/TxBsOidnu2CW1y69GatlTEPbK0Wlmq6sEH3RY37dG3TQkf7ljj7bm7OoIPLNU4c6O7VDYdnfvw8uuvEyZmntY18QQEAOw==);border:1px solid #333;display:inline-block;width:99px;height:99px;position:absolute;top:50%;transform:translateY(-50%)}.editor #SidePanel .field .vector2 .input .x{background-color:#333;height:.5px;width:100%;position:absolute;top:50%;transform:translateY(-50%)}.editor #SidePanel .field .vector2 .input .y{background-color:#333;height:100%;width:.5px;position:absolute;left:50%;transform:translate(-50%)}.editor #SidePanel .field .vector2 .input .pt{background-color:#fff;border-radius:5px;width:5px;height:5px;position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);z-index:10}.editor #SidePanel .field .grid3{grid-template-columns:repeat(3,1fr)}.editor #SidePanel .field .grid4{grid-template-columns:repeat(4,1fr)}.editor #SidePanel .field .grid3,.editor #SidePanel .field .grid4{display:grid;margin-top:4px}.editor #SidePanel .field .grid3 div,.editor #SidePanel .field .grid4 div{display:flex;overflow:hidden}.editor #SidePanel .field .grid3 div label,.editor #SidePanel .field .grid4 div label{padding:0 10px;line-height:30px;min-width:inherit}.editor #SidePanel .field .grid3 div input,.editor #SidePanel .field .grid4 div input{width:100%}.editor #SidePanel .field .imageField{display:block;height:120px;position:relative}.editor #SidePanel .field .imageField img{display:inline-block}.editor #SidePanel .field .imageField .fields{display:inline-block;position:absolute;top:0;width:170px}.editor #SidePanel .field .imageField .fields div{display:inline-block;width:100%}.editor #SidePanel .field .imageField .fields div label{background:none;display:block;padding:0 5px}.editor #SidePanel .field .imageField .fields div input{width:calc(50% - 10px)}.editor #SidePanel .group{background-color:#191919;margin:2px 0}.editor #SidePanel .group h4{display:inline;font-weight:700;pointer-events:none;width:fit-content}.editor #SidePanel .group .toggleBtn{background-color:#191919;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACcAAAB1CAYAAADN5fjJAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAzklEQVR4nO3bwQqCUBBA0Yz+/5dt1eYRkVfKWZyzUgi5zEJSxm3f99tU96sDPhFXiavEVeIqcZW4anTcYzmf8P9pex2Mnpy4Slwlrhodt96Et7e/usjoyYmrxFXiKnGVuEpcJa4SV4mrxFXiKnGVuEpcJa4SV4mrxFXiKnGVuEpcJa4SV4mrxFXiqtFx69LLUd9sKuZFmtGTE1eJq8RV4ipx1T+2+o9e01b/aeIqcZW46uxWvweckcRV4ipxlbhqdNzZl4c//cJu9ORGxz0BUl8I9T4qXncAAAAASUVORK5CYII=);background-position:1px 1px;background-repeat:no-repeat;background-size:15px 45px;display:inline-block;height:15px;opacity:.8;overflow:hidden;margin:0 0 0 5px;padding-left:20px;width:calc(100% - 7px);transition:all .15s linear}.editor #SidePanel .group .toggleBtn:hover{background-color:#222;opacity:1}.editor #SidePanel .group .fieldItems{border-top:1px dotted #333;overflow-y:auto;user-select:none}.editor .multiview{display:grid;font-family:Arial,Helvetica,sans-serif;font-size:10px;grid-template-columns:auto;position:absolute;overflow:hidden;inset:0 300px 0 0;z-index:1}.editor .multiview canvas{pointer-events:none}.editor .multiview .dropdown{background-color:#222;display:inline-block;font-size:10px;text-align:center}.editor .multiview .dropdown .dropdown-toggle{cursor:pointer;padding:0 10px;height:30px;line-height:30px;overflow:hidden}.editor .multiview .dropdown .dropdown-toggle:hover{background-color:#333}.editor .multiview .dropdown .dropdown-menu{overflow:hidden;position:absolute;top:30px;left:50%;z-index:1;list-style:none;padding:0;margin:0;min-width:100%;width:auto;transform:translate(-50%);transition:all .33s cubic-bezier(.75,0,.25,1)}.editor .multiview .dropdown .dropdown-menu li{background-color:#222;border-top:1px solid #191919;cursor:pointer;height:30px;line-height:30px;padding:0 10px;transition:.2s linear background-color}.editor .multiview .dropdown .dropdown-menu li:hover{background-color:#333}.editor .multiview .cameras{display:grid;grid-template-columns:repeat(2,1fr);pointer-events:visible;position:absolute;width:100%;height:100%}.editor .multiview .cameras.single{grid-template-columns:repeat(1,1fr)}.editor .multiview .cameras .CameraWindow{border:1px dotted #333;border-top:none;border-left:none;pointer-events:visible;position:relative}.editor .multiview .cameras .CameraWindow .clickable{display:inline-block;width:100%;height:100%}.editor .multiview .cameras .CameraWindow .options{position:absolute;height:30px;top:initial;bottom:-1px;left:50%;transform:translate(-50%);width:max-content}.editor .multiview .cameras .CameraWindow .options .dropdown{position:relative;top:0;transition:background-color .25s linear}.editor .multiview .cameras .CameraWindow .options .dropdown.up{background-color:#333;bottom:0;top:initial}.editor .multiview .cameras .CameraWindow .options .dropdown.up .dropdown-menu{top:initial;bottom:100%}.editor .multiview .settings{box-shadow:#00000040 0 1px 1px,#00000026 0 2px 6px;pointer-events:visible;position:absolute;left:50%;transform:translate(-50%)}.editor .multiview .settings .toggle{background-blend-mode:overlay;background-color:#222;background-position:2px 2px;background-repeat:no-repeat;background-size:26px 26px;display:inline-block;position:relative;left:0;transform:none;width:30px;height:30px;overflow:hidden}.editor .multiview .settings .toggle.selected{background-blend-mode:normal}.editor .multiview .connectionStatus{background-color:red;font-weight:700;line-height:30px;padding:0 10px;text-transform:uppercase;position:absolute;left:0;bottom:0;z-index:10}body .tp-dfwv,body .tp-dfwv button,body .tp-dfwv input{text-transform:none}.tp-ckbv{float:right}.tp-dfwv{left:50%;top:0;max-height:100%;overflow-x:hidden;overflow-y:auto;transform:translate(-50%);width:400px;z-index:100}.tp-dfwv .tp-lblv{position:relative}.tp-dfwv .tp-lblv_v{display:inline-block}.tp-dfwv .tp-lblv_v .tp-ckbv{width:20px}.tp-dfwv .tp-lblv_v .tp-fpsv{width:280px}.tp-dfwv .tp-btnv_b{padding:0 5px}.tp-dfwv .tp-btngridv{max-height:100px;overflow-x:hidden;overflow-y:auto}.tp-dfwv .tp-tabv{max-height:90vh;overflow:hidden auto}.tp-dfwv{font-family:Roboto Mono,Source Code Pro,Menlo,Courier,monospace;font-size:10px}.editor #SidePanel{background-color:#0d0d0d;border:1px solid #111;max-height:100%;min-height:20px;overflow-y:auto;pointer-events:visible;position:absolute;right:0;top:0;bottom:0;width:300px}.editor #SidePanel .accordion{border-bottom:1px dotted #333;background-color:#111;line-height:0;resize:vertical;overflow-y:auto}.editor #SidePanel .accordion.hide{resize:none;overflow-y:hidden}.editor #SidePanel .accordion>div{display:grid;grid-template-rows:0fr;margin-left:5px;transition:.33s grid-template-rows cubic-bezier(.645,.045,.355,1)}.editor #SidePanel .accordion>div>div{overflow:hidden}.editor #SidePanel .accordion>div.open{border-top:1px solid #222;grid-template-rows:1fr}.editor #SidePanel .accordion .icon{height:20px;width:20px}.editor #SidePanel .accordion .icon button{text-indent:-9999px;white-space:nowrap}.editor #SidePanel .accordion .toggle{background-color:#333;display:inline-block;font-size:12px;font-weight:700;margin:0;padding:0;position:relative;user-select:none;width:100%;height:20px;transition:background-color .2s linear}.editor #SidePanel .accordion .toggle:hover{background-color:#444}.editor #SidePanel .accordion .toggle p{margin:0;padding:0}.editor #SidePanel .accordion .toggle .label{display:inline;position:absolute;left:25px;top:3px;height:15px;line-height:15px}.editor #SidePanel input{background-color:#222;border:1px dotted #333;font-family:Arial,Helvetica,sans-serif;font-size:12px;padding:4px}.editor #SidePanel button{background-color:transparent;border:none;color:#fff;cursor:pointer;font-family:Arial;font-size:12px;margin:0;padding:0;text-align:left}.editor #SidePanel #options{border-bottom:1px solid #111;display:flex;margin:0;padding:0;list-style-type:none;width:100%}.editor #SidePanel #options .selected{background-color:#222}.editor #SidePanel #options .selected button{pointer-events:none}.editor #SidePanel #options button{min-width:20px;height:20px;text-align:center;width:100%}.editor #SidePanel #options button:hover{background-color:#333}.editor #SidePanel #options li{border-right:1px solid #111;font-size:12px;line-height:20px;min-height:20px;min-width:20px;text-align:center;width:100%}.editor #SidePanel #options li:first-child{border-left:1px solid #111}.editor #SidePanel .status,.editor #SidePanel .refresh,.editor #SidePanel .remove,.editor #SidePanel .visibility{display:inline-block;margin:0;padding:0;overflow:hidden;width:20px;height:20px;text-indent:-9999px;white-space:nowrap}.editor #SidePanel .status{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHgAAAA8CAYAAACtrX6oAAAACXBIWXMAABYlAAAWJQFJUiTwAAAB90lEQVR4nO2cXWoCQRCEy+R0+6QguCE5XwLJtYToIZTOgxFlWd1Vd7p7yvpgXoLJ1NQ3a/wZnZkZBC8v0QFEWSSYHAkmR4LJkWByJJgcCSZHgsmRYHIkmBwJJkeCyZFgciSYHAkmR4LJkWByxghuAKwBbAEsiqa5jzlO+ZrgLH3MAWxwyLd0n93MhsbaTuzMrB3xO15j9Z/pyG+CTNfyufd36130K4BPAG2BvXYrKwBfOGTKSF8+//5G7IJFZxeG7MTOaC9kWgRmunbldnHr79FCIyRnyjJW7i4qc23FZshwj9zWzN4istdUcM1yj7dxl1xL0QxyQyTXUDiTXHfJ2YtnlOu6tswCmOW6rXGKP1Ii5DPIdVnr0y14glHVhp5y4VXcZT04qvuXNHUB6R90ZBNQeo4SRaR+2pCleK+5ShWS9ol/dOHec5YsJuVLd1FFR81dOmS6F9+9C47O4BEy1dtnXsVmyeIVMs0b4CPG4pFCC427Dzh4hrwkObq87jg/g5YpX19/g2fQPI/N/gB4B7A/+9kewAeAb8cct5ApX19/wwTsxLmZbcxsa2bLBFdGdzR2uIq3lueMV7e/Y75m6PYzM33THTP6ZAM5EkyOBJMjweRIMDkSTI4EkyPB5EgwORJMjgSTI8HkSDA5EkyOBJMjweRIMDl/5nU6ICCWVGoAAAAASUVORK5CYII=);background-position-x:2px;background-position-y:2px;background-size:32px 16px}.editor #SidePanel .status.open{background-position-x:18px}.editor #SidePanel .refresh{background-color:transparent;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADwAAAA8CAYAAAA6/NlyAAAACXBIWXMAAAsTAAALEwEAmpwYAAAE1UlEQVRoge2aW2gdRRzGf5vGWMSTVBpNUjWNijHgg6KIRqmtD0UpqA9iFeulijWkllIsKOKb+lbxgr6oLQUFtc2LPgjaImILSq36oKLWkpZC7C1p6zkNXkqSz4c5x2zH3T27s7vnnMR8MBxmzsx/vm/2P/fxJPF/QlO9CdQac4JnO+YEz3Y052y/C7gV6Af6gCuAhUABEDAOnASGgX3AV8Au4Le8CHk5TEttwMPA/cBNuHnR18D7wLvAieyoAZKyChdJelXSaWWHcUmvS1qUFc8sjDRLeiZjoTZOS3pOUktavmld+irgPeC6MAcC9gBfYNx0P6Z/lsr/FzD9vBe4HlgK3AzMC7H3HfAQ8JMz4xSttUJSMeSLnJT0vKRLHex2SNogaTjia9/lyttV7IIQsWOSnpZUSNGQldAkabWkkYB6JiUN1lJwTwCJT5Xh4OILBUmbA+qbkjRQK8FI2lquuCjjgl4OYv1hlaQ/LdGTku5MYiftoNUD/F4OtcAS4GPMYFdBCbgR+CWOgTwWHnljCbADmO9L24sZ3SeqFZ6Ja+ndwONW2g3Axlilq/i8J2mLzKicZ/90CVus/lyS1FmtXDWjT5SNvdkAAu3QKumwJfqVNIK7NT3XTkla3gAi7fCYJbhUbojEgj1JOyxjh6oZq0NolnTQ4rkuqkzYoLUGWG6ldQObkowuNcAE8IaVtjKqQNC01A38ALQG5BdwO7DTkWAe6AJGmJ5xpsppx4My21/YAzYTLDbO//XAEcxJSQVNwC1hmW3BQa5soxFde5cV7w/L6BecREichqkl9lrxvrCMFcEe8BbxXdUDtgILkjLLCfut+OWhOcvD9YDcUI8FyXZHrpK0zZO0GPget4FIwArgE4eyrmgHfgQ6EpYbA66O2i39DbT44ucCZxLTywd3Ax8mLLMSGIraLY1b8fMTVpAnPgKGEuTfXskfJfiUFe9MSCpvPAmMxsg3CqyrRKIED1vxXgdSeWIUMz1Ww1kNEyXYPjIJO3uuJ6q59pD9f5TgPVZ8mRun3LEWOBaQPobPlSuIEvwZZtqpoJ/G68dghA0EpK8lYAMRJfgY8K0v3oy5EWxE2K79H1f+F1VWNeutlcqwzKa73hv/oNAu6aikUZmbzMB81Y5p24FDwHm+tEeAd9J9kNxwb/k3dCCLcy79GrDeFz+K2Y0UU1GrE+KcS28C/vDFO2m8/XBsxBE8Arxgpa0BHsieTv6Ie9XSgrnQvsaX9hdwB+aye8Yg7lXLGeA+zt5QzMdMB0uzJhWBCzAXeM5Icre0D1iNORWsoA2zF16VhkQMeMAGzIxxEHPa4gaH+W4w5DThbUltOcyvF0vaGVBfj4s9VxKDkiYCSByR9KiyWZy0SnpW0omAeoqujZuG0D0ydzlBOCDpKUldDnYXS3pR0qkQ20WZBzVOvNNeiPcC24BrQ/6fxOy6Psc8OfoVOMz04FcALgGuxLzaW4bZhnoh9r7BTIf2KWV8pPjClXCOzMud8ZAvkgWKkjZKmpeWbxaCK2GRpJczFl6S9JLMxiATnnm88ViIcbsHMU8RwtwzDFPAl8AHmMelpejsyZD3o5YO4DbMK5s+4DLgQswJqIfpy8eBA8DPmEux3QSfYGSCmfiKJxVm4iueVJgTPNsxJ3i24x9qO45nn/sZdwAAAABJRU5ErkJggg==);background-position:2px 2px;background-repeat:no-repeat;background-size:16px 16px;position:absolute;right:25px}.editor #SidePanel .remove{background-color:transparent;background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDIwIDIwIj4KICA8ZGVmcz4KICAgIDxzdHlsZT4KICAgICAgLmNscy0xIHsKICAgICAgICBmaWxsOiAjZmZmOwogICAgICAgIHN0cm9rZS13aWR0aDogMHB4OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvZGVmcz4KICA8ZyBpZD0iTGF5ZXJfMyIgZGF0YS1uYW1lPSJMYXllciAzIj4KICAgIDxwYXRoIGNsYXNzPSJjbHMtMSIgZD0iTTE2LDdINGMtLjYsMC0xLC40LTEsMXYxMGMwLC42LjQsMSwxLDFoMTJjLjYsMCwxLS40LDEtMXYtMTBjMC0uNi0uNC0xLTEtMVpNOCwxNS41YzAsLjYtLjQsMS0xLDFoLTFjLS42LDAtMS0uNC0xLTF2LTVjMC0uNi40LTEsMS0xaDFjLjYsMCwxLC40LDEsMXY1Wk0xNSwxNS41YzAsLjYtLjQsMS0xLDFoLTFjLS42LDAtMS0uNC0xLTF2LTVjMC0uNi40LTEsMS0xaDFjLjYsMCwxLC40LDEsMXY1WiIvPgogIDwvZz4KICA8ZyBpZD0iTGF5ZXJfMiIgZGF0YS1uYW1lPSJMYXllciAyIj4KICAgIDxwb2x5Z29uIGNsYXNzPSJjbHMtMSIgcG9pbnRzPSIxIDUgMSAzIDMgMyAzIDEgMTcgMSAxNyAzIDE5IDMgMTkgNSAxIDUiLz4KICA8L2c+Cjwvc3ZnPg==);background-position:2px 2px;background-repeat:no-repeat;background-size:16px 16px;position:absolute;right:5px}.editor #SidePanel .visibility{background-color:transparent;background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyBpZD0iTGF5ZXJfMSIgZGF0YS1uYW1lPSJMYXllciAxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDgwMCA4MDAiPgogIDxkZWZzPgogICAgPHN0eWxlPgogICAgICAuY2xzLTEgewogICAgICAgIGZpbGw6IG5vbmU7CiAgICAgICAgc3Ryb2tlOiAjZmZmOwogICAgICAgIHN0cm9rZS1saW5lY2FwOiByb3VuZDsKICAgICAgICBzdHJva2UtbGluZWpvaW46IHJvdW5kOwogICAgICAgIHN0cm9rZS13aWR0aDogNjYuN3B4OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvZGVmcz4KICA8cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik01MDAsNDAwYzAsNTUuMi00NC44LDEwMC0xMDAsMTAwcy0xMDAtNDQuOC0xMDAtMTAwLDQ0LjgtMTAwLDEwMC0xMDAsMTAwLDQ0LjgsMTAwLDEwMFoiLz4KICA8cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik00MDAsMTY2LjdjLTE0OS4zLDAtMjc1LjYsOTguMS0zMTguMSwyMzMuMyw0Mi41LDEzNS4yLDE2OC44LDIzMy4zLDMxOC4xLDIzMy4zczI3NS42LTk4LjEsMzE4LjEtMjMzLjNjLTQyLjUtMTM1LjItMTY4LjgtMjMzLjMtMzE4LjEtMjMzLjNaIi8+Cjwvc3ZnPg==);background-position:2px 2px;background-repeat:no-repeat;background-size:16px 16px;position:absolute;right:45px}.editor #SidePanel .childObject{background-color:#111;min-height:20px;overflow:hidden}.editor #SidePanel .childObject ::-webkit-scrollbar{width:10px}.editor #SidePanel .childObject ::-webkit-scrollbar-track{background:#0d0d0d}.editor #SidePanel .childObject ::-webkit-scrollbar-thumb{background:#666}.editor #SidePanel .childObject ::-webkit-scrollbar-thumb:hover{background:#999}.editor #SidePanel .childObject .child{background-color:#222;border:none;border-bottom:1px solid #111;height:20px;position:relative}.editor #SidePanel .childObject .child:hover{background-color:#333}.editor #SidePanel .childObject .name{background-color:transparent;font-family:Arial;height:20px;overflow:hidden;position:absolute;left:5px;right:50px;top:50%;transform:translateY(-50%);white-space:nowrap}.editor #SidePanel .childObject .visibility{background-color:transparent;background-image:url(data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHN2ZyBpZD0iTGF5ZXJfMSIgZGF0YS1uYW1lPSJMYXllciAxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZlcnNpb249IjEuMSIgdmlld0JveD0iMCAwIDgwMCA4MDAiPgogIDxkZWZzPgogICAgPHN0eWxlPgogICAgICAuY2xzLTEgewogICAgICAgIGZpbGw6IG5vbmU7CiAgICAgICAgc3Ryb2tlOiAjZmZmOwogICAgICAgIHN0cm9rZS1saW5lY2FwOiByb3VuZDsKICAgICAgICBzdHJva2UtbGluZWpvaW46IHJvdW5kOwogICAgICAgIHN0cm9rZS13aWR0aDogNjYuN3B4OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvZGVmcz4KICA8cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik01MDAsNDAwYzAsNTUuMi00NC44LDEwMC0xMDAsMTAwcy0xMDAtNDQuOC0xMDAtMTAwLDQ0LjgtMTAwLDEwMC0xMDAsMTAwLDQ0LjgsMTAwLDEwMFoiLz4KICA8cGF0aCBjbGFzcz0iY2xzLTEiIGQ9Ik00MDAsMTY2LjdjLTE0OS4zLDAtMjc1LjYsOTguMS0zMTguMSwyMzMuMyw0Mi41LDEzNS4yLDE2OC44LDIzMy4zLDMxOC4xLDIzMy4zczI3NS42LTk4LjEsMzE4LjEtMjMzLjNjLTQyLjUtMTM1LjItMTY4LjgtMjMzLjMtMzE4LjEtMjMzLjNaIi8+Cjwvc3ZnPg==);background-position:0;background-size:contain;height:16px;overflow:hidden;position:absolute;right:25px;top:50%;transform:translateY(-50%);width:16px;white-space:nowrap}.editor #SidePanel .childObject>div{display:grid;grid-template-rows:0fr;transition:.33s grid-template-rows cubic-bezier(.645,.045,.355,1)}.editor #SidePanel .childObject>div.open{grid-template-rows:1fr}.editor #SidePanel .childObject>div .container{padding-left:5px;height:auto;overflow-x:hidden;overflow-y:auto;max-height:200px}.editor #SidePanel .childObject>div .container.closed{height:0;overflow:hidden}.editor #SidePanel .childObject .icon{background-color:transparent;background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAACXBIWXMAAAsTAAALEwEAmpwYAAAEZklEQVRYhe2YW4iVVRTHf4465oSaUNlUjo7SmCBEPVipTWYXoV7qoejykhRCEVQP9pAFSWVBPdRTMNRLWGRaFr2FSShmEQ1KzQymUhpeMky6ONbcfj3sdZpvvvnO8Zy5lA/+YcP51jpr7bVv/7X2nqByNqPu/w7gTDgX4GgxaYR2DcDlwC3AUmAh0ARMDf1fwGGgE9gFfAb8AJyquSe1ljZFXa6+o/Y4FD3qvmh5neomdYXaUEuftQQ3T31d7Y8O96tdal98P69eos5SXwhZn7pb7cgE2qa2jHWAy9Svo4Nf1VfUG9VPQvauWp/5f726MXSb1WvVF9XjIftWvXWsArxdPRSOt5uWCfV+dUDtVJsL7K5Q98aM3xuyVnVr+Dqi3jHaAJepx8Lhe2pTyJvVn6PzVRXsHw7bw+rckDWqb4b8mHrbSAOcp7aHozZ1Wka3NuQfqHUVfExUt8R/n8rI69XXQt6lLijnoxzNTAEeA64GeoDzgbVBI5OBu+J/FwPrg3aK0A1cGL8fB+YAfUFDF4T+SmAN8ATwZ97BBC3MxdeTuGtqOBSYkGklgu/NyIpgtMnxPRDfpd9kdCuBT/MOimawHlgdwW0DPs918AAwH9gK7MjoyqEHWA6sAPYBGzMD6gWWRHCPhL/TQ4dYfPpOxSFYXKDvVE+YaKZamrpZPWmil7xuoXrQxAiL8vqiXHwTaU99BbTndItJe+Zoga4S2oFjpJR4TU7XBXwZs7oyb1gU4DKgH/iCtP+yaAlH+4E/agjwJCkXTwwfeewgLXdrNQEuAn6neIYaSfvwQA3BlXCAdEAaC3TtpEFclVcUHZIm0sauC2f1Ie8lLZGkmbiI8vSSR3fYDYSPyzJ990YfvQxS0r8oopkTJI76jbTUpRMnMI3Ekd2k0qnaenKAxKUNwN+k7ZH1Wxd9nswHWWvBWo7vxg1FSyzwC/AgsIfBJe4DngNWAW1UziB5dAPPAo8CbwPrGLrELcAGYEY1AR4C5pKW5WhOt5c0iwMxiFpQykBdpGo7i7kkwj+eNypa4g5gOsP5ChKX1ZG4sFbMjyDzgyb6mgl8V02AO0mndAnDZ/h70hZoJg2iWswMm37SKuRxA2kGtw/TFKSelipTXesIUt3uWlNd0R78EXifdEheYnixMDlm5BlqKxZmkChqHcOLhdnAxxQkgErl1jbgPM7CcgtS6nkDeDIcbQZ+IpVgk4A7gUtJBcVOKhesS0n5/QjwEYMF6yzg7gjwLVLuLxhi+X3TrH4TZXmbOj2jezrkZyr5JzlY8q/JyKsu+UdzaToaG/uhCvarw/agOscxvjSVWvbaucPBa+d9plvdXlORm7dbELo+9Z6Qjfm1MzuT2Yv7q9HZlpBtdOjFfar6Yeg2qdep6x2ni3upFT19dDj49PGy6emjMQZg6PaY9lkJ4/L0UWqlx6MNDn8g6o2g98fvPEb0eFSOB8+Eoue32Rm6OR200hn0sY0RPr+NNMD/DGf9C+u5AEeLfwBkrdN1844nCgAAAABJRU5ErkJggg==);background-size:20px 20px;display:inline-block;position:absolute;right:5px;top:0;width:20px;height:20px;transform:scale(.8)}.editor #SidePanel .childObject .obj3D{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAACXBIWXMAAAsTAAALEwEAmpwYAAAEZklEQVRYhe2YW4iVVRTHf4465oSaUNlUjo7SmCBEPVipTWYXoV7qoejykhRCEVQP9pAFSWVBPdRTMNRLWGRaFr2FSShmEQ1KzQymUhpeMky6ONbcfj3sdZpvvvnO8Zy5lA/+YcP51jpr7bVv/7X2nqByNqPu/w7gTDgX4GgxaYR2DcDlwC3AUmAh0ARMDf1fwGGgE9gFfAb8AJyquSe1ljZFXa6+o/Y4FD3qvmh5neomdYXaUEuftQQ3T31d7Y8O96tdal98P69eos5SXwhZn7pb7cgE2qa2jHWAy9Svo4Nf1VfUG9VPQvauWp/5f726MXSb1WvVF9XjIftWvXWsArxdPRSOt5uWCfV+dUDtVJsL7K5Q98aM3xuyVnVr+Dqi3jHaAJepx8Lhe2pTyJvVn6PzVRXsHw7bw+rckDWqb4b8mHrbSAOcp7aHozZ1Wka3NuQfqHUVfExUt8R/n8rI69XXQt6lLijnoxzNTAEeA64GeoDzgbVBI5OBu+J/FwPrg3aK0A1cGL8fB+YAfUFDF4T+SmAN8ATwZ97BBC3MxdeTuGtqOBSYkGklgu/NyIpgtMnxPRDfpd9kdCuBT/MOimawHlgdwW0DPs918AAwH9gK7MjoyqEHWA6sAPYBGzMD6gWWRHCPhL/TQ4dYfPpOxSFYXKDvVE+YaKZamrpZPWmil7xuoXrQxAiL8vqiXHwTaU99BbTndItJe+Zoga4S2oFjpJR4TU7XBXwZs7oyb1gU4DKgH/iCtP+yaAlH+4E/agjwJCkXTwwfeewgLXdrNQEuAn6neIYaSfvwQA3BlXCAdEAaC3TtpEFclVcUHZIm0sauC2f1Ie8lLZGkmbiI8vSSR3fYDYSPyzJ990YfvQxS0r8oopkTJI76jbTUpRMnMI3Ekd2k0qnaenKAxKUNwN+k7ZH1Wxd9nswHWWvBWo7vxg1FSyzwC/AgsIfBJe4DngNWAW1UziB5dAPPAo8CbwPrGLrELcAGYEY1AR4C5pKW5WhOt5c0iwMxiFpQykBdpGo7i7kkwj+eNypa4g5gOsP5ChKX1ZG4sFbMjyDzgyb6mgl8V02AO0mndAnDZ/h70hZoJg2iWswMm37SKuRxA2kGtw/TFKSelipTXesIUt3uWlNd0R78EXifdEheYnixMDlm5BlqKxZmkChqHcOLhdnAxxQkgErl1jbgPM7CcgtS6nkDeDIcbQZ+IpVgk4A7gUtJBcVOKhesS0n5/QjwEYMF6yzg7gjwLVLuLxhi+X3TrH4TZXmbOj2jezrkZyr5JzlY8q/JyKsu+UdzaToaG/uhCvarw/agOscxvjSVWvbaucPBa+d9plvdXlORm7dbELo+9Z6Qjfm1MzuT2Yv7q9HZlpBtdOjFfar6Yeg2qdep6x2ni3upFT19dDj49PGy6emjMQZg6PaY9lkJ4/L0UWqlx6MNDn8g6o2g98fvPEb0eFSOB8+Eoue32Rm6OR200hn0sY0RPr+NNMD/DGf9C+u5AEeLfwBkrdN1844nCgAAAABJRU5ErkJggg==)}.editor #SidePanel .childObject .camera{background-image:url(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)}.editor #SidePanel .childObject .interactive{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAACXBIWXMAAAsTAAALEwEAmpwYAAADA0lEQVRYhe2Yu2sUURTGf5uYSJ4EsgqJIkRMEYOFYMBCQcTe57/hs9AqlVpYiChYqREsFBRF8AF2KgpqErQQRKIRi6ghRozEhcSYz+Le1bPD7MzOzm5MkQ+Gc+/Z79z7cfY+5kxGEosZNf9bQByWBKbFsjJiGoEuYC3QAUwC74EPwFTlpHlIKvVplHRS0rSK47KktgRjxj6lEtdJ+hIhzGJO0raFFNghaTYg4oKkPkmdknrlMvsjwNm8EAJrJI2YSZ9IyhbhNkkaMNwZSS3VFrjbTPhC0nLzW6ekDZK6jC8j6ZqJOV9tgTZ7eSF1ks6oEHd9BpHULGnS+2flNldVBK4wAu4Z/0GF47bhHDP+njQCow7qbtO+4209cNy3p4ETwCff34k7FwEGTWw2zTFY6k0y4W2LfwAeA/3AdcNr9PZzGXOEIuomeYbL0BrgvvdlzO8z3tYa37y3b33sKuB5tQTO4zJUDLUhvrkSY0tGOXdxHgpYgNPAU9yaHQP6gB3AS+AB0Ars8fYW8C5+lmS7Khuya88W2dXBmyUXwjmXZhenRUug3xDC2Q9sjRokqcBMSNv6DgH7TH8M2AQMBTh7Tf9o1IRJ16BC2tZ3Ffhp+oPAMPDICw3jRCJNBsNQR+HurjF+y7GJiazakgoMGyxOdJBTCv8vKrEG6yPGawrhBAVWLYP59kVvp4DvuDs6vyluenvJcL6RIKNpDup87BCwEsjxb/FvAdqAcd8fNJwc0G7GicxgUoEzpm3PuYkQ3njAZzl2I0VmMOlfnAM++vZ6CtdWEthXsNEoYlKBv3F3aH6S7ghuFA6Y9pVIZhlvuRvNXTosV4ckiV8duJ/ro/jlCKxVYa3SnyC2SdIrE3skLqbcWqFLhTglqSEmpkPSGxMzGpe9NAKRtCsg8qukw3LlaLPPVqtcYT8Q4OY8L3aeNAKRtF3F8auI/7Wk9lLnSCsQufL0RoTQPKblSta6JONnpIp9As4Cvbjyswd3Rk7hXrUeAiO4czQRKimwKlj0X1iXBKbFH8wWbNSnU+tzAAAAAElFTkSuQmCC)}.editor #SidePanel .childObject .light{background-image:url(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==)}.editor #SidePanel .childObject .ui{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAACXBIWXMAAAsTAAALEwEAmpwYAAADjElEQVRYhe2YTWhdRRTHf+lLTFRCkjaLILgIKoIBRRfaSmMFQSsoIrrRuhEqfnTTtV20qHUllIBWcKNQxG4EJWoVEUxKqV8blXYlYv0utr7UtkaN9dfFTMzNfXM/8hJeI/iHYV7OOTP3d+89M3NuulRWs9ZcaIAq/Q+4XJUB3gDsA74BZoDPgaeAdStw3SHgdeD2ykg11baoZ03rS/XKgnGD6niBLxszFedqqpvK4lPG69U/4gTvqneo16lb1e+j/SO1LzF2SD2pbqsBN69SyJTxtTjwPbU75xuLAKr3Zy46FNuoeib6n6kBVwmZAvwuDrqt4K72Rv8LakP9Wv01tqb6T+bCr6rD6og6XQA3rxl1c/56qUXSH/ufCtL229gPxH40Jv0QMAh0ZWIfBG4CNgLjFcthANiWN3YnAn+IweuBown/xtgfAwReAS6NtouAO2P/O/AY8Hb07YqtSNPAwy3WxCt8Oj7yY+q1Od+j6rnovzExtqH+qR5Xb034dxW83ilDjtbKwXXqkTiwqb6o7lDfykw4kZosk2tjBX7UnTm4D4vgigBRr1APFtzthNpTMK5P7S+By0MeLINT6dLCaqYHuAfYFHPsR2AS+Lgkj5aih4ADwMmyoDLAeTUIR9KBleEC4BJgDugFzhIWW1J1ioV9wDuEO14pPQ8cB75gYbtKqgpwN/BA/P0ScMuy0YIGCPvmMIv3zRaVAT4OPJn5+2JCBTK2XDrC6wX4O7ZCFQGOAzuBUyzkx19AH7AXWNsGVC8wQnhyfdHWRXiKw4RTqFUFy3vQcIaOxr1Q9Q1DQTCi9tbYSvJtbdzzThs2cw3n9oz6swVlWtWk/YYiQHV/G1D5do36S+vW6hNFY6oWSTcL53VPG681r6PAfcBsxvYsIW2SqgIUOAE0Cfm4EpoGHom/9wM7yoLrbNRrCMl8btloi7UZeL9q3hTgyyyUTxC2AQmgjYz9MLCnDbANwF3AZYRTZAp4k7BLtCqRmHOJJE5pcokLpNdQGaV0SL2q7iI5XfNJzFaHLNIeQgGb0s2EQmQ47+jUh/t6wslUpquB7XljpwDvbTeuU4CjNeNG8oZOATZrxp3JGzoF+EHNuMN5Q6cAJ4FPKmLmgOfyxhRg6ls5pUZ1yL+aBbYAR0r8W4HP6sCcoKKIjFrq2fwV4QNsO3A3cDnwG3AImAA+TQ2qcxZfUP2n/8O6KrTqAc8D9emWHC8oT9IAAAAASUVORK5CYII=)}.editor #SidePanel .childObject .utils{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACgAAAAoCAYAAACM/rhtAAAACXBIWXMAAAsTAAALEwEAmpwYAAADFElEQVRYhe2YT0hVQRSHf7YwsUVoakFtKmhdUfhUeLSrrFVQEES72rip1EoscFlLK2jRpl21tT8QhFkLq13gIotqlaRPQ8SkgvRrcefiOO/eufN8LzPwwMV375w5893fnHPm+aoArWZb968BsmwNsFz7rwHzkgYltVdgnRpJZyU9lTQm6ZukUUl9GQwSkHS1AgUimwduAHUpvlnXLmCYYpsFDmXNT3p4AJhICDgC7C0RbgvwISHWGNASEiPpYdLbxvYJ2FQC4F1rbj/w1nx+ERoj6WE78NsDeSIw+E7gh5kzYJ5dM/dzwFbH/yDQ58ZJStAnkm570rY+sDDaTHEgqd88GzJ/ayWdk7Td3Ock3Zd0OrRINgKjKQq+ApoCFOw0/j8tteqAaSvWd6LtjgtyKkRBSZqRdFLS+4SxnKQBSU0ZCsaHfLXlOy3plqRxc79BUTtrNPe/QhWU9cbHgQ7gTYKSm1Pm5YAvlm+bM15PlOvXWSwcgGdurFJaRpOBsu010Oj4tVhbBtAFVHni3rR8z5QDKKNYEmSsZI6lPbTbmZ8HdgPbgMNE1R3bMFBbLqCABgNl20vgmAN30ZnXRXQqzbPYfmIbAXYkrbccwLTtts1VrjvFbxa4Q3GalA0Yb/fzALgua2zcjHcDp0hRrVKAAo4CCx64XmtsksDzt1KAbitx4a5YY1+BPctZZ7lwzfgLwlZuxQFb8LcSW7k5FlNgRbY4R5ToIXATREp3OM9a/xZgjqUnhG9bZ4D91linNTZpYlUU0IVzlbMBIGrE5z0+hVAlQ3POt63uwnZ+XvL4ThCQk5VUbhLYR1StNmSPM+eCM8erZBacr1rtE8JVw21Dlz0vVsCTk2lwDcBnE2CB4oKwz9YCyVvltqOkLw9xC/pIyj9jaYBHrMC9Hris3pYzPmmQPdZYeymAeWviPaAmAS4oyT1KrjexY8uXAlgNPLImP2BpnwtuExakXWxXHbjHZs2SiqQeGKTYpgKVy9ru2IbMWiVXcQxpfy1/t0y4+Go2MWJ7SMYvFVWw9hNwWbYGWK6tesA/ap/6uHJWeiAAAAAASUVORK5CYII=)}.editor .header .dropdown{color:#fff;display:inline-block;margin-right:1px;text-align:left;height:fit-content;min-width:auto;width:max-content}.editor .header .dropdown button{backdrop-filter:blur(2px);background-color:#222c;border:none;color:#ffffff80;font-size:12px;padding:5px 10px;position:relative;text-align:left;min-width:22px;width:100%;height:32px;transition:all .2s linear}.editor .header .dropdown button:hover{background-color:#333c;color:#fff}.editor .header .dropdown button.svg{line-height:0;width:32px}.editor .header .dropdown p{background-color:#222c;display:inline-block;height:22px;margin:0;min-width:22px;padding:5px}.editor .header .dropdown svg{position:relative;left:50%;transform:translate(-50%)}.editor .header .dropdown ul{list-style:none;margin:0;margin-block:0;padding-inline:0;position:absolute;width:max-content}.editor .header .dropdown ul li{border-top:1px solid rgba(17,17,17,.9);display:block;position:relative}.editor .header .dropdown ul li.selected button{background-color:#444c}.editor .header .dropdown ul li.selected button:hover{background-color:#555c}.editor .header .dropdown.subdropdown{min-width:100%}.editor .header .dropdown.subdropdown ul{border-left:1px solid rgba(17,17,17,.9);left:100%;top:-1px}.editor .header .draggable li{cursor:grab;transition:transform .25s ease-out}.editor .header .draggable li.dragging{transform:scale(1.1)}.editor .header .draggable li.dragging div{background-color:#404040}.editor .header .draggable li div{background-color:#222c;line-height:14px;padding:5px 10px;transition:background-color .25s linear}.editor .header .draggable li div:hover{background-color:#333c}.editor .header .draggable li div span{font-size:12px;margin:0 15px 0 10px;padding:0 5px}.editor .header .draggable li div .dragIcon{position:absolute;left:10px}.editor .header .draggable li div .closeIcon{background-color:transparent;padding:0;position:absolute;right:5px;top:50%;min-width:14px;width:14px;height:14px;transform:translateY(-50%);visibility:inherit}.editor .header .draggable li div .closeIcon svg{background-color:transparent;left:0;position:relative}.editor{background:linear-gradient(45deg,#000,#333);font-family:Arial,Helvetica,sans-serif;font-size:12px;left:0;pointer-events:none;position:absolute;top:0;width:100%;height:100%;z-index:100}.editor button{background:none;border:none;color:#fff;display:inline-block;margin:0;padding:0;text-align:left}.editor .header{display:inline-block;pointer-events:visible;position:relative;left:130px;z-index:101}.editor .footer{position:absolute;right:5px;bottom:0}.fsAbsolute{position:absolute;inset:0}.absoluteCenter{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%)}.hidden{display:none;visibility:hidden}.hideText{text-indent:-9999px;white-space:nowrap}
|
package/dist/hermes.es.js
CHANGED
|
@@ -165,8 +165,8 @@ const n_ = ({ mobileTiers: a = [0, 15, 30, 60], desktopTiers: e = [0, 15, 30, 60
|
|
|
165
165
|
W.length || (W = k.filter(([be]) => be.includes(T)));
|
|
166
166
|
const $ = W.length;
|
|
167
167
|
if ($ === 0) return;
|
|
168
|
-
const
|
|
169
|
-
let Z, [we, , , , ue] = $ > 1 ? W.map((be) => [be, s_(
|
|
168
|
+
const Y = T.split(/[.,()\[\]/\s]/g).sort().filter((be, ot, Lt) => ot === 0 || be !== Lt[ot - 1]).join(" ");
|
|
169
|
+
let Z, [we, , , , ue] = $ > 1 ? W.map((be) => [be, s_(Y, be[2])]).sort(([, be], [, ot]) => be - ot)[0][0] : W[0], ge = Number.MAX_VALUE;
|
|
170
170
|
const { devicePixelRatio: ie } = window, Ee = c.width * ie * c.height * ie;
|
|
171
171
|
for (const be of ue) {
|
|
172
172
|
const [ot, Lt] = be, Ir = ot * Lt, Rn = Math.abs(Ee - Ir);
|
|
@@ -771,7 +771,7 @@ class fP {
|
|
|
771
771
|
this.targets[e.id]?.handleEvent(e.data);
|
|
772
772
|
}
|
|
773
773
|
}
|
|
774
|
-
var
|
|
774
|
+
var q = /* @__PURE__ */ ((a) => (a.CUSTOM = "ToolEvents::custom", a.REMOTE_CONNECTED = "ToolEvents::remoteConnected", a.REMOTE_DISCONNECTED = "ToolEvents::remoteDisconnected", a.SELECT_DROPDOWN = "ToolEvents::selectDropdown", a.DRAG_UPDATE = "ToolEvents::dragUpdate", a.ADD_SCENE = "ToolEvents::addScene", a.REFRESH_SCENE = "ToolEvents::refreshScene", a.REMOVE_SCENE = "ToolEvents::removeScene", a.SET_SCENE = "ToolEvents::setScene", a.GET_OBJECT = "ToolEvents::getObject", a.SET_OBJECT = "ToolEvents::setObject", a.CLEAR_OBJECT = "ToolEvents::clearObject", a.UPDATE_OBJECT = "ToolEvents::updateObject", a.CREATE_TEXTURE = "ToolEvents::createTexture", a.REQUEST_METHOD = "ToolEvents::requestMethod", a.ADD_CAMERA = "ToolEvents::addCamera", a.REMOVE_CAMERA = "ToolEvents::removeCamera", a.ADD_GROUP = "ToolEvents::addGroup", a.REMOVE_GROUP = "ToolEvents::removeGroup", a.ADD_SPLINE = "ToolEvents::addSpline", a.ADD_RENDERER = "ToolEvents::addRenderer", a.UPDATE_RENDERER = "ToolEvents::updateRenderer", a))(q || {});
|
|
775
775
|
class mP extends xu {
|
|
776
776
|
assets = {
|
|
777
777
|
audio: /* @__PURE__ */ new Map(),
|
|
@@ -1099,10 +1099,10 @@ class xP extends Su {
|
|
|
1099
1099
|
handleApp(e) {
|
|
1100
1100
|
switch (e.event) {
|
|
1101
1101
|
case "selectComponent":
|
|
1102
|
-
this.app.dispatchEvent({ type:
|
|
1102
|
+
this.app.dispatchEvent({ type: q.SELECT_DROPDOWN, value: e.data });
|
|
1103
1103
|
break;
|
|
1104
1104
|
case "draggableListUpdate":
|
|
1105
|
-
this.app.dispatchEvent({ type:
|
|
1105
|
+
this.app.dispatchEvent({ type: q.DRAG_UPDATE, value: e.data });
|
|
1106
1106
|
break;
|
|
1107
1107
|
}
|
|
1108
1108
|
}
|
|
@@ -1824,16 +1824,16 @@ class SP extends Su {
|
|
|
1824
1824
|
handleApp(e) {
|
|
1825
1825
|
switch (e.event) {
|
|
1826
1826
|
case "getObject":
|
|
1827
|
-
this.app.dispatchEvent({ type:
|
|
1827
|
+
this.app.dispatchEvent({ type: q.GET_OBJECT, value: e.data });
|
|
1828
1828
|
break;
|
|
1829
1829
|
case "updateObject":
|
|
1830
|
-
this.app.dispatchEvent({ type:
|
|
1830
|
+
this.app.dispatchEvent({ type: q.UPDATE_OBJECT, value: e.data });
|
|
1831
1831
|
break;
|
|
1832
1832
|
case "createTexture":
|
|
1833
|
-
this.app.dispatchEvent({ type:
|
|
1833
|
+
this.app.dispatchEvent({ type: q.CREATE_TEXTURE, value: e.data });
|
|
1834
1834
|
break;
|
|
1835
1835
|
case "requestMethod":
|
|
1836
|
-
this.app.dispatchEvent({ type:
|
|
1836
|
+
this.app.dispatchEvent({ type: q.REQUEST_METHOD, value: e.data });
|
|
1837
1837
|
break;
|
|
1838
1838
|
case "refreshScene":
|
|
1839
1839
|
this.app.send({
|
|
@@ -1854,37 +1854,37 @@ class SP extends Su {
|
|
|
1854
1854
|
handleEditor(e) {
|
|
1855
1855
|
switch (e.event) {
|
|
1856
1856
|
case "setObject":
|
|
1857
|
-
this.app.dispatchEvent({ type:
|
|
1857
|
+
this.app.dispatchEvent({ type: q.SET_OBJECT, value: e.data });
|
|
1858
1858
|
break;
|
|
1859
1859
|
case "addScene":
|
|
1860
|
-
this.app.dispatchEvent({ type:
|
|
1860
|
+
this.app.dispatchEvent({ type: q.ADD_SCENE, value: e.data });
|
|
1861
1861
|
break;
|
|
1862
1862
|
case "refreshScene":
|
|
1863
|
-
this.app.dispatchEvent({ type:
|
|
1863
|
+
this.app.dispatchEvent({ type: q.REFRESH_SCENE, value: e.data });
|
|
1864
1864
|
break;
|
|
1865
1865
|
case "removeScene":
|
|
1866
|
-
this.app.dispatchEvent({ type:
|
|
1866
|
+
this.app.dispatchEvent({ type: q.REMOVE_SCENE, value: e.data });
|
|
1867
1867
|
break;
|
|
1868
1868
|
case "setScene":
|
|
1869
|
-
this.app.dispatchEvent({ type:
|
|
1869
|
+
this.app.dispatchEvent({ type: q.SET_SCENE, value: e.data });
|
|
1870
1870
|
break;
|
|
1871
1871
|
case "addCamera":
|
|
1872
|
-
this.app.dispatchEvent({ type:
|
|
1872
|
+
this.app.dispatchEvent({ type: q.ADD_CAMERA, value: e.data });
|
|
1873
1873
|
break;
|
|
1874
1874
|
case "removeCamera":
|
|
1875
|
-
this.app.dispatchEvent({ type:
|
|
1875
|
+
this.app.dispatchEvent({ type: q.REMOVE_CAMERA, value: e.data });
|
|
1876
1876
|
break;
|
|
1877
1877
|
case "addGroup":
|
|
1878
|
-
this.app.dispatchEvent({ type:
|
|
1878
|
+
this.app.dispatchEvent({ type: q.ADD_GROUP, value: e.data });
|
|
1879
1879
|
break;
|
|
1880
1880
|
case "removeGroup":
|
|
1881
|
-
this.app.dispatchEvent({ type:
|
|
1881
|
+
this.app.dispatchEvent({ type: q.REMOVE_GROUP, value: e.data });
|
|
1882
1882
|
break;
|
|
1883
1883
|
case "addSpline":
|
|
1884
|
-
this.app.dispatchEvent({ type:
|
|
1884
|
+
this.app.dispatchEvent({ type: q.ADD_SPLINE, value: e.data });
|
|
1885
1885
|
break;
|
|
1886
1886
|
case "addRenderer":
|
|
1887
|
-
this.app.dispatchEvent({ type:
|
|
1887
|
+
this.app.dispatchEvent({ type: q.ADD_RENDERER, value: e.data });
|
|
1888
1888
|
}
|
|
1889
1889
|
}
|
|
1890
1890
|
// Renderer
|
|
@@ -2042,7 +2042,7 @@ function A_() {
|
|
|
2042
2042
|
}
|
|
2043
2043
|
return null;
|
|
2044
2044
|
}
|
|
2045
|
-
var
|
|
2045
|
+
var Y = Object.assign, Z = 0, we, ue, ge, ie, Ee, ze, at;
|
|
2046
2046
|
function be() {
|
|
2047
2047
|
}
|
|
2048
2048
|
be.__reactDisabledLog = !0;
|
|
@@ -2078,25 +2078,25 @@ function A_() {
|
|
|
2078
2078
|
writable: !0
|
|
2079
2079
|
};
|
|
2080
2080
|
Object.defineProperties(console, {
|
|
2081
|
-
log:
|
|
2081
|
+
log: Y({}, S, {
|
|
2082
2082
|
value: we
|
|
2083
2083
|
}),
|
|
2084
|
-
info:
|
|
2084
|
+
info: Y({}, S, {
|
|
2085
2085
|
value: ue
|
|
2086
2086
|
}),
|
|
2087
|
-
warn:
|
|
2087
|
+
warn: Y({}, S, {
|
|
2088
2088
|
value: ge
|
|
2089
2089
|
}),
|
|
2090
|
-
error:
|
|
2090
|
+
error: Y({}, S, {
|
|
2091
2091
|
value: ie
|
|
2092
2092
|
}),
|
|
2093
|
-
group:
|
|
2093
|
+
group: Y({}, S, {
|
|
2094
2094
|
value: Ee
|
|
2095
2095
|
}),
|
|
2096
|
-
groupCollapsed:
|
|
2096
|
+
groupCollapsed: Y({}, S, {
|
|
2097
2097
|
value: ze
|
|
2098
2098
|
}),
|
|
2099
|
-
groupEnd:
|
|
2099
|
+
groupEnd: Y({}, S, {
|
|
2100
2100
|
value: at
|
|
2101
2101
|
})
|
|
2102
2102
|
});
|
|
@@ -2681,7 +2681,7 @@ function I_(a) {
|
|
|
2681
2681
|
}
|
|
2682
2682
|
function ol(a) {
|
|
2683
2683
|
const [e, t] = Ne(a.open !== void 0 ? a.open : !0), s = !e || a.children === void 0, i = Ge(null), n = () => {
|
|
2684
|
-
a.app.dispatchEvent({ type:
|
|
2684
|
+
a.app.dispatchEvent({ type: q.REMOVE_SCENE, value: a.scene });
|
|
2685
2685
|
};
|
|
2686
2686
|
return /* @__PURE__ */ C.jsxs("div", { className: `accordion ${s ? "hide" : ""}`, children: [
|
|
2687
2687
|
/* @__PURE__ */ C.jsxs(
|
|
@@ -2937,8 +2937,8 @@ function B_(a) {
|
|
|
2937
2937
|
window.removeEventListener("mousemove", T), window.removeEventListener("mouseup", b), x(!1);
|
|
2938
2938
|
}
|
|
2939
2939
|
function T(N) {
|
|
2940
|
-
const k = n.current.getBoundingClientRect(), H = rn(0, 99, N.clientX - k.left) / 99, W = 1 - rn(0, 99, N.clientY - k.top) / 99, $ = vs(Fa(m.min, m.max, H), 3),
|
|
2941
|
-
a.onChange({ target: { value: { x: $, y:
|
|
2940
|
+
const k = n.current.getBoundingClientRect(), H = rn(0, 99, N.clientX - k.left) / 99, W = 1 - rn(0, 99, N.clientY - k.top) / 99, $ = vs(Fa(m.min, m.max, H), 3), Y = vs(Fa(m.min, m.max, W), 3);
|
|
2941
|
+
a.onChange({ target: { value: { x: $, y: Y } } }), d($), f(Y);
|
|
2942
2942
|
}
|
|
2943
2943
|
function E() {
|
|
2944
2944
|
const N = Number(s.current.value);
|
|
@@ -4687,10 +4687,10 @@ class xe extends Va {
|
|
|
4687
4687
|
static groupTitles = [];
|
|
4688
4688
|
static app;
|
|
4689
4689
|
constructor(e) {
|
|
4690
|
-
super(e), this.state = { lastUpdate: Date.now() }, xe.app = e.app, xe.instance = this, xe.app.addEventListener(
|
|
4690
|
+
super(e), this.state = { lastUpdate: Date.now() }, xe.app = e.app, xe.instance = this, xe.app.addEventListener(q.ADD_GROUP, this.addGroup), xe.app.addEventListener(q.REMOVE_GROUP, this.removeGroup);
|
|
4691
4691
|
}
|
|
4692
4692
|
componentWillUnmount() {
|
|
4693
|
-
xe.app.removeEventListener(
|
|
4693
|
+
xe.app.removeEventListener(q.ADD_GROUP, this.addGroup), xe.app.removeEventListener(q.REMOVE_GROUP, this.removeGroup);
|
|
4694
4694
|
}
|
|
4695
4695
|
render() {
|
|
4696
4696
|
return /* @__PURE__ */ C.jsx("div", { className: "customGroups", children: xe.groups }, this.state.lastUpdate);
|
|
@@ -7652,8 +7652,8 @@ class Be {
|
|
|
7652
7652
|
* @return {Matrix4} A reference to this matrix.
|
|
7653
7653
|
*/
|
|
7654
7654
|
multiplyMatrices(e, t) {
|
|
7655
|
-
const s = e.elements, i = t.elements, n = this.elements, r = s[0], o = s[4], l = s[8], c = s[12], h = s[1], u = s[5], d = s[9], p = s[13], f = s[2], m = s[6], y = s[10], g = s[14], x = s[3], _ = s[7], b = s[11], T = s[15], E = i[0], v = i[4], A = i[8], N = i[12], k = i[1], H = i[5], W = i[9], $ = i[13],
|
|
7656
|
-
return n[0] = r * E + o * k + l *
|
|
7655
|
+
const s = e.elements, i = t.elements, n = this.elements, r = s[0], o = s[4], l = s[8], c = s[12], h = s[1], u = s[5], d = s[9], p = s[13], f = s[2], m = s[6], y = s[10], g = s[14], x = s[3], _ = s[7], b = s[11], T = s[15], E = i[0], v = i[4], A = i[8], N = i[12], k = i[1], H = i[5], W = i[9], $ = i[13], Y = i[2], Z = i[6], we = i[10], ue = i[14], ge = i[3], ie = i[7], Ee = i[11], ze = i[15];
|
|
7656
|
+
return n[0] = r * E + o * k + l * Y + c * ge, n[4] = r * v + o * H + l * Z + c * ie, n[8] = r * A + o * W + l * we + c * Ee, n[12] = r * N + o * $ + l * ue + c * ze, n[1] = h * E + u * k + d * Y + p * ge, n[5] = h * v + u * H + d * Z + p * ie, n[9] = h * A + u * W + d * we + p * Ee, n[13] = h * N + u * $ + d * ue + p * ze, n[2] = f * E + m * k + y * Y + g * ge, n[6] = f * v + m * H + y * Z + g * ie, n[10] = f * A + m * W + y * we + g * Ee, n[14] = f * N + m * $ + y * ue + g * ze, n[3] = x * E + _ * k + b * Y + T * ge, n[7] = x * v + _ * H + b * Z + T * ie, n[11] = x * A + _ * W + b * we + T * Ee, n[15] = x * N + _ * $ + b * ue + T * ze, this;
|
|
7657
7657
|
}
|
|
7658
7658
|
/**
|
|
7659
7659
|
* Multiplies every component of the matrix by the given scalar.
|
|
@@ -19922,7 +19922,7 @@ class yi extends En {
|
|
|
19922
19922
|
}]);
|
|
19923
19923
|
for (let A = 0, N = x.length; A < N; ++A) {
|
|
19924
19924
|
const k = x[A], H = k.start, W = k.count;
|
|
19925
|
-
for (let $ = H,
|
|
19925
|
+
for (let $ = H, Y = H + W; $ < Y; $ += 3)
|
|
19926
19926
|
g(
|
|
19927
19927
|
e.getX($ + 0),
|
|
19928
19928
|
e.getX($ + 1),
|
|
@@ -19939,7 +19939,7 @@ class yi extends En {
|
|
|
19939
19939
|
}
|
|
19940
19940
|
for (let A = 0, N = x.length; A < N; ++A) {
|
|
19941
19941
|
const k = x[A], H = k.start, W = k.count;
|
|
19942
|
-
for (let $ = H,
|
|
19942
|
+
for (let $ = H, Y = H + W; $ < Y; $ += 3)
|
|
19943
19943
|
v(e.getX($ + 0)), v(e.getX($ + 1)), v(e.getX($ + 2));
|
|
19944
19944
|
}
|
|
19945
19945
|
}
|
|
@@ -22628,14 +22628,14 @@ class qa extends yi {
|
|
|
22628
22628
|
let d = 0, p = 0;
|
|
22629
22629
|
f("z", "y", "x", -1, -1, s, t, e, r, n, 0), f("z", "y", "x", 1, -1, s, t, -e, r, n, 1), f("x", "z", "y", 1, 1, e, s, t, i, r, 2), f("x", "z", "y", 1, -1, e, s, -t, i, r, 3), f("x", "y", "z", 1, -1, e, t, s, i, n, 4), f("x", "y", "z", -1, -1, e, t, -s, i, n, 5), this.setIndex(l), this.setAttribute("position", new Ot(c, 3)), this.setAttribute("normal", new Ot(h, 3)), this.setAttribute("uv", new Ot(u, 2));
|
|
22630
22630
|
function f(m, y, g, x, _, b, T, E, v, A, N) {
|
|
22631
|
-
const k = b / v, H = T / A, W = b / 2, $ = T / 2,
|
|
22631
|
+
const k = b / v, H = T / A, W = b / 2, $ = T / 2, Y = E / 2, Z = v + 1, we = A + 1;
|
|
22632
22632
|
let ue = 0, ge = 0;
|
|
22633
22633
|
const ie = new R();
|
|
22634
22634
|
for (let Ee = 0; Ee < we; Ee++) {
|
|
22635
22635
|
const ze = Ee * H - $;
|
|
22636
22636
|
for (let at = 0; at < Z; at++) {
|
|
22637
22637
|
const be = at * k - W;
|
|
22638
|
-
ie[m] = be * x, ie[y] = ze * _, ie[g] =
|
|
22638
|
+
ie[m] = be * x, ie[y] = ze * _, ie[g] = Y, c.push(ie.x, ie.y, ie.z), ie[m] = 0, ie[y] = 0, ie[g] = E > 0 ? 1 : -1, h.push(ie.x, ie.y, ie.z), u.push(at / v), u.push(1 - Ee / A), ue += 1;
|
|
22639
22639
|
}
|
|
22640
22640
|
}
|
|
22641
22641
|
for (let Ee = 0; Ee < A; Ee++)
|
|
@@ -27341,7 +27341,7 @@ class yd extends yi {
|
|
|
27341
27341
|
for (let A = 0; A <= n; A++) {
|
|
27342
27342
|
const N = [], k = A / n, H = k * (t - e) + e;
|
|
27343
27343
|
for (let W = 0; W <= i; W++) {
|
|
27344
|
-
const $ = W / i,
|
|
27344
|
+
const $ = W / i, Y = $ * l + o, Z = Math.sin(Y), we = Math.cos(Y);
|
|
27345
27345
|
T.x = H * Z, T.y = -k * s + y, T.z = H * we, u.push(T.x, T.y, T.z), b.set(Z, v, we).normalize(), d.push(b.x, b.y, b.z), p.push($, 1 - k), N.push(f++);
|
|
27346
27346
|
}
|
|
27347
27347
|
m.push(N);
|
|
@@ -27361,12 +27361,12 @@ class yd extends yi {
|
|
|
27361
27361
|
u.push(0, y * k, 0), d.push(0, k, 0), p.push(0.5, 0.5), f++;
|
|
27362
27362
|
const H = f;
|
|
27363
27363
|
for (let W = 0; W <= i; W++) {
|
|
27364
|
-
const
|
|
27364
|
+
const Y = W / i * l + o, Z = Math.cos(Y), we = Math.sin(Y);
|
|
27365
27365
|
v.x = N * we, v.y = y * k, v.z = N * Z, u.push(v.x, v.y, v.z), d.push(0, k, 0), E.x = Z * 0.5 + 0.5, E.y = we * 0.5 * k + 0.5, p.push(E.x, E.y), f++;
|
|
27366
27366
|
}
|
|
27367
27367
|
for (let W = 0; W < i; W++) {
|
|
27368
|
-
const $ = T + W,
|
|
27369
|
-
b === !0 ? h.push(
|
|
27368
|
+
const $ = T + W, Y = H + W;
|
|
27369
|
+
b === !0 ? h.push(Y, Y + 1, $) : h.push(Y + 1, Y, $), A += 3;
|
|
27370
27370
|
}
|
|
27371
27371
|
c.addGroup(g, A, b === !0 ? 1 : 2), g += A;
|
|
27372
27372
|
}
|
|
@@ -32095,15 +32095,15 @@ class DR {
|
|
|
32095
32095
|
if (s !== null)
|
|
32096
32096
|
f = s.max.x - s.min.x, m = s.max.y - s.min.y, y = s.isBox3 ? s.max.z - s.min.z : 1, g = s.min.x, x = s.min.y, _ = s.isBox3 ? s.min.z : 0;
|
|
32097
32097
|
else {
|
|
32098
|
-
const
|
|
32099
|
-
f = Math.floor(v.width *
|
|
32098
|
+
const Y = Math.pow(2, -n);
|
|
32099
|
+
f = Math.floor(v.width * Y), m = Math.floor(v.height * Y), e.isDataArrayTexture || e.isArrayTexture ? y = v.depth : e.isData3DTexture ? y = Math.floor(v.depth * Y) : y = 1, g = 0, x = 0, _ = 0;
|
|
32100
32100
|
}
|
|
32101
32101
|
i !== null ? (b = i.x, T = i.y, E = i.z) : (b = 0, T = 0, E = 0), o.pixelStorei(o.UNPACK_FLIP_Y_WEBGL, t.flipY), o.pixelStorei(o.UNPACK_PREMULTIPLY_ALPHA_WEBGL, t.premultiplyAlpha), o.pixelStorei(o.UNPACK_ALIGNMENT, t.unpackAlignment);
|
|
32102
32102
|
const A = o.getParameter(o.UNPACK_ROW_LENGTH), N = o.getParameter(o.UNPACK_IMAGE_HEIGHT), k = o.getParameter(o.UNPACK_SKIP_PIXELS), H = o.getParameter(o.UNPACK_SKIP_ROWS), W = o.getParameter(o.UNPACK_SKIP_IMAGES);
|
|
32103
32103
|
o.pixelStorei(o.UNPACK_ROW_LENGTH, v.width), o.pixelStorei(o.UNPACK_IMAGE_HEIGHT, v.height), o.pixelStorei(o.UNPACK_SKIP_PIXELS, g), o.pixelStorei(o.UNPACK_SKIP_ROWS, x), o.pixelStorei(o.UNPACK_SKIP_IMAGES, _);
|
|
32104
32104
|
const $ = t.isDataArrayTexture || t.isData3DTexture || t.isArrayTexture;
|
|
32105
32105
|
if (e.isRenderTargetTexture || e.isDepthTexture) {
|
|
32106
|
-
const
|
|
32106
|
+
const Y = l.get(e), Z = l.get(t), we = l.get(Y.renderTarget), ue = l.get(Z.renderTarget), ge = we.framebuffers[Y.cacheKey], ie = ue.framebuffers[Z.cacheKey];
|
|
32107
32107
|
c.bindFramebuffer(o.READ_FRAMEBUFFER, ge), c.bindFramebuffer(o.DRAW_FRAMEBUFFER, ie);
|
|
32108
32108
|
let Ee = o.COLOR_BUFFER_BIT;
|
|
32109
32109
|
e.isDepthTexture && (Ee = o.DEPTH_BUFFER_BIT), o.blitFramebuffer(g, x, f, m, b, T, f, m, Ee, o.NEAREST), c.bindFramebuffer(o.READ_FRAMEBUFFER, null), c.bindFramebuffer(o.DRAW_FRAMEBUFFER, null);
|
|
@@ -32906,7 +32906,7 @@ class sm extends M0 {
|
|
|
32906
32906
|
}
|
|
32907
32907
|
v.indexesGPU = we;
|
|
32908
32908
|
}
|
|
32909
|
-
const k = this.get(N), H = this.renderer.getPixelRatio(), W = this._currentContext.renderTarget, $ = this._isRenderCameraDepthArray(this._currentContext),
|
|
32909
|
+
const k = this.get(N), H = this.renderer.getPixelRatio(), W = this._currentContext.renderTarget, $ = this._isRenderCameraDepthArray(this._currentContext), Y = this._currentContext.activeCubeFace;
|
|
32910
32910
|
if ($) {
|
|
32911
32911
|
const Z = this.get(W.depthTexture);
|
|
32912
32912
|
if (Z.clearedRenderId !== this.renderer._nodes.nodeFrame.renderId) {
|
|
@@ -32914,7 +32914,7 @@ class sm extends M0 {
|
|
|
32914
32914
|
const { stencilBuffer: we } = W;
|
|
32915
32915
|
for (let ue = 0, ge = A.length; ue < ge; ue++)
|
|
32916
32916
|
this.renderer._activeCubeFace = ue, this._currentContext.activeCubeFace = ue, this._setFramebuffer(this._currentContext), this.clear(!1, !0, we, this._currentContext, !1);
|
|
32917
|
-
this.renderer._activeCubeFace =
|
|
32917
|
+
this.renderer._activeCubeFace = Y, this._currentContext.activeCubeFace = Y;
|
|
32918
32918
|
}
|
|
32919
32919
|
}
|
|
32920
32920
|
for (let Z = 0, we = A.length; Z < we; Z++) {
|
|
@@ -32933,7 +32933,7 @@ class sm extends M0 {
|
|
|
32933
32933
|
}
|
|
32934
32934
|
c.bindBufferBase(l.UNIFORM_BUFFER, k.index, v.indexesGPU[Z]), E();
|
|
32935
32935
|
}
|
|
32936
|
-
this._currentContext.activeCubeFace =
|
|
32936
|
+
this._currentContext.activeCubeFace = Y, this.renderer._activeCubeFace = Y;
|
|
32937
32937
|
}
|
|
32938
32938
|
} else
|
|
32939
32939
|
E();
|
|
@@ -36688,8 +36688,8 @@ class l1 {
|
|
|
36688
36688
|
createRenderPipeline(e, t) {
|
|
36689
36689
|
const { object: s, material: i, geometry: n, pipeline: r } = e, { vertexProgram: o, fragmentProgram: l } = r, c = this.backend, h = c.device, u = c.utils, d = c.get(r), p = [];
|
|
36690
36690
|
for (const $ of e.getBindings()) {
|
|
36691
|
-
const
|
|
36692
|
-
p.push(
|
|
36691
|
+
const Y = c.get($);
|
|
36692
|
+
p.push(Y.layout);
|
|
36693
36693
|
}
|
|
36694
36694
|
const f = c.attributeUtils.createShaderVertexBuffers(e);
|
|
36695
36695
|
let m;
|
|
@@ -36704,8 +36704,8 @@ class l1 {
|
|
|
36704
36704
|
const g = this._getColorWriteMask(i), x = [];
|
|
36705
36705
|
if (e.context.textures !== null) {
|
|
36706
36706
|
const $ = e.context.textures;
|
|
36707
|
-
for (let
|
|
36708
|
-
const Z = u.getTextureFormatGPU($[
|
|
36707
|
+
for (let Y = 0; Y < $.length; Y++) {
|
|
36708
|
+
const Z = u.getTextureFormatGPU($[Y]);
|
|
36709
36709
|
x.push({
|
|
36710
36710
|
format: Z,
|
|
36711
36711
|
blend: m,
|
|
@@ -36736,9 +36736,9 @@ class l1 {
|
|
|
36736
36736
|
if ((H === !0 || W === !0) && (H === !0 && (k.format = v, k.depthWriteEnabled = i.depthWrite, k.depthCompare = E), W === !0 && (k.stencilFront = y, k.stencilBack = {}, k.stencilReadMask = i.stencilFuncMask, k.stencilWriteMask = i.stencilWriteMask), i.polygonOffset === !0 && (k.depthBias = i.polygonOffsetUnits, k.depthBiasSlopeScale = i.polygonOffsetFactor, k.depthBiasClamp = 0), N.depthStencil = k), t === null)
|
|
36737
36737
|
d.pipeline = h.createRenderPipeline(N);
|
|
36738
36738
|
else {
|
|
36739
|
-
const $ = new Promise((
|
|
36739
|
+
const $ = new Promise((Y) => {
|
|
36740
36740
|
h.createRenderPipelineAsync(N).then((Z) => {
|
|
36741
|
-
d.pipeline = Z,
|
|
36741
|
+
d.pipeline = Z, Y();
|
|
36742
36742
|
});
|
|
36743
36743
|
});
|
|
36744
36744
|
t.push($);
|
|
@@ -40376,8 +40376,8 @@ function ym(a, e, t, s, i = 1 / 0, n, r) {
|
|
|
40376
40376
|
h = a.x - p, u = a.y - f, d = a.z - m;
|
|
40377
40377
|
const E = (t.x + o * p) * n, v = (t.y + o * f) * n, A = (t.z + o * m) * n;
|
|
40378
40378
|
t.x = (t.x - o * E) * c, t.y = (t.y - o * v) * c, t.z = (t.z - o * A) * c, r.x = h + (p + E) * c, r.y = u + (f + v) * c, r.z = d + (m + A) * c;
|
|
40379
|
-
const N = y - a.x, k = g - a.y, H = x - a.z, W = r.x - y, $ = r.y - g,
|
|
40380
|
-
return N * W + k * $ + H *
|
|
40379
|
+
const N = y - a.x, k = g - a.y, H = x - a.z, W = r.x - y, $ = r.y - g, Y = r.z - x;
|
|
40380
|
+
return N * W + k * $ + H * Y > 0 && (r.x = y, r.y = g, r.z = x, t.x = (r.x - y) / n, t.y = (r.y - g) / n, t.z = (r.z - x) / n), r;
|
|
40381
40381
|
}
|
|
40382
40382
|
function yh(a, e) {
|
|
40383
40383
|
e.set(0, 0), a.forEach((t) => {
|
|
@@ -42378,7 +42378,7 @@ class zN extends Tr {
|
|
|
42378
42378
|
[new Ls(g, i.clone()), [0, 0, -1e3], [0, -Math.PI / 2, 0], [1e6, 1, 1], "helper"]
|
|
42379
42379
|
]
|
|
42380
42380
|
};
|
|
42381
|
-
function
|
|
42381
|
+
function Y(Z) {
|
|
42382
42382
|
const we = new Tr();
|
|
42383
42383
|
for (const ue in Z)
|
|
42384
42384
|
for (let ge = Z[ue].length; ge--; ) {
|
|
@@ -42389,7 +42389,7 @@ class zN extends Tr {
|
|
|
42389
42389
|
}
|
|
42390
42390
|
return we;
|
|
42391
42391
|
}
|
|
42392
|
-
this.gizmo = {}, this.picker = {}, this.helper = {}, this.add(this.gizmo.translate =
|
|
42392
|
+
this.gizmo = {}, this.picker = {}, this.helper = {}, this.add(this.gizmo.translate = Y(T)), this.add(this.gizmo.rotate = Y(A)), this.add(this.gizmo.scale = Y(H)), this.add(this.picker.translate = Y(E)), this.add(this.picker.rotate = Y(k)), this.add(this.picker.scale = Y(W)), this.add(this.helper.translate = Y(v)), this.add(this.helper.rotate = Y(N)), this.add(this.helper.scale = Y($)), this.picker.translate.visible = !1, this.picker.rotate.visible = !1, this.picker.scale.visible = !1;
|
|
42393
42393
|
}
|
|
42394
42394
|
// updateMatrixWorld will update transformations and appearance of individual handles
|
|
42395
42395
|
updateMatrixWorld(e) {
|
|
@@ -42466,7 +42466,7 @@ class xt extends xu {
|
|
|
42466
42466
|
controls = /* @__PURE__ */ new Map();
|
|
42467
42467
|
visibility = /* @__PURE__ */ new Map();
|
|
42468
42468
|
setApp(e, t) {
|
|
42469
|
-
this.app = e, this.three = t, this.app.addEventListener(
|
|
42469
|
+
this.app = e, this.three = t, this.app.addEventListener(q.SET_SCENE, this.setScene);
|
|
42470
42470
|
}
|
|
42471
42471
|
clear() {
|
|
42472
42472
|
for (const e of this.controls.values()) {
|
|
@@ -42866,7 +42866,7 @@ class HN extends Tr {
|
|
|
42866
42866
|
app;
|
|
42867
42867
|
splineDataText = "";
|
|
42868
42868
|
constructor(e, t) {
|
|
42869
|
-
super(), this.name = "Spline Editor", this._camera = e, this.app = t, this.app.addEventListener(
|
|
42869
|
+
super(), this.name = "Spline Editor", this._camera = e, this.app = t, this.app.addEventListener(q.ADD_SPLINE, this.onAddSpline);
|
|
42870
42870
|
}
|
|
42871
42871
|
initDebug() {
|
|
42872
42872
|
this.group = xe.addEditorGroup({
|
|
@@ -42938,7 +42938,7 @@ class HN extends Tr {
|
|
|
42938
42938
|
});
|
|
42939
42939
|
}
|
|
42940
42940
|
dispose() {
|
|
42941
|
-
this.app.removeEventListener(
|
|
42941
|
+
this.app.removeEventListener(q.ADD_SPLINE, this.onAddSpline), xe.removeEditorGroup(this.name);
|
|
42942
42942
|
}
|
|
42943
42943
|
addSpline(e) {
|
|
42944
42944
|
e.draggableScale = this.defaultScale, e.hideTransform(), this.group?.current !== null && e.initDebug(this.group.current), this.add(e), this.currentSpline = e;
|
|
@@ -43120,7 +43120,7 @@ class ht extends Va {
|
|
|
43120
43120
|
"Debug"
|
|
43121
43121
|
];
|
|
43122
43122
|
constructor(e) {
|
|
43123
|
-
super(e), this.app = e.app, this.app.addEventListener(
|
|
43123
|
+
super(e), this.app = e.app, this.app.addEventListener(q.ADD_RENDERER, this.setupRenderer), this.scene = new yu(), this.scene.name = this.scene.uuid = "", this.canvasRef = Ai(), this.containerRef = Ai(), this.tlWindow = Ai(), this.trWindow = Ai(), this.blWindow = Ai(), this.brWindow = Ai();
|
|
43124
43124
|
const t = e.three.app.appID, s = localStorage, i = s.getItem(`${t}_mode`);
|
|
43125
43125
|
this.state = {
|
|
43126
43126
|
mode: i !== null ? i : "Single",
|
|
@@ -43425,13 +43425,10 @@ class ht extends Va {
|
|
|
43425
43425
|
});
|
|
43426
43426
|
}
|
|
43427
43427
|
clear() {
|
|
43428
|
-
this.app.dispatchEvent({ type:
|
|
43429
|
-
|
|
43430
|
-
const s = this.cameraHelpers.get(e.uuid);
|
|
43431
|
-
s && (s.parent?.remove(s), this.helpersContainer.remove(s), s.dispose()), this.cameraHelpers.delete(e.uuid);
|
|
43432
|
-
}
|
|
43428
|
+
this.app.dispatchEvent({ type: q.CLEAR_OBJECT }), xe.removeAllGroups(), this.clearLightHelpers(), this.clearControls(), this.currentTransform !== void 0 && (this.currentTransform.removeEventListener("objectChange", this.onUpdateTransform), xt.instance.remove(this.currentTransform.getHelper().name)), this.currentTransform = void 0, xt.instance.clear(), this.cameras.forEach((e) => {
|
|
43429
|
+
this.editorCameras.indexOf(e.name) < 0 && this.app.dispatchEvent({ type: q.REMOVE_CAMERA, value: e });
|
|
43433
43430
|
}), this.currentCamera = this.debugCamera, this.currentScene = void 0, this.scenes.forEach((e) => {
|
|
43434
|
-
this.app.dispatchEvent({ type:
|
|
43431
|
+
this.app.dispatchEvent({ type: q.REMOVE_SCENE, value: e });
|
|
43435
43432
|
}), this.scenes.clear();
|
|
43436
43433
|
}
|
|
43437
43434
|
// Playback
|
|
@@ -43460,11 +43457,11 @@ class ht extends Va {
|
|
|
43460
43457
|
// Events
|
|
43461
43458
|
enable() {
|
|
43462
43459
|
const e = this.containerRef.current;
|
|
43463
|
-
e.addEventListener("mousemove", this.onMouseMove), e.addEventListener("click", this.onClick), window.addEventListener("keydown", this.onKey), window.addEventListener("resize", this.resize), this.app.addEventListener(
|
|
43460
|
+
e.addEventListener("mousemove", this.onMouseMove), e.addEventListener("click", this.onClick), window.addEventListener("keydown", this.onKey), window.addEventListener("resize", this.resize), this.app.addEventListener(q.ADD_SCENE, this.addScene), this.app.addEventListener(q.SET_SCENE, this.sceneUpdate), this.app.addEventListener(q.REMOVE_SCENE, this.removeScene), this.app.addEventListener(q.ADD_CAMERA, this.addCamera), this.app.addEventListener(q.REMOVE_CAMERA, this.removeCamera), this.app.addEventListener(q.SET_OBJECT, this.onSetSelectedItem), this.app.addEventListener(q.REMOTE_CONNECTED, this.onRemoteConnected), this.app.addEventListener(q.REMOTE_DISCONNECTED, this.onRemoteDisconnected);
|
|
43464
43461
|
}
|
|
43465
43462
|
disable() {
|
|
43466
43463
|
const e = this.containerRef.current;
|
|
43467
|
-
e.removeEventListener("mousemove", this.onMouseMove), e.removeEventListener("click", this.onClick), window.removeEventListener("keydown", this.onKey), window.removeEventListener("resize", this.resize), this.app.removeEventListener(
|
|
43464
|
+
e.removeEventListener("mousemove", this.onMouseMove), e.removeEventListener("click", this.onClick), window.removeEventListener("keydown", this.onKey), window.removeEventListener("resize", this.resize), this.app.removeEventListener(q.ADD_SCENE, this.addScene), this.app.removeEventListener(q.SET_SCENE, this.sceneUpdate), this.app.removeEventListener(q.ADD_CAMERA, this.addCamera), this.app.removeEventListener(q.REMOVE_CAMERA, this.removeCamera), this.app.removeEventListener(q.SET_OBJECT, this.onSetSelectedItem), this.app.removeEventListener(q.REMOTE_CONNECTED, this.onRemoteConnected), this.app.removeEventListener(q.REMOTE_DISCONNECTED, this.onRemoteDisconnected);
|
|
43468
43465
|
}
|
|
43469
43466
|
resize = () => {
|
|
43470
43467
|
this.width = window.innerWidth - 300, this.height = window.innerHeight, this.renderer?.setSize(this.width, this.height);
|
|
@@ -44066,8 +44063,8 @@ function XN(a) {
|
|
|
44066
44063
|
function o() {
|
|
44067
44064
|
t(Rh);
|
|
44068
44065
|
}
|
|
44069
|
-
return a.app.addEventListener(
|
|
44070
|
-
a.app.removeEventListener(
|
|
44066
|
+
return a.app.addEventListener(q.CLEAR_OBJECT, o), a.app.addEventListener(q.SET_SCENE, o), a.app.addEventListener(q.SET_OBJECT, r), () => {
|
|
44067
|
+
a.app.removeEventListener(q.CLEAR_OBJECT, o), a.app.removeEventListener(q.SET_SCENE, o), a.app.removeEventListener(q.SET_OBJECT, r);
|
|
44071
44068
|
};
|
|
44072
44069
|
}, []);
|
|
44073
44070
|
const s = e.type.toLowerCase(), i = e.animations.length > 0 || e.mixer !== void 0, n = s.search("mesh") > -1 || s.search("line") > -1 || s.search("points") > -1;
|
|
@@ -44148,10 +44145,10 @@ class ZN extends Va {
|
|
|
44148
44145
|
const i = ht.instance.renderer;
|
|
44149
44146
|
i && (this.autoClear = i.autoClear, this.autoClearColor = i.autoClearColor, this.autoClearDepth = i.autoClearDepth, this.autoClearStencil = i.autoClearStencil, this.clearAlpha = i.getClearAlpha(), this.toneMapping = i.toneMapping, this.toneMappingExposure = i.toneMappingExposure, i instanceof da && (this.localClippingEnabled = i.localClippingEnabled, i.getClearColor(this.clearColor)));
|
|
44150
44147
|
}
|
|
44151
|
-
this.app.addEventListener(
|
|
44148
|
+
this.app.addEventListener(q.ADD_RENDERER, this.onAddRenderer);
|
|
44152
44149
|
}
|
|
44153
44150
|
componentwillunmount() {
|
|
44154
|
-
this.app.removeEventListener(
|
|
44151
|
+
this.app.removeEventListener(q.ADD_RENDERER, this.onAddRenderer);
|
|
44155
44152
|
}
|
|
44156
44153
|
onAddRenderer = (e) => {
|
|
44157
44154
|
const t = e.value;
|
|
@@ -44397,8 +44394,8 @@ function KN(a) {
|
|
|
44397
44394
|
return;
|
|
44398
44395
|
}
|
|
44399
44396
|
};
|
|
44400
|
-
return wn(() => (a.app.addEventListener(
|
|
44401
|
-
a.app.removeEventListener(
|
|
44397
|
+
return wn(() => (a.app.addEventListener(q.ADD_SCENE, n), a.app.addEventListener(q.REFRESH_SCENE, r), a.app.addEventListener(q.REMOVE_SCENE, o), () => {
|
|
44398
|
+
a.app.removeEventListener(q.ADD_SCENE, n), a.app.removeEventListener(q.REFRESH_SCENE, r), a.app.removeEventListener(q.REMOVE_SCENE, o);
|
|
44402
44399
|
}), []), /* @__PURE__ */ C.jsxs("div", { id: "SidePanel", children: [
|
|
44403
44400
|
/* @__PURE__ */ C.jsx("div", { className: "scenes", children: t }, s),
|
|
44404
44401
|
/* @__PURE__ */ C.jsx(XN, { app: a.app, three: a.three }),
|
|
@@ -44475,8 +44472,8 @@ function EP(a) {
|
|
|
44475
44472
|
console.log("Error requesting method:"), console.log(f), console.log(l), console.log(h);
|
|
44476
44473
|
}
|
|
44477
44474
|
};
|
|
44478
|
-
return a.app.addEventListener(
|
|
44479
|
-
a.app.removeEventListener(
|
|
44475
|
+
return a.app.addEventListener(q.GET_OBJECT, t), a.app.addEventListener(q.UPDATE_OBJECT, i), a.app.addEventListener(q.CREATE_TEXTURE, n), a.app.addEventListener(q.REQUEST_METHOD, r), () => {
|
|
44476
|
+
a.app.removeEventListener(q.GET_OBJECT, t), a.app.removeEventListener(q.UPDATE_OBJECT, i), a.app.removeEventListener(q.CREATE_TEXTURE, n), a.app.removeEventListener(q.REQUEST_METHOD, r);
|
|
44480
44477
|
};
|
|
44481
44478
|
}, []), null;
|
|
44482
44479
|
}
|
|
@@ -44531,7 +44528,7 @@ export {
|
|
|
44531
44528
|
Ah as Spline,
|
|
44532
44529
|
HN as SplineEditor,
|
|
44533
44530
|
CP as ThreeEditor,
|
|
44534
|
-
|
|
44531
|
+
q as ToolEvents,
|
|
44535
44532
|
xt as Transform,
|
|
44536
44533
|
dP as WebworkerEventHandlers,
|
|
44537
44534
|
al as capitalize,
|
package/package.json
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
"module": "./dist/hermes.esm.js",
|
|
8
8
|
"types": "./types/index.d.ts",
|
|
9
9
|
"type": "module",
|
|
10
|
-
"version": "0.0.
|
|
10
|
+
"version": "0.0.172",
|
|
11
11
|
"homepage": "https://github.com/tomorrowevening/hermes#readme",
|
|
12
12
|
"bugs": {
|
|
13
13
|
"url": "https://github.com/tomorrowevening/hermes/issues"
|