@vincentt-xr/sdk 2.0.0-alpha.3 → 2.0.0-alpha.5

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.
Files changed (57) hide show
  1. package/GROUNDING.md +33 -0
  2. package/README.md +85 -52
  3. package/dist/{DebuggerUI-xp4bg3gH.js → DebuggerUI-DhKTXTY2.js} +1 -1
  4. package/dist/{DebuggerUI-B45_Gb9d.cjs → DebuggerUI-bnGHSSOb.cjs} +1 -1
  5. package/dist/{FaceMeshRenderer-CALA4k49.js → FaceMeshRenderer-B2i2NW71.js} +3 -3
  6. package/dist/{FaceMeshRenderer-D4PFqsb3.cjs → FaceMeshRenderer-BSOq1OnG.cjs} +1 -1
  7. package/dist/{FaceRetouch-DF5UsOsZ.js → FaceRetouch-Bg-OBU4n.js} +4 -4
  8. package/dist/{FaceRetouch-Bq2rtPlV.cjs → FaceRetouch-TZeBGIqW.cjs} +1 -1
  9. package/dist/{contexts-D5TQcwmv.js → contexts-B2_NsTnk.js} +3 -3
  10. package/dist/{contexts-Dv1SA0bS.cjs → contexts-BgWfyxre.cjs} +1 -1
  11. package/dist/debug-ui/media-source.cjs +1 -1
  12. package/dist/debug-ui/media-source.js +1 -1
  13. package/dist/debug-ui.cjs +1 -1
  14. package/dist/debug-ui.js +10 -10
  15. package/dist/entries/low-level.d.ts +2 -0
  16. package/dist/face-effects.cjs +1 -1
  17. package/dist/face-effects.js +4 -4
  18. package/dist/{getFaceInfo-Cjcgcc4w.js → getFaceInfo-4DhcPZDJ.js} +1 -1
  19. package/dist/{getFaceInfo-oQcP40Ha.cjs → getFaceInfo-QOQ_dc-W.cjs} +1 -1
  20. package/dist/hooks/selectors.d.ts +2 -4
  21. package/dist/hooks/useXRSession/reason.d.ts +19 -0
  22. package/dist/hooks/useXRSession/store.d.ts +12 -4
  23. package/dist/{index-N7C6fNah.js → index-72Wb15Ca.js} +1 -1
  24. package/dist/{index-JygePOwo.js → index-BMeBJ0dV.js} +322 -299
  25. package/dist/{index-UU5ODHGU.cjs → index-C9yQVzAh.cjs} +1 -1
  26. package/dist/{index-DdWBnI7A.cjs → index-CNGzE49z.cjs} +1 -1
  27. package/dist/{index-DpVIEBHw.js → index-Cj3fGDtZ.js} +8 -8
  28. package/dist/{index-YMUaJU7U.js → index-D1kj6uc-.js} +1 -1
  29. package/dist/{index-D4bLzBr6.cjs → index-Da7uycur.cjs} +1 -1
  30. package/dist/{index-Be-S7uSm.cjs → index-WPPnlFO1.cjs} +1 -1
  31. package/dist/{index-DqhqBi7O.cjs → index-ZaDEzDtR.cjs} +1 -1
  32. package/dist/{index-HxT9XEuh.js → index-g250Tqme.js} +1 -1
  33. package/dist/{internal-D7NxAsc6.js → internal-34pb7djs.js} +3 -3
  34. package/dist/{internal-i2JkM85N.cjs → internal-Dtvo4WYo.cjs} +1 -1
  35. package/dist/internal.cjs +1 -1
  36. package/dist/internal.js +1 -1
  37. package/dist/low-level.cjs +1 -1
  38. package/dist/low-level.js +11 -11
  39. package/dist/main.cjs +1 -1
  40. package/dist/main.js +12 -12
  41. package/dist/{renderGroups-JEXqSACh.js → renderGroups-CPWUX6z9.js} +1 -1
  42. package/dist/{renderGroups-uXXsFpvw.cjs → renderGroups-jSUOY1Oq.cjs} +1 -1
  43. package/dist/{renderPasses-CdGZeHHL.js → renderPasses-CLlYRdMk.js} +4 -4
  44. package/dist/{renderPasses-CVWt0t8m.cjs → renderPasses-KUJUSevp.cjs} +1 -1
  45. package/dist/scene-object.cjs +1 -1
  46. package/dist/scene-object.js +2 -2
  47. package/dist/{selectors-twqYByYZ.js → selectors-DLxL8Q66.js} +1 -1
  48. package/dist/{selectors-2QvO5RYY.cjs → selectors-S8g25ke9.cjs} +1 -1
  49. package/dist/{session-C1StwN0f.js → session-CbtvwiaD.js} +1 -1
  50. package/dist/{session-BChR4TgK.cjs → session-DP8AF7Rg.cjs} +1 -1
  51. package/dist/tracking.cjs +1 -1
  52. package/dist/tracking.js +9 -9
  53. package/dist/{useFaceInfo-DSUmuzzO.cjs → useFaceInfo-BvZeUBsL.cjs} +1 -1
  54. package/dist/{useFaceInfo-DOJCGlDG.js → useFaceInfo-C06EyScd.js} +3 -3
  55. package/dist/{useFaceResults-CBmhT5E8.js → useFaceResults-C1Ppc8rS.js} +1 -1
  56. package/dist/{useFaceResults-B1BSGUAW.cjs → useFaceResults-CCNiH7VZ.cjs} +1 -1
  57. package/package.json +3 -2
