@needle-tools/engine 4.11.0-next.cc37c71 → 4.11.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +6 -0
- package/dist/{needle-engine.bundle-BPZ6emFK.js → needle-engine.bundle-6yF8G5KJ.js} +17 -11
- package/dist/{needle-engine.bundle-JV2ghuCa.min.js → needle-engine.bundle-BSk8yk3v.min.js} +4 -4
- package/dist/{needle-engine.bundle-CTY0RgBZ.umd.cjs → needle-engine.bundle-DPVYipMl.umd.cjs} +5 -5
- package/dist/needle-engine.js +2 -2
- package/dist/needle-engine.min.js +1 -1
- package/dist/needle-engine.umd.cjs +1 -1
- package/lib/engine/engine_physics.js +2 -1
- package/lib/engine/engine_physics.js.map +1 -1
- package/lib/engine-components/web/ScrollFollow.d.ts +3 -0
- package/lib/engine-components/web/ScrollFollow.js +15 -3
- package/lib/engine-components/web/ScrollFollow.js.map +1 -1
- package/package.json +2 -2
- package/src/engine/engine_physics.ts +3 -3
- package/src/engine-components/web/ScrollFollow.ts +19 -3
package/dist/{needle-engine.bundle-CTY0RgBZ.umd.cjs → needle-engine.bundle-DPVYipMl.umd.cjs}
RENAMED
|
@@ -141,7 +141,7 @@ void main(){
|
|
|
141
141
|
#__vconsole .vc-mask {
|
|
142
142
|
overflow: hidden;
|
|
143
143
|
}
|
|
144
|
-
`,Co?.prepend(i),s===!0&&Rb()<=0&&Xb(),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.":"")),il=!1,Ri=null},e.src="https://cdn.jsdelivr.net/npm/vconsole@3.15.1/dist/vconsole.min.js",document.body.appendChild(e)}function RS(){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"),Ri?.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 TS(){const s=document.querySelector("#__vconsole .vc-switch");return s||null}function AS(){const s=document.querySelector("#__vconsole");return s||null}const Qb=x("debugdefines");ro('if(!globalThis["NEEDLE_ENGINE_VERSION"]) globalThis["NEEDLE_ENGINE_VERSION"] = "0.0.0";');ro('if(!globalThis["NEEDLE_ENGINE_GENERATOR"]) globalThis["NEEDLE_ENGINE_GENERATOR"] = "unknown";');ro('if(!globalThis["NEEDLE_PROJECT_BUILD_TIME"]) globalThis["NEEDLE_PROJECT_BUILD_TIME"] = "unknown";');ro('if(!globalThis["NEEDLE_PUBLIC_KEY"]) globalThis["NEEDLE_PUBLIC_KEY"] = "unknown";');ro('globalThis["__NEEDLE_ENGINE_VERSION__"] = "4.11.
|
|
144
|
+
`,Co?.prepend(i),s===!0&&Rb()<=0&&Xb(),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.":"")),il=!1,Ri=null},e.src="https://cdn.jsdelivr.net/npm/vconsole@3.15.1/dist/vconsole.min.js",document.body.appendChild(e)}function RS(){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"),Ri?.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 TS(){const s=document.querySelector("#__vconsole .vc-switch");return s||null}function AS(){const s=document.querySelector("#__vconsole");return s||null}const Qb=x("debugdefines");ro('if(!globalThis["NEEDLE_ENGINE_VERSION"]) globalThis["NEEDLE_ENGINE_VERSION"] = "0.0.0";');ro('if(!globalThis["NEEDLE_ENGINE_GENERATOR"]) globalThis["NEEDLE_ENGINE_GENERATOR"] = "unknown";');ro('if(!globalThis["NEEDLE_PROJECT_BUILD_TIME"]) globalThis["NEEDLE_PROJECT_BUILD_TIME"] = "unknown";');ro('if(!globalThis["NEEDLE_PUBLIC_KEY"]) globalThis["NEEDLE_PUBLIC_KEY"] = "unknown";');ro('globalThis["__NEEDLE_ENGINE_VERSION__"] = "4.11.1";');ro('globalThis["__NEEDLE_ENGINE_GENERATOR__"] = "undefined";');ro('globalThis["__NEEDLE_PROJECT_BUILD_TIME__"] = "Thu Oct 16 2025 14:08:49 GMT+0000 (Coordinated Universal Time)";');ro('globalThis["__NEEDLE_PUBLIC_KEY__"] = "'+NEEDLE_PUBLIC_KEY+'";');const en="4.11.1",Qd="undefined",wm="Thu Oct 16 2025 14:08:49 GMT+0000 (Coordinated Universal Time)";Qb&&console.log(`Engine version: ${en} (generator: ${Qd})
|
|
145
145
|
Project built at ${wm}`);const Zr=NEEDLE_PUBLIC_KEY,ls="needle_isActiveInHierarchy",Do="builtin_components",Ul="needle_editor_guid";function ro(s){try{(0,eval)(s)}catch(e){Qb&&console.error(e)}}let Yb,Ly=null;function on(){return Yb}function xm(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}Ly!==s&&(Ly=s,Yb=new s)}const ai=Symbol("shadowDomOwner"),DS=x("debugpatch");function Yd(s,e,t,i){const n=DS===e;if(!t&&!i)return;const o=e+"___needle";IS(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]=jy(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]=jy(l,s,e);else{const h=this[o];Kb(s,e,this,h,l),this[o]=l,Zb(s,e,this,h,l)}},get:function(){const l=this[o];return typeof l=="function"&&l[o]?l[o]:l}}))}function LS(s,e,t){const i=Sm(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 Iy=Symbol("Needle:Patches:WrappedFunction");function jy(s,e,t){if(s[Iy])return s;const i=function(...n){Kb(e,t,this,...n);const o=s.apply(this,n);return Zb(e,t,this,o,...n),o};return i[Iy]=!0,i}const Zh="Needle:Patches";function _p(){return globalThis[Zh]||(globalThis[Zh]=new WeakMap),globalThis[Zh]}function Sm(s,e){const t=_p().get(s);return t?t.get(e):null}function IS(s,e,t,i){let n=_p().get(s);n||(n=new Map,_p().set(s,n));let o=n.get(e);o||(o=[],n.set(e,o)),o.push({prefix:t,postfix:i})}function Kb(s,e,t,...i){if(!t)return;const n=Sm(s,e);if(n)for(const o of n)o.prefix?.call(t,...i)}function Zb(s,e,t,i,...n){if(!t)return;const o=Sm(s,e);if(o)for(const r of o)r.postfix?.call(t,i,...n)}const ma=[];function Kd(s){ma.indexOf(s)===-1&&ma.push(s)}function jS(s){const e=ma.indexOf(s);e!==-1&&ma.splice(e,1)}const ga=[];function Cm(s){ga.indexOf(s)===-1&&ga.push(s)}function BS(s){const e=ga.indexOf(s);e!==-1&&ga.splice(e,1)}function Jb(s){globalThis.dispatchEvent(new CustomEvent("needle-xrsession-start",{detail:s}));for(let e=0;e<ma.length;e++)ma[e](s)}function e0(s){globalThis.dispatchEvent(new CustomEvent("needle-xrsession-end",{detail:s}));for(let e=0;e<ga.length;e++)ga[e](s)}const Xe=x("debuginput");var Zd=(s=>(s.Mouse="mouse",s.Touch="touch",s.Controller="controller",s.Hand="hand",s))(Zd||{}),xe=(s=>(s.PointerDown="pointerdown",s.PointerUp="pointerup",s.PointerMove="pointermove",s.KeyDown="keydown",s.KeyUp="keyup",s.KeyPressed="keypress",s))(xe||{});class Zn 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(),Xe&&console.warn("Stop propagation...",this.pointerId,this.pointerType)}}class wl extends KeyboardEvent{source;constructor(e,t,i){super(e,i),this.source=t}stopImmediatePropagation(){super.stopImmediatePropagation(),this.source?.stopImmediatePropagation()}}class FS{key;keyType;source;constructor(e){this.key=e.key,this.keyType=e.type,this.source=e}}var Xt=(s=>(s[s.Early=-100]="Early",s[s.Default=0]="Default",s[s.Late=100]="Late",s))(Xt||{});class t0{_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 wl){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 Zn){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,Xe&&console.log("immediatePropagationStopped",e.type);break}else e.propagationStopped&&(t=!0,Xe&&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":Xe&&Ce("Create Pointer down"),this.onDownButton(e.deviceIndex,e.button),this.onDown(e);break;case"pointermove":Xe&&Ce("Create Pointer move"),this.onMove(e);break;case"pointerup":Xe&&Ce("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:(Xe&&console.warn("CanReceiveInput:False for",e.target),!1)}onContextMenu=e=>{this.canReceiveInput(e)!==!1&&e instanceof PointerEvent&&e.pointerType};keysPressed={};onKeyDown=e=>{if(Xe&&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 wl("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 wl("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 wl("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);Xe&&Ce(`pointer down #${t}, identifier:${e.pointerId}`);const i=this.getAndUpdateSpatialObjectForScreenPosition(t,e.clientX,e.clientY),n=new Zn("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 Zn("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||(Xe&&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 Zn("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,Xe&&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 Zn("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 Zn("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 Zn("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||j(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 Xe&&!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}`,Xe?e:""),Xe&&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)){Xe&&console.log(e.pointerType,"UP",t,"was not down");return}Xe&&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]){Xe&&de("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;Xe&&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):(Xe&&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=z.Current;try{z.Current=this.context,this.dispatchEvent(e)}finally{z.Current=t}}}const oa=new c.Matrix4().makeRotationY(Math.PI),ki=new c.Quaternion().setFromAxisAngle(new c.Vector3(0,1,0),Math.PI),US=x("debugwebxr");class zS{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",US){const e=Tm(16733661);e.position.y+=.5,this.gameObject.add(e)}}}const $n=x("debugwebxr"),bh=x("debugcustomgesture"),NS="https://cdn.jsdelivr.net/npm/@webxr-input-profiles/assets@1.0/dist/profiles",VS="generic-trigger",$S=new c.Quaternion().setFromEuler(new c.Euler(c.MathUtils.degToRad(0),c.MathUtils.degToRad(-90),c.MathUtils.degToRad(-90))),WS=new c.Vector3(.04,-.04,0);class Pm{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 j(this._gripPosition)}get gripQuaternion(){return qt(this._gripQuaternion)}get gripMatrix(){return this._gripMatrix}get gripLinearVelocity(){return j(this._linearVelocity).applyQuaternion(ki)}get rayPosition(){return j(this._rayPosition)}get rayQuaternion(){return qt(this._rayQuaternion)}get gripWorldPosition(){return j(this._gripWorldPosition)}_gripWorldPosition=new c.Vector3;get gripWorldQuaternion(){return qt(this._gripWorldQuaternion)}_gripWorldQuaternion=new c.Quaternion;get rayWorldPosition(){return j(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 qt(this._rayWorldQuaternion)}_rayWorldQuaternion=new c.Quaternion;get pinchPosition(){return j(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(ki),t&&this._rayWorldQuaternion.premultiply(t)}get ray(){return this._ray.origin.copy(this.rayWorldPosition),this._ray.direction.copy(j(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=j(0,1,0).applyQuaternion(e.quaternion),i=j(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}`,$n&&(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(){B.DrawSphere(this.rayWorldPosition,.003),B.DrawDirection(this.rayWorldPosition,j(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+=`
|
|
@@ -164,7 +164,7 @@ See https://engine.needle.tools/docs/scripting.html#special-lifecycle-hooks for
|
|
|
164
164
|
`+xi);const o=await Promise.resolve().then(()=>require("./vendor-CAWj5cBK.umd.cjs")).then(h=>h.index),r=o.default?.WebsocketBuilder??o.WebsocketBuilder,a=o.default?.ExponentialBackoff??o.ExponentialBackoff,l=new r(xi).withMaxRetries(10).withBackoff(new a(2e3,4)).onOpen(()=>{this._connectingToWebsocketPromise=null,this._ws=l,this.connected=!0,T()||Nt?console.log(`⊞ Connected to networking backend
|
|
165
165
|
`+xi):console.debug("⊞ Connected to networking backend",xi),n(!0),this.onSendQueued(Ki.OnConnection)}).onClose(h=>{this._connectingToWebsocketPromise=null,this.connected=!1,this._isInRoom=!1,n(!1);let d="Websocket connection closed...";xi?.includes("/socket")||(d+=' Do you perhaps mean to connect to "/socket"?'),console.error(d)}).onError(h=>{console.error("⊠ Websocket connection failed..."),n(!1)}).onRetry(()=>{console.log("→ Retry connecting to networking websocket")}).build();l.addEventListener(o.WebsocketEvent.message,(h,d)=>{this.onMessage(h,d)})})}onMessage(e,t){const i=t.data;try{if(typeof i!="string"){i.size&&this.handleIncomingBinaryMessage(i);return}const n=JSON.parse(i);if(Array.isArray(n))for(const o of n)this.handleIncomingStringMessage(o);else this.handleIncomingStringMessage(n);return}catch(n){Nt&&i==="pong"?console.log("<<",i):T()&&console.error("Failed to parse message",n)}}async handleIncomingBinaryMessage(e){wh&&console.log("<< bin",this.context.time.frame);const t=await e.arrayBuffer();var i=new Uint8Array(t);const n=new se.ByteBuffer(i),o=n.getBufferIdentifier(),r=this._listenersBinary[o],a=n0(n),l=s0(a);if(l&&typeof l=="string"&&(this._state[l]=a),!r)return;const h=a??n;for(const d of r)d(h)}handleIncomingStringMessage(e){if(Nt&&console.log("<<",e.key??e),e.key)switch(e.key){case"connection-start-info":if(e.data){const r=e.data;r&&(console.assert(r.id!==void 0&&r.id!==null&&r.id.length>0,"server did not send connection id",r.id),console.debug("Your id is: "+r.id,this.context.alias??""),this._connectionId=r.id)}else console.warn("Expected connection id in "+e.key);break;case"joined-room":if(Nt&&console.log(e),e){this._isInRoom=!0;const r=e;this._currentRoomName=r.room,this._currentRoomViewId=r.viewId,this._currentRoomAllowEditing=r.allowEditing??!0,this._currentInRoom.length=0,this._currentInRoom.push(...r.inRoom),(wh||T())&&console.debug("Joined Needle Engine Room: "+r.room);const a=new URL(window.location.href);a.searchParams.has("room")&&a.searchParams.delete("room"),a.searchParams.set("view",this._currentRoomViewId),console.debug(`Room view id: ${this._currentRoomViewId}
|
|
166
166
|
${a.href}`)}this.onSendQueued(Ki.OnRoomJoin);break;case"left-room":const n=e;n.room===this.currentRoomName&&(this._isInRoom=!1,this._currentRoomName=null,this._currentRoomAllowEditing=!0,this._currentInRoom.length=0,(wh||T())&&console.debug("Left Needle Engine Room: "+n.room));break;case"user-joined-room":if(e.data){const r=e.data;this._currentInRoom.push(r.userId),Nt&&console.log(r.userId+" joined","now in room:",this._currentInRoom)}break;case"user-left-room":if(e.data){const r=e.data,a=this._currentInRoom.indexOf(r.userId);a>=0&&(Nt&&console.log(r.userId+" left","now in room:",this._currentInRoom),this._currentInRoom.splice(a,1)),r.userId===this.connectionId&&console.log("you left the room")}break;case"all-room-state-deleted":Nt&&console.log("RECEIVED all-room-state-deleted"),this._state={};break;case"ping":case"pong":const o=e.data?.time;o&&(this._currentDelay=this.context.time.time-o),Nt&&console.log(`Current latency: ${(this._currentDelay*1e3).toFixed()} ms`,"Clients in room: "+this._currentInRoom?.length);break}const t=e.data;t&&(this._state[t.guid]=t);let i=this._listeners[e.key];if(i){i=[...i];for(const n of i)try{n(e.data)}catch(o){console.error('Error invoking callback for "'+e.key+'"',o)}}}toMessage(e,t){return{key:e,data:t}}sendWithWebsocket(e,t,i=Ki.OnRoomJoin){if(!this._ws){const o=this._waitingForSocket[i]||[];o.push(()=>this.sendWithWebsocket(e,t,i)),this._waitingForSocket[i]=o;return}const n=JSON.stringify(this.toMessage(e,t));Nt&&console.log(">>",e),this._ws.send(n)}onSendQueued(e){const t=this._waitingForSocket[e];if(t){for(const i of t)i();t.length=0}}}const zl=x("debugwebxr");class cf{controllerStates=[];userId;context;userStateEvtName;constructor(e,t){this.userId=e,this.context=t,this.userStateEvtName="xr-sync-user-state-"+e,this.context.connection.beginListen(this.userStateEvtName,this.onReceivedControllerState)}dispose(){this.context.connection.stopListen(this.userStateEvtName,this.onReceivedControllerState)}onReceivedControllerState=e=>{zl&&console.log(`XRSync: Received change for ${this.userId}: ${e.type} ${e.handedness}; tracked=${e.isTracking}`);let t=!1;for(let i=0;i<this.controllerStates.length;i++)if(this.controllerStates[i].index===e.index){this.controllerStates[i]=e,t=!0;break}t||this.controllerStates.push(e)};update(e){if(this.context.connection.isConnected!=!1){for(let t=this.controllerStates.length-1;t>=0;t--){const i=this.controllerStates[t];let n=!1;for(let o=0;o<e.controllers.length;o++)e.controllers[o].index===i.index&&(n=!0);n||(zl&&console.log(`XRSync: ${i.type} ${i.handedness} removed`,i.index),this.controllerStates.splice(t,1),this.sendControllerRemoved(i))}for(const t of e.controllers)this.updateControllerStates(t)}}onExitXR(e){for(const t of this.controllerStates)this.sendControllerRemoved(t);this.controllerStates.length=0}sendControllerRemoved(e){e.isTracking=!1,e.guid="",this.context.connection.send(this.userStateEvtName,e),this.context.connection.sendDeleteRemoteState(e.guid)}updateControllerStates(e){const t=this.controllerStates.find(i=>i.index===e.index);if(t){let i=!1;i||=t.isTracking!=e.isTracking,i&&(t.isTracking=e.isTracking,this.context.connection.send(this.userStateEvtName,t))}else{const i={guid:this.userId+"-"+e.index,isTracking:e.isTracking,handedness:e.side,index:e.index,type:e.hand?"hand":"controller"};this.controllerStates.push(i),this.context.connection.send(this.userStateEvtName,i),zl&&console.log(`XRSync: ${i.type} ${i.handedness} added`,i.index)}}}class h0{hasState(e){return e?this._states.has(e):!1}isTracking(e,t){if(!e)return;const i=this._states.get(e);return i?i.controllerStates.find(o=>o.handedness===t)?.isTracking||!1:void 0}getDeviceType(e,t){if(!e)return;const i=this._states.get(e);return i?i.controllerStates.find(o=>o.handedness===t)?.type||"unknown":void 0}context;constructor(e){this.context=e,this.context.connection.beginListen(Q.JoinedRoom,this.onJoinedRoom),this.context.connection.beginListen(Q.LeftRoom,this.onLeftRoom),this.context.connection.beginListen(Q.UserJoinedRoom,this.onOtherUserJoinedRoom),this.context.connection.beginListen(Q.UserLeftRoom,this.onOtherUserLeftRoom)}destroy(){this.context.connection.stopListen(Q.JoinedRoom,this.onJoinedRoom),this.context.connection.stopListen(Q.LeftRoom,this.onLeftRoom),this.context.connection.stopListen(Q.UserJoinedRoom,this.onOtherUserJoinedRoom),this.context.connection.stopListen(Q.UserLeftRoom,this.onOtherUserLeftRoom)}onJoinedRoom=()=>{if(this.context.connection.connectionId){this._states.has(this.context.connection.connectionId)||(zl&&console.log("XRSync: Local user joined room",this.context.connection.connectionId),this._states.set(this.context.connection.connectionId,new cf(this.context.connection.connectionId,this.context)));for(const e of this.context.connection.usersInRoom())this._states.has(e)||this._states.set(e,new cf(e,this.context))}};onLeftRoom=()=>{this.context.connection.connectionId&&(this._states.has(this.context.connection.connectionId)||(this._states.get(this.context.connection.connectionId)?.dispose(),this._states.delete(this.context.connection.connectionId)))};onOtherUserJoinedRoom=e=>{const t=e.userId;this._states.has(t)||(zl&&console.log("XRSync: Remote user joined room",t),this._states.set(t,new cf(t,this.context)))};onOtherUserLeftRoom=e=>{const t=e.userId;this._states.has(t)||(this._states.get(t)?.dispose(),this._states.delete(t))};_states=new Map;onUpdate(e){this.context.connection.isConnected&&this.context.connection.connectionId&&this._states.get(this.context.connection.connectionId)?.update(e)}onExitXR(e){this.context.connection.isConnected&&this.context.connection.connectionId&&this._states.get(this.context.connection.connectionId)?.onExitXR(e)}}class Wy{_fadeToColorQuad;_fadeToColorMaterial;constructor(){this._fadeToColorMaterial=new c.MeshBasicMaterial({color:0,transparent:!0,depthTest:!1,fog:!1,side:c.DoubleSide}),this._fadeToColorQuad=new c.Mesh(new c.PlaneGeometry(10,10),this._fadeToColorMaterial)}dispose(){this._fadeToColorQuad.geometry.dispose(),this._fadeToColorMaterial.dispose()}update(e,t){const i=this._fadeToColorQuad,n=this._fadeToColorMaterial;i.parent!==e&&n.opacity>0?e.add(i):n.opacity===0&&i.removeFromParent(),i.layers.set(2),i.material=this._fadeToColorMaterial,i.position.z=-1,i.renderOrder=1/0;const o=this._requestedFadeValue;n.opacity=I.lerp(n.opacity,o,t/.03),Math.abs(n.opacity-o)<=.01&&this._transitionResolve&&(this._transitionResolve(),this._transitionResolve=null,this._transitionPromise=null,this._requestedFadeValue=0)}remove(){this._fadeToColorQuad.removeFromParent()}fadeTransition(){if(this._transitionPromise)return this._transitionPromise;this._requestedFadeValue=1;const e=new Promise(t=>{this._transitionResolve=t});return this._transitionPromise=e,e}_requestedFadeValue=0;_transitionPromise=null;_transitionResolve=null}var Jo=(s=>(s[s.Quad=0]="Quad",s[s.Cube=1]="Cube",s[s.Sphere=2]="Sphere",s[s.Cylinder=3]="Cylinder",s[s.RoundedCube=10]="RoundedCube",s))(Jo||{});class hr{static createText(e,t){let i=null;const n=t?.font||JS(t?.familyFamily||null);n instanceof q.Font?i=this.#t(e,n,t):i==null&&(i=new c.BufferGeometry);const o=t?.color||16777215,r=new c.Mesh(i,t?.material??new c.MeshStandardMaterial({color:o}));return this.applyDefaultObjectOptions(r,t),n instanceof Promise?n.then(a=>{r.geometry=this.#t(e,a,t),t?.onGeometry&&t.onGeometry(r)}):t?.onGeometry&&t.onGeometry(r),r}static#t(e,t,i){const n=i?.depth||.1;return new q.TextGeometry(e,{font:t,size:1,depth:n,height:n,bevelEnabled:i?.bevel||!1,bevelThickness:.01,bevelOffset:.01,bevelSize:.01})}static createOccluder(e){const t=new c.MeshBasicMaterial({colorWrite:!1,depthWrite:!0,side:c.DoubleSide});return this.createPrimitive(e,{material:t})}static createPrimitive(e,t){let i;const n=t?.color||16777215;switch(e){case"Quad":case 0:{const o=new c.PlaneGeometry(1,1,1,1),r=t?.material??new c.MeshStandardMaterial({color:n});t?.texture&&"map"in r&&(r.map=t.texture),i=new c.Mesh(o,r),i.name="Quad"}break;case"Cube":case 1:{const o=new c.BoxGeometry(1,1,1),r=t?.material??new c.MeshStandardMaterial({color:n});t?.texture&&"map"in r&&(r.map=t.texture),i=new c.Mesh(o,r),i.name="Cube"}break;case 10:case"RoundedCube":{const o=ZS(1,1,1,.1,2),r=t?.material??new c.MeshStandardMaterial({color:n});t?.texture&&"map"in r&&(r.map=t.texture),i=new c.Mesh(o,r),i.name="RoundedCube"}break;case"Sphere":case 2:{const o=new c.SphereGeometry(.5,16,16),r=t?.material??new c.MeshStandardMaterial({color:n});t?.texture&&"map"in r&&(r.map=t.texture),i=new c.Mesh(o,r),i.name="Sphere"}break;case"Cylinder":case 3:{const o=new c.CylinderGeometry(.5,.5,1,32),r=t?.material??new c.MeshStandardMaterial({color:n});t?.texture&&"map"in r&&(r.map=t.texture),i=new c.Mesh(o,r),i.name="Cylinder"}break;case"ShaderBall":i=new c.Group,i.name="ShaderBall",eC(i,t);break}return this.applyDefaultObjectOptions(i,t),i}static createSprite(e){const i=new c.SpriteMaterial({color:16777215});e?.texture&&"map"in i&&(i.map=e.texture);const n=new c.Sprite(i);return this.applyDefaultObjectOptions(n,e),n}static applyDefaultObjectOptions(e,t){e.receiveShadow=!0,e.castShadow=!0,t?.name&&(e.name=t.name),t?.position&&(Array.isArray(t.position)?e.position.set(t.position[0],t.position[1],t.position[2]):e.position.set(t.position.x||0,t.position.y||0,t.position.z||0)),t?.rotation&&(Array.isArray(t.rotation)?e.rotation.set(t.rotation[0],t.rotation[1],t.rotation[2]):e.rotation.set(t.rotation.x||0,t.rotation.y||0,t.rotation.z||0)),t?.scale&&(typeof t.scale=="number"?e.scale.set(t.scale,t.scale,t.scale):Array.isArray(t.scale)?e.scale.set(t.scale[0],t.scale[1],t.scale[2]):e.scale.set(t.scale.x||1,t.scale.y||1,t.scale.z||1)),t?.receiveShadow!=null&&(e.receiveShadow=t.receiveShadow),t?.castShadow!=null&&(e.castShadow=t.castShadow),t?.parent&&t.parent.add(e)}}function ZS(s,e,t,i,n){const o=new c.Shape,r=1e-5,a=i-r;o.absarc(r,r,r,-Math.PI/2,-Math.PI,!0),o.absarc(r,e-a*2,r,Math.PI,Math.PI/2,!0),o.absarc(s-a*2,e-a*2,r,Math.PI/2,0,!0),o.absarc(s-a*2,r,r,0,-Math.PI/2,!0);const l=new c.ExtrudeGeometry(o,{bevelEnabled:!0,bevelSegments:n*2,steps:1,bevelSize:a,bevelThickness:i,curveSegments:n,UVGenerator:{generateTopUV:(h,d)=>{const u=[];for(let p=0;p<d.length;p+=3)u.push(new c.Vector2(d[p]/s,d[p+1]/e));return u},generateSideWallUV:(h,d,u,p,m,y)=>{const _=[];return _.push(new c.Vector2(d[u]/s,d[u+1]/e)),_.push(new c.Vector2(d[p]/s,d[p+1]/e)),_.push(new c.Vector2(d[m]/s,d[m+1]/e)),_.push(new c.Vector2(d[y]/s,d[y+1]/e)),_}}});return l.scale(1,1,1-i),l.center(),l.index||l.setIndex(Array.from({length:l.attributes.position.count},(h,d)=>d)),l.computeVertexNormals(),l}const xh=new Map;function JS(s){let e="";switch(s){default:case"OpenSans":e="https://cdn.needle.tools/static/fonts/facetype/Open Sans_Regular_ascii.json";break;case"Helvetiker":e="https://raw.githubusercontent.com/mrdoob/three.js/master/examples/fonts/helvetiker_regular.typeface.json";break}if(xh.has(e)){const n=xh.get(e);if(n)return n}const t=new q.FontLoader,i=new Promise((n,o)=>{t.load(e,r=>{xh.set(e,r),n(r)},void 0,o)});return xh.set(e,i),i}let hf=!1,df=null;function eC(s,e){if(df===null){const t="https://cdn.needle.tools/static/models/shaderball.glb",i=new q.GLTFLoader,n=ne.createLoaders(null);i.setDRACOLoader(n.dracoLoader),i.setKTX2Loader(n.ktx2Loader),hf=!0,df=i.loadAsync(t).then(o=>{const r=o.scene;return r.position.y-=.5,r}).catch(o=>(console.warn("Failed to load shaderball mesh: "+o.message),Gy())).finally(()=>{hf=!1})}if(hf){const t=Gy();t.name="ShaderBall-Placeholder";const i=t.children[0];i?.type==="Mesh"&&Hy(i,e),s.add(t)}df.then(t=>{s.children.forEach(o=>{o.name==="ShaderBall-Placeholder"&&s.remove(o)});const i=t.clone(),n=i.children[0];n?.type==="Mesh"&&(n.geometry.attributes.tangent||n.geometry.computeTangents(),Hy(n,e)),s.add(i)})}function Hy(s,e){if(e?.color||e?.material||e?.texture){const i=e?.material??s.material?.clone()??new c.MeshStandardMaterial;e.color&&"color"in i&&i.color instanceof c.Color&&i.color.set(e.color),e?.texture&&"map"in i&&(i.map=e.texture),s.material=i}}function Gy(){return new c.Group().add(hr.createPrimitive("Sphere",{material:new c.MeshBasicMaterial({transparent:!0,opacity:.1})}))}class ya{static _active=null;static get active(){return this._active}static _requestInFlight=!1;static async start(e,t){if(this._active)return console.error("Cannot start a new XR session while one is already active"),null;if(this._requestInFlight)return console.error("Cannot start a new XR session while a request is already in flight"),null;if("xr"in navigator&&navigator.xr){if(!t)return console.error("XRSessionInit must be provided"),null;this._requestInFlight=!0;const i=await navigator.xr.requestSession(e,t);return i.addEventListener("end",()=>{this._active=null}),this._requestInFlight?(this._requestInFlight=!1,this._active=new ya(e,t,i),this._active):(i.end(),null)}return null}static async handoff(){return this._active?this._active.handoff():null}static async stop(){this._requestInFlight=!1,this._active&&(await this._active.end(),await In(100)),this._active=null}_session;_mode;_init;get isAR(){return this._mode==="immersive-ar"}_renderer;_camera;_scene;constructor(e,t,i){this._mode=e,this._init=t,this._session=i,this._session.addEventListener("end",this.onEnd),this._renderer=new c.WebGLRenderer({alpha:!0}),this._renderer.setAnimationLoop(this.onFrame),this._renderer.xr.setSession(i),this._renderer.xr.enabled=!0,this._camera=new c.PerspectiveCamera,this._scene=new c.Scene,this._scene.fog=new c.Fog(4473924,10,250),this._scene.add(this._camera),this.setupScene()}end(){return this._session?this._session.end():Promise.resolve()}async handoff(){if(!this._session)throw new Error("Cannot handoff a session that has already ended");const e={session:this._session,mode:this._mode,init:this._init};return await this.onBeforeHandoff(),this.onEnd(),this._session=null,e}onEnd=()=>{this._session?.removeEventListener("end",this.onEnd),this._renderer.setAnimationLoop(null),this._renderer.dispose(),this._scene.clear()};_lastTime=0;onFrame=(e,t)=>{const i=e-this._lastTime;this.update(e,i),this._camera.parent!==this._scene&&this._scene.add(this._camera),this._renderer.render(this._scene,this._camera)};async onBeforeHandoff(){await In(1e3),this._scene.clear()}_objects=[];setupScene(){this._scene.background=new c.Color(0),this._scene.add(new c.GridHelper(5,10,1118481,1118481));const e=new c.DirectionalLight(16777215,1);e.position.set(0,20,0),e.castShadow=!1,this._scene.add(e);const t=new c.DirectionalLight(16777215,1);t.position.set(0,-1,0),t.castShadow=!1,this._scene.add(t);const i=new c.PointLight(16777215,1,100,1);i.position.set(0,2,0),i.castShadow=!1,i.distance=200,this._scene.add(i);const n=50;for(let o=0;o<100;o++){const r=new c.MeshStandardMaterial({color:2236962,metalness:1,roughness:.8});this.isAR&&(r.emissive=new c.Color(Math.random(),Math.random(),Math.random()),r.emissiveIntensity=Math.random());const a=I.random(0,1)>.5?Jo.Sphere:Jo.Cube,l=hr.createPrimitive(a,{material:r});l.position.x=I.random(-n,n),l.position.y=I.random(-2,n),l.position.z=I.random(-n,n),l.rotation.x=I.random(0,Math.PI*2),l.rotation.y=I.random(0,Math.PI*2),l.rotation.z=I.random(0,Math.PI*2),l.scale.multiplyScalar(.5+Math.random()*10);const h=l.position.distanceTo(this._camera.position)-l.scale.x;h<1&&l.position.multiplyScalar(1+1/h),this._objects.push(l),this._scene.add(l)}}update(e,t){const i=e*4e-4;for(let n=0;n<this._objects.length;n++){const o=this._objects[n];o.position.y+=Math.sin(i+n*.5)*.005,o.rotateY(.002)}}}var tc;(s=>{const e=[];function t(){if(!e?.length)return!1;for(const o of e)o.exportAndOpen();return!0}s.exportAndOpen=t;function i(o){e.push(o)}s.registerExporter=i;function n(o){if(!e)return;const r=e.indexOf(o);r>=0&&e.splice(r,1)}s.unregisterExporter=n})(tc||(tc={}));const Le=x("debugwebxr"),qy=x("stats");let uf=0;function tC(s){let e=null;const t=s;return t.getAROverlayContainer?e=t.getAROverlayContainer():e=s,e}iC();async function iC(){if(x("debugasap")){let s=globalThis["needle:XRSession"];if(s instanceof Promise){delete globalThis["needle:XRSession"],ae.addContextCreatedCallback(async e=>{if(!s)return;No(!0);const t=await s;if(t){const i=G.getDefaultSessionInit("immersive-vr");G.setSession("immersive-vr",t,i,e.context)}else console.error("NeedleXRSession: ASAP session was rejected");s=void 0});return}}if("xr"in navigator){if(/WebXRViewer\//i.test(navigator.userAgent)){console.warn("WebXRViewer does not support addEventListener");return}navigator.xr?.addEventListener("sessiongranted",async()=>{No(!0),console.log("Received Session Granted..."),await In(100);const s=sessionStorage.getItem("needle_xr_session_mode"),e=sessionStorage.getItem("needle_xr_session_init")??null,t=e?JSON.parse(e):null;let i=null;if(d0()&&(await ya.start(s||"immersive-vr",t||G.getDefaultSessionInit("immersive-vr")),await oC(),i=await ya.handoff()),i)G.setSession(i.mode,i.session,i.init,z.Current);else if(s&&e){console.log("Session Granted: Restore last session");const n=JSON.parse(e);G.start(s,n).catch(o=>console.warn(o))}else G.start("immersive-vr").catch(n=>console.warn("Session Granted failed:",n))},{once:!0})}}function nC(s,e){sessionStorage.setItem("needle_xr_session_mode",s),sessionStorage.setItem("needle_xr_session_init",JSON.stringify(e))}function sC(){sessionStorage.removeItem("needle_xr_session_mode"),sessionStorage.removeItem("needle_xr_session_init")}const Rm=new Set;ae.registerCallback(re.ContextCreationStart,async s=>{Rm.add(s.context)});ae.registerCallback(re.ContextCreated,async s=>{Rm.delete(s.context);const e=s.context?.domElement.getAttribute("autostart")||null;rC(e)});function d0(){return Rm.size>0}function oC(){return new Promise(s=>{const e=Date.now(),t=setInterval(()=>{(!d0()||Date.now()-e>6e4)&&(clearInterval(t),s())},100)})}exports.DeviceUtilities.isDesktop()&&T()&&window.addEventListener("keydown",s=>{(s.key==="x"||s.key==="Escape")&&G.active&&G.stop()});function rC(s){if(s)switch(s?.toLowerCase()){case"ar":rn.registerWaitForInteraction(()=>{G.start("ar")});break}}const Sh=Symbol("initial-fov");class G{static _sync=null;static getXRSync(e){return this._sync||(this._sync=new h0(e)),this._sync}static get currentSessionRequest(){return this._currentSessionRequestMode}static _currentSessionRequestMode=null;static get active(){return this._activeSession}static get activeMode(){return this._activeSession?.mode??null}static get xrSystem(){return"xr"in navigator?navigator.xr:void 0}static isXRSupported(){return Promise.all([this.isVRSupported(),this.isARSupported()]).then(e=>e.some(t=>t)).catch(()=>!1)}static isVRSupported(){return this.isSessionSupported("immersive-vr")}static isARSupported(){return this.isSessionSupported("immersive-ar")}static isSessionSupported(e){return this.xrSystem?.isSessionSupported(e).catch(t=>(Le&&console.error(t),!1))??Promise.resolve(!1)}static _currentSessionRequest;static _activeSession;static onSessionRequestStart(e){this._sessionRequestStartListeners.push(e)}static offSessionRequestStart(e){const t=this._sessionRequestStartListeners.indexOf(e);t>=0&&this._sessionRequestStartListeners.splice(t,1)}static _sessionRequestStartListeners=[];static onSessionRequestEnd(e){this._sessionRequestEndListeners.push(e)}static offSessionRequestEnd(e){const t=this._sessionRequestEndListeners.indexOf(e);t>=0&&this._sessionRequestEndListeners.splice(t,1)}static _sessionRequestEndListeners=[];static onXRSessionStart(e){this._xrStartListeners.push(e)}static offXRSessionStart(e){const t=this._xrStartListeners.indexOf(e);t>=0&&this._xrStartListeners.splice(t,1)}static _xrStartListeners=[];static onXRSessionEnd(e){this._xrEndListeners.push(e)}static offXRSessionEnd(e){const t=this._xrEndListeners.indexOf(e);t>=0&&this._xrEndListeners.splice(t,1)}static _xrEndListeners=[];static onControllerAdded(e){this._controllerAddedListeners.push(e)}static offControllerAdded(e){const t=this._controllerAddedListeners.indexOf(e);t>=0&&this._controllerAddedListeners.splice(t,1)}static _controllerAddedListeners=[];static onControllerRemoved(e){this._controllerRemovedListeners.push(e)}static offControllerRemoved(e){const t=this._controllerRemovedListeners.indexOf(e);t>=0&&this._controllerRemovedListeners.splice(t,1)}static _controllerRemovedListeners=[];static offerSession(e,t,i){return"xr"in navigator&&navigator.xr&&"offerSession"in navigator.xr?(typeof navigator.xr.offerSession=="function"&&(console.log("WebXR offerSession is available - requesting mode: "+e),t=="default"&&(t=this.getDefaultSessionInit(e)),navigator.xr.offerSession(e,{...t}).then(n=>G.setSession(e,n,t,i)).catch(n=>{console.log("XRSession offer rejected (perhaps because another call to offerSession was made or a call to requestSession was made)")})),!0):!1}static getDefaultSessionInit(e){switch(e){case"immersive-ar":const t=["anchors","local-floor","layers","dom-overlay","hit-test","unbounded"];return exports.DeviceUtilities.isVisionOS()||t.push("hand-tracking"),{optionalFeatures:t};case"immersive-vr":const i=["local-floor","bounded-floor","high-fixed-foveation-level","layers"];return exports.DeviceUtilities.isVisionOS()||i.push("hand-tracking"),{optionalFeatures:i};default:return console.warn("No default session init for mode",e),{}}}static async start(e,t,i){if(exports.DeviceUtilities.isiOS()){if(e==="ar")if(await this.isARSupported())e="immersive-ar";else return tc.exportAndOpen(),null}else e=="ar"&&(e="immersive-ar");if(T()&&x("debugxrpreroom"))return console.warn("Debug: Starting temporary XR session"),await ya.start(e,t||G.getDefaultSessionInit(e)),null;if(this._currentSessionRequest)return console.warn("A XRSession is already being requested"),(Le||T())&&de("A XRSession is already being requested"),this._currentSessionRequest.then(()=>this._activeSession);if(this._activeSession)return console.error("A XRSession is already running"),this._activeSession;if(i||(i=z.Current),i||(i=ae.All[0]),!i)throw new Error("No Needle Engine Context found");switch(t||(t={}),e){case"immersive-ar":{if(await this.xrSystem?.isSessionSupported("immersive-ar")!==!0)return console.error(e+" is not supported by this browser."),null;const l=this.getDefaultSessionInit(e),h=tC(i.domElement);h&&!exports.DeviceUtilities.isQuest()&&(l.domOverlay={root:h},l.optionalFeatures.push("dom-overlay")),t={...l,...t}}break;case"immersive-vr":{if(await this.xrSystem?.isSessionSupported("immersive-vr")!==!0)return console.error(e+" is not supported by this browser."),null;t={...this.getDefaultSessionInit(e),...t}}break;default:console.warn("No default session init for mode",e);break}t.optionalFeatures??=[],t.requiredFeatures??=[],await ya.stop();const n=e=="immersive-ar"?i.scripts_immersive_ar:i.scripts_immersive_vr;Le?console.log(`%cRequesting ${e} session`,"font-weight:bold;",t,n):console.log(`%cRequesting ${e} session`,"font-weight:bold;");for(const a of n)a.onBeforeXR&&a.onBeforeXR(e,t);for(const a of this._sessionRequestStartListeners)a({mode:e,init:t});Le&&Ce("Requesting "+e+" session ("+Date.now()+")"),this._currentSessionRequest=navigator?.xr?.requestSession(e,t),this._currentSessionRequestMode=e;const o=await this._currentSessionRequest?.catch(a=>{console.error(a,"Code: "+a.code),a.code===9&&de("Make sure your device has the required permissions (e.g. camera access)"),console.log("If the specified XR configuration is not supported (e.g. entering AR doesnt work) - make sure you access the website on a secure connection (HTTPS) and your device has the required permissions (e.g. camera access)"),location.protocol==="http:"&&de("XR requires a secure connection (HTTPS)")});this._currentSessionRequest=void 0,this._currentSessionRequestMode=null;for(const a of this._sessionRequestEndListeners)a({mode:e,init:t,newSession:o||null});return o?this.setSession(e,o,t,i):(console.warn("XR Session request was rejected"),null)}static setSession(e,t,i,n){if(this._activeSession)return console.error("A XRSession is already running"),this._activeSession;const o=e=="immersive-ar"?n.scripts_immersive_ar:n.scripts_immersive_vr;return this._activeSession=new G(e,t,n,{scripts:o,controller_added:this._controllerAddedListeners,controller_removed:this._controllerRemovedListeners,init:i}),t.addEventListener("end",this.onEnd),Le?console.log(`%cStarted ${e} session`,"font-weight:bold;",o):console.log(`%cStarted ${e} session`,"font-weight:bold;"),this._activeSession}static $_stop_request=Symbol();static stop(){const e=this._activeSession;e&&(e[this.$_stop_request]===void 0?(Le&&console.log("[NeedleXRSession] Stopping XR Session... (new)"),e[this.$_stop_request]=setTimeout(()=>{e.end()})):Le&&console.warn("[NeedleXRSession] XR Session stop already requested"))}static onEnd=()=>{Le&&console.log("XR Session ended"),this._activeSession=null};context;get sync(){return G._sync}get running(){return!this._ended&&this.session!=null}session;mode;get interactionMode(){return this.session.interactionMode}get visibilityState(){return this.session.visibilityState}get isVisibleBlurred(){return this.session.visibilityState==="visible-blurred"}get isSystemKeyboardSupported(){return this.session.isSystemKeyboardSupported}get environmentBlendMode(){return this.session.environmentBlendMode}get frame(){return this.context.xrFrame}controllers=[];get leftController(){return this.controllers.find(e=>e.side==="left")}get rightController(){return this.controllers.find(e=>e.side==="right")}getController(e){return typeof e=="number"?this.controllers[e]||null:this.controllers.find(t=>t.side===e)||null}get isPassThrough(){return!!(this.environmentBlendMode!=="opaque"&&this.interactionMode==="world-space"||this.mode==="immersive-ar"&&this.environmentBlendMode!=="opaque"&&this.controllers.some(e=>e.inputSource.targetRayMode==="tracked-pointer")||T()&&exports.DeviceUtilities.isDesktop()&&this.mode==="immersive-ar")}get isAR(){return this.mode==="immersive-ar"}get isVR(){return this.mode==="immersive-vr"}get isScreenBasedAR(){return this.isAR&&!this.isPassThrough}get posePosition(){return this._transformPosition}get poseOrientation(){return this._transformOrientation}get referenceSpace(){return this.context.renderer.xr.getReferenceSpace()}get viewerPose(){return this._viewerPose}get isTrackingImages(){if(this.frame&&"getImageTrackingResults"in this.frame&&typeof this.frame.getImageTrackingResults=="function")try{const e=this.frame.getImageTrackingResults();for(const t of e)if(t.trackingState==="tracked")return!0}catch{return!1}return!1}get rig(){const e=this._rigs[0]??null;return e?.gameObject&&er(e.gameObject)||e?.isActive===!1?(this.updateActiveXRRig(),this._rigs[0]??null):e}_rigScale=1;_lastRigScaleUpdate=-1;get rigScale(){return this._rigs[0]?(this._lastRigScaleUpdate!==this.context.time.frame&&(this._lastRigScaleUpdate=this.context.time.frame,this._rigScale=this._rigs[0].gameObject.worldScale.x),this._rigScale):1}addRig(e){this._rigs.indexOf(e)>=0||(e.priority===void 0&&(e.priority=0),this._rigs.push(e),this.updateActiveXRRig())}removeRig(e){const t=this._rigs.indexOf(e);t!==-1&&(this._rigs.splice(t,1),this.updateActiveXRRig())}setRigActive(e){const t=this._rigs.indexOf(e),i=this._rigs[0];this._rigs.splice(t,1),this._rigs.unshift(e),e.priority=i?.priority??0,this.updateActiveXRRig()}getUserOffsetInRig(){const e=this.context.mainCamera?.position;if(!e||!this.rig)return j(0,0,0);const t=j(e);return t.x*=-1,t.z*=-1,t.applyQuaternion(qt(this.rig.gameObject.quaternion)),t}updateActiveXRRig(){const e=this._rigs[0]??null;this._defaultRig.gameObject.parent!==this.context.scene&&this.context.scene.add(this._defaultRig.gameObject),this._defaultRig.gameObject.visible=!0,this._rigs.includes(this._defaultRig)||this._rigs.push(this._defaultRig);let t=this._rigs[0];t&&t.priority===void 0&&(t.priority=0);for(let i=1;i<this._rigs.length;i++){const n=this._rigs[i];if(n.isActive){if(er(n.gameObject)){this._rigs.splice(i,1),i--;continue}(!t||t.isActive===!1||n.priority!==void 0&&n.priority>t.priority)&&(t=n)}}if(e!==t){const i=this._rigs.indexOf(t);i>=0&&this._rigs.splice(i,1),this._rigs.unshift(t)}Le&&(e===t?console.log("Updated Active XR Rig:",t,"prev:",e):console.log("Updated Active XRRig:",t," (the same as before)"))}_rigs=[];_viewerHitTestSource=null;getHitTest(e){if(e)return this.getControllerHitTest(e);if(!this._viewerHitTestSource)return null;const t=this._viewerHitTestSource,i=this.frame.getHitTestResults(t);if(i.length>0){const n=i[0];return this.convertHitTestResult(n)}return null}getControllerHitTest(e){const t=e.getHitTestSource();if(!t)return null;const i=this.frame.getHitTestResultsForTransientInput(t);for(const n of i)if(n.inputSource===e.inputSource)for(const o of n.results)return this.convertHitTestResult(o);return null}convertHitTestResult(e){const t=this.context.renderer.xr.getReferenceSpace(),i=t&&e.getPose(t);if(i){const n=j(i.transform.position),o=qt(i.transform.orientation),r=this.context.mainCamera;if(r?.parent!==this._cameraRenderParent&&n.applyMatrix4(oa),r?.parent){n.applyMatrix4(r.parent.matrixWorld),o.multiply(ki);const a=ue(r.parent);a.premultiply(ki),o.premultiply(a)}return{hit:e,position:n,quaternion:o}}return null}convertSpace(e){const t=j(e.position);t.applyMatrix4(oa);const i=qt(e.orientation);return i.premultiply(ki),{position:t,quaternion:i}}_defaultRig;_xr_scripts;_xr_update_scripts=[];_inactive_scripts=[];_controllerAdded;_controllerRemoved;_originalCameraWorldPosition;_originalCameraWorldRotation;_originalCameraWorldScale;_originalCameraParent;_mainCamera=null;constructor(e,t,i,n){nC(e,n.init),this.session=t,this.mode=e,this.context=i,(Le||x("console"))&&No(!0),this._xr_scripts=[...n.scripts],this._xr_update_scripts=this._xr_scripts.filter(o=>typeof o.onUpdateXR=="function"),this._controllerAdded=n.controller_added,this._controllerRemoved=n.controller_removed,ds(this.onBefore,pe.LateUpdate),this.context.pre_render_callbacks.push(this.onBeforeRender),this.context.post_render_callbacks.push(this.onAfterRender),(n.init.optionalFeatures?.includes("hit-test")||n.init.requiredFeatures?.includes("hit-test"))&&t.requestReferenceSpace("viewer").then(o=>t.requestHitTestSource?.call(t,{space:o})?.then(r=>this._viewerHitTestSource=r).catch(r=>console.error(r))).catch(o=>console.error(o)),this.context.mainCamera&&(this._originalCameraWorldPosition=X(this.context.mainCamera,new c.Vector3),this._originalCameraWorldRotation=ue(this.context.mainCamera,new c.Quaternion),this._originalCameraWorldScale=je(this.context.mainCamera,new c.Vector3),this._originalCameraParent=this.context.mainCamera.parent,this.context.mainCamera instanceof c.PerspectiveCamera&&(this.context.mainCamera[Sh]=this.context.mainCamera.fov)),this._defaultRig=new zS,this.context.scene.add(this._defaultRig.gameObject),this.addRig(this._defaultRig);for(let o=0;o<t.inputSources.length;o++){const r=t.inputSources[o];if(!r.handedness){console.warn("Input source in xr session has no handedness - ignoring",o);continue}this.onInputSourceAdded(r)}this.session.addEventListener("end",this.onEnd),this.session.addEventListener("inputsourceschange",o=>{for(const r of o.removed)this.disconnectInputSource(r);for(const r of o.added)this.onInputSourceAdded(r)}),this.context.xr=this,this.context.renderer.xr.setSession(this.session).then(this.onRendererSessionSet),"controllerAutoUpdate"in this.context.renderer.xr?(console.debug("Disabling three.js controllerAutoUpdate"),this.context.renderer.xr.controllerAutoUpdate=!1):Le&&console.warn("controllerAutoUpdate is not available in three.js - cannot disable it")}onRendererSessionSet=()=>{this.running&&(this.context.renderer.xr.enabled=!0,this.context.renderer.xr.updateCamera(this.context.mainCamera),this.context.mainCameraComponent?.applyClearFlags())};onInputSourceAdded=e=>{if(e.targetRayMode==="screen")return;let t=0;for(let n=0;n<this.session.inputSources.length;n++)if(this.session.inputSources[n]===e){t=n;break}if(this.controllers.find(n=>n.inputSource===e)){console.debug("Controller already exists for input source",t);return}else if(this._newControllers.find(n=>n.inputSource===e)){console.debug("Controller already registered for input source",t);return}const i=new Pm(this,e,t);this._newControllers.push(i)};disconnectInputSource(e){const t=(o,r)=>{if(o.inputSource===e){Le&&console.log("Disconnecting controller",o.index);const a=r.indexOf(o);a>=0&&r.splice(a,1),this.invokeControllerEvent(o,this._controllerRemoved,"removed");const l={xr:this,controller:o,change:"removed"};for(const h of this._xr_scripts)h.onXRControllerRemoved&&h.onXRControllerRemoved(l);o.onDisconnected()}},i=[...this.controllers];for(let o=i.length-1;o>=0;o--){const r=i[o];t(r,this.controllers)}const n=[...this._newControllers];for(let o=n.length-1;o>=0;o--){const r=n[o];t(r,this._newControllers)}}end(){this._ended||this.session.end().catch(e=>console.warn(e))}_ended=!1;_newControllers=[];onEnd=e=>{if(this._ended)return;this._ended=!0,console.debug("XR Session ended"),sC(),this.onAfterRender(),this.revertCustomForward(),this._didStart=!1,this._previousCameraParent=null,this.requestedCameraNearPlane=null,ao(this.onBefore,pe.LateUpdate);const t=this.context.pre_render_callbacks.indexOf(this.onBeforeRender);t>=0&&this.context.pre_render_callbacks.splice(t,1);const i=this.context.post_render_callbacks.indexOf(this.onAfterRender);i>=0&&this.context.post_render_callbacks.splice(i,1),this.context.xr=null,this.context.renderer.xr.enabled=!1,this.context.pre_update_oneshot_callbacks.push(()=>{this.context.mainCameraComponent?.applyClearFlags(),this.context.mainCameraComponent?.applyClippingPlane()}),e0({session:this});for(const o of G._xrEndListeners)o({xr:this});const n=[...this.controllers];for(let o=0;o<n.length;o++)this.disconnectInputSource(n[o].inputSource);this.controllers.length=0,this._newControllers.length=0;for(const o of this._xr_scripts)o?.onLeaveXR?.({xr:this});this.sync?.onExitXR(this),this.context.mainCamera&&(this._originalCameraParent?.add(this.context.mainCamera),this._originalCameraWorldPosition&&ot(this.context.mainCamera,this._originalCameraWorldPosition),this._originalCameraWorldRotation&&sn(this.context.mainCamera,this._originalCameraWorldRotation),this._originalCameraWorldScale&&pa(this.context.mainCamera,this._originalCameraWorldScale),this.context.mainCamera instanceof c.PerspectiveCamera&&this.context.mainCamera[Sh]&&(this.context.mainCamera.fov=this.context.mainCamera[Sh],this.context.mainCamera[Sh]=0)),this.context.requestSizeUpdate(),this._defaultRig.gameObject.removeFromParent(),No(!1)};_didStart=!1;onBefore=e=>{const t=e.xrFrame;if(!t)return;this.context.xr=this,this.context.mainCameraComponent&&this.context.mainCameraComponent!==this._mainCamera&&(this._mainCamera=this.context.mainCameraComponent),this.rig?.isActive==!1&&(Le&&console.warn("Latest rig is not active - trying to activate a different rig",this.rig),this.updateActiveXRRig()),this.rig&&this._mainCamera?.gameObject&&this._mainCamera?.gameObject?.parent!==this.rig.gameObject&&this.rig.gameObject.add(this._mainCamera?.gameObject),this.internalUpdateState(),this.applyCustomForward();const i={xr:this};if(this._didStart){if(this.context.new_scripts_xr.length>0){const n=[...this.context.new_scripts_xr];for(let o=0;o<n.length;o++){const r=this.context.new_scripts_xr[o];if(!r||r.destroyed||r.supportsXR?.(this.mode)==!1){this.context.new_scripts_xr.splice(o,1);continue}if(!r.activeAndEnabled){this.context.new_scripts_xr.splice(o,1),this.markInactive(r);continue}if(this.addScript(r)){this.invokeCallback_EnterXR(r);for(const a of this.controllers)this.invokeCallback_ControllerAdded(r,a)}}}}else{if(this._didStart=!0,this.mode==="immersive-vr"){const o=Ft(this.context.scene.children);if(o){const r=o.getSize(j());if(r.length()>0){const a=this._defaultRig.gameObject;a.position.set(o.min.x+r.x*.5,o.min.y,o.max.z+r.z*.5+1.5);const l=o.getCenter(j());l.y=a.position.y,a.lookAt(l)}}}Jb({session:this}),cr();for(const o of G._xrStartListeners)o(i);const n=[...this._xr_scripts];Le&&console.log("NeedleXRSession start, handle scripts:",n);for(const o of n){if(o.destroyed){this._script_to_remove.push(o);continue}if(!o.activeAndEnabled){this.markInactive(o);continue}this.invokeCallback_EnterXR(o);for(const r of this.controllers)this.invokeCallback_ControllerAdded(o,r)}}this.syncCameraCullingMask();for(const n of this.controllers)n.onUpdate(t);if(this._newControllers.length>0){const n=[...this._newControllers];this._newControllers.length=0;for(const o of n){if(!o.connected){console.warn("New controller is not connected",o);continue}this.controllers.push(o);for(const r of this._xr_scripts){if(r.destroyed){this._script_to_remove.push(r);continue}r.activeAndEnabled!==!1&&this.invokeCallback_ControllerAdded(r,o)}}this.controllers.sort((o,r)=>o.index-r.index)}Le&&this.context.time.frame%30===0&&this.controllers.length<=0&&this.session.inputSources.length>0&&(No(!0),console.error("XRControllers are not added but inputSources are present"));for(const n of this._xr_update_scripts){if(n.destroyed===!0){this._script_to_remove.push(n);continue}if(n.activeAndEnabled===!1){this.markInactive(n);continue}n.onUpdateXR&&n.onUpdateXR(i)}if(this.handleInactiveScripts(),this._script_to_remove.length>0){const n=[...new Set(this._script_to_remove)];this._script_to_remove.length=0;for(const o of n)!o.destroyed&&this.running&&o.onLeaveXR?.(i),this.removeScript(o)}this.sync?.onUpdate(this),this.onRenderDebug()};onRenderDebug(){if(Le)for(const e of this.controllers)e.onRenderDebug();if((Le||qy)&&this.rig&&(uf++,uf>=20)){const e=this.rig.gameObject.worldPosition,t=this.rig.gameObject.worldForward;e.add(t.multiplyScalar(1.5));const i=this.rig.gameObject.worldUp;e.add(i.multiplyScalar(2.5));let n="";if(n+=`${this.context.time.smoothedFps.toFixed(0)} FPS`,n+=`, calls: ${this.context.renderer.info.render.calls}, tris: ${this.context.renderer.info.render.triangles.toLocaleString()}`,Le||qy)for(const o of this.controllers)n+=`
|
|
167
|
-
${o.hand?"hand":"ctrl"} ${o.inputSource.handedness}[${o.index}] con:${o.connected} tr:${o.isTracking} hts:${o.hasHitTestSource?"yes":"no"}`;uf=0,B.DrawLabel(e,n,void 0,1/60*20)}}onBeforeRender=()=>{this.context.mainCamera&&(this.updateFade(this.context.mainCamera),this.requestedCameraNearPlane!==null&&this.context.mainCamera instanceof c.PerspectiveCamera&&(this.context.mainCamera.near=this.requestedCameraNearPlane,this.requestedCameraNearPlane=null))};onAfterRender=()=>{if(this.onUpdateFade_PostRender(),exports.DeviceUtilities.isDesktop()||!this._renderOnceOnDevice){const e=this.context.renderer;if(e.xr.isPresenting&&this.context.mainCamera){this._renderOnceOnDevice=!0;const t=e.xr.enabled,i=e.getRenderTarget(),n=this.context.scene.background;e.xr.enabled=!1,e.setRenderTarget(null),this.isPassThrough&&(this.context.scene.background=null),this.context.composer?this.context.composer.render(this.context.time.deltaTime):e.render(this.context.scene,this.context.mainCamera),e.xr.enabled=t,e.setRenderTarget(i),this.context.scene.background=n}}};addScript(e){return this._xr_scripts.includes(e)?!1:(Le&&console.log("Register new XRScript",e),this._xr_scripts.push(e),typeof e.onUpdateXR=="function"&&this._xr_update_scripts.push(e),!0)}markInactive(e){if(!(this._inactive_scripts.indexOf(e)>=0)){this.removeScript(e,!1),this._inactive_scripts.push(e);for(const t of this.controllers)this.invokeCallback_ControllerRemoved(e,t);this.invokeCallback_LeaveXR(e)}}handleInactiveScripts(){if(this._inactive_scripts.length>0)for(let e=this._inactive_scripts.length-1;e>=0;e--){const t=this._inactive_scripts[e];if(t.activeAndEnabled){this._inactive_scripts.splice(e,1),this.addScript(t),this.invokeCallback_EnterXR(t);for(const i of this.controllers)this.invokeCallback_ControllerAdded(t,i)}}}_script_to_remove=[];removeScript(e,t=!0){Le&&console.log("Remove XRScript",e);const i=this._xr_scripts.indexOf(e);i>=0&&this._xr_scripts.splice(i,1);const n=this._xr_update_scripts.indexOf(e);if(n>=0&&this._xr_update_scripts.splice(n,1),t){const o=this._inactive_scripts.indexOf(e);o>=0&&this._inactive_scripts.splice(o,1)}}invokeCallback_EnterXR(e){e.onEnterXR&&e.onEnterXR({xr:this})}invokeCallback_ControllerAdded(e,t){e.onXRControllerAdded&&e.onXRControllerAdded({xr:this,controller:t,change:"added"})}invokeCallback_ControllerRemoved(e,t){e.onXRControllerRemoved&&e.onXRControllerRemoved({xr:this,controller:t,change:"removed"})}invokeCallback_LeaveXR(e){e.onLeaveXR&&!e.destroyed&&e.onLeaveXR({xr:this})}syncCameraCullingMask(){const e=this.context.xrCamera,t=this.context.mainCameraComponent?.cullingMask;if(e&&t!==void 0){for(const i of e.cameras)i.layers.mask=t;e.layers.mask=t}else if(e){for(const i of e.cameras)i.layers.enableAll();e.layers.enableAll()}}invokeControllerEvent(e,t,i){for(let n=t.length-1;n>=0;n--){const o=t[n];if(o)try{o({xr:this,controller:e,change:i})}catch(r){console.error(r)}}}_camera;_cameraRenderParent=new c.Object3D().rotateY(Math.PI);_previousCameraParent;_customforward=!0;originalCameraNearPlane;requestedCameraNearPlane=null;applyCustomForward(){if(this.context.mainCamera&&this._customforward){this._camera=this.context.mainCamera,this._camera.parent!==this._cameraRenderParent&&(this._previousCameraParent=this._camera.parent,this._previousCameraParent?.add(this._cameraRenderParent)),this._cameraRenderParent.name="XR Camera Render Parent",this._cameraRenderParent.add(this._camera);{let e=.02;const t=.001;if(this.rig){const i=je(this.rig.gameObject);e*=i.x}this._camera instanceof c.PerspectiveCamera&&Math.abs(this._camera.near-e)>t&&(this.isAR?this.originalCameraNearPlane=this._camera.near:this._camera.near=e,Le&&console.debug(`Setting camera near plane to ${e} (was ${this.originalCameraNearPlane}) to account for XR rendering scale`))}}}revertCustomForward(){this._camera&&this._previousCameraParent&&this._previousCameraParent.add(this._camera),this._previousCameraParent=null,this._camera instanceof c.PerspectiveCamera&&this.originalCameraNearPlane!=null&&(this._camera.near=this.originalCameraNearPlane,this.originalCameraNearPlane=void 0)}_viewerPose;_transformOrientation=new c.Quaternion;_transformPosition=new c.Vector3;internalUpdateState(){const e=this.context.renderer.xr.getReferenceSpace();if(!e){this._viewerPose=void 0;return}if(this._viewerPose=this.frame.getViewerPose(e),this._viewerPose){const t=this._viewerPose.transform;this._transformPosition.set(t.position.x,t.position.y,t.position.z),this._transformOrientation.set(t.orientation.x,t.orientation.y,t.orientation.z,t.orientation.w)}}_transition;get transition(){return this._transition||(this._transition=new Wy),this._transition}fadeTransition(){return this._transition||(this._transition=new Wy),this._transition.fadeTransition()}updateFade(e){this._transition&&e instanceof c.PerspectiveCamera&&this._transition.update(e,this.context.time.deltaTime)}onUpdateFade_PostRender(){this._transition?.remove()}}const ff=x("debugwebxr");class u0{static tryFindAvatarObjects(e,t,i){if(i.head&&i.leftHand&&i.rightHand)return;const n=e.name.toLocaleLowerCase();!i.head&&n.includes("head")&&(ff&&console.log("FOUND AVATAR HEAD",e.name),i.head=new Y("",t,e)),n.includes("hand")&&(!i.leftHand&&n.includes("left")&&(ff&&console.log("FOUND AVATAR LEFT HAND",e.name),i.leftHand=new Y("",t,e)),!i.rightHand&&n.includes("right")&&(ff&&console.log("FOUND AVATAR RIGHT HAND",e.name),i.rightHand=new Y("",t,e)));for(let o=0;o<e.children.length;o++){if(i.head&&i.leftHand&&i.rightHand)return;const r=e.children[o];this.tryFindAvatarObjects(r,t,i)}}}class Z extends c.Color{alpha=1;get isRGBAColor(){return!0}set a(e){this.alpha=e}get a(){return this.alpha}constructor(e,t,i,n){super(),typeof e=="number"&&typeof t=="number"&&typeof i=="number"?(this.set(e,t,i),this.alpha=typeof n=="number"?n:1):e!==void 0&&(this.set(e),this.alpha=1)}clone(){const e=super.clone();return e.alpha=this.alpha,e}copy(e){return this.r=e.r,this.g=e.g,this.b=e.b,"alpha"in e&&typeof e.alpha=="number"?this.alpha=e.alpha:typeof e.a=="number"&&(this.alpha=e.a),this}lerp(e,t){const i=e;return i.alpha!=null&&(this.alpha=I.lerp(this.alpha,i.alpha,t)),super.lerp(e,t)}lerpColors(e,t,i){const n=e,o=t;return n.alpha!=null&&o.alpha!=null&&(this.alpha=I.lerp(n.alpha,o.alpha,i)),super.lerpColors(e,t,i)}multiply(e){const t=e;return t.alpha!=null&&(this.alpha=this.alpha*t.alpha),super.multiply(e)}fromArray(e,t=0){return this.alpha=e[t+3],super.fromArray(e,t)}static fromColorRepresentation(e){if(typeof e=="string"){if(e.trim()==="transparent")return new Z(0,0,0,0);if(e.startsWith("#")&&e.length===9){const t=parseInt(e.slice(1,9),16),i=t>>24&255,n=t>>16&255,o=t>>8&255,r=t>>0&255;return new Z(i/255,n/255,o/255,r/255)}else if(e.startsWith("#")){const t=parseInt(e.slice(1),16),i=t>>16&255,n=t>>8&255,o=t>>0&255;return new Z(i/255,n/255,o/255,1)}else if(e.startsWith("rgba")){const t=e.slice(5,-1).split(",").map(Number);return new Z(t[0]/255,t[1]/255,t[2]/255,t[3])}else if(e.startsWith("rgb")){const t=e.slice(4,-1).split(",").map(Number);return new Z(t[0]/255,t[1]/255,t[2]/255,1)}}else if(Array.isArray(e)){if(e.length===4)return new Z(e[0],e[1],e[2],e[3]);if(e.length===3)return new Z(e[0],e[1],e[2],1);console.error("Invalid color array length. Expected 3 or 4, got "+e.length)}return new Z(e)}}const bt=new c.Vector3,Xy=new c.Vector3,Qy=new c.Quaternion,aC=x("debuggizmos"),qi=8947848,pf=32;class B{constructor(){}static enabled=!0;static isGizmo(e){return e[wp]!==void 0}static setVisible(e){for(const t of Si.timedObjectsBuffer)t.visible=e}static DrawLabel(e,t,i=.05,n=0,o,r,a){if(!B.enabled)return null;o||(o=qi);const l=G.active?.rigScale??1,h=Si.getTextLabel(n,t,i*l,o,r);return a instanceof c.Object3D&&a.add(h),h.position.x=e.x,h.position.y=e.y,h.position.z=e.z,h}static DrawRay(e,t,i=qi,n=0,o=!0){if(!B.enabled)return;const r=Si.getLine(n),a=r.geometry.getAttribute("position");a.setXYZ(0,e.x,e.y,e.z),bt.set(t.x,t.y,t.z).multiplyScalar(999999999),a.setXYZ(1,e.x+bt.x,e.y+bt.y,e.z+bt.z),a.needsUpdate=!0,r.material.depthTest=o,r.material.depthWrite=!1,r.material.fog=!1,Yi(r.material,i)}static DrawDirection(e,t,i=qi,n=0,o=!0,r=1){if(!B.enabled)return;const a=Si.getLine(n),l=a.geometry.getAttribute("position");l.setXYZ(0,e.x,e.y,e.z),t.w!==void 0?(bt.set(0,0,-r),Qy.set(t.x,t.y,t.z,t.w),bt.applyQuaternion(Qy)):(bt.set(t.x,t.y,t.z),bt.multiplyScalar(r)),l.setXYZ(1,e.x+bt.x,e.y+bt.y,e.z+bt.z),l.needsUpdate=!0,a.material.depthTest=o,a.material.depthWrite=!1,Yi(a.material,i)}static DrawLine(e,t,i=qi,n=0,o=!0){if(!B.enabled)return;const r=Si.getLine(n),a=r.geometry.getAttribute("position");a.setXYZ(0,e.x,e.y,e.z),a.setXYZ(1,t.x,t.y,t.z),a.needsUpdate=!0,r.material.depthTest=o,r.material.depthWrite=!1,r.material.fog=!1,Yi(r.material,i)}static DrawCircle(e,t,i,n=qi,o=0,r=!0){if(!B.enabled)return;const a=Si.getCircle(o);a.position.set(e.x,e.y,e.z),a.scale.set(i,i,i),a.quaternion.setFromUnitVectors(this._up,bt.set(t.x,t.y,t.z).normalize()),a.material.depthTest=r,a.material.depthWrite=!1,a.material.fog=!1,Yi(a.material,n)}static DrawWireSphere(e,t,i=qi,n=0,o=!0){if(!B.enabled)return;const r=Si.getSphere(t,n,!0);Zo(r,e.x,e.y,e.z),r.material.depthTest=o,r.material.depthWrite=!1,r.material.fog=!1,Yi(r.material,i)}static DrawSphere(e,t,i=qi,n=0,o=!0){if(!B.enabled)return;const r=Si.getSphere(t,n,!1);Zo(r,e.x,e.y,e.z),r.material.depthTest=o,r.material.depthWrite=!1,Yi(r.material,i)}static DrawWireBox(e,t,i=qi,n=0,o=!0,r=void 0){if(!B.enabled)return;const a=Si.getBox(n);a.position.set(e.x,e.y,e.z),a.scale.set(t.x,t.y,t.z),r?a.quaternion.copy(r):a.quaternion.identity(),a.material.depthTest=o,a.material.wireframe=!0,a.material.depthWrite=!1,a.material.fog=!1,Yi(a.material,i)}static DrawWireBox3(e,t=qi,i=0,n=!0){if(!B.enabled)return;const o=Si.getBox(i);o.position.copy(e.getCenter(bt)),o.scale.copy(e.getSize(bt)),o.material.depthTest=n,o.material.wireframe=!0,o.material.depthWrite=!1,o.material.fog=!1,Yi(o.material,t)}static _up=new c.Vector3(0,1,0);static DrawArrow(e,t,i=qi,n=0,o=!0,r=!1){if(!B.enabled)return;const a=Si.getArrowHead(n);a.position.set(t.x,t.y,t.z),a.quaternion.setFromUnitVectors(this._up.set(0,1,0),bt.set(t.x,t.y,t.z).sub(Xy.set(e.x,e.y,e.z)).normalize());const h=bt.set(t.x,t.y,t.z).sub(Xy.set(e.x,e.y,e.z)).length()*.1;a.scale.set(h,h,h),a.material.depthTest=o,a.material.wireframe=r,Yi(a.material,i),this.DrawLine(e,t,i,n,o)}static DrawWireMesh(e){const t=Si.getMesh(e.duration??0);"mesh"in e?(t.geometry=e.mesh.geometry,t.matrixWorld.copy(e.mesh.matrixWorld)):(t.geometry=e.geometry,t.matrixWorld.copy(e.matrix)),t.matrixAutoUpdate=!1,t.matrixWorldAutoUpdate=!1,t.material.depthTest=e.depthTest??!0,t.material.wireframe=!0,Yi(t.material,e.color??qi)}}const lC=new c.BoxGeometry(1,1,1);function Tm(s=null){const e=new c.Color(s??14540253),t=new c.EdgesGeometry(lC);return new c.LineSegments(t,new c.LineBasicMaterial({color:e}))}function Yi(s,e){if(Array.isArray(s)){for(const i of s)Yi(i,e);return}const t=e instanceof Z?e.a:1;s.color.set(e),s.opacity=t,s.transparent=t<1}const wp=Symbol("GizmoCache");class Si{static familyName="needle-gizmos";static ensureFont(){let e=ee.__webpack_exports__default.FontLibrary.getFontFamily(this.familyName);e||(e=ee.__webpack_exports__default.FontLibrary.addFontFamily(this.familyName),e.addVariant("normal","normal","https://uploads.needle.tools/include/font-msdf.json","https://uploads.needle.tools/include/font.png")?.addEventListener("ready",()=>{ee.__webpack_exports__default.update()}))}static getTextLabel(e,t,i,n,o){this.ensureFont();let r=this.textLabelCache.pop(),a=1;o&&typeof o=="string"&&o?.length>=8&&o.startsWith("#")?(a=parseInt(o.substring(7),16)/255,o=o.substring(0,7),aC&&console.log(o,a)):typeof o=="object"&&o.a!==void 0&&(a=o.a);const l={boxSizing:"border-box",fontFamily:this.familyName,width:"auto",fontSize:i,color:n,lineHeight:1,backgroundColor:o??void 0,backgroundOpacity:a,textContent:t,borderRadius:.5*i,padding:.8*i,whiteSpace:"pre",offset:.05*i};if(r)r.set(l);else{r=new ee.__webpack_exports__Text(l);const h=this,d=r;d.setText=function(u){this.set({textContent:u}),h.tmuiNeedsUpdate=!0}}return this.tmuiNeedsUpdate=!0,this.registerTimedObject(z.Current,r,e,this.textLabelCache),r}static getBox(e){let t=this.boxesCache.pop();if(!t){const i=new c.BoxGeometry(1,1,1);t=new c.Mesh(i)}return this.registerTimedObject(z.Current,t,e,this.boxesCache),t}static getLine(e){let t=this.linesCache.pop();if(!t){t=new c.Line;let i=t.geometry.getAttribute("position");i||(i=new c.BufferAttribute(new Float32Array(6),3),t.geometry.setAttribute("position",i))}return t.frustumCulled=!1,this.registerTimedObject(z.Current,t,e,this.linesCache),t}static getCircle(e){let t=this.circlesCache.pop();if(!t){t=new c.Line;let i=t.geometry.getAttribute("position");if(!i){i=new c.BufferAttribute(new Float32Array(pf*3),3),t.geometry.setAttribute("position",i);const n=j(0,1,0),o=j(0,0,1),r=j(o);r.cross(n).normalize();const a=j(r),l=Math.PI*2/(pf-1);for(let h=0;h<pf+1;h++){const d=l*h;n.copy(a).multiplyScalar(Math.cos(d)*1),r.copy(o).multiplyScalar(Math.sin(d)*1);const u=n.add(r);i.setXYZ(h,u.x,u.y,u.z)}}}return t.frustumCulled=!1,this.registerTimedObject(z.Current,t,e,this.circlesCache),t}static getSphere(e,t,i){let n=this.spheresCache.pop();return n||(n=new c.Mesh(new c.SphereGeometry(1,8,8))),n.scale.set(e,e,e),n.material.wireframe=i,this.registerTimedObject(z.Current,n,t,this.spheresCache),n}static getArrowHead(e){let t=this.arrowHeadsCache.pop();return t||(t=new c.Mesh(new c.CylinderGeometry(0,.5,1,8))),this.registerTimedObject(z.Current,t,e,this.arrowHeadsCache),t}static getMesh(e){let t=this.mesh.pop();return t||(t=new c.Mesh,t.material=new c.MeshBasicMaterial),this.registerTimedObject(z.Current,t,e,this.mesh),t}static linesCache=[];static circlesCache=[];static spheresCache=[];static boxesCache=[];static arrowHeadsCache=[];static mesh=[];static textLabelCache=[];static registerTimedObject(e,t,i,n){if(!e){console.error("No Needle Engine context available. Did you call a Gizmos function in global scope?");return}const o=this.contextBeforeRenderCallbacks.get(e),r=this.contextPostRenderCallbacks.get(e);if(o){if(e.pre_render_callbacks[e.pre_render_callbacks.length-1]!==o){const a=e.pre_render_callbacks.indexOf(o);a>=0&&e.pre_render_callbacks.splice(a,1),e.pre_render_callbacks.push(o)}}else{const a=()=>{this.onBeforeRender(e,this.timedObjectsBuffer)};this.contextBeforeRenderCallbacks.set(e,a),e.pre_render_callbacks.push(a)}if(r){if(e.post_render_callbacks[e.post_render_callbacks.length-1]!==r){const a=e.post_render_callbacks.indexOf(r);a>=0&&e.post_render_callbacks.splice(a,1),e.post_render_callbacks.push(r)}}else{const a=()=>{this.onPostRender(e,this.timedObjectsBuffer,this.timesBuffer)};this.contextPostRenderCallbacks.set(e,a),e.post_render_callbacks.push(a)}t.traverse(a=>{a.layers.disableAll(),a.layers.enable(2)}),t.renderOrder=999999,t[wp]=n,t.castShadow=!1,t.receiveShadow=!1,t.isGizmo=!0,this.timedObjectsBuffer.push(t),this.timesBuffer.push(z.Current.time.realtimeSinceStartup+i),e.scene.add(t)}static timedObjectsBuffer=new Array;static timesBuffer=new Array;static contextPostRenderCallbacks=new Map;static contextBeforeRenderCallbacks=new Map;static tmuiNeedsUpdate=!1;static onBeforeRender(e,t){this.tmuiNeedsUpdate&&(this.tmuiNeedsUpdate=!1,ee.__webpack_exports__default.update());for(let i=0;i<t.length;i++){const n=t[i];if(e.mainCamera&&n instanceof ee.__webpack_exports__default.MeshUIBaseElement){if(er(n))continue;const o=e.isInVR,r=!1,a=!o;wc(n,e.mainCamera,r,a)}}}static onPostRender(e,t,i){const n=e.time.realtimeSinceStartup;for(let o=t.length-1;o>=0;o--){const r=t[o];n>=i[o]-1e-6&&(t.splice(o,1),i.splice(o,1),r.removeFromParent(),er(r)!=!0&&r[wp].push(r))}}}const It=x("debugphysics"),Yy=new c.Layers;class lo{static AllLayers=4294967295;ray;cam;screenPoint;raycaster;results;targets;recursive=!0;minDistance;maxDistance;lineThreshold;layerMask;ignore;testObject;useAcceleratedRaycast;allowSlowRaycastFallback=!0;screenPointFromOffset(e,t){this.screenPoint===void 0&&(this.screenPoint=new c.Vector2),this.screenPoint.x=e/window.innerWidth*2-1,this.screenPoint.y=-(t/window.innerHeight)*2+1}setLayer(e){Yy.set(e),this.layerMask=Yy}setMask(e){this.layerMask||(this.layerMask=new c.Layers);const t=this.layerMask;t?t.mask=e:this.layerMask=e}}class Am{distance;point;object;constructor(e,t,i){this.object=e,this.distance=t,this.point=i}}class _a{static _raycasting=0;static get raycasting(){return this._raycasting>0}raycastPhysicsFast(e,t=void 0,i=1/0,n=!0){return this.context.physics.engine?.raycast(e,t,{maxDistance:i,solid:n})??null}raycastPhysicsFastAndGetNormal(e,t=void 0,i=1/0,n=!0){return this.context.physics.engine?.raycastAndGetNormal(e,t,{maxDistance:i,solid:n})??null}sphereOverlapPhysics(e,t){return this.context.physics.engine?.sphereOverlap(e,t)??null}context;engine;constructor(e){this.context=e}raycaster=new c.Raycaster;defaultRaycastOptions=new lo;targetBuffer=new Array(1);defaultThresholds={Mesh:{},Line:{threshold:-1},LOD:{},Points:{threshold:0},Sprite:{}};sphereResults=new Array;sphereMask=new c.Layers;sphere=new c.Sphere;sphereOverlap(e,t,i=!0,n=!1,o=null){if(this.sphereResults.length=0,!this.context.scene)return this.sphereResults;const r=this.sphereMask;r.enableAll(),r.disable(2);for(const a of this.context.scene.children)this.intersectSphere(a,e,t,r,this.sphereResults,i,n,o);return this.sphereResults.sort((a,l)=>a.distance-l.distance)}raycastFromRay(e,t=null){const i=t??this.defaultRaycastOptions;i.ray=e;const n=this.raycast(i);return i===this.defaultRaycastOptions&&(i.ray=void 0),n}raycast(e=null){It&&performance.mark("raycast.start"),e||(e=this.defaultRaycastOptions);const t=e.screenPoint??this.context.input.mousePositionRC,i=e.raycaster??this.raycaster;if(i.near=e.minDistance??0,i.far=e.maxDistance??1/0,i.params=this.defaultThresholds,e.lineThreshold===void 0&&(e.lineThreshold=-1),i.params.Line={threshold:e.lineThreshold},e.ray)i.ray.copy(e.ray);else{const a=e.cam??this.context.mainCamera;if(!a)return It&&console.error("Can not perform raycast - no main camera found"),this.defaultRaycastOptions.results&&(this.defaultRaycastOptions.results.length=0),this.defaultRaycastOptions.results??[];const l=this.context.xrCamera;this.context.isInXR&&l instanceof c.ArrayCamera&&l.cameras.length>0?i.setFromCamera(t,l.cameras[0]):i.setFromCamera(t,a)}let n=e.targets;n||(n=this.targetBuffer,n.length=1,n[0]=this.context.scene);let o=e.results;this.defaultRaycastOptions.results&&(this.defaultRaycastOptions.results.length=0),o||(this.defaultRaycastOptions.results||(this.defaultRaycastOptions.results=new Array),o=this.defaultRaycastOptions.results),e.layerMask!==void 0?e.layerMask instanceof c.Layers?i.layers.mask=e.layerMask.mask:i.layers.mask=e.layerMask:(i.layers.enableAll(),i.layers.disable(2)),It&&console.time("raycast"),o.length=0,_a._raycasting++,this.intersect(this.raycaster,n,o,e),o.sort((a,l)=>a.distance-l.distance);const r=e.ignore;return r!==void 0&&r.length>0&&(o=o.filter(a=>!r.includes(a.object))),_a._raycasting--,It&&(console.timeEnd("raycast"),console.warn("#"+this.context.time.frame+", hits:",o?.length?[...o]:"nothing"),performance.mark("raycast.end"),performance.measure("raycast","raycast.start","raycast.end")),o}intersect(e,t,i,n){for(const o of t){if(!o||o.visible===!1||B.isGizmo(o)||n.lineThreshold!==void 0&&n.lineThreshold<0&&o instanceof c.Line)continue;let r=!0;const a=o,l=a.geometry;if(o.raycastAllowed===!1&&(r=!1),r&&n.testObject){const h=n.testObject?.(o);if(h===!1)continue;h==="continue in children"&&(r=!1)}else r&&(l&&Ky(l)||(r=!1));if(r){const h=i.length,d=o.raycastPreference||"lod";let u=d!=="bounds";if(n.precise===!1&&(u=!1),u||=l.getAttribute("position")?.array?.length<64,a instanceof q.GroundedSkybox&&(u=!1),d==="lod"){const p=ne.getRaycastMesh(o);p&&(a.geometry=p)}if(!u&&hC(a,e,i)||(n.useAcceleratedRaycast!==!1?xd.runMeshBVHRaycast(e,a,i,this.context,n):e.intersectObject(a,!1,i)),a.geometry=l,It&&i.length!=h){const p=i[i.length-1];B.DrawWireSphere(p.point,.1,7798784,1,!1),B.DrawWireMesh({mesh:o,depthTest:!1,duration:.2,color:7798784})}}n.recursive!==!1&&this.intersect(e,o.children,i,n)}return i}tempBoundingBox=new c.Box3;intersectSphere(e,t,i,n,o,r,a,l){let h=e&&e.isMesh&&e.layers.test(n)&&!B.isGizmo(e);h&&=e.visible,h&&=!(e instanceof c.Line),h&&=!(e instanceof q.GroundedSkybox);const d=e,u=d.geometry;if(h&&l){const p=l(e);if(p===!1)return;p==="continue in children"&&(h=!1)}if(u&&Ky(u)||(h=!1),h){if(a){const p=this.sphere;p.center.copy(t),p.radius=i;const m=o.length;if(xd.runMeshBVHRaycast(this.sphere,d,o,this.context,{}),m!=o.length&&!r)return}else if(u.boundingBox||u.computeBoundingBox(),u.boundingBox){d.matrixWorldNeedsUpdate&&d.updateWorldMatrix(!1,!1);const p=this.tempBoundingBox.copy(u.boundingBox).applyMatrix4(d.matrixWorld),m=this.sphere;if(m.center.copy(t),m.radius=i,m.intersectsBox(p)){const y=X(e),_=y.distanceTo(m.center),g=new Am(e,_,y);if(o.push(g),!r)return}}}if(e.children)for(const p of e.children){const m=o.length;if(this.intersectSphere(p,t,i,n,o,r,a,l),m!=o.length&&!r)return}}}function Ky(s){return!(s.index&&s.index.array.length<3)}const Po=new c.Sphere,Ch=new c.Plane,cC=new c.Matrix3;function hC(s,e,t){const i=s._computeIntersections;if(!i)return!1;let n=s["_computeIntersections:Needle"];return n||(n=s["_computeIntersections:Needle"]=function(o,r,a){const l=this,h=l.geometry.boundingSphere;if(h){if(l instanceof q.GroundedSkybox){Ch.setFromNormalAndCoplanarPoint(j(0,1,0),j(0,-l.position.y,0)),Ch.applyMatrix4(l.matrixWorld,cC);const u=o.ray.intersectPlane(Ch,j());if(u){Po.copy(h),Po.applyMatrix4(l.matrixWorld);const m=j(u).sub(o.ray.origin).length(),y=Po.radius*.5;m<y&&r.push({distance:m,point:u,object:l,normal:Ch.normal.clone()})}return}Po.copy(h),Po.applyMatrix4(l.matrixWorld);const d=o.ray.intersectSphere(Po,j());if(d){const u=j(d).sub(o.ray.origin),p=u.length();if(p>Po.radius){const m=u.clone().normalize();r.push({distance:p,point:d,object:l,normal:m})}}}}),s._computeIntersections=n,e.intersectObject(s,!1,t),s._computeIntersections=i,!0}var xd;(s=>{let e=0;function t(b,v,R,O,k){if(!v.geometry||!v.geometry.hasAttribute("position"))return!1;const A=v.geometry;if(v?.isSkinnedMesh){const D=v,L=D.bvhNeedsUpdate;if(!D.staticGenerator)l(),r&&(D.staticGenerator=new r(v),D.staticGenerator.applyWorldTransforms=!1,D.staticGeometry=D.staticGenerator.generate(),A.boundsTree=a?.call(D.staticGeometry),D.staticGeometryLastUpdate=performance.now()+Math.random()*200,D.bvhNeedsUpdate=!0);else if(A.boundsTree&&(D.autoUpdateMeshBvhInterval!==void 0&&D.autoUpdateMeshBvhInterval>=0||L===!0)){const N=performance.now(),W=N-D.staticGeometryLastUpdate,E=D.autoUpdateMeshBvhInterval??100;(L||W>E)&&(It&&console.warn(`Physics: updating skinned mesh bvh for ${v.name} after ${W.toFixed(2)}ms`),D.bvhNeedsUpdate=!1,D.staticGeometryLastUpdate=N,D.staticGenerator?.generate(D.staticGeometry),A.boundsTree.refit())}}else if(!A.boundsTree){d||w();let D=!0;if((O.xr||A[y]===!1||A.getAttribute("position")?.isInterleavedBufferAttribute||A.index&&A.index?.isInterleavedBufferAttribute||e>10)&&(D=!1),D&&p){if(A[m]===void 0){let L=null;if(g.length>0){const N=g.shift();N&&!N.running&&(L=N)}if(!L&&_.length<3)try{L=new p,_.push(L)}catch(N){N instanceof DOMException&&N.name==="SecurityError"?(console.warn("Failed to create MeshBVH worker, falling back to main thread generation. This can happen when running from file://, if the browser does not support workers or if the browser is blocking workers for other reasons."),console.debug(N),e+=10):(console.error("Failed to create MeshBVH worker"),console.debug(N)),e++}if(L!=null&&!L.running){const N=v.name;It&&console.log("<<<< worker start",N,L),A[m]="queued",performance.mark("bvh.create.start");const W=A.clone();try{L.generate(W).then(E=>{A[m]="done",A.boundsTree=E}).catch(E=>{A[m]="failed - "+E?.message,A[y]=!1,It&&console.error("Failed to generate mesh bvh on worker",E)}).finally(()=>{It&&console.log(">>>>> worker done",N,{hasBoundsTre:A.boundsTree!=null}),g.push(L),W.dispose(),performance.mark("bvh.create.end"),performance.measure("bvh.create (worker)","bvh.create.start","bvh.create.end")})}catch(E){console.error("Failed to generate mesh bvh on worker",E)}}else It&&console.warn("No worker available")}}else(!u||!D)&&(l(),o&&(performance.mark("bvh.create.start"),A.boundsTree=new o(A),performance.mark("bvh.create.end"),performance.measure("bvh.create","bvh.create.start","bvh.create.end")))}if(b instanceof c.Raycaster){const D=b,L=v.raycast;if(A.boundsTree)l(),n&&(v.acceleratedRaycast||(v.acceleratedRaycast=n.bind(v),It&&console.debug(`Physics: bind acceleratedRaycast fn to "${v.name}"`)),v.raycast=v.acceleratedRaycast);else if(It&&console.warn("No bounds tree found for mesh",v.name,{workerTask:A[m],hasAcceleratedRaycast:n!=null}),k.allowSlowRaycastFallback===!1&&(A.getAttribute("position")?.array?.length??0)>2e3)return It&&console.warn("Skipping raycast because no bounds tree is available and allowSlowRaycastFallback is false"),!1;const N=D.firstHitOnly;return D.firstHitOnly=!1,D.intersectObject(v,!1,R),D.firstHitOnly=N,v.raycast=L,!0}else if(b instanceof c.Sphere){const D=A.boundsTree;if(D){const L=b;if(h.copy(v.matrixWorld).invert(),L.applyMatrix4(h),D.intersectsSphere(L)){const W=X(v),E=W.distanceTo(L.center),U=new Am(v,E,W);R.push(U)}}return!0}return!1}s.runMeshBVHRaycast=t;let i=!1,n=null,o=null,r=null,a=null;function l(){i||(i=!0,Promise.resolve().then(()=>require("./vendor-CAWj5cBK.umd.cjs")).then(b=>b.index$1).then(b=>{n=b.acceleratedRaycast,o=b.MeshBVH,r=b.StaticGeometryGenerator,a=b.computeBoundsTree}).catch(b=>{(It||T())&&console.error("Failed to load BVH library...",b.message)}))}const h=new c.Matrix4;let d=!1,u=!1,p=null;const m=Symbol("Needle:MeshBVH-Worker"),y=Symbol("Needle:MeshBVH-CanUseWorker"),_=[],g=[];function w(){d=!0,u=!0,Promise.resolve().then(()=>oT).then(b=>{p=b.GenerateMeshBVHWorker}).catch(b=>{It||T()?console.warn("Failed to setup mesh bvh worker"):console.debug("Failed to setup mesh bvh worker",b)}).finally(()=>{u=!1})}})(xd||(xd={}));const Zy=Symbol("gltf-loader-internal-usage-tracker"),dC=x("debugusers");class aa{get name(){return"NEEDLE_internal_usage_tracker"}static isLoading(e){return aa._loadingProcesses>0}static _loadingProcesses=0;parser;_getDependency;_loadingId;_loadedObjects=new Set;constructor(e){this.parser=e,this._getDependency=this.parser.getDependency,this._loadingId=Date.now().toString()}beforeRoot(){aa._loadingProcesses++;const e=this,t=this._getDependency;return this.parser.getDependency=function(i,n){const o=t.call(this,i,n);return o.then(r=>(r&&(e._loadedObjects.add(r),r[Zy]=e._loadingId),r)),o},null}afterRoot(e){aa._loadingProcesses--,this.parser.getDependency=this._getDependency;for(const t of this._loadedObjects)delete t[Zy],t instanceof c.Object3D&&(t.parent||t instanceof c.Mesh&&setTimeout(()=>{dC&&console.warn("> GLTF LOADER: Mesh not used in scene!",t),t.material=null,t.geometry=null},1e3));return null}}class f0{constructor(){window.addEventListener("unhandledrejection",e=>{if(e.defaultPrevented)return;const t=e?.reason?.path;if(t){const i=t[0];i&&i.tagName==="IMG"&&(console.warn(`Could not load image:
|
|
167
|
+
${o.hand?"hand":"ctrl"} ${o.inputSource.handedness}[${o.index}] con:${o.connected} tr:${o.isTracking} hts:${o.hasHitTestSource?"yes":"no"}`;uf=0,B.DrawLabel(e,n,void 0,1/60*20)}}onBeforeRender=()=>{this.context.mainCamera&&(this.updateFade(this.context.mainCamera),this.requestedCameraNearPlane!==null&&this.context.mainCamera instanceof c.PerspectiveCamera&&(this.context.mainCamera.near=this.requestedCameraNearPlane,this.requestedCameraNearPlane=null))};onAfterRender=()=>{if(this.onUpdateFade_PostRender(),exports.DeviceUtilities.isDesktop()||!this._renderOnceOnDevice){const e=this.context.renderer;if(e.xr.isPresenting&&this.context.mainCamera){this._renderOnceOnDevice=!0;const t=e.xr.enabled,i=e.getRenderTarget(),n=this.context.scene.background;e.xr.enabled=!1,e.setRenderTarget(null),this.isPassThrough&&(this.context.scene.background=null),this.context.composer?this.context.composer.render(this.context.time.deltaTime):e.render(this.context.scene,this.context.mainCamera),e.xr.enabled=t,e.setRenderTarget(i),this.context.scene.background=n}}};addScript(e){return this._xr_scripts.includes(e)?!1:(Le&&console.log("Register new XRScript",e),this._xr_scripts.push(e),typeof e.onUpdateXR=="function"&&this._xr_update_scripts.push(e),!0)}markInactive(e){if(!(this._inactive_scripts.indexOf(e)>=0)){this.removeScript(e,!1),this._inactive_scripts.push(e);for(const t of this.controllers)this.invokeCallback_ControllerRemoved(e,t);this.invokeCallback_LeaveXR(e)}}handleInactiveScripts(){if(this._inactive_scripts.length>0)for(let e=this._inactive_scripts.length-1;e>=0;e--){const t=this._inactive_scripts[e];if(t.activeAndEnabled){this._inactive_scripts.splice(e,1),this.addScript(t),this.invokeCallback_EnterXR(t);for(const i of this.controllers)this.invokeCallback_ControllerAdded(t,i)}}}_script_to_remove=[];removeScript(e,t=!0){Le&&console.log("Remove XRScript",e);const i=this._xr_scripts.indexOf(e);i>=0&&this._xr_scripts.splice(i,1);const n=this._xr_update_scripts.indexOf(e);if(n>=0&&this._xr_update_scripts.splice(n,1),t){const o=this._inactive_scripts.indexOf(e);o>=0&&this._inactive_scripts.splice(o,1)}}invokeCallback_EnterXR(e){e.onEnterXR&&e.onEnterXR({xr:this})}invokeCallback_ControllerAdded(e,t){e.onXRControllerAdded&&e.onXRControllerAdded({xr:this,controller:t,change:"added"})}invokeCallback_ControllerRemoved(e,t){e.onXRControllerRemoved&&e.onXRControllerRemoved({xr:this,controller:t,change:"removed"})}invokeCallback_LeaveXR(e){e.onLeaveXR&&!e.destroyed&&e.onLeaveXR({xr:this})}syncCameraCullingMask(){const e=this.context.xrCamera,t=this.context.mainCameraComponent?.cullingMask;if(e&&t!==void 0){for(const i of e.cameras)i.layers.mask=t;e.layers.mask=t}else if(e){for(const i of e.cameras)i.layers.enableAll();e.layers.enableAll()}}invokeControllerEvent(e,t,i){for(let n=t.length-1;n>=0;n--){const o=t[n];if(o)try{o({xr:this,controller:e,change:i})}catch(r){console.error(r)}}}_camera;_cameraRenderParent=new c.Object3D().rotateY(Math.PI);_previousCameraParent;_customforward=!0;originalCameraNearPlane;requestedCameraNearPlane=null;applyCustomForward(){if(this.context.mainCamera&&this._customforward){this._camera=this.context.mainCamera,this._camera.parent!==this._cameraRenderParent&&(this._previousCameraParent=this._camera.parent,this._previousCameraParent?.add(this._cameraRenderParent)),this._cameraRenderParent.name="XR Camera Render Parent",this._cameraRenderParent.add(this._camera);{let e=.02;const t=.001;if(this.rig){const i=je(this.rig.gameObject);e*=i.x}this._camera instanceof c.PerspectiveCamera&&Math.abs(this._camera.near-e)>t&&(this.isAR?this.originalCameraNearPlane=this._camera.near:this._camera.near=e,Le&&console.debug(`Setting camera near plane to ${e} (was ${this.originalCameraNearPlane}) to account for XR rendering scale`))}}}revertCustomForward(){this._camera&&this._previousCameraParent&&this._previousCameraParent.add(this._camera),this._previousCameraParent=null,this._camera instanceof c.PerspectiveCamera&&this.originalCameraNearPlane!=null&&(this._camera.near=this.originalCameraNearPlane,this.originalCameraNearPlane=void 0)}_viewerPose;_transformOrientation=new c.Quaternion;_transformPosition=new c.Vector3;internalUpdateState(){const e=this.context.renderer.xr.getReferenceSpace();if(!e){this._viewerPose=void 0;return}if(this._viewerPose=this.frame.getViewerPose(e),this._viewerPose){const t=this._viewerPose.transform;this._transformPosition.set(t.position.x,t.position.y,t.position.z),this._transformOrientation.set(t.orientation.x,t.orientation.y,t.orientation.z,t.orientation.w)}}_transition;get transition(){return this._transition||(this._transition=new Wy),this._transition}fadeTransition(){return this._transition||(this._transition=new Wy),this._transition.fadeTransition()}updateFade(e){this._transition&&e instanceof c.PerspectiveCamera&&this._transition.update(e,this.context.time.deltaTime)}onUpdateFade_PostRender(){this._transition?.remove()}}const ff=x("debugwebxr");class u0{static tryFindAvatarObjects(e,t,i){if(i.head&&i.leftHand&&i.rightHand)return;const n=e.name.toLocaleLowerCase();!i.head&&n.includes("head")&&(ff&&console.log("FOUND AVATAR HEAD",e.name),i.head=new Y("",t,e)),n.includes("hand")&&(!i.leftHand&&n.includes("left")&&(ff&&console.log("FOUND AVATAR LEFT HAND",e.name),i.leftHand=new Y("",t,e)),!i.rightHand&&n.includes("right")&&(ff&&console.log("FOUND AVATAR RIGHT HAND",e.name),i.rightHand=new Y("",t,e)));for(let o=0;o<e.children.length;o++){if(i.head&&i.leftHand&&i.rightHand)return;const r=e.children[o];this.tryFindAvatarObjects(r,t,i)}}}class Z extends c.Color{alpha=1;get isRGBAColor(){return!0}set a(e){this.alpha=e}get a(){return this.alpha}constructor(e,t,i,n){super(),typeof e=="number"&&typeof t=="number"&&typeof i=="number"?(this.set(e,t,i),this.alpha=typeof n=="number"?n:1):e!==void 0&&(this.set(e),this.alpha=1)}clone(){const e=super.clone();return e.alpha=this.alpha,e}copy(e){return this.r=e.r,this.g=e.g,this.b=e.b,"alpha"in e&&typeof e.alpha=="number"?this.alpha=e.alpha:typeof e.a=="number"&&(this.alpha=e.a),this}lerp(e,t){const i=e;return i.alpha!=null&&(this.alpha=I.lerp(this.alpha,i.alpha,t)),super.lerp(e,t)}lerpColors(e,t,i){const n=e,o=t;return n.alpha!=null&&o.alpha!=null&&(this.alpha=I.lerp(n.alpha,o.alpha,i)),super.lerpColors(e,t,i)}multiply(e){const t=e;return t.alpha!=null&&(this.alpha=this.alpha*t.alpha),super.multiply(e)}fromArray(e,t=0){return this.alpha=e[t+3],super.fromArray(e,t)}static fromColorRepresentation(e){if(typeof e=="string"){if(e.trim()==="transparent")return new Z(0,0,0,0);if(e.startsWith("#")&&e.length===9){const t=parseInt(e.slice(1,9),16),i=t>>24&255,n=t>>16&255,o=t>>8&255,r=t>>0&255;return new Z(i/255,n/255,o/255,r/255)}else if(e.startsWith("#")){const t=parseInt(e.slice(1),16),i=t>>16&255,n=t>>8&255,o=t>>0&255;return new Z(i/255,n/255,o/255,1)}else if(e.startsWith("rgba")){const t=e.slice(5,-1).split(",").map(Number);return new Z(t[0]/255,t[1]/255,t[2]/255,t[3])}else if(e.startsWith("rgb")){const t=e.slice(4,-1).split(",").map(Number);return new Z(t[0]/255,t[1]/255,t[2]/255,1)}}else if(Array.isArray(e)){if(e.length===4)return new Z(e[0],e[1],e[2],e[3]);if(e.length===3)return new Z(e[0],e[1],e[2],1);console.error("Invalid color array length. Expected 3 or 4, got "+e.length)}return new Z(e)}}const bt=new c.Vector3,Xy=new c.Vector3,Qy=new c.Quaternion,aC=x("debuggizmos"),qi=8947848,pf=32;class B{constructor(){}static enabled=!0;static isGizmo(e){return e[wp]!==void 0}static setVisible(e){for(const t of Si.timedObjectsBuffer)t.visible=e}static DrawLabel(e,t,i=.05,n=0,o,r,a){if(!B.enabled)return null;o||(o=qi);const l=G.active?.rigScale??1,h=Si.getTextLabel(n,t,i*l,o,r);return a instanceof c.Object3D&&a.add(h),h.position.x=e.x,h.position.y=e.y,h.position.z=e.z,h}static DrawRay(e,t,i=qi,n=0,o=!0){if(!B.enabled)return;const r=Si.getLine(n),a=r.geometry.getAttribute("position");a.setXYZ(0,e.x,e.y,e.z),bt.set(t.x,t.y,t.z).multiplyScalar(999999999),a.setXYZ(1,e.x+bt.x,e.y+bt.y,e.z+bt.z),a.needsUpdate=!0,r.material.depthTest=o,r.material.depthWrite=!1,r.material.fog=!1,Yi(r.material,i)}static DrawDirection(e,t,i=qi,n=0,o=!0,r=1){if(!B.enabled)return;const a=Si.getLine(n),l=a.geometry.getAttribute("position");l.setXYZ(0,e.x,e.y,e.z),t.w!==void 0?(bt.set(0,0,-r),Qy.set(t.x,t.y,t.z,t.w),bt.applyQuaternion(Qy)):(bt.set(t.x,t.y,t.z),bt.multiplyScalar(r)),l.setXYZ(1,e.x+bt.x,e.y+bt.y,e.z+bt.z),l.needsUpdate=!0,a.material.depthTest=o,a.material.depthWrite=!1,Yi(a.material,i)}static DrawLine(e,t,i=qi,n=0,o=!0){if(!B.enabled)return;const r=Si.getLine(n),a=r.geometry.getAttribute("position");a.setXYZ(0,e.x,e.y,e.z),a.setXYZ(1,t.x,t.y,t.z),a.needsUpdate=!0,r.material.depthTest=o,r.material.depthWrite=!1,r.material.fog=!1,Yi(r.material,i)}static DrawCircle(e,t,i,n=qi,o=0,r=!0){if(!B.enabled)return;const a=Si.getCircle(o);a.position.set(e.x,e.y,e.z),a.scale.set(i,i,i),a.quaternion.setFromUnitVectors(this._up,bt.set(t.x,t.y,t.z).normalize()),a.material.depthTest=r,a.material.depthWrite=!1,a.material.fog=!1,Yi(a.material,n)}static DrawWireSphere(e,t,i=qi,n=0,o=!0){if(!B.enabled)return;const r=Si.getSphere(t,n,!0);Zo(r,e.x,e.y,e.z),r.material.depthTest=o,r.material.depthWrite=!1,r.material.fog=!1,Yi(r.material,i)}static DrawSphere(e,t,i=qi,n=0,o=!0){if(!B.enabled)return;const r=Si.getSphere(t,n,!1);Zo(r,e.x,e.y,e.z),r.material.depthTest=o,r.material.depthWrite=!1,Yi(r.material,i)}static DrawWireBox(e,t,i=qi,n=0,o=!0,r=void 0){if(!B.enabled)return;const a=Si.getBox(n);a.position.set(e.x,e.y,e.z),a.scale.set(t.x,t.y,t.z),r?a.quaternion.copy(r):a.quaternion.identity(),a.material.depthTest=o,a.material.wireframe=!0,a.material.depthWrite=!1,a.material.fog=!1,Yi(a.material,i)}static DrawWireBox3(e,t=qi,i=0,n=!0){if(!B.enabled)return;const o=Si.getBox(i);o.position.copy(e.getCenter(bt)),o.scale.copy(e.getSize(bt)),o.material.depthTest=n,o.material.wireframe=!0,o.material.depthWrite=!1,o.material.fog=!1,Yi(o.material,t)}static _up=new c.Vector3(0,1,0);static DrawArrow(e,t,i=qi,n=0,o=!0,r=!1){if(!B.enabled)return;const a=Si.getArrowHead(n);a.position.set(t.x,t.y,t.z),a.quaternion.setFromUnitVectors(this._up.set(0,1,0),bt.set(t.x,t.y,t.z).sub(Xy.set(e.x,e.y,e.z)).normalize());const h=bt.set(t.x,t.y,t.z).sub(Xy.set(e.x,e.y,e.z)).length()*.1;a.scale.set(h,h,h),a.material.depthTest=o,a.material.wireframe=r,Yi(a.material,i),this.DrawLine(e,t,i,n,o)}static DrawWireMesh(e){const t=Si.getMesh(e.duration??0);"mesh"in e?(t.geometry=e.mesh.geometry,t.matrixWorld.copy(e.mesh.matrixWorld)):(t.geometry=e.geometry,t.matrixWorld.copy(e.matrix)),t.matrixAutoUpdate=!1,t.matrixWorldAutoUpdate=!1,t.material.depthTest=e.depthTest??!0,t.material.wireframe=!0,Yi(t.material,e.color??qi)}}const lC=new c.BoxGeometry(1,1,1);function Tm(s=null){const e=new c.Color(s??14540253),t=new c.EdgesGeometry(lC);return new c.LineSegments(t,new c.LineBasicMaterial({color:e}))}function Yi(s,e){if(Array.isArray(s)){for(const i of s)Yi(i,e);return}const t=e instanceof Z?e.a:1;s.color.set(e),s.opacity=t,s.transparent=t<1}const wp=Symbol("GizmoCache");class Si{static familyName="needle-gizmos";static ensureFont(){let e=ee.__webpack_exports__default.FontLibrary.getFontFamily(this.familyName);e||(e=ee.__webpack_exports__default.FontLibrary.addFontFamily(this.familyName),e.addVariant("normal","normal","https://uploads.needle.tools/include/font-msdf.json","https://uploads.needle.tools/include/font.png")?.addEventListener("ready",()=>{ee.__webpack_exports__default.update()}))}static getTextLabel(e,t,i,n,o){this.ensureFont();let r=this.textLabelCache.pop(),a=1;o&&typeof o=="string"&&o?.length>=8&&o.startsWith("#")?(a=parseInt(o.substring(7),16)/255,o=o.substring(0,7),aC&&console.log(o,a)):typeof o=="object"&&o.a!==void 0&&(a=o.a);const l={boxSizing:"border-box",fontFamily:this.familyName,width:"auto",fontSize:i,color:n,lineHeight:1,backgroundColor:o??void 0,backgroundOpacity:a,textContent:t,borderRadius:.5*i,padding:.8*i,whiteSpace:"pre",offset:.05*i};if(r)r.set(l);else{r=new ee.__webpack_exports__Text(l);const h=this,d=r;d.setText=function(u){this.set({textContent:u}),h.tmuiNeedsUpdate=!0}}return this.tmuiNeedsUpdate=!0,this.registerTimedObject(z.Current,r,e,this.textLabelCache),r}static getBox(e){let t=this.boxesCache.pop();if(!t){const i=new c.BoxGeometry(1,1,1);t=new c.Mesh(i)}return this.registerTimedObject(z.Current,t,e,this.boxesCache),t}static getLine(e){let t=this.linesCache.pop();if(!t){t=new c.Line;let i=t.geometry.getAttribute("position");i||(i=new c.BufferAttribute(new Float32Array(6),3),t.geometry.setAttribute("position",i))}return t.frustumCulled=!1,this.registerTimedObject(z.Current,t,e,this.linesCache),t}static getCircle(e){let t=this.circlesCache.pop();if(!t){t=new c.Line;let i=t.geometry.getAttribute("position");if(!i){i=new c.BufferAttribute(new Float32Array(pf*3),3),t.geometry.setAttribute("position",i);const n=j(0,1,0),o=j(0,0,1),r=j(o);r.cross(n).normalize();const a=j(r),l=Math.PI*2/(pf-1);for(let h=0;h<pf+1;h++){const d=l*h;n.copy(a).multiplyScalar(Math.cos(d)*1),r.copy(o).multiplyScalar(Math.sin(d)*1);const u=n.add(r);i.setXYZ(h,u.x,u.y,u.z)}}}return t.frustumCulled=!1,this.registerTimedObject(z.Current,t,e,this.circlesCache),t}static getSphere(e,t,i){let n=this.spheresCache.pop();return n||(n=new c.Mesh(new c.SphereGeometry(1,8,8))),n.scale.set(e,e,e),n.material.wireframe=i,this.registerTimedObject(z.Current,n,t,this.spheresCache),n}static getArrowHead(e){let t=this.arrowHeadsCache.pop();return t||(t=new c.Mesh(new c.CylinderGeometry(0,.5,1,8))),this.registerTimedObject(z.Current,t,e,this.arrowHeadsCache),t}static getMesh(e){let t=this.mesh.pop();return t||(t=new c.Mesh,t.material=new c.MeshBasicMaterial),this.registerTimedObject(z.Current,t,e,this.mesh),t}static linesCache=[];static circlesCache=[];static spheresCache=[];static boxesCache=[];static arrowHeadsCache=[];static mesh=[];static textLabelCache=[];static registerTimedObject(e,t,i,n){if(!e){console.error("No Needle Engine context available. Did you call a Gizmos function in global scope?");return}const o=this.contextBeforeRenderCallbacks.get(e),r=this.contextPostRenderCallbacks.get(e);if(o){if(e.pre_render_callbacks[e.pre_render_callbacks.length-1]!==o){const a=e.pre_render_callbacks.indexOf(o);a>=0&&e.pre_render_callbacks.splice(a,1),e.pre_render_callbacks.push(o)}}else{const a=()=>{this.onBeforeRender(e,this.timedObjectsBuffer)};this.contextBeforeRenderCallbacks.set(e,a),e.pre_render_callbacks.push(a)}if(r){if(e.post_render_callbacks[e.post_render_callbacks.length-1]!==r){const a=e.post_render_callbacks.indexOf(r);a>=0&&e.post_render_callbacks.splice(a,1),e.post_render_callbacks.push(r)}}else{const a=()=>{this.onPostRender(e,this.timedObjectsBuffer,this.timesBuffer)};this.contextPostRenderCallbacks.set(e,a),e.post_render_callbacks.push(a)}t.traverse(a=>{a.layers.disableAll(),a.layers.enable(2)}),t.renderOrder=999999,t[wp]=n,t.castShadow=!1,t.receiveShadow=!1,t.isGizmo=!0,this.timedObjectsBuffer.push(t),this.timesBuffer.push(z.Current.time.realtimeSinceStartup+i),e.scene.add(t)}static timedObjectsBuffer=new Array;static timesBuffer=new Array;static contextPostRenderCallbacks=new Map;static contextBeforeRenderCallbacks=new Map;static tmuiNeedsUpdate=!1;static onBeforeRender(e,t){this.tmuiNeedsUpdate&&(this.tmuiNeedsUpdate=!1,ee.__webpack_exports__default.update());for(let i=0;i<t.length;i++){const n=t[i];if(e.mainCamera&&n instanceof ee.__webpack_exports__default.MeshUIBaseElement){if(er(n))continue;const o=e.isInVR,r=!1,a=!o;wc(n,e.mainCamera,r,a)}}}static onPostRender(e,t,i){const n=e.time.realtimeSinceStartup;for(let o=t.length-1;o>=0;o--){const r=t[o];n>=i[o]-1e-6&&(t.splice(o,1),i.splice(o,1),r.removeFromParent(),er(r)!=!0&&r[wp].push(r))}}}const It=x("debugphysics"),Yy=new c.Layers;class lo{static AllLayers=4294967295;ray;cam;screenPoint;raycaster;results;targets;recursive=!0;minDistance;maxDistance;lineThreshold;layerMask;ignore;testObject;useAcceleratedRaycast;allowSlowRaycastFallback=!0;screenPointFromOffset(e,t){this.screenPoint===void 0&&(this.screenPoint=new c.Vector2),this.screenPoint.x=e/window.innerWidth*2-1,this.screenPoint.y=-(t/window.innerHeight)*2+1}setLayer(e){Yy.set(e),this.layerMask=Yy}setMask(e){this.layerMask||(this.layerMask=new c.Layers);const t=this.layerMask;t?t.mask=e:this.layerMask=e}}class Am{distance;point;object;constructor(e,t,i){this.object=e,this.distance=t,this.point=i}}class _a{static _raycasting=0;static get raycasting(){return this._raycasting>0}raycastPhysicsFast(e,t=void 0,i=1/0,n=!0){return this.context.physics.engine?.raycast(e,t,{maxDistance:i,solid:n})??null}raycastPhysicsFastAndGetNormal(e,t=void 0,i=1/0,n=!0){return this.context.physics.engine?.raycastAndGetNormal(e,t,{maxDistance:i,solid:n})??null}sphereOverlapPhysics(e,t){return this.context.physics.engine?.sphereOverlap(e,t)??null}context;engine;constructor(e){this.context=e}raycaster=new c.Raycaster;defaultRaycastOptions=new lo;targetBuffer=new Array(1);defaultThresholds={Mesh:{},Line:{threshold:-1},LOD:{},Points:{threshold:0},Sprite:{}};sphereResults=new Array;sphereMask=new c.Layers;sphere=new c.Sphere;sphereOverlap(e,t,i=!0,n=!1,o=null){if(this.sphereResults.length=0,!this.context.scene)return this.sphereResults;const r=this.sphereMask;r.enableAll(),r.disable(2);for(const a of this.context.scene.children)this.intersectSphere(a,e,t,r,this.sphereResults,i,n,o);return this.sphereResults.sort((a,l)=>a.distance-l.distance)}raycastFromRay(e,t=null){const i=t??this.defaultRaycastOptions;i.ray=e;const n=this.raycast(i);return i===this.defaultRaycastOptions&&(i.ray=void 0),n}raycast(e=null){It&&performance.mark("raycast.start"),e||(e=this.defaultRaycastOptions);const t=e.screenPoint??this.context.input.mousePositionRC,i=e.raycaster??this.raycaster;if(i.near=e.minDistance??0,i.far=e.maxDistance??1/0,i.params=this.defaultThresholds,e.lineThreshold===void 0&&(e.lineThreshold=-1),i.params.Line={threshold:e.lineThreshold},e.ray)i.ray.copy(e.ray);else{const a=e.cam??this.context.mainCamera;if(!a)return It&&console.error("Can not perform raycast - no main camera found"),this.defaultRaycastOptions.results&&(this.defaultRaycastOptions.results.length=0),this.defaultRaycastOptions.results??[];const l=this.context.xrCamera;this.context.isInXR&&l instanceof c.ArrayCamera&&l.cameras.length>0?i.setFromCamera(t,l.cameras[0]):i.setFromCamera(t,a)}let n=e.targets;n||(n=this.targetBuffer,n.length=1,n[0]=this.context.scene);let o=e.results;this.defaultRaycastOptions.results&&(this.defaultRaycastOptions.results.length=0),o||(this.defaultRaycastOptions.results||(this.defaultRaycastOptions.results=new Array),o=this.defaultRaycastOptions.results),e.layerMask!==void 0?e.layerMask instanceof c.Layers?i.layers.mask=e.layerMask.mask:i.layers.mask=e.layerMask:(i.layers.enableAll(),i.layers.disable(2)),It&&console.time("raycast"),o.length=0,_a._raycasting++,this.intersect(this.raycaster,n,o,e),o.sort((a,l)=>a.distance-l.distance);const r=e.ignore;return r!==void 0&&r.length>0&&(o=o.filter(a=>!r.includes(a.object))),_a._raycasting--,It&&(console.timeEnd("raycast"),console.warn("#"+this.context.time.frame+", hits:",o?.length?[...o]:"nothing"),performance.mark("raycast.end"),performance.measure("raycast","raycast.start","raycast.end")),o}intersect(e,t,i,n){for(const o of t){if(!o||o.visible===!1||B.isGizmo(o)||n.lineThreshold!==void 0&&n.lineThreshold<0&&o instanceof c.Line)continue;let r=!0;const a=o,l=a.geometry;if(o.raycastAllowed===!1&&(r=!1),r&&n.testObject){const h=n.testObject?.(o);if(h===!1)continue;h==="continue in children"&&(r=!1)}else r&&(l&&Ky(l)||(r=!1));if(r){const h=i.length,d=o.raycastPreference||"lod";let u=d!=="bounds";if(n.precise===!1&&(u=!1),l&&(u||=l.getAttribute("position")?.array?.length<64),a instanceof q.GroundedSkybox&&(u=!1),d==="lod"){const p=ne.getRaycastMesh(o);p&&(a.geometry=p)}if(!u&&hC(a,e,i)||(n.useAcceleratedRaycast!==!1?xd.runMeshBVHRaycast(e,a,i,this.context,n):e.intersectObject(a,!1,i)),a.geometry=l,It&&i.length!=h){const p=i[i.length-1];B.DrawWireSphere(p.point,.1,7798784,1,!1),B.DrawWireMesh({mesh:o,depthTest:!1,duration:.2,color:7798784})}}n.recursive!==!1&&this.intersect(e,o.children,i,n)}return i}tempBoundingBox=new c.Box3;intersectSphere(e,t,i,n,o,r,a,l){let h=e&&e.isMesh&&e.layers.test(n)&&!B.isGizmo(e);h&&=e.visible,h&&=!(e instanceof c.Line),h&&=!(e instanceof q.GroundedSkybox);const d=e,u=d.geometry;if(h&&l){const p=l(e);if(p===!1)return;p==="continue in children"&&(h=!1)}if(u&&Ky(u)||(h=!1),h){if(a){const p=this.sphere;p.center.copy(t),p.radius=i;const m=o.length;if(xd.runMeshBVHRaycast(this.sphere,d,o,this.context,{}),m!=o.length&&!r)return}else if(u.boundingBox||u.computeBoundingBox(),u.boundingBox){d.matrixWorldNeedsUpdate&&d.updateWorldMatrix(!1,!1);const p=this.tempBoundingBox.copy(u.boundingBox).applyMatrix4(d.matrixWorld),m=this.sphere;if(m.center.copy(t),m.radius=i,m.intersectsBox(p)){const y=X(e),_=y.distanceTo(m.center),g=new Am(e,_,y);if(o.push(g),!r)return}}}if(e.children)for(const p of e.children){const m=o.length;if(this.intersectSphere(p,t,i,n,o,r,a,l),m!=o.length&&!r)return}}}function Ky(s){return!(s.index&&s.index.array.length<3)}const Po=new c.Sphere,Ch=new c.Plane,cC=new c.Matrix3;function hC(s,e,t){const i=s._computeIntersections;if(!i)return!1;let n=s["_computeIntersections:Needle"];return n||(n=s["_computeIntersections:Needle"]=function(o,r,a){const l=this,h=l.geometry.boundingSphere;if(h){if(l instanceof q.GroundedSkybox){Ch.setFromNormalAndCoplanarPoint(j(0,1,0),j(0,-l.position.y,0)),Ch.applyMatrix4(l.matrixWorld,cC);const u=o.ray.intersectPlane(Ch,j());if(u){Po.copy(h),Po.applyMatrix4(l.matrixWorld);const m=j(u).sub(o.ray.origin).length(),y=Po.radius*.5;m<y&&r.push({distance:m,point:u,object:l,normal:Ch.normal.clone()})}return}Po.copy(h),Po.applyMatrix4(l.matrixWorld);const d=o.ray.intersectSphere(Po,j());if(d){const u=j(d).sub(o.ray.origin),p=u.length();if(p>Po.radius){const m=u.clone().normalize();r.push({distance:p,point:d,object:l,normal:m})}}}}),s._computeIntersections=n,e.intersectObject(s,!1,t),s._computeIntersections=i,!0}var xd;(s=>{let e=0;function t(b,v,R,O,k){if(!v.geometry||!v.geometry.hasAttribute("position"))return!1;const A=v.geometry;if(v?.isSkinnedMesh){const D=v,L=D.bvhNeedsUpdate;if(!D.staticGenerator)l(),r&&(D.staticGenerator=new r(v),D.staticGenerator.applyWorldTransforms=!1,D.staticGeometry=D.staticGenerator.generate(),A.boundsTree=a?.call(D.staticGeometry),D.staticGeometryLastUpdate=performance.now()+Math.random()*200,D.bvhNeedsUpdate=!0);else if(A.boundsTree&&(D.autoUpdateMeshBvhInterval!==void 0&&D.autoUpdateMeshBvhInterval>=0||L===!0)){const N=performance.now(),W=N-D.staticGeometryLastUpdate,E=D.autoUpdateMeshBvhInterval??100;(L||W>E)&&(It&&console.warn(`Physics: updating skinned mesh bvh for ${v.name} after ${W.toFixed(2)}ms`),D.bvhNeedsUpdate=!1,D.staticGeometryLastUpdate=N,D.staticGenerator?.generate(D.staticGeometry),A.boundsTree.refit())}}else if(!A.boundsTree){d||w();let D=!0;if((O.xr||A[y]===!1||A.getAttribute("position")?.isInterleavedBufferAttribute||A.index&&A.index?.isInterleavedBufferAttribute||e>10)&&(D=!1),D&&p){if(A[m]===void 0){let L=null;if(g.length>0){const N=g.shift();N&&!N.running&&(L=N)}if(!L&&_.length<3)try{L=new p,_.push(L)}catch(N){N instanceof DOMException&&N.name==="SecurityError"?(console.warn("Failed to create MeshBVH worker, falling back to main thread generation. This can happen when running from file://, if the browser does not support workers or if the browser is blocking workers for other reasons."),console.debug(N),e+=10):(console.error("Failed to create MeshBVH worker"),console.debug(N)),e++}if(L!=null&&!L.running){const N=v.name;It&&console.log("<<<< worker start",N,L),A[m]="queued",performance.mark("bvh.create.start");const W=A.clone();try{L.generate(W).then(E=>{A[m]="done",A.boundsTree=E}).catch(E=>{A[m]="failed - "+E?.message,A[y]=!1,It&&console.error("Failed to generate mesh bvh on worker",E)}).finally(()=>{It&&console.log(">>>>> worker done",N,{hasBoundsTre:A.boundsTree!=null}),g.push(L),W.dispose(),performance.mark("bvh.create.end"),performance.measure("bvh.create (worker)","bvh.create.start","bvh.create.end")})}catch(E){console.error("Failed to generate mesh bvh on worker",E)}}else It&&console.warn("No worker available")}}else(!u||!D)&&(l(),o&&(performance.mark("bvh.create.start"),A.boundsTree=new o(A),performance.mark("bvh.create.end"),performance.measure("bvh.create","bvh.create.start","bvh.create.end")))}if(b instanceof c.Raycaster){const D=b,L=v.raycast;if(A.boundsTree)l(),n&&(v.acceleratedRaycast||(v.acceleratedRaycast=n.bind(v),It&&console.debug(`Physics: bind acceleratedRaycast fn to "${v.name}"`)),v.raycast=v.acceleratedRaycast);else if(It&&console.warn("No bounds tree found for mesh",v.name,{workerTask:A[m],hasAcceleratedRaycast:n!=null}),k.allowSlowRaycastFallback===!1&&(A.getAttribute("position")?.array?.length??0)>2e3)return It&&console.warn("Skipping raycast because no bounds tree is available and allowSlowRaycastFallback is false"),!1;const N=D.firstHitOnly;return D.firstHitOnly=!1,D.intersectObject(v,!1,R),D.firstHitOnly=N,v.raycast=L,!0}else if(b instanceof c.Sphere){const D=A.boundsTree;if(D){const L=b;if(h.copy(v.matrixWorld).invert(),L.applyMatrix4(h),D.intersectsSphere(L)){const W=X(v),E=W.distanceTo(L.center),U=new Am(v,E,W);R.push(U)}}return!0}return!1}s.runMeshBVHRaycast=t;let i=!1,n=null,o=null,r=null,a=null;function l(){i||(i=!0,Promise.resolve().then(()=>require("./vendor-CAWj5cBK.umd.cjs")).then(b=>b.index$1).then(b=>{n=b.acceleratedRaycast,o=b.MeshBVH,r=b.StaticGeometryGenerator,a=b.computeBoundsTree}).catch(b=>{(It||T())&&console.error("Failed to load BVH library...",b.message)}))}const h=new c.Matrix4;let d=!1,u=!1,p=null;const m=Symbol("Needle:MeshBVH-Worker"),y=Symbol("Needle:MeshBVH-CanUseWorker"),_=[],g=[];function w(){d=!0,u=!0,Promise.resolve().then(()=>oT).then(b=>{p=b.GenerateMeshBVHWorker}).catch(b=>{It||T()?console.warn("Failed to setup mesh bvh worker"):console.debug("Failed to setup mesh bvh worker",b)}).finally(()=>{u=!1})}})(xd||(xd={}));const Zy=Symbol("gltf-loader-internal-usage-tracker"),dC=x("debugusers");class aa{get name(){return"NEEDLE_internal_usage_tracker"}static isLoading(e){return aa._loadingProcesses>0}static _loadingProcesses=0;parser;_getDependency;_loadingId;_loadedObjects=new Set;constructor(e){this.parser=e,this._getDependency=this.parser.getDependency,this._loadingId=Date.now().toString()}beforeRoot(){aa._loadingProcesses++;const e=this,t=this._getDependency;return this.parser.getDependency=function(i,n){const o=t.call(this,i,n);return o.then(r=>(r&&(e._loadedObjects.add(r),r[Zy]=e._loadingId),r)),o},null}afterRoot(e){aa._loadingProcesses--,this.parser.getDependency=this._getDependency;for(const t of this._loadedObjects)delete t[Zy],t instanceof c.Object3D&&(t.parent||t instanceof c.Mesh&&setTimeout(()=>{dC&&console.warn("> GLTF LOADER: Mesh not used in scene!",t),t.material=null,t.geometry=null},1e3));return null}}class f0{constructor(){window.addEventListener("unhandledrejection",e=>{if(e.defaultPrevented)return;const t=e?.reason?.path;if(t){const i=t[0];i&&i.tagName==="IMG"&&(console.warn(`Could not load image:
|
|
168
168
|
`+i.src),e.preventDefault())}})}}const Jd=x("trackresources");function p0(){return Jd==="dispose"}let dr=!0;Jd===0&&(dr=!1);function uC(s){dr=s}function m0(){return dr}const g0=Symbol("disposable");function y0(s,e){s&&(s[g0]=e,$o&&console.warn("Set disposable",e,s))}const _0=Symbol("disposed");function fC(s){return s[_0]===!0}function _e(s){if(s){if(s[g0]===!1){$o&&console.warn("Object is marked as not disposable",s);return}if(typeof s=="object"&&(s[_0]=!0),s instanceof c.Scene)_e(s.environment),_e(s.background),_e(s.customDepthMaterial),_e(s.customDistanceMaterial);else if(s instanceof c.SkinnedMesh)_e(s.geometry),_e(s.material),_e(s.skeleton),_e(s.bindMatrix),_e(s.bindMatrixInverse),_e(s.customDepthMaterial),_e(s.customDistanceMaterial),s.visible=!1;else if(s instanceof c.Mesh)_e(s.geometry),_e(s.material),_e(s.customDepthMaterial),_e(s.customDistanceMaterial),s.visible=!1;else if(s instanceof c.Object3D)s.visible=!1;else if(s instanceof c.BufferGeometry){Ir(s);for(const e of Object.keys(s.attributes)){const t=s.attributes[e];_e(t)}}else if(s instanceof c.BufferAttribute||s instanceof c.InterleavedBufferAttribute)$o&&console.warn("BufferAttribute dispose not supported",s.count);else if(s instanceof Array)for(const e of s)e instanceof c.Material&&_e(e);else if(s instanceof c.Material){Ir(s);for(const t of Object.keys(s)){const i=s[t];i instanceof c.Texture&&_e(i)}const e=s.uniforms;if(e)for(const t of Object.keys(e)){const i=e[t];i instanceof c.Texture?_e(i):i instanceof c.Uniform$1&&_e(i.value)}}else s instanceof c.Texture?(Ir(s),Ir(s.source),s.source?.data instanceof ImageBitmap&&Ir(s.source.data)):s instanceof c.Skeleton?(Ir(s.boneTexture),s.boneTexture=null):s instanceof c.Bone||!(s instanceof c.Object3D)&&$o&&console.warn("Unknown object type",s)}}function Ir(s){s&&(($o||p0()||Jd)&&console.warn("🧨 FREE",s),s instanceof ImageBitmap||"dispose"in s&&typeof s.dispose=="function"&&s.dispose())}function pC(s){}const mC=new Set;function Dm(s,e,t=null,i){if(i||(i=mC,i.clear()),!s)return i;const n=s[ic];if(n)for(const o of n)i.has(o)||t?.call(null,o)!==!1&&(i.add(o),e&&Dm(o,!0,t,i));return i}function gC(s){return s[Sl]}const $o=x("debugresourceusers")||x("debugmemory"),ic=Symbol("needle-resource-users"),Sl=Symbol("needle-resource-users-count");function Rt(s,e){Yd(s,e,function(t,i){dr&&!_a.raycasting&&(Sd(ic,this,t,!1),Sd(ic,this,i,!0))})}dr&&(Rt(c.Mesh.prototype,"material"),Rt(c.Mesh.prototype,"geometry"),Rt(c.Material.prototype,"map"),Rt(c.Material.prototype,"bumpMap"),Rt(c.Material.prototype,"alphaMap"),Rt(c.Material.prototype,"normalMap"),Rt(c.Material.prototype,"displacementMap"),Rt(c.Material.prototype,"roughnessMap"),Rt(c.Material.prototype,"metalnessMap"),Rt(c.Material.prototype,"emissiveMap"),Rt(c.Material.prototype,"specularMap"),Rt(c.Material.prototype,"envMap"),Rt(c.Material.prototype,"lightMap"),Rt(c.Material.prototype,"aoMap"),Rt(c.Material.prototype,"gradientMap"));function yC(s){if(dr===!1)return;const e=s[ic];if(e)for(const t of e)Sd(ic,t,s,!1)}dr&&Yd(c.Material.prototype,"dispose",function(){yC(this)});let xp=0;function Sd(s,e,t,i){if(xp>0)return;if(Array.isArray(t)){for(const o of t)Sd(s,e,o,i);return}if(!t)return;let n=t[s];if(n||(n=new Set),i){if(e&&!n.has(e)){n.add(e);let o=t[Sl]||0;o+=1,t[Sl]=o,$o&&console.warn(`🟢 Added user of "${t.type}"`,e,t,o,"users:",n)}}else if(e&&n.has(e)){n.delete(e);let o=t[Sl]||0;o>0&&(o-=1,t[Sl]=o),$o&&console.warn(`🔴 Removed user of "${t.type}"`,e,t,o,"users:",n),o<=0&&(aa.isLoading(t)||(Jd&&console.warn(`🔴 Removed all user of "${t.type}"`,t),p0()&&_e(t)))}t[s]=n}try{Yd(c.WebGLRenderer.prototype,"render",function(){xp++},function(){xp--})}catch(s){console.warn("Could not wrap WebGLRenderer.render",s)}const Jy=x("debugcomponentevents");class eu{static eventListeners=new Map;static addComponentLifecylceEventListener(e,t){this.eventListeners.has(e)&&this.eventListeners.set(e,[]);let i=this.eventListeners.get(e);i||(i=[]),i.push(t),this.eventListeners.set(e,i),Jy&&console.log("Added event listener for "+e,this.eventListeners)}static removeComponentLifecylceEventListener(e,t){const i=this.eventListeners.get(e);if(!i)return;const n=i.indexOf(t);n<0||i.splice(n,1)}static dispatchComponentLifecycleEvent(e,t){const i=this.eventListeners.get(e);if(Jy&&console.log("Dispatching event "+e,i),!!i)for(const n of i)n(t)}}const nc=Symbol("NEEDLE_NEED_UPDATE_INSTANCE"),b0=Symbol("isUsingInstancing"),v0=Symbol("instancingRenderer"),Cl=Symbol("instancingAutoUpdateBounds");class Di{static isUsingInstancing(e){return e[b0]===!0}static getRenderer(e){return e[v0]||null}setAutoUpdateBounds(e,t){const i=Di.getRenderer(e);i&&(i[Cl]=t)}static markDirty(e,t=!0){if(e&&(this.isUsingInstancing(e)&&(e[nc]=!0,e.matrixWorldNeedsUpdate=!0),t))for(const i of e.children)Di.markDirty(i,!0)}}exports.NEEDLE_ENGINE_FEATURE_FLAGS=void 0;(s=>{s.experimentalSmartHierarchyUpdate=!1})(exports.NEEDLE_ENGINE_FEATURE_FLAGS||(exports.NEEDLE_ENGINE_FEATURE_FLAGS={}));function la(s,e){try{e||s()}catch(t){return console.error(t),!1}return!0}const Sp=x("debugnewscripts"),_C=x("debughierarchy"),we=[];function bC(){return we.length>0}function Cd(s){if(Sp&&console.log("Register new components",s.new_scripts.length,[...s.new_scripts],s.alias?"element: "+s.alias:s.hash,s),s.new_scripts_pre_setup_callbacks.length>0){for(const e of s.new_scripts_pre_setup_callbacks)e&&e();s.new_scripts_pre_setup_callbacks.length=0}if(!(s.new_scripts.length<=0)){we.length=0,s.new_scripts.length>0&&we.push(...s.new_scripts),s.new_scripts.length=0;for(let e=0;e<we.length;e++)try{const t=we[e];if(t.isComponent!==!0){(T()||Sp)&&console.error(`Registered script is not a Needle Engine component.
|
|
169
169
|
The script will be ignored. Please make sure your component extends "Behaviour" imported from "@needle-tools/engine"
|
|
170
170
|
`,t),we.splice(e,1),e--;continue}if(t.destroyed)continue;if(!t.gameObject){console.warn(`Component can not be initialized: no GameObject assigned.
|
|
@@ -1427,8 +1427,8 @@ C) Set "joinRandomRoom" to true`),!1):(np&&console.log("Join "+this.roomName),th
|
|
|
1427
1427
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
1428
1428
|
* See the License for the specific language governing permissions and
|
|
1429
1429
|
* limitations under the License.
|
|
1430
|
-
*/const sR={topLight:{intensity:500,position:[.418,16.199,.3]},room:{position:[-.757,13.219,.717],scale:[31.713,28.305,28.591]},boxes:[{position:[-10.906,2.009,1.846],rotation:-.195,scale:[2.328,7.905,4.651]},{position:[-5.607,-.754,-.758],rotation:.994,scale:[1.97,1.534,3.955]},{position:[6.167,.857,7.803],rotation:.561,scale:[3.927,6.285,3.687]},{position:[-2.017,.018,6.124],rotation:.333,scale:[2.002,4.566,2.064]},{position:[2.291,-.756,-2.621],rotation:-.286,scale:[1.546,1.552,1.496]},{position:[-2.193,-.369,-5.547],rotation:.516,scale:[3.875,3.487,2.986]}],lights:[{intensity:50,position:[-16.116,14.37,8.208],scale:[.1,2.428,2.739]},{intensity:50,position:[-16.109,18.021,-8.207],scale:[.1,2.425,2.751]},{intensity:17,position:[14.904,12.198,-1.832],scale:[.15,4.265,6.331]},{intensity:43,position:[-.462,8.89,14.52],scale:[4.38,5.441,.088]},{intensity:20,position:[3.235,11.486,-12.541],scale:[2.5,2,.1]},{intensity:100,position:[0,20,0],scale:[1,.1,1]}]},oR={topLight:{intensity:400,position:[.5,14,.5]},room:{position:[0,13.2,0],scale:[31.5,28.5,31.5]},boxes:[{position:[-10.906,-1,1.846],rotation:-.195,scale:[2.328,7.905,4.651]},{position:[-5.607,-.754,-.758],rotation:.994,scale:[1.97,1.534,3.955]},{position:[6.167,-.16,7.803],rotation:.561,scale:[3.927,6.285,3.687]},{position:[-2.017,.018,6.124],rotation:.333,scale:[2.002,4.566,2.064]},{position:[2.291,-.756,-2.621],rotation:-.286,scale:[1.546,1.552,1.496]},{position:[-2.193,-.369,-5.547],rotation:.516,scale:[3.875,3.487,2.986]}],lights:[{intensity:80,position:[-14,10,8],scale:[.1,2.5,2.5]},{intensity:80,position:[-14,14,-4],scale:[.1,2.5,2.5]},{intensity:23,position:[14,12,0],scale:[.1,5,5]},{intensity:16,position:[0,9,14],scale:[5,5,.1]},{intensity:80,position:[7,8,-14],scale:[2.5,2.5,.1]},{intensity:80,position:[-7,16,-14],scale:[2.5,2.5,.1]},{intensity:1,position:[0,20,0],scale:[.1,.1,.1]}]};class Xu extends c.Scene{constructor(e){super(),this.position.y=-3.5;const t=new c.BoxGeometry;t.deleteAttribute("uv");const i=new c.MeshStandardMaterial({metalness:0,side:c.BackSide}),n=new c.MeshStandardMaterial({metalness:0}),o=e=="legacy"?sR:oR,r=new c.PointLight(16777215,o.topLight.intensity,28,2);r.position.set(...o.topLight.position),this.add(r);const a=new c.Mesh(t,i);a.position.set(...o.room.position),a.scale.set(...o.room.scale),this.add(a);for(const l of o.boxes){const h=new c.Mesh(t,n);h.position.set(...l.position),h.rotation.set(0,l.rotation,0),h.scale.set(...l.scale),this.add(h)}for(const l of o.lights){const h=new c.Mesh(t,this.createAreaLightMaterial(l.intensity));h.position.set(...l.position),h.scale.set(...l.scale),this.add(h)}}createAreaLightMaterial(e){const t=new c.MeshBasicMaterial;return t.color.setScalar(e),t}}var rR=Object.defineProperty,Qu=(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&&rR(e,t,n),n};const fh=class qw extends M{target;invertForward=!1;keepUpDirection=!0;copyTargetRotation=!1;static flipYQuat=new c.Quaternion().setFromAxisAngle(new c.Vector3(0,1,0),Math.PI);onBeforeRender(){let e=this.target;if(e||(e=this.context.mainCamera,T()&&!this.__did_warn&&(this.__did_warn=!0,console.debug(`[LookAt] No target set on ${this.name}, using main camera as target.`))),!e)return;let t=this.copyTargetRotation;(this.context.isInVR||this.context.isInPassThrough)&&(t=!1),wc(this.gameObject,e,this.keepUpDirection,t),this.invertForward&&this.gameObject.quaternion.multiply(qw.flipYQuat)}createBehaviours(e,t,i){if(t.uuid===this.gameObject.uuid){let n=t;if(this.keepUpDirection){const r=Ne.createEmptyParent(t);n=r;const a=this.invertForward?-1:1;r.setMatrix(r.getMatrix().multiply(new c.Matrix4().makeRotationZ(Math.PI/2*a))),t.setMatrix(t.getMatrix().multiply(new c.Matrix4().makeRotationZ(-Math.PI/2*a)))}const o=new gt("lookat "+this.name,St.sceneStartTrigger(),le.lookAtCameraAction(n,void 0,this.invertForward?Ai.back:Ai.forward,this.keepUpDirection?Ai.up:Ai.zero));e.addBehavior(o)}}};Qu([f(c.Object3D)],fh.prototype,"target");Qu([f()],fh.prototype,"invertForward");Qu([f()],fh.prototype,"keepUpDirection");Qu([f()],fh.prototype,"copyTargetRotation");let uy=fh;var aR=Object.defineProperty,fy=(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&&aR(e,t,n),n};class Xa extends M{url;mode=0;clickable=!0;async open(){if(!this.url){console.warn("OpenURL: URL is not set, can't open.",this);return}this._validateUrl();let e=this.url;switch(!e.startsWith("mailto:")&&e.includes("@")&&(e="mailto:"+e),T()&&Ce("Open URL: "+e),this.mode){case 0:exports.DeviceUtilities.isSafari(),globalThis.open(e,"_blank");break;case 1:exports.DeviceUtilities.isSafari()&&exports.DeviceUtilities.isiOS()?globalThis.open(e,"_top"):globalThis.open(e,"_self");break;case 2:exports.DeviceUtilities.isSafari()?globalThis.open(e,"_top"):globalThis.open(e,"_new");break}}start(){this.gameObject.getComponentInParent(fi)||this.gameObject.addComponent(fi)}onPointerEnter(e){!e.used&&this.clickable&&this.context.input.setCursor("pointer")}onPointerExit(){this.clickable&&this.context.input.unsetCursor("pointer")}onPointerClick(e){this.clickable&&!e.used&&this.url?.length&&this.open()}_validateUrl(){this.url&&this.url.startsWith("www.")&&(T()&&console.warn("URL is not valid, adding https:// to the start of the URL",this.url),this.url="https://"+this.url)}}fy([f()],Xa.prototype,"url");fy([f()],Xa.prototype,"mode");fy([f()],Xa.prototype,"clickable");au(s=>{const e=s.domElement.getAttribute("clickthrough");if(t(e)){const i=s.scene.addComponent(Yu);cm(s.domElement,"clickthrough",()=>{const n=s.domElement.getAttribute("clickthrough");i.enabled=t(n)})}function t(i){return i!==null&&i!=="0"&&i!=="false"}});class Yu extends M{_previousPointerEvents="all";onEnable(){this.context.input.addEventListener("pointerdown",this.onPointerEvent),this.context.input.addEventListener("pointermove",this.onPointerEvent,{queue:100}),window.addEventListener("touchstart",this.onTouchStart,{passive:!0}),window.addEventListener("touchend",this.onTouchEnd,{passive:!0}),this._previousPointerEvents=this.context.domElement.style.pointerEvents}onDisable(){this.context.input.removeEventListener("pointerdown",this.onPointerEvent),this.context.input.removeEventListener("pointermove",this.onPointerEvent),window.removeEventListener("touchstart",this.onTouchStart),window.removeEventListener("touchend",this.onTouchEnd),this.context.domElement.style.pointerEvents=this._previousPointerEvents}onPointerEnter(){}onPointerEvent=e=>{if(e.pointerId>0)return;e.intersections?.length<=0?this.context.domElement.style.pointerEvents="none":this.context.domElement.style.pointerEvents="all"};_touchDidHitAnything=!1;onTouchStart=e=>{const t=e.touches[0];if(!t)return;const i=t.clientX/window.innerWidth*2-1,n=-(t.clientY/window.innerHeight)*2+1;this.context.physics.raycast({screenPoint:new c.Vector2(i,n)}).length>0&&(this._touchDidHitAnything=!0)};onTouchEnd=e=>{const t=this._touchDidHitAnything;this._touchDidHitAnything=!1,setTimeout(()=>{t&&(this.context.domElement.style.pointerEvents="all")},100)}}var lR=Object.defineProperty,Ku=(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&&lR(e,t,n),n};const cR=x("debugcursor");class Dr extends M{damping=0;useFullPage=!0;keepDistance=!0;snapToSurface=!1;_distance=-1;updateDistance(e=!1){!e&&this.keepDistance&&this._distance!==-1||(this._distance=this.gameObject.worldPosition.distanceTo(this.context.mainCamera.worldPosition))}awake(){this._distance=-1}onEnable(){this._distance=-1,window.addEventListener("pointermove",this._onPointerMove)}onDisable(){window.removeEventListener("pointermove",this._onPointerMove)}_ndc_x=0;_ndc_y=0;_onPointerMove=e=>{if(!this.useFullPage)return;const t=e.clientX,i=e.clientY,n=this.context.domX,o=this.context.domY,r=this.context.domWidth,a=this.context.domHeight;this._ndc_x=(t-n)/r*2-1,this._ndc_y=-(i-o)/a*2+1};lateUpdate(){this.updateDistance();const e=this.useFullPage?this._ndc_x:this.context.input.mousePositionRC.x,t=this.useFullPage?this._ndc_y:this.context.input.mousePositionRC.y,i=this.context.mainCamera,n=i.worldPosition,o=j(e,t,1).unproject(i);o.sub(n).normalize();const r=j(o).multiplyScalar(this._distance).add(n);let a=r;if(this.damping>0){const l=this.gameObject.worldPosition;l.lerp(r,this.context.time.deltaTime/this.damping),this.gameObject.worldPosition=l,a=l}else this.gameObject.worldPosition=r;if(this.snapToSurface){sp.origin=a,sp.direction=o.multiplyScalar(-1);const l=this.context.physics.raycastFromRay(sp);if(l?.length){const h=l[0];this.damping>0?this.gameObject.worldPosition=a.lerp(h.point,this.context.time.deltaTime/this.damping):this.gameObject.worldPosition=h.point,cR&&B.DrawLine(h.point,h.normal.add(h.point),65280)}}}}Ku([f()],Dr.prototype,"damping");Ku([f()],Dr.prototype,"useFullPage");Ku([f()],Dr.prototype,"keepDistance");Ku([f()],Dr.prototype,"snapToSurface");const sp=new c.Ray;var hR=Object.defineProperty,dR=Object.getOwnPropertyDescriptor,Qa=(s,e,t,i)=>{for(var n=i>1?void 0:i?dR(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&&hR(e,t,n),n};exports.HoverAnimation=class extends M{type="linear";duration=.1;scaleFactor=1.1;hovered=null;idle=null;animation=null;start(){this.idle||(this.idle=eo.emptyClip()),(!this.hovered||!(this.hovered instanceof c.AnimationClip))&&(this.hovered=eo.createScaleClip({type:"linear",duration:this.duration||.1,scale:this.gameObject.scale,scaleFactor:this.scaleFactor||1.1})),this.animation??=this.gameObject.addComponent(Ct),this.animation.playAutomatically=!1,this.playIdle()}onEnable(){this.animation&&(this.animation.enabled=!0),this.playIdle()}onDisable(){this.animation&&(this.animation.enabled=!1),this.playIdle()}onPointerEnter(){this.playHover()}onPointerExit(){this.playIdle()}playIdle(){this.idle&&this.animation?.play(this.idle,{exclusive:!0,fadeDuration:.1,loop:!0})}playHover(){this.hovered&&this.animation?.play(this.hovered,{exclusive:!0,fadeDuration:.1,loop:!1,clampWhenFinished:!0})}};Qa([f()],exports.HoverAnimation.prototype,"type",2);Qa([f()],exports.HoverAnimation.prototype,"duration",2);Qa([f()],exports.HoverAnimation.prototype,"scaleFactor",2);Qa([f(c.AnimationClip)],exports.HoverAnimation.prototype,"hovered",2);Qa([f(c.AnimationClip)],exports.HoverAnimation.prototype,"idle",2);exports.HoverAnimation=Qa([Bm],exports.HoverAnimation);var uR=Object.defineProperty,Ya=(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&&uR(e,t,n),n};const ul=x("debugscroll");class Ss extends M{target=null;damping=0;invert=!1;htmlSelector=null;mode="window";changed=new oe;get currentValue(){return this._current_value}_current_value=0;_target_value=0;_appliedValue=-1;onEnable(){window.addEventListener("wheel",this.updateCurrentScrollValue,{passive:!0}),this._appliedValue=-1}onDisable(){window.removeEventListener("wheel",this.updateCurrentScrollValue)}lateUpdate(){if(this.updateCurrentScrollValue(),this._target_value>=0&&(this.damping>0?(this._current_value=I.lerp(this._current_value,this._target_value,this.context.time.deltaTime/this.damping),Math.abs(this._current_value-this._target_value)<.001&&(this._current_value=this._target_value)):this._current_value=this._target_value),this._current_value!==this._appliedValue){this._appliedValue=this._current_value;let e=!1;if(this.changed.listenerCount>0){const t={type:"change",value:this._current_value,component:this,preventDefault:()=>{t.defaultPrevented=!0},defaultPrevented:!1};this.changed.invoke(t),e=t.defaultPrevented}if(!e){const t=this.invert?1-this._current_value:this._current_value;Array.isArray(this.target)?this.target.forEach(i=>i&&this.applyScroll(i,t)):this.target&&this.applyScroll(this.target,t),ul&&this.context.time.frame%30===0&&console.debug(`[ScrollFollow] ${this._current_value.toFixed(5)} — ${(this._target_value*100).toFixed(0)}%, targets [${Array.isArray(this.target)?this.target.length:1}]`)}}}_lastSelectorValue=null;_lastSelectorElement=null;updateCurrentScrollValue=()=>{switch(this.mode){case"window":if(this.htmlSelector?.length){if(this.htmlSelector!==this._lastSelectorValue&&(this._lastSelectorElement=document.querySelector(this.htmlSelector),this._lastSelectorValue=this.htmlSelector),this._lastSelectorElement){const e=this._lastSelectorElement.getBoundingClientRect();this._target_value=-e.top/(e.height-window.innerHeight);break}}else if(!(window.document.body.scrollHeight<=window.innerHeight)){const e=window.document.body.scrollHeight-window.innerHeight;this._target_value=window.scrollY/(e||1)}break}(isNaN(this._target_value)||!isFinite(this._target_value))&&(this._target_value=-1)};applyScroll(e,t){if(e)if(e instanceof lr)this.handleTimelineTarget(e,t),e.isPlaying&&e.pause(),e.evaluate();else if(e instanceof rt)e.setFloat("scroll",t);else if(e instanceof Ct)e.time=t*e.duration;else if(e instanceof pi){if(!e.duration)return;e.time=t*e.duration}else if(e instanceof Wi)e.position01=t;else if(e instanceof ii)e.intensity=t;else if(e instanceof c.Object3D){const i=e;i["needle:scrollbounds"]===void 0&&(i["needle:scrollbounds"]=Ft(e)||null);const n=i["needle:scrollbounds"];n&&(e.position.y=-n.min.y-t*(n.max.y-n.min.y))}else"scroll"in e&&(typeof e.scroll=="number"?e.scroll=t:typeof e.scroll=="function"&&e.scroll(t))}handleTimelineTarget(e,t){const i=e.duration;let n=db.get(e);if(!n){n=[],db.set(e,n);let l=0;for(const h of e.foreachMarker("ScrollMarker")){const d=l++;if(h.element===void 0||h.needsUpdate===!0||h.element&&!h.element?.parentNode){h.needsUpdate=!1;try{if(h.element=Xw(d),ul&&console.debug(`ScrollMarker #${d} (${h.time.toFixed(2)}) found`,h.element),!h.element){(ul||T())&&console.warn(`No HTML element found for ScrollMarker: ${h.name} (index ${d})`);continue}}catch(u){h.element=null,console.error("ScrollMarker selector is not valid: "+h.name+`
|
|
1431
|
-
`,u)}}h.element&&n.push(h)}n.length<=0&&document.querySelectorAll("[data-timeline-marker]").forEach(d=>{const u=d.getAttribute("data-timeline-marker"),p=parseFloat(u||"NaN");isNaN(p)?(T()||ul)&&console.warn('[ScrollFollow] data-timeline-marker attribute is not a valid number. Supported are numbers only (e.g. <div data-timeline-marker="0.5">)'):n.push({time:p,element:d})});for(const h of n)h.element&&(h.timeline=new ViewTimeline({subject:h.element,axis:"block"}))}yn.length=0;let o=0;const r=1/60;let a=0;for(let l=0;l<n.length;l++){const h=n[l];if(!h.element)continue;const d=n[l+1],u=d?d.time-r:i;a+=1;const p=h.timeline;if(p){const m=fR(p),y=1-Math.abs(m-.5)*2,_=`marker${l}`;if(m>0&&m<=1){const g=h.time+(u-h.time)*m;yn.push({name:_,time:g,weight:y}),o+=y}else l===0&&m<=0?(yn.push({name:_,time:0,weight:1}),o+=1):l===n.length-1&&m>=1&&(yn.push({name:_,time:i,weight:1}),o+=1)}}if(yn.length<=0&&a<=0)e.time=t*i;else if(yn.length>0){let l=yn[0].time;if(yn.length>1)for(const
|
|
1430
|
+
*/const sR={topLight:{intensity:500,position:[.418,16.199,.3]},room:{position:[-.757,13.219,.717],scale:[31.713,28.305,28.591]},boxes:[{position:[-10.906,2.009,1.846],rotation:-.195,scale:[2.328,7.905,4.651]},{position:[-5.607,-.754,-.758],rotation:.994,scale:[1.97,1.534,3.955]},{position:[6.167,.857,7.803],rotation:.561,scale:[3.927,6.285,3.687]},{position:[-2.017,.018,6.124],rotation:.333,scale:[2.002,4.566,2.064]},{position:[2.291,-.756,-2.621],rotation:-.286,scale:[1.546,1.552,1.496]},{position:[-2.193,-.369,-5.547],rotation:.516,scale:[3.875,3.487,2.986]}],lights:[{intensity:50,position:[-16.116,14.37,8.208],scale:[.1,2.428,2.739]},{intensity:50,position:[-16.109,18.021,-8.207],scale:[.1,2.425,2.751]},{intensity:17,position:[14.904,12.198,-1.832],scale:[.15,4.265,6.331]},{intensity:43,position:[-.462,8.89,14.52],scale:[4.38,5.441,.088]},{intensity:20,position:[3.235,11.486,-12.541],scale:[2.5,2,.1]},{intensity:100,position:[0,20,0],scale:[1,.1,1]}]},oR={topLight:{intensity:400,position:[.5,14,.5]},room:{position:[0,13.2,0],scale:[31.5,28.5,31.5]},boxes:[{position:[-10.906,-1,1.846],rotation:-.195,scale:[2.328,7.905,4.651]},{position:[-5.607,-.754,-.758],rotation:.994,scale:[1.97,1.534,3.955]},{position:[6.167,-.16,7.803],rotation:.561,scale:[3.927,6.285,3.687]},{position:[-2.017,.018,6.124],rotation:.333,scale:[2.002,4.566,2.064]},{position:[2.291,-.756,-2.621],rotation:-.286,scale:[1.546,1.552,1.496]},{position:[-2.193,-.369,-5.547],rotation:.516,scale:[3.875,3.487,2.986]}],lights:[{intensity:80,position:[-14,10,8],scale:[.1,2.5,2.5]},{intensity:80,position:[-14,14,-4],scale:[.1,2.5,2.5]},{intensity:23,position:[14,12,0],scale:[.1,5,5]},{intensity:16,position:[0,9,14],scale:[5,5,.1]},{intensity:80,position:[7,8,-14],scale:[2.5,2.5,.1]},{intensity:80,position:[-7,16,-14],scale:[2.5,2.5,.1]},{intensity:1,position:[0,20,0],scale:[.1,.1,.1]}]};class Xu extends c.Scene{constructor(e){super(),this.position.y=-3.5;const t=new c.BoxGeometry;t.deleteAttribute("uv");const i=new c.MeshStandardMaterial({metalness:0,side:c.BackSide}),n=new c.MeshStandardMaterial({metalness:0}),o=e=="legacy"?sR:oR,r=new c.PointLight(16777215,o.topLight.intensity,28,2);r.position.set(...o.topLight.position),this.add(r);const a=new c.Mesh(t,i);a.position.set(...o.room.position),a.scale.set(...o.room.scale),this.add(a);for(const l of o.boxes){const h=new c.Mesh(t,n);h.position.set(...l.position),h.rotation.set(0,l.rotation,0),h.scale.set(...l.scale),this.add(h)}for(const l of o.lights){const h=new c.Mesh(t,this.createAreaLightMaterial(l.intensity));h.position.set(...l.position),h.scale.set(...l.scale),this.add(h)}}createAreaLightMaterial(e){const t=new c.MeshBasicMaterial;return t.color.setScalar(e),t}}var rR=Object.defineProperty,Qu=(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&&rR(e,t,n),n};const fh=class qw extends M{target;invertForward=!1;keepUpDirection=!0;copyTargetRotation=!1;static flipYQuat=new c.Quaternion().setFromAxisAngle(new c.Vector3(0,1,0),Math.PI);onBeforeRender(){let e=this.target;if(e||(e=this.context.mainCamera,T()&&!this.__did_warn&&(this.__did_warn=!0,console.debug(`[LookAt] No target set on ${this.name}, using main camera as target.`))),!e)return;let t=this.copyTargetRotation;(this.context.isInVR||this.context.isInPassThrough)&&(t=!1),wc(this.gameObject,e,this.keepUpDirection,t),this.invertForward&&this.gameObject.quaternion.multiply(qw.flipYQuat)}createBehaviours(e,t,i){if(t.uuid===this.gameObject.uuid){let n=t;if(this.keepUpDirection){const r=Ne.createEmptyParent(t);n=r;const a=this.invertForward?-1:1;r.setMatrix(r.getMatrix().multiply(new c.Matrix4().makeRotationZ(Math.PI/2*a))),t.setMatrix(t.getMatrix().multiply(new c.Matrix4().makeRotationZ(-Math.PI/2*a)))}const o=new gt("lookat "+this.name,St.sceneStartTrigger(),le.lookAtCameraAction(n,void 0,this.invertForward?Ai.back:Ai.forward,this.keepUpDirection?Ai.up:Ai.zero));e.addBehavior(o)}}};Qu([f(c.Object3D)],fh.prototype,"target");Qu([f()],fh.prototype,"invertForward");Qu([f()],fh.prototype,"keepUpDirection");Qu([f()],fh.prototype,"copyTargetRotation");let uy=fh;var aR=Object.defineProperty,fy=(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&&aR(e,t,n),n};class Xa extends M{url;mode=0;clickable=!0;async open(){if(!this.url){console.warn("OpenURL: URL is not set, can't open.",this);return}this._validateUrl();let e=this.url;switch(!e.startsWith("mailto:")&&e.includes("@")&&(e="mailto:"+e),T()&&Ce("Open URL: "+e),this.mode){case 0:exports.DeviceUtilities.isSafari(),globalThis.open(e,"_blank");break;case 1:exports.DeviceUtilities.isSafari()&&exports.DeviceUtilities.isiOS()?globalThis.open(e,"_top"):globalThis.open(e,"_self");break;case 2:exports.DeviceUtilities.isSafari()?globalThis.open(e,"_top"):globalThis.open(e,"_new");break}}start(){this.gameObject.getComponentInParent(fi)||this.gameObject.addComponent(fi)}onPointerEnter(e){!e.used&&this.clickable&&this.context.input.setCursor("pointer")}onPointerExit(){this.clickable&&this.context.input.unsetCursor("pointer")}onPointerClick(e){this.clickable&&!e.used&&this.url?.length&&this.open()}_validateUrl(){this.url&&this.url.startsWith("www.")&&(T()&&console.warn("URL is not valid, adding https:// to the start of the URL",this.url),this.url="https://"+this.url)}}fy([f()],Xa.prototype,"url");fy([f()],Xa.prototype,"mode");fy([f()],Xa.prototype,"clickable");au(s=>{const e=s.domElement.getAttribute("clickthrough");if(t(e)){const i=s.scene.addComponent(Yu);cm(s.domElement,"clickthrough",()=>{const n=s.domElement.getAttribute("clickthrough");i.enabled=t(n)})}function t(i){return i!==null&&i!=="0"&&i!=="false"}});class Yu extends M{_previousPointerEvents="all";onEnable(){this.context.input.addEventListener("pointerdown",this.onPointerEvent),this.context.input.addEventListener("pointermove",this.onPointerEvent,{queue:100}),window.addEventListener("touchstart",this.onTouchStart,{passive:!0}),window.addEventListener("touchend",this.onTouchEnd,{passive:!0}),this._previousPointerEvents=this.context.domElement.style.pointerEvents}onDisable(){this.context.input.removeEventListener("pointerdown",this.onPointerEvent),this.context.input.removeEventListener("pointermove",this.onPointerEvent),window.removeEventListener("touchstart",this.onTouchStart),window.removeEventListener("touchend",this.onTouchEnd),this.context.domElement.style.pointerEvents=this._previousPointerEvents}onPointerEnter(){}onPointerEvent=e=>{if(e.pointerId>0)return;e.intersections?.length<=0?this.context.domElement.style.pointerEvents="none":this.context.domElement.style.pointerEvents="all"};_touchDidHitAnything=!1;onTouchStart=e=>{const t=e.touches[0];if(!t)return;const i=t.clientX/window.innerWidth*2-1,n=-(t.clientY/window.innerHeight)*2+1;this.context.physics.raycast({screenPoint:new c.Vector2(i,n)}).length>0&&(this._touchDidHitAnything=!0)};onTouchEnd=e=>{const t=this._touchDidHitAnything;this._touchDidHitAnything=!1,setTimeout(()=>{t&&(this.context.domElement.style.pointerEvents="all")},100)}}var lR=Object.defineProperty,Ku=(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&&lR(e,t,n),n};const cR=x("debugcursor");class Dr extends M{damping=0;useFullPage=!0;keepDistance=!0;snapToSurface=!1;_distance=-1;updateDistance(e=!1){!e&&this.keepDistance&&this._distance!==-1||(this._distance=this.gameObject.worldPosition.distanceTo(this.context.mainCamera.worldPosition))}awake(){this._distance=-1}onEnable(){this._distance=-1,window.addEventListener("pointermove",this._onPointerMove)}onDisable(){window.removeEventListener("pointermove",this._onPointerMove)}_ndc_x=0;_ndc_y=0;_onPointerMove=e=>{if(!this.useFullPage)return;const t=e.clientX,i=e.clientY,n=this.context.domX,o=this.context.domY,r=this.context.domWidth,a=this.context.domHeight;this._ndc_x=(t-n)/r*2-1,this._ndc_y=-(i-o)/a*2+1};lateUpdate(){this.updateDistance();const e=this.useFullPage?this._ndc_x:this.context.input.mousePositionRC.x,t=this.useFullPage?this._ndc_y:this.context.input.mousePositionRC.y,i=this.context.mainCamera,n=i.worldPosition,o=j(e,t,1).unproject(i);o.sub(n).normalize();const r=j(o).multiplyScalar(this._distance).add(n);let a=r;if(this.damping>0){const l=this.gameObject.worldPosition;l.lerp(r,this.context.time.deltaTime/this.damping),this.gameObject.worldPosition=l,a=l}else this.gameObject.worldPosition=r;if(this.snapToSurface){sp.origin=a,sp.direction=o.multiplyScalar(-1);const l=this.context.physics.raycastFromRay(sp);if(l?.length){const h=l[0];this.damping>0?this.gameObject.worldPosition=a.lerp(h.point,this.context.time.deltaTime/this.damping):this.gameObject.worldPosition=h.point,cR&&B.DrawLine(h.point,h.normal.add(h.point),65280)}}}}Ku([f()],Dr.prototype,"damping");Ku([f()],Dr.prototype,"useFullPage");Ku([f()],Dr.prototype,"keepDistance");Ku([f()],Dr.prototype,"snapToSurface");const sp=new c.Ray;var hR=Object.defineProperty,dR=Object.getOwnPropertyDescriptor,Qa=(s,e,t,i)=>{for(var n=i>1?void 0:i?dR(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&&hR(e,t,n),n};exports.HoverAnimation=class extends M{type="linear";duration=.1;scaleFactor=1.1;hovered=null;idle=null;animation=null;start(){this.idle||(this.idle=eo.emptyClip()),(!this.hovered||!(this.hovered instanceof c.AnimationClip))&&(this.hovered=eo.createScaleClip({type:"linear",duration:this.duration||.1,scale:this.gameObject.scale,scaleFactor:this.scaleFactor||1.1})),this.animation??=this.gameObject.addComponent(Ct),this.animation.playAutomatically=!1,this.playIdle()}onEnable(){this.animation&&(this.animation.enabled=!0),this.playIdle()}onDisable(){this.animation&&(this.animation.enabled=!1),this.playIdle()}onPointerEnter(){this.playHover()}onPointerExit(){this.playIdle()}playIdle(){this.idle&&this.animation?.play(this.idle,{exclusive:!0,fadeDuration:.1,loop:!0})}playHover(){this.hovered&&this.animation?.play(this.hovered,{exclusive:!0,fadeDuration:.1,loop:!1,clampWhenFinished:!0})}};Qa([f()],exports.HoverAnimation.prototype,"type",2);Qa([f()],exports.HoverAnimation.prototype,"duration",2);Qa([f()],exports.HoverAnimation.prototype,"scaleFactor",2);Qa([f(c.AnimationClip)],exports.HoverAnimation.prototype,"hovered",2);Qa([f(c.AnimationClip)],exports.HoverAnimation.prototype,"idle",2);exports.HoverAnimation=Qa([Bm],exports.HoverAnimation);var uR=Object.defineProperty,Ya=(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&&uR(e,t,n),n};const ul=x("debugscroll");class Ss extends M{target=null;damping=0;invert=!1;htmlSelector=null;mode="window";changed=new oe;get currentValue(){return this._current_value}_current_value=0;_target_value=0;_appliedValue=-1;_needsUpdate=!1;_firstUpdate=!1;awake(){this._firstUpdate=!0}onEnable(){window.addEventListener("wheel",this.updateCurrentScrollValue,{passive:!0}),this._appliedValue=-1,this._needsUpdate=!0}onDisable(){window.removeEventListener("wheel",this.updateCurrentScrollValue)}lateUpdate(){if(this.updateCurrentScrollValue(),this._target_value>=0&&(this.damping>0&&!this._firstUpdate?(this._current_value=I.lerp(this._current_value,this._target_value,this.context.time.deltaTime/this.damping),Math.abs(this._current_value-this._target_value)<.001&&(this._current_value=this._target_value)):this._current_value=this._target_value),this._needsUpdate||this._current_value!==this._appliedValue){this._appliedValue=this._current_value,this._needsUpdate=!1;let e=!1;if(this.changed.listenerCount>0){const t={type:"change",value:this._current_value,component:this,preventDefault:()=>{t.defaultPrevented=!0},defaultPrevented:!1};this.changed.invoke(t),e=t.defaultPrevented}if(!e){const t=this.invert?1-this._current_value:this._current_value;Array.isArray(this.target)?this.target.forEach(i=>i&&this.applyScroll(i,t)):this.target&&this.applyScroll(this.target,t),ul&&this.context.time.frame%30===0&&console.debug(`[ScrollFollow] ${this._current_value.toFixed(5)} — ${(this._target_value*100).toFixed(0)}%, targets [${Array.isArray(this.target)?this.target.length:1}]`)}this._firstUpdate=!1}}_lastSelectorValue=null;_lastSelectorElement=null;updateCurrentScrollValue=()=>{switch(this.mode){case"window":if(this.htmlSelector?.length){if(this.htmlSelector!==this._lastSelectorValue&&(this._lastSelectorElement=document.querySelector(this.htmlSelector),this._lastSelectorValue=this.htmlSelector),this._lastSelectorElement){const e=this._lastSelectorElement.getBoundingClientRect();this._target_value=-e.top/(e.height-window.innerHeight);break}}else if(!(window.document.body.scrollHeight<=window.innerHeight)){const e=window.document.body.scrollHeight-window.innerHeight;this._target_value=window.scrollY/(e||1)}break}(isNaN(this._target_value)||!isFinite(this._target_value))&&(this._target_value=-1)};applyScroll(e,t){if(e)if(e instanceof lr)this.handleTimelineTarget(e,t),e.isPlaying&&e.pause(),e.evaluate();else if(e instanceof rt)e.setFloat("scroll",t);else if(e instanceof Ct)e.time=t*e.duration;else if(e instanceof pi){if(!e.duration)return;e.time=t*e.duration}else if(e instanceof Wi)e.position01=t;else if(e instanceof ii)e.intensity=t;else if(e instanceof c.Object3D){const i=e;i["needle:scrollbounds"]===void 0&&(i["needle:scrollbounds"]=Ft(e)||null);const n=i["needle:scrollbounds"];n&&(e.position.y=-n.min.y-t*(n.max.y-n.min.y))}else"scroll"in e&&(typeof e.scroll=="number"?e.scroll=t:typeof e.scroll=="function"&&e.scroll(t))}handleTimelineTarget(e,t){const i=e.duration;let n=db.get(e);if(!n){n=[],db.set(e,n);let l=0;for(const h of e.foreachMarker("ScrollMarker")){const d=l++;if(h.element===void 0||h.needsUpdate===!0||h.element&&!h.element?.parentNode){h.needsUpdate=!1;try{if(h.element=Xw(d),ul&&console.debug(`ScrollMarker #${d} (${h.time.toFixed(2)}) found`,h.element),!h.element){(ul||T())&&console.warn(`No HTML element found for ScrollMarker: ${h.name} (index ${d})`);continue}}catch(u){h.element=null,console.error("ScrollMarker selector is not valid: "+h.name+`
|
|
1431
|
+
`,u)}}h.element&&n.push(h)}n.length<=0&&document.querySelectorAll("[data-timeline-marker]").forEach(d=>{const u=d.getAttribute("data-timeline-marker"),p=parseFloat(u||"NaN");isNaN(p)?(T()||ul)&&console.warn('[ScrollFollow] data-timeline-marker attribute is not a valid number. Supported are numbers only (e.g. <div data-timeline-marker="0.5">)'):n.push({time:p,element:d})});for(const h of n)h.element&&(h.timeline=new ViewTimeline({subject:h.element,axis:"block"}))}yn.length=0;let o=0;const r=1/60;let a=0;for(let l=0;l<n.length;l++){const h=n[l];if(!h.element)continue;const d=n[l+1],u=d?d.time-r:i;a+=1;const p=h.timeline;if(p){const m=fR(p),y=1-Math.abs(m-.5)*2,_=`marker${l}`;if(m>0&&m<=1){const g=h.time+(u-h.time)*m;yn.push({name:_,time:g,weight:y}),o+=y}else l===0&&m<=0?(yn.push({name:_,time:0,weight:1}),o+=1):l===n.length-1&&m>=1&&(yn.push({name:_,time:i,weight:1}),o+=1)}}if(yn.length<=0&&a<=0)e.time=t*i;else if(yn.length>0){let l=yn[0].time;if(yn.length>1)for(const d of yn){const u=d.weight/Math.max(1e-5,o),p=Math.abs(d.time-l);l+=p*u}this.damping<=0||this._firstUpdate?e.time=l:e.time=I.lerp(e.time,l,this.context.time.deltaTime/this.damping),Math.abs(e.time-l)>.001&&(this._needsUpdate=!0),ul&&this.context.time.frame%30===0&&console.log(`[ScrollFollow ] Timeline ${e.name}: ${l.toFixed(3)}`,yn.map(d=>`[${d.name} ${(d.weight*100).toFixed(0)}%]`).join(", "))}}}Ya([f([M,c.Object3D])],Ss.prototype,"target");Ya([f()],Ss.prototype,"damping");Ya([f()],Ss.prototype,"invert");Ya([f()],Ss.prototype,"htmlSelector");Ya([f()],Ss.prototype,"mode");Ya([f(oe)],Ss.prototype,"changed");const db=new WeakMap,yn=[],op=new Array;let rp=!0;function Xw(s){return rp?(rp=!1,op.length=0,document.querySelectorAll("[data-timeline-marker]").forEach((t,i)=>{op[i]=t}),rp=!1,Xw(s)):op[s]||null}function fR(s){if(!s.source)return 0;const e=s.currentTime,t=s.duration;let i=1;return(t.unit==="seconds"||t.unit==="percent")&&(i=t.value),e.unit==="seconds"?e.value/i:e.value/100}var Qw=Object.defineProperty,pR=Object.getOwnPropertyDescriptor,mR=(s,e,t)=>e in s?Qw(s,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):s[e]=t,Zu=(s,e,t,i)=>{for(var n=i>1?void 0:i?pR(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&&Qw(e,t,n),n},py=(s,e,t)=>mR(s,typeof e!="symbol"?e+"":e,t);const js=x("debugviewbox"),gR=new Z(.5,.5,.5,.5);exports.ViewBox=class extends M{referenceFieldOfView=-1;get mode(){return this._mode}set mode(e){e!==this._mode&&(this._mode=e,e==="once"&&(this._applyCount=0),(js||this.debug)&&console.debug("[ViewBox] Set mode:",e))}_mode="continuous";debug=!1;onEnable(){(js||this.debug||T())&&console.debug("[ViewBox] Using camera fov:",this.referenceFieldOfView),exports.ViewBox.instances.push(this),this._applyCount=0,this.removeUpdateCallback(),this.context.pre_render_callbacks.push(this.internalUpdate)}onDisable(){(js||this.debug)&&console.debug("[ViewBox] Disabled");const e=exports.ViewBox.instances.indexOf(this);e!==-1&&exports.ViewBox.instances.splice(e,1),this._projectedBoxElement?.remove(),this.removeUpdateCallback()}removeUpdateCallback(){const e=this.context.pre_render_callbacks.indexOf(this.internalUpdate);e!==-1&&this.context.pre_render_callbacks.splice(e,1)}_applyCount=0;internalUpdate=()=>{if(this.context.isInXR||this.destroyed||!this.activeAndEnabled)return;if(!(exports.ViewBox.instances[exports.ViewBox.instances.length-1]===this)){(js||this.debug)&&B.DrawWireBox(this.gameObject.worldPosition,this.gameObject.worldScale,gR);return}(js||this.debug)&&B.DrawWireBox(this.gameObject.worldPosition,this.gameObject.worldScale,14540032,0,!0,this.gameObject.worldQuaternion);const t=this.context.mainCamera;if(!t||!(t instanceof c.PerspectiveCamera))return;if((this.referenceFieldOfView===void 0||this.referenceFieldOfView===-1)&&(this.referenceFieldOfView=t.fov,console.debug("[ViewBox] No referenceFieldOfView set, using camera fov:",this.referenceFieldOfView)),this.referenceFieldOfView===void 0||this.referenceFieldOfView<=0){(js||this.debug)&&console.warn("[ViewBox] No valid referenceFieldOfView set, cannot adjust box size:",this.referenceFieldOfView);return}if(this._applyCount>=1&&this.mode==="once")return;this._applyCount++;const i=this.context.domWidth,n=this.context.domHeight;let o=i,r=n,a=1,l=1;const h=this.context.focusRectSize;h&&(o=h.width,r=h.height,a=i/o,l=n/r),exports.ViewBox._tempProjectionMatrix.copy(t.projectionMatrix),exports.ViewBox._tempProjectionMatrixInverse.copy(t.projectionMatrixInverse);const d=t.view,u=t.zoom,p=t.aspect,m=t.fov;t.view=null,t.zoom=1,t.fov=this.referenceFieldOfView,t.updateProjectionMatrix();const y=this.gameObject.worldPosition,_=this.gameObject.worldScale,g=t.worldPosition,w=g.distanceTo(y),b=Math.max(_.x,_.y,_.z),v=j(g).sub(y);if(w<b){(this.debug||js)&&console.warn("[ViewBox] Moving camera out of bounds",w,"<",b);const V=j(v);V.y*=1e-8,V.normalize();const K=b-w,J=g.add(V.multiplyScalar(K));t.worldPosition=J.lerp(g,1-this.context.time.deltaTime)}const R=j(y);t.worldToLocal(R),t.lookAt(y),t.updateMatrixWorld();const O=this.referenceFieldOfView*Math.PI/180,k=2*Math.tan(O/2)*w,A=k*t.aspect,D=this.projectBoxIntoCamera(t,1),L=D.maxX-D.minX,N=D.maxY-D.minY,E=this.fit(L*t.aspect,N,A/a,k/l)/(k*.5),U=j(y);U.project(t),this.context.focusRectSettings.offsetX=U.x,this.context.focusRectSettings.offsetY=U.y,this.context.focusRectSettings.zoom=E,this.context.focusRect||this.context.setCameraFocusRect(this.context.domElement),t.view=d,t.zoom=u,t.aspect=p,t.fov=m,t.projectionMatrix.copy(exports.ViewBox._tempProjectionMatrix),t.projectionMatrixInverse.copy(exports.ViewBox._tempProjectionMatrixInverse)};fit(e,t,i,n){const o=i/e,r=n/t;return Math.min(o,r)}projectBoxIntoCamera(e,t){const i=.5*t,n=[j(-i,-i,-i),j(i,-i,-i),j(-i,i,-i),j(i,i,-i),j(-i,-i,i),j(i,-i,i),j(-i,i,i),j(i,i,i)];let o=Number.POSITIVE_INFINITY,r=Number.NEGATIVE_INFINITY,a=Number.POSITIVE_INFINITY,l=Number.NEGATIVE_INFINITY;for(let h=0;h<n.length;h++){const d=n[h];d.applyMatrix4(this.gameObject.matrixWorld),d.project(e),d.x<o&&(o=d.x),d.x>r&&(r=d.x),d.y<a&&(a=d.y),d.y>l&&(l=d.y)}return js&&(this._projectedBoxElement||(this._projectedBoxElement=document.createElement("div")),this._projectedBoxElement.parentElement!==this.context.domElement&&this.context.domElement.appendChild(this._projectedBoxElement),this._projectedBoxElement.style.position="fixed",this._projectedBoxElement.style.outline="2px dashed rgba(255,0,0,.5)",this._projectedBoxElement.style.left=(o*.5+.5)*this.context.domWidth+"px",this._projectedBoxElement.style.top=(-l*.5+.5)*this.context.domHeight+"px",this._projectedBoxElement.style.width=(r-o)*.5*this.context.domWidth+"px",this._projectedBoxElement.style.height=(l-a)*.5*this.context.domHeight+"px",this._projectedBoxElement.style.pointerEvents="none",this._projectedBoxElement.style.zIndex="1000"),{minX:o,maxX:r,minY:a,maxY:l}}_projectedBoxElement=null};py(exports.ViewBox,"instances",[]);py(exports.ViewBox,"_tempProjectionMatrix",new c.Matrix4);py(exports.ViewBox,"_tempProjectionMatrixInverse",new c.Matrix4);Zu([f()],exports.ViewBox.prototype,"referenceFieldOfView",2);Zu([f()],exports.ViewBox.prototype,"mode",1);Zu([f()],exports.ViewBox.prototype,"debug",2);exports.ViewBox=Zu([Bm],exports.ViewBox);var yR=Object.defineProperty,Ka=(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&&yR(e,t,n),n};class Cs extends M{get activeAndEnabled(){return!0}side="none";controller=!0;hands=!1;controlVisibility=!0;useGripSpace=!1;resetTransformAfterXRSession=!0;_startPosition=new c.Vector3;_startRotation=new c.Quaternion;_startScale=new c.Vector3;onEnterXR(e){this._startPosition.copy(this.gameObject.position),this._startRotation.copy(this.gameObject.quaternion),this._startScale.copy(this.gameObject.scale)}onUpdateXR(e){if(!this.enabled)return;const t=e.xr.getController(this.side);if(t){if(t.hand&&!this.hands){this.controlVisibility&&(this.gameObject.visible=!1);return}else if(!this.controller){this.controlVisibility&&(this.gameObject.visible=!1);return}this.controlVisibility&&(this.gameObject.visible=!0),this.useGripSpace||t.targetRayMode==="transient-pointer"?(this.gameObject.worldPosition=t.gripWorldPosition,this.gameObject.worldQuaternion=t.gripWorldQuaternion,this.gameObject.worldScale=j(t.xr.rigScale,t.xr.rigScale,t.xr.rigScale).multiply(this._startScale)):(this.gameObject.worldPosition=t.rayWorldPosition,this.gameObject.worldQuaternion=t.rayWorldQuaternion,this.gameObject.worldScale=j(t.xr.rigScale,t.xr.rigScale,t.xr.rigScale).multiply(this._startScale))}}onLeaveXR(e){this.resetTransformAfterXRSession&&(this.gameObject.position.copy(this._startPosition),this.gameObject.quaternion.copy(this._startRotation),this.gameObject.scale.copy(this._startScale))}}Ka([f()],Cs.prototype,"side");Ka([f()],Cs.prototype,"controller");Ka([f()],Cs.prototype,"hands");Ka([f()],Cs.prototype,"controlVisibility");Ka([f()],Cs.prototype,"useGripSpace");Ka([f()],Cs.prototype,"resetTransformAfterXRSession");function Yw(s,e){const t=s.xr.getFrame();if(!t)return console.warn("No XRFrame available"),!1;const i=t.session.enabledFeatures;if(i&&!i.some(o=>o==="camera-access"))return console.error(`No camera feed available - please request the 'camera-access' feature before starting WebXR or add the ARCameraBackground component to your scene.
|
|
1432
1432
|
|
|
1433
1433
|
Example to request camera-access in global scope:
|
|
1434
1434
|
NeedleXRSession.onSessionRequestStart(evt => {
|
|
@@ -1649,4 +1649,4 @@ Error:`,r),null}}updateColliderCollisionGroups(e){const t=e[wt],i=e.membership;l
|
|
|
1649
1649
|
justify-content: center;
|
|
1650
1650
|
gap: .5rem;
|
|
1651
1651
|
}
|
|
1652
|
-
`),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),Rd(Lp,{element:this.#t}),this.#o?.disconnect(),this.#o??=new MutationObserver(()=>this.#l()),this.#o.observe(this.#e,{attributes:!0}),hp&&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=>{hp&&console.log("Needle Button clicked"),!e.defaultPrevented&&this.#e&&this.#e.click()}}typeof window<"u"&&!window.customElements.get(wb)&&window.customElements.define(wb,rx);const vl=x("debugavatar");class by{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 ax{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 cn;i=S.instantiate(fa(t,e.scene),o)}}else i=t;if(!i)return null;const n=this.findAvatar(i);return n.isValid?(vl&&console.log("[Custom Avatar] valid config",t,vl?n:""),n):(console.warn("[Custom Avatar] config isn't valid",t,vl?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(vl&&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 on().parseSync(e,o,null,0))?.scene??null:null}const i=new q.GLTFLoader;return Gm(i,e),new Promise((n,o)=>{const r=this.avatarRegistryUrl+"/"+t;i.load(r,async a=>{await on().createBuiltinComponents(e,r,a,null,void 0),n(a.scene)},a=>{vl&&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 by(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 lx{get extensionName(){return"DocumentExtension"}onAfterBuildDocument(e){}}class cx{}const nT=Object.freeze(Object.defineProperty({__proto__:null,ActionBuilder:le,ActionCollection:fw,ActionModel:Gt,AlignmentConstraint:Tc,Animation:Ct,AnimationCurve:Kc,AnimationExtension:vu,AnimationTrackHandler:pc,Animator:rt,AnimatorController:Li,Antialiasing:Jc,Attractor:Na,AudioExtension:br,AudioListener:ss,AudioSource:pi,AudioTrackHandler:rs,Avatar:io,AvatarBlink_Simple:mr,AvatarEyeLook_Rotation:tg,AvatarLoader:ax,AvatarMarker:Se,AvatarModel:by,Avatar_Brain_LookAt:lc,Avatar_MouthShapes:Ic,Avatar_MustacheShake:Jm,Avatar_POI:Yo,AxesHelper:ka,BaseUIComponent:Bi,BasicIKConstraint:ng,BehaviorExtension:Dg,BehaviorModel:gt,BloomEffect:Du,BoxCollider:mu,BoxGizmo:Sr,BoxHelperComponent:nt,Button:xs,CallInfo:ns,Camera:Qt,CameraTargetReachedEvent:ac,Canvas:xa,CanvasGroup:no,CapsuleCollider:cs,ChangeMaterialOnClick:Cg,ChangeTransformOnClick:vr,CharacterController:gr,CharacterControllerInput:fs,ChromaticAberration:eh,ClickThrough:Yu,Collider:Jt,ColorAdjustments:_o,ColorBySpeedModule:za,ColorOverLifetimeModule:Ru,ContactShadows:jc,ControlTrackHandler:$u,CursorFollow:Dr,CustomBranding:xr,Deletable:ag,DeleteBox:Ys,DepthOfField:un,DeviceFlag:gu,DocumentExtension:lx,DragControls:Fo,DropListener:ms,Duplicatable:mg,EffectWrapper:fc,EmissionModule:bs,EmphasizeOnClick:Aa,EnvironmentScene:Xu,EventList:oe,EventListEvent:hu,EventSystem:Bt,EventTrigger:_u,FieldWithDefault:Xv,FixedJoint:qg,Fog:Ba,GltfExport:vg,GltfExportBox:_g,Gradient:Pr,Graphic:Hc,GraphicRaycaster:du,GridHelper:Fa,GridLayoutGroup:Ug,GroundProjectedEnv:Bn,GroupActionModel:Uo,HideOnStart:Ei,HingeJoint:qc,HorizontalLayoutGroup:Fg,get HoverAnimation(){return exports.HoverAnimation},Image:qa,InheritVelocityModule:Kg,InputField:dy,InstanceHandle:Ko,InstancingHandler:or,Interactable:rg,Keyframe:Yt,LODGroup:Qc,LODModel:Ua,Light:ii,LimitVelocityOverLifetimeModule:et,LogStats:og,LookAt:uy,LookAtConstraint:pr,MainModule:Mt,MarkerTrackHandler:Vu,MaskableGraphic:Gc,MeshCollider:ho,MeshRenderer:Fc,MinMaxCurve:H,MinMaxGradient:Or,NeedleMenu:Un,NestedGltf:Yc,Networking:Qg,NoiseModule:fe,ObjectRaycaster:fi,OffsetConstraint:Cr,OpenURL:Xa,OrbitControls:ce,Outline:ja,Padding:wr,ParticleBurst:Vd,ParticleSubEmitter:Zg,ParticleSystem:uc,ParticleSystemRenderer:Vi,PhysicsExtension:Lg,PixelationEffect:th,PlayAnimationOnClick:hc,PlayAudioOnClick:to,PlayableDirector:lr,PlayerColor:Sa,PointerEventData:Dc,PostProcessingHandler:ny,PreliminaryAction:Da,PreliminaryTrigger:Nc,RawImage:Gu,Rect:_w,RectTransform:ln,ReflectionProbe:cc,RegisteredAnimationInfo:Gs,RemoteSkybox:Iu,Renderer:Ut,RendererLightmap:ug,Rigidbody:Ve,RotationBySpeedModule:Ni,RotationOverLifetimeModule:dn,SceneSwitcher:Fe,ScreenCapture:bo,ScreenSpaceAmbientOcclusion:vs,ScreenSpaceAmbientOcclusionN8:fn,ScrollFollow:Ss,SeeThrough:ws,SetActiveOnClick:Pg,ShadowCatcher:oh,ShapeModule:Yg,SharpeningEffect:nh,SignalAsset:Nu,SignalReceiver:hh,SignalReceiverEvent:ch,SignalTrackHandler:mc,Size:yw,SizeBySpeedModule:ni,SizeOverLifetimeModule:Mr,SkinnedMeshRenderer:fg,SmoothFollow:Bu,SpatialGrabRaycaster:nr,SpatialHtml:uh,SpatialTrigger:Fu,SpatialTriggerReceiver:Ln,SpectatorCamera:Uu,SphereCollider:Ea,SplineContainer:Tr,SplineData:jn,SplineWalker:Wi,Sprite:gs,SpriteData:da,SpriteRenderer:ei,SpriteSheet:wa,SubEmitterSystem:$d,SyncedCamera:oy,SyncedRoom:pn,SyncedTransform:an,TapGestureTrigger:Mg,TeleportTarget:Pu,TestRunner:ry,TestSimulateUserData:ay,Text:Ot,TextBuilder:jg,TextExtension:Mu,TextureSheetAnimationModule:kt,TiltShiftEffect:Vn,ToneMappingEffect:so,TrailModule:Re,TransformData:ke,TransformGizmo:Ar,TriggerBuilder:St,TriggerModel:Ks,UIRaycastUtils:Qm,UIRootComponent:$c,USDZExporter:nn,USDZText:na,USDZUIExtension:Ng,UsageMarker:Bc,VariantAction:Sg,VelocityOverLifetimeModule:De,VerticalLayoutGroup:Bg,VideoPlayer:Ze,get ViewBox(){return exports.ViewBox},Vignette:Rr,VisibilityAction:Vc,Voip:co,Volume:$a,VolumeParameter:F,VolumeProfile:Tu,WebARCameraBackground:ph,WebARSessionRoot:di,WebXR:Ou,WebXRImageTracking:mh,WebXRImageTrackingModel:Ps,WebXRPlaneTracking:Os,WebXRTrackedImage:Ca,XRControllerFollow:Cs,XRControllerModel:hs,XRControllerMovement:gi,XRFlag:Ti,XRRig:Ju,XRState:jt,__Ignore:cx},Symbol.toStringTag,{value:"Module"})),yc=x("debugmissingcamera");ae.registerCallback(re.MissingCamera,s=>{yc&&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 Qt;if(i.sourceId=s.files?.[0]?.src??"unknown",i.fieldOfView=35,s.context.domElement.getAttribute("transparent")!=null)i.clearFlags=Qo.Uninitialized;else if(s.context.domElement.getAttribute("background-image")?.length||s.context.lightmaps.tryGetSkybox(i.sourceId))i.clearFlags=Qo.Skybox;else{if(i.clearFlags=Qo.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 Xu("neutral");e.environment=a.fromScene(l,.025).texture}}const o=Wo(t,i,!0);return t.position.x=0,t.position.y=1,t.position.z=2,s.context.domElement?.cameraControls!=!1&&hx(s.context,o),o});ae.registerCallback(re.ContextCreated,s=>{if(!s.context.mainCamera){yc&&console.log("Will not auto-fit because a default camera exists");return}if(s.context.domElement?.cameraControls==!0){if(Ib(s.context.mainCamera)?.isCameraController==!0){yc&&console.log("Will not auto-fit because a camera controller exists");return}hx(s.context)}});function hx(s,e){e=e??s.mainCameraComponent;const t=e?.gameObject;if(yc&&console.log("Creating default camera controls",e?.name),t){const i=Oc(t,ce);i.sourceId=e?.sourceId??"unknown";const n=s.domElement.getAttribute("auto-rotate");i.autoRotate=n!="0"&&n?.toLowerCase()!="false";const o=Number.parseFloat(n||".5");i.autoRotateSpeed=isNaN(o)?.5:o,yc&&console.log("Auto-rotate",i.autoRotate,"speed:",i.autoRotateSpeed);const r=s.domElement.getAttribute("auto-fit");i.autoFit=r!=="0"&&r?.toLowerCase()!="false",i.autoTarget=!0}else console.warn("Missing camera object, can not add orbit controls")}ae.registerCallback(re.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)S.foreachComponent(t.file.scene,n=>{if(n.enabled!==!1){if(n instanceof Ct&&n.playAutomatically||n instanceof rt||n instanceof lr&&n.playOnAwake===!0)return!0;if(n instanceof Ct)return n.playAutomatically=!0,!0;if(n instanceof lr)return n.playOnAwake=!0,!0}},!0)!==!0&&eo.autoplayAnimations(t.file)});exports.SplineUtils=void 0;(s=>{function e(t,i=!1,n=.75){const o=new Tr,r=1-I.clamp(n,0,1);return t.forEach((a,l)=>{const h=new c.Vector3;l<t.length-1?h.subVectors(t[l+1],a).normalize().multiplyScalar(r):i&&t.length>1&&h.subVectors(t[0],a).normalize().multiplyScalar(r);const d=new jn;d.position.copy(a),d.tangentIn.copy(h),d.tangentOut.copy(h),o.addKnot(d)}),o.closed=i,o}s.createFromPoints=e})(exports.SplineUtils||(exports.SplineUtils={}));class sT extends se.WorkerBase{constructor(){super(new Worker(new URL("/generateMeshBVH.worker-2qGLkQjg.js",typeof document>"u"?require("url").pathToFileURL(__filename).href:tf&&tf.tagName.toUpperCase()==="SCRIPT"&&tf.src||new URL("needle-engine.bundle-CTY0RgBZ.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 _=new c.BufferAttribute(u.index,1,!1);t.setIndex(_)}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 oT=Object.freeze(Object.defineProperty({__proto__:null,GenerateMeshBVHWorker:sT},Symbol.toStringTag,{value:"Module"}));exports.$physicsKey=AP;exports.ActionBuilder=le;exports.ActionCollection=fw;exports.ActionModel=Gt;exports.Addressables=Y0;exports.AlignmentConstraint=Tc;exports.AmbientMode=ca;exports.Animation=Ct;exports.AnimationCurve=Kc;exports.AnimationExtension=vu;exports.AnimationTrackHandler=pc;exports.AnimationUtils=eo;exports.Animator=rt;exports.AnimatorConditionMode=Ns;exports.AnimatorController=Li;exports.AnimatorControllerParameterType=qm;exports.AnimatorStateInfo=Pl;exports.Antialiasing=Jc;exports.Application=rn;exports.AssetDatabase=f0;exports.AssetReference=Y;exports.Attractor=Na;exports.AudioExtension=br;exports.AudioListener=ss;exports.AudioSource=pi;exports.AudioTrackHandler=rs;exports.Avatar=io;exports.AvatarBlink_Simple=mr;exports.AvatarEyeLook_Rotation=tg;exports.AvatarLoader=ax;exports.AvatarMarker=Se;exports.AvatarModel=by;exports.Avatar_Brain_LookAt=lc;exports.Avatar_MouthShapes=Ic;exports.Avatar_MustacheShake=Jm;exports.Avatar_POI=Yo;exports.Axes=ta;exports.AxesHelper=ka;exports.BUILD_TIME=wm;exports.BaseUIComponent=Bi;exports.BasicIKConstraint=ng;exports.BehaviorExtension=Dg;exports.BehaviorModel=gt;exports.BloomEffect=Du;exports.BoxCollider=mu;exports.BoxGizmo=Sr;exports.BoxHelperComponent=nt;exports.Button=xs;exports.ButtonsFactory=Zi;exports.CallDirection=Av;exports.CallInfo=ns;exports.Camera=Qt;exports.CameraTargetReachedEvent=ac;exports.Canvas=xa;exports.CanvasGroup=no;exports.CapsuleCollider=cs;exports.ChangeMaterialOnClick=Cg;exports.ChangeTransformOnClick=vr;exports.CharacterController=gr;exports.CharacterControllerInput=fs;exports.ChromaticAberration=eh;exports.CircularBuffer=ui;exports.ClearFlags=Qo;exports.ClickThrough=Yu;exports.ClipExtrapolation=vn;exports.Collider=Jt;exports.Collision=Ev;exports.CollisionDetectionMode=cu;exports.ColorAdjustments=_o;exports.ColorBySpeedModule=za;exports.ColorOverLifetimeModule=Ru;exports.Component=U1;exports.Component$1=M;exports.ComponentLifecycleEvents=eu;exports.Components=nT;exports.ConnectionEvents=a0;exports.ContactPoint=kv;exports.ContactShadows=jc;exports.Context=z;exports.ContextArgs=C1;exports.ContextEvent=re;exports.ContextRegistry=ae;exports.ControlTrackHandler=$u;exports.CursorFollow=Dr;exports.CustomBranding=xr;exports.CustomShader=ye;exports.DefaultReflectionMode=Ed;exports.Deletable=ag;exports.DeleteBox=Ys;exports.DepthOfField=un;exports.DeviceFlag=gu;exports.DocumentExtension=lx;exports.DragControls=Fo;exports.DragMode=lg;exports.DropListener=ms;exports.Duplicatable=mg;exports.EffectWrapper=fc;exports.EmissionModule=bs;exports.EmphasizeOnClick=Aa;exports.EngineLoadingView=gc;exports.EnvironmentScene=Xu;exports.EventList=oe;exports.EventListEvent=hu;exports.EventSystem=Bt;exports.EventTrigger=_u;exports.FieldWithDefault=Xv;exports.FileReference=qo;exports.FileReferenceSerializer=Z0;exports.FileSpawnModel=tO;exports.File_Event=Uv;exports.FixedJoint=qg;exports.Fog=Ba;exports.FrameEvent=pe;exports.GENERATOR=Qd;exports.GameObject=S;exports.Gizmos=B;exports.GltfExport=vg;exports.GltfExportBox=_g;exports.Gradient=Pr;exports.Graphic=Hc;exports.GraphicRaycaster=du;exports.Graphics=Js;exports.GridHelper=Fa;exports.GridLayoutGroup=Ug;exports.GroundProjectedEnv=Bn;exports.GroupActionModel=Uo;exports.HideFlags=uu;exports.HideOnStart=Ei;exports.HingeJoint=qc;exports.HorizontalLayoutGroup=Fg;exports.HostData=PC;exports.Image=qa;exports.ImageReference=Go;exports.ImageReferenceSerializer=K0;exports.InheritVelocityModule=Kg;exports.Input=t0;exports.InputEventQueue=Xt;exports.InputEvents=xe;exports.InputField=dy;exports.InstanceHandle=Ko;exports.InstancingHandler=or;exports.InstancingUtil=Di;exports.InstantiateEvent=C0;exports.InstantiateIdProvider=mt;exports.InstantiateOptions=cn;exports.Interactable=rg;exports.JoinedRoomResponse=QS;exports.KeyEventArgs=FS;exports.Keyframe=Yt;exports.LODGroup=Qc;exports.LODModel=Ua;exports.LeftRoomResponse=YS;exports.Light=ii;exports.LightData=nv;exports.LimitVelocityOverLifetimeModule=et;exports.LoadingElementOptions=VR;exports.LogStats=og;exports.LogType=hi;exports.LookAt=uy;exports.LookAtConstraint=pr;exports.MainModule=Mt;exports.MarkerTrackHandler=Vu;exports.MarkerType=ly;exports.MaskableGraphic=Gc;exports.Mathf=I;exports.MeshCollider=ho;exports.MeshRenderer=Fc;exports.MinMaxCurve=H;exports.MinMaxGradient=Or;exports.NEKeyboardEvent=wl;exports.NEPointerEvent=Zn;exports.NeedleButtonElement=rx;exports.NeedleEngineWebComponent=_y;exports.NeedleMenu=Un;exports.NeedlePatchesKey=Zh;exports.NeedleXRController=Pm;exports.NeedleXRSession=G;exports.NeedleXRSync=h0;exports.NeedleXRUtils=u0;exports.NestedGltf=Yc;exports.NetworkConnection=c0;exports.NetworkedStreamEvents=kn;exports.NetworkedStreams=Lc;exports.Networking=Qg;exports.NewInstanceModel=O0;exports.NoiseModule=fe;exports.ObjectRaycaster=fi;exports.ObjectUtils=hr;exports.OffsetConstraint=Cr;exports.OneEuroFilter=Yh;exports.OneEuroFilterXYZ=fm;exports.OpenURL=Xa;exports.OrbitControls=ce;exports.Outline=ja;exports.OwnershipEvent=l0;exports.OwnershipModel=Em;exports.PUBLIC_KEY=Zr;exports.Padding=wr;exports.ParticleBurst=Vd;exports.ParticleSubEmitter=Zg;exports.ParticleSystem=uc;exports.ParticleSystemBaseBehaviour=yo;exports.ParticleSystemRenderer=Vi;exports.ParticleSystemShapeType=Nd;exports.PeerHandle=os;exports.PeerNetworking=r0;exports.Physics=_a;exports.PhysicsExtension=Lg;exports.PhysicsMaterialCombine=it;exports.PixelationEffect=th;exports.PlayAnimationOnClick=hc;exports.PlayAudioOnClick=to;exports.PlayableDirector=lr;exports.PlayerColor=Sa;exports.PlayerState=Ji;exports.PlayerStateEvent=gw;exports.PlayerSync=Tg;exports.PlayerView=ev;exports.PlayerViewManager=tv;exports.PointerEventData=Dc;exports.PointerType=Zd;exports.PostProcessingEffect=$e;exports.PostProcessingEffectOrder=Ke;exports.PostProcessingHandler=ny;exports.PreliminaryAction=Da;exports.PreliminaryTrigger=Nc;exports.PrimitiveType=Jo;exports.Progress=ie;exports.PromiseAllWithErrors=dm;exports.PromiseErrorResult=fp;exports.RGBAColor=Z;exports.RapierPhysics=ua;exports.RawImage=Gu;exports.RaycastOptions=lo;exports.Rect=_w;exports.RectTransform=ln;exports.ReflectionProbe=cc;exports.RegisteredAnimationInfo=Gs;exports.RemoteSkybox=Iu;exports.RenderTexture=Mn;exports.RenderTextureSerializer=Cv;exports.Renderer=Ut;exports.RendererData=iv;exports.RendererLightmap=ug;exports.Rigidbody=Ve;exports.RigidbodyConstraints=Ie;exports.RoomEvents=Q;exports.RotationBySpeedModule=Ni;exports.RotationOverLifetimeModule=dn;exports.SceneLightSettings=jd;exports.SceneSwitcher=Fe;exports.ScreenCapture=bo;exports.ScreenSpaceAmbientOcclusion=vs;exports.ScreenSpaceAmbientOcclusionN8=fn;exports.ScrollFollow=Ss;exports.SeeThrough=ws;exports.SendQueue=Ki;exports.SerializationContext=zm;exports.SetActiveOnClick=Pg;exports.ShadowCatcher=oh;exports.ShapeModule=Yg;exports.ShapeOverlapResult=Rv;exports.SharpeningEffect=nh;exports.SignalAsset=Nu;exports.SignalReceiver=hh;exports.SignalReceiverEvent=ch;exports.SignalTrackHandler=mc;exports.Size=yw;exports.SizeBySpeedModule=ni;exports.SizeOverLifetimeModule=Mr;exports.SkinnedMeshRenderer=fg;exports.SmoothFollow=Bu;exports.SpatialGrabRaycaster=nr;exports.SpatialHtml=uh;exports.SpatialTrigger=Fu;exports.SpatialTriggerReceiver=Ln;exports.SpectatorCamera=Uu;exports.SphereCollider=Ea;exports.SphereIntersection=Am;exports.SplineContainer=Tr;exports.SplineData=jn;exports.SplineWalker=Wi;exports.Sprite=gs;exports.SpriteData=da;exports.SpriteRenderer=ei;exports.SpriteSheet=wa;exports.StateMachineBehaviour=H1;exports.StreamEndedEvent=Km;exports.StreamReceivedEvent=Tv;exports.SubEmitterSystem=$d;exports.SyncedCamera=oy;exports.SyncedRoom=pn;exports.SyncedTransform=an;exports.TapGestureTrigger=Mg;exports.TeleportTarget=Pu;exports.TestRunner=ry;exports.TestSceneUtils=KR;exports.TestSimulateUserData=ay;exports.Text=Ot;exports.TextBuilder=jg;exports.TextExtension=Mu;exports.TextureSheetAnimationModule=kt;exports.TiltShiftEffect=Vn;exports.Time=sv;exports.ToneMappingEffect=so;exports.TrackHandler=Ga;exports.TrackType=ri;exports.TrailModule=Re;exports.TransformData=ke;exports.TransformGizmo=Ar;exports.TriggerBuilder=St;exports.TriggerModel=Ks;exports.TypeStore=P;exports.UIRaycastUtils=Qm;exports.UIRootComponent=$c;exports.USDDocument=wg;exports.USDObject=Ne;exports.USDWriter=sw;exports.USDZExporter=nn;exports.USDZExporter$1=ow;exports.USDZText=na;exports.USDZUIExtension=Ng;exports.UriSerializer=Pv;exports.UsageMarker=Bc;exports.UserJoinedOrLeftRoomModel=KS;exports.VERSION=en;exports.VariantAction=Sg;exports.VelocityOverLifetimeModule=De;exports.VerticalLayoutGroup=Bg;exports.VideoPlayer=Ze;exports.ViewDevice=qs;exports.Vignette=Rr;exports.VisibilityAction=Vc;exports.Voip=co;exports.Volume=$a;exports.VolumeParameter=F;exports.VolumeProfile=Tu;exports.WaitForFrames=n1;exports.WaitForPromise=J0;exports.WaitForSeconds=$m;exports.Watch=as;exports.WebARCameraBackground=ph;exports.WebARSessionRoot=di;exports.WebXR=Ou;exports.WebXRButtonFactory=Zs;exports.WebXRImageTracking=mh;exports.WebXRImageTrackingModel=Ps;exports.WebXRPlaneTracking=Os;exports.WebXRTrackedImage=Ca;exports.XRControllerFollow=Cs;exports.XRControllerModel=hs;exports.XRControllerMovement=gi;exports.XRFlag=Ti;exports.XRRig=Ju;exports.XRState=jt;exports.XRStateFlag=Pn;exports.__Ignore=cx;exports.__internalNotifyObjectDestroyed=pC;exports.activeInHierarchyFieldName=ls;exports.addAttributeChangeCallback=cm;exports.addComponent=tn;exports.addCustomExtensionPlugin=yO;exports.addNewComponent=Wo;exports.addPatch=Yd;exports.apply=iu;exports.applyHMRChanges=F1;exports.applyPrototypeExtensions=F0;exports.beginListenDestroy=P0;exports.beginListenInstantiate=k0;exports.binaryIdentifierCasts=Om;exports.build_scene_functions=S1;exports.builtinComponentKeyName=Do;exports.calculateProgress01=yy;exports.clearMessages=qx;exports.colorSerializer=lP;exports.compareAssociation=A0;exports.componentSerializer=ad;exports.copyTexture=Vb;exports.createMotion=bv;exports.debugNet=Nt;exports.debugOwner=xl;exports.decompressGpuTexture=cw;exports.deepClone=bc;exports.delay=In;exports.delayForFrames=vc;exports.deserializeObject=Md;exports.destroy=ji;exports.destroyComponentInstance=N0;exports.determineMimeTypeFromExtension=zv;exports.disposeObjectResources=_e;exports.disposeStream=En;exports.editorGuidKeyName=Ul;exports.enableSpatialConsole=No;exports.euler=hP;exports.eventListSerializer=pP;exports.exportAsGLTF=eT;exports.findByGuid=Vm;exports.findObjectOfType=Oa;exports.findObjectsOfType=$0;exports.findResourceUsers=Dm;exports.fitCamera=vv;exports.fitObjectIntoVolume=Wb;exports.foreachComponent=tr;exports.foreachComponentEnumerator=su;exports.forward=dS;exports.generateQRCode=Eb;exports.generateSeed=M0;exports.getBoundingBox=Ft;exports.getCameraController=Ib;exports.getComponent=ur;exports.getComponentInChildren=kc;exports.getComponentInParent=sc;exports.getComponents=Mc;exports.getComponentsInChildren=Pa;exports.getComponentsInParent=tu;exports.getFormattedDate=ew;exports.getIconElement=pt;exports.getIconTexture=Dp;exports.getLoader=on;exports.getOrAddComponent=Oc;exports.getParam=x;exports.getParentHierarchyPath=pS;exports.getPath=Cx;exports.getPeerOptions=HS;exports.getPeerjsInstance=o0;exports.getResourceUserCount=gC;exports.getTempColor=Fb;exports.getTempQuaternion=qt;exports.getTempVector=j;exports.getUrlParams=_c;exports.getVisibleInCustomShadowRendering=$b;exports.getWorldDirection=Ub;exports.getWorldEuler=gm;exports.getWorldPosition=X;exports.getWorldQuaternion=ue;exports.getWorldRotation=Xd;exports.getWorldScale=je;exports.hasCommercialLicense=Xs;exports.hasIndieLicense=Rc;exports.hasPointerEventComponent=Dd;exports.hasProLicense=Dn;exports.hideDebugConsole=Xb;exports.imageToCanvas=hw;exports.instantiate=ir;exports.invokeLoadedImportPluginHooks=qv;exports.invokeXRSessionEnd=e0;exports.invokeXRSessionStart=Jb;exports.isActiveInHierarchy=W0;exports.isActiveSelf=Ma;exports.isAndroidDevice=Rx;exports.isAnimationAction=Nb;exports.isComponent=Mv;exports.isDebugMode=vx;exports.isDesktop=Ox;exports.isDestroyed=er;exports.isDevEnvironment=T;exports.isDisposed=fC;exports.isExporting=ZR;exports.isGLTFModel=Ov;exports.isHostedOnGlitch=xb;exports.isHotReloadEnabled=Fp;exports.isHotReloading=j1;exports.isIPad=kx;exports.isIconElement=av;exports.isLocalNetwork=Ii;exports.isMacOS=Ax;exports.isMobileDevice=Mx;exports.isMozillaXR=Tx;exports.isQuest=Ix;exports.isResourceTrackingEnabled=m0;exports.isSafari=Lx;exports.isUsingInstancing=nu;exports.isiOS=Dx;exports.isiPad=Ex;exports.loadAsset=jR;exports.loadPMREM=zw;exports.loadSync=gy;exports.logHierarchy=bd;exports.lookAtInverse=nS;exports.lookAtObject=wc;exports.lookAtScreenPoint=sS;exports.makeId=xx;exports.makeIdFromRandomWords=Pb;exports.makeNameSafe=mi;exports.markAsInstancedRendered=H0;exports.microphonePermissionsGranted=jx;exports.nameof=bx;exports.nameofFactory=Sb;exports.objectSerializer=Sv;exports.offXRSessionEnd=BS;exports.offXRSessionStart=jS;exports.onAfterRender=L1;exports.onBeforeRender=D1;exports.onClear=T1;exports.onDestroy=A1;exports.onInitialized=uv;exports.onStart=au;exports.onUpdate=fv;exports.onXRSessionEnd=Cm;exports.onXRSessionStart=Kd;exports.parseSync=tx;exports.placeOnSurface=Hb;exports.postprocessFBXMaterials=bm;exports.prefix=iP;exports.pushState=Cb;exports.randomNumber=Sx;exports.registerBinaryType=Mm;exports.registerComponent=ru;exports.registerComponentExtension=hg;exports.registerCustomEffectType=$i;exports.registerExportExtensions=dg;exports.registerExtensions=Fd;exports.registerHotReloadType=mv;exports.registerLoader=xm;exports.registerPrefabProvider=R0;exports.registerPrototypeExtensions=U0;exports.registerType=Bm;exports.relativePathPrefix=Mb;exports.removeAttributeChangeCallback=hm;exports.removeComponent=Nm;exports.removeCustomImportExtensionType=_O;exports.removePatch=LS;exports.resolveUrl=oo;exports.sanitizeString=Ob;exports.saveImage=Kw;exports.screenshot=bR;exports.screenshot2=my;exports.sendDestroyed=Im;exports.serializable=f;exports.serializeObject=L0;exports.serializeable=Be;exports.setActive=Vl;exports.setAllowBalloonMessages=Ab;exports.setAllowOverlayMessages=$x;exports.setAutoFitEnabled=yd;exports.setCameraController=mp;exports.setDestroyed=q0;exports.setDevEnvironment=xS;exports.setDisposable=y0;exports.setDontDestroy=Hr;exports.setOrAddParamsToUrl=up;exports.setParam=wx;exports.setParamWithoutReload=ec;exports.setPeerOptions=GS;exports.setResourceTrackingEnabled=uC;exports.setState=am;exports.setVisibleInCustomShadowRendering=_m;exports.setWorldEuler=ym;exports.setWorldPosition=ot;exports.setWorldPositionXYZ=Zo;exports.setWorldQuaternion=sn;exports.setWorldQuaternionXYZW=mm;exports.setWorldRotation=zb;exports.setWorldRotationXYZ=xc;exports.setWorldScale=pa;exports.showBalloonError=Sc;exports.showBalloonMessage=Ce;exports.showBalloonWarning=de;exports.showDebugConsole=vm;exports.slerp=iS;exports.syncDestroy=Cc;exports.syncField=Rg;exports.syncInstantiate=jm;exports.textureToCanvas=mS;exports.toSourceId=kb;exports.tryCastBinary=n0;exports.tryDetermineMimetypeFromBinary=Vv;exports.tryDetermineMimetypeFromURL=Nv;exports.tryFindObject=fa;exports.tryGetGuid=s0;exports.unregisterHotReloadType=gv;exports.unwatchWrite=lm;exports.useForAutoFit=jb;exports.validate=yt;exports.watchWrite=qd;
|
|
1652
|
+
`),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),Rd(Lp,{element:this.#t}),this.#o?.disconnect(),this.#o??=new MutationObserver(()=>this.#l()),this.#o.observe(this.#e,{attributes:!0}),hp&&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=>{hp&&console.log("Needle Button clicked"),!e.defaultPrevented&&this.#e&&this.#e.click()}}typeof window<"u"&&!window.customElements.get(wb)&&window.customElements.define(wb,rx);const vl=x("debugavatar");class by{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 ax{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 cn;i=S.instantiate(fa(t,e.scene),o)}}else i=t;if(!i)return null;const n=this.findAvatar(i);return n.isValid?(vl&&console.log("[Custom Avatar] valid config",t,vl?n:""),n):(console.warn("[Custom Avatar] config isn't valid",t,vl?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(vl&&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 on().parseSync(e,o,null,0))?.scene??null:null}const i=new q.GLTFLoader;return Gm(i,e),new Promise((n,o)=>{const r=this.avatarRegistryUrl+"/"+t;i.load(r,async a=>{await on().createBuiltinComponents(e,r,a,null,void 0),n(a.scene)},a=>{vl&&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 by(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 lx{get extensionName(){return"DocumentExtension"}onAfterBuildDocument(e){}}class cx{}const nT=Object.freeze(Object.defineProperty({__proto__:null,ActionBuilder:le,ActionCollection:fw,ActionModel:Gt,AlignmentConstraint:Tc,Animation:Ct,AnimationCurve:Kc,AnimationExtension:vu,AnimationTrackHandler:pc,Animator:rt,AnimatorController:Li,Antialiasing:Jc,Attractor:Na,AudioExtension:br,AudioListener:ss,AudioSource:pi,AudioTrackHandler:rs,Avatar:io,AvatarBlink_Simple:mr,AvatarEyeLook_Rotation:tg,AvatarLoader:ax,AvatarMarker:Se,AvatarModel:by,Avatar_Brain_LookAt:lc,Avatar_MouthShapes:Ic,Avatar_MustacheShake:Jm,Avatar_POI:Yo,AxesHelper:ka,BaseUIComponent:Bi,BasicIKConstraint:ng,BehaviorExtension:Dg,BehaviorModel:gt,BloomEffect:Du,BoxCollider:mu,BoxGizmo:Sr,BoxHelperComponent:nt,Button:xs,CallInfo:ns,Camera:Qt,CameraTargetReachedEvent:ac,Canvas:xa,CanvasGroup:no,CapsuleCollider:cs,ChangeMaterialOnClick:Cg,ChangeTransformOnClick:vr,CharacterController:gr,CharacterControllerInput:fs,ChromaticAberration:eh,ClickThrough:Yu,Collider:Jt,ColorAdjustments:_o,ColorBySpeedModule:za,ColorOverLifetimeModule:Ru,ContactShadows:jc,ControlTrackHandler:$u,CursorFollow:Dr,CustomBranding:xr,Deletable:ag,DeleteBox:Ys,DepthOfField:un,DeviceFlag:gu,DocumentExtension:lx,DragControls:Fo,DropListener:ms,Duplicatable:mg,EffectWrapper:fc,EmissionModule:bs,EmphasizeOnClick:Aa,EnvironmentScene:Xu,EventList:oe,EventListEvent:hu,EventSystem:Bt,EventTrigger:_u,FieldWithDefault:Xv,FixedJoint:qg,Fog:Ba,GltfExport:vg,GltfExportBox:_g,Gradient:Pr,Graphic:Hc,GraphicRaycaster:du,GridHelper:Fa,GridLayoutGroup:Ug,GroundProjectedEnv:Bn,GroupActionModel:Uo,HideOnStart:Ei,HingeJoint:qc,HorizontalLayoutGroup:Fg,get HoverAnimation(){return exports.HoverAnimation},Image:qa,InheritVelocityModule:Kg,InputField:dy,InstanceHandle:Ko,InstancingHandler:or,Interactable:rg,Keyframe:Yt,LODGroup:Qc,LODModel:Ua,Light:ii,LimitVelocityOverLifetimeModule:et,LogStats:og,LookAt:uy,LookAtConstraint:pr,MainModule:Mt,MarkerTrackHandler:Vu,MaskableGraphic:Gc,MeshCollider:ho,MeshRenderer:Fc,MinMaxCurve:H,MinMaxGradient:Or,NeedleMenu:Un,NestedGltf:Yc,Networking:Qg,NoiseModule:fe,ObjectRaycaster:fi,OffsetConstraint:Cr,OpenURL:Xa,OrbitControls:ce,Outline:ja,Padding:wr,ParticleBurst:Vd,ParticleSubEmitter:Zg,ParticleSystem:uc,ParticleSystemRenderer:Vi,PhysicsExtension:Lg,PixelationEffect:th,PlayAnimationOnClick:hc,PlayAudioOnClick:to,PlayableDirector:lr,PlayerColor:Sa,PointerEventData:Dc,PostProcessingHandler:ny,PreliminaryAction:Da,PreliminaryTrigger:Nc,RawImage:Gu,Rect:_w,RectTransform:ln,ReflectionProbe:cc,RegisteredAnimationInfo:Gs,RemoteSkybox:Iu,Renderer:Ut,RendererLightmap:ug,Rigidbody:Ve,RotationBySpeedModule:Ni,RotationOverLifetimeModule:dn,SceneSwitcher:Fe,ScreenCapture:bo,ScreenSpaceAmbientOcclusion:vs,ScreenSpaceAmbientOcclusionN8:fn,ScrollFollow:Ss,SeeThrough:ws,SetActiveOnClick:Pg,ShadowCatcher:oh,ShapeModule:Yg,SharpeningEffect:nh,SignalAsset:Nu,SignalReceiver:hh,SignalReceiverEvent:ch,SignalTrackHandler:mc,Size:yw,SizeBySpeedModule:ni,SizeOverLifetimeModule:Mr,SkinnedMeshRenderer:fg,SmoothFollow:Bu,SpatialGrabRaycaster:nr,SpatialHtml:uh,SpatialTrigger:Fu,SpatialTriggerReceiver:Ln,SpectatorCamera:Uu,SphereCollider:Ea,SplineContainer:Tr,SplineData:jn,SplineWalker:Wi,Sprite:gs,SpriteData:da,SpriteRenderer:ei,SpriteSheet:wa,SubEmitterSystem:$d,SyncedCamera:oy,SyncedRoom:pn,SyncedTransform:an,TapGestureTrigger:Mg,TeleportTarget:Pu,TestRunner:ry,TestSimulateUserData:ay,Text:Ot,TextBuilder:jg,TextExtension:Mu,TextureSheetAnimationModule:kt,TiltShiftEffect:Vn,ToneMappingEffect:so,TrailModule:Re,TransformData:ke,TransformGizmo:Ar,TriggerBuilder:St,TriggerModel:Ks,UIRaycastUtils:Qm,UIRootComponent:$c,USDZExporter:nn,USDZText:na,USDZUIExtension:Ng,UsageMarker:Bc,VariantAction:Sg,VelocityOverLifetimeModule:De,VerticalLayoutGroup:Bg,VideoPlayer:Ze,get ViewBox(){return exports.ViewBox},Vignette:Rr,VisibilityAction:Vc,Voip:co,Volume:$a,VolumeParameter:F,VolumeProfile:Tu,WebARCameraBackground:ph,WebARSessionRoot:di,WebXR:Ou,WebXRImageTracking:mh,WebXRImageTrackingModel:Ps,WebXRPlaneTracking:Os,WebXRTrackedImage:Ca,XRControllerFollow:Cs,XRControllerModel:hs,XRControllerMovement:gi,XRFlag:Ti,XRRig:Ju,XRState:jt,__Ignore:cx},Symbol.toStringTag,{value:"Module"})),yc=x("debugmissingcamera");ae.registerCallback(re.MissingCamera,s=>{yc&&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 Qt;if(i.sourceId=s.files?.[0]?.src??"unknown",i.fieldOfView=35,s.context.domElement.getAttribute("transparent")!=null)i.clearFlags=Qo.Uninitialized;else if(s.context.domElement.getAttribute("background-image")?.length||s.context.lightmaps.tryGetSkybox(i.sourceId))i.clearFlags=Qo.Skybox;else{if(i.clearFlags=Qo.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 Xu("neutral");e.environment=a.fromScene(l,.025).texture}}const o=Wo(t,i,!0);return t.position.x=0,t.position.y=1,t.position.z=2,s.context.domElement?.cameraControls!=!1&&hx(s.context,o),o});ae.registerCallback(re.ContextCreated,s=>{if(!s.context.mainCamera){yc&&console.log("Will not auto-fit because a default camera exists");return}if(s.context.domElement?.cameraControls==!0){if(Ib(s.context.mainCamera)?.isCameraController==!0){yc&&console.log("Will not auto-fit because a camera controller exists");return}hx(s.context)}});function hx(s,e){e=e??s.mainCameraComponent;const t=e?.gameObject;if(yc&&console.log("Creating default camera controls",e?.name),t){const i=Oc(t,ce);i.sourceId=e?.sourceId??"unknown";const n=s.domElement.getAttribute("auto-rotate");i.autoRotate=n!="0"&&n?.toLowerCase()!="false";const o=Number.parseFloat(n||".5");i.autoRotateSpeed=isNaN(o)?.5:o,yc&&console.log("Auto-rotate",i.autoRotate,"speed:",i.autoRotateSpeed);const r=s.domElement.getAttribute("auto-fit");i.autoFit=r!=="0"&&r?.toLowerCase()!="false",i.autoTarget=!0}else console.warn("Missing camera object, can not add orbit controls")}ae.registerCallback(re.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)S.foreachComponent(t.file.scene,n=>{if(n.enabled!==!1){if(n instanceof Ct&&n.playAutomatically||n instanceof rt||n instanceof lr&&n.playOnAwake===!0)return!0;if(n instanceof Ct)return n.playAutomatically=!0,!0;if(n instanceof lr)return n.playOnAwake=!0,!0}},!0)!==!0&&eo.autoplayAnimations(t.file)});exports.SplineUtils=void 0;(s=>{function e(t,i=!1,n=.75){const o=new Tr,r=1-I.clamp(n,0,1);return t.forEach((a,l)=>{const h=new c.Vector3;l<t.length-1?h.subVectors(t[l+1],a).normalize().multiplyScalar(r):i&&t.length>1&&h.subVectors(t[0],a).normalize().multiplyScalar(r);const d=new jn;d.position.copy(a),d.tangentIn.copy(h),d.tangentOut.copy(h),o.addKnot(d)}),o.closed=i,o}s.createFromPoints=e})(exports.SplineUtils||(exports.SplineUtils={}));class sT extends se.WorkerBase{constructor(){super(new Worker(new URL("/generateMeshBVH.worker-2qGLkQjg.js",typeof document>"u"?require("url").pathToFileURL(__filename).href:tf&&tf.tagName.toUpperCase()==="SCRIPT"&&tf.src||new URL("needle-engine.bundle-DPVYipMl.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 _=new c.BufferAttribute(u.index,1,!1);t.setIndex(_)}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 oT=Object.freeze(Object.defineProperty({__proto__:null,GenerateMeshBVHWorker:sT},Symbol.toStringTag,{value:"Module"}));exports.$physicsKey=AP;exports.ActionBuilder=le;exports.ActionCollection=fw;exports.ActionModel=Gt;exports.Addressables=Y0;exports.AlignmentConstraint=Tc;exports.AmbientMode=ca;exports.Animation=Ct;exports.AnimationCurve=Kc;exports.AnimationExtension=vu;exports.AnimationTrackHandler=pc;exports.AnimationUtils=eo;exports.Animator=rt;exports.AnimatorConditionMode=Ns;exports.AnimatorController=Li;exports.AnimatorControllerParameterType=qm;exports.AnimatorStateInfo=Pl;exports.Antialiasing=Jc;exports.Application=rn;exports.AssetDatabase=f0;exports.AssetReference=Y;exports.Attractor=Na;exports.AudioExtension=br;exports.AudioListener=ss;exports.AudioSource=pi;exports.AudioTrackHandler=rs;exports.Avatar=io;exports.AvatarBlink_Simple=mr;exports.AvatarEyeLook_Rotation=tg;exports.AvatarLoader=ax;exports.AvatarMarker=Se;exports.AvatarModel=by;exports.Avatar_Brain_LookAt=lc;exports.Avatar_MouthShapes=Ic;exports.Avatar_MustacheShake=Jm;exports.Avatar_POI=Yo;exports.Axes=ta;exports.AxesHelper=ka;exports.BUILD_TIME=wm;exports.BaseUIComponent=Bi;exports.BasicIKConstraint=ng;exports.BehaviorExtension=Dg;exports.BehaviorModel=gt;exports.BloomEffect=Du;exports.BoxCollider=mu;exports.BoxGizmo=Sr;exports.BoxHelperComponent=nt;exports.Button=xs;exports.ButtonsFactory=Zi;exports.CallDirection=Av;exports.CallInfo=ns;exports.Camera=Qt;exports.CameraTargetReachedEvent=ac;exports.Canvas=xa;exports.CanvasGroup=no;exports.CapsuleCollider=cs;exports.ChangeMaterialOnClick=Cg;exports.ChangeTransformOnClick=vr;exports.CharacterController=gr;exports.CharacterControllerInput=fs;exports.ChromaticAberration=eh;exports.CircularBuffer=ui;exports.ClearFlags=Qo;exports.ClickThrough=Yu;exports.ClipExtrapolation=vn;exports.Collider=Jt;exports.Collision=Ev;exports.CollisionDetectionMode=cu;exports.ColorAdjustments=_o;exports.ColorBySpeedModule=za;exports.ColorOverLifetimeModule=Ru;exports.Component=U1;exports.Component$1=M;exports.ComponentLifecycleEvents=eu;exports.Components=nT;exports.ConnectionEvents=a0;exports.ContactPoint=kv;exports.ContactShadows=jc;exports.Context=z;exports.ContextArgs=C1;exports.ContextEvent=re;exports.ContextRegistry=ae;exports.ControlTrackHandler=$u;exports.CursorFollow=Dr;exports.CustomBranding=xr;exports.CustomShader=ye;exports.DefaultReflectionMode=Ed;exports.Deletable=ag;exports.DeleteBox=Ys;exports.DepthOfField=un;exports.DeviceFlag=gu;exports.DocumentExtension=lx;exports.DragControls=Fo;exports.DragMode=lg;exports.DropListener=ms;exports.Duplicatable=mg;exports.EffectWrapper=fc;exports.EmissionModule=bs;exports.EmphasizeOnClick=Aa;exports.EngineLoadingView=gc;exports.EnvironmentScene=Xu;exports.EventList=oe;exports.EventListEvent=hu;exports.EventSystem=Bt;exports.EventTrigger=_u;exports.FieldWithDefault=Xv;exports.FileReference=qo;exports.FileReferenceSerializer=Z0;exports.FileSpawnModel=tO;exports.File_Event=Uv;exports.FixedJoint=qg;exports.Fog=Ba;exports.FrameEvent=pe;exports.GENERATOR=Qd;exports.GameObject=S;exports.Gizmos=B;exports.GltfExport=vg;exports.GltfExportBox=_g;exports.Gradient=Pr;exports.Graphic=Hc;exports.GraphicRaycaster=du;exports.Graphics=Js;exports.GridHelper=Fa;exports.GridLayoutGroup=Ug;exports.GroundProjectedEnv=Bn;exports.GroupActionModel=Uo;exports.HideFlags=uu;exports.HideOnStart=Ei;exports.HingeJoint=qc;exports.HorizontalLayoutGroup=Fg;exports.HostData=PC;exports.Image=qa;exports.ImageReference=Go;exports.ImageReferenceSerializer=K0;exports.InheritVelocityModule=Kg;exports.Input=t0;exports.InputEventQueue=Xt;exports.InputEvents=xe;exports.InputField=dy;exports.InstanceHandle=Ko;exports.InstancingHandler=or;exports.InstancingUtil=Di;exports.InstantiateEvent=C0;exports.InstantiateIdProvider=mt;exports.InstantiateOptions=cn;exports.Interactable=rg;exports.JoinedRoomResponse=QS;exports.KeyEventArgs=FS;exports.Keyframe=Yt;exports.LODGroup=Qc;exports.LODModel=Ua;exports.LeftRoomResponse=YS;exports.Light=ii;exports.LightData=nv;exports.LimitVelocityOverLifetimeModule=et;exports.LoadingElementOptions=VR;exports.LogStats=og;exports.LogType=hi;exports.LookAt=uy;exports.LookAtConstraint=pr;exports.MainModule=Mt;exports.MarkerTrackHandler=Vu;exports.MarkerType=ly;exports.MaskableGraphic=Gc;exports.Mathf=I;exports.MeshCollider=ho;exports.MeshRenderer=Fc;exports.MinMaxCurve=H;exports.MinMaxGradient=Or;exports.NEKeyboardEvent=wl;exports.NEPointerEvent=Zn;exports.NeedleButtonElement=rx;exports.NeedleEngineWebComponent=_y;exports.NeedleMenu=Un;exports.NeedlePatchesKey=Zh;exports.NeedleXRController=Pm;exports.NeedleXRSession=G;exports.NeedleXRSync=h0;exports.NeedleXRUtils=u0;exports.NestedGltf=Yc;exports.NetworkConnection=c0;exports.NetworkedStreamEvents=kn;exports.NetworkedStreams=Lc;exports.Networking=Qg;exports.NewInstanceModel=O0;exports.NoiseModule=fe;exports.ObjectRaycaster=fi;exports.ObjectUtils=hr;exports.OffsetConstraint=Cr;exports.OneEuroFilter=Yh;exports.OneEuroFilterXYZ=fm;exports.OpenURL=Xa;exports.OrbitControls=ce;exports.Outline=ja;exports.OwnershipEvent=l0;exports.OwnershipModel=Em;exports.PUBLIC_KEY=Zr;exports.Padding=wr;exports.ParticleBurst=Vd;exports.ParticleSubEmitter=Zg;exports.ParticleSystem=uc;exports.ParticleSystemBaseBehaviour=yo;exports.ParticleSystemRenderer=Vi;exports.ParticleSystemShapeType=Nd;exports.PeerHandle=os;exports.PeerNetworking=r0;exports.Physics=_a;exports.PhysicsExtension=Lg;exports.PhysicsMaterialCombine=it;exports.PixelationEffect=th;exports.PlayAnimationOnClick=hc;exports.PlayAudioOnClick=to;exports.PlayableDirector=lr;exports.PlayerColor=Sa;exports.PlayerState=Ji;exports.PlayerStateEvent=gw;exports.PlayerSync=Tg;exports.PlayerView=ev;exports.PlayerViewManager=tv;exports.PointerEventData=Dc;exports.PointerType=Zd;exports.PostProcessingEffect=$e;exports.PostProcessingEffectOrder=Ke;exports.PostProcessingHandler=ny;exports.PreliminaryAction=Da;exports.PreliminaryTrigger=Nc;exports.PrimitiveType=Jo;exports.Progress=ie;exports.PromiseAllWithErrors=dm;exports.PromiseErrorResult=fp;exports.RGBAColor=Z;exports.RapierPhysics=ua;exports.RawImage=Gu;exports.RaycastOptions=lo;exports.Rect=_w;exports.RectTransform=ln;exports.ReflectionProbe=cc;exports.RegisteredAnimationInfo=Gs;exports.RemoteSkybox=Iu;exports.RenderTexture=Mn;exports.RenderTextureSerializer=Cv;exports.Renderer=Ut;exports.RendererData=iv;exports.RendererLightmap=ug;exports.Rigidbody=Ve;exports.RigidbodyConstraints=Ie;exports.RoomEvents=Q;exports.RotationBySpeedModule=Ni;exports.RotationOverLifetimeModule=dn;exports.SceneLightSettings=jd;exports.SceneSwitcher=Fe;exports.ScreenCapture=bo;exports.ScreenSpaceAmbientOcclusion=vs;exports.ScreenSpaceAmbientOcclusionN8=fn;exports.ScrollFollow=Ss;exports.SeeThrough=ws;exports.SendQueue=Ki;exports.SerializationContext=zm;exports.SetActiveOnClick=Pg;exports.ShadowCatcher=oh;exports.ShapeModule=Yg;exports.ShapeOverlapResult=Rv;exports.SharpeningEffect=nh;exports.SignalAsset=Nu;exports.SignalReceiver=hh;exports.SignalReceiverEvent=ch;exports.SignalTrackHandler=mc;exports.Size=yw;exports.SizeBySpeedModule=ni;exports.SizeOverLifetimeModule=Mr;exports.SkinnedMeshRenderer=fg;exports.SmoothFollow=Bu;exports.SpatialGrabRaycaster=nr;exports.SpatialHtml=uh;exports.SpatialTrigger=Fu;exports.SpatialTriggerReceiver=Ln;exports.SpectatorCamera=Uu;exports.SphereCollider=Ea;exports.SphereIntersection=Am;exports.SplineContainer=Tr;exports.SplineData=jn;exports.SplineWalker=Wi;exports.Sprite=gs;exports.SpriteData=da;exports.SpriteRenderer=ei;exports.SpriteSheet=wa;exports.StateMachineBehaviour=H1;exports.StreamEndedEvent=Km;exports.StreamReceivedEvent=Tv;exports.SubEmitterSystem=$d;exports.SyncedCamera=oy;exports.SyncedRoom=pn;exports.SyncedTransform=an;exports.TapGestureTrigger=Mg;exports.TeleportTarget=Pu;exports.TestRunner=ry;exports.TestSceneUtils=KR;exports.TestSimulateUserData=ay;exports.Text=Ot;exports.TextBuilder=jg;exports.TextExtension=Mu;exports.TextureSheetAnimationModule=kt;exports.TiltShiftEffect=Vn;exports.Time=sv;exports.ToneMappingEffect=so;exports.TrackHandler=Ga;exports.TrackType=ri;exports.TrailModule=Re;exports.TransformData=ke;exports.TransformGizmo=Ar;exports.TriggerBuilder=St;exports.TriggerModel=Ks;exports.TypeStore=P;exports.UIRaycastUtils=Qm;exports.UIRootComponent=$c;exports.USDDocument=wg;exports.USDObject=Ne;exports.USDWriter=sw;exports.USDZExporter=nn;exports.USDZExporter$1=ow;exports.USDZText=na;exports.USDZUIExtension=Ng;exports.UriSerializer=Pv;exports.UsageMarker=Bc;exports.UserJoinedOrLeftRoomModel=KS;exports.VERSION=en;exports.VariantAction=Sg;exports.VelocityOverLifetimeModule=De;exports.VerticalLayoutGroup=Bg;exports.VideoPlayer=Ze;exports.ViewDevice=qs;exports.Vignette=Rr;exports.VisibilityAction=Vc;exports.Voip=co;exports.Volume=$a;exports.VolumeParameter=F;exports.VolumeProfile=Tu;exports.WaitForFrames=n1;exports.WaitForPromise=J0;exports.WaitForSeconds=$m;exports.Watch=as;exports.WebARCameraBackground=ph;exports.WebARSessionRoot=di;exports.WebXR=Ou;exports.WebXRButtonFactory=Zs;exports.WebXRImageTracking=mh;exports.WebXRImageTrackingModel=Ps;exports.WebXRPlaneTracking=Os;exports.WebXRTrackedImage=Ca;exports.XRControllerFollow=Cs;exports.XRControllerModel=hs;exports.XRControllerMovement=gi;exports.XRFlag=Ti;exports.XRRig=Ju;exports.XRState=jt;exports.XRStateFlag=Pn;exports.__Ignore=cx;exports.__internalNotifyObjectDestroyed=pC;exports.activeInHierarchyFieldName=ls;exports.addAttributeChangeCallback=cm;exports.addComponent=tn;exports.addCustomExtensionPlugin=yO;exports.addNewComponent=Wo;exports.addPatch=Yd;exports.apply=iu;exports.applyHMRChanges=F1;exports.applyPrototypeExtensions=F0;exports.beginListenDestroy=P0;exports.beginListenInstantiate=k0;exports.binaryIdentifierCasts=Om;exports.build_scene_functions=S1;exports.builtinComponentKeyName=Do;exports.calculateProgress01=yy;exports.clearMessages=qx;exports.colorSerializer=lP;exports.compareAssociation=A0;exports.componentSerializer=ad;exports.copyTexture=Vb;exports.createMotion=bv;exports.debugNet=Nt;exports.debugOwner=xl;exports.decompressGpuTexture=cw;exports.deepClone=bc;exports.delay=In;exports.delayForFrames=vc;exports.deserializeObject=Md;exports.destroy=ji;exports.destroyComponentInstance=N0;exports.determineMimeTypeFromExtension=zv;exports.disposeObjectResources=_e;exports.disposeStream=En;exports.editorGuidKeyName=Ul;exports.enableSpatialConsole=No;exports.euler=hP;exports.eventListSerializer=pP;exports.exportAsGLTF=eT;exports.findByGuid=Vm;exports.findObjectOfType=Oa;exports.findObjectsOfType=$0;exports.findResourceUsers=Dm;exports.fitCamera=vv;exports.fitObjectIntoVolume=Wb;exports.foreachComponent=tr;exports.foreachComponentEnumerator=su;exports.forward=dS;exports.generateQRCode=Eb;exports.generateSeed=M0;exports.getBoundingBox=Ft;exports.getCameraController=Ib;exports.getComponent=ur;exports.getComponentInChildren=kc;exports.getComponentInParent=sc;exports.getComponents=Mc;exports.getComponentsInChildren=Pa;exports.getComponentsInParent=tu;exports.getFormattedDate=ew;exports.getIconElement=pt;exports.getIconTexture=Dp;exports.getLoader=on;exports.getOrAddComponent=Oc;exports.getParam=x;exports.getParentHierarchyPath=pS;exports.getPath=Cx;exports.getPeerOptions=HS;exports.getPeerjsInstance=o0;exports.getResourceUserCount=gC;exports.getTempColor=Fb;exports.getTempQuaternion=qt;exports.getTempVector=j;exports.getUrlParams=_c;exports.getVisibleInCustomShadowRendering=$b;exports.getWorldDirection=Ub;exports.getWorldEuler=gm;exports.getWorldPosition=X;exports.getWorldQuaternion=ue;exports.getWorldRotation=Xd;exports.getWorldScale=je;exports.hasCommercialLicense=Xs;exports.hasIndieLicense=Rc;exports.hasPointerEventComponent=Dd;exports.hasProLicense=Dn;exports.hideDebugConsole=Xb;exports.imageToCanvas=hw;exports.instantiate=ir;exports.invokeLoadedImportPluginHooks=qv;exports.invokeXRSessionEnd=e0;exports.invokeXRSessionStart=Jb;exports.isActiveInHierarchy=W0;exports.isActiveSelf=Ma;exports.isAndroidDevice=Rx;exports.isAnimationAction=Nb;exports.isComponent=Mv;exports.isDebugMode=vx;exports.isDesktop=Ox;exports.isDestroyed=er;exports.isDevEnvironment=T;exports.isDisposed=fC;exports.isExporting=ZR;exports.isGLTFModel=Ov;exports.isHostedOnGlitch=xb;exports.isHotReloadEnabled=Fp;exports.isHotReloading=j1;exports.isIPad=kx;exports.isIconElement=av;exports.isLocalNetwork=Ii;exports.isMacOS=Ax;exports.isMobileDevice=Mx;exports.isMozillaXR=Tx;exports.isQuest=Ix;exports.isResourceTrackingEnabled=m0;exports.isSafari=Lx;exports.isUsingInstancing=nu;exports.isiOS=Dx;exports.isiPad=Ex;exports.loadAsset=jR;exports.loadPMREM=zw;exports.loadSync=gy;exports.logHierarchy=bd;exports.lookAtInverse=nS;exports.lookAtObject=wc;exports.lookAtScreenPoint=sS;exports.makeId=xx;exports.makeIdFromRandomWords=Pb;exports.makeNameSafe=mi;exports.markAsInstancedRendered=H0;exports.microphonePermissionsGranted=jx;exports.nameof=bx;exports.nameofFactory=Sb;exports.objectSerializer=Sv;exports.offXRSessionEnd=BS;exports.offXRSessionStart=jS;exports.onAfterRender=L1;exports.onBeforeRender=D1;exports.onClear=T1;exports.onDestroy=A1;exports.onInitialized=uv;exports.onStart=au;exports.onUpdate=fv;exports.onXRSessionEnd=Cm;exports.onXRSessionStart=Kd;exports.parseSync=tx;exports.placeOnSurface=Hb;exports.postprocessFBXMaterials=bm;exports.prefix=iP;exports.pushState=Cb;exports.randomNumber=Sx;exports.registerBinaryType=Mm;exports.registerComponent=ru;exports.registerComponentExtension=hg;exports.registerCustomEffectType=$i;exports.registerExportExtensions=dg;exports.registerExtensions=Fd;exports.registerHotReloadType=mv;exports.registerLoader=xm;exports.registerPrefabProvider=R0;exports.registerPrototypeExtensions=U0;exports.registerType=Bm;exports.relativePathPrefix=Mb;exports.removeAttributeChangeCallback=hm;exports.removeComponent=Nm;exports.removeCustomImportExtensionType=_O;exports.removePatch=LS;exports.resolveUrl=oo;exports.sanitizeString=Ob;exports.saveImage=Kw;exports.screenshot=bR;exports.screenshot2=my;exports.sendDestroyed=Im;exports.serializable=f;exports.serializeObject=L0;exports.serializeable=Be;exports.setActive=Vl;exports.setAllowBalloonMessages=Ab;exports.setAllowOverlayMessages=$x;exports.setAutoFitEnabled=yd;exports.setCameraController=mp;exports.setDestroyed=q0;exports.setDevEnvironment=xS;exports.setDisposable=y0;exports.setDontDestroy=Hr;exports.setOrAddParamsToUrl=up;exports.setParam=wx;exports.setParamWithoutReload=ec;exports.setPeerOptions=GS;exports.setResourceTrackingEnabled=uC;exports.setState=am;exports.setVisibleInCustomShadowRendering=_m;exports.setWorldEuler=ym;exports.setWorldPosition=ot;exports.setWorldPositionXYZ=Zo;exports.setWorldQuaternion=sn;exports.setWorldQuaternionXYZW=mm;exports.setWorldRotation=zb;exports.setWorldRotationXYZ=xc;exports.setWorldScale=pa;exports.showBalloonError=Sc;exports.showBalloonMessage=Ce;exports.showBalloonWarning=de;exports.showDebugConsole=vm;exports.slerp=iS;exports.syncDestroy=Cc;exports.syncField=Rg;exports.syncInstantiate=jm;exports.textureToCanvas=mS;exports.toSourceId=kb;exports.tryCastBinary=n0;exports.tryDetermineMimetypeFromBinary=Vv;exports.tryDetermineMimetypeFromURL=Nv;exports.tryFindObject=fa;exports.tryGetGuid=s0;exports.unregisterHotReloadType=gv;exports.unwatchWrite=lm;exports.useForAutoFit=jb;exports.validate=yt;exports.watchWrite=qd;
|