@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.
Files changed (88) hide show
  1. package/GROUNDING.md +92 -7
  2. package/dist/{DebuggerUI-bnGHSSOb.cjs → DebuggerUI-B6bP6P9r.cjs} +1 -1
  3. package/dist/{DebuggerUI-DhKTXTY2.js → DebuggerUI-BjOMr8q_.js} +1 -1
  4. package/dist/FaceMeshRenderer-C5l6VLdO.cjs +155 -0
  5. package/dist/FaceMeshRenderer-wjAHrJzP.js +1270 -0
  6. package/dist/{FaceRetouch-TZeBGIqW.cjs → FaceRetouch-BkJzoA79.cjs} +1 -1
  7. package/dist/{FaceRetouch-Bg-OBU4n.js → FaceRetouch-DwbKQJAN.js} +30 -30
  8. package/dist/components/FaceMesh/FaceMeshRenderer.d.ts +11 -3
  9. package/dist/components/FaceMesh/canonical/CanonicalFaceMeshRenderer.d.ts +17 -1
  10. package/dist/components/FaceMesh/canonical/geometryGroups.d.ts +1 -1
  11. package/dist/components/FaceMesh/canonical/parseCanonicalFaceModel.d.ts +1 -0
  12. package/dist/components/FaceMesh/index.d.ts +2 -2
  13. package/dist/components/LipEffect/LipEffect.d.ts +2 -0
  14. package/dist/components/LipEffect/LipEffectMaterial.d.ts +10 -0
  15. package/dist/components/LipEffect/defaults.d.ts +9 -0
  16. package/dist/components/LipEffect/index.d.ts +4 -0
  17. package/dist/components/LipEffect/types.d.ts +22 -0
  18. package/dist/components/SceneObjectRenderer/index.d.ts +9 -2
  19. package/dist/components/XRMediaSurface/index.d.ts +2 -1
  20. package/dist/{contexts-B2_NsTnk.js → contexts-ByhzppYl.js} +6 -3
  21. package/dist/contexts-Dr62It_K.cjs +1 -0
  22. package/dist/debug-ui/media-source.cjs +1 -1
  23. package/dist/debug-ui/media-source.js +1 -1
  24. package/dist/debug-ui.cjs +1 -1
  25. package/dist/debug-ui.js +10 -10
  26. package/dist/entries/core.d.ts +3 -2
  27. package/dist/entries/face-effects.d.ts +4 -2
  28. package/dist/entries/tracking.d.ts +2 -0
  29. package/dist/face-effects.cjs +1 -1
  30. package/dist/face-effects.js +622 -508
  31. package/dist/{getFaceInfo-4DhcPZDJ.js → getFaceInfo-C4QpCQIY.js} +1 -1
  32. package/dist/{getFaceInfo-QOQ_dc-W.cjs → getFaceInfo-fA1bFBub.cjs} +1 -1
  33. package/dist/hooks/useXRSession/facade.d.ts +2 -0
  34. package/dist/{index-BMeBJ0dV.js → index-9dlAQAhy.js} +457 -416
  35. package/dist/{index-C9yQVzAh.cjs → index-BjmTe9eM.cjs} +1 -1
  36. package/dist/{index-WPPnlFO1.cjs → index-BpEf2BBb.cjs} +1 -1
  37. package/dist/{index-D1kj6uc-.js → index-ByoNj0QP.js} +1 -1
  38. package/dist/{index-ZaDEzDtR.cjs → index-CyUUurQT.cjs} +1 -1
  39. package/dist/index-DCiMbxC3.cjs +1 -0
  40. package/dist/{index-Cj3fGDtZ.js → index-DXT3WccE.js} +808 -787
  41. package/dist/index-DpI-qo5X.cjs +17 -0
  42. package/dist/{index-g250Tqme.js → index-DyVF4vEW.js} +1 -1
  43. package/dist/{index-72Wb15Ca.js → index-VJ0SJwmG.js} +1 -1
  44. package/dist/{internal-Dtvo4WYo.cjs → internal-Cq-TEQ5Y.cjs} +1 -1
  45. package/dist/{internal-34pb7djs.js → internal-Dmk1cTXq.js} +3 -3
  46. package/dist/internal.cjs +1 -1
  47. package/dist/internal.js +1 -1
  48. package/dist/low-level.cjs +1 -1
  49. package/dist/low-level.js +344 -330
  50. package/dist/main.cjs +1 -1
  51. package/dist/main.js +94 -91
  52. package/dist/{renderGroups-jSUOY1Oq.cjs → renderGroups-80H3DpTl.cjs} +1 -1
  53. package/dist/{renderGroups-CPWUX6z9.js → renderGroups-KZk6eRiY.js} +1 -1
  54. package/dist/{renderPasses-KUJUSevp.cjs → renderPasses-BOoBSr8z.cjs} +1 -1
  55. package/dist/{renderPasses-CLlYRdMk.js → renderPasses-BcquyVtu.js} +4 -4
  56. package/dist/scene-object.cjs +1 -1
  57. package/dist/scene-object.js +2 -2
  58. package/dist/screen2d/coordinates.d.ts +20 -0
  59. package/dist/{selectors-DLxL8Q66.js → selectors-B8H97CKA.js} +1 -1
  60. package/dist/{selectors-S8g25ke9.cjs → selectors-CZLKT2Iv.cjs} +1 -1
  61. package/dist/{session-DP8AF7Rg.cjs → session-CpkiK5YA.cjs} +1 -1
  62. package/dist/{session-CbtvwiaD.js → session-DLFN_VII.js} +1 -1
  63. package/dist/tracking/coordinates.d.ts +5 -0
  64. package/dist/tracking.cjs +1 -1
  65. package/dist/tracking.js +69 -66
  66. package/dist/types/common.d.ts +11 -1
  67. package/dist/types/gesture-tracking.d.ts +2 -2
  68. package/dist/types/hand-tracking.d.ts +3 -3
  69. package/dist/types/nodes.d.ts +2 -2
  70. package/dist/types/session.d.ts +7 -1
  71. package/dist/{useFaceInfo-BvZeUBsL.cjs → useFaceInfo-BJ8-_MOs.cjs} +1 -1
  72. package/dist/{useFaceInfo-C06EyScd.js → useFaceInfo-Dk426LTu.js} +3 -3
  73. package/dist/{useFaceResults-C1Ppc8rS.js → useFaceResults-CtetsO9M.js} +1 -1
  74. package/dist/{useFaceResults-CCNiH7VZ.cjs → useFaceResults-wBJF3zyp.cjs} +1 -1
  75. package/dist/utils/visionWasm.d.ts +18 -0
  76. package/docs/SDK_DOCUMENTATION.md +3 -0
  77. package/docs/api/capture-recording.mdx +9 -1
  78. package/docs/api/face-mesh.mdx +33 -0
  79. package/docs/api/runtime-3d.mdx +5 -0
  80. package/docs/api/screen-image.mdx +3 -1
  81. package/docs/api/screen-space-coordinates.mdx +31 -0
  82. package/docs/api/trackers.mdx +13 -0
  83. package/package.json +4 -1
  84. package/dist/FaceMeshRenderer-B2i2NW71.js +0 -1195
  85. package/dist/FaceMeshRenderer-BSOq1OnG.cjs +0 -155
  86. package/dist/contexts-BgWfyxre.cjs +0 -1
  87. package/dist/index-CNGzE49z.cjs +0 -17
  88. package/dist/index-Da7uycur.cjs +0 -1
@@ -1,19 +1,19 @@
1
- var Ae = Object.defineProperty;
2
- var be = (n, s, e) => s in n ? Ae(n, s, { enumerable: !0, configurable: !0, writable: !0, value: e }) : n[s] = e;
3
- var h = (n, s, e) => be(n, typeof s != "symbol" ? s + "" : s, e);
4
- import { jsx as ae } from "react/jsx-runtime";
5
- import { useRef as oe, useMemo as $, useEffect as Ee, useContext as ce, useCallback as ie, createElement as Ie, createContext as he } from "react";
6
- import { FilesetResolver as V, PoseLandmarker as De, FaceLandmarker as _e, GestureRecognizer as Pe, HandLandmarker as Oe, ImageSegmenter as Ue, DrawingUtils as ze } from "@mediapipe/tasks-vision";
1
+ var De = Object.defineProperty;
2
+ var _e = (a, s, e) => s in a ? De(a, s, { enumerable: !0, configurable: !0, writable: !0, value: e }) : a[s] = e;
3
+ var h = (a, s, e) => _e(a, typeof s != "symbol" ? s + "" : s, e);
4
+ import { jsx as ce } from "react/jsx-runtime";
5
+ import { useRef as ue, useMemo as ee, useEffect as Oe, useContext as le, useCallback as he, createElement as Ue, createContext as ge } from "react";
6
+ import { FilesetResolver as V, PoseLandmarker as ze, FaceLandmarker as Le, GestureRecognizer as Be, HandLandmarker as Ve, ImageSegmenter as Ke, DrawingUtils as Ne } from "@mediapipe/tasks-vision";
7
7
  import * as E from "three";
8
- import { RGBAFormat as de, LinearFilter as q, CanvasTexture as ue, SRGBColorSpace as Le } from "three";
9
- var F = /* @__PURE__ */ ((n) => (n.WEBCAM = "webcam", n.STREAM = "stream", n.CANVAS = "canvas", n))(F || {}), z = /* @__PURE__ */ ((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))(z || {});
8
+ import { RGBAFormat as me, LinearFilter as G, CanvasTexture as fe, SRGBColorSpace as He } from "three";
9
+ var T = /* @__PURE__ */ ((a) => (a.WEBCAM = "webcam", a.STREAM = "stream", a.CANVAS = "canvas", a))(T || {}), U = /* @__PURE__ */ ((a) => (a.HAND_TRACKER = "vincentt.xr.hand-tracker", a.GESTURE_TRACKER = "vincentt.xr.gesture-tracker", a.FACE_TRACKER = "vincentt.xr.face-tracker", a.BODY_TRACKER = "vincentt.xr.body-tracker", a.BACKGROUND_SEGMENTATION = "vincentt.xr.background-segmentation", a))(U || {});
10
10
  class b extends Error {
11
11
  constructor(s) {
12
12
  super(s), this.name = "VincenttXRError";
13
13
  }
14
14
  }