package/GROUNDING.md CHANGED
@@ -2078,6 +2078,39 @@ import { AspectRatioContainer } from "@vincentt-xr/sdk";
2078
2078
  </AspectRatioContainer>;
2079
2079
  ```
2080
2080
 
2081
+ ### `useXRError()` — Why the camera failed to start
2082
+
2083
+ Returns the session error, or `undefined` while the session is healthy. `<XRScene>`
2084
+ already renders `message` through its default error component, so reach for this
2085
+ hook only to branch on the cause or to render your own copy.
2086
+
2087
+ ```tsx
2088
+ import { useXRError } from "@vincentt-xr/sdk/low-level";
2089
+ import type { XRErrorReason, XRSessionError } from "@vincentt-xr/sdk/low-level";
2090
+
2091
+ const error = useXRError();
2092
+
2093
+ if (error?.reason === "camera-in-use") {
2094
+ // "close your other tab", not "grant permission"
2095
+ }
2096
+ ```
2097
+
2098
+ The shape is `{ error, message, reason }`:
2099
+
2100
+ - **`reason`** — the stable, machine-readable identity. Branch on this. One of
2101
+ `"permission-denied"`, `"camera-in-use"`, `"no-camera"`, `"unsupported"`, or
2102
+ `"unknown"`.
2103
+ - **`message`** — human prose for display. It may be reworded in any release, so
2104
+ never match on its text.
2105
+ - **`error`** — a legacy constant kept for backwards compatibility. Carries no
2106
+ information; do not branch on it.
2107
+
2108
+ `reason` is the SDK's own vocabulary rather than the browser's `DOMException`
2109
+ name, because those names are vendor-specific and get renamed. `"camera-in-use"`
2110
+ covers a camera held by another app or tab; `"no-camera"` means the device has
2111
+ none; `"unsupported"` covers an insecure context or a browser that refuses the
2112
+ request; `"unknown"` is anything unrecognized.
2113
+
2081
2114
  ---
2082
2115
 
2083
2116
  ## Capture & share
package/README.md CHANGED
@@ -1,85 +1,118 @@
1
- # RTX AR Tracking SDK
1
+ # Vincentt XR SDK
2
2
 
3
- This SDK is intended for implementing AI-powered tracking for WebAR projects by rangoon.tech.
3
+ `@vincentt-xr/sdk` is the AR runtime for Vincentt projects. It gives a React +
4
+ react-three-fiber app a camera session, face/hand/body tracking, and the
5
+ screen-space layout primitives that most AR effects are built from.
4
6
 
5
- ## Installation
6
- First, install the library by running the command
7
+ Your JSX renders directly — in local preview and in the published bundle at
8
+ `<slug>.vincentt.app`.
9
+
10
+ ## Install
11
+
12
+ The SDK is installed for you when you scaffold a project from the Vincentt
13
+ template, which pins a known-good version alongside its peers:
7
14
 
8
15
  ```
9
- npm install @rangoon/track
16
+ vincentt create my-app
10
17
  ```
11
18
 
12
- If you're using yarn,
19
+ To add it to an existing project:
13
20
 
14
21
  ```
15
- yarn add @rangoon/track
22
+ pnpm add @vincentt-xr/sdk
16
23
  ```
17
24
 
18
- ## How to use
19
- The usage of `@rangoon/track` usually involves two steps.
25
+ It expects `react`, `react-dom`, `three`, `@react-three/fiber`,
26
+ `@react-three/drei`, and `@mediapipe/tasks-vision` as peers. The template
27
+ already pins compatible versions of all of them; mismatched copies of React or
28
+ three.js are the most common source of runtime errors.
20
29
 
21
- ### 1. Start a video stream
22
- Initialize the SDK by attaching the `@rangoon/track`'s `Webcam` component to your React Project.
23
- The `Webcam` component will start a video stream which will be used for tracking.
30
+ ## Quick start
24
31
 
25
- ```ts
26
- import { Webcam } from "@rangoon/track"
27
- import { useRef } from "react"
32
+ Wrap your app in `XRProvider`, mount an `XRScene`, and add content. Trackers
33
+ self-register when mounted — there is no pipeline to wire up by hand.
28
34
 
