@needle-tools/engine 4.8.8-next.857d744 → 4.8.8

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 CHANGED
@@ -12,11 +12,10 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
12
12
  - Change: OrbitControls with locked target constraint is now updating the constraint position when calling e.g. `setTargetPosition`
13
13
  - Add: `setCameraFocusRect` method on Needle Context for easier responsive layouting.
14
14
  With this you can e.g. overlay the webgl scene with HTML elements and pass in a div element for keeping important elements visible.
15
- [Example 1 Website](https://responsive-layout-z23hmxb22no6t.needle.run/) | [Code on Stackblitz](<https://stackblitz.com/edit/needle-engine-camera-focus-rect?file=src%2Fsidebar.ts,index.html,src%2Fmain.ts>)
16
- [![](https://cdn.needle.tools/static/images/changelog/4.8.8-focus-thumbnail.jpg)](https://responsive-layout-z23hmxb22no6t.needle.run/)
17
- [Example 2 Website](https://responsive-layout-click-example-z23hmxbzuyk6y.needle.run/) | [Code on Stackblitz](<https://stackblitz.com/edit/needle-engine-camera-focus-rect-click-to-move?file=index.html,src%2Fmain.ts>)
18
- [![](https://cdn.needle.tools/static/images/changelog/4.8.8-focus-2-thumbnail.jpg?)](https://responsive-layout-click-example-z23hmxbzuyk6y.needle.run/)
19
-
15
+ [Example 1 Website](<https://responsive-layout-z23hmxb22no6t.needle.run/>) | [Code on Stackblitz](<https://stackblitz.com/edit/needle-engine-camera-focus-rect?file=src%2Fsidebar.ts,index.html,src%2Fmain.ts>)
16
+ [![](https://cdn.needle.tools/static/images/changelog/4.8.8-focus-thumbnail.jpg)](<https://responsive-layout-z23hmxb22no6t.needle.run/>)
17
+ [Example 2 Website](<https://responsive-layout-click-example-z23hmxbzuyk6y.needle.run/>) | [Code on Stackblitz](<https://stackblitz.com/edit/needle-engine-camera-focus-rect-click-to-move?file=index.html,src%2Fmain.ts>)
18
+ [![](https://cdn.needle.tools/static/images/changelog/4.8.8-focus-2-thumbnail.jpg?)](<https://responsive-layout-click-example-z23hmxbzuyk6y.needle.run/>)
20
19
 
21
20
  ## [4.8.7] - 2025-08-27
22
21
  - Add: New [@needle-tools/three-animation-pointer](<https://www.npmjs.com/package/@needle-tools/three-animation-pointer>) package
package/README.md CHANGED
@@ -1,61 +1,69 @@
1
1
  # Needle Engine
2
2
 
3
- <img src="https://engine.needle.tools/docs/imgs/banner.webp" />
3
+ <!-- <img src="https://engine.needle.tools/docs/imgs/banner.webp" /> -->
4
4
 
5
5
  **[Needle Engine](https://needle.tools)** is a fast web engine for complex and simple 3D applications alike.
6
- It is flexible, extensible and has built-in support for collaboration and XR! It is built around the **glTF standard** for 3D assets.
7
-
6
+ It is flexible, extensible and has built-in support for collaboration and XR! It is built around the **glTF standard** for 3D assets and is using three.js under the hood - so all your existing knowledge applies.
8
7
 
8
+ → 📑 [Documentation](https://docs.needle.tools)
9
+ → 💎 [Samples](https://samples.needle.tools)
10
+ → 🏓 [Changelog](https://github.com/needle-tools/needle-engine-support/releases)
9
11
 
10
12
  ## Features
11
- - Powered by three.js
13
+ - Components System: Add your custom components with easy
12
14
  - WebXR support & iOS Quicklook support for interactive AR
13
- - Builtin Networking
15
+ - Networking is built-in
14
16
  - Advanced PBR Rendering
15
17
  - Animate Everything
16
18
  - Animation Statemachines & Timeline Animations
17
19
  - Lightmaps
18
20
  - Physics
19
21
  - Postprocessing
20
- - Custom Components and Scripting
21
- - Automatic Texture & Mesh LOD Generation
22
+ - Texture & Mesh LOD Generation
22
23
  - Progressive Texture and Mesh Loading
23
24
  *Higher resolution assets are loaded on demand*
24
25
  - Dynamic Content Loading & Multi-Scene support
25
26
  - Integrations for Unity or Blender
26
27
  - Commercial & Educational Licenses
27
- - [Hosting and asset optimization](https://cloud.needle.tools)
28
- - [More features](https://docs.needle.tools/features)
28
+ - [ more features](https://docs.needle.tools/features)
29
29
 
30
30
 
31
31
  <br />
32
32
 
33
- [Needle Engine Changelog](https://github.com/needle-tools/needle-engine-support/releases)
34
33
 
35
34
 
36
35
  ## Editor Integrations
37
36
 
38
- **Powerful integrations for Unity and Blender** allow artists and developers to collaborate and manage web applications inside battle-tested 3d editors. Needle Engine integrations allow you to use editor features for exporting models, author materials, animate and sequence animations, bake lightmaps and more.
37
+ **Powerful integrations for Unity and Blender** allow artists and developers to collaborate and manage web applications inside battle-tested 3d editors. Needle Engine integrations allow you to use editor features for exporting models, author materials, animate and sequence animations, bake lightmaps and more.
38
+ - 🎲 [Download Unity Integration](https://engine.needle.tools/downloads/unity)
39
+ - 🐵 [Download Blender Integration](https://engine.needle.tools/downloads/blender)
40
+ - 📜 [Code only](https://engine.needle.tools/docs/three/)
39
41
 
40
- - [Download Unity Integration](https://engine.needle.tools/downloads/unity)
41
42
 
42
- - [Download Blender Integration](https://engine.needle.tools/downloads/blender)
43
+ ## Getting Started
43
44
 
44
- - [Try on Stackblitz](https://stackblitz.com/@marwie/collections/needle-engine)
45
+ Follow the [Getting Started Guide](https://docs.needle.tools/getting-started) to download and install Needle Engine or [try one of our samples](https://engine.needle.tools/samples)
45
46
 
46
47
 
47
- ## Getting Started
48
+ ## Examples
48
49
 
49
- Follow the [Getting Started Guide](https://docs.needle.tools/getting-started) to download and install Needle Engine.
50
- You can also find a [list of sample projects](https://engine.needle.tools/samples) that you can try live in the browser and download to give your project a headstart.
51
- For writing custom components read the [Scripting Guide](https://docs.needle.tools/scripting) or try [Needle Engine on StackBlitz](https://stackblitz.com/@marwie/collections/needle-engine) ⚡
50
+ ### [Custom loading overlay & wait for LODs](https://lods-loading-overlay-z23hmxbz29h8vr.needle.run/) | [Code on Stackblitz](https://stackblitz.com/edit/needle-engine-wait-for-lods?file=README.md)
52
51
 
52
+ ### [Motors & More Shop Example with React](https://reactshoppingcart-z23hmxbzcfkmf.needle.run/) | [Code on Stackblitz](https://stackblitz.com/edit/needle-react-shopping-cart-2)
53
53
 
54
- ## Examples
55
- - [Needle Engine Stackblitz Collection](https://stackblitz.com/@marwie/collections/needle-engine)
56
- - [Custom loading overlay & wait for LODs](https://lods-loading-overlay-z23hmxbz29h8vr.needle.run/), [Stackblitz](https://stackblitz.com/edit/needle-engine-wait-for-lods?file=README.md)
57
- - [Motors & More Shop Example with React](https://reactshoppingcart-z23hmxbzcfkmf.needle.run/), [Stackblitz](https://stackblitz.com/edit/needle-react-shopping-cart-2)
58
- - [Postprocessing Effects with custom Magnifier effect](https://antialiasing-and-postprocessing-zubcksz1o8daw.needle.run/), [Stackblitz](https://stackblitz.com/edit/needle-engine-postprocessing?file=README.md)
54
+ ### [Postprocessing Effects with custom Magnifier effect](https://antialiasing-and-postprocessing-zubcksz1o8daw.needle.run/) | [Code on Stackblitz](https://stackblitz.com/edit/needle-engine-postprocessing?file=README.md)
55
+ [![](https://cdn.needle.tools/static/images/changelog/magnifier-postprocessing-example-thumbnail.jpg)](https://antialiasing-and-postprocessing-zubcksz1o8daw.needle.run/)
56
+
57
+ ### [AR Restaurant Example](https://ar-restaurant-example-zubcks1t14le.needle.run/) | [Code on Github](https://github.com/needle-engine/ar-restaurant-example)
58
+
59
+ ### [Camera Focus DIV Example 1](https://responsive-layout-z23hmxb22no6t.needle.run/) | [Code on Stackblitz](<https://stackblitz.com/edit/needle-engine-camera-focus-rect?file=src%2Fsidebar.ts,index.html,src%2Fmain.ts>)
60
+ [![](https://cdn.needle.tools/static/images/changelog/4.8.8-focus-thumbnail.jpg)](https://responsive-layout-z23hmxb22no6t.needle.run/)
61
+
62
+ ### [Camera Focus DIV Example 2](https://responsive-layout-click-example-z23hmxbzuyk6y.needle.run/) | [Code on Stackblitz](<https://stackblitz.com/edit/needle-engine-camera-focus-rect-click-to-move?file=index.html,src%2Fmain.ts>)
63
+ [![](https://cdn.needle.tools/static/images/changelog/4.8.8-focus-2-thumbnail.jpg?)](https://responsive-layout-click-example-z23hmxbzuyk6y.needle.run/)
64
+
65
+
66
+ 👋 Find more examples on [samples.needle.tools](https://samples.needle.tools/), [docs.needle.tools](https://docs.needle.tools) and in the [Needle Engine Stackblitz Collection](https://stackblitz.com/@marwie/collections/needle-engine)
59
67
 
60
68
  <br />
61
69
 
@@ -54,7 +54,7 @@ div[data-needle_engine_debug_overlay] .error strong {
54
54
  color: white;
55
55
  overflow: auto;
56
56
  word-break: break-word;
57
- `,o.shadowRoot?o.shadowRoot.appendChild(t):o.appendChild(t);const i=document.createElement("style");return i.innerHTML=mP,t.appendChild(i),t}}const db=Symbol("logtype"),rd=new Map;function ub(o){o.remove();const e=o[db],t=rd.get(e)??[];t.push(o),rd.set(e,t)}function fP(o,e){if(rd.has(o)){const i=rd.get(o);if(i.length>0){const n=i.pop();return n.innerHTML=e,n}}const t=document.createElement("div");switch(t.setAttribute("data-id","__needle_engine_debug_overlay"),t.style.marginRight="5px",t.style.padding=".5em",t.style.backgroundColor="rgba(0,0,0,.9)",t.style.marginTop="5px",t.style.marginBottom="3px",t.style.borderRadius="8px",t.style.pointerEvents="all",t.style.userSelect="text",t.style.maxWidth="250px",t.style.whiteSpace="pre-wrap",t.style["backdrop-filter"]="blur(10px)",t.style["-webkit-backdrop-filter"]="blur(10px)",t.style.backgroundColor="rgba(20,20,20,.8)",t.style.boxShadow="inset 0 0 80px rgba(0,0,0,.2), 0 0 5px rgba(0,0,0,.2)",t.style.border="1px solid rgba(160,160,160,.2)",t[db]=o,o){case 0:t.classList.add("log"),t.style.color="rgba(200,200,200,.7)",t.style.backgroundColor="rgba(40,40,40,.7)";break;case 1:t.classList.add("warn"),t.style.color="rgb(255, 255, 150)",t.style.backgroundColor="rgba(50,50,20,.8)";break;case 2:t.classList.add("error"),t.style.color="rgb(255, 50, 50",t.style.backgroundColor="rgba(50,20,20,.8)";break}return t.title="Open the browser console (F12) for more information",t.innerHTML=e,t}class yP{random(e,t){return Array.isArray(e)?e.length<=0?null:e[Math.floor(Math.random()*e.length)]:e!==void 0&&t!==void 0?Math.random()*(t-e)+e:Math.random()}randomVector3(e,t=0,i=1){e.x=this.random(t,i),e.y=this.random(t,i),e.z=this.random(t,i)}clamp(e,t,i){return e<t?t:e>i?i:e}clamp01(e){return this.clamp(e,0,1)}lerp(e,t,i){return i=i<0?0:i,i=i>1?1:i,e+(t-e)*i}inverseLerp(e,t,i){return(i-e)/(t-e)}remap(e,t,i,n,s){return n+(s-n)*(e-t)/(i-t)}moveTowards(e,t,i){return e+=i,(i<0&&e<t||i>0&&e>t)&&(e=t),e}Rad2Deg=180/Math.PI;Deg2Rad=Math.PI/180;Epsilon=1e-5;toDegrees(e){return e*180/Math.PI}toRadians(e){return e*Math.PI/180}tan(e){return Math.tan(e)}gammaToLinear(e){return Math.pow(e,2.2)}linearToGamma(e){return Math.pow(e,1/2.2)}approximately(e,t,i=Number.EPSILON){for(const n of bP){const s=e[n],r=t[n];if(s===void 0||r===void 0)break;if(Math.abs(s-r)>i)return!1}return!0}easeInOutCubic(e){return e<.5?4*e*e*e:1-Math.pow(-2*e+2,3)/2}}const bP=["x","y","z","w"],D=new yP;class pb{y;s;alpha=0;constructor(e){this.setAlpha(e),this.y=null,this.s=null}setAlpha(e){if(e<=0||e>1)throw new Error;this.alpha=e}filter(e,t){t&&this.setAlpha(t);let i;return this.y?i=this.alpha*e+(1-this.alpha)*this.s:i=e,this.y=e,this.s=i,i}lastValue(){return this.y}reset(e){this.y=e,this.s=e}}class ad{freq;minCutOff;beta;dCutOff;x;dx;lasttime;constructor(e,t=1,i=0,n=1){if(e<=0||t<=0||n<=0)throw new Error;this.freq=e,this.minCutOff=t,this.beta=i,this.dCutOff=n,this.x=new pb(this.alpha(this.minCutOff)),this.dx=new pb(this.alpha(this.dCutOff)),this.lasttime=null}alpha(e){const t=1/this.freq;return 1/(1+1/(2*Math.PI*e)/t)}filter(e,t=null){this.lasttime&&t&&(this.freq=1/(t-this.lasttime)),this.lasttime=t;const i=this.x.lastValue(),n=i?(e-i)*this.freq:0,s=this.dx.filter(n,this.alpha(this.dCutOff)),r=this.minCutOff+this.beta*Math.abs(s);return this.x.filter(e,this.alpha(r))}reset(e){e!=null&&this.x.reset(e),this.x.alpha=this.alpha(this.minCutOff),this.dx.alpha=this.alpha(this.dCutOff),this.lasttime=null}}class ym{x;y;z;constructor(e,t=1,i=0,n=1){this.x=new ad(e,t,i,n),this.y=new ad(e,t,i,n),this.z=new ad(e,t,i,n)}filter(e,t,i=null){t.x=this.x.filter(e.x,i),t.y=this.y.filter(e.y,i),t.z=this.z.filter(e.z,i)}reset(e){this.x.reset(e?.x),this.y.reset(e?.y),this.z.reset(e?.z)}}const ld="needle:cameraController";function mb(o){return o[ld]}function bm(o,e,t){t?o[ld]=e:o[ld]===e&&(o[ld]=null)}const _m="needle:autofit";function gb(o){return o[_m]===void 0?!0:o[_m]!==!1}function cd(o,e){o[_m]=e}let fo,_P={x:0,y:0,width:0,height:0};function vP(o,e,t,i){o instanceof Element&&(o=o.getBoundingClientRect()),fo=i.domElement.getBoundingClientRect();const n=_P;n.x=o.x,n.y=o.y,n.width=o.width,n.height=o.height,n.x-=fo.x,n.y-=fo.y;let s=n.width/-2-(n.x-fo.width/2),r=n.height/-2-(n.y-fo.height/2);const a=t.view;let l=a?.offsetX||0,c=a?.offsetY||0;l=D.lerp(l,s,e),c=D.lerp(c,r,e),t.setViewOffset(fo.width,fo.height,l,c,fo.width,fo.height),t.updateProjectionMatrix()}function xP(o,e,t){const i=o.length(),n=e.length(),s=D.lerp(i,n,t);return o.lerp(e,t).normalize().multiplyScalar(s)}const vm=new z,fb=new z().setFromAxisAngle(new b(0,1,0),Math.PI);function wP(o,e){o.lookAt(e),o.quaternion.multiply(fb)}function jl(o,e,t=!0,i=!1){if(o===e)return;vm.copy(o.quaternion);const n=Z(e),s=Z(o);if(i){if(Ui(o,be(e)),t){const r=s.y,a=s.sub(xb(o));a.y=r,o.lookAt(a),o.quaternion.multiply(fb)}Number.isNaN(o.quaternion.x)&&o.quaternion.copy(vm);return}t&&(n.y=s.y),o.lookAt(n),Number.isNaN(o.quaternion.x)&&o.quaternion.copy(vm)}function SP(o,e,t,i=1){if(t){const n=H(0,0,0),s=e.x/window.innerWidth*2-1,r=-(e.y/window.innerHeight)*2+1;n.set(s,r,0),n.unproject(t);const a=t.worldPosition,l=o.worldPosition.distanceTo(a),c=n.sub(a);c.multiplyScalar(i*3.6*l);const h=t.worldPosition.add(c);return o.lookAt(h),h}return null}const CP=new yi(()=>new b,100);function H(o,e,t){const i=CP.get();return i.set(0,0,0),o instanceof b?i.copy(o):Array.isArray(o)?i.set(o[0],o[1],o[2]):o instanceof DOMPointReadOnly?i.set(o.x,o.y,o.z):typeof o=="number"?(i.x=o,i.y=e!==void 0?e:i.x,i.z=t!==void 0?t:i.x):typeof o=="object"&&(i.x=o.x,i.y=o.y,i.z=o.z),i}const PP=new yi(()=>new ne,30);function yb(o){const e=PP.get();return o?e.copy(o):e.set(0,0,0),e}const OP=new yi(()=>new z,100);function dn(o){const e=OP.get();return e.identity(),o instanceof z?e.copy(o):o instanceof DOMPointReadOnly&&e.set(o.x,o.y,o.z,o.w),e}const xm=new yi(()=>new b,100),bb=Symbol("lastMatrixWorldUpdateKey");function Z(o,e=null,t=!0){const i=e??xm.get();return o?o.parent?(t&&o.updateWorldMatrix(!0,!1),o.matrixWorldNeedsUpdate&&o[bb]!==Date.now()&&(o[bb]=Date.now(),o.updateMatrixWorld()),i.setFromMatrixPosition(o.matrixWorld),i):i.copy(o.position):i.set(0,0,0)}function tt(o,e){if(!o)return o;const t=xm.get();return e!==t&&t.copy(e),(o?.parent??o).worldToLocal(t),o.position.set(t.x,t.y,t.z),o}function ir(o,e,t,i){const n=xm.get();return n.set(e,t,i),tt(o,n),o}const hd=new yi(()=>new z,100),nr=new z,wm=new z;function be(o,e=null){if(!o)return hd.get().identity();const t=e??hd.get();return o.parent?(o.getWorldQuaternion(t),t):t.copy(o.quaternion)}function Ui(o,e){if(!o)return;e!==nr&&nr.copy(e);const t=nr;o?.parent?.getWorldQuaternion(wm),wm.invert();const i=wm.multiply(t);o.quaternion.set(i.x,i.y,i.z,i.w)}function Sm(o,e,t,i,n){nr.set(e,t,i,n),Ui(o,nr)}const kP=new yi(()=>new b,100),MP=new b;function We(o,e=null){return e||(e=kP.get()),o?o.parent?(o.getWorldScale(e),e):e.copy(o.scale):e.set(0,0,0)}function ma(o,e){if(!o)return;if(!o.parent){o.scale.copy(e);return}const t=MP;o.parent.getWorldScale(t),o.scale.copy(e),o.scale.divide(t)}const RP=new b,_b=new z;function TP(o){return be(o,_b),RP.set(0,0,1).applyQuaternion(_b)}const EP=new yi(()=>new b,100),vb=new z;function xb(o,e){return e||(e=EP.get().set(0,0,1)),be(o,vb),e.applyQuaternion(vb)}const wb=new Et,Sb=new Et,AP=new b;function Cm(o){const e=hd.get();return o.getWorldQuaternion(e),Sb.setFromQuaternion(e),Sb}function Pm(o,e){const t=hd.get();Ui(o,t.setFromEuler(e))}function dd(o){const e=Cm(o),t=AP;return t.set(e.x,e.y,e.z),t.x=D.toDegrees(t.x),t.y=D.toDegrees(t.y),t.z=D.toDegrees(t.z),t}function Cb(o,e){Dl(o,e.x,e.y,e.z,!0)}function Dl(o,e,t,i,n=!0){n&&(e=D.toRadians(e),t=D.toRadians(t),i=D.toRadians(i)),wb.set(e,t,i),nr.setFromEuler(wb),Ui(o,nr)}function ud(o,e=!0){o&&(e?function t(i){console.groupCollapsed((i.name?i.name:"(no name : "+i.type+")")+" %o",i),i.children.forEach(t),console.groupEnd()}(o):o.traverse(function(t){for(var i="|___",n=t;n.parent!==null;)i=" "+i,n=n.parent;console.log(i+t.name+" <"+t.type+">")}))}function IP(o){let e=o?.name||"";if(!o)return e;let t=o.parent;for(;t;)e=t.name+"/"+e,t=t.parent;return e}function Pb(o){if(o){const e=o;return e.blendMode!==void 0&&e.clampWhenFinished!==void 0&&e.enabled!==void 0&&e.fadeIn!==void 0&&e.getClip!==void 0}return!1}class Bp extends En{static vertex=`
57
+ `,o.shadowRoot?o.shadowRoot.appendChild(t):o.appendChild(t);const i=document.createElement("style");return i.innerHTML=mP,t.appendChild(i),t}}const db=Symbol("logtype"),rd=new Map;function ub(o){o.remove();const e=o[db],t=rd.get(e)??[];t.push(o),rd.set(e,t)}function fP(o,e){if(rd.has(o)){const i=rd.get(o);if(i.length>0){const n=i.pop();return n.innerHTML=e,n}}const t=document.createElement("div");switch(t.setAttribute("data-id","__needle_engine_debug_overlay"),t.style.marginRight="5px",t.style.padding=".5em",t.style.backgroundColor="rgba(0,0,0,.9)",t.style.marginTop="5px",t.style.marginBottom="3px",t.style.borderRadius="8px",t.style.pointerEvents="all",t.style.userSelect="text",t.style.maxWidth="250px",t.style.whiteSpace="pre-wrap",t.style["backdrop-filter"]="blur(10px)",t.style["-webkit-backdrop-filter"]="blur(10px)",t.style.backgroundColor="rgba(20,20,20,.8)",t.style.boxShadow="inset 0 0 80px rgba(0,0,0,.2), 0 0 5px rgba(0,0,0,.2)",t.style.border="1px solid rgba(160,160,160,.2)",t[db]=o,o){case 0:t.classList.add("log"),t.style.color="rgba(200,200,200,.7)",t.style.backgroundColor="rgba(40,40,40,.7)";break;case 1:t.classList.add("warn"),t.style.color="rgb(255, 255, 150)",t.style.backgroundColor="rgba(50,50,20,.8)";break;case 2:t.classList.add("error"),t.style.color="rgb(255, 50, 50",t.style.backgroundColor="rgba(50,20,20,.8)";break}return t.title="Open the browser console (F12) for more information",t.innerHTML=e,t}class yP{random(e,t){return Array.isArray(e)?e.length<=0?null:e[Math.floor(Math.random()*e.length)]:e!==void 0&&t!==void 0?Math.random()*(t-e)+e:Math.random()}randomVector3(e,t=0,i=1){e.x=this.random(t,i),e.y=this.random(t,i),e.z=this.random(t,i)}clamp(e,t,i){return e<t?t:e>i?i:e}clamp01(e){return this.clamp(e,0,1)}lerp(e,t,i){return i=i<0?0:i,i=i>1?1:i,e+(t-e)*i}inverseLerp(e,t,i){return(i-e)/(t-e)}remap(e,t,i,n,s){return n+(s-n)*(e-t)/(i-t)}moveTowards(e,t,i){return e+=i,(i<0&&e<t||i>0&&e>t)&&(e=t),e}Rad2Deg=180/Math.PI;Deg2Rad=Math.PI/180;Epsilon=1e-5;toDegrees(e){return e*180/Math.PI}toRadians(e){return e*Math.PI/180}tan(e){return Math.tan(e)}gammaToLinear(e){return Math.pow(e,2.2)}linearToGamma(e){return Math.pow(e,1/2.2)}approximately(e,t,i=Number.EPSILON){for(const n of bP){const s=e[n],r=t[n];if(s===void 0||r===void 0)break;if(Math.abs(s-r)>i)return!1}return!0}easeInOutCubic(e){return e<.5?4*e*e*e:1-Math.pow(-2*e+2,3)/2}}const bP=["x","y","z","w"],D=new yP;class pb{y;s;alpha=0;constructor(e){this.setAlpha(e),this.y=null,this.s=null}setAlpha(e){if(e<=0||e>1)throw new Error;this.alpha=e}filter(e,t){t&&this.setAlpha(t);let i;return this.y?i=this.alpha*e+(1-this.alpha)*this.s:i=e,this.y=e,this.s=i,i}lastValue(){return this.y}reset(e){this.y=e,this.s=e}}class ad{freq;minCutOff;beta;dCutOff;x;dx;lasttime;constructor(e,t=1,i=0,n=1){if(e<=0||t<=0||n<=0)throw new Error;this.freq=e,this.minCutOff=t,this.beta=i,this.dCutOff=n,this.x=new pb(this.alpha(this.minCutOff)),this.dx=new pb(this.alpha(this.dCutOff)),this.lasttime=null}alpha(e){const t=1/this.freq;return 1/(1+1/(2*Math.PI*e)/t)}filter(e,t=null){this.lasttime&&t&&(this.freq=1/(t-this.lasttime)),this.lasttime=t;const i=this.x.lastValue(),n=i?(e-i)*this.freq:0,s=this.dx.filter(n,this.alpha(this.dCutOff)),r=this.minCutOff+this.beta*Math.abs(s);return this.x.filter(e,this.alpha(r))}reset(e){e!=null&&this.x.reset(e),this.x.alpha=this.alpha(this.minCutOff),this.dx.alpha=this.alpha(this.dCutOff),this.lasttime=null}}class ym{x;y;z;constructor(e,t=1,i=0,n=1){this.x=new ad(e,t,i,n),this.y=new ad(e,t,i,n),this.z=new ad(e,t,i,n)}filter(e,t,i=null){t.x=this.x.filter(e.x,i),t.y=this.y.filter(e.y,i),t.z=this.z.filter(e.z,i)}reset(e){this.x.reset(e?.x),this.y.reset(e?.y),this.z.reset(e?.z)}}const ld="needle:cameraController";function mb(o){return o[ld]}function bm(o,e,t){t?o[ld]=e:o[ld]===e&&(o[ld]=null)}const _m="needle:autofit";function gb(o){return o[_m]===void 0?!0:o[_m]!==!1}function cd(o,e){o[_m]=e}let fo;const _P={x:0,y:0,width:0,height:0};function vP(o,e,t,i){o instanceof Element&&(o=o.getBoundingClientRect()),fo=i.domElement.getBoundingClientRect();const n=_P;n.x=o.x,n.y=o.y,n.width=o.width,n.height=o.height,n.x-=fo.x,n.y-=fo.y;const s=n.width/-2-(n.x-fo.width/2),r=n.height/-2-(n.y-fo.height/2),a=t.view;let l=a?.offsetX||0,c=a?.offsetY||0;l=D.lerp(l,s,e),c=D.lerp(c,r,e),t.setViewOffset(fo.width,fo.height,l,c,fo.width,fo.height),t.updateProjectionMatrix()}function xP(o,e,t){const i=o.length(),n=e.length(),s=D.lerp(i,n,t);return o.lerp(e,t).normalize().multiplyScalar(s)}const vm=new z,fb=new z().setFromAxisAngle(new b(0,1,0),Math.PI);function wP(o,e){o.lookAt(e),o.quaternion.multiply(fb)}function jl(o,e,t=!0,i=!1){if(o===e)return;vm.copy(o.quaternion);const n=Z(e),s=Z(o);if(i){if(Ui(o,be(e)),t){const r=s.y,a=s.sub(xb(o));a.y=r,o.lookAt(a),o.quaternion.multiply(fb)}Number.isNaN(o.quaternion.x)&&o.quaternion.copy(vm);return}t&&(n.y=s.y),o.lookAt(n),Number.isNaN(o.quaternion.x)&&o.quaternion.copy(vm)}function SP(o,e,t,i=1){if(t){const n=H(0,0,0),s=e.x/window.innerWidth*2-1,r=-(e.y/window.innerHeight)*2+1;n.set(s,r,0),n.unproject(t);const a=t.worldPosition,l=o.worldPosition.distanceTo(a),c=n.sub(a);c.multiplyScalar(i*3.6*l);const h=t.worldPosition.add(c);return o.lookAt(h),h}return null}const CP=new yi(()=>new b,100);function H(o,e,t){const i=CP.get();return i.set(0,0,0),o instanceof b?i.copy(o):Array.isArray(o)?i.set(o[0],o[1],o[2]):o instanceof DOMPointReadOnly?i.set(o.x,o.y,o.z):typeof o=="number"?(i.x=o,i.y=e!==void 0?e:i.x,i.z=t!==void 0?t:i.x):typeof o=="object"&&(i.x=o.x,i.y=o.y,i.z=o.z),i}const PP=new yi(()=>new ne,30);function yb(o){const e=PP.get();return o?e.copy(o):e.set(0,0,0),e}const OP=new yi(()=>new z,100);function dn(o){const e=OP.get();return e.identity(),o instanceof z?e.copy(o):o instanceof DOMPointReadOnly&&e.set(o.x,o.y,o.z,o.w),e}const xm=new yi(()=>new b,100),bb=Symbol("lastMatrixWorldUpdateKey");function Z(o,e=null,t=!0){const i=e??xm.get();return o?o.parent?(t&&o.updateWorldMatrix(!0,!1),o.matrixWorldNeedsUpdate&&o[bb]!==Date.now()&&(o[bb]=Date.now(),o.updateMatrixWorld()),i.setFromMatrixPosition(o.matrixWorld),i):i.copy(o.position):i.set(0,0,0)}function tt(o,e){if(!o)return o;const t=xm.get();return e!==t&&t.copy(e),(o?.parent??o).worldToLocal(t),o.position.set(t.x,t.y,t.z),o}function ir(o,e,t,i){const n=xm.get();return n.set(e,t,i),tt(o,n),o}const hd=new yi(()=>new z,100),nr=new z,wm=new z;function be(o,e=null){if(!o)return hd.get().identity();const t=e??hd.get();return o.parent?(o.getWorldQuaternion(t),t):t.copy(o.quaternion)}function Ui(o,e){if(!o)return;e!==nr&&nr.copy(e);const t=nr;o?.parent?.getWorldQuaternion(wm),wm.invert();const i=wm.multiply(t);o.quaternion.set(i.x,i.y,i.z,i.w)}function Sm(o,e,t,i,n){nr.set(e,t,i,n),Ui(o,nr)}const kP=new yi(()=>new b,100),MP=new b;function We(o,e=null){return e||(e=kP.get()),o?o.parent?(o.getWorldScale(e),e):e.copy(o.scale):e.set(0,0,0)}function ma(o,e){if(!o)return;if(!o.parent){o.scale.copy(e);return}const t=MP;o.parent.getWorldScale(t),o.scale.copy(e),o.scale.divide(t)}const RP=new b,_b=new z;function TP(o){return be(o,_b),RP.set(0,0,1).applyQuaternion(_b)}const EP=new yi(()=>new b,100),vb=new z;function xb(o,e){return e||(e=EP.get().set(0,0,1)),be(o,vb),e.applyQuaternion(vb)}const wb=new Et,Sb=new Et,AP=new b;function Cm(o){const e=hd.get();return o.getWorldQuaternion(e),Sb.setFromQuaternion(e),Sb}function Pm(o,e){const t=hd.get();Ui(o,t.setFromEuler(e))}function dd(o){const e=Cm(o),t=AP;return t.set(e.x,e.y,e.z),t.x=D.toDegrees(t.x),t.y=D.toDegrees(t.y),t.z=D.toDegrees(t.z),t}function Cb(o,e){Dl(o,e.x,e.y,e.z,!0)}function Dl(o,e,t,i,n=!0){n&&(e=D.toRadians(e),t=D.toRadians(t),i=D.toRadians(i)),wb.set(e,t,i),nr.setFromEuler(wb),Ui(o,nr)}function ud(o,e=!0){o&&(e?function t(i){console.groupCollapsed((i.name?i.name:"(no name : "+i.type+")")+" %o",i),i.children.forEach(t),console.groupEnd()}(o):o.traverse(function(t){for(var i="|___",n=t;n.parent!==null;)i=" "+i,n=n.parent;console.log(i+t.name+" <"+t.type+">")}))}function IP(o){let e=o?.name||"";if(!o)return e;let t=o.parent;for(;t;)e=t.name+"/"+e,t=t.parent;return e}function Pb(o){if(o){const e=o;return e.blendMode!==void 0&&e.clampWhenFinished!==void 0&&e.enabled!==void 0&&e.fadeIn!==void 0&&e.getClip!==void 0}return!1}class Bp extends En{static vertex=`
58
58
  varying vec2 vUv;
59
59
  void main(){
60
60
  vUv = uv;
@@ -141,7 +141,7 @@ void main(){
141
141
  #__vconsole .vc-mask {
142
142
  overflow: hidden;
143
143
  }
144
- `,rr?.prepend(i),o===!0&&ab()<=0&&Ib(),console.log("\u{1F335} Debug console has loaded")}},e.onerror=()=>{console.warn("\u{1F335} Debug console failed to load."+(window.crossOriginIsolated?"This page is using cross-origin isolation, so external scripts can't be loaded.":"")),zl=!1,zi=null},e.src="https://cdn.jsdelivr.net/npm/vconsole@3.15.1/dist/vconsole.min.js",document.body.appendChild(e)}function QP(){if(!globalThis.VConsole)return;const o=new VConsole.VConsolePlugin("needle-console","\u{1F335} Inspect glTF"),e=()=>document.querySelector("#__vc_plug_"+o._id+" iframe");return o.on("renderTab",function(t){const i=globalThis["needle:codegen_files"];if(!i||i.length===0)return;let n=globalThis["needle:codegen_files"][0];const s=n.indexOf("?");s>-1&&(n=n.substring(0,s));const r=location.protocol+"//"+location.host+location.pathname+"/"+n,a=encodeURIComponent(r);o.fullUrl="https://viewer.needle.tools?inspect&file="+a;var l='<iframe src="" style="width: 100%; height: 99%; border: none;"></iframe>';t(l)}),o.on("show",function(){const t=e();t&&t.src!==o.fullUrl&&(t.src=o.fullUrl)}),o.on("hide",function(){const t=e();t&&(t.src="")}),o.on("addTopBar",function(t){var i=new Array;i.push({name:"Open in new window \u2197",onClick:function(n){window.open(o.fullUrl,"_blank"),zi?.hide()}}),i.push({name:"Reload",onClick:function(n){const s=e();s&&(s.src=o.fullUrl)}}),i.push({name:"Fullscreen",onClick:function(n){const s=e();s.requestFullscreen?s.requestFullscreen():s.webkitRequestFullscreen instanceof Function&&s.webkitRequestFullscreen()}}),t(i)}),o}function YP(){return document.querySelector("#__vconsole .vc-switch")||null}function KP(){return document.querySelector("#__vconsole")||null}const jb=x("debugdefines");ls('if(!globalThis["NEEDLE_ENGINE_VERSION"]) globalThis["NEEDLE_ENGINE_VERSION"] = "0.0.0";'),ls('if(!globalThis["NEEDLE_ENGINE_GENERATOR"]) globalThis["NEEDLE_ENGINE_GENERATOR"] = "unknown";'),ls('if(!globalThis["NEEDLE_PROJECT_BUILD_TIME"]) globalThis["NEEDLE_PROJECT_BUILD_TIME"] = "unknown";'),ls('if(!globalThis["NEEDLE_PUBLIC_KEY"]) globalThis["NEEDLE_PUBLIC_KEY"] = "unknown";'),ls('globalThis["__NEEDLE_ENGINE_VERSION__"] = "4.8.8";'),ls('globalThis["__NEEDLE_ENGINE_GENERATOR__"] = "undefined";'),ls('globalThis["__NEEDLE_PROJECT_BUILD_TIME__"] = "Fri Aug 29 2025 16:58:42 GMT+0000 (Coordinated Universal Time)";'),ls('globalThis["__NEEDLE_PUBLIC_KEY__"] = "'+NEEDLE_PUBLIC_KEY+'";');const un="4.8.8",md="undefined",Em="Fri Aug 29 2025 16:58:42 GMT+0000 (Coordinated Universal Time)";jb&&console.log(`Engine version: ${un} (generator: ${md})
144
+ `,rr?.prepend(i),o===!0&&ab()<=0&&Ib(),console.log("\u{1F335} Debug console has loaded")}},e.onerror=()=>{console.warn("\u{1F335} Debug console failed to load."+(window.crossOriginIsolated?"This page is using cross-origin isolation, so external scripts can't be loaded.":"")),zl=!1,zi=null},e.src="https://cdn.jsdelivr.net/npm/vconsole@3.15.1/dist/vconsole.min.js",document.body.appendChild(e)}function QP(){if(!globalThis.VConsole)return;const o=new VConsole.VConsolePlugin("needle-console","\u{1F335} Inspect glTF"),e=()=>document.querySelector("#__vc_plug_"+o._id+" iframe");return o.on("renderTab",function(t){const i=globalThis["needle:codegen_files"];if(!i||i.length===0)return;let n=globalThis["needle:codegen_files"][0];const s=n.indexOf("?");s>-1&&(n=n.substring(0,s));const r=location.protocol+"//"+location.host+location.pathname+"/"+n,a=encodeURIComponent(r);o.fullUrl="https://viewer.needle.tools?inspect&file="+a;var l='<iframe src="" style="width: 100%; height: 99%; border: none;"></iframe>';t(l)}),o.on("show",function(){const t=e();t&&t.src!==o.fullUrl&&(t.src=o.fullUrl)}),o.on("hide",function(){const t=e();t&&(t.src="")}),o.on("addTopBar",function(t){var i=new Array;i.push({name:"Open in new window \u2197",onClick:function(n){window.open(o.fullUrl,"_blank"),zi?.hide()}}),i.push({name:"Reload",onClick:function(n){const s=e();s&&(s.src=o.fullUrl)}}),i.push({name:"Fullscreen",onClick:function(n){const s=e();s.requestFullscreen?s.requestFullscreen():s.webkitRequestFullscreen instanceof Function&&s.webkitRequestFullscreen()}}),t(i)}),o}function YP(){return document.querySelector("#__vconsole .vc-switch")||null}function KP(){return document.querySelector("#__vconsole")||null}const jb=x("debugdefines");ls('if(!globalThis["NEEDLE_ENGINE_VERSION"]) globalThis["NEEDLE_ENGINE_VERSION"] = "0.0.0";'),ls('if(!globalThis["NEEDLE_ENGINE_GENERATOR"]) globalThis["NEEDLE_ENGINE_GENERATOR"] = "unknown";'),ls('if(!globalThis["NEEDLE_PROJECT_BUILD_TIME"]) globalThis["NEEDLE_PROJECT_BUILD_TIME"] = "unknown";'),ls('if(!globalThis["NEEDLE_PUBLIC_KEY"]) globalThis["NEEDLE_PUBLIC_KEY"] = "unknown";'),ls('globalThis["__NEEDLE_ENGINE_VERSION__"] = "4.8.8";'),ls('globalThis["__NEEDLE_ENGINE_GENERATOR__"] = "undefined";'),ls('globalThis["__NEEDLE_PROJECT_BUILD_TIME__"] = "Fri Aug 29 2025 17:31:49 GMT+0000 (Coordinated Universal Time)";'),ls('globalThis["__NEEDLE_PUBLIC_KEY__"] = "'+NEEDLE_PUBLIC_KEY+'";');const un="4.8.8",md="undefined",Em="Fri Aug 29 2025 17:31:49 GMT+0000 (Coordinated Universal Time)";jb&&console.log(`Engine version: ${un} (generator: ${md})
145
145
  Project built at ${Em}`);const ga=NEEDLE_PUBLIC_KEY,yo="needle_isActiveInHierarchy",ar="builtin_components",Nl="needle_editor_guid";function ls(o){try{(0,eval)(o)}catch(e){jb&&console.error(e)}}let Db,Bb=null;function pn(){return Db}function Am(o){if(o==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}Bb!==o&&(Bb=o,Db=new o)}const _i=Symbol("shadowDomOwner"),ZP=x("debugpatch");function gd(o,e,t,i){const n=ZP===e;if(!t&&!i)return;const s=e+"___needle";eO(o,e,t,i);const r=Object.getOwnPropertyDescriptor(o,e),a=o[e];n&&console.log("Patch",o.constructor.name,e,r,a),r?(n&&console.log("Apply patch with existing descriptor",o.constructor.name,e,r),typeof r.value=="function"&&(o[e]=Ub(r.value,o,e))):(n&&console.log("Create patch with new property",o.constructor.name,e,r),Object.defineProperty(o,e,{set:function(l){if(typeof l=="function")this[s]=Ub(l,o,e);else{const c=this[s];zb(o,e,this,c,l),this[s]=l,Nb(o,e,this,c,l)}},get:function(){const l=this[s];return typeof l=="function"&&l[s]?l[s]:l}}))}function JP(o,e,t){const i=Lm(o,e);if(i)for(let n=i.length-1;n>=0;n--){const s=i[n];s.prefix===t&&(s.prefix=null),s.postfix===t&&(s.postfix=null),!s.prefix&&!s.postfix&&i.splice(n,1)}}const Fb=Symbol("Needle:Patches:WrappedFunction");function Ub(o,e,t){if(o[Fb])return o;const i=function(...n){zb(e,t,this,...n);const s=o.apply(this,n);return Nb(e,t,this,s,...n),s};return i[Fb]=!0,i}const fd="Needle:Patches";function Im(){return globalThis[fd]||(globalThis[fd]=new WeakMap),globalThis[fd]}function Lm(o,e){const t=Im().get(o);return t?t.get(e):null}function eO(o,e,t,i){let n=Im().get(o);n||(n=new Map,Im().set(o,n));let s=n.get(e);s||(s=[],n.set(e,s)),s.push({prefix:t,postfix:i})}function zb(o,e,t,...i){if(!t)return;const n=Lm(o,e);if(n)for(const s of n)s.prefix?.call(t,...i)}function Nb(o,e,t,i,...n){if(!t)return;const s=Lm(o,e);if(s)for(const r of s)r.postfix?.call(t,i,...n)}const fa=[];function yd(o){fa.indexOf(o)===-1&&fa.push(o)}function tO(o){const e=fa.indexOf(o);e!==-1&&fa.splice(e,1)}const ya=[];function jm(o){ya.indexOf(o)===-1&&ya.push(o)}function iO(o){const e=ya.indexOf(o);e!==-1&&ya.splice(e,1)}function Wb(o){globalThis.dispatchEvent(new CustomEvent("needle-xrsession-start",{detail:o}));for(let e=0;e<fa.length;e++)fa[e](o)}function Vb(o){globalThis.dispatchEvent(new CustomEvent("needle-xrsession-end",{detail:o}));for(let e=0;e<ya.length;e++)ya[e](o)}const it=x("debuginput");var bd=(o=>(o.Mouse="mouse",o.Touch="touch",o.Controller="controller",o.Hand="hand",o))(bd||{}),Ee=(o=>(o.PointerDown="pointerdown",o.PointerUp="pointerup",o.PointerMove="pointermove",o.KeyDown="keydown",o.KeyUp="keyup",o.KeyPressed="keypress",o))(Ee||{});class bo extends PointerEvent{clientZ;deviceIndex;origin;source;mode;get isSpatial(){return this.mode!="screen"}get ray(){return this._ray||(this._ray=new is(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(),it&&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 nO{key;keyType;source;constructor(e){this.key=e.key,this.keyType=e.type,this.source=e}}var Zt=(o=>(o[o.Early=-100]="Early",o[o.Default=0]="Default",o[o.Late=100]="Late",o))(Zt||{});class $b{_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 s=this._eventListeners[e],r=s.find(a=>a.priority===n);r?r.listeners.push({callback:t,options:i}):(s.push({priority:n,listeners:[{callback:t,options:i}]}),s.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 s=n.find(a=>a.priority===i.queue);if(!s)return;const r=s.listeners.findIndex(a=>a.callback===t);r>=0&&s.listeners.splice(r,1)}else for(const s of n){const r=s.listeners.findIndex(a=>a.callback===t);r>=0&&s.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 s=0;s<n.listeners.length;s++){const r=n.listeners[s];if(r.options?.signal?.aborted){n.listeners.splice(s,1),s--;continue}r.options.once&&(n.listeners.splice(s,1),s--),r.callback(e)}}if(e instanceof bo){const i=this._eventListeners[e.type];if(i)for(const n of i){if(t)break;for(let s=0;s<n.listeners.length;s++){const r=n.listeners[s];if(r.options?.signal?.aborted){n.listeners.splice(s,1),s--;continue}if(e.immediatePropagationStopped){t=!0,it&&console.log("immediatePropagationStopped",e.type);break}else e.propagationStopped&&(t=!0,it&&console.log("propagationStopped",e.type));r.options.once&&(n.listeners.splice(s,1),s--),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 s of e)if(i===s){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 J];_pointerPositionsLastFrame=[new J];_pointerPositionsDelta=[new J];_pointerPositionsRC=[new J];_pointerPositionDown=[new b];_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":it&&Te("Create Pointer down"),this.onDownButton(e.deviceIndex,e.button),this.onDown(e);break;case"pointermove":it&&Te("Create Pointer move"),this.onMove(e);break;case"pointerup":it&&Te("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&&G.isMozillaXR()?!0:(it&&console.warn("CanReceiveInput:False for",e.target),!1)}onContextMenu=e=>{this.canReceiveInput(e)!==!1&&e instanceof PointerEvent&&e.pointerType};keysPressed={};onKeyDown=e=>{if(it&&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);it&&Te(`pointer down #${t}, identifier:${e.pointerId}`);const i=this.getAndUpdateSpatialObjectForScreenPosition(t,e.clientX,e.clientY),n=new bo("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),s=new bo("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(s)};onPointerCancel=e=>{this.context.isInAR||(it&&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 bo("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,it&&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),s=this.getAndUpdateSpatialObjectForScreenPosition(n,i.clientX,i.clientY),r=new bo("pointerdown",e,{origin:this,mode:"screen",deviceIndex:0,pointerId:n,button:0,clientX:i.clientX,clientY:i.clientY,pointerType:"touch",buttonName:"unknown",device:s,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),s=this.getAndUpdateSpatialObjectForScreenPosition(n,i.clientX,i.clientY),r=new bo("pointermove",e,{origin:this,mode:"screen",deviceIndex:0,pointerId:n,button:0,clientX:i.clientX,clientY:i.clientY,pointerType:"touch",buttonName:"unknown",device:s,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),s=new bo("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(s),this._pointerIds[n]=-1}};tempNearPlaneVector=new b;tempFarPlaneVector=new b;tempLookMatrix=new te;getAndUpdateSpatialObjectForScreenPosition(e,t,i){let n=this._pointerSpace[e];n||(n=new k,this._pointerSpace[e]=n),this._pointerSpace[e]=n;const s=this.context.mainCamera;if(s){const r=this.tempNearPlaneVector.set(t,i,-1);this.convertScreenspaceToRaycastSpace(r);const a=this.tempFarPlaneVector.set(r.x,r.y,1);r.unproject(s),a.unproject(s);const l=s.worldUp||H(0,1,0).applyQuaternion(be(s));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,s=i>=t.x&&i<=t.right&&n>=t.y&&n<=t.bottom;return it&&!s&&console.log("Not in rect",t,i,n),s}onDown(e){const t=e.pointerId;if(this.getPointerPressed(t)&&console.warn(`Received pointerDown for pointerId that is already pressed: ${t}`,it?e:""),it&&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 b);for(this._pointerPositionDown[t].set(e.clientX,e.clientY,e.clientZ??0);t>=this._pointerPositions.length;)this._pointerPositions.push(new J);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)){it&&console.log(e.pointerType,"UP",t,"was not down");return}it&&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 a=this._pointerEventsPressed.length-1;a>=0;a--)if(this._pointerEventsPressed[a].pointerId===t){this._pointerEventsPressed.splice(a,1);break}if(!this._pointerPositionDown[t]){it&&ge("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 i=this._pointerUpTime[t],n=this._pointerDownTime[t],s=this.context.time.realtimeSinceStartup,r=s-n;if(t>=this._pointerUpTime.length&&this._pointerUpTime.push(-99),this._pointerUpTime[t]=s,r<1){let a=e.clientX-this._pointerPositionDown[t].x,l=e.clientY-this._pointerPositionDown[t].y,c=0;if(e.isSpatial&&e.clientZ!=null&&(c=e.clientZ-this._pointerPositionDown[t].z,a*=200,l*=200,c*=200),Math.abs(a)<5&&Math.abs(l)<5&&Math.abs(c)<5){this.setPointerState(t,this._pointerClick,!0),e.isClick=!0;const h=s-i;it&&console.log("CLICK",t,a,l,c,h),h<this._doubleClickTimeThreshold&&h>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 J);for(;t>=this._pointerPositionsLastFrame.length;)this._pointerPositionsLastFrame.push(new J);for(;t>=this._pointerPositionsDelta.length;)this._pointerPositionsDelta.push(new J);const i=this._pointerPositionsLastFrame[t];i.copy(this._pointerPositions[t]);const n=this._pointerPositionsDelta[t];let s=e.clientX-i.x,r=e.clientY-i.y;if(e.source instanceof MouseEvent||e.source instanceof TouchEvent){const h=e.source;s===0&&h.movementX!==0&&(s=h.movementX||0),r===0&&h.movementY!==0&&(r=h.movementY||0)}n.x+=s,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 J);const c=this._pointerPositionsRC[t];c.set(a,l),this.convertScreenspaceToRaycastSpace(c)}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):(it&&console.log("PUSH pointerId:",e),this._pointerIds.push(e),this._pointerIds.length-1)}setPointerState(e,t,i){t[e]=i}setPointerStateT(e,t,i){return t[e]=i,i}onDispatchEvent(e){const t=U.Current;try{U.Current=this.context,this.dispatchEvent(e)}finally{U.Current=t}}}const ba=new te().makeRotationY(Math.PI),Ni=new z().setFromAxisAngle(new b(0,1,0),Math.PI),oO=x("debugwebxr");class sO{priority=-1e5;gameObject;isXRRig(){return!0}get isActive(){return this.gameObject.visible}constructor(){if(this.gameObject=new k,this.gameObject.name="Implicit XR Rig",oO){const e=Ym(16733661);e.position.y+=.5,this.gameObject.add(e)}}}const _o=x("debugwebxr"),_d=x("debugcustomgesture"),rO="https://cdn.jsdelivr.net/npm/@webxr-input-profiles/assets@1.0/dist/profiles",aO="generic-trigger",lO=new z().setFromEuler(new Et(lo.degToRad(0),lo.degToRad(-90),lo.degToRad(-90))),cO=new b(.04,-.04,0);class Dm{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 te;_gripPosition=new b;_gripQuaternion=new z;_linearVelocity=new b;_rayPositionRaw=new b;_rayRotationRaw=new z;_rayMatrix=new te;_rayPosition=new b;_rayQuaternion=new z;get gripPosition(){return H(this._gripPosition)}get gripQuaternion(){return dn(this._gripQuaternion)}get gripMatrix(){return this._gripMatrix}get gripLinearVelocity(){return H(this._linearVelocity).applyQuaternion(Ni)}get rayPosition(){return H(this._rayPosition)}get rayQuaternion(){return dn(this._rayQuaternion)}get gripWorldPosition(){return H(this._gripWorldPosition)}_gripWorldPosition=new b;get gripWorldQuaternion(){return dn(this._gripWorldQuaternion)}_gripWorldQuaternion=new z;get rayWorldPosition(){return H(this._rayWorldPosition)}_rayWorldPosition=new b;updateRayWorldPosition(){const e=this.xr.context.mainCamera?.parent;this._rayWorldPosition.copy(this._rayPositionRaw),e&&this._rayWorldPosition.applyMatrix4(e.matrixWorld)}get rayWorldQuaternion(){return dn(this._rayWorldQuaternion)}_rayWorldQuaternion=new z;get pinchPosition(){return H(this._pinchPosition)}_pinchPosition=new b;updateRayWorldQuaternion(){const e=this.xr.context.mainCamera?.parent,t=e?be(e):void 0;this._rayWorldQuaternion.copy(this._rayRotationRaw).multiply(Ni),t&&this._rayWorldQuaternion.premultiply(t)}get ray(){return this._ray.origin.copy(this.rayWorldPosition),this._ray.direction.copy(H(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=H(0,1,0).applyQuaternion(e.quaternion),i=H(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 gi(.15);_debugGripAxesHelper=new gi(.07);_debugRayAxesHelper=new gi(.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 k,this._object.name=`NeedleXRController_${i}`,_o&&(this._object.add(this._debugAxesHelper),this._gripSpaceObject=new k,this._raySpaceObject=new k,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 is,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(){F.DrawSphere(this.rayWorldPosition,.003),F.DrawDirection(this.rayWorldPosition,H(0,0,10).applyQuaternion(this.rayWorldQuaternion));const e=(this.inputSource.gripSpace?this.gripWorldPosition:this.object.worldPosition).sub(this.object.worldForward.multiplyScalar(.1)),t=this.inputSource.profiles.join(`
146
146
  `);let i=`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&&(i+=`
@@ -957,13 +957,13 @@ function wC(s) {
957
957
  function cp(s, e) {
958
958
  s[lp] = e;
959
959
  }
960
- let Qn, xC = { x: 0, y: 0, width: 0, height: 0 };
960
+ let Qn;
961
+ const xC = { x: 0, y: 0, width: 0, height: 0 };
961
962
  function SC(s, e, t, i) {
962
963
  s instanceof Element && (s = s.getBoundingClientRect()), Qn = i.domElement.getBoundingClientRect();
963
964
  const n = xC;
964
965
  n.x = s.x, n.y = s.y, n.width = s.width, n.height = s.height, n.x -= Qn.x, n.y -= Qn.y;
965
- let o = n.width / -2 - (n.x - Qn.width / 2), r = n.height / -2 - (n.y - Qn.height / 2);
966
- const a = t.view;
966
+ const o = n.width / -2 - (n.x - Qn.width / 2), r = n.height / -2 - (n.y - Qn.height / 2), a = t.view;
967
967
  let l = a?.offsetX || 0, c = a?.offsetY || 0;
968
968
  l = j.lerp(l, o, e), c = j.lerp(c, r, e), t.setViewOffset(Qn.width, Qn.height, l, c, Qn.width, Qn.height), t.updateProjectionMatrix();
969
969
  }
@@ -1765,9 +1765,9 @@ fo('if(!globalThis["NEEDLE_PROJECT_BUILD_TIME"]) globalThis["NEEDLE_PROJECT_BUIL
1765
1765
  fo('if(!globalThis["NEEDLE_PUBLIC_KEY"]) globalThis["NEEDLE_PUBLIC_KEY"] = "unknown";');
1766
1766
  fo('globalThis["__NEEDLE_ENGINE_VERSION__"] = "4.8.8";');
1767
1767
  fo('globalThis["__NEEDLE_ENGINE_GENERATOR__"] = "undefined";');
1768
- fo('globalThis["__NEEDLE_PROJECT_BUILD_TIME__"] = "Fri Aug 29 2025 16:58:42 GMT+0000 (Coordinated Universal Time)";');
1768
+ fo('globalThis["__NEEDLE_PROJECT_BUILD_TIME__"] = "Fri Aug 29 2025 17:31:49 GMT+0000 (Coordinated Universal Time)";');
1769
1769
  fo('globalThis["__NEEDLE_PUBLIC_KEY__"] = "' + NEEDLE_PUBLIC_KEY + '";');
1770
- const En = "4.8.8", Sm = "undefined", Gb = "Fri Aug 29 2025 16:58:42 GMT+0000 (Coordinated Universal Time)";
1770
+ const En = "4.8.8", Sm = "undefined", Gb = "Fri Aug 29 2025 17:31:49 GMT+0000 (Coordinated Universal Time)";
1771
1771
  Hb && console.log(`Engine version: ${En} (generator: ${Sm})
1772
1772
  Project built at ${Gb}`);
1773
1773
  const bl = NEEDLE_PUBLIC_KEY, oo = "needle_isActiveInHierarchy", Br = "builtin_components", Mh = "needle_editor_guid";
@@ -54,7 +54,7 @@ div[data-needle_engine_debug_overlay] .error strong {
54
54
  color: white;
55
55
  overflow: auto;
56
56
  word-break: break-word;
57
- `,s.shadowRoot?s.shadowRoot.appendChild(t):s.appendChild(t);const i=document.createElement("style");return i.innerHTML=px,t.appendChild(i),t}}const ib=Symbol("logtype"),Yh=new Map;function Xg(s){s.remove();const e=s[ib],t=Yh.get(e)??[];t.push(s),Yh.set(e,t)}function gx(s,e){if(Yh.has(s)){const i=Yh.get(s);if(i.length>0){const n=i.pop();return n.innerHTML=e,n}}const t=document.createElement("div");switch(t.setAttribute("data-id","__needle_engine_debug_overlay"),t.style.marginRight="5px",t.style.padding=".5em",t.style.backgroundColor="rgba(0,0,0,.9)",t.style.marginTop="5px",t.style.marginBottom="3px",t.style.borderRadius="8px",t.style.pointerEvents="all",t.style.userSelect="text",t.style.maxWidth="250px",t.style.whiteSpace="pre-wrap",t.style["backdrop-filter"]="blur(10px)",t.style["-webkit-backdrop-filter"]="blur(10px)",t.style.backgroundColor="rgba(20,20,20,.8)",t.style.boxShadow="inset 0 0 80px rgba(0,0,0,.2), 0 0 5px rgba(0,0,0,.2)",t.style.border="1px solid rgba(160,160,160,.2)",t[ib]=s,s){case 0:t.classList.add("log"),t.style.color="rgba(200,200,200,.7)",t.style.backgroundColor="rgba(40,40,40,.7)";break;case 1:t.classList.add("warn"),t.style.color="rgb(255, 255, 150)",t.style.backgroundColor="rgba(50,50,20,.8)";break;case 2:t.classList.add("error"),t.style.color="rgb(255, 50, 50",t.style.backgroundColor="rgba(50,20,20,.8)";break}return t.title="Open the browser console (F12) for more information",t.innerHTML=e,t}class yx{random(e,t){return Array.isArray(e)?e.length<=0?null:e[Math.floor(Math.random()*e.length)]:e!==void 0&&t!==void 0?Math.random()*(t-e)+e:Math.random()}randomVector3(e,t=0,i=1){e.x=this.random(t,i),e.y=this.random(t,i),e.z=this.random(t,i)}clamp(e,t,i){return e<t?t:e>i?i:e}clamp01(e){return this.clamp(e,0,1)}lerp(e,t,i){return i=i<0?0:i,i=i>1?1:i,e+(t-e)*i}inverseLerp(e,t,i){return(i-e)/(t-e)}remap(e,t,i,n,o){return n+(o-n)*(e-t)/(i-t)}moveTowards(e,t,i){return e+=i,(i<0&&e<t||i>0&&e>t)&&(e=t),e}Rad2Deg=180/Math.PI;Deg2Rad=Math.PI/180;Epsilon=1e-5;toDegrees(e){return e*180/Math.PI}toRadians(e){return e*Math.PI/180}tan(e){return Math.tan(e)}gammaToLinear(e){return Math.pow(e,2.2)}linearToGamma(e){return Math.pow(e,1/2.2)}approximately(e,t,i=Number.EPSILON){for(const n of _x){const o=e[n],r=t[n];if(o===void 0||r===void 0)break;if(Math.abs(o-r)>i)return!1}return!0}easeInOutCubic(e){return e<.5?4*e*e*e:1-Math.pow(-2*e+2,3)/2}}const _x=["x","y","z","w"],D=new yx;class Qg{y;s;alpha=0;constructor(e){this.setAlpha(e),this.y=null,this.s=null}setAlpha(e){if(e<=0||e>1)throw new Error;this.alpha=e}filter(e,t){t&&this.setAlpha(t);let i;return this.y?i=this.alpha*e+(1-this.alpha)*this.s:i=e,this.y=e,this.s=i,i}lastValue(){return this.y}reset(e){this.y=e,this.s=e}}class Eh{freq;minCutOff;beta;dCutOff;x;dx;lasttime;constructor(e,t=1,i=0,n=1){if(e<=0||t<=0||n<=0)throw new Error;this.freq=e,this.minCutOff=t,this.beta=i,this.dCutOff=n,this.x=new Qg(this.alpha(this.minCutOff)),this.dx=new Qg(this.alpha(this.dCutOff)),this.lasttime=null}alpha(e){const t=1/this.freq;return 1/(1+1/(2*Math.PI*e)/t)}filter(e,t=null){this.lasttime&&t&&(this.freq=1/(t-this.lasttime)),this.lasttime=t;const i=this.x.lastValue(),n=i?(e-i)*this.freq:0,o=this.dx.filter(n,this.alpha(this.dCutOff)),r=this.minCutOff+this.beta*Math.abs(o);return this.x.filter(e,this.alpha(r))}reset(e){e!=null&&this.x.reset(e),this.x.alpha=this.alpha(this.minCutOff),this.dx.alpha=this.alpha(this.dCutOff),this.lasttime=null}}class zp{x;y;z;constructor(e,t=1,i=0,n=1){this.x=new Eh(e,t,i,n),this.y=new Eh(e,t,i,n),this.z=new Eh(e,t,i,n)}filter(e,t,i=null){t.x=this.x.filter(e.x,i),t.y=this.y.filter(e.y,i),t.z=this.z.filter(e.z,i)}reset(e){this.x.reset(e?.x),this.y.reset(e?.y),this.z.reset(e?.z)}}const Th="needle:cameraController";function nb(s){return s[Th]}function Gf(s,e,t){t?s[Th]=e:s[Th]===e&&(s[Th]=null)}const Hf="needle:autofit";function sb(s){return s[Hf]===void 0?!0:s[Hf]!==!1}function Kh(s,e){s[Hf]=e}let Fn,bx={x:0,y:0,width:0,height:0};function vx(s,e,t,i){s instanceof Element&&(s=s.getBoundingClientRect()),Fn=i.domElement.getBoundingClientRect();const n=bx;n.x=s.x,n.y=s.y,n.width=s.width,n.height=s.height,n.x-=Fn.x,n.y-=Fn.y;let o=n.width/-2-(n.x-Fn.width/2),r=n.height/-2-(n.y-Fn.height/2);const a=t.view;let l=a?.offsetX||0,h=a?.offsetY||0;l=D.lerp(l,o,e),h=D.lerp(h,r,e),t.setViewOffset(Fn.width,Fn.height,l,h,Fn.width,Fn.height),t.updateProjectionMatrix()}function wx(s,e,t){const i=s.length(),n=e.length(),o=D.lerp(i,n,t);return s.lerp(e,t).normalize().multiplyScalar(o)}const Fu=new c.Quaternion,ob=new c.Quaternion().setFromAxisAngle(new c.Vector3(0,1,0),Math.PI);function xx(s,e){s.lookAt(e),s.quaternion.multiply(ob)}function ec(s,e,t=!0,i=!1){if(s===e)return;Fu.copy(s.quaternion);const n=X(e),o=X(s);if(i){if(Li(s,ue(e)),t){const r=o.y,a=o.sub(ab(s));a.y=r,s.lookAt(a),s.quaternion.multiply(ob)}Number.isNaN(s.quaternion.x)&&s.quaternion.copy(Fu);return}t&&(n.y=o.y),s.lookAt(n),Number.isNaN(s.quaternion.x)&&s.quaternion.copy(Fu)}function Sx(s,e,t,i=1){if(t){const n=V(0,0,0),o=e.x/window.innerWidth*2-1,r=-(e.y/window.innerHeight)*2+1;n.set(o,r,0),n.unproject(t);const a=t.worldPosition,l=s.worldPosition.distanceTo(a),h=n.sub(a);h.multiplyScalar(i*3.6*l);const d=t.worldPosition.add(h);return s.lookAt(d),d}return null}const Cx=new ai(()=>new c.Vector3,100);function V(s,e,t){const i=Cx.get();return i.set(0,0,0),s instanceof c.Vector3?i.copy(s):Array.isArray(s)?i.set(s[0],s[1],s[2]):s instanceof DOMPointReadOnly?i.set(s.x,s.y,s.z):typeof s=="number"?(i.x=s,i.y=e!==void 0?e:i.x,i.z=t!==void 0?t:i.x):typeof s=="object"&&(i.x=s.x,i.y=s.y,i.z=s.z),i}const Px=new ai(()=>new c.Color,30);function rb(s){const e=Px.get();return s?e.copy(s):e.set(0,0,0),e}const Mx=new ai(()=>new c.Quaternion,100);function qi(s){const e=Mx.get();return e.identity(),s instanceof c.Quaternion?e.copy(s):s instanceof DOMPointReadOnly&&e.set(s.x,s.y,s.z,s.w),e}const Np=new ai(()=>new c.Vector3,100),Yg=Symbol("lastMatrixWorldUpdateKey");function X(s,e=null,t=!0){const i=e??Np.get();return s?s.parent?(t&&s.updateWorldMatrix(!0,!1),s.matrixWorldNeedsUpdate&&s[Yg]!==Date.now()&&(s[Yg]=Date.now(),s.updateMatrixWorld()),i.setFromMatrixPosition(s.matrixWorld),i):i.copy(s.position):i.set(0,0,0)}function Ye(s,e){if(!s)return s;const t=Np.get();return e!==t&&t.copy(e),(s?.parent??s).worldToLocal(t),s.position.set(t.x,t.y,t.z),s}function No(s,e,t,i){const n=Np.get();return n.set(e,t,i),Ye(s,n),s}const Zh=new ai(()=>new c.Quaternion,100),Ro=new c.Quaternion,Uu=new c.Quaternion;function ue(s,e=null){if(!s)return Zh.get().identity();const t=e??Zh.get();return s.parent?(s.getWorldQuaternion(t),t):t.copy(s.quaternion)}function Li(s,e){if(!s)return;e!==Ro&&Ro.copy(e);const t=Ro;s?.parent?.getWorldQuaternion(Uu),Uu.invert();const n=Uu.multiply(t);s.quaternion.set(n.x,n.y,n.z,n.w)}function Vp(s,e,t,i,n){Ro.set(e,t,i,n),Li(s,Ro)}const Ox=new ai(()=>new c.Vector3,100),kx=new c.Vector3;function Ae(s,e=null){return e||(e=Ox.get()),s?s.parent?(s.getWorldScale(e),e):e.copy(s.scale):e.set(0,0,0)}function ea(s,e){if(!s)return;if(!s.parent){s.scale.copy(e);return}const t=kx;s.parent.getWorldScale(t),s.scale.copy(e),s.scale.divide(t)}const Rx=new c.Vector3,Kg=new c.Quaternion;function Ex(s){return ue(s,Kg),Rx.set(0,0,1).applyQuaternion(Kg)}const Tx=new ai(()=>new c.Vector3,100),Zg=new c.Quaternion;function ab(s,e){return e||(e=Tx.get().set(0,0,1)),ue(s,Zg),e.applyQuaternion(Zg)}const Jg=new c.Euler,ey=new c.Euler,Ax=new c.Vector3;function $p(s){const e=Zh.get();return s.getWorldQuaternion(e),ey.setFromQuaternion(e),ey}function Wp(s,e){const t=Zh.get();Li(s,t.setFromEuler(e))}function Ed(s){const e=$p(s),t=Ax;return t.set(e.x,e.y,e.z),t.x=D.toDegrees(t.x),t.y=D.toDegrees(t.y),t.z=D.toDegrees(t.z),t}function lb(s,e){tc(s,e.x,e.y,e.z,!0)}function tc(s,e,t,i,n=!0){n&&(e=D.toRadians(e),t=D.toRadians(t),i=D.toRadians(i)),Jg.set(e,t,i),Ro.setFromEuler(Jg),Li(s,Ro)}function Jh(s,e=!0){s&&(e?(function t(i){console.groupCollapsed((i.name?i.name:"(no name : "+i.type+")")+" %o",i),i.children.forEach(t),console.groupEnd()})(s):s.traverse(function(t){for(var i="|___",n=t;n.parent!==null;)i=" "+i,n=n.parent;console.log(i+t.name+" <"+t.type+">")}))}function Lx(s){let e=s?.name||"";if(!s)return e;let t=s.parent;for(;t;)e=t.name+"/"+e,t=t.parent;return e}function cb(s){if(s){const e=s;return e.blendMode!==void 0&&e.clampWhenFinished!==void 0&&e.enabled!==void 0&&e.fadeIn!==void 0&&e.getClip!==void 0}return!1}class ed extends c.ShaderMaterial{static vertex=`
57
+ `,s.shadowRoot?s.shadowRoot.appendChild(t):s.appendChild(t);const i=document.createElement("style");return i.innerHTML=px,t.appendChild(i),t}}const ib=Symbol("logtype"),Yh=new Map;function Xg(s){s.remove();const e=s[ib],t=Yh.get(e)??[];t.push(s),Yh.set(e,t)}function gx(s,e){if(Yh.has(s)){const i=Yh.get(s);if(i.length>0){const n=i.pop();return n.innerHTML=e,n}}const t=document.createElement("div");switch(t.setAttribute("data-id","__needle_engine_debug_overlay"),t.style.marginRight="5px",t.style.padding=".5em",t.style.backgroundColor="rgba(0,0,0,.9)",t.style.marginTop="5px",t.style.marginBottom="3px",t.style.borderRadius="8px",t.style.pointerEvents="all",t.style.userSelect="text",t.style.maxWidth="250px",t.style.whiteSpace="pre-wrap",t.style["backdrop-filter"]="blur(10px)",t.style["-webkit-backdrop-filter"]="blur(10px)",t.style.backgroundColor="rgba(20,20,20,.8)",t.style.boxShadow="inset 0 0 80px rgba(0,0,0,.2), 0 0 5px rgba(0,0,0,.2)",t.style.border="1px solid rgba(160,160,160,.2)",t[ib]=s,s){case 0:t.classList.add("log"),t.style.color="rgba(200,200,200,.7)",t.style.backgroundColor="rgba(40,40,40,.7)";break;case 1:t.classList.add("warn"),t.style.color="rgb(255, 255, 150)",t.style.backgroundColor="rgba(50,50,20,.8)";break;case 2:t.classList.add("error"),t.style.color="rgb(255, 50, 50",t.style.backgroundColor="rgba(50,20,20,.8)";break}return t.title="Open the browser console (F12) for more information",t.innerHTML=e,t}class yx{random(e,t){return Array.isArray(e)?e.length<=0?null:e[Math.floor(Math.random()*e.length)]:e!==void 0&&t!==void 0?Math.random()*(t-e)+e:Math.random()}randomVector3(e,t=0,i=1){e.x=this.random(t,i),e.y=this.random(t,i),e.z=this.random(t,i)}clamp(e,t,i){return e<t?t:e>i?i:e}clamp01(e){return this.clamp(e,0,1)}lerp(e,t,i){return i=i<0?0:i,i=i>1?1:i,e+(t-e)*i}inverseLerp(e,t,i){return(i-e)/(t-e)}remap(e,t,i,n,o){return n+(o-n)*(e-t)/(i-t)}moveTowards(e,t,i){return e+=i,(i<0&&e<t||i>0&&e>t)&&(e=t),e}Rad2Deg=180/Math.PI;Deg2Rad=Math.PI/180;Epsilon=1e-5;toDegrees(e){return e*180/Math.PI}toRadians(e){return e*Math.PI/180}tan(e){return Math.tan(e)}gammaToLinear(e){return Math.pow(e,2.2)}linearToGamma(e){return Math.pow(e,1/2.2)}approximately(e,t,i=Number.EPSILON){for(const n of _x){const o=e[n],r=t[n];if(o===void 0||r===void 0)break;if(Math.abs(o-r)>i)return!1}return!0}easeInOutCubic(e){return e<.5?4*e*e*e:1-Math.pow(-2*e+2,3)/2}}const _x=["x","y","z","w"],D=new yx;class Qg{y;s;alpha=0;constructor(e){this.setAlpha(e),this.y=null,this.s=null}setAlpha(e){if(e<=0||e>1)throw new Error;this.alpha=e}filter(e,t){t&&this.setAlpha(t);let i;return this.y?i=this.alpha*e+(1-this.alpha)*this.s:i=e,this.y=e,this.s=i,i}lastValue(){return this.y}reset(e){this.y=e,this.s=e}}class Eh{freq;minCutOff;beta;dCutOff;x;dx;lasttime;constructor(e,t=1,i=0,n=1){if(e<=0||t<=0||n<=0)throw new Error;this.freq=e,this.minCutOff=t,this.beta=i,this.dCutOff=n,this.x=new Qg(this.alpha(this.minCutOff)),this.dx=new Qg(this.alpha(this.dCutOff)),this.lasttime=null}alpha(e){const t=1/this.freq;return 1/(1+1/(2*Math.PI*e)/t)}filter(e,t=null){this.lasttime&&t&&(this.freq=1/(t-this.lasttime)),this.lasttime=t;const i=this.x.lastValue(),n=i?(e-i)*this.freq:0,o=this.dx.filter(n,this.alpha(this.dCutOff)),r=this.minCutOff+this.beta*Math.abs(o);return this.x.filter(e,this.alpha(r))}reset(e){e!=null&&this.x.reset(e),this.x.alpha=this.alpha(this.minCutOff),this.dx.alpha=this.alpha(this.dCutOff),this.lasttime=null}}class zp{x;y;z;constructor(e,t=1,i=0,n=1){this.x=new Eh(e,t,i,n),this.y=new Eh(e,t,i,n),this.z=new Eh(e,t,i,n)}filter(e,t,i=null){t.x=this.x.filter(e.x,i),t.y=this.y.filter(e.y,i),t.z=this.z.filter(e.z,i)}reset(e){this.x.reset(e?.x),this.y.reset(e?.y),this.z.reset(e?.z)}}const Th="needle:cameraController";function nb(s){return s[Th]}function Gf(s,e,t){t?s[Th]=e:s[Th]===e&&(s[Th]=null)}const Hf="needle:autofit";function sb(s){return s[Hf]===void 0?!0:s[Hf]!==!1}function Kh(s,e){s[Hf]=e}let Fn;const bx={x:0,y:0,width:0,height:0};function vx(s,e,t,i){s instanceof Element&&(s=s.getBoundingClientRect()),Fn=i.domElement.getBoundingClientRect();const n=bx;n.x=s.x,n.y=s.y,n.width=s.width,n.height=s.height,n.x-=Fn.x,n.y-=Fn.y;const o=n.width/-2-(n.x-Fn.width/2),r=n.height/-2-(n.y-Fn.height/2),a=t.view;let l=a?.offsetX||0,h=a?.offsetY||0;l=D.lerp(l,o,e),h=D.lerp(h,r,e),t.setViewOffset(Fn.width,Fn.height,l,h,Fn.width,Fn.height),t.updateProjectionMatrix()}function wx(s,e,t){const i=s.length(),n=e.length(),o=D.lerp(i,n,t);return s.lerp(e,t).normalize().multiplyScalar(o)}const Fu=new c.Quaternion,ob=new c.Quaternion().setFromAxisAngle(new c.Vector3(0,1,0),Math.PI);function xx(s,e){s.lookAt(e),s.quaternion.multiply(ob)}function ec(s,e,t=!0,i=!1){if(s===e)return;Fu.copy(s.quaternion);const n=X(e),o=X(s);if(i){if(Li(s,ue(e)),t){const r=o.y,a=o.sub(ab(s));a.y=r,s.lookAt(a),s.quaternion.multiply(ob)}Number.isNaN(s.quaternion.x)&&s.quaternion.copy(Fu);return}t&&(n.y=o.y),s.lookAt(n),Number.isNaN(s.quaternion.x)&&s.quaternion.copy(Fu)}function Sx(s,e,t,i=1){if(t){const n=V(0,0,0),o=e.x/window.innerWidth*2-1,r=-(e.y/window.innerHeight)*2+1;n.set(o,r,0),n.unproject(t);const a=t.worldPosition,l=s.worldPosition.distanceTo(a),h=n.sub(a);h.multiplyScalar(i*3.6*l);const d=t.worldPosition.add(h);return s.lookAt(d),d}return null}const Cx=new ai(()=>new c.Vector3,100);function V(s,e,t){const i=Cx.get();return i.set(0,0,0),s instanceof c.Vector3?i.copy(s):Array.isArray(s)?i.set(s[0],s[1],s[2]):s instanceof DOMPointReadOnly?i.set(s.x,s.y,s.z):typeof s=="number"?(i.x=s,i.y=e!==void 0?e:i.x,i.z=t!==void 0?t:i.x):typeof s=="object"&&(i.x=s.x,i.y=s.y,i.z=s.z),i}const Px=new ai(()=>new c.Color,30);function rb(s){const e=Px.get();return s?e.copy(s):e.set(0,0,0),e}const Mx=new ai(()=>new c.Quaternion,100);function qi(s){const e=Mx.get();return e.identity(),s instanceof c.Quaternion?e.copy(s):s instanceof DOMPointReadOnly&&e.set(s.x,s.y,s.z,s.w),e}const Np=new ai(()=>new c.Vector3,100),Yg=Symbol("lastMatrixWorldUpdateKey");function X(s,e=null,t=!0){const i=e??Np.get();return s?s.parent?(t&&s.updateWorldMatrix(!0,!1),s.matrixWorldNeedsUpdate&&s[Yg]!==Date.now()&&(s[Yg]=Date.now(),s.updateMatrixWorld()),i.setFromMatrixPosition(s.matrixWorld),i):i.copy(s.position):i.set(0,0,0)}function Ye(s,e){if(!s)return s;const t=Np.get();return e!==t&&t.copy(e),(s?.parent??s).worldToLocal(t),s.position.set(t.x,t.y,t.z),s}function No(s,e,t,i){const n=Np.get();return n.set(e,t,i),Ye(s,n),s}const Zh=new ai(()=>new c.Quaternion,100),Ro=new c.Quaternion,Uu=new c.Quaternion;function ue(s,e=null){if(!s)return Zh.get().identity();const t=e??Zh.get();return s.parent?(s.getWorldQuaternion(t),t):t.copy(s.quaternion)}function Li(s,e){if(!s)return;e!==Ro&&Ro.copy(e);const t=Ro;s?.parent?.getWorldQuaternion(Uu),Uu.invert();const n=Uu.multiply(t);s.quaternion.set(n.x,n.y,n.z,n.w)}function Vp(s,e,t,i,n){Ro.set(e,t,i,n),Li(s,Ro)}const Ox=new ai(()=>new c.Vector3,100),kx=new c.Vector3;function Ae(s,e=null){return e||(e=Ox.get()),s?s.parent?(s.getWorldScale(e),e):e.copy(s.scale):e.set(0,0,0)}function ea(s,e){if(!s)return;if(!s.parent){s.scale.copy(e);return}const t=kx;s.parent.getWorldScale(t),s.scale.copy(e),s.scale.divide(t)}const Rx=new c.Vector3,Kg=new c.Quaternion;function Ex(s){return ue(s,Kg),Rx.set(0,0,1).applyQuaternion(Kg)}const Tx=new ai(()=>new c.Vector3,100),Zg=new c.Quaternion;function ab(s,e){return e||(e=Tx.get().set(0,0,1)),ue(s,Zg),e.applyQuaternion(Zg)}const Jg=new c.Euler,ey=new c.Euler,Ax=new c.Vector3;function $p(s){const e=Zh.get();return s.getWorldQuaternion(e),ey.setFromQuaternion(e),ey}function Wp(s,e){const t=Zh.get();Li(s,t.setFromEuler(e))}function Ed(s){const e=$p(s),t=Ax;return t.set(e.x,e.y,e.z),t.x=D.toDegrees(t.x),t.y=D.toDegrees(t.y),t.z=D.toDegrees(t.z),t}function lb(s,e){tc(s,e.x,e.y,e.z,!0)}function tc(s,e,t,i,n=!0){n&&(e=D.toRadians(e),t=D.toRadians(t),i=D.toRadians(i)),Jg.set(e,t,i),Ro.setFromEuler(Jg),Li(s,Ro)}function Jh(s,e=!0){s&&(e?(function t(i){console.groupCollapsed((i.name?i.name:"(no name : "+i.type+")")+" %o",i),i.children.forEach(t),console.groupEnd()})(s):s.traverse(function(t){for(var i="|___",n=t;n.parent!==null;)i=" "+i,n=n.parent;console.log(i+t.name+" <"+t.type+">")}))}function Lx(s){let e=s?.name||"";if(!s)return e;let t=s.parent;for(;t;)e=t.name+"/"+e,t=t.parent;return e}function cb(s){if(s){const e=s;return e.blendMode!==void 0&&e.clampWhenFinished!==void 0&&e.enabled!==void 0&&e.fadeIn!==void 0&&e.getClip!==void 0}return!1}class ed extends c.ShaderMaterial{static vertex=`
58
58
  varying vec2 vUv;
59
59
  void main(){
60
60
  vUv = uv;
@@ -141,7 +141,7 @@ void main(){
141
141
  #__vconsole .vc-mask {
142
142
  overflow: hidden;
143
143
  }
144
- `,po?.prepend(i),s===!0&&Z_()<=0&&gb(),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.":"")),Fa=!1,Oi=null},e.src="https://cdn.jsdelivr.net/npm/vconsole@3.15.1/dist/vconsole.min.js",document.body.appendChild(e)}function Qx(){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"),Oi?.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 Yx(){const s=document.querySelector("#__vconsole .vc-switch");return s||null}function Kx(){const s=document.querySelector("#__vconsole");return s||null}const yb=w("debugdefines");Ks('if(!globalThis["NEEDLE_ENGINE_VERSION"]) globalThis["NEEDLE_ENGINE_VERSION"] = "0.0.0";');Ks('if(!globalThis["NEEDLE_ENGINE_GENERATOR"]) globalThis["NEEDLE_ENGINE_GENERATOR"] = "unknown";');Ks('if(!globalThis["NEEDLE_PROJECT_BUILD_TIME"]) globalThis["NEEDLE_PROJECT_BUILD_TIME"] = "unknown";');Ks('if(!globalThis["NEEDLE_PUBLIC_KEY"]) globalThis["NEEDLE_PUBLIC_KEY"] = "unknown";');Ks('globalThis["__NEEDLE_ENGINE_VERSION__"] = "4.8.8";');Ks('globalThis["__NEEDLE_ENGINE_GENERATOR__"] = "undefined";');Ks('globalThis["__NEEDLE_PROJECT_BUILD_TIME__"] = "Fri Aug 29 2025 16:58:42 GMT+0000 (Coordinated Universal Time)";');Ks('globalThis["__NEEDLE_PUBLIC_KEY__"] = "'+NEEDLE_PUBLIC_KEY+'";');const Ki="4.8.8",Td="undefined",Xp="Fri Aug 29 2025 16:58:42 GMT+0000 (Coordinated Universal Time)";yb&&console.log(`Engine version: ${Ki} (generator: ${Td})
144
+ `,po?.prepend(i),s===!0&&Z_()<=0&&gb(),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.":"")),Fa=!1,Oi=null},e.src="https://cdn.jsdelivr.net/npm/vconsole@3.15.1/dist/vconsole.min.js",document.body.appendChild(e)}function Qx(){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"),Oi?.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 Yx(){const s=document.querySelector("#__vconsole .vc-switch");return s||null}function Kx(){const s=document.querySelector("#__vconsole");return s||null}const yb=w("debugdefines");Ks('if(!globalThis["NEEDLE_ENGINE_VERSION"]) globalThis["NEEDLE_ENGINE_VERSION"] = "0.0.0";');Ks('if(!globalThis["NEEDLE_ENGINE_GENERATOR"]) globalThis["NEEDLE_ENGINE_GENERATOR"] = "unknown";');Ks('if(!globalThis["NEEDLE_PROJECT_BUILD_TIME"]) globalThis["NEEDLE_PROJECT_BUILD_TIME"] = "unknown";');Ks('if(!globalThis["NEEDLE_PUBLIC_KEY"]) globalThis["NEEDLE_PUBLIC_KEY"] = "unknown";');Ks('globalThis["__NEEDLE_ENGINE_VERSION__"] = "4.8.8";');Ks('globalThis["__NEEDLE_ENGINE_GENERATOR__"] = "undefined";');Ks('globalThis["__NEEDLE_PROJECT_BUILD_TIME__"] = "Fri Aug 29 2025 17:31:49 GMT+0000 (Coordinated Universal Time)";');Ks('globalThis["__NEEDLE_PUBLIC_KEY__"] = "'+NEEDLE_PUBLIC_KEY+'";');const Ki="4.8.8",Td="undefined",Xp="Fri Aug 29 2025 17:31:49 GMT+0000 (Coordinated Universal Time)";yb&&console.log(`Engine version: ${Ki} (generator: ${Td})
145
145
  Project built at ${Xp}`);const Fr=NEEDLE_PUBLIC_KEY,os="needle_isActiveInHierarchy",xo="builtin_components",xl="needle_editor_guid";function Ks(s){try{(0,eval)(s)}catch(e){yb&&console.error(e)}}let _b,ny=null;function Ji(){return _b}function Qp(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}ny!==s&&(ny=s,_b=new s)}const ii=Symbol("shadowDomOwner"),Zx=w("debugpatch");function Ad(s,e,t,i){const n=Zx===e;if(!t&&!i)return;const o=e+"___needle";eS(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]=oy(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]=oy(l,s,e);else{const h=this[o];bb(s,e,this,h,l),this[o]=l,vb(s,e,this,h,l)}},get:function(){const l=this[o];return typeof l=="function"&&l[o]?l[o]:l}}))}function Jx(s,e,t){const i=Yp(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 sy=Symbol("Needle:Patches:WrappedFunction");function oy(s,e,t){if(s[sy])return s;const i=function(...n){bb(e,t,this,...n);const o=s.apply(this,n);return vb(e,t,this,o,...n),o};return i[sy]=!0,i}const Ah="Needle:Patches";function Xf(){return globalThis[Ah]||(globalThis[Ah]=new WeakMap),globalThis[Ah]}function Yp(s,e){const t=Xf().get(s);return t?t.get(e):null}function eS(s,e,t,i){let n=Xf().get(s);n||(n=new Map,Xf().set(s,n));let o=n.get(e);o||(o=[],n.set(e,o)),o.push({prefix:t,postfix:i})}function bb(s,e,t,...i){if(!t)return;const n=Yp(s,e);if(n)for(const o of n)o.prefix?.call(t,...i)}function vb(s,e,t,i,...n){if(!t)return;const o=Yp(s,e);if(o)for(const r of o)r.postfix?.call(t,i,...n)}const ta=[];function Ld(s){ta.indexOf(s)===-1&&ta.push(s)}function tS(s){const e=ta.indexOf(s);e!==-1&&ta.splice(e,1)}const ia=[];function Kp(s){ia.indexOf(s)===-1&&ia.push(s)}function iS(s){const e=ia.indexOf(s);e!==-1&&ia.splice(e,1)}function wb(s){globalThis.dispatchEvent(new CustomEvent("needle-xrsession-start",{detail:s}));for(let e=0;e<ta.length;e++)ta[e](s)}function xb(s){globalThis.dispatchEvent(new CustomEvent("needle-xrsession-end",{detail:s}));for(let e=0;e<ia.length;e++)ia[e](s)}const He=w("debuginput");var Dd=(s=>(s.Mouse="mouse",s.Touch="touch",s.Controller="controller",s.Hand="hand",s))(Dd||{}),we=(s=>(s.PointerDown="pointerdown",s.PointerUp="pointerup",s.PointerMove="pointermove",s.KeyDown="keydown",s.KeyUp="keyup",s.KeyPressed="keypress",s))(we||{});class Qn extends PointerEvent{clientZ;deviceIndex;origin;source;mode;get isSpatial(){return this.mode!="screen"}get ray(){return this._ray||(this._ray=new c.Ray(this.space.worldPosition.clone(),this.space.worldForward.clone())),this._ray}set ray(e){this._ray=e}get hasRay(){return this._ray!==void 0}_ray;space;isClick=!1;isDoubleClick=!1;get used(){return this._used}_used=!1;use(){this._used=!0}get pointerId(){return this._pointerid}_pointerid;get pointerType(){return this._pointerType}_pointerType;get type(){return this._type}_type;metadata={};intersections=new Array;constructor(e,t,i){super(e,i),this.clientZ=i.clientZ,this._pointerid=i.pointerId,this._pointerType=i.pointerType,this._type=e,this.deviceIndex=i.deviceIndex,this.origin=i.origin,this.source=t,this.mode=i.mode,this._ray=i.ray,this.space=i.device}_immediatePropagationStopped=!1;get immediatePropagationStopped(){return this._immediatePropagationStopped}_propagationStopped=!1;get propagationStopped(){return this._immediatePropagationStopped||this._propagationStopped}stopImmediatePropagation(){this._immediatePropagationStopped=!0,super.stopImmediatePropagation(),this.source?.stopImmediatePropagation()}stopPropagation(){this._propagationStopped=!0,super.stopPropagation(),this.source?.stopPropagation(),He&&console.warn("Stop propagation...",this.pointerId,this.pointerType)}}class nl extends KeyboardEvent{source;constructor(e,t,i){super(e,i),this.source=t}stopImmediatePropagation(){super.stopImmediatePropagation(),this.source?.stopImmediatePropagation()}}class nS{key;keyType;source;constructor(e){this.key=e.key,this.keyType=e.type,this.source=e}}var Nt=(s=>(s[s.Early=-100]="Early",s[s.Default=0]="Default",s[s.Late=100]="Late",s))(Nt||{});class Sb{_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 nl){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 Qn){const i=this._eventListeners[e.type];if(i)for(const n of i){if(t)break;for(let o=0;o<n.listeners.length;o++){const r=n.listeners[o];if(r.options?.signal?.aborted){n.listeners.splice(o,1),o--;continue}if(e.immediatePropagationStopped){t=!0,He&&console.log("immediatePropagationStopped",e.type);break}else e.propagationStopped&&(t=!0,He&&console.log("propagationStopped",e.type));r.options.once&&(n.listeners.splice(o,1),o--),r.callback(e)}}}}_doubleClickTimeThreshold=.2;_longPressTimeThreshold=1;get mousePosition(){return this._pointerPositions[0]}get mousePositionRC(){return this._pointerPositionsRC[0]}get mouseDown(){return this._pointerDown[0]}get mouseUp(){return this._pointerUp[0]}get mouseClick(){return this._pointerClick[0]}get mouseDoubleClick(){return this._pointerDoubleClick[0]}get mousePressed(){return this._pointerPressed[0]}get mouseWheelChanged(){return this.getMouseWheelChanged(0)}get click(){return this._pointerClick[0]}get doubleClick(){return this._pointerDoubleClick[0]}getGamepad(e=0){return typeof navigator<"u"&&"getGamepads"in navigator&&navigator.getGamepads()[e]||null}_setCursorTypes=[];setCursorPointer(){this.setCursor("pointer")}setCursorNormal(){this.unsetCursor("pointer")}setCursor(e){this._setCursorTypes.push(e),this._setCursorTypes.length>10&&this._setCursorTypes.shift(),this.updateCursor()}unsetCursor(e){for(let t=this._setCursorTypes.length-1;t>=0;t--)if(this._setCursorTypes[t]===e){this._setCursorTypes.splice(t,1),this.updateCursor();break}}updateCursor(){this._setCursorTypes?.length==0?this.context.domElement.style.cursor="default":this.context.domElement.style.cursor=this._setCursorTypes[this._setCursorTypes.length-1]}getIsPointerIdInUse(e){for(const t of this._pointerEventsPressed)if(t.pointerId===e&&t.used)return!0;return!1}getPointerPressedCount(){let e=0;for(let t=0;t<this._pointerPressed.length;t++)this._pointerPressed[t]&&e++;return e}getPointerPosition(e){return e>=this._pointerPositions.length?null:this._pointerPositions[e]}getPointerPositionLastFrame(e){return e>=this._pointerPositionsLastFrame.length?null:this._pointerPositionsLastFrame[e]}getPointerPositionDelta(e){return e>=this._pointerPositionsDelta.length?null:this._pointerPositionsDelta[e]}getPointerPositionRC(e){return e>=this._pointerPositionsRC.length?null:this._pointerPositionsRC[e]}getPointerDown(e){return e>=this._pointerDown.length?!1:this._pointerDown[e]}getPointerUp(e){return e>=this._pointerUp.length?!1:this._pointerUp[e]}getPointerPressed(e){return e>=this._pointerPressed.length?!1:this._pointerPressed[e]}getPointerClicked(e){return e>=this._pointerClick.length?!1:this._pointerClick[e]}getPointerDoubleClicked(e){return e>=this._pointerDoubleClick.length?!1:this._pointerDoubleClick[e]}getPointerDownTime(e){return e>=this._pointerDownTime.length?-1:this._pointerDownTime[e]}getPointerUpTime(e){return e>=this._pointerUpTime.length?-1:this._pointerUpTime[e]}getPointerLongPress(e){return e>=this._pointerDownTime.length?!1:this.getPointerPressed(e)&&this.context.time.time-this._pointerDownTime[e]>this._longPressTimeThreshold}getIsMouse(e){return e<0||e>=this._pointerTypes.length?!1:this._pointerTypes[e]==="mouse"}getIsTouch(e){return e<0||e>=this._pointerTypes.length?!1:this._pointerTypes[e]==="touch"}getTouchesPressedCount(){let e=0;for(let t=0;t<this._pointerPressed.length;t++)this._pointerPressed[t]&&this.getIsTouch(t)&&e++;return e}getMouseWheelChanged(e=0){return e>=this._mouseWheelChanged.length?!1:this._mouseWheelChanged[e]}getMouseWheelDeltaY(e=0){return e>=this._mouseWheelDeltaY.length?0:this._mouseWheelDeltaY[e]}getPointerEvent(e){if(!(e>=this._pointerEvent.length))return this._pointerEvent[e]??void 0}*foreachPointerId(e){for(let t=0;t<this._pointerTypes.length;t++)if(this._pointerIsActive(t)){if(e!==void 0){const i=this._pointerTypes[t];if(Array.isArray(e)){let n=!1;for(const o of e)if(i===o){n=!0;break}if(!n)continue}else if(e!==i)continue}yield t}}*foreachTouchId(){for(let e=0;e<this._pointerTypes.length;e++)this._pointerTypes[e]==="touch"&&this._pointerIsActive[e]&&(yield e)}_pointerIsActive(e){return e<0?!1:this._pointerPressed[e]||this._pointerDown[e]||this._pointerUp[e]}context;_pointerDown=[!1];_pointerUp=[!1];_pointerClick=[!1];_pointerDoubleClick=[!1];_pointerPressed=[!1];_pointerPositions=[new c.Vector2];_pointerPositionsLastFrame=[new c.Vector2];_pointerPositionsDelta=[new c.Vector2];_pointerPositionsRC=[new c.Vector2];_pointerPositionDown=[new c.Vector3];_pointerDownTime=[];_pointerUpTime=[];_pointerUpTimestamp=[];_pointerIds=[];_pointerTypes=[""];_mouseWheelChanged=[!1];_mouseWheelDeltaY=[0];_pointerEvent=[];_pointerEventsPressed=[];_pointerSpace=[];_pressedStack=new Map;onDownButton(e,t){let i=this._pressedStack.get(e);i||(i=[],this._pressedStack.set(e,i)),i.push(t)}onReleaseButton(e,t){const i=this._pressedStack.get(e);if(!i)return;const n=i.indexOf(t);n>=0&&i.splice(n,1)}getFirstPressedButtonForPointer(e){const t=this._pressedStack.get(e);if(t)return t[0]}getLatestPressedButtonForPointer(e){const t=this._pressedStack.get(e);if(t)return t[t.length-1]}getKeyDown(e){if(e!==void 0)return this.isKeyDown(e);for(const t in this.keysPressed){const i=this.keysPressed[t];if(i.startFrame===this.context.time.frameCount)return i.key}return null}getKeyPressed(e){if(e!==void 0)return this.isKeyPressed(e);for(const t in this.keysPressed){const i=this.keysPressed[t];if(i.pressed)return i.key}return null}getKeyUp(e){if(e!==void 0)return this.isKeyUp(e);for(const t in this.keysPressed){const i=this.keysPressed[t];return i.pressed===!1&&i.frame===this.context.time.frameCount}return null}isKeyDown(e){if(!this.context.application.isVisible||!this.context.application.hasFocus)return!1;const t=this.getCodeForCommonKeyName(e);if(t!==null){for(const n of t)if(this.isKeyDown(n))return!0;return!1}const i=this.keysPressed[e];return i?i.startFrame===this.context.time.frameCount&&i.pressed:!1}isKeyUp(e){if(!this.context.application.isVisible||!this.context.application.hasFocus)return!1;const t=this.getCodeForCommonKeyName(e);if(t!==null){for(const n of t)if(this.isKeyUp(n))return!0;return!1}const i=this.keysPressed[e];return i?i.frame===this.context.time.frameCount&&i.pressed===!1:!1}isKeyPressed(e){if(!this.context.application.isVisible||!this.context.application.hasFocus)return!1;const t=this.getCodeForCommonKeyName(e);if(t!==null){for(const n of t)if(this.isKeyPressed(n))return!0;return!1}const i=this.keysPressed[e];return i&&i.pressed||!1}getCodeForCommonKeyName(e){if(e.length===1){if(e>="0"&&e<="9")return["Digit"+e];if(e>="a"&&e<="z")return["Key"+e.toUpperCase()];if(e==" ")return["Space"]}switch(e){case"shift":case"Shift":return["ShiftLeft","ShiftRight"];case"control":case"Control":return["ControlLeft","ControlRight"];case"alt":case"Alt":return["AltLeft","AltRight"]}return null}createInputEvent(e){switch(e.type){case"pointerdown":He&&Se("Create Pointer down"),this.onDownButton(e.deviceIndex,e.button),this.onDown(e);break;case"pointermove":He&&Se("Create Pointer move"),this.onMove(e);break;case"pointerup":He&&Se("Create Pointer up"),this.onUp(e),this.onReleaseButton(e.deviceIndex,e.button);break}}convertScreenspaceToRaycastSpace(e){return e.x=(e.x-this.context.domX)/this.context.domWidth*2-1,e.y=-((e.y-this.context.domY)/this.context.domHeight)*2+1,e}constructor(e){this.context=e,this.context.post_render_callbacks.push(this.onEndOfFrame)}_htmlEventSource;bindEvents(){this.unbindEvents(),this._htmlEventSource=this.context.renderer.domElement,window.addEventListener("contextmenu",this.onContextMenu),this._htmlEventSource.addEventListener("pointerdown",this.onPointerDown,{passive:!0}),window.addEventListener("pointermove",this.onPointerMove,{passive:!0,capture:!0}),window.addEventListener("pointerup",this.onPointerUp,{passive:!0}),window.addEventListener("pointercancel",this.onPointerCancel,{passive:!0}),window.addEventListener("touchstart",this.onTouchStart,{passive:!0}),window.addEventListener("touchmove",this.onTouchMove,{passive:!0}),window.addEventListener("touchend",this.onTouchEnd,{passive:!0}),this._htmlEventSource.addEventListener("wheel",this.onMouseWheel,{passive:!0}),window.addEventListener("wheel",this.onWheelWindow,{passive:!0}),window.addEventListener("keydown",this.onKeyDown,!1),window.addEventListener("keypress",this.onKeyPressed,!1),window.addEventListener("keyup",this.onKeyUp,!1),window.addEventListener("blur",this.onLostFocus)}unbindEvents(){for(const e in this._eventListeners)this._eventListeners[e].length=0;window.removeEventListener("contextmenu",this.onContextMenu),this._htmlEventSource?.removeEventListener("pointerdown",this.onPointerDown),window.removeEventListener("pointermove",this.onPointerMove),window.removeEventListener("pointerup",this.onPointerUp),window.removeEventListener("pointercancel",this.onPointerCancel),window.removeEventListener("touchstart",this.onTouchStart),window.removeEventListener("touchmove",this.onTouchMove),window.removeEventListener("touchend",this.onTouchEnd),this._htmlEventSource?.removeEventListener("wheel",this.onMouseWheel,!1),window.removeEventListener("wheel",this.onWheelWindow,!1),window.removeEventListener("keydown",this.onKeyDown,!1),window.removeEventListener("keypress",this.onKeyPressed,!1),window.removeEventListener("keyup",this.onKeyUp,!1),window.removeEventListener("blur",this.onLostFocus)}dispose(){const e=this.context.post_render_callbacks.indexOf(this.onEndOfFrame);e>=0&&this.context.post_render_callbacks.splice(e,1),this.unbindEvents()}onLostFocus=()=>{for(const e in this.keysPressed)this.keysPressed[e].pressed=!1};_receivedPointerMoveEventsThisFrame=new Array;onEndOfFrame=()=>{this._receivedPointerMoveEventsThisFrame.length=0;for(let e=0;e<this._pointerUp.length;e++)this._pointerUp[e]=!1;for(let e=0;e<this._pointerDown.length;e++)this._pointerDown[e]=!1;for(let e=0;e<this._pointerClick.length;e++)this._pointerClick[e]=!1;for(let e=0;e<this._pointerDoubleClick.length;e++)this._pointerDoubleClick[e]=!1;for(const e of this._pointerPositionsDelta)e.set(0,0);for(let e=0;e<this._mouseWheelChanged.length;e++)this._mouseWheelChanged[e]=!1;for(let e=0;e<this._mouseWheelDeltaY.length;e++)this._mouseWheelDeltaY[e]=0};canReceiveInput(e){return e.target===this.context.renderer?.domElement||e.target===this.context.domElement||this.context.isInAR||this.context.isInAR&&e.target===document.body&&exports.DeviceUtilities.isMozillaXR()?!0:(He&&console.warn("CanReceiveInput:False for",e.target),!1)}onContextMenu=e=>{this.canReceiveInput(e)!==!1&&e instanceof PointerEvent&&e.pointerType};keysPressed={};onKeyDown=e=>{if(He&&console.log(`key down ${e.code}, ${this.context.application.hasFocus}`,e),!this.context.application.hasFocus)return;const t=this.keysPressed[e.code];if(t&&t.pressed)return;this.keysPressed[e.code]={pressed:!0,frame:this.context.time.frameCount+1,startFrame:this.context.time.frameCount+1,key:e.key,code:e.code};const i=new nl("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 nl("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 nl("keyup",e,e);this.onDispatchEvent(i)};onWheelWindow=e=>{document.pointerLockElement&&this.onMouseWheel(e)};onMouseWheel=e=>{if(this.canReceiveInput(e)===!1)return;this._mouseWheelDeltaY.length<=0&&this._mouseWheelDeltaY.push(0),this._mouseWheelChanged.length<=0&&this._mouseWheelChanged.push(!1),this._mouseWheelChanged[0]=!0;const t=this._mouseWheelDeltaY[0];this._mouseWheelDeltaY[0]=t+e.deltaY};onPointerDown=e=>{if(this.context.isInAR||this.canReceiveInput(e)===!1)return;e.target instanceof HTMLElement&&e.target.setPointerCapture(e.pointerId);const t=this.getPointerId(e);He&&Se(`pointer down #${t}, identifier:${e.pointerId}`);const i=this.getAndUpdateSpatialObjectForScreenPosition(t,e.clientX,e.clientY),n=new Qn("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 Qn("pointermove",e,{origin:this,mode:"screen",deviceIndex:0,pointerId:i,button:t,clientX:e.clientX,clientY:e.clientY,pointerType:e.pointerType,buttonName:this.getButtonName(e),device:n,pressure:e.pressure});this.onMove(o)};onPointerCancel=e=>{this.context.isInAR||(He&&console.log("Pointer cancel",e),this.onPointerUp(e))};onPointerUp=e=>{if(this.context.isInAR)return;e.target instanceof HTMLElement&&e.target.releasePointerCapture(e.pointerId);const t=this.getPointerId(e),i=new Qn("pointerup",e,{origin:this,mode:"screen",deviceIndex:0,pointerId:t,button:e.button,clientX:e.clientX,clientY:e.clientY,pointerType:e.pointerType,buttonName:this.getButtonName(e),device:this.getAndUpdateSpatialObjectForScreenPosition(t,e.clientX,e.clientY),pressure:e.pressure});this.onUp(i),this._pointerIds[t]=-1,He&&console.log("ID="+t,"PointerId="+e.pointerId,"ALL:",[...this._pointerIds])};getPointerId(e,t){return e.pointerType==="mouse"?0+(t??e.button):this.getPointerIndex(e.pointerId)}getButtonName(e){const t=e.button;if(e.pointerType==="mouse")switch(t){case 0:return"left";case 1:return"middle";case 2:return"right"}return"unknown"}onTouchStart=e=>{if(this.context.isInAR)for(let t=0;t<e.changedTouches.length;t++){const i=e.changedTouches[t],n=this.getPointerIndex(i.identifier),o=this.getAndUpdateSpatialObjectForScreenPosition(n,i.clientX,i.clientY),r=new Qn("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 Qn("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 Qn("pointerup",e,{origin:this,mode:"screen",deviceIndex:0,pointerId:n,button:0,clientX:i.clientX,clientY:i.clientY,pointerType:"touch",buttonName:"unknown",device:this.getAndUpdateSpatialObjectForScreenPosition(n,i.clientX,i.clientY),pressure:i.force});this.onUp(o),this._pointerIds[n]=-1}};tempNearPlaneVector=new c.Vector3;tempFarPlaneVector=new c.Vector3;tempLookMatrix=new c.Matrix4;getAndUpdateSpatialObjectForScreenPosition(e,t,i){let n=this._pointerSpace[e];n||(n=new c.Object3D,this._pointerSpace[e]=n),this._pointerSpace[e]=n;const o=this.context.mainCamera;if(o){const r=this.tempNearPlaneVector.set(t,i,-1);this.convertScreenspaceToRaycastSpace(r);const a=this.tempFarPlaneVector.set(r.x,r.y,1);r.unproject(o),a.unproject(o);const l=o.worldUp||V(0,1,0).applyQuaternion(ue(o));this.tempLookMatrix.lookAt(a,r,l),n.position.set(r.x,r.y,r.z),n.quaternion.setFromRotationMatrix(this.tempLookMatrix)}return n}isInRect(e){if(this.context.isInXR)return!0;const t=this.context.domElement.getBoundingClientRect(),i=e.clientX,n=e.clientY,o=i>=t.x&&i<=t.right&&n>=t.y&&n<=t.bottom;return He&&!o&&console.log("Not in rect",t,i,n),o}onDown(e){const t=e.pointerId;if(this.getPointerPressed(t)&&console.warn(`Received pointerDown for pointerId that is already pressed: ${t}`,He?e:""),He&&console.log(e.pointerType,"DOWN",t),!!this.isInRect(e)){for(this.setPointerState(t,this._pointerPressed,!0),this.setPointerState(t,this._pointerDown,!0),this.setPointerStateT(t,this._pointerEvent,e.source);t>=this._pointerTypes.length;)this._pointerTypes.push(e.pointerType);for(this._pointerTypes[t]=e.pointerType;t>=this._pointerPositionDown.length;)this._pointerPositionDown.push(new c.Vector3);for(this._pointerPositionDown[t].set(e.clientX,e.clientY,e.clientZ??0);t>=this._pointerPositions.length;)this._pointerPositions.push(new c.Vector2);this._pointerPositions[t].set(e.clientX,e.clientY),t>=this._pointerDownTime.length&&this._pointerDownTime.push(0),this._pointerDownTime[t]=this.context.time.realtimeSinceStartup,this.updatePointerPosition(e),this._pointerEventsPressed.push(e),this.onDispatchEvent(e)}}onMove(e){const t=e.pointerId,i=this.getPointerPressed(t);i===!1&&!this.isInRect(e)||e.pointerType==="touch"&&!i||(this.updatePointerPosition(e),this.setPointerStateT(t,this._pointerEvent,e.source),this.onDispatchEvent(e))}onUp(e){const t=e.pointerId;if(!this.getPointerPressed(t)){He&&console.log(e.pointerType,"UP",t,"was not down");return}He&&console.log(e.pointerType,"UP",t),this.setPointerState(t,this._pointerPressed,!1),this.setPointerStateT(t,this._pointerEvent,e.source),this.setPointerState(t,this._pointerUp,!0),this.updatePointerPosition(e);for(let l=this._pointerEventsPressed.length-1;l>=0;l--)if(this._pointerEventsPressed[l].pointerId===t){this._pointerEventsPressed.splice(l,1);break}if(!this._pointerPositionDown[t]){He&&he("Received pointer up event without matching down event for button: "+t),console.warn("Received pointer up event without matching down event for button: "+t);return}const n=this._pointerUpTime[t],o=this._pointerDownTime[t],r=this.context.time.realtimeSinceStartup,a=r-o;if(t>=this._pointerUpTime.length&&this._pointerUpTime.push(-99),this._pointerUpTime[t]=r,a<1){let l=e.clientX-this._pointerPositionDown[t].x,h=e.clientY-this._pointerPositionDown[t].y,d=0;if(e.isSpatial&&e.clientZ!=null&&(d=e.clientZ-this._pointerPositionDown[t].z,l*=200,h*=200,d*=200),Math.abs(l)<5&&Math.abs(h)<5&&Math.abs(d)<5){this.setPointerState(t,this._pointerClick,!0),e.isClick=!0;const u=r-n;He&&console.log("CLICK",t,l,h,d,u),u<this._doubleClickTimeThreshold&&u>0&&(this.setPointerState(t,this._pointerDoubleClick,!0),e.isDoubleClick=!0)}}this.onDispatchEvent(e)}updatePointerPosition(e){const t=e.pointerId;for(;t>=this._pointerPositions.length;)this._pointerPositions.push(new c.Vector2);for(;t>=this._pointerPositionsLastFrame.length;)this._pointerPositionsLastFrame.push(new c.Vector2);for(;t>=this._pointerPositionsDelta.length;)this._pointerPositionsDelta.push(new c.Vector2);const i=this._pointerPositionsLastFrame[t];i.copy(this._pointerPositions[t]);const n=this._pointerPositionsDelta[t];let o=e.clientX-i.x,r=e.clientY-i.y;if(e.source instanceof MouseEvent||e.source instanceof TouchEvent){const d=e.source;o===0&&d.movementX!==0&&(o=d.movementX||0),r===0&&d.movementY!==0&&(r=d.movementY||0)}n.x+=o,n.y+=r,this._pointerPositions[t].x=e.clientX,this._pointerPositions[t].y=e.clientY;const a=e.clientX,l=e.clientY;for(;t>=this._pointerPositionsRC.length;)this._pointerPositionsRC.push(new c.Vector2);const h=this._pointerPositionsRC[t];h.set(a,l),this.convertScreenspaceToRaycastSpace(h)}getPointerIndex(e){let t=-1;for(let i=0;i<this._pointerIds.length;i++){if(this._pointerIds[i]===e)return i;t===-1&&this._pointerIds[i]===-1&&(t=i)}return t!==-1?(this._pointerIds[t]=e,t):(He&&console.log("PUSH pointerId:",e),this._pointerIds.push(e),this._pointerIds.length-1)}setPointerState(e,t,i){t[e]=i}setPointerStateT(e,t,i){return t[e]=i,i}onDispatchEvent(e){const t=U.Current;try{U.Current=this.context,this.dispatchEvent(e)}finally{U.Current=t}}}const Gr=new c.Matrix4().makeRotationY(Math.PI),Pi=new c.Quaternion().setFromAxisAngle(new c.Vector3(0,1,0),Math.PI),sS=w("debugwebxr");class oS{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",sS){const e=sm(16733661);e.position.y+=.5,this.gameObject.add(e)}}}const Un=w("debugwebxr"),Jc=w("debugcustomgesture"),rS="https://cdn.jsdelivr.net/npm/@webxr-input-profiles/assets@1.0/dist/profiles",aS="generic-trigger",lS=new c.Quaternion().setFromEuler(new c.Euler(c.MathUtils.degToRad(0),c.MathUtils.degToRad(-90),c.MathUtils.degToRad(-90))),cS=new c.Vector3(.04,-.04,0);class Zp{xr;get context(){return this.xr.context}inputSource;index=0;emitEvents=!0;get connected(){return this._connected}_connected=!0;get isTracking(){return this._isTracking}_isTracking=!1;get gamepad(){return this.__gamepad??=this.inputSource.gamepad}__gamepad;get isHand(){return this.hand!=null}get hand(){return this.__hand??=this.inputSource.hand}__hand;get handObject(){return this.context.renderer.xr.getHand(this.index)}get profiles(){return this.inputSource.profiles}get layout(){return this._layout}get targetRayMode(){return this.inputSource.targetRayMode}get targetRaySpace(){return this.inputSource.targetRaySpace}get gripSpace(){return this.inputSource.gripSpace}get side(){return this.__side??=this.inputSource.handedness}__side=void 0;get isRight(){return this.side==="right"}get isLeft(){return this.side==="left"}get isStylus(){return this._isMxInk}getHitTestSource(){return this._hitTestSource||this._requestHitTestSource(),this._hitTestSource}get hasHitTestSource(){return this._hitTestSource}cancelHitTestSource(){this._hitTestSource&&(this._hitTestSource.cancel(),this._hitTestSource=void 0)}_hitTestSource=void 0;_hasSelectEvent=!1;get hasSelectEvent(){return this._hasSelectEvent}_isMxInk=!1;_isMetaQuestTouchController=!1;getHitTest(){return this.xr.getHitTest(this)}_handJointPoses=new Map;getHandJointPose(e,t){if(t=t||this.xr.frame,!this.hand||!t?.getJointPose||!this.xr.referenceSpace)return null;let i=this._handJointPoses?.get(e);return i||(i=t.getJointPose(e,this.xr.referenceSpace),i&&this._handJointPoses.set(e,i),i)}_gripMatrix=new c.Matrix4;_gripPosition=new c.Vector3;_gripQuaternion=new c.Quaternion;_linearVelocity=new c.Vector3;_rayPositionRaw=new c.Vector3;_rayRotationRaw=new c.Quaternion;_rayMatrix=new c.Matrix4;_rayPosition=new c.Vector3;_rayQuaternion=new c.Quaternion;get gripPosition(){return V(this._gripPosition)}get gripQuaternion(){return qi(this._gripQuaternion)}get gripMatrix(){return this._gripMatrix}get gripLinearVelocity(){return V(this._linearVelocity).applyQuaternion(Pi)}get rayPosition(){return V(this._rayPosition)}get rayQuaternion(){return qi(this._rayQuaternion)}get gripWorldPosition(){return V(this._gripWorldPosition)}_gripWorldPosition=new c.Vector3;get gripWorldQuaternion(){return qi(this._gripWorldQuaternion)}_gripWorldQuaternion=new c.Quaternion;get rayWorldPosition(){return V(this._rayWorldPosition)}_rayWorldPosition=new c.Vector3;updateRayWorldPosition(){const e=this.xr.context.mainCamera?.parent;this._rayWorldPosition.copy(this._rayPositionRaw),e&&this._rayWorldPosition.applyMatrix4(e.matrixWorld)}get rayWorldQuaternion(){return qi(this._rayWorldQuaternion)}_rayWorldQuaternion=new c.Quaternion;get pinchPosition(){return V(this._pinchPosition)}_pinchPosition=new c.Vector3;updateRayWorldQuaternion(){const e=this.xr.context.mainCamera?.parent,t=e?ue(e):void 0;this._rayWorldQuaternion.copy(this._rayRotationRaw).multiply(Pi),t&&this._rayWorldQuaternion.premultiply(t)}get ray(){return this._ray.origin.copy(this.rayWorldPosition),this._ray.direction.copy(V(0,0,1).applyQuaternion(this.rayWorldQuaternion)),this._ray}_ray;_hand_wristDotUp=void 0;get handWristDotUp(){if(this._hand_wristDotUp!==void 0)return this._hand_wristDotUp;const e=this.handObject?.joints.wrist;if(e){const t=V(0,1,0).applyQuaternion(e.quaternion),i=V(0,1,0).dot(t);return this._hand_wristDotUp=i}}get isHandUpsideDown(){return this.handWristDotUp!==void 0?this.handWristDotUp<-.7:!1}get isTeleportGesture(){return this.isHandUpsideDown&&this.getGesture("pinch")?.isDown}get object(){return this._object}_object;_gripSpaceObject;_raySpaceObject;model=null;_debugAxesHelper=new c.AxesHelper(.15);_debugGripAxesHelper=new c.AxesHelper(.07);_debugRayAxesHelper=new c.AxesHelper(.07);async getModelUrl(){return this.getMotionController?.then(e=>e?.assetUrl||null)}constructor(e,t,i){this.xr=e,this.inputSource=t,this.index=i,this._object=new c.Object3D,this._object.name=`NeedleXRController_${i}`,Un&&(this._object.add(this._debugAxesHelper),this._gripSpaceObject=new c.Object3D,this._raySpaceObject=new c.Object3D,this._gripSpaceObject.name=`NeedleXRController_${i}_gripSpace`,this._raySpaceObject.name=`NeedleXRController_${i}_raySpace`,this._gripSpaceObject.add(this._debugGripAxesHelper),this._raySpaceObject.add(this._debugRayAxesHelper),this.xr.context.scene.add(this._gripSpaceObject),this.xr.context.scene.add(this._raySpaceObject)),this.xr.context.scene.add(this._object),this._ray=new c.Ray,this.pointerInit={origin:this,pointerType:this.hand?"hand":"controller",deviceIndex:this.index,pointerId:-1,mode:this.inputSource.targetRayMode,ray:this._ray,device:this._object,buttonName:"none"},this.initialize(),this.subscribeEvents()}_hitTestSourcePromise=null;_requestHitTestSource(){return this._hitTestSourcePromise?this._hitTestSourcePromise:this.xr.mode==="immersive-ar"&&this.inputSource.targetRayMode==="tracked-pointer"&&this.xr.session.requestHitTestSourceForTransientInput?this._hitTestSourcePromise=this.xr.session.requestHitTestSourceForTransientInput({profile:this.inputSource.profiles[0],offsetRay:new XRRay})?.then(e=>(this._hitTestSourcePromise=null,this.connected?this._hitTestSource=e:(e.cancel(),null)))??null:null}onPointerHits=e=>{};onUpdate(e){this.onUpdateFrame(e),this.updateInputEvents(),this.onUpdateMove()}onRenderDebug(){j.DrawSphere(this.rayWorldPosition,.003),j.DrawDirection(this.rayWorldPosition,V(0,0,10).applyQuaternion(this.rayWorldQuaternion));const t=(this.inputSource.gripSpace?this.gripWorldPosition:this.object.worldPosition).sub(this.object.worldForward.multiplyScalar(.1)),i=this.inputSource.profiles.join(`
146
146
  `);let n=`Controller[${this.index}] (${this.inputSource.targetRayMode}, ${this.side})
147
147
  C:${this.connected?"x":"-"} T:${this.isTracking?"x":"-"} Hand:${this.inputSource.hand?"x":"-"} Pen: ${this._isMxInk?"x":"-"}`;if(this.inputSource.hand&&(n+=`
@@ -1613,4 +1613,4 @@ Error:`,r),null}}updateColliderCollisionGroups(e){const t=e[kt],i=e.membership;l
1613
1613
  justify-content: center;
1614
1614
  gap: .5rem;
1615
1615
  }
1616
- `),this.#n.innerHTML=this.#e.innerHTML,this.#n.style.cssText="display: flex; align-items: center; justify-content: center;",this.#e.innerHTML=this.#n.outerHTML,this.#t.innerHTML=this.#e.outerHTML,this.#t.prepend(this.#s),hd(hp,{element:this.#t}),this.#o?.disconnect(),this.#o??=new MutationObserver(()=>this.#l()),this.#o.observe(this.#e,{attributes:!0}),zf&&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=>{zf&&console.log("Needle Button clicked"),!e.defaultPrevented&&this.#e&&this.#e.click()}}typeof window<"u"&&!window.customElements.get(N_)&&window.customElements.define(N_,Pw);const il=w("debugavatar");class $g{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 Mw{avatarRegistryUrl=null;async getOrCreateNewAvatarInstance(e,t){if(!t)return console.error("Can not create avatar: failed to provide id or root object"),null;let i=null;if(typeof t=="string"){if(i=await this.loadAvatar(e,t),!i){const o=new sn;i=S.instantiate(Jr(t,e.scene),o)}}else i=t;if(!i)return null;const n=this.findAvatar(i);return n.isValid?(il&&console.log("[Custom Avatar] valid config",t,il?n:""),n):(console.warn("[Custom Avatar] config isn't valid",t,il?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(il&&console.log("[Custom Avatar] "+t+", loading..."),t.endsWith(".glb")||(t+=".glb"),this.avatarRegistryUrl===null){const n=await fetch("./"+t);let o=null;if(n.ok){const a=await n.blob();a&&(o=await a.arrayBuffer())}return o?(await Ji().parseSync(e,o,null,0))?.scene??null:null}const i=new q.GLTFLoader;return bm(i,e),new Promise((n,o)=>{const r=this.avatarRegistryUrl+"/"+t;i.load(r,async a=>{await Ji().createBuiltinComponents(e,r,a,null,void 0),n(a.scene)},a=>{il&&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 $g(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 Ow{get extensionName(){return"DocumentExtension"}onAfterBuildDocument(e){}}class kw{}const eE=Object.freeze(Object.defineProperty({__proto__:null,ActionBuilder:ae,ActionCollection:Iv,ActionModel:zt,AlignmentConstraint:dc,Animation:Gt,AnimationCurve:Ec,AnimationExtension:tu,AnimationTrackHandler:Cu,Animator:mt,AnimatorController:Ti,Antialiasing:Ac,AudioExtension:lr,AudioListener:ts,AudioSource:Di,AudioTrackHandler:ns,Avatar:qs,AvatarBlink_Simple:sr,AvatarEyeLook_Rotation:km,AvatarLoader:Mw,AvatarMarker:xe,AvatarModel:$g,Avatar_Brain_LookAt:$l,Avatar_MouthShapes:mc,Avatar_MustacheShake:Mm,Avatar_POI:Uo,AxesHelper:ga,BaseUIComponent:ji,BasicIKConstraint:Em,BehaviorExtension:og,BehaviorModel:pt,BloomEffect:mu,BoxCollider:Yd,BoxGizmo:ur,BoxHelperComponent:nt,Button:_s,CallInfo:es,Camera:Vt,CameraTargetReachedEvent:Vl,Canvas:ha,CanvasGroup:Xs,CapsuleCollider:rs,ChangeMaterialOnClick:Ym,ChangeTransformOnClick:cr,CharacterController:or,CharacterControllerInput:hs,ChromaticAberration:Lc,Collider:Xt,ColorAdjustments:lo,ColorBySpeedModule:ka,ColorOverLifetimeModule:uu,ContactShadows:gc,ControlTrackHandler:Pu,CustomBranding:dr,Deletable:Dm,DeleteBox:Vs,DepthOfField:an,DeviceFlag:Kd,DocumentExtension:Ow,DragControls:Oo,DropListener:ds,Duplicatable:Bm,EffectWrapper:Xl,EmissionModule:gs,EmphasizeOnClick:va,EnvironmentScene:Eu,EventList:le,EventListEvent:Gd,EventSystem:Dt,EventTrigger:Jd,FieldWithDefault:vv,FixedJoint:bg,Fog:Pa,GltfExport:Hm,GltfExportBox:Wm,Gradient:pr,Graphic:Pc,GraphicRaycaster:Hd,GridHelper:Ma,GridLayoutGroup:dg,GroundProjectedEnv:An,GroupActionModel:ko,HideOnStart:Mi,HingeJoint:Oc,HorizontalLayoutGroup:hg,Image:Ta,InheritVelocityModule:Sg,InputField:jg,InstanceHandle:zo,InstancingHandler:Xo,Interactable:Lm,Keyframe:$t,LODGroup:Rc,LODModel:Oa,Light:pi,LimitVelocityOverLifetimeModule:et,LogStats:Am,LookAt:Bg,LookAtConstraint:nr,MainModule:St,MaskableGraphic:Mc,MeshCollider:to,MeshRenderer:_c,MinMaxCurve:G,MinMaxGradient:mr,NeedleMenu:Dn,NestedGltf:cu,Networking:wg,NoiseModule:fe,ObjectRaycaster:ci,OffsetConstraint:fr,OpenURL:Aa,OrbitControls:de,Outline:Ca,Padding:hr,ParticleBurst:Sd,ParticleSubEmitter:Cg,ParticleSystem:ql,ParticleSystemRenderer:Ni,PhysicsExtension:rg,PixelationEffect:Dc,PlayAnimationOnClick:Gl,PlayAudioOnClick:Hs,PlayableDirector:ua,PlayerColor:da,PointerEventData:fc,PostProcessingHandler:kg,PreliminaryAction:wa,PreliminaryTrigger:wc,RawImage:ku,Rect:zv,RectTransform:nn,ReflectionProbe:Wl,RegisteredAnimationInfo:Us,RemoteSkybox:yu,Renderer:hi,RendererLightmap:bd,Rigidbody:Ke,RotationBySpeedModule:zi,RotationOverLifetimeModule:rn,SceneSwitcher:Ie,ScreenCapture:co,ScreenSpaceAmbientOcclusion:ys,ScreenSpaceAmbientOcclusionN8:ln,SetActiveOnClick:Km,ShadowCatcher:Fc,ShapeModule:xg,SharpeningEffect:jc,SignalAsset:Su,SignalReceiver:$c,SignalReceiverEvent:Vc,SignalTrackHandler:Ql,Size:Uv,SizeBySpeedModule:Kt,SizeOverLifetimeModule:gr,SkinnedMeshRenderer:$m,SmoothFollow:bu,SpatialGrabRaycaster:Ho,SpatialHtml:Hc,SpatialTrigger:vu,SpatialTriggerReceiver:En,SpectatorCamera:wu,SphereCollider:ya,Sprite:fs,SpriteData:Kr,SpriteRenderer:Qt,SpriteSheet:ca,SubEmitterSystem:Cd,SyncedCamera:Eg,SyncedRoom:cn,SyncedTransform:tn,TapGestureTrigger:Jm,TeleportTarget:ru,TestRunner:Tg,TestSimulateUserData:Ag,Text:xt,TextBuilder:lg,TextExtension:lu,TextureSheetAnimationModule:Ct,TiltShiftEffect:Bn,ToneMappingEffect:Qs,TrailModule:Ee,TransformData:ke,TransformGizmo:vr,TriggerBuilder:vt,TriggerModel:$s,UIRaycastUtils:xm,UIRootComponent:Sc,USDZExporter:Rn,USDZText:$r,USDZUIExtension:fg,UsageMarker:yc,VariantAction:Qm,VelocityOverLifetimeModule:Le,VerticalLayoutGroup:cg,VideoPlayer:Ze,Vignette:br,VisibilityAction:xc,Voip:eo,Volume:Ea,VolumeParameter:I,VolumeProfile:fu,WebARCameraBackground:Xc,WebARSessionRoot:ri,WebXR:au,WebXRImageTracking:Qc,WebXRImageTrackingModel:vs,WebXRPlaneTracking:ws,WebXRTrackedImage:fa,XRControllerFollow:bs,XRControllerModel:as,XRControllerMovement:di,XRFlag:ki,XRRig:Au,XRState:Lt,__Ignore:kw},Symbol.toStringTag,{value:"Module"})),kd=w("debugmissingcamera");re.registerCallback(oe.MissingCamera,s=>{kd&&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 Vt;if(i.sourceId=s.files?.[0]?.src??"unknown",i.fieldOfView=35,s.context.domElement.getAttribute("transparent")!=null)i.clearFlags=Fo.Uninitialized;else if(s.context.domElement.getAttribute("background-image")?.length||s.context.lightmaps.tryGetSkybox(i.sourceId))i.clearFlags=Fo.Skybox;else{if(i.clearFlags=Fo.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 Eu("neutral");e.environment=a.fromScene(l,.025).texture}}const o=Lo(t,i,!0);return t.position.x=0,t.position.y=1,t.position.z=2,s.context.domElement?.cameraControls!=!1&&Rw(s.context,o),o});re.registerCallback(oe.ContextCreated,s=>{if(!s.context.mainCamera){kd&&console.log("Will not auto-fit because a default camera exists");return}if(s.context.domElement?.cameraControls==!0){if(nb(s.context.mainCamera)?.isCameraController==!0){kd&&console.log("Will not auto-fit because a camera controller exists");return}Rw(s.context)}});function Rw(s,e){e=e??s.mainCameraComponent;const t=e?.gameObject;if(kd&&console.log("Creating default camera controls",e?.name),t){const i=oc(t,de);i.sourceId=e?.sourceId??"unknown";const n=s.domElement.getAttribute("auto-rotate");if(i.autoRotate=n!=null&&n!="0"&&n?.toLowerCase()!="false",i.autoRotateSpeed=.5,i.autoFit=!0,i.autoRotate&&n){const o=parseFloat(n);isNaN(o)||(i.autoRotateSpeed=o)}}else console.warn("Missing camera object, can not add orbit controls")}re.registerCallback(oe.ContextCreated,s=>{const e=s.context.domElement.getAttribute("autoplay");if(e!==void 0&&(e===""||e==="true"||e==="1")&&s.files)for(const t of s.files)S.foreachComponent(t.file.scene,n=>{if(n.enabled!==!1){if(n instanceof Gt&&n.playAutomatically||n instanceof mt||n instanceof ua&&n.playOnAwake===!0)return!0;if(n instanceof Gt)return n.playAutomatically=!0,!0;if(n instanceof ua)return n.playOnAwake=!0,!0}},!0)!==!0&&ra.autoplayAnimations(t.file)});class tE extends se.WorkerBase{constructor(){super(new Worker(new URL("/generateMeshBVH.worker-2qGLkQjg.js",typeof document>"u"?require("url").pathToFileURL(__filename).href:Du&&Du.tagName.toUpperCase()==="SCRIPT"&&Du.src||new URL("needle-engine.bundle-gnU2UVys.umd.cjs",document.baseURI).href),{type:"module"})),this.name="GenerateMeshBVHWorker"}runTask(e,t,i={}){return new Promise((n,o)=>{if(t.getAttribute("position").isInterleavedBufferAttribute||t.index&&t.index.isInterleavedBufferAttribute)throw new Error("GenerateMeshBVHWorker: InterleavedBufferAttribute are not supported for the geometry attributes.");e.onerror=h=>{o(new Error(`[GenerateMeshBVHWorker] ${h.message||"Unknown error. Please check the server console. If you're using vite try adding 'three-mesh-bvh' to 'optimizeDeps.exclude' in your vite.config.js"}`))},e.onmessage=h=>{const{data:d}=h;if(d.error)o(new Error(d.error)),e.onmessage=null;else if(d.serialized){const{serialized:u,position:p}=d,m=se.MeshBVH.deserialize(u,t,{setIndex:!1}),y=Object.assign({setBoundingBox:!0},i);if(t.attributes.position.array=p,u.index)if(t.index)t.index.array=u.index;else{const b=new c.BufferAttribute(u.index,1,!1);t.setIndex(b)}y.setBoundingBox&&(t.boundingBox=m.getBoundingBox(new c.Box3)),i.onProgress&&i.onProgress(d.progress),n(m),e.onmessage=null}else i.onProgress&&i.onProgress(d.progress)};const r=t.index?t.index.array:null,a=t.attributes.position.array,l=[a];r&&l.push(r),e.postMessage({index:r,position:a,options:{...i,onProgress:null,includedProgressCallback:!!i.onProgress,groups:[...t.groups]}},l.map(h=>h.buffer).filter(h=>typeof SharedArrayBuffer>"u"||!(h instanceof SharedArrayBuffer)))})}}const iE=Object.freeze(Object.defineProperty({__proto__:null,GenerateMeshBVHWorker:tE},Symbol.toStringTag,{value:"Module"}));exports.$physicsKey=G1;exports.ActionBuilder=ae;exports.ActionCollection=Iv;exports.ActionModel=zt;exports.Addressables=b0;exports.AlignmentConstraint=dc;exports.AmbientMode=Qr;exports.Animation=Gt;exports.AnimationCurve=Ec;exports.AnimationExtension=tu;exports.AnimationTrackHandler=Cu;exports.AnimationUtils=ra;exports.Animator=mt;exports.AnimatorConditionMode=Ds;exports.AnimatorController=Ti;exports.AnimatorControllerParameterType=vm;exports.AnimatorStateInfo=al;exports.Antialiasing=Ac;exports.Application=en;exports.AssetDatabase=Ib;exports.AssetReference=Y;exports.AudioExtension=lr;exports.AudioListener=ts;exports.AudioSource=Di;exports.AudioTrackHandler=ns;exports.Avatar=qs;exports.AvatarBlink_Simple=sr;exports.AvatarEyeLook_Rotation=km;exports.AvatarLoader=Mw;exports.AvatarMarker=xe;exports.AvatarModel=$g;exports.Avatar_Brain_LookAt=$l;exports.Avatar_MouthShapes=mc;exports.Avatar_MustacheShake=Mm;exports.Avatar_POI=Uo;exports.Axes=Nr;exports.AxesHelper=ga;exports.BUILD_TIME=Xp;exports.BaseUIComponent=ji;exports.BasicIKConstraint=Em;exports.BehaviorExtension=og;exports.BehaviorModel=pt;exports.BloomEffect=mu;exports.BoxCollider=Yd;exports.BoxGizmo=ur;exports.BoxHelperComponent=nt;exports.Button=_s;exports.ButtonsFactory=Qi;exports.CallDirection=ev;exports.CallInfo=es;exports.Camera=Vt;exports.CameraTargetReachedEvent=Vl;exports.Canvas=ha;exports.CanvasGroup=Xs;exports.CapsuleCollider=rs;exports.ChangeMaterialOnClick=Ym;exports.ChangeTransformOnClick=cr;exports.CharacterController=or;exports.CharacterControllerInput=hs;exports.ChromaticAberration=Lc;exports.CircularBuffer=ai;exports.ClearFlags=Fo;exports.ClipExtrapolation=pn;exports.Collider=Xt;exports.Collision=K0;exports.CollisionDetectionMode=Wd;exports.ColorAdjustments=lo;exports.ColorBySpeedModule=ka;exports.ColorOverLifetimeModule=uu;exports.Component=e1;exports.Component$1=k;exports.ComponentLifecycleEvents=jd;exports.Components=eE;exports.ConnectionEvents=Rb;exports.ContactPoint=Y0;exports.ContactShadows=gc;exports.Context=U;exports.ContextArgs=UC;exports.ContextEvent=oe;exports.ContextRegistry=re;exports.ControlTrackHandler=Pu;exports.CustomBranding=dr;exports.CustomShader=ye;exports.DefaultReflectionMode=cd;exports.Deletable=Dm;exports.DeleteBox=Vs;exports.DepthOfField=an;exports.DeviceFlag=Kd;exports.DocumentExtension=Ow;exports.DragControls=Oo;exports.DragMode=Im;exports.DropListener=ds;exports.Duplicatable=Bm;exports.EffectWrapper=Xl;exports.EmissionModule=gs;exports.EmphasizeOnClick=va;exports.EngineLoadingView=Yl;exports.EnvironmentScene=Eu;exports.EventList=le;exports.EventListEvent=Gd;exports.EventSystem=Dt;exports.EventTrigger=Jd;exports.FieldWithDefault=vv;exports.FileReference=jo;exports.FileReferenceSerializer=w0;exports.FileSpawnModel=pP;exports.File_Event=av;exports.FixedJoint=bg;exports.Fog=Pa;exports.FrameEvent=pe;exports.GENERATOR=Td;exports.GameObject=S;exports.Gizmos=j;exports.GltfExport=Hm;exports.GltfExportBox=Wm;exports.Gradient=pr;exports.Graphic=Pc;exports.GraphicRaycaster=Hd;exports.Graphics=Gs;exports.GridHelper=Ma;exports.GridLayoutGroup=dg;exports.GroundProjectedEnv=An;exports.GroupActionModel=ko;exports.HideFlags=qd;exports.HideOnStart=Mi;exports.HingeJoint=Oc;exports.HorizontalLayoutGroup=hg;exports.HostData=$S;exports.Image=Ta;exports.ImageReference=Io;exports.ImageReferenceSerializer=v0;exports.InheritVelocityModule=Sg;exports.Input=Sb;exports.InputEventQueue=Nt;exports.InputEvents=we;exports.InputField=jg;exports.InstanceHandle=zo;exports.InstancingHandler=Xo;exports.InstancingUtil=Ei;exports.InstantiateEvent=qb;exports.InstantiateIdProvider=ft;exports.InstantiateOptions=sn;exports.Interactable=Lm;exports.JoinedRoomResponse=pS;exports.KeyEventArgs=nS;exports.Keyframe=$t;exports.LODGroup=Rc;exports.LODModel=Oa;exports.LeftRoomResponse=mS;exports.Light=pi;exports.LightData=M0;exports.LimitVelocityOverLifetimeModule=et;exports.LoadingElementOptions=UR;exports.LogStats=Am;exports.LogType=oi;exports.LookAt=Bg;exports.LookAtConstraint=nr;exports.MainModule=St;exports.MarkerType=Lg;exports.MaskableGraphic=Mc;exports.Mathf=D;exports.MeshCollider=to;exports.MeshRenderer=_c;exports.MinMaxCurve=G;exports.MinMaxGradient=mr;exports.NEKeyboardEvent=nl;exports.NEPointerEvent=Qn;exports.NeedleButtonElement=Pw;exports.NeedleEngineWebComponent=Vg;exports.NeedleMenu=Dn;exports.NeedlePatchesKey=Ah;exports.NeedleXRController=Zp;exports.NeedleXRSession=H;exports.NeedleXRSync=Ab;exports.NeedleXRUtils=Db;exports.NestedGltf=cu;exports.NetworkConnection=Tb;exports.NetworkedStreamEvents=xn;exports.NetworkedStreams=pc;exports.Networking=wg;exports.NewInstanceModel=Qb;exports.NoiseModule=fe;exports.ObjectRaycaster=ci;exports.ObjectUtils=Zo;exports.OffsetConstraint=fr;exports.OneEuroFilter=Eh;exports.OneEuroFilterXYZ=zp;exports.OpenURL=Aa;exports.OrbitControls=de;exports.Outline=Ca;exports.OwnershipEvent=Eb;exports.OwnershipModel=im;exports.PUBLIC_KEY=Fr;exports.Padding=hr;exports.ParticleBurst=Sd;exports.ParticleSubEmitter=Cg;exports.ParticleSystem=ql;exports.ParticleSystemBaseBehaviour=ao;exports.ParticleSystemRenderer=Ni;exports.ParticleSystemShapeType=xd;exports.PeerHandle=is;exports.PeerNetworking=kb;exports.Physics=sa;exports.PhysicsExtension=rg;exports.PhysicsMaterialCombine=it;exports.PixelationEffect=Dc;exports.PlayAnimationOnClick=Gl;exports.PlayAudioOnClick=Hs;exports.PlayableDirector=ua;exports.PlayerColor=da;exports.PlayerState=Yi;exports.PlayerStateEvent=Fv;exports.PlayerSync=ng;exports.PlayerView=S0;exports.PlayerViewManager=C0;exports.PointerEventData=fc;exports.PointerType=Dd;exports.PostProcessingEffect=Ne;exports.PostProcessingEffectOrder=Qe;exports.PostProcessingHandler=kg;exports.PreliminaryAction=wa;exports.PreliminaryTrigger=wc;exports.PrimitiveType=Vo;exports.Progress=ie;exports.PromiseAllWithErrors=Fp;exports.PromiseErrorResult=$f;exports.RGBAColor=Z;exports.RapierPhysics=Zr;exports.RawImage=ku;exports.RaycastOptions=Js;exports.Rect=zv;exports.RectTransform=nn;exports.ReflectionProbe=Wl;exports.RegisteredAnimationInfo=Us;exports.RemoteSkybox=yu;exports.RenderTexture=wn;exports.RenderTextureSerializer=H0;exports.Renderer=hi;exports.RendererData=P0;exports.RendererLightmap=bd;exports.Rigidbody=Ke;exports.RigidbodyConstraints=De;exports.RoomEvents=Q;exports.RotationBySpeedModule=zi;exports.RotationOverLifetimeModule=rn;exports.SceneLightSettings=gd;exports.SceneSwitcher=Ie;exports.ScreenCapture=co;exports.ScreenSpaceAmbientOcclusion=ys;exports.ScreenSpaceAmbientOcclusionN8=ln;exports.SendQueue=Xi;exports.SerializationContext=um;exports.SetActiveOnClick=Km;exports.ShadowCatcher=Fc;exports.ShapeModule=xg;exports.ShapeOverlapResult=Z0;exports.SharpeningEffect=jc;exports.SignalAsset=Su;exports.SignalReceiver=$c;exports.SignalReceiverEvent=Vc;exports.SignalTrackHandler=Ql;exports.Size=Uv;exports.SizeBySpeedModule=Kt;exports.SizeOverLifetimeModule=gr;exports.SkinnedMeshRenderer=$m;exports.SmoothFollow=bu;exports.SpatialGrabRaycaster=Ho;exports.SpatialHtml=Hc;exports.SpatialTrigger=vu;exports.SpatialTriggerReceiver=En;exports.SpectatorCamera=wu;exports.SphereCollider=ya;exports.SphereIntersection=om;exports.Sprite=fs;exports.SpriteData=Kr;exports.SpriteRenderer=Qt;exports.SpriteSheet=ca;exports.StateMachineBehaviour=r1;exports.StreamEndedEvent=Cm;exports.StreamReceivedEvent=J0;exports.SubEmitterSystem=Cd;exports.SyncedCamera=Eg;exports.SyncedRoom=cn;exports.SyncedTransform=tn;exports.TapGestureTrigger=Jm;exports.TeleportTarget=ru;exports.TestRunner=Tg;exports.TestSceneUtils=XR;exports.TestSimulateUserData=Ag;exports.Text=xt;exports.TextBuilder=lg;exports.TextExtension=lu;exports.TextureSheetAnimationModule=Ct;exports.TiltShiftEffect=Bn;exports.Time=O0;exports.ToneMappingEffect=Qs;exports.TrackHandler=Wc;exports.TrackType=ei;exports.TrailModule=Ee;exports.TransformData=ke;exports.TransformGizmo=vr;exports.TriggerBuilder=vt;exports.TriggerModel=$s;exports.TypeStore=P;exports.UIRaycastUtils=xm;exports.UIRootComponent=Sc;exports.USDDocument=qm;exports.USDObject=ze;exports.USDWriter=Mv;exports.USDZExporter=Rn;exports.USDZExporter$1=Ov;exports.USDZText=$r;exports.USDZUIExtension=fg;exports.UriSerializer=q0;exports.UsageMarker=yc;exports.UserJoinedOrLeftRoomModel=gS;exports.VERSION=Ki;exports.VariantAction=Qm;exports.VelocityOverLifetimeModule=Le;exports.VerticalLayoutGroup=cg;exports.VideoPlayer=Ze;exports.ViewDevice=zs;exports.Vignette=br;exports.VisibilityAction=xc;exports.Voip=eo;exports.Volume=Ea;exports.VolumeParameter=I;exports.VolumeProfile=fu;exports.WaitForFrames=_C;exports.WaitForPromise=x0;exports.WaitForSeconds=mm;exports.Watch=ss;exports.WebARCameraBackground=Xc;exports.WebARSessionRoot=ri;exports.WebXR=au;exports.WebXRButtonFactory=Ws;exports.WebXRImageTracking=Qc;exports.WebXRImageTrackingModel=vs;exports.WebXRPlaneTracking=ws;exports.WebXRTrackedImage=fa;exports.XRControllerFollow=bs;exports.XRControllerModel=as;exports.XRControllerMovement=di;exports.XRFlag=ki;exports.XRRig=Au;exports.XRState=Lt;exports.XRStateFlag=bn;exports.__Ignore=kw;exports.__internalNotifyObjectDestroyed=Nb;exports.activeInHierarchyFieldName=os;exports.addAttributeChangeCallback=Q_;exports.addComponent=Zi;exports.addCustomExtensionPlugin=jP;exports.addNewComponent=Lo;exports.addPatch=Ad;exports.apply=Fd;exports.applyHMRChanges=JC;exports.applyPrototypeExtensions=a0;exports.beginListenDestroy=Xb;exports.beginListenInstantiate=Kb;exports.binaryIdentifierCasts=Jp;exports.build_scene_functions=FC;exports.builtinComponentKeyName=xo;exports.calculateProgress01=Ng;exports.clearMessages=fx;exports.colorSerializer=S1;exports.compareAssociation=t0;exports.componentSerializer=Nh;exports.copyTexture=hb;exports.createMotion=V0;exports.debugNet=jt;exports.debugOwner=sl;exports.decompressGpuTexture=Tv;exports.deepClone=Zl;exports.delay=Tn;exports.delayForFrames=Jl;exports.deserializeObject=ad;exports.destroy=li;exports.destroyComponentInstance=h0;exports.determineMimeTypeFromExtension=lv;exports.disposeObjectResources=_e;exports.disposeStream=Sn;exports.editorGuidKeyName=xl;exports.enableSpatialConsole=Eo;exports.euler=P1;exports.eventListSerializer=R1;exports.exportAsGLTF=KR;exports.findByGuid=pm;exports.findObjectOfType=lc;exports.findObjectsOfType=u0;exports.findResourceUsers=rm;exports.fitObjectIntoVolume=ub;exports.foreachComponent=Wo;exports.foreachComponentEnumerator=zd;exports.forward=Ex;exports.generateQRCode=K_;exports.generateSeed=Yb;exports.getBoundingBox=Wt;exports.getCameraController=nb;exports.getComponent=er;exports.getComponentInChildren=ac;exports.getComponentInParent=Ul;exports.getComponents=rc;exports.getComponentsInChildren=pa;exports.getComponentsInParent=Bd;exports.getFormattedDate=xv;exports.getIconElement=ut;exports.getIconTexture=cp;exports.getLoader=Ji;exports.getOrAddComponent=oc;exports.getParam=w;exports.getParentHierarchyPath=Lx;exports.getPath=Ww;exports.getPeerOptions=hS;exports.getPeerjsInstance=Ob;exports.getResourceUserCount=DS;exports.getTempColor=rb;exports.getTempQuaternion=qi;exports.getTempVector=V;exports.getUrlParams=Kl;exports.getVisibleInCustomShadowRendering=db;exports.getWorldDirection=ab;exports.getWorldEuler=$p;exports.getWorldPosition=X;exports.getWorldQuaternion=ue;exports.getWorldRotation=Ed;exports.getWorldScale=Ae;exports.hasCommercialLicense=kn;exports.hasIndieLicense=hc;exports.hasPointerEventComponent=ud;exports.hasProLicense=On;exports.hideDebugConsole=gb;exports.imageToCanvas=Av;exports.instantiate=Go;exports.invokeLoadedImportPluginHooks=yv;exports.invokeXRSessionEnd=xb;exports.invokeXRSessionStart=wb;exports.isActiveInHierarchy=f0;exports.isActiveSelf=ma;exports.isAndroidDevice=Yw;exports.isAnimationAction=cb;exports.isComponent=Q0;exports.isDebugMode=zw;exports.isDesktop=Hw;exports.isDestroyed=$o;exports.isDevEnvironment=A;exports.isDisposed=AS;exports.isExporting=QR;exports.isGLTFModel=X0;exports.isHostedOnGlitch=V_;exports.isHotReloadEnabled=pp;exports.isHotReloading=KC;exports.isIPad=Xw;exports.isIconElement=E0;exports.isLocalNetwork=Ai;exports.isMacOS=Zw;exports.isMobileDevice=qw;exports.isMozillaXR=Kw;exports.isQuest=tx;exports.isResourceTrackingEnabled=Bb;exports.isSafari=ex;exports.isUsingInstancing=Ud;exports.isiOS=Jw;exports.isiPad=Qw;exports.loadAsset=LR;exports.loadPMREM=aw;exports.loadSync=zg;exports.logHierarchy=Jh;exports.lookAtInverse=xx;exports.lookAtObject=ec;exports.lookAtScreenPoint=Sx;exports.makeId=Vw;exports.makeIdFromRandomWords=H_;exports.makeNameSafe=Ii;exports.markAsInstancedRendered=p0;exports.microphonePermissionsGranted=ix;exports.nameof=Uw;exports.nameofFactory=W_;exports.objectSerializer=G0;exports.offXRSessionEnd=iS;exports.offXRSessionStart=tS;exports.onAfterRender=QC;exports.onBeforeRender=XC;exports.onClear=HC;exports.onDestroy=qC;exports.onInitialized=I0;exports.onStart=_m;exports.onUpdate=j0;exports.onXRSessionEnd=Kp;exports.onXRSessionStart=Ld;exports.parseSync=vw;exports.placeOnSurface=fb;exports.postprocessFBXMaterials=Hp;exports.prefix=y1;exports.pushState=G_;exports.randomNumber=$w;exports.registerBinaryType=em;exports.registerComponent=Vd;exports.registerComponentExtension=zm;exports.registerCustomEffectType=Vi;exports.registerExportExtensions=Nm;exports.registerExtensions=_d;exports.registerHotReloadType=F0;exports.registerLoader=Qp;exports.registerPrefabProvider=Jb;exports.registerPrototypeExtensions=l0;exports.registerType=XS;exports.relativePathPrefix=X_;exports.removeAttributeChangeCallback=Y_;exports.removeComponent=fm;exports.removeCustomImportExtensionType=BP;exports.removePatch=Jx;exports.resolveUrl=Ys;exports.sanitizeString=q_;exports.saveImage=gw;exports.screenshot=mR;exports.screenshot2=Ug;exports.sendDestroyed=lm;exports.serializable=f;exports.serializeObject=n0;exports.serializeable=tr;exports.setActive=Pl;exports.setAllowBalloonMessages=eb;exports.setAllowOverlayMessages=cx;exports.setAutoFitEnabled=Kh;exports.setCameraController=Gf;exports.setDestroyed=g0;exports.setDevEnvironment=Nx;exports.setDisposable=Ub;exports.setDontDestroy=Ar;exports.setOrAddParamsToUrl=Vf;exports.setParam=Nw;exports.setParamWithoutReload=Il;exports.setPeerOptions=dS;exports.setResourceTrackingEnabled=TS;exports.setState=jp;exports.setVisibleInCustomShadowRendering=Gp;exports.setWorldEuler=Wp;exports.setWorldPosition=Ye;exports.setWorldPositionXYZ=No;exports.setWorldQuaternion=Li;exports.setWorldQuaternionXYZW=Vp;exports.setWorldRotation=lb;exports.setWorldRotationXYZ=tc;exports.setWorldScale=ea;exports.showBalloonError=ic;exports.showBalloonMessage=Se;exports.showBalloonWarning=he;exports.showDebugConsole=qp;exports.slerp=wx;exports.syncDestroy=nc;exports.syncField=ig;exports.syncInstantiate=cm;exports.textureToCanvas=Dx;exports.tryCastBinary=Pb;exports.tryDetermineMimetypeFromBinary=hv;exports.tryDetermineMimetypeFromURL=cv;exports.tryFindObject=Jr;exports.tryGetGuid=Mb;exports.unregisterHotReloadType=U0;exports.unwatchWrite=Bp;exports.useForAutoFit=sb;exports.validate=gt;exports.watchWrite=Rd;
1616
+ `),this.#n.innerHTML=this.#e.innerHTML,this.#n.style.cssText="display: flex; align-items: center; justify-content: center;",this.#e.innerHTML=this.#n.outerHTML,this.#t.innerHTML=this.#e.outerHTML,this.#t.prepend(this.#s),hd(hp,{element:this.#t}),this.#o?.disconnect(),this.#o??=new MutationObserver(()=>this.#l()),this.#o.observe(this.#e,{attributes:!0}),zf&&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=>{zf&&console.log("Needle Button clicked"),!e.defaultPrevented&&this.#e&&this.#e.click()}}typeof window<"u"&&!window.customElements.get(N_)&&window.customElements.define(N_,Pw);const il=w("debugavatar");class $g{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 Mw{avatarRegistryUrl=null;async getOrCreateNewAvatarInstance(e,t){if(!t)return console.error("Can not create avatar: failed to provide id or root object"),null;let i=null;if(typeof t=="string"){if(i=await this.loadAvatar(e,t),!i){const o=new sn;i=S.instantiate(Jr(t,e.scene),o)}}else i=t;if(!i)return null;const n=this.findAvatar(i);return n.isValid?(il&&console.log("[Custom Avatar] valid config",t,il?n:""),n):(console.warn("[Custom Avatar] config isn't valid",t,il?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(il&&console.log("[Custom Avatar] "+t+", loading..."),t.endsWith(".glb")||(t+=".glb"),this.avatarRegistryUrl===null){const n=await fetch("./"+t);let o=null;if(n.ok){const a=await n.blob();a&&(o=await a.arrayBuffer())}return o?(await Ji().parseSync(e,o,null,0))?.scene??null:null}const i=new q.GLTFLoader;return bm(i,e),new Promise((n,o)=>{const r=this.avatarRegistryUrl+"/"+t;i.load(r,async a=>{await Ji().createBuiltinComponents(e,r,a,null,void 0),n(a.scene)},a=>{il&&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 $g(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 Ow{get extensionName(){return"DocumentExtension"}onAfterBuildDocument(e){}}class kw{}const eE=Object.freeze(Object.defineProperty({__proto__:null,ActionBuilder:ae,ActionCollection:Iv,ActionModel:zt,AlignmentConstraint:dc,Animation:Gt,AnimationCurve:Ec,AnimationExtension:tu,AnimationTrackHandler:Cu,Animator:mt,AnimatorController:Ti,Antialiasing:Ac,AudioExtension:lr,AudioListener:ts,AudioSource:Di,AudioTrackHandler:ns,Avatar:qs,AvatarBlink_Simple:sr,AvatarEyeLook_Rotation:km,AvatarLoader:Mw,AvatarMarker:xe,AvatarModel:$g,Avatar_Brain_LookAt:$l,Avatar_MouthShapes:mc,Avatar_MustacheShake:Mm,Avatar_POI:Uo,AxesHelper:ga,BaseUIComponent:ji,BasicIKConstraint:Em,BehaviorExtension:og,BehaviorModel:pt,BloomEffect:mu,BoxCollider:Yd,BoxGizmo:ur,BoxHelperComponent:nt,Button:_s,CallInfo:es,Camera:Vt,CameraTargetReachedEvent:Vl,Canvas:ha,CanvasGroup:Xs,CapsuleCollider:rs,ChangeMaterialOnClick:Ym,ChangeTransformOnClick:cr,CharacterController:or,CharacterControllerInput:hs,ChromaticAberration:Lc,Collider:Xt,ColorAdjustments:lo,ColorBySpeedModule:ka,ColorOverLifetimeModule:uu,ContactShadows:gc,ControlTrackHandler:Pu,CustomBranding:dr,Deletable:Dm,DeleteBox:Vs,DepthOfField:an,DeviceFlag:Kd,DocumentExtension:Ow,DragControls:Oo,DropListener:ds,Duplicatable:Bm,EffectWrapper:Xl,EmissionModule:gs,EmphasizeOnClick:va,EnvironmentScene:Eu,EventList:le,EventListEvent:Gd,EventSystem:Dt,EventTrigger:Jd,FieldWithDefault:vv,FixedJoint:bg,Fog:Pa,GltfExport:Hm,GltfExportBox:Wm,Gradient:pr,Graphic:Pc,GraphicRaycaster:Hd,GridHelper:Ma,GridLayoutGroup:dg,GroundProjectedEnv:An,GroupActionModel:ko,HideOnStart:Mi,HingeJoint:Oc,HorizontalLayoutGroup:hg,Image:Ta,InheritVelocityModule:Sg,InputField:jg,InstanceHandle:zo,InstancingHandler:Xo,Interactable:Lm,Keyframe:$t,LODGroup:Rc,LODModel:Oa,Light:pi,LimitVelocityOverLifetimeModule:et,LogStats:Am,LookAt:Bg,LookAtConstraint:nr,MainModule:St,MaskableGraphic:Mc,MeshCollider:to,MeshRenderer:_c,MinMaxCurve:G,MinMaxGradient:mr,NeedleMenu:Dn,NestedGltf:cu,Networking:wg,NoiseModule:fe,ObjectRaycaster:ci,OffsetConstraint:fr,OpenURL:Aa,OrbitControls:de,Outline:Ca,Padding:hr,ParticleBurst:Sd,ParticleSubEmitter:Cg,ParticleSystem:ql,ParticleSystemRenderer:Ni,PhysicsExtension:rg,PixelationEffect:Dc,PlayAnimationOnClick:Gl,PlayAudioOnClick:Hs,PlayableDirector:ua,PlayerColor:da,PointerEventData:fc,PostProcessingHandler:kg,PreliminaryAction:wa,PreliminaryTrigger:wc,RawImage:ku,Rect:zv,RectTransform:nn,ReflectionProbe:Wl,RegisteredAnimationInfo:Us,RemoteSkybox:yu,Renderer:hi,RendererLightmap:bd,Rigidbody:Ke,RotationBySpeedModule:zi,RotationOverLifetimeModule:rn,SceneSwitcher:Ie,ScreenCapture:co,ScreenSpaceAmbientOcclusion:ys,ScreenSpaceAmbientOcclusionN8:ln,SetActiveOnClick:Km,ShadowCatcher:Fc,ShapeModule:xg,SharpeningEffect:jc,SignalAsset:Su,SignalReceiver:$c,SignalReceiverEvent:Vc,SignalTrackHandler:Ql,Size:Uv,SizeBySpeedModule:Kt,SizeOverLifetimeModule:gr,SkinnedMeshRenderer:$m,SmoothFollow:bu,SpatialGrabRaycaster:Ho,SpatialHtml:Hc,SpatialTrigger:vu,SpatialTriggerReceiver:En,SpectatorCamera:wu,SphereCollider:ya,Sprite:fs,SpriteData:Kr,SpriteRenderer:Qt,SpriteSheet:ca,SubEmitterSystem:Cd,SyncedCamera:Eg,SyncedRoom:cn,SyncedTransform:tn,TapGestureTrigger:Jm,TeleportTarget:ru,TestRunner:Tg,TestSimulateUserData:Ag,Text:xt,TextBuilder:lg,TextExtension:lu,TextureSheetAnimationModule:Ct,TiltShiftEffect:Bn,ToneMappingEffect:Qs,TrailModule:Ee,TransformData:ke,TransformGizmo:vr,TriggerBuilder:vt,TriggerModel:$s,UIRaycastUtils:xm,UIRootComponent:Sc,USDZExporter:Rn,USDZText:$r,USDZUIExtension:fg,UsageMarker:yc,VariantAction:Qm,VelocityOverLifetimeModule:Le,VerticalLayoutGroup:cg,VideoPlayer:Ze,Vignette:br,VisibilityAction:xc,Voip:eo,Volume:Ea,VolumeParameter:I,VolumeProfile:fu,WebARCameraBackground:Xc,WebARSessionRoot:ri,WebXR:au,WebXRImageTracking:Qc,WebXRImageTrackingModel:vs,WebXRPlaneTracking:ws,WebXRTrackedImage:fa,XRControllerFollow:bs,XRControllerModel:as,XRControllerMovement:di,XRFlag:ki,XRRig:Au,XRState:Lt,__Ignore:kw},Symbol.toStringTag,{value:"Module"})),kd=w("debugmissingcamera");re.registerCallback(oe.MissingCamera,s=>{kd&&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 Vt;if(i.sourceId=s.files?.[0]?.src??"unknown",i.fieldOfView=35,s.context.domElement.getAttribute("transparent")!=null)i.clearFlags=Fo.Uninitialized;else if(s.context.domElement.getAttribute("background-image")?.length||s.context.lightmaps.tryGetSkybox(i.sourceId))i.clearFlags=Fo.Skybox;else{if(i.clearFlags=Fo.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 Eu("neutral");e.environment=a.fromScene(l,.025).texture}}const o=Lo(t,i,!0);return t.position.x=0,t.position.y=1,t.position.z=2,s.context.domElement?.cameraControls!=!1&&Rw(s.context,o),o});re.registerCallback(oe.ContextCreated,s=>{if(!s.context.mainCamera){kd&&console.log("Will not auto-fit because a default camera exists");return}if(s.context.domElement?.cameraControls==!0){if(nb(s.context.mainCamera)?.isCameraController==!0){kd&&console.log("Will not auto-fit because a camera controller exists");return}Rw(s.context)}});function Rw(s,e){e=e??s.mainCameraComponent;const t=e?.gameObject;if(kd&&console.log("Creating default camera controls",e?.name),t){const i=oc(t,de);i.sourceId=e?.sourceId??"unknown";const n=s.domElement.getAttribute("auto-rotate");if(i.autoRotate=n!=null&&n!="0"&&n?.toLowerCase()!="false",i.autoRotateSpeed=.5,i.autoFit=!0,i.autoRotate&&n){const o=parseFloat(n);isNaN(o)||(i.autoRotateSpeed=o)}}else console.warn("Missing camera object, can not add orbit controls")}re.registerCallback(oe.ContextCreated,s=>{const e=s.context.domElement.getAttribute("autoplay");if(e!==void 0&&(e===""||e==="true"||e==="1")&&s.files)for(const t of s.files)S.foreachComponent(t.file.scene,n=>{if(n.enabled!==!1){if(n instanceof Gt&&n.playAutomatically||n instanceof mt||n instanceof ua&&n.playOnAwake===!0)return!0;if(n instanceof Gt)return n.playAutomatically=!0,!0;if(n instanceof ua)return n.playOnAwake=!0,!0}},!0)!==!0&&ra.autoplayAnimations(t.file)});class tE extends se.WorkerBase{constructor(){super(new Worker(new URL("/generateMeshBVH.worker-2qGLkQjg.js",typeof document>"u"?require("url").pathToFileURL(__filename).href:Du&&Du.tagName.toUpperCase()==="SCRIPT"&&Du.src||new URL("needle-engine.bundle-CK8rTkFm.umd.cjs",document.baseURI).href),{type:"module"})),this.name="GenerateMeshBVHWorker"}runTask(e,t,i={}){return new Promise((n,o)=>{if(t.getAttribute("position").isInterleavedBufferAttribute||t.index&&t.index.isInterleavedBufferAttribute)throw new Error("GenerateMeshBVHWorker: InterleavedBufferAttribute are not supported for the geometry attributes.");e.onerror=h=>{o(new Error(`[GenerateMeshBVHWorker] ${h.message||"Unknown error. Please check the server console. If you're using vite try adding 'three-mesh-bvh' to 'optimizeDeps.exclude' in your vite.config.js"}`))},e.onmessage=h=>{const{data:d}=h;if(d.error)o(new Error(d.error)),e.onmessage=null;else if(d.serialized){const{serialized:u,position:p}=d,m=se.MeshBVH.deserialize(u,t,{setIndex:!1}),y=Object.assign({setBoundingBox:!0},i);if(t.attributes.position.array=p,u.index)if(t.index)t.index.array=u.index;else{const b=new c.BufferAttribute(u.index,1,!1);t.setIndex(b)}y.setBoundingBox&&(t.boundingBox=m.getBoundingBox(new c.Box3)),i.onProgress&&i.onProgress(d.progress),n(m),e.onmessage=null}else i.onProgress&&i.onProgress(d.progress)};const r=t.index?t.index.array:null,a=t.attributes.position.array,l=[a];r&&l.push(r),e.postMessage({index:r,position:a,options:{...i,onProgress:null,includedProgressCallback:!!i.onProgress,groups:[...t.groups]}},l.map(h=>h.buffer).filter(h=>typeof SharedArrayBuffer>"u"||!(h instanceof SharedArrayBuffer)))})}}const iE=Object.freeze(Object.defineProperty({__proto__:null,GenerateMeshBVHWorker:tE},Symbol.toStringTag,{value:"Module"}));exports.$physicsKey=G1;exports.ActionBuilder=ae;exports.ActionCollection=Iv;exports.ActionModel=zt;exports.Addressables=b0;exports.AlignmentConstraint=dc;exports.AmbientMode=Qr;exports.Animation=Gt;exports.AnimationCurve=Ec;exports.AnimationExtension=tu;exports.AnimationTrackHandler=Cu;exports.AnimationUtils=ra;exports.Animator=mt;exports.AnimatorConditionMode=Ds;exports.AnimatorController=Ti;exports.AnimatorControllerParameterType=vm;exports.AnimatorStateInfo=al;exports.Antialiasing=Ac;exports.Application=en;exports.AssetDatabase=Ib;exports.AssetReference=Y;exports.AudioExtension=lr;exports.AudioListener=ts;exports.AudioSource=Di;exports.AudioTrackHandler=ns;exports.Avatar=qs;exports.AvatarBlink_Simple=sr;exports.AvatarEyeLook_Rotation=km;exports.AvatarLoader=Mw;exports.AvatarMarker=xe;exports.AvatarModel=$g;exports.Avatar_Brain_LookAt=$l;exports.Avatar_MouthShapes=mc;exports.Avatar_MustacheShake=Mm;exports.Avatar_POI=Uo;exports.Axes=Nr;exports.AxesHelper=ga;exports.BUILD_TIME=Xp;exports.BaseUIComponent=ji;exports.BasicIKConstraint=Em;exports.BehaviorExtension=og;exports.BehaviorModel=pt;exports.BloomEffect=mu;exports.BoxCollider=Yd;exports.BoxGizmo=ur;exports.BoxHelperComponent=nt;exports.Button=_s;exports.ButtonsFactory=Qi;exports.CallDirection=ev;exports.CallInfo=es;exports.Camera=Vt;exports.CameraTargetReachedEvent=Vl;exports.Canvas=ha;exports.CanvasGroup=Xs;exports.CapsuleCollider=rs;exports.ChangeMaterialOnClick=Ym;exports.ChangeTransformOnClick=cr;exports.CharacterController=or;exports.CharacterControllerInput=hs;exports.ChromaticAberration=Lc;exports.CircularBuffer=ai;exports.ClearFlags=Fo;exports.ClipExtrapolation=pn;exports.Collider=Xt;exports.Collision=K0;exports.CollisionDetectionMode=Wd;exports.ColorAdjustments=lo;exports.ColorBySpeedModule=ka;exports.ColorOverLifetimeModule=uu;exports.Component=e1;exports.Component$1=k;exports.ComponentLifecycleEvents=jd;exports.Components=eE;exports.ConnectionEvents=Rb;exports.ContactPoint=Y0;exports.ContactShadows=gc;exports.Context=U;exports.ContextArgs=UC;exports.ContextEvent=oe;exports.ContextRegistry=re;exports.ControlTrackHandler=Pu;exports.CustomBranding=dr;exports.CustomShader=ye;exports.DefaultReflectionMode=cd;exports.Deletable=Dm;exports.DeleteBox=Vs;exports.DepthOfField=an;exports.DeviceFlag=Kd;exports.DocumentExtension=Ow;exports.DragControls=Oo;exports.DragMode=Im;exports.DropListener=ds;exports.Duplicatable=Bm;exports.EffectWrapper=Xl;exports.EmissionModule=gs;exports.EmphasizeOnClick=va;exports.EngineLoadingView=Yl;exports.EnvironmentScene=Eu;exports.EventList=le;exports.EventListEvent=Gd;exports.EventSystem=Dt;exports.EventTrigger=Jd;exports.FieldWithDefault=vv;exports.FileReference=jo;exports.FileReferenceSerializer=w0;exports.FileSpawnModel=pP;exports.File_Event=av;exports.FixedJoint=bg;exports.Fog=Pa;exports.FrameEvent=pe;exports.GENERATOR=Td;exports.GameObject=S;exports.Gizmos=j;exports.GltfExport=Hm;exports.GltfExportBox=Wm;exports.Gradient=pr;exports.Graphic=Pc;exports.GraphicRaycaster=Hd;exports.Graphics=Gs;exports.GridHelper=Ma;exports.GridLayoutGroup=dg;exports.GroundProjectedEnv=An;exports.GroupActionModel=ko;exports.HideFlags=qd;exports.HideOnStart=Mi;exports.HingeJoint=Oc;exports.HorizontalLayoutGroup=hg;exports.HostData=$S;exports.Image=Ta;exports.ImageReference=Io;exports.ImageReferenceSerializer=v0;exports.InheritVelocityModule=Sg;exports.Input=Sb;exports.InputEventQueue=Nt;exports.InputEvents=we;exports.InputField=jg;exports.InstanceHandle=zo;exports.InstancingHandler=Xo;exports.InstancingUtil=Ei;exports.InstantiateEvent=qb;exports.InstantiateIdProvider=ft;exports.InstantiateOptions=sn;exports.Interactable=Lm;exports.JoinedRoomResponse=pS;exports.KeyEventArgs=nS;exports.Keyframe=$t;exports.LODGroup=Rc;exports.LODModel=Oa;exports.LeftRoomResponse=mS;exports.Light=pi;exports.LightData=M0;exports.LimitVelocityOverLifetimeModule=et;exports.LoadingElementOptions=UR;exports.LogStats=Am;exports.LogType=oi;exports.LookAt=Bg;exports.LookAtConstraint=nr;exports.MainModule=St;exports.MarkerType=Lg;exports.MaskableGraphic=Mc;exports.Mathf=D;exports.MeshCollider=to;exports.MeshRenderer=_c;exports.MinMaxCurve=G;exports.MinMaxGradient=mr;exports.NEKeyboardEvent=nl;exports.NEPointerEvent=Qn;exports.NeedleButtonElement=Pw;exports.NeedleEngineWebComponent=Vg;exports.NeedleMenu=Dn;exports.NeedlePatchesKey=Ah;exports.NeedleXRController=Zp;exports.NeedleXRSession=H;exports.NeedleXRSync=Ab;exports.NeedleXRUtils=Db;exports.NestedGltf=cu;exports.NetworkConnection=Tb;exports.NetworkedStreamEvents=xn;exports.NetworkedStreams=pc;exports.Networking=wg;exports.NewInstanceModel=Qb;exports.NoiseModule=fe;exports.ObjectRaycaster=ci;exports.ObjectUtils=Zo;exports.OffsetConstraint=fr;exports.OneEuroFilter=Eh;exports.OneEuroFilterXYZ=zp;exports.OpenURL=Aa;exports.OrbitControls=de;exports.Outline=Ca;exports.OwnershipEvent=Eb;exports.OwnershipModel=im;exports.PUBLIC_KEY=Fr;exports.Padding=hr;exports.ParticleBurst=Sd;exports.ParticleSubEmitter=Cg;exports.ParticleSystem=ql;exports.ParticleSystemBaseBehaviour=ao;exports.ParticleSystemRenderer=Ni;exports.ParticleSystemShapeType=xd;exports.PeerHandle=is;exports.PeerNetworking=kb;exports.Physics=sa;exports.PhysicsExtension=rg;exports.PhysicsMaterialCombine=it;exports.PixelationEffect=Dc;exports.PlayAnimationOnClick=Gl;exports.PlayAudioOnClick=Hs;exports.PlayableDirector=ua;exports.PlayerColor=da;exports.PlayerState=Yi;exports.PlayerStateEvent=Fv;exports.PlayerSync=ng;exports.PlayerView=S0;exports.PlayerViewManager=C0;exports.PointerEventData=fc;exports.PointerType=Dd;exports.PostProcessingEffect=Ne;exports.PostProcessingEffectOrder=Qe;exports.PostProcessingHandler=kg;exports.PreliminaryAction=wa;exports.PreliminaryTrigger=wc;exports.PrimitiveType=Vo;exports.Progress=ie;exports.PromiseAllWithErrors=Fp;exports.PromiseErrorResult=$f;exports.RGBAColor=Z;exports.RapierPhysics=Zr;exports.RawImage=ku;exports.RaycastOptions=Js;exports.Rect=zv;exports.RectTransform=nn;exports.ReflectionProbe=Wl;exports.RegisteredAnimationInfo=Us;exports.RemoteSkybox=yu;exports.RenderTexture=wn;exports.RenderTextureSerializer=H0;exports.Renderer=hi;exports.RendererData=P0;exports.RendererLightmap=bd;exports.Rigidbody=Ke;exports.RigidbodyConstraints=De;exports.RoomEvents=Q;exports.RotationBySpeedModule=zi;exports.RotationOverLifetimeModule=rn;exports.SceneLightSettings=gd;exports.SceneSwitcher=Ie;exports.ScreenCapture=co;exports.ScreenSpaceAmbientOcclusion=ys;exports.ScreenSpaceAmbientOcclusionN8=ln;exports.SendQueue=Xi;exports.SerializationContext=um;exports.SetActiveOnClick=Km;exports.ShadowCatcher=Fc;exports.ShapeModule=xg;exports.ShapeOverlapResult=Z0;exports.SharpeningEffect=jc;exports.SignalAsset=Su;exports.SignalReceiver=$c;exports.SignalReceiverEvent=Vc;exports.SignalTrackHandler=Ql;exports.Size=Uv;exports.SizeBySpeedModule=Kt;exports.SizeOverLifetimeModule=gr;exports.SkinnedMeshRenderer=$m;exports.SmoothFollow=bu;exports.SpatialGrabRaycaster=Ho;exports.SpatialHtml=Hc;exports.SpatialTrigger=vu;exports.SpatialTriggerReceiver=En;exports.SpectatorCamera=wu;exports.SphereCollider=ya;exports.SphereIntersection=om;exports.Sprite=fs;exports.SpriteData=Kr;exports.SpriteRenderer=Qt;exports.SpriteSheet=ca;exports.StateMachineBehaviour=r1;exports.StreamEndedEvent=Cm;exports.StreamReceivedEvent=J0;exports.SubEmitterSystem=Cd;exports.SyncedCamera=Eg;exports.SyncedRoom=cn;exports.SyncedTransform=tn;exports.TapGestureTrigger=Jm;exports.TeleportTarget=ru;exports.TestRunner=Tg;exports.TestSceneUtils=XR;exports.TestSimulateUserData=Ag;exports.Text=xt;exports.TextBuilder=lg;exports.TextExtension=lu;exports.TextureSheetAnimationModule=Ct;exports.TiltShiftEffect=Bn;exports.Time=O0;exports.ToneMappingEffect=Qs;exports.TrackHandler=Wc;exports.TrackType=ei;exports.TrailModule=Ee;exports.TransformData=ke;exports.TransformGizmo=vr;exports.TriggerBuilder=vt;exports.TriggerModel=$s;exports.TypeStore=P;exports.UIRaycastUtils=xm;exports.UIRootComponent=Sc;exports.USDDocument=qm;exports.USDObject=ze;exports.USDWriter=Mv;exports.USDZExporter=Rn;exports.USDZExporter$1=Ov;exports.USDZText=$r;exports.USDZUIExtension=fg;exports.UriSerializer=q0;exports.UsageMarker=yc;exports.UserJoinedOrLeftRoomModel=gS;exports.VERSION=Ki;exports.VariantAction=Qm;exports.VelocityOverLifetimeModule=Le;exports.VerticalLayoutGroup=cg;exports.VideoPlayer=Ze;exports.ViewDevice=zs;exports.Vignette=br;exports.VisibilityAction=xc;exports.Voip=eo;exports.Volume=Ea;exports.VolumeParameter=I;exports.VolumeProfile=fu;exports.WaitForFrames=_C;exports.WaitForPromise=x0;exports.WaitForSeconds=mm;exports.Watch=ss;exports.WebARCameraBackground=Xc;exports.WebARSessionRoot=ri;exports.WebXR=au;exports.WebXRButtonFactory=Ws;exports.WebXRImageTracking=Qc;exports.WebXRImageTrackingModel=vs;exports.WebXRPlaneTracking=ws;exports.WebXRTrackedImage=fa;exports.XRControllerFollow=bs;exports.XRControllerModel=as;exports.XRControllerMovement=di;exports.XRFlag=ki;exports.XRRig=Au;exports.XRState=Lt;exports.XRStateFlag=bn;exports.__Ignore=kw;exports.__internalNotifyObjectDestroyed=Nb;exports.activeInHierarchyFieldName=os;exports.addAttributeChangeCallback=Q_;exports.addComponent=Zi;exports.addCustomExtensionPlugin=jP;exports.addNewComponent=Lo;exports.addPatch=Ad;exports.apply=Fd;exports.applyHMRChanges=JC;exports.applyPrototypeExtensions=a0;exports.beginListenDestroy=Xb;exports.beginListenInstantiate=Kb;exports.binaryIdentifierCasts=Jp;exports.build_scene_functions=FC;exports.builtinComponentKeyName=xo;exports.calculateProgress01=Ng;exports.clearMessages=fx;exports.colorSerializer=S1;exports.compareAssociation=t0;exports.componentSerializer=Nh;exports.copyTexture=hb;exports.createMotion=V0;exports.debugNet=jt;exports.debugOwner=sl;exports.decompressGpuTexture=Tv;exports.deepClone=Zl;exports.delay=Tn;exports.delayForFrames=Jl;exports.deserializeObject=ad;exports.destroy=li;exports.destroyComponentInstance=h0;exports.determineMimeTypeFromExtension=lv;exports.disposeObjectResources=_e;exports.disposeStream=Sn;exports.editorGuidKeyName=xl;exports.enableSpatialConsole=Eo;exports.euler=P1;exports.eventListSerializer=R1;exports.exportAsGLTF=KR;exports.findByGuid=pm;exports.findObjectOfType=lc;exports.findObjectsOfType=u0;exports.findResourceUsers=rm;exports.fitObjectIntoVolume=ub;exports.foreachComponent=Wo;exports.foreachComponentEnumerator=zd;exports.forward=Ex;exports.generateQRCode=K_;exports.generateSeed=Yb;exports.getBoundingBox=Wt;exports.getCameraController=nb;exports.getComponent=er;exports.getComponentInChildren=ac;exports.getComponentInParent=Ul;exports.getComponents=rc;exports.getComponentsInChildren=pa;exports.getComponentsInParent=Bd;exports.getFormattedDate=xv;exports.getIconElement=ut;exports.getIconTexture=cp;exports.getLoader=Ji;exports.getOrAddComponent=oc;exports.getParam=w;exports.getParentHierarchyPath=Lx;exports.getPath=Ww;exports.getPeerOptions=hS;exports.getPeerjsInstance=Ob;exports.getResourceUserCount=DS;exports.getTempColor=rb;exports.getTempQuaternion=qi;exports.getTempVector=V;exports.getUrlParams=Kl;exports.getVisibleInCustomShadowRendering=db;exports.getWorldDirection=ab;exports.getWorldEuler=$p;exports.getWorldPosition=X;exports.getWorldQuaternion=ue;exports.getWorldRotation=Ed;exports.getWorldScale=Ae;exports.hasCommercialLicense=kn;exports.hasIndieLicense=hc;exports.hasPointerEventComponent=ud;exports.hasProLicense=On;exports.hideDebugConsole=gb;exports.imageToCanvas=Av;exports.instantiate=Go;exports.invokeLoadedImportPluginHooks=yv;exports.invokeXRSessionEnd=xb;exports.invokeXRSessionStart=wb;exports.isActiveInHierarchy=f0;exports.isActiveSelf=ma;exports.isAndroidDevice=Yw;exports.isAnimationAction=cb;exports.isComponent=Q0;exports.isDebugMode=zw;exports.isDesktop=Hw;exports.isDestroyed=$o;exports.isDevEnvironment=A;exports.isDisposed=AS;exports.isExporting=QR;exports.isGLTFModel=X0;exports.isHostedOnGlitch=V_;exports.isHotReloadEnabled=pp;exports.isHotReloading=KC;exports.isIPad=Xw;exports.isIconElement=E0;exports.isLocalNetwork=Ai;exports.isMacOS=Zw;exports.isMobileDevice=qw;exports.isMozillaXR=Kw;exports.isQuest=tx;exports.isResourceTrackingEnabled=Bb;exports.isSafari=ex;exports.isUsingInstancing=Ud;exports.isiOS=Jw;exports.isiPad=Qw;exports.loadAsset=LR;exports.loadPMREM=aw;exports.loadSync=zg;exports.logHierarchy=Jh;exports.lookAtInverse=xx;exports.lookAtObject=ec;exports.lookAtScreenPoint=Sx;exports.makeId=Vw;exports.makeIdFromRandomWords=H_;exports.makeNameSafe=Ii;exports.markAsInstancedRendered=p0;exports.microphonePermissionsGranted=ix;exports.nameof=Uw;exports.nameofFactory=W_;exports.objectSerializer=G0;exports.offXRSessionEnd=iS;exports.offXRSessionStart=tS;exports.onAfterRender=QC;exports.onBeforeRender=XC;exports.onClear=HC;exports.onDestroy=qC;exports.onInitialized=I0;exports.onStart=_m;exports.onUpdate=j0;exports.onXRSessionEnd=Kp;exports.onXRSessionStart=Ld;exports.parseSync=vw;exports.placeOnSurface=fb;exports.postprocessFBXMaterials=Hp;exports.prefix=y1;exports.pushState=G_;exports.randomNumber=$w;exports.registerBinaryType=em;exports.registerComponent=Vd;exports.registerComponentExtension=zm;exports.registerCustomEffectType=Vi;exports.registerExportExtensions=Nm;exports.registerExtensions=_d;exports.registerHotReloadType=F0;exports.registerLoader=Qp;exports.registerPrefabProvider=Jb;exports.registerPrototypeExtensions=l0;exports.registerType=XS;exports.relativePathPrefix=X_;exports.removeAttributeChangeCallback=Y_;exports.removeComponent=fm;exports.removeCustomImportExtensionType=BP;exports.removePatch=Jx;exports.resolveUrl=Ys;exports.sanitizeString=q_;exports.saveImage=gw;exports.screenshot=mR;exports.screenshot2=Ug;exports.sendDestroyed=lm;exports.serializable=f;exports.serializeObject=n0;exports.serializeable=tr;exports.setActive=Pl;exports.setAllowBalloonMessages=eb;exports.setAllowOverlayMessages=cx;exports.setAutoFitEnabled=Kh;exports.setCameraController=Gf;exports.setDestroyed=g0;exports.setDevEnvironment=Nx;exports.setDisposable=Ub;exports.setDontDestroy=Ar;exports.setOrAddParamsToUrl=Vf;exports.setParam=Nw;exports.setParamWithoutReload=Il;exports.setPeerOptions=dS;exports.setResourceTrackingEnabled=TS;exports.setState=jp;exports.setVisibleInCustomShadowRendering=Gp;exports.setWorldEuler=Wp;exports.setWorldPosition=Ye;exports.setWorldPositionXYZ=No;exports.setWorldQuaternion=Li;exports.setWorldQuaternionXYZW=Vp;exports.setWorldRotation=lb;exports.setWorldRotationXYZ=tc;exports.setWorldScale=ea;exports.showBalloonError=ic;exports.showBalloonMessage=Se;exports.showBalloonWarning=he;exports.showDebugConsole=qp;exports.slerp=wx;exports.syncDestroy=nc;exports.syncField=ig;exports.syncInstantiate=cm;exports.textureToCanvas=Dx;exports.tryCastBinary=Pb;exports.tryDetermineMimetypeFromBinary=hv;exports.tryDetermineMimetypeFromURL=cv;exports.tryFindObject=Jr;exports.tryGetGuid=Mb;exports.unregisterHotReloadType=U0;exports.unwatchWrite=Bp;exports.useForAutoFit=sb;exports.validate=gt;exports.watchWrite=Rd;