@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 +4 -5
- package/README.md +31 -23
- package/dist/{needle-engine.bundle-C0MpXHGe.min.js → needle-engine.bundle--H5L0liy.min.js} +2 -2
- package/dist/{needle-engine.bundle-BATGweff.js → needle-engine.bundle-C071tpzX.js} +5 -5
- package/dist/{needle-engine.bundle-gnU2UVys.umd.cjs → needle-engine.bundle-CK8rTkFm.umd.cjs} +3 -3
- package/dist/needle-engine.js +2 -2
- package/dist/needle-engine.min.js +1 -1
- package/dist/needle-engine.umd.cjs +1 -1
- package/lib/engine/engine_camera.js +3 -3
- package/lib/engine/engine_camera.js.map +1 -1
- package/lib/engine/engine_context.d.ts +1 -1
- package/lib/engine/engine_context.js +1 -1
- package/lib/engine/engine_context.js.map +1 -1
- package/lib/engine-components/export/usdz/USDZExporter.d.ts +1 -1
- package/lib/engine-components/export/usdz/USDZExporter.js +1 -1
- package/lib/engine-components/export/usdz/USDZExporter.js.map +1 -1
- package/lib/engine-components/webxr/WebXRImageTracking.js.map +1 -1
- package/package.json +2 -2
- package/src/engine/engine_camera.ts +4 -4
- package/src/engine/engine_context.ts +1 -1
- package/src/engine-components/export/usdz/USDZExporter.ts +1 -1
- package/src/engine-components/webxr/WebXRImageTracking.ts +1 -1
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
|
|
16
|
-
[](https://responsive-layout-z23hmxb22no6t.needle.run
|
|
17
|
-
[Example 2 Website](https://responsive-layout-click-example-z23hmxbzuyk6y.needle.run
|
|
18
|
-
[](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://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://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
|
-
-
|
|
13
|
+
- Components System: Add your custom components with easy
|
|
12
14
|
- WebXR support & iOS Quicklook support for interactive AR
|
|
13
|
-
-
|
|
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
|
-
-
|
|
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
|
-
- [
|
|
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
|
-
|
|
43
|
+
## Getting Started
|
|
43
44
|
|
|
44
|
-
|
|
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
|
-
##
|
|
48
|
+
## Examples
|
|
48
49
|
|
|
49
|
-
|
|
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
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
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://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://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://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
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
|
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";
|
package/dist/{needle-engine.bundle-gnU2UVys.umd.cjs → needle-engine.bundle-CK8rTkFm.umd.cjs}
RENAMED
|
@@ -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
|
|
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
|
|
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;
|