three-live 1.1.0 → 1.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +3 -3
- package/dist/three-author-engine.js +45 -40
- package/dist/three-author.cjs +32 -27
- package/dist/three-author.d.ts +3 -3
- package/dist/three-author.js +32 -27
- package/dist/three-convert.cjs +43 -38
- package/dist/three-convert.d.ts +3 -3
- package/dist/three-convert.js +42 -37
- package/dist/three-live-animation.cjs +6 -6
- package/dist/three-live-animation.d.ts +3 -3
- package/dist/three-live-animation.js +5 -5
- package/dist/three-live-animation.min.js +6 -6
- package/dist/three-live-element.cjs +12 -7
- package/dist/three-live-element.d.ts +3 -3
- package/dist/three-live-element.js +12 -7
- package/dist/three-live-extras.cjs +13 -13
- package/dist/three-live-extras.d.ts +3 -3
- package/dist/three-live-extras.js +12 -12
- package/dist/three-live-extras.min.js +13 -13
- package/dist/three-live-full.cjs +69 -64
- package/dist/three-live-full.js +69 -64
- package/dist/three-live-full.min.js +69 -64
- package/dist/three-live-viewer.cjs +12 -7
- package/dist/three-live-viewer.d.ts +3 -3
- package/dist/three-live-viewer.js +12 -7
- package/dist/three-live-viewer.min.js +12 -7
- package/dist/three-live.cjs +49 -44
- package/dist/three-live.js +49 -44
- package/dist/three-live.min.js +49 -44
- package/dist/three-view.cjs +12 -7
- package/dist/three-view.d.ts +3 -3
- package/dist/three-view.js +12 -7
- package/dist/three-xr.cjs +44 -39
- package/dist/three-xr.d.ts +3 -3
- package/dist/three-xr.js +44 -39
- package/package.json +1 -1
|
@@ -14,13 +14,13 @@
|
|
|
14
14
|
* See the License for the specific language governing permissions and
|
|
15
15
|
* limitations under the License.
|
|
16
16
|
*/
|
|
17
|
-
"use strict";var
|
|
18
|
-
out vec2 vNDC;void main(){vec2 p=vec2((gl_VertexID<<1)&2,gl_VertexID&2);vNDC=p*2.-1.;gl_Position=vec4(vNDC,.999999,1.);}`)),t.attachShader(S,
|
|
19
|
-
precision highp float;in vec2 vNDC;uniform mat4 uInvVP;uniform vec3 uCameraPos;uniform sampler2D uSkyboxMap;uniform float uExposure;out vec4 fragColor;vec2 eqUV(vec3 d){return vec2(atan(d.x,d.z)/6.2831853+.5,asin(clamp(d.y,-1.,1.))/3.1415926+.5);}void main(){vec4 fp=uInvVP*vec4(vNDC,1.,1.);vec3 dir=normalize(fp.xyz/fp.w-uCameraPos);fragColor=vec4(pow(texture(uSkyboxMap,eqUV(dir)).rgb*uExposure,vec3(1./2.2)),1.);}`)),t.linkProgram(S);let
|
|
17
|
+
"use strict";var ve=Object.defineProperty;var ct=Object.getOwnPropertyDescriptor;var lt=Object.getOwnPropertyNames;var ut=Object.prototype.hasOwnProperty;var ft=(e,t)=>{for(var n in t)ve(e,n,{get:t[n],enumerable:!0})},mt=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of lt(t))!ut.call(e,o)&&o!==n&&ve(e,o,{get:()=>t[o],enumerable:!(r=ct(t,o))||r.enumerable});return e};var dt=e=>mt(ve({},"__esModule",{value:!0}),e);var Pt={};ft(Pt,{InteractivityVM:()=>re,contactShadowPlugin:()=>ke,environmentMapPlugin:()=>Se,getEnvironmentSH:()=>je,getInteractivityVM:()=>be,hotspotPlugin:()=>Ee,interactivityPlugin:()=>Le,materialsPlugin:()=>Ve,parseSafeGltfPointer:()=>ne,registerMaterialShader:()=>rt,sendInteractivityEvent:()=>Pe,setEnvironmentSH:()=>le,webxrPlugin:()=>De});module.exports=dt(Pt);var ce="__THREE_LIVE_REGISTRY__";function Ae(){let e=typeof globalThis<"u"?globalThis:{};if(!e[ce]){let t={plugins:[],decoders:new Map};try{Object.defineProperty(e,ce,{value:t,writable:!1,configurable:!1,enumerable:!1})}catch{e[ce]=t}}return e[ce]}var Ct=Ae().plugins;function Q(e){let t=Ae().plugins;t.some(n=>n.name===e.name)||t.push(e)}function Be(){return Ae().plugins}function Oe(){let e=new Float32Array(16);return e[0]=1,e[5]=1,e[10]=1,e[15]=1,e}function pt(e,t,n){let r=t[0],o=t[1],s=t[2],x=t[3],p=t[4],f=t[5],d=t[6],m=t[7],M=t[8],S=t[9],F=t[10],v=t[11],y=t[12],R=t[13],V=t[14],N=t[15],E=n[0],w=n[1],I=n[2],P=n[3];return e[0]=E*r+w*p+I*M+P*y,e[1]=E*o+w*f+I*S+P*R,e[2]=E*s+w*d+I*F+P*V,e[3]=E*x+w*m+I*v+P*N,E=n[4],w=n[5],I=n[6],P=n[7],e[4]=E*r+w*p+I*M+P*y,e[5]=E*o+w*f+I*S+P*R,e[6]=E*s+w*d+I*F+P*V,e[7]=E*x+w*m+I*v+P*N,E=n[8],w=n[9],I=n[10],P=n[11],e[8]=E*r+w*p+I*M+P*y,e[9]=E*o+w*f+I*S+P*R,e[10]=E*s+w*d+I*F+P*V,e[11]=E*x+w*m+I*v+P*N,E=n[12],w=n[13],I=n[14],P=n[15],e[12]=E*r+w*p+I*M+P*y,e[13]=E*o+w*f+I*S+P*R,e[14]=E*s+w*d+I*F+P*V,e[15]=E*x+w*m+I*v+P*N,e}function bt(e,t,n,r){let o=t[0],s=t[1],x=t[2],p=t[3],f=o+o,d=s+s,m=x+x,M=o*f,S=o*d,F=o*m,v=s*d,y=s*m,R=x*m,V=p*f,N=p*d,E=p*m,w=r[0],I=r[1],P=r[2];return e[0]=(1-(v+R))*w,e[1]=(S+E)*w,e[2]=(F-N)*w,e[3]=0,e[4]=(S-E)*I,e[5]=(1-(M+R))*I,e[6]=(y+V)*I,e[7]=0,e[8]=(F+N)*P,e[9]=(y-V)*P,e[10]=(1-(M+v))*P,e[11]=0,e[12]=n[0],e[13]=n[1],e[14]=n[2],e[15]=1,e}function Me(e,t){let n=t[0],r=t[1],o=t[2],s=t[4],x=t[5],p=t[6],f=t[8],d=t[9],m=t[10],M=m*x-p*d,S=-m*s+p*f,F=d*s-x*f,v=n*M+r*S+o*F;return v&&(v=1/v,e[0]=M*v,e[1]=(-m*r+o*d)*v,e[2]=(p*r-o*x)*v,e[3]=S*v,e[4]=(m*n-o*f)*v,e[5]=(-p*n+o*s)*v,e[6]=F*v,e[7]=(-d*n+r*f)*v,e[8]=(x*n-r*s)*v),e}function We(e,t){let n=t[0],r=t[1],o=t[2],s=t[3],x=t[4],p=t[5],f=t[6],d=t[7],m=t[8],M=t[9],S=t[10],F=t[11],v=t[12],y=t[13],R=t[14],V=t[15],N=n*p-r*x,E=n*f-o*x,w=n*d-s*x,I=r*f-o*p,P=r*d-s*p,O=o*d-s*f,H=m*y-M*v,B=m*R-S*v,k=m*V-F*v,Y=M*R-S*y,q=M*V-F*y,Z=S*V-F*R,z=N*Z-E*q+w*Y+I*k-P*B+O*H;return z?(z=1/z,e[0]=(p*Z-f*q+d*Y)*z,e[1]=(o*q-r*Z-s*Y)*z,e[2]=(y*O-R*P+V*I)*z,e[3]=(S*P-M*O-F*I)*z,e[4]=(f*k-x*Z-d*B)*z,e[5]=(n*Z-o*k+s*B)*z,e[6]=(R*w-v*O-V*E)*z,e[7]=(m*O-S*w+F*E)*z,e[8]=(x*q-p*k+d*H)*z,e[9]=(r*k-n*q-s*H)*z,e[10]=(v*P-y*w+V*N)*z,e[11]=(M*w-m*P-F*N)*z,e[12]=(p*B-x*Y-f*H)*z,e[13]=(n*Y-r*B+o*H)*z,e[14]=(y*E-v*I-R*N)*z,e[15]=(m*I-M*E+S*N)*z,e):null}function Te(e,t){let n=Array.isArray(e?.nodes)?e.nodes.length:0,r=[];for(let m=0;m<n;m++)r.push(Oe());if(n===0)return r;let o=new Set;for(let m of e.nodes)if(Array.isArray(m.children))for(let M of m.children)o.add(M);let s=new Set,x=128,p=(m,M,S=0)=>{if(S>x||m<0||m>=n||s.has(m))return;s.add(m);let F=e.nodes[m];if(!F)return;let v=Oe();if(t&&t[m])v.set(t[m]);else if(F.matrix&&F.matrix.length===16)v.set(F.matrix);else{let R=F.translation||[0,0,0],V=F.rotation||[0,0,0,1],N=F.scale||[1,1,1];bt(v,V,R,N)}let y=r[m];if(M?pt(y,M,v):y.set(v),Array.isArray(F.children))for(let R of F.children)typeof R=="number"&&p(R,y,S+1)},f=[],d=e.scenes&&e.scenes[e.scene!==void 0?e.scene:0];if(d&&Array.isArray(d.nodes))f.push(...d.nodes);else for(let m=0;m<n;m++)o.has(m)||f.push(m);for(let m of f)p(m,null);for(let m=0;m<n;m++)!o.has(m)&&!f.includes(m)&&p(m,null);return r}var Re=new WeakMap;function le(e,t){let n=t instanceof Float32Array?t:new Float32Array(t);Re.set(e,n)}function je(e){return Re.get(e)}async function yt(e,t){if(!t)return null;let n;if(typeof t=="string")if(typeof fetch<"u"&&typeof createImageBitmap=="function"){let s=await(await fetch(t)).blob();n=await createImageBitmap(s)}else if(typeof Image<"u")n=await new Promise((o,s)=>{let x=new Image;x.crossOrigin="anonymous",x.onload=()=>o(x),x.onerror=s,x.src=t});else return null;else n=t;let r=e.createTexture();return e.bindTexture(3553,r),e.texImage2D(3553,0,6408,6408,5121,n),e.texParameteri(3553,10242,33071),e.texParameteri(3553,10243,33071),e.texParameteri(3553,10241,9987),e.texParameteri(3553,10240,9729),e.generateMipmap(3553),r}var Ge=new WeakMap,Xe=new Float32Array(16);async function $e(e,t,n){let r=n?await yt(e.gl,n):null;e[t]&&e.gl.deleteTexture(e[t]),e[t]=r}var Se={name:"environment-map",setEnvironmentImage(e,t){return $e(e,"environmentTexture",t)},setSkyboxImage(e,t){return $e(e,"skyboxTexture",t)},onBeforeDrawScene(e,t,n,r,o){if(!e.skyboxTexture||typeof t.createProgram!="function")return;let s=Ge.get(t);if(!s){let M=(v,y)=>{let R=t.createShader(v);return t.shaderSource(R,y),t.compileShader(R),R},S=t.createProgram();t.attachShader(S,M(35633,`#version 300 es
|
|
18
|
+
out vec2 vNDC;void main(){vec2 p=vec2((gl_VertexID<<1)&2,gl_VertexID&2);vNDC=p*2.-1.;gl_Position=vec4(vNDC,.999999,1.);}`)),t.attachShader(S,M(35632,`#version 300 es
|
|
19
|
+
precision highp float;in vec2 vNDC;uniform mat4 uInvVP;uniform vec3 uCameraPos;uniform sampler2D uSkyboxMap;uniform float uExposure;out vec4 fragColor;vec2 eqUV(vec3 d){return vec2(atan(d.x,d.z)/6.2831853+.5,asin(clamp(d.y,-1.,1.))/3.1415926+.5);}void main(){vec4 fp=uInvVP*vec4(vNDC,1.,1.);vec3 dir=normalize(fp.xyz/fp.w-uCameraPos);fragColor=vec4(pow(texture(uSkyboxMap,eqUV(dir)).rgb*uExposure,vec3(1./2.2)),1.);}`)),t.linkProgram(S);let F=typeof t.createVertexArray=="function"?t.createVertexArray():null;s={program:S,vao:F},Ge.set(t,s)}let x=We(Xe,n)||Xe;t.depthMask(!1),t.useProgram(s.program),s.vao&&t.bindVertexArray(s.vao),t.activeTexture(33984),t.bindTexture(3553,e.skyboxTexture);let p=t.getUniformLocation(s.program,"uSkyboxMap");p&&t.uniform1i(p,0);let f=t.getUniformLocation(s.program,"uInvVP");f&&t.uniformMatrix4fv(f,!1,x);let d=t.getUniformLocation(s.program,"uCameraPos");d&&t.uniform3f(d,r[0],r[1],r[2]);let m=t.getUniformLocation(s.program,"uExposure");m&&t.uniform1f(m,e.exposure??1),t.drawArrays(4,0,3),t.depthMask(!0)},onResolveShader(e,t,n,r){if(r.includes("evalSHIrradiance"))return null;let o=r.replace("out vec4 fragColor;",`uniform vec3 uSH[9];
|
|
20
20
|
uniform int uHasSH;
|
|
21
21
|
out vec4 fragColor;`).replace("void main(){",`vec3 integrateBRDFApprox(vec3 f0,float r,float NoV){vec4 c0=vec4(-1.,-.0275,-.572,.022),c1=vec4(1.,.0425,1.04,-.04),rv=r*c0+c1;float a=min(rv.x*rv.x,exp2(-9.28*NoV))*rv.x+rv.y;vec2 ab=vec2(-1.04,1.04)*a+rv.zw;return f0*ab.x+vec3(ab.y);}
|
|
22
22
|
vec3 evalSHIrradiance(vec3 n){return max(vec3(0.),uSH[0]+uSH[1]*n.y+uSH[2]*n.z+uSH[3]*n.x+uSH[4]*(n.x*n.y)+uSH[5]*(n.y*n.z)+uSH[6]*(3.*n.z*n.z-1.)+uSH[7]*(n.x*n.z)+uSH[8]*(n.x*n.x-n.y*n.y));}
|
|
23
|
-
void main(){`);return
|
|
23
|
+
void main(){`);return o=o.replace(`if(uHasEnvironmentMap==1){
|
|
24
24
|
specularIBL=texture(uEnvironmentMap,equirectangularUV(R)).rgb*(F*brdf.x+brdf.y);
|
|
25
25
|
envDiffuse=texture(uEnvironmentMap,equirectangularUV(N)).rgb;
|
|
26
26
|
}`,`if(uHasEnvironmentMap==1){
|
|
@@ -29,14 +29,14 @@ envDiffuse=uHasSH==1?evalSHIrradiance(N):textureLod(uEnvironmentMap,equirectangu
|
|
|
29
29
|
}else if(uHasSH==1){
|
|
30
30
|
specularIBL=getStudioRadiance(R,roughness)*integrateBRDFApprox(F,roughness,NoV);
|
|
31
31
|
envDiffuse=evalSHIrradiance(N);
|
|
32
|
-
}`),{vs:n,fs:r}},onBeforeDrawPrimitive(e,t,n,a,r,s){let y=Se.get(e),l=e.getUniformLocation(t,"uHasSH");if(y&&y.length>=27){l&&e.uniform1i(l,1);let u=e.getUniformLocation(t,"uSH");u&&e.uniform3fv(u,y)}else l&&e.uniform1i(l,0)},onAttributeChanged(e,t,n,a){t==="environment-image"&&e.viewer?this.setEnvironmentImage?.(e.viewer,a):t==="skybox-image"&&e.viewer&&this.setSkyboxImage?.(e.viewer,a)}};var Ee=new WeakMap;function Ie(e,t){let n=t||e.viewer;if(!n||typeof n.projectPointToScreen!="function")return;let a=e.mockHotspots||e.querySelectorAll('[slot^="hotspot-"], [data-position]');for(let r=0;r<a.length;r++){let s=a[r],y=s.getAttribute("data-position");if(!y)continue;let l=y.trim().split(/\s+/).map(b=>parseFloat(b.replace(/m$/,"")));if(l.length<3||l.some(isNaN))continue;let u=s.getAttribute("data-normal"),m;if(u){let b=u.trim().split(/\s+/).map(S=>parseFloat(S));b.length>=3&&!b.some(isNaN)&&(m=[b[0],b[1],b[2]])}let o=n.projectPointToScreen([l[0],l[1],l[2]],m);s.style.position="absolute",s.style.left="0",s.style.top="0",s.style.transform=`translate(-50%, -50%) translate3d(${o.x}px, ${o.y}px, 0)`,s.style.zIndex="3",o.visible?(s.style.opacity="1",s.style.pointerEvents="auto",s.removeAttribute("data-occluded")):(s.style.opacity="0",s.style.pointerEvents="none",s.setAttribute("data-occluded",""))}}var _e={name:"hotspots",updateHotspotsForElement:Ie,onElementConnected(e){if(typeof MutationObserver>"u"||!e)return;let t=new MutationObserver(()=>{Ie(e)});t.observe(e,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["data-position","data-normal"]}),Ee.set(e,t)},onCameraChange(e,t){t&&Ie(t,e)},onElementDisconnected(e){let t=Ee.get(e);t&&(t.disconnect(),Ee.delete(e))}};function me(e,t,n,a){let r=typeof e=="number"&&Number.isFinite(e)?e:a;return Math.max(t,Math.min(n,r))}function gt(e){return Array.isArray(e)&&e.length>=3&&Number.isFinite(e[0])&&Number.isFinite(e[1])&&Number.isFinite(e[2])}function xt(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:null}function je(e){let t=xt(e);if(!t)return null;let n=t.target;return{target:gt(n)?[n[0],n[1],n[2]]:typeof n=="string"&&n.length>0&&n.length<=256?n:[0,0,0],radius:me(t.radius,.01,50,.5),speed:me(t.speed,-20,20,.5),height:me(t.height,-10,10,0),phase:me(t.phase,-1e6,1e6,0),faceCenter:t.faceCenter===!0}}function qe(e,t,n,a){let r=t[0],s=t[1],y=t[2],l=t[3],u=n[0],m=n[1],o=n[2],b=n[3],S=r*u+s*m+y*o+l*b;if(S<0&&(u=-u,m=-m,o=-o,b=-b,S=-S),Math.abs(S)>=1)return e[0]=r,e[1]=s,e[2]=y,e[3]=l,e;let w=Math.acos(S),g=Math.sqrt(1-S*S);if(Math.abs(g)<.001)return e[0]=.5*(r+u),e[1]=.5*(s+m),e[2]=.5*(y+o),e[3]=.5*(l+b),e;let x=Math.sin((1-a)*w)/g,R=Math.sin(a*w)/g;return e[0]=r*x+u*R,e[1]=s*x+m*R,e[2]=y*x+o*R,e[3]=l*x+b*R,e}var Ye=1024,Fe=256,de=2048,vt=128,At=64,Tt=16,Mt=1e4,Rt=8,Y=new Set(["__proto__","constructor","prototype"]),Ke={neg:e=>-e,abs:Math.abs,sign:Math.sign,floor:Math.floor,ceil:Math.ceil,round:Math.round,trunc:Math.trunc,fract:e=>e-Math.floor(e),sqrt:e=>Math.sqrt(Math.max(0,e)),cbrt:Math.cbrt,exp:Math.exp,log:e=>e>0?Math.log(e):0,sin:Math.sin,cos:Math.cos,tan:Math.tan,asin:e=>Math.asin(Math.max(-1,Math.min(1,e))),acos:e=>Math.acos(Math.max(-1,Math.min(1,e))),atan:Math.atan,rad:e=>e*Math.PI/180,deg:e=>e*180/Math.PI,saturate:e=>Math.max(0,Math.min(1,e))},Ze={add:(e,t)=>e+t,sub:(e,t)=>e-t,mul:(e,t)=>e*t,div:(e,t)=>Math.abs(t)<1e-12?0:e/t,rem:(e,t)=>Math.abs(t)<1e-12?0:e%t,mod:(e,t)=>Math.abs(t)<1e-12?0:e%t,min:Math.min,max:Math.max,pow:Math.pow,atan2:Math.atan2},pe={translation:[0,0,0],rotation:[0,0,0,1],scale:[1,1,1]},be=(e,t)=>e!==null&&typeof e=="object"&&!Y.has(t)&&Object.prototype.hasOwnProperty.call(e,t),W=e=>Array.isArray(e)?[...e]:e,tt=e=>e!==null&&typeof e=="object"&&!Array.isArray(e)&&be(e,"value")?e.value:e,D=(e,t)=>be(e.configuration,t)?tt(e.configuration[t]):void 0,T=(e,t=0)=>{let n=Number(e);return Number.isFinite(n)?n:t},J=e=>Math.max(0,Math.min(1,e)),X=e=>typeof e=="boolean"?e:typeof e=="number"?e!==0&&!Number.isNaN(e):typeof e=="string"?e.length>0&&e!=="false":!!e;function oe(e){if(typeof e!="string"||!e.startsWith("/"))return null;let t=[];for(let n of e.slice(1).split("/")){let a=n.replace(/~1/g,"/").replace(/~0/g,"~");if(!a||Y.has(a)||Y.has(n))return null;t.push(a)}return{segments:t}}var te=(e,t)=>{if(e===void 0||!/^\d+$/.test(e))return-1;let n=Number(e);return Number.isSafeInteger(n)&&n>=0&&n<t?n:-1},Qe=e=>{let t=T(e[0]),n=T(e[1]),a=T(e[2]),r=T(e[3],1),s=Math.hypot(t,n,a,r);return s>1e-8?[t/s,n/s,a/s,r/s]:[0,0,0,1]},Je=(e,t,n,a)=>{if(typeof e=="number"&&typeof t=="number")return e+(t-e)*n;if(Array.isArray(e)&&Array.isArray(t)){if(a&&e.length===4&&t.length===4){let r=[0,0,0,1];return qe(r,Qe(e),Qe(t),n),r}return e.slice(0,t.length).map((r,s)=>r+(t[s]-r)*n)}return n>=.5?t:e},Pe=(e,t,n)=>Array.isArray(e)&&Array.isArray(t)?e.slice(0,t.length).map((a,r)=>n(T(a),T(t[r]))):Array.isArray(e)?e.map(a=>n(T(a),T(t))):Array.isArray(t)?t.map(a=>n(T(e),T(a))):n(T(e),T(t)),St=(e,t)=>Array.isArray(e)?e.map(n=>t(T(n))):t(T(e)),et=(e,t)=>Array.isArray(e)&&Array.isArray(t)?e.length===t.length&&e.every((n,a)=>Math.abs(n-t[a])<=1e-6):e===t,ae=class{constructor(t,n,a){let r=Array.isArray(a.nodes)?a.nodes:[];if(r.length>Ye)throw new Error(`SecurityError: Exceeds MAX_GRAPH_NODES (${Ye})`);let s=Array.isArray(a.variables)?a.variables:[];if(s.length>Fe)throw new Error(`SecurityError: Exceeds MAX_VARIABLES (${Fe})`);let y=Array.isArray(a.declarations)?a.declarations:[],l=Array.isArray(a.events)?a.events:[],u=new Map,m=new Map,o=new Map,b=new Map,S=new Map,w=new Map,g=[],x=[],R=new Map,I=1,C=0,E=0,F=0,L=0,N=!1,G=!1,H=!1;s.forEach((d,p)=>{if(!d||typeof d!="object")return;let v=W(tt(d.value));u.set(p,v);let A=d.id??d.name;typeof A=="string"&&A&&!Y.has(A)&&u.set(A,v)}),(n?.nodes||[]).forEach((d,p)=>{for(let v of d?.children||[])typeof v=="number"&&R.set(v,p)});let O=d=>d.op||typeof d.declaration=="number"&&y[d.declaration]?.op||"",U=(d,p,v)=>{if(Y.has(p))return;let A=m.get(d);A||m.set(d,A=Object.create(null)),A[p]=v},K=(d,p)=>{if(typeof d!="number"&&typeof d!="string"||typeof d=="string"&&Y.has(d)||!u.has(d)&&u.size>=Fe*2)return;let v=W(p);if(u.set(d,v),typeof d=="number"){let A=s[d]?.id??s[d]?.name;typeof A=="string"&&!Y.has(A)&&u.set(A,v)}},q=d=>typeof d=="number"?l[d]?.id??String(d):typeof d=="string"?/^\d+$/.test(d)&&l[Number(d)]?.id?l[Number(d)].id:d:"",Z=(d,p)=>{for(let v=d,A=0;v!==void 0&&v>=0&&A<128;v=R.get(v),A++)if(v===p)return!0;return!1},z=d=>{for(let p=g.length-1;p>=0;p--)g[p].key===d&&g.splice(p,1)},Ue=d=>{z(d.key),g.length>=vt&&g.shift(),g.push(d)},xe=d=>{let p=oe(d)?.segments;if(p){if(p[0]==="nodes"&&Array.isArray(n?.nodes)){let v=n.nodes[te(p[1],n.nodes.length)];if(!v)return;let A=p[2];if(A in pe){let f=pe[A],i=v[A]||f;return f.map((c,h)=>T(i[h],c))}if(A==="weights"){let f=Array.isArray(v.weights)?v.weights:[0],i=p.length===4?te(p[3],64):-2;return i===-2?f.map(c=>T(c)):i>=0?T(f[i]):void 0}if(A==="visible"||A==="extensions"&&p[3]==="KHR_node_visibility"&&p[4]==="visible")return v.extensions?.KHR_node_visibility?.visible??v.visible??!0}else if(p[0]==="materials"&&Array.isArray(n?.materials)){let v=n.materials[te(p[1],n.materials.length)];if(!v)return;let A=v.pbrMetallicRoughness||{};if(p[2]==="pbrMetallicRoughness"){if(p[3]==="baseColorFactor"){let f=A.baseColorFactor||[1,1,1,1];return[T(f[0],1),T(f[1],1),T(f[2],1),T(f[3],1)]}if(p[3]==="metallicFactor"||p[3]==="roughnessFactor")return T(A[p[3]],1)}if(p[2]==="emissiveFactor"){let f=v.emissiveFactor||[0,0,0];return[T(f[0]),T(f[1]),T(f[2])]}if(p[2]==="alphaCutoff")return T(v.alphaCutoff,.5)}}},se=(d,p)=>{let v=oe(d)?.segments;if(!v)return!1;if(v[0]==="nodes"&&Array.isArray(n?.nodes)){let A=te(v[1],n.nodes.length),f=n.nodes[A];if(!f)return!1;let i=v[2];if(i in pe&&Array.isArray(p)){let c=pe[i];if(p.length<c.length)return!1;let h=c.map((V,k)=>T(p[k],V));if(i==="rotation"){let V=Math.hypot(...h);h=V>1e-8?h.map(k=>k/V):[0,0,0,1]}f[i]=h,delete f.matrix;let P=t?.initialNodeTransforms?.[A];return P&&(P[i[0]]=[...h]),N=!0,!0}if(i==="weights"){Array.isArray(f.weights)||(f.weights=[]);let c=(h,P)=>{for(let V of t?.meshes||[])if(V.nodeIndex===A)for(let k of V.primitives||[])k.pluginData?.morph?.weights&&(k.pluginData.morph.weights[h]=P)};if(v.length===4){let h=te(v[3],64);if(h<0)return!1;c(h,f.weights[h]=T(p))}else if(Array.isArray(p))f.weights=p.slice(0,64).map(h=>T(h)),f.weights.forEach((h,P)=>c(P,h));else return!1;return H=!0,!0}if(i==="visible"||i==="extensions"&&v[3]==="KHR_node_visibility"&&v[4]==="visible"){let c=X(p);return f.visible=c,(!f.extensions||typeof f.extensions!="object")&&(f.extensions={}),f.extensions.KHR_node_visibility={visible:c},G=!0,!0}}else if(v[0]==="materials"&&Array.isArray(n?.materials)){let A=te(v[1],n.materials.length),f=n.materials[A];if(!f)return!1;let i=f.pbrMetallicRoughness||(f.pbrMetallicRoughness={}),c=h=>{for(let P of t?.meshes||[])for(let V of P.primitives||[])(V.materialIndex??0)===A&&h(V)};if(v[2]==="pbrMetallicRoughness"){if(v[3]==="baseColorFactor"&&Array.isArray(p)&&p.length>=3){let h=[J(T(p[0],1)),J(T(p[1],1)),J(T(p[2],1)),p[3]!==void 0?J(T(p[3],1)):i.baseColorFactor?.[3]??1];return i.baseColorFactor=h,c(P=>P.baseColor=[...h]),H=!0}if(v[3]==="metallicFactor"||v[3]==="roughnessFactor"){let h=v[3]==="metallicFactor",P=J(T(p,h?0:.5));return i[v[3]]=P,c(V=>V[h?"metallic":"roughness"]=P),H=!0}}if(v[2]==="emissiveFactor"&&Array.isArray(p)&&p.length>=3)return f.emissiveFactor=[0,1,2].map(h=>Math.max(0,T(p[h]))),H=!0;if(v[2]==="alphaCutoff")return f.alphaCutoff=J(T(p,.5)),H=!0}return!1},ve=(d,p,v=new Set)=>{let A=D(p,"pointer");if(typeof A!="string"||!A.startsWith("/"))return null;let f=A.replace(/\{([a-zA-Z0-9_]+)\}/g,(i,c)=>{let h=Math.trunc(Number(ce(d,c,void 0,v)??D(p,c)));return Number.isSafeInteger(h)&&h>=0?String(h):"-1"});return oe(f)?f:null},ce=(d,p,v,A)=>{let f=r[d]?.values;if(!be(f,p))return v;let i=f[p];if(i==null)return v;if(typeof i!="object"||Array.isArray(i))return W(i);let c=i;return typeof c.node=="number"?st(c.node,c.socket||"value",A):be(c,"value")?W(c.value):v},st=(d,p,v)=>{if(d<0||d>=r.length||v.has(d)||v.size>128||++F>Mt)return;let A=r[d],f=O(A);if(/^(event\/|pointer\/on|scene\/on|flow\/)/.test(f))return W(m.get(d)?.[p]);v.add(d);try{let i=(c,h=0)=>ce(d,c,h,v);if(f==="variable/get"){let c=D(A,"variable")??D(A,"id");return typeof c=="number"||typeof c=="string"?W(u.get(c)):void 0}if(f==="pointer/get"){let c=ve(d,A,v);return c?xe(c):void 0}if(f.startsWith("math/")){let c=f.slice(5);if(c in Ke)return St(i("a"),Ke[c]);if(c in Ze){let h=/^(mul|div|rem|mod|pow)$/.test(c)?1:0;return Pe(i("a",c==="mul"?1:0),i("b",h),Ze[c])}if(c==="pi")return Math.PI;if(c==="e")return Math.E;if(c==="random")return Math.random();if(c==="clamp")return Pe(Pe(i("a"),i("b",i("min",0)),Math.max),i("c",i("max",1)),Math.min);if(c==="mix"||c==="quatSlerp")return Je(i("a",0),i("b",1),T(i("c",i("t",.5)),.5),c==="quatSlerp");if(c==="dot"){let h=i("a"),P=i("b");return Array.isArray(h)&&Array.isArray(P)?h.reduce((V,k,M)=>V+(k||0)*(P[M]||0),0):T(h)*T(P)}if(c==="cross"){let h=i("a",[0,0,0]),P=i("b",[0,0,0]);return Array.isArray(h)&&Array.isArray(P)?[(h[1]||0)*(P[2]||0)-(h[2]||0)*(P[1]||0),(h[2]||0)*(P[0]||0)-(h[0]||0)*(P[2]||0),(h[0]||0)*(P[1]||0)-(h[1]||0)*(P[0]||0)]:[0,0,0]}if(c==="length"){let h=i("a");return Array.isArray(h)?Math.hypot(...h):Math.abs(T(h))}if(c==="distance"){let h=i("a"),P=i("b");return Array.isArray(h)&&Array.isArray(P)?Math.hypot(...h.map((V,k)=>(V||0)-(P[k]||0))):Math.abs(T(h)-T(P))}if(c==="normalize"){let h=i("a");if(!Array.isArray(h))return T(h)>=0?1:-1;let P=Math.hypot(...h);return P>1e-8?h.map(V=>V/P):h.map(()=>0)}if(c.startsWith("combine"))return["a","b","c","d"].slice(0,Number(c[7])||2).map(h=>T(i(h)));if(c.startsWith("extract")){let h=i("a");return Array.isArray(h)?h[p==="0"||p==="x"?0:p==="1"||p==="y"?1:p==="2"||p==="z"?2:3]??0:0}if(c==="eq")return et(i("a"),i("b"));if(c==="ne")return!et(i("a"),i("b"));if(c==="lt")return T(i("a"))<T(i("b"));if(c==="le")return T(i("a"))<=T(i("b"));if(c==="gt")return T(i("a"))>T(i("b"));if(c==="ge")return T(i("a"))>=T(i("b"));if(c==="isNaN")return Number.isNaN(Number(i("a")));if(c==="isInf"){let h=Number(i("a"));return!Number.isFinite(h)&&!Number.isNaN(h)}return c==="and"?X(i("a",!1))&&X(i("b",!1)):c==="or"?X(i("a",!1))||X(i("b",!1)):c==="xor"?X(i("a",!1))!==X(i("b",!1)):c==="not"?!X(i("a",!1)):c==="select"?W(X(i("condition",!1))?i("a"):i("b")):void 0}return f==="type/boolToInt"||f==="type/boolToFloat"?X(i("a",!1))?1:0:f==="type/intToBool"||f==="type/floatToBool"?T(i("a",0))!==0:f==="type/intToFloat"?T(i("a",0)):f==="type/floatToInt"?Math.trunc(T(i("a",0))):void 0}finally{v.delete(d)}},le=()=>{if(N){N=!1,H=!0;let d=Re(n);if(t){t.worldMatrices=d;for(let p of t.meshes||[])p.nodeIndex>=0&&p.nodeIndex<d.length&&(p.transform.set(d[p.nodeIndex]),re(p.normalMatrix,p.transform))}}if(G){G=!1,H=!0;let d=n?.nodes;if(Array.isArray(t?.meshes)&&Array.isArray(d))for(let p of t.meshes){let v=!0;for(let A=p.nodeIndex,f=0;A!==void 0&&A>=0&&f<128;A=R.get(A),f++){let i=d[A];if(i?.visible===!1||i?.extensions?.KHR_node_visibility?.visible===!1){v=!1;break}}p.visible=v}}H&&(H=!1,t?.render?.())},ee=(d,p={steps:0})=>{if(!d||typeof d.node!="number")return;p.steps===0&&(F=0);let v=[d],A=f=>{v.length+p.steps<de&&v.push(f)};for(;v.length>0&&p.steps<de;){p.steps++;let f=v.shift();if(!f||f.node<0||f.node>=r.length)continue;let i=f.node,c=r[i];if(!c)continue;let h=f.socket||"in",P=O(c),V=(M,_=void 0)=>ce(i,M,_,new Set),k=(M="out")=>{let _=c.flows?.[M];_&&A(_)};switch(P){case"flow/branch":k(X(V("condition",!1))?"true":"false");break;case"flow/sequence":for(let M of Object.keys(c.flows||{}).sort((_,B)=>Number(_)-Number(B)||_.localeCompare(B)))k(M);break;case"flow/switch":{let M=c.flows?.[String(V("selection",V("value",0)))]??c.flows?.default;M&&A(M);break}case"flow/for":{let M=Math.trunc(T(V("startIndex",0))),_=Math.trunc(T(V("endIndex",0))),B=Math.max(1,Math.trunc(T(V("step",1),1))),$=c.flows?.body;if($&&_>M&&L<Rt){let ct=Math.min(Math.ceil((_-M)/B),de);L++;try{for(let Ae=0;Ae<ct&&p.steps<de;Ae++)U(i,"index",M+Ae*B),ee($,p)}finally{L--}}let ze=c.flows?.completed??c.flows?.out;ze&&A(ze);break}case"flow/doN":{let M=h==="reset"?0:(o.get(i)||0)+1;if(o.set(i,M),U(i,"currentCount",M),U(i,"count",M),h!=="reset"){let _=Math.trunc(T(V("n",D(c,"stopIterations")??D(c,"n")??1),1));M<=_&&k()}break}case"flow/multiGate":{if(h==="reset"){w.set(i,0);break}let M=Object.keys(c.flows||{}).sort();if(!M.length)break;let _=D(c,"isRandom")?Math.floor(Math.random()*M.length):w.get(i)||0;_<M.length&&(k(M[_]),w.set(i,D(c,"isLoop")!==!1?(_+1)%M.length:_+1));break}case"flow/waitAll":{if(h==="reset"){b.delete(i);break}let M=b.get(i);M||b.set(i,M=new Set),M.add(h),M.size>=Math.max(1,Math.trunc(Number(D(c,"inputFlows")??2)||2))&&(M.clear(),k("out"),k("completed"));break}case"flow/throttle":{if(h==="reset"){S.delete(i);break}let M=Math.max(0,T(V("duration",0))),_=S.get(i);_===void 0||C-_>=M?(S.set(i,C),U(i,"lastRemainingTime",0),k()):U(i,"lastRemainingTime",Math.max(0,M-(C-_)));break}case"flow/delay":case"flow/setDelay":{if(h==="cancel"){for(let $=x.length-1;$>=0;$--)x[$].nodeIdx===i&&x.splice($,1);U(i,"lastDelayIndex",-1);break}let M=Math.max(0,T(V("duration",D(c,"duration")??0))),_=c.flows?.done??c.flows?.out;if(M<=0){U(i,"lastDelayIndex",-1),_&&A(_);break}x.length>=At&&x.shift();let B=I++;U(i,"lastDelayIndex",B),x.push({id:B,nodeIdx:i,rem:M,done:_}),P==="flow/setDelay"&&c.flows?.out&&c.flows?.done&&k("out");break}case"flow/cancelDelay":{let M=Math.trunc(T(V("delayIndex",-1),-1));if(M<0)x.length=0;else for(let _=x.length-1;_>=0;_--)x[_].id===M&&x.splice(_,1);k();break}case"variable/set":K(D(c,"variable")??D(c,"id"),V("value")),k();break;case"variable/interpolate":{let M=D(c,"variable")??D(c,"id"),_=V("value",V("target")),B=Math.max(0,T(V("duration",D(c,"duration")??.3),.3));M!==void 0&&_!==void 0&&Ue({key:`var:${String(M)}`,varKey:M,from:W(V("from")??u.get(M)??0),to:W(_),dur:B,elapsed:0,quat:!1,linear:D(c,"easing")==="linear",done:c.flows?.done}),k();break}case"pointer/set":{let M=ve(i,c),_=V("value");M&&_!==void 0&&(z(`ptr:${M}`),se(M,_)),k();break}case"pointer/interpolate":{let M=ve(i,c),_=V("value",V("target")),B=Math.max(0,T(V("duration",D(c,"duration")??.3),.3));if(M&&_!==void 0){let $=V("from")??xe(M);$!==void 0&&(B<=0?(se(M,_),k("done")):Ue({key:`ptr:${M}`,ptr:M,from:W($),to:W(_),dur:B,elapsed:0,quat:M.endsWith("/rotation"),linear:D(c,"easing")==="linear",done:c.flows?.done}))}k();break}case"animation/start":{let M=V("animation")??D(c,"animation")??D(c,"clipName"),_=typeof M=="number"?t?.animations?.[M]?.name??n?.animations?.[M]?.name:typeof M=="string"?M:void 0;t?.playAnimation?.(_),H=!0,k();break}case"animation/stop":case"animation/resetAt":t?.pauseAnimation?.(),P==="animation/resetAt"&&t?.evaluateAnimation?.(T(V("time",0))),H=!0,k();break;case"event/send":case"customEvent/send":{let M=q(D(c,"event")??D(c,"id")),_={};for(let B of Object.keys(c.values||{}))Y.has(B)||(_[B]=V(B));M&&(typeof CustomEvent<"u"&&typeof t?.container?.dispatchEvent=="function"&&t.container.dispatchEvent(new CustomEvent("interactivityEvent",{bubbles:!0,composed:!0,detail:{id:M,values:_}})),He(M,_,p)),k();break}default:k();break}}};this.readScenePointer=xe,this.writeScenePointer=se,this.fireOnStart=()=>{r.forEach(d=>{O(d)==="event/onStart"&&ee(d.flows?.out)}),le()},this.fireOnSelect=d=>{if(!d)return;let p=typeof d.meshIndex=="number"?d.meshIndex:-1,v=typeof d.nodeIndex=="number"?d.nodeIndex:t?.meshes?.[p]?.nodeIndex??-1;r.forEach((A,f)=>{if(!/^(pointer|event|scene)\/onSelect$/.test(O(A)))return;let i=D(A,"nodeIndex")??D(A,"node")??ce(f,"nodeIndex",void 0,new Set),c=D(A,"meshName");if(typeof c=="string"&&c?d.meshName===c:i==null||Number(i)<0||Number.isNaN(Number(i))||Z(v,Math.trunc(Number(i)))){if(U(f,"nodeIndex",v),U(f,"meshIndex",p),Array.isArray(d.hitPoint)){let P=[T(d.hitPoint[0]),T(d.hitPoint[1]),T(d.hitPoint[2])];U(f,"hitPoint",P),U(f,"point",P),U(f,"intersectionPoint",P)}if(Array.isArray(d.normal)){let P=[T(d.normal[0]),T(d.normal[1],1),T(d.normal[2])];U(f,"normal",P),U(f,"hitNormal",P)}typeof d.distance=="number"&&U(f,"distance",d.distance),ee(A.flows?.out)}}),le()},this.receiveCustomEvent=(d,p={})=>He(d,p,{steps:0});function He(d,p,v){if(!(E>=Tt)){E++;try{let A=q(d);r.forEach((f,i)=>{if(!/^(customE|e)vent\/receive$/.test(O(f)))return;let c=D(f,"event")??D(f,"id");if(!(q(c)!==A&&String(c)!==String(d))){for(let[h,P]of Object.entries(p))Y.has(h)||U(i,h,W(P));ee(f.flows?.out,v)}}),le()}finally{E--}}}this.tick=d=>{if(!Number.isFinite(d)||d<0)return;let p=Math.min(d,.25);C+=p,r.forEach((A,f)=>{O(A)==="event/onTick"&&(U(f,"timeDelta",p),U(f,"dt",p),U(f,"timeElapsed",C),ee(A.flows?.out))});let v=[];for(let A=g.length-1;A>=0;A--){let f=g[A];f.elapsed+=p;let i=f.dur>1e-6?J(f.elapsed/f.dur):1,c=f.linear?i:i*i*(3-2*i),h=Je(f.from,f.to,c,f.quat);f.ptr?se(f.ptr,h):f.varKey!==void 0&&K(f.varKey,h),i>=1&&(g.splice(A,1),f.done&&v.push(f.done))}for(let A=x.length-1;A>=0;A--){let f=x[A];f.rem-=p,f.rem<=0&&(x.splice(A,1),f.done&&v.push(f.done))}for(let A of v)ee(A);le()},this.dispose=()=>{g.length=0,x.length=0,u.clear(),m.clear(),o.clear(),b.clear(),S.clear(),w.clear()}}},j=new WeakMap,ye=new WeakMap;function wt(e,t){if(!e||typeof e!="object"||!Number.isFinite(t)||t<=0||Be().some(l=>l.name==="xr-live-head-follow"))return;let n=e.gltf,a=n?.nodes;if(!Array.isArray(a)||a.length===0)return;let r=Math.min(t,.1),s=(ye.get(e)||0)+r,y=!1;for(let l=0;l<a.length;l++){let u=a[l],m=je(u?.extras?.xr?.orbit);if(!m)continue;let o=0,b=0,S=0;if(Array.isArray(m.target))o=m.target[0],b=m.target[1],S=m.target[2];else if(typeof m.target=="string"&&m.target!=="head"){let I=a.find(C=>C?.name===m.target);Array.isArray(I?.translation)&&(o=T(I.translation[0]),b=T(I.translation[1]),S=T(I.translation[2]))}let w=m.phase+m.speed*s,g=o+Math.cos(w)*m.radius,x=b+m.height,R=S+Math.sin(w)*m.radius;if(u.translation=[g,x,R],m.faceCenter){let I=Math.atan2(o-g,S-R);u.rotation=[0,Math.sin(I*.5),0,Math.cos(I*.5)]}y=!0}if(y){ye.set(e,s);let l=Re(n);e.worldMatrices=l;for(let u of e.meshes||[])u.nodeIndex>=0&&u.nodeIndex<l.length&&(u.transform.set(l[u.nodeIndex]),re(u.normalMatrix,u.transform))}}function he(e){if(!(!e||typeof e!="object"))return j.get(e)||j.get(e.viewer)||j.get(e._view)}function Le(e,t,n){let a=he(e);return a?(a.receiveCustomEvent(t,n),!0):!1}var Ce={name:"khr-interactivity",sendInteractivityEvent:Le,getInteractivityVM:he,onLoadModel(e,t){if(!e||typeof e!="object")return;j.get(e)?.dispose(),j.delete(e),ye.delete(e);let n=t?.extensions?.KHR_interactivity,a=Array.isArray(n?.graphs)?n.graphs[n.graph??0]:n;if(!a||!Array.isArray(a.nodes))return;let r=new ae(e,t,a);j.set(e,r),r.fireOnStart()},onMeshSelect(e,t){j.get(e)?.fireOnSelect(t)},onUpdate(e,t){j.get(e)?.tick(t),wt(e,t)},onDestroy(e,t){j.get(t)?.dispose(),j.delete(t),ye.delete(t)}};var ie=new Map,Ve=new WeakMap;function nt(e,t){ie.set(e,t)}var Ne={name:"materials",onBuildPrimitiveVAO(e,t,n,a,r){return(((a?.materials&&n.material!==void 0?a.materials[n.material]:null)?.extensions||{}).KHR_materials_transmission?.transmissionFactor??0)>0?{isTransmissive:!0}:null},onBeforeTransmissivePass(e,t){let n=Ve.get(e);n||(n=e.createTexture(),Ve.set(e,n));let a=Math.max(1,t.canvas.width),r=Math.max(1,t.canvas.height);e.activeTexture(33990),e.bindTexture(3553,n),e.copyTexImage2D(3553,0,6408,0,0,a,r,0),e.texParameteri(3553,10242,33071),e.texParameteri(3553,10243,33071),e.texParameteri(3553,10241,9987),e.texParameteri(3553,10240,9729),e.generateMipmap(3553)},onResolveShader(e,t,n,a){if(!t)return null;if(t.name&&ie.has(t.name)){let g=ie.get(t.name);return{vs:g.vs||n,fs:g.fs||a}}let r=t.extensions||{},s=r.KHR_materials_clearcoat,y=r.KHR_materials_sheen,l=!!r.KHR_materials_transmission,u=!!r.KHR_materials_ior,m=r.KHR_materials_iridescence;if(!s&&!y&&!r.KHR_materials_unlit&&!l&&!r.KHR_materials_volume&&!u&&!r.KHR_materials_dispersion&&!m)return null;if(r.KHR_materials_unlit)return{vs:n,fs:a.replace("fragColor=vec4(color,outAlpha);","fragColor=vec4(base.rgb,outAlpha);").replace("fragColor=vec4(color,base.a);","fragColor=vec4(base.rgb,base.a);")};let o=a;l&&(o=o.replace("out vec4 fragColor;",`uniform sampler2D uTransmissionTex;
|
|
33
|
-
uniform
|
|
34
|
-
out vec4 fragColor;`)
|
|
35
|
-
vec2 sUV=gl_FragCoord.xy/max(uViewportSize,vec2(1.));float iorB=${
|
|
32
|
+
}`),{vs:n,fs:o}},onBeforeDrawPrimitive(e,t,n,r,o,s){let x=Re.get(e),p=e.getUniformLocation(t,"uHasSH");if(x&&x.length>=27){p&&e.uniform1i(p,1);let f=e.getUniformLocation(t,"uSH");f&&e.uniform3fv(f,x)}else p&&e.uniform1i(p,0)},onAttributeChanged(e,t,n,r){t==="environment-image"&&e.viewer?this.setEnvironmentImage?.(e.viewer,r):t==="skybox-image"&&e.viewer&&this.setSkyboxImage?.(e.viewer,r)}};var we=new WeakMap;function Ie(e,t){let n=t||e.viewer;if(!n||typeof n.projectPointToScreen!="function")return;let r=e.mockHotspots||e.querySelectorAll('[slot^="hotspot-"], [data-position]');for(let o=0;o<r.length;o++){let s=r[o],x=s.getAttribute("data-position");if(!x)continue;let p=x.trim().split(/\s+/).map(M=>parseFloat(M.replace(/m$/,"")));if(p.length<3||p.some(isNaN))continue;let f=s.getAttribute("data-normal"),d;if(f){let M=f.trim().split(/\s+/).map(S=>parseFloat(S));M.length>=3&&!M.some(isNaN)&&(d=[M[0],M[1],M[2]])}let m=n.projectPointToScreen([p[0],p[1],p[2]],d);s.style.position="absolute",s.style.left="0",s.style.top="0",s.style.transform=`translate(-50%, -50%) translate3d(${m.x}px, ${m.y}px, 0)`,s.style.zIndex="3",m.visible?(s.style.opacity="1",s.style.pointerEvents="auto",s.removeAttribute("data-occluded")):(s.style.opacity="0",s.style.pointerEvents="none",s.setAttribute("data-occluded",""))}}var Ee={name:"hotspots",updateHotspotsForElement:Ie,onElementConnected(e){if(typeof MutationObserver>"u"||!e)return;let t=new MutationObserver(()=>{Ie(e)});t.observe(e,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["data-position","data-normal"]}),we.set(e,t)},onCameraChange(e,t){t&&Ie(t,e)},onElementDisconnected(e){let t=we.get(e);t&&(t.disconnect(),we.delete(e))}};function ue(e,t,n,r){let o=typeof e=="number"&&Number.isFinite(e)?e:r;return Math.max(t,Math.min(n,o))}function ht(e){return Array.isArray(e)&&e.length>=3&&Number.isFinite(e[0])&&Number.isFinite(e[1])&&Number.isFinite(e[2])}function gt(e){return e&&typeof e=="object"&&!Array.isArray(e)?e:null}function qe(e){let t=gt(e);if(!t)return null;let n=t.target;return{target:ht(n)?[n[0],n[1],n[2]]:typeof n=="string"&&n.length>0&&n.length<=256?n:[0,0,0],radius:ue(t.radius,.01,50,.5),speed:ue(t.speed,-20,20,.5),height:ue(t.height,-10,10,0),phase:ue(t.phase,-1e6,1e6,0),faceCenter:t.faceCenter===!0}}function Ke(e,t,n,r){let o=t[0],s=t[1],x=t[2],p=t[3],f=n[0],d=n[1],m=n[2],M=n[3],S=o*f+s*d+x*m+p*M;if(S<0&&(f=-f,d=-d,m=-m,M=-M,S=-S),Math.abs(S)>=1)return e[0]=o,e[1]=s,e[2]=x,e[3]=p,e;let F=Math.acos(S),v=Math.sqrt(1-S*S);if(Math.abs(v)<.001)return e[0]=.5*(o+f),e[1]=.5*(s+d),e[2]=.5*(x+m),e[3]=.5*(p+M),e;let y=Math.sin((1-r)*F)/v,R=Math.sin(r*F)/v;return e[0]=o*y+f*R,e[1]=s*y+d*R,e[2]=x*y+m*R,e[3]=p*y+M*R,e}var Ye=1024,_e=256,fe=2048,xt=128,vt=64,At=16,Mt=1e4,Tt=8,K=new Set(["__proto__","constructor","prototype"]),Ze={neg:e=>-e,abs:Math.abs,sign:Math.sign,floor:Math.floor,ceil:Math.ceil,round:Math.round,trunc:Math.trunc,fract:e=>e-Math.floor(e),sqrt:e=>Math.sqrt(Math.max(0,e)),cbrt:Math.cbrt,exp:Math.exp,log:e=>e>0?Math.log(e):0,sin:Math.sin,cos:Math.cos,tan:Math.tan,asin:e=>Math.asin(Math.max(-1,Math.min(1,e))),acos:e=>Math.acos(Math.max(-1,Math.min(1,e))),atan:Math.atan,rad:e=>e*Math.PI/180,deg:e=>e*180/Math.PI,saturate:e=>Math.max(0,Math.min(1,e))},Qe={add:(e,t)=>e+t,sub:(e,t)=>e-t,mul:(e,t)=>e*t,div:(e,t)=>Math.abs(t)<1e-12?0:e/t,rem:(e,t)=>Math.abs(t)<1e-12?0:e%t,mod:(e,t)=>Math.abs(t)<1e-12?0:e%t,min:Math.min,max:Math.max,pow:Math.pow,atan2:Math.atan2},me={translation:[0,0,0],rotation:[0,0,0,1],scale:[1,1,1]},de=(e,t)=>e!==null&&typeof e=="object"&&!K.has(t)&&Object.prototype.hasOwnProperty.call(e,t),G=e=>Array.isArray(e)?[...e]:e,nt=e=>e!==null&&typeof e=="object"&&!Array.isArray(e)&&de(e,"value")?e.value:e,U=(e,t)=>de(e.configuration,t)?nt(e.configuration[t]):void 0,A=(e,t=0)=>{let n=Number(e);return Number.isFinite(n)?n:t},J=e=>Math.max(0,Math.min(1,e)),X=e=>typeof e=="boolean"?e:typeof e=="number"?e!==0&&!Number.isNaN(e):typeof e=="string"?e.length>0&&e!=="false":!!e;function ne(e){if(typeof e!="string"||!e.startsWith("/"))return null;let t=[];for(let n of e.slice(1).split("/")){let r=n.replace(/~1/g,"/").replace(/~0/g,"~");if(!r||K.has(r)||K.has(n))return null;t.push(r)}return{segments:t}}var te=(e,t)=>{if(e===void 0||!/^\d+$/.test(e))return-1;let n=Number(e);return Number.isSafeInteger(n)&&n>=0&&n<t?n:-1},Je=e=>{let t=A(e[0]),n=A(e[1]),r=A(e[2]),o=A(e[3],1),s=Math.hypot(t,n,r,o);return s>1e-8?[t/s,n/s,r/s,o/s]:[0,0,0,1]},et=(e,t,n,r)=>{if(typeof e=="number"&&typeof t=="number")return e+(t-e)*n;if(Array.isArray(e)&&Array.isArray(t)){if(r&&e.length===4&&t.length===4){let o=[0,0,0,1];return Ke(o,Je(e),Je(t),n),o}return e.slice(0,t.length).map((o,s)=>o+(t[s]-o)*n)}return n>=.5?t:e},Fe=(e,t,n)=>Array.isArray(e)&&Array.isArray(t)?e.slice(0,t.length).map((r,o)=>n(A(r),A(t[o]))):Array.isArray(e)?e.map(r=>n(A(r),A(t))):Array.isArray(t)?t.map(r=>n(A(e),A(r))):n(A(e),A(t)),Rt=(e,t)=>Array.isArray(e)?e.map(n=>t(A(n))):t(A(e)),tt=(e,t)=>Array.isArray(e)&&Array.isArray(t)?e.length===t.length&&e.every((n,r)=>Math.abs(n-t[r])<=1e-6):e===t,re=class{constructor(t,n,r){let o=Array.isArray(r.nodes)?r.nodes:[];if(o.length>Ye)throw new Error(`SecurityError: Exceeds MAX_GRAPH_NODES (${Ye})`);let s=Array.isArray(r.variables)?r.variables:[];if(s.length>_e)throw new Error(`SecurityError: Exceeds MAX_VARIABLES (${_e})`);let x=Array.isArray(r.declarations)?r.declarations:[],p=Array.isArray(r.events)?r.events:[],f=new Map,d=new Map,m=new Map,M=new Map,S=new Map,F=new Map,v=[],y=[],R=new Map,V=1,N=0,E=0,w=0,I=0,P=!1,O=!1,H=!1;s.forEach((l,u)=>{if(!l||typeof l!="object")return;let h=G(nt(l.value));f.set(u,h);let g=l.id??l.name;typeof g=="string"&&g&&!K.has(g)&&f.set(g,h)}),(n?.nodes||[]).forEach((l,u)=>{for(let h of l?.children||[])typeof h=="number"&&R.set(h,u)});let B=l=>l.op||typeof l.declaration=="number"&&x[l.declaration]?.op||"",k=(l,u,h)=>{if(K.has(u))return;let g=d.get(l);g||d.set(l,g=Object.create(null)),g[u]=h},Y=(l,u)=>{if(typeof l!="number"&&typeof l!="string"||typeof l=="string"&&K.has(l)||!f.has(l)&&f.size>=_e*2)return;let h=G(u);if(f.set(l,h),typeof l=="number"){let g=s[l]?.id??s[l]?.name;typeof g=="string"&&!K.has(g)&&f.set(g,h)}},q=l=>typeof l=="number"?p[l]?.id??String(l):typeof l=="string"?/^\d+$/.test(l)&&p[Number(l)]?.id?p[Number(l)].id:l:"",Z=(l,u)=>{for(let h=l,g=0;h!==void 0&&h>=0&&g<128;h=R.get(h),g++)if(h===u)return!0;return!1},z=l=>{for(let u=v.length-1;u>=0;u--)v[u].key===l&&v.splice(u,1)},Ue=l=>{z(l.key),v.length>=xt&&v.shift(),v.push(l)},he=l=>{let u=ne(l)?.segments;if(u){if(u[0]==="nodes"&&Array.isArray(n?.nodes)){let h=n.nodes[te(u[1],n.nodes.length)];if(!h)return;let g=u[2];if(g in me){let c=me[g],a=h[g]||c;return c.map((i,b)=>A(a[b],i))}if(g==="weights"){let c=Array.isArray(h.weights)?h.weights:[0],a=u.length===4?te(u[3],64):-2;return a===-2?c.map(i=>A(i)):a>=0?A(c[a]):void 0}if(g==="visible"||g==="extensions"&&u[3]==="KHR_node_visibility"&&u[4]==="visible")return h.extensions?.KHR_node_visibility?.visible??h.visible??!0}else if(u[0]==="materials"&&Array.isArray(n?.materials)){let h=n.materials[te(u[1],n.materials.length)];if(!h)return;let g=h.pbrMetallicRoughness||{};if(u[2]==="pbrMetallicRoughness"){if(u[3]==="baseColorFactor"){let c=g.baseColorFactor||[1,1,1,1];return[A(c[0],1),A(c[1],1),A(c[2],1),A(c[3],1)]}if(u[3]==="metallicFactor"||u[3]==="roughnessFactor")return A(g[u[3]],1)}if(u[2]==="emissiveFactor"){let c=h.emissiveFactor||[0,0,0];return[A(c[0]),A(c[1]),A(c[2])]}if(u[2]==="alphaCutoff")return A(h.alphaCutoff,.5)}}},ae=(l,u)=>{let h=ne(l)?.segments;if(!h)return!1;if(h[0]==="nodes"&&Array.isArray(n?.nodes)){let g=te(h[1],n.nodes.length),c=n.nodes[g];if(!c)return!1;let a=h[2];if(a in me&&Array.isArray(u)){let i=me[a];if(u.length<i.length)return!1;let b=i.map((C,D)=>A(u[D],C));if(a==="rotation"){let C=Math.hypot(...b);b=C>1e-8?b.map(D=>D/C):[0,0,0,1]}c[a]=b,delete c.matrix;let L=t?.initialNodeTransforms?.[g];return L&&(L[a[0]]=[...b]),P=!0,!0}if(a==="weights"){Array.isArray(c.weights)||(c.weights=[]);let i=(b,L)=>{for(let C of t?.meshes||[])if(C.nodeIndex===g)for(let D of C.primitives||[])D.pluginData?.morph?.weights&&(D.pluginData.morph.weights[b]=L)};if(h.length===4){let b=te(h[3],64);if(b<0)return!1;i(b,c.weights[b]=A(u))}else if(Array.isArray(u))c.weights=u.slice(0,64).map(b=>A(b)),c.weights.forEach((b,L)=>i(L,b));else return!1;return H=!0,!0}if(a==="visible"||a==="extensions"&&h[3]==="KHR_node_visibility"&&h[4]==="visible"){let i=X(u);return c.visible=i,(!c.extensions||typeof c.extensions!="object")&&(c.extensions={}),c.extensions.KHR_node_visibility={visible:i},O=!0,!0}}else if(h[0]==="materials"&&Array.isArray(n?.materials)){let g=te(h[1],n.materials.length),c=n.materials[g];if(!c)return!1;let a=c.pbrMetallicRoughness||(c.pbrMetallicRoughness={}),i=b=>{for(let L of t?.meshes||[])for(let C of L.primitives||[])(C.materialIndex??0)===g&&b(C)};if(h[2]==="pbrMetallicRoughness"){if(h[3]==="baseColorFactor"&&Array.isArray(u)&&u.length>=3){let b=[J(A(u[0],1)),J(A(u[1],1)),J(A(u[2],1)),u[3]!==void 0?J(A(u[3],1)):a.baseColorFactor?.[3]??1];return a.baseColorFactor=b,i(L=>L.baseColor=[...b]),H=!0}if(h[3]==="metallicFactor"||h[3]==="roughnessFactor"){let b=h[3]==="metallicFactor",L=J(A(u,b?0:.5));return a[h[3]]=L,i(C=>C[b?"metallic":"roughness"]=L),H=!0}}if(h[2]==="emissiveFactor"&&Array.isArray(u)&&u.length>=3)return c.emissiveFactor=[0,1,2].map(b=>Math.max(0,A(u[b]))),H=!0;if(h[2]==="alphaCutoff")return c.alphaCutoff=J(A(u,.5)),H=!0}return!1},ge=(l,u,h=new Set)=>{let g=U(u,"pointer");if(typeof g!="string"||!g.startsWith("/"))return null;let c=g.replace(/\{([a-zA-Z0-9_]+)\}/g,(a,i)=>{let b=Math.trunc(Number(ie(l,i,void 0,h)??U(u,i)));return Number.isSafeInteger(b)&&b>=0?String(b):"-1"});return ne(c)?c:null},ie=(l,u,h,g)=>{let c=o[l]?.values;if(!de(c,u))return h;let a=c[u];if(a==null)return h;if(typeof a!="object"||Array.isArray(a))return G(a);let i=a;return typeof i.node=="number"?it(i.node,i.socket||"value",g):de(i,"value")?G(i.value):h},it=(l,u,h)=>{if(l<0||l>=o.length||h.has(l)||h.size>128||++w>Mt)return;let g=o[l],c=B(g);if(/^(event\/|pointer\/on|scene\/on|flow\/)/.test(c))return G(d.get(l)?.[u]);h.add(l);try{let a=(i,b=0)=>ie(l,i,b,h);if(c==="variable/get"){let i=U(g,"variable")??U(g,"id");return typeof i=="number"||typeof i=="string"?G(f.get(i)):void 0}if(c==="pointer/get"){let i=ge(l,g,h);return i?he(i):void 0}if(c.startsWith("math/")){let i=c.slice(5);if(i in Ze)return Rt(a("a"),Ze[i]);if(i in Qe){let b=/^(mul|div|rem|mod|pow)$/.test(i)?1:0;return Fe(a("a",i==="mul"?1:0),a("b",b),Qe[i])}if(i==="pi")return Math.PI;if(i==="e")return Math.E;if(i==="random")return Math.random();if(i==="clamp")return Fe(Fe(a("a"),a("b",a("min",0)),Math.max),a("c",a("max",1)),Math.min);if(i==="mix"||i==="quatSlerp")return et(a("a",0),a("b",1),A(a("c",a("t",.5)),.5),i==="quatSlerp");if(i==="dot"){let b=a("a"),L=a("b");return Array.isArray(b)&&Array.isArray(L)?b.reduce((C,D,T)=>C+(D||0)*(L[T]||0),0):A(b)*A(L)}if(i==="cross"){let b=a("a",[0,0,0]),L=a("b",[0,0,0]);return Array.isArray(b)&&Array.isArray(L)?[(b[1]||0)*(L[2]||0)-(b[2]||0)*(L[1]||0),(b[2]||0)*(L[0]||0)-(b[0]||0)*(L[2]||0),(b[0]||0)*(L[1]||0)-(b[1]||0)*(L[0]||0)]:[0,0,0]}if(i==="length"){let b=a("a");return Array.isArray(b)?Math.hypot(...b):Math.abs(A(b))}if(i==="distance"){let b=a("a"),L=a("b");return Array.isArray(b)&&Array.isArray(L)?Math.hypot(...b.map((C,D)=>(C||0)-(L[D]||0))):Math.abs(A(b)-A(L))}if(i==="normalize"){let b=a("a");if(!Array.isArray(b))return A(b)>=0?1:-1;let L=Math.hypot(...b);return L>1e-8?b.map(C=>C/L):b.map(()=>0)}if(i.startsWith("combine"))return["a","b","c","d"].slice(0,Number(i[7])||2).map(b=>A(a(b)));if(i.startsWith("extract")){let b=a("a");return Array.isArray(b)?b[u==="0"||u==="x"?0:u==="1"||u==="y"?1:u==="2"||u==="z"?2:3]??0:0}if(i==="eq")return tt(a("a"),a("b"));if(i==="ne")return!tt(a("a"),a("b"));if(i==="lt")return A(a("a"))<A(a("b"));if(i==="le")return A(a("a"))<=A(a("b"));if(i==="gt")return A(a("a"))>A(a("b"));if(i==="ge")return A(a("a"))>=A(a("b"));if(i==="isNaN")return Number.isNaN(Number(a("a")));if(i==="isInf"){let b=Number(a("a"));return!Number.isFinite(b)&&!Number.isNaN(b)}return i==="and"?X(a("a",!1))&&X(a("b",!1)):i==="or"?X(a("a",!1))||X(a("b",!1)):i==="xor"?X(a("a",!1))!==X(a("b",!1)):i==="not"?!X(a("a",!1)):i==="select"?G(X(a("condition",!1))?a("a"):a("b")):void 0}return c==="type/boolToInt"||c==="type/boolToFloat"?X(a("a",!1))?1:0:c==="type/intToBool"||c==="type/floatToBool"?A(a("a",0))!==0:c==="type/intToFloat"?A(a("a",0)):c==="type/floatToInt"?Math.trunc(A(a("a",0))):void 0}finally{h.delete(l)}},se=()=>{if(P){P=!1,H=!0;let l=Te(n);if(t){t.worldMatrices=l;for(let u of t.meshes||[])u.nodeIndex>=0&&u.nodeIndex<l.length&&(u.transform.set(l[u.nodeIndex]),Me(u.normalMatrix,u.transform))}}if(O){O=!1,H=!0;let l=n?.nodes;if(Array.isArray(t?.meshes)&&Array.isArray(l))for(let u of t.meshes){let h=!0;for(let g=u.nodeIndex,c=0;g!==void 0&&g>=0&&c<128;g=R.get(g),c++){let a=l[g];if(a?.visible===!1||a?.extensions?.KHR_node_visibility?.visible===!1){h=!1;break}}u.visible=h}}H&&(H=!1,t?.render?.())},ee=(l,u={steps:0})=>{if(!l||typeof l.node!="number")return;u.steps===0&&(w=0);let h=[l],g=c=>{h.length+u.steps<fe&&h.push(c)};for(;h.length>0&&u.steps<fe;){u.steps++;let c=h.shift();if(!c||c.node<0||c.node>=o.length)continue;let a=c.node,i=o[a];if(!i)continue;let b=c.socket||"in",L=B(i),C=(T,_=void 0)=>ie(a,T,_,new Set),D=(T="out")=>{let _=i.flows?.[T];_&&g(_)};switch(L){case"flow/branch":D(X(C("condition",!1))?"true":"false");break;case"flow/sequence":for(let T of Object.keys(i.flows||{}).sort((_,W)=>Number(_)-Number(W)||_.localeCompare(W)))D(T);break;case"flow/switch":{let T=i.flows?.[String(C("selection",C("value",0)))]??i.flows?.default;T&&g(T);break}case"flow/for":{let T=Math.trunc(A(C("startIndex",0))),_=Math.trunc(A(C("endIndex",0))),W=Math.max(1,Math.trunc(A(C("step",1),1))),$=i.flows?.body;if($&&_>T&&I<Tt){let st=Math.min(Math.ceil((_-T)/W),fe);I++;try{for(let xe=0;xe<st&&u.steps<fe;xe++)k(a,"index",T+xe*W),ee($,u)}finally{I--}}let ze=i.flows?.completed??i.flows?.out;ze&&g(ze);break}case"flow/doN":{let T=b==="reset"?0:(m.get(a)||0)+1;if(m.set(a,T),k(a,"currentCount",T),k(a,"count",T),b!=="reset"){let _=Math.trunc(A(C("n",U(i,"stopIterations")??U(i,"n")??1),1));T<=_&&D()}break}case"flow/multiGate":{if(b==="reset"){F.set(a,0);break}let T=Object.keys(i.flows||{}).sort();if(!T.length)break;let _=U(i,"isRandom")?Math.floor(Math.random()*T.length):F.get(a)||0;_<T.length&&(D(T[_]),F.set(a,U(i,"isLoop")!==!1?(_+1)%T.length:_+1));break}case"flow/waitAll":{if(b==="reset"){M.delete(a);break}let T=M.get(a);T||M.set(a,T=new Set),T.add(b),T.size>=Math.max(1,Math.trunc(Number(U(i,"inputFlows")??2)||2))&&(T.clear(),D("out"),D("completed"));break}case"flow/throttle":{if(b==="reset"){S.delete(a);break}let T=Math.max(0,A(C("duration",0))),_=S.get(a);_===void 0||N-_>=T?(S.set(a,N),k(a,"lastRemainingTime",0),D()):k(a,"lastRemainingTime",Math.max(0,T-(N-_)));break}case"flow/delay":case"flow/setDelay":{if(b==="cancel"){for(let $=y.length-1;$>=0;$--)y[$].nodeIdx===a&&y.splice($,1);k(a,"lastDelayIndex",-1);break}let T=Math.max(0,A(C("duration",U(i,"duration")??0))),_=i.flows?.done??i.flows?.out;if(T<=0){k(a,"lastDelayIndex",-1),_&&g(_);break}y.length>=vt&&y.shift();let W=V++;k(a,"lastDelayIndex",W),y.push({id:W,nodeIdx:a,rem:T,done:_}),L==="flow/setDelay"&&i.flows?.out&&i.flows?.done&&D("out");break}case"flow/cancelDelay":{let T=Math.trunc(A(C("delayIndex",-1),-1));if(T<0)y.length=0;else for(let _=y.length-1;_>=0;_--)y[_].id===T&&y.splice(_,1);D();break}case"variable/set":Y(U(i,"variable")??U(i,"id"),C("value")),D();break;case"variable/interpolate":{let T=U(i,"variable")??U(i,"id"),_=C("value",C("target")),W=Math.max(0,A(C("duration",U(i,"duration")??.3),.3));T!==void 0&&_!==void 0&&Ue({key:`var:${String(T)}`,varKey:T,from:G(C("from")??f.get(T)??0),to:G(_),dur:W,elapsed:0,quat:!1,linear:U(i,"easing")==="linear",done:i.flows?.done}),D();break}case"pointer/set":{let T=ge(a,i),_=C("value");T&&_!==void 0&&(z(`ptr:${T}`),ae(T,_)),D();break}case"pointer/interpolate":{let T=ge(a,i),_=C("value",C("target")),W=Math.max(0,A(C("duration",U(i,"duration")??.3),.3));if(T&&_!==void 0){let $=C("from")??he(T);$!==void 0&&(W<=0?(ae(T,_),D("done")):Ue({key:`ptr:${T}`,ptr:T,from:G($),to:G(_),dur:W,elapsed:0,quat:T.endsWith("/rotation"),linear:U(i,"easing")==="linear",done:i.flows?.done}))}D();break}case"animation/start":{let T=C("animation")??U(i,"animation")??U(i,"clipName"),_=typeof T=="number"?t?.animations?.[T]?.name??n?.animations?.[T]?.name:typeof T=="string"?T:void 0;t?.playAnimation?.(_),H=!0,D();break}case"animation/stop":case"animation/resetAt":t?.pauseAnimation?.(),L==="animation/resetAt"&&t?.evaluateAnimation?.(A(C("time",0))),H=!0,D();break;case"event/send":case"customEvent/send":{let T=q(U(i,"event")??U(i,"id")),_={};for(let W of Object.keys(i.values||{}))K.has(W)||(_[W]=C(W));T&&(typeof CustomEvent<"u"&&typeof t?.container?.dispatchEvent=="function"&&t.container.dispatchEvent(new CustomEvent("interactivityEvent",{bubbles:!0,composed:!0,detail:{id:T,values:_}})),He(T,_,u)),D();break}default:D();break}}};this.readScenePointer=he,this.writeScenePointer=ae,this.fireOnStart=()=>{o.forEach(l=>{B(l)==="event/onStart"&&ee(l.flows?.out)}),se()},this.fireOnSelect=l=>{if(!l)return;let u=typeof l.meshIndex=="number"?l.meshIndex:-1,h=typeof l.nodeIndex=="number"?l.nodeIndex:t?.meshes?.[u]?.nodeIndex??-1;o.forEach((g,c)=>{if(!/^(pointer|event|scene)\/onSelect$/.test(B(g)))return;let a=U(g,"nodeIndex")??U(g,"node")??ie(c,"nodeIndex",void 0,new Set),i=U(g,"meshName");if(typeof i=="string"&&i?l.meshName===i:a==null||Number(a)<0||Number.isNaN(Number(a))||Z(h,Math.trunc(Number(a)))){if(k(c,"nodeIndex",h),k(c,"meshIndex",u),Array.isArray(l.hitPoint)){let L=[A(l.hitPoint[0]),A(l.hitPoint[1]),A(l.hitPoint[2])];k(c,"hitPoint",L),k(c,"point",L),k(c,"intersectionPoint",L)}if(Array.isArray(l.normal)){let L=[A(l.normal[0]),A(l.normal[1],1),A(l.normal[2])];k(c,"normal",L),k(c,"hitNormal",L)}typeof l.distance=="number"&&k(c,"distance",l.distance),ee(g.flows?.out)}}),se()},this.receiveCustomEvent=(l,u={})=>He(l,u,{steps:0});function He(l,u,h){if(!(E>=At)){E++;try{let g=q(l);o.forEach((c,a)=>{if(!/^(customE|e)vent\/receive$/.test(B(c)))return;let i=U(c,"event")??U(c,"id");if(!(q(i)!==g&&String(i)!==String(l))){for(let[b,L]of Object.entries(u))K.has(b)||k(a,b,G(L));ee(c.flows?.out,h)}}),se()}finally{E--}}}this.tick=l=>{if(!Number.isFinite(l)||l<0)return;let u=Math.min(l,.25);N+=u,o.forEach((g,c)=>{B(g)==="event/onTick"&&(k(c,"timeDelta",u),k(c,"dt",u),k(c,"timeElapsed",N),ee(g.flows?.out))});let h=[];for(let g=v.length-1;g>=0;g--){let c=v[g];c.elapsed+=u;let a=c.dur>1e-6?J(c.elapsed/c.dur):1,i=c.linear?a:a*a*(3-2*a),b=et(c.from,c.to,i,c.quat);c.ptr?ae(c.ptr,b):c.varKey!==void 0&&Y(c.varKey,b),a>=1&&(v.splice(g,1),c.done&&h.push(c.done))}for(let g=y.length-1;g>=0;g--){let c=y[g];c.rem-=u,c.rem<=0&&(y.splice(g,1),c.done&&h.push(c.done))}for(let g of h)ee(g);se()},this.dispose=()=>{v.length=0,y.length=0,f.clear(),d.clear(),m.clear(),M.clear(),S.clear(),F.clear()}}},j=new WeakMap,pe=new WeakMap;function St(e,t){if(!e||typeof e!="object"||!Number.isFinite(t)||t<=0||Be().some(p=>p.name==="xr-live-head-follow"))return;let n=e.gltf,r=n?.nodes;if(!Array.isArray(r)||r.length===0)return;let o=Math.min(t,.1),s=(pe.get(e)||0)+o,x=!1;for(let p=0;p<r.length;p++){let f=r[p],d=qe(f?.extras?.xr?.orbit);if(!d)continue;let m=0,M=0,S=0;if(Array.isArray(d.target))m=d.target[0],M=d.target[1],S=d.target[2];else if(typeof d.target=="string"&&d.target!=="head"){let V=r.find(N=>N?.name===d.target);Array.isArray(V?.translation)&&(m=A(V.translation[0]),M=A(V.translation[1]),S=A(V.translation[2]))}let F=d.phase+d.speed*s,v=m+Math.cos(F)*d.radius,y=M+d.height,R=S+Math.sin(F)*d.radius;if(f.translation=[v,y,R],d.faceCenter){let V=Math.atan2(m-v,S-R);f.rotation=[0,Math.sin(V*.5),0,Math.cos(V*.5)]}x=!0}if(x){pe.set(e,s);let p=Te(n);e.worldMatrices=p;for(let f of e.meshes||[])f.nodeIndex>=0&&f.nodeIndex<p.length&&(f.transform.set(p[f.nodeIndex]),Me(f.normalMatrix,f.transform))}}function be(e){if(!(!e||typeof e!="object"))return j.get(e)||j.get(e.viewer)||j.get(e._view)}function Pe(e,t,n){let r=be(e);return r?(r.receiveCustomEvent(t,n),!0):!1}var Le={name:"khr-interactivity",sendInteractivityEvent:Pe,getInteractivityVM:be,onLoadModel(e,t){if(!e||typeof e!="object")return;j.get(e)?.dispose(),j.delete(e),pe.delete(e);let n=t?.extensions?.KHR_interactivity,r=Array.isArray(n?.graphs)?n.graphs[n.graph??0]:n;if(!r||!Array.isArray(r.nodes))return;let o=new re(e,t,r);j.set(e,o),o.fireOnStart()},onMeshSelect(e,t){j.get(e)?.fireOnSelect(t)},onUpdate(e,t){j.get(e)?.tick(t),St(e,t)},onDestroy(e,t){j.get(t)?.dispose(),j.delete(t),pe.delete(t)}};var oe=new Map,Ce=new WeakMap;function rt(e,t){oe.set(e,t)}var Ve={name:"materials",onBuildPrimitiveVAO(e,t,n,r,o){return(((r?.materials&&n.material!==void 0?r.materials[n.material]:null)?.extensions||{}).KHR_materials_transmission?.transmissionFactor??0)>0?{isTransmissive:!0}:null},onBeforeTransmissivePass(e,t){let n=Ce.get(e);n||(n=e.createTexture(),Ce.set(e,n));let r=Math.max(1,t.canvas.width),o=Math.max(1,t.canvas.height);e.activeTexture(33990),e.bindTexture(3553,n),e.copyTexImage2D(3553,0,6408,0,0,r,o,0),e.texParameteri(3553,10242,33071),e.texParameteri(3553,10243,33071),e.texParameteri(3553,10241,9987),e.texParameteri(3553,10240,9729),e.generateMipmap(3553)},onResolveShader(e,t,n,r){if(!t)return null;if(t.name&&oe.has(t.name)){let v=oe.get(t.name);return{vs:v.vs||n,fs:v.fs||r}}let o=t.extensions||{},s=o.KHR_materials_clearcoat,x=o.KHR_materials_sheen,p=!!o.KHR_materials_transmission,f=!!o.KHR_materials_ior,d=o.KHR_materials_iridescence;if(!s&&!x&&!o.KHR_materials_unlit&&!p&&!o.KHR_materials_volume&&!f&&!o.KHR_materials_dispersion&&!d)return null;if(o.KHR_materials_unlit)return{vs:n,fs:r.replace("fragColor=vec4(color,outAlpha);","fragColor=vec4(base.rgb,outAlpha);").replace("fragColor=vec4(color,base.a);","fragColor=vec4(base.rgb,base.a);")};let m=r;if(p){let v=m.includes("uniform vec2 uViewportSize;")?"":`uniform vec2 uViewportSize;
|
|
33
|
+
`;m=m.replace("out vec4 fragColor;",`uniform sampler2D uTransmissionTex;
|
|
34
|
+
${v}out vec4 fragColor;`)}let M=(v,y,R=0,V=1e6,N=3)=>{let E=Number(v);return(Number.isFinite(E)?Math.min(V,Math.max(R,E)):y).toFixed(N)},S=Number(o.KHR_materials_ior?.ior??1.5),F=Number.isFinite(S)?Math.min(10,Math.max(1,S)):1.5;if(f){let v=Math.pow((F-1)/(F+1),2);m=m.replace("vec3 F0=mix(vec3(0.04),base.rgb,metallic);",`vec3 F0=mix(vec3(${M(v,.04,0,1,4)}),base.rgb,metallic);`)}if(d){let v=M(d.iridescenceFactor,1,0,1),y=M(d.iridescenceIor,1.3,1,10);m=m.replace("vec3 F=F_SchlickRoughness(F0,roughness,NoV);",`vec3 F=F_SchlickRoughness(F0,roughness,NoV);vec3 iridColor=.5+.5*cos(800.*${y}*NoV*vec3(.015,.018,.022));F=mix(F,iridColor,${v}*pow(1.-NoV,2.));`)}if(p){let v=M(o.KHR_materials_transmission?.transmissionFactor,1,0,1),y=o.KHR_materials_volume||{},R=M(y.thicknessFactor,.5,0,1e4),V=M(y.attenuationDistance,1,.001,1e6),N=Array.isArray(y.attenuationColor)?y.attenuationColor:[1,1,1],E=M(o.KHR_materials_dispersion?.dispersion,0,0,10);m=m.replace("vec3 diffuseIBL=kD*base.rgb*(uAmbientColor+envDiffuse*0.5)*occ;",`vec3 diffuseIBL=kD*base.rgb*(uAmbientColor+envDiffuse*0.5)*occ;
|
|
35
|
+
vec2 sUV=gl_FragCoord.xy/max(uViewportSize,vec2(1.));float iorB=${M(F,1.5,1,10)},dV=${E},tV=${R},lod=clamp(roughness*5.,0.,5.),sc=.06*(1.+tV);
|
|
36
36
|
vec3 refractedR=refract(-V,N,1./(iorB-.02*dV)),rG=refract(-V,N,1./iorB),refractedB=refract(-V,N,1./(iorB+.02*dV));
|
|
37
37
|
vec3 tr=vec3(textureLod(uTransmissionTex,clamp(sUV+refractedR.xy*sc,.001,.999),lod).r,textureLod(uTransmissionTex,clamp(sUV+rG.xy*sc,.001,.999),lod).g,textureLod(uTransmissionTex,clamp(sUV+refractedB.xy*sc,.001,.999),lod).b);
|
|
38
|
-
vec3 aCol=vec3(${
|
|
39
|
-
vec3 volumeAtten=exp(-tV*(vec3(1.)-aCol)/max(${
|
|
40
|
-
diffuseIBL=mix(diffuseIBL,tr*volumeAtten*base.rgb,${
|
|
41
|
-
layout(location=0) in vec3 aPosition;layout(location=1) in vec2 aUV;uniform mat4 uMVP;out vec2 vUV;void main(){vUV=aUV;gl_Position=uMVP*vec4(aPosition,1.);}`,
|
|
42
|
-
precision highp float;in vec2 vUV;uniform float uShadowIntensity,uShadowSoftness;out vec4 fragColor;void main(){vec2 p=(vUV-.5)*2.;float d=clamp(length(p),0.,1.);fragColor=vec4(0.,0.,0.,pow(1.-d*d,mix(1.2,2.8,uShadowSoftness))*smoothstep(1.,.85-uShadowSoftness*.6,d)*uShadowIntensity);}`,
|
|
38
|
+
vec3 aCol=vec3(${M(N[0],1,0,1)},${M(N[1],1,0,1)},${M(N[2],1,0,1)});
|
|
39
|
+
vec3 volumeAtten=exp(-tV*(vec3(1.)-aCol)/max(${V},.001));
|
|
40
|
+
diffuseIBL=mix(diffuseIBL,tr*volumeAtten*base.rgb,${v});`)}if(s&&!r.includes("uClearcoat")){let v=M(s.clearcoatFactor,1,0,1),y=M(s.clearcoatRoughnessFactor,0,0,1);m=m.replace("fragColor=vec4(color,base.a);",`vec3 ccF=F_SchlickRoughness(vec3(.04),${y},NoV)*${v};color=color*(vec3(1.)-ccF)+getStudioRadiance(R,${y})*ccF;fragColor=vec4(color,base.a);`)}if(x){let v=Array.isArray(x.sheenColorFactor)?x.sheenColorFactor:[1,1,1],y=`color+=vec3(${M(v[0],1,0,1)},${M(v[1],1,0,1)},${M(v[2],1,0,1)})*pow(1.-NoV,4.)*.5;`;m.includes("color=applyToneMapping(color,uToneMapping);")?m=m.replace("color=applyToneMapping(color,uToneMapping);",`${y}color=applyToneMapping(color,uToneMapping);`):m=m.replace("fragColor=vec4(color,base.a);",`${y}fragColor=vec4(color,base.a);`)}return{vs:n,fs:m}},onBeforeDrawPrimitive(e,t,n,r,o,s){let x=n.materialIndex;if(x!==void 0&&s?.materials){let p=s.materials[x];p?.name&&oe.has(p.name)&&oe.get(p.name).onBindUniforms?.(e,t,n)}if(n.isTransmissive){let p=Ce.get(e);if(p){e.activeTexture(33990),e.bindTexture(3553,p);let f=e.getUniformLocation(t,"uTransmissionTex");f&&e.uniform1i(f,6);let d=e.getUniformLocation(t,"uViewportSize");d&&e.uniform2f(d,e.drawingBufferWidth||1,e.drawingBufferHeight||1)}}}};var It=`#version 300 es
|
|
41
|
+
layout(location=0) in vec3 aPosition;layout(location=1) in vec2 aUV;uniform mat4 uMVP;out vec2 vUV;void main(){vUV=aUV;gl_Position=uMVP*vec4(aPosition,1.);}`,Et=`#version 300 es
|
|
42
|
+
precision highp float;in vec2 vUV;uniform float uShadowIntensity,uShadowSoftness;out vec4 fragColor;void main(){vec2 p=(vUV-.5)*2.;float d=clamp(length(p),0.,1.);fragColor=vec4(0.,0.,0.,pow(1.-d*d,mix(1.2,2.8,uShadowSoftness))*smoothstep(1.,.85-uShadowSoftness*.6,d)*uShadowIntensity);}`,ye=new WeakMap,ot=new Float32Array(20);function Ne(e,t){let[n,r,o,s,x,p]=t;return[e[0]*n+e[4]*r+e[8]*o+e[12],e[1]*n+e[5]*r+e[9]*o+e[13],e[2]*n+e[6]*r+e[10]*o+e[14],Math.abs(e[0])*s+Math.abs(e[4])*x+Math.abs(e[8])*p,Math.abs(e[1])*s+Math.abs(e[5])*x+Math.abs(e[9])*p,Math.abs(e[2])*s+Math.abs(e[6])*x+Math.abs(e[10])*p]}function _t(e){if(e._lb!==void 0)return e._lb;let t=1e9,n=1e9,r=1e9,o=-1e9,s=-1e9,x=-1e9;for(let p of e.primitives||[]){let f=p.positions;if(f)for(let d=0;d<f.length;d+=3)f[d]<t&&(t=f[d]),f[d+1]<n&&(n=f[d+1]),f[d+2]<r&&(r=f[d+2]),f[d]>o&&(o=f[d]),f[d+1]>s&&(s=f[d+1]),f[d+2]>x&&(x=f[d+2])}return e._lb=t<=o?[(t+o)*.5,(n+s)*.5,(r+x)*.5,(o-t)*.5,(s-n)*.5,(x-r)*.5]:null}function Ft(e){let t=ye.get(e);if(t)return t;let n=(p,f)=>{let d=e.createShader(p);return e.shaderSource(d,f),e.compileShader(d),d},r=e.createProgram();e.attachShader(r,n(35633,It)),e.attachShader(r,n(35632,Et)),e.linkProgram(r);let o=e.createVertexArray(),s=e.createBuffer(),x=e.createBuffer();return e.bindVertexArray(o),e.bindBuffer(34962,s),e.bufferData(34962,80,35048),e.enableVertexAttribArray(0),e.vertexAttribPointer(0,3,5126,!1,20,0),e.enableVertexAttribArray(1),e.vertexAttribPointer(1,2,5126,!1,20,12),e.bindBuffer(34963,x),e.bufferData(34963,new Uint16Array([0,1,2,0,2,3]),35044),e.bindVertexArray(null),t={prog:r,vao:o,vbo:s,ibo:x,uMVP:e.getUniformLocation(r,"uMVP"),uIntensity:e.getUniformLocation(r,"uShadowIntensity"),uSoftness:e.getUniformLocation(r,"uShadowSoftness")},ye.set(e,t),t}var ke={name:"contact-shadow",onAfterRender(e,t,n){let r=t.shadowIntensity;if(r<=0||!t.bounds)return;let o=Ft(e),s=!t.xrSessionActive&&(t.backdropMeshes?.length??0)>0,x=[],p=[];for(let y of t.meshes||[]){if(!y||y.visible===!1||y.isPluginMesh||y.name==="__xr_reticle__"||y.name?.startsWith("__xr_slot_"))continue;let R=_t(y);if(!R)continue;y.transform&&(R=Ne(y.transform,R)),t.modelRootMatrix&&(R=Ne(t.modelRootMatrix,R));let[V,N,E,w,I,P]=R,O=[V,E,w,P,N-I,N+I];/floor|table|pedestal|ground|base|plane/i.test(y.name||"")||I<.14&&Math.min(w,P)>.45?p.push(O):x.push(O)}let f=[],d=t.bounds.center||[0,0,0],m=Math.max(.05,Number(t.bounds.radius)||.5),M=t.bounds.min,S=M?[d[0],d[1],d[2],m,Math.max(.01,d[1]-M[1]),m]:[d[0],d[1],d[2],m,m,m];t.modelRootMatrix&&(S=Ne(t.modelRootMatrix,S));let v=t.xrSessionActive&&p.length===0&&String(t.container?.tagName||"").toLowerCase()==="xr-live"?(t.modelRootMatrix?t.modelRootMatrix[5]*-.25+t.modelRootMatrix[13]:-.25)+.002:S[1]-S[4]+.002;for(let[y,R,V,N,E]of x){let w=-1/0;for(let[P,O,H,B,,k]of p)E>=k-.08&&Math.abs(y-P)<=H&&Math.abs(R-O)<=B&&k+.002>w&&(w=k+.002);s&&(w=Math.max(w,y>=.04&&y<=.36&&R>=-.34&&R<=-.04&&E>=.01?.036:Math.hypot(y,R)<=.66&&E>=-.06?.003:-.477)),isFinite(w)||(w=v);let I=f.find(P=>Math.hypot(y-P[0],R-P[1])<.06&&Math.abs(w-P[5])<.05);I?(I[2]=Math.max(I[2],V*.78),I[3]=Math.max(I[3],N*.78),I[4]=Math.min(I[4],E)):f.push([y,R,V,N,E,w])}if(f.length===0){let y=Math.max(.1,S[3]*1.5)/1.45;f.push([S[0],S[2],y,y,v,v])}e.useProgram(o.prog),e.uniformMatrix4fv(o.uMVP,!1,n),e.enable(3042),(e.blendFuncSeparate||e.blendFunc).call(e,770,771,1,771),e.depthMask(!1),e.bindVertexArray(o.vao),e.bindBuffer(34962,o.vbo);for(let[y,R,V,N,E,w]of f){let I=Math.max(0,E-w),P=r/(1+I*2);if(P<.02)continue;let O=1+Math.min(.75,I*.85),H=Math.max(.045,V*1.45*O),B=Math.max(.045,N*1.45*O);ot.set([y-H,w,R-B,0,0,y+H,w,R-B,1,0,y+H,w,R+B,1,1,y-H,w,R+B,0,1]),e.bufferSubData(34962,0,ot),e.uniform1f(o.uIntensity,P),e.uniform1f(o.uSoftness,Math.min(1,t.shadowSoftness+Math.min(.45,I*.6))),e.drawElements(4,6,5123,0)}e.bindVertexArray(null),e.depthMask(!0),e.disable(3042)},onDestroy(e){let t=ye.get(e);t&&(e.deleteVertexArray(t.vao),e.deleteBuffer(t.vbo),e.deleteBuffer(t.ibo),e.deleteProgram(t.prog),ye.delete(e))}};var at=new WeakMap,De={name:"webxr-suite",onConfigureXRSessionInit(e,t){let n=new Set(t.optionalFeatures||[]);n.add("hit-test"),n.add("light-estimation");let r=e?.querySelector?.('[slot="ar-overlay"]')||null;r&&(n.add("dom-overlay"),t.domOverlay={root:r},r.addEventListener?.("beforexrselect",o=>{o.preventDefault()})),t.optionalFeatures=Array.from(n)},onXRFrame(e,t,n,r){if(!e||!t||!n||!r)return;let o=at.get(t);if(o||(o={lightProbe:null},at.set(t,o),typeof t.requestLightProbe=="function"&&t.requestLightProbe().then(s=>{o&&s&&(o.lightProbe=s)}).catch(()=>{})),o.lightProbe&&typeof n.getLightEstimate=="function"){let s=n.getLightEstimate(o.lightProbe);if(s){let x=s.primaryLightDirection,p=s.primaryLightIntensity;if(x&&p&&Array.isArray(e.lights)){let f=e.lights.find(m=>m.type==="directional");f||(f={type:"directional",direction:[.5,1,.8],color:[1,1,1],intensity:1},e.lights.push(f)),f.direction=[x.x,x.y,x.z];let d=Math.max(p.x,p.y,p.z,.001);f.color=[p.x/d,p.y/d,p.z/d],f.intensity=d}s.sphericalHarmonicsCoefficients&&e.gl&&le(e.gl,s.sphericalHarmonicsCoefficients)}}}};Q(ke);Q(Ee);Q(Se);Q(Ve);Q(De);Q(Le);
|
|
@@ -74,7 +74,7 @@ export {
|
|
|
74
74
|
type XRProfile,
|
|
75
75
|
type XRSimulatorRoom,
|
|
76
76
|
} from './xr-live/src/xr-live-element';
|
|
77
|
-
/** Optional
|
|
77
|
+
/** Optional spatial plugins (`xr-live/plugins`, `xr-live-plugins.min.js`). */
|
|
78
78
|
export * from './xr-live/src/plugins/index';
|
|
79
79
|
|
|
80
80
|
/**
|
|
@@ -191,9 +191,9 @@ export interface XRLiveAttributes extends ThreeLiveAttributes {
|
|
|
191
191
|
'xr-simulator'?: XRSimulatorRoom;
|
|
192
192
|
/** Spatial UI profile ("quest3", "android-xr", "visionos", "auto"). */
|
|
193
193
|
'xr-profile'?: XRProfile;
|
|
194
|
-
/**
|
|
194
|
+
/** Spatial plugin: enables plane/mesh detection; include "reticle" for a gaze reticle. */
|
|
195
195
|
'world-understanding'?: boolean | string;
|
|
196
|
-
/**
|
|
196
|
+
/** Spatial plugin: pinch in empty space to paint 3D tubes (optional `#rrggbb` color). */
|
|
197
197
|
'spatial-paint'?: boolean | string;
|
|
198
198
|
'onxr-object-detected'?: (e: CustomEvent<Detection3D>) => void;
|
|
199
199
|
'onxr-transcription'?: (e: CustomEvent<TranscriptEvent>) => void;
|