15
- const Be = (n, s) => s, I = {
16
- apiBaseUrl: Be(void 0, "https://api.vincentt.studio"),
15
+ const qe = (a, s) => s, I = {
16
+ apiBaseUrl: qe(void 0, "https://api.vincentt.studio"),
17
17
  // Pinned to the CDN, NOT build-env-driven: a stale VITE_ASSET_STORAGE_ENDPOINT
18
18
  // baked a now-deleted CloudFront domain into every published bundle, breaking
19
19
  // WASM/model loads at runtime. The host must never come from a mutable env value.
@@ -23,7 +23,7 @@ const Be = (n, s) => s, I = {
23
23
  loggerPrefix: "[vincentt-xr]:",
24
24
  sessionCheckInterval: 3e4
25
25
  };
26
- class Ve {
26
+ class Ge {
27
27
  constructor(s) {
28
28
  h(this, "options");
29
29
  const e = {
@@ -41,12 +41,12 @@ class Ve {
41
41
  e && console.error(t, ...s);
42
42
  }
43
43
  }
44
- const O = (n) => n * 2 - 1, j = new E.Vector3(), Y = new E.Vector3(), H = ({ x: n, y: s, z: e }, t, i) => {
45
- j.set((n - 0.5) * 2, (0.5 - s) * 2, -e), j.unproject(t), Y.copy(j).sub(t.position).normalize();
46
- const r = -t.position.z / Y.z;
47
- return i.copy(t.position).addScaledVector(Y, r), i;
48
- }, _t = (n, s) => H(n, s, new E.Vector3()), Ke = (n, s, e = 0.2) => e * s + (1 - e) * n;
49
- class Z {
44
+ const te = (a, s = { x: 0, y: 0, z: 0 }) => (s.x = a.x * 2 - 1, s.y = 1 - a.y * 2, s.z = -a.z, s), Vt = (a, s = { x: 0, y: 0, z: 0 }) => (s.x = (a.x + 1) / 2, s.y = (1 - a.y) / 2, s.z = -a.z, s), Q = new E.Vector3(), $ = new E.Vector3(), q = ({ x: a, y: s, z: e }, t, i) => {
45
+ Q.set((a - 0.5) * 2, (0.5 - s) * 2, -e), Q.unproject(t), $.copy(Q).sub(t.position).normalize();
46
+ const r = -t.position.z / $.z;
47
+ return i.copy(t.position).addScaledVector($, r), i;
48
+ }, Kt = (a, s) => q(a, s, new E.Vector3()), We = (a, s, e = 0.2) => e * s + (1 - e) * a;
49
+ class se {
50
50
  constructor(s) {
51
51
  h(this, "canvas");
52
52
  this.maxDimension = s;
@@ -59,16 +59,16 @@ class Z {
59
59
  draw(s) {
60
60
  const e = s.width, t = s.height, i = Math.min(1, this.maxDimension / Math.max(e, t));
61
61
  if (i >= 1) return s;
62
- const r = Math.max(1, Math.round(e * i)), o = Math.max(1, Math.round(t * i));
63
- (!this.canvas || this.canvas.width !== r || this.canvas.height !== o) && (this.canvas = new OffscreenCanvas(r, o));
64
- const u = this.canvas.getContext("2d");
65
- return u ? (u.setTransform(1, 0, 0, 1, 0, 0), u.clearRect(0, 0, r, o), u.drawImage(s, 0, 0, r, o), this.canvas) : s;
62
+ const r = Math.max(1, Math.round(e * i)), c = Math.max(1, Math.round(t * i));
63
+ (!this.canvas || this.canvas.width !== r || this.canvas.height !== c) && (this.canvas = new OffscreenCanvas(r, c));
64
+ const d = this.canvas.getContext("2d");
65
+ return d ? (d.setTransform(1, 0, 0, 1, 0, 0), d.clearRect(0, 0, r, c), d.drawImage(s, 0, 0, r, c), this.canvas) : s;
66
66
  }
67
67
  dispose() {
68
68
  this.canvas = void 0;
69
69
  }
70
70
  }
71
- const Ne = {
71
+ const Xe = {
72
72
  "/assets/xr/models/face_tracking.task": "sha384-tYQh+yJE8llY+zO4RviZmWaSKs5W9tsB0ix5rjQVpF5/CLTqmwtP7bYtkUi2w65P",
73
73
  "/assets/xr/models/hand_tracking.task": "sha384-uWvruVKd887ov8k43S+DBHCsi7UXXS+CKvvdM1PX00rjPzx/B0QrAPfJ1U9yKcze",
74
74
  "/assets/xr/models/gesture_tracking.task": "sha384-2zuseP9JKKWAYlWQGKA2N+ooabB8V/yIxu23Mv8mtY7SowcySB+xKiOmqBhVvlUC",
@@ -78,50 +78,68 @@ const Ne = {
78
78
  "/assets/sdk/face/v1/canonical_face_model.obj": "sha384-xP8YM/72TXKvbMptXB9a8JUlUf3MZQ8uLurExrsZc05v6/P5RrsaNGMUYS/BZx8A",
79
79
  "/opencv/facial_expression_recognition/resolve/main/facial_expression_recognition_mobilefacenet_2022july_int8.onnx": "sha384-g8mtFubiIc/yhqi591RsxD76AJLw2CfYgKhKbVkIiFlwBmIyG7ZAIVyGPXafrDGB"
80
80
  };
81
- async function He(n) {
82
- const s = await fetch(n);
81
+ async function je(a) {
82
+ const s = await fetch(a);
83
83
  if (!s.ok)
84
- throw new Error(`fetchAndVerify: ${s.status} ${n}`);
85
- const e = await s.arrayBuffer(), t = Ge(n);
84
+ throw new Error(`fetchAndVerify: ${s.status} ${a}`);
85
+ const e = await s.arrayBuffer(), t = Qe(a);
86
86
  if (!t) {
87
- if (qe(n))
88
- throw new Error(`[xr-sdk integrity] no SRI hash for SDK asset ${n}`);
89
- return console.warn(`[xr-sdk integrity] no SRI hash for ${n} — passing through`), e;
87
+ if (Ye(a))
88
+ throw new Error(`[xr-sdk integrity] no SRI hash for SDK asset ${a}`);
89
+ return console.warn(`[xr-sdk integrity] no SRI hash for ${a} — passing through`), e;
90
90
  }
91
- const i = await We(e);
91
+ const i = await $e(e);
92
92
  if (i !== t)
93
93
  throw new Error(
94
- `[xr-sdk integrity] SRI mismatch for ${n}: expected ${t}, got ${i}`
94
+ `[xr-sdk integrity] SRI mismatch for ${a}: expected ${t}, got ${i}`
95
95
  );
96
96
  return e;
97
97
  }
98
- function qe(n) {
98
+ function Ye(a) {
99
99
  try {
100
- return new URL(n).origin === new URL(I.assetStorageEndpoint).origin;
100
+ return new URL(a).origin === new URL(I.assetStorageEndpoint).origin;
101
101
  } catch {
102
102
  return !1;
103
103
  }
104
104
  }
105
- async function K(n) {
106
- const s = await He(n);
105
+ async function K(a) {
106
+ const s = await je(a);
107
107
  return new Uint8Array(s);
108
108
  }
109
- function Ge(n) {
109
+ function Qe(a) {
110
110
  try {
111
- const s = new URL(n);
112
- return Ne[s.pathname];
111
+ const s = new URL(a);
112
+ return Xe[s.pathname];
113
113
  } catch {
114
114
  return;
115
115
  }
116
116
  }
117
- async function We(n) {
118
- const s = await crypto.subtle.digest("SHA-384", n), e = new Uint8Array(s);
117
+ async function $e(a) {
118
+ const s = await crypto.subtle.digest("SHA-384", a), e = new Uint8Array(s);
119
119
  let t = "";
120
120
  for (let i = 0; i < e.byteLength; i++)
121
121
  t += String.fromCharCode(e[i]);
122
122
  return `sha384-${btoa(t)}`;
123
123
  }
124
- class N {
124
+ const Z = /* @__PURE__ */ new Map();
125
+ function N(a) {
126
+ const s = a.wasmBinaryPath;
127
+ let e = Z.get(s);
128
+ return e || (e = Ze(s).catch(() => {
129
+ Z.delete(s);
130
+ }), Z.set(s, e)), e;
131
+ }
132
+ async function Ze(a) {
133
+ const s = await fetch(a, { credentials: "same-origin" });
134
+ if (!s.ok || !s.body)
135
+ throw new Error(`warmVisionWasm: ${s.status} ${a}`);
136
+ const e = s.body.getReader();
137
+ for (; ; ) {
138
+ const { done: t } = await e.read();
139
+ if (t) return;
140
+ }
141
+ }
142
+ class H {
125
143
  constructor() {
126
144
  h(this, "disposed", !1);
127
145
  h(this, "paused", !1);
@@ -183,30 +201,29 @@ class N {
183
201
  this.disposed = !0, this.rafId !== null && (cancelAnimationFrame(this.rafId), this.rafId = null);
184
202
  }
185
203
  }
186
- const Xe = 768;
187
- class je extends N {
204
+ const Je = 768;
205
+ class et extends H {
188
206
  constructor() {
189
207
  super();
190
208
  h(this, "landmarker", null);
191
209
  h(this, "processingTime", null);
192
210
  h(this, "coordinates");
193
211
  h(this, "sourceCanvas");
194
- h(this, "downscaler", new Z(Xe));
212
+ h(this, "downscaler", new se(Je));
195
213
  }
196
214
  async getBodyData() {
197
215
  if (!this.landmarker || !this.sourceCanvas)
198
216
  return;
199
217
  const e = this.downscaler.draw(this.sourceCanvas), t = performance.now(), i = this.landmarker.detectForVideo(e, t), r = performance.now();
200
218
  this.processingTime = r - t;
201
- const o = i.landmarks, u = [];
202
- if (o)
203
- return o.forEach((m, d) => {
204
- u[d] || (u[d] = []), m.forEach((S) => {
205
- const R = O(S.x), M = O(1 - S.y), x = O(S.z);
206
- u[d].push({ x: R, y: M, z: x });
219
+ const c = i.landmarks, d = [];
220
+ if (c)
221
+ return c.forEach((m, u) => {
222
+ d[u] || (d[u] = []), m.forEach((C) => {
223
+ d[u].push(te(C));
207
224
  });
208
225
  }), {
209
- coordinatesList: u
226
+ coordinatesList: d
210
227
  };
211
228
  }
212
229
  async processBodyTracking() {
@@ -238,10 +255,13 @@ class je extends N {
238
255
  async initialize(e) {
239
256
  const t = await V.forVisionTasks(
240
257
  new URL("/assets/xr/wasm", I.assetStorageEndpoint).toString()
241
- ), i = await K(
242
- new URL("/assets/xr/models/body_tracking.task", I.assetStorageEndpoint).toString()
243
- );
244
- this.landmarker = await De.createFromOptions(t, {
258
+ ), [i] = await Promise.all([
259
+ K(
260
+ new URL("/assets/xr/models/body_tracking.task", I.assetStorageEndpoint).toString()
261
+ ),
262
+ N(t)
263
+ ]);
264
+ this.landmarker = await ze.createFromOptions(t, {
245
265
  baseOptions: {
246
266
  modelAssetBuffer: i,
247
267
  delegate: "GPU"
@@ -265,8 +285,8 @@ class je extends N {
265
285
  };
266
286
  }
267
287
  }
268
- const Ye = 0.11, Qe = 4e-3, $e = (n, s) => s.set(n.x, -n.y, n.z);
269
- class Ze extends N {
288
+ const tt = 0.11, st = 4e-3, at = (a, s) => s.set(a.x, -a.y, a.z);
289
+ class nt extends H {
270
290
  constructor() {
271
291
  super();
272
292
  h(this, "landmarker", null);
@@ -321,33 +341,33 @@ class Ze extends N {
321
341
  for (let r = 0; r < t; r += 1) {
322
342
  if (!this.cameras[r])
323
343
  continue;
324
- const o = this.faces[r], u = (i = this.getSource) == null ? void 0 : i.call(this), m = !(u === "webcam" || !u), d = e.faceLandmarks[r], S = e.facialTransformationMatrixes[r];
325
- this.rotMatrixScratch.fromArray(S.data), this.rotQuatScratch.setFromRotationMatrix(this.rotMatrixScratch), this.rotQuatScratch.set(
344
+ const c = this.faces[r], d = (i = this.getSource) == null ? void 0 : i.call(this), m = !(d === "webcam" || !d), u = e.faceLandmarks[r], C = e.facialTransformationMatrixes[r];
345
+ this.rotMatrixScratch.fromArray(C.data), this.rotQuatScratch.setFromRotationMatrix(this.rotMatrixScratch), this.rotQuatScratch.set(
326
346
  -this.rotQuatScratch.x,
327
347
  this.rotQuatScratch.y,
328
348
  this.rotQuatScratch.z,
329
349
  this.rotQuatScratch.w
330
- ), this.rotEulerScratch.setFromQuaternion(this.rotQuatScratch, "XYZ"), $e(this.rotEulerScratch, o.transform.rotation), H(
331
- this.landmarkForSource(d[4], m),
350
+ ), this.rotEulerScratch.setFromQuaternion(this.rotQuatScratch, "XYZ"), at(this.rotEulerScratch, c.transform.rotation), q(
351
+ this.landmarkForSource(u[4], m),
332
352
  this.cameras[r],
333
- o.transform.position
334
- ), H(
335
- this.landmarkForSource(d[50], m),
353
+ c.transform.position
354
+ ), q(
355
+ this.landmarkForSource(u[50], m),
336
356
  this.cameras[r],
337
357
  this.leftCheekScratch[r]
338
- ), H(
339
- this.landmarkForSource(d[280], m),
358
+ ), q(
359
+ this.landmarkForSource(u[280], m),
340
360
  this.cameras[r],
341
361
  this.rightCheekScratch[r]
342
362
  );
343
- const M = this.leftCheekScratch[r].distanceTo(this.rightCheekScratch[r]) * Ye, x = Math.abs(E.MathUtils.radToDeg(this.rotEulerScratch.y)), l = M + x * Qe, f = o.transform.scale.x, v = Ke(
363
+ const M = this.leftCheekScratch[r].distanceTo(this.rightCheekScratch[r]) * tt, F = Math.abs(E.MathUtils.radToDeg(this.rotEulerScratch.y)), l = M + F * st, f = c.transform.scale.x, v = We(
344
364
  isNaN(f) ? 0 : f,
345
365
  l
346
366
  );
347
- o.transform.scale.set(v, v, v);
348
- const p = o.gestures, k = e.faceBlendshapes[r].categories;
349
- for (const C of k)
350
- p[C.categoryName] = C.score;
367
+ c.transform.scale.set(v, v, v);
368
+ const p = c.gestures, k = e.faceBlendshapes[r].categories;
369
+ for (const S of k)
370
+ p[S.categoryName] = S.score;
351
371
  }
352
372
  }
353
373
  async processFaceTracking() {
@@ -357,16 +377,16 @@ class Ze extends N {
357
377
  this.rafId = requestAnimationFrame(this.processFaceTracking.bind(this));
358
378
  return;
359
379
  }
360
- const e = Je(this.numFaces), t = this.sourceCanvas.width, i = this.sourceCanvas.height, r = Math.min(1, e / Math.max(t, i)), o = Math.max(1, Math.round(t * r)), u = Math.max(1, Math.round(i * r));
361
- (!this.analysisCanvas || this.analysisCanvas.width !== o || this.analysisCanvas.height !== u) && (this.analysisCanvas = new OffscreenCanvas(o, u));
380
+ const e = it(this.numFaces), t = this.sourceCanvas.width, i = this.sourceCanvas.height, r = Math.min(1, e / Math.max(t, i)), c = Math.max(1, Math.round(t * r)), d = Math.max(1, Math.round(i * r));
381
+ (!this.analysisCanvas || this.analysisCanvas.width !== c || this.analysisCanvas.height !== d) && (this.analysisCanvas = new OffscreenCanvas(c, d));
362
382
  const m = this.analysisCanvas.getContext("2d");
363
383
  if (!m) {
364
384
  this.rafId = requestAnimationFrame(this.processFaceTracking.bind(this));
365
385
  return;
366
386
  }
367
- m.setTransform(1, 0, 0, 1, 0, 0), m.clearRect(0, 0, o, u), m.drawImage(this.sourceCanvas, 0, 0, o, u);
368
- const d = performance.now(), S = this.landmarker.detectForVideo(this.analysisCanvas, d), R = performance.now();
369
- this.processingTime = R - d, this.detectionResults = S, this.extractAndUpdateFaceData(S), !(this.disposed || this.paused) && (this.rafId = requestAnimationFrame(this.processFaceTracking.bind(this)));
387
+ m.setTransform(1, 0, 0, 1, 0, 0), m.clearRect(0, 0, c, d), m.drawImage(this.sourceCanvas, 0, 0, c, d);
388
+ const u = performance.now(), C = this.landmarker.detectForVideo(this.analysisCanvas, u), x = performance.now();
389
+ this.processingTime = x - u, this.detectionResults = C, this.extractAndUpdateFaceData(C), !(this.disposed || this.paused) && (this.rafId = requestAnimationFrame(this.processFaceTracking.bind(this)));
370
390
  }
371
391
  resume() {
372
392
  this.paused && (super.resume(), this.processFaceTracking());
@@ -388,21 +408,24 @@ class Ze extends N {
388
408
  return this.detectionResults;
389
409
  }
390
410
  getRawFaceTrackingData(e = 0) {
391
- var t, i, r, o;
411
+ var t, i, r, c;
392
412
  if (this.detectionResults)
393
413
  return {
394
414
  landmarks: (t = this.detectionResults.faceLandmarks) == null ? void 0 : t[e],
395
415
  blendshapes: (r = (i = this.detectionResults.faceBlendshapes) == null ? void 0 : i[e]) == null ? void 0 : r.categories,
396
- transformationMatrix: (o = this.detectionResults.facialTransformationMatrixes) == null ? void 0 : o[e]
416
+ transformationMatrix: (c = this.detectionResults.facialTransformationMatrixes) == null ? void 0 : c[e]
397
417
  };
398
418
  }
399
419
  async initialize(e) {
400
420
  this.numFaces = (e == null ? void 0 : e.numFaces) || 1;
401
421
  const t = await V.forVisionTasks(
402
422
  new URL("/assets/xr/wasm", I.assetStorageEndpoint).toString()
403
- ), i = await K(
404
- new URL("/assets/xr/models/face_tracking.task", I.assetStorageEndpoint).toString()
405
- ), r = await _e.createFromOptions(t, {
423
+ ), [i] = await Promise.all([
424
+ K(
425
+ new URL("/assets/xr/models/face_tracking.task", I.assetStorageEndpoint).toString()
426
+ ),
427
+ N(t)
428
+ ]), r = await Le.createFromOptions(t, {
406
429
  baseOptions: {
407
430
  modelAssetBuffer: i,
408
431
  delegate: "GPU"
@@ -446,19 +469,19 @@ class Ze extends N {
446
469
  };
447
470
  }
448
471
  }
449
- const Je = (n) => n > 1 ? 1024 : 512;
450
- var D = /* @__PURE__ */ ((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))(D || {});
451
- const et = 512, tt = {
452
- Closed_Fist: D.ClosedFist,
453
- Open_Palm: D.OpenPalm,
454
- Pointing_Up: D.PointingUp,
455
- Thumb_Down: D.ThumbDown,
456
- Thumb_Up: D.ThumbUp,
457
- Victory: D.Victory,
458
- ILoveYou: D.ILoveYou,
459
- None: D.None
460
- }, st = 15;
461
- class nt extends N {
472
+ const it = (a) => a > 1 ? 1024 : 512;
473
+ var P = /* @__PURE__ */ ((a) => (a.ClosedFist = "closed_fist", a.OpenPalm = "open_palm", a.PointingUp = "pointing_up", a.ThumbDown = "thumb_down", a.ThumbUp = "thumb_up", a.Victory = "victory", a.ILoveYou = "i_love_you", a.None = "none", a))(P || {});
474
+ const rt = 512, ot = {
475
+ Closed_Fist: P.ClosedFist,
476
+ Open_Palm: P.OpenPalm,
477
+ Pointing_Up: P.PointingUp,
478
+ Thumb_Down: P.ThumbDown,
479
+ Thumb_Up: P.ThumbUp,
480
+ Victory: P.Victory,
481
+ ILoveYou: P.ILoveYou,
482
+ None: P.None
483
+ }, ct = 15;
484
+ class ht extends H {
462
485
  constructor() {
463
486
  super();
464
487
  h(this, "landmarker", null);
@@ -466,25 +489,21 @@ class nt extends N {
466
489
  h(this, "coordinates");
467
490
  h(this, "gesture");
468
491
  h(this, "sourceCanvas");
469
- h(this, "downscaler", new Z(et));
492
+ h(this, "downscaler", new se(rt));
470
493
  }
471
494
  async getGestureData() {
472
495
  if (!this.landmarker || !this.sourceCanvas)
473
496
  return;
474
497
  const e = this.downscaler.draw(this.sourceCanvas), t = performance.now(), i = this.landmarker.recognizeForVideo(e, t), r = performance.now();
475
498
  this.processingTime = r - t;
476
- const o = i.landmarks[0], u = [];
477
- if (o) {
499
+ const c = i.landmarks[0], d = [];
500
+ if (c) {
478
501
  const m = i.gestures[0][0].categoryName;
479
- return o.forEach((d) => {
480
- u.push({
481
- x: O(d.x),
482
- y: O(1 - d.y),
483
- z: -d.z
484
- });
502
+ return c.forEach((u) => {
503
+ d.push(te(u));
485
504
  }), {
486
- coordinates: u,
487
- gesture: tt[m]
505
+ coordinates: d,
506
+ gesture: ot[m]
488
507
  };
489
508
  }
490
509
  return { coordinates: void 0, gesture: void 0 };
@@ -514,9 +533,15 @@ class nt extends N {
514
533
  async initialize() {
515
534
  const e = await V.forVisionTasks(
516
535
  new URL("/assets/xr/wasm", I.assetStorageEndpoint).toString()
517
- ), t = await K(
518
- new URL("/assets/xr/models/gesture_tracking.task", I.assetStorageEndpoint).toString()
519
- ), i = await Pe.createFromOptions(e, {
536
+ ), [t] = await Promise.all([
537
+ K(
538
+ new URL(
539
+ "/assets/xr/models/gesture_tracking.task",
540
+ I.assetStorageEndpoint
541
+ ).toString()
542
+ ),
543
+ N(e)
544
+ ]), i = await Be.createFromOptions(e, {
520
545
  baseOptions: {
521
546
  modelAssetBuffer: t,
522
547
  delegate: "GPU"
@@ -527,7 +552,7 @@ class nt extends N {
527
552
  this.landmarker = i;
528
553
  }
529
554
  async run({ sourceCanvas: e, targetFps: t }) {
530
- this.sourceCanvas = e, this.setTargetFps(t ?? st), this.rafId === null && await this.processGestureTracking();
555
+ this.sourceCanvas = e, this.setTargetFps(t ?? ct), this.rafId === null && await this.processGestureTracking();
531
556
  }
532
557
  getModelNode() {
533
558
  const e = this;
@@ -547,8 +572,8 @@ class nt extends N {
547
572
  };
548
573
  }
549
574
  }
550
- const at = 512;
551
- class it extends N {
575
+ const dt = 512;
576
+ class ut extends H {
552
577
  constructor() {
553
578
  super();
554
579
  h(this, "landmarker", null);
@@ -558,34 +583,32 @@ class it extends N {
558
583
  h(this, "gesture");
559
584
  h(this, "handedness");
560
585
  h(this, "sourceCanvas");
561
- h(this, "downscaler", new Z(at));
586
+ h(this, "downscaler", new se(dt));
562
587
  }
563
588
  async getHandData() {
564
589
  if (!this.landmarker || !this.sourceCanvas)
565
590
  return;
566
591
  const e = this.downscaler.draw(this.sourceCanvas), t = performance.now(), i = this.landmarker.detectForVideo(e, t), r = performance.now();
567
592
  this.processingTime = r - t;
568
- const o = [], u = i.handedness ?? i.handednesses ?? [];
569
- if (i.landmarks.forEach((d, S) => {
593
+ const c = [], d = i.handedness ?? i.handednesses ?? [];
594
+ if (i.landmarks.forEach((u, C) => {
570
595
  var f, v, p;
571
- if (!d || d.length === 0)
596
+ if (!u || u.length === 0)
572
597
  return;
573
- const R = d.map((k) => ({
574
- x: O(k.x),
575
- y: O(1 - k.y),
576
- z: -k.z
577
- })), M = (p = (v = (f = u[S]) == null ? void 0 : f[0]) == null ? void 0 : v.categoryName) == null ? void 0 : p.toLowerCase(), x = M === "left" || M === "right" ? M : void 0, l = d[0].z < 0 ? "closed_fist" : "open_palm";
578
- o.push({ coordinates: R, gesture: l, handedness: x });
579
- }), !o.length)
598
+ const x = u.map(
599
+ (k) => te(k)
600
+ ), M = (p = (v = (f = d[C]) == null ? void 0 : f[0]) == null ? void 0 : v.categoryName) == null ? void 0 : p.toLowerCase(), F = M === "left" || M === "right" ? M : void 0, l = u[0].z < 0 ? "closed_fist" : "open_palm";
601
+ c.push({ coordinates: x, gesture: l, handedness: F });
602
+ }), !c.length)
580
603
  return {
581
604
  hands: void 0,
582
605
  coordinates: void 0,
583
606
  gesture: void 0,
584
607
  handedness: void 0
585
608
  };
586
- const m = o[0];
609
+ const m = c[0];
587
610
  return {
588
- hands: o,
611
+ hands: c,
589
612
  coordinates: m.coordinates,
590
613
  gesture: m.gesture,
591
614
  handedness: m.handedness
@@ -616,9 +639,12 @@ class it extends N {
616
639
  async initialize() {
617
640
  const e = await V.forVisionTasks(
618
641
  new URL("/assets/xr/wasm", I.assetStorageEndpoint).toString()
619
- ), t = await K(
620
- new URL("/assets/xr/models/hand_tracking.task", I.assetStorageEndpoint).toString()
621
- ), i = await Oe.createFromOptions(e, {
642
+ ), [t] = await Promise.all([
643
+ K(
644
+ new URL("/assets/xr/models/hand_tracking.task", I.assetStorageEndpoint).toString()
645
+ ),
646
+ N(e)
647
+ ]), i = await Ve.createFromOptions(e, {
622
648
  baseOptions: {
623
649
  modelAssetBuffer: t,
624
650
  delegate: "GPU"
@@ -655,13 +681,13 @@ class it extends N {
655
681
  };
656
682
  }
657
683
  }
658
- const rt = 24, ot = 720, ct = [
684
+ const lt = 24, gt = 720, mt = [
659
685
  [255, 255, 255, 255],
660
686
  // 0: background → green 255, kept
661
687
  [0, 0, 0, 0]
662
688
  // 1: person → green 0, discarded
663
689
  ];
664
- class ht extends N {
690
+ class ft extends H {
665
691
  constructor() {
666
692
  super();
667
693
  h(this, "segmenter", null);
@@ -747,7 +773,7 @@ class ht extends N {
747
773
  const e = this.readIntrinsicSize(this.inputSource);
748
774
  if (!e) return;
749
775
  this.inputSourceSize = e;
750
- const t = Math.min(1, ot / Math.max(e.width, e.height)), i = Math.max(1, Math.round(e.width * t)), r = Math.max(1, Math.round(e.height * t));
776
+ const t = Math.min(1, gt / Math.max(e.width, e.height)), i = Math.max(1, Math.round(e.width * t)), r = Math.max(1, Math.round(e.height * t));
751
777
  this.processCanvas.width === i && this.processCanvas.height === r || (this.processCanvas.width = i, this.processCanvas.height = r, this.glCanvas && (this.glCanvas.width = i, this.glCanvas.height = r), this.maskImageData = void 0);
752
778
  }
753
779
  async processSegmentation() {
@@ -768,30 +794,30 @@ class ht extends N {
768
794
  this.ensureProcessCanvasForInput();
769
795
  const i = this.processCanvas.getContext("2d");
770
796
  if (i) {
771
- const u = this.processCanvas.width, m = this.processCanvas.height;
772
- if (i.clearRect(0, 0, u, m), this.inputSource && this.inputSourceSize) {
773
- const { width: d, height: S } = this.inputSourceSize, R = Math.min(u / d, m / S), M = d * R, x = S * R;
774
- i.drawImage(this.inputSource, (u - M) / 2, (m - x) / 2, M, x);
797
+ const d = this.processCanvas.width, m = this.processCanvas.height;
798
+ if (i.clearRect(0, 0, d, m), this.inputSource && this.inputSourceSize) {
799
+ const { width: u, height: C } = this.inputSourceSize, x = Math.min(d / u, m / C), M = u * x, F = C * x;
800
+ i.drawImage(this.inputSource, (d - M) / 2, (m - F) / 2, M, F);
775
801
  } else
776
- i.drawImage(e, 0, 0, u, m);
802
+ i.drawImage(e, 0, 0, d, m);
777
803
  }
778
- const o = this.segmenter.segmentForVideo(
804
+ const c = this.segmenter.segmentForVideo(
779
805
  this.processCanvas,
780
806
  performance.now()
781
807
  ).categoryMask;
782
- if (!o) {
808
+ if (!c) {
783
809
  if (this.disposed || this.paused) return;
784
810
  this.rafId = requestAnimationFrame(this.processSegmentation.bind(this));
785
811
  return;
786
812
  }
787
813
  if (this.rawCache = null, this.latestMask && (this.latestMask.close(), this.latestMask = null), this.useGpuMaskPath && this.drawingUtils && this.glCanvas)
788
- this.drawingUtils.drawCategoryMask(o, ct), this.latestMask = o.clone(), o.close(), this.blitGlToMask();
814
+ this.drawingUtils.drawCategoryMask(c, mt), this.latestMask = c.clone(), c.close(), this.blitGlToMask();
789
815
  else {
790
- this.latestMask = o.clone();
791
- const u = this.readMaskToImageData(o);
792
- o.close(), u && this.blitImageDataToMask(u);
816
+ this.latestMask = c.clone();
817
+ const d = this.readMaskToImageData(c);
818
+ c.close(), d && this.blitImageDataToMask(d);
793
819
  }
794
- this.segmentationMaskTexture && (this.isMaskSetup || (this.segmentationMaskTexture.format = de, this.segmentationMaskTexture.minFilter = q, this.segmentationMaskTexture.magFilter = q, 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)));
820
+ this.segmentationMaskTexture && (this.isMaskSetup || (this.segmentationMaskTexture.format = me, this.segmentationMaskTexture.minFilter = G, this.segmentationMaskTexture.magFilter = G, 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)));
795
821
  }
796
822
  /**
797
823
  * Blit the GPU-rendered mask (already RGBA-inverted by drawCategoryMask)
@@ -814,10 +840,10 @@ class ht extends N {
814
840
  const t = e.getAsUint8Array(), { width: i, height: r } = e;
815
841
  if (!t || i <= 0 || r <= 0) return null;
816
842
  (!this.maskImageData || this.maskImageData.width !== i || this.maskImageData.height !== r) && (this.maskImageData = new ImageData(i, r));
817
- const o = this.maskImageData.data;
818
- for (let u = 0; u < t.length; u += 1) {
819
- const m = t[u] === 255 ? 0 : 255;
820
- o[u * 4] = 255, o[u * 4 + 1] = m, o[u * 4 + 2] = 255, o[u * 4 + 3] = m;
843
+ const c = this.maskImageData.data;
844
+ for (let d = 0; d < t.length; d += 1) {
845
+ const m = t[d] === 255 ? 0 : 255;
846
+ c[d * 4] = 255, c[d * 4 + 1] = m, c[d * 4 + 2] = 255, c[d * 4 + 3] = m;
821
847
  }
822
848
  return this.maskImageData;
823
849
  }
@@ -830,8 +856,8 @@ class ht extends N {
830
856
  if (!this.maskCanvas || !this.filterCanvas) return;
831
857
  const t = this.maskCanvas.getContext("2d"), i = this.filterCanvas.getContext("2d");
832
858
  if (!t || !i) return;
833
- const r = this.getStagingCanvas(e.width, e.height), o = r.getContext("2d");
834
- o && (o.putImageData(e, 0, 0), i.filter = "blur(0.5px)", i.clearRect(0, 0, this.filterCanvas.width, this.filterCanvas.height), i.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));
859
+ const r = this.getStagingCanvas(e.width, e.height), c = r.getContext("2d");
860
+ c && (c.putImageData(e, 0, 0), i.filter = "blur(0.5px)", i.clearRect(0, 0, this.filterCanvas.width, this.filterCanvas.height), i.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));
835
861
  }
836
862
  getStagingCanvas(e, t) {
837
863
  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;
@@ -860,14 +886,17 @@ class ht extends N {
860
886
  this.quality = (e == null ? void 0 : e.quality) ?? "low";
861
887
  const t = await V.forVisionTasks(
862
888
  new URL("/assets/xr/wasm", I.assetStorageEndpoint).toString()
863
- ), i = await K(
864
- new URL("/assets/xr/models/segmentation.tflite", I.assetStorageEndpoint).toString()
865
- );
889
+ ), [i] = await Promise.all([
890
+ K(
891
+ new URL("/assets/xr/models/segmentation.tflite", I.assetStorageEndpoint).toString()
892
+ ),
893
+ N(t)
894
+ ]);
866
895
  this.glCanvas = new OffscreenCanvas(1, 1);
867
896
  const r = this.glCanvas.getContext("webgl2", {
868
897
  preserveDrawingBuffer: !0
869
898
  });
870
- this.segmenter = await Ue.createFromOptions(t, {
899
+ this.segmenter = await Ke.createFromOptions(t, {
871
900
  baseOptions: {
872
901
  modelAssetBuffer: i,
873
902
  delegate: "GPU"
@@ -876,7 +905,7 @@ class ht extends N {
876
905
  outputCategoryMask: !0,
877
906
  outputConfidenceMasks: !1,
878
907
  runningMode: "VIDEO"
879
- }), r ? (this.drawingUtils = new ze(r), this.useGpuMaskPath = !0) : this.useGpuMaskPath = !1;
908
+ }), r ? (this.drawingUtils = new Ne(r), this.useGpuMaskPath = !0) : this.useGpuMaskPath = !1;
880
909
  }
881
910
  async run({
882
911
  sourceCanvas: e,
@@ -884,12 +913,12 @@ class ht extends N {
884
913
  renderHeight: i,
885
914
  targetFps: r
886
915
  }) {
887
- var u;
916
+ var d;
888
917
  if (!e)
889
918
  return;
890
- this.setTargetFps(r ?? rt), this.isProcessing = !1, this.rafId !== null && (cancelAnimationFrame(this.rafId), this.rafId = null);
891
- const o = this.getQualityScaleFactor();
892
- 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 = i, this.filterCanvas = document.createElement("canvas"), this.filterCanvas.width = t, this.filterCanvas.height = i, (u = this.segmentationMaskTexture) == null || u.dispose(), this.segmentationMaskTexture = new ue(this.maskCanvas), this.isMaskSetup = !1, this.rawCache = null, this.isProcessing = !0, this.lastInferenceMs = 0, this.rafId = requestAnimationFrame(this.processSegmentation.bind(this));
919
+ this.setTargetFps(r ?? lt), this.isProcessing = !1, this.rafId !== null && (cancelAnimationFrame(this.rafId), this.rafId = null);
920
+ const c = this.getQualityScaleFactor();
921
+ this.sourceCanvas = e, this.processCanvas = document.createElement("canvas"), this.processCanvas.width = e.width * c, this.processCanvas.height = e.height * c, 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 = i, this.filterCanvas = document.createElement("canvas"), this.filterCanvas.width = t, this.filterCanvas.height = i, (d = this.segmentationMaskTexture) == null || d.dispose(), this.segmentationMaskTexture = new fe(this.maskCanvas), this.isMaskSetup = !1, this.rawCache = null, this.isProcessing = !0, this.lastInferenceMs = 0, this.rafId = requestAnimationFrame(this.processSegmentation.bind(this));
893
922
  }
894
923
  /**
895
924
  * Lazily read the single-channel mask back to a Uint8Array. Only invoked when
@@ -924,15 +953,15 @@ class ht extends N {
924
953
  };
925
954
  }
926
955
  }
927
- const re = {
928
- [z.BACKGROUND_SEGMENTATION]: ht,
929
- [z.HAND_TRACKER]: it,
930
- [z.GESTURE_TRACKER]: nt,
931
- [z.FACE_TRACKER]: Ze,
932
- [z.BODY_TRACKER]: je
933
- }, dt = async (n) => {
956
+ const de = {
957
+ [U.BACKGROUND_SEGMENTATION]: ft,
958
+ [U.HAND_TRACKER]: ut,
959
+ [U.GESTURE_TRACKER]: ht,
960
+ [U.FACE_TRACKER]: nt,
961
+ [U.BODY_TRACKER]: et
962
+ }, pt = async (a) => {
934
963
  const s = document.createElement("video");
935
- s.srcObject = n, s.muted = !0, s.playsInline = !0, s.autoplay = !0, await new Promise((t) => {
964
+ s.srcObject = a, s.muted = !0, s.playsInline = !0, s.autoplay = !0, await new Promise((t) => {
936
965
  s.onloadedmetadata = () => {
937
966
  s.play(), t();
938
967
  };
@@ -944,38 +973,38 @@ const re = {
944
973
  };
945
974
  typeof e.requestVideoFrameCallback == "function" ? e.requestVideoFrameCallback(r) : requestAnimationFrame(() => requestAnimationFrame(() => r()));
946
975
  }), s;
947
- }, ut = (n) => {
948
- const s = new ue(n);
949
- return s.colorSpace = Le, s.format = de, s.minFilter = q, s.magFilter = q, s.generateMipmaps = !1, s.needsUpdate = !0, s;
950
- }, lt = (n, s) => {
951
- const e = n.videoWidth, t = n.videoHeight;
976
+ }, wt = (a) => {
977
+ const s = new fe(a);
978
+ return s.colorSpace = He, s.format = me, s.minFilter = G, s.magFilter = G, s.generateMipmaps = !1, s.needsUpdate = !0, s;
979
+ }, vt = (a, s) => {
980
+ const e = a.videoWidth, t = a.videoHeight;
952
981
  e > 0 && t > 0 && (s.width !== e && (s.width = e), s.height !== t && (s.height = t));
953
982
  const i = s.getContext("2d", {
954
983
  colorSpace: "srgb"
955
984
  });
956
- i.save(), i.scale(-1, 1), i.drawImage(n, -s.width, 0, s.width, s.height), i.restore();
957
- }, gt = (n, s, e = 1) => {
985
+ i.save(), i.scale(-1, 1), i.drawImage(a, -s.width, 0, s.width, s.height), i.restore();
986
+ }, St = (a, s, e = 1) => {
958
987
  const t = s.getContext("2d", {
959
988
  colorSpace: "srgb"
960
- }), i = s.width / s.height, r = n.width / n.height;
961
- let o, u;
962
- r > i ? (u = s.height, o = n.width * (s.height / n.height)) : (o = s.width, u = n.height * (s.width / n.width));
989
+ }), i = s.width / s.height, r = a.width / a.height;
990
+ let c, d;
991
+ r > i ? (d = s.height, c = a.width * (s.height / a.height)) : (c = s.width, d = a.height * (s.width / a.width));
963
992
  const m = Number.isFinite(e) && e > 0 ? e : 1;
964
- o *= m, u *= m;
965
- const d = (s.width - o) / 2, S = (s.height - u) / 2;
993
+ c *= m, d *= m;
994
+ const u = (s.width - c) / 2, C = (s.height - d) / 2;
966
995
  t.setTransform(1, 0, 0, 1, 0, 0), t.clearRect(0, 0, s.width, s.height), t.drawImage(
967
- n,
996
+ a,
968
997
  0,
969
998
  0,
970
- n.width,
971
- n.height,
972
- d,
973
- S,
974
- o,
975
- u
999
+ a.width,
1000
+ a.height,
1001
+ u,
1002
+ C,
1003
+ c,
1004
+ d
976
1005
  );
977
- }, mt = (n) => {
978
- switch (n instanceof DOMException ? n.name : "") {
1006
+ }, Ct = (a) => {
1007
+ switch (a instanceof DOMException ? a.name : "") {
979
1008
  case "NotAllowedError":
980
1009
  case "PermissionDeniedError":
981
1010
  return "permission-denied";
@@ -989,15 +1018,15 @@ const re = {
989
1018
  case "SecurityError":
990
1019
  return "unsupported";
991
1020
  default:
992
- return n instanceof TypeError ? "unsupported" : "unknown";
1021
+ return a instanceof TypeError ? "unsupported" : "unknown";
993
1022
  }
994
- }, ft = {
1023
+ }, kt = {
995
1024
  "permission-denied": "Camera access was blocked. Allow camera permissions in your browser, then refresh.",
996
1025
  "camera-in-use": "Camera is already in use by another app or browser tab. Close it and refresh.",
997
1026
  "no-camera": "No camera was found on this device.",
998
1027
  unsupported: "Unable to access camera. Allow camera permissions in your browser, then refresh.",
999
1028
  unknown: "Unable to access camera. Allow camera permissions in your browser, then refresh."
1000
- }, pt = (n, s, e) => {
1029
+ }, yt = (a, s, e) => {
1001
1030
  const t = /* @__PURE__ */ new Map();
1002
1031
  let i = !1;
1003
1032
  const r = (l, f) => {
@@ -1015,28 +1044,28 @@ const re = {
1015
1044
  const k = s[l];
1016
1045
  if (!k)
1017
1046
  throw new Error(`Invalid model: ${l}`);
1018
- const C = new k(), L = /* @__PURE__ */ new Set([f]), U = /* @__PURE__ */ new Set([f]), _ = (async () => {
1019
- await C.initialize(v);
1020
- const B = t.get(l);
1021
- if (!B || B.model !== C || B.refs.size === 0)
1022
- return r(l, C), C;
1023
- e && await e(l, C);
1024
- const T = t.get(l);
1025
- return T && T.refs.size > 0 && n.setPipeline((P) => P.set(l, C)), C;
1047
+ const S = new k(), O = /* @__PURE__ */ new Set([f]), z = /* @__PURE__ */ new Set([f]), D = (async () => {
1048
+ await S.initialize(v);
1049
+ const _ = t.get(l);
1050
+ if (!_ || _.model !== S || _.refs.size === 0)
1051
+ return r(l, S), S;
1052
+ e && await e(l, S);
1053
+ const L = t.get(l);
1054
+ return L && L.refs.size > 0 && a.setPipeline((A) => A.set(l, S)), S;
1026
1055
  })();
1027
- return p = { model: C, refs: L, activeRefs: U, initPromise: _, options: v }, t.set(l, p), _.catch(() => {
1028
- t.get(l) === p && (t.delete(l), n.setPipeline((T) => T.delete(l))), r(l, C);
1029
- }), _;
1056
+ return p = { model: S, refs: O, activeRefs: z, initPromise: D, options: v }, t.set(l, p), D.catch(() => {
1057
+ t.get(l) === p && (t.delete(l), a.setPipeline((L) => L.delete(l))), r(l, S);
1058
+ }), D;
1030
1059
  }, release: (l, f) => {
1031
1060
  const v = t.get(l);
1032
- v && (v.refs.delete(f), v.activeRefs.delete(f) && v.refs.size > 0 && v.activeRefs.size === 0 && v.model.pause(), !(v.refs.size > 0) && (t.delete(l), r(l, v.model), n.setPipeline((p) => p.delete(l))));
1061
+ v && (v.refs.delete(f), v.activeRefs.delete(f) && v.refs.size > 0 && v.activeRefs.size === 0 && v.model.pause(), !(v.refs.size > 0) && (t.delete(l), r(l, v.model), a.setPipeline((p) => p.delete(l))));
1033
1062
  }, setActive: (l, f, v) => {
1034
1063
  const p = t.get(l);
1035
1064
  if (!p || !p.refs.has(f)) return;
1036
1065
  const k = p.activeRefs.size > 0;
1037
1066
  v ? p.activeRefs.add(f) : p.activeRefs.delete(f);
1038
- const C = p.activeRefs.size > 0;
1039
- k !== C && (C && !i ? p.model.resume() : p.model.pause());
1067
+ const S = p.activeRefs.size > 0;
1068
+ k !== S && (S && !i ? p.model.resume() : p.model.pause());
1040
1069
  }, suspendAll: () => {
1041
1070
  i = !0;
1042
1071
  for (const l of t.values())
@@ -1056,9 +1085,9 @@ const re = {
1056
1085
  const f = t.get(l);
1057
1086
  f && (f.refs.clear(), t.delete(l), r(l, f.model));
1058
1087
  }
1059
- n.setPipeline((l) => l.clear());
1088
+ a.setPipeline((l) => l.clear());
1060
1089
  } };
1061
- }, wt = {
1090
+ }, Mt = {
1062
1091
  lifecycle: "idle",
1063
1092
  ready: !1,
1064
1093
  error: void 0,
@@ -1068,307 +1097,317 @@ const re = {
1068
1097
  source: void 0,
1069
1098
  sourceKind: void 0,
1070
1099
  pipeline: /* @__PURE__ */ new Map()
1071
- }, vt = () => {
1072
- let n = { ...wt, pipeline: /* @__PURE__ */ new Map() };
1100
+ }, Tt = () => {
1101
+ let a = { ...Mt, pipeline: /* @__PURE__ */ new Map() };
1073
1102
  const s = /* @__PURE__ */ new Set(), e = () => {
1074
1103
  s.forEach((t) => t());
1075
1104
  };
1076
1105
  return {
1077
- getSnapshot: () => n,
1106
+ getSnapshot: () => a,
1078
1107
  set: (t) => {
1079
1108
  let i = !1;
1080
1109
  for (const r of Object.keys(t))
1081
- if (t[r] !== n[r]) {
1110
+ if (t[r] !== a[r]) {
1082
1111
  i = !0;
1083
1112
  break;
1084
1113
  }
1085
- i && (n = { ...n, ...t }, e());
1114
+ i && (a = { ...a, ...t }, e());
1086
1115
  },
1087
1116
  setPipeline: (t) => {
1088
- const i = new Map(n.pipeline);
1089
- return t(i), n = { ...n, pipeline: i }, e(), i;
1117
+ const i = new Map(a.pipeline);
1118
+ return t(i), a = { ...a, pipeline: i }, e(), i;
1090
1119
  },
1091
1120
  subscribe: (t) => (s.add(t), () => {
1092
1121
  s.delete(t);
1093
1122
  })
1094
1123
  };
1095
- }, Ct = ({
1096
- renderHeight: n,
1124
+ }, Rt = ({
1125
+ renderHeight: a,
1097
1126
  renderWidth: s,
1098
1127
  videoHeight: e,
1099
1128
  videoWidth: t
1100
1129
  }) => ({
1101
- height: n || e,
1130
+ height: a || e,
1102
1131
  width: s || t
1103
- }), St = (n) => {
1104
- const s = new Ve({ verbose: !0 }), e = vt();
1105
- let t = n;
1106
- const i = (a) => {
1132
+ }), xt = (a) => {
1133
+ const s = new Ge({ verbose: !0 }), e = Tt();
1134
+ let t = a;
1135
+ const i = (n) => {
1107
1136
  var g;
1108
- const c = (g = T.getOptions(a)) == null ? void 0 : g.targetFps;
1109
- return typeof c == "number" ? c : t == null ? void 0 : t.targetFps;
1137
+ const o = (g = A.getOptions(n)) == null ? void 0 : g.targetFps;
1138
+ return typeof o == "number" ? o : t == null ? void 0 : t.targetFps;
1110
1139
  };
1111
- let r, o, u, m, d, S, R, M, x, l, f, v = !1, p = !1, k = 0;
1112
- const C = /* @__PURE__ */ new Set(), L = /* @__PURE__ */ new Set(), U = (a) => {
1113
- const c = e.getSnapshot().cameraTexture;
1114
- c && c.dispose();
1115
- const g = ut(a);
1140
+ let r, c, d, m, u, C, x, M, F, l, f, v, p = !1, k = !1, S = 0;
1141
+ const O = /* @__PURE__ */ new Set(), z = /* @__PURE__ */ new Set(), D = (n) => {
1142
+ const o = e.getSnapshot().cameraTexture;
1143
+ o && o.dispose();
1144
+ const g = wt(n);
1116
1145
  return e.set({ cameraTexture: g }), g;
1117
- }, _ = async (a, c) => {
1118
- if (C.has(a) || e.getSnapshot().lifecycle !== "running" || !d) return;
1119
- C.add(a);
1120
- const g = k;
1146
+ }, _ = async (n, o) => {
1147
+ if (O.has(n) || e.getSnapshot().lifecycle !== "running" || !u) return;
1148
+ O.add(n);
1149
+ const g = S;
1121
1150
  try {
1122
- await c.run({
1123
- sourceCanvas: d,
1151
+ await o.run({
1152
+ sourceCanvas: u,
1124
1153
  renderWidth: e.getSnapshot().renderWidth,
1125
1154
  renderHeight: e.getSnapshot().renderHeight,
1126
1155
  getSource: () => e.getSnapshot().sourceKind,
1127
- targetFps: i(a)
1128
- }), p && (await new Promise((w) => requestAnimationFrame(() => w())), await new Promise((w) => requestAnimationFrame(() => w())), p && k === g && T.suspendAll());
1156
+ targetFps: i(n)
1157
+ }), k && (await new Promise((w) => requestAnimationFrame(() => w())), await new Promise((w) => requestAnimationFrame(() => w())), k && S === g && A.suspendAll());
1129
1158
  } catch (w) {
1130
- throw C.delete(a), w;
1159
+ throw O.delete(n), w;
1131
1160
  }
1132
- }, T = pt(e, re, (a, c) => _(a, c));
1161
+ }, A = yt(e, de, (n, o) => _(n, o));
1133
1162
  e.subscribe(() => {
1134
1163
  if (e.getSnapshot().lifecycle !== "running") return;
1135
- const a = e.getSnapshot().pipeline;
1136
- for (const [c, g] of a.entries())
1137
- C.has(c) || _(c, g);
1164
+ const n = e.getSnapshot().pipeline;
1165
+ for (const [o, g] of n.entries())
1166
+ O.has(o) || _(o, g);
1138
1167
  });
1139
- const P = () => {
1140
- if (f !== void 0 && (cancelAnimationFrame(f), f = void 0), o) {
1168
+ const B = () => {
1169
+ if (v !== void 0 && (cancelAnimationFrame(v), v = void 0), c) {
1141
1170
  try {
1142
- o.pause();
1171
+ c.pause();
1143
1172
  } catch {
1144
1173
  }
1145
1174
  try {
1146
- o.srcObject = null;
1175
+ c.srcObject = null;
1147
1176
  } catch {
1148
1177
  }
1149
- o = void 0;
1178
+ c = void 0;
1150
1179
  }
1151
- if (u) {
1180
+ if (d) {
1152
1181
  try {
1153
- u.getTracks().forEach((a) => a.stop());
1182
+ d.getTracks().forEach((n) => n.stop());
1154
1183
  } catch {
1155
1184
  }
1156
- u = void 0;
1185
+ d = void 0;
1157
1186
  }
1158
- }, G = () => {
1159
- if (v || !o || !m || !d) return;
1160
- const a = window.__xr_debugger_metrics;
1161
- if (a != null && a.trackCameraFrame && a.trackCameraFrame(), (e.getSnapshot().sourceKind ?? "webcam") === "webcam")
1162
- lt(o, m);
1187
+ }, W = () => {
1188
+ if (p || !c || !m || !u) return;
1189
+ const n = window.__xr_debugger_metrics;
1190
+ if (n != null && n.trackCameraFrame && n.trackCameraFrame(), (e.getSnapshot().sourceKind ?? "webcam") === "webcam")
1191
+ vt(c, m);
1163
1192
  else {
1164
1193
  const w = m.getContext("2d");
1165
1194
  if (!w) return;
1166
- const y = o.videoWidth, A = o.videoHeight;
1167
- m.width !== y && (m.width = y), m.height !== A && (m.height = A), w.setTransform(1, 0, 0, 1, 0, 0), w.clearRect(0, 0, y, A), w.drawImage(o, 0, 0, y, A);
1195
+ const y = c.videoWidth, R = c.videoHeight;
1196
+ m.width !== y && (m.width = y), m.height !== R && (m.height = R), w.setTransform(1, 0, 0, 1, 0, 0), w.clearRect(0, 0, y, R), w.drawImage(c, 0, 0, y, R);
1168
1197
  }
1169
- gt(m, d, (t == null ? void 0 : t.cameraZoom) ?? 1.2);
1198
+ St(m, u, (t == null ? void 0 : t.cameraZoom) ?? 1.2);
1170
1199
  const g = e.getSnapshot().cameraTexture;
1171
1200
  g && (g.needsUpdate = !0);
1172
- }, J = () => {
1173
- if (!o || !m || !d) return;
1174
- if (p) {
1175
- G();
1201
+ }, ae = () => {
1202
+ if (!c || !m || !u) return;
1203
+ if (k) {
1204
+ W();
1176
1205
  return;
1177
1206
  }
1178
- const a = () => {
1179
- f = requestAnimationFrame(a), G();
1207
+ const n = () => {
1208
+ v = requestAnimationFrame(n), W();
1180
1209
  };
1181
- f = requestAnimationFrame(a);
1182
- }, pe = async (a) => {
1183
- if (a.source === F.WEBCAM)
1210
+ v = requestAnimationFrame(n);
1211
+ }, Ce = async (n) => {
1212
+ if (n.source === T.WEBCAM)
1184
1213
  try {
1185
- const c = t != null && t.camRes && t.camRes > 0 ? t.camRes : 960;
1214
+ const o = t != null && t.camRes && t.camRes > 0 ? t.camRes : 960;
1186
1215
  return await navigator.mediaDevices.getUserMedia({
1187
1216
  video: {
1188
1217
  facingMode: "user",
1189
1218
  frameRate: { min: 24, ideal: 30, max: 60 },
1190
- width: { ideal: c }
1219
+ width: { ideal: o }
1191
1220
  }
1192
1221
  });
1193
- } catch (c) {
1194
- const g = mt(c), w = ft[g];
1195
- throw e.set({ error: { error: "PermissionError", message: w, reason: g } }), new b(c instanceof Error ? c.message : "getUserMedia failed");
1222
+ } catch (o) {
1223
+ const g = Ct(o), w = kt[g];
1224
+ throw e.set({ error: { error: "PermissionError", message: w, reason: g } }), new b(o instanceof Error ? o.message : "getUserMedia failed");
1196
1225
  }
1197
- return a.stream;
1198
- }, W = async (a) => {
1199
- const c = await pe(a);
1200
- u = c;
1201
- const g = await dt(c);
1202
- o = g, m = new OffscreenCanvas(g.videoWidth, g.videoHeight);
1203
- const { renderWidth: w, renderHeight: y } = e.getSnapshot(), A = Ct({
1226
+ return n.stream;
1227
+ }, X = async (n) => {
1228
+ const o = await Ce(n);
1229
+ d = o;
1230
+ const g = await pt(o);
1231
+ c = g, m = new OffscreenCanvas(g.videoWidth, g.videoHeight);
1232
+ const { renderWidth: w, renderHeight: y } = e.getSnapshot(), R = Rt({
1204
1233
  renderWidth: w,
1205
1234
  renderHeight: y,
1206
1235
  videoWidth: g.videoWidth,
1207
1236
  videoHeight: g.videoHeight
1208
1237
  });
1209
- d ? (d.width !== A.width || d.height !== A.height) && (d.width = A.width, d.height = A.height, U(d)) : (d = new OffscreenCanvas(A.width, A.height), U(d));
1210
- const ne = a.source === F.STREAM ? a.static === !0 : !1;
1211
- p = ne, r = a.source === F.WEBCAM ? { source: F.WEBCAM, sourceKind: "webcam" } : {
1212
- source: F.STREAM,
1213
- stream: a.stream,
1214
- static: ne,
1215
- sourceKind: a.sourceKind ?? "webcam"
1238
+ u ? (u.width !== R.width || u.height !== R.height) && (u.width = R.width, u.height = R.height, D(u)) : (u = new OffscreenCanvas(R.width, R.height), D(u));
1239
+ const oe = n.source === T.STREAM ? n.static === !0 : !1;
1240
+ k = oe, r = n.source === T.WEBCAM ? { source: T.WEBCAM, sourceKind: "webcam" } : {
1241
+ source: T.STREAM,
1242
+ stream: n.stream,
1243
+ static: oe,
1244
+ sourceKind: n.sourceKind ?? "webcam"
1216
1245
  }, e.set({
1217
- source: a.source,
1246
+ source: n.source,
1218
1247
  sourceKind: r.sourceKind,
1219
1248
  error: void 0
1220
1249
  });
1221
- }, X = async (a) => {
1222
- const c = a.sourceKind ?? "webcam";
1223
- d = a.canvas;
1224
- const g = U(d);
1250
+ }, j = async (n) => {
1251
+ const o = n.sourceKind ?? "webcam";
1252
+ u = n.canvas;
1253
+ const g = D(u);
1225
1254
  e.set({
1226
1255
  cameraTexture: g,
1227
- source: F.CANVAS,
1228
- sourceKind: c,
1229
- renderWidth: d.width,
1230
- renderHeight: d.height,
1256
+ source: T.CANVAS,
1257
+ sourceKind: o,
1258
+ renderWidth: u.width,
1259
+ renderHeight: u.height,
1231
1260
  error: void 0
1232
1261
  }), r = {
1233
- source: F.CANVAS,
1234
- canvas: a.canvas,
1235
- sourceKind: c
1262
+ source: T.CANVAS,
1263
+ canvas: n.canvas,
1264
+ sourceKind: o
1236
1265
  };
1237
- }, we = (a, c) => !c || a.source !== c.source ? !1 : a.source === F.STREAM && c.source === F.STREAM ? a.stream === c.stream && (a.sourceKind ?? "webcam") === c.sourceKind : !0, ve = async () => {
1238
- if (!d) return;
1239
- const a = k, c = e.getSnapshot().pipeline;
1240
- for (const [, g] of c.entries())
1266
+ }, ke = (n, o) => !o || n.source !== o.source ? !1 : n.source === T.STREAM && o.source === T.STREAM ? n.stream === o.stream && (n.sourceKind ?? "webcam") === o.sourceKind : !0, ye = async () => {
1267
+ if (!u) return;
1268
+ const n = S, o = e.getSnapshot().pipeline;
1269
+ for (const [, g] of o.entries())
1241
1270
  g.resume();
1242
- await new Promise((g) => requestAnimationFrame(() => g())), await new Promise((g) => requestAnimationFrame(() => g())), p && k === a && T.suspendAll();
1243
- }, Ce = (a, c) => !c || c.source !== F.CANVAS ? !1 : a.canvas === c.canvas && (a.sourceKind ?? "webcam") === c.sourceKind, Se = async (a) => {
1244
- const c = a.source;
1245
- if (c !== F.WEBCAM && c !== F.STREAM)
1246
- throw new b(`Invalid media source: ${String(c)}`);
1247
- if (we(a, r)) {
1271
+ await new Promise((g) => requestAnimationFrame(() => g())), await new Promise((g) => requestAnimationFrame(() => g())), k && S === n && A.suspendAll();
1272
+ }, Me = (n, o) => !o || o.source !== T.CANVAS ? !1 : n.canvas === o.canvas && (n.sourceKind ?? "webcam") === o.sourceKind, Te = async (n) => {
1273
+ const o = n.source;
1274
+ if (o !== T.WEBCAM && o !== T.STREAM)
1275
+ throw new b(`Invalid media source: ${String(o)}`);
1276
+ if (ke(n, r)) {
1248
1277
  s.log("Media source unchanged, skipping rebind.");
1249
1278
  return;
1250
1279
  }
1251
- k += 1;
1280
+ S += 1;
1252
1281
  const { lifecycle: g } = e.getSnapshot();
1253
1282
  if (g === "idle" || g === "stopped") {
1254
- await W(a), e.set({ lifecycle: "media-bound" }), s.log("Media source set to:", a.source);
1283
+ await X(n), e.set({ lifecycle: "media-bound" }), s.log("Media source set to:", n.source);
1255
1284
  return;
1256
1285
  }
1257
1286
  if (g === "media-bound") {
1258
- P(), await W(a), s.log("Media source rebound to:", a.source);
1287
+ B(), await X(n), s.log("Media source rebound to:", n.source);
1259
1288
  return;
1260
1289
  }
1261
- v = !0, await new Promise((w) => requestAnimationFrame(() => w())), P(), await W(a), v = !1, J(), p ? await ve() : T.resumeActive(), s.log("Media source swapped to:", a.source);
1262
- }, ke = async (a) => {
1263
- if (Ce(a, r)) {
1290
+ p = !0, await new Promise((w) => requestAnimationFrame(() => w())), B(), await X(n), p = !1, ae(), k ? await ye() : A.resumeActive(), s.log("Media source swapped to:", n.source);
1291
+ }, Re = async (n) => {
1292
+ if (Me(n, r)) {
1264
1293
  s.log("Frame source unchanged, skipping rebind.");
1265
1294
  return;
1266
1295
  }
1267
- k += 1;
1268
- const { lifecycle: c } = e.getSnapshot();
1269
- if (c === "idle" || c === "stopped") {
1270
- await X(a), e.set({ lifecycle: "media-bound" }), s.log("Frame source set to canvas.");
1296
+ S += 1;
1297
+ const { lifecycle: o } = e.getSnapshot();
1298
+ if (o === "idle" || o === "stopped") {
1299
+ await j(n), e.set({ lifecycle: "media-bound" }), s.log("Frame source set to canvas.");
1271
1300
  return;
1272
1301
  }
1273
- if (c === "media-bound") {
1274
- P(), await X(a), s.log("Frame source rebound to canvas.");
1302
+ if (o === "media-bound") {
1303
+ B(), await j(n), s.log("Frame source rebound to canvas.");
1275
1304
  return;
1276
1305
  }
1277
- v = !0, await new Promise((g) => requestAnimationFrame(() => g())), P(), await X(a), v = !1, s.log("Frame source swapped to canvas.");
1278
- }, ye = async () => {
1279
- const { lifecycle: a } = e.getSnapshot();
1280
- if (a === "running") return;
1281
- if (a === "idle")
1306
+ p = !0, await new Promise((g) => requestAnimationFrame(() => g())), B(), await j(n), p = !1, s.log("Frame source swapped to canvas.");
1307
+ }, xe = async () => {
1308
+ const { lifecycle: n } = e.getSnapshot();
1309
+ if (n === "running") return;
1310
+ if (n === "idle")
1282
1311
  throw new b("session.start() called before setMediaSource — call setMediaSource first");
1283
- if (!d)
1312
+ if (!u)
1284
1313
  throw new b("session.start(): media source not bound");
1285
- const c = (r == null ? void 0 : r.source) === F.CANVAS;
1286
- if (!c && (!o || !m))
1287
- throw a === "stopped" ? new b(
1314
+ const o = (r == null ? void 0 : r.source) === T.CANVAS;
1315
+ if (!o && (!c || !m))
1316
+ throw n === "stopped" ? new b(
1288
1317
  "session.start() called from stopped state without a media source — call setMediaSource first"
1289
1318
  ) : new b("session.start(): media source not bound");
1290
- c || J(), T.resumeActive(), e.set({ lifecycle: "running" }), await new Promise((w) => requestAnimationFrame(() => w()));
1319
+ o || ae(), A.resumeActive(), e.set({ lifecycle: "running" }), await new Promise((w) => requestAnimationFrame(() => w()));
1291
1320
  const g = e.getSnapshot().pipeline;
1292
1321
  for (const [w, y] of g.entries())
1293
1322
  await _(w, y);
1294
1323
  e.set({ ready: !0 }), s.log("XR session started.");
1295
- }, ee = async () => {
1296
- const { lifecycle: a } = e.getSnapshot();
1297
- a === "stopped" || a === "idle" || (P(), T.suspendAll(), e.set({ lifecycle: "stopped", ready: !1 }), s.log("XR session stopped."));
1298
- }, Me = async () => {
1299
- await ee(), T.releaseAll(), L.clear();
1300
- const a = e.getSnapshot().cameraTexture;
1301
- a && a.dispose(), C.clear(), r = void 0, k += 1, d = void 0, m = void 0, p = !1, e.set({
1324
+ }, ne = async () => {
1325
+ const { lifecycle: n } = e.getSnapshot();
1326
+ n === "stopped" || n === "idle" || (B(), A.suspendAll(), e.set({ lifecycle: "stopped", ready: !1 }), s.log("XR session stopped."));
1327
+ }, Fe = async () => {
1328
+ await ne(), A.releaseAll(), z.clear();
1329
+ const n = e.getSnapshot().cameraTexture;
1330
+ n && n.dispose(), O.clear(), r = void 0, S += 1, u = void 0, m = void 0, x = void 0, k = !1, e.set({
1302
1331
  lifecycle: "idle",
1303
1332
  cameraTexture: void 0,
1304
1333
  source: void 0
1305
1334
  }), s.log("XR session reset.");
1306
- }, Re = async (a) => {
1307
- const c = "legacy:registerXRPipeline", g = [];
1335
+ }, Ae = async (n) => {
1336
+ const o = "legacy:registerXRPipeline", g = [];
1308
1337
  await Promise.all(
1309
- a.map(async (w) => {
1338
+ n.map(async (w) => {
1310
1339
  const { model: y } = w;
1311
- if (!re[y])
1340
+ if (!de[y])
1312
1341
  throw new b(`Invalid model: ${y}`);
1313
- L.has(y) || g.push(y);
1314
- const A = "options" in w ? w.options : void 0;
1315
- await T.acquire(y, c, A);
1342
+ z.has(y) || g.push(y);
1343
+ const R = "options" in w ? w.options : void 0;
1344
+ await A.acquire(y, o, R);
1316
1345
  })
1317
- ), g.length > 0 && (g.forEach((w) => L.add(w)), s.log("XR pipeline registered."));
1318
- }, Te = (a) => {
1319
- const c = T.get(a);
1320
- if (!c)
1321
- throw new b(`Model ${a} is not registered in the pipeline`);
1322
- return c.getModelNode();
1323
- }, te = async (a, c) => {
1324
- a <= 0 || c <= 0 || (e.set({ renderWidth: a, renderHeight: c }), d && (d.width !== a || d.height !== c) && (d.width = a, d.height = c, U(d), p && G()), s.log(`Source canvas set. Render size: ${a}x${c}`));
1325
- }, xe = async (a) => {
1346
+ ), g.length > 0 && (g.forEach((w) => z.add(w)), s.log("XR pipeline registered."));
1347
+ }, be = (n) => {
1348
+ const o = A.get(n);
1349
+ if (!o)
1350
+ throw new b(`Model ${n} is not registered in the pipeline`);
1351
+ return o.getModelNode();
1352
+ }, ie = async (n, o) => {
1353
+ n <= 0 || o <= 0 || (e.set({ renderWidth: n, renderHeight: o }), u && (u.width !== n || u.height !== o) && (u.width = n, u.height = o, D(u), k && W()), s.log(`Source canvas set. Render size: ${n}x${o}`));
1354
+ }, Ee = async (n) => {
1326
1355
  var y;
1327
- S = a;
1328
- const c = (y = a.getBoundingClientRect) == null ? void 0 : y.call(a), g = c && c.width > 0 ? Math.round(c.width) : a.clientWidth, w = c && c.height > 0 ? Math.round(c.height) : a.clientHeight;
1329
- await te(g, w);
1330
- }, Fe = (a) => {
1331
- R = a.renderer, M = a.scene, x = a.camera, l = a.renderFrame;
1332
- }, se = () => {
1333
- if (!R || !M || !x)
1356
+ C = n;
1357
+ const o = (y = n.getBoundingClientRect) == null ? void 0 : y.call(n), g = o && o.width > 0 ? Math.round(o.width) : n.clientWidth, w = o && o.height > 0 ? Math.round(o.height) : n.clientHeight;
1358
+ await ie(g, w);
1359
+ }, Ie = (n) => {
1360
+ x = n;
1361
+ }, Y = () => C && M && F && l ? C : x, Pe = (n) => {
1362
+ M = n.renderer, F = n.scene, l = n.camera, f = n.renderFrame;
1363
+ }, re = () => {
1364
+ if (!M || !F || !l)
1334
1365
  throw new b(
1335
1366
  "XR frame render requested before the R3F state was bound — make sure <XRScene> is mounted"
1336
1367
  );
1337
- l ? l() : R.render(M, x);
1368
+ f ? f() : M.render(F, l);
1338
1369
  };
1339
1370
  return {
1340
1371
  store: e,
1341
- registry: T,
1342
- setMediaSource: Se,
1343
- start: ye,
1344
- stop: ee,
1345
- reset: Me,
1346
- setFrameSource: ke,
1347
- registerXRPipeline: Re,
1348
- getModelNode: Te,
1372
+ registry: A,
1373
+ setMediaSource: Te,
1374
+ start: xe,
1375
+ stop: ne,
1376
+ reset: Fe,
1377
+ setFrameSource: Re,
1378
+ registerXRPipeline: Ae,
1379
+ getModelNode: be,
1349
1380
  captureFrame: () => {
1350
- if (!S)
1351
- throw new b(
1352
- "session.captureFrame() called before the XRScene render target was bound — make sure <XRScene> is mounted"
1353
- );
1354
- if (!R || !M || !x)
1381
+ const n = C;
1382
+ if (n && Y() === n)
1383
+ return re(), n.toDataURL("image/png");
1384
+ const o = Y();
1385
+ if (o) return o.toDataURL("image/png");
1386
+ throw new b(
1387
+ "session.captureFrame() called before an XRScene or XRMediaSurface capture target was bound"
1388
+ );
1389
+ },
1390
+ captureStream: (n = 30) => {
1391
+ const o = Y();
1392
+ if (!(o != null && o.captureStream))
1355
1393
  throw new b(
1356
- "session.captureFrame() called before the R3F state was bound — make sure <XRScene> is mounted"
1394
+ "session.captureStream() called before an XRScene or XRMediaSurface capture target was bound"
1357
1395
  );
1358
- return se(), S.toDataURL("image/png");
1396
+ return o.captureStream(n);
1359
1397
  },
1360
- getInputFrame: () => d ?? null,
1361
- _setRenderTarget: xe,
1362
- _setRenderSize: te,
1363
- _setR3FState: Fe,
1364
- _renderFrame: se,
1365
- _getVideoElement: () => o,
1366
- _setPerf: (a) => {
1367
- if (t = a, e.getSnapshot().lifecycle !== "running" || !d) return;
1368
- const c = e.getSnapshot().pipeline;
1369
- for (const [g, w] of c.entries())
1398
+ getInputFrame: () => u ?? null,
1399
+ _setRenderTarget: Ee,
1400
+ _setCaptureTarget: Ie,
1401
+ _setRenderSize: ie,
1402
+ _setR3FState: Pe,
1403
+ _renderFrame: re,
1404
+ _getVideoElement: () => c,
1405
+ _setPerf: (n) => {
1406
+ if (t = n, e.getSnapshot().lifecycle !== "running" || !u) return;
1407
+ const o = e.getSnapshot().pipeline;
1408
+ for (const [g, w] of o.entries())
1370
1409
  w.run({
1371
- sourceCanvas: d,
1410
+ sourceCanvas: u,
1372
1411
  renderWidth: e.getSnapshot().renderWidth,
1373
1412
  renderHeight: e.getSnapshot().renderHeight,
1374
1413
  getSource: () => e.getSnapshot().sourceKind,
@@ -1376,46 +1415,48 @@ const re = {
1376
1415
  });
1377
1416
  }
1378
1417
  };
1379
- }, kt = (n) => {
1380
- const s = oe(n), e = $(() => St(s.current), []), t = JSON.stringify(n ?? {});
1381
- return Ee(() => {
1382
- e._setPerf(n);
1418
+ }, Ft = (a) => {
1419
+ const s = ue(a), e = ee(() => xt(s.current), []), t = JSON.stringify(a ?? {});
1420
+ return Oe(() => {
1421
+ e._setPerf(a);
1383
1422
  }, [e, t]), e;
1384
- }, Q = /* @__PURE__ */ new Map(), yt = () => ({
1385
- register: (n, s) => {
1386
- s ? Q.set(n, s) : Q.delete(n);
1423
+ }, J = /* @__PURE__ */ new Map(), At = () => ({
1424
+ register: (a, s) => {
1425
+ s ? J.set(a, s) : J.delete(a);
1387
1426
  },
1388
- resolve: (n) => n ? Q.get(n) ?? null : null
1389
- }), le = yt(), ge = he(null), Mt = ({ children: n }) => {
1390
- const s = oe(/* @__PURE__ */ new Map()), e = ie((r, o) => {
1391
- o ? s.current.set(r, o) : s.current.delete(r);
1392
- }, []), t = ie(
1427
+ resolve: (a) => a ? J.get(a) ?? null : null
1428
+ }), pe = At(), we = ge(null), bt = ({ children: a }) => {
1429
+ const s = ue(/* @__PURE__ */ new Map()), e = he((r, c) => {
1430
+ c ? s.current.set(r, c) : s.current.delete(r);
1431
+ }, []), t = he(
1393
1432
  (r) => r ? s.current.get(r) ?? null : null,
1394
1433
  []
1395
- ), i = $(() => ({ register: e, resolve: t }), [e, t]);
1396
- return Ie(ge.Provider, { value: i }, n);
1397
- }, me = () => ce(ge) ?? le, Pt = () => me().register, Ot = () => me().resolve;
1398
- le.register;
1399
- const fe = he(void 0), Ut = () => {
1400
- const n = ce(fe);
1401
- if (!n)
1434
+ ), i = ee(() => ({ register: e, resolve: t }), [e, t]);
1435
+ return Ue(we.Provider, { value: i }, a);
1436
+ }, ve = () => le(we) ?? pe, Nt = () => ve().register, Ht = () => ve().resolve;
1437
+ pe.register;
1438
+ const Se = ge(void 0), qt = () => {
1439
+ const a = le(Se);
1440
+ if (!a)
1402
1441
  throw new b(
1403
1442
  "XR context can only be used inside XRProvider, did you forget to wrap your app in <XRProvider>?"
1404
1443
  );
1405
- return n;
1406
- }, zt = ({ children: n, perf: s }) => {
1407
- const e = kt(s), t = $(() => ({ session: e }), [e]);
1408
- return /* @__PURE__ */ ae(fe.Provider, { value: t, children: /* @__PURE__ */ ae(Mt, { children: n }) });
1444
+ return a;
1445
+ }, Gt = ({ children: a, perf: s }) => {
1446
+ const e = Ft(s), t = ee(() => ({ session: e }), [e]);
1447
+ return /* @__PURE__ */ ce(Se.Provider, { value: t, children: /* @__PURE__ */ ce(bt, { children: a }) });
1409
1448
  };
1410
1449
  export {
1411
- z as X,
1412
- H as a,
1413
- _t as b,
1414
- F as c,
1415
- zt as d,
1416
- Ot as e,
1417
- He as f,
1418
- Pt as g,
1450
+ U as X,
1451
+ q as a,
1452
+ Kt as b,
1453
+ T as c,
1454
+ Gt as d,
1455
+ Ht as e,
1456
+ je as f,
1457
+ Nt as g,
1419
1458
  I as l,
1420
- Ut as u
1459
+ te as n,
1460
+ Vt as t,
1461
+ qt as u
1421
1462
  };