29
- function App() {
35
+ ```tsx
36
+ import { ScreenSpaceUI, ScreenText, XRProvider, XRScene } from "@vincentt-xr/sdk";
37
+ import { useFaceDetection } from "@vincentt-xr/sdk/tracking";
30
38
 
31
- const videoRef = useRef<HTMLVideoElement>(null)
39
+ function Effect() {
40
+ const detection = useFaceDetection({ numFaces: 1 });
41
+
42
+ if (detection.face) return null;
32
43
 
33
44
  return (
34
- <div>
35
- <Webcam videoReference={videoRef}/>
36
- </div>
37
- )
45
+ <ScreenSpaceUI>
46
+ <ScreenText
47
+ text="SHOW A FACE TO THE CAMERA"
48
+ screenTransform={{ position: { x: 0, y: 0 }, size: { width: 400, height: 52 } }}
49
+ fontSize={24}
50
+ />
51
+ </ScreenSpaceUI>
52
+ );
38
53
  }
39
54
 
40
- export default App
41
-
55
+ export default function App() {
56
+ return (
57
+ <XRProvider>
58
+ <XRScene>
59
+ <Effect />
60
+ </XRScene>
61
+ </XRProvider>
62
+ );
63
+ }
42
64
  ```
43
65
 
44
- ### 2. Initiate a tracking model
66
+ ## Import doors
45
67
 
46
- Currently, `@rangoon/track` supports three types of tracking models.
47
- * Hand Tracking (Landmarks)
48
- * Hand Gesture Tracking (Landmarks + Gestures)
49
- * Face Tracking
68
+ The API is split by task domain. Import each symbol from the door that owns it.
50
69
 
51
- By calling the Hook associated with the respective model, you can obtain the tracking data.
70
+ | Entry point | What lives there |
71
+ | -------------------------------- | ------------------------------------------------------------------------------- |
72
+ | `@vincentt-xr/sdk` | Providers, scene root, screen-space layout, renderers, text, capture, audio |
73
+ | `@vincentt-xr/sdk/tracking` | Face / hand / gesture / body / segmentation trackers, anchors, triggers |
74
+ | `@vincentt-xr/sdk/face-effects` | Face mesh materials, retouch, canonical mesh, head binding |
75
+ | `@vincentt-xr/sdk/scene-object` | Scene-object types, factories, selectors, immutable store operations |
76
+ | `@vincentt-xr/sdk/low-level` | Raw model-node reads and custom-tracker plumbing — the escape hatch |
77
+ | `@vincentt-xr/sdk/debug-ui` | Dev-only inspector panels; not for shipping surfaces |
52
78
 
53
- Below is an example of obtaining hand-tracking data with `useHandTracking` Hook.
54
- ```ts
55
- import { Webcam, useHandTracking } from "@rangoon/track"
56
- import { useEffect, useRef } from "react"
79
+ ## Documentation
57
80
 
58
- function App() {
81
+ **[`GROUNDING.md`](./GROUNDING.md) is the authoritative API reference** — every
82
+ component, hook, and prop, plus the composition conventions. Read it before
83
+ reaching into `node_modules` or inventing props. It ships inside the package, so
84
+ it travels with the version you actually installed.
59
85
 
60
- const videoRef = useRef<HTMLVideoElement>(null)
86
+ Longer-form guides live in [`docs/`](./docs):
61
87
 
62
- //Initiate the model by passing the webcam reference
63
- const handData = useHandTracking({
64
- videoReference: videoRef
65
- })
88
+ - [`docs/introduction.mdx`](./docs/introduction.mdx) — the scene-object authoring model
89
+ - [`docs/guides/`](./docs/guides) — task guides
90
+ - [`docs/api/`](./docs/api) — API pages
91
+ - [`docs/MIGRATION_GUIDE.md`](./docs/MIGRATION_GUIDE.md) — upgrading from 1.x
66
92
 
67
- //Watch the data changes with useEffect
68
- useEffect(() => {
69
- console.log(handData)
70
- }, [handData])
93
+ ## Local development
71
94
 
72
- return (
73
- <div>
74
- <Webcam videoReference={videoRef}/>
75
- </div>
76
- )
77
- }
78
-
79
- export default App
80
95
  ```
96
+ pnpm install
97
+ pnpm dev # example app
98
+ pnpm preview:tunnel # example app, reachable on a phone
99
+ pnpm build
100
+ pnpm test
101
+ pnpm typecheck
102
+ ```
103
+
104
+ The example app under `example/` is the development surface for the SDK itself.
105
+ Experiments start there; once one becomes a real app it graduates to its own
106
+ repo built against the packaged SDK.
107
+
108
+ Release steps are in [`RELEASING.md`](./RELEASING.md).
109
+
110
+ ## License
81
111
 
112
+ Proprietary. See [`LICENSE`](./LICENSE) — the published package is for use with
113
+ the Vincentt platform only.
82
114
 
83
115
  ## Feedback
84
116
 
85
- If you have any feedback, please reach out to us at waing@rangoon.tech
117
+ Report friction and bugs to the Vincentt team through the beta reporting flow,
118
+ or open an issue on this repository.
@@ -1,7 +1,7 @@
1
1
  import { jsx as e, jsxs as r, Fragment as f } from "react/jsx-runtime";
2
2
  import { useState as P, useEffect as M } from "react";
3
3
  import { createPortal as F } from "react-dom";
4
- import { f as i } from "./internal-D7NxAsc6.js";
4
+ import { f as i } from "./internal-34pb7djs.js";
5
5
  const z = {
6
6
  position: "fixed",
7
7
  top: "10px",
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),x=require("react"),C=require("react-dom"),s=require("./internal-i2JkM85N.cjs"),P={position:"fixed",top:"10px",left:"10px",zIndex:9999,fontFamily:"'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', monospace",fontSize:"12px",color:"#fff",pointerEvents:"auto",userSelect:"none"},h={background:"rgba(0, 0, 0, 0.85)",borderRadius:"6px",padding:"12px 16px",boxShadow:"0 4px 12px rgba(0, 0, 0, 0.5)",backdropFilter:"blur(10px)",border:"1px solid rgba(255, 255, 255, 0.1)",minWidth:"240px"},k={...h,padding:"8px 12px",minWidth:"auto"},F={display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:"12px",paddingBottom:"8px",borderBottom:"1px solid rgba(255, 255, 255, 0.2)"},M={fontSize:"13px",fontWeight:"bold",color:"#00ff9f",letterSpacing:"0.5px",textTransform:"uppercase"},z={display:"flex",gap:"6px"},f={background:"rgba(255, 255, 255, 0.1)",border:"1px solid rgba(255, 255, 255, 0.2)",borderRadius:"4px",color:"#fff",padding:"4px 8px",fontSize:"11px",cursor:"pointer",transition:"all 0.2s"},R={display:"grid",gridTemplateColumns:"1fr 1fr",gap:"10px"},i={display:"flex",flexDirection:"column",gap:"4px"},o={fontSize:"10px",color:"rgba(255, 255, 255, 0.6)",textTransform:"uppercase",letterSpacing:"0.5px"},d={fontSize:"16px",fontWeight:"bold",color:"#fff"},u={...d,color:"#00ff9f"},g={...d,color:"#ffaa00"},m={...d,color:"#ff4444"},l={fontSize:"11px",color:"rgba(255, 255, 255, 0.5)",marginLeft:"4px"},N={width:"100%",height:"4px",background:"rgba(255, 255, 255, 0.2)",borderRadius:"2px",overflow:"hidden",marginTop:"4px"},w=t=>({width:`${t}%`,height:"100%",background:t>90?"#ff4444":t>70?"#ffaa00":"#00ff9f",transition:"width 0.3s ease, background 0.3s ease"}),B={fontSize:"9px",color:"rgba(255, 255, 255, 0.4)",marginTop:"8px",textAlign:"center",fontStyle:"italic"};function a(t,n){return n==="fps"?t>=30?u:t>=20?g:m:t<=40?u:t<=60?g:m}function D({metrics:t,collapsed:n,onCollapse:y,onClose:b,position:c="top-left",keyboardShortcut:j="ctrl+shift+d"}){const[p,v]=x.useState(null);if(x.useEffect(()=>{const r=document.createElement("div");return r.id="xr-debugger-overlay",document.body.appendChild(r),v(r),()=>{document.body.removeChild(r)}},[]),!p)return null;const S={...P,...c==="top-right"&&{left:"auto",right:"10px"},...c==="bottom-left"&&{top:"auto",bottom:"10px"},...c==="bottom-right"&&{top:"auto",bottom:"10px",left:"auto",right:"10px"}};return C.createPortal(e.jsx("div",{style:S,children:e.jsxs("div",{style:n?k:h,children:[e.jsxs("div",{style:F,children:[e.jsx("div",{style:M,children:n?"AR Debugger":"AR Performance"}),e.jsxs("div",{style:z,children:[e.jsx("button",{style:f,onClick:()=>y(!n),onMouseEnter:r=>{r.currentTarget.style.background="rgba(255, 255, 255, 0.2)"},onMouseLeave:r=>{r.currentTarget.style.background="rgba(255, 255, 255, 0.1)"},children:n?"+":"−"}),e.jsx("button",{style:f,onClick:b,onMouseEnter:r=>{r.currentTarget.style.background="rgba(255, 255, 255, 0.2)"},onMouseLeave:r=>{r.currentTarget.style.background="rgba(255, 255, 255, 0.1)"},children:"✕"})]})]}),!n&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{style:R,children:[e.jsxs("div",{style:i,children:[e.jsx("div",{style:o,children:"Camera FPS"}),e.jsxs("div",{children:[e.jsx("span",{style:a(t.cameraFPS,"fps"),children:s.formatNumber(t.cameraFPS,0)}),e.jsx("span",{style:l,children:"fps"})]})]}),e.jsxs("div",{style:i,children:[e.jsx("div",{style:o,children:"Resolution"}),e.jsx("span",{style:d,children:t.resolution})]}),e.jsxs("div",{style:i,children:[e.jsx("div",{style:o,children:"Detection"}),e.jsxs("div",{children:[e.jsx("span",{style:a(t.detectionTime,"time"),children:s.formatNumber(t.detectionTime,1)}),e.jsx("span",{style:l,children:"ms"})]})]}),e.jsxs("div",{style:i,children:[e.jsx("div",{style:o,children:"Rendering"}),e.jsxs("div",{children:[e.jsx("span",{style:a(t.renderTime,"time"),children:s.formatNumber(t.renderTime,1)}),e.jsx("span",{style:l,children:"ms"})]})]}),e.jsxs("div",{style:i,children:[e.jsx("div",{style:o,children:"Effective FPS"}),e.jsxs("div",{children:[e.jsx("span",{style:a(t.effectiveFPS,"fps"),children:s.formatNumber(t.effectiveFPS,0)}),e.jsx("span",{style:l,children:"fps"})]})]}),e.jsxs("div",{style:i,children:[e.jsx("div",{style:o,children:"Memory"}),t.memory?e.jsxs(e.Fragment,{children:[e.jsxs("div",{children:[e.jsx("span",{style:d,children:s.formatNumber(t.memory.used,0)}),e.jsxs("span",{style:l,children:["/ ",s.formatNumber(t.memory.total,0)," MB"]})]}),e.jsx("div",{style:N,children:e.jsx("div",{style:w(t.memory.percentage)})})]}):e.jsx("span",{style:d,children:"N/A"})]})]}),t.modelPerformance.length>0&&e.jsx(e.Fragment,{children:e.jsxs("div",{style:{borderTop:"1px solid rgba(255, 255, 255, 0.15)",marginTop:"12px",paddingTop:"12px"},children:[e.jsx("div",{style:o,children:"Model Performance"}),e.jsx("div",{style:{marginTop:"8px",display:"flex",flexDirection:"column",gap:"6px"},children:t.modelPerformance.map((r,T)=>e.jsxs("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",fontSize:"11px"},children:[e.jsx("span",{style:{color:"rgba(255, 255, 255, 0.7)"},children:r.name}),e.jsxs("div",{children:[e.jsx("span",{style:a(r.processingTime,"time"),children:s.formatNumber(r.processingTime,1)}),e.jsx("span",{style:l,children:"ms"})]})]},T))})]})}),e.jsxs("div",{style:B,children:["Press ",j.toUpperCase()," to toggle"]})]})]})}),p)}exports.DebuggerUI=D;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),x=require("react"),C=require("react-dom"),s=require("./internal-Dtvo4WYo.cjs"),P={position:"fixed",top:"10px",left:"10px",zIndex:9999,fontFamily:"'Monaco', 'Menlo', 'Ubuntu Mono', 'Consolas', monospace",fontSize:"12px",color:"#fff",pointerEvents:"auto",userSelect:"none"},h={background:"rgba(0, 0, 0, 0.85)",borderRadius:"6px",padding:"12px 16px",boxShadow:"0 4px 12px rgba(0, 0, 0, 0.5)",backdropFilter:"blur(10px)",border:"1px solid rgba(255, 255, 255, 0.1)",minWidth:"240px"},k={...h,padding:"8px 12px",minWidth:"auto"},F={display:"flex",justifyContent:"space-between",alignItems:"center",marginBottom:"12px",paddingBottom:"8px",borderBottom:"1px solid rgba(255, 255, 255, 0.2)"},M={fontSize:"13px",fontWeight:"bold",color:"#00ff9f",letterSpacing:"0.5px",textTransform:"uppercase"},z={display:"flex",gap:"6px"},f={background:"rgba(255, 255, 255, 0.1)",border:"1px solid rgba(255, 255, 255, 0.2)",borderRadius:"4px",color:"#fff",padding:"4px 8px",fontSize:"11px",cursor:"pointer",transition:"all 0.2s"},R={display:"grid",gridTemplateColumns:"1fr 1fr",gap:"10px"},i={display:"flex",flexDirection:"column",gap:"4px"},o={fontSize:"10px",color:"rgba(255, 255, 255, 0.6)",textTransform:"uppercase",letterSpacing:"0.5px"},d={fontSize:"16px",fontWeight:"bold",color:"#fff"},u={...d,color:"#00ff9f"},g={...d,color:"#ffaa00"},m={...d,color:"#ff4444"},l={fontSize:"11px",color:"rgba(255, 255, 255, 0.5)",marginLeft:"4px"},N={width:"100%",height:"4px",background:"rgba(255, 255, 255, 0.2)",borderRadius:"2px",overflow:"hidden",marginTop:"4px"},w=t=>({width:`${t}%`,height:"100%",background:t>90?"#ff4444":t>70?"#ffaa00":"#00ff9f",transition:"width 0.3s ease, background 0.3s ease"}),B={fontSize:"9px",color:"rgba(255, 255, 255, 0.4)",marginTop:"8px",textAlign:"center",fontStyle:"italic"};function a(t,n){return n==="fps"?t>=30?u:t>=20?g:m:t<=40?u:t<=60?g:m}function D({metrics:t,collapsed:n,onCollapse:y,onClose:b,position:c="top-left",keyboardShortcut:j="ctrl+shift+d"}){const[p,v]=x.useState(null);if(x.useEffect(()=>{const r=document.createElement("div");return r.id="xr-debugger-overlay",document.body.appendChild(r),v(r),()=>{document.body.removeChild(r)}},[]),!p)return null;const S={...P,...c==="top-right"&&{left:"auto",right:"10px"},...c==="bottom-left"&&{top:"auto",bottom:"10px"},...c==="bottom-right"&&{top:"auto",bottom:"10px",left:"auto",right:"10px"}};return C.createPortal(e.jsx("div",{style:S,children:e.jsxs("div",{style:n?k:h,children:[e.jsxs("div",{style:F,children:[e.jsx("div",{style:M,children:n?"AR Debugger":"AR Performance"}),e.jsxs("div",{style:z,children:[e.jsx("button",{style:f,onClick:()=>y(!n),onMouseEnter:r=>{r.currentTarget.style.background="rgba(255, 255, 255, 0.2)"},onMouseLeave:r=>{r.currentTarget.style.background="rgba(255, 255, 255, 0.1)"},children:n?"+":"−"}),e.jsx("button",{style:f,onClick:b,onMouseEnter:r=>{r.currentTarget.style.background="rgba(255, 255, 255, 0.2)"},onMouseLeave:r=>{r.currentTarget.style.background="rgba(255, 255, 255, 0.1)"},children:"✕"})]})]}),!n&&e.jsxs(e.Fragment,{children:[e.jsxs("div",{style:R,children:[e.jsxs("div",{style:i,children:[e.jsx("div",{style:o,children:"Camera FPS"}),e.jsxs("div",{children:[e.jsx("span",{style:a(t.cameraFPS,"fps"),children:s.formatNumber(t.cameraFPS,0)}),e.jsx("span",{style:l,children:"fps"})]})]}),e.jsxs("div",{style:i,children:[e.jsx("div",{style:o,children:"Resolution"}),e.jsx("span",{style:d,children:t.resolution})]}),e.jsxs("div",{style:i,children:[e.jsx("div",{style:o,children:"Detection"}),e.jsxs("div",{children:[e.jsx("span",{style:a(t.detectionTime,"time"),children:s.formatNumber(t.detectionTime,1)}),e.jsx("span",{style:l,children:"ms"})]})]}),e.jsxs("div",{style:i,children:[e.jsx("div",{style:o,children:"Rendering"}),e.jsxs("div",{children:[e.jsx("span",{style:a(t.renderTime,"time"),children:s.formatNumber(t.renderTime,1)}),e.jsx("span",{style:l,children:"ms"})]})]}),e.jsxs("div",{style:i,children:[e.jsx("div",{style:o,children:"Effective FPS"}),e.jsxs("div",{children:[e.jsx("span",{style:a(t.effectiveFPS,"fps"),children:s.formatNumber(t.effectiveFPS,0)}),e.jsx("span",{style:l,children:"fps"})]})]}),e.jsxs("div",{style:i,children:[e.jsx("div",{style:o,children:"Memory"}),t.memory?e.jsxs(e.Fragment,{children:[e.jsxs("div",{children:[e.jsx("span",{style:d,children:s.formatNumber(t.memory.used,0)}),e.jsxs("span",{style:l,children:["/ ",s.formatNumber(t.memory.total,0)," MB"]})]}),e.jsx("div",{style:N,children:e.jsx("div",{style:w(t.memory.percentage)})})]}):e.jsx("span",{style:d,children:"N/A"})]})]}),t.modelPerformance.length>0&&e.jsx(e.Fragment,{children:e.jsxs("div",{style:{borderTop:"1px solid rgba(255, 255, 255, 0.15)",marginTop:"12px",paddingTop:"12px"},children:[e.jsx("div",{style:o,children:"Model Performance"}),e.jsx("div",{style:{marginTop:"8px",display:"flex",flexDirection:"column",gap:"6px"},children:t.modelPerformance.map((r,T)=>e.jsxs("div",{style:{display:"flex",justifyContent:"space-between",alignItems:"center",fontSize:"11px"},children:[e.jsx("span",{style:{color:"rgba(255, 255, 255, 0.7)"},children:r.name}),e.jsxs("div",{children:[e.jsx("span",{style:a(r.processingTime,"time"),children:s.formatNumber(r.processingTime,1)}),e.jsx("span",{style:l,children:"ms"})]})]},T))})]})}),e.jsxs("div",{style:B,children:["Press ",j.toUpperCase()," to toggle"]})]})]})}),p)}exports.DebuggerUI=D;
@@ -3,9 +3,9 @@ import { useLoader as ce, useThree as Dt, useFrame as Pt } from "@react-three/fi
3
3
  import { useMemo as q, useRef as l, useState as We, useCallback as Ge, useEffect as Te } from "react";
4
4
  import * as g from "three";
5
5
  import { MathUtils as Xe, Color as Gt, Vector2 as ze } from "three";
6
- import { l as ne, f as zt, X as Nt } from "./index-JygePOwo.js";
7
- import { c as Ht, u as Bt } from "./selectors-twqYByYZ.js";
8
- import { t as Vt, p as Wt, b as Xt } from "./index-YMUaJU7U.js";
6
+ import { l as ne, f as zt, X as Nt } from "./index-BMeBJ0dV.js";
7
+ import { c as Ht, u as Bt } from "./selectors-DLxL8Q66.js";
8
+ import { t as Vt, p as Wt, b as Xt } from "./index-D1kj6uc-.js";
9
9
  import { TransformControls as jt } from "@react-three/drei";
10
10
  const Re = 8, K = {
11
11
  type: "linear",
@@ -1,4 +1,4 @@
1
- "use strict";const u=require("react/jsx-runtime"),ee=require("@react-three/fiber"),i=require("react"),J=require("three"),q=require("./index-D4bLzBr6.cjs"),je=require("./selectors-2QvO5RYY.cjs"),_e=require("./index-DqhqBi7O.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=`
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
2
  varying vec2 vPosition;
3
3
  void main() {
4
4
  vPosition = position.xy;
@@ -1,11 +1,11 @@
1
- import { g as p, h as _, i as w, j as A, F as y, e as c, f as k } from "./FaceMeshRenderer-CALA4k49.js";
1
+ import { g as p, h as _, i as w, j as A, F as y, e as c, f as k } from "./FaceMeshRenderer-B2i2NW71.js";
2
2
  import { jsx as x, jsxs as W } from "react/jsx-runtime";
3
3
  import { useMemo as b, useEffect as P } from "react";
4
- import { X } from "./index-JygePOwo.js";
5
- import { u as I } from "./index-YMUaJU7U.js";
4
+ import { X } from "./index-BMeBJ0dV.js";
5
+ import { u as I } from "./index-D1kj6uc-.js";
6
6
  import { useThree as Y, useFrame as V } from "@react-three/fiber";
7
7
  import * as g from "three";
8
- import { u as G } from "./selectors-twqYByYZ.js";
8
+ import { u as G } from "./selectors-DLxL8Q66.js";
9
9
  const j = {
10
10
  enabled: !1,
11
11
  strength: 1,
@@ -1,4 +1,4 @@
1
- "use strict";const o=require("./FaceMeshRenderer-D4PFqsb3.cjs"),M=require("react/jsx-runtime"),S=require("react"),D=require("./index-D4bLzBr6.cjs"),y=require("./index-DqhqBi7O.cjs"),T=require("@react-three/fiber"),U=require("three"),B=require("./selectors-2QvO5RYY.cjs");function N(e){const a=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(a,t,r.get?r:{enumerable:!0,get:()=>e[t]})}}return a.default=e,Object.freeze(a)}const p=N(U),w={enabled:!1,strength:1,faceWidth:0,faceHeight:0,faceRoundness:0,midfaceHeight:0,foreheadHeight:0,foreheadWidth:0,cheekboneWidth:0,cheekWidth:0,cheekHollowness:0,midfaceDepth:0,scalpHeight:0,headCurve:0,faceTwist:0,faceSwirl:0,browDistance:0,browHeight:0,browDepth:0,eyeSize:0,leftEyeSize:0,rightEyeSize:0,eyeDistance:0,leftEyeX:0,rightEyeX:0,leftEyeY:0,rightEyeY:0,noseSize:0,noseLength:0,mouthWidth:0,mouthHeight:0,jawWidth:0,chinHeight:0},I={...w,enabled:!0,strength:1,faceWidth:-.08,faceHeight:.04,foreheadHeight:.04,cheekWidth:-.04,eyeSize:.08,eyeDistance:.03,noseSize:-.05,noseLength:.03,mouthWidth:.06,mouthHeight:.02,jawWidth:-.05,chinHeight:.03},X=[{label:"Wireframe",value:o.FACE_MESH_MATERIAL_TYPES.wireframe},{label:"Basic",value:o.FACE_MESH_MATERIAL_TYPES.basic},{label:"Standard",value:o.FACE_MESH_MATERIAL_TYPES.standard},{label:"Physical",value:o.FACE_MESH_MATERIAL_TYPES.physical},{label:"Toon",value:o.FACE_MESH_MATERIAL_TYPES.toon},{label:"Normal",value:o.FACE_MESH_MATERIAL_TYPES.normal},{label:"Matcap",value:o.FACE_MESH_MATERIAL_TYPES.matcap},{label:"Shader",value:o.FACE_MESH_MATERIAL_TYPES.shader}],W=[{label:"Original Face",value:o.FACE_MESH_SHADER_PRESETS.originalFace},{label:"Composite",value:o.FACE_MESH_SHADER_PRESETS.composite}],Y=[{label:"Front",value:o.FACE_MESH_SIDES.front},{label:"Back",value:o.FACE_MESH_SIDES.back},{label:"Double",value:o.FACE_MESH_SIDES.double}],j=[{label:"None",value:o.FACE_MESH_TEXTURE_MAPS.none},{label:"UV Map 1",value:o.FACE_MESH_TEXTURE_MAPS.canonical},{label:"UV Map 2",value:o.FACE_MESH_TEXTURE_MAPS.style2}],q=[{label:"None",value:o.FACE_MESH_ALPHA_MAPS.none},{label:"Default Mask",value:o.FACE_MESH_ALPHA_MAPS.canonical}],G=[{label:"Solid",value:o.FACE_MESH_MASK_TEXTURE_SOURCES.solid},{label:"Gradient",value:o.FACE_MESH_MASK_TEXTURE_SOURCES.gradient},{label:"Image URL",value:o.FACE_MESH_MASK_TEXTURE_SOURCES.imageUrl},{label:"Media URL",value:o.FACE_MESH_MASK_TEXTURE_SOURCES.mediaUrl}],V=[{label:"Normal",value:o.FACE_MESH_BLEND_MODES.normal},{label:"Add",value:o.FACE_MESH_BLEND_MODES.add},{label:"Subtract",value:o.FACE_MESH_BLEND_MODES.subtract},{label:"Multiply",value:o.FACE_MESH_BLEND_MODES.multiply},{label:"Screen",value:o.FACE_MESH_BLEND_MODES.screen},{label:"Overlay",value:o.FACE_MESH_BLEND_MODES.overlay},{label:"Soft Light",value:o.FACE_MESH_BLEND_MODES.softLight},{label:"Hard Light",value:o.FACE_MESH_BLEND_MODES.hardLight},{label:"Lighten",value:o.FACE_MESH_BLEND_MODES.lighten},{label:"Darken",value:o.FACE_MESH_BLEND_MODES.darken},{label:"Difference",value:o.FACE_MESH_BLEND_MODES.difference},{label:"Exclusion",value:o.FACE_MESH_BLEND_MODES.exclusion}],K=`
1
+ "use strict";const o=require("./FaceMeshRenderer-BSOq1OnG.cjs"),M=require("react/jsx-runtime"),S=require("react"),D=require("./index-Da7uycur.cjs"),y=require("./index-ZaDEzDtR.cjs"),T=require("@react-three/fiber"),U=require("three"),B=require("./selectors-S8g25ke9.cjs");function N(e){const a=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(a,t,r.get?r:{enumerable:!0,get:()=>e[t]})}}return a.default=e,Object.freeze(a)}const p=N(U),w={enabled:!1,strength:1,faceWidth:0,faceHeight:0,faceRoundness:0,midfaceHeight:0,foreheadHeight:0,foreheadWidth:0,cheekboneWidth:0,cheekWidth:0,cheekHollowness:0,midfaceDepth:0,scalpHeight:0,headCurve:0,faceTwist:0,faceSwirl:0,browDistance:0,browHeight:0,browDepth:0,eyeSize:0,leftEyeSize:0,rightEyeSize:0,eyeDistance:0,leftEyeX:0,rightEyeX:0,leftEyeY:0,rightEyeY:0,noseSize:0,noseLength:0,mouthWidth:0,mouthHeight:0,jawWidth:0,chinHeight:0},I={...w,enabled:!0,strength:1,faceWidth:-.08,faceHeight:.04,foreheadHeight:.04,cheekWidth:-.04,eyeSize:.08,eyeDistance:.03,noseSize:-.05,noseLength:.03,mouthWidth:.06,mouthHeight:.02,jawWidth:-.05,chinHeight:.03},X=[{label:"Wireframe",value:o.FACE_MESH_MATERIAL_TYPES.wireframe},{label:"Basic",value:o.FACE_MESH_MATERIAL_TYPES.basic},{label:"Standard",value:o.FACE_MESH_MATERIAL_TYPES.standard},{label:"Physical",value:o.FACE_MESH_MATERIAL_TYPES.physical},{label:"Toon",value:o.FACE_MESH_MATERIAL_TYPES.toon},{label:"Normal",value:o.FACE_MESH_MATERIAL_TYPES.normal},{label:"Matcap",value:o.FACE_MESH_MATERIAL_TYPES.matcap},{label:"Shader",value:o.FACE_MESH_MATERIAL_TYPES.shader}],W=[{label:"Original Face",value:o.FACE_MESH_SHADER_PRESETS.originalFace},{label:"Composite",value:o.FACE_MESH_SHADER_PRESETS.composite}],Y=[{label:"Front",value:o.FACE_MESH_SIDES.front},{label:"Back",value:o.FACE_MESH_SIDES.back},{label:"Double",value:o.FACE_MESH_SIDES.double}],j=[{label:"None",value:o.FACE_MESH_TEXTURE_MAPS.none},{label:"UV Map 1",value:o.FACE_MESH_TEXTURE_MAPS.canonical},{label:"UV Map 2",value:o.FACE_MESH_TEXTURE_MAPS.style2}],q=[{label:"None",value:o.FACE_MESH_ALPHA_MAPS.none},{label:"Default Mask",value:o.FACE_MESH_ALPHA_MAPS.canonical}],G=[{label:"Solid",value:o.FACE_MESH_MASK_TEXTURE_SOURCES.solid},{label:"Gradient",value:o.FACE_MESH_MASK_TEXTURE_SOURCES.gradient},{label:"Image URL",value:o.FACE_MESH_MASK_TEXTURE_SOURCES.imageUrl},{label:"Media URL",value:o.FACE_MESH_MASK_TEXTURE_SOURCES.mediaUrl}],V=[{label:"Normal",value:o.FACE_MESH_BLEND_MODES.normal},{label:"Add",value:o.FACE_MESH_BLEND_MODES.add},{label:"Subtract",value:o.FACE_MESH_BLEND_MODES.subtract},{label:"Multiply",value:o.FACE_MESH_BLEND_MODES.multiply},{label:"Screen",value:o.FACE_MESH_BLEND_MODES.screen},{label:"Overlay",value:o.FACE_MESH_BLEND_MODES.overlay},{label:"Soft Light",value:o.FACE_MESH_BLEND_MODES.softLight},{label:"Hard Light",value:o.FACE_MESH_BLEND_MODES.hardLight},{label:"Lighten",value:o.FACE_MESH_BLEND_MODES.lighten},{label:"Darken",value:o.FACE_MESH_BLEND_MODES.darken},{label:"Difference",value:o.FACE_MESH_BLEND_MODES.difference},{label:"Exclusion",value:o.FACE_MESH_BLEND_MODES.exclusion}],K=`
2
2
  varying vec2 vUv;
3
3
 
4
4
  void main() {
@@ -6,9 +6,9 @@ import { Canvas as ye, useThree as _e, useFrame as Se } from "@react-three/fiber
6
6
  import { useRef as J, useState as Ee, useEffect as Q, useMemo as ne, useContext as fe, createContext as ve } from "react";
7
7
  import * as D from "three";
8
8
  import { R as pe } from "./renderLayers-zrK2pv5O.js";
9
- import { a as Re, b as Te } from "./selectors-twqYByYZ.js";
10
- import { u as xe } from "./index-JygePOwo.js";
11
- import { u as ke, S as Fe } from "./index-N7C6fNah.js";
9
+ import { a as Re, b as Te } from "./selectors-DLxL8Q66.js";
10
+ import { u as xe } from "./index-BMeBJ0dV.js";
11
+ import { u as ke, S as Fe } from "./index-72Wb15Ca.js";
12
12
  const ue = {
13
13
  display: "flex",
14
14
  alignItems: "center",
@@ -1 +1 @@
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-2QvO5RYY.cjs"),ue=require("./index-D4bLzBr6.cjs"),se=require("./index-UU5ODHGU.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;
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;
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("../session-BChR4TgK.cjs");exports.MediaSourceSwitcher=e.MediaSourceSwitcher;exports.defaultMediaSources=e.defaultMediaSources;exports.sdkImageMediaSources=e.sdkImageMediaSources;exports.sdkVideoMediaSources=e.sdkVideoMediaSources;exports.useFaceTrackingMediaSourceSession=e.useFaceTrackingMediaSourceSession;exports.useMediaSourceSession=e.useMediaSourceSession;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("../session-DP8AF7Rg.cjs");exports.MediaSourceSwitcher=e.MediaSourceSwitcher;exports.defaultMediaSources=e.defaultMediaSources;exports.sdkImageMediaSources=e.sdkImageMediaSources;exports.sdkVideoMediaSources=e.sdkVideoMediaSources;exports.useFaceTrackingMediaSourceSession=e.useFaceTrackingMediaSourceSession;exports.useMediaSourceSession=e.useMediaSourceSession;
@@ -1,4 +1,4 @@
1
- import { M as a, d, s as i, a as o, u as r, b as u } from "../session-C1StwN0f.js";
1
+ import { M as a, d, s as i, a as o, u as r, b as u } from "../session-CbtvwiaD.js";
2
2
  export {
3
3
  a as MediaSourceSwitcher,
4
4
  d as defaultMediaSources,