@needle-tools/engine 4.8.6-next.7fdd4fa → 4.8.6-next.f3ce848

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.
@@ -141,7 +141,7 @@ void main(){
141
141
  #__vconsole .vc-mask {
142
142
  overflow: hidden;
143
143
  }
144
- `,fo?.prepend(i),s===!0&&Q_()<=0&&fb(),console.log("🌵 Debug console has loaded")}},e.onerror=()=>{console.warn("🌵 Debug console failed to load."+(window.crossOriginIsolated?"This page is using cross-origin isolation, so external scripts can't be loaded.":"")),Ba=!1,ki=null},e.src="https://cdn.jsdelivr.net/npm/vconsole@3.15.1/dist/vconsole.min.js",document.body.appendChild(e)}function Wx(){if(!globalThis.VConsole)return;const s=new VConsole.VConsolePlugin("needle-console","🌵 Inspect glTF"),e=()=>document.querySelector("#__vc_plug_"+s._id+" iframe");return s.on("renderTab",function(t){const i=globalThis["needle:codegen_files"];if(!i||i.length===0)return;let n=globalThis["needle:codegen_files"][0];const o=n.indexOf("?");o>-1&&(n=n.substring(0,o));const a=location.protocol+"//"+location.host+location.pathname+"/"+n,l=encodeURIComponent(a);s.fullUrl="https://viewer.needle.tools?inspect&file="+l;var h='<iframe src="" style="width: 100%; height: 99%; border: none;"></iframe>';t(h)}),s.on("show",function(){const t=e();t&&t.src!==s.fullUrl&&(t.src=s.fullUrl)}),s.on("hide",function(){const t=e();t&&(t.src="")}),s.on("addTopBar",function(t){var i=new Array;i.push({name:"Open in new window ↗",onClick:function(n){window.open(s.fullUrl,"_blank"),ki?.hide()}}),i.push({name:"Reload",onClick:function(n){const o=e();o&&(o.src=s.fullUrl)}}),i.push({name:"Fullscreen",onClick:function(n){const o=e();o.requestFullscreen?o.requestFullscreen():o.webkitRequestFullscreen instanceof Function&&o.webkitRequestFullscreen()}}),t(i)}),s}function Gx(){const s=document.querySelector("#__vconsole .vc-switch");return s||null}function Hx(){const s=document.querySelector("#__vconsole");return s||null}const pb=w("debugdefines");Ys('if(!globalThis["NEEDLE_ENGINE_VERSION"]) globalThis["NEEDLE_ENGINE_VERSION"] = "0.0.0";');Ys('if(!globalThis["NEEDLE_ENGINE_GENERATOR"]) globalThis["NEEDLE_ENGINE_GENERATOR"] = "unknown";');Ys('if(!globalThis["NEEDLE_PROJECT_BUILD_TIME"]) globalThis["NEEDLE_PROJECT_BUILD_TIME"] = "unknown";');Ys('if(!globalThis["NEEDLE_PUBLIC_KEY"]) globalThis["NEEDLE_PUBLIC_KEY"] = "unknown";');Ys('globalThis["__NEEDLE_ENGINE_VERSION__"] = "4.8.6";');Ys('globalThis["__NEEDLE_ENGINE_GENERATOR__"] = "undefined";');Ys('globalThis["__NEEDLE_PROJECT_BUILD_TIME__"] = "Thu Aug 21 2025 19:35:23 GMT+0000 (Coordinated Universal Time)";');Ys('globalThis["__NEEDLE_PUBLIC_KEY__"] = "'+NEEDLE_PUBLIC_KEY+'";');const Zi="4.8.6",Od="undefined",$p="Thu Aug 21 2025 19:35:23 GMT+0000 (Coordinated Universal Time)";pb&&console.log(`Engine version: ${Zi} (generator: ${Od})
144
+ `,fo?.prepend(i),s===!0&&Q_()<=0&&fb(),console.log("🌵 Debug console has loaded")}},e.onerror=()=>{console.warn("🌵 Debug console failed to load."+(window.crossOriginIsolated?"This page is using cross-origin isolation, so external scripts can't be loaded.":"")),Ba=!1,ki=null},e.src="https://cdn.jsdelivr.net/npm/vconsole@3.15.1/dist/vconsole.min.js",document.body.appendChild(e)}function Wx(){if(!globalThis.VConsole)return;const s=new VConsole.VConsolePlugin("needle-console","🌵 Inspect glTF"),e=()=>document.querySelector("#__vc_plug_"+s._id+" iframe");return s.on("renderTab",function(t){const i=globalThis["needle:codegen_files"];if(!i||i.length===0)return;let n=globalThis["needle:codegen_files"][0];const o=n.indexOf("?");o>-1&&(n=n.substring(0,o));const a=location.protocol+"//"+location.host+location.pathname+"/"+n,l=encodeURIComponent(a);s.fullUrl="https://viewer.needle.tools?inspect&file="+l;var h='<iframe src="" style="width: 100%; height: 99%; border: none;"></iframe>';t(h)}),s.on("show",function(){const t=e();t&&t.src!==s.fullUrl&&(t.src=s.fullUrl)}),s.on("hide",function(){const t=e();t&&(t.src="")}),s.on("addTopBar",function(t){var i=new Array;i.push({name:"Open in new window ↗",onClick:function(n){window.open(s.fullUrl,"_blank"),ki?.hide()}}),i.push({name:"Reload",onClick:function(n){const o=e();o&&(o.src=s.fullUrl)}}),i.push({name:"Fullscreen",onClick:function(n){const o=e();o.requestFullscreen?o.requestFullscreen():o.webkitRequestFullscreen instanceof Function&&o.webkitRequestFullscreen()}}),t(i)}),s}function Gx(){const s=document.querySelector("#__vconsole .vc-switch");return s||null}function Hx(){const s=document.querySelector("#__vconsole");return s||null}const pb=w("debugdefines");Ys('if(!globalThis["NEEDLE_ENGINE_VERSION"]) globalThis["NEEDLE_ENGINE_VERSION"] = "0.0.0";');Ys('if(!globalThis["NEEDLE_ENGINE_GENERATOR"]) globalThis["NEEDLE_ENGINE_GENERATOR"] = "unknown";');Ys('if(!globalThis["NEEDLE_PROJECT_BUILD_TIME"]) globalThis["NEEDLE_PROJECT_BUILD_TIME"] = "unknown";');Ys('if(!globalThis["NEEDLE_PUBLIC_KEY"]) globalThis["NEEDLE_PUBLIC_KEY"] = "unknown";');Ys('globalThis["__NEEDLE_ENGINE_VERSION__"] = "4.8.6";');Ys('globalThis["__NEEDLE_ENGINE_GENERATOR__"] = "undefined";');Ys('globalThis["__NEEDLE_PROJECT_BUILD_TIME__"] = "Tue Aug 26 2025 08:09:54 GMT+0000 (Coordinated Universal Time)";');Ys('globalThis["__NEEDLE_PUBLIC_KEY__"] = "'+NEEDLE_PUBLIC_KEY+'";');const Zi="4.8.6",Od="undefined",$p="Tue Aug 26 2025 08:09:54 GMT+0000 (Coordinated Universal Time)";pb&&console.log(`Engine version: ${Zi} (generator: ${Od})
145
145
  Project built at ${$p}`);const Br=NEEDLE_PUBLIC_KEY,ss="needle_isActiveInHierarchy",wo="builtin_components",wl="needle_editor_guid";function Ys(s){try{(0,eval)(s)}catch(e){pb&&console.error(e)}}let mb,Jg=null;function Ji(){return mb}function Wp(s){if(s==null){console.warn("Oh no: someone tried registering a non-existend gltf-loader. When you see this log it might mean that needle-engine is being imported multiple times. Please check your project setup.");return}Jg!==s&&(Jg=s,mb=new s)}const ii=Symbol("shadowDomOwner"),qx=w("debugpatch");function kd(s,e,t,i){const n=qx===e;if(!t&&!i)return;const o=e+"___needle";Qx(s,e,t,i);const r=Object.getOwnPropertyDescriptor(s,e),a=s[e];n&&console.log("Patch",s.constructor.name,e,r,a),r?(n&&console.log("Apply patch with existing descriptor",s.constructor.name,e,r),typeof r.value=="function"&&(s[e]=ty(r.value,s,e))):(n&&console.log("Create patch with new property",s.constructor.name,e,r),Object.defineProperty(s,e,{set:function(l){if(typeof l=="function")this[o]=ty(l,s,e);else{const h=this[o];gb(s,e,this,h,l),this[o]=l,yb(s,e,this,h,l)}},get:function(){const l=this[o];return typeof l=="function"&&l[o]?l[o]:l}}))}function Xx(s,e,t){const i=Gp(s,e);if(i)for(let n=i.length-1;n>=0;n--){const o=i[n];o.prefix===t&&(o.prefix=null),o.postfix===t&&(o.postfix=null),!o.prefix&&!o.postfix&&i.splice(n,1)}}const ey=Symbol("Needle:Patches:WrappedFunction");function ty(s,e,t){if(s[ey])return s;const i=function(...n){gb(e,t,this,...n);const o=s.apply(this,n);return yb(e,t,this,o,...n),o};return i[ey]=!0,i}const Rh="Needle:Patches";function $f(){return globalThis[Rh]||(globalThis[Rh]=new WeakMap),globalThis[Rh]}function Gp(s,e){const t=$f().get(s);return t?t.get(e):null}function Qx(s,e,t,i){let n=$f().get(s);n||(n=new Map,$f().set(s,n));let o=n.get(e);o||(o=[],n.set(e,o)),o.push({prefix:t,postfix:i})}function gb(s,e,t,...i){if(!t)return;const n=Gp(s,e);if(n)for(const o of n)o.prefix?.call(t,...i)}function yb(s,e,t,i,...n){if(!t)return;const o=Gp(s,e);if(o)for(const r of o)r.postfix?.call(t,i,...n)}const ea=[];function Rd(s){ea.indexOf(s)===-1&&ea.push(s)}function Yx(s){const e=ea.indexOf(s);e!==-1&&ea.splice(e,1)}const ta=[];function Hp(s){ta.indexOf(s)===-1&&ta.push(s)}function Kx(s){const e=ta.indexOf(s);e!==-1&&ta.splice(e,1)}function _b(s){globalThis.dispatchEvent(new CustomEvent("needle-xrsession-start",{detail:s}));for(let e=0;e<ea.length;e++)ea[e](s)}function bb(s){globalThis.dispatchEvent(new CustomEvent("needle-xrsession-end",{detail:s}));for(let e=0;e<ta.length;e++)ta[e](s)}const He=w("debuginput");var Ed=(s=>(s.Mouse="mouse",s.Touch="touch",s.Controller="controller",s.Hand="hand",s))(Ed||{}),we=(s=>(s.PointerDown="pointerdown",s.PointerUp="pointerup",s.PointerMove="pointermove",s.KeyDown="keydown",s.KeyUp="keyup",s.KeyPressed="keypress",s))(we||{});class Xn extends PointerEvent{clientZ;deviceIndex;origin;source;mode;get isSpatial(){return this.mode!="screen"}get ray(){return this._ray||(this._ray=new c.Ray(this.space.worldPosition.clone(),this.space.worldForward.clone())),this._ray}set ray(e){this._ray=e}get hasRay(){return this._ray!==void 0}_ray;space;isClick=!1;isDoubleClick=!1;get used(){return this._used}_used=!1;use(){this._used=!0}get pointerId(){return this._pointerid}_pointerid;get pointerType(){return this._pointerType}_pointerType;get type(){return this._type}_type;metadata={};intersections=new Array;constructor(e,t,i){super(e,i),this.clientZ=i.clientZ,this._pointerid=i.pointerId,this._pointerType=i.pointerType,this._type=e,this.deviceIndex=i.deviceIndex,this.origin=i.origin,this.source=t,this.mode=i.mode,this._ray=i.ray,this.space=i.device}_immediatePropagationStopped=!1;get immediatePropagationStopped(){return this._immediatePropagationStopped}_propagationStopped=!1;get propagationStopped(){return this._immediatePropagationStopped||this._propagationStopped}stopImmediatePropagation(){this._immediatePropagationStopped=!0,super.stopImmediatePropagation(),this.source?.stopImmediatePropagation()}stopPropagation(){this._propagationStopped=!0,super.stopPropagation(),this.source?.stopPropagation(),He&&console.warn("Stop propagation...",this.pointerId,this.pointerType)}}class il extends KeyboardEvent{source;constructor(e,t,i){super(e,i),this.source=t}stopImmediatePropagation(){super.stopImmediatePropagation(),this.source?.stopImmediatePropagation()}}class Zx{key;keyType;source;constructor(e){this.key=e.key,this.keyType=e.type,this.source=e}}var Vt=(s=>(s[s.Early=-100]="Early",s[s.Default=0]="Default",s[s.Late=100]="Late",s))(Vt||{});class vb{_eventListeners={};addEventListener(e,t,i){if(this._eventListeners[e]||(this._eventListeners[e]=[]),!t||typeof t!="function"){console.error("Invalid call to addEventListener: callback is required and must be a function!");return}i?i={...i}:i={};let n=0;i?.queue!=null&&(n=i.queue);const o=this._eventListeners[e],r=o.find(a=>a.priority===n);r?r.listeners.push({callback:t,options:i}):(o.push({priority:n,listeners:[{callback:t,options:i}]}),o.sort((a,l)=>a.priority-l.priority))}removeEventListener(e,t,i){if(!this._eventListeners[e]||!t)return;const n=this._eventListeners[e];if(i?.queue!=null){const o=n.find(a=>a.priority===i.queue);if(!o)return;const r=o.listeners.findIndex(a=>a.callback===t);r>=0&&o.listeners.splice(r,1)}else for(const o of n){const r=o.listeners.findIndex(a=>a.callback===t);r>=0&&o.listeners.splice(r,1)}}dispatchEvent(e){let t=!1;if(e instanceof il){const i=this._eventListeners[e.type];if(i)for(const n of i)for(let o=0;o<n.listeners.length;o++){const r=n.listeners[o];if(r.options?.signal?.aborted){n.listeners.splice(o,1),o--;continue}r.options.once&&(n.listeners.splice(o,1),o--),r.callback(e)}}if(e instanceof Xn){const i=this._eventListeners[e.type];if(i)for(const n of i){if(t)break;for(let o=0;o<n.listeners.length;o++){const r=n.listeners[o];if(r.options?.signal?.aborted){n.listeners.splice(o,1),o--;continue}if(e.immediatePropagationStopped){t=!0,He&&console.log("immediatePropagationStopped",e.type);break}else e.propagationStopped&&(t=!0,He&&console.log("propagationStopped",e.type));r.options.once&&(n.listeners.splice(o,1),o--),r.callback(e)}}}}_doubleClickTimeThreshold=.2;_longPressTimeThreshold=1;get mousePosition(){return this._pointerPositions[0]}get mousePositionRC(){return this._pointerPositionsRC[0]}get mouseDown(){return this._pointerDown[0]}get mouseUp(){return this._pointerUp[0]}get mouseClick(){return this._pointerClick[0]}get mouseDoubleClick(){return this._pointerDoubleClick[0]}get mousePressed(){return this._pointerPressed[0]}get mouseWheelChanged(){return this.getMouseWheelChanged(0)}get click(){return this._pointerClick[0]}get doubleClick(){return this._pointerDoubleClick[0]}getGamepad(e=0){return typeof navigator<"u"&&"getGamepads"in navigator&&navigator.getGamepads()[e]||null}_setCursorTypes=[];setCursorPointer(){this.setCursor("pointer")}setCursorNormal(){this.unsetCursor("pointer")}setCursor(e){this._setCursorTypes.push(e),this._setCursorTypes.length>10&&this._setCursorTypes.shift(),this.updateCursor()}unsetCursor(e){for(let t=this._setCursorTypes.length-1;t>=0;t--)if(this._setCursorTypes[t]===e){this._setCursorTypes.splice(t,1),this.updateCursor();break}}updateCursor(){this._setCursorTypes?.length==0?this.context.domElement.style.cursor="default":this.context.domElement.style.cursor=this._setCursorTypes[this._setCursorTypes.length-1]}getIsPointerIdInUse(e){for(const t of this._pointerEventsPressed)if(t.pointerId===e&&t.used)return!0;return!1}getPointerPressedCount(){let e=0;for(let t=0;t<this._pointerPressed.length;t++)this._pointerPressed[t]&&e++;return e}getPointerPosition(e){return e>=this._pointerPositions.length?null:this._pointerPositions[e]}getPointerPositionLastFrame(e){return e>=this._pointerPositionsLastFrame.length?null:this._pointerPositionsLastFrame[e]}getPointerPositionDelta(e){return e>=this._pointerPositionsDelta.length?null:this._pointerPositionsDelta[e]}getPointerPositionRC(e){return e>=this._pointerPositionsRC.length?null:this._pointerPositionsRC[e]}getPointerDown(e){return e>=this._pointerDown.length?!1:this._pointerDown[e]}getPointerUp(e){return e>=this._pointerUp.length?!1:this._pointerUp[e]}getPointerPressed(e){return e>=this._pointerPressed.length?!1:this._pointerPressed[e]}getPointerClicked(e){return e>=this._pointerClick.length?!1:this._pointerClick[e]}getPointerDoubleClicked(e){return e>=this._pointerDoubleClick.length?!1:this._pointerDoubleClick[e]}getPointerDownTime(e){return e>=this._pointerDownTime.length?-1:this._pointerDownTime[e]}getPointerUpTime(e){return e>=this._pointerUpTime.length?-1:this._pointerUpTime[e]}getPointerLongPress(e){return e>=this._pointerDownTime.length?!1:this.getPointerPressed(e)&&this.context.time.time-this._pointerDownTime[e]>this._longPressTimeThreshold}getIsMouse(e){return e<0||e>=this._pointerTypes.length?!1:this._pointerTypes[e]==="mouse"}getIsTouch(e){return e<0||e>=this._pointerTypes.length?!1:this._pointerTypes[e]==="touch"}getTouchesPressedCount(){let e=0;for(let t=0;t<this._pointerPressed.length;t++)this._pointerPressed[t]&&this.getIsTouch(t)&&e++;return e}getMouseWheelChanged(e=0){return e>=this._mouseWheelChanged.length?!1:this._mouseWheelChanged[e]}getMouseWheelDeltaY(e=0){return e>=this._mouseWheelDeltaY.length?0:this._mouseWheelDeltaY[e]}getPointerEvent(e){if(!(e>=this._pointerEvent.length))return this._pointerEvent[e]??void 0}*foreachPointerId(e){for(let t=0;t<this._pointerTypes.length;t++)if(this._pointerIsActive(t)){if(e!==void 0){const i=this._pointerTypes[t];if(Array.isArray(e)){let n=!1;for(const o of e)if(i===o){n=!0;break}if(!n)continue}else if(e!==i)continue}yield t}}*foreachTouchId(){for(let e=0;e<this._pointerTypes.length;e++)this._pointerTypes[e]==="touch"&&this._pointerIsActive[e]&&(yield e)}_pointerIsActive(e){return e<0?!1:this._pointerPressed[e]||this._pointerDown[e]||this._pointerUp[e]}context;_pointerDown=[!1];_pointerUp=[!1];_pointerClick=[!1];_pointerDoubleClick=[!1];_pointerPressed=[!1];_pointerPositions=[new c.Vector2];_pointerPositionsLastFrame=[new c.Vector2];_pointerPositionsDelta=[new c.Vector2];_pointerPositionsRC=[new c.Vector2];_pointerPositionDown=[new c.Vector3];_pointerDownTime=[];_pointerUpTime=[];_pointerUpTimestamp=[];_pointerIds=[];_pointerTypes=[""];_mouseWheelChanged=[!1];_mouseWheelDeltaY=[0];_pointerEvent=[];_pointerEventsPressed=[];_pointerSpace=[];_pressedStack=new Map;onDownButton(e,t){let i=this._pressedStack.get(e);i||(i=[],this._pressedStack.set(e,i)),i.push(t)}onReleaseButton(e,t){const i=this._pressedStack.get(e);if(!i)return;const n=i.indexOf(t);n>=0&&i.splice(n,1)}getFirstPressedButtonForPointer(e){const t=this._pressedStack.get(e);if(t)return t[0]}getLatestPressedButtonForPointer(e){const t=this._pressedStack.get(e);if(t)return t[t.length-1]}getKeyDown(e){if(e!==void 0)return this.isKeyDown(e);for(const t in this.keysPressed){const i=this.keysPressed[t];if(i.startFrame===this.context.time.frameCount)return i.key}return null}getKeyPressed(e){if(e!==void 0)return this.isKeyPressed(e);for(const t in this.keysPressed){const i=this.keysPressed[t];if(i.pressed)return i.key}return null}getKeyUp(e){if(e!==void 0)return this.isKeyUp(e);for(const t in this.keysPressed){const i=this.keysPressed[t];return i.pressed===!1&&i.frame===this.context.time.frameCount}return null}isKeyDown(e){if(!this.context.application.isVisible||!this.context.application.hasFocus)return!1;const t=this.getCodeForCommonKeyName(e);if(t!==null){for(const n of t)if(this.isKeyDown(n))return!0;return!1}const i=this.keysPressed[e];return i?i.startFrame===this.context.time.frameCount&&i.pressed:!1}isKeyUp(e){if(!this.context.application.isVisible||!this.context.application.hasFocus)return!1;const t=this.getCodeForCommonKeyName(e);if(t!==null){for(const n of t)if(this.isKeyUp(n))return!0;return!1}const i=this.keysPressed[e];return i?i.frame===this.context.time.frameCount&&i.pressed===!1:!1}isKeyPressed(e){if(!this.context.application.isVisible||!this.context.application.hasFocus)return!1;const t=this.getCodeForCommonKeyName(e);if(t!==null){for(const n of t)if(this.isKeyPressed(n))return!0;return!1}const i=this.keysPressed[e];return i&&i.pressed||!1}getCodeForCommonKeyName(e){if(e.length===1){if(e>="0"&&e<="9")return["Digit"+e];if(e>="a"&&e<="z")return["Key"+e.toUpperCase()];if(e==" ")return["Space"]}switch(e){case"shift":case"Shift":return["ShiftLeft","ShiftRight"];case"control":case"Control":return["ControlLeft","ControlRight"];case"alt":case"Alt":return["AltLeft","AltRight"]}return null}createInputEvent(e){switch(e.type){case"pointerdown":He&&Se("Create Pointer down"),this.onDownButton(e.deviceIndex,e.button),this.onDown(e);break;case"pointermove":He&&Se("Create Pointer move"),this.onMove(e);break;case"pointerup":He&&Se("Create Pointer up"),this.onUp(e),this.onReleaseButton(e.deviceIndex,e.button);break}}convertScreenspaceToRaycastSpace(e){return e.x=(e.x-this.context.domX)/this.context.domWidth*2-1,e.y=-((e.y-this.context.domY)/this.context.domHeight)*2+1,e}constructor(e){this.context=e,this.context.post_render_callbacks.push(this.onEndOfFrame)}_htmlEventSource;bindEvents(){this.unbindEvents(),this._htmlEventSource=this.context.renderer.domElement,window.addEventListener("contextmenu",this.onContextMenu),this._htmlEventSource.addEventListener("pointerdown",this.onPointerDown,{passive:!0}),window.addEventListener("pointermove",this.onPointerMove,{passive:!0,capture:!0}),window.addEventListener("pointerup",this.onPointerUp,{passive:!0}),window.addEventListener("pointercancel",this.onPointerCancel,{passive:!0}),window.addEventListener("touchstart",this.onTouchStart,{passive:!0}),window.addEventListener("touchmove",this.onTouchMove,{passive:!0}),window.addEventListener("touchend",this.onTouchEnd,{passive:!0}),this._htmlEventSource.addEventListener("wheel",this.onMouseWheel,{passive:!0}),window.addEventListener("wheel",this.onWheelWindow,{passive:!0}),window.addEventListener("keydown",this.onKeyDown,!1),window.addEventListener("keypress",this.onKeyPressed,!1),window.addEventListener("keyup",this.onKeyUp,!1),window.addEventListener("blur",this.onLostFocus)}unbindEvents(){for(const e in this._eventListeners)this._eventListeners[e].length=0;window.removeEventListener("contextmenu",this.onContextMenu),this._htmlEventSource?.removeEventListener("pointerdown",this.onPointerDown),window.removeEventListener("pointermove",this.onPointerMove),window.removeEventListener("pointerup",this.onPointerUp),window.removeEventListener("pointercancel",this.onPointerCancel),window.removeEventListener("touchstart",this.onTouchStart),window.removeEventListener("touchmove",this.onTouchMove),window.removeEventListener("touchend",this.onTouchEnd),this._htmlEventSource?.removeEventListener("wheel",this.onMouseWheel,!1),window.removeEventListener("wheel",this.onWheelWindow,!1),window.removeEventListener("keydown",this.onKeyDown,!1),window.removeEventListener("keypress",this.onKeyPressed,!1),window.removeEventListener("keyup",this.onKeyUp,!1),window.removeEventListener("blur",this.onLostFocus)}dispose(){const e=this.context.post_render_callbacks.indexOf(this.onEndOfFrame);e>=0&&this.context.post_render_callbacks.splice(e,1),this.unbindEvents()}onLostFocus=()=>{for(const e in this.keysPressed)this.keysPressed[e].pressed=!1};_receivedPointerMoveEventsThisFrame=new Array;onEndOfFrame=()=>{this._receivedPointerMoveEventsThisFrame.length=0;for(let e=0;e<this._pointerUp.length;e++)this._pointerUp[e]=!1;for(let e=0;e<this._pointerDown.length;e++)this._pointerDown[e]=!1;for(let e=0;e<this._pointerClick.length;e++)this._pointerClick[e]=!1;for(let e=0;e<this._pointerDoubleClick.length;e++)this._pointerDoubleClick[e]=!1;for(const e of this._pointerPositionsDelta)e.set(0,0);for(let e=0;e<this._mouseWheelChanged.length;e++)this._mouseWheelChanged[e]=!1;for(let e=0;e<this._mouseWheelDeltaY.length;e++)this._mouseWheelDeltaY[e]=0};canReceiveInput(e){return e.target===this.context.renderer?.domElement||e.target===this.context.domElement||this.context.isInAR||this.context.isInAR&&e.target===document.body&&exports.DeviceUtilities.isMozillaXR()?!0:(He&&console.warn("CanReceiveInput:False for",e.target),!1)}onContextMenu=e=>{this.canReceiveInput(e)!==!1&&e instanceof PointerEvent&&e.pointerType};keysPressed={};onKeyDown=e=>{if(He&&console.log(`key down ${e.code}, ${this.context.application.hasFocus}`,e),!this.context.application.hasFocus)return;const t=this.keysPressed[e.code];if(t&&t.pressed)return;this.keysPressed[e.code]={pressed:!0,frame:this.context.time.frameCount+1,startFrame:this.context.time.frameCount+1,key:e.key,code:e.code};const i=new il("keydown",e,e);this.onDispatchEvent(i)};onKeyPressed=e=>{if(!this.context.application.hasFocus)return;const t=this.keysPressed[e.code];if(!t)return;t.pressed=!0,t.frame=this.context.time.frameCount+1;const i=new il("keypress",e,e);this.onDispatchEvent(i)};onKeyUp=e=>{if(!this.context.application.hasFocus)return;const t=this.keysPressed[e.code];if(!t)return;t.pressed=!1,t.frame=this.context.time.frameCount+1;const i=new il("keyup",e,e);this.onDispatchEvent(i)};onWheelWindow=e=>{document.pointerLockElement&&this.onMouseWheel(e)};onMouseWheel=e=>{if(this.canReceiveInput(e)===!1)return;this._mouseWheelDeltaY.length<=0&&this._mouseWheelDeltaY.push(0),this._mouseWheelChanged.length<=0&&this._mouseWheelChanged.push(!1),this._mouseWheelChanged[0]=!0;const t=this._mouseWheelDeltaY[0];this._mouseWheelDeltaY[0]=t+e.deltaY};onPointerDown=e=>{if(this.context.isInAR||this.canReceiveInput(e)===!1)return;e.target instanceof HTMLElement&&e.target.setPointerCapture(e.pointerId);const t=this.getPointerId(e);He&&Se(`pointer down #${t}, identifier:${e.pointerId}`);const i=this.getAndUpdateSpatialObjectForScreenPosition(t,e.clientX,e.clientY),n=new Xn("pointerdown",e,{origin:this,mode:"screen",deviceIndex:0,pointerId:t,button:e.button,clientX:e.clientX,clientY:e.clientY,pointerType:e.pointerType,buttonName:this.getButtonName(e),device:i,pressure:e.pressure});this.onDown(n)};onPointerMove=e=>{if(this.context.isInAR||this._receivedPointerMoveEventsThisFrame.includes(e.pointerId))return;this._receivedPointerMoveEventsThisFrame.push(e.pointerId);let t=e.button;e.pointerType==="mouse"&&(t=this.getFirstPressedButtonForPointer(0)??0);const i=this.getPointerId(e,t);t===-1&&(t=i);const n=this.getAndUpdateSpatialObjectForScreenPosition(i,e.clientX,e.clientY),o=new Xn("pointermove",e,{origin:this,mode:"screen",deviceIndex:0,pointerId:i,button:t,clientX:e.clientX,clientY:e.clientY,pointerType:e.pointerType,buttonName:this.getButtonName(e),device:n,pressure:e.pressure});this.onMove(o)};onPointerCancel=e=>{this.context.isInAR||(He&&console.log("Pointer cancel",e),this.onPointerUp(e))};onPointerUp=e=>{if(this.context.isInAR)return;e.target instanceof HTMLElement&&e.target.releasePointerCapture(e.pointerId);const t=this.getPointerId(e),i=new Xn("pointerup",e,{origin:this,mode:"screen",deviceIndex:0,pointerId:t,button:e.button,clientX:e.clientX,clientY:e.clientY,pointerType:e.pointerType,buttonName:this.getButtonName(e),device:this.getAndUpdateSpatialObjectForScreenPosition(t,e.clientX,e.clientY),pressure:e.pressure});this.onUp(i),this._pointerIds[t]=-1,He&&console.log("ID="+t,"PointerId="+e.pointerId,"ALL:",[...this._pointerIds])};getPointerId(e,t){return e.pointerType==="mouse"?0+(t??e.button):this.getPointerIndex(e.pointerId)}getButtonName(e){const t=e.button;if(e.pointerType==="mouse")switch(t){case 0:return"left";case 1:return"middle";case 2:return"right"}return"unknown"}onTouchStart=e=>{if(this.context.isInAR)for(let t=0;t<e.changedTouches.length;t++){const i=e.changedTouches[t],n=this.getPointerIndex(i.identifier),o=this.getAndUpdateSpatialObjectForScreenPosition(n,i.clientX,i.clientY),r=new Xn("pointerdown",e,{origin:this,mode:"screen",deviceIndex:0,pointerId:n,button:0,clientX:i.clientX,clientY:i.clientY,pointerType:"touch",buttonName:"unknown",device:o,pressure:i.force});this.onDown(r)}};onTouchMove=e=>{if(this.context.isInAR)for(let t=0;t<e.changedTouches.length;t++){const i=e.changedTouches[t],n=this.getPointerIndex(i.identifier),o=this.getAndUpdateSpatialObjectForScreenPosition(n,i.clientX,i.clientY),r=new Xn("pointermove",e,{origin:this,mode:"screen",deviceIndex:0,pointerId:n,button:0,clientX:i.clientX,clientY:i.clientY,pointerType:"touch",buttonName:"unknown",device:o,pressure:i.force});this.onMove(r)}};onTouchEnd=e=>{if(this.context.isInAR)for(let t=0;t<e.changedTouches.length;t++){const i=e.changedTouches[t],n=this.getPointerIndex(i.identifier),o=new Xn("pointerup",e,{origin:this,mode:"screen",deviceIndex:0,pointerId:n,button:0,clientX:i.clientX,clientY:i.clientY,pointerType:"touch",buttonName:"unknown",device:this.getAndUpdateSpatialObjectForScreenPosition(n,i.clientX,i.clientY),pressure:i.force});this.onUp(o),this._pointerIds[n]=-1}};tempNearPlaneVector=new c.Vector3;tempFarPlaneVector=new c.Vector3;tempLookMatrix=new c.Matrix4;getAndUpdateSpatialObjectForScreenPosition(e,t,i){let n=this._pointerSpace[e];n||(n=new c.Object3D,this._pointerSpace[e]=n),this._pointerSpace[e]=n;const o=this.context.mainCamera;if(o){const r=this.tempNearPlaneVector.set(t,i,-1);this.convertScreenspaceToRaycastSpace(r);const a=this.tempFarPlaneVector.set(r.x,r.y,1);r.unproject(o),a.unproject(o);const l=o.worldUp||V(0,1,0).applyQuaternion(ue(o));this.tempLookMatrix.lookAt(a,r,l),n.position.set(r.x,r.y,r.z),n.quaternion.setFromRotationMatrix(this.tempLookMatrix)}return n}isInRect(e){if(this.context.isInXR)return!0;const t=this.context.domElement.getBoundingClientRect(),i=e.clientX,n=e.clientY,o=i>=t.x&&i<=t.right&&n>=t.y&&n<=t.bottom;return He&&!o&&console.log("Not in rect",t,i,n),o}onDown(e){const t=e.pointerId;if(this.getPointerPressed(t)&&console.warn(`Received pointerDown for pointerId that is already pressed: ${t}`,He?e:""),He&&console.log(e.pointerType,"DOWN",t),!!this.isInRect(e)){for(this.setPointerState(t,this._pointerPressed,!0),this.setPointerState(t,this._pointerDown,!0),this.setPointerStateT(t,this._pointerEvent,e.source);t>=this._pointerTypes.length;)this._pointerTypes.push(e.pointerType);for(this._pointerTypes[t]=e.pointerType;t>=this._pointerPositionDown.length;)this._pointerPositionDown.push(new c.Vector3);for(this._pointerPositionDown[t].set(e.clientX,e.clientY,e.clientZ??0);t>=this._pointerPositions.length;)this._pointerPositions.push(new c.Vector2);this._pointerPositions[t].set(e.clientX,e.clientY),t>=this._pointerDownTime.length&&this._pointerDownTime.push(0),this._pointerDownTime[t]=this.context.time.realtimeSinceStartup,this.updatePointerPosition(e),this._pointerEventsPressed.push(e),this.onDispatchEvent(e)}}onMove(e){const t=e.pointerId,i=this.getPointerPressed(t);i===!1&&!this.isInRect(e)||e.pointerType==="touch"&&!i||(this.updatePointerPosition(e),this.setPointerStateT(t,this._pointerEvent,e.source),this.onDispatchEvent(e))}onUp(e){const t=e.pointerId;if(!this.getPointerPressed(t)){He&&console.log(e.pointerType,"UP",t,"was not down");return}He&&console.log(e.pointerType,"UP",t),this.setPointerState(t,this._pointerPressed,!1),this.setPointerStateT(t,this._pointerEvent,e.source),this.setPointerState(t,this._pointerUp,!0),this.updatePointerPosition(e);for(let l=this._pointerEventsPressed.length-1;l>=0;l--)if(this._pointerEventsPressed[l].pointerId===t){this._pointerEventsPressed.splice(l,1);break}if(!this._pointerPositionDown[t]){He&&ce("Received pointer up event without matching down event for button: "+t),console.warn("Received pointer up event without matching down event for button: "+t);return}const n=this._pointerUpTime[t],o=this._pointerDownTime[t],r=this.context.time.realtimeSinceStartup,a=r-o;if(t>=this._pointerUpTime.length&&this._pointerUpTime.push(-99),this._pointerUpTime[t]=r,a<1){let l=e.clientX-this._pointerPositionDown[t].x,h=e.clientY-this._pointerPositionDown[t].y,d=0;if(e.isSpatial&&e.clientZ!=null&&(d=e.clientZ-this._pointerPositionDown[t].z,l*=200,h*=200,d*=200),Math.abs(l)<5&&Math.abs(h)<5&&Math.abs(d)<5){this.setPointerState(t,this._pointerClick,!0),e.isClick=!0;const u=r-n;He&&console.log("CLICK",t,l,h,d,u),u<this._doubleClickTimeThreshold&&u>0&&(this.setPointerState(t,this._pointerDoubleClick,!0),e.isDoubleClick=!0)}}this.onDispatchEvent(e)}updatePointerPosition(e){const t=e.pointerId;for(;t>=this._pointerPositions.length;)this._pointerPositions.push(new c.Vector2);for(;t>=this._pointerPositionsLastFrame.length;)this._pointerPositionsLastFrame.push(new c.Vector2);for(;t>=this._pointerPositionsDelta.length;)this._pointerPositionsDelta.push(new c.Vector2);const i=this._pointerPositionsLastFrame[t];i.copy(this._pointerPositions[t]);const n=this._pointerPositionsDelta[t];let o=e.clientX-i.x,r=e.clientY-i.y;if(e.source instanceof MouseEvent||e.source instanceof TouchEvent){const d=e.source;o===0&&d.movementX!==0&&(o=d.movementX||0),r===0&&d.movementY!==0&&(r=d.movementY||0)}n.x+=o,n.y+=r,this._pointerPositions[t].x=e.clientX,this._pointerPositions[t].y=e.clientY;const a=e.clientX,l=e.clientY;for(;t>=this._pointerPositionsRC.length;)this._pointerPositionsRC.push(new c.Vector2);const h=this._pointerPositionsRC[t];h.set(a,l),this.convertScreenspaceToRaycastSpace(h)}getPointerIndex(e){let t=-1;for(let i=0;i<this._pointerIds.length;i++){if(this._pointerIds[i]===e)return i;t===-1&&this._pointerIds[i]===-1&&(t=i)}return t!==-1?(this._pointerIds[t]=e,t):(He&&console.log("PUSH pointerId:",e),this._pointerIds.push(e),this._pointerIds.length-1)}setPointerState(e,t,i){t[e]=i}setPointerStateT(e,t,i){return t[e]=i,i}onDispatchEvent(e){const t=U.Current;try{U.Current=this.context,this.dispatchEvent(e)}finally{U.Current=t}}}const Wr=new c.Matrix4().makeRotationY(Math.PI),Mi=new c.Quaternion().setFromAxisAngle(new c.Vector3(0,1,0),Math.PI),Jx=w("debugwebxr");class eS{priority=-1e5;gameObject;isXRRig(){return!0}get isActive(){return this.gameObject.visible}constructor(){if(this.gameObject=new c.Object3D,this.gameObject.name="Implicit XR Rig",Jx){const e=Jp(16733661);e.position.y+=.5,this.gameObject.add(e)}}}const Fn=w("debugwebxr"),Kc=w("debugcustomgesture"),tS="https://cdn.jsdelivr.net/npm/@webxr-input-profiles/assets@1.0/dist/profiles",iS="generic-trigger",nS=new c.Quaternion().setFromEuler(new c.Euler(c.MathUtils.degToRad(0),c.MathUtils.degToRad(-90),c.MathUtils.degToRad(-90))),sS=new c.Vector3(.04,-.04,0);class qp{xr;get context(){return this.xr.context}inputSource;index=0;emitEvents=!0;get connected(){return this._connected}_connected=!0;get isTracking(){return this._isTracking}_isTracking=!1;get gamepad(){return this.__gamepad??=this.inputSource.gamepad}__gamepad;get isHand(){return this.hand!=null}get hand(){return this.__hand??=this.inputSource.hand}__hand;get handObject(){return this.context.renderer.xr.getHand(this.index)}get profiles(){return this.inputSource.profiles}get layout(){return this._layout}get targetRayMode(){return this.inputSource.targetRayMode}get targetRaySpace(){return this.inputSource.targetRaySpace}get gripSpace(){return this.inputSource.gripSpace}get side(){return this.__side??=this.inputSource.handedness}__side=void 0;get isRight(){return this.side==="right"}get isLeft(){return this.side==="left"}get isStylus(){return this._isMxInk}getHitTestSource(){return this._hitTestSource||this._requestHitTestSource(),this._hitTestSource}get hasHitTestSource(){return this._hitTestSource}cancelHitTestSource(){this._hitTestSource&&(this._hitTestSource.cancel(),this._hitTestSource=void 0)}_hitTestSource=void 0;_hasSelectEvent=!1;get hasSelectEvent(){return this._hasSelectEvent}_isMxInk=!1;_isMetaQuestTouchController=!1;getHitTest(){return this.xr.getHitTest(this)}_handJointPoses=new Map;getHandJointPose(e,t){if(t=t||this.xr.frame,!this.hand||!t?.getJointPose||!this.xr.referenceSpace)return null;let i=this._handJointPoses?.get(e);return i||(i=t.getJointPose(e,this.xr.referenceSpace),i&&this._handJointPoses.set(e,i),i)}_gripMatrix=new c.Matrix4;_gripPosition=new c.Vector3;_gripQuaternion=new c.Quaternion;_linearVelocity=new c.Vector3;_rayPositionRaw=new c.Vector3;_rayRotationRaw=new c.Quaternion;_rayMatrix=new c.Matrix4;_rayPosition=new c.Vector3;_rayQuaternion=new c.Quaternion;get gripPosition(){return V(this._gripPosition)}get gripQuaternion(){return Xi(this._gripQuaternion)}get gripMatrix(){return this._gripMatrix}get gripLinearVelocity(){return V(this._linearVelocity).applyQuaternion(Mi)}get rayPosition(){return V(this._rayPosition)}get rayQuaternion(){return Xi(this._rayQuaternion)}get gripWorldPosition(){return V(this._gripWorldPosition)}_gripWorldPosition=new c.Vector3;get gripWorldQuaternion(){return Xi(this._gripWorldQuaternion)}_gripWorldQuaternion=new c.Quaternion;get rayWorldPosition(){return V(this._rayWorldPosition)}_rayWorldPosition=new c.Vector3;updateRayWorldPosition(){const e=this.xr.context.mainCamera?.parent;this._rayWorldPosition.copy(this._rayPositionRaw),e&&this._rayWorldPosition.applyMatrix4(e.matrixWorld)}get rayWorldQuaternion(){return Xi(this._rayWorldQuaternion)}_rayWorldQuaternion=new c.Quaternion;get pinchPosition(){return V(this._pinchPosition)}_pinchPosition=new c.Vector3;updateRayWorldQuaternion(){const e=this.xr.context.mainCamera?.parent,t=e?ue(e):void 0;this._rayWorldQuaternion.copy(this._rayRotationRaw).multiply(Mi),t&&this._rayWorldQuaternion.premultiply(t)}get ray(){return this._ray.origin.copy(this.rayWorldPosition),this._ray.direction.copy(V(0,0,1).applyQuaternion(this.rayWorldQuaternion)),this._ray}_ray;_hand_wristDotUp=void 0;get handWristDotUp(){if(this._hand_wristDotUp!==void 0)return this._hand_wristDotUp;const e=this.handObject?.joints.wrist;if(e){const t=V(0,1,0).applyQuaternion(e.quaternion),i=V(0,1,0).dot(t);return this._hand_wristDotUp=i}}get isHandUpsideDown(){return this.handWristDotUp!==void 0?this.handWristDotUp<-.7:!1}get isTeleportGesture(){return this.isHandUpsideDown&&this.getGesture("pinch")?.isDown}get object(){return this._object}_object;_gripSpaceObject;_raySpaceObject;model=null;_debugAxesHelper=new c.AxesHelper(.15);_debugGripAxesHelper=new c.AxesHelper(.07);_debugRayAxesHelper=new c.AxesHelper(.07);async getModelUrl(){return this.getMotionController?.then(e=>e?.assetUrl||null)}constructor(e,t,i){this.xr=e,this.inputSource=t,this.index=i,this._object=new c.Object3D,this._object.name=`NeedleXRController_${i}`,Fn&&(this._object.add(this._debugAxesHelper),this._gripSpaceObject=new c.Object3D,this._raySpaceObject=new c.Object3D,this._gripSpaceObject.name=`NeedleXRController_${i}_gripSpace`,this._raySpaceObject.name=`NeedleXRController_${i}_raySpace`,this._gripSpaceObject.add(this._debugGripAxesHelper),this._raySpaceObject.add(this._debugRayAxesHelper),this.xr.context.scene.add(this._gripSpaceObject),this.xr.context.scene.add(this._raySpaceObject)),this.xr.context.scene.add(this._object),this._ray=new c.Ray,this.pointerInit={origin:this,pointerType:this.hand?"hand":"controller",deviceIndex:this.index,pointerId:-1,mode:this.inputSource.targetRayMode,ray:this._ray,device:this._object,buttonName:"none"},this.initialize(),this.subscribeEvents()}_hitTestSourcePromise=null;_requestHitTestSource(){return this._hitTestSourcePromise?this._hitTestSourcePromise:this.xr.mode==="immersive-ar"&&this.inputSource.targetRayMode==="tracked-pointer"&&this.xr.session.requestHitTestSourceForTransientInput?this._hitTestSourcePromise=this.xr.session.requestHitTestSourceForTransientInput({profile:this.inputSource.profiles[0],offsetRay:new XRRay})?.then(e=>(this._hitTestSourcePromise=null,this.connected?this._hitTestSource=e:(e.cancel(),null)))??null:null}onPointerHits=e=>{};onUpdate(e){this.onUpdateFrame(e),this.updateInputEvents(),this.onUpdateMove()}onRenderDebug(){j.DrawSphere(this.rayWorldPosition,.003),j.DrawDirection(this.rayWorldPosition,V(0,0,10).applyQuaternion(this.rayWorldQuaternion));const t=(this.inputSource.gripSpace?this.gripWorldPosition:this.object.worldPosition).sub(this.object.worldForward.multiplyScalar(.1)),i=this.inputSource.profiles.join(`
