@vincentt-xr/sdk 2.0.0-alpha.5 → 2.0.0-alpha.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/GROUNDING.md +92 -7
- package/dist/{DebuggerUI-bnGHSSOb.cjs → DebuggerUI-B6bP6P9r.cjs} +1 -1
- package/dist/{DebuggerUI-DhKTXTY2.js → DebuggerUI-BjOMr8q_.js} +1 -1
- package/dist/FaceMeshRenderer-C5l6VLdO.cjs +155 -0
- package/dist/FaceMeshRenderer-wjAHrJzP.js +1270 -0
- package/dist/{FaceRetouch-TZeBGIqW.cjs → FaceRetouch-BkJzoA79.cjs} +1 -1
- package/dist/{FaceRetouch-Bg-OBU4n.js → FaceRetouch-DwbKQJAN.js} +30 -30
- package/dist/components/FaceMesh/FaceMeshRenderer.d.ts +11 -3
- package/dist/components/FaceMesh/canonical/CanonicalFaceMeshRenderer.d.ts +17 -1
- package/dist/components/FaceMesh/canonical/geometryGroups.d.ts +1 -1
- package/dist/components/FaceMesh/canonical/parseCanonicalFaceModel.d.ts +1 -0
- package/dist/components/FaceMesh/index.d.ts +2 -2
- package/dist/components/LipEffect/LipEffect.d.ts +2 -0
- package/dist/components/LipEffect/LipEffectMaterial.d.ts +10 -0
- package/dist/components/LipEffect/defaults.d.ts +9 -0
- package/dist/components/LipEffect/index.d.ts +4 -0
- package/dist/components/LipEffect/types.d.ts +22 -0
- package/dist/components/SceneObjectRenderer/index.d.ts +9 -2
- package/dist/components/XRMediaSurface/index.d.ts +2 -1
- package/dist/{contexts-B2_NsTnk.js → contexts-ByhzppYl.js} +6 -3
- package/dist/contexts-Dr62It_K.cjs +1 -0
- package/dist/debug-ui/media-source.cjs +1 -1
- package/dist/debug-ui/media-source.js +1 -1
- package/dist/debug-ui.cjs +1 -1
- package/dist/debug-ui.js +10 -10
- package/dist/entries/core.d.ts +3 -2
- package/dist/entries/face-effects.d.ts +4 -2
- package/dist/entries/tracking.d.ts +2 -0
- package/dist/face-effects.cjs +1 -1
- package/dist/face-effects.js +622 -508
- package/dist/{getFaceInfo-4DhcPZDJ.js → getFaceInfo-C4QpCQIY.js} +1 -1
- package/dist/{getFaceInfo-QOQ_dc-W.cjs → getFaceInfo-fA1bFBub.cjs} +1 -1
- package/dist/hooks/useXRSession/facade.d.ts +2 -0
- package/dist/{index-BMeBJ0dV.js → index-9dlAQAhy.js} +457 -416
- package/dist/{index-C9yQVzAh.cjs → index-BjmTe9eM.cjs} +1 -1
- package/dist/{index-WPPnlFO1.cjs → index-BpEf2BBb.cjs} +1 -1
- package/dist/{index-D1kj6uc-.js → index-ByoNj0QP.js} +1 -1
- package/dist/{index-ZaDEzDtR.cjs → index-CyUUurQT.cjs} +1 -1
- package/dist/index-DCiMbxC3.cjs +1 -0
- package/dist/{index-Cj3fGDtZ.js → index-DXT3WccE.js} +808 -787
- package/dist/index-DpI-qo5X.cjs +17 -0
- package/dist/{index-g250Tqme.js → index-DyVF4vEW.js} +1 -1
- package/dist/{index-72Wb15Ca.js → index-VJ0SJwmG.js} +1 -1
- package/dist/{internal-Dtvo4WYo.cjs → internal-Cq-TEQ5Y.cjs} +1 -1
- package/dist/{internal-34pb7djs.js → internal-Dmk1cTXq.js} +3 -3
- package/dist/internal.cjs +1 -1
- package/dist/internal.js +1 -1
- package/dist/low-level.cjs +1 -1
- package/dist/low-level.js +344 -330
- package/dist/main.cjs +1 -1
- package/dist/main.js +94 -91
- package/dist/{renderGroups-jSUOY1Oq.cjs → renderGroups-80H3DpTl.cjs} +1 -1
- package/dist/{renderGroups-CPWUX6z9.js → renderGroups-KZk6eRiY.js} +1 -1
- package/dist/{renderPasses-KUJUSevp.cjs → renderPasses-BOoBSr8z.cjs} +1 -1
- package/dist/{renderPasses-CLlYRdMk.js → renderPasses-BcquyVtu.js} +4 -4
- package/dist/scene-object.cjs +1 -1
- package/dist/scene-object.js +2 -2
- package/dist/screen2d/coordinates.d.ts +20 -0
- package/dist/{selectors-DLxL8Q66.js → selectors-B8H97CKA.js} +1 -1
- package/dist/{selectors-S8g25ke9.cjs → selectors-CZLKT2Iv.cjs} +1 -1
- package/dist/{session-DP8AF7Rg.cjs → session-CpkiK5YA.cjs} +1 -1
- package/dist/{session-CbtvwiaD.js → session-DLFN_VII.js} +1 -1
- package/dist/tracking/coordinates.d.ts +5 -0
- package/dist/tracking.cjs +1 -1
- package/dist/tracking.js +69 -66
- package/dist/types/common.d.ts +11 -1
- package/dist/types/gesture-tracking.d.ts +2 -2
- package/dist/types/hand-tracking.d.ts +3 -3
- package/dist/types/nodes.d.ts +2 -2
- package/dist/types/session.d.ts +7 -1
- package/dist/{useFaceInfo-BvZeUBsL.cjs → useFaceInfo-BJ8-_MOs.cjs} +1 -1
- package/dist/{useFaceInfo-C06EyScd.js → useFaceInfo-Dk426LTu.js} +3 -3
- package/dist/{useFaceResults-C1Ppc8rS.js → useFaceResults-CtetsO9M.js} +1 -1
- package/dist/{useFaceResults-CCNiH7VZ.cjs → useFaceResults-wBJF3zyp.cjs} +1 -1
- package/dist/utils/visionWasm.d.ts +18 -0
- package/docs/SDK_DOCUMENTATION.md +3 -0
- package/docs/api/capture-recording.mdx +9 -1
- package/docs/api/face-mesh.mdx +33 -0
- package/docs/api/runtime-3d.mdx +5 -0
- package/docs/api/screen-image.mdx +3 -1
- package/docs/api/screen-space-coordinates.mdx +31 -0
- package/docs/api/trackers.mdx +13 -0
- package/package.json +4 -1
- package/dist/FaceMeshRenderer-B2i2NW71.js +0 -1195
- package/dist/FaceMeshRenderer-BSOq1OnG.cjs +0 -155
- package/dist/contexts-BgWfyxre.cjs +0 -1
- package/dist/index-CNGzE49z.cjs +0 -17
- package/dist/index-Da7uycur.cjs +0 -1
|
@@ -1,19 +1,19 @@
|
|
|
1
|
-
var
|
|
2
|
-
var
|
|
3
|
-
var h = (
|
|
4
|
-
import { jsx as
|
|
5
|
-
import { useRef as
|
|
6
|
-
import { FilesetResolver as V, PoseLandmarker as
|
|
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
|
|
9
|
-
var
|
|
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
|
|
16
|
-
apiBaseUrl:
|
|
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
|
|
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
|
|
45
|
-
|
|
46
|
-
const r = -t.position.z /
|
|
47
|
-
return i.copy(t.position).addScaledVector(
|
|
48
|
-
},
|
|
49
|
-
class
|
|
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)),
|
|
63
|
-
(!this.canvas || this.canvas.width !== r || this.canvas.height !==
|
|
64
|
-
const
|
|
65
|
-
return
|
|
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
|
|
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
|
|
82
|
-
const s = await fetch(
|
|
81
|
+
async function je(a) {
|
|
82
|
+
const s = await fetch(a);
|
|
83
83
|
if (!s.ok)
|
|
84
|
-
throw new Error(`fetchAndVerify: ${s.status} ${
|
|
85
|
-
const e = await s.arrayBuffer(), t =
|
|
84
|
+
throw new Error(`fetchAndVerify: ${s.status} ${a}`);
|
|
85
|
+
const e = await s.arrayBuffer(), t = Qe(a);
|
|
86
86
|
if (!t) {
|
|
87
|
-
if (
|
|
88
|
-
throw new Error(`[xr-sdk integrity] no SRI hash for SDK asset ${
|
|
89
|
-
return console.warn(`[xr-sdk integrity] no SRI hash for ${
|
|
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
|
|
91
|
+
const i = await $e(e);
|
|
92
92
|
if (i !== t)
|
|
93
93
|
throw new Error(
|
|
94
|
-
`[xr-sdk integrity] SRI mismatch for ${
|
|
94
|
+
`[xr-sdk integrity] SRI mismatch for ${a}: expected ${t}, got ${i}`
|
|
95
95
|
);
|
|
96
96
|
return e;
|
|
97
97
|
}
|
|
98
|
-
function
|
|
98
|
+
function Ye(a) {
|
|
99
99
|
try {
|
|
100
|
-
return new URL(
|
|
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(
|
|
106
|
-
const s = await
|
|
105
|
+
async function K(a) {
|
|
106
|
+
const s = await je(a);
|
|
107
107
|
return new Uint8Array(s);
|
|
108
108
|
}
|
|
109
|
-
function
|
|
109
|
+
function Qe(a) {
|
|
110
110
|
try {
|
|
111
|
-
const s = new URL(
|
|
112
|
-
return
|
|
111
|
+
const s = new URL(a);
|
|
112
|
+
return Xe[s.pathname];
|
|
113
113
|
} catch {
|
|
114
114
|
return;
|
|
115
115
|
}
|
|
116
116
|
}
|
|
117
|
-
async function
|
|
118
|
-
const s = await crypto.subtle.digest("SHA-384",
|
|
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
|
-
|
|
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
|
|
187
|
-
class
|
|
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
|
|
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
|
|
202
|
-
if (
|
|
203
|
-
return
|
|
204
|
-
u
|
|
205
|
-
|
|
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:
|
|
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
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
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
|
|
269
|
-
class
|
|
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
|
|
325
|
-
this.rotMatrixScratch.fromArray(
|
|
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"),
|
|
331
|
-
this.landmarkForSource(
|
|
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
|
-
|
|
334
|
-
),
|
|
335
|
-
this.landmarkForSource(
|
|
353
|
+
c.transform.position
|
|
354
|
+
), q(
|
|
355
|
+
this.landmarkForSource(u[50], m),
|
|
336
356
|
this.cameras[r],
|
|
337
357
|
this.leftCheekScratch[r]
|
|
338
|
-
),
|
|
339
|
-
this.landmarkForSource(
|
|
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]) *
|
|
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
|
-
|
|
348
|
-
const p =
|
|
349
|
-
for (const
|
|
350
|
-
p[
|
|
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 =
|
|
361
|
-
(!this.analysisCanvas || this.analysisCanvas.width !==
|
|
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,
|
|
368
|
-
const
|
|
369
|
-
this.processingTime =
|
|
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,
|
|
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: (
|
|
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
|
|
404
|
-
|
|
405
|
-
|
|
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
|
|
450
|
-
var
|
|
451
|
-
const
|
|
452
|
-
Closed_Fist:
|
|
453
|
-
Open_Palm:
|
|
454
|
-
Pointing_Up:
|
|
455
|
-
Thumb_Down:
|
|
456
|
-
Thumb_Up:
|
|
457
|
-
Victory:
|
|
458
|
-
ILoveYou:
|
|
459
|
-
None:
|
|
460
|
-
},
|
|
461
|
-
class
|
|
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
|
|
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
|
|
477
|
-
if (
|
|
499
|
+
const c = i.landmarks[0], d = [];
|
|
500
|
+
if (c) {
|
|
478
501
|
const m = i.gestures[0][0].categoryName;
|
|
479
|
-
return
|
|
480
|
-
|
|
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:
|
|
487
|
-
gesture:
|
|
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
|
|
518
|
-
|
|
519
|
-
|
|
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 ??
|
|
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
|
|
551
|
-
class
|
|
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
|
|
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
|
|
569
|
-
if (i.landmarks.forEach((
|
|
593
|
+
const c = [], d = i.handedness ?? i.handednesses ?? [];
|
|
594
|
+
if (i.landmarks.forEach((u, C) => {
|
|
570
595
|
var f, v, p;
|
|
571
|
-
if (!
|
|
596
|
+
if (!u || u.length === 0)
|
|
572
597
|
return;
|
|
573
|
-
const
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
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 =
|
|
609
|
+
const m = c[0];
|
|
587
610
|
return {
|
|
588
|
-
hands:
|
|
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
|
|
620
|
-
|
|
621
|
-
|
|
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
|
|
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
|
|
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,
|
|
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
|
|
772
|
-
if (i.clearRect(0, 0,
|
|
773
|
-
const { width:
|
|
774
|
-
i.drawImage(this.inputSource, (
|
|
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,
|
|
802
|
+
i.drawImage(e, 0, 0, d, m);
|
|
777
803
|
}
|
|
778
|
-
const
|
|
804
|
+
const c = this.segmenter.segmentForVideo(
|
|
779
805
|
this.processCanvas,
|
|
780
806
|
performance.now()
|
|
781
807
|
).categoryMask;
|
|
782
|
-
if (!
|
|
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(
|
|
814
|
+
this.drawingUtils.drawCategoryMask(c, mt), this.latestMask = c.clone(), c.close(), this.blitGlToMask();
|
|
789
815
|
else {
|
|
790
|
-
this.latestMask =
|
|
791
|
-
const
|
|
792
|
-
|
|
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 =
|
|
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
|
|
818
|
-
for (let
|
|
819
|
-
const m = t[
|
|
820
|
-
|
|
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),
|
|
834
|
-
|
|
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
|
|
864
|
-
|
|
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
|
|
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
|
|
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
|
|
916
|
+
var d;
|
|
888
917
|
if (!e)
|
|
889
918
|
return;
|
|
890
|
-
this.setTargetFps(r ??
|
|
891
|
-
const
|
|
892
|
-
this.sourceCanvas = e, this.processCanvas = document.createElement("canvas"), this.processCanvas.width = e.width *
|
|
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
|
|
928
|
-
[
|
|
929
|
-
[
|
|
930
|
-
[
|
|
931
|
-
[
|
|
932
|
-
[
|
|
933
|
-
},
|
|
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 =
|
|
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
|
-
},
|
|
948
|
-
const s = new
|
|
949
|
-
return s.colorSpace =
|
|
950
|
-
},
|
|
951
|
-
const e =
|
|
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(
|
|
957
|
-
},
|
|
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 =
|
|
961
|
-
let
|
|
962
|
-
r > i ? (
|
|
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
|
-
|
|
965
|
-
const
|
|
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
|
-
|
|
996
|
+
a,
|
|
968
997
|
0,
|
|
969
998
|
0,
|
|
970
|
-
|
|
971
|
-
|
|
972
|
-
|
|
973
|
-
|
|
974
|
-
|
|
975
|
-
|
|
999
|
+
a.width,
|
|
1000
|
+
a.height,
|
|
1001
|
+
u,
|
|
1002
|
+
C,
|
|
1003
|
+
c,
|
|
1004
|
+
d
|
|
976
1005
|
);
|
|
977
|
-
},
|
|
978
|
-
switch (
|
|
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
|
|
1021
|
+
return a instanceof TypeError ? "unsupported" : "unknown";
|
|
993
1022
|
}
|
|
994
|
-
},
|
|
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
|
-
},
|
|
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
|
|
1019
|
-
await
|
|
1020
|
-
const
|
|
1021
|
-
if (!
|
|
1022
|
-
return r(l,
|
|
1023
|
-
e && await e(l,
|
|
1024
|
-
const
|
|
1025
|
-
return
|
|
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:
|
|
1028
|
-
t.get(l) === p && (t.delete(l),
|
|
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),
|
|
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
|
|
1039
|
-
k !==
|
|
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
|
-
|
|
1088
|
+
a.setPipeline((l) => l.clear());
|
|
1060
1089
|
} };
|
|
1061
|
-
},
|
|
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
|
-
},
|
|
1072
|
-
let
|
|
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: () =>
|
|
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] !==
|
|
1110
|
+
if (t[r] !== a[r]) {
|
|
1082
1111
|
i = !0;
|
|
1083
1112
|
break;
|
|
1084
1113
|
}
|
|
1085
|
-
i && (
|
|
1114
|
+
i && (a = { ...a, ...t }, e());
|
|
1086
1115
|
},
|
|
1087
1116
|
setPipeline: (t) => {
|
|
1088
|
-
const i = new Map(
|
|
1089
|
-
return t(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
|
-
},
|
|
1096
|
-
renderHeight:
|
|
1124
|
+
}, Rt = ({
|
|
1125
|
+
renderHeight: a,
|
|
1097
1126
|
renderWidth: s,
|
|
1098
1127
|
videoHeight: e,
|
|
1099
1128
|
videoWidth: t
|
|
1100
1129
|
}) => ({
|
|
1101
|
-
height:
|
|
1130
|
+
height: a || e,
|
|
1102
1131
|
width: s || t
|
|
1103
|
-
}),
|
|
1104
|
-
const s = new
|
|
1105
|
-
let t =
|
|
1106
|
-
const i = (
|
|
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
|
|
1109
|
-
return typeof
|
|
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,
|
|
1112
|
-
const
|
|
1113
|
-
const
|
|
1114
|
-
|
|
1115
|
-
const g =
|
|
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 (
|
|
1118
|
-
if (
|
|
1119
|
-
|
|
1120
|
-
const g =
|
|
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
|
|
1123
|
-
sourceCanvas:
|
|
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(
|
|
1128
|
-
}),
|
|
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
|
|
1159
|
+
throw O.delete(n), w;
|
|
1131
1160
|
}
|
|
1132
|
-
},
|
|
1161
|
+
}, A = yt(e, de, (n, o) => _(n, o));
|
|
1133
1162
|
e.subscribe(() => {
|
|
1134
1163
|
if (e.getSnapshot().lifecycle !== "running") return;
|
|
1135
|
-
const
|
|
1136
|
-
for (const [
|
|
1137
|
-
|
|
1164
|
+
const n = e.getSnapshot().pipeline;
|
|
1165
|
+
for (const [o, g] of n.entries())
|
|
1166
|
+
O.has(o) || _(o, g);
|
|
1138
1167
|
});
|
|
1139
|
-
const
|
|
1140
|
-
if (
|
|
1168
|
+
const B = () => {
|
|
1169
|
+
if (v !== void 0 && (cancelAnimationFrame(v), v = void 0), c) {
|
|
1141
1170
|
try {
|
|
1142
|
-
|
|
1171
|
+
c.pause();
|
|
1143
1172
|
} catch {
|
|
1144
1173
|
}
|
|
1145
1174
|
try {
|
|
1146
|
-
|
|
1175
|
+
c.srcObject = null;
|
|
1147
1176
|
} catch {
|
|
1148
1177
|
}
|
|
1149
|
-
|
|
1178
|
+
c = void 0;
|
|
1150
1179
|
}
|
|
1151
|
-
if (
|
|
1180
|
+
if (d) {
|
|
1152
1181
|
try {
|
|
1153
|
-
|
|
1182
|
+
d.getTracks().forEach((n) => n.stop());
|
|
1154
1183
|
} catch {
|
|
1155
1184
|
}
|
|
1156
|
-
|
|
1185
|
+
d = void 0;
|
|
1157
1186
|
}
|
|
1158
|
-
},
|
|
1159
|
-
if (
|
|
1160
|
-
const
|
|
1161
|
-
if (
|
|
1162
|
-
|
|
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 =
|
|
1167
|
-
m.width !== y && (m.width = y), m.height !==
|
|
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
|
-
|
|
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
|
-
},
|
|
1173
|
-
if (!
|
|
1174
|
-
if (
|
|
1175
|
-
|
|
1201
|
+
}, ae = () => {
|
|
1202
|
+
if (!c || !m || !u) return;
|
|
1203
|
+
if (k) {
|
|
1204
|
+
W();
|
|
1176
1205
|
return;
|
|
1177
1206
|
}
|
|
1178
|
-
const
|
|
1179
|
-
|
|
1207
|
+
const n = () => {
|
|
1208
|
+
v = requestAnimationFrame(n), W();
|
|
1180
1209
|
};
|
|
1181
|
-
|
|
1182
|
-
},
|
|
1183
|
-
if (
|
|
1210
|
+
v = requestAnimationFrame(n);
|
|
1211
|
+
}, Ce = async (n) => {
|
|
1212
|
+
if (n.source === T.WEBCAM)
|
|
1184
1213
|
try {
|
|
1185
|
-
const
|
|
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:
|
|
1219
|
+
width: { ideal: o }
|
|
1191
1220
|
}
|
|
1192
1221
|
});
|
|
1193
|
-
} catch (
|
|
1194
|
-
const g =
|
|
1195
|
-
throw e.set({ error: { error: "PermissionError", message: w, reason: g } }), new b(
|
|
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
|
|
1198
|
-
},
|
|
1199
|
-
const
|
|
1200
|
-
|
|
1201
|
-
const g = await
|
|
1202
|
-
|
|
1203
|
-
const { renderWidth: w, renderHeight: y } = e.getSnapshot(),
|
|
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
|
-
|
|
1210
|
-
const
|
|
1211
|
-
|
|
1212
|
-
source:
|
|
1213
|
-
stream:
|
|
1214
|
-
static:
|
|
1215
|
-
sourceKind:
|
|
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:
|
|
1246
|
+
source: n.source,
|
|
1218
1247
|
sourceKind: r.sourceKind,
|
|
1219
1248
|
error: void 0
|
|
1220
1249
|
});
|
|
1221
|
-
},
|
|
1222
|
-
const
|
|
1223
|
-
|
|
1224
|
-
const g =
|
|
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:
|
|
1228
|
-
sourceKind:
|
|
1229
|
-
renderWidth:
|
|
1230
|
-
renderHeight:
|
|
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:
|
|
1234
|
-
canvas:
|
|
1235
|
-
sourceKind:
|
|
1262
|
+
source: T.CANVAS,
|
|
1263
|
+
canvas: n.canvas,
|
|
1264
|
+
sourceKind: o
|
|
1236
1265
|
};
|
|
1237
|
-
},
|
|
1238
|
-
if (!
|
|
1239
|
-
const
|
|
1240
|
-
for (const [, g] of
|
|
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())),
|
|
1243
|
-
},
|
|
1244
|
-
const
|
|
1245
|
-
if (
|
|
1246
|
-
throw new b(`Invalid media source: ${String(
|
|
1247
|
-
if (
|
|
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
|
-
|
|
1280
|
+
S += 1;
|
|
1252
1281
|
const { lifecycle: g } = e.getSnapshot();
|
|
1253
1282
|
if (g === "idle" || g === "stopped") {
|
|
1254
|
-
await
|
|
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
|
-
|
|
1287
|
+
B(), await X(n), s.log("Media source rebound to:", n.source);
|
|
1259
1288
|
return;
|
|
1260
1289
|
}
|
|
1261
|
-
|
|
1262
|
-
},
|
|
1263
|
-
if (
|
|
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
|
-
|
|
1268
|
-
const { lifecycle:
|
|
1269
|
-
if (
|
|
1270
|
-
await
|
|
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 (
|
|
1274
|
-
|
|
1302
|
+
if (o === "media-bound") {
|
|
1303
|
+
B(), await j(n), s.log("Frame source rebound to canvas.");
|
|
1275
1304
|
return;
|
|
1276
1305
|
}
|
|
1277
|
-
|
|
1278
|
-
},
|
|
1279
|
-
const { lifecycle:
|
|
1280
|
-
if (
|
|
1281
|
-
if (
|
|
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 (!
|
|
1312
|
+
if (!u)
|
|
1284
1313
|
throw new b("session.start(): media source not bound");
|
|
1285
|
-
const
|
|
1286
|
-
if (!
|
|
1287
|
-
throw
|
|
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
|
-
|
|
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
|
-
},
|
|
1296
|
-
const { lifecycle:
|
|
1297
|
-
|
|
1298
|
-
},
|
|
1299
|
-
await
|
|
1300
|
-
const
|
|
1301
|
-
|
|
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
|
-
},
|
|
1307
|
-
const
|
|
1335
|
+
}, Ae = async (n) => {
|
|
1336
|
+
const o = "legacy:registerXRPipeline", g = [];
|
|
1308
1337
|
await Promise.all(
|
|
1309
|
-
|
|
1338
|
+
n.map(async (w) => {
|
|
1310
1339
|
const { model: y } = w;
|
|
1311
|
-
if (!
|
|
1340
|
+
if (!de[y])
|
|
1312
1341
|
throw new b(`Invalid model: ${y}`);
|
|
1313
|
-
|
|
1314
|
-
const
|
|
1315
|
-
await
|
|
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) =>
|
|
1318
|
-
},
|
|
1319
|
-
const
|
|
1320
|
-
if (!
|
|
1321
|
-
throw new b(`Model ${
|
|
1322
|
-
return
|
|
1323
|
-
},
|
|
1324
|
-
|
|
1325
|
-
},
|
|
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
|
-
|
|
1328
|
-
const
|
|
1329
|
-
await
|
|
1330
|
-
},
|
|
1331
|
-
|
|
1332
|
-
},
|
|
1333
|
-
|
|
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
|
-
|
|
1368
|
+
f ? f() : M.render(F, l);
|
|
1338
1369
|
};
|
|
1339
1370
|
return {
|
|
1340
1371
|
store: e,
|
|
1341
|
-
registry:
|
|
1342
|
-
setMediaSource:
|
|
1343
|
-
start:
|
|
1344
|
-
stop:
|
|
1345
|
-
reset:
|
|
1346
|
-
setFrameSource:
|
|
1347
|
-
registerXRPipeline:
|
|
1348
|
-
getModelNode:
|
|
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
|
-
|
|
1351
|
-
|
|
1352
|
-
|
|
1353
|
-
|
|
1354
|
-
if (
|
|
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.
|
|
1394
|
+
"session.captureStream() called before an XRScene or XRMediaSurface capture target was bound"
|
|
1357
1395
|
);
|
|
1358
|
-
return
|
|
1396
|
+
return o.captureStream(n);
|
|
1359
1397
|
},
|
|
1360
|
-
getInputFrame: () =>
|
|
1361
|
-
_setRenderTarget:
|
|
1362
|
-
|
|
1363
|
-
|
|
1364
|
-
|
|
1365
|
-
|
|
1366
|
-
|
|
1367
|
-
|
|
1368
|
-
|
|
1369
|
-
|
|
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:
|
|
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
|
-
},
|
|
1380
|
-
const s =
|
|
1381
|
-
return
|
|
1382
|
-
e._setPerf(
|
|
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
|
-
},
|
|
1385
|
-
register: (
|
|
1386
|
-
s ?
|
|
1423
|
+
}, J = /* @__PURE__ */ new Map(), At = () => ({
|
|
1424
|
+
register: (a, s) => {
|
|
1425
|
+
s ? J.set(a, s) : J.delete(a);
|
|
1387
1426
|
},
|
|
1388
|
-
resolve: (
|
|
1389
|
-
}),
|
|
1390
|
-
const s =
|
|
1391
|
-
|
|
1392
|
-
}, []), t =
|
|
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 =
|
|
1396
|
-
return
|
|
1397
|
-
},
|
|
1398
|
-
|
|
1399
|
-
const
|
|
1400
|
-
const
|
|
1401
|
-
if (!
|
|
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
|
|
1406
|
-
},
|
|
1407
|
-
const e =
|
|
1408
|
-
return /* @__PURE__ */
|
|
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
|
-
|
|
1412
|
-
|
|
1413
|
-
|
|
1414
|
-
|
|
1415
|
-
|
|
1416
|
-
|
|
1417
|
-
|
|
1418
|
-
|
|
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
|
-
|
|
1459
|
+
te as n,
|
|
1460
|
+
Vt as t,
|
|
1461
|
+
qt as u
|
|
1421
1462
|
};
|