@vincentt-xr/sdk 2.0.0-alpha.0
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 +537 -0
- package/LICENSE +7 -0
- package/README.md +85 -0
- package/dist/DebuggerUI-CEfdddkZ.cjs +1 -0
- package/dist/DebuggerUI-Dgop6Q6o.js +269 -0
- package/dist/audio/AudioEngine.d.ts +98 -0
- package/dist/audio/index.d.ts +34 -0
- package/dist/components/AspectRatioContainer/index.d.ts +10 -0
- package/dist/components/BodyTracker/index.d.ts +15 -0
- package/dist/components/Debugger/DebuggerProvider.d.ts +22 -0
- package/dist/components/Debugger/DebuggerUI.d.ts +13 -0
- package/dist/components/Debugger/index.d.ts +38 -0
- package/dist/components/Debugger/styles.d.ts +19 -0
- package/dist/components/FaceMesh/FaceMesh.d.ts +26 -0
- package/dist/components/FaceMesh/canonical/CanonicalFaceMeshRenderer.d.ts +34 -0
- package/dist/components/FaceMesh/canonical/parseCanonicalFaceModel.d.ts +16 -0
- package/dist/components/FaceMesh/canonical/useCanonicalFaceMesh.d.ts +15 -0
- package/dist/components/FaceMesh/deform.d.ts +36 -0
- package/dist/components/FaceMesh/index.d.ts +6 -0
- package/dist/components/FaceMesh/indices.d.ts +1 -0
- package/dist/components/FaceMesh/material/blendModes.d.ts +2 -0
- package/dist/components/FaceMesh/material/defaults.d.ts +3 -0
- package/dist/components/FaceMesh/material/index.d.ts +5 -0
- package/dist/components/FaceMesh/material/options.d.ts +25 -0
- package/dist/components/FaceMesh/material/support.d.ts +3 -0
- package/dist/components/FaceMesh/material/types.d.ts +23 -0
- package/dist/components/FaceMesh/uv.d.ts +1 -0
- package/dist/components/FaceRetouch/Background.d.ts +16 -0
- package/dist/components/FaceRetouch/index.d.ts +6 -0
- package/dist/components/FaceRetouch/landmarkMask.d.ts +23 -0
- package/dist/components/FaceRetouch/retouchRegions.d.ts +23 -0
- package/dist/components/FaceRetouch/useFaceRetouchMask.d.ts +14 -0
- package/dist/components/FaceRetouch/useFaceRetouchRegions.d.ts +12 -0
- package/dist/components/FaceTracker/BoundingBoxOverlay.d.ts +20 -0
- package/dist/components/FaceTracker/index.d.ts +54 -0
- package/dist/components/GestureTracker/index.d.ts +31 -0
- package/dist/components/GestureTrigger/index.d.ts +3 -0
- package/dist/components/HandTracker/index.d.ts +24 -0
- package/dist/components/HeadBinding/index.d.ts +31 -0
- package/dist/components/HeadBindingOccluder/index.d.ts +36 -0
- package/dist/components/HeadOccluder/index.d.ts +13 -0
- package/dist/components/Panel/index.d.ts +71 -0
- package/dist/components/PerspectiveCamera/index.d.ts +14 -0
- package/dist/components/ScreenSpaceUI/ScreenTransform.d.ts +54 -0
- package/dist/components/ScreenSpaceUI/context.d.ts +29 -0
- package/dist/components/ScreenSpaceUI/index.d.ts +40 -0
- package/dist/components/Segmentation/index.d.ts +44 -0
- package/dist/components/SpriteAnimation/index.d.ts +52 -0
- package/dist/components/TextLabel/index.d.ts +62 -0
- package/dist/components/TrackingAnchor/index.d.ts +74 -0
- package/dist/components/VideoBackground/index.d.ts +38 -0
- package/dist/components/XRCompositor/index.d.ts +5 -0
- package/dist/components/XRDebugView/index.d.ts +6 -0
- package/dist/components/XRLayer/index.d.ts +6 -0
- package/dist/components/XRMediaSurface/index.d.ts +27 -0
- package/dist/components/XRProvider/index.d.ts +13 -0
- package/dist/components/XRScene/defaults.d.ts +4 -0
- package/dist/components/XRScene/index.d.ts +15 -0
- package/dist/components/XRViewport/index.d.ts +101 -0
- package/dist/components/index.d.ts +26 -0
- package/dist/config/index.d.ts +8 -0
- package/dist/constants/index.d.ts +25 -0
- package/dist/constants/renderLayers.d.ts +25 -0
- package/dist/entries/all.d.ts +15 -0
- package/dist/entries/core.d.ts +21 -0
- package/dist/entries/face-effects.d.ts +19 -0
- package/dist/entries/internal.d.ts +16 -0
- package/dist/entries/low-level.d.ts +30 -0
- package/dist/entries/tracking.d.ts +15 -0
- package/dist/face-effects.cjs +252 -0
- package/dist/face-effects.js +3542 -0
- package/dist/hasFullUnitUVBounds-BGvcFsQM.js +26 -0
- package/dist/hasFullUnitUVBounds-p1Dl0ejX.cjs +1 -0
- package/dist/hooks/faceResults.d.ts +39 -0
- package/dist/hooks/selectors.d.ts +33 -0
- package/dist/hooks/useCalibrationFaceTracker.d.ts +23 -0
- package/dist/hooks/useDebugger/index.d.ts +25 -0
- package/dist/hooks/useDebugger/types.d.ts +20 -0
- package/dist/hooks/useFaceBoundingBox.d.ts +11 -0
- package/dist/hooks/useFaceResults.d.ts +31 -0
- package/dist/hooks/useGestureEdge.d.ts +53 -0
- package/dist/hooks/useMediaRecorder.d.ts +40 -0
- package/dist/hooks/useTrackerContext.d.ts +35 -0
- package/dist/hooks/useXRModel.d.ts +15 -0
- package/dist/hooks/useXRSession/constants.d.ts +4 -0
- package/dist/hooks/useXRSession/facade.d.ts +39 -0
- package/dist/hooks/useXRSession/fns.d.ts +5 -0
- package/dist/hooks/useXRSession/index.d.ts +4 -0
- package/dist/hooks/useXRSession/registry.d.ts +52 -0
- package/dist/hooks/useXRSession/store.d.ts +40 -0
- package/dist/index-B5J4gzn2.cjs +1 -0
- package/dist/index-BD-JWMjE.js +1991 -0
- package/dist/index-BVBVg96G.cjs +1 -0
- package/dist/index-CYMj26Ej.js +1331 -0
- package/dist/index-DtwHElmG.js +157 -0
- package/dist/index-PtFmD6B8.cjs +1 -0
- package/dist/internal-DH5d1Xnq.cjs +1 -0
- package/dist/internal-KOKJDxCG.js +519 -0
- package/dist/internal.cjs +1 -0
- package/dist/internal.js +14 -0
- package/dist/low-level.cjs +1 -0
- package/dist/low-level.js +941 -0
- package/dist/main.cjs +1 -0
- package/dist/main.js +612 -0
- package/dist/models/Base/index.d.ts +25 -0
- package/dist/models/Body/index.d.ts +22 -0
- package/dist/models/Face/constants.d.ts +2 -0
- package/dist/models/Face/index.d.ts +45 -0
- package/dist/models/Face/landmarksData.d.ts +2 -0
- package/dist/models/Hand/GestureTracking.d.ts +21 -0
- package/dist/models/Hand/HandTracking.d.ts +21 -0
- package/dist/models/Segmentation/index.d.ts +75 -0
- package/dist/models/index.d.ts +5 -0
- package/dist/modules/XRClient/index.d.ts +9 -0
- package/dist/modules/index.d.ts +1 -0
- package/dist/selectors-BHO6TnoC.js +59 -0
- package/dist/selectors-Bub0o3qy.cjs +1 -0
- package/dist/services/ApiService.d.ts +12 -0
- package/dist/services/MetricsCollector/CameraFPSTracker.d.ts +25 -0
- package/dist/services/MetricsCollector/MemoryTracker.d.ts +43 -0
- package/dist/services/MetricsCollector/RenderTimeTracker.d.ts +10 -0
- package/dist/services/MetricsCollector/ResolutionTracker.d.ts +26 -0
- package/dist/services/MetricsCollector/index.d.ts +59 -0
- package/dist/services/MetricsCollector/types.d.ts +47 -0
- package/dist/services/MetricsCollector/utils.d.ts +65 -0
- package/dist/texture/computeContainScale.d.ts +25 -0
- package/dist/texture/hasFullUnitUVBounds.d.ts +37 -0
- package/dist/texture/types.d.ts +20 -0
- package/dist/tracking.cjs +1 -0
- package/dist/tracking.js +344 -0
- package/dist/types/body.d.ts +3 -0
- package/dist/types/client.d.ts +3 -0
- package/dist/types/common.d.ts +9 -0
- package/dist/types/compositor.d.ts +23 -0
- package/dist/types/debugger.d.ts +83 -0
- package/dist/types/face.d.ts +67 -0
- package/dist/types/gesture-tracking.d.ts +15 -0
- package/dist/types/hand-tracking.d.ts +5 -0
- package/dist/types/headBinding.d.ts +67 -0
- package/dist/types/index.d.ts +12 -0
- package/dist/types/logger.d.ts +4 -0
- package/dist/types/model.d.ts +46 -0
- package/dist/types/nodes.d.ts +35 -0
- package/dist/types/segmentation.d.ts +31 -0
- package/dist/types/session.d.ts +102 -0
- package/dist/types/tracking.d.ts +30 -0
- package/dist/types/util-types.d.ts +1 -0
- package/dist/useFaceResults-cpsSmKKc.js +81 -0
- package/dist/useFaceResults-hVUJYSEY.cjs +1 -0
- package/dist/utils/calibrationDebug.d.ts +9 -0
- package/dist/utils/dataURL.d.ts +6 -0
- package/dist/utils/drawMediaCover.d.ts +18 -0
- package/dist/utils/errors.d.ts +3 -0
- package/dist/utils/fns.d.ts +48 -0
- package/dist/utils/headBinding.d.ts +85 -0
- package/dist/utils/integrity.d.ts +43 -0
- package/dist/utils/landmarkBounds.d.ts +11 -0
- package/dist/utils/logger.d.ts +7 -0
- package/package.json +113 -0
package/dist/tracking.js
ADDED
|
@@ -0,0 +1,344 @@
|
|
|
1
|
+
import { u as pr } from "./useFaceResults-cpsSmKKc.js";
|
|
2
|
+
import { u as g, T as z, a as K } from "./index-BD-JWMjE.js";
|
|
3
|
+
import { b as yr, F as mr } from "./index-BD-JWMjE.js";
|
|
4
|
+
import { jsx as E, Fragment as G } from "react/jsx-runtime";
|
|
5
|
+
import { useThree as N, useFrame as v } from "@react-three/fiber";
|
|
6
|
+
import { useRef as T, useCallback as C, useMemo as k, useEffect as x } from "react";
|
|
7
|
+
import * as R from "three";
|
|
8
|
+
import { X as S, R as w } from "./index-CYMj26Ej.js";
|
|
9
|
+
const L = {
|
|
10
|
+
"body.head": 0,
|
|
11
|
+
"body.leftShoulder": 11,
|
|
12
|
+
"body.rightShoulder": 12,
|
|
13
|
+
"body.leftElbow": 13,
|
|
14
|
+
"body.rightElbow": 14,
|
|
15
|
+
"body.leftWrist": 15,
|
|
16
|
+
"body.rightWrist": 16,
|
|
17
|
+
"body.leftHip": 23,
|
|
18
|
+
"body.rightHip": 24,
|
|
19
|
+
"body.leftKnee": 25,
|
|
20
|
+
"body.rightKnee": 26,
|
|
21
|
+
"body.leftAnkle": 27,
|
|
22
|
+
"body.rightAnkle": 28
|
|
23
|
+
}, er = ({ bodyIndex: r = 0, active: n = !0, children: t }) => {
|
|
24
|
+
const e = T(null), { ready: o, node: a } = g(
|
|
25
|
+
S.BODY_TRACKER,
|
|
26
|
+
void 0,
|
|
27
|
+
n
|
|
28
|
+
), { camera: s } = N(), d = T(s);
|
|
29
|
+
d.current !== s && (d.current = s);
|
|
30
|
+
const i = T(null);
|
|
31
|
+
v(() => {
|
|
32
|
+
if (!o || !a || !e.current) return;
|
|
33
|
+
const f = a;
|
|
34
|
+
i.current = f;
|
|
35
|
+
const c = f.getLandmarks2D(r), u = c == null ? void 0 : c[0];
|
|
36
|
+
if (!u) {
|
|
37
|
+
e.current.visible = !1;
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
const p = D(u, d.current);
|
|
41
|
+
e.current.visible = !0, e.current.position.copy(p);
|
|
42
|
+
});
|
|
43
|
+
const l = C(
|
|
44
|
+
(f) => {
|
|
45
|
+
const c = i.current;
|
|
46
|
+
if (!c) return null;
|
|
47
|
+
const u = c.getLandmarks2D(r);
|
|
48
|
+
if (!u) return null;
|
|
49
|
+
if (f === "body.neck") {
|
|
50
|
+
const h = u[11], b = u[12];
|
|
51
|
+
if (!h || !b) return null;
|
|
52
|
+
const A = {
|
|
53
|
+
x: (h.x + b.x) / 2,
|
|
54
|
+
y: (h.y + b.y) / 2,
|
|
55
|
+
z: (h.z + b.z) / 2
|
|
56
|
+
};
|
|
57
|
+
return { position: D(A, d.current) };
|
|
58
|
+
}
|
|
59
|
+
const p = L[f];
|
|
60
|
+
if (p === void 0) return null;
|
|
61
|
+
const m = u[p];
|
|
62
|
+
return m ? { position: D(m, d.current) } : null;
|
|
63
|
+
},
|
|
64
|
+
[r]
|
|
65
|
+
), y = k(
|
|
66
|
+
() => ({ type: "body", resolveLandmark: l }),
|
|
67
|
+
[l]
|
|
68
|
+
);
|
|
69
|
+
return /* @__PURE__ */ E(z.Provider, { value: y, children: /* @__PURE__ */ E("group", { ref: e, renderOrder: w.TRACKED, children: t }) });
|
|
70
|
+
}, D = (r, n) => {
|
|
71
|
+
const t = new R.Vector3(r.x, r.y, r.z);
|
|
72
|
+
t.unproject(n);
|
|
73
|
+
const e = t.sub(n.position).normalize(), o = -n.position.z / e.z;
|
|
74
|
+
return n.position.clone().add(e.multiplyScalar(o));
|
|
75
|
+
}, W = {
|
|
76
|
+
"hand.wrist": 0,
|
|
77
|
+
"hand.thumbTip": 4,
|
|
78
|
+
"hand.indexTip": 8,
|
|
79
|
+
"hand.middleTip": 12,
|
|
80
|
+
"hand.ringTip": 16,
|
|
81
|
+
"hand.pinkyTip": 20,
|
|
82
|
+
"hand.indexBase": 5,
|
|
83
|
+
"hand.middleBase": 9,
|
|
84
|
+
"hand.ringBase": 13,
|
|
85
|
+
"hand.pinkyBase": 17
|
|
86
|
+
}, tr = ({ children: r, targetFps: n, active: t = !0 }) => {
|
|
87
|
+
const e = T(null), o = k(
|
|
88
|
+
() => n === void 0 ? void 0 : { targetFps: n },
|
|
89
|
+
[n]
|
|
90
|
+
), { ready: a, node: s } = g(
|
|
91
|
+
S.GESTURE_TRACKER,
|
|
92
|
+
o,
|
|
93
|
+
t
|
|
94
|
+
), { camera: d } = N(), i = T(d);
|
|
95
|
+
i.current !== d && (i.current = d);
|
|
96
|
+
const l = T(null);
|
|
97
|
+
v(() => {
|
|
98
|
+
var p;
|
|
99
|
+
if (!a || !s || !e.current) return;
|
|
100
|
+
l.current = s;
|
|
101
|
+
const c = (p = s == null ? void 0 : s.coordinates) == null ? void 0 : p[0];
|
|
102
|
+
if (!c) {
|
|
103
|
+
e.current.visible = !1;
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
const u = _(c, i.current);
|
|
107
|
+
e.current.visible = !0, e.current.position.copy(u);
|
|
108
|
+
});
|
|
109
|
+
const y = C((c) => {
|
|
110
|
+
var m, h;
|
|
111
|
+
const u = W[c];
|
|
112
|
+
if (u === void 0) return null;
|
|
113
|
+
const p = (h = (m = l.current) == null ? void 0 : m.coordinates) == null ? void 0 : h[u];
|
|
114
|
+
return p ? { position: _(p, i.current) } : null;
|
|
115
|
+
}, []), f = k(
|
|
116
|
+
() => ({ type: "hand", resolveLandmark: y }),
|
|
117
|
+
[y]
|
|
118
|
+
);
|
|
119
|
+
return /* @__PURE__ */ E(z.Provider, { value: f, children: /* @__PURE__ */ E("group", { ref: e, renderOrder: w.TRACKED, children: r }) });
|
|
120
|
+
}, _ = (r, n) => {
|
|
121
|
+
const t = new R.Vector3(r.x, r.y, r.z);
|
|
122
|
+
t.unproject(n);
|
|
123
|
+
const e = t.sub(n.position).normalize(), o = -n.position.z / e.z;
|
|
124
|
+
return n.position.clone().add(e.multiplyScalar(o));
|
|
125
|
+
}, P = 800, V = 200, $ = () => ({
|
|
126
|
+
armed: !1,
|
|
127
|
+
armStart: null,
|
|
128
|
+
holdStart: null,
|
|
129
|
+
fired: !1
|
|
130
|
+
}), j = (r, {
|
|
131
|
+
isTrigger: n,
|
|
132
|
+
gesture: t,
|
|
133
|
+
now: e,
|
|
134
|
+
mode: o,
|
|
135
|
+
debounceMs: a,
|
|
136
|
+
holdMs: s
|
|
137
|
+
}) => {
|
|
138
|
+
if (r.fired) return null;
|
|
139
|
+
if (o === "hold") {
|
|
140
|
+
if (n && t) {
|
|
141
|
+
if (r.holdStart === null && (r.holdStart = e), e - r.holdStart >= s)
|
|
142
|
+
return r.fired = !0, t;
|
|
143
|
+
} else
|
|
144
|
+
r.holdStart = null;
|
|
145
|
+
return null;
|
|
146
|
+
}
|
|
147
|
+
return r.armed ? n && t ? (r.fired = !0, t) : null : (n ? r.armStart = null : (r.armStart === null && (r.armStart = e), e - r.armStart >= a && (r.armed = !0)), null);
|
|
148
|
+
};
|
|
149
|
+
function F({
|
|
150
|
+
gestures: r,
|
|
151
|
+
mode: n = "arm",
|
|
152
|
+
debounceMs: t = P,
|
|
153
|
+
holdMs: e = V,
|
|
154
|
+
onTrigger: o,
|
|
155
|
+
enabled: a = !0
|
|
156
|
+
}) {
|
|
157
|
+
const { ready: s, node: d } = g(S.GESTURE_TRACKER), i = T(o);
|
|
158
|
+
x(() => {
|
|
159
|
+
i.current = o;
|
|
160
|
+
}, [o]);
|
|
161
|
+
const l = T(/* @__PURE__ */ new Set());
|
|
162
|
+
x(() => {
|
|
163
|
+
l.current = new Set(Array.isArray(r) ? r : [r]);
|
|
164
|
+
}, [r]);
|
|
165
|
+
const y = T($());
|
|
166
|
+
v(() => {
|
|
167
|
+
if (!a || !s || !d) return;
|
|
168
|
+
const f = d.gesture, c = !!(f && l.current.has(f)), u = j(y.current, {
|
|
169
|
+
isTrigger: c,
|
|
170
|
+
gesture: f,
|
|
171
|
+
now: performance.now(),
|
|
172
|
+
mode: n,
|
|
173
|
+
debounceMs: t,
|
|
174
|
+
holdMs: e
|
|
175
|
+
});
|
|
176
|
+
u && i.current(u);
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
const or = (r) => (F(r), null), q = {
|
|
180
|
+
"hand.wrist": 0,
|
|
181
|
+
"hand.thumbTip": 4,
|
|
182
|
+
"hand.indexTip": 8,
|
|
183
|
+
"hand.middleTip": 12,
|
|
184
|
+
"hand.ringTip": 16,
|
|
185
|
+
"hand.pinkyTip": 20,
|
|
186
|
+
"hand.indexBase": 5,
|
|
187
|
+
"hand.middleBase": 9,
|
|
188
|
+
"hand.ringBase": 13,
|
|
189
|
+
"hand.pinkyBase": 17
|
|
190
|
+
}, ir = ({ children: r, targetFps: n, active: t = !0 }) => {
|
|
191
|
+
const e = T(null), o = k(
|
|
192
|
+
() => n === void 0 ? void 0 : { targetFps: n },
|
|
193
|
+
[n]
|
|
194
|
+
), { ready: a, node: s } = g(
|
|
195
|
+
S.HAND_TRACKER,
|
|
196
|
+
o,
|
|
197
|
+
t
|
|
198
|
+
), { camera: d } = N(), i = T(d);
|
|
199
|
+
i.current !== d && (i.current = d);
|
|
200
|
+
const l = T(null);
|
|
201
|
+
v(() => {
|
|
202
|
+
var m;
|
|
203
|
+
if (!a || !s || !e.current) return;
|
|
204
|
+
const c = s;
|
|
205
|
+
l.current = c;
|
|
206
|
+
const u = (m = c == null ? void 0 : c.coordinates) == null ? void 0 : m[0];
|
|
207
|
+
if (!u) {
|
|
208
|
+
e.current.visible = !1;
|
|
209
|
+
return;
|
|
210
|
+
}
|
|
211
|
+
const p = B(u, i.current);
|
|
212
|
+
e.current.visible = !0, e.current.position.copy(p);
|
|
213
|
+
});
|
|
214
|
+
const y = C((c) => {
|
|
215
|
+
var m, h;
|
|
216
|
+
const u = q[c];
|
|
217
|
+
if (u === void 0) return null;
|
|
218
|
+
const p = (h = (m = l.current) == null ? void 0 : m.coordinates) == null ? void 0 : h[u];
|
|
219
|
+
return p ? { position: B(p, i.current) } : null;
|
|
220
|
+
}, []), f = k(
|
|
221
|
+
() => ({ type: "hand", resolveLandmark: y }),
|
|
222
|
+
[y]
|
|
223
|
+
);
|
|
224
|
+
return /* @__PURE__ */ E(z.Provider, { value: f, children: /* @__PURE__ */ E("group", { ref: e, renderOrder: w.TRACKED, children: r }) });
|
|
225
|
+
}, B = (r, n) => {
|
|
226
|
+
const t = new R.Vector3(r.x, r.y, r.z);
|
|
227
|
+
t.unproject(n);
|
|
228
|
+
const e = t.sub(n.position).normalize(), o = -n.position.z / e.z;
|
|
229
|
+
return n.position.clone().add(e.multiplyScalar(o));
|
|
230
|
+
}, H = ["portrait"], cr = ({ type: r, active: n = !0, children: t }) => (g(S.BACKGROUND_SEGMENTATION, { type: r }, n), x(() => {
|
|
231
|
+
H.includes(r) || console.warn(
|
|
232
|
+
`[Segmentation] unsupported type "${r}"; valid values: ${H.join(", ")}`
|
|
233
|
+
);
|
|
234
|
+
}, [r]), /* @__PURE__ */ E(G, { children: t })), sr = [
|
|
235
|
+
"face.forehead",
|
|
236
|
+
"face.noseTip",
|
|
237
|
+
"face.chin",
|
|
238
|
+
"face.leftEyeOuter",
|
|
239
|
+
"face.rightEyeOuter",
|
|
240
|
+
"face.leftCheek",
|
|
241
|
+
"face.rightCheek",
|
|
242
|
+
"face.mouthCenter"
|
|
243
|
+
], ur = [
|
|
244
|
+
"hand.wrist",
|
|
245
|
+
"hand.thumbTip",
|
|
246
|
+
"hand.indexTip",
|
|
247
|
+
"hand.middleTip",
|
|
248
|
+
"hand.ringTip",
|
|
249
|
+
"hand.pinkyTip",
|
|
250
|
+
"hand.indexBase",
|
|
251
|
+
"hand.middleBase",
|
|
252
|
+
"hand.ringBase",
|
|
253
|
+
"hand.pinkyBase"
|
|
254
|
+
], ar = [
|
|
255
|
+
"body.head",
|
|
256
|
+
"body.neck",
|
|
257
|
+
"body.leftShoulder",
|
|
258
|
+
"body.rightShoulder",
|
|
259
|
+
"body.leftElbow",
|
|
260
|
+
"body.rightElbow",
|
|
261
|
+
"body.leftWrist",
|
|
262
|
+
"body.rightWrist",
|
|
263
|
+
"body.leftHip",
|
|
264
|
+
"body.rightHip",
|
|
265
|
+
"body.leftKnee",
|
|
266
|
+
"body.rightKnee",
|
|
267
|
+
"body.leftAnkle",
|
|
268
|
+
"body.rightAnkle"
|
|
269
|
+
], U = (r) => r.startsWith("face.") ? "face" : r.startsWith("hand.") ? "hand" : r.startsWith("body.") ? "body" : null, M = (r, n, t) => n + t * (r - n), O = (r, n) => 1 / (1 + 1 / (2 * Math.PI * r) / n), X = (r, n, t, e, o, a) => {
|
|
270
|
+
if (!r.initialized || t <= 0)
|
|
271
|
+
return r.pos.copy(n), r.prevRaw.copy(n), r.dxHat.set(0, 0, 0), r.initialized = !0, r;
|
|
272
|
+
const s = O(a, t), d = ["x", "y", "z"];
|
|
273
|
+
for (const i of d) {
|
|
274
|
+
const l = (n[i] - r.prevRaw[i]) / t, y = M(l, r.dxHat[i], s);
|
|
275
|
+
r.dxHat[i] = y;
|
|
276
|
+
const f = e + o * Math.abs(y), c = O(f, t);
|
|
277
|
+
r.pos[i] = M(n[i], r.pos[i], c), r.prevRaw[i] = n[i];
|
|
278
|
+
}
|
|
279
|
+
return r;
|
|
280
|
+
}, dr = ({
|
|
281
|
+
target: r,
|
|
282
|
+
offset: n,
|
|
283
|
+
smoothing: t = 0,
|
|
284
|
+
children: e
|
|
285
|
+
}) => {
|
|
286
|
+
const o = K(), a = T(null), s = T(!1), d = T(new R.Vector3()), i = T({
|
|
287
|
+
pos: new R.Vector3(),
|
|
288
|
+
prevRaw: new R.Vector3(),
|
|
289
|
+
dxHat: new R.Vector3(),
|
|
290
|
+
initialized: !1
|
|
291
|
+
}), l = U(r), y = o !== null && l !== null && o.type !== l, f = o === null, c = f || y || l === null;
|
|
292
|
+
return x(() => {
|
|
293
|
+
f ? console.warn(
|
|
294
|
+
`[TrackingAnchor] target "${r}" requires a FaceTracker / HandTracker / BodyTracker ancestor; rendering null.`
|
|
295
|
+
) : y ? console.warn(
|
|
296
|
+
`[TrackingAnchor] target "${r}" namespace does not match parent tracker type "${o == null ? void 0 : o.type}"; rendering null.`
|
|
297
|
+
) : l === null && console.warn(
|
|
298
|
+
`[TrackingAnchor] target "${r}" is not a recognized face/hand/body landmark; rendering null.`
|
|
299
|
+
);
|
|
300
|
+
}, [r, l, f, y, o == null ? void 0 : o.type]), v((u, p) => {
|
|
301
|
+
if (c || !a.current || !o) return;
|
|
302
|
+
const m = o.resolveLandmark(r);
|
|
303
|
+
if (!m) {
|
|
304
|
+
a.current.visible = !1, s.current = !1, i.current.initialized = !1;
|
|
305
|
+
return;
|
|
306
|
+
}
|
|
307
|
+
a.current.visible = !0;
|
|
308
|
+
const h = d.current.copy(m.position), b = a.current.parent;
|
|
309
|
+
if (b) {
|
|
310
|
+
b.updateMatrixWorld();
|
|
311
|
+
const A = new R.Matrix4().copy(b.matrixWorld).invert();
|
|
312
|
+
h.applyMatrix4(A);
|
|
313
|
+
}
|
|
314
|
+
if (n && (h.x += n[0], h.y += n[1], h.z += n[2]), t > 0) {
|
|
315
|
+
const A = t * 0.1;
|
|
316
|
+
X(
|
|
317
|
+
i.current,
|
|
318
|
+
h,
|
|
319
|
+
s.current ? p : 0,
|
|
320
|
+
A,
|
|
321
|
+
0.5,
|
|
322
|
+
1
|
|
323
|
+
), a.current.position.copy(i.current.pos);
|
|
324
|
+
} else
|
|
325
|
+
a.current.position.copy(h);
|
|
326
|
+
s.current = !0, m.quaternion && a.current.quaternion.copy(m.quaternion);
|
|
327
|
+
}), c ? null : /* @__PURE__ */ E("group", { ref: a, renderOrder: w.TRACKED, children: e });
|
|
328
|
+
};
|
|
329
|
+
export {
|
|
330
|
+
ar as BODY_TARGETS,
|
|
331
|
+
er as BodyTracker,
|
|
332
|
+
sr as FACE_TARGETS,
|
|
333
|
+
yr as FaceMesh,
|
|
334
|
+
mr as FaceTracker,
|
|
335
|
+
tr as GestureTracker,
|
|
336
|
+
or as GestureTrigger,
|
|
337
|
+
ur as HAND_TARGETS,
|
|
338
|
+
ir as HandTracker,
|
|
339
|
+
H as SEGMENTATION_TYPES,
|
|
340
|
+
cr as Segmentation,
|
|
341
|
+
dr as TrackingAnchor,
|
|
342
|
+
U as getTargetNamespace,
|
|
343
|
+
pr as useFaceResults
|
|
344
|
+
};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export type XRLayerConfig = {
|
|
2
|
+
name: string;
|
|
3
|
+
clearColor: string;
|
|
4
|
+
hidden?: boolean;
|
|
5
|
+
pointerEvents?: "none" | "auto";
|
|
6
|
+
zIndex: number;
|
|
7
|
+
};
|
|
8
|
+
export type XRMediaSourceKind = "image" | "video";
|
|
9
|
+
export type XRMediaLayout = {
|
|
10
|
+
source: {
|
|
11
|
+
width: number;
|
|
12
|
+
height: number;
|
|
13
|
+
};
|
|
14
|
+
destination: {
|
|
15
|
+
width: number;
|
|
16
|
+
height: number;
|
|
17
|
+
};
|
|
18
|
+
drawWidth: number;
|
|
19
|
+
drawHeight: number;
|
|
20
|
+
offsetX: number;
|
|
21
|
+
offsetY: number;
|
|
22
|
+
scale: number;
|
|
23
|
+
};
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Debugger type definitions for the XR SDK
|
|
3
|
+
* Provides real-time performance insights for WebAR experiences
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Per-model performance data
|
|
7
|
+
*/
|
|
8
|
+
export interface ModelPerformanceData {
|
|
9
|
+
/** Model name */
|
|
10
|
+
name: string;
|
|
11
|
+
/** Processing time in milliseconds */
|
|
12
|
+
processingTime: number;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Core metrics collected by the debugger
|
|
16
|
+
*/
|
|
17
|
+
export interface DebuggerMetrics {
|
|
18
|
+
/** Camera frames per second (updated every 500ms) */
|
|
19
|
+
cameraFPS: number;
|
|
20
|
+
/** Total detection time across all models in milliseconds (per frame) */
|
|
21
|
+
detectionTime: number;
|
|
22
|
+
/** Per-model detection times */
|
|
23
|
+
modelPerformance: ModelPerformanceData[];
|
|
24
|
+
/** Rendering time per frame in milliseconds */
|
|
25
|
+
renderTime: number;
|
|
26
|
+
/** Effective FPS combining detection + render (updated every 1s) */
|
|
27
|
+
effectiveFPS: number;
|
|
28
|
+
/** Memory usage information */
|
|
29
|
+
memory: {
|
|
30
|
+
/** Used heap size in MB */
|
|
31
|
+
used: number;
|
|
32
|
+
/** Total heap size in MB */
|
|
33
|
+
total: number;
|
|
34
|
+
/** Usage percentage (0-100) */
|
|
35
|
+
percentage: number;
|
|
36
|
+
} | null;
|
|
37
|
+
/** Camera resolution as "widthxheight" string (e.g., "1280x720") */
|
|
38
|
+
resolution: string;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Debugger state managed by DebuggerProvider
|
|
42
|
+
*/
|
|
43
|
+
export interface DebuggerState {
|
|
44
|
+
/** Whether the debugger is enabled (visible) */
|
|
45
|
+
enabled: boolean;
|
|
46
|
+
/** Whether the debugger UI is collapsed */
|
|
47
|
+
collapsed: boolean;
|
|
48
|
+
/** Current metrics */
|
|
49
|
+
metrics: DebuggerMetrics;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Configuration options for the DebuggerOverlay component
|
|
53
|
+
*/
|
|
54
|
+
export interface DebuggerConfig {
|
|
55
|
+
/** Starting state: collapsed or expanded */
|
|
56
|
+
defaultCollapsed?: boolean;
|
|
57
|
+
/** Keyboard shortcut to toggle debugger (default: "ctrl+shift+d") */
|
|
58
|
+
keyboardShortcut?: string;
|
|
59
|
+
/** Position of the overlay (default: "top-left") */
|
|
60
|
+
position?: "top-left" | "top-right" | "bottom-left" | "bottom-right";
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Context value provided by DebuggerProvider
|
|
64
|
+
*/
|
|
65
|
+
export interface DebuggerContextValue {
|
|
66
|
+
/** Current debugger state */
|
|
67
|
+
state: DebuggerState;
|
|
68
|
+
/** Toggle debugger visibility */
|
|
69
|
+
toggle: () => void;
|
|
70
|
+
/** Set collapsed state */
|
|
71
|
+
setCollapsed: (collapsed: boolean) => void;
|
|
72
|
+
/** Enable debugger */
|
|
73
|
+
enable: () => void;
|
|
74
|
+
/** Disable debugger */
|
|
75
|
+
disable: () => void;
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Props for DebuggerOverlay component
|
|
79
|
+
*/
|
|
80
|
+
export interface DebuggerOverlayProps extends DebuggerConfig {
|
|
81
|
+
/** Optional className for custom styling */
|
|
82
|
+
className?: string;
|
|
83
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { Category, Matrix, NormalizedLandmark } from '@mediapipe/tasks-vision';
|
|
2
|
+
import { Vector3 } from 'three';
|
|
3
|
+
export type FaceModelOptions = {
|
|
4
|
+
numFaces?: number;
|
|
5
|
+
};
|
|
6
|
+
export type Face = {
|
|
7
|
+
transform: {
|
|
8
|
+
position: Vector3;
|
|
9
|
+
rotation: Vector3;
|
|
10
|
+
scale: Vector3;
|
|
11
|
+
};
|
|
12
|
+
gestures: Record<string, number>;
|
|
13
|
+
};
|
|
14
|
+
export type FaceBounds = {
|
|
15
|
+
minX: number;
|
|
16
|
+
minY: number;
|
|
17
|
+
maxX: number;
|
|
18
|
+
maxY: number;
|
|
19
|
+
width: number;
|
|
20
|
+
height: number;
|
|
21
|
+
centerX: number;
|
|
22
|
+
centerY: number;
|
|
23
|
+
};
|
|
24
|
+
export type FaceTrackingResult = {
|
|
25
|
+
landmarks: NormalizedLandmark[];
|
|
26
|
+
bounds: FaceBounds;
|
|
27
|
+
};
|
|
28
|
+
/**
|
|
29
|
+
* Raw MediaPipe face-tracking payload for one detected face. This stays
|
|
30
|
+
* close to the upstream output so custom effects and AI-assisted tooling
|
|
31
|
+
* can inspect low-level tracking data without reconstructing it from the
|
|
32
|
+
* higher-level `Face` transform abstraction.
|
|
33
|
+
*/
|
|
34
|
+
export type FaceRawTrackingData = {
|
|
35
|
+
landmarks?: NormalizedLandmark[];
|
|
36
|
+
blendshapes?: Category[];
|
|
37
|
+
transformationMatrix?: Matrix;
|
|
38
|
+
};
|
|
39
|
+
/**
|
|
40
|
+
* 2D face landmark in normalized image space (0..1 across both axes).
|
|
41
|
+
*/
|
|
42
|
+
export type FaceLandmark2D = {
|
|
43
|
+
x: number;
|
|
44
|
+
y: number;
|
|
45
|
+
};
|
|
46
|
+
/**
|
|
47
|
+
* Normalized bounding box (0..1 across both axes). Multiply by container
|
|
48
|
+
* dimensions to position in CSS or screen space.
|
|
49
|
+
*/
|
|
50
|
+
export type BoundingBox = {
|
|
51
|
+
left: number;
|
|
52
|
+
top: number;
|
|
53
|
+
width: number;
|
|
54
|
+
height: number;
|
|
55
|
+
};
|
|
56
|
+
/**
|
|
57
|
+
* Elliptical region used by the face-retouch shader. All coordinates are
|
|
58
|
+
* in normalized image space (0..1).
|
|
59
|
+
*/
|
|
60
|
+
export type FaceRetouchRegion = {
|
|
61
|
+
centerX: number;
|
|
62
|
+
centerY: number;
|
|
63
|
+
radiusX: number;
|
|
64
|
+
radiusY: number;
|
|
65
|
+
strength: number;
|
|
66
|
+
kind: "face" | "feature";
|
|
67
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Coordinate } from './common';
|
|
2
|
+
export type GestureData = {
|
|
3
|
+
coordinates?: Coordinate[];
|
|
4
|
+
gesture?: "closed_fist" | "open_palm" | "pointing_up" | "thumb_down" | "thumb_up" | "victory" | "i_love_you" | "none";
|
|
5
|
+
};
|
|
6
|
+
export declare enum Gestures {
|
|
7
|
+
ClosedFist = "closed_fist",
|
|
8
|
+
OpenPalm = "open_palm",
|
|
9
|
+
PointingUp = "pointing_up",
|
|
10
|
+
ThumbDown = "thumb_down",
|
|
11
|
+
ThumbUp = "thumb_up",
|
|
12
|
+
Victory = "victory",
|
|
13
|
+
ILoveYou = "i_love_you",
|
|
14
|
+
None = "none"
|
|
15
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
export type HeadBindingShape = {
|
|
2
|
+
x: number;
|
|
3
|
+
y: number;
|
|
4
|
+
width: number;
|
|
5
|
+
height: number;
|
|
6
|
+
centerX: number;
|
|
7
|
+
centerY: number;
|
|
8
|
+
};
|
|
9
|
+
export type HeadBindingAdaptiveValues = {
|
|
10
|
+
aspectRatio: number;
|
|
11
|
+
normalizedAspect: number;
|
|
12
|
+
scaleY: number;
|
|
13
|
+
offsetY: number;
|
|
14
|
+
};
|
|
15
|
+
export type HeadBindingCubePose = {
|
|
16
|
+
boxCenterZ: number;
|
|
17
|
+
centerX: number;
|
|
18
|
+
centerY: number;
|
|
19
|
+
depth: number;
|
|
20
|
+
height: number;
|
|
21
|
+
rotationX: number;
|
|
22
|
+
rotationY: number;
|
|
23
|
+
rotationZ: number;
|
|
24
|
+
width: number;
|
|
25
|
+
};
|
|
26
|
+
export type HeadBindingCubeModel = "v1" | "v2";
|
|
27
|
+
export type HeadBindingDebugMetrics = {
|
|
28
|
+
center: {
|
|
29
|
+
x: number;
|
|
30
|
+
y: number;
|
|
31
|
+
z: number;
|
|
32
|
+
};
|
|
33
|
+
depthPx: number;
|
|
34
|
+
face: {
|
|
35
|
+
centerX: number;
|
|
36
|
+
centerY: number;
|
|
37
|
+
height: number;
|
|
38
|
+
width: number;
|
|
39
|
+
};
|
|
40
|
+
normalized: {
|
|
41
|
+
rawPitch: number;
|
|
42
|
+
rawPitchFromBalance: number;
|
|
43
|
+
rawPitchFromCenter: number;
|
|
44
|
+
rawYaw: number;
|
|
45
|
+
roll: number;
|
|
46
|
+
verticalBalance: number;
|
|
47
|
+
};
|
|
48
|
+
pose: {
|
|
49
|
+
pitch: number;
|
|
50
|
+
rotationX: number;
|
|
51
|
+
rotationY: number;
|
|
52
|
+
rotationZ: number;
|
|
53
|
+
yaw: number;
|
|
54
|
+
};
|
|
55
|
+
screen: {
|
|
56
|
+
heightPx: number;
|
|
57
|
+
widthPx: number;
|
|
58
|
+
};
|
|
59
|
+
skullAnchor: {
|
|
60
|
+
x: number;
|
|
61
|
+
y: number;
|
|
62
|
+
};
|
|
63
|
+
};
|
|
64
|
+
export type HeadBindingSolveResult = {
|
|
65
|
+
pose: HeadBindingCubePose;
|
|
66
|
+
debugMetrics: HeadBindingDebugMetrics;
|
|
67
|
+
};
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export * from './client';
|
|
2
|
+
export * from './nodes';
|
|
3
|
+
export * from './session';
|
|
4
|
+
export * from './body';
|
|
5
|
+
export * from './face';
|
|
6
|
+
export * from './headBinding';
|
|
7
|
+
export * from './model';
|
|
8
|
+
export * from './segmentation';
|
|
9
|
+
export * from './common';
|
|
10
|
+
export * from './compositor';
|
|
11
|
+
export * from './logger';
|
|
12
|
+
export * from './util-types';
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { XRMediaSourceKind } from './compositor';
|
|
2
|
+
/**
|
|
3
|
+
* Session-level performance config, set via `<XRProvider perf={...}>`. Trades
|
|
4
|
+
* tracking fidelity for lower GPU/CPU load and heat. Every field is optional;
|
|
5
|
+
* omitted fields keep the SDK's built-in behavior.
|
|
6
|
+
*/
|
|
7
|
+
export type XRPerfConfig = {
|
|
8
|
+
/**
|
|
9
|
+
* Default inference-rate cap (fps) applied to every tracker model that does
|
|
10
|
+
* not set its own `targetFps` prop. Undefined / <= 0 → uncapped for Face and
|
|
11
|
+
* Hand (Gesture keeps its own 15fps default). A per-tracker `targetFps` prop
|
|
12
|
+
* overrides this for that tracker.
|
|
13
|
+
*/
|
|
14
|
+
targetFps?: number;
|
|
15
|
+
/**
|
|
16
|
+
* Target width (px) for the camera-inference source canvas — the image the
|
|
17
|
+
* ML models analyze, NOT the visible camera background the user sees. Lower
|
|
18
|
+
* = less ML work. Undefined keeps the SDK default. This does not change the
|
|
19
|
+
* displayed feed quality.
|
|
20
|
+
*/
|
|
21
|
+
camRes?: number;
|
|
22
|
+
/**
|
|
23
|
+
* Camera framing zoom applied when cover-cropping the webcam into the
|
|
24
|
+
* viewport. `1` = the full native frame (widest field of view); `> 1` crops
|
|
25
|
+
* in and enlarges the subject (a `1.2` fills the frame like a native selfie /
|
|
26
|
+
* Instagram front camera). This is a FRAMING control, not a perf one — it
|
|
27
|
+
* changes the visible feed (and the captured photo and what the trackers see,
|
|
28
|
+
* since all three read the same cover-cropped source). Default `1.2` to match
|
|
29
|
+
* the tight native-selfie framing users expect; set `1` for the widest FOV.
|
|
30
|
+
*/
|
|
31
|
+
cameraZoom?: number;
|
|
32
|
+
};
|
|
33
|
+
export type RunModelParams = {
|
|
34
|
+
sourceCanvas: OffscreenCanvas | HTMLCanvasElement;
|
|
35
|
+
renderWidth: number;
|
|
36
|
+
renderHeight: number;
|
|
37
|
+
getSource?: () => "webcam" | XRMediaSourceKind | undefined;
|
|
38
|
+
/**
|
|
39
|
+
* Cap the model's inference rate to this many frames per second. The model's
|
|
40
|
+
* RAF loop still runs at display rate, but the (expensive) MediaPipe detect
|
|
41
|
+
* call is skipped between intervals. Undefined / <= 0 means uncapped (detect
|
|
42
|
+
* every frame). Lower values cut GPU/CPU load and heat at the cost of tracking
|
|
43
|
+
* smoothness. See `session.perf.targetFps` and the per-tracker `targetFps`.
|
|
44
|
+
*/
|
|
45
|
+
targetFps?: number;
|
|
46
|
+
};
|