146
146
  `);let n=`Controller[${this.index}] (${this.inputSource.targetRayMode}, ${this.side})
147
147
  C:${this.connected?"x":"-"} T:${this.isTracking?"x":"-"} Hand:${this.inputSource.hand?"x":"-"} Pen: ${this._isMxInk?"x":"-"}`;if(this.inputSource.hand&&(n+=`
@@ -167,7 +167,7 @@ ${o.hand?"hand":"ctrl"} ${o.inputSource.handedness}[${o.index}] con:${o.connecte
167
167
  The script will be ignored. Please make sure your component extends "Behaviour" imported from "@needle-tools/engine"
168
168
  `,t),ve.splice(e,1),e--;continue}if(t.destroyed)continue;if(!t.gameObject){console.warn(`Component can not be initialized: no GameObject assigned.
169
169
  Did you add and remove a component in the same frame?`),ve.splice(e,1),e--;continue}t.context=s,Sl(t.gameObject),im(t,s)}catch(t){console.error(t),Yn(ve[e],s),ve.splice(e,1),e--}for(let e=0;e<ve.length;e++)try{const t=ve[e];if(t.destroyed){Yn(ve[e],s),ve.splice(e,1),e--;continue}if(t.registering)try{t.registering()}catch(i){console.error(i)}t.__internalAwake!==void 0&&(t.gameObject||console.error("Calling awake for a component without a GameObject",t,t.gameObject),Sl(t.gameObject),t.activeAndEnabled&&qr(t.__internalAwake.bind(t)))}catch(t){console.error(t),Yn(ve[e],s),ve.splice(e,1),e--}for(let e=0;e<ve.length;e++)try{const t=ve[e];if(t.destroyed||t.enabled===!1||(Sl(t.gameObject),t.activeAndEnabled===!1))continue;t.__internalEnable!==void 0&&(t.enabled=!0,qr(t.__internalEnable.bind(t)))}catch(t){console.error(t),Yn(ve[e],s),ve.splice(e,1),e--}for(let e=0;e<ve.length;e++)try{const t=ve[e];if(t.destroyed||!t.gameObject)continue;s.new_script_start.push(t)}catch(t){console.error(t),Yn(ve[e],s),ve.splice(e,1),e--}ve.length=0;for(const e of s.new_scripts_post_setup_callbacks)e&&e();s.new_scripts_post_setup_callbacks.length=0}}function LS(s){s&&(s.__internalDisable(!0),Yn(s,s.context))}function Nb(s,e){for(let t=0;t<s.new_script_start.length;t++)try{const i=s.new_script_start[t];if(e!==void 0&&i.gameObject!==e||i.destroyed||i.activeAndEnabled===!1)continue;qr(i.__internalAwake.bind(i)),i.enabled&&(qr(i.__internalEnable.bind(i)),qr(i.__internalStart.bind(i)),s.new_script_start.splice(t,1),t--)}catch(i){console.error(i),Yn(s.new_script_start[t],s),s.new_script_start.splice(t,1),t--}}function im(s,e){e.scripts.indexOf(s)===-1&&(e.scripts.push(s),s.earlyUpdate&&e.scripts_earlyUpdate.push(s),s.update&&e.scripts_update.push(s),s.lateUpdate&&e.scripts_lateUpdate.push(s),s.onBeforeRender&&e.scripts_onBeforeRender.push(s),s.onAfterRender&&e.scripts_onAfterRender.push(s),s.onPausedChanged&&e.scripts_pausedChanged.push(s),$u(s,null)&&e.new_scripts_xr.push(s),$u(s,"immersive-vr")&&e.scripts_immersive_vr.push(s),$u(s,"immersive-ar")&&e.scripts_immersive_ar.push(s))}function Yn(s,e){wi(s,e.new_scripts),wi(s,e.new_script_start),wi(s,e.scripts),wi(s,e.scripts_earlyUpdate),wi(s,e.scripts_update),wi(s,e.scripts_lateUpdate),wi(s,e.scripts_onBeforeRender),wi(s,e.scripts_onAfterRender),wi(s,e.scripts_pausedChanged),wi(s,e.new_scripts_xr),wi(s,e.scripts_immersive_vr),wi(s,e.scripts_immersive_ar),e.stopAllCoroutinesFrom(s)}function wi(s,e){const t=e.indexOf(s);t>=0&&e.splice(t,1)}function $u(s,e){if(s){const t=s;if(t.onBeforeXR||t.onEnterXR||t.onUpdateXR||t.onLeaveXR||t.onXRControllerAdded||t.onXRControllerRemoved)return!(e!=null&&t.supportsXR?.(e)===!1)}return!1}function Eh(s){if(s||(s=re.Current.scene),!s){console.trace("Invalid call - no current context.");return}const e=pa(s);Vb(s,e,!0)||(Xf||A()?console.error(`Error updating hierarchy
170
- Do you have circular references in your project? <a target="_blank" href="https://docs.needle.tools/circular-reference"> Click here for more information.`,s):console.error('Failed to update active state in hierarchy of "'+s.name+'"',s),console.warn(" ↑ this error might be caused by circular references. Please make sure you don't have files with circular references (e.g. one GLB 1 is loading GLB 2 which is then loading GLB 1 again)."))}function Vb(s,e,t,i=0){if(i>1e3)return console.warn("Hierarchy is too deep (> 1000 level) - will abort updating active state"),!1;const n=pa(s);if(e&&(e=n,e&&s.parent)){const l=s.parent;e=l[ss],e===void 0&&(l instanceof c.Scene||(e=!0))}const r=s[ss]!==e;s[ss]=e,r&&(TS&&console.warn("ACTIVE CHANGE",s.name,n,s.visible,e,"changed?"+r,s),DS(s,l=>{e?l.enabled&&(qr(l.__internalAwake.bind(l)),l.enabled&&l.__internalEnable()):l.__didAwake&&l.enabled&&(l.__didEnable=!1,l.onDisable())}));let a=!0;if(s.children)for(const l of s.children)Vb(l,e,t,i+1)===!1&&(a=!1);return a}function Sl(s){let e=!0,t=s,i=!1;for(;t&&t;){if(t.type==="Scene"&&(i=!0),!pa(t)){e=!1;break}t=t.parent}if(!s){console.error("GO is null");return}s[ss]=e&&i}function DS(s,e){if(s.userData?.components)for(const t of s.userData.components)e(t)}const Th=new Map,$b=Symbol("prewarmFlag"),Qf=Symbol("waitingForPrewarm"),Yf=w("debugprewarm");function IS(s,e){if(!s||s[$b]===!0||s[Qf]===!0)return;Th.has(e)||Th.set(e,[]),s[Qf]=!0,Th.get(e).push(s),Yf&&console.debug("register prewarm",s.name)}let by=null,vy=null;function jS(s){if(!s)return;const e=Th.get(s);if(!e?.length)return;const t=s.mainCamera;if(t){Yf&&console.log("prewarm",e.length,"objects",[...e]);const i=s.renderer;if(i.compile){const n=s.scene;i.compile(n,t),by??=new c.WebGLCubeRenderTarget(64),vy??=new c.CubeCamera(.001,9999999,by),vy.update(i,n);for(const o of e)o[$b]=!0,o[Qf]=!1;e.length=0,Yf&&console.log("prewarm done")}}}re.registerCallback(oe.ContextCreated,s=>{const e=s.context;Xb(e),Gb(e)});const id=w("debugcomponents"),wy="eff8ba80-635d-11ec-90d6-0242ac120003";class ft{get seed(){return this._seed}set seed(e){this._seed=e}_originalSeed;_seed;constructor(e){typeof e=="string"&&(e=ft.hash(e)),this._originalSeed=e,this._seed=e}reset(){this._seed=this._originalSeed}generateUUID(e){if(typeof e=="string")return se.v5(e,wy);const t=this._seed;return this._seed-=1,se.v5(t.toString(),wy)}initialize(e){typeof e=="string"?this._seed=ft.hash(e):this._seed=e}static createFromString(e){return new ft(this.hash(e))}static hash(e){let t=0;for(let i=0;i<e.length;i++)t=e.charCodeAt(i)+((t<<5)-t);return t}}var Wb=(s=>(s.NewInstanceCreated="new-instance-created",s.InstanceDestroyed="instance-destroyed",s))(Wb||{});class BS{guid;dontSave;constructor(e){this.guid=e}}function ic(s,e,t=!0,i){if(!s)return;const n=s;if(ci(s,t),!e){console.warn("Can not send destroy: No networking connection provided",s.guid);return}if(!e.isConnected){A()&&console.debug("Can not send destroy: not connected",s.guid);return}let o=s.guid;if(!o&&n.uuid&&(o=n.uuid),!o){console.warn("Can not send destroy: failed to find guid",s);return}nm(o,e,i)}function nm(s,e,t){const i=new BS(s);t?.saveInRoom===!1&&(i.dontSave=!0),e.send("instance-destroyed",i,Qi.Queued)}function Gb(s){s.connection.beginListen("instance-destroyed",e=>{id&&console.log("[Remote] Destroyed",s.scene,e);const t=cm(e.guid,s.scene);t&&ci(t)})}class FS{filename;hash;size;constructor(e,t,i){this.filename=e,this.hash=t,this.size=i}}class Hb{guid;originalGuid;seed;visible;hostData;dontSave;parent;position;rotation;scale;preventCreation=void 0;deleteStateOnDisconnect;constructor(e,t){this.originalGuid=e,this.guid=t}}function sm(s,e,t,i){const n=s;if(!n.guid)return console.warn("Can not instantiate: No guid",n),null;if(e.context||(e.context=U.Current),!e.context)return console.error("Missing network instantiate options / reference to network connection in sync instantiate"),null;const o=e?{...e}:null,{instance:r,seed:a}=US(n,e);if(r){const l=r;if(l.guid){id&&console.log("[Local] new instance","gameobject:",r?.guid);const h=new Hb(n.guid,l.guid);h.seed=a,e.deleteOnDisconnect===!0&&(h.deleteStateOnDisconnect=!0),o&&(o.position&&(h.position={x:o.position.x,y:o.position.y,z:o.position.z}),o.rotation&&(h.rotation={x:o.rotation.x,y:o.rotation.y,z:o.rotation.z,w:o.rotation.w}),o.scale&&(h.scale={x:o.scale.x,y:o.scale.y,z:o.scale.z})),h.position||(h.position={x:l.position.x,y:l.position.y,z:l.position.z}),h.rotation||(h.rotation={x:l.quaternion.x,y:l.quaternion.y,z:l.quaternion.z,w:l.quaternion.w}),h.scale||(h.scale={x:l.scale.x,y:l.scale.y,z:l.scale.z}),h.visible=n.visible,o?.parent&&(typeof o.parent=="string"?h.parent=o.parent:h.parent=o.parent.guid),h.hostData=t,i===!1&&(h.dontSave=!0),!e?.context?.connection&&A()&&console.debug("Object will be instantiated but it will not be synced: not connected",n.guid),e.context.connection.isInRoom&&Er.push(new WeakRef(l)),e?.context?.connection.send("new-instance-created",h)}else console.warn("Missing guid, can not send new instance event",l)}return r}function qb(){return Math.random()*9999999}const Er=new Array;function Xb(s){s.connection.beginListen("new-instance-created",async e=>{const t=await zS(e.originalGuid,s.scene);if(e.preventCreation===!0)return;if(!t){console.warn("could not find object that was instantiated: "+e.guid);return}const i=new sn;e.position&&(i.position=new c.Vector3(e.position.x,e.position.y,e.position.z)),e.rotation&&(i.rotation=new c.Quaternion(e.rotation.x,e.rotation.y,e.rotation.z,e.rotation.w)),e.scale&&(i.scale=new c.Vector3(e.scale.x,e.scale.y,e.scale.z)),i.parent=e.parent,e.seed&&(i.idProvider=new ft(e.seed)),i.visible=e.visible,i.context=s,id&&s.alias&&console.log("[Remote] instantiate in: "+s.alias);const n=Wo(t,i);Er.push(new WeakRef(n)),n&&(e.parent==="scene"&&s.scene.add(n),id&&console.log("[Remote] new instance","gameobject:",n?.guid,t))}),s.connection.beginListen("left-room",()=>{Er.length>0&&console.debug(`Left networking room, cleaning up ${Er.length} instantiated objects`);for(const e of Er){const t=e.deref();t&&t.destroy()}Er.length=0})}function US(s,e){const t=qb(),i=e??new sn;i.idProvider=new ft(t);const n=Wo(s,i);return{seed:t,instance:n}}const Qb={};function Yb(s,e){Qb[s]=e}async function zS(s,e){const t=Qb[s];if(t!=null){const i=await t(s);if(i)return i}return Kb(s,e)}function Kb(s,e){if(e===null||!s)return null;if(e.guid===s)return e;if(e.children)for(const t of e.children){const i=Kb(s,t);if(i)return i}return null}const nc=w("gizmos"),st=w("debugextension"),Wu=w("debugtypes");class NS{_types=new Map;constructor(){Wu&&console.warn("TypeStore: Created",this)}add(e,t){Wu&&console.warn("ADD TYPE",e);const i=this._types.get(e);i?Wu&&i!==t&&console.warn("Type name exists multiple times in your project and may lead to runtime errors:",e):this._types.set(e,t)}get(e){return this._types.get(e)||null}getKey(e){for(const[t,i]of this._types)if(i===e)return t;return null}}const VS=Symbol("BuiltInType"),P=new NS,$S=function(s){P.get(s.name)||P.add(s.name,s)},om=w("debugresolvedependencies"),WS=["/extensions/","extensions/"],GS=[{prefix:"/nodes/",dependencyName:"node"},{prefix:"/meshes/",dependencyName:"mesh"},{prefix:"/materials/",dependencyName:"material"},{prefix:"/textures/",dependencyName:"texture"},{prefix:"/animations/",dependencyName:"animation"},{prefix:"nodes/",dependencyName:"node"},{prefix:"meshes/",dependencyName:"mesh"},{prefix:"materials/",dependencyName:"material"},{prefix:"textures/",dependencyName:"texture"},{prefix:"animations/",dependencyName:"animation"}];async function rm(s,e){om&&console.log(s,e);const t=[];Kf(GS,s,e,t);const i=await Promise.all(t);return typeof e=="string"&&i.length===1?i[0]:i}function Zb(s,e){return!s||!e?!1:s["needle:identifier"]!=null&&e["needle:identifier"]!=null?s["needle:identifier"]===e["needle:identifier"]:!1}function HS(s,e){s["needle:identifier"]=e}function Kf(s,e,t,i){if(typeof t=="object"&&t!==void 0&&t!==null)for(const n of Object.keys(t)){const o=t[n];if(typeof o=="string"){const r=xy(e,o);if(r!=null)typeof r.then=="function"?i.push(r.then(a=>t[n]=a)):t[n]=r;else{const a=Sy(s,e,o);if(a){i.push(a.then(l=>(t[n]=l,l)));continue}}}else if(Array.isArray(o))for(let r=0;r<o.length;r++){const a=o[r],l=xy(e,a);if(l!==null){typeof l.then=="function"?i.push(l.then(h=>o[r]=h)):o[r]=l;continue}for(const h of s){const d=Jb(h.prefix,a);if(d>=0){om&&console.log(h,d,h.dependencyName),i.push(e.getDependency(h.dependencyName,d).then(u=>o[r]=u));break}}typeof a=="object"&&Kf(s,e,a,i)}else typeof o=="object"&&Kf(s,e,o,i)}else if(typeof t=="string"){const n=Sy(s,e,t);n&&i.push(n)}}function xy(s,e){if(s&&s.plugins&&typeof e=="string"){for(const t of WS)if(e.startsWith(t)){let i=e.substring(t.length);const n=i.indexOf("/");n>=0&&(i=i.substring(0,n));const o=s.plugins[i];if(st&&console.log(i,o),typeof o?.resolve=="function"){const r=e.substring(t.length+i.length+1);return o.resolve(s,r)}break}}return null}function Sy(s,e,t){for(const i of s){const n=Jb(i.prefix,t);if(n>=0)return om&&console.warn("GET DEPENDENCY",i,n,i.dependencyName),e.getDependency(i.dependencyName,n)}return null}function Jb(s,e){if(typeof e=="string"&&e.startsWith(s)){const t=e.substring(s.length),i=Number.parseInt(t);if(i>=0)return i}return-1}const Gu="NEEDLE_persistent_assets";function qS(s){return s?.___persistentAsset===!0}class XS{get name(){return Gu}parser;constructor(e){this.parser=e}async afterRoot(e){if(!this.parser?.json?.extensions)return;const t=this.parser.json.extensions[Gu];if(!t)return;st&&console.log(t);const i=new Array;for(const n of t?.assets){const o=rm(this.parser,n);o&&i.push(o)}await Promise.all(i)}resolve(e,t){const i=Number.parseInt(t);if(i>=0){st&&console.log(t);const n=e.json.extensions[Gu];if(n){const o=n?.assets[i];if(o&&typeof o=="object"){o.___persistentAsset=!0;const r=o.__type;r&&P.get(r)}return o}}return null}}const mn=w("debugserializer");class QS{register(e,t){if(this.typeMap.has(e)){const i=this.typeMap.get(e);if(i===t)return;mn&&console.warn("Type: "+e+" is already registered",t,i)}mn&&console.log("Register type serializer",t.name,t,e),this.typeMap.set(e,t)}typeMap=new Map;getSerializer(e){if(e)return this.typeMap.get(e)}getSerializerForConstructor(e,t=0){if(t>20)return;if(!e||!e.constructor){mn&&console.log("invalid type");return}const i=e.name,n=this.getSerializer(e);if(n!==void 0)return mn&&console.log("FOUND SERIALIZER",n?.name,e.name,e.constructor.name,"for type: "+i,n,e,this.typeMap),n;const o=Object.getPrototypeOf(e);if(o&&o!==e){const r=this.getSerializerForConstructor(o,++t);if(r){const a=o.constructor||o.prototype;mn&&console.log("FOUND SERIALIZER(in constructor) "+a.constructor.name,a.name,a,r),this.register(a,r)}return r}mn&&console.warn("No serializer found for "+i,e,e.name,e.constructor.name)}}const nd=new QS;class Ui{name;constructor(e,t){if(this.name=t,Array.isArray(e))for(const i of e)nd.register(i,this);else nd.register(e,this)}}class YS{isDevMode=Li();cache={};registerDefinedKeys(e,t){if(this.isDevMode&&this.cache[e]===void 0){this.cache[e]=Object.keys(t);const i=t;i.$serializedTypes&&Object.keys(i.$serializedTypes)&&this.cache[e].push(...Object.keys(i.$serializedTypes)),mn&&console.log("registerDefinedKeys for "+e,this.cache[e],t)}}getDefinedKey(e,t){return this.cache[e]===void 0?!1:this.cache[e].includes(t)}}class am{root;gltf;gltfId;object;target;nodeId;nodeToObject;objectToNode;context;path;type;serializable;implementationInformation;constructor(e){this.root=e}}function e0(s,e){const t=s.$serializedTypes;if(t===void 0)return null;const i={};for(const o in t){const r=s[o];if(r!=null&&typeof r=="object"){const a=nd.getSerializerForConstructor(r);if(a){i[o]=a.onSerialize(r,e);continue}}i[o]=r}function n(o){const r=P._types;for(const[a,l]of r)if(l===s.constructor)return a;return o.__name||o.constructor.name}return i.name=n(s),typeof s.guid=="string"&&(i.guid=s.guid),i}const Ah=[];function t0(s,e){if(!s)return e;typeof s.$serializedTypes=="object"&&(e||(e={}),Object.assign(e,s.$serializedTypes));const t=Object.getPrototypeOf(s);return t0(t,e)}function sd(s,e,t){if(!s)return!1;if(t.target=s,s.onBeforeDeserialize!==void 0){const n=s.onBeforeDeserialize(e,t);if(typeof n=="boolean")return n}const i=t0(s);if(e){if(typeof e.guid=="string"&&(s.guid=e.guid),i)for(const n in i){let o=function(l){const d=l.type;return d?Zf(a,d,t,void 0,s[n]):Zf(a,l,t,void 0,s[n])};const r=i[n],a=e[n];if(mn&&console.log(n,a,s,r),!(s[n]!==void 0&&a===void 0)&&(t.type=void 0,t.path=n,t.serializable=r,!(s.onBeforeDeserializeMember!==void 0&&s.onBeforeDeserializeMember(n,a,t)===!0))){if(r===null)s[n]=a;else{if(Array.isArray(r))for(let l=0;l<r.length;l++){const h=r[l],d=o(h);if(d!==void 0||l===r.length-1){s[n]=d;break}}else s[n]=o(r);Ah.length=0}s.onAfterDeserializeMember!==void 0&&s.onAfterDeserializeMember(n,a,t)}}JS(s,e)}return ZS(s,e,t.implementationInformation),s.onAfterDeserialize!==void 0&&s.onAfterDeserialize(e,t),!0}const KS=w("noerrors");function ZS(s,e,t){if(KS||!e||!Li()||!s||s.constructor&&s.constructor[VS]===!0)return;const i=s.constructor?.name,n=Object.getOwnPropertyNames(e);for(const o of n){if(o==="sourceId")continue;const r=s[o];if(r==null)continue;const a=e[o];if(t?.getDefinedKey(i,o)===!1){const l=o.charAt(0).toUpperCase()+o.slice(1);t.getDefinedKey(i,l)&&(Po(oi.Warn,'<strong>Please rename</strong> "'+l+'" to "'+o+'" in '+i),console.warn('Please use lowercase for field: "'+l+'" in '+i,a,s));continue}if(a!=null){if(typeof a=="object"&&(r===void 0||!r.isObject3D)){if(typeof a.node=="number"||typeof a.guid=="string"){if(a.could_not_resolve)continue;if(!(r!==void 0&&Object.keys(r).length>1)){Po(oi.Warn,`<strong>Missing serialization for object reference!</strong>
170
+ Do you have circular references in your project? <a target="_blank" href="https://docs.needle.tools/circular-reference"> Click here for more information.`,s):console.error('Failed to update active state in hierarchy of "'+s.name+'"',s),console.warn(" ↑ this error might be caused by circular references. Please make sure you don't have files with circular references (e.g. one GLB 1 is loading GLB 2 which is then loading GLB 1 again)."))}function Vb(s,e,t,i=0){if(i>1e3)return console.warn("Hierarchy is too deep (> 1000 level) - will abort updating active state"),!1;const n=pa(s);if(e&&(e=n,e&&s.parent&&i===0)){const l=s.parent;e=l[ss],e===void 0&&(l instanceof c.Scene||(e=!0))}const r=s[ss]!==e;r&&(s[ss]=e,TS&&console.warn("ACTIVE CHANGE",s.name,n,s.visible,e,"changed?"+r,s),DS(s,l=>{e?l.enabled&&(qr(l.__internalAwake.bind(l)),l.enabled&&l.__internalEnable()):l.__didAwake&&l.enabled&&(l.__didEnable=!1,l.onDisable())}));let a=!0;if(s.children)for(const l of s.children)Vb(l,e,t,i+1)===!1&&(a=!1);return a}function Sl(s){let e=!0,t=s,i=!1;for(;t&&t;){if(t.type==="Scene"&&(i=!0),!pa(t)){e=!1;break}t=t.parent}if(!s){console.error("GO is null");return}s[ss]=e&&i}function DS(s,e){if(s.userData?.components)for(const t of s.userData.components)e(t)}const Th=new Map,$b=Symbol("prewarmFlag"),Qf=Symbol("waitingForPrewarm"),Yf=w("debugprewarm");function IS(s,e){if(!s||s[$b]===!0||s[Qf]===!0)return;Th.has(e)||Th.set(e,[]),s[Qf]=!0,Th.get(e).push(s),Yf&&console.debug("register prewarm",s.name)}let by=null,vy=null;function jS(s){if(!s)return;const e=Th.get(s);if(!e?.length)return;const t=s.mainCamera;if(t){Yf&&console.log("prewarm",e.length,"objects",[...e]);const i=s.renderer;if(i.compile){const n=s.scene;i.compile(n,t),by??=new c.WebGLCubeRenderTarget(64),vy??=new c.CubeCamera(.001,9999999,by),vy.update(i,n);for(const o of e)o[$b]=!0,o[Qf]=!1;e.length=0,Yf&&console.log("prewarm done")}}}re.registerCallback(oe.ContextCreated,s=>{const e=s.context;Xb(e),Gb(e)});const id=w("debugcomponents"),wy="eff8ba80-635d-11ec-90d6-0242ac120003";class ft{get seed(){return this._seed}set seed(e){this._seed=e}_originalSeed;_seed;constructor(e){typeof e=="string"&&(e=ft.hash(e)),this._originalSeed=e,this._seed=e}reset(){this._seed=this._originalSeed}generateUUID(e){if(typeof e=="string")return se.v5(e,wy);const t=this._seed;return this._seed-=1,se.v5(t.toString(),wy)}initialize(e){typeof e=="string"?this._seed=ft.hash(e):this._seed=e}static createFromString(e){return new ft(this.hash(e))}static hash(e){let t=0;for(let i=0;i<e.length;i++)t=e.charCodeAt(i)+((t<<5)-t);return t}}var Wb=(s=>(s.NewInstanceCreated="new-instance-created",s.InstanceDestroyed="instance-destroyed",s))(Wb||{});class BS{guid;dontSave;constructor(e){this.guid=e}}function ic(s,e,t=!0,i){if(!s)return;const n=s;if(ci(s,t),!e){console.warn("Can not send destroy: No networking connection provided",s.guid);return}if(!e.isConnected){A()&&console.debug("Can not send destroy: not connected",s.guid);return}let o=s.guid;if(!o&&n.uuid&&(o=n.uuid),!o){console.warn("Can not send destroy: failed to find guid",s);return}nm(o,e,i)}function nm(s,e,t){const i=new BS(s);t?.saveInRoom===!1&&(i.dontSave=!0),e.send("instance-destroyed",i,Qi.Queued)}function Gb(s){s.connection.beginListen("instance-destroyed",e=>{id&&console.log("[Remote] Destroyed",s.scene,e);const t=cm(e.guid,s.scene);t&&ci(t)})}class FS{filename;hash;size;constructor(e,t,i){this.filename=e,this.hash=t,this.size=i}}class Hb{guid;originalGuid;seed;visible;hostData;dontSave;parent;position;rotation;scale;preventCreation=void 0;deleteStateOnDisconnect;constructor(e,t){this.originalGuid=e,this.guid=t}}function sm(s,e,t,i){const n=s;if(!n.guid)return console.warn("Can not instantiate: No guid",n),null;if(e.context||(e.context=U.Current),!e.context)return console.error("Missing network instantiate options / reference to network connection in sync instantiate"),null;const o=e?{...e}:null,{instance:r,seed:a}=US(n,e);if(r){const l=r;if(l.guid){id&&console.log("[Local] new instance","gameobject:",r?.guid);const h=new Hb(n.guid,l.guid);h.seed=a,e.deleteOnDisconnect===!0&&(h.deleteStateOnDisconnect=!0),o&&(o.position&&(h.position={x:o.position.x,y:o.position.y,z:o.position.z}),o.rotation&&(h.rotation={x:o.rotation.x,y:o.rotation.y,z:o.rotation.z,w:o.rotation.w}),o.scale&&(h.scale={x:o.scale.x,y:o.scale.y,z:o.scale.z})),h.position||(h.position={x:l.position.x,y:l.position.y,z:l.position.z}),h.rotation||(h.rotation={x:l.quaternion.x,y:l.quaternion.y,z:l.quaternion.z,w:l.quaternion.w}),h.scale||(h.scale={x:l.scale.x,y:l.scale.y,z:l.scale.z}),h.visible=n.visible,o?.parent&&(typeof o.parent=="string"?h.parent=o.parent:h.parent=o.parent.guid),h.hostData=t,i===!1&&(h.dontSave=!0),!e?.context?.connection&&A()&&console.debug("Object will be instantiated but it will not be synced: not connected",n.guid),e.context.connection.isInRoom&&Er.push(new WeakRef(l)),e?.context?.connection.send("new-instance-created",h)}else console.warn("Missing guid, can not send new instance event",l)}return r}function qb(){return Math.random()*9999999}const Er=new Array;function Xb(s){s.connection.beginListen("new-instance-created",async e=>{const t=await zS(e.originalGuid,s.scene);if(e.preventCreation===!0)return;if(!t){console.warn("could not find object that was instantiated: "+e.guid);return}const i=new sn;e.position&&(i.position=new c.Vector3(e.position.x,e.position.y,e.position.z)),e.rotation&&(i.rotation=new c.Quaternion(e.rotation.x,e.rotation.y,e.rotation.z,e.rotation.w)),e.scale&&(i.scale=new c.Vector3(e.scale.x,e.scale.y,e.scale.z)),i.parent=e.parent,e.seed&&(i.idProvider=new ft(e.seed)),i.visible=e.visible,i.context=s,id&&s.alias&&console.log("[Remote] instantiate in: "+s.alias);const n=Wo(t,i);Er.push(new WeakRef(n)),n&&(e.parent==="scene"&&s.scene.add(n),id&&console.log("[Remote] new instance","gameobject:",n?.guid,t))}),s.connection.beginListen("left-room",()=>{Er.length>0&&console.debug(`Left networking room, cleaning up ${Er.length} instantiated objects`);for(const e of Er){const t=e.deref();t&&t.destroy()}Er.length=0})}function US(s,e){const t=qb(),i=e??new sn;i.idProvider=new ft(t);const n=Wo(s,i);return{seed:t,instance:n}}const Qb={};function Yb(s,e){Qb[s]=e}async function zS(s,e){const t=Qb[s];if(t!=null){const i=await t(s);if(i)return i}return Kb(s,e)}function Kb(s,e){if(e===null||!s)return null;if(e.guid===s)return e;if(e.children)for(const t of e.children){const i=Kb(s,t);if(i)return i}return null}const nc=w("gizmos"),st=w("debugextension"),Wu=w("debugtypes");class NS{_types=new Map;constructor(){Wu&&console.warn("TypeStore: Created",this)}add(e,t){Wu&&console.warn("ADD TYPE",e);const i=this._types.get(e);i?Wu&&i!==t&&console.warn("Type name exists multiple times in your project and may lead to runtime errors:",e):this._types.set(e,t)}get(e){return this._types.get(e)||null}getKey(e){for(const[t,i]of this._types)if(i===e)return t;return null}}const VS=Symbol("BuiltInType"),P=new NS,$S=function(s){P.get(s.name)||P.add(s.name,s)},om=w("debugresolvedependencies"),WS=["/extensions/","extensions/"],GS=[{prefix:"/nodes/",dependencyName:"node"},{prefix:"/meshes/",dependencyName:"mesh"},{prefix:"/materials/",dependencyName:"material"},{prefix:"/textures/",dependencyName:"texture"},{prefix:"/animations/",dependencyName:"animation"},{prefix:"nodes/",dependencyName:"node"},{prefix:"meshes/",dependencyName:"mesh"},{prefix:"materials/",dependencyName:"material"},{prefix:"textures/",dependencyName:"texture"},{prefix:"animations/",dependencyName:"animation"}];async function rm(s,e){om&&console.log(s,e);const t=[];Kf(GS,s,e,t);const i=await Promise.all(t);return typeof e=="string"&&i.length===1?i[0]:i}function Zb(s,e){return!s||!e?!1:s["needle:identifier"]!=null&&e["needle:identifier"]!=null?s["needle:identifier"]===e["needle:identifier"]:!1}function HS(s,e){s["needle:identifier"]=e}function Kf(s,e,t,i){if(typeof t=="object"&&t!==void 0&&t!==null)for(const n of Object.keys(t)){const o=t[n];if(typeof o=="string"){const r=xy(e,o);if(r!=null)typeof r.then=="function"?i.push(r.then(a=>t[n]=a)):t[n]=r;else{const a=Sy(s,e,o);if(a){i.push(a.then(l=>(t[n]=l,l)));continue}}}else if(Array.isArray(o))for(let r=0;r<o.length;r++){const a=o[r],l=xy(e,a);if(l!==null){typeof l.then=="function"?i.push(l.then(h=>o[r]=h)):o[r]=l;continue}for(const h of s){const d=Jb(h.prefix,a);if(d>=0){om&&console.log(h,d,h.dependencyName),i.push(e.getDependency(h.dependencyName,d).then(u=>o[r]=u));break}}typeof a=="object"&&Kf(s,e,a,i)}else typeof o=="object"&&Kf(s,e,o,i)}else if(typeof t=="string"){const n=Sy(s,e,t);n&&i.push(n)}}function xy(s,e){if(s&&s.plugins&&typeof e=="string"){for(const t of WS)if(e.startsWith(t)){let i=e.substring(t.length);const n=i.indexOf("/");n>=0&&(i=i.substring(0,n));const o=s.plugins[i];if(st&&console.log(i,o),typeof o?.resolve=="function"){const r=e.substring(t.length+i.length+1);return o.resolve(s,r)}break}}return null}function Sy(s,e,t){for(const i of s){const n=Jb(i.prefix,t);if(n>=0)return om&&console.warn("GET DEPENDENCY",i,n,i.dependencyName),e.getDependency(i.dependencyName,n)}return null}function Jb(s,e){if(typeof e=="string"&&e.startsWith(s)){const t=e.substring(s.length),i=Number.parseInt(t);if(i>=0)return i}return-1}const Gu="NEEDLE_persistent_assets";function qS(s){return s?.___persistentAsset===!0}class XS{get name(){return Gu}parser;constructor(e){this.parser=e}async afterRoot(e){if(!this.parser?.json?.extensions)return;const t=this.parser.json.extensions[Gu];if(!t)return;st&&console.log(t);const i=new Array;for(const n of t?.assets){const o=rm(this.parser,n);o&&i.push(o)}await Promise.all(i)}resolve(e,t){const i=Number.parseInt(t);if(i>=0){st&&console.log(t);const n=e.json.extensions[Gu];if(n){const o=n?.assets[i];if(o&&typeof o=="object"){o.___persistentAsset=!0;const r=o.__type;r&&P.get(r)}return o}}return null}}const mn=w("debugserializer");class QS{register(e,t){if(this.typeMap.has(e)){const i=this.typeMap.get(e);if(i===t)return;mn&&console.warn("Type: "+e+" is already registered",t,i)}mn&&console.log("Register type serializer",t.name,t,e),this.typeMap.set(e,t)}typeMap=new Map;getSerializer(e){if(e)return this.typeMap.get(e)}getSerializerForConstructor(e,t=0){if(t>20)return;if(!e||!e.constructor){mn&&console.log("invalid type");return}const i=e.name,n=this.getSerializer(e);if(n!==void 0)return mn&&console.log("FOUND SERIALIZER",n?.name,e.name,e.constructor.name,"for type: "+i,n,e,this.typeMap),n;const o=Object.getPrototypeOf(e);if(o&&o!==e){const r=this.getSerializerForConstructor(o,++t);if(r){const a=o.constructor||o.prototype;mn&&console.log("FOUND SERIALIZER(in constructor) "+a.constructor.name,a.name,a,r),this.register(a,r)}return r}mn&&console.warn("No serializer found for "+i,e,e.name,e.constructor.name)}}const nd=new QS;class Ui{name;constructor(e,t){if(this.name=t,Array.isArray(e))for(const i of e)nd.register(i,this);else nd.register(e,this)}}class YS{isDevMode=Li();cache={};registerDefinedKeys(e,t){if(this.isDevMode&&this.cache[e]===void 0){this.cache[e]=Object.keys(t);const i=t;i.$serializedTypes&&Object.keys(i.$serializedTypes)&&this.cache[e].push(...Object.keys(i.$serializedTypes)),mn&&console.log("registerDefinedKeys for "+e,this.cache[e],t)}}getDefinedKey(e,t){return this.cache[e]===void 0?!1:this.cache[e].includes(t)}}class am{root;gltf;gltfId;object;target;nodeId;nodeToObject;objectToNode;context;path;type;serializable;implementationInformation;constructor(e){this.root=e}}function e0(s,e){const t=s.$serializedTypes;if(t===void 0)return null;const i={};for(const o in t){const r=s[o];if(r!=null&&typeof r=="object"){const a=nd.getSerializerForConstructor(r);if(a){i[o]=a.onSerialize(r,e);continue}}i[o]=r}function n(o){const r=P._types;for(const[a,l]of r)if(l===s.constructor)return a;return o.__name||o.constructor.name}return i.name=n(s),typeof s.guid=="string"&&(i.guid=s.guid),i}const Ah=[];function t0(s,e){if(!s)return e;typeof s.$serializedTypes=="object"&&(e||(e={}),Object.assign(e,s.$serializedTypes));const t=Object.getPrototypeOf(s);return t0(t,e)}function sd(s,e,t){if(!s)return!1;if(t.target=s,s.onBeforeDeserialize!==void 0){const n=s.onBeforeDeserialize(e,t);if(typeof n=="boolean")return n}const i=t0(s);if(e){if(typeof e.guid=="string"&&(s.guid=e.guid),i)for(const n in i){let o=function(l){const d=l.type;return d?Zf(a,d,t,void 0,s[n]):Zf(a,l,t,void 0,s[n])};const r=i[n],a=e[n];if(mn&&console.log(n,a,s,r),!(s[n]!==void 0&&a===void 0)&&(t.type=void 0,t.path=n,t.serializable=r,!(s.onBeforeDeserializeMember!==void 0&&s.onBeforeDeserializeMember(n,a,t)===!0))){if(r===null)s[n]=a;else{if(Array.isArray(r))for(let l=0;l<r.length;l++){const h=r[l],d=o(h);if(d!==void 0||l===r.length-1){s[n]=d;break}}else s[n]=o(r);Ah.length=0}s.onAfterDeserializeMember!==void 0&&s.onAfterDeserializeMember(n,a,t)}}JS(s,e)}return ZS(s,e,t.implementationInformation),s.onAfterDeserialize!==void 0&&s.onAfterDeserialize(e,t),!0}const KS=w("noerrors");function ZS(s,e,t){if(KS||!e||!Li()||!s||s.constructor&&s.constructor[VS]===!0)return;const i=s.constructor?.name,n=Object.getOwnPropertyNames(e);for(const o of n){if(o==="sourceId")continue;const r=s[o];if(r==null)continue;const a=e[o];if(t?.getDefinedKey(i,o)===!1){const l=o.charAt(0).toUpperCase()+o.slice(1);t.getDefinedKey(i,l)&&(Po(oi.Warn,'<strong>Please rename</strong> "'+l+'" to "'+o+'" in '+i),console.warn('Please use lowercase for field: "'+l+'" in '+i,a,s));continue}if(a!=null){if(typeof a=="object"&&(r===void 0||!r.isObject3D)){if(typeof a.node=="number"||typeof a.guid=="string"){if(a.could_not_resolve)continue;if(!(r!==void 0&&Object.keys(r).length>1)){Po(oi.Warn,`<strong>Missing serialization for object reference!</strong>
171
171
 
172
172
  Please change to:
173
173
  @serializable(Object3D)
@@ -1395,7 +1395,7 @@ If you need multisampling consider changing 'auto' to a fixed value (e.g. 4).`))
1395
1395
  // be blended onto the scene.
1396
1396
  gl_FragColor = vec4(direct, max);
1397
1397
  return;
1398
- `)},e.userData.isLightBlendMaterial=!0}applyShadowMaterial(){if(this.targetMesh)if(this.targetMesh.material.type!=="ShadowMaterial"){const e=new c.ShadowMaterial;e.color=this.shadowColor,e.opacity=this.shadowColor.alpha,this.applyMaterialOptions(e),this.targetMesh.material=e,e.userData.isShadowCatcherMaterial=!0}else{const e=this.targetMesh.material;e.color=this.shadowColor,e.opacity=this.shadowColor.alpha,this.applyMaterialOptions(e),e.userData.isShadowCatcherMaterial=!0}}applyOccluderMaterial(){if(this.targetMesh){let e=this.targetMesh.material;if(!e){const t=new c.MeshBasicMaterial;this.targetMesh.material=t,e=t}e.depthWrite=!0,e.stencilWrite=!0,e.colorWrite=!1,this.gameObject.renderOrder=-100}}applyMaterialOptions(e){e&&(e.depthWrite=!1,e.stencilWrite=!1)}}nw([f()],Bc.prototype,"mode");nw([f(Z)],Bc.prototype,"shadowColor");const Ph=new Map;function sw(s,e){if(Ph.has(s))return Ph.get(s);const t=new URL(s,window.location.href),i=Sk(t,e);return Ph.set(s,i),i.finally(()=>{Ph.delete(s)}),i}async function Sk(s,e){if(!s)return Promise.resolve(null);const t=s.pathname,i=s.toString().toLowerCase().includes("pmrem")||s.searchParams.get("pmrem")!=null,n=t.endsWith(".exr"),o=t.endsWith(".hdr"),r=t.endsWith(".ktx2");let a;if(n)a=new q.EXRLoader;else if(o)a=new q.RGBELoader;else if(r){const{ktx2Loader:u}=ne.createLoaders(e);a=u}else a=new c.TextureLoader;const l=s.toString();return await a.loadAsync(l).then(u=>{if(u){const p=t.lastIndexOf("/");u.name=t.substring(p>=0?p+1:0),i&&(u.mapping=c.CubeUVReflectionMapping),a instanceof c.TextureLoader&&(u.colorSpace=c.SRGBColorSpace)}return u}).catch(u=>(console.warn("Failed to load texture from url:",s),null))}var Ck=Object.defineProperty,Fc=(s,e,t,i)=>{for(var n=void 0,o=s.length-1,r;o>=0;o--)(r=s[o])&&(n=r(e,t,n)||n);return n&&Ck(e,t,n),n};const zt=w("debugskybox");Cg("background-image");Cg("environment-image");function P_(s,e,t,i,n){if(e==="transparent"||e?.startsWith("rgb")||e?.startsWith("#"))return console.warn(`Needle Engine: Invalid ${n} value (${e}). Did you mean to set background-color instead?`),null;const o=new fu;o.allowDrop=!1,o.allowNetworking=!1,o.background=t,o.environment=i,x.addComponent(s.scene,o);const r=a=>{typeof a=="string"&&(zt&&console.log(n,"CHANGED TO",a),o.setSkybox(a))};return H_(s.domElement,n,r),o.addEventListener("destroy",()=>{zt&&console.log("Destroyed attribute remote skybox",n),q_(s.domElement,n,r)}),o.setSkybox(e)}const xd=new Array;re.registerCallback(oe.ContextCreationStart,s=>{const e=s.context,t=e.domElement.getAttribute("background-image"),i=e.domElement.getAttribute("environment-image"),n=t===i;if(t&&!n){zt&&console.log("Creating remote skybox to load "+t);const o=P_(e,t,!0,!1,"background-image");o&&xd.push(o)}if(i){zt&&console.log("Creating remote environment to load "+i);const o=P_(e,i,n,!0,"environment-image");o&&xd.push(o)}});re.registerCallback(oe.ContextCreationStart,()=>Promise.all(xd).finally(()=>{xd.length=0}));const Qo=class extends k{url;allowDrop=!0;background=!0;environment=!0;allowNetworking=!0;_prevUrl;_prevLoadedEnvironment;_prevEnvironment=null;_prevBackground=null;onEnable(){this.setSkybox(this.url),this.registerDropEvents()}onDisable(){this.context.scene.environment===this._prevLoadedEnvironment&&(this.context.scene.environment=this._prevEnvironment,$t.backgroundShouldBeTransparent(this.context)||(this.context.scene.background=this._prevBackground),this._prevLoadedEnvironment=void 0),this.unregisterDropEvents(),this.context.mainCameraComponent?.applyClearFlags()}urlChangedSyncField(){this.allowNetworking&&this.url&&(this.isRemoteTexture(this.url)?this.setSkybox(this.url):zt&&console.warn(`RemoteSkybox: Not setting skybox: ${this.url} is not a remote texture. If you want to set a local texture, set allowNetworking to false.`))}async setSkybox(e,t){if(!this.activeAndEnabled||(e=Pk(e,this.environment,this.background),!e))return!1;if(t??=e,this.isValidTextureType(t)||console.warn('Potentially invalid skybox URL: "'+t+'" on '+(this.name||this.gameObject?.name||"context")),zt&&console.log("Set remote skybox url: "+e),this._prevUrl===e&&this._prevLoadedEnvironment)return this.apply(),!0;this._prevLoadedEnvironment?.dispose(),this._prevLoadedEnvironment=void 0,this._prevUrl=e;const i=await sw(e,this.context.renderer);return i?this.enabled?this._prevUrl!==e?(zt&&console.warn("RemoteSkybox: URL changed while loading texture, aborting setSkybox"),!1):(this.url=e,this._prevLoadedEnvironment=i,this.apply(),!0):(zt&&console.warn("RemoteSkybox: Component is not enabled, aborting setSkybox"),!1):(zt&&console.warn("RemoteSkybox: Failed to load texture from url",e),!1)}apply(){const e=this._prevLoadedEnvironment;e&&(e instanceof c.CubeTexture||e instanceof c.CompressedCubeTexture||e.mapping==c.CubeUVReflectionMapping||(e.mapping=c.EquirectangularRefractionMapping,e.needsUpdate=!0),this.context.scene.background!==e&&(this._prevBackground=this.context.scene.background),this.context.scene.environment!==e&&(this._prevEnvironment=this.context.scene.environment),zt&&console.log("Set remote skybox",this.url,!$t.backgroundShouldBeTransparent(this.context)),this.environment&&(this.context.scene.environment=e),this.background&&!$t.backgroundShouldBeTransparent(this.context)&&(this.context.scene.background=e),this.context.mainCameraComponent?.backgroundBlurriness!==void 0&&(this.context.scene.backgroundBlurriness=this.context.mainCameraComponent.backgroundBlurriness))}validProtocols=["file:","blob:","data:"];validTextureTypes=[".ktx2",".hdr",".exr",".jpg",".jpeg",".png"];isRemoteTexture(e){return e.startsWith("http://")||e.startsWith("https://")}isValidTextureType(e){for(const t of this.validTextureTypes)if(e.includes(t))return!0;for(const t of this.validProtocols)if(e.startsWith(t))return!0;return!1}registerDropEvents(){this.unregisterDropEvents(),this.context.domElement.addEventListener("dragover",this.onDragOverEvent),this.context.domElement.addEventListener("drop",this.onDrop)}unregisterDropEvents(){this.context.domElement.removeEventListener("dragover",this.onDragOverEvent),this.context.domElement.removeEventListener("drop",this.onDrop)}onDragOverEvent=e=>{if(this.allowDrop&&e.dataTransfer)for(const t of e.dataTransfer.types)(t==="text/uri-list"||t==="Files")&&e.preventDefault()};onDrop=e=>{if(this.allowDrop&&e.dataTransfer){for(const t of e.dataTransfer.types)if(zt&&console.log(t),t==="text/uri-list"){const i=e.dataTransfer.getData(t);zt&&console.log(t,i);let n=new RegExp(/polyhaven.com\/asset_img\/.+?\/(?<name>.+)\.png/).exec(i)?.groups?.name;if(n||(n=new RegExp(/polyhaven\.com\/a\/(?<name>.+)/).exec(i)?.groups?.name),zt&&console.log(n),n){const o="https://dl.polyhaven.org/file/ph-assets/HDRIs/exr/1k/"+n+"_1k.exr";console.log(`[Remote Skybox] Setting skybox from url: ${o}`),e.preventDefault(),this.setSkybox(o);break}else if(this.isValidTextureType(i)){console.log("[Remote Skybox] Setting skybox from url: "+i),e.preventDefault(),this.setSkybox(i);break}else{console.warn(`[RemoteSkybox] Unknown url ${i}. If you want to load a skybox from a url, make sure it is a valid image url. Url must end with${this.validTextureTypes.join(", ")}.`);const o=new CustomEvent("dropped-unknown-url",{detail:{sender:this,event:e,url:i,apply:r=>{e.preventDefault(),this.setSkybox(r)}}});this.dispatchEvent(o)}}else if(t=="Files"){const i=e.dataTransfer.files.item(0);if(zt&&console.log(t,i),!i)continue;if(!this.isValidTextureType(i.name)){console.warn(`[RemoteSkybox]: File "${i.name}" is not supported. Supported files are ${this.validTextureTypes.join(", ")}`);return}e.preventDefault(),this.setSkybox(i.name);break}}}};Fc([Km(Qo.prototype.urlChangedSyncField),f(URL)],Qo.prototype,"url");Fc([f()],Qo.prototype,"allowDrop");Fc([f()],Qo.prototype,"background");Fc([f()],Qo.prototype,"environment");Fc([f()],Qo.prototype,"allowNetworking");let fu=Qo;function Pk(s,e,t){if(s==null)return null;const i=e&&!t;switch(s.toLowerCase()){case"studio":return i?"https://cdn.needle.tools/static/skybox/modelviewer-Neutral-small.pmrem4x4.ktx2?pmrem":"https://cdn.needle.tools/static/skybox/modelviewer-Neutral.pmrem4x4.ktx2?pmrem";case"blurred-skybox":return i?"https://cdn.needle.tools/static/skybox/blurred-skybox-small.pmrem4x4.ktx2?pmrem":"https://cdn.needle.tools/static/skybox/blurred-skybox.pmrem4x4.ktx2?pmrem";case"quicklook-ar":return i?"https://cdn.needle.tools/static/skybox/QuickLook-ARMode-small.pmrem4x4.ktx2?pmrem":"https://cdn.needle.tools/static/skybox/QuickLook-ARMode.pmrem4x4.ktx2?pmrem";case"quicklook":return i?"https://cdn.needle.tools/static/skybox/QuickLook-ObjectMode-small.pmrem4x4.ktx2?pmrem":"https://cdn.needle.tools/static/skybox/QuickLook-ObjectMode.pmrem4x4.ktx2?pmrem"}return s}var Mk=Object.defineProperty,pu=(s,e,t,i)=>{for(var n=void 0,o=s.length-1,r;o>=0;o--)(r=s[o])&&(n=r(e,t,n)||n);return n&&Mk(e,t,n),n};const Uc=class ow extends k{target=null;followFactor=.1;rotateFactor=.1;positionAxes=zr.All;flipForward=!1;static _invertForward=new c.Quaternion().setFromAxisAngle(new c.Vector3(0,1,0),Math.PI);_firstUpdate=!0;onBeforeRender(){this.updateNow(!1)}updateNow(e){if(!(!this.target||this.target===this.gameObject)){if(this.followFactor>0){const t=X(this.target),i=this._firstUpdate||e?1:I.clamp01(this.context.time.deltaTime*this.followFactor),n=this.worldPosition;this.positionAxes&zr.X&&(n.x=I.lerp(n.x,t.x,i)),this.positionAxes&zr.Y&&(n.y=I.lerp(n.y,t.y,i)),this.positionAxes&zr.Z&&(n.z=I.lerp(n.z,t.z,i)),this.worldPosition=n}if(this.rotateFactor>0){const t=ue(this.target);this.flipForward&&t.premultiply(ow._invertForward);const i=this._firstUpdate||e?1:I.clamp01(this.context.time.deltaTime*this.rotateFactor);this.worldQuaternion=this.worldQuaternion.slerp(t,i)}this._firstUpdate=!1}}};pu([f(c.Object3D)],Uc.prototype,"target");pu([f()],Uc.prototype,"followFactor");pu([f()],Uc.prototype,"rotateFactor");pu([f()],Uc.prototype,"positionAxes");let mu=Uc;var Ok=Object.defineProperty,zc=(s,e,t,i)=>{for(var n=void 0,o=s.length-1,r;o>=0;o--)(r=s[o])&&(n=r(e,t,n)||n);return n&&Ok(e,t,n),n};const El=w("debugspatialtrigger"),M_=new c.Layers,O_=new c.Layers;function kk(s,e){return M_.mask=s,O_.mask=e,M_.test(O_)}class En extends k{triggerMask=0;onEnter;onStay;onExit;start(){El&&console.log(this.name,this.triggerMask,this)}update(){this.currentIntersected.length=0;for(const e of gu.triggers)kk(e.triggerMask,this.triggerMask)&&e.test(this.gameObject)&&this.currentIntersected.push(e);for(let e=this.lastIntersected.length-1;e>=0;e--){const t=this.lastIntersected[e];this.currentIntersected.indexOf(t)<0&&(this.onExitTrigger(t),this.lastIntersected.splice(e,1))}for(const e of this.currentIntersected)this.lastIntersected.indexOf(e)<0&&this.onEnterTrigger(e),this.onStayTrigger(e);this.lastIntersected.length=0,this.lastIntersected.push(...this.currentIntersected)}currentIntersected=[];lastIntersected=[];onEnterTrigger(e){El&&console.log("ENTER TRIGGER",this.name,e.name,this,e),e.raiseOnEnterEvent(this),this.onEnter?.invoke()}onExitTrigger(e){El&&console.log("EXIT TRIGGER",this.name,e.name),e.raiseOnExitEvent(this),this.onExit?.invoke()}onStayTrigger(e){e.raiseOnStayEvent(this),this.onStay?.invoke()}}zc([f()],En.prototype,"triggerMask");zc([f(de)],En.prototype,"onEnter");zc([f(de)],En.prototype,"onStay");zc([f(de)],En.prototype,"onExit");const rw=class Hh extends k{static triggers=[];triggerMask;boxHelper;start(){El&&console.log(this.name,this.triggerMask,this)}onEnable(){Hh.triggers.push(this),this.boxHelper||(this.boxHelper=x.addComponent(this.gameObject,nt),this.boxHelper?.showHelper(null,El))}onDisable(){Hh.triggers.splice(Hh.triggers.indexOf(this),1)}test(e){return this.boxHelper?this.boxHelper.isInBox(e)??!1:!1}raiseOnEnterEvent(e){x.foreachComponent(this.gameObject,t=>{t!==e&&t instanceof En&&t.onEnterTrigger(this)},!1)}raiseOnStayEvent(e){x.foreachComponent(this.gameObject,t=>{t!==e&&t instanceof En&&t.onStayTrigger(this)},!1)}raiseOnExitEvent(e){x.foreachComponent(this.gameObject,t=>{t!==e&&t instanceof En&&t.onExitTrigger(this)},!1)}};zc([f()],rw.prototype,"triggerMask");let gu=rw;var Rk=Object.defineProperty,Ek=(s,e,t,i)=>{for(var n=void 0,o=s.length-1,r;o>=0;o--)(r=s[o])&&(n=r(e,t,n)||n);return n&&Rk(e,t,n),n};const si=w("debugspectator");class yu extends k{cam=null;useKeys=!0;_mode=0;get mode(){return this._mode}set mode(e){this._mode=e}get isSpectating(){return this._handler?.currentTarget!==void 0}isSpectatingUser(e){return this.target?.userId===e}isFollowedBy(e){return this.followers?.includes(e)}get followers(){return this._networking.followers}stopSpectating(){if(this.context.isInXR){this.followSelf();return}this.target=void 0}get localId(){return this.context.connection.connectionId??"local"}set target(e){if(this._handler){const t=this._handler.currentTarget?.userId,i=this.context.players.getPlayerView(this.localId);e===void 0||this.context.isInXR===!1&&i?.currentObject===e.currentObject?this._handler.currentTarget!==void 0&&(this._handler.disable(),x.setActive(this.gameObject,!1),this.orbit&&(this.orbit.enabled=!0),this._networking.onSpectatedObjectChanged(e,t)):this._handler.currentTarget!==e&&(this._handler.set(e),x.setActive(this.gameObject,!0),this.orbit&&(this.orbit.enabled=!1),this._networking.onSpectatedObjectChanged(e,t))}}get target(){return this._handler?.currentTarget}requestAllFollowMe(){this._networking.onRequestFollowMe()}get isSpectatingSelf(){return this.isSpectating&&this.target?.currentObject===this.context.players.getPlayerView(this.localId)?.currentObject}orbit=null;_handler;eventSub_WebXRRequestStartEvent=null;eventSub_WebXRStartEvent=null;eventSub_WebXREndEvent=null;_debug;_networking;awake(){if(this._debug=new Lk(this.context,this),this._networking=new jk(this.context,this),this._networking.awake(),x.setActive(this.gameObject,!1),this.cam=x.getComponent(this.gameObject,$t),!this.cam){console.warn("SpectatorCamera: Spectator camera needs camera component on the same object.",this);return}!this._handler&&this.cam&&(this._handler=new Tk(this.context,this.cam,this)),this.orbit=x.getComponent(this.context.mainCamera,he)}onDestroy(){this.stopSpectating(),this._handler?.destroy(),this._networking?.destroy()}isSupportedPlatform(){const e=window.navigator.userAgent,t=/Windows|MacOS/.test(e),i=/Windows NT/.test(e)&&/Edg/.test(e)&&!/Win64/.test(e);return t&&!i}onBeforeXR(e){this.isSupportedPlatform()&&x.setActive(this.gameObject,!0)}onEnterXR(e){this.isSupportedPlatform()&&(si&&console.log(this.context.mainCamera),this.context.mainCamera&&this.followSelf())}onLeaveXR(e){this.context.removeCamera(this.cam),x.setActive(this.gameObject,!1),this.orbit&&(this.orbit.enabled=!0),this._handler?.set(void 0),this._handler?.disable(),this.isSpectatingSelf&&this.stopSpectating()}followSelf(){this.target=this.context.players.getPlayerView(this.context.connection.connectionId),this.target||(this.context.players.setPlayerView(this.localId,this.context.mainCamera,Us.Headset),this.target=this.context.players.getPlayerView(this.localId)),si&&console.log("Follow self",this.target)}onAfterRender(){if(!this.cam)return;const e=this.context.renderer,t=e.xr.enabled;if(!e.xr.isPresenting&&!this._handler?.currentTarget)return;this._handler?.update(this._mode);const i=e.getRenderTarget();let n=null;const o=e.state;if(!i){if(!e.state.bindFramebuffer||!o.bindXRFramebuffer)return;n=e._framebuffer,o.bindXRFramebuffer(null)}this.setAvatarFlagsBeforeRender();const r=this.context.mainCameraComponent;if(r){const h=r.backgroundColor;h&&e.setClearColor(h,h.alpha),this.cam.backgroundColor=h,this.cam.clearFlags=r.clearFlags,this.cam.nearClipPlane=r.nearClipPlane,this.cam.farClipPlane=r.farClipPlane}else e.setClearColor(new c.Color(1,1,1));e.setRenderTarget(null),e.xr.enabled=!1;const a=this.cam?.threeCamera;this.context.updateAspect(a);const l=e.xr.isPresenting;e.xr.isPresenting=!1,e.setSize(this.context.domWidth,this.context.domHeight),e.render(this.context.scene,a),e.xr.isPresenting=l,e.xr.enabled=t,i?e.setRenderTarget(i):o.bindXRFramebuffer&&o.bindXRFramebuffer(n),this.resetAvatarFlags()}setAvatarFlagsBeforeRender(){const e=this._mode===0;for(const t of xe.instances)if(t.avatar&&"isLocalAvatar"in t.avatar&&"flags"in t.avatar){let i=bn.All;this.isSpectatingSelf&&(i=e&&t.avatar.isLocalAvatar?bn.FirstPerson:bn.ThirdPerson);const n=t.avatar.flags;if(!n)continue;for(const o of n)o.UpdateVisible(i)}}resetAvatarFlags(){for(const e of xe.instances)if(e.avatar&&"flags"in e.avatar){const t=e.avatar.flags;if(!t)continue;for(const i of t)"isLocalAvatar"in e.avatar&&e.avatar?.isLocalAvatar?i.UpdateVisible(bn.FirstPerson):i.UpdateVisible(bn.ThirdPerson)}}}Ek([f()],yu.prototype,"useKeys");class Tk{context;cam;spectator;follow;target;view;currentObject;get currentTarget(){return this.view}constructor(e,t,i){this.context=e,this.cam=t,this.spectator=i}set(e){const t=e?.currentObject;if(!t){this.spectator.stopSpectating();return}t!==this.currentObject&&(this.currentObject=t,this.view=e,this.follow||(this.follow=x.addComponent(this.cam.gameObject,mu)),this.target||(this.target=new c.Object3D),t.add(this.target),this.follow.enabled=!0,this.follow.target=this.target,si&&console.log("FOLLOW",t),this.context.isInXR?this.context.removeCamera(this.cam):this.context.setCurrentCamera(this.cam))}disable(){si&&console.log("STOP FOLLOW",this.currentObject),this.view=void 0,this.currentObject=void 0,this.context.removeCamera(this.cam),this.follow&&(this.follow.enabled=!1)}destroy(){this.target?.removeFromParent(),this.follow&&x.destroy(this.follow)}update(e){if(this.currentTarget?.isConnected===!1||this.currentTarget?.removed===!0){si&&console.log("Target disconnected or timeout",this.currentTarget),this.spectator.stopSpectating();return}this.currentTarget&&this.currentTarget?.currentObject!==this.currentObject&&(si&&console.log("Target changed",this.currentObject,"to",this.currentTarget.currentObject),this.set(this.currentTarget));const t=this.context.mainCamera;if(t){const n=this.cam.threeCamera;(n.near!==t.near||n.far!==t.far)&&(n.near=t.near,n.far=t.far,n.updateProjectionMatrix())}const i=this.follow?.target;if(!(!i||!this.follow)){switch(e){case 0:this.view?.viewDevice!==Us.Browser?(this.follow.followFactor=5,this.follow.rotateFactor=5):(this.follow.followFactor=50,this.follow.rotateFactor=50),i.position.set(0,0,0);break;case 1:this.follow.followFactor=3,this.follow.rotateFactor=2,i.position.set(0,.5,1.5);break}this.follow.flipForward=!1,this.view?.viewDevice!==Us.Browser?i.quaternion.copy(Ak):i.quaternion.identity()}}}const Ak=new c.Quaternion().setFromAxisAngle(new c.Vector3(0,1,0),Math.PI);class Lk{context;spectator;constructor(e,t){this.context=e,this.spectator=t,console.log("[Spectator Camera] Click other avatars or cameras to follow them. Press ESC to exit spectator mode."),this.context.domElement.addEventListener("keydown",n=>{if(!this.spectator.useKeys)return;n.key==="Escape"&&this.spectator.stopSpectating()});let i=0;this.context.input.addEventListener(we.PointerDown,n=>{i=this.context.time.time}),this.context.input.addEventListener(we.PointerUp,n=>{const o=this.context.time.time-i;o>1?this.spectator.stopSpectating():this.context.input.getPointerClicked(0)&&o<.3&&this.trySelectObject()})}trySelectObject(){const e=new Zs;e.setMask(16777215);const t=this.context.physics.raycast(e);if(si&&console.log(...t),t?.length)for(const i of t){if(i.distance<.2)continue;const n=i.object,o=x.getComponentInParent(n,xe),r=o?.connectionId;if(r){const a=this.context.players.getPlayerView(r);this.spectator.target=a,si&&console.log("spectate",r,o);break}}}}class Dk{guid;dontSave=!0;targetUserId;stoppedFollowing;constructor(e,t,i){this.guid=e,this.targetUserId=t,this.stoppedFollowing=i}}class Ik{guid;userId;constructor(e,t){this.guid=e.guid,this.userId=t}}class jk{followers=[];context;spectator;_followerEventMethod;_requestFollowMethod;_joinedRoomMethod;constructor(e,t){this.context=e,this.spectator=t,this._followerEventMethod=this.onFollowerEvent.bind(this),this._requestFollowMethod=this.onRequestFollowEvent.bind(this),this._joinedRoomMethod=this.onUserJoinedRoom.bind(this)}awake(){this.context.connection.beginListen("spectator-follower-changed",this._followerEventMethod),this.context.connection.beginListen("spectator-request-follow",this._requestFollowMethod),this.context.connection.beginListen(Q.JoinedRoom,this._joinedRoomMethod),this.context.domElement.addEventListener("keydown",e=>{this.spectator.useKeys&&(e.key==="f"?this.onRequestFollowMe():e.key==="Escape"&&this.onRequestFollowMe(!0))})}destroy(){this.context.connection.stopListen("spectator-follower-changed",this._followerEventMethod),this.context.connection.stopListen("spectator-request-follow",this._requestFollowMethod),this.context.connection.stopListen(Q.JoinedRoom,this._joinedRoomMethod)}onSpectatedObjectChanged(e,t){if(si&&console.log(this.context.connection.connectionId,"onSpectatedObjectChanged",e,t),this.context.connection.connectionId){const i=e?.userId===void 0,n=i?t:e?.userId,o=new Dk(this.context.connection.connectionId,n,i);this.context.connection.send("spectator-follower-changed",o)}}onRequestFollowMe(e=!1){if(si&&console.log("Request follow",this.context.connection.connectionId),this.context.connection.connectionId){this.spectator.stopSpectating();const t=e?void 0:this.context.connection.connectionId,i=new Ik(this.spectator,t);this.context.connection.send("spectator-request-follow",i)}}onUserJoinedRoom(){w("followme")&&this.onRequestFollowMe()}onFollowerEvent(e){const t=e.targetUserId,i=e.guid;if(si&&console.log(e),t===this.context.connection.connectionId)if(e.stoppedFollowing){const n=this.followers.indexOf(i);n!==-1&&(this.followers.splice(n,1),this.removeDisconnectedFollowers(),console.log(i,"unfollows you",this.followers.length))}else this.followers.includes(i)||(this.followers.push(i),this.removeDisconnectedFollowers(),console.log(i,"follows you",this.followers.length))}removeDisconnectedFollowers(){for(let e=this.followers.length-1;e>=0;e--){const t=this.followers[e];this.context.connection.userIsInRoom(t)===!1&&this.followers.splice(e,1)}}_lastRequestFollowUser;onRequestFollowEvent(e){if(this._lastRequestFollowUser=e,e.userId===this.context.connection.connectionId)this.spectator.stopSpectating();else if(e.userId===void 0)this.spectator.stopSpectating();else{const t=this.context.players.getPlayerView(e.userId);if(t)this.spectator.target=t;else return si&&console.warn("Could not find view",e.userId),this.enforceFollow(),!1}return!0}_enforceFollowInterval;enforceFollow(){this._enforceFollowInterval||(this._enforceFollowInterval=setInterval(()=>{this._lastRequestFollowUser===void 0||this._lastRequestFollowUser.userId&&this.spectator.isFollowedBy(this._lastRequestFollowUser.userId)?(clearInterval(this._enforceFollowInterval),this._enforceFollowInterval=void 0):(si&&console.log("REQUEST FOLLOW AGAIN",this._lastRequestFollowUser.userId),this.onRequestFollowEvent(this._lastRequestFollowUser))},1e3))}}class _n{bb=null;bb_pos=0;__init(e,t){return this.bb_pos=e,this.bb=t,this}static getRootAsSyncedCameraModel(e,t){return(t||new _n).__init(e.readInt32(e.position())+e.position(),e)}static getSizePrefixedRootAsSyncedCameraModel(e,t){return e.setPosition(e.position()+se.SIZE_PREFIX_LENGTH),(t||new _n).__init(e.readInt32(e.position())+e.position(),e)}userId(e){const t=this.bb.__offset(this.bb_pos,4);return t?this.bb.__string(this.bb_pos+t,e):null}guid(e){const t=this.bb.__offset(this.bb_pos,6);return t?this.bb.__string(this.bb_pos+t,e):null}dontSave(){const e=this.bb.__offset(this.bb_pos,8);return e?!!this.bb.readInt8(this.bb_pos+e):!1}pos(e){const t=this.bb.__offset(this.bb_pos,10);return t?(e||new jo).__init(this.bb_pos+t,this.bb):null}rot(e){const t=this.bb.__offset(this.bb_pos,12);return t?(e||new jo).__init(this.bb_pos+t,this.bb):null}static startSyncedCameraModel(e){e.startObject(5)}static addUserId(e,t){e.addFieldOffset(0,t,0)}static addGuid(e,t){e.addFieldOffset(1,t,0)}static addDontSave(e,t){e.addFieldInt8(2,+t,0)}static addPos(e,t){e.addFieldStruct(3,t,0)}static addRot(e,t){e.addFieldStruct(4,t,0)}static endSyncedCameraModel(e){return e.endObject()}static finishSyncedCameraModelBuffer(e,t){e.finish(t)}static finishSizePrefixedSyncedCameraModelBuffer(e,t){e.finish(t,void 0,!0)}}var Bk=Object.defineProperty,Fk=(s,e,t,i)=>{for(var n=void 0,o=s.length-1,r;o>=0;o--)(r=s[o])&&(n=r(e,t,n)||n);return n&&Bk(e,t,n),n};const Sd="SCAM";Qp(Sd,_n.getRootAsSyncedCameraModel);const Jt=new se.Builder;class Uk{userId;guid;constructor(e,t){this.guid=t,this.userId=e}send(e,t){if(e){Jt.clear();const i=Jt.createString(this.guid),n=Jt.createString(this.userId);_n.startSyncedCameraModel(Jt),_n.addGuid(Jt,i),_n.addUserId(Jt,n);const o=X(e),r=Md(e);_n.addPos(Jt,jo.createVec3(Jt,o.x,o.y,o.z)),_n.addRot(Jt,jo.createVec3(Jt,r.x,r.y,r.z));const a=_n.endSyncedCameraModel(Jt);Jt.finish(a,Sd),t.sendBinary(Jt.asUint8Array())}}}const aw=class Pp extends k{static instances=[];getCameraObject(e){const t=this.userToCamMap[e];return t?this.remoteCams[t].obj:null}cameraPrefab=null;_lastWorldPosition;_lastWorldQuaternion;_model=null;_needsUpdate=!0;_lastUpdateTime=0;remoteCams={};userToCamMap={};_camTimeoutInSeconds=10;_receiveCallback=null;async awake(){this._lastWorldPosition=this.worldPosition.clone(),this._lastWorldQuaternion=this.worldQuaternion.clone(),this.cameraPrefab&&("uri"in this.cameraPrefab&&(this.cameraPrefab=await this.cameraPrefab.instantiate(this.gameObject)),this.cameraPrefab&&"isObject3D"in this.cameraPrefab&&(this.cameraPrefab.visible=!1))}onEnable(){this._receiveCallback=this.context.connection.beginListenBinary(Sd,this.onReceivedRemoteCameraInfoBin.bind(this))}onDisable(){this.context.connection.stopListenBinary(Sd,this._receiveCallback)}update(){for(const n in this.remoteCams){const o=this.remoteCams[n],r=this.context.time.realtimeSinceStartup-o.lastUpdate;if(!o||r>this._camTimeoutInSeconds){A()&&console.log("Remote cam timeout",n),o?.obj&&x.destroy(o.obj),delete this.remoteCams[n],o&&delete this.userToCamMap[o.userId],Pp.instances.push(o),this.context.players.removePlayerView(o.userId,Us.Browser);continue}}if(this.context.isInXR)return;const e=this.context.mainCamera;if(e===null){this.enabled=!1;return}if(!this.context.connection.isConnected||this.context.connection.connectionId===null)return;this._model===null&&(this._model=new Uk(this.context.connection.connectionId,this.context.connection.connectionId+"_camera"));const t=X(e),i=ue(e);(t.distanceTo(this._lastWorldPosition)>.001||i.angleTo(this._lastWorldQuaternion)>.01)&&(this._needsUpdate=!0),this._lastWorldPosition.copy(t),this._lastWorldQuaternion.copy(i),!((!this._needsUpdate||this.context.time.frameCount%2!==0)&&!(this.context.time.realtimeSinceStartup-this._lastUpdateTime>this._camTimeoutInSeconds*.5))&&(this._lastUpdateTime=this.context.time.realtimeSinceStartup,this._needsUpdate=!1,this._model.send(e,this.context.connection),this.context.isInXR||this.context.players.setPlayerView(this.context.connection.connectionId,e,Us.Browser))}onReceivedRemoteCameraInfoBin(e){const t=e.guid();if(!t)return;const i=e.userId();if(!i||!this.context.connection.userIsInRoom(i)||!this.cameraPrefab)return;let n=this.remoteCams[t];if(!n)if("isObject3D"in this.cameraPrefab){const l=new sn;l.context=this.context;const h=x.instantiate(this.cameraPrefab,l);n=this.remoteCams[t]={obj:h,lastUpdate:this.context.time.realtimeSinceStartup,userId:i},n.obj.visible=!0,this.gameObject.add(h),this.userToCamMap[i]=t,Pp.instances.push(n);const d=x.getOrAddComponent(h,xe);d.connectionId=i,d.avatar=h}else return;const o=n.obj;this.context.players.setPlayerView(i,o,Us.Browser),n.lastUpdate=this.context.time.realtimeSinceStartup,Ti.markDirty(o);const r=e.pos();r&&zo(o,r.x(),r.y(),r.z());const a=e.rot();a&&ec(o,a.x(),a.y(),a.z())}};Fk([f([c.Object3D,Y])],aw.prototype,"cameraPrefab");let Pg=aw;var zk=Object.defineProperty,Nk=Object.getOwnPropertyDescriptor,co=(s,e,t,i)=>{for(var n=i>1?void 0:i?Nk(e,t):e,o=s.length-1,r;o>=0;o--)(r=s[o])&&(n=(i?r(e,t,n):r(n))||n);return i&&n&&zk(e,t,n),n};const Ef="view",Tf=w("debugsyncedroom");class cn extends k{roomName="";urlParameterName="room";joinRandomRoom;requireRoomParameter=!1;autoRejoin=!0;createJoinButton=!0;createViewOnlyButton=!1;get currentRoomName(){const e=w(Ef);return e||w(this.urlParameterName)}_lastJoinedRoom;set roomPrefix(e){this._roomPrefix=e}get roomPrefix(){return this._roomPrefix}_roomPrefix="";awake(){this.joinRandomRoom===void 0&&this.roomName?.length<=0&&(this.joinRandomRoom=!0),Tf&&console.log(`SyncedRoom roomName:${this.roomName}, urlParamName:${this.urlParameterName}, joinRandomRoom:${this.joinRandomRoom}`)}onEnable(){const e=w(Ef);if(e&&typeof e=="string"&&e.length>0){console.log("Join as viewer"),this.context.connection.joinRoom(e,!0);return}if(this.tryJoinRoom(),this.createJoinButton){const t=this.createRoomButton();this.context.menu.appendChild(t)}this.createViewOnlyButton&&this.onEnableViewOnlyButton()}onDisable(){this._roomButton?.remove(),this.onDisableViewOnlyButton(),this.roomName&&this.roomName.length>0&&this.context.connection.leaveRoom(this.roomName)}onDestroy(){this.destroyRoomButton()}tryJoinRandomRoom(){this.setRandomRoomUrlParameter(),this.tryJoinRoom()}tryJoinRoom(e=0){e===void 0&&(e=0);let t=!1;if(this.urlParameterName?.length>0){const i=w(this.urlParameterName);if(i&&(typeof i=="string"||typeof i=="number")){t=!0;const n=W_(i.toString());this.roomName=n}else if(this.joinRandomRoom&&(console.log("No room name found in url, generating random one"),this.setRandomRoomUrlParameter(),e<1))return this.tryJoinRoom(e+1)}else this.joinRandomRoom&&(this.roomName===null||this.roomName===void 0||this.roomName.length<=0)&&(this.roomName=this.generateRoomName());return this.requireRoomParameter&&!t?((Tf||A())&&console.warn('[SyncedRoom] Missing required room parameter "'+this.urlParameterName+`" in url - will not connect.
1398
+ `)},e.userData.isLightBlendMaterial=!0}applyShadowMaterial(){if(this.targetMesh)if(this.targetMesh.material.type!=="ShadowMaterial"){const e=new c.ShadowMaterial;e.color=this.shadowColor,e.opacity=this.shadowColor.alpha,this.applyMaterialOptions(e),this.targetMesh.material=e,e.userData.isShadowCatcherMaterial=!0}else{const e=this.targetMesh.material;e.color=this.shadowColor,e.opacity=this.shadowColor.alpha,this.applyMaterialOptions(e),e.userData.isShadowCatcherMaterial=!0}}applyOccluderMaterial(){if(this.targetMesh){let e=this.targetMesh.material;if(!e){const t=new c.MeshBasicMaterial;this.targetMesh.material=t,e=t}e.depthWrite=!0,e.stencilWrite=!0,e.colorWrite=!1,this.gameObject.renderOrder=-100}}applyMaterialOptions(e){e&&(e.depthWrite=!1,e.stencilWrite=!1)}}nw([f()],Bc.prototype,"mode");nw([f(Z)],Bc.prototype,"shadowColor");const Ph=new Map;function sw(s,e){if(Ph.has(s))return Ph.get(s);const t=new URL(s,window.location.href),i=Sk(t,e);return Ph.set(s,i),i.finally(()=>{Ph.delete(s)}),i}async function Sk(s,e){if(!s)return Promise.resolve(null);const t=s.pathname,i=s.toString().toLowerCase().includes("pmrem")||s.searchParams.get("pmrem")!=null,n=t.endsWith(".exr"),o=t.endsWith(".hdr"),r=t.endsWith(".ktx2");let a;if(n)a=new q.EXRLoader;else if(o)a=new q.RGBELoader;else if(r){const{ktx2Loader:u}=ne.createLoaders(e);a=u}else a=new c.TextureLoader;const l=s.toString();return await a.loadAsync(l).then(u=>{if(u){const p=t.lastIndexOf("/");u.name=t.substring(p>=0?p+1:0),i&&(u.mapping=c.CubeUVReflectionMapping),a instanceof c.TextureLoader&&(u.colorSpace=c.SRGBColorSpace)}return u}).catch(u=>(console.warn("Failed to load texture from url:",s),null))}var Ck=Object.defineProperty,Fc=(s,e,t,i)=>{for(var n=void 0,o=s.length-1,r;o>=0;o--)(r=s[o])&&(n=r(e,t,n)||n);return n&&Ck(e,t,n),n};const zt=w("debugskybox");Cg("background-image");Cg("environment-image");function P_(s,e,t,i,n){if(e==="transparent"||e?.startsWith("rgb")||e?.startsWith("#"))return console.warn(`Needle Engine: Invalid ${n} value (${e}). Did you mean to set background-color instead?`),null;const o=new fu;o.allowDrop=!1,o.allowNetworking=!1,o.background=t,o.environment=i,x.addComponent(s.scene,o);const r=a=>{typeof a=="string"&&(zt&&console.log(n,"CHANGED TO",a),o.setSkybox(a))};return H_(s.domElement,n,r),o.addEventListener("destroy",()=>{zt&&console.log("Destroyed attribute remote skybox",n),q_(s.domElement,n,r)}),o.setSkybox(e)}const xd=new Array;re.registerCallback(oe.ContextCreationStart,s=>{const e=s.context,t=e.domElement.getAttribute("background-image"),i=e.domElement.getAttribute("environment-image"),n=t===i;if(t&&!n){zt&&console.log("Creating remote skybox to load "+t);const o=P_(e,t,!0,!1,"background-image");o&&xd.push(o)}if(i){zt&&console.log("Creating remote environment to load "+i);const o=P_(e,i,n,!0,"environment-image");o&&xd.push(o)}});re.registerCallback(oe.ContextCreationStart,()=>Promise.all(xd).finally(()=>{xd.length=0}));const Qo=class extends k{url;allowDrop=!0;background=!0;environment=!0;allowNetworking=!0;_prevUrl;_prevLoadedEnvironment;_prevEnvironment=null;_prevBackground=null;onEnable(){this.setSkybox(this.url),this.registerDropEvents()}onDisable(){this.context.scene.environment===this._prevLoadedEnvironment&&(this.context.scene.environment=this._prevEnvironment,$t.backgroundShouldBeTransparent(this.context)||(this.context.scene.background=this._prevBackground),this._prevLoadedEnvironment=void 0),this.unregisterDropEvents(),this.context.mainCameraComponent?.applyClearFlags()}urlChangedSyncField(){this.allowNetworking&&this.url&&(this.isRemoteTexture(this.url)?this.setSkybox(this.url):zt&&console.warn(`RemoteSkybox: Not setting skybox: ${this.url} is not a remote texture. If you want to set a local texture, set allowNetworking to false.`))}async setSkybox(e,t){if(!this.activeAndEnabled||(e=Pk(e,this.environment,this.background),!e))return!1;if(t??=e,this.isValidTextureType(t)||console.warn('Potentially invalid skybox URL: "'+t+'" on '+(this.name||this.gameObject?.name||"context")),zt&&console.log("Set remote skybox url: "+e),this._prevUrl===e&&this._prevLoadedEnvironment)return this.apply(),!0;this._prevLoadedEnvironment?.dispose(),this._prevLoadedEnvironment=void 0,this._prevUrl=e;const i=await sw(e,this.context.renderer);return i?!this.enabled||this.destroyed?(zt&&console.warn("RemoteSkybox: Component is disabled or destroyed"),!1):this._prevUrl!==e?(zt&&console.warn("RemoteSkybox: URL changed while loading texture, aborting setSkybox"),!1):(this.url=e,this._prevLoadedEnvironment=i,this.apply(),!0):(zt&&console.warn("RemoteSkybox: Failed to load texture from url",e),!1)}apply(){const e=this._prevLoadedEnvironment;if(e&&(e instanceof c.CubeTexture||e instanceof c.CompressedCubeTexture||e.mapping==c.CubeUVReflectionMapping||(e.mapping=c.EquirectangularRefractionMapping,e.needsUpdate=!0),!this.destroyed)){if(!this.context){console.warn("RemoteSkybox: Context is not available - can not apply skybox.");return}this.context.scene.background!==e&&(this._prevBackground=this.context.scene.background),this.context.scene.environment!==e&&(this._prevEnvironment=this.context.scene.environment),zt&&console.log("Set remote skybox",this.url,!$t.backgroundShouldBeTransparent(this.context)),this.environment&&(this.context.scene.environment=e),this.background&&!$t.backgroundShouldBeTransparent(this.context)&&(this.context.scene.background=e),this.context.mainCameraComponent?.backgroundBlurriness!==void 0&&(this.context.scene.backgroundBlurriness=this.context.mainCameraComponent.backgroundBlurriness)}}validProtocols=["file:","blob:","data:"];validTextureTypes=[".ktx2",".hdr",".exr",".jpg",".jpeg",".png"];isRemoteTexture(e){return e.startsWith("http://")||e.startsWith("https://")}isValidTextureType(e){for(const t of this.validTextureTypes)if(e.includes(t))return!0;for(const t of this.validProtocols)if(e.startsWith(t))return!0;return!1}registerDropEvents(){this.unregisterDropEvents(),this.context.domElement.addEventListener("dragover",this.onDragOverEvent),this.context.domElement.addEventListener("drop",this.onDrop)}unregisterDropEvents(){this.context.domElement.removeEventListener("dragover",this.onDragOverEvent),this.context.domElement.removeEventListener("drop",this.onDrop)}onDragOverEvent=e=>{if(this.allowDrop&&e.dataTransfer)for(const t of e.dataTransfer.types)(t==="text/uri-list"||t==="Files")&&e.preventDefault()};onDrop=e=>{if(this.allowDrop&&e.dataTransfer){for(const t of e.dataTransfer.types)if(zt&&console.log(t),t==="text/uri-list"){const i=e.dataTransfer.getData(t);zt&&console.log(t,i);let n=new RegExp(/polyhaven.com\/asset_img\/.+?\/(?<name>.+)\.png/).exec(i)?.groups?.name;if(n||(n=new RegExp(/polyhaven\.com\/a\/(?<name>.+)/).exec(i)?.groups?.name),zt&&console.log(n),n){const o="https://dl.polyhaven.org/file/ph-assets/HDRIs/exr/1k/"+n+"_1k.exr";console.log(`[Remote Skybox] Setting skybox from url: ${o}`),e.preventDefault(),this.setSkybox(o);break}else if(this.isValidTextureType(i)){console.log("[Remote Skybox] Setting skybox from url: "+i),e.preventDefault(),this.setSkybox(i);break}else{console.warn(`[RemoteSkybox] Unknown url ${i}. If you want to load a skybox from a url, make sure it is a valid image url. Url must end with${this.validTextureTypes.join(", ")}.`);const o=new CustomEvent("dropped-unknown-url",{detail:{sender:this,event:e,url:i,apply:r=>{e.preventDefault(),this.setSkybox(r)}}});this.dispatchEvent(o)}}else if(t=="Files"){const i=e.dataTransfer.files.item(0);if(zt&&console.log(t,i),!i)continue;if(!this.isValidTextureType(i.name)){console.warn(`[RemoteSkybox]: File "${i.name}" is not supported. Supported files are ${this.validTextureTypes.join(", ")}`);return}e.preventDefault(),this.setSkybox(i.name);break}}}};Fc([Km(Qo.prototype.urlChangedSyncField),f(URL)],Qo.prototype,"url");Fc([f()],Qo.prototype,"allowDrop");Fc([f()],Qo.prototype,"background");Fc([f()],Qo.prototype,"environment");Fc([f()],Qo.prototype,"allowNetworking");let fu=Qo;function Pk(s,e,t){if(s==null)return null;const i=e&&!t;switch(s.toLowerCase()){case"studio":return i?"https://cdn.needle.tools/static/skybox/modelviewer-Neutral-small.pmrem4x4.ktx2?pmrem":"https://cdn.needle.tools/static/skybox/modelviewer-Neutral.pmrem4x4.ktx2?pmrem";case"blurred-skybox":return i?"https://cdn.needle.tools/static/skybox/blurred-skybox-small.pmrem4x4.ktx2?pmrem":"https://cdn.needle.tools/static/skybox/blurred-skybox.pmrem4x4.ktx2?pmrem";case"quicklook-ar":return i?"https://cdn.needle.tools/static/skybox/QuickLook-ARMode-small.pmrem4x4.ktx2?pmrem":"https://cdn.needle.tools/static/skybox/QuickLook-ARMode.pmrem4x4.ktx2?pmrem";case"quicklook":return i?"https://cdn.needle.tools/static/skybox/QuickLook-ObjectMode-small.pmrem4x4.ktx2?pmrem":"https://cdn.needle.tools/static/skybox/QuickLook-ObjectMode.pmrem4x4.ktx2?pmrem"}return s}var Mk=Object.defineProperty,pu=(s,e,t,i)=>{for(var n=void 0,o=s.length-1,r;o>=0;o--)(r=s[o])&&(n=r(e,t,n)||n);return n&&Mk(e,t,n),n};const Uc=class ow extends k{target=null;followFactor=.1;rotateFactor=.1;positionAxes=zr.All;flipForward=!1;static _invertForward=new c.Quaternion().setFromAxisAngle(new c.Vector3(0,1,0),Math.PI);_firstUpdate=!0;onBeforeRender(){this.updateNow(!1)}updateNow(e){if(!(!this.target||this.target===this.gameObject)){if(this.followFactor>0){const t=X(this.target),i=this._firstUpdate||e?1:I.clamp01(this.context.time.deltaTime*this.followFactor),n=this.worldPosition;this.positionAxes&zr.X&&(n.x=I.lerp(n.x,t.x,i)),this.positionAxes&zr.Y&&(n.y=I.lerp(n.y,t.y,i)),this.positionAxes&zr.Z&&(n.z=I.lerp(n.z,t.z,i)),this.worldPosition=n}if(this.rotateFactor>0){const t=ue(this.target);this.flipForward&&t.premultiply(ow._invertForward);const i=this._firstUpdate||e?1:I.clamp01(this.context.time.deltaTime*this.rotateFactor);this.worldQuaternion=this.worldQuaternion.slerp(t,i)}this._firstUpdate=!1}}};pu([f(c.Object3D)],Uc.prototype,"target");pu([f()],Uc.prototype,"followFactor");pu([f()],Uc.prototype,"rotateFactor");pu([f()],Uc.prototype,"positionAxes");let mu=Uc;var Ok=Object.defineProperty,zc=(s,e,t,i)=>{for(var n=void 0,o=s.length-1,r;o>=0;o--)(r=s[o])&&(n=r(e,t,n)||n);return n&&Ok(e,t,n),n};const El=w("debugspatialtrigger"),M_=new c.Layers,O_=new c.Layers;function kk(s,e){return M_.mask=s,O_.mask=e,M_.test(O_)}class En extends k{triggerMask=0;onEnter;onStay;onExit;start(){El&&console.log(this.name,this.triggerMask,this)}update(){this.currentIntersected.length=0;for(const e of gu.triggers)kk(e.triggerMask,this.triggerMask)&&e.test(this.gameObject)&&this.currentIntersected.push(e);for(let e=this.lastIntersected.length-1;e>=0;e--){const t=this.lastIntersected[e];this.currentIntersected.indexOf(t)<0&&(this.onExitTrigger(t),this.lastIntersected.splice(e,1))}for(const e of this.currentIntersected)this.lastIntersected.indexOf(e)<0&&this.onEnterTrigger(e),this.onStayTrigger(e);this.lastIntersected.length=0,this.lastIntersected.push(...this.currentIntersected)}currentIntersected=[];lastIntersected=[];onEnterTrigger(e){El&&console.log("ENTER TRIGGER",this.name,e.name,this,e),e.raiseOnEnterEvent(this),this.onEnter?.invoke()}onExitTrigger(e){El&&console.log("EXIT TRIGGER",this.name,e.name),e.raiseOnExitEvent(this),this.onExit?.invoke()}onStayTrigger(e){e.raiseOnStayEvent(this),this.onStay?.invoke()}}zc([f()],En.prototype,"triggerMask");zc([f(de)],En.prototype,"onEnter");zc([f(de)],En.prototype,"onStay");zc([f(de)],En.prototype,"onExit");const rw=class Hh extends k{static triggers=[];triggerMask;boxHelper;start(){El&&console.log(this.name,this.triggerMask,this)}onEnable(){Hh.triggers.push(this),this.boxHelper||(this.boxHelper=x.addComponent(this.gameObject,nt),this.boxHelper?.showHelper(null,El))}onDisable(){Hh.triggers.splice(Hh.triggers.indexOf(this),1)}test(e){return this.boxHelper?this.boxHelper.isInBox(e)??!1:!1}raiseOnEnterEvent(e){x.foreachComponent(this.gameObject,t=>{t!==e&&t instanceof En&&t.onEnterTrigger(this)},!1)}raiseOnStayEvent(e){x.foreachComponent(this.gameObject,t=>{t!==e&&t instanceof En&&t.onStayTrigger(this)},!1)}raiseOnExitEvent(e){x.foreachComponent(this.gameObject,t=>{t!==e&&t instanceof En&&t.onExitTrigger(this)},!1)}};zc([f()],rw.prototype,"triggerMask");let gu=rw;var Rk=Object.defineProperty,Ek=(s,e,t,i)=>{for(var n=void 0,o=s.length-1,r;o>=0;o--)(r=s[o])&&(n=r(e,t,n)||n);return n&&Rk(e,t,n),n};const si=w("debugspectator");class yu extends k{cam=null;useKeys=!0;_mode=0;get mode(){return this._mode}set mode(e){this._mode=e}get isSpectating(){return this._handler?.currentTarget!==void 0}isSpectatingUser(e){return this.target?.userId===e}isFollowedBy(e){return this.followers?.includes(e)}get followers(){return this._networking.followers}stopSpectating(){if(this.context.isInXR){this.followSelf();return}this.target=void 0}get localId(){return this.context.connection.connectionId??"local"}set target(e){if(this._handler){const t=this._handler.currentTarget?.userId,i=this.context.players.getPlayerView(this.localId);e===void 0||this.context.isInXR===!1&&i?.currentObject===e.currentObject?this._handler.currentTarget!==void 0&&(this._handler.disable(),x.setActive(this.gameObject,!1),this.orbit&&(this.orbit.enabled=!0),this._networking.onSpectatedObjectChanged(e,t)):this._handler.currentTarget!==e&&(this._handler.set(e),x.setActive(this.gameObject,!0),this.orbit&&(this.orbit.enabled=!1),this._networking.onSpectatedObjectChanged(e,t))}}get target(){return this._handler?.currentTarget}requestAllFollowMe(){this._networking.onRequestFollowMe()}get isSpectatingSelf(){return this.isSpectating&&this.target?.currentObject===this.context.players.getPlayerView(this.localId)?.currentObject}orbit=null;_handler;eventSub_WebXRRequestStartEvent=null;eventSub_WebXRStartEvent=null;eventSub_WebXREndEvent=null;_debug;_networking;awake(){if(this._debug=new Lk(this.context,this),this._networking=new jk(this.context,this),this._networking.awake(),x.setActive(this.gameObject,!1),this.cam=x.getComponent(this.gameObject,$t),!this.cam){console.warn("SpectatorCamera: Spectator camera needs camera component on the same object.",this);return}!this._handler&&this.cam&&(this._handler=new Tk(this.context,this.cam,this)),this.orbit=x.getComponent(this.context.mainCamera,he)}onDestroy(){this.stopSpectating(),this._handler?.destroy(),this._networking?.destroy()}isSupportedPlatform(){const e=window.navigator.userAgent,t=/Windows|MacOS/.test(e),i=/Windows NT/.test(e)&&/Edg/.test(e)&&!/Win64/.test(e);return t&&!i}onBeforeXR(e){this.isSupportedPlatform()&&x.setActive(this.gameObject,!0)}onEnterXR(e){this.isSupportedPlatform()&&(si&&console.log(this.context.mainCamera),this.context.mainCamera&&this.followSelf())}onLeaveXR(e){this.context.removeCamera(this.cam),x.setActive(this.gameObject,!1),this.orbit&&(this.orbit.enabled=!0),this._handler?.set(void 0),this._handler?.disable(),this.isSpectatingSelf&&this.stopSpectating()}followSelf(){this.target=this.context.players.getPlayerView(this.context.connection.connectionId),this.target||(this.context.players.setPlayerView(this.localId,this.context.mainCamera,Us.Headset),this.target=this.context.players.getPlayerView(this.localId)),si&&console.log("Follow self",this.target)}onAfterRender(){if(!this.cam)return;const e=this.context.renderer,t=e.xr.enabled;if(!e.xr.isPresenting&&!this._handler?.currentTarget)return;this._handler?.update(this._mode);const i=e.getRenderTarget();let n=null;const o=e.state;if(!i){if(!e.state.bindFramebuffer||!o.bindXRFramebuffer)return;n=e._framebuffer,o.bindXRFramebuffer(null)}this.setAvatarFlagsBeforeRender();const r=this.context.mainCameraComponent;if(r){const h=r.backgroundColor;h&&e.setClearColor(h,h.alpha),this.cam.backgroundColor=h,this.cam.clearFlags=r.clearFlags,this.cam.nearClipPlane=r.nearClipPlane,this.cam.farClipPlane=r.farClipPlane}else e.setClearColor(new c.Color(1,1,1));e.setRenderTarget(null),e.xr.enabled=!1;const a=this.cam?.threeCamera;this.context.updateAspect(a);const l=e.xr.isPresenting;e.xr.isPresenting=!1,e.setSize(this.context.domWidth,this.context.domHeight),e.render(this.context.scene,a),e.xr.isPresenting=l,e.xr.enabled=t,i?e.setRenderTarget(i):o.bindXRFramebuffer&&o.bindXRFramebuffer(n),this.resetAvatarFlags()}setAvatarFlagsBeforeRender(){const e=this._mode===0;for(const t of xe.instances)if(t.avatar&&"isLocalAvatar"in t.avatar&&"flags"in t.avatar){let i=bn.All;this.isSpectatingSelf&&(i=e&&t.avatar.isLocalAvatar?bn.FirstPerson:bn.ThirdPerson);const n=t.avatar.flags;if(!n)continue;for(const o of n)o.UpdateVisible(i)}}resetAvatarFlags(){for(const e of xe.instances)if(e.avatar&&"flags"in e.avatar){const t=e.avatar.flags;if(!t)continue;for(const i of t)"isLocalAvatar"in e.avatar&&e.avatar?.isLocalAvatar?i.UpdateVisible(bn.FirstPerson):i.UpdateVisible(bn.ThirdPerson)}}}Ek([f()],yu.prototype,"useKeys");class Tk{context;cam;spectator;follow;target;view;currentObject;get currentTarget(){return this.view}constructor(e,t,i){this.context=e,this.cam=t,this.spectator=i}set(e){const t=e?.currentObject;if(!t){this.spectator.stopSpectating();return}t!==this.currentObject&&(this.currentObject=t,this.view=e,this.follow||(this.follow=x.addComponent(this.cam.gameObject,mu)),this.target||(this.target=new c.Object3D),t.add(this.target),this.follow.enabled=!0,this.follow.target=this.target,si&&console.log("FOLLOW",t),this.context.isInXR?this.context.removeCamera(this.cam):this.context.setCurrentCamera(this.cam))}disable(){si&&console.log("STOP FOLLOW",this.currentObject),this.view=void 0,this.currentObject=void 0,this.context.removeCamera(this.cam),this.follow&&(this.follow.enabled=!1)}destroy(){this.target?.removeFromParent(),this.follow&&x.destroy(this.follow)}update(e){if(this.currentTarget?.isConnected===!1||this.currentTarget?.removed===!0){si&&console.log("Target disconnected or timeout",this.currentTarget),this.spectator.stopSpectating();return}this.currentTarget&&this.currentTarget?.currentObject!==this.currentObject&&(si&&console.log("Target changed",this.currentObject,"to",this.currentTarget.currentObject),this.set(this.currentTarget));const t=this.context.mainCamera;if(t){const n=this.cam.threeCamera;(n.near!==t.near||n.far!==t.far)&&(n.near=t.near,n.far=t.far,n.updateProjectionMatrix())}const i=this.follow?.target;if(!(!i||!this.follow)){switch(e){case 0:this.view?.viewDevice!==Us.Browser?(this.follow.followFactor=5,this.follow.rotateFactor=5):(this.follow.followFactor=50,this.follow.rotateFactor=50),i.position.set(0,0,0);break;case 1:this.follow.followFactor=3,this.follow.rotateFactor=2,i.position.set(0,.5,1.5);break}this.follow.flipForward=!1,this.view?.viewDevice!==Us.Browser?i.quaternion.copy(Ak):i.quaternion.identity()}}}const Ak=new c.Quaternion().setFromAxisAngle(new c.Vector3(0,1,0),Math.PI);class Lk{context;spectator;constructor(e,t){this.context=e,this.spectator=t,console.log("[Spectator Camera] Click other avatars or cameras to follow them. Press ESC to exit spectator mode."),this.context.domElement.addEventListener("keydown",n=>{if(!this.spectator.useKeys)return;n.key==="Escape"&&this.spectator.stopSpectating()});let i=0;this.context.input.addEventListener(we.PointerDown,n=>{i=this.context.time.time}),this.context.input.addEventListener(we.PointerUp,n=>{const o=this.context.time.time-i;o>1?this.spectator.stopSpectating():this.context.input.getPointerClicked(0)&&o<.3&&this.trySelectObject()})}trySelectObject(){const e=new Zs;e.setMask(16777215);const t=this.context.physics.raycast(e);if(si&&console.log(...t),t?.length)for(const i of t){if(i.distance<.2)continue;const n=i.object,o=x.getComponentInParent(n,xe),r=o?.connectionId;if(r){const a=this.context.players.getPlayerView(r);this.spectator.target=a,si&&console.log("spectate",r,o);break}}}}class Dk{guid;dontSave=!0;targetUserId;stoppedFollowing;constructor(e,t,i){this.guid=e,this.targetUserId=t,this.stoppedFollowing=i}}class Ik{guid;userId;constructor(e,t){this.guid=e.guid,this.userId=t}}class jk{followers=[];context;spectator;_followerEventMethod;_requestFollowMethod;_joinedRoomMethod;constructor(e,t){this.context=e,this.spectator=t,this._followerEventMethod=this.onFollowerEvent.bind(this),this._requestFollowMethod=this.onRequestFollowEvent.bind(this),this._joinedRoomMethod=this.onUserJoinedRoom.bind(this)}awake(){this.context.connection.beginListen("spectator-follower-changed",this._followerEventMethod),this.context.connection.beginListen("spectator-request-follow",this._requestFollowMethod),this.context.connection.beginListen(Q.JoinedRoom,this._joinedRoomMethod),this.context.domElement.addEventListener("keydown",e=>{this.spectator.useKeys&&(e.key==="f"?this.onRequestFollowMe():e.key==="Escape"&&this.onRequestFollowMe(!0))})}destroy(){this.context.connection.stopListen("spectator-follower-changed",this._followerEventMethod),this.context.connection.stopListen("spectator-request-follow",this._requestFollowMethod),this.context.connection.stopListen(Q.JoinedRoom,this._joinedRoomMethod)}onSpectatedObjectChanged(e,t){if(si&&console.log(this.context.connection.connectionId,"onSpectatedObjectChanged",e,t),this.context.connection.connectionId){const i=e?.userId===void 0,n=i?t:e?.userId,o=new Dk(this.context.connection.connectionId,n,i);this.context.connection.send("spectator-follower-changed",o)}}onRequestFollowMe(e=!1){if(si&&console.log("Request follow",this.context.connection.connectionId),this.context.connection.connectionId){this.spectator.stopSpectating();const t=e?void 0:this.context.connection.connectionId,i=new Ik(this.spectator,t);this.context.connection.send("spectator-request-follow",i)}}onUserJoinedRoom(){w("followme")&&this.onRequestFollowMe()}onFollowerEvent(e){const t=e.targetUserId,i=e.guid;if(si&&console.log(e),t===this.context.connection.connectionId)if(e.stoppedFollowing){const n=this.followers.indexOf(i);n!==-1&&(this.followers.splice(n,1),this.removeDisconnectedFollowers(),console.log(i,"unfollows you",this.followers.length))}else this.followers.includes(i)||(this.followers.push(i),this.removeDisconnectedFollowers(),console.log(i,"follows you",this.followers.length))}removeDisconnectedFollowers(){for(let e=this.followers.length-1;e>=0;e--){const t=this.followers[e];this.context.connection.userIsInRoom(t)===!1&&this.followers.splice(e,1)}}_lastRequestFollowUser;onRequestFollowEvent(e){if(this._lastRequestFollowUser=e,e.userId===this.context.connection.connectionId)this.spectator.stopSpectating();else if(e.userId===void 0)this.spectator.stopSpectating();else{const t=this.context.players.getPlayerView(e.userId);if(t)this.spectator.target=t;else return si&&console.warn("Could not find view",e.userId),this.enforceFollow(),!1}return!0}_enforceFollowInterval;enforceFollow(){this._enforceFollowInterval||(this._enforceFollowInterval=setInterval(()=>{this._lastRequestFollowUser===void 0||this._lastRequestFollowUser.userId&&this.spectator.isFollowedBy(this._lastRequestFollowUser.userId)?(clearInterval(this._enforceFollowInterval),this._enforceFollowInterval=void 0):(si&&console.log("REQUEST FOLLOW AGAIN",this._lastRequestFollowUser.userId),this.onRequestFollowEvent(this._lastRequestFollowUser))},1e3))}}class _n{bb=null;bb_pos=0;__init(e,t){return this.bb_pos=e,this.bb=t,this}static getRootAsSyncedCameraModel(e,t){return(t||new _n).__init(e.readInt32(e.position())+e.position(),e)}static getSizePrefixedRootAsSyncedCameraModel(e,t){return e.setPosition(e.position()+se.SIZE_PREFIX_LENGTH),(t||new _n).__init(e.readInt32(e.position())+e.position(),e)}userId(e){const t=this.bb.__offset(this.bb_pos,4);return t?this.bb.__string(this.bb_pos+t,e):null}guid(e){const t=this.bb.__offset(this.bb_pos,6);return t?this.bb.__string(this.bb_pos+t,e):null}dontSave(){const e=this.bb.__offset(this.bb_pos,8);return e?!!this.bb.readInt8(this.bb_pos+e):!1}pos(e){const t=this.bb.__offset(this.bb_pos,10);return t?(e||new jo).__init(this.bb_pos+t,this.bb):null}rot(e){const t=this.bb.__offset(this.bb_pos,12);return t?(e||new jo).__init(this.bb_pos+t,this.bb):null}static startSyncedCameraModel(e){e.startObject(5)}static addUserId(e,t){e.addFieldOffset(0,t,0)}static addGuid(e,t){e.addFieldOffset(1,t,0)}static addDontSave(e,t){e.addFieldInt8(2,+t,0)}static addPos(e,t){e.addFieldStruct(3,t,0)}static addRot(e,t){e.addFieldStruct(4,t,0)}static endSyncedCameraModel(e){return e.endObject()}static finishSyncedCameraModelBuffer(e,t){e.finish(t)}static finishSizePrefixedSyncedCameraModelBuffer(e,t){e.finish(t,void 0,!0)}}var Bk=Object.defineProperty,Fk=(s,e,t,i)=>{for(var n=void 0,o=s.length-1,r;o>=0;o--)(r=s[o])&&(n=r(e,t,n)||n);return n&&Bk(e,t,n),n};const Sd="SCAM";Qp(Sd,_n.getRootAsSyncedCameraModel);const Jt=new se.Builder;class Uk{userId;guid;constructor(e,t){this.guid=t,this.userId=e}send(e,t){if(e){Jt.clear();const i=Jt.createString(this.guid),n=Jt.createString(this.userId);_n.startSyncedCameraModel(Jt),_n.addGuid(Jt,i),_n.addUserId(Jt,n);const o=X(e),r=Md(e);_n.addPos(Jt,jo.createVec3(Jt,o.x,o.y,o.z)),_n.addRot(Jt,jo.createVec3(Jt,r.x,r.y,r.z));const a=_n.endSyncedCameraModel(Jt);Jt.finish(a,Sd),t.sendBinary(Jt.asUint8Array())}}}const aw=class Pp extends k{static instances=[];getCameraObject(e){const t=this.userToCamMap[e];return t?this.remoteCams[t].obj:null}cameraPrefab=null;_lastWorldPosition;_lastWorldQuaternion;_model=null;_needsUpdate=!0;_lastUpdateTime=0;remoteCams={};userToCamMap={};_camTimeoutInSeconds=10;_receiveCallback=null;async awake(){this._lastWorldPosition=this.worldPosition.clone(),this._lastWorldQuaternion=this.worldQuaternion.clone(),this.cameraPrefab&&("uri"in this.cameraPrefab&&(this.cameraPrefab=await this.cameraPrefab.instantiate(this.gameObject)),this.cameraPrefab&&"isObject3D"in this.cameraPrefab&&(this.cameraPrefab.visible=!1))}onEnable(){this._receiveCallback=this.context.connection.beginListenBinary(Sd,this.onReceivedRemoteCameraInfoBin.bind(this))}onDisable(){this.context.connection.stopListenBinary(Sd,this._receiveCallback)}update(){for(const n in this.remoteCams){const o=this.remoteCams[n],r=this.context.time.realtimeSinceStartup-o.lastUpdate;if(!o||r>this._camTimeoutInSeconds){A()&&console.log("Remote cam timeout",n),o?.obj&&x.destroy(o.obj),delete this.remoteCams[n],o&&delete this.userToCamMap[o.userId],Pp.instances.push(o),this.context.players.removePlayerView(o.userId,Us.Browser);continue}}if(this.context.isInXR)return;const e=this.context.mainCamera;if(e===null){this.enabled=!1;return}if(!this.context.connection.isConnected||this.context.connection.connectionId===null)return;this._model===null&&(this._model=new Uk(this.context.connection.connectionId,this.context.connection.connectionId+"_camera"));const t=X(e),i=ue(e);(t.distanceTo(this._lastWorldPosition)>.001||i.angleTo(this._lastWorldQuaternion)>.01)&&(this._needsUpdate=!0),this._lastWorldPosition.copy(t),this._lastWorldQuaternion.copy(i),!((!this._needsUpdate||this.context.time.frameCount%2!==0)&&!(this.context.time.realtimeSinceStartup-this._lastUpdateTime>this._camTimeoutInSeconds*.5))&&(this._lastUpdateTime=this.context.time.realtimeSinceStartup,this._needsUpdate=!1,this._model.send(e,this.context.connection),this.context.isInXR||this.context.players.setPlayerView(this.context.connection.connectionId,e,Us.Browser))}onReceivedRemoteCameraInfoBin(e){const t=e.guid();if(!t)return;const i=e.userId();if(!i||!this.context.connection.userIsInRoom(i)||!this.cameraPrefab)return;let n=this.remoteCams[t];if(!n)if("isObject3D"in this.cameraPrefab){const l=new sn;l.context=this.context;const h=x.instantiate(this.cameraPrefab,l);n=this.remoteCams[t]={obj:h,lastUpdate:this.context.time.realtimeSinceStartup,userId:i},n.obj.visible=!0,this.gameObject.add(h),this.userToCamMap[i]=t,Pp.instances.push(n);const d=x.getOrAddComponent(h,xe);d.connectionId=i,d.avatar=h}else return;const o=n.obj;this.context.players.setPlayerView(i,o,Us.Browser),n.lastUpdate=this.context.time.realtimeSinceStartup,Ti.markDirty(o);const r=e.pos();r&&zo(o,r.x(),r.y(),r.z());const a=e.rot();a&&ec(o,a.x(),a.y(),a.z())}};Fk([f([c.Object3D,Y])],aw.prototype,"cameraPrefab");let Pg=aw;var zk=Object.defineProperty,Nk=Object.getOwnPropertyDescriptor,co=(s,e,t,i)=>{for(var n=i>1?void 0:i?Nk(e,t):e,o=s.length-1,r;o>=0;o--)(r=s[o])&&(n=(i?r(e,t,n):r(n))||n);return i&&n&&zk(e,t,n),n};const Ef="view",Tf=w("debugsyncedroom");class cn extends k{roomName="";urlParameterName="room";joinRandomRoom;requireRoomParameter=!1;autoRejoin=!0;createJoinButton=!0;createViewOnlyButton=!1;get currentRoomName(){const e=w(Ef);return e||w(this.urlParameterName)}_lastJoinedRoom;set roomPrefix(e){this._roomPrefix=e}get roomPrefix(){return this._roomPrefix}_roomPrefix="";awake(){this.joinRandomRoom===void 0&&this.roomName?.length<=0&&(this.joinRandomRoom=!0),Tf&&console.log(`SyncedRoom roomName:${this.roomName}, urlParamName:${this.urlParameterName}, joinRandomRoom:${this.joinRandomRoom}`)}onEnable(){const e=w(Ef);if(e&&typeof e=="string"&&e.length>0){console.log("Join as viewer"),this.context.connection.joinRoom(e,!0);return}if(this.tryJoinRoom(),this.createJoinButton){const t=this.createRoomButton();this.context.menu.appendChild(t)}this.createViewOnlyButton&&this.onEnableViewOnlyButton()}onDisable(){this._roomButton?.remove(),this.onDisableViewOnlyButton(),this.roomName&&this.roomName.length>0&&this.context.connection.leaveRoom(this.roomName)}onDestroy(){this.destroyRoomButton()}tryJoinRandomRoom(){this.setRandomRoomUrlParameter(),this.tryJoinRoom()}tryJoinRoom(e=0){e===void 0&&(e=0);let t=!1;if(this.urlParameterName?.length>0){const i=w(this.urlParameterName);if(i&&(typeof i=="string"||typeof i=="number")){t=!0;const n=W_(i.toString());this.roomName=n}else if(this.joinRandomRoom&&(console.log("No room name found in url, generating random one"),this.setRandomRoomUrlParameter(),e<1))return this.tryJoinRoom(e+1)}else this.joinRandomRoom&&(this.roomName===null||this.roomName===void 0||this.roomName.length<=0)&&(this.roomName=this.generateRoomName());return this.requireRoomParameter&&!t?((Tf||A())&&console.warn('[SyncedRoom] Missing required room parameter "'+this.urlParameterName+`" in url - will not connect.
1399
1399
  To allow joining a room without a query parameter you can set "requireRoomParameter" to false.`),!1):(this.context.connection.isConnected||this.context.connection.connect(),this._lastJoinedRoom=this.roomName,this._roomPrefix&&(this.roomName=this._roomPrefix+this.roomName),this.roomName.length<=0?(console.warn(`[SyncedRoom] Room name is not set so we can not join a networked room.
1400
1400
  Please choose one of the following options to fix this:
1401
1401
  A) Set a room name in the SyncedRoom component
@@ -1613,4 +1613,4 @@ Error:`,r),null}}updateColliderCollisionGroups(e){const t=e[Rt],i=e.membership;l
1613
1613
  justify-content: center;
1614
1614
  gap: .5rem;
1615
1615
  }
1616
- `),this.#n.innerHTML=this.#e.innerHTML,this.#n.style.cssText="display: flex; align-items: center; justify-content: center;",this.#e.innerHTML=this.#n.outerHTML,this.#t.innerHTML=this.#e.outerHTML,this.#t.prepend(this.#s),ad(sp,{element:this.#t}),this.#o?.disconnect(),this.#o??=new MutationObserver(()=>this.#l()),this.#o.observe(this.#e,{attributes:!0}),If&&console.log("Needle Button updated")}#l(){this.#e&&(this.#e.style.display==="none"?this.style.display="none":this.style.display==="none"&&(this.style.display=""))}#r=e=>{If&&console.log("Needle Button clicked"),!e.defaultPrevented&&this.#e&&this.#e.click()}}typeof window<"u"&&!window.customElements.get(F_)&&window.customElements.define(F_,xw);const tl=w("debugavatar");class Ug{root;head;leftHand;rigthHand;get isValid(){return this.head!==null&&this.head!==void 0}constructor(e,t,i,n){this.root=e,this.head=t,this.leftHand=i,this.rigthHand=n,this.root?.traverse(o=>o.layers.set(2))}}class Sw{avatarRegistryUrl=null;async getOrCreateNewAvatarInstance(e,t){if(!t)return console.error("Can not create avatar: failed to provide id or root object"),null;let i=null;if(typeof t=="string"){if(i=await this.loadAvatar(e,t),!i){const o=new sn;i=x.instantiate(Zr(t,e.scene),o)}}else i=t;if(!i)return null;const n=this.findAvatar(i);return n.isValid?(tl&&console.log("[Custom Avatar] valid config",t,tl?n:""),n):(console.warn("[Custom Avatar] config isn't valid",t,tl?n:""),null)}async loadAvatar(e,t){if(console.assert(t!=null&&typeof t=="string","Avatar id must not be null"),t.length<=0||!t)return null;if(tl&&console.log("[Custom Avatar] "+t+", loading..."),t.endsWith(".glb")||(t+=".glb"),this.avatarRegistryUrl===null){const n=await fetch("./"+t);let o=null;if(n.ok){const a=await n.blob();a&&(o=await a.arrayBuffer())}return o?(await Ji().parseSync(e,o,null,0))?.scene??null:null}const i=new q.GLTFLoader;return pm(i,e),new Promise((n,o)=>{const r=this.avatarRegistryUrl+"/"+t;i.load(r,async a=>{await Ji().createBuiltinComponents(e,r,a,null,void 0),n(a.scene)},a=>{tl&&console.log("[Custom Avatar] "+a.loaded/a.total*100+"% loaded of "+a.total/1024+"kB")},a=>{console.error("[Custom Avatar] Error when loading: "+a),n(null)})})}cacheModel(e,t){}findAvatar(e){const t=e;let i=t;i.children.length==1&&(i=e.children[0]);let n=this.findAvatarPart(i,["head"]);const o=this.findAvatarPart(i,["left","hand"]),r=this.findAvatarPart(i,["right","hand"]);if(!n){n=t;const l=new c.Vector3;new c.Box3().setFromObject(n).getSize(l);const h=Math.max(l.x,l.y,l.z);console.warn("[Custom Avatar] Normalizing head scale, it's too big: "+h+" meters! Should be < 0.3m"),h>.3&&n.scale.multiplyScalar(1/h*.3)}return new Ug(t,n,o,r)}findAvatarPart(e,t){const i=e.name.toLowerCase();let n=!0;for(const o of t){if(!n)break;i.indexOf(o)===-1&&(n=!1)}if(n)return e;if(e.children)for(const o of e.children){const r=this.findAvatarPart(o,t);if(r)return r}return null}handleCustomAvatarErrors(e){if(!e.ok)throw Error(e.statusText);return e}}class Cw{get extensionName(){return"DocumentExtension"}onAfterBuildDocument(e){}}class Pw{}const XR=Object.freeze(Object.defineProperty({__proto__:null,ActionBuilder:ae,ActionCollection:Av,ActionModel:Nt,AlignmentConstraint:hc,Animation:vt,AnimationCurve:Rc,AnimationExtension:Kd,AnimationTrackHandler:vu,Animator:mt,AnimatorController:Ai,Antialiasing:Tc,AudioExtension:ar,AudioListener:es,AudioSource:Ii,AudioTrackHandler:is,Avatar:Hs,AvatarBlink_Simple:nr,AvatarEyeLook_Rotation:Sm,AvatarLoader:Sw,AvatarMarker:xe,AvatarModel:Ug,Avatar_Brain_LookAt:Nl,Avatar_MouthShapes:pc,Avatar_MustacheShake:wm,Avatar_POI:Fo,AxesHelper:ma,BaseUIComponent:Bi,BasicIKConstraint:Pm,BehaviorExtension:eg,BehaviorModel:pt,BloomEffect:du,BoxCollider:Hd,BoxGizmo:dr,BoxHelperComponent:nt,Button:ys,CallInfo:Jn,Camera:$t,CameraTargetReachedEvent:zl,Canvas:ca,CanvasGroup:qs,CapsuleCollider:os,ChangeMaterialOnClick:Gm,ChangeTransformOnClick:lr,CharacterController:sr,CharacterControllerInput:cs,ChromaticAberration:Ac,Collider:Xt,ColorAdjustments:ao,ColorBySpeedModule:Oa,ColorOverLifetimeModule:lu,ContactShadows:mc,ControlTrackHandler:wu,CustomBranding:hr,Deletable:Rm,DeleteBox:Ns,DepthOfField:an,DeviceFlag:qd,DocumentExtension:Cw,DragControls:Mo,DropListener:hs,Duplicatable:Am,EffectWrapper:Hl,EmissionModule:ms,EmphasizeOnClick:ba,EnvironmentScene:Mu,EventList:de,EventListEvent:Nd,EventSystem:It,EventTrigger:Qd,FieldWithDefault:yv,FixedJoint:pg,Fog:Ca,GltfExport:Nm,GltfExportBox:Um,Gradient:fr,Graphic:Cc,GraphicRaycaster:Vd,GridHelper:Pa,GridLayoutGroup:rg,GroundProjectedEnv:An,GroupActionModel:Oo,HideOnStart:Oi,HingeJoint:Mc,HorizontalLayoutGroup:og,Image:Ea,InheritVelocityModule:_g,InputField:Tg,InstanceHandle:Uo,InstancingHandler:qo,Interactable:km,Keyframe:Wt,LODGroup:kc,LODModel:Ma,Light:mi,LimitVelocityOverLifetimeModule:et,LogStats:Om,LookAt:Ag,LookAtConstraint:ir,MainModule:Ct,MaskableGraphic:Pc,MeshCollider:eo,MeshRenderer:yc,MinMaxCurve:G,MinMaxGradient:pr,NeedleMenu:Dn,NestedGltf:ou,Networking:gg,NoiseModule:fe,ObjectRaycaster:hi,OffsetConstraint:ur,OpenURL:Ta,OrbitControls:he,Outline:Sa,Padding:cr,ParticleBurst:vd,ParticleSubEmitter:bg,ParticleSystem:Gl,ParticleSystemRenderer:Vi,PhysicsExtension:tg,PixelationEffect:Lc,PlayAnimationOnClick:$l,PlayAudioOnClick:Gs,PlayableDirector:da,PlayerColor:ha,PointerEventData:uc,PostProcessingHandler:Sg,PreliminaryAction:va,PreliminaryTrigger:vc,RawImage:Cu,Rect:Bv,RectTransform:nn,ReflectionProbe:Vl,RegisteredAnimationInfo:Fs,RemoteSkybox:fu,Renderer:di,RendererLightmap:gd,Rigidbody:Ke,RotationBySpeedModule:Ni,RotationOverLifetimeModule:rn,SceneSwitcher:Ie,ScreenCapture:lo,ScreenSpaceAmbientOcclusion:gs,ScreenSpaceAmbientOcclusionN8:ln,SetActiveOnClick:Hm,ShadowCatcher:Bc,ShapeModule:yg,SharpeningEffect:Ic,SignalAsset:bu,SignalReceiver:Vc,SignalReceiverEvent:Nc,SignalTrackHandler:ql,Size:jv,SizeBySpeedModule:Kt,SizeOverLifetimeModule:mr,SkinnedMeshRenderer:Fm,SmoothFollow:mu,SpatialGrabRaycaster:Go,SpatialHtml:Gc,SpatialTrigger:gu,SpatialTriggerReceiver:En,SpectatorCamera:yu,SphereCollider:ga,Sprite:us,SpriteData:Yr,SpriteRenderer:Qt,SpriteSheet:la,SubEmitterSystem:wd,SyncedCamera:Pg,SyncedRoom:cn,SyncedTransform:tn,TapGestureTrigger:Xm,TeleportTarget:iu,TestRunner:Mg,TestSimulateUserData:Og,Text:St,TextBuilder:ng,TextExtension:su,TextureSheetAnimationModule:Pt,TiltShiftEffect:Bn,ToneMappingEffect:Xs,TrailModule:Ee,TransformData:ke,TransformGizmo:br,TriggerBuilder:wt,TriggerModel:Vs,UIRaycastUtils:ym,UIRootComponent:xc,USDZExporter:Rn,USDZText:Vr,USDZUIExtension:lg,UsageMarker:gc,VariantAction:Wm,VelocityOverLifetimeModule:Le,VerticalLayoutGroup:sg,VideoPlayer:Ze,Vignette:_r,VisibilityAction:wc,Voip:Js,Volume:Ra,VolumeParameter:D,VolumeProfile:cu,WebARCameraBackground:qc,WebARSessionRoot:ri,WebXR:nu,WebXRImageTracking:Xl,WebXRImageTrackingModel:bs,WebXRPlaneTracking:vs,WebXRTrackedImage:ua,XRControllerFollow:_s,XRControllerModel:rs,XRControllerMovement:ui,XRFlag:Ri,XRRig:ku,XRState:Dt,__Ignore:Pw},Symbol.toStringTag,{value:"Module"})),Cd=w("debugmissingcamera");re.registerCallback(oe.MissingCamera,s=>{Cd&&console.warn("Creating missing camera");const e=s.context.scene,t=new c.PerspectiveCamera;t.name="Default Fallback Camera",e.add(t);const i=new $t;if(i.sourceId=s.files?.[0]?.src??"unknown",i.fieldOfView=35,s.context.domElement.getAttribute("transparent")!=null)i.clearFlags=Bo.Uninitialized;else if(s.context.domElement.getAttribute("background-image")?.length||s.context.lightmaps.tryGetSkybox(i.sourceId))i.clearFlags=Bo.Skybox;else{if(i.clearFlags=Bo.SolidColor,!s.context.domElement.getAttribute("background-color")){let a="#efefef";typeof window!==void 0&&window.matchMedia("(prefers-color-scheme: dark)").matches&&(a="#1f1f1f"),e.background=new c.Color(a)}if(!e.environment){const a=new c.PMREMGenerator$1(s.context.renderer),l=new Mu("neutral");e.environment=a.fromScene(l,.025).texture}}const o=Ao(t,i,!0);return t.position.x=0,t.position.y=1,t.position.z=2,s.context.domElement?.cameraControls!=!1&&Mw(s.context,o),o});re.registerCallback(oe.ContextCreated,s=>{if(!s.context.mainCamera){Cd&&console.log("Will not auto-fit because a default camera exists");return}if(s.context.domElement?.cameraControls==!0){if(eb(s.context.mainCamera)?.isCameraController==!0){Cd&&console.log("Will not auto-fit because a camera controller exists");return}Mw(s.context)}});function Mw(s,e){e=e??s.mainCameraComponent;const t=e?.gameObject;if(Cd&&console.log("Creating default camera controls",e?.name),t){const i=sc(t,he);i.sourceId=e?.sourceId??"unknown";const n=s.domElement.getAttribute("auto-rotate");if(i.autoRotate=n!=null&&n!="0"&&n?.toLowerCase()!="false",i.autoRotateSpeed=.5,i.autoFit=!0,i.autoRotate&&n){const o=parseFloat(n);isNaN(o)||(i.autoRotateSpeed=o)}}else console.warn("Missing camera object, can not add orbit controls")}re.registerCallback(oe.ContextCreated,s=>{const e=s.context.domElement.getAttribute("autoplay");if(e!==void 0&&(e===""||e==="true"||e==="1")&&s.files)for(const t of s.files)x.foreachComponent(t.file.scene,n=>{if(n.enabled!==!1){if(n instanceof vt&&n.playAutomatically||n instanceof mt||n instanceof da&&n.playOnAwake===!0)return!0;if(n instanceof vt)return n.playAutomatically=!0,!0;if(n instanceof da)return n.playOnAwake=!0,!0}},!0)!==!0&&oa.assignAnimationsFromFile(t.file,{createAnimationComponent:(n,o)=>ai(n,vt)})});class QR extends se.WorkerBase{constructor(){super(new Worker(new URL("/generateMeshBVH.worker-2qGLkQjg.js",typeof document>"u"?require("url").pathToFileURL(__filename).href:Eu&&Eu.tagName.toUpperCase()==="SCRIPT"&&Eu.src||new URL("needle-engine.bundle-B1l8PaE0.umd.cjs",document.baseURI).href),{type:"module"})),this.name="GenerateMeshBVHWorker"}runTask(e,t,i={}){return new Promise((n,o)=>{if(t.getAttribute("position").isInterleavedBufferAttribute||t.index&&t.index.isInterleavedBufferAttribute)throw new Error("GenerateMeshBVHWorker: InterleavedBufferAttribute are not supported for the geometry attributes.");e.onerror=h=>{o(new Error(`[GenerateMeshBVHWorker] ${h.message||"Unknown error. Please check the server console. If you're using vite try adding 'three-mesh-bvh' to 'optimizeDeps.exclude' in your vite.config.js"}`))},e.onmessage=h=>{const{data:d}=h;if(d.error)o(new Error(d.error)),e.onmessage=null;else if(d.serialized){const{serialized:u,position:p}=d,m=se.MeshBVH.deserialize(u,t,{setIndex:!1}),y=Object.assign({setBoundingBox:!0},i);if(t.attributes.position.array=p,u.index)if(t.index)t.index.array=u.index;else{const b=new c.BufferAttribute(u.index,1,!1);t.setIndex(b)}y.setBoundingBox&&(t.boundingBox=m.getBoundingBox(new c.Box3)),i.onProgress&&i.onProgress(d.progress),n(m),e.onmessage=null}else i.onProgress&&i.onProgress(d.progress)};const r=t.index?t.index.array:null,a=t.attributes.position.array,l=[a];r&&l.push(r),e.postMessage({index:r,position:a,options:{...i,onProgress:null,includedProgressCallback:!!i.onProgress,groups:[...t.groups]}},l.map(h=>h.buffer).filter(h=>typeof SharedArrayBuffer>"u"||!(h instanceof SharedArrayBuffer)))})}}const YR=Object.freeze(Object.defineProperty({__proto__:null,GenerateMeshBVHWorker:QR},Symbol.toStringTag,{value:"Module"}));exports.$physicsKey=z1;exports.ActionBuilder=ae;exports.ActionCollection=Av;exports.ActionModel=Nt;exports.Addressables=g0;exports.AlignmentConstraint=hc;exports.AmbientMode=Xr;exports.Animation=vt;exports.AnimationCurve=Rc;exports.AnimationExtension=Kd;exports.AnimationTrackHandler=vu;exports.AnimationUtils=oa;exports.Animator=mt;exports.AnimatorConditionMode=Ls;exports.AnimatorController=Ai;exports.AnimatorControllerParameterType=mm;exports.AnimatorStateInfo=rl;exports.Antialiasing=Tc;exports.Application=en;exports.AssetDatabase=Ab;exports.AssetReference=Y;exports.AudioExtension=ar;exports.AudioListener=es;exports.AudioSource=Ii;exports.AudioTrackHandler=is;exports.Avatar=Hs;exports.AvatarBlink_Simple=nr;exports.AvatarEyeLook_Rotation=Sm;exports.AvatarLoader=Sw;exports.AvatarMarker=xe;exports.AvatarModel=Ug;exports.Avatar_Brain_LookAt=Nl;exports.Avatar_MouthShapes=pc;exports.Avatar_MustacheShake=wm;exports.Avatar_POI=Fo;exports.Axes=zr;exports.AxesHelper=ma;exports.BUILD_TIME=$p;exports.BaseUIComponent=Bi;exports.BasicIKConstraint=Pm;exports.BehaviorExtension=eg;exports.BehaviorModel=pt;exports.BloomEffect=du;exports.BoxCollider=Hd;exports.BoxGizmo=dr;exports.BoxHelperComponent=nt;exports.Button=ys;exports.ButtonsFactory=Yi;exports.CallDirection=K0;exports.CallInfo=Jn;exports.Camera=$t;exports.CameraTargetReachedEvent=zl;exports.Canvas=ca;exports.CanvasGroup=qs;exports.CapsuleCollider=os;exports.ChangeMaterialOnClick=Gm;exports.ChangeTransformOnClick=lr;exports.CharacterController=sr;exports.CharacterControllerInput=cs;exports.ChromaticAberration=Ac;exports.CircularBuffer=li;exports.ClearFlags=Bo;exports.ClipExtrapolation=pn;exports.Collider=Xt;exports.Collision=X0;exports.CollisionDetectionMode=zd;exports.ColorAdjustments=ao;exports.ColorBySpeedModule=Oa;exports.ColorOverLifetimeModule=lu;exports.Component=QC;exports.Component$1=k;exports.ComponentLifecycleEvents=Ad;exports.Components=XR;exports.ConnectionEvents=Mb;exports.ContactPoint=q0;exports.ContactShadows=mc;exports.Context=U;exports.ContextArgs=DC;exports.ContextEvent=oe;exports.ContextRegistry=re;exports.ControlTrackHandler=wu;exports.CustomBranding=hr;exports.CustomShader=ye;exports.DefaultReflectionMode=rd;exports.Deletable=Rm;exports.DeleteBox=Ns;exports.DepthOfField=an;exports.DeviceFlag=qd;exports.DocumentExtension=Cw;exports.DragControls=Mo;exports.DragMode=Em;exports.DropListener=hs;exports.Duplicatable=Am;exports.EffectWrapper=Hl;exports.EmissionModule=ms;exports.EmphasizeOnClick=ba;exports.EngineLoadingView=Ql;exports.EnvironmentScene=Mu;exports.EventList=de;exports.EventListEvent=Nd;exports.EventSystem=It;exports.EventTrigger=Qd;exports.FieldWithDefault=yv;exports.FileReference=Io;exports.FileReferenceSerializer=_0;exports.FileSpawnModel=cP;exports.File_Event=sv;exports.FixedJoint=pg;exports.Fog=Ca;exports.FrameEvent=pe;exports.GENERATOR=Od;exports.GameObject=x;exports.Gizmos=j;exports.GltfExport=Nm;exports.GltfExportBox=Um;exports.Gradient=fr;exports.Graphic=Cc;exports.GraphicRaycaster=Vd;exports.Graphics=Ws;exports.GridHelper=Pa;exports.GridLayoutGroup=rg;exports.GroundProjectedEnv=An;exports.GroupActionModel=Oo;exports.HideFlags=$d;exports.HideOnStart=Oi;exports.HingeJoint=Mc;exports.HorizontalLayoutGroup=og;exports.HostData=FS;exports.Image=Ea;exports.ImageReference=Do;exports.ImageReferenceSerializer=y0;exports.InheritVelocityModule=_g;exports.Input=vb;exports.InputEventQueue=Vt;exports.InputEvents=we;exports.InputField=Tg;exports.InstanceHandle=Uo;exports.InstancingHandler=qo;exports.InstancingUtil=Ti;exports.InstantiateEvent=Wb;exports.InstantiateIdProvider=ft;exports.InstantiateOptions=sn;exports.Interactable=km;exports.JoinedRoomResponse=cS;exports.KeyEventArgs=Zx;exports.Keyframe=Wt;exports.LODGroup=kc;exports.LODModel=Ma;exports.LeftRoomResponse=hS;exports.Light=mi;exports.LightData=S0;exports.LimitVelocityOverLifetimeModule=et;exports.LoadingElementOptions=LR;exports.LogStats=Om;exports.LogType=oi;exports.LookAt=Ag;exports.LookAtConstraint=ir;exports.MainModule=Ct;exports.MarkerType=kg;exports.MaskableGraphic=Pc;exports.Mathf=I;exports.MeshCollider=eo;exports.MeshRenderer=yc;exports.MinMaxCurve=G;exports.MinMaxGradient=pr;exports.NEKeyboardEvent=il;exports.NEPointerEvent=Xn;exports.NeedleButtonElement=xw;exports.NeedleEngineWebComponent=Fg;exports.NeedleMenu=Dn;exports.NeedlePatchesKey=Rh;exports.NeedleXRController=qp;exports.NeedleXRSession=H;exports.NeedleXRSync=Rb;exports.NeedleXRUtils=Tb;exports.NestedGltf=ou;exports.NetworkConnection=kb;exports.NetworkedStreamEvents=xn;exports.NetworkedStreams=fc;exports.Networking=gg;exports.NewInstanceModel=Hb;exports.NoiseModule=fe;exports.ObjectRaycaster=hi;exports.ObjectUtils=Ko;exports.OffsetConstraint=ur;exports.OneEuroFilter=Oh;exports.OneEuroFilterXYZ=Ip;exports.OpenURL=Ta;exports.OrbitControls=he;exports.Outline=Sa;exports.OwnershipEvent=Ob;exports.OwnershipModel=Kp;exports.PUBLIC_KEY=Br;exports.Padding=cr;exports.ParticleBurst=vd;exports.ParticleSubEmitter=bg;exports.ParticleSystem=Gl;exports.ParticleSystemBaseBehaviour=ro;exports.ParticleSystemRenderer=Vi;exports.ParticleSystemShapeType=bd;exports.PeerHandle=ts;exports.PeerNetworking=Pb;exports.Physics=na;exports.PhysicsExtension=tg;exports.PhysicsMaterialCombine=it;exports.PixelationEffect=Lc;exports.PlayAnimationOnClick=$l;exports.PlayAudioOnClick=Gs;exports.PlayableDirector=da;exports.PlayerColor=ha;exports.PlayerState=Ki;exports.PlayerStateEvent=Iv;exports.PlayerSync=Zm;exports.PlayerView=v0;exports.PlayerViewManager=w0;exports.PointerEventData=uc;exports.PointerType=Ed;exports.PostProcessingEffect=Ne;exports.PostProcessingEffectOrder=Qe;exports.PostProcessingHandler=Sg;exports.PreliminaryAction=va;exports.PreliminaryTrigger=vc;exports.PrimitiveType=No;exports.Progress=ie;exports.PromiseAllWithErrors=Lp;exports.PromiseErrorResult=Ff;exports.RGBAColor=Z;exports.RapierPhysics=Kr;exports.RawImage=Cu;exports.RaycastOptions=Zs;exports.Rect=Bv;exports.RectTransform=nn;exports.ReflectionProbe=Vl;exports.RegisteredAnimationInfo=Fs;exports.RemoteSkybox=fu;exports.RenderTexture=wn;exports.RenderTextureSerializer=$0;exports.Renderer=di;exports.RendererData=x0;exports.RendererLightmap=gd;exports.Rigidbody=Ke;exports.RigidbodyConstraints=De;exports.RoomEvents=Q;exports.RotationBySpeedModule=Ni;exports.RotationOverLifetimeModule=rn;exports.SceneLightSettings=fd;exports.SceneSwitcher=Ie;exports.ScreenCapture=lo;exports.ScreenSpaceAmbientOcclusion=gs;exports.ScreenSpaceAmbientOcclusionN8=ln;exports.SendQueue=Qi;exports.SerializationContext=am;exports.SetActiveOnClick=Hm;exports.ShadowCatcher=Bc;exports.ShapeModule=yg;exports.ShapeOverlapResult=Q0;exports.SharpeningEffect=Ic;exports.SignalAsset=bu;exports.SignalReceiver=Vc;exports.SignalReceiverEvent=Nc;exports.SignalTrackHandler=ql;exports.Size=jv;exports.SizeBySpeedModule=Kt;exports.SizeOverLifetimeModule=mr;exports.SkinnedMeshRenderer=Fm;exports.SmoothFollow=mu;exports.SpatialGrabRaycaster=Go;exports.SpatialHtml=Gc;exports.SpatialTrigger=gu;exports.SpatialTriggerReceiver=En;exports.SpectatorCamera=yu;exports.SphereCollider=ga;exports.SphereIntersection=em;exports.Sprite=us;exports.SpriteData=Yr;exports.SpriteRenderer=Qt;exports.SpriteSheet=la;exports.StateMachineBehaviour=t1;exports.StreamEndedEvent=bm;exports.StreamReceivedEvent=Y0;exports.SubEmitterSystem=wd;exports.SyncedCamera=Pg;exports.SyncedRoom=cn;exports.SyncedTransform=tn;exports.TapGestureTrigger=Xm;exports.TeleportTarget=iu;exports.TestRunner=Mg;exports.TestSceneUtils=VR;exports.TestSimulateUserData=Og;exports.Text=St;exports.TextBuilder=ng;exports.TextExtension=su;exports.TextureSheetAnimationModule=Pt;exports.TiltShiftEffect=Bn;exports.Time=C0;exports.ToneMappingEffect=Xs;exports.TrackHandler=$c;exports.TrackType=ei;exports.TrailModule=Ee;exports.TransformData=ke;exports.TransformGizmo=br;exports.TriggerBuilder=wt;exports.TriggerModel=Vs;exports.TypeStore=P;exports.UIRaycastUtils=ym;exports.UIRootComponent=xc;exports.USDDocument=Vm;exports.USDObject=ze;exports.USDWriter=Sv;exports.USDZExporter=Rn;exports.USDZExporter$1=Cv;exports.USDZText=Vr;exports.USDZUIExtension=lg;exports.UriSerializer=W0;exports.UsageMarker=gc;exports.UserJoinedOrLeftRoomModel=dS;exports.VERSION=Zi;exports.VariantAction=Wm;exports.VelocityOverLifetimeModule=Le;exports.VerticalLayoutGroup=sg;exports.VideoPlayer=Ze;exports.ViewDevice=Us;exports.Vignette=_r;exports.VisibilityAction=wc;exports.Voip=Js;exports.Volume=Ra;exports.VolumeParameter=D;exports.VolumeProfile=cu;exports.WaitForFrames=fC;exports.WaitForPromise=b0;exports.WaitForSeconds=hm;exports.Watch=ns;exports.WebARCameraBackground=qc;exports.WebARSessionRoot=ri;exports.WebXR=nu;exports.WebXRButtonFactory=$s;exports.WebXRImageTracking=Xl;exports.WebXRImageTrackingModel=bs;exports.WebXRPlaneTracking=vs;exports.WebXRTrackedImage=ua;exports.XRControllerFollow=_s;exports.XRControllerModel=rs;exports.XRControllerMovement=ui;exports.XRFlag=Ri;exports.XRRig=ku;exports.XRState=Dt;exports.XRStateFlag=bn;exports.__Ignore=Pw;exports.__internalNotifyObjectDestroyed=Fb;exports.activeInHierarchyFieldName=ss;exports.addAttributeChangeCallback=H_;exports.addComponent=ai;exports.addCustomExtensionPlugin=TP;exports.addNewComponent=Ao;exports.addPatch=kd;exports.apply=Dd;exports.applyHMRChanges=XC;exports.applyPrototypeExtensions=s0;exports.beginListenDestroy=Gb;exports.beginListenInstantiate=Xb;exports.binaryIdentifierCasts=Xp;exports.build_scene_functions=LC;exports.builtinComponentKeyName=wo;exports.calculateProgress01=Bg;exports.clearMessages=hx;exports.colorSerializer=_1;exports.compareAssociation=Zb;exports.componentSerializer=Fh;exports.copyTexture=ab;exports.createMotion=U0;exports.debugNet=Bt;exports.debugOwner=nl;exports.decompressGpuTexture=kv;exports.deepClone=Kl;exports.delay=Tn;exports.delayForFrames=Zl;exports.deserializeObject=sd;exports.destroy=ci;exports.destroyComponentInstance=a0;exports.determineMimeTypeFromExtension=ov;exports.disposeObjectResources=_e;exports.disposeStream=Sn;exports.editorGuidKeyName=wl;exports.enableSpatialConsole=Ro;exports.euler=v1;exports.eventListSerializer=C1;exports.exportAsGLTF=GR;exports.findByGuid=cm;exports.findObjectOfType=ac;exports.findObjectsOfType=c0;exports.findResourceUsers=tm;exports.fitObjectIntoVolume=cb;exports.foreachComponent=$o;exports.foreachComponentEnumerator=jd;exports.forward=Px;exports.generateQRCode=X_;exports.generateSeed=qb;exports.getBoundingBox=Gt;exports.getCameraController=eb;exports.getComponent=Jo;exports.getComponentInChildren=rc;exports.getComponentInParent=Bl;exports.getComponents=oc;exports.getComponentsInChildren=fa;exports.getComponentsInParent=Ld;exports.getFormattedDate=bv;exports.getIconElement=ut;exports.getIconTexture=np;exports.getLoader=Ji;exports.getOrAddComponent=sc;exports.getParam=w;exports.getParentHierarchyPath=kx;exports.getPath=Nw;exports.getPeerOptions=oS;exports.getPeerjsInstance=Cb;exports.getResourceUserCount=RS;exports.getTempColor=nb;exports.getTempQuaternion=Xi;exports.getTempVector=V;exports.getUrlParams=Yl;exports.getVisibleInCustomShadowRendering=lb;exports.getWorldDirection=sb;exports.getWorldEuler=Fp;exports.getWorldPosition=X;exports.getWorldQuaternion=ue;exports.getWorldRotation=Md;exports.getWorldScale=Ae;exports.hasCommercialLicense=kn;exports.hasIndieLicense=cc;exports.hasPointerEventComponent=cd;exports.hasProLicense=On;exports.hideDebugConsole=fb;exports.imageToCanvas=Rv;exports.instantiate=Wo;exports.invokeLoadedImportPluginHooks=pv;exports.invokeXRSessionEnd=bb;exports.invokeXRSessionStart=_b;exports.isActiveInHierarchy=h0;exports.isActiveSelf=pa;exports.isAndroidDevice=qw;exports.isAnimationAction=rb;exports.isComponent=H0;exports.isDebugMode=Bw;exports.isDesktop=$w;exports.isDestroyed=Vo;exports.isDevEnvironment=A;exports.isDisposed=OS;exports.isExporting=$R;exports.isGLTFModel=G0;exports.isHostedOnGlitch=U_;exports.isHotReloadEnabled=lp;exports.isHotReloading=HC;exports.isIPad=Gw;exports.isIconElement=O0;exports.isLocalNetwork=Li;exports.isMacOS=Qw;exports.isMobileDevice=Ww;exports.isMozillaXR=Xw;exports.isQuest=Zw;exports.isResourceTrackingEnabled=Db;exports.isSafari=Kw;exports.isUsingInstancing=Id;exports.isiOS=Yw;exports.isiPad=Hw;exports.loadAsset=OR;exports.loadPMREM=sw;exports.loadSync=jg;exports.logHierarchy=Yh;exports.lookAtInverse=yx;exports.lookAtObject=Jl;exports.lookAtScreenPoint=_x;exports.makeId=Uw;exports.makeIdFromRandomWords=$_;exports.makeNameSafe=ji;exports.markAsInstancedRendered=d0;exports.microphonePermissionsGranted=Jw;exports.nameof=jw;exports.nameofFactory=N_;exports.objectSerializer=V0;exports.offXRSessionEnd=Kx;exports.offXRSessionStart=Yx;exports.onAfterRender=WC;exports.onBeforeRender=$C;exports.onClear=NC;exports.onDestroy=VC;exports.onInitialized=A0;exports.onStart=fm;exports.onUpdate=L0;exports.onXRSessionEnd=Hp;exports.onXRSessionStart=Rd;exports.parseSync=yw;exports.placeOnSurface=hb;exports.postprocessFBXMaterials=Np;exports.prefix=u1;exports.pushState=V_;exports.randomNumber=zw;exports.registerBinaryType=Qp;exports.registerComponent=Fd;exports.registerComponentExtension=Im;exports.registerCustomEffectType=$i;exports.registerExportExtensions=jm;exports.registerExtensions=md;exports.registerHotReloadType=I0;exports.registerLoader=Wp;exports.registerPrefabProvider=Yb;exports.registerPrototypeExtensions=o0;exports.registerType=$S;exports.relativePathPrefix=G_;exports.removeAttributeChangeCallback=q_;exports.removeComponent=lm;exports.removeCustomImportExtensionType=AP;exports.removePatch=Xx;exports.resolveUrl=Qs;exports.sanitizeString=W_;exports.saveImage=fw;exports.screenshot=hR;exports.screenshot2=Dg;exports.sendDestroyed=nm;exports.serializable=f;exports.serializeObject=e0;exports.serializeable=er;exports.setActive=Cl;exports.setAllowBalloonMessages=K_;exports.setAllowOverlayMessages=rx;exports.setAutoFitEnabled=Xh;exports.setCameraController=zf;exports.setDestroyed=f0;exports.setDevEnvironment=jx;exports.setDisposable=jb;exports.setDontDestroy=Tr;exports.setOrAddParamsToUrl=Bf;exports.setParam=Fw;exports.setParamWithoutReload=Ll;exports.setPeerOptions=rS;exports.setResourceTrackingEnabled=MS;exports.setState=Tp;exports.setVisibleInCustomShadowRendering=zp;exports.setWorldEuler=Up;exports.setWorldPosition=Ye;exports.setWorldPositionXYZ=zo;exports.setWorldQuaternion=Di;exports.setWorldQuaternionXYZW=Bp;exports.setWorldRotation=ob;exports.setWorldRotationXYZ=ec;exports.setWorldScale=Jr;exports.showBalloonError=tc;exports.showBalloonMessage=Se;exports.showBalloonWarning=ce;exports.showDebugConsole=Vp;exports.slerp=gx;exports.syncDestroy=ic;exports.syncField=Km;exports.syncInstantiate=sm;exports.textureToCanvas=Rx;exports.tryCastBinary=xb;exports.tryDetermineMimetypeFromBinary=av;exports.tryDetermineMimetypeFromURL=rv;exports.tryFindObject=Zr;exports.tryGetGuid=Sb;exports.unregisterHotReloadType=j0;exports.unwatchWrite=Ap;exports.useForAutoFit=tb;exports.validate=gt;exports.watchWrite=Pd;
1616
+ `),this.#n.innerHTML=this.#e.innerHTML,this.#n.style.cssText="display: flex; align-items: center; justify-content: center;",this.#e.innerHTML=this.#n.outerHTML,this.#t.innerHTML=this.#e.outerHTML,this.#t.prepend(this.#s),ad(sp,{element:this.#t}),this.#o?.disconnect(),this.#o??=new MutationObserver(()=>this.#l()),this.#o.observe(this.#e,{attributes:!0}),If&&console.log("Needle Button updated")}#l(){this.#e&&(this.#e.style.display==="none"?this.style.display="none":this.style.display==="none"&&(this.style.display=""))}#r=e=>{If&&console.log("Needle Button clicked"),!e.defaultPrevented&&this.#e&&this.#e.click()}}typeof window<"u"&&!window.customElements.get(F_)&&window.customElements.define(F_,xw);const tl=w("debugavatar");class Ug{root;head;leftHand;rigthHand;get isValid(){return this.head!==null&&this.head!==void 0}constructor(e,t,i,n){this.root=e,this.head=t,this.leftHand=i,this.rigthHand=n,this.root?.traverse(o=>o.layers.set(2))}}class Sw{avatarRegistryUrl=null;async getOrCreateNewAvatarInstance(e,t){if(!t)return console.error("Can not create avatar: failed to provide id or root object"),null;let i=null;if(typeof t=="string"){if(i=await this.loadAvatar(e,t),!i){const o=new sn;i=x.instantiate(Zr(t,e.scene),o)}}else i=t;if(!i)return null;const n=this.findAvatar(i);return n.isValid?(tl&&console.log("[Custom Avatar] valid config",t,tl?n:""),n):(console.warn("[Custom Avatar] config isn't valid",t,tl?n:""),null)}async loadAvatar(e,t){if(console.assert(t!=null&&typeof t=="string","Avatar id must not be null"),t.length<=0||!t)return null;if(tl&&console.log("[Custom Avatar] "+t+", loading..."),t.endsWith(".glb")||(t+=".glb"),this.avatarRegistryUrl===null){const n=await fetch("./"+t);let o=null;if(n.ok){const a=await n.blob();a&&(o=await a.arrayBuffer())}return o?(await Ji().parseSync(e,o,null,0))?.scene??null:null}const i=new q.GLTFLoader;return pm(i,e),new Promise((n,o)=>{const r=this.avatarRegistryUrl+"/"+t;i.load(r,async a=>{await Ji().createBuiltinComponents(e,r,a,null,void 0),n(a.scene)},a=>{tl&&console.log("[Custom Avatar] "+a.loaded/a.total*100+"% loaded of "+a.total/1024+"kB")},a=>{console.error("[Custom Avatar] Error when loading: "+a),n(null)})})}cacheModel(e,t){}findAvatar(e){const t=e;let i=t;i.children.length==1&&(i=e.children[0]);let n=this.findAvatarPart(i,["head"]);const o=this.findAvatarPart(i,["left","hand"]),r=this.findAvatarPart(i,["right","hand"]);if(!n){n=t;const l=new c.Vector3;new c.Box3().setFromObject(n).getSize(l);const h=Math.max(l.x,l.y,l.z);console.warn("[Custom Avatar] Normalizing head scale, it's too big: "+h+" meters! Should be < 0.3m"),h>.3&&n.scale.multiplyScalar(1/h*.3)}return new Ug(t,n,o,r)}findAvatarPart(e,t){const i=e.name.toLowerCase();let n=!0;for(const o of t){if(!n)break;i.indexOf(o)===-1&&(n=!1)}if(n)return e;if(e.children)for(const o of e.children){const r=this.findAvatarPart(o,t);if(r)return r}return null}handleCustomAvatarErrors(e){if(!e.ok)throw Error(e.statusText);return e}}class Cw{get extensionName(){return"DocumentExtension"}onAfterBuildDocument(e){}}class Pw{}const XR=Object.freeze(Object.defineProperty({__proto__:null,ActionBuilder:ae,ActionCollection:Av,ActionModel:Nt,AlignmentConstraint:hc,Animation:vt,AnimationCurve:Rc,AnimationExtension:Kd,AnimationTrackHandler:vu,Animator:mt,AnimatorController:Ai,Antialiasing:Tc,AudioExtension:ar,AudioListener:es,AudioSource:Ii,AudioTrackHandler:is,Avatar:Hs,AvatarBlink_Simple:nr,AvatarEyeLook_Rotation:Sm,AvatarLoader:Sw,AvatarMarker:xe,AvatarModel:Ug,Avatar_Brain_LookAt:Nl,Avatar_MouthShapes:pc,Avatar_MustacheShake:wm,Avatar_POI:Fo,AxesHelper:ma,BaseUIComponent:Bi,BasicIKConstraint:Pm,BehaviorExtension:eg,BehaviorModel:pt,BloomEffect:du,BoxCollider:Hd,BoxGizmo:dr,BoxHelperComponent:nt,Button:ys,CallInfo:Jn,Camera:$t,CameraTargetReachedEvent:zl,Canvas:ca,CanvasGroup:qs,CapsuleCollider:os,ChangeMaterialOnClick:Gm,ChangeTransformOnClick:lr,CharacterController:sr,CharacterControllerInput:cs,ChromaticAberration:Ac,Collider:Xt,ColorAdjustments:ao,ColorBySpeedModule:Oa,ColorOverLifetimeModule:lu,ContactShadows:mc,ControlTrackHandler:wu,CustomBranding:hr,Deletable:Rm,DeleteBox:Ns,DepthOfField:an,DeviceFlag:qd,DocumentExtension:Cw,DragControls:Mo,DropListener:hs,Duplicatable:Am,EffectWrapper:Hl,EmissionModule:ms,EmphasizeOnClick:ba,EnvironmentScene:Mu,EventList:de,EventListEvent:Nd,EventSystem:It,EventTrigger:Qd,FieldWithDefault:yv,FixedJoint:pg,Fog:Ca,GltfExport:Nm,GltfExportBox:Um,Gradient:fr,Graphic:Cc,GraphicRaycaster:Vd,GridHelper:Pa,GridLayoutGroup:rg,GroundProjectedEnv:An,GroupActionModel:Oo,HideOnStart:Oi,HingeJoint:Mc,HorizontalLayoutGroup:og,Image:Ea,InheritVelocityModule:_g,InputField:Tg,InstanceHandle:Uo,InstancingHandler:qo,Interactable:km,Keyframe:Wt,LODGroup:kc,LODModel:Ma,Light:mi,LimitVelocityOverLifetimeModule:et,LogStats:Om,LookAt:Ag,LookAtConstraint:ir,MainModule:Ct,MaskableGraphic:Pc,MeshCollider:eo,MeshRenderer:yc,MinMaxCurve:G,MinMaxGradient:pr,NeedleMenu:Dn,NestedGltf:ou,Networking:gg,NoiseModule:fe,ObjectRaycaster:hi,OffsetConstraint:ur,OpenURL:Ta,OrbitControls:he,Outline:Sa,Padding:cr,ParticleBurst:vd,ParticleSubEmitter:bg,ParticleSystem:Gl,ParticleSystemRenderer:Vi,PhysicsExtension:tg,PixelationEffect:Lc,PlayAnimationOnClick:$l,PlayAudioOnClick:Gs,PlayableDirector:da,PlayerColor:ha,PointerEventData:uc,PostProcessingHandler:Sg,PreliminaryAction:va,PreliminaryTrigger:vc,RawImage:Cu,Rect:Bv,RectTransform:nn,ReflectionProbe:Vl,RegisteredAnimationInfo:Fs,RemoteSkybox:fu,Renderer:di,RendererLightmap:gd,Rigidbody:Ke,RotationBySpeedModule:Ni,RotationOverLifetimeModule:rn,SceneSwitcher:Ie,ScreenCapture:lo,ScreenSpaceAmbientOcclusion:gs,ScreenSpaceAmbientOcclusionN8:ln,SetActiveOnClick:Hm,ShadowCatcher:Bc,ShapeModule:yg,SharpeningEffect:Ic,SignalAsset:bu,SignalReceiver:Vc,SignalReceiverEvent:Nc,SignalTrackHandler:ql,Size:jv,SizeBySpeedModule:Kt,SizeOverLifetimeModule:mr,SkinnedMeshRenderer:Fm,SmoothFollow:mu,SpatialGrabRaycaster:Go,SpatialHtml:Gc,SpatialTrigger:gu,SpatialTriggerReceiver:En,SpectatorCamera:yu,SphereCollider:ga,Sprite:us,SpriteData:Yr,SpriteRenderer:Qt,SpriteSheet:la,SubEmitterSystem:wd,SyncedCamera:Pg,SyncedRoom:cn,SyncedTransform:tn,TapGestureTrigger:Xm,TeleportTarget:iu,TestRunner:Mg,TestSimulateUserData:Og,Text:St,TextBuilder:ng,TextExtension:su,TextureSheetAnimationModule:Pt,TiltShiftEffect:Bn,ToneMappingEffect:Xs,TrailModule:Ee,TransformData:ke,TransformGizmo:br,TriggerBuilder:wt,TriggerModel:Vs,UIRaycastUtils:ym,UIRootComponent:xc,USDZExporter:Rn,USDZText:Vr,USDZUIExtension:lg,UsageMarker:gc,VariantAction:Wm,VelocityOverLifetimeModule:Le,VerticalLayoutGroup:sg,VideoPlayer:Ze,Vignette:_r,VisibilityAction:wc,Voip:Js,Volume:Ra,VolumeParameter:D,VolumeProfile:cu,WebARCameraBackground:qc,WebARSessionRoot:ri,WebXR:nu,WebXRImageTracking:Xl,WebXRImageTrackingModel:bs,WebXRPlaneTracking:vs,WebXRTrackedImage:ua,XRControllerFollow:_s,XRControllerModel:rs,XRControllerMovement:ui,XRFlag:Ri,XRRig:ku,XRState:Dt,__Ignore:Pw},Symbol.toStringTag,{value:"Module"})),Cd=w("debugmissingcamera");re.registerCallback(oe.MissingCamera,s=>{Cd&&console.warn("Creating missing camera");const e=s.context.scene,t=new c.PerspectiveCamera;t.name="Default Fallback Camera",e.add(t);const i=new $t;if(i.sourceId=s.files?.[0]?.src??"unknown",i.fieldOfView=35,s.context.domElement.getAttribute("transparent")!=null)i.clearFlags=Bo.Uninitialized;else if(s.context.domElement.getAttribute("background-image")?.length||s.context.lightmaps.tryGetSkybox(i.sourceId))i.clearFlags=Bo.Skybox;else{if(i.clearFlags=Bo.SolidColor,!s.context.domElement.getAttribute("background-color")){let a="#efefef";typeof window!==void 0&&window.matchMedia("(prefers-color-scheme: dark)").matches&&(a="#1f1f1f"),e.background=new c.Color(a)}if(!e.environment){const a=new c.PMREMGenerator$1(s.context.renderer),l=new Mu("neutral");e.environment=a.fromScene(l,.025).texture}}const o=Ao(t,i,!0);return t.position.x=0,t.position.y=1,t.position.z=2,s.context.domElement?.cameraControls!=!1&&Mw(s.context,o),o});re.registerCallback(oe.ContextCreated,s=>{if(!s.context.mainCamera){Cd&&console.log("Will not auto-fit because a default camera exists");return}if(s.context.domElement?.cameraControls==!0){if(eb(s.context.mainCamera)?.isCameraController==!0){Cd&&console.log("Will not auto-fit because a camera controller exists");return}Mw(s.context)}});function Mw(s,e){e=e??s.mainCameraComponent;const t=e?.gameObject;if(Cd&&console.log("Creating default camera controls",e?.name),t){const i=sc(t,he);i.sourceId=e?.sourceId??"unknown";const n=s.domElement.getAttribute("auto-rotate");if(i.autoRotate=n!=null&&n!="0"&&n?.toLowerCase()!="false",i.autoRotateSpeed=.5,i.autoFit=!0,i.autoRotate&&n){const o=parseFloat(n);isNaN(o)||(i.autoRotateSpeed=o)}}else console.warn("Missing camera object, can not add orbit controls")}re.registerCallback(oe.ContextCreated,s=>{const e=s.context.domElement.getAttribute("autoplay");if(e!==void 0&&(e===""||e==="true"||e==="1")&&s.files)for(const t of s.files)x.foreachComponent(t.file.scene,n=>{if(n.enabled!==!1){if(n instanceof vt&&n.playAutomatically||n instanceof mt||n instanceof da&&n.playOnAwake===!0)return!0;if(n instanceof vt)return n.playAutomatically=!0,!0;if(n instanceof da)return n.playOnAwake=!0,!0}},!0)!==!0&&oa.assignAnimationsFromFile(t.file,{createAnimationComponent:(n,o)=>ai(n,vt)})});class QR extends se.WorkerBase{constructor(){super(new Worker(new URL("/generateMeshBVH.worker-2qGLkQjg.js",typeof document>"u"?require("url").pathToFileURL(__filename).href:Eu&&Eu.tagName.toUpperCase()==="SCRIPT"&&Eu.src||new URL("needle-engine.bundle-C4N-adas.umd.cjs",document.baseURI).href),{type:"module"})),this.name="GenerateMeshBVHWorker"}runTask(e,t,i={}){return new Promise((n,o)=>{if(t.getAttribute("position").isInterleavedBufferAttribute||t.index&&t.index.isInterleavedBufferAttribute)throw new Error("GenerateMeshBVHWorker: InterleavedBufferAttribute are not supported for the geometry attributes.");e.onerror=h=>{o(new Error(`[GenerateMeshBVHWorker] ${h.message||"Unknown error. Please check the server console. If you're using vite try adding 'three-mesh-bvh' to 'optimizeDeps.exclude' in your vite.config.js"}`))},e.onmessage=h=>{const{data:d}=h;if(d.error)o(new Error(d.error)),e.onmessage=null;else if(d.serialized){const{serialized:u,position:p}=d,m=se.MeshBVH.deserialize(u,t,{setIndex:!1}),y=Object.assign({setBoundingBox:!0},i);if(t.attributes.position.array=p,u.index)if(t.index)t.index.array=u.index;else{const b=new c.BufferAttribute(u.index,1,!1);t.setIndex(b)}y.setBoundingBox&&(t.boundingBox=m.getBoundingBox(new c.Box3)),i.onProgress&&i.onProgress(d.progress),n(m),e.onmessage=null}else i.onProgress&&i.onProgress(d.progress)};const r=t.index?t.index.array:null,a=t.attributes.position.array,l=[a];r&&l.push(r),e.postMessage({index:r,position:a,options:{...i,onProgress:null,includedProgressCallback:!!i.onProgress,groups:[...t.groups]}},l.map(h=>h.buffer).filter(h=>typeof SharedArrayBuffer>"u"||!(h instanceof SharedArrayBuffer)))})}}const YR=Object.freeze(Object.defineProperty({__proto__:null,GenerateMeshBVHWorker:QR},Symbol.toStringTag,{value:"Module"}));exports.$physicsKey=z1;exports.ActionBuilder=ae;exports.ActionCollection=Av;exports.ActionModel=Nt;exports.Addressables=g0;exports.AlignmentConstraint=hc;exports.AmbientMode=Xr;exports.Animation=vt;exports.AnimationCurve=Rc;exports.AnimationExtension=Kd;exports.AnimationTrackHandler=vu;exports.AnimationUtils=oa;exports.Animator=mt;exports.AnimatorConditionMode=Ls;exports.AnimatorController=Ai;exports.AnimatorControllerParameterType=mm;exports.AnimatorStateInfo=rl;exports.Antialiasing=Tc;exports.Application=en;exports.AssetDatabase=Ab;exports.AssetReference=Y;exports.AudioExtension=ar;exports.AudioListener=es;exports.AudioSource=Ii;exports.AudioTrackHandler=is;exports.Avatar=Hs;exports.AvatarBlink_Simple=nr;exports.AvatarEyeLook_Rotation=Sm;exports.AvatarLoader=Sw;exports.AvatarMarker=xe;exports.AvatarModel=Ug;exports.Avatar_Brain_LookAt=Nl;exports.Avatar_MouthShapes=pc;exports.Avatar_MustacheShake=wm;exports.Avatar_POI=Fo;exports.Axes=zr;exports.AxesHelper=ma;exports.BUILD_TIME=$p;exports.BaseUIComponent=Bi;exports.BasicIKConstraint=Pm;exports.BehaviorExtension=eg;exports.BehaviorModel=pt;exports.BloomEffect=du;exports.BoxCollider=Hd;exports.BoxGizmo=dr;exports.BoxHelperComponent=nt;exports.Button=ys;exports.ButtonsFactory=Yi;exports.CallDirection=K0;exports.CallInfo=Jn;exports.Camera=$t;exports.CameraTargetReachedEvent=zl;exports.Canvas=ca;exports.CanvasGroup=qs;exports.CapsuleCollider=os;exports.ChangeMaterialOnClick=Gm;exports.ChangeTransformOnClick=lr;exports.CharacterController=sr;exports.CharacterControllerInput=cs;exports.ChromaticAberration=Ac;exports.CircularBuffer=li;exports.ClearFlags=Bo;exports.ClipExtrapolation=pn;exports.Collider=Xt;exports.Collision=X0;exports.CollisionDetectionMode=zd;exports.ColorAdjustments=ao;exports.ColorBySpeedModule=Oa;exports.ColorOverLifetimeModule=lu;exports.Component=QC;exports.Component$1=k;exports.ComponentLifecycleEvents=Ad;exports.Components=XR;exports.ConnectionEvents=Mb;exports.ContactPoint=q0;exports.ContactShadows=mc;exports.Context=U;exports.ContextArgs=DC;exports.ContextEvent=oe;exports.ContextRegistry=re;exports.ControlTrackHandler=wu;exports.CustomBranding=hr;exports.CustomShader=ye;exports.DefaultReflectionMode=rd;exports.Deletable=Rm;exports.DeleteBox=Ns;exports.DepthOfField=an;exports.DeviceFlag=qd;exports.DocumentExtension=Cw;exports.DragControls=Mo;exports.DragMode=Em;exports.DropListener=hs;exports.Duplicatable=Am;exports.EffectWrapper=Hl;exports.EmissionModule=ms;exports.EmphasizeOnClick=ba;exports.EngineLoadingView=Ql;exports.EnvironmentScene=Mu;exports.EventList=de;exports.EventListEvent=Nd;exports.EventSystem=It;exports.EventTrigger=Qd;exports.FieldWithDefault=yv;exports.FileReference=Io;exports.FileReferenceSerializer=_0;exports.FileSpawnModel=cP;exports.File_Event=sv;exports.FixedJoint=pg;exports.Fog=Ca;exports.FrameEvent=pe;exports.GENERATOR=Od;exports.GameObject=x;exports.Gizmos=j;exports.GltfExport=Nm;exports.GltfExportBox=Um;exports.Gradient=fr;exports.Graphic=Cc;exports.GraphicRaycaster=Vd;exports.Graphics=Ws;exports.GridHelper=Pa;exports.GridLayoutGroup=rg;exports.GroundProjectedEnv=An;exports.GroupActionModel=Oo;exports.HideFlags=$d;exports.HideOnStart=Oi;exports.HingeJoint=Mc;exports.HorizontalLayoutGroup=og;exports.HostData=FS;exports.Image=Ea;exports.ImageReference=Do;exports.ImageReferenceSerializer=y0;exports.InheritVelocityModule=_g;exports.Input=vb;exports.InputEventQueue=Vt;exports.InputEvents=we;exports.InputField=Tg;exports.InstanceHandle=Uo;exports.InstancingHandler=qo;exports.InstancingUtil=Ti;exports.InstantiateEvent=Wb;exports.InstantiateIdProvider=ft;exports.InstantiateOptions=sn;exports.Interactable=km;exports.JoinedRoomResponse=cS;exports.KeyEventArgs=Zx;exports.Keyframe=Wt;exports.LODGroup=kc;exports.LODModel=Ma;exports.LeftRoomResponse=hS;exports.Light=mi;exports.LightData=S0;exports.LimitVelocityOverLifetimeModule=et;exports.LoadingElementOptions=LR;exports.LogStats=Om;exports.LogType=oi;exports.LookAt=Ag;exports.LookAtConstraint=ir;exports.MainModule=Ct;exports.MarkerType=kg;exports.MaskableGraphic=Pc;exports.Mathf=I;exports.MeshCollider=eo;exports.MeshRenderer=yc;exports.MinMaxCurve=G;exports.MinMaxGradient=pr;exports.NEKeyboardEvent=il;exports.NEPointerEvent=Xn;exports.NeedleButtonElement=xw;exports.NeedleEngineWebComponent=Fg;exports.NeedleMenu=Dn;exports.NeedlePatchesKey=Rh;exports.NeedleXRController=qp;exports.NeedleXRSession=H;exports.NeedleXRSync=Rb;exports.NeedleXRUtils=Tb;exports.NestedGltf=ou;exports.NetworkConnection=kb;exports.NetworkedStreamEvents=xn;exports.NetworkedStreams=fc;exports.Networking=gg;exports.NewInstanceModel=Hb;exports.NoiseModule=fe;exports.ObjectRaycaster=hi;exports.ObjectUtils=Ko;exports.OffsetConstraint=ur;exports.OneEuroFilter=Oh;exports.OneEuroFilterXYZ=Ip;exports.OpenURL=Ta;exports.OrbitControls=he;exports.Outline=Sa;exports.OwnershipEvent=Ob;exports.OwnershipModel=Kp;exports.PUBLIC_KEY=Br;exports.Padding=cr;exports.ParticleBurst=vd;exports.ParticleSubEmitter=bg;exports.ParticleSystem=Gl;exports.ParticleSystemBaseBehaviour=ro;exports.ParticleSystemRenderer=Vi;exports.ParticleSystemShapeType=bd;exports.PeerHandle=ts;exports.PeerNetworking=Pb;exports.Physics=na;exports.PhysicsExtension=tg;exports.PhysicsMaterialCombine=it;exports.PixelationEffect=Lc;exports.PlayAnimationOnClick=$l;exports.PlayAudioOnClick=Gs;exports.PlayableDirector=da;exports.PlayerColor=ha;exports.PlayerState=Ki;exports.PlayerStateEvent=Iv;exports.PlayerSync=Zm;exports.PlayerView=v0;exports.PlayerViewManager=w0;exports.PointerEventData=uc;exports.PointerType=Ed;exports.PostProcessingEffect=Ne;exports.PostProcessingEffectOrder=Qe;exports.PostProcessingHandler=Sg;exports.PreliminaryAction=va;exports.PreliminaryTrigger=vc;exports.PrimitiveType=No;exports.Progress=ie;exports.PromiseAllWithErrors=Lp;exports.PromiseErrorResult=Ff;exports.RGBAColor=Z;exports.RapierPhysics=Kr;exports.RawImage=Cu;exports.RaycastOptions=Zs;exports.Rect=Bv;exports.RectTransform=nn;exports.ReflectionProbe=Vl;exports.RegisteredAnimationInfo=Fs;exports.RemoteSkybox=fu;exports.RenderTexture=wn;exports.RenderTextureSerializer=$0;exports.Renderer=di;exports.RendererData=x0;exports.RendererLightmap=gd;exports.Rigidbody=Ke;exports.RigidbodyConstraints=De;exports.RoomEvents=Q;exports.RotationBySpeedModule=Ni;exports.RotationOverLifetimeModule=rn;exports.SceneLightSettings=fd;exports.SceneSwitcher=Ie;exports.ScreenCapture=lo;exports.ScreenSpaceAmbientOcclusion=gs;exports.ScreenSpaceAmbientOcclusionN8=ln;exports.SendQueue=Qi;exports.SerializationContext=am;exports.SetActiveOnClick=Hm;exports.ShadowCatcher=Bc;exports.ShapeModule=yg;exports.ShapeOverlapResult=Q0;exports.SharpeningEffect=Ic;exports.SignalAsset=bu;exports.SignalReceiver=Vc;exports.SignalReceiverEvent=Nc;exports.SignalTrackHandler=ql;exports.Size=jv;exports.SizeBySpeedModule=Kt;exports.SizeOverLifetimeModule=mr;exports.SkinnedMeshRenderer=Fm;exports.SmoothFollow=mu;exports.SpatialGrabRaycaster=Go;exports.SpatialHtml=Gc;exports.SpatialTrigger=gu;exports.SpatialTriggerReceiver=En;exports.SpectatorCamera=yu;exports.SphereCollider=ga;exports.SphereIntersection=em;exports.Sprite=us;exports.SpriteData=Yr;exports.SpriteRenderer=Qt;exports.SpriteSheet=la;exports.StateMachineBehaviour=t1;exports.StreamEndedEvent=bm;exports.StreamReceivedEvent=Y0;exports.SubEmitterSystem=wd;exports.SyncedCamera=Pg;exports.SyncedRoom=cn;exports.SyncedTransform=tn;exports.TapGestureTrigger=Xm;exports.TeleportTarget=iu;exports.TestRunner=Mg;exports.TestSceneUtils=VR;exports.TestSimulateUserData=Og;exports.Text=St;exports.TextBuilder=ng;exports.TextExtension=su;exports.TextureSheetAnimationModule=Pt;exports.TiltShiftEffect=Bn;exports.Time=C0;exports.ToneMappingEffect=Xs;exports.TrackHandler=$c;exports.TrackType=ei;exports.TrailModule=Ee;exports.TransformData=ke;exports.TransformGizmo=br;exports.TriggerBuilder=wt;exports.TriggerModel=Vs;exports.TypeStore=P;exports.UIRaycastUtils=ym;exports.UIRootComponent=xc;exports.USDDocument=Vm;exports.USDObject=ze;exports.USDWriter=Sv;exports.USDZExporter=Rn;exports.USDZExporter$1=Cv;exports.USDZText=Vr;exports.USDZUIExtension=lg;exports.UriSerializer=W0;exports.UsageMarker=gc;exports.UserJoinedOrLeftRoomModel=dS;exports.VERSION=Zi;exports.VariantAction=Wm;exports.VelocityOverLifetimeModule=Le;exports.VerticalLayoutGroup=sg;exports.VideoPlayer=Ze;exports.ViewDevice=Us;exports.Vignette=_r;exports.VisibilityAction=wc;exports.Voip=Js;exports.Volume=Ra;exports.VolumeParameter=D;exports.VolumeProfile=cu;exports.WaitForFrames=fC;exports.WaitForPromise=b0;exports.WaitForSeconds=hm;exports.Watch=ns;exports.WebARCameraBackground=qc;exports.WebARSessionRoot=ri;exports.WebXR=nu;exports.WebXRButtonFactory=$s;exports.WebXRImageTracking=Xl;exports.WebXRImageTrackingModel=bs;exports.WebXRPlaneTracking=vs;exports.WebXRTrackedImage=ua;exports.XRControllerFollow=_s;exports.XRControllerModel=rs;exports.XRControllerMovement=ui;exports.XRFlag=Ri;exports.XRRig=ku;exports.XRState=Dt;exports.XRStateFlag=bn;exports.__Ignore=Pw;exports.__internalNotifyObjectDestroyed=Fb;exports.activeInHierarchyFieldName=ss;exports.addAttributeChangeCallback=H_;exports.addComponent=ai;exports.addCustomExtensionPlugin=TP;exports.addNewComponent=Ao;exports.addPatch=kd;exports.apply=Dd;exports.applyHMRChanges=XC;exports.applyPrototypeExtensions=s0;exports.beginListenDestroy=Gb;exports.beginListenInstantiate=Xb;exports.binaryIdentifierCasts=Xp;exports.build_scene_functions=LC;exports.builtinComponentKeyName=wo;exports.calculateProgress01=Bg;exports.clearMessages=hx;exports.colorSerializer=_1;exports.compareAssociation=Zb;exports.componentSerializer=Fh;exports.copyTexture=ab;exports.createMotion=U0;exports.debugNet=Bt;exports.debugOwner=nl;exports.decompressGpuTexture=kv;exports.deepClone=Kl;exports.delay=Tn;exports.delayForFrames=Zl;exports.deserializeObject=sd;exports.destroy=ci;exports.destroyComponentInstance=a0;exports.determineMimeTypeFromExtension=ov;exports.disposeObjectResources=_e;exports.disposeStream=Sn;exports.editorGuidKeyName=wl;exports.enableSpatialConsole=Ro;exports.euler=v1;exports.eventListSerializer=C1;exports.exportAsGLTF=GR;exports.findByGuid=cm;exports.findObjectOfType=ac;exports.findObjectsOfType=c0;exports.findResourceUsers=tm;exports.fitObjectIntoVolume=cb;exports.foreachComponent=$o;exports.foreachComponentEnumerator=jd;exports.forward=Px;exports.generateQRCode=X_;exports.generateSeed=qb;exports.getBoundingBox=Gt;exports.getCameraController=eb;exports.getComponent=Jo;exports.getComponentInChildren=rc;exports.getComponentInParent=Bl;exports.getComponents=oc;exports.getComponentsInChildren=fa;exports.getComponentsInParent=Ld;exports.getFormattedDate=bv;exports.getIconElement=ut;exports.getIconTexture=np;exports.getLoader=Ji;exports.getOrAddComponent=sc;exports.getParam=w;exports.getParentHierarchyPath=kx;exports.getPath=Nw;exports.getPeerOptions=oS;exports.getPeerjsInstance=Cb;exports.getResourceUserCount=RS;exports.getTempColor=nb;exports.getTempQuaternion=Xi;exports.getTempVector=V;exports.getUrlParams=Yl;exports.getVisibleInCustomShadowRendering=lb;exports.getWorldDirection=sb;exports.getWorldEuler=Fp;exports.getWorldPosition=X;exports.getWorldQuaternion=ue;exports.getWorldRotation=Md;exports.getWorldScale=Ae;exports.hasCommercialLicense=kn;exports.hasIndieLicense=cc;exports.hasPointerEventComponent=cd;exports.hasProLicense=On;exports.hideDebugConsole=fb;exports.imageToCanvas=Rv;exports.instantiate=Wo;exports.invokeLoadedImportPluginHooks=pv;exports.invokeXRSessionEnd=bb;exports.invokeXRSessionStart=_b;exports.isActiveInHierarchy=h0;exports.isActiveSelf=pa;exports.isAndroidDevice=qw;exports.isAnimationAction=rb;exports.isComponent=H0;exports.isDebugMode=Bw;exports.isDesktop=$w;exports.isDestroyed=Vo;exports.isDevEnvironment=A;exports.isDisposed=OS;exports.isExporting=$R;exports.isGLTFModel=G0;exports.isHostedOnGlitch=U_;exports.isHotReloadEnabled=lp;exports.isHotReloading=HC;exports.isIPad=Gw;exports.isIconElement=O0;exports.isLocalNetwork=Li;exports.isMacOS=Qw;exports.isMobileDevice=Ww;exports.isMozillaXR=Xw;exports.isQuest=Zw;exports.isResourceTrackingEnabled=Db;exports.isSafari=Kw;exports.isUsingInstancing=Id;exports.isiOS=Yw;exports.isiPad=Hw;exports.loadAsset=OR;exports.loadPMREM=sw;exports.loadSync=jg;exports.logHierarchy=Yh;exports.lookAtInverse=yx;exports.lookAtObject=Jl;exports.lookAtScreenPoint=_x;exports.makeId=Uw;exports.makeIdFromRandomWords=$_;exports.makeNameSafe=ji;exports.markAsInstancedRendered=d0;exports.microphonePermissionsGranted=Jw;exports.nameof=jw;exports.nameofFactory=N_;exports.objectSerializer=V0;exports.offXRSessionEnd=Kx;exports.offXRSessionStart=Yx;exports.onAfterRender=WC;exports.onBeforeRender=$C;exports.onClear=NC;exports.onDestroy=VC;exports.onInitialized=A0;exports.onStart=fm;exports.onUpdate=L0;exports.onXRSessionEnd=Hp;exports.onXRSessionStart=Rd;exports.parseSync=yw;exports.placeOnSurface=hb;exports.postprocessFBXMaterials=Np;exports.prefix=u1;exports.pushState=V_;exports.randomNumber=zw;exports.registerBinaryType=Qp;exports.registerComponent=Fd;exports.registerComponentExtension=Im;exports.registerCustomEffectType=$i;exports.registerExportExtensions=jm;exports.registerExtensions=md;exports.registerHotReloadType=I0;exports.registerLoader=Wp;exports.registerPrefabProvider=Yb;exports.registerPrototypeExtensions=o0;exports.registerType=$S;exports.relativePathPrefix=G_;exports.removeAttributeChangeCallback=q_;exports.removeComponent=lm;exports.removeCustomImportExtensionType=AP;exports.removePatch=Xx;exports.resolveUrl=Qs;exports.sanitizeString=W_;exports.saveImage=fw;exports.screenshot=hR;exports.screenshot2=Dg;exports.sendDestroyed=nm;exports.serializable=f;exports.serializeObject=e0;exports.serializeable=er;exports.setActive=Cl;exports.setAllowBalloonMessages=K_;exports.setAllowOverlayMessages=rx;exports.setAutoFitEnabled=Xh;exports.setCameraController=zf;exports.setDestroyed=f0;exports.setDevEnvironment=jx;exports.setDisposable=jb;exports.setDontDestroy=Tr;exports.setOrAddParamsToUrl=Bf;exports.setParam=Fw;exports.setParamWithoutReload=Ll;exports.setPeerOptions=rS;exports.setResourceTrackingEnabled=MS;exports.setState=Tp;exports.setVisibleInCustomShadowRendering=zp;exports.setWorldEuler=Up;exports.setWorldPosition=Ye;exports.setWorldPositionXYZ=zo;exports.setWorldQuaternion=Di;exports.setWorldQuaternionXYZW=Bp;exports.setWorldRotation=ob;exports.setWorldRotationXYZ=ec;exports.setWorldScale=Jr;exports.showBalloonError=tc;exports.showBalloonMessage=Se;exports.showBalloonWarning=ce;exports.showDebugConsole=Vp;exports.slerp=gx;exports.syncDestroy=ic;exports.syncField=Km;exports.syncInstantiate=sm;exports.textureToCanvas=Rx;exports.tryCastBinary=xb;exports.tryDetermineMimetypeFromBinary=av;exports.tryDetermineMimetypeFromURL=rv;exports.tryFindObject=Zr;exports.tryGetGuid=Sb;exports.unregisterHotReloadType=j0;exports.unwatchWrite=Ap;exports.useForAutoFit=tb;exports.validate=gt;exports.watchWrite=Pd;