@vincentt-xr/sdk 2.0.0-alpha.5 → 2.0.0-alpha.7
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/GROUNDING.md +92 -7
- package/dist/{DebuggerUI-bnGHSSOb.cjs → DebuggerUI-B6bP6P9r.cjs} +1 -1
- package/dist/{DebuggerUI-DhKTXTY2.js → DebuggerUI-BjOMr8q_.js} +1 -1
- package/dist/FaceMeshRenderer-C5l6VLdO.cjs +155 -0
- package/dist/FaceMeshRenderer-wjAHrJzP.js +1270 -0
- package/dist/{FaceRetouch-TZeBGIqW.cjs → FaceRetouch-BkJzoA79.cjs} +1 -1
- package/dist/{FaceRetouch-Bg-OBU4n.js → FaceRetouch-DwbKQJAN.js} +30 -30
- package/dist/components/FaceMesh/FaceMeshRenderer.d.ts +11 -3
- package/dist/components/FaceMesh/canonical/CanonicalFaceMeshRenderer.d.ts +17 -1
- package/dist/components/FaceMesh/canonical/geometryGroups.d.ts +1 -1
- package/dist/components/FaceMesh/canonical/parseCanonicalFaceModel.d.ts +1 -0
- package/dist/components/FaceMesh/index.d.ts +2 -2
- package/dist/components/LipEffect/LipEffect.d.ts +2 -0
- package/dist/components/LipEffect/LipEffectMaterial.d.ts +10 -0
- package/dist/components/LipEffect/defaults.d.ts +9 -0
- package/dist/components/LipEffect/index.d.ts +4 -0
- package/dist/components/LipEffect/types.d.ts +22 -0
- package/dist/components/SceneObjectRenderer/index.d.ts +9 -2
- package/dist/components/XRMediaSurface/index.d.ts +2 -1
- package/dist/{contexts-B2_NsTnk.js → contexts-ByhzppYl.js} +6 -3
- package/dist/contexts-Dr62It_K.cjs +1 -0
- package/dist/debug-ui/media-source.cjs +1 -1
- package/dist/debug-ui/media-source.js +1 -1
- package/dist/debug-ui.cjs +1 -1
- package/dist/debug-ui.js +10 -10
- package/dist/entries/core.d.ts +3 -2
- package/dist/entries/face-effects.d.ts +4 -2
- package/dist/entries/tracking.d.ts +2 -0
- package/dist/face-effects.cjs +1 -1
- package/dist/face-effects.js +622 -508
- package/dist/{getFaceInfo-4DhcPZDJ.js → getFaceInfo-C4QpCQIY.js} +1 -1
- package/dist/{getFaceInfo-QOQ_dc-W.cjs → getFaceInfo-fA1bFBub.cjs} +1 -1
- package/dist/hooks/useXRSession/facade.d.ts +2 -0
- package/dist/{index-BMeBJ0dV.js → index-9dlAQAhy.js} +457 -416
- package/dist/{index-C9yQVzAh.cjs → index-BjmTe9eM.cjs} +1 -1
- package/dist/{index-WPPnlFO1.cjs → index-BpEf2BBb.cjs} +1 -1
- package/dist/{index-D1kj6uc-.js → index-ByoNj0QP.js} +1 -1
- package/dist/{index-ZaDEzDtR.cjs → index-CyUUurQT.cjs} +1 -1
- package/dist/index-DCiMbxC3.cjs +1 -0
- package/dist/{index-Cj3fGDtZ.js → index-DXT3WccE.js} +808 -787
- package/dist/index-DpI-qo5X.cjs +17 -0
- package/dist/{index-g250Tqme.js → index-DyVF4vEW.js} +1 -1
- package/dist/{index-72Wb15Ca.js → index-VJ0SJwmG.js} +1 -1
- package/dist/{internal-Dtvo4WYo.cjs → internal-Cq-TEQ5Y.cjs} +1 -1
- package/dist/{internal-34pb7djs.js → internal-Dmk1cTXq.js} +3 -3
- package/dist/internal.cjs +1 -1
- package/dist/internal.js +1 -1
- package/dist/low-level.cjs +1 -1
- package/dist/low-level.js +344 -330
- package/dist/main.cjs +1 -1
- package/dist/main.js +94 -91
- package/dist/{renderGroups-jSUOY1Oq.cjs → renderGroups-80H3DpTl.cjs} +1 -1
- package/dist/{renderGroups-CPWUX6z9.js → renderGroups-KZk6eRiY.js} +1 -1
- package/dist/{renderPasses-KUJUSevp.cjs → renderPasses-BOoBSr8z.cjs} +1 -1
- package/dist/{renderPasses-CLlYRdMk.js → renderPasses-BcquyVtu.js} +4 -4
- package/dist/scene-object.cjs +1 -1
- package/dist/scene-object.js +2 -2
- package/dist/screen2d/coordinates.d.ts +20 -0
- package/dist/{selectors-DLxL8Q66.js → selectors-B8H97CKA.js} +1 -1
- package/dist/{selectors-S8g25ke9.cjs → selectors-CZLKT2Iv.cjs} +1 -1
- package/dist/{session-DP8AF7Rg.cjs → session-CpkiK5YA.cjs} +1 -1
- package/dist/{session-CbtvwiaD.js → session-DLFN_VII.js} +1 -1
- package/dist/tracking/coordinates.d.ts +5 -0
- package/dist/tracking.cjs +1 -1
- package/dist/tracking.js +69 -66
- package/dist/types/common.d.ts +11 -1
- package/dist/types/gesture-tracking.d.ts +2 -2
- package/dist/types/hand-tracking.d.ts +3 -3
- package/dist/types/nodes.d.ts +2 -2
- package/dist/types/session.d.ts +7 -1
- package/dist/{useFaceInfo-BvZeUBsL.cjs → useFaceInfo-BJ8-_MOs.cjs} +1 -1
- package/dist/{useFaceInfo-C06EyScd.js → useFaceInfo-Dk426LTu.js} +3 -3
- package/dist/{useFaceResults-C1Ppc8rS.js → useFaceResults-CtetsO9M.js} +1 -1
- package/dist/{useFaceResults-CCNiH7VZ.cjs → useFaceResults-wBJF3zyp.cjs} +1 -1
- package/dist/utils/visionWasm.d.ts +18 -0
- package/docs/SDK_DOCUMENTATION.md +3 -0
- package/docs/api/capture-recording.mdx +9 -1
- package/docs/api/face-mesh.mdx +33 -0
- package/docs/api/runtime-3d.mdx +5 -0
- package/docs/api/screen-image.mdx +3 -1
- package/docs/api/screen-space-coordinates.mdx +31 -0
- package/docs/api/trackers.mdx +13 -0
- package/package.json +4 -1
- package/dist/FaceMeshRenderer-B2i2NW71.js +0 -1195
- package/dist/FaceMeshRenderer-BSOq1OnG.cjs +0 -155
- package/dist/contexts-BgWfyxre.cjs +0 -1
- package/dist/index-CNGzE49z.cjs +0 -17
- package/dist/index-Da7uycur.cjs +0 -1
|
@@ -1,155 +0,0 @@
|
|
|
1
|
-
"use strict";const u=require("react/jsx-runtime"),ee=require("@react-three/fiber"),i=require("react"),J=require("three"),q=require("./index-Da7uycur.cjs"),je=require("./selectors-S8g25ke9.cjs"),_e=require("./index-ZaDEzDtR.cjs"),Xt=require("@react-three/drei");function Wt(e){const n=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const t in e)if(t!=="default"){const r=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(n,t,r.get?r:{enumerable:!0,get:()=>e[t]})}}return n.default=e,Object.freeze(n)}const y=Wt(J),ue=8,V={type:"linear",stops:[{offset:0,color:"#38bdf8"},{offset:1,color:"#a78bfa"}],angle:0,center:{x:.5,y:.5},radius:.5},Yt=e=>{const n=e.slice(0,ue).map(t=>({...t,offset:J.MathUtils.clamp(t.offset,0,1)})).sort((t,r)=>t.offset-r.offset);return n.length>=2?n:V.stops.map(t=>({...t}))},Be=e=>({...V,...e,center:{...V.center,...e==null?void 0:e.center},radius:Math.max(.01,(e==null?void 0:e.radius)??V.radius),stops:Yt((e==null?void 0:e.stops)??V.stops)}),Kt=`
|
|
2
|
-
varying vec2 vPosition;
|
|
3
|
-
void main() {
|
|
4
|
-
vPosition = position.xy;
|
|
5
|
-
gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
|
|
6
|
-
}
|
|
7
|
-
`,$t=`
|
|
8
|
-
#define MAX_STOPS 8
|
|
9
|
-
uniform vec3 stopColors[MAX_STOPS];
|
|
10
|
-
uniform float stopOffsets[MAX_STOPS];
|
|
11
|
-
uniform int stopCount;
|
|
12
|
-
uniform int gradientType;
|
|
13
|
-
uniform vec2 direction;
|
|
14
|
-
uniform vec2 center;
|
|
15
|
-
uniform float radius;
|
|
16
|
-
uniform float angleOffset;
|
|
17
|
-
uniform float opacity;
|
|
18
|
-
varying vec2 vPosition;
|
|
19
|
-
|
|
20
|
-
vec3 sampleGradient(float amount) {
|
|
21
|
-
vec3 color = stopColors[0];
|
|
22
|
-
for (int index = 1; index < MAX_STOPS; index++) {
|
|
23
|
-
if (index >= stopCount) break;
|
|
24
|
-
if (amount <= stopOffsets[index]) {
|
|
25
|
-
float width = max(0.0001, stopOffsets[index] - stopOffsets[index - 1]);
|
|
26
|
-
return mix(stopColors[index - 1], stopColors[index], clamp((amount - stopOffsets[index - 1]) / width, 0.0, 1.0));
|
|
27
|
-
}
|
|
28
|
-
color = stopColors[index];
|
|
29
|
-
}
|
|
30
|
-
return color;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
void main() {
|
|
34
|
-
vec2 delta = vPosition - center;
|
|
35
|
-
float amount;
|
|
36
|
-
if (gradientType == 1) {
|
|
37
|
-
amount = clamp(length(delta) / radius, 0.0, 1.0);
|
|
38
|
-
} else if (gradientType == 2) {
|
|
39
|
-
amount = fract(atan(delta.y, delta.x) / 6.28318530718 + 0.5 + angleOffset);
|
|
40
|
-
} else {
|
|
41
|
-
amount = clamp(dot(delta, direction) + 0.5, 0.0, 1.0);
|
|
42
|
-
}
|
|
43
|
-
gl_FragColor = vec4(sampleGradient(amount), opacity);
|
|
44
|
-
}
|
|
45
|
-
`,qt={linear:0,radial:1,angular:2},Ve=({opacity:e=1,value:n})=>{const t=i.useMemo(()=>{const r=Be(n),a=J.MathUtils.degToRad(r.angle),o=r.stops.map(c=>new J.Color(c.color)),s=r.stops.map(c=>c.offset);for(;o.length<ue;)o.push(o[o.length-1]);for(;s.length<ue;)s.push(1);return{stopColors:{value:o},stopOffsets:{value:s},stopCount:{value:r.stops.length},gradientType:{value:qt[r.type]},direction:{value:new J.Vector2(Math.cos(a),Math.sin(a))},center:{value:new J.Vector2(r.center.x-.5,.5-r.center.y)},radius:{value:r.radius},angleOffset:{value:r.angle/360},opacity:{value:e}}},[e,n]);return u.jsx("shaderMaterial",{uniforms:t,vertexShader:Kt,fragmentShader:$t,transparent:e<1,depthTest:!1,depthWrite:!1,toneMapped:!1})},Qt="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAwMCAO2YpZcAAAAASUVORK5CYII=",Zt={source:"solid",color:"#ffffff",opacity:1,textureUrl:"",gradient:V},ke=e=>({...V,stops:[{offset:0,color:"#ffffff"},{offset:1,color:e}]}),Jt=({depthTest:e,depthWrite:n,settings:t,side:r,toneMapped:a})=>{const o=ee.useLoader(y.TextureLoader,t.textureUrl||Qt);return u.jsx("meshBasicMaterial",{color:t.color,map:o,transparent:!0,opacity:t.opacity,side:r,depthWrite:n,depthTest:e,toneMapped:a})},Xe=({depthTest:e=!1,depthWrite:n=!1,settings:t,side:r,toneMapped:a=!1})=>{const o=i.useMemo(()=>t.gradient??ke(t.color),[t.color,t.gradient]);return t.source==="gradient"?u.jsx(Ve,{value:o,opacity:t.opacity}):t.source==="texture"?u.jsx(Jt,{settings:t,side:r,depthTest:e,depthWrite:n,toneMapped:a}):u.jsx("meshBasicMaterial",{color:t.color,transparent:!0,opacity:t.opacity,side:r,depthWrite:n,depthTest:e,toneMapped:a})},be=Math.PI/180,xe=180/Math.PI,N=e=>Number(e.toFixed(6)),Ce={enabled:!0,linked:{position:!1,rotation:!1,scale:!1},showTransformControls:!1,transformControlMode:"translate",transformControlSpace:"local",position:{x:0,y:0,z:0},rotation:{x:0,y:0,z:0},scale:{x:1,y:1,z:1},visible:!0},en=({children:e,objectRef:n,onChange:t,value:r})=>{const a=i.useRef(null),o=i.useRef(n);o.current=n;const[s,c]=i.useState(null),_=i.useCallback(d=>{var S;a.current=d,c(d),(S=o.current)==null||S.call(o,d)},[]),R=i.useCallback(()=>{const d=a.current;!d||!t||t({...r,position:{x:N(d.position.x),y:N(d.position.y),z:N(d.position.z)},rotation:{x:N(d.rotation.x*xe),y:N(d.rotation.y*xe),z:N(d.rotation.z*xe)},scale:{x:N(d.scale.x),y:N(d.scale.y),z:N(d.scale.z)}})},[t,r]);return r.enabled?u.jsxs(u.Fragment,{children:[u.jsx("group",{ref:_,position:[r.position.x,r.position.y,r.position.z],rotation:[r.rotation.x*be,r.rotation.y*be,r.rotation.z*be],scale:[r.scale.x,r.scale.y,r.scale.z],visible:r.visible,children:e}),s&&r.showTransformControls&&u.jsx(Xt.TransformControls,{object:s,mode:r.transformControlMode,space:r.transformControlSpace,size:.85,onMouseUp:R,onObjectChange:R})]}):null},ae=e=>Math.min(1,Math.max(0,e)),k=(e,n,t)=>ae(1-Math.abs(e-n)/t),tn=e=>{let n=1/0,t=-1/0,r=1/0,a=-1/0;for(const c of e)n=Math.min(n,c.x),t=Math.max(t,c.x),r=Math.min(r,c.y),a=Math.max(a,c.y);const o=Math.max(t-n,.001),s=Math.max(a-r,.001);return{centerX:n+o*.5,centerY:r+s*.5,width:o,height:s}},nn=e=>e!=null&&e.enabled?(e.strength??1)!==0&&Object.entries(e).some(([n,t])=>n!=="enabled"&&n!=="strength"&&typeof t=="number"&&t!==0):!1,rn=(e,n,t,r)=>{const a=t.enabled?t.strength??1:0;if(a===0)return r.x=e.x,r.y=e.y,r.z=e.z,r;const o=(e.x-n.centerX)/n.width,s=(e.y-n.centerY)/n.height,c=Math.abs(o),_=ae((-s+.42)/.55),R=k(s,-.02,.34),d=k(s,-.24,.16)*ae((c-.05)/.28),S=k(s,.02,.26)*k(c,0,.18),C=k(s,.29,.18)*k(c,0,.36),I=ae((s-.16)/.36),b=R*k(c,.34,.22),m=_*k(c,0,.48),x=k(s,-.19,.1)*ae((c-.05)/.3),X=k(s,.48,.2)*k(c,0,.26);let f=e.x,l=e.y,h=e.z;const A=(K,U=1)=>{f+=o*n.width*K*a*U},E=(K,U=1)=>{l+=s*n.height*K*a*U};A(t.faceWidth??0),E(t.faceHeight??0),A(t.faceRoundness??0,R*(1-c)),l-=n.height*(t.midfaceHeight??0)*a*R*.25,E(-(t.foreheadHeight??0),m),A(t.foreheadWidth??0,m),A(t.cheekboneWidth??0,k(s,-.06,.16)*k(c,.34,.2)),A(t.cheekWidth??0,b),A(t.jawWidth??0,I),E(t.chinHeight??0,X),l-=n.height*(t.scalpHeight??0)*a*_*.3,h-=(t.midfaceDepth??0)*a*R*.08,h+=(t.cheekHollowness??0)*a*b*.06,h-=(t.browDepth??0)*a*x*.05,l-=n.height*(t.browHeight??0)*a*x*.2,f+=Math.sign(o||1)*n.width*(t.browDistance??0)*a*x*.16;const v=(t.headCurve??0)*a*(s+.1);h-=v*v*.04*Math.sign(t.headCurve??0),f+=n.width*(t.faceTwist??0)*a*s*.18;const j=(t.faceSwirl??0)*a*.22;f+=-s*n.width*j,l+=o*n.height*j;const W=o<0?t.leftEyeSize??0:t.rightEyeSize??0,L=((t.eyeSize??0)+W)*a*d;f+=o*n.width*L*.45,l+=(s+.24)*n.height*L*.7,f+=Math.sign(o||1)*n.width*(t.eyeDistance??0)*a*d*.2,f+=n.width*(o<0?t.leftEyeX??0:t.rightEyeX??0)*a*d*.15,l+=n.height*(o<0?t.leftEyeY??0:t.rightEyeY??0)*a*d*.15;const Y=(t.noseSize??0)*a*S;return f+=o*n.width*Y*.7,l+=(s-.02)*n.height*Y*.5,l+=n.height*(t.noseLength??0)*a*S*Math.max(s+.08,0)*.4,h-=(t.noseSize??0)*a*S*.08,f+=o*n.width*(t.mouthWidth??0)*a*C,l+=(s-.29)*n.height*(t.mouthHeight??0)*a*C,r.x=f,r.y=l,r.z=h,r},ge=new Set([61,146,91,181,84,17,314,405,321,375,291,78,95,88,178,87,14,317,402,318,324,308,191,80,81,82,13,312,311,310,415]),Re=new Set([33,7,163,144,145,153,154,155,133,173,157,158,159,160,161,246]),Se=new Set([362,382,381,380,374,373,390,249,263,466,388,387,386,385,384,398]),an=new Set([814,815,816,817,818,819,830,831,832,833]),on=(e,n,t)=>{const r=ge.has(e)&&ge.has(n)&&ge.has(t),a=Re.has(e)&&Re.has(n)&&Re.has(t),o=Se.has(e)&&Se.has(n)&&Se.has(t);return r?"mouth":a?"leftEye":o?"rightEye":"base"},We=e=>{const n=[],t=[],r=[],a=[],o=[],s=[],c=[];let _=0,R=0;e.split(`
|
|
46
|
-
`).forEach(b=>{const m=b.trim();if(!m)return;if(m.startsWith("v ")){_+=1;return}if(m.startsWith("vt ")){const[,l,h]=m.split(/\s+/);s.push([Number(l),Number(h)]);return}if(!m.startsWith("f "))return;const x=R;R+=1;const[,...X]=m.split(/\s+/),f=X.map(l=>{const[h,A]=l.split("/"),E=Number(h)-1,v=Number(A)-1;return v>=0&&s[v]&&!c[E]&&(c[E]=s[v]),E});if(!(f.length<3))for(let l=1;l<f.length-1;l+=1){const h=f[0],A=f[l],E=f[l+1],v=on(h,A,E);an.has(x)?o.push(h,A,E):v==="mouth"?t.push(h,A,E):v==="leftEye"?r.push(h,A,E):v==="rightEye"?a.push(h,A,E):n.push(h,A,E)}});const d=[];for(let b=0;b<_;b+=1){const[m,x]=c[b]??[0,0];d.push(m,x)}const S=new Uint16Array(r),C=new Uint16Array(a),I=new Uint16Array(r.length+a.length);return I.set(S),I.set(C,S.length),{baseIndices:new Uint16Array(n),mouthIndices:new Uint16Array(t),leftEyeIndices:S,rightEyeIndices:C,eyeIndices:I,noseIndices:new Uint16Array(o),uvs:new Float32Array(d),vertexCount:_}},sn="canonical_face_model.obj",cn=new TextDecoder("utf-8"),ve=new Map,ln=e=>{const n=ve.get(e);if(n)return n;const t=q.fetchAndVerify(e).then(r=>We(cn.decode(r))).catch(r=>{throw ve.delete(e),r});return ve.set(e,t),t},Ye=e=>{const{mesh:n,url:t}=e??{},r=t??`${q.libConfig.sdkAssetsBaseUrl}/${sn}`,[a,o]=i.useState(n??null);return i.useEffect(()=>{if(n){o(n);return}let s=!1;return ln(r).then(c=>{s||o(c)}).catch(c=>{s||console.error(`${q.libConfig.loggerPrefix} canonical face mesh load failed`,c)}),()=>{s=!0}},[n,r]),a},g={basic:"basic",standard:"standard",physical:"physical",toon:"toon",normal:"normal",matcap:"matcap",wireframe:"wireframe",shader:"shader"},G={originalFace:"originalFace",composite:"composite"},H={none:"none",canonical:"canonical",style2:"style2"},$={none:"none",canonical:"canonical"},re={solid:"solid",gradient:"gradient",imageUrl:"imageUrl",mediaUrl:"mediaUrl"},te={front:"front",back:"back",double:"double"},Ue={normal:"normal",add:"add",subtract:"subtract",multiply:"multiply",screen:"screen",overlay:"overlay",softLight:"softLight",hardLight:"hardLight",lighten:"lighten",darken:"darken",difference:"difference",exclusion:"exclusion"},un={textureMap:H.canonical,alphaMap:$.canonical,alphaOpacity:1},ze={...un,blendMode:Ue.hardLight,blendOpacity:.85,baseColor:"#ffffff",opacity:1,compositeShading:!0},O={materialType:g.basic,shaderPreset:G.originalFace,textureMap:H.none,alphaMap:$.none,alphaOpacity:1,side:te.front,blendMode:Ue.normal,blendOpacity:1,baseColor:"#38bdf8",opacity:.45,compositeShading:!1};g.shader,G.composite,te.front;const le={mouth:!0,eyes:!0,nose:!0},ne={textureSource:re.solid,color:"#111111",opacity:.5},dn=24,Ke=10,we=(e,n,t)=>e!==g.shader?"none":n===G.originalFace?"originalFace":n===G.composite?t===H.none?"originalFace":"composite":"none",fn=(e,n)=>e===g.basic||e===g.standard||e===g.physical||e===g.toon||e===g.shader&&n===G.composite,hn=(e,n,t=H.canonical)=>we(e,n,t)==="composite",mn=(e,n,t)=>we(e,n,t)==="originalFace",de=e=>e===re.imageUrl||e===re.mediaUrl,$e=e=>e===re.solid||e===re.gradient,Fe={normal:0,add:1,subtract:2,multiply:3,screen:4,overlay:5,softLight:6,hardLight:7,lighten:8,darken:9,difference:10,exclusion:11},Te="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mP8/x8AAwMCAO2YpZcAAAAASUVORK5CYII=",pn=()=>{const e=new Uint8Array([32,32,32,255,96,96,96,255,176,176,176,255,255,255,255,255]),n=new y.DataTexture(e,4,1,y.RGBAFormat);return n.minFilter=y.NearestFilter,n.magFilter=y.NearestFilter,n.generateMipmaps=!1,n.needsUpdate=!0,n},En=()=>{const e=document.createElement("canvas");e.width=256,e.height=256;const n=e.getContext("2d");if(!n)return new y.CanvasTexture(e);const t=n.createRadialGradient(96,80,10,128,128,128);t.addColorStop(0,"#ffffff"),t.addColorStop(.18,"#f7d794"),t.addColorStop(.45,"#d97706"),t.addColorStop(.72,"#78350f"),t.addColorStop(1,"#120701"),n.fillStyle=t,n.fillRect(0,0,e.width,e.height);const r=new y.CanvasTexture(e);return r.needsUpdate=!0,r},Mn=`
|
|
47
|
-
attribute vec2 faceUv;
|
|
48
|
-
varying vec2 vUv;
|
|
49
|
-
varying vec2 vFaceUv;
|
|
50
|
-
varying vec3 vNormal;
|
|
51
|
-
|
|
52
|
-
void main() {
|
|
53
|
-
vUv = uv;
|
|
54
|
-
vFaceUv = faceUv;
|
|
55
|
-
vNormal = normalize(normalMatrix * normal);
|
|
56
|
-
gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
|
|
57
|
-
}
|
|
58
|
-
`,yn=`
|
|
59
|
-
uniform sampler2D cameraTexture;
|
|
60
|
-
uniform sampler2D canonicalTexture;
|
|
61
|
-
uniform sampler2D alphaMask;
|
|
62
|
-
uniform vec3 textureTint;
|
|
63
|
-
uniform float opacity;
|
|
64
|
-
uniform int blendMode;
|
|
65
|
-
uniform float blendOpacity;
|
|
66
|
-
uniform float useCanonicalTexture;
|
|
67
|
-
uniform float useAlphaMask;
|
|
68
|
-
uniform float alphaOpacity;
|
|
69
|
-
uniform float compositeShading;
|
|
70
|
-
uniform vec3 lightDirection;
|
|
71
|
-
uniform float ambientStrength;
|
|
72
|
-
uniform float directionalStrength;
|
|
73
|
-
varying vec2 vUv;
|
|
74
|
-
varying vec2 vFaceUv;
|
|
75
|
-
varying vec3 vNormal;
|
|
76
|
-
|
|
77
|
-
vec3 linearToSrgb(vec3 value) {
|
|
78
|
-
vec3 low = value * 12.92;
|
|
79
|
-
vec3 high = 1.055 * pow(max(value, vec3(0.0)), vec3(1.0 / 2.4)) - 0.055;
|
|
80
|
-
return mix(high, low, step(value, vec3(0.0031308)));
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
vec3 srgbToLinear(vec3 value) {
|
|
84
|
-
vec3 low = value / 12.92;
|
|
85
|
-
vec3 high = pow(max((value + 0.055) / 1.055, vec3(0.0)), vec3(2.4));
|
|
86
|
-
return mix(high, low, step(value, vec3(0.04045)));
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
float overlayChannel(float base, float blend) {
|
|
90
|
-
return base < 0.5 ? 2.0 * base * blend : 1.0 - 2.0 * (1.0 - base) * (1.0 - blend);
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
float hardLightChannel(float base, float blend) {
|
|
94
|
-
return blend < 0.5 ? 2.0 * base * blend : 1.0 - 2.0 * (1.0 - base) * (1.0 - blend);
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
float softLightChannel(float base, float blend) {
|
|
98
|
-
if (blend <= 0.5) {
|
|
99
|
-
return base - (1.0 - 2.0 * blend) * base * (1.0 - base);
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
float d = base <= 0.25
|
|
103
|
-
? ((16.0 * base - 12.0) * base + 4.0) * base
|
|
104
|
-
: sqrt(base);
|
|
105
|
-
|
|
106
|
-
return base + (2.0 * blend - 1.0) * (d - base);
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
vec3 applyBlendMode(vec3 base, vec3 blend, int mode) {
|
|
110
|
-
if (mode == 0) return blend;
|
|
111
|
-
if (mode == 1) return min(base + blend, 1.0);
|
|
112
|
-
if (mode == 2) return max(base - blend, 0.0);
|
|
113
|
-
if (mode == 3) return base * blend;
|
|
114
|
-
if (mode == 4) return 1.0 - (1.0 - base) * (1.0 - blend);
|
|
115
|
-
if (mode == 5) {
|
|
116
|
-
return vec3(
|
|
117
|
-
overlayChannel(base.r, blend.r),
|
|
118
|
-
overlayChannel(base.g, blend.g),
|
|
119
|
-
overlayChannel(base.b, blend.b)
|
|
120
|
-
);
|
|
121
|
-
}
|
|
122
|
-
if (mode == 6) {
|
|
123
|
-
return vec3(
|
|
124
|
-
softLightChannel(base.r, blend.r),
|
|
125
|
-
softLightChannel(base.g, blend.g),
|
|
126
|
-
softLightChannel(base.b, blend.b)
|
|
127
|
-
);
|
|
128
|
-
}
|
|
129
|
-
if (mode == 7) {
|
|
130
|
-
return vec3(
|
|
131
|
-
hardLightChannel(base.r, blend.r),
|
|
132
|
-
hardLightChannel(base.g, blend.g),
|
|
133
|
-
hardLightChannel(base.b, blend.b)
|
|
134
|
-
);
|
|
135
|
-
}
|
|
136
|
-
if (mode == 8) return max(base, blend);
|
|
137
|
-
if (mode == 9) return min(base, blend);
|
|
138
|
-
if (mode == 10) return abs(base - blend);
|
|
139
|
-
return base + blend - 2.0 * base * blend;
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
void main() {
|
|
143
|
-
vec3 base = linearToSrgb(texture2D(cameraTexture, vFaceUv).rgb);
|
|
144
|
-
vec4 textureSample = texture2D(canonicalTexture, vUv);
|
|
145
|
-
vec3 blend = linearToSrgb(textureSample.rgb) * textureTint;
|
|
146
|
-
float light = ambientStrength + max(dot(normalize(vNormal), normalize(lightDirection)), 0.0) * directionalStrength;
|
|
147
|
-
blend *= mix(1.0, clamp(light, 0.35, 1.35), compositeShading);
|
|
148
|
-
float maskSample = texture2D(alphaMask, vUv).r;
|
|
149
|
-
float mask = useAlphaMask > 0.5 ? mix(1.0, maskSample, alphaOpacity) : 1.0;
|
|
150
|
-
float textureAlpha = useCanonicalTexture > 0.5 ? textureSample.a : 1.0;
|
|
151
|
-
vec3 blended = applyBlendMode(base, blend, blendMode);
|
|
152
|
-
vec3 color = useCanonicalTexture > 0.5 ? mix(base, blended, blendOpacity) : base;
|
|
153
|
-
gl_FragColor = vec4(srgbToLinear(color), opacity * mask * textureAlpha);
|
|
154
|
-
}
|
|
155
|
-
`,qe=({alphaMap:e,alphaOpacity:n,blendMode:t,blendOpacity:r,cameraTexture:a,color:o,compositeShading:s,faceAlphaMaskUrl:c,faceTextureStyle2Url:_,faceTextureUrl:R,masked:d=!1,maskColor:S,maskOpacity:C,maskSourceUrl:I,maskTextureSource:b,materialType:m,opacity:x,shaderPreset:X,side:f,textureMap:l})=>{const h=ee.useLoader(y.TextureLoader,R||Te),A=ee.useLoader(y.TextureLoader,_||R||Te),E=ee.useLoader(y.TextureLoader,c||Te),v=i.useMemo(()=>pn(),[]),j=i.useMemo(()=>En(),[]);i.useEffect(()=>()=>{v.dispose(),j.dispose()},[j,v]);const W=l===H.style2?A:h,L=l!==H.none,Y=we(m,X,l),K=["composite-material",l,e,n,t,r,s?"lit":"flat",o,x,R,_,c].join("|"),U={side:f,transparent:!0,opacity:x,wireframe:!1},fe=i.useMemo(()=>({source:de(b)?"texture":b,color:$e(b)?S:"#ffffff",opacity:C,textureUrl:de(b)?I:"",gradient:ke(S)}),[S,C,I,b]),T=i.useMemo(()=>({cameraTexture:{value:null},canonicalTexture:{value:null},alphaMask:{value:null},textureTint:{value:new y.Color(o)},opacity:{value:x},blendMode:{value:Fe[t]},blendOpacity:{value:r},useCanonicalTexture:{value:L?1:0},useAlphaMask:{value:e===$.canonical?1:0},alphaOpacity:{value:n},compositeShading:{value:s?1:0},lightDirection:{value:new y.Vector3(.3,.65,.7).normalize()},ambientStrength:{value:.78},directionalStrength:{value:.38}}),[e,n,t,r,o,s,L,x]);if(i.useEffect(()=>{T.cameraTexture.value=a??h,T.canonicalTexture.value=W,T.alphaMask.value=E,T.textureTint.value.set(o),T.opacity.value=x,T.blendMode.value=Fe[t],T.blendOpacity.value=r,T.useCanonicalTexture.value=L?1:0,T.useAlphaMask.value=e===$.canonical?1:0,T.alphaOpacity.value=n,T.compositeShading.value=s?1:0},[e,E,n,t,r,a,o,s,T,h,L,x,W]),d)return u.jsx(Xe,{settings:fe,side:f},`masked-${b}-material`);if(m===g.wireframe)return u.jsx("meshBasicMaterial",{color:o,transparent:!0,opacity:x,side:f,depthWrite:!1,depthTest:!1,wireframe:!0,toneMapped:!1},"wireframe-material");if(Y==="originalFace"&&a)return u.jsx("meshBasicMaterial",{map:a,alphaMap:E,transparent:!0,opacity:x,side:f,depthWrite:!1,depthTest:!0,toneMapped:!1},"use-original-face-material");if(Y==="composite"&&a)return u.jsx("shaderMaterial",{uniforms:T,vertexShader:Mn,fragmentShader:yn,transparent:!0,side:f,depthWrite:!1,depthTest:!0,toneMapped:!1},K);const z=L?W:null,Q=e===$.canonical&&n>0?E:null,B=`${m}-${l}-${e}-${n>0?"alpha-on":"alpha-off"}`;return m===g.standard?u.jsx("meshStandardMaterial",{...U,color:o,map:z??void 0,alphaMap:Q??void 0,depthWrite:!0,depthTest:!0,metalness:.05,roughness:.72},B):m===g.physical?u.jsx("meshPhysicalMaterial",{...U,color:o,map:z??void 0,alphaMap:Q??void 0,depthWrite:!0,depthTest:!0,roughness:.58,metalness:.08,clearcoat:.35,clearcoatRoughness:.4},B):m===g.toon?u.jsx("meshToonMaterial",{...U,color:o,map:z??void 0,alphaMap:Q??void 0,gradientMap:v,depthWrite:!0,depthTest:!0},B):m===g.normal?u.jsx("meshNormalMaterial",{...U,depthWrite:!0,depthTest:!0,flatShading:!1},"normal-material"):m===g.matcap?u.jsx("meshMatcapMaterial",{...U,color:o,matcap:j,depthWrite:!0,depthTest:!0},"matcap-material"):u.jsx("meshBasicMaterial",{...U,color:o,map:z??void 0,alphaMap:Q??void 0,depthWrite:!1,depthTest:l!==H.none||e!==$.none,toneMapped:!1},B)},Qe=[{key:"base",getIndices:e=>e.baseIndices,masked:!1,renderOrderOffset:0},{key:"mouth",getIndices:e=>e.mouthIndices,masked:!1,renderOrderOffset:2},{key:"left-eye",getIndices:e=>e.leftEyeIndices,masked:!1,renderOrderOffset:2},{key:"right-eye",getIndices:e=>e.rightEyeIndices,masked:!1,renderOrderOffset:2},{key:"nose",getIndices:e=>e.noseIndices,masked:!1,renderOrderOffset:2},{key:"mouth-mask",getIndices:e=>e.mouthIndices,masked:!0,renderOrderOffset:3},{key:"left-eye-mask",getIndices:e=>e.leftEyeIndices,masked:!0,renderOrderOffset:3},{key:"right-eye-mask",getIndices:e=>e.rightEyeIndices,masked:!0,renderOrderOffset:3},{key:"nose-mask",getIndices:e=>e.noseIndices,masked:!0,renderOrderOffset:3}],An={[te.front]:y.FrontSide,[te.back]:y.BackSide,[te.double]:y.DoubleSide},bn=(e,n,t)=>{e.setAttribute("position",n.position),e.setAttribute("uv",n.uv),e.setAttribute("faceUv",n.faceUv),e.setIndex(new y.BufferAttribute(t,1))},Ze=({faceIndex:e=0,baseColor:n,color:t=O.baseColor,opacity:r=O.opacity,materialType:a=O.materialType,shaderPreset:o=O.shaderPreset,textureMap:s=O.textureMap,alphaMap:c=O.alphaMap,alphaOpacity:_=O.alphaOpacity,side:R=O.side,blendMode:d=O.blendMode,blendOpacity:S=O.blendOpacity,showOverlayMask:C=!1,showMouthMask:I=le.mouth,showEyeMask:b=le.eyes,showLeftEyeMask:m,showRightEyeMask:x,showNoseMask:X=le.nose,showEyeGeometry:f=!0,showLeftEyeGeometry:l,showRightEyeGeometry:h,showMouthGeometry:A=!0,showNoseGeometry:E=!0,maskTextureSource:v=ne.textureSource,maskSourceUrl:j="",maskColor:W=ne.color,maskOpacity:L=ne.opacity,faceTextureUrl:Y="",faceTextureStyle2Url:K="",faceAlphaMaskUrl:U="",compositeShading:fe=!1,faceWarp3D:T,transform:z,renderOrder:Q=Ke,externalScale:B=1,mesh:at,meshUrl:ot})=>{const he=je.useXRModelNode(q.XRModel.FACE_TRACKER),st=je.useXRCameraTexture(),{camera:it}=ee.useThree(),D=Ye({mesh:at,url:ot}),Oe=i.useRef(null),ct=i.useRef(null),lt=i.useRef(null),ut=i.useRef(null),dt=i.useRef(null),ft=i.useRef(null),ht=i.useRef(null),mt=i.useRef(null),pt=i.useRef(null),Et=i.useRef(null),Mt=i.useRef(null),yt=i.useRef(null),At=i.useRef(null),bt=i.useRef(null),xt=i.useRef(null),gt=i.useRef(null),Rt=i.useRef(null),St=i.useRef(null),me=i.useRef(null),pe=i.useRef(null),Ee=i.useRef(null),Ie=i.useRef(null),vt=i.useRef(new y.Vector3),Tt=i.useRef({x:0,y:0,z:0}),_t=i.useRef({x:0,y:0,z:0}),Ct=i.useRef({x:0,y:0,z:0}),oe=i.useRef(!1),Ft=An[R],kt=n??t,Ut=l??f,wt=h??f,Ot=C||(m??b),It=C||(x??b),Lt=C||I,Dt=C||X,Pt={base:Oe,mouth:ct,"left-eye":lt,"right-eye":ut,nose:dt,"mouth-mask":ft,"left-eye-mask":ht,"right-eye-mask":mt,"nose-mask":pt},Nt={base:Et,mouth:Mt,"left-eye":yt,"right-eye":At,nose:bt,"mouth-mask":xt,"left-eye-mask":gt,"right-eye-mask":Rt,"nose-mask":St},Gt={base:!0,mouth:A,"left-eye":Ut,"right-eye":wt,nose:E,"mouth-mask":Lt,"left-eye-mask":Ot,"right-eye-mask":It,"nose-mask":Dt},Ht=M=>u.jsx(qe,{alphaMap:c,alphaOpacity:_,blendMode:d,blendOpacity:S,cameraTexture:st,color:kt,compositeShading:fe,faceAlphaMaskUrl:U,faceTextureStyle2Url:K,faceTextureUrl:Y,masked:M,maskColor:W,maskOpacity:L,maskSourceUrl:j,maskTextureSource:v,materialType:a,opacity:r,shaderPreset:o,side:Ft,textureMap:s}),Z=Qe.map(M=>({...M,geometryRef:Pt[M.key],meshRef:Nt[M.key],visible:Gt[M.key]})),jt=M=>_e.projectLandmarkWithDepth(M,it,vt.current);return ee.useFrame(()=>{var Ne,Ge;const M=Oe.current,P=(Ge=(Ne=he==null?void 0:he.detectionResults)==null?void 0:Ne.faceLandmarks)==null?void 0:Ge[e],zt=Z.every(p=>p.geometryRef.current&&p.meshRef.current);if(!D||!M||!zt)return;if(!P||P.length<D.vertexCount){Z.forEach(p=>{p.meshRef.current.visible=!1});return}if(Ie.current!==D){me.current=new Float32Array(D.vertexCount*3),pe.current=new Float32Array(D.uvs),Ee.current=new Float32Array(D.vertexCount*2);const p={position:new y.BufferAttribute(me.current,3),uv:new y.BufferAttribute(pe.current,2),faceUv:new y.BufferAttribute(Ee.current,2)};Z.forEach(F=>{bn(F.geometryRef.current,p,F.getIndices(D))}),p.uv.needsUpdate=!0,Ie.current=D,oe.current=!1}const se=me.current,Me=Ee.current,ie=pe.current;if(!se||!Me||!ie)return;const Le=mn(a,o,s),De=nn(T),Pe=De?tn(P):null,w=z?Ct.current:null;if(w){w.x=0,w.y=0,w.z=0;for(let p=0;p<P.length;p++){const F=P[p];w.x+=F.x,w.y+=F.y,w.z+=F.z}w.x/=P.length,w.y/=P.length,w.z/=P.length}const Bt=Math.min(P.length,D.vertexCount);for(let p=0;p<Bt;p++){const F=P[p],He=De&&Pe?rn(F,Pe,T,Tt.current):F,Vt=z&&w?_e.transformFaceMeshLandmark(He,w,z,_t.current):He,ye=p*3,ce=p*2,Ae=jt(Vt);se[ye]=Ae.x,se[ye+1]=Ae.y,se[ye+2]=Ae.z,Me[ce]=F.x,Me[ce+1]=1-F.y,Le&&(ie[ce]=F.x,ie[ce+1]=1-F.y)}Le?(M.attributes.uv.needsUpdate=!0,oe.current=!0):oe.current&&(ie.set(D.uvs),M.attributes.uv.needsUpdate=!0,oe.current=!1),Z.forEach(p=>{p.meshRef.current.visible=p.visible}),M.attributes.position.needsUpdate=!0,M.attributes.faceUv.needsUpdate=!0,Z.forEach(p=>{p.geometryRef.current.computeVertexNormals()})}),u.jsx("group",{scale:[B,B,B],children:Z.map(M=>u.jsxs("mesh",{ref:M.meshRef,renderOrder:Q+M.renderOrderOffset,frustumCulled:!1,children:[u.jsx("bufferGeometry",{ref:M.geometryRef}),Ht(M.masked)]},M.key))})},Je=`${q.libConfig.sdkAssetsBaseUrl}/Canonical_Face_Color.png`,et=`${q.libConfig.sdkAssetsBaseUrl}/Canonical_Face_Color_style_2.png`,tt=`${q.libConfig.sdkAssetsBaseUrl}/Canonical_Face_Color_Mask.png`,nt={...Ce,position:{...Ce.position,y:.001}},xn={enabled:!0,faceIndex:0,targetFps:dn,...O,showLeftEyeGeometry:!0,showRightEyeGeometry:!0,showMouthGeometry:!0,showNoseGeometry:!0,externalScale:1,showOverlayMask:!1,showMouthMask:!1,showLeftEyeMask:!1,showRightEyeMask:!1,showNoseMask:!1,maskTextureSource:ne.textureSource,maskSourceUrl:"",maskColor:ne.color,maskOpacity:ne.opacity,faceTextureUrl:Je,faceTextureStyle2Url:et,faceAlphaMaskUrl:tt,renderOrder:Ke},rt=e=>{const{externalMeshUrl:n,...t}=e;return{...t,color:t.baseColor,meshUrl:n}},gn=(e,n)=>{const t={...e,...n};return n.maskTextureSource&&!de(n.maskTextureSource)&&(t.maskSourceUrl=""),t.materialType===g.shader&&n.shaderPreset===G.composite?{...t,...ze,materialType:g.shader,shaderPreset:G.composite}:t.materialType===g.shader&&t.shaderPreset===G.composite&&t.textureMap===H.none?{...t,textureMap:ze.textureMap}:t},Rn=({transform:e,value:n})=>n.enabled?u.jsxs(u.Fragment,{children:[u.jsx(_e.FaceTracker,{active:n.enabled,faceIndex:n.faceIndex,numFaces:n.faceIndex+1,targetFps:n.targetFps}),u.jsx(Ze,{...rt(n),transform:e??nt})]}):null;exports.CANONICAL_FACE_MESH_GEOMETRY_SPECS=Qe;exports.CanonicalFaceMeshRenderer=Ze;exports.DEFAULT_APPEARANCE=O;exports.DEFAULT_FACE_MESH_RENDERER=xn;exports.DEFAULT_FACE_MESH_TRANSFORM=nt;exports.DEFAULT_MASKING=le;exports.DEFAULT_MATERIAL_FILL=Zt;exports.DEFAULT_SCREEN_GRADIENT=V;exports.DEFAULT_TRANSFORM_3D=Ce;exports.FACE_MESH_ALPHA_MAPS=$;exports.FACE_MESH_BLEND_MODES=Ue;exports.FACE_MESH_MASK_TEXTURE_SOURCES=re;exports.FACE_MESH_MATERIAL_TYPES=g;exports.FACE_MESH_SHADER_PRESETS=G;exports.FACE_MESH_SIDES=te;exports.FACE_MESH_TEXTURE_MAPS=H;exports.FaceMeshMaterial=qe;exports.FaceMeshRenderer=Rn;exports.MAX_SCREEN_GRADIENT_STOPS=ue;exports.MaterialFill=Xe;exports.ScreenGradientMaterial=Ve;exports.Transform3D=en;exports.blendModeIndices=Fe;exports.canonicalFaceAlphaMaskUrl=tt;exports.canonicalFaceTextureStyle2Url=et;exports.canonicalFaceTextureUrl=Je;exports.createTwoStopGradient=ke;exports.mapFaceMeshRendererSettingsToProps=rt;exports.normalizeScreenGradient=Be;exports.parseCanonicalFaceModel=We;exports.resolveFaceMeshRendererSettings=gn;exports.supportsBlendMode=hn;exports.supportsTexturePanel=fn;exports.useCanonicalFaceMesh=Ye;exports.usesMaskColor=$e;exports.usesMaskSourceUrl=de;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";var Ee=Object.defineProperty;var Te=(e,t,n)=>t in e?Ee(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;var O=(e,t,n)=>Te(e,typeof t!="symbol"?t+"":t,n);const B=require("react/jsx-runtime"),ne=require("@react-three/fiber"),A=require("react"),Fe=require("three"),fe=require("./renderLayers-lDtL0_43.cjs"),ie=require("./selectors-S8g25ke9.cjs"),ue=require("./index-Da7uycur.cjs"),se=require("./index-C9yQVzAh.cjs");function Me(e){const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const n in e)if(n!=="default"){const a=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(t,n,a.get?a:{enumerable:!0,get:()=>e[n]})}}return t.default=e,Object.freeze(t)}const U=Me(Fe),xe={display:"flex",alignItems:"center",justifyContent:"center",height:"100%",background:"#363636",color:"white",fontFamily:"monospace"},Ae=()=>B.jsx("div",{style:xe,children:"Loading..."}),Ce=e=>B.jsx("div",{style:xe,children:e.error}),le={position:"absolute",top:0,left:0,width:"100%",height:"100%",zIndex:10},ce={sceneColorTexture:null,sceneDepthTexture:null},ke=({onRenderOutputs:e,renderOutputs:t,size:n})=>{const{gl:a,scene:r,size:s}=ne.useThree(),{session:c}=ue.useXRContext(),i=Math.max(1,Math.round((n==null?void 0:n.width)??s.width)),d=Math.max(1,Math.round((n==null?void 0:n.height)??s.height)),f=!!(t.sceneColor||t.sceneDepth),l=A.useMemo(()=>{if(!f)return null;const o=new U.WebGLRenderTarget(i,d,{colorSpace:U.SRGBColorSpace,depthBuffer:!0,stencilBuffer:!1});return t.sceneDepth&&(o.depthTexture=new U.DepthTexture(i,d),o.depthTexture.format=U.DepthFormat,o.depthTexture.type=U.UnsignedShortType),o},[f,d,t.sceneDepth,i]);return A.useEffect(()=>{if(!l){e==null||e(ce);return}return e==null||e({sceneColorTexture:t.sceneColor?l.texture:null,sceneDepthTexture:t.sceneDepth&&l.depthTexture?l.depthTexture:null}),()=>{var o;l.dispose(),(o=l.depthTexture)==null||o.dispose(),e==null||e(ce)}},[e,t.sceneColor,t.sceneDepth,l]),ne.useFrame(()=>{if(!l)return;const o=[];t.excludeScreenUI!==!1&&r.traverse(x=>{x.visible&&x.renderOrder>=fe.RENDER_LAYERS.SCREEN_UI&&(o.push(x),x.visible=!1)});const p=a.getRenderTarget(),v=a.xr.enabled;a.xr.enabled=!1,a.setRenderTarget(l),a.clear(),c._renderFrame(),a.setRenderTarget(p),a.xr.enabled=v,o.forEach(x=>{x.visible=!0})},-100),null},Ie=({style:e,canvasProps:t,children:n,loadingComponent:a,loadingTransitionDuration:r,errorComponent:s,renderTargetSize:c,renderOutputs:i={},onRenderOutputs:d})=>{const f=A.useRef(null),l=A.useRef(null),o=A.useRef(null),p=A.useRef(!1),{session:v}=ue.useXRContext(),x=ie.useXRReady(),u=ie.useXRError(),[h,g]=A.useState(!0);return A.useEffect(()=>{if(c){v._setRenderSize(Math.round(c.width),Math.round(c.height));return}const S=(w,E)=>{w<=0||E<=0||v._setRenderSize(Math.round(w),Math.round(E))},m=()=>{!l.current||p.current||(p.current=!0,v._setRenderTarget(l.current))},M=(w,E)=>{o.current!==null&&cancelAnimationFrame(o.current),o.current=requestAnimationFrame(()=>{o.current=null,S(w,E)})},_=new ResizeObserver(w=>{const E=w[0];if(!E)return;const{width:G,height:I}=E.contentRect;m(),M(G,I)});return f.current&&_.observe(f.current),m(),()=>{_.disconnect(),o.current!==null&&(cancelAnimationFrame(o.current),o.current=null),p.current=!1}},[c,v]),A.useEffect(()=>{x&&(r?setTimeout(()=>{g(!1)},r):g(!1))},[x,r]),B.jsxs("div",{id:"vincentt-xr-container",ref:f,style:{width:"100%",height:"100%",...e,position:"relative"},children:[h&&B.jsx("div",{style:le,children:a||B.jsx(Ae,{})}),u&&B.jsx("div",{style:le,children:s||B.jsx(Ce,{error:u.message})}),B.jsxs(ne.Canvas,{id:"vincentt-xr-canvas",ref:l,dpr:[1,3],gl:{alpha:!0,preserveDrawingBuffer:!1,antialias:!0,premultipliedAlpha:!1,toneMapping:U.NoToneMapping},...t,onCreated:S=>{c?v._setRenderSize(Math.round(c.width),Math.round(c.height)):v._setRenderTarget(l.current),v._setR3FState({renderer:S.gl,scene:S.scene,camera:S.camera}),S.gl.outputColorSpace=U.SRGBColorSpace,t!=null&&t.onCreated&&t.onCreated(S)},children:[B.jsx(ke,{onRenderOutputs:d,renderOutputs:i,size:c}),n]})]})},ve=(e,t,n,a,r)=>{const s=e/2,c=t/2,i=n.left*s+a.left,d=n.right*s-a.right,f=n.bottom*c+a.bottom,l=n.top*c-a.top,o=d-i,p=l-f,v=(i+d)/2,x=(f+l)/2,u=r[0]*o/2,h=r[1]*p/2;return{centerX:v,centerY:x,width:o,height:p,pivotX:u,pivotY:h}},Le={left:0,right:0,top:0,bottom:0},Be={left:0,right:0,top:0,bottom:0},Ge=[0,0],Xe=({anchors:e,offsets:t,pivot:n=Ge,children:a})=>{const{width:r,height:s}=se.useScreenSpace(),c=A.useMemo(()=>({anchors:{...Le,...e??{}},offsets:{...Be,...t??{}}}),[e,t]),i=A.useMemo(()=>ve(r,s,c.anchors,c.offsets,n),[r,s,c,n]);A.useEffect(()=>{const o=c.anchors;o.left>o.right&&console.warn(`[ScreenTransform] inverted X axis: anchors.left (${o.left}) > anchors.right (${o.right})`),o.bottom>o.top&&console.warn(`[ScreenTransform] inverted Y axis: anchors.bottom (${o.bottom}) > anchors.top (${o.top})`),i.width<=0&&console.warn(`[ScreenTransform] zero or negative width (${i.width.toFixed(3)}) — anchors + offsets collapse the X extent`),i.height<=0&&console.warn(`[ScreenTransform] zero or negative height (${i.height.toFixed(3)}) — anchors + offsets collapse the Y extent`)},[c,i.width,i.height]);const d=n[0]!==0||n[1]!==0,f=d?[1,1,1]:[i.width,i.height,1],l=!d&&i.width>0&&i.height>0?i.width/i.height:null;return B.jsx("group",{position:[i.centerX-i.pivotX,i.centerY-i.pivotY,0],scale:f,renderOrder:fe.RENDER_LAYERS.SCREEN_UI,children:B.jsx(se.ScreenRectAspectContext.Provider,{value:l,children:a})})};class pe{constructor(t,n){O(this,"capabilities");O(this,"snapshot");O(this,"listeners",new Set);O(this,"eventListeners",new Map);this.capabilities=t,this.snapshot={state:"idle",frame:0,time:0,playMode:"forward",loop:!0,loopCount:0,...n}}play(){const t=this.snapshot.state==="paused";this.update({state:"playing"}),this.emit(t?"Resume":"PlayBegin")}pause(){this.update({state:"paused"}),this.emit("Pause")}restart(){this.update({state:"playing",frame:0,time:0}),this.emit("PlayBegin")}setPlayMode(t){!this.capabilities.canReverse&&(t==="reverse"||t==="ping-pong"||t==="random")||this.update({playMode:t})}setLoop(t,n=0){this.update({loop:t,loopCount:n})}seek(t){this.capabilities.canSeek&&this.update({frame:Math.max(0,Math.floor(t)),time:Math.max(0,t)})}subscribe(t){return this.listeners.add(t),()=>this.listeners.delete(t)}on(t,n){const a=this.eventListeners.get(t)??new Set;return a.add(n),this.eventListeners.set(t,a),()=>this.off(t,n)}off(t,n){var a;(a=this.eventListeners.get(t))==null||a.delete(n)}getSnapshot(){return this.snapshot}dispose(){this.listeners.clear(),this.eventListeners.clear(),this.snapshot={...this.snapshot,state:"idle"}}updateSnapshot(t){this.update(t)}emit(t){var n;(n=this.eventListeners.get(t))==null||n.forEach(a=>a({type:t,snapshot:this.snapshot}))}update(t){this.snapshot={...this.snapshot,...t},this.listeners.forEach(n=>n(this.snapshot))}}const ge=(e,t,n,a,r)=>{const s=Math.max(1,Math.floor(t)),c=Math.max(0,Math.floor(e)),i=n==="ping-pong"&&s>1?s*2-2:s,d=Math.floor(c/i),f=r>0?d>=r:!a&&c>=i,l=f?i-1:c%i;return{frame:n==="reverse"?s-1-l%s:n==="random"?l*7919%s:n==="ping-pong"&&l>=s?i-l:l,ended:f,loop:d}},De=(e,t,n)=>{const a=Math.max(1,Math.floor(n));return Math.floor(Math.max(0,e)*Math.max(0,t))%a};var he={},me,Ue;function je(e,t,n,s){var r=0,s=s===void 0?{}:s,c=s.loop===void 0?null:s.loop,i=s.palette===void 0?null:s.palette;if(t<=0||n<=0||t>65535||n>65535)throw new Error("Width/Height invalid.");function d(h){var g=h.length;if(g<2||g>256||g&g-1)throw new Error("Invalid code/color length, must be power of 2 and 2 .. 256.");return g}e[r++]=71,e[r++]=73,e[r++]=70,e[r++]=56,e[r++]=57,e[r++]=97;var f=0,l=0;if(i!==null){for(var o=d(i);o>>=1;)++f;if(o=1<<f,--f,s.background!==void 0){if(l=s.background,l>=o)throw new Error("Background index out of range.");if(l===0)throw new Error("Background index explicitly passed as 0.")}}if(e[r++]=t&255,e[r++]=t>>8&255,e[r++]=n&255,e[r++]=n>>8&255,e[r++]=(i!==null?128:0)|f,e[r++]=l,e[r++]=0,i!==null)for(var p=0,v=i.length;p<v;++p){var x=i[p];e[r++]=x>>16&255,e[r++]=x>>8&255,e[r++]=x&255}if(c!==null){if(c<0||c>65535)throw new Error("Loop count invalid.");e[r++]=33,e[r++]=255,e[r++]=11,e[r++]=78,e[r++]=69,e[r++]=84,e[r++]=83,e[r++]=67,e[r++]=65,e[r++]=80,e[r++]=69,e[r++]=50,e[r++]=46,e[r++]=48,e[r++]=3,e[r++]=1,e[r++]=c&255,e[r++]=c>>8&255,e[r++]=0}var u=!1;this.addFrame=function(h,g,S,m,M,_){if(u===!0&&(--r,u=!1),_=_===void 0?{}:_,h<0||g<0||h>65535||g>65535)throw new Error("x/y invalid.");if(S<=0||m<=0||S>65535||m>65535)throw new Error("Width/Height invalid.");if(M.length<S*m)throw new Error("Not enough pixels for the frame size.");var w=!0,E=_.palette;if(E==null&&(w=!1,E=i),E==null)throw new Error("Must supply either a local or global palette.");for(var G=d(E),I=0;G>>=1;)++I;G=1<<I;var j=_.delay===void 0?0:_.delay,R=_.disposal===void 0?0:_.disposal;if(R<0||R>3)throw new Error("Disposal out of range.");var T=!1,k=0;if(_.transparent!==void 0&&_.transparent!==null&&(T=!0,k=_.transparent,k<0||k>=G))throw new Error("Transparent color index.");if((R!==0||T||j!==0)&&(e[r++]=33,e[r++]=249,e[r++]=4,e[r++]=R<<2|(T===!0?1:0),e[r++]=j&255,e[r++]=j>>8&255,e[r++]=k,e[r++]=0),e[r++]=44,e[r++]=h&255,e[r++]=h>>8&255,e[r++]=g&255,e[r++]=g>>8&255,e[r++]=S&255,e[r++]=S>>8&255,e[r++]=m&255,e[r++]=m>>8&255,e[r++]=w===!0?128|I-1:0,w===!0)for(var $=0,L=E.length;$<L;++$){var C=E[$];e[r++]=C>>16&255,e[r++]=C>>8&255,e[r++]=C&255}return r=$e(e,r,I<2?2:I,M),r},this.end=function(){return u===!1&&(e[r++]=59,u=!0),r},this.getOutputBuffer=function(){return e},this.setOutputBuffer=function(h){e=h},this.getOutputBufferPosition=function(){return r},this.setOutputBufferPosition=function(h){r=h}}function $e(e,t,n,a){e[t++]=n;var r=t++,s=1<<n,c=s-1,i=s+1,d=i+1,f=n+1,l=0,o=0;function p(_){for(;l>=_;)e[t++]=o&255,o>>=8,l-=8,t===r+256&&(e[r]=255,r=t++)}function v(_){o|=_<<l,l+=f,p(8)}var x=a[0]&c,u={};v(s);for(var h=1,g=a.length;h<g;++h){var S=a[h]&c,m=x<<8|S,M=u[m];if(M===void 0){for(o|=x<<l,l+=f;l>=8;)e[t++]=o&255,o>>=8,l-=8,t===r+256&&(e[r]=255,r=t++);d===4096?(v(s),d=i+1,f=n+1,u={}):(d>=1<<f&&++f,u[m]=d++),x=S}else x=M}return v(x),v(i),p(1),r+1===t?e[r]=0:(e[r]=t-r-1,e[t++]=0),t}function Pe(e){var t=0;if(e[t++]!==71||e[t++]!==73||e[t++]!==70||e[t++]!==56||(e[t++]+1&253)!==56||e[t++]!==97)throw new Error("Invalid GIF 87a/89a header.");var n=e[t++]|e[t++]<<8,a=e[t++]|e[t++]<<8,r=e[t++],s=r>>7,c=r&7,i=1<<c+1;e[t++],e[t++];var d=null,f=null;s&&(d=t,f=i,t+=i*3);var l=!0,o=[],p=0,v=null,x=0,u=null;for(this.width=n,this.height=a;l&&t<e.length;)switch(e[t++]){case 33:switch(e[t++]){case 255:if(e[t]!==11||e[t+1]==78&&e[t+2]==69&&e[t+3]==84&&e[t+4]==83&&e[t+5]==67&&e[t+6]==65&&e[t+7]==80&&e[t+8]==69&&e[t+9]==50&&e[t+10]==46&&e[t+11]==48&&e[t+12]==3&&e[t+13]==1&&e[t+16]==0)t+=14,u=e[t++]|e[t++]<<8,t++;else for(t+=12;;){var h=e[t++];if(!(h>=0))throw Error("Invalid block size");if(h===0)break;t+=h}break;case 249:if(e[t++]!==4||e[t+4]!==0)throw new Error("Invalid graphics extension block.");var g=e[t++];p=e[t++]|e[t++]<<8,v=e[t++],g&1||(v=null),x=g>>2&7,t++;break;case 254:for(;;){var h=e[t++];if(!(h>=0))throw Error("Invalid block size");if(h===0)break;t+=h}break;default:throw new Error("Unknown graphic control label: 0x"+e[t-1].toString(16))}break;case 44:var S=e[t++]|e[t++]<<8,m=e[t++]|e[t++]<<8,M=e[t++]|e[t++]<<8,_=e[t++]|e[t++]<<8,w=e[t++],E=w>>7,G=w>>6&1,I=w&7,j=1<<I+1,R=d,T=f,k=!1;if(E){var k=!0;R=t,T=j,t+=j*3}var $=t;for(t++;;){var h=e[t++];if(!(h>=0))throw Error("Invalid block size");if(h===0)break;t+=h}o.push({x:S,y:m,width:M,height:_,has_local_palette:k,palette_offset:R,palette_size:T,data_offset:$,data_length:t-$,transparent_index:v,interlaced:!!G,delay:p,disposal:x});break;case 59:l=!1;break;default:throw new Error("Unknown gif block: 0x"+e[t-1].toString(16))}this.numFrames=function(){return o.length},this.loopCount=function(){return u},this.frameInfo=function(L){if(L<0||L>=o.length)throw new Error("Frame index out of range.");return o[L]},this.decodeAndBlitFrameBGRA=function(L,C){var y=this.frameInfo(L),Z=y.width*y.height,P=new Uint8Array(Z);de(e,y.data_offset,P,Z);var q=y.palette_offset,W=y.transparent_index;W===null&&(W=256);var X=y.width,N=n-X,Y=X,K=(y.y*n+y.x)*4,Q=((y.y+y.height)*n+y.x)*4,F=K,V=N*4;y.interlaced===!0&&(V+=n*4*7);for(var H=8,z=0,b=P.length;z<b;++z){var D=P[z];if(Y===0&&(F+=V,Y=X,F>=Q&&(V=N*4+n*4*(H-1),F=K+(X+N)*(H<<1),H>>=1)),D===W)F+=4;else{var ee=e[q+D*3],te=e[q+D*3+1],re=e[q+D*3+2];C[F++]=re,C[F++]=te,C[F++]=ee,C[F++]=255}--Y}},this.decodeAndBlitFrameRGBA=function(L,C){var y=this.frameInfo(L),Z=y.width*y.height,P=new Uint8Array(Z);de(e,y.data_offset,P,Z);var q=y.palette_offset,W=y.transparent_index;W===null&&(W=256);var X=y.width,N=n-X,Y=X,K=(y.y*n+y.x)*4,Q=((y.y+y.height)*n+y.x)*4,F=K,V=N*4;y.interlaced===!0&&(V+=n*4*7);for(var H=8,z=0,b=P.length;z<b;++z){var D=P[z];if(Y===0&&(F+=V,Y=X,F>=Q&&(V=N*4+n*4*(H-1),F=K+(X+N)*(H<<1),H>>=1)),D===W)F+=4;else{var ee=e[q+D*3],te=e[q+D*3+1],re=e[q+D*3+2];C[F++]=ee,C[F++]=te,C[F++]=re,C[F++]=255}--Y}}}function de(e,t,n,a){for(var r=e[t++],s=1<<r,c=s+1,i=c+1,d=r+1,f=(1<<d)-1,l=0,o=0,p=0,v=e[t++],x=new Int32Array(4096),u=null;;){for(;l<16&&v!==0;)o|=e[t++]<<l,l+=8,v===1?v=e[t++]:--v;if(l<d)break;var h=o&f;if(o>>=d,l-=d,h===s){i=c+1,d=r+1,f=(1<<d)-1,u=null;continue}else if(h===c)break;for(var g=h<i?h:u,S=0,m=g;m>s;)m=x[m]>>8,++S;var M=m,_=p+S+(g!==h?1:0);if(_>a){console.log("Warning, gif stream longer than expected.");return}n[p++]=M,p+=S;var w=p;for(g!==h&&(n[p++]=M),m=g;S--;)m=x[m],n[--w]=m&255,m>>=8;u!==null&&i<4096&&(x[i++]=u<<8|M,i>=f+1&&d<12&&(++d,f=f<<1|1)),u=h}return p!==a&&console.log("Warning, gif stream shorter than expected."),n}try{Ue=he.GifWriter=je,me=he.GifReader=Pe}catch{}const qe=me;function We(e){return async(t,n)=>{const a=e.find(r=>r.canResolve(t));if(!a)throw new we("No texture provider matched source",t);return Se(a.resolve.bind(a),t,n)}}class we extends Error{constructor(n,a){super(n);O(this,"source");this.name="TextureSourceLoadError",this.source=a}}function J(e){if(e.aborted)throw new DOMException("Texture source load aborted","AbortError")}async function Se(e,t,n){J(n);const a=await e(t,n);return n.aborted&&(a.dispose(),J(n)),a}function Ne(e){e==null||e.dispose()}const _e=5*1024*1024,ae=1e6,oe=180,Ye=(e,t,n)=>{for(let a=n.y;a<n.y+n.height;a+=1)e.fill(0,(a*t+n.x)*4,(a*t+n.x+n.width)*4)},Ve=(e,t,n,a,r)=>t.byteLength>_e?`file is ${(t.byteLength/1024/1024).toFixed(1)} MB; max is 5 MB`:n*a>ae?`canvas is ${n}x${a}; max area is ${ae}`:r>oe?`frame count is ${r}; max is ${oe}`:r===0?"frame count is 0":e?null:"source URL is empty",He=e=>typeof e=="string"?e:e.src,ze={canResolve:e=>typeof e=="string"?/\.gif(?:[?#].*)?$/i.test(e):e.kind==="gif",async resolve(e,t){const n=He(e),a=await fetch(n,{signal:t});if(!a.ok)throw new Error(`GIF request failed with ${a.status}`);const r=new Uint8Array(await a.arrayBuffer());J(t);const s=new qe(r),c=s.numFrames(),i=Ve(n,r,s.width,s.height,c);if(i)throw console.warn(`[xr-sdk] GIF ScreenImage source rejected: ${i}`,n),new Error(`GIF source rejected: ${i}`);const d=document.createElement("canvas");d.width=s.width,d.height=s.height;const f=d.getContext("2d");if(!f)throw new Error("Could not create GIF canvas context");const l=new U.CanvasTexture(d);l.colorSpace=U.SRGBColorSpace;const o=new Uint8Array(s.width*s.height*4),p=new ImageData(new Uint8ClampedArray(o.buffer),s.width,s.height),v=Array.from({length:c},(R,T)=>s.frameInfo(T)),x=v.reduce((R,T)=>R+Math.max(20,T.delay*10),0)/1e3,u=new pe({canSeek:!1,canReverse:!1,supportsLoopCount:!0},{state:"ready",duration:x,frameCount:c});let h=0,g=0,S=!1,m=!1,M=0,_=0,w=null;const E=(R,T=!1)=>{T&&(o.fill(0),w=null),(w==null?void 0:w.info.disposal)===2?Ye(o,s.width,w.info):w!=null&&w.restorePixels&&o.set(w.restorePixels);const k=v[R],$=k.disposal===3?new Uint8Array(o):null;return s.decodeAndBlitFrameRGBA(R,o),f.putImageData(p,0,0),l.needsUpdate=!0,w={info:k,restorePixels:$},m=!0,u.updateSnapshot({frame:R,time:v.slice(0,R).reduce((L,C)=>L+Math.max(20,C.delay*10),0)/1e3}),m=!1,u.emit("KeyFrameInSecond"),Math.max(20,k.delay*10)},G=R=>{g=window.setTimeout(()=>{h=requestAnimationFrame(I)},R)},I=()=>{if(S||u.getSnapshot().state!=="playing")return;const R=u.getSnapshot(),T=ge(M,c,R.playMode,R.loop,R.loopCount);if(T.ended){u.updateSnapshot({state:"ended",frame:T.frame,time:x}),u.emit("PlayEnd");return}const k=T.loop!==_;_=T.loop,M+=1,G(E(T.frame,k))},j=u.subscribe(R=>{m||(clearTimeout(g),cancelAnimationFrame(h),R.state==="playing"&&(h=requestAnimationFrame(I)))});return E(0),u.play(),{texture:l,controller:u,metadata:{width:s.width,height:s.height,duration:x,frameCount:c},dispose(){S=!0,j(),clearTimeout(g),cancelAnimationFrame(h),u.dispose(),l.dispose()}}}},ye=A.createContext(null),Re=A.createContext(null),Oe=()=>A.useContext(ye),Ze=()=>A.useContext(Re);exports.BasicAnimatedTextureController=pe;exports.MAX_GIF_BYTES=_e;exports.MAX_GIF_FRAMES=oe;exports.MAX_GIF_PIXELS=ae;exports.ScreenTransform=Xe;exports.TextureSourceLoadError=we;exports.XRScene=Ie;exports.XRViewportRenderOutputsContext=Re;exports.XRViewportStateContext=ye;exports.computeScreenTransform=ve;exports.createTextureSourceResolver=We;exports.disposeResolvedTextureSource=Ne;exports.getPlaybackFrame=ge;exports.getSequenceFrame=De;exports.gifTextureSourceProvider=ze;exports.resolveTextureSource=Se;exports.throwIfAborted=J;exports.useXRViewportRenderOutputs=Ze;exports.useXRViewportState=Oe;
|
package/dist/index-CNGzE49z.cjs
DELETED
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
"use strict";const l=require("react/jsx-runtime"),J=require("@react-three/fiber"),v=require("react"),Y=require("three"),z=require("./index-C9yQVzAh.cjs"),re=require("./FaceMeshRenderer-BSOq1OnG.cjs"),x=require("./renderPasses-KUJUSevp.cjs"),te=require("./contexts-BgWfyxre.cjs"),Xe=require("./index-ZaDEzDtR.cjs"),Pe=require("./index-WPPnlFO1.cjs"),rt=require("./useFaceInfo-BvZeUBsL.cjs"),Ae=require("./index-Da7uycur.cjs"),it=require("@react-three/drei");function st(t){const e=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(t){for(const n in t)if(n!=="default"){const r=Object.getOwnPropertyDescriptor(t,n);Object.defineProperty(e,n,r.get?r:{enumerable:!0,get:()=>t[n]})}}return e.default=t,Object.freeze(e)}const w=st(Y),q={width:720,height:1280},ot=(t=[.5,.5])=>[t[0]*2-1,t[1]*2-1],de=({position:t=[0,0],size:e=[1,1]})=>{const n=e[0]/2,r=e[1]/2;return{left:t[0]-n,right:t[0]+n,top:t[1]+r,bottom:t[1]-r}},at=({position:t=[0,0],size:e=[q.width,q.width],canvasSize:n=q})=>{const r=n.width/2||q.width/2,s=n.height/2||q.height/2;return de({position:[t[0]/r,t[1]/s],size:[e[0]/r,e[1]/s]})},je=({coordinateSpace:t="normalized",canvasSize:e=q,position:n,size:r,fallbackAnchors:s})=>s||(!n&&!r?de({}):t==="canvas"?at({position:n,size:r,canvasSize:e}):de({position:n,size:r})),he=(t,e)=>{if(!Number.isFinite(t)||t<=0)throw new RangeError(`${e} must be positive`);return t},oe=(t,e)=>{const n=he(e.width,"root.width"),r=he(e.height,"root.height");return!Number.isFinite(t.width)||!Number.isFinite(t.height)||t.width<=0||t.height<=0?0:Math.min(t.width/n,t.height/r)},ve=(t,e,n,r)=>{const s=oe(e,n);return s===0?Object.assign(r,{x:0,y:0}):(r.x=(t.x-e.width*.5)/s,r.y=(e.height*.5-t.y)/s,r)},Ce=(t,e,n,r)=>{const s=oe(e,n);return r.x=t.x*s+e.width*.5,r.y=e.height*.5-t.y*s,r},Ge=({parentSize:t,referencePixelsPerUnit:e=x.DEFAULT_REFERENCE_PIXELS_PER_UNIT,root:n=x.DEFAULT_SCREEN_TRANSFORM_ROOT})=>oe(t,n)*(x.DEFAULT_REFERENCE_PIXELS_PER_UNIT/he(e,"referencePixelsPerUnit")),lt=(t,e)=>t*Ge(e),ct=(t,e)=>{const n=Ge(e);return n===0?0:t/n},At=({point:t,rect:e,root:n=x.DEFAULT_SCREEN_TRANSFORM_ROOT,target:r={x:0,y:0}})=>ve({x:t.x-e.left,y:t.y-e.top},e,n,r),dt=({point:t,rect:e,root:n=x.DEFAULT_SCREEN_TRANSFORM_ROOT,target:r={x:0,y:0}})=>(Ce(t,e,n,r),r.x+=e.left,r.y+=e.top,r),He=({point:t,root:e=x.DEFAULT_SCREEN_TRANSFORM_ROOT,target:n={x:0,y:0},viewportSize:r})=>ve({x:t.x*r.width,y:t.y*r.height},r,e,n),ht=({point:t,root:e=x.DEFAULT_SCREEN_TRANSFORM_ROOT,target:n={x:0,y:0},viewportSize:r})=>r.width<=0||r.height<=0?Object.assign(n,{x:0,y:0}):(Ce(t,r,e,n),n.x/=r.width,n.y/=r.height,n),gt=({layout:t,mirrored:e=!1,point:n,root:r=x.DEFAULT_SCREEN_TRANSFORM_ROOT,target:s={x:0,y:0}})=>{if(t.scale<=0)return Object.assign(s,{x:0,y:0});const i=t.offsetX+n.x*t.scale;return ve({x:e?t.destination.width-i:i,y:t.offsetY+n.y*t.scale},t.destination,r,s)},ut=({layout:t,mirrored:e=!1,point:n,root:r=x.DEFAULT_SCREEN_TRANSFORM_ROOT,target:s={x:0,y:0}})=>{if(t.scale<=0)return Object.assign(s,{x:0,y:0});Ce(n,t.destination,r,s);const i=e?t.destination.width-s.x:s.x;return s.x=(i-t.offsetX)/t.scale,s.y=(s.y-t.offsetY)/t.scale,s},ae=new Y.Vector3,Qe=new Y.Vector2,ke=new Y.Raycaster,ft=({camera:t,point:e,root:n=x.DEFAULT_SCREEN_TRANSFORM_ROOT,target:r={x:0,y:0,depth:0},viewportSize:s})=>{const i=oe(s,n);return ae.set(e.x,e.y,e.z).project(t),r.x=i===0?0:ae.x*s.width/(2*i),r.y=i===0?0:ae.y*s.height/(2*i),r.depth=ae.z,r},St=({camera:t,point:e,root:n=x.DEFAULT_SCREEN_TRANSFORM_ROOT,target:r=new Y.Ray,viewportSize:s})=>{const i=oe(s,n);return Qe.set(s.width<=0?0:e.x*i*2/s.width,s.height<=0?0:e.y*i*2/s.height),ke.setFromCamera(Qe,t),r.copy(ke.ray)},Je=({children:t,depth:e=0})=>{const{camera:n,size:r}=J.useThree(),s=v.useMemo(()=>{if(!n.isPerspectiveCamera)return{width:10,height:10};const i=n,o=Math.abs(i.position.z-e),c=i.fov*Math.PI/180,a=2*Math.tan(c/2)*o;return{width:a*(r.width/r.height),height:a}},[n,r,e]);return l.jsx(z.ScreenSpaceContext.Provider,{value:s,children:l.jsx("group",{position:[0,0,e],children:t})})},Ne=v.forwardRef(({texture:t,name:e,overlay:n,opacity:r,position:s,rotation:i,scale:o,visible:c,renderOrder:a},d)=>l.jsxs("mesh",{ref:d,name:e,position:s,rotation:i,scale:o,visible:c,renderOrder:a,children:[l.jsx("planeGeometry",{args:[1,1]}),l.jsx("meshBasicMaterial",{map:t,transparent:!0,opacity:r,depthTest:!n,depthWrite:!n})]}));Ne.displayName="TextLabelMesh";const Et={color:"#ffffff",strokeWidth:0,strokeOpacity:1,shadowBlur:0,shadowOffsetX:0,shadowOffsetY:0,shadowOpacity:1,fontWeight:"bold",fontStyle:"normal",fontFamily:"Arial, sans-serif",fontSize:48,textAlign:"center",verticalAlign:"center",minFontSize:12,letterSpacing:0,lineSpacing:.3,bgColor:"rgba(20,40,110,0.88)",bgFillMode:"solid",bgOpacity:1,bgFit:"full",bgTextureFit:"cover",bgTextureFlipX:!1,bgTextureFlipY:!1,borderWidth:0,borderRadius:24,padding:32,aspect:2.5,resolution:512,opacity:1,underline:!1,strikethrough:!1,bendPreset:"arc",bendStrength:0},ge=t=>{v.useEffect(()=>()=>{t==null||t.dispose()},[t])};function vt(t,e,n){return n==="left"?e:n==="right"?t-e:t/2}function Ct(t,e,n,r,s){return s==="top"?e+n/2:s==="bottom"?t-e-r+n/2:t/2-(r-n)/2}function mt(t,e,n,r){return r==="full"||n==="left"?0:n==="right"?t-e:(t-e)/2}function ze(t,e,n,r){return`${t} ${e} ${n}px ${r}`}function se(t,e){const n=Math.max(0,Math.min(e,1));return t*n*.08}function Ue(t,e){const n=Math.max(0,Math.min(e,1));return t*(1.2+n*.6)}function Ke(t,e){"letterSpacing"in t&&(t.letterSpacing=`${e}px`)}function Ve(t){"letterSpacing"in t&&(t.letterSpacing="0px")}function ne(t,e,n){Ke(t,n);const r=t.measureText(e).width;return Ve(t),r}function ue(t,e,n,r){return Math.max(1,Math.floor((t-e*2)/Ue(n,r)))}function bt(t,e,n,r,s){return e.length<=r&&e.every(i=>ne(t,i,s)<=n)}function fe(t,e,n,r,s,i,o,c){t.font=ze(r,s,i,o);const a=e.split(" "),d=[];let A="";for(const g of a){const u=A?`${A} ${g}`:g;ne(t,u,c)>n&&A?(d.push(A),A=g):A=u}return A&&d.push(A),d}function Fe(t,e,n,r,s,i,o,c){const d=e.split(/\r?\n/).flatMap(A=>A.trim().length===0?[""]:fe(t,A,n,r,s,i,o,c));return d.length>0?d:[e]}function qe(t,e,n,r,s){const i=r?"...":"";let o=e.trimEnd();for(;o.length>0&&ne(t,`${o}${i}`,s)>n;)o=o.slice(0,-1).trimEnd();return`${o}${i}`}function Se(t,e,n,r,s){return e.map((i,o)=>{if(ne(t,i,s)<=n)return i;const c=o===e.length-1;return qe(t,i,n,r==="ellipsis"&&c,s)})}function Le(t,e,n,r,s,i){if(e.length<=n)return Se(t,e,r,s?"ellipsis":"clip",i);const o=e.slice(0,n),c=o[n-1];return o[n-1]=qe(t,c,r,s,i),Se(t,o,r,s?"ellipsis":"clip",i)}function It(t){const{ctx:e,text:n,explicitLines:r,maxWidth:s,maxHeight:i,padding:o,fontStyle:c,fontWeight:a,fontSize:d,fontFamily:A,letterSpacing:g,lineSpacing:u,overflow:S,resizeToFit:C,minFontSize:E}=t;let f=d,m=se(f,g),I=r??Fe(e,n,s,c,a,f,A,m),b=ue(i,o,f,u);const p=C===!0||S==="shrink";for(;p&&!bt(e,I,s,b,m)&&f>E&&(f=Math.max(E,f-4),m=se(f,g),I=r??Fe(e,n,s,c,a,f,A,m),b=ue(i,o,f,u),f!==E););return S==="ellipsis"?I=Le(e,I,b,s,!0,m):S==="clamp"||S==="shrink"?I=Le(e,I,b,s,!1,m):S!=="clip"&&(I=Se(e,I,s,void 0,m)),{fontSize:f,lines:I}}function Tt(t){const{ctx:e,text:n,maxWidth:r,maxHeight:s,padding:i,fontStyle:o,fontWeight:c,fontSize:a,fontFamily:d,letterSpacing:A,lineSpacing:g}=t;let u=a,S=fe(e,n,r,o,c,u,d,se(u,A));const C=ue(s,i,u,g);return S.length>C&&(u=Math.max(12,Math.round(u*.75)),S=fe(e,n,r,o,c,u,d,se(u,A))),{fontSize:u,lines:S}}function Ee(t,e){return typeof OffscreenCanvas<"u"?new OffscreenCanvas(t,e):(()=>{const n=document.createElement("canvas");return n.width=t,n.height=e,n})()}function xt(t,e){const n=e.width-e.padding*2,s=Array.isArray(e.lines)||e.text.includes(`
|
|
2
|
-
`)||e.overflow!==void 0||e.resizeToFit!==void 0?It({ctx:t,text:e.text,explicitLines:e.lines,maxWidth:n,maxHeight:e.height,padding:e.padding,fontStyle:e.fontStyle,fontWeight:e.fontWeight,fontSize:e.fontSize,fontFamily:e.fontFamily,overflow:e.overflow,resizeToFit:e.resizeToFit,minFontSize:e.minFontSize,letterSpacing:e.letterSpacing,lineSpacing:e.lineSpacing}):Tt({ctx:t,text:e.text,maxWidth:n,maxHeight:e.height,padding:e.padding,fontStyle:e.fontStyle,fontWeight:e.fontWeight,fontSize:e.fontSize,fontFamily:e.fontFamily,letterSpacing:e.letterSpacing,lineSpacing:e.lineSpacing}),i=s.fontSize,o=s.lines;t.font=ze(e.fontStyle,e.fontWeight,i,e.fontFamily);const c=se(i,e.letterSpacing),a=Ue(i,e.lineSpacing),d=Math.max(i,i+(o.length-1)*a),A=Ct(e.height,e.padding,i,d,e.verticalAlign),g=o.map(u=>ne(t,u,c));return{fontSize:i,resolvedLines:o,letterSpacingPx:c,lineHeight:a,startY:A,textBlockWidth:Math.min(e.width,Math.max(0,Math.max(...g,0))+e.padding*2),textBlockHeight:Math.min(e.height,d+e.padding*2),textX:vt(e.width,e.padding,e.textAlign)}}function yt(t,e,n,r,s,i){t.beginPath(),t.moveTo(e+i,n),t.lineTo(e+r-i,n),t.quadraticCurveTo(e+r,n,e+r,n+i),t.lineTo(e+r,n+s-i),t.quadraticCurveTo(e+r,n+s,e+r-i,n+s),t.lineTo(e+i,n+s),t.quadraticCurveTo(e,n+s,e,n+s-i),t.lineTo(e,n+i),t.quadraticCurveTo(e,n,e+i,n),t.closePath()}function Re(t,e,n){return typeof t!="number"||Number.isNaN(t)||t<=0?e:Math.min(t,n)}function Mt(t,e){const n=mt(e.canvasWidth,e.panelWidth,e.textAlign,e.bgFit),r=(e.canvasHeight-e.panelHeight)/2,s=Math.min(e.borderRadius,Math.min(e.panelWidth,e.panelHeight)/2);yt(t,n,r,e.panelWidth,e.panelHeight,s),Bt(t,{panelX:n,panelY:r,panelWidth:e.panelWidth,panelHeight:e.panelHeight,bgColor:e.bgColor,bgFillMode:e.bgFillMode,bgOpacity:e.bgOpacity,bgGradientStops:e.bgGradientStops,bgTextureImage:e.bgTextureImage,bgTextureFit:e.bgTextureFit,bgTextureFlipX:e.bgTextureFlipX,bgTextureFlipY:e.bgTextureFlipY}),e.borderColor&&e.borderWidth>0&&(t.lineWidth=e.borderWidth,t.strokeStyle=e.borderColor,t.stroke())}function Bt(t,e){if(t.save(),t.globalAlpha=Math.max(0,Math.min(e.bgOpacity,1)),e.bgFillMode==="gradient"&&e.bgGradientStops&&e.bgGradientStops.length>1){const n=t.createLinearGradient(e.panelX,e.panelY,e.panelX+e.panelWidth,e.panelY+e.panelHeight);[...e.bgGradientStops].sort((r,s)=>r.position-s.position).forEach(r=>n.addColorStop(Math.max(0,Math.min(r.position,1)),r.color)),t.fillStyle=n,t.fill(),t.restore();return}if(e.bgTextureImage){t.clip(),pt(t,{image:e.bgTextureImage,x:e.panelX,y:e.panelY,width:e.panelWidth,height:e.panelHeight,fit:e.bgTextureFit,flipX:e.bgTextureFlipX,flipY:e.bgTextureFlipY}),t.restore();return}t.fillStyle=e.bgColor,t.fill(),t.restore()}function pt(t,e){const{image:n,x:r,y:s,width:i,height:o,fit:c,flipX:a,flipY:d}=e,A="naturalWidth"in n?n.naturalWidth:"videoWidth"in n?n.videoWidth:n.width,g="naturalHeight"in n?n.naturalHeight:"videoHeight"in n?n.videoHeight:n.height;let u=i,S=o,C=r,E=s;if(c!=="stretch"&&A>0&&g>0){const f=c==="cover"?Math.max(i/A,o/g):Math.min(i/A,o/g);u=A*f,S=g*f,C=r+(i-u)/2,E=s+(o-S)/2}t.save(),(a||d)&&(t.translate(a?r+i:0,d?s+o:0),t.scale(a?-1:1,d?-1:1),C=a?-(C-r)-u+r:C,E=d?-(E-s)-S+s:E),t.drawImage(n,C,E,u,S),t.restore()}function wt(t,e,n,r,s,i){const o=s/72,c=Math.abs(o),a=1-Math.min(1,Math.abs(e)),d=Math.min(1,Math.abs(e)),A=r<=1?.5:n/(r-1),g=Math.sin(A*Math.PI*2-Math.PI/2),u=Math.sin(A*Math.PI*2.7-Math.PI/2)*(.65+A*.35),S=s*e*e,C=2*s*e/i,E={xOffset:0,yOffset:0,rotation:0,scaleX:1,scaleY:1};switch(t){case"arc":return{...E,yOffset:S,rotation:Math.atan(C)};case"arc-lower":return{...E,yOffset:S*.55,scaleY:Math.max(.2,1+o*e*e*.45)};case"arc-upper":return{...E,yOffset:-S*.55,scaleY:Math.max(.2,1-o*e*e*.45)};case"arch":return{...E,yOffset:S};case"bulge":return{...E,scaleY:Math.max(.2,1+o*a*.75)};case"shell-lower":return{...E,yOffset:s*.45*A*a,scaleY:Math.max(.2,1+o*A*a)};case"shell-upper":return{...E,yOffset:-s*.45*(1-A)*a,scaleY:Math.max(.2,1+o*(1-A)*a)};case"flag":return{...E,yOffset:s*.65*u,rotation:Math.atan(s/Math.max(i,1)*Math.cos(A*Math.PI*2.7)*1.6)};case"wave":return{...E,yOffset:s*.6*g,rotation:Math.atan(s/Math.max(i,1)*Math.cos(A*Math.PI*2)*1.4)};case"fish":return{...E,scaleX:Math.max(.25,1-c*d*.55),scaleY:Math.max(.2,1+o*a)};case"rise":return{...E,yOffset:s*e};case"fisheye":return{...E,yOffset:s*.18*e*a,scaleX:Math.max(.25,1+o*a*.7),scaleY:Math.max(.2,1+o*a*.7)};case"inflate":return{...E,scaleX:Math.max(.25,1+o*a*.6),scaleY:Math.max(.2,1+o*a*.6)};case"squeeze":return{...E,scaleY:Math.max(.2,1-o*a*.8)};case"twist":return{...E,yOffset:s*e,rotation:o*e*.45,scaleY:Math.max(.2,1+o*e*.25)};default:return E}}function $(t,e,n,r,s,i,o="arc",c=0){if(c!==0){Qt(t,e,n,r,s,i,o,c);return}Ke(t,s),i==="fill"?t.fillText(e,n,r):t.strokeText(e,n,r),Ve(t)}function Qt(t,e,n,r,s,i,o,c){const a=Array.from(e);if(a.length===0)return;const d=a.map(m=>t.measureText(m).width),A=d.reduce((m,I)=>m+I,0)+s*Math.max(0,a.length-1),g=t.textAlign,u=g==="right"?n-A:g==="center"?n-A/2:n,C=Math.max(-100,Math.min(c,100))/100*72,E=Math.max(A/2,1);let f=u;for(let m=0;m<a.length;m++){const I=a[m],b=d[m],p=f+b/2,Q=(p-u-A/2)/E,M=wt(o,Q,m,a.length,C,E);t.save(),t.translate(p+M.xOffset,r+M.yOffset),t.rotate(M.rotation),t.scale(M.scaleX,M.scaleY),t.textAlign="center",i==="fill"?t.fillText(I,0,0):t.strokeText(I,0,0),t.restore(),f+=b+s}}function De(t,e,n,r,s,i,o,c,a){const d=ne(t,e,c),A=s==="center"?n-d/2:s==="right"?n-d:n,g=a==="underline"?o*.42:-o*.08,u=r+g;t.save(),t.strokeStyle=i,t.lineWidth=Math.max(2,o*.06),t.lineCap="round",t.beginPath(),t.moveTo(A,u),t.lineTo(A+d,u),t.stroke(),t.restore()}function kt(t,e){for(let n=0;n<e.lines.length;n++){const r=e.lines[n],s=e.startY+n*e.lineHeight;for(const i of e.shadowLayers)t.save(),t.shadowColor=i.color,t.shadowBlur=i.blur,t.shadowOffsetX=i.offsetX??0,t.shadowOffsetY=i.offsetY??0,t.globalAlpha=i.opacity??1,t.fillStyle=e.color,$(t,r,e.textX,s,e.letterSpacingPx,"fill",e.bendPreset,e.bendStrength),t.restore();for(const i of e.strokeLayers)t.save(),t.lineJoin="round",t.miterLimit=2,t.lineWidth=i.width,t.strokeStyle=i.color,t.globalAlpha=i.opacity??1,$(t,r,e.textX,s,e.letterSpacingPx,"stroke",e.bendPreset,e.bendStrength),t.restore();t.save(),t.fillStyle=e.color,t.globalAlpha=1,$(t,r,e.textX,s,e.letterSpacingPx,"fill",e.bendPreset,e.bendStrength),t.restore(),e.underline&&De(t,r,e.textX,s,e.textAlign,e.color,e.fontSize,e.letterSpacingPx,"underline"),e.strikethrough&&De(t,r,e.textX,s,e.textAlign,e.color,e.fontSize,e.letterSpacingPx,"strikethrough")}}function Ft(t,e){const n=Math.max(0,Math.min(e.intensity,1));if(n<=0)return;const r=Math.max(0,Math.min(e.range,1)),s=r*72,i=Math.max(-.5,Math.min(e.horizontalAngle,.5))*80,o=Math.max(-.5,Math.min(e.verticalAngle,.5))*80;for(let c=0;c<e.lines.length;c++){const a=e.startY+c*e.lineHeight;t.save(),t.globalAlpha=n,t.shadowColor=e.color,t.shadowBlur=s,t.shadowOffsetX=i,t.shadowOffsetY=o,e.style==="contoured"?(t.lineJoin="round",t.miterLimit=2,t.lineWidth=Math.max(2,r*42),t.strokeStyle=e.color,$(t,e.lines[c],e.textX,a,e.letterSpacingPx,"stroke",e.bendPreset,e.bendStrength)):(t.fillStyle=e.color,$(t,e.lines[c],e.textX,a,e.letterSpacingPx,"fill",e.bendPreset,e.bendStrength)),t.restore()}}function Lt(t,e){const n=Ee(e.width,e.height),r=n.getContext("2d");r.clearRect(0,0,e.width,e.height),r.font=e.font,r.fillStyle="#ffffff",r.textAlign=e.textAlign,r.textBaseline="middle";for(let o=0;o<e.lines.length;o++)$(r,e.lines[o],e.textX,e.startY+o*e.lineHeight,e.letterSpacingPx,"fill",e.bendPreset,e.bendStrength);const s=Ee(e.width,e.height),i=s.getContext("2d");i.clearRect(0,0,e.width,e.height),i.save(),i.globalAlpha=e.opacity,i.filter=e.blur>0?`blur(${e.blur}px)`:"none",i.drawImage(n,e.offsetX,e.offsetY),i.restore(),i.globalCompositeOperation="destination-in",i.drawImage(n,0,0),i.globalCompositeOperation="source-in",i.globalAlpha=e.opacity,i.fillStyle=e.color,i.fillRect(0,0,e.width,e.height),t.drawImage(s,0,0)}function Rt(t){const{width:e,height:n,color:r,strokeLayers:s,strokeColor:i,strokeWidth:o,strokeOpacity:c,shadowLayers:a,innerShadow:d,glow:A,shadowColor:g,shadowBlur:u,shadowOffsetX:S,shadowOffsetY:C,shadowOpacity:E,textAlign:f,bgFillMode:m,bgOpacity:I,bgFit:b,bgAutoSize:p,bgWidth:Q,bgHeight:M,bgGradientStops:T,bgTextureImage:h,bgTextureFit:B,bgTextureFlipX:j,bgTextureFlipY:O,underline:Z,strikethrough:U,bendPreset:G,bendStrength:D}=t;let{fontSize:K,bgColor:N}=t;const V=[...s??[],...i&&o>0?[{color:i,width:o,opacity:c}]:[]].filter(L=>L.width>0),W=[...a??[],...g&&(u>0||S!==0||C!==0)?[{color:g,blur:u,offsetX:S,offsetY:C,opacity:E}]:[]].filter(L=>L.blur>0||(L.offsetX??0)!==0||(L.offsetY??0)!==0);let R;const H=Ee(e,n),F=H.getContext("2d");F.clearRect(0,0,e,n),F.fillStyle=r,F.textAlign=f,F.textBaseline="middle";const y=xt(F,t);if(K=y.fontSize,N!=="transparent"){const L=p===!0,_=Re(L?void 0:Q,b==="text"||L?y.textBlockWidth:e,e),X=Re(L?void 0:M,b==="text"||L?y.textBlockHeight:n,n);Mt(F,{canvasWidth:e,canvasHeight:n,textAlign:f,bgFit:b,panelWidth:_,panelHeight:X,bgColor:N,bgFillMode:m,bgOpacity:I,bgGradientStops:T,bgTextureImage:h,bgTextureFit:B,bgTextureFlipX:j,bgTextureFlipY:O,borderColor:t.borderColor,borderWidth:t.borderWidth,borderRadius:t.borderRadius})}return A&&Ft(F,{lines:y.resolvedLines,textX:y.textX,startY:y.startY,lineHeight:y.lineHeight,letterSpacingPx:y.letterSpacingPx,bendPreset:G,bendStrength:D,color:A.color,style:A.style,intensity:A.intensity??.5,range:A.range??.5,horizontalAngle:A.horizontalAngle??0,verticalAngle:A.verticalAngle??0}),kt(F,{lines:y.resolvedLines,textX:y.textX,startY:y.startY,lineHeight:y.lineHeight,textAlign:f,color:r,fontSize:K,letterSpacingPx:y.letterSpacingPx,bendPreset:G,bendStrength:D,shadowLayers:W,strokeLayers:V,underline:Z,strikethrough:U}),d&&Lt(F,{width:e,height:n,font:F.font,lines:y.resolvedLines,textX:y.textX,startY:y.startY,lineHeight:y.lineHeight,letterSpacingPx:y.letterSpacingPx,bendPreset:G,bendStrength:D,textAlign:f,color:d.color,opacity:d.opacity??1,blur:d.blur,offsetX:d.offsetX??0,offsetY:d.offsetY??0}),R=new w.CanvasTexture(H),R.needsUpdate=!0,R}function Dt(t,e){const{lines:n,color:r,strokeLayers:s,outlineEnabled:i,strokeColor:o,strokeWidth:c,strokeOpacity:a,shadowLayers:d,shadowEnabled:A,innerShadow:g,glow:u,shadowColor:S,shadowBlur:C,shadowOffsetX:E,shadowOffsetY:f,shadowOpacity:m,fontWeight:I,fontStyle:b,fontFamily:p,fontSize:Q,textAlign:M,verticalAlign:T,overflow:h,resizeToFit:B,minFontSize:j,letterSpacing:O,lineSpacing:Z,bgFillMode:U,bgOpacity:G,bgFit:D,bgAutoSize:K,bgWidth:N,bgHeight:V,bgGradientStops:W,bgTextureFit:R,bgTextureFlipX:H,bgTextureFlipY:F,borderColor:y,borderWidth:L,borderRadius:_,padding:X,aspect:me,resolution:ce,underline:be,strikethrough:Ie,bendPreset:Te,bendStrength:xe}=t,ye=v.useMemo(()=>i===!1?[]:s,[i,s]),Me=v.useMemo(()=>A===!1?[]:d,[A,d]),Be=void 0,pe=v.useMemo(()=>({text:e.text,lines:n,color:r,strokeLayers:ye,strokeColor:i===!1?void 0:o,strokeWidth:i===!1?0:c,strokeOpacity:a,shadowLayers:Me,innerShadow:g,glow:u,shadowColor:A===!1?void 0:S,shadowBlur:A===!1?0:C,shadowOffsetX:A===!1?0:E,shadowOffsetY:A===!1?0:f,shadowOpacity:m,fontWeight:I,fontStyle:b,fontFamily:p,fontSize:Q,textAlign:M,verticalAlign:T,overflow:h,resizeToFit:B,minFontSize:j,letterSpacing:O,lineSpacing:Z,bgColor:e.bgColor,bgFillMode:U,bgOpacity:G,bgFit:D,bgAutoSize:K,bgWidth:N,bgHeight:V,bgGradientStops:W,bgTextureImage:Be,bgTextureFit:R,bgTextureFlipX:H,bgTextureFlipY:F,borderColor:y,borderWidth:L,borderRadius:_,padding:X,height:ce,width:Math.round(ce*Math.max(me,.1)),underline:be,strikethrough:Ie,bendPreset:Te,bendStrength:xe}),[e.text,e.bgColor,n,r,ye,i,o,c,a,Me,g,u,A,S,C,E,f,m,I,b,p,Q,M,T,h,B,j,O,Z,U,G,D,K,N,V,W,Be,R,H,F,y,L,_,X,me,ce,be,Ie,Te,xe]),we=v.useMemo(()=>Rt(pe),[pe]);return ge(we),we}function Ze(t){const e={...Et,...t},{text:n,bgColor:r,opacity:s,name:i,overlay:o=!0,position:c,rotation:a,scale:d,visible:A,renderOrder:g}=e,[u,S]=v.useState(null),[C,E]=v.useState(null),f=v.useRef(n);f.current!==n&&(f.current=n,u!==null&&S(null));const m=v.useRef(r);m.current!==r&&(m.current=r,C!==null&&E(null));const I=v.useRef(null),Q=Dt(e,{text:u??n,bgColor:C??r});return v.useEffect(()=>{const M=I.current;if(M)return M.userData.setText=T=>S(T),M.userData.setBgColor=T=>E(T),()=>{delete M.userData.setText,delete M.userData.setBgColor}},[]),l.jsx(Ne,{ref:I,name:i,texture:Q,overlay:o,opacity:s,position:c,rotation:a,scale:d,visible:A,renderOrder:g})}function le(t,e){return!Number.isFinite(t)||!Number.isFinite(e)||t<=0||e<=0?[1,1,1]:Math.abs(t-e)<1e-6?[1,1,1]:t>e?[e/t,1,1]:[1,t/e,1]}const Yt="data:image/png;base64,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",Wt=(t,e)=>t||(e==="cover"?"fill":e==="stretch"?"stretch":"fit"),Ye=(t,e)=>{const[n,r]=le(t,e);return n===1&&r===1?[1,1,1]:n<1?[1,1/n,1]:[1/r,1,1]},Ot=(t,e,n,r,s,i,o)=>{let c=[1,1,1],a=[1,1,1],d=[1,1],A=[0,0];switch(t){case"fit":c=le(e,n),a=c;break;case"fitWidth":c=[1,e>0&&n>0?e/n:1,1],a=c;break;case"fitHeight":c=[e>0&&n>0?n/e:1,1,1],a=c;break;case"center":c=i&&o&&i.width>0&&i.height>0&&o.width>0&&o.height>0?[o.width/i.width,o.height/i.height,1]:le(e,n),a=c;break;case"fill":c=Ye(e,n),a=c;break;case"fillAndCut":if(a=Ye(e,n),n>e){const g=e/n;d=[g,1],A=[(1-g)/2,0]}else if(n<e){const g=n/e;d=[1,g],A=[0,(1-g)/2]}break}return{meshScale:[c[0]*(r?-1:1),c[1]*(s?-1:1),1],guideScale:a,repeat:d,offset:A}},Xt=(t,e)=>t??(e?{kind:"image",src:e}:{kind:"default"}),ee=t=>{const e=t.image;return{width:(e==null?void 0:e.videoWidth)??(e==null?void 0:e.width)??1,height:(e==null?void 0:e.videoHeight)??(e==null?void 0:e.height)??1}},Pt=t=>{const{width:e,height:n}=ee(t);return e>0&&n>0?e/n:1},jt=new Set(["overlay","softLight","hardLight","difference","exclusion"]),Gt={overlay:0,softLight:1,hardLight:2,difference:3,exclusion:4},Ht=t=>{switch(t){case"add":return{blending:w.AdditiveBlending};case"subtract":return{blending:w.SubtractiveBlending};case"multiply":return{blending:w.MultiplyBlending};case"screen":return{blending:w.CustomBlending,blendSrc:w.OneFactor,blendDst:w.OneMinusSrcColorFactor,blendEquation:w.AddEquation};case"lighten":return{blending:w.CustomBlending,blendSrc:w.OneFactor,blendDst:w.OneFactor,blendEquation:w.MaxEquation};case"darken":return{blending:w.CustomBlending,blendSrc:w.OneFactor,blendDst:w.OneFactor,blendEquation:w.MinEquation};default:return{blending:w.NormalBlending}}},Jt=`
|
|
3
|
-
varying vec2 vUv;
|
|
4
|
-
void main(){vUv=uv;gl_Position=projectionMatrix*modelViewMatrix*vec4(position,1.0);}`,Nt=`
|
|
5
|
-
uniform sampler2D imageMap;uniform sampler2D backdropMap;uniform vec2 resolution;
|
|
6
|
-
uniform vec3 tint;uniform float opacity;uniform float alphaTest;uniform int blendMode;varying vec2 vUv;
|
|
7
|
-
float overlayChannel(float b,float s){return b<.5?2.*b*s:1.-2.*(1.-b)*(1.-s);}
|
|
8
|
-
float hardLightChannel(float b,float s){return s<.5?2.*b*s:1.-2.*(1.-b)*(1.-s);}
|
|
9
|
-
float softLightChannel(float b,float s){return s<.5?b-(1.-2.*s)*b*(1.-b):b+(2.*s-1.)*(sqrt(max(b,0.))-b);}
|
|
10
|
-
vec3 applyAdvancedBlend(vec3 b,vec3 s){
|
|
11
|
-
if(blendMode==0)return vec3(overlayChannel(b.r,s.r),overlayChannel(b.g,s.g),overlayChannel(b.b,s.b));
|
|
12
|
-
if(blendMode==1)return vec3(softLightChannel(b.r,s.r),softLightChannel(b.g,s.g),softLightChannel(b.b,s.b));
|
|
13
|
-
if(blendMode==2)return vec3(hardLightChannel(b.r,s.r),hardLightChannel(b.g,s.g),hardLightChannel(b.b,s.b));
|
|
14
|
-
if(blendMode==3)return abs(b-s);return b+s-2.*b*s;}
|
|
15
|
-
void main(){vec4 image=texture2D(imageMap,vUv)*vec4(tint,opacity);if(image.a<=alphaTest)discard;
|
|
16
|
-
vec2 uv=gl_FragCoord.xy/max(resolution,vec2(1.));vec3 base=texture2D(backdropMap,uv).rgb;
|
|
17
|
-
vec3 mixed=applyAdvancedBlend(base,image.rgb);gl_FragColor=vec4(mix(base,mixed,image.a),1.);}`,zt=()=>{const t=document.createElement("canvas");t.width=256,t.height=256;const e=t.getContext("2d");if(!e)return new w.CanvasTexture(t);const n=e.createRadialGradient(96,80,10,128,128,128);n.addColorStop(0,"#ffffff"),n.addColorStop(.18,"#f8fafc"),n.addColorStop(.44,"#cbd5e1"),n.addColorStop(.72,"#475569"),n.addColorStop(1,"#0f172a"),e.fillStyle=n,e.fillRect(0,0,t.width,t.height);const r=new w.CanvasTexture(t);return r.needsUpdate=!0,r};function Ut({materialTexture:t,sourceTexture:e,onSourceSizeChange:n}){const r=v.useRef(ee(e));return J.useFrame(()=>{t.needsUpdate=!0;const s=ee(e);(s.width!==r.current.width||s.height!==r.current.height)&&(r.current=s,n(s))}),null}const Kt=999,Vt=Math.PI/180,qt=te.createTextureSourceResolver([te.gifTextureSourceProvider]);function Zt(t){const[e,n]=v.useState(null);return v.useEffect(()=>{if(n(null),!t||typeof document>"u")return;const r=new AbortController;let s;return qt({kind:"gif",src:t},r.signal).then(i=>{s=i,n(i)}).catch(i=>{i instanceof DOMException&&i.name==="AbortError"||console.warn("[xr-sdk] Failed to load GIF ScreenImage source",i)}),()=>{r.abort(),te.disposeResolvedTextureSource(s)}},[t]),e}function We({name:t,source:e,src:n,fit:r,stretchMode:s,materialType:i="unlit",blendMode:o="normal",backdropTexture:c=null,rotation:a=0,opacity:d=1,color:A="#ffffff",flipX:g=!1,flipY:u=!1,renderOrder:S=Kt,transparent:C=!0,alphaTest:E=0,overlay:f=!0,visible:m,layoutSize:I}){const{size:b}=J.useThree(),p=te.useXRViewportRenderOutputs(),Q=Xt(e,n),M=Q.kind==="image"?Q.src:Yt,T=it.useTexture(M),h=Zt(Q.kind==="gif"?Q.src:void 0),B=Q.kind==="texture"?Q.texture:Q.kind==="gif"?(h==null?void 0:h.texture)??T:T,j=z.useScreenRectAspect(),O=Wt(s,r),[Z,U]=v.useState(()=>ee(B));v.useEffect(()=>{U(ee(B))},[B]);const G=B instanceof w.VideoTexture||typeof HTMLCanvasElement<"u"&&B.image instanceof HTMLCanvasElement,D=G?Z:ee(B),K=v.useCallback(X=>U(X),[]),N=D.width>0&&D.height>0?D.width/D.height:Pt(B),V=v.useMemo(()=>zt(),[]),W=v.useMemo(()=>Ot(O,j,N,g,u,I,D),[O,j,N,g,u,I,D]),R=v.useMemo(()=>{const X=B.clone();return X.needsUpdate=!0,X.repeat.set(W.repeat[0],W.repeat[1]),X.offset.set(W.offset[0],W.offset[1]),X},[B,W.repeat,W.offset]);ge(R),ge(V);const H=v.useMemo(()=>Ht(o),[o]),F=jt.has(o)?o:null,y=c??(p==null?void 0:p.finalColorTexture)??(p==null?void 0:p.sceneColorTexture)??null,L=F!==null&&y!==null,_=v.useMemo(()=>({imageMap:{value:R},backdropMap:{value:y},resolution:{value:new w.Vector2(b.width,b.height)},tint:{value:new w.Color(A)},opacity:{value:d},alphaTest:{value:E},blendMode:{value:F===null?0:Gt[F]}}),[F,E,y,b.height,b.width,A,R,d]);return l.jsxs("group",{visible:m,children:[G?l.jsx(Ut,{materialTexture:R,sourceTexture:B,onSourceSizeChange:K}):null,l.jsxs("mesh",{name:t,scale:W.meshScale,rotation:[0,0,a*Vt],renderOrder:S,children:[l.jsx("planeGeometry",{args:[1,1]}),L?l.jsx("shaderMaterial",{uniforms:_,vertexShader:Jt,fragmentShader:Nt,transparent:!1,depthTest:!f,depthWrite:!f,toneMapped:!1}):i==="standardPBR"?l.jsx("meshStandardMaterial",{map:R,transparent:C||d<1,opacity:d,color:A,alphaTest:E,depthTest:!f,depthWrite:!f,toneMapped:!1,roughness:.72,metalness:.08,emissive:A,emissiveIntensity:.18,...H}):i==="matcap"?l.jsx("meshMatcapMaterial",{map:R,matcap:V,transparent:C||d<1,opacity:d,color:A,alphaTest:E,depthTest:!f,depthWrite:!f,toneMapped:!1,...H}):l.jsx("meshBasicMaterial",{map:R,transparent:C||d<1,opacity:d,color:A,alphaTest:E,depthTest:!f,depthWrite:!f,toneMapped:!1,...H})]})]})}const _t={left:0,right:0,top:0,bottom:0},$t=Math.PI/180;function en({anchors:t,offsets:e,pivot:n,rotation:r,children:s}){const{width:i,height:o}=z.useScreenSpace(),c=v.useMemo(()=>({left:-1,right:1,top:1,bottom:-1,...t}),[t]),a=v.useMemo(()=>({..._t,...e}),[e]),d=v.useMemo(()=>te.computeScreenTransform(i,o,c,a,n),[o,n,c,a,i]),A=d.width>0&&d.height>0?d.width/d.height:null;return l.jsx("group",{position:[d.centerX-d.pivotX,d.centerY-d.pivotY,0],rotation:[0,0,r*$t],scale:[d.width,d.height,1],children:l.jsx(z.ScreenRectAspectContext.Provider,{value:A,children:s})})}function tn({transform:t,guideLayer:e,onChange:n,children:r}){return l.jsx(x.ScreenTransformFrame,{guideColor:"#22d3ee",guideLayer:e,transform:t,onChange:n,children:r})}const nn={left:-1,right:1,top:1,bottom:-1},rn={},sn=[.5,.5];[["Normal","normal"],["Add","add"],["Subtract","subtract"],["Multiply","multiply"],["Screen","screen"],["Lighten","lighten"],["Darken","darken"],["Overlay","overlay"],["Soft Light","softLight"],["Hard Light","hardLight"],["Difference","difference"],["Exclusion","exclusion"]].map(([t,e])=>({label:t,value:e}));const on=t=>[t[0]*2-1,t[1]*2-1],an=(t,e,n,r,s)=>t||(!r&&!s?nn:je({coordinateSpace:e,canvasSize:n??q,position:r,size:s}));function _e({anchors:t,coordinateSpace:e,canvasSize:n,position:r,size:s,offsets:i=rn,pivot:o=sn,rotation:c=0,transform:a,onScreenTransformChange:d,transformGuideLayer:A="scene",...g}){const u=v.useMemo(()=>an(t,e,n,r,s),[t,n,e,r,s]),S=v.useMemo(()=>on(o),[o]);if(a){const C=x.mergeScreenTransform2D(a);return C.enabled?l.jsx(tn,{guideLayer:A,transform:C,onChange:d,children:l.jsx(We,{...g,layoutSize:C.size,renderOrder:g.renderOrder??C.renderOrder,overlay:g.overlay??C.overlay,visible:g.visible??C.visible,rotation:0})}):null}return l.jsx(en,{anchors:u,offsets:i,pivot:S,rotation:c,children:l.jsx(We,{...g,layoutSize:s?{width:s[0],height:s[1]}:void 0,rotation:0})})}const ln=2.5,cn="#38bdf8",An={top:{left:-.92,right:.92,top:.92,bottom:.56},center:{left:-.92,right:.92,top:.18,bottom:-.18},bottom:{left:-.92,right:.92,top:-.56,bottom:-.92}};function dn({bend:t,bendPreset:e,bendStrength:n}){return{bendPreset:(t==null?void 0:t.preset)??e,bendStrength:(t==null?void 0:t.strength)??n}}function hn({width:t,height:e}){const n=Math.max(1,t),r=Math.max(1,e);return{aspect:n/r,resolution:r}}function Oe(t){const e=z.useScreenRectAspect(),{bend:n,layoutSize:r,renderOrder:s,overlay:i=!0,...o}=t,c=r?hn(r):void 0,a=Math.max((c==null?void 0:c.aspect)??e??ln,.1),d=dn({bend:n,bendPreset:o.bendPreset,bendStrength:o.bendStrength});return l.jsx(Ze,{...o,aspect:a,resolution:(c==null?void 0:c.resolution)??o.resolution,...d,overlay:i,renderOrder:s})}function gn({transform:t,guideLayer:e,onChange:n,children:r}){return l.jsx(x.ScreenTransformFrame,{guideColor:cn,guideLayer:e,transform:t,onChange:n,children:r})}function un(t="center"){return An[t]}function fn({anchors:t,coordinateSpace:e,canvasSize:n,position:r,size:s,transform:i,pivot:o,verticalAlign:c}){return{resolvedAnchors:i!=null&&i.anchors?i.anchors:t||(i!=null&&i.position||i!=null&&i.size||r||s?je({coordinateSpace:(i==null?void 0:i.coordinateSpace)??e,canvasSize:(i==null?void 0:i.canvasSize)??n,position:(i==null?void 0:i.position)??r,size:(i==null?void 0:i.size)??s}):un(c)),resolvedOffsets:i==null?void 0:i.offsets,resolvedPivot:ot((i==null?void 0:i.pivot)??o??[.5,.5])}}function $e({anchors:t,coordinateSpace:e,canvasSize:n,offsets:r,pivot:s,position:i,rotation:o=0,size:c,transform:a,screenTransform:d,onScreenTransformChange:A,transformGuideLayer:g="scene",verticalAlign:u="center",...S}){const{resolvedAnchors:C,resolvedOffsets:E,resolvedPivot:f}=v.useMemo(()=>fn({anchors:t,coordinateSpace:e,canvasSize:n,position:i,size:c,transform:a,pivot:s,verticalAlign:u}),[t,n,e,s,i,c,a,u]),m=(a==null?void 0:a.offsets)??r??E,I=(a==null?void 0:a.rotation)??o;if(d){const b=x.mergeScreenTransform2D(d);return b.enabled?l.jsx(gn,{guideLayer:g,transform:b,onChange:A,children:l.jsx(Oe,{...S,layoutSize:b.size,verticalAlign:u,renderOrder:S.renderOrder??b.renderOrder,overlay:S.overlay??b.overlay,visible:S.visible??b.visible})}):null}return l.jsx(te.ScreenTransform,{anchors:C,offsets:m,pivot:f,children:l.jsx("group",{rotation:[0,0,I*Math.PI/180],children:l.jsx(Oe,{...S,verticalAlign:u})})})}const et=({settings:t,transform:e})=>{const n=v.useMemo(()=>l.jsxs("group",{name:"LightEditorGizmo",visible:t.showHelper,children:[l.jsxs("mesh",{renderOrder:1e3,children:[l.jsx("sphereGeometry",{args:[.12,12,8]}),l.jsx("meshBasicMaterial",{color:"#facc15",wireframe:!0,depthTest:!1,depthWrite:!1})]}),l.jsxs("mesh",{position:[0,0,-.35],rotation:[Math.PI/2,0,0],renderOrder:1e3,children:[l.jsx("coneGeometry",{args:[.08,.45,12]}),l.jsx("meshBasicMaterial",{color:"#fde047",wireframe:!0,depthTest:!1,depthWrite:!1})]})]}),[t.showHelper]);return t.enabled?l.jsxs(re.Transform3D,{value:e,children:[n,t.type==="ambient"?l.jsx("ambientLight",{color:t.color,intensity:t.intensity}):null,t.type==="directional"?l.jsx("directionalLight",{color:t.color,intensity:t.intensity,castShadow:t.castShadow}):null,t.type==="point"?l.jsx("pointLight",{color:t.color,intensity:t.intensity,distance:t.distance,decay:t.decay,castShadow:t.castShadow}):null,t.type==="spot"?l.jsx("spotLight",{color:t.color,intensity:t.intensity,distance:t.distance,angle:t.angle,penumbra:t.penumbra,decay:t.decay,castShadow:t.castShadow}):null]}):null},Sn=({source:t,target:e,settings:n})=>{if(!n.enabled||!e)return!1;const r=new Y.Quaternion;if(n.mode==="point"){const i=new Y.Vector3;e.getWorldPosition(i),t.lookAt(i),r.copy(t.quaternion)}else e.getWorldQuaternion(r);const s=new Y.Quaternion().setFromEuler(new Y.Euler(n.offsetRotation.x*Math.PI/180,n.offsetRotation.y*Math.PI/180,n.offsetRotation.z*Math.PI/180));return t.quaternion.copy(r).multiply(s),!0},tt=({target:t,settings:e,children:n})=>{const r=v.useRef(null);return J.useFrame(()=>{r.current&&Sn({source:r.current,target:t,settings:e})}),l.jsx("group",{ref:r,children:n})},En=(t,e)=>{let n=t;for(;n&&n!==e;){if("isTransformControls"in n&&n.isTransformControls===!0)return!0;n=n.parent}return!1},P=({children:t,layer:e})=>{const n=v.useRef(null),r=v.useRef(0),s=v.useCallback(()=>{e===void 0||!n.current||n.current.traverse(i=>{En(i,n.current)||i.layers.set(e)})},[e]);return v.useLayoutEffect(()=>{s(),r.current=2},[s,t]),J.useFrame(()=>{r.current<=0||(s(),r.current-=1)},-1e3),l.jsx("group",{ref:n,children:t})},k=(t,e)=>(t==null?void 0:t.type)===e,vn=t=>null,ie=({children:t,inside:e})=>e?l.jsx(l.Fragment,{children:t}):l.jsx(Je,{children:t}),Cn=({children:t,insideScreenSpaceUI:e,objectRef:n,renderOrder:r,settings:s})=>l.jsx(ie,{inside:e,children:l.jsx(mn,{settings:s,renderOrder:r,objectRef:n,children:t})}),mn=({children:t,objectRef:e,renderOrder:n,settings:r})=>{const s=z.useScreenSpace();if(!r.enabled||!r.visible)return null;const i=x.resolveScreenTransform2D({transform:r,parentSize:s});return l.jsx("group",{ref:e,position:i.center,rotation:i.rotation,scale:i.size,renderOrder:n??r.renderOrder,children:t})},bn=({anchor:t,children:e,insideScreenSpaceUI:n,objectRef:r,renderOrder:s,settings:i})=>l.jsx(ie,{inside:n,children:l.jsx(In,{anchor:t,settings:i,renderOrder:s,objectRef:r,children:e})}),In=({anchor:t,children:e,objectRef:n,renderOrder:r,settings:s})=>{const i=rt.useFaceInfo({targetFps:24}),{size:o}=J.useThree(),c=z.useScreenSpace(),a=v.useRef(null),d=v.useRef(new Y.Vector3),A=v.useRef({pos:new Y.Vector3,prevRaw:new Y.Vector3,dxHat:new Y.Vector3,initialized:!1}),g=v.useRef(!1),u=v.useRef({x:0,y:0,z:0,visibility:0}),S=v.useRef({x:0,y:0}),C=i?Xe.resolveFaceAnchorPoint(t.target,i.landmarks,t.customAnchorPoint,u.current):null,E=C?He({point:C,viewportSize:o,target:S.current}):null,f=E?x.resolveScreenTransform2D({transform:{...s,position:{x:E.x+s.position.x+t.offset.x,y:E.y+s.position.y+t.offset.y}},parentSize:c}):null;return J.useFrame((m,I)=>{const b=a.current;if(b){if(b.visible=!!(f&&s.enabled&&s.visible),!f){g.current=!1,A.current.initialized=!1;return}d.current.set(f.center[0],f.center[1],t.offset.z),t.smoothing>0?(Pe.stepTrackingSmoothing(A.current,d.current,g.current?I:0,t.smoothing),b.position.copy(A.current.pos)):b.position.copy(d.current),g.current=!0}}),l.jsx("group",{ref:m=>{a.current=m,n==null||n(m)},rotation:[(f==null?void 0:f.rotation[0])??0,(f==null?void 0:f.rotation[1])??0,((f==null?void 0:f.rotation[2])??0)+(t.followFaceRoll?(i==null?void 0:i.pose.rotation.z)??0:0)],scale:[s.size.width/100*s.scale2D.x,s.size.height/100*s.scale2D.y,1],renderOrder:r??s.renderOrder,children:e})},nt=({editorMode:t=!1,fallback:e=vn,insideScreenSpaceUI:n=!1,objectId:r,onComponentChange:s,renderLayer:i,renderOrder:o,store:c})=>{const a=Ae.useRegisterRuntimeObject(),d=Ae.useResolveRuntimeObject(),A=c.objects[r];if(!A||!A.enabled)return null;const g=x.getOrderedComponents(c,r).filter(h=>h.enabled),u=g.find(h=>h.type==="Transform"),S=g.find(h=>h.type==="ScreenTransform"),C=g.find(h=>h.type==="ScreenImage"),E=g.find(h=>h.type==="ScreenText"),f=g.find(h=>h.type==="ScreenShape"),m=g.find(h=>h.type==="MeshRenderer"),I=g.find(h=>h.type==="FaceMeshRenderer"),b=g.find(h=>h.type==="Light"),p=g.find(h=>h.type==="LookAt"),Q=g.find(h=>h.type==="PinToMesh"),M=g.find(h=>h.type==="TrackingAnchor"),T=x.getSceneObjectChildren(c,r).map(h=>l.jsx(nt,{objectId:h.id,store:c,editorMode:t,renderOrder:o,renderLayer:i,onComponentChange:s,fallback:e,insideScreenSpaceUI:n||!!S},h.id));if(k(u,"Transform")&&k(b,"Light"))return l.jsx(P,{layer:i,children:l.jsxs("group",{ref:h=>a(r,h),children:[l.jsx(et,{settings:b.settings,transform:u.settings}),T]})});if(k(u,"Transform")&&k(m,"MeshRenderer")){const h=k(p,"LookAt")?p.settings:x.createDefaultComponent("LookAt",r).settings,B=h.inheritChildren?T:null,j=h.inheritChildren?null:T;return l.jsx(P,{layer:i,children:l.jsx("group",{ref:O=>a(r,O),children:l.jsx(x.PinToMesh,{target:k(Q,"PinToMesh")?d(Q.settings.targetObjectId):null,settings:k(Q,"PinToMesh")?Q.settings:x.createDefaultComponent("PinToMesh",r).settings,children:l.jsxs(re.Transform3D,{value:u.settings,onChange:s?O=>s({...u,settings:O}):void 0,children:[l.jsxs(tt,{target:k(p,"LookAt")?d(p.settings.targetObjectId):null,settings:h,children:[l.jsx(z.MeshRenderer,{value:m.settings,renderOrder:o}),B]}),j]})})})})}if(k(I,"FaceMeshRenderer"))return l.jsx(P,{layer:i,children:l.jsxs("group",{ref:h=>a(r,h),children:[l.jsx(re.FaceMeshRenderer,{value:I.settings,transform:k(u,"Transform")?u.settings:void 0}),T]})});if(k(u,"Transform")){if(k(M,"TrackingAnchor")){const h=M.settings;return l.jsx(P,{layer:i,children:l.jsx(Xe.FaceTracker,{followFaceRoll:h.followFaceRoll,children:l.jsx(Pe.TrackingAnchor,{target:h.target,customAnchorPoint:h.customAnchorPoint,offset:[h.offset.x,h.offset.y,h.offset.z],smoothing:h.smoothing,children:l.jsx(re.Transform3D,{objectRef:B=>a(r,B),value:u.settings,children:T})})})})}return l.jsx(P,{layer:i,children:l.jsx("group",{children:l.jsx(re.Transform3D,{objectRef:h=>a(r,h),value:u.settings,onChange:s?h=>s({...u,settings:h}):void 0,children:T})})})}if(k(S,"ScreenTransform")&&k(C,"ScreenImage")){const h=x.mapScreenImageSettingsToProps({screenSpaceUI:{enabled:!0},screenImage:{...C.settings,screenTransform:S.settings}});return h.shouldRender?l.jsx(P,{layer:i,children:l.jsx("group",{renderOrder:o,children:l.jsxs(ie,{inside:n,children:[l.jsx(_e,{...h.props,renderOrder:o??h.props.renderOrder,onScreenTransformChange:s?B=>s({...S,settings:B}):void 0}),T]})})}):null}if(k(S,"ScreenTransform")&&k(E,"ScreenText")){const h=x.mapScreenTextSettingsToProps({screenSpaceUI:{enabled:!0},screenText:{...E.settings,screenTransform:S.settings}});return h.shouldRender?l.jsx(P,{layer:i,children:l.jsx("group",{renderOrder:o,children:l.jsxs(ie,{inside:n,children:[l.jsx($e,{...h.props,renderOrder:o??h.props.renderOrder,onScreenTransformChange:s?B=>s({...S,settings:B}):void 0}),T]})})}):null}return k(S,"ScreenTransform")&&k(f,"ScreenShape")?l.jsx(P,{layer:i,children:l.jsx("group",{ref:h=>a(r,h),renderOrder:o,children:l.jsxs(ie,{inside:n,children:[l.jsx(x.ScreenShape,{name:A.name,settings:f.settings,transform:S.settings,renderOrder:o,onScreenTransformChange:s?h=>s({...S,settings:h}):void 0}),T]})})}):k(S,"ScreenTransform")?k(M,"TrackingAnchor")?l.jsx(P,{layer:i,children:l.jsx("group",{children:l.jsx(bn,{anchor:M.settings,settings:S.settings,renderOrder:o,insideScreenSpaceUI:n,objectRef:h=>a(r,h),children:T})})}):l.jsx(P,{layer:i,children:l.jsx("group",{children:l.jsx(Cn,{settings:S.settings,renderOrder:o,insideScreenSpaceUI:n,objectRef:h=>a(r,h),children:T})})}):t?l.jsxs(l.Fragment,{children:[T,e(`Object "${A.name}" has unsupported components: ${g.map(h=>h.type).join(", ")}`)]}):T.length?l.jsx(l.Fragment,{children:T}):null},Tn=({layers:t})=>{const{camera:e,gl:n,raycaster:r,scene:s}=J.useThree(),{session:i}=Ae.useXRContext(),o=v.useCallback(()=>x.renderSequentialPasses({renderer:n,scene:s,camera:e,layers:t}),[e,n,t,s]);return J.useFrame(o,1),v.useEffect(()=>{const c=r.layers.mask;return t.forEach(a=>r.layers.enable(a)),()=>{r.layers.mask=c}},[t,r]),v.useEffect(()=>(i._setR3FState({renderer:n,scene:s,camera:e,renderFrame:o}),()=>i._setR3FState({renderer:n,scene:s,camera:e})),[e,n,o,s,i]),null};exports.LightObject=et;exports.LookAt=tt;exports.RenderGroupLayer=P;exports.SceneObjectRenderer=nt;exports.ScreenImage=_e;exports.ScreenSpaceUI=Je;exports.ScreenText=$e;exports.SequentialRenderPasses=Tn;exports.TextLabel=Ze;exports.clientToScreenPixels=At;exports.computeContainScale=le;exports.mediaToScreenPixels=gt;exports.normalizedToScreenPixels=He;exports.screenPixelsToClient=dt;exports.screenPixelsToMedia=ut;exports.screenPixelsToNormalized=ht;exports.screenPixelsToUnits=lt;exports.screenPointToRay=St;exports.screenUnitsToPixels=ct;exports.worldToScreenPixels=ft;
|
package/dist/index-Da7uycur.cjs
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";var Re=Object.defineProperty;var Me=(n,s,e)=>s in n?Re(n,s,{enumerable:!0,configurable:!0,writable:!0,value:e}):n[s]=e;var h=(n,s,e)=>Me(n,typeof s!="symbol"?s+"":s,e);const ie=require("react/jsx-runtime"),b=require("react"),_=require("@mediapipe/tasks-vision"),P=require("three");function Te(n){const s=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(n){for(const e in n)if(e!=="default"){const t=Object.getOwnPropertyDescriptor(n,e);Object.defineProperty(s,e,t.get?t:{enumerable:!0,get:()=>n[e]})}}return s.default=n,Object.freeze(s)}const D=Te(P);var x=(n=>(n.WEBCAM="webcam",n.STREAM="stream",n.CANVAS="canvas",n))(x||{}),L=(n=>(n.HAND_TRACKER="vincentt.xr.hand-tracker",n.GESTURE_TRACKER="vincentt.xr.gesture-tracker",n.FACE_TRACKER="vincentt.xr.face-tracker",n.BODY_TRACKER="vincentt.xr.body-tracker",n.BACKGROUND_SEGMENTATION="vincentt.xr.background-segmentation",n))(L||{});class I extends Error{constructor(s){super(s),this.name="VincenttXRError"}}const xe=(n,s)=>s,E={apiBaseUrl:xe(void 0,"https://api.vincentt.studio"),assetStorageEndpoint:"https://cdn.vincentt.studio",sdkAssetsBaseUrl:"https://cdn.vincentt.studio/assets/sdk/face/v1",loggerPrefix:"[vincentt-xr]:",sessionCheckInterval:3e4};class Fe{constructor(s){h(this,"options");const e={verbose:!1,prefix:E.loggerPrefix};this.options={...e,...s}}log(...s){const{verbose:e,prefix:t}=this.options;e&&console.info(t,...s)}error(...s){const{verbose:e,prefix:t}=this.options;e&&console.error(t,...s)}}const B=n=>n*2-1,Y=new D.Vector3,Q=new D.Vector3,q=({x:n,y:s,z:e},t,a)=>{Y.set((n-.5)*2,(.5-s)*2,-e),Y.unproject(t),Q.copy(Y).sub(t.position).normalize();const r=-t.position.z/Q.z;return a.copy(t.position).addScaledVector(Q,r),a},Ae=(n,s)=>q(n,s,new D.Vector3),be=(n,s,e=.2)=>e*s+(1-e)*n;class ${constructor(s){h(this,"canvas");this.maxDimension=s}draw(s){const e=s.width,t=s.height,a=Math.min(1,this.maxDimension/Math.max(e,t));if(a>=1)return s;const r=Math.max(1,Math.round(e*a)),o=Math.max(1,Math.round(t*a));(!this.canvas||this.canvas.width!==r||this.canvas.height!==o)&&(this.canvas=new OffscreenCanvas(r,o));const d=this.canvas.getContext("2d");return d?(d.setTransform(1,0,0,1,0,0),d.clearRect(0,0,r,o),d.drawImage(s,0,0,r,o),this.canvas):s}dispose(){this.canvas=void 0}}const Ee={"/assets/xr/models/face_tracking.task":"sha384-tYQh+yJE8llY+zO4RviZmWaSKs5W9tsB0ix5rjQVpF5/CLTqmwtP7bYtkUi2w65P","/assets/xr/models/hand_tracking.task":"sha384-uWvruVKd887ov8k43S+DBHCsi7UXXS+CKvvdM1PX00rjPzx/B0QrAPfJ1U9yKcze","/assets/xr/models/gesture_tracking.task":"sha384-2zuseP9JKKWAYlWQGKA2N+ooabB8V/yIxu23Mv8mtY7SowcySB+xKiOmqBhVvlUC","/assets/xr/models/body_tracking.task":"sha384-3Wk9dvRYo36b3Nc9xVjKamb4wCKt9FwiPjcHKfrvyJL/jXoGs+uRLnii6yjWLKul","/assets/xr/models/segmentation.tflite":"sha384-A2bQ8+iZyQM3KIGVBUf0FyetqxuynyKpjsjCE8uzoJEnj1ghCu6ge2daiRffAiS5","/assets/xr/3d-models/head-occluder-v2.glb":"sha384-+0G60Q6EBVE6hpITxGzQgofAeKexPltpsfPq5T5et9GGBjRhFP5HOdsKAhe73OaI","/assets/sdk/face/v1/canonical_face_model.obj":"sha384-xP8YM/72TXKvbMptXB9a8JUlUf3MZQ8uLurExrsZc05v6/P5RrsaNGMUYS/BZx8A","/opencv/facial_expression_recognition/resolve/main/facial_expression_recognition_mobilefacenet_2022july_int8.onnx":"sha384-g8mtFubiIc/yhqi591RsxD76AJLw2CfYgKhKbVkIiFlwBmIyG7ZAIVyGPXafrDGB"};async function re(n){const s=await fetch(n);if(!s.ok)throw new Error(`fetchAndVerify: ${s.status} ${n}`);const e=await s.arrayBuffer(),t=De(n);if(!t){if(Ie(n))throw new Error(`[xr-sdk integrity] no SRI hash for SDK asset ${n}`);return console.warn(`[xr-sdk integrity] no SRI hash for ${n} — passing through`),e}const a=await _e(e);if(a!==t)throw new Error(`[xr-sdk integrity] SRI mismatch for ${n}: expected ${t}, got ${a}`);return e}function Ie(n){try{return new URL(n).origin===new URL(E.assetStorageEndpoint).origin}catch{return!1}}async function H(n){const s=await re(n);return new Uint8Array(s)}function De(n){try{const s=new URL(n);return Ee[s.pathname]}catch{return}}async function _e(n){const s=await crypto.subtle.digest("SHA-384",n),e=new Uint8Array(s);let t="";for(let a=0;a<e.byteLength;a++)t+=String.fromCharCode(e[a]);return`sha384-${btoa(t)}`}class G{constructor(){h(this,"disposed",!1);h(this,"paused",!1);h(this,"rafId",null);h(this,"targetFrameIntervalMs",0);h(this,"lastInferenceMs",0)}setTargetFps(s){this.targetFrameIntervalMs=s&&s>0?1e3/s:0}shouldRunInference(){if(this.targetFrameIntervalMs<=0)return!0;const s=performance.now();return s-this.lastInferenceMs<this.targetFrameIntervalMs?!1:(this.lastInferenceMs=s,!0)}async initialize(s){}async run(s){}getModelNode(){return{}}async getPerformanceData(){return{name:this.constructor.name,processingTime:null}}pause(){this.paused=!0,this.rafId!==null&&(cancelAnimationFrame(this.rafId),this.rafId=null)}resume(){this.paused=!1}dispose(){this.disposed=!0,this.rafId!==null&&(cancelAnimationFrame(this.rafId),this.rafId=null)}}const Pe=768;class Oe extends G{constructor(){super();h(this,"landmarker",null);h(this,"processingTime",null);h(this,"coordinates");h(this,"sourceCanvas");h(this,"downscaler",new $(Pe))}async getBodyData(){if(!this.landmarker||!this.sourceCanvas)return;const e=this.downscaler.draw(this.sourceCanvas),t=performance.now(),a=this.landmarker.detectForVideo(e,t),r=performance.now();this.processingTime=r-t;const o=a.landmarks,d=[];if(o)return o.forEach((m,u)=>{d[u]||(d[u]=[]),m.forEach(S=>{const M=B(S.x),R=B(1-S.y),F=B(S.z);d[u].push({x:M,y:R,z:F})})}),{coordinatesList:d}}async processBodyTracking(){if(!(this.disposed||this.paused||!this.landmarker)){if(this.shouldRunInference()){const e=await this.getBodyData();e&&(this.coordinates=e.coordinatesList)}this.disposed||this.paused||(this.rafId=requestAnimationFrame(this.processBodyTracking.bind(this)))}}resume(){this.paused&&(super.resume(),this.processBodyTracking())}dispose(){if(super.dispose(),this.landmarker){try{this.landmarker.close()}catch{}this.landmarker=null}this.sourceCanvas=void 0,this.downscaler.dispose(),this.coordinates=void 0}getLandmarks2D(e=0){if(this.coordinates)return this.coordinates[e]}async initialize(e){const t=await _.FilesetResolver.forVisionTasks(new URL("/assets/xr/wasm",E.assetStorageEndpoint).toString()),a=await H(new URL("/assets/xr/models/body_tracking.task",E.assetStorageEndpoint).toString());this.landmarker=await _.PoseLandmarker.createFromOptions(t,{baseOptions:{modelAssetBuffer:a,delegate:"GPU"},runningMode:"VIDEO",numPoses:(e==null?void 0:e.numPoses)||1})}async run({sourceCanvas:e,targetFps:t}){this.sourceCanvas=e,this.setTargetFps(t),this.rafId===null&&await this.processBodyTracking()}getModelNode(){return{getLandmarks2D:this.getLandmarks2D.bind(this)}}async getPerformanceData(){return{name:this.constructor.name,processingTime:this.processingTime}}}const Ue=.11,ze=.004,Le=(n,s)=>s.set(n.x,-n.y,n.z);class Be extends G{constructor(){super();h(this,"landmarker",null);h(this,"processingTime",null);h(this,"sourceCanvas");h(this,"analysisCanvas");h(this,"getSource");h(this,"detectionResults");h(this,"numFaces",1);h(this,"cameras",[]);h(this,"faces",[]);h(this,"leftCheekScratch",[]);h(this,"rightCheekScratch",[]);h(this,"landmarkScratch",{x:0,y:0,z:0,visibility:0});h(this,"rotMatrixScratch",new D.Matrix4);h(this,"rotQuatScratch",new D.Quaternion);h(this,"rotEulerScratch",new D.Euler)}landmarkForSource(e,t){return t?(this.landmarkScratch.x=1-e.x,this.landmarkScratch.y=e.y,this.landmarkScratch.z=e.z,this.landmarkScratch.visibility=e.visibility,this.landmarkScratch):e}extractAndUpdateFaceData(e){var a;if(!e.faceLandmarks.length){this.faces=[];return}const t=e.faceLandmarks.length;for(this.faces.length>t&&(this.faces.length=t,this.leftCheekScratch.length=t,this.rightCheekScratch.length=t);this.faces.length<t;)this.faces.push({transform:{position:new D.Vector3,rotation:new D.Vector3,scale:new D.Vector3},gestures:{}}),this.leftCheekScratch.push(new D.Vector3),this.rightCheekScratch.push(new D.Vector3);for(let r=0;r<t;r+=1){if(!this.cameras[r])continue;const o=this.faces[r],d=(a=this.getSource)==null?void 0:a.call(this),m=!(d==="webcam"||!d),u=e.faceLandmarks[r],S=e.facialTransformationMatrixes[r];this.rotMatrixScratch.fromArray(S.data),this.rotQuatScratch.setFromRotationMatrix(this.rotMatrixScratch),this.rotQuatScratch.set(-this.rotQuatScratch.x,this.rotQuatScratch.y,this.rotQuatScratch.z,this.rotQuatScratch.w),this.rotEulerScratch.setFromQuaternion(this.rotQuatScratch,"XYZ"),Le(this.rotEulerScratch,o.transform.rotation),q(this.landmarkForSource(u[4],m),this.cameras[r],o.transform.position),q(this.landmarkForSource(u[50],m),this.cameras[r],this.leftCheekScratch[r]),q(this.landmarkForSource(u[280],m),this.cameras[r],this.rightCheekScratch[r]);const R=this.leftCheekScratch[r].distanceTo(this.rightCheekScratch[r])*Ue,F=Math.abs(D.MathUtils.radToDeg(this.rotEulerScratch.y)),l=R+F*ze,f=o.transform.scale.x,w=be(isNaN(f)?0:f,l);o.transform.scale.set(w,w,w);const p=o.gestures,k=e.faceBlendshapes[r].categories;for(const C of k)p[C.categoryName]=C.score}}async processFaceTracking(){if(this.disposed||this.paused||!this.landmarker||!this.sourceCanvas)return null;if(!this.shouldRunInference()){this.rafId=requestAnimationFrame(this.processFaceTracking.bind(this));return}const e=Ve(this.numFaces),t=this.sourceCanvas.width,a=this.sourceCanvas.height,r=Math.min(1,e/Math.max(t,a)),o=Math.max(1,Math.round(t*r)),d=Math.max(1,Math.round(a*r));(!this.analysisCanvas||this.analysisCanvas.width!==o||this.analysisCanvas.height!==d)&&(this.analysisCanvas=new OffscreenCanvas(o,d));const m=this.analysisCanvas.getContext("2d");if(!m){this.rafId=requestAnimationFrame(this.processFaceTracking.bind(this));return}m.setTransform(1,0,0,1,0,0),m.clearRect(0,0,o,d),m.drawImage(this.sourceCanvas,0,0,o,d);const u=performance.now(),S=this.landmarker.detectForVideo(this.analysisCanvas,u),M=performance.now();this.processingTime=M-u,this.detectionResults=S,this.extractAndUpdateFaceData(S),!(this.disposed||this.paused)&&(this.rafId=requestAnimationFrame(this.processFaceTracking.bind(this)))}resume(){this.paused&&(super.resume(),this.processFaceTracking())}dispose(){if(super.dispose(),this.landmarker){try{this.landmarker.close()}catch{}this.landmarker=null}this.sourceCanvas=void 0,this.analysisCanvas=void 0,this.getSource=void 0,this.detectionResults=void 0,this.processingTime=null,this.cameras=[],this.faces=[],this.leftCheekScratch=[],this.rightCheekScratch=[]}getFace(e=0){return this.faces[e]}getDetectionResults(){return this.detectionResults}getRawFaceTrackingData(e=0){var t,a,r,o;if(this.detectionResults)return{landmarks:(t=this.detectionResults.faceLandmarks)==null?void 0:t[e],blendshapes:(r=(a=this.detectionResults.faceBlendshapes)==null?void 0:a[e])==null?void 0:r.categories,transformationMatrix:(o=this.detectionResults.facialTransformationMatrixes)==null?void 0:o[e]}}async initialize(e){this.numFaces=(e==null?void 0:e.numFaces)||1;const t=await _.FilesetResolver.forVisionTasks(new URL("/assets/xr/wasm",E.assetStorageEndpoint).toString()),a=await H(new URL("/assets/xr/models/face_tracking.task",E.assetStorageEndpoint).toString()),r=await _.FaceLandmarker.createFromOptions(t,{baseOptions:{modelAssetBuffer:a,delegate:"GPU"},minFaceDetectionConfidence:.3,minFacePresenceConfidence:.3,minTrackingConfidence:.3,outputFaceBlendshapes:!0,outputFacialTransformationMatrixes:!0,runningMode:"VIDEO",numFaces:this.numFaces});if(this.disposed){r.close();return}this.landmarker=r}async run({sourceCanvas:e,getSource:t,targetFps:a}){this.sourceCanvas=e,this.getSource=t,this.setTargetFps(a),this.analysisCanvas=void 0,this.rafId===null&&this.processFaceTracking()}getModelNode(){const e=this;return{get detectionResults(){return e.detectionResults},getDetectionResults:this.getDetectionResults.bind(this),getFace:this.getFace.bind(this),getRawFaceTrackingData:this.getRawFaceTrackingData.bind(this),setCamera:(a,r=0)=>{this.cameras[r]=a}}}async getPerformanceData(){return{name:this.constructor.name,processingTime:this.processingTime}}}const Ve=n=>n>1?1024:512;var O=(n=>(n.ClosedFist="closed_fist",n.OpenPalm="open_palm",n.PointingUp="pointing_up",n.ThumbDown="thumb_down",n.ThumbUp="thumb_up",n.Victory="victory",n.ILoveYou="i_love_you",n.None="none",n))(O||{});const Ke=512,Ne={Closed_Fist:O.ClosedFist,Open_Palm:O.OpenPalm,Pointing_Up:O.PointingUp,Thumb_Down:O.ThumbDown,Thumb_Up:O.ThumbUp,Victory:O.Victory,ILoveYou:O.ILoveYou,None:O.None},qe=15;class He extends G{constructor(){super();h(this,"landmarker",null);h(this,"processingTime",null);h(this,"coordinates");h(this,"gesture");h(this,"sourceCanvas");h(this,"downscaler",new $(Ke))}async getGestureData(){if(!this.landmarker||!this.sourceCanvas)return;const e=this.downscaler.draw(this.sourceCanvas),t=performance.now(),a=this.landmarker.recognizeForVideo(e,t),r=performance.now();this.processingTime=r-t;const o=a.landmarks[0],d=[];if(o){const m=a.gestures[0][0].categoryName;return o.forEach(u=>{d.push({x:B(u.x),y:B(1-u.y),z:-u.z})}),{coordinates:d,gesture:Ne[m]}}return{coordinates:void 0,gesture:void 0}}async processGestureTracking(){if(!this.disposed){if(this.shouldRunInference()){const e=await this.getGestureData();e&&(this.coordinates=e.coordinates,this.gesture=e.gesture)}this.disposed||this.paused||(this.rafId=requestAnimationFrame(this.processGestureTracking.bind(this)))}}resume(){this.paused&&(super.resume(),this.processGestureTracking())}dispose(){if(super.dispose(),this.landmarker){try{this.landmarker.close()}catch{}this.landmarker=null}this.sourceCanvas=void 0,this.downscaler.dispose(),this.coordinates=void 0,this.gesture=void 0}async initialize(){const e=await _.FilesetResolver.forVisionTasks(new URL("/assets/xr/wasm",E.assetStorageEndpoint).toString()),t=await H(new URL("/assets/xr/models/gesture_tracking.task",E.assetStorageEndpoint).toString()),a=await _.GestureRecognizer.createFromOptions(e,{baseOptions:{modelAssetBuffer:t,delegate:"GPU"},runningMode:"VIDEO",numHands:1});this.landmarker=a}async run({sourceCanvas:e,targetFps:t}){this.sourceCanvas=e,this.setTargetFps(t??qe),this.rafId===null&&await this.processGestureTracking()}getModelNode(){const e=this;return{get coordinates(){return e.coordinates},get gesture(){return e.gesture}}}async getPerformanceData(){return{name:this.constructor.name,processingTime:this.processingTime}}}const Ge=512;class je extends G{constructor(){super();h(this,"landmarker",null);h(this,"processingTime",null);h(this,"hands");h(this,"coordinates");h(this,"gesture");h(this,"handedness");h(this,"sourceCanvas");h(this,"downscaler",new $(Ge))}async getHandData(){if(!this.landmarker||!this.sourceCanvas)return;const e=this.downscaler.draw(this.sourceCanvas),t=performance.now(),a=this.landmarker.detectForVideo(e,t),r=performance.now();this.processingTime=r-t;const o=[],d=a.handedness??a.handednesses??[];if(a.landmarks.forEach((u,S)=>{var f,w,p;if(!u||u.length===0)return;const M=u.map(k=>({x:B(k.x),y:B(1-k.y),z:-k.z})),R=(p=(w=(f=d[S])==null?void 0:f[0])==null?void 0:w.categoryName)==null?void 0:p.toLowerCase(),F=R==="left"||R==="right"?R:void 0,l=u[0].z<0?"closed_fist":"open_palm";o.push({coordinates:M,gesture:l,handedness:F})}),!o.length)return{hands:void 0,coordinates:void 0,gesture:void 0,handedness:void 0};const m=o[0];return{hands:o,coordinates:m.coordinates,gesture:m.gesture,handedness:m.handedness}}async processHandTracking(){if(!this.disposed){if(this.shouldRunInference()){const e=await this.getHandData();e&&(this.hands=e.hands,this.coordinates=e.coordinates,this.gesture=e.gesture,this.handedness=e.handedness)}this.disposed||this.paused||(this.rafId=requestAnimationFrame(this.processHandTracking.bind(this)))}}resume(){this.paused&&(super.resume(),this.processHandTracking())}dispose(){if(super.dispose(),this.landmarker){try{this.landmarker.close()}catch{}this.landmarker=null}this.sourceCanvas=void 0,this.hands=void 0,this.downscaler.dispose(),this.coordinates=void 0,this.gesture=void 0,this.handedness=void 0}async initialize(){const e=await _.FilesetResolver.forVisionTasks(new URL("/assets/xr/wasm",E.assetStorageEndpoint).toString()),t=await H(new URL("/assets/xr/models/hand_tracking.task",E.assetStorageEndpoint).toString()),a=await _.HandLandmarker.createFromOptions(e,{baseOptions:{modelAssetBuffer:t,delegate:"GPU"},runningMode:"VIDEO",numHands:2});this.landmarker=a}async run({sourceCanvas:e,targetFps:t}){this.sourceCanvas=e,this.setTargetFps(t),this.rafId===null&&await this.processHandTracking()}getModelNode(){const e=this;return{get hands(){return e.hands},get coordinates(){return e.coordinates},get gesture(){return e.gesture},get handedness(){return e.handedness}}}async getPerformanceData(){return{name:this.constructor.name,processingTime:this.processingTime}}}const We=24,Xe=720,Ye=[[255,255,255,255],[0,0,0,0]];class Qe extends G{constructor(){super();h(this,"segmenter",null);h(this,"processingTime",null);h(this,"sourceCanvas");h(this,"processCanvas");h(this,"filterCanvas");h(this,"inputSource");h(this,"inputSourceSize");h(this,"glCanvas");h(this,"drawingUtils");h(this,"useGpuMaskPath",!1);h(this,"maskImageData");h(this,"maskCanvas",null);h(this,"segmentationMaskTexture");h(this,"isMaskSetup",!1);h(this,"isProcessing",!1);h(this,"latestMask",null);h(this,"rawCache",null);h(this,"quality","medium");h(this,"stagingCanvas")}getQualityScaleFactor(){switch(this.quality){case"low":return .5;case"medium":return .75;case"high":return 1;default:return .5}}setInputSource(e){this.inputSource=e,this.inputSourceSize=e?this.readIntrinsicSize(e):void 0}readIntrinsicSize(e){if(e instanceof HTMLVideoElement)return e.videoWidth>0?{width:e.videoWidth,height:e.videoHeight}:void 0;if(e instanceof HTMLImageElement)return e.naturalWidth>0?{width:e.naturalWidth,height:e.naturalHeight}:void 0;const t=e.width,a=e.height;return typeof t=="number"&&t>0&&typeof a=="number"&&a>0?{width:t,height:a}:void 0}ensureProcessCanvasForInput(){if(!this.processCanvas||!this.inputSource)return;const e=this.readIntrinsicSize(this.inputSource);if(!e)return;this.inputSourceSize=e;const t=Math.min(1,Xe/Math.max(e.width,e.height)),a=Math.max(1,Math.round(e.width*t)),r=Math.max(1,Math.round(e.height*t));this.processCanvas.width===a&&this.processCanvas.height===r||(this.processCanvas.width=a,this.processCanvas.height=r,this.glCanvas&&(this.glCanvas.width=a,this.glCanvas.height=r),this.maskImageData=void 0)}async processSegmentation(){if(this.disposed||!this.isProcessing||!this.maskCanvas||!this.processCanvas)return;if(!this.shouldRunInference()){if(this.disposed||this.paused)return;this.rafId=requestAnimationFrame(this.processSegmentation.bind(this));return}const e=this.inputSource??this.sourceCanvas;if(!this.segmenter||!e){if(this.disposed||this.paused)return;this.rafId=requestAnimationFrame(this.processSegmentation.bind(this));return}const t=performance.now();this.ensureProcessCanvasForInput();const a=this.processCanvas.getContext("2d");if(a){const d=this.processCanvas.width,m=this.processCanvas.height;if(a.clearRect(0,0,d,m),this.inputSource&&this.inputSourceSize){const{width:u,height:S}=this.inputSourceSize,M=Math.min(d/u,m/S),R=u*M,F=S*M;a.drawImage(this.inputSource,(d-R)/2,(m-F)/2,R,F)}else a.drawImage(e,0,0,d,m)}const o=this.segmenter.segmentForVideo(this.processCanvas,performance.now()).categoryMask;if(!o){if(this.disposed||this.paused)return;this.rafId=requestAnimationFrame(this.processSegmentation.bind(this));return}if(this.rawCache=null,this.latestMask&&(this.latestMask.close(),this.latestMask=null),this.useGpuMaskPath&&this.drawingUtils&&this.glCanvas)this.drawingUtils.drawCategoryMask(o,Ye),this.latestMask=o.clone(),o.close(),this.blitGlToMask();else{this.latestMask=o.clone();const d=this.readMaskToImageData(o);o.close(),d&&this.blitImageDataToMask(d)}this.segmentationMaskTexture&&(this.isMaskSetup||(this.segmentationMaskTexture.format=P.RGBAFormat,this.segmentationMaskTexture.minFilter=P.LinearFilter,this.segmentationMaskTexture.magFilter=P.LinearFilter,this.segmentationMaskTexture.generateMipmaps=!1,this.isMaskSetup=!0),this.segmentationMaskTexture.needsUpdate=!0),this.processingTime=performance.now()-t,!(this.disposed||this.paused)&&(this.rafId=requestAnimationFrame(this.processSegmentation.bind(this)))}blitGlToMask(){if(!this.maskCanvas||!this.filterCanvas||!this.glCanvas)return;const e=this.maskCanvas.getContext("2d"),t=this.filterCanvas.getContext("2d");!e||!t||(t.filter="blur(0.5px)",t.clearRect(0,0,this.filterCanvas.width,this.filterCanvas.height),t.drawImage(this.glCanvas,0,0,this.filterCanvas.width,this.filterCanvas.height),e.clearRect(0,0,this.maskCanvas.width,this.maskCanvas.height),e.drawImage(this.filterCanvas,0,0,this.maskCanvas.width,this.maskCanvas.height))}readMaskToImageData(e){const t=e.getAsUint8Array(),{width:a,height:r}=e;if(!t||a<=0||r<=0)return null;(!this.maskImageData||this.maskImageData.width!==a||this.maskImageData.height!==r)&&(this.maskImageData=new ImageData(a,r));const o=this.maskImageData.data;for(let d=0;d<t.length;d+=1){const m=t[d]===255?0:255;o[d*4]=255,o[d*4+1]=m,o[d*4+2]=255,o[d*4+3]=m}return this.maskImageData}blitImageDataToMask(e){if(!this.maskCanvas||!this.filterCanvas)return;const t=this.maskCanvas.getContext("2d"),a=this.filterCanvas.getContext("2d");if(!t||!a)return;const r=this.getStagingCanvas(e.width,e.height),o=r.getContext("2d");o&&(o.putImageData(e,0,0),a.filter="blur(0.5px)",a.clearRect(0,0,this.filterCanvas.width,this.filterCanvas.height),a.drawImage(r,0,0,this.filterCanvas.width,this.filterCanvas.height),t.clearRect(0,0,this.maskCanvas.width,this.maskCanvas.height),t.drawImage(this.filterCanvas,0,0,this.maskCanvas.width,this.maskCanvas.height))}getStagingCanvas(e,t){return this.stagingCanvas||(this.stagingCanvas=document.createElement("canvas")),this.stagingCanvas.width!==e&&(this.stagingCanvas.width=e),this.stagingCanvas.height!==t&&(this.stagingCanvas.height=t),this.stagingCanvas}resume(){this.paused&&(super.resume(),this.processSegmentation())}dispose(){if(super.dispose(),this.isProcessing=!1,this.latestMask){try{this.latestMask.close()}catch{}this.latestMask=null}if(this.rawCache=null,this.segmenter){try{this.segmenter.close()}catch{}this.segmenter=null}this.drawingUtils=void 0,this.glCanvas=void 0,this.maskImageData=void 0,this.segmentationMaskTexture&&(this.segmentationMaskTexture.dispose(),this.segmentationMaskTexture=void 0),this.sourceCanvas=void 0,this.inputSource=void 0,this.inputSourceSize=void 0,this.processCanvas=void 0,this.filterCanvas=void 0,this.stagingCanvas=void 0,this.maskCanvas=null}async initialize(e){this.quality=(e==null?void 0:e.quality)??"low";const t=await _.FilesetResolver.forVisionTasks(new URL("/assets/xr/wasm",E.assetStorageEndpoint).toString()),a=await H(new URL("/assets/xr/models/segmentation.tflite",E.assetStorageEndpoint).toString());this.glCanvas=new OffscreenCanvas(1,1);const r=this.glCanvas.getContext("webgl2",{preserveDrawingBuffer:!0});this.segmenter=await _.ImageSegmenter.createFromOptions(t,{baseOptions:{modelAssetBuffer:a,delegate:"GPU"},...r?{canvas:this.glCanvas}:{},outputCategoryMask:!0,outputConfidenceMasks:!1,runningMode:"VIDEO"}),r?(this.drawingUtils=new _.DrawingUtils(r),this.useGpuMaskPath=!0):this.useGpuMaskPath=!1}async run({sourceCanvas:e,renderWidth:t,renderHeight:a,targetFps:r}){var d;if(!e)return;this.setTargetFps(r??We),this.isProcessing=!1,this.rafId!==null&&(cancelAnimationFrame(this.rafId),this.rafId=null);const o=this.getQualityScaleFactor();this.sourceCanvas=e,this.processCanvas=document.createElement("canvas"),this.processCanvas.width=e.width*o,this.processCanvas.height=e.height*o,this.glCanvas&&(this.glCanvas.width=this.processCanvas.width,this.glCanvas.height=this.processCanvas.height),this.maskImageData=void 0,this.maskCanvas=document.createElement("canvas"),this.maskCanvas.width=t,this.maskCanvas.height=a,this.filterCanvas=document.createElement("canvas"),this.filterCanvas.width=t,this.filterCanvas.height=a,(d=this.segmentationMaskTexture)==null||d.dispose(),this.segmentationMaskTexture=new P.CanvasTexture(this.maskCanvas),this.isMaskSetup=!1,this.rawCache=null,this.isProcessing=!0,this.lastInferenceMs=0,this.rafId=requestAnimationFrame(this.processSegmentation.bind(this))}getRawSegmentationData(){if(this.rawCache)return this.rawCache;if(!this.latestMask)return null;const e=this.latestMask.getAsUint8Array();return this.rawCache={maskData:e,width:this.latestMask.width,height:this.latestMask.height},this.rawCache}getModelNode(){const e=this;return{get backgroundSegmentationMask(){return e.segmentationMaskTexture},getMaskCanvas:()=>e.maskCanvas,getRawSegmentationData:()=>e.getRawSegmentationData(),setInputSource:t=>e.setInputSource(t??void 0)}}async getPerformanceData(){return{name:this.constructor.name,processingTime:this.processingTime}}}const ae={[L.BACKGROUND_SEGMENTATION]:Qe,[L.HAND_TRACKER]:je,[L.GESTURE_TRACKER]:He,[L.FACE_TRACKER]:Be,[L.BODY_TRACKER]:Oe},Ze=async n=>{const s=document.createElement("video");s.srcObject=n,s.muted=!0,s.playsInline=!0,s.autoplay=!0,await new Promise(t=>{s.onloadedmetadata=()=>{s.play(),t()}});const e=s;return await new Promise(t=>{const a=setTimeout(t,150),r=()=>{clearTimeout(a),t()};typeof e.requestVideoFrameCallback=="function"?e.requestVideoFrameCallback(r):requestAnimationFrame(()=>requestAnimationFrame(()=>r()))}),s},$e=n=>{const s=new P.CanvasTexture(n);return s.colorSpace=P.SRGBColorSpace,s.format=P.RGBAFormat,s.minFilter=P.LinearFilter,s.magFilter=P.LinearFilter,s.generateMipmaps=!1,s.needsUpdate=!0,s},Je=(n,s)=>{const e=n.videoWidth,t=n.videoHeight;e>0&&t>0&&(s.width!==e&&(s.width=e),s.height!==t&&(s.height=t));const a=s.getContext("2d",{colorSpace:"srgb"});a.save(),a.scale(-1,1),a.drawImage(n,-s.width,0,s.width,s.height),a.restore()},et=(n,s,e=1)=>{const t=s.getContext("2d",{colorSpace:"srgb"}),a=s.width/s.height,r=n.width/n.height;let o,d;r>a?(d=s.height,o=n.width*(s.height/n.height)):(o=s.width,d=n.height*(s.width/n.width));const m=Number.isFinite(e)&&e>0?e:1;o*=m,d*=m;const u=(s.width-o)/2,S=(s.height-d)/2;t.setTransform(1,0,0,1,0,0),t.clearRect(0,0,s.width,s.height),t.drawImage(n,0,0,n.width,n.height,u,S,o,d)},tt=n=>{switch(n instanceof DOMException?n.name:""){case"NotAllowedError":case"PermissionDeniedError":return"permission-denied";case"NotReadableError":case"TrackStartError":return"camera-in-use";case"NotFoundError":case"DevicesNotFoundError":return"no-camera";case"NotSupportedError":case"SecurityError":return"unsupported";default:return n instanceof TypeError?"unsupported":"unknown"}},st={"permission-denied":"Camera access was blocked. Allow camera permissions in your browser, then refresh.","camera-in-use":"Camera is already in use by another app or browser tab. Close it and refresh.","no-camera":"No camera was found on this device.",unsupported:"Unable to access camera. Allow camera permissions in your browser, then refresh.",unknown:"Unable to access camera. Allow camera permissions in your browser, then refresh."},nt=(n,s,e)=>{const t=new Map;let a=!1;const r=(l,f)=>{var w;try{(w=f.dispose)==null||w.call(f)}catch(p){console.warn(`[xr-sdk registry] dispose threw for ${l}`,p)}};return{acquire:async(l,f,w)=>{let p=t.get(l);if(p)return p.refs.add(f),p.activeRefs.add(f),p.initPromise;const k=s[l];if(!k)throw new Error(`Invalid model: ${l}`);const C=new k,K=new Set([f]),V=new Set([f]),U=(async()=>{await C.initialize(w);const N=t.get(l);if(!N||N.model!==C||N.refs.size===0)return r(l,C),C;e&&await e(l,C);const T=t.get(l);return T&&T.refs.size>0&&n.setPipeline(z=>z.set(l,C)),C})();return p={model:C,refs:K,activeRefs:V,initPromise:U,options:w},t.set(l,p),U.catch(()=>{t.get(l)===p&&(t.delete(l),n.setPipeline(T=>T.delete(l))),r(l,C)}),U},release:(l,f)=>{const w=t.get(l);w&&(w.refs.delete(f),w.activeRefs.delete(f)&&w.refs.size>0&&w.activeRefs.size===0&&w.model.pause(),!(w.refs.size>0)&&(t.delete(l),r(l,w.model),n.setPipeline(p=>p.delete(l))))},setActive:(l,f,w)=>{const p=t.get(l);if(!p||!p.refs.has(f))return;const k=p.activeRefs.size>0;w?p.activeRefs.add(f):p.activeRefs.delete(f);const C=p.activeRefs.size>0;k!==C&&(C&&!a?p.model.resume():p.model.pause())},suspendAll:()=>{a=!0;for(const l of t.values())l.model.pause()},resumeActive:()=>{a=!1;for(const l of t.values())l.activeRefs.size>0&&l.model.resume()},get:l=>{var f;return(f=t.get(l))==null?void 0:f.model},getOptions:l=>{var f;return(f=t.get(l))==null?void 0:f.options},releaseAll:()=>{for(const l of Array.from(t.keys())){const f=t.get(l);f&&(f.refs.clear(),t.delete(l),r(l,f.model))}n.setPipeline(l=>l.clear())}}},it={lifecycle:"idle",ready:!1,error:void 0,cameraTexture:void 0,renderWidth:0,renderHeight:0,source:void 0,sourceKind:void 0,pipeline:new Map},at=()=>{let n={...it,pipeline:new Map};const s=new Set,e=()=>{s.forEach(t=>t())};return{getSnapshot:()=>n,set:t=>{let a=!1;for(const r of Object.keys(t))if(t[r]!==n[r]){a=!0;break}a&&(n={...n,...t},e())},setPipeline:t=>{const a=new Map(n.pipeline);return t(a),n={...n,pipeline:a},e(),a},subscribe:t=>(s.add(t),()=>{s.delete(t)})}},rt=({renderHeight:n,renderWidth:s,videoHeight:e,videoWidth:t})=>({height:n||e,width:s||t}),ot=n=>{const s=new Fe({verbose:!0}),e=at();let t=n;const a=i=>{var g;const c=(g=T.getOptions(i))==null?void 0:g.targetFps;return typeof c=="number"?c:t==null?void 0:t.targetFps};let r,o,d,m,u,S,M,R,F,l,f,w=!1,p=!1,k=0;const C=new Set,K=new Set,V=i=>{const c=e.getSnapshot().cameraTexture;c&&c.dispose();const g=$e(i);return e.set({cameraTexture:g}),g},U=async(i,c)=>{if(C.has(i)||e.getSnapshot().lifecycle!=="running"||!u)return;C.add(i);const g=k;try{await c.run({sourceCanvas:u,renderWidth:e.getSnapshot().renderWidth,renderHeight:e.getSnapshot().renderHeight,getSource:()=>e.getSnapshot().sourceKind,targetFps:a(i)}),p&&(await new Promise(v=>requestAnimationFrame(()=>v())),await new Promise(v=>requestAnimationFrame(()=>v())),p&&k===g&&T.suspendAll())}catch(v){throw C.delete(i),v}},T=nt(e,ae,(i,c)=>U(i,c));e.subscribe(()=>{if(e.getSnapshot().lifecycle!=="running")return;const i=e.getSnapshot().pipeline;for(const[c,g]of i.entries())C.has(c)||U(c,g)});const z=()=>{if(f!==void 0&&(cancelAnimationFrame(f),f=void 0),o){try{o.pause()}catch{}try{o.srcObject=null}catch{}o=void 0}if(d){try{d.getTracks().forEach(i=>i.stop())}catch{}d=void 0}},j=()=>{if(w||!o||!m||!u)return;const i=window.__xr_debugger_metrics;if(i!=null&&i.trackCameraFrame&&i.trackCameraFrame(),(e.getSnapshot().sourceKind??"webcam")==="webcam")Je(o,m);else{const v=m.getContext("2d");if(!v)return;const y=o.videoWidth,A=o.videoHeight;m.width!==y&&(m.width=y),m.height!==A&&(m.height=A),v.setTransform(1,0,0,1,0,0),v.clearRect(0,0,y,A),v.drawImage(o,0,0,y,A)}et(m,u,(t==null?void 0:t.cameraZoom)??1.2);const g=e.getSnapshot().cameraTexture;g&&(g.needsUpdate=!0)},J=()=>{if(!o||!m||!u)return;if(p){j();return}const i=()=>{f=requestAnimationFrame(i),j()};f=requestAnimationFrame(i)},de=async i=>{if(i.source===x.WEBCAM)try{const c=t!=null&&t.camRes&&t.camRes>0?t.camRes:960;return await navigator.mediaDevices.getUserMedia({video:{facingMode:"user",frameRate:{min:24,ideal:30,max:60},width:{ideal:c}}})}catch(c){const g=tt(c),v=st[g];throw e.set({error:{error:"PermissionError",message:v,reason:g}}),new I(c instanceof Error?c.message:"getUserMedia failed")}return i.stream},W=async i=>{const c=await de(i);d=c;const g=await Ze(c);o=g,m=new OffscreenCanvas(g.videoWidth,g.videoHeight);const{renderWidth:v,renderHeight:y}=e.getSnapshot(),A=rt({renderWidth:v,renderHeight:y,videoWidth:g.videoWidth,videoHeight:g.videoHeight});u?(u.width!==A.width||u.height!==A.height)&&(u.width=A.width,u.height=A.height,V(u)):(u=new OffscreenCanvas(A.width,A.height),V(u));const ne=i.source===x.STREAM?i.static===!0:!1;p=ne,r=i.source===x.WEBCAM?{source:x.WEBCAM,sourceKind:"webcam"}:{source:x.STREAM,stream:i.stream,static:ne,sourceKind:i.sourceKind??"webcam"},e.set({source:i.source,sourceKind:r.sourceKind,error:void 0})},X=async i=>{const c=i.sourceKind??"webcam";u=i.canvas;const g=V(u);e.set({cameraTexture:g,source:x.CANVAS,sourceKind:c,renderWidth:u.width,renderHeight:u.height,error:void 0}),r={source:x.CANVAS,canvas:i.canvas,sourceKind:c}},le=(i,c)=>!c||i.source!==c.source?!1:i.source===x.STREAM&&c.source===x.STREAM?i.stream===c.stream&&(i.sourceKind??"webcam")===c.sourceKind:!0,ge=async()=>{if(!u)return;const i=k,c=e.getSnapshot().pipeline;for(const[,g]of c.entries())g.resume();await new Promise(g=>requestAnimationFrame(()=>g())),await new Promise(g=>requestAnimationFrame(()=>g())),p&&k===i&&T.suspendAll()},me=(i,c)=>!c||c.source!==x.CANVAS?!1:i.canvas===c.canvas&&(i.sourceKind??"webcam")===c.sourceKind,fe=async i=>{const c=i.source;if(c!==x.WEBCAM&&c!==x.STREAM)throw new I(`Invalid media source: ${String(c)}`);if(le(i,r)){s.log("Media source unchanged, skipping rebind.");return}k+=1;const{lifecycle:g}=e.getSnapshot();if(g==="idle"||g==="stopped"){await W(i),e.set({lifecycle:"media-bound"}),s.log("Media source set to:",i.source);return}if(g==="media-bound"){z(),await W(i),s.log("Media source rebound to:",i.source);return}w=!0,await new Promise(v=>requestAnimationFrame(()=>v())),z(),await W(i),w=!1,J(),p?await ge():T.resumeActive(),s.log("Media source swapped to:",i.source)},pe=async i=>{if(me(i,r)){s.log("Frame source unchanged, skipping rebind.");return}k+=1;const{lifecycle:c}=e.getSnapshot();if(c==="idle"||c==="stopped"){await X(i),e.set({lifecycle:"media-bound"}),s.log("Frame source set to canvas.");return}if(c==="media-bound"){z(),await X(i),s.log("Frame source rebound to canvas.");return}w=!0,await new Promise(g=>requestAnimationFrame(()=>g())),z(),await X(i),w=!1,s.log("Frame source swapped to canvas.")},ve=async()=>{const{lifecycle:i}=e.getSnapshot();if(i==="running")return;if(i==="idle")throw new I("session.start() called before setMediaSource — call setMediaSource first");if(!u)throw new I("session.start(): media source not bound");const c=(r==null?void 0:r.source)===x.CANVAS;if(!c&&(!o||!m))throw i==="stopped"?new I("session.start() called from stopped state without a media source — call setMediaSource first"):new I("session.start(): media source not bound");c||J(),T.resumeActive(),e.set({lifecycle:"running"}),await new Promise(v=>requestAnimationFrame(()=>v()));const g=e.getSnapshot().pipeline;for(const[v,y]of g.entries())await U(v,y);e.set({ready:!0}),s.log("XR session started.")},ee=async()=>{const{lifecycle:i}=e.getSnapshot();i==="stopped"||i==="idle"||(z(),T.suspendAll(),e.set({lifecycle:"stopped",ready:!1}),s.log("XR session stopped."))},we=async()=>{await ee(),T.releaseAll(),K.clear();const i=e.getSnapshot().cameraTexture;i&&i.dispose(),C.clear(),r=void 0,k+=1,u=void 0,m=void 0,p=!1,e.set({lifecycle:"idle",cameraTexture:void 0,source:void 0}),s.log("XR session reset.")},Ce=async i=>{const c="legacy:registerXRPipeline",g=[];await Promise.all(i.map(async v=>{const{model:y}=v;if(!ae[y])throw new I(`Invalid model: ${y}`);K.has(y)||g.push(y);const A="options"in v?v.options:void 0;await T.acquire(y,c,A)})),g.length>0&&(g.forEach(v=>K.add(v)),s.log("XR pipeline registered."))},Se=i=>{const c=T.get(i);if(!c)throw new I(`Model ${i} is not registered in the pipeline`);return c.getModelNode()},te=async(i,c)=>{i<=0||c<=0||(e.set({renderWidth:i,renderHeight:c}),u&&(u.width!==i||u.height!==c)&&(u.width=i,u.height=c,V(u),p&&j()),s.log(`Source canvas set. Render size: ${i}x${c}`))},ke=async i=>{var y;S=i;const c=(y=i.getBoundingClientRect)==null?void 0:y.call(i),g=c&&c.width>0?Math.round(c.width):i.clientWidth,v=c&&c.height>0?Math.round(c.height):i.clientHeight;await te(g,v)},ye=i=>{M=i.renderer,R=i.scene,F=i.camera,l=i.renderFrame},se=()=>{if(!M||!R||!F)throw new I("XR frame render requested before the R3F state was bound — make sure <XRScene> is mounted");l?l():M.render(R,F)};return{store:e,registry:T,setMediaSource:fe,start:ve,stop:ee,reset:we,setFrameSource:pe,registerXRPipeline:Ce,getModelNode:Se,captureFrame:()=>{if(!S)throw new I("session.captureFrame() called before the XRScene render target was bound — make sure <XRScene> is mounted");if(!M||!R||!F)throw new I("session.captureFrame() called before the R3F state was bound — make sure <XRScene> is mounted");return se(),S.toDataURL("image/png")},getInputFrame:()=>u??null,_setRenderTarget:ke,_setRenderSize:te,_setR3FState:ye,_renderFrame:se,_getVideoElement:()=>o,_setPerf:i=>{if(t=i,e.getSnapshot().lifecycle!=="running"||!u)return;const c=e.getSnapshot().pipeline;for(const[g,v]of c.entries())v.run({sourceCanvas:u,renderWidth:e.getSnapshot().renderWidth,renderHeight:e.getSnapshot().renderHeight,getSource:()=>e.getSnapshot().sourceKind,targetFps:a(g)})}}},ct=n=>{const s=b.useRef(n),e=b.useMemo(()=>ot(s.current),[]),t=JSON.stringify(n??{});return b.useEffect(()=>{e._setPerf(n)},[e,t]),e},Z=new Map,ht=()=>({register:(n,s)=>{s?Z.set(n,s):Z.delete(n)},resolve:n=>n?Z.get(n)??null:null}),oe=ht(),ce=b.createContext(null),ut=({children:n})=>{const s=b.useRef(new Map),e=b.useCallback((r,o)=>{o?s.current.set(r,o):s.current.delete(r)},[]),t=b.useCallback(r=>r?s.current.get(r)??null:null,[]),a=b.useMemo(()=>({register:e,resolve:t}),[e,t]);return b.createElement(ce.Provider,{value:a},n)},he=()=>b.useContext(ce)??oe,dt=()=>he().register,lt=()=>he().resolve;oe.register;const ue=b.createContext(void 0),gt=()=>{const n=b.useContext(ue);if(!n)throw new I("XR context can only be used inside XRProvider, did you forget to wrap your app in <XRProvider>?");return n},mt=({children:n,perf:s})=>{const e=ct(s),t=b.useMemo(()=>({session:e}),[e]);return ie.jsx(ue.Provider,{value:t,children:ie.jsx(ut,{children:n})})};exports.XRMediaSource=x;exports.XRModel=L;exports.XRProvider=mt;exports.fetchAndVerify=re;exports.libConfig=E;exports.unprojectToZZero=Ae;exports.unprojectToZZeroInto=q;exports.useRegisterRuntimeObject=dt;exports.useResolveRuntimeObject=lt;exports.useXRContext=gt;
|