@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.
Files changed (159) hide show
  1. package/GROUNDING.md +537 -0
  2. package/LICENSE +7 -0
  3. package/README.md +85 -0
  4. package/dist/DebuggerUI-CEfdddkZ.cjs +1 -0
  5. package/dist/DebuggerUI-Dgop6Q6o.js +269 -0
  6. package/dist/audio/AudioEngine.d.ts +98 -0
  7. package/dist/audio/index.d.ts +34 -0
  8. package/dist/components/AspectRatioContainer/index.d.ts +10 -0
  9. package/dist/components/BodyTracker/index.d.ts +15 -0
  10. package/dist/components/Debugger/DebuggerProvider.d.ts +22 -0
  11. package/dist/components/Debugger/DebuggerUI.d.ts +13 -0
  12. package/dist/components/Debugger/index.d.ts +38 -0
  13. package/dist/components/Debugger/styles.d.ts +19 -0
  14. package/dist/components/FaceMesh/FaceMesh.d.ts +26 -0
  15. package/dist/components/FaceMesh/canonical/CanonicalFaceMeshRenderer.d.ts +34 -0
  16. package/dist/components/FaceMesh/canonical/parseCanonicalFaceModel.d.ts +16 -0
  17. package/dist/components/FaceMesh/canonical/useCanonicalFaceMesh.d.ts +15 -0
  18. package/dist/components/FaceMesh/deform.d.ts +36 -0
  19. package/dist/components/FaceMesh/index.d.ts +6 -0
  20. package/dist/components/FaceMesh/indices.d.ts +1 -0
  21. package/dist/components/FaceMesh/material/blendModes.d.ts +2 -0
  22. package/dist/components/FaceMesh/material/defaults.d.ts +3 -0
  23. package/dist/components/FaceMesh/material/index.d.ts +5 -0
  24. package/dist/components/FaceMesh/material/options.d.ts +25 -0
  25. package/dist/components/FaceMesh/material/support.d.ts +3 -0
  26. package/dist/components/FaceMesh/material/types.d.ts +23 -0
  27. package/dist/components/FaceMesh/uv.d.ts +1 -0
  28. package/dist/components/FaceRetouch/Background.d.ts +16 -0
  29. package/dist/components/FaceRetouch/index.d.ts +6 -0
  30. package/dist/components/FaceRetouch/landmarkMask.d.ts +23 -0
  31. package/dist/components/FaceRetouch/retouchRegions.d.ts +23 -0
  32. package/dist/components/FaceRetouch/useFaceRetouchMask.d.ts +14 -0
  33. package/dist/components/FaceRetouch/useFaceRetouchRegions.d.ts +12 -0
  34. package/dist/components/FaceTracker/BoundingBoxOverlay.d.ts +20 -0
  35. package/dist/components/FaceTracker/index.d.ts +54 -0
  36. package/dist/components/GestureTracker/index.d.ts +31 -0
  37. package/dist/components/GestureTrigger/index.d.ts +3 -0
  38. package/dist/components/HandTracker/index.d.ts +24 -0
  39. package/dist/components/HeadBinding/index.d.ts +31 -0
  40. package/dist/components/HeadBindingOccluder/index.d.ts +36 -0
  41. package/dist/components/HeadOccluder/index.d.ts +13 -0
  42. package/dist/components/Panel/index.d.ts +71 -0
  43. package/dist/components/PerspectiveCamera/index.d.ts +14 -0
  44. package/dist/components/ScreenSpaceUI/ScreenTransform.d.ts +54 -0
  45. package/dist/components/ScreenSpaceUI/context.d.ts +29 -0
  46. package/dist/components/ScreenSpaceUI/index.d.ts +40 -0
  47. package/dist/components/Segmentation/index.d.ts +44 -0
  48. package/dist/components/SpriteAnimation/index.d.ts +52 -0
  49. package/dist/components/TextLabel/index.d.ts +62 -0
  50. package/dist/components/TrackingAnchor/index.d.ts +74 -0
  51. package/dist/components/VideoBackground/index.d.ts +38 -0
  52. package/dist/components/XRCompositor/index.d.ts +5 -0
  53. package/dist/components/XRDebugView/index.d.ts +6 -0
  54. package/dist/components/XRLayer/index.d.ts +6 -0
  55. package/dist/components/XRMediaSurface/index.d.ts +27 -0
  56. package/dist/components/XRProvider/index.d.ts +13 -0
  57. package/dist/components/XRScene/defaults.d.ts +4 -0
  58. package/dist/components/XRScene/index.d.ts +15 -0
  59. package/dist/components/XRViewport/index.d.ts +101 -0
  60. package/dist/components/index.d.ts +26 -0
  61. package/dist/config/index.d.ts +8 -0
  62. package/dist/constants/index.d.ts +25 -0
  63. package/dist/constants/renderLayers.d.ts +25 -0
  64. package/dist/entries/all.d.ts +15 -0
  65. package/dist/entries/core.d.ts +21 -0
  66. package/dist/entries/face-effects.d.ts +19 -0
  67. package/dist/entries/internal.d.ts +16 -0
  68. package/dist/entries/low-level.d.ts +30 -0
  69. package/dist/entries/tracking.d.ts +15 -0
  70. package/dist/face-effects.cjs +252 -0
  71. package/dist/face-effects.js +3542 -0
  72. package/dist/hasFullUnitUVBounds-BGvcFsQM.js +26 -0
  73. package/dist/hasFullUnitUVBounds-p1Dl0ejX.cjs +1 -0
  74. package/dist/hooks/faceResults.d.ts +39 -0
  75. package/dist/hooks/selectors.d.ts +33 -0
  76. package/dist/hooks/useCalibrationFaceTracker.d.ts +23 -0
  77. package/dist/hooks/useDebugger/index.d.ts +25 -0
  78. package/dist/hooks/useDebugger/types.d.ts +20 -0
  79. package/dist/hooks/useFaceBoundingBox.d.ts +11 -0
  80. package/dist/hooks/useFaceResults.d.ts +31 -0
  81. package/dist/hooks/useGestureEdge.d.ts +53 -0
  82. package/dist/hooks/useMediaRecorder.d.ts +40 -0
  83. package/dist/hooks/useTrackerContext.d.ts +35 -0
  84. package/dist/hooks/useXRModel.d.ts +15 -0
  85. package/dist/hooks/useXRSession/constants.d.ts +4 -0
  86. package/dist/hooks/useXRSession/facade.d.ts +39 -0
  87. package/dist/hooks/useXRSession/fns.d.ts +5 -0
  88. package/dist/hooks/useXRSession/index.d.ts +4 -0
  89. package/dist/hooks/useXRSession/registry.d.ts +52 -0
  90. package/dist/hooks/useXRSession/store.d.ts +40 -0
  91. package/dist/index-B5J4gzn2.cjs +1 -0
  92. package/dist/index-BD-JWMjE.js +1991 -0
  93. package/dist/index-BVBVg96G.cjs +1 -0
  94. package/dist/index-CYMj26Ej.js +1331 -0
  95. package/dist/index-DtwHElmG.js +157 -0
  96. package/dist/index-PtFmD6B8.cjs +1 -0
  97. package/dist/internal-DH5d1Xnq.cjs +1 -0
  98. package/dist/internal-KOKJDxCG.js +519 -0
  99. package/dist/internal.cjs +1 -0
  100. package/dist/internal.js +14 -0
  101. package/dist/low-level.cjs +1 -0
  102. package/dist/low-level.js +941 -0
  103. package/dist/main.cjs +1 -0
  104. package/dist/main.js +612 -0
  105. package/dist/models/Base/index.d.ts +25 -0
  106. package/dist/models/Body/index.d.ts +22 -0
  107. package/dist/models/Face/constants.d.ts +2 -0
  108. package/dist/models/Face/index.d.ts +45 -0
  109. package/dist/models/Face/landmarksData.d.ts +2 -0
  110. package/dist/models/Hand/GestureTracking.d.ts +21 -0
  111. package/dist/models/Hand/HandTracking.d.ts +21 -0
  112. package/dist/models/Segmentation/index.d.ts +75 -0
  113. package/dist/models/index.d.ts +5 -0
  114. package/dist/modules/XRClient/index.d.ts +9 -0
  115. package/dist/modules/index.d.ts +1 -0
  116. package/dist/selectors-BHO6TnoC.js +59 -0
  117. package/dist/selectors-Bub0o3qy.cjs +1 -0
  118. package/dist/services/ApiService.d.ts +12 -0
  119. package/dist/services/MetricsCollector/CameraFPSTracker.d.ts +25 -0
  120. package/dist/services/MetricsCollector/MemoryTracker.d.ts +43 -0
  121. package/dist/services/MetricsCollector/RenderTimeTracker.d.ts +10 -0
  122. package/dist/services/MetricsCollector/ResolutionTracker.d.ts +26 -0
  123. package/dist/services/MetricsCollector/index.d.ts +59 -0
  124. package/dist/services/MetricsCollector/types.d.ts +47 -0
  125. package/dist/services/MetricsCollector/utils.d.ts +65 -0
  126. package/dist/texture/computeContainScale.d.ts +25 -0
  127. package/dist/texture/hasFullUnitUVBounds.d.ts +37 -0
  128. package/dist/texture/types.d.ts +20 -0
  129. package/dist/tracking.cjs +1 -0
  130. package/dist/tracking.js +344 -0
  131. package/dist/types/body.d.ts +3 -0
  132. package/dist/types/client.d.ts +3 -0
  133. package/dist/types/common.d.ts +9 -0
  134. package/dist/types/compositor.d.ts +23 -0
  135. package/dist/types/debugger.d.ts +83 -0
  136. package/dist/types/face.d.ts +67 -0
  137. package/dist/types/gesture-tracking.d.ts +15 -0
  138. package/dist/types/hand-tracking.d.ts +5 -0
  139. package/dist/types/headBinding.d.ts +67 -0
  140. package/dist/types/index.d.ts +12 -0
  141. package/dist/types/logger.d.ts +4 -0
  142. package/dist/types/model.d.ts +46 -0
  143. package/dist/types/nodes.d.ts +35 -0
  144. package/dist/types/segmentation.d.ts +31 -0
  145. package/dist/types/session.d.ts +102 -0
  146. package/dist/types/tracking.d.ts +30 -0
  147. package/dist/types/util-types.d.ts +1 -0
  148. package/dist/useFaceResults-cpsSmKKc.js +81 -0
  149. package/dist/useFaceResults-hVUJYSEY.cjs +1 -0
  150. package/dist/utils/calibrationDebug.d.ts +9 -0
  151. package/dist/utils/dataURL.d.ts +6 -0
  152. package/dist/utils/drawMediaCover.d.ts +18 -0
  153. package/dist/utils/errors.d.ts +3 -0
  154. package/dist/utils/fns.d.ts +48 -0
  155. package/dist/utils/headBinding.d.ts +85 -0
  156. package/dist/utils/integrity.d.ts +43 -0
  157. package/dist/utils/landmarkBounds.d.ts +11 -0
  158. package/dist/utils/logger.d.ts +7 -0
  159. package/package.json +113 -0
@@ -0,0 +1,26 @@
1
+ function b(t, n = 1e-3) {
2
+ const i = t.getAttribute("uv");
3
+ if (!i) return !1;
4
+ let u = 1 / 0, o = 1 / 0, f = -1 / 0, l = -1 / 0;
5
+ const c = i.count;
6
+ for (let s = 0; s < c; s++) {
7
+ const a = i.getX(s), e = i.getY(s);
8
+ a < u && (u = a), a > f && (f = a), e < o && (o = e), e > l && (l = e);
9
+ }
10
+ return Math.abs(u) <= n && Math.abs(o) <= n && Math.abs(f - 1) <= n && Math.abs(l - 1) <= n;
11
+ }
12
+ const r = /* @__PURE__ */ new Set();
13
+ function d(t, n) {
14
+ if (r.has(t)) return;
15
+ r.add(t), console.warn(
16
+ `[xr-sdk] Mesh "${n ?? t}" (id=${t}) has non-unit UV bounds; textureFit falls back to uvAspect=1`
17
+ );
18
+ }
19
+ function h() {
20
+ r.clear();
21
+ }
22
+ export {
23
+ h as _,
24
+ b as h,
25
+ d as l
26
+ };
@@ -0,0 +1 @@
1
+ "use strict";function U(n,t=.001){const s=n.getAttribute("uv");if(!s)return!1;let e=1/0,o=1/0,r=-1/0,l=-1/0;const c=s.count;for(let i=0;i<c;i++){const u=s.getX(i),a=s.getY(i);u<e&&(e=u),u>r&&(r=u),a<o&&(o=a),a>l&&(l=a)}return Math.abs(e)<=t&&Math.abs(o)<=t&&Math.abs(r-1)<=t&&Math.abs(l-1)<=t}const f=new Set;function d(n,t){if(f.has(n))return;f.add(n),console.warn(`[xr-sdk] Mesh "${t??n}" (id=${n}) has non-unit UV bounds; textureFit falls back to uvAspect=1`)}function b(){f.clear()}exports._resetUVBoundsWarnings=b;exports.hasFullUnitUVBounds=U;exports.logUVBoundsWarningOnce=d;
@@ -0,0 +1,39 @@
1
+ import { NormalizedLandmark } from '@mediapipe/tasks-vision';
2
+ import { FaceTrackingResult } from '../types/face';
3
+ import { XRMediaSourceKind } from '../types/compositor';
4
+ export type CalibrationMediaSourceKind = "webcam" | XRMediaSourceKind;
5
+ /**
6
+ * Map raw per-face MediaPipe landmark arrays into normalized
7
+ * `FaceTrackingResult`s (landmarks + axis-aligned bounds). Source-kind is
8
+ * accepted for future per-source handling; results stay in display space.
9
+ */
10
+ export declare const prepareCalibrationFaceResults: (faceLandmarks: NormalizedLandmark[][], _selectedSource: CalibrationMediaSourceKind) => FaceTrackingResult[];
11
+ /**
12
+ * Per-frame publish state for the face-results reader. Pure so the hold +
13
+ * throttle timing can be unit-tested without a RAF/React harness.
14
+ *
15
+ * - `publishedCount` — faces currently published to React (0 = cleared).
16
+ * - `lastPublishAt` — timestamp of the last non-empty publish (throttle anchor).
17
+ * - `lastNonEmptyAt` — timestamp of the last frame that had faces, or -1 if
18
+ * none has been seen yet (so the first empty run clears promptly).
19
+ */
20
+ export type FacePublishState = {
21
+ publishedCount: number;
22
+ lastPublishAt: number;
23
+ lastNonEmptyAt: number;
24
+ };
25
+ export declare const initialFacePublishState: FacePublishState;
26
+ export type FacePublishDecision = {
27
+ action: "publish" | "clear" | "none";
28
+ state: FacePublishState;
29
+ };
30
+ /**
31
+ * Decide what to do with a frame's face count given the prior state.
32
+ *
33
+ * - Non-empty: publish at most once per `throttleMs`; always records the frame
34
+ * as the latest non-empty so the hold window resets.
35
+ * - Empty: hold the last good result until faces have been absent for `holdMs`,
36
+ * then clear once. Bridges MediaPipe's isolated dropped-detection frames so
37
+ * the mesh does not blink off for a single frame.
38
+ */
39
+ export declare const decideFacePublish: (prev: FacePublishState, faceCount: number, now: number, throttleMs: number, holdMs: number) => FacePublishDecision;
@@ -0,0 +1,33 @@
1
+ import { CanvasTexture } from 'three';
2
+ import { XRModel } from '../constants';
3
+ export declare const useXRReady: () => boolean;
4
+ export declare const useXRError: () => {
5
+ error: string;
6
+ message: string;
7
+ } | undefined;
8
+ export declare const useXRCameraTexture: () => CanvasTexture | undefined;
9
+ export declare const useXRRenderSize: () => {
10
+ width: number;
11
+ height: number;
12
+ };
13
+ /**
14
+ * Read the live model node for `modelName`. Returns `null` until some
15
+ * component has acquired the model via `useXRModel(modelName)` and its
16
+ * initialize() has resolved.
17
+ *
18
+ * Type-parameterized so consumers can specify the concrete node type
19
+ * (e.g. `XRModelNodeFaceTracking`).
20
+ *
21
+ * Implementation note: we subscribe to the model INSTANCE (a stable
22
+ * reference) and derive the node via `useMemo`. Subscribing to the node
23
+ * directly would warn about unstable snapshots because most model classes
24
+ * build their node object literal on every `getModelNode()` call.
25
+ */
26
+ export declare const useXRModelNode: <T extends Record<string, unknown>>(modelName: XRModel) => T | null;
27
+ /**
28
+ * Snapshot of which models are currently registered. Useful for debugger
29
+ * overlays. The returned array is recomputed only when the underlying
30
+ * pipeline map identity changes (which the store guarantees only happens
31
+ * on actual add/remove).
32
+ */
33
+ export declare const useXRPipelineSnapshot: () => ReadonlyArray<XRModel>;
@@ -0,0 +1,23 @@
1
+ import { RefObject } from 'react';
2
+ import { XRMediaLayout } from '../types/compositor';
3
+ import { CalibrationMediaSourceKind } from './faceResults';
4
+ export type { CalibrationMediaSourceKind } from './faceResults';
5
+ export { prepareCalibrationFaceResults } from './faceResults';
6
+ export type CalibrationTrackerMode = "default" | "head-binding";
7
+ export declare const resolveCalibrationFaceDisplayMirrored: (_selectedSource: CalibrationMediaSourceKind, mirrored: boolean) => boolean;
8
+ export declare const useCalibrationFaceTracker: ({ enabled, displayMirrored, imageRef, layout, mode, numFaces, selectedSource, sourceStream, videoRef, }: {
9
+ enabled: boolean;
10
+ displayMirrored: boolean;
11
+ imageRef: RefObject<HTMLImageElement | null>;
12
+ layout: XRMediaLayout | null;
13
+ mode?: CalibrationTrackerMode;
14
+ numFaces?: number;
15
+ selectedSource: CalibrationMediaSourceKind;
16
+ sourceStream?: MediaStream | null;
17
+ videoRef: RefObject<HTMLVideoElement | null>;
18
+ }) => {
19
+ activeDelegate: "GPU";
20
+ faces: import('../types').FaceTrackingResult[];
21
+ status: "error" | "idle" | "ready" | "initializing";
22
+ error: string | null;
23
+ };
@@ -0,0 +1,25 @@
1
+ import { UseDebuggerReturn } from './types';
2
+ /**
3
+ * Hook to access debugger state and control functions
4
+ *
5
+ * @example
6
+ * ```tsx
7
+ * function CustomDebugUI() {
8
+ * const { metrics, enabled, toggle } = useDebugger();
9
+ *
10
+ * if (!enabled) return null;
11
+ *
12
+ * return (
13
+ * <div>
14
+ * <p>Camera FPS: {metrics.cameraFPS}</p>
15
+ * <p>Detection: {metrics.detectionTime}ms</p>
16
+ * <button onClick={toggle}>Hide</button>
17
+ * </div>
18
+ * );
19
+ * }
20
+ * ```
21
+ *
22
+ * @throws {Error} If used outside DebuggerProvider
23
+ * @returns Debugger state and control functions
24
+ */
25
+ export declare function useDebugger(): UseDebuggerReturn;
@@ -0,0 +1,20 @@
1
+ import { DebuggerMetrics } from '../../types/debugger';
2
+ /**
3
+ * Return type for useDebugger hook
4
+ */
5
+ export interface UseDebuggerReturn {
6
+ /** Current metrics */
7
+ metrics: DebuggerMetrics;
8
+ /** Whether the debugger is enabled (visible) */
9
+ enabled: boolean;
10
+ /** Whether the debugger UI is collapsed */
11
+ collapsed: boolean;
12
+ /** Toggle debugger visibility */
13
+ toggle: () => void;
14
+ /** Set collapsed state */
15
+ setCollapsed: (collapsed: boolean) => void;
16
+ /** Enable debugger */
17
+ enable: () => void;
18
+ /** Disable debugger */
19
+ disable: () => void;
20
+ }
@@ -0,0 +1,11 @@
1
+ import { BoundingBox } from '../types/face';
2
+ import { XRModelNodeFaceTracking } from '../types/nodes';
3
+ /**
4
+ * Track the axis-aligned bounding box of a detected face in normalized
5
+ * image space (0..1 across both axes). Updated on requestAnimationFrame
6
+ * and skips state updates when the box hasn't moved.
7
+ *
8
+ * Multiply the result by the container's width/height (or by 100 for
9
+ * percentage-based CSS positioning) at the call site.
10
+ */
11
+ export declare const useFaceBoundingBox: (faceNode: XRModelNodeFaceTracking | null) => BoundingBox | null;
@@ -0,0 +1,31 @@
1
+ import { CalibrationMediaSourceKind } from './faceResults';
2
+ import { FaceTrackingResult } from '../types/face';
3
+ import { XRModelNodeFaceTracking } from '../types/nodes';
4
+ /**
5
+ * Single RAF reader for a face-tracking node's detection results, shared by
6
+ * every consumer that needs normalized face results (XRViewport, the
7
+ * calibration tracker). Two cost guards keep it off the render hot path:
8
+ *
9
+ * 1. Reference dedup — `getDetectionResults()` returns a fresh object only
10
+ * when the model loop advances, so identical frames are skipped entirely
11
+ * (no reprocess, no setState).
12
+ * 2. Publish throttle — non-empty results are committed at most once per
13
+ * `throttleMs` so a steady stream of new detections does not force a
14
+ * React re-render every display frame.
15
+ * 3. Empty-frame hold — MediaPipe's VIDEO mode drops detection on the odd
16
+ * frame (motion blur, brief occlusion), which would otherwise clear the
17
+ * faces and blink the mesh off for a frame. Empty results are only
18
+ * published once faces have been absent for `holdMs`, so isolated misses
19
+ * are bridged by the last good frame.
20
+ *
21
+ * `onFrame` fires every tick the node is readable (regardless of whether
22
+ * faces changed) so callers can drive status/error state.
23
+ */
24
+ export declare const useFaceResults: ({ node, enabled, selectedSource, throttleMs, holdMs, onFrame, }: {
25
+ node: XRModelNodeFaceTracking | null;
26
+ enabled: boolean;
27
+ selectedSource: CalibrationMediaSourceKind;
28
+ throttleMs?: number;
29
+ holdMs?: number;
30
+ onFrame?: () => void;
31
+ }) => FaceTrackingResult[];
@@ -0,0 +1,53 @@
1
+ import { GestureData } from '../types/gesture-tracking';
2
+ export type GestureName = NonNullable<GestureData["gesture"]>;
3
+ export type UseGestureEdgeOptions = {
4
+ /** Gestures that should fire the trigger. */
5
+ gestures: GestureName | GestureName[];
6
+ /**
7
+ * Firing mode. `"arm"` (default) waits for a not-showing stretch before it
8
+ * can fire (raise a new gesture to advance). `"hold"` skips the arm gate and
9
+ * fires as soon as the trigger is held for `holdMs` (instruction-driven
10
+ * scenes where the hand is already up on mount).
11
+ */
12
+ mode?: "arm" | "hold";
13
+ /**
14
+ * `mode: "arm"` only. How long the user must hold a non-trigger gesture (or
15
+ * none) before the hook is armed and a subsequent trigger can fire. Defaults
16
+ * to 800ms — matches the value scripts were using.
17
+ */
18
+ debounceMs?: number;
19
+ /**
20
+ * `mode: "hold"` only. How long the trigger must be held continuously before
21
+ * it fires. Defaults to 200ms — long enough to reject a one-frame flicker,
22
+ * short enough to feel instant.
23
+ */
24
+ holdMs?: number;
25
+ /** Called once, with the matched gesture name, when the edge fires. */
26
+ onTrigger: (gesture: GestureName) => void;
27
+ /** Set to false to pause matching without unmounting. Defaults to true. */
28
+ enabled?: boolean;
29
+ };
30
+ /** Mutable per-instance state the frame reducer advances. */
31
+ export type GestureEdgeState = {
32
+ armed: boolean;
33
+ armStart: number | null;
34
+ holdStart: number | null;
35
+ fired: boolean;
36
+ };
37
+ export declare const initGestureEdgeState: () => GestureEdgeState;
38
+ /**
39
+ * Pure state-machine step for one frame. Advances `state` in place and returns
40
+ * the gesture that fired this frame (or null). Kept separate from the hook so
41
+ * the arm/hold timing is unit-testable without a renderer. `now` is the caller's
42
+ * clock (performance.now()); `isTrigger` is whether `gesture` is in the trigger
43
+ * set on this frame.
44
+ */
45
+ export declare const stepGestureEdge: (state: GestureEdgeState, { isTrigger, gesture, now, mode, debounceMs, holdMs, }: {
46
+ isTrigger: boolean;
47
+ gesture: GestureName | undefined;
48
+ now: number;
49
+ mode: "arm" | "hold";
50
+ debounceMs: number;
51
+ holdMs: number;
52
+ }) => GestureName | null;
53
+ export declare function useGestureEdge({ gestures, mode, debounceMs, holdMs, onTrigger, enabled, }: UseGestureEdgeOptions): void;
@@ -0,0 +1,40 @@
1
+ export interface UseMediaRecorderOptions {
2
+ /**
3
+ * Add an audio track to the recording. `true` opens the default microphone;
4
+ * pass a `MediaStream` to supply your own audio (e.g. a music mix), or a
5
+ * `MediaStreamConstraints["audio"]` to configure getUserMedia. Default: no
6
+ * audio (kiosk/silent contexts don't surface a mic prompt).
7
+ */
8
+ audio?: boolean | MediaStream | MediaTrackConstraints;
9
+ /** Force a container/codec; otherwise the first supported of mp4 → webm is used. */
10
+ mimeType?: string;
11
+ bitsPerSecond?: number;
12
+ onData?: (chunk: Blob) => void;
13
+ onStop?: (blob: Blob) => void;
14
+ /**
15
+ * Record this exact stream as-is (no track assembly, no getUserMedia). Use
16
+ * when you've already composed the stream you want (e.g. canvas + music).
17
+ */
18
+ passThroughStream?: MediaStream;
19
+ }
20
+ /**
21
+ * Record a `MediaStream` (typically a canvas capture stream) to a `Blob`.
22
+ *
23
+ * `start(stream)` assembles the recording stream — the video tracks from the
24
+ * input, plus an optional audio track per `audio` — picks the first supported
25
+ * codec, and begins recording. `stop()` finalizes; the `Blob` lands on
26
+ * `recordedBlob` (and `onStop`). Pass `passThroughStream` to record a
27
+ * pre-composed stream verbatim.
28
+ */
29
+ export declare function useMediaRecorder(opts?: UseMediaRecorderOptions): {
30
+ start: (inputStream: MediaStream, timeslice?: number) => Promise<void>;
31
+ stop: () => void;
32
+ pause: () => void;
33
+ resume: () => void;
34
+ clear: () => void;
35
+ isRecording: boolean;
36
+ isPaused: boolean;
37
+ recordedBlob: Blob | null;
38
+ error: Error | null;
39
+ getActiveStream: () => MediaStream | null;
40
+ };
@@ -0,0 +1,35 @@
1
+ import { TrackerType, TrackingTarget } from '../types/tracking';
2
+ import * as THREE from "three";
3
+ /**
4
+ * Per-frame resolver for a tracker's landmarks/joints.
5
+ *
6
+ * `TrackingAnchor` calls this with the requested `target` to get the
7
+ * world-space position (and optional rotation) of the resolved
8
+ * landmark each frame. The tracker is responsible for converting from
9
+ * its internal representation (face landmarks, hand coordinates, body
10
+ * pose) to a Three.js Vector3.
11
+ *
12
+ * Returning `null` means "this landmark is not currently detected" —
13
+ * the anchor should hide its children for that frame.
14
+ */
15
+ export type TrackerLandmarkResolver = (target: TrackingTarget) => {
16
+ position: THREE.Vector3;
17
+ quaternion?: THREE.Quaternion;
18
+ } | null;
19
+ export type TrackerContextValue = {
20
+ /** Which kind of tracker — used to validate `TrackingAnchor.target` namespace. */
21
+ type: TrackerType;
22
+ /**
23
+ * Resolver mounted by the tracker. Stable identity not required —
24
+ * `TrackingAnchor` reads it via the context and calls it inside
25
+ * `useFrame`.
26
+ */
27
+ resolveLandmark: TrackerLandmarkResolver;
28
+ };
29
+ export declare const TrackerContext: import('react').Context<TrackerContextValue | null>;
30
+ /**
31
+ * Read the nearest tracker context. Returns `null` outside any tracker —
32
+ * `TrackingAnchor` uses this to detect "no parent tracker" and render
33
+ * `null` with a warning.
34
+ */
35
+ export declare const useTrackerContext: () => TrackerContextValue | null;
@@ -0,0 +1,15 @@
1
+ import { XRModel } from '../constants';
2
+ export type UseXRModelResult<T extends Record<string, unknown>> = {
3
+ ready: boolean;
4
+ node: T | null;
5
+ error: Error | null;
6
+ };
7
+ export declare function useXRModel<T extends Record<string, unknown>>(modelName: XRModel, options?: Record<string, unknown>,
8
+ /**
9
+ * Whether this consumer wants the model running. `false` pauses the model's
10
+ * per-frame inference (and its expensive GPU→CPU readback) whenever every
11
+ * consumer of the shared model is inactive — the model stays acquired and
12
+ * initialized, so flipping back to `true` resumes instantly with no re-init
13
+ * or registry re-acquire race. Defaults to `true` (always-on).
14
+ */
15
+ active?: boolean): UseXRModelResult<T>;
@@ -0,0 +1,4 @@
1
+ import { XRModel } from '../../constants';
2
+ import { BaseXRModel } from '../../models/Base';
3
+ import { Class } from '../../types';
4
+ export declare const modelCodeMap: Record<XRModel, Class<BaseXRModel>>;
@@ -0,0 +1,39 @@
1
+ import { Camera, Scene, WebGLRenderer } from 'three';
2
+ import { XRModel } from '../../constants';
3
+ import { RegisterXRPipelineParams, SetFrameSourceParams, SetMediaSourceParams, XRPerfConfig } from '../../types';
4
+ import { ModelRegistry } from './registry';
5
+ import { SessionStore } from './store';
6
+ export type SessionFacade = {
7
+ store: SessionStore;
8
+ registry: ModelRegistry;
9
+ setMediaSource: (params: SetMediaSourceParams) => Promise<void>;
10
+ setFrameSource: (params: SetFrameSourceParams) => Promise<void>;
11
+ start: () => Promise<void>;
12
+ stop: () => Promise<void>;
13
+ reset: () => Promise<void>;
14
+ /** @deprecated prefer `useXRModel` */
15
+ registerXRPipeline: (params: RegisterXRPipelineParams) => Promise<void>;
16
+ getModelNode: <T extends Record<string, unknown>>(modelCode: XRModel) => T;
17
+ captureFrame: () => string;
18
+ _setRenderTarget: (canvas: HTMLCanvasElement) => Promise<void>;
19
+ _setRenderSize: (width: number, height: number) => Promise<void>;
20
+ _setR3FState: (state: {
21
+ renderer: WebGLRenderer;
22
+ scene: Scene;
23
+ camera: Camera;
24
+ }) => void;
25
+ _getVideoElement: () => HTMLVideoElement | undefined;
26
+ /** Update the session perf config (targetFps / camRes). Applied to models on
27
+ * their next run; camRes takes effect on the next media (re)bind. */
28
+ _setPerf: (perf: XRPerfConfig | undefined) => void;
29
+ };
30
+ export declare const resolveSourceCanvasSize: ({ renderHeight, renderWidth, videoHeight, videoWidth, }: {
31
+ renderHeight: number;
32
+ renderWidth: number;
33
+ videoHeight: number;
34
+ videoWidth: number;
35
+ }) => {
36
+ height: number;
37
+ width: number;
38
+ };
39
+ export declare const createSessionFacade: (perf?: XRPerfConfig) => SessionFacade;
@@ -0,0 +1,5 @@
1
+ import { CanvasTexture } from 'three';
2
+ export declare const createVideoFromStream: (stream: MediaStream) => Promise<HTMLVideoElement>;
3
+ export declare const createCameraTexture: (source: OffscreenCanvas | HTMLCanvasElement) => CanvasTexture;
4
+ export declare const flipCanvasHorizontal: (source: HTMLVideoElement, dest: OffscreenCanvas) => void;
5
+ export declare const cropCanvasCover: (source: OffscreenCanvas, dest: OffscreenCanvas | HTMLCanvasElement, zoom?: number) => void;
@@ -0,0 +1,4 @@
1
+ import { XRPerfConfig } from '../../types';
2
+ import { SessionFacade } from './facade';
3
+ export type { SessionFacade } from './facade';
4
+ export declare const useXRSession: (perf?: XRPerfConfig) => SessionFacade;
@@ -0,0 +1,52 @@
1
+ import { XRModel } from '../../constants';
2
+ import { BaseXRModel } from '../../models/Base';
3
+ import { Class } from '../../types';
4
+ import { SessionStore } from './store';
5
+ export type ModelRegistry = {
6
+ /**
7
+ * Acquire a model by name on behalf of `ownerId`. Increments the refcount,
8
+ * lazily instantiating + initializing on first acquire. Idempotent for the
9
+ * same `ownerId` — calling acquire twice with the same owner does not
10
+ * double-increment the refcount.
11
+ */
12
+ acquire: (modelName: XRModel, ownerId: string, options?: Record<string, unknown>) => Promise<BaseXRModel>;
13
+ /**
14
+ * Release the ref held by `ownerId`. If this was the last ref, the model
15
+ * is disposed and removed from the store's pipeline map.
16
+ */
17
+ release: (modelName: XRModel, ownerId: string) => void;
18
+ /**
19
+ * Mark `ownerId`'s interest in the model *running*. The model pauses its
20
+ * per-frame inference (and the expensive MediaPipe readback) when every
21
+ * owner is inactive, and resumes as soon as any owner goes active again —
22
+ * without releasing MediaPipe resources, so there's no re-init cost or
23
+ * registry re-acquire race. No-op if the owner never acquired the model.
24
+ * Owners are active by default, so callers that never call this keep the
25
+ * always-on behavior.
26
+ */
27
+ setActive: (modelName: XRModel, ownerId: string, active: boolean) => void;
28
+ /**
29
+ * Direct accessor — returns the registered model instance, or undefined.
30
+ * Does NOT throw. The session facade's `getModelNode` wraps this with the
31
+ * existing throw-on-missing semantics for backwards compat.
32
+ */
33
+ get: (modelName: XRModel) => BaseXRModel | undefined;
34
+ /**
35
+ * Acquire options recorded for a model (e.g. per-tracker `targetFps`). The
36
+ * facade reads this when calling `model.run()` so a per-tracker override
37
+ * beats the session-level default. Undefined if the model isn't registered.
38
+ */
39
+ getOptions: (modelName: XRModel) => Record<string, unknown> | undefined;
40
+ /**
41
+ * Force-release every model. Used by `session.reset()`.
42
+ */
43
+ releaseAll: () => void;
44
+ };
45
+ export declare const createModelRegistry: (store: SessionStore, modelCodeMap: Record<XRModel, Class<BaseXRModel>>,
46
+ /**
47
+ * Hook called with the model instance immediately after `initialize()`
48
+ * resolves, BEFORE the model is published to the store. The session
49
+ * facade uses this to attach the run loop / source canvas binding so the
50
+ * model is ready to render on the next frame.
51
+ */
52
+ onModelReady?: (modelName: XRModel, model: BaseXRModel) => Promise<void>) => ModelRegistry;
@@ -0,0 +1,40 @@
1
+ import { CanvasTexture } from 'three';
2
+ import { XRMediaSource, XRModel } from '../../constants';
3
+ import { XRMediaSourceKind } from '../../types/compositor';
4
+ import { BaseXRModel } from '../../models/Base';
5
+ export type SessionLifecycleState = "idle" | "media-bound" | "running" | "stopped";
6
+ export type SessionState = {
7
+ lifecycle: SessionLifecycleState;
8
+ ready: boolean;
9
+ error: {
10
+ error: string;
11
+ message: string;
12
+ } | undefined;
13
+ cameraTexture: CanvasTexture | undefined;
14
+ renderWidth: number;
15
+ renderHeight: number;
16
+ source: XRMediaSource | undefined;
17
+ sourceKind: "webcam" | XRMediaSourceKind | undefined;
18
+ /**
19
+ * Active model instances by `XRModel` code. The Map identity is replaced
20
+ * (not mutated in place) on every add/remove so subscribers comparing
21
+ * snapshots see a change.
22
+ */
23
+ pipeline: ReadonlyMap<XRModel, BaseXRModel>;
24
+ };
25
+ export type SessionStore = {
26
+ getSnapshot: () => SessionState;
27
+ /**
28
+ * Apply a partial update to the state. Notifies all subscribers exactly
29
+ * once. Only the keys present in `patch` change; other keys keep their
30
+ * existing reference. The top-level state object identity is replaced.
31
+ */
32
+ set: (patch: Partial<SessionState>) => void;
33
+ /**
34
+ * Replace the pipeline map with a new map containing the given mutation.
35
+ * Returns the new map identity so callers can hand it to consumers.
36
+ */
37
+ setPipeline: (mutate: (current: Map<XRModel, BaseXRModel>) => void) => ReadonlyMap<XRModel, BaseXRModel>;
38
+ subscribe: (listener: () => void) => () => void;
39
+ };
40
+ export declare const createSessionStore: () => SessionStore;
@@ -0,0 +1 @@
1
+ "use strict";const T=require("react/jsx-runtime"),b=require("@react-three/fiber"),t=require("react"),M=require("./index-PtFmD6B8.cjs"),L=require("three");function P(e){const n=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const s in e)if(s!=="default"){const o=Object.getOwnPropertyDescriptor(e,s);Object.defineProperty(n,s,o.get?o:{enumerable:!0,get:()=>e[s]})}}return n.default=e,Object.freeze(n)}const g=P(L),v=t.createContext(null),U=()=>t.useContext(v);function j(e,n,s=!0){const{session:o}=M.useXRContext(),a=t.useId(),[l,p]=t.useState(null),u=t.useMemo(()=>JSON.stringify(n??{}),[n]);t.useEffect(()=>{let R=!1;return p(null),o.registry.acquire(e,a,n).catch(d=>{R||p(d instanceof Error?d:new Error(String(d)))}),()=>{R=!0,o.registry.release(e,a)}},[o,e,a,u]),t.useEffect(()=>{o.registry.setActive(e,a,s)},[o,e,a,s]);const f=o.store,E=t.useSyncExternalStore(R=>f.subscribe(R),()=>f.getSnapshot().pipeline.get(e)??null,()=>null),m=t.useMemo(()=>E?E.getModelNode():null,[E]);return{ready:E!==null&&l===null,node:m,error:l}}const q=(e,n,s)=>M.unprojectToZZeroInto(e,n,s),H=(e,n,s)=>{const o=(e.x-.5)*2,a=(.5-e.y)*2,l=g.MathUtils.clamp(e.z*2,-1,1);return s.set(o,a,l).unproject(n)},I=(e,n,s,o,a,l)=>{const p=Math.min(n,e.length);for(let u=0;u<p;u++){a(e[u],o,l);const f=u*3;s[f]=l.x,s[f+1]=l.y,s[f+2]=l.z}return p},X=[[127,34,139],[11,0,37],[232,231,120],[72,37,39],[128,121,47],[232,121,128],[104,69,67],[175,171,148],[118,50,101],[73,39,40],[9,151,108],[48,115,131],[194,204,211],[74,40,185],[80,42,183],[40,92,186],[230,229,118],[202,212,214],[83,18,17],[76,61,146],[160,29,30],[56,157,173],[106,204,194],[135,214,192],[203,165,98],[21,71,68],[51,45,4],[144,24,23],[77,146,91],[205,50,187],[201,200,18],[91,106,182],[90,91,181],[85,84,17],[206,203,36],[148,171,140],[92,40,39],[193,189,244],[159,158,28],[247,246,161],[236,3,196],[54,68,104],[193,168,8],[117,228,31],[189,193,55],[98,97,99],[126,47,100],[166,79,218],[155,154,26],[209,49,131],[135,136,150],[47,126,217],[223,52,53],[45,51,134],[211,170,140],[67,69,108],[43,106,91],[230,119,120],[226,130,247],[63,53,52],[238,20,242],[46,70,156],[78,62,96],[46,53,63],[143,34,227],[123,117,111],[44,125,19],[236,134,51],[216,206,205],[154,153,22],[39,37,167],[200,201,208],[36,142,100],[57,212,202],[20,60,99],[28,158,157],[35,226,113],[160,159,27],[204,202,210],[113,225,46],[43,202,204],[62,76,77],[137,123,116],[41,38,72],[203,129,142],[64,98,240],[49,102,64],[41,73,74],[212,216,207],[42,74,184],[169,170,211],[170,149,176],[105,66,69],[122,6,168],[123,147,187],[96,77,90],[65,55,107],[89,90,180],[101,100,120],[63,105,104],[93,137,227],[15,86,85],[129,102,49],[14,87,86],[55,8,9],[100,47,121],[145,23,22],[88,89,179],[6,122,196],[88,95,96],[138,172,136],[215,58,172],[115,48,219],[42,80,81],[195,3,51],[43,146,61],[171,175,199],[81,82,38],[53,46,225],[144,163,110],[52,65,66],[229,228,117],[34,127,234],[107,108,69],[109,108,151],[48,64,235],[62,78,191],[129,209,126],[111,35,143],[117,123,50],[222,65,52],[19,125,141],[221,55,65],[3,195,197],[25,7,33],[220,237,44],[70,71,139],[122,193,245],[247,130,33],[71,21,162],[170,169,150],[188,174,196],[216,186,92],[2,97,167],[141,125,241],[164,167,37],[72,38,12],[38,82,13],[63,68,71],[226,35,111],[101,50,205],[206,92,165],[209,198,217],[165,167,97],[220,115,218],[133,112,243],[239,238,241],[214,135,169],[190,173,133],[171,208,32],[125,44,237],[86,87,178],[85,86,179],[84,85,180],[83,84,181],[201,83,182],[137,93,132],[76,62,183],[61,76,184],[57,61,185],[212,57,186],[214,207,187],[34,143,156],[79,239,237],[123,137,177],[44,1,4],[201,194,32],[64,102,129],[213,215,138],[59,166,219],[242,99,97],[2,94,141],[75,59,235],[24,110,228],[25,130,226],[23,24,229],[22,23,230],[26,22,231],[112,26,232],[189,190,243],[221,56,190],[28,56,221],[27,28,222],[29,27,223],[30,29,224],[247,30,225],[238,79,20],[166,59,75],[60,75,240],[147,177,215],[20,79,166],[187,147,213],[112,233,244],[233,128,245],[128,114,188],[114,217,174],[131,115,220],[217,198,236],[198,131,134],[177,132,58],[143,35,124],[110,163,7],[228,110,25],[356,389,368],[11,302,267],[452,350,349],[302,303,269],[357,343,277],[452,453,357],[333,332,297],[175,152,377],[347,348,330],[303,304,270],[9,336,337],[278,279,360],[418,262,431],[304,408,409],[310,415,407],[270,409,410],[450,348,347],[422,430,434],[313,314,17],[306,307,375],[387,388,260],[286,414,398],[335,406,418],[364,367,416],[423,358,327],[251,284,298],[281,5,4],[373,374,253],[307,320,321],[425,427,411],[421,313,18],[321,405,406],[320,404,405],[315,16,17],[426,425,266],[377,400,369],[322,391,269],[417,465,464],[386,257,258],[466,260,388],[456,399,419],[284,332,333],[417,285,8],[346,340,261],[413,441,285],[327,460,328],[355,371,329],[392,439,438],[382,341,256],[429,420,360],[364,394,379],[277,343,437],[443,444,283],[275,440,363],[431,262,369],[297,338,337],[273,375,321],[450,451,349],[446,342,467],[293,334,282],[458,461,462],[276,353,383],[308,324,325],[276,300,293],[372,345,447],[352,345,340],[274,1,19],[456,248,281],[436,427,425],[381,256,252],[269,391,393],[200,199,428],[266,330,329],[287,273,422],[250,462,328],[258,286,384],[265,353,342],[387,259,257],[424,431,430],[342,353,276],[273,335,424],[292,325,307],[366,447,345],[271,303,302],[423,266,371],[294,455,460],[279,278,294],[271,272,304],[432,434,427],[272,407,408],[394,430,431],[395,369,400],[334,333,299],[351,417,168],[352,280,411],[325,319,320],[295,296,336],[319,403,404],[330,348,349],[293,298,333],[323,454,447],[15,16,315],[358,429,279],[14,15,316],[285,336,9],[329,349,350],[374,380,252],[318,402,403],[6,197,419],[318,319,325],[367,364,365],[435,367,397],[344,438,439],[272,271,311],[195,5,281],[273,287,291],[396,428,199],[311,271,268],[283,444,445],[373,254,339],[282,334,296],[449,347,346],[264,447,454],[336,296,299],[338,10,151],[278,439,455],[292,407,415],[358,371,355],[340,345,372],[346,347,280],[442,443,282],[19,94,370],[441,442,295],[248,419,197],[263,255,359],[440,275,274],[300,383,368],[351,412,465],[263,467,466],[301,368,389],[395,378,379],[412,351,419],[436,426,322],[2,164,393],[370,462,461],[164,0,267],[302,11,12],[268,12,13],[293,300,301],[446,261,340],[330,266,425],[426,423,391],[429,355,437],[391,327,326],[440,457,438],[341,382,362],[459,457,461],[434,430,394],[414,463,362],[396,369,262],[354,461,457],[316,403,402],[315,404,403],[314,405,404],[313,406,405],[421,418,406],[366,401,361],[306,408,407],[291,409,408],[287,410,409],[432,436,410],[434,416,411],[264,368,383],[309,438,457],[352,376,401],[274,275,4],[421,428,262],[294,327,358],[433,416,367],[289,455,439],[462,370,326],[2,326,370],[305,460,455],[254,449,448],[255,261,446],[253,450,449],[252,451,450],[256,452,451],[341,453,452],[413,464,463],[441,413,414],[258,442,441],[257,443,442],[259,444,443],[260,445,444],[467,342,445],[459,458,250],[289,392,290],[290,328,460],[376,433,435],[250,290,392],[411,416,433],[341,463,464],[453,464,465],[357,465,412],[343,412,399],[360,363,440],[437,399,456],[420,456,363],[401,435,288],[372,383,353],[339,255,249],[448,261,255],[133,243,190],[133,155,112],[33,246,247],[33,130,25],[398,384,286],[362,398,414],[362,463,341],[263,359,467],[263,249,255],[466,467,260],[75,60,166],[238,239,79],[162,127,139],[72,11,37],[121,232,120],[73,72,39],[114,128,47],[233,232,128],[103,104,67],[152,175,148],[119,118,101],[74,73,40],[107,9,108],[49,48,131],[32,194,211],[184,74,185],[191,80,183],[185,40,186],[119,230,118],[210,202,214],[84,83,17],[77,76,146],[161,160,30],[190,56,173],[182,106,194],[138,135,192],[129,203,98],[54,21,68],[5,51,4],[145,144,23],[90,77,91],[207,205,187],[83,201,18],[181,91,182],[180,90,181],[16,85,17],[205,206,36],[176,148,140],[165,92,39],[245,193,244],[27,159,28],[30,247,161],[174,236,196],[103,54,104],[55,193,8],[111,117,31],[221,189,55],[240,98,99],[142,126,100],[219,166,218],[112,155,26],[198,209,131],[169,135,150],[114,47,217],[224,223,53],[220,45,134],[32,211,140],[109,67,108],[146,43,91],[231,230,120],[113,226,247],[105,63,52],[241,238,242],[124,46,156],[95,78,96],[70,46,63],[116,143,227],[116,123,111],[1,44,19],[3,236,51],[207,216,205],[26,154,22],[165,39,167],[199,200,208],[101,36,100],[43,57,202],[242,20,99],[56,28,157],[124,35,113],[29,160,27],[211,204,210],[124,113,46],[106,43,204],[96,62,77],[227,137,116],[73,41,72],[36,203,142],[235,64,240],[48,49,64],[42,41,74],[214,212,207],[183,42,184],[210,169,211],[140,170,176],[104,105,69],[193,122,168],[50,123,187],[89,96,90],[66,65,107],[179,89,180],[119,101,120],[68,63,104],[234,93,227],[16,15,85],[209,129,49],[15,14,86],[107,55,9],[120,100,121],[153,145,22],[178,88,179],[197,6,196],[89,88,96],[135,138,136],[138,215,172],[218,115,219],[41,42,81],[5,195,51],[57,43,61],[208,171,199],[41,81,38],[224,53,225],[24,144,110],[105,52,66],[118,229,117],[227,34,234],[66,107,69],[10,109,151],[219,48,235],[183,62,191],[142,129,126],[116,111,143],[118,117,50],[223,222,52],[94,19,141],[222,221,65],[196,3,197],[45,220,44],[156,70,139],[188,122,245],[139,71,162],[149,170,150],[122,188,196],[206,216,92],[164,2,167],[242,141,241],[0,164,37],[11,72,12],[12,38,13],[70,63,71],[31,226,111],[36,101,205],[203,206,165],[126,209,217],[98,165,97],[237,220,218],[237,239,241],[210,214,169],[140,171,32],[241,125,237],[179,86,178],[180,85,179],[181,84,180],[182,83,181],[194,201,182],[177,137,132],[184,76,183],[185,61,184],[186,57,185],[216,212,186],[192,214,187],[139,34,156],[218,79,237],[147,123,177],[45,44,4],[208,201,32],[98,64,129],[192,213,138],[235,59,219],[141,242,97],[97,2,141],[240,75,235],[229,24,228],[31,25,226],[230,23,229],[231,22,230],[232,26,231],[233,112,232],[244,189,243],[189,221,190],[222,28,221],[223,27,222],[224,29,223],[225,30,224],[113,247,225],[99,60,240],[213,147,215],[60,20,166],[192,187,213],[243,112,244],[244,233,245],[245,128,188],[188,114,174],[134,131,220],[174,217,236],[236,198,134],[215,177,58],[156,143,124],[25,110,7],[31,228,25],[264,356,368],[0,11,267],[451,452,349],[267,302,269],[350,357,277],[350,452,357],[299,333,297],[396,175,377],[280,347,330],[269,303,270],[151,9,337],[344,278,360],[424,418,431],[270,304,409],[272,310,407],[322,270,410],[449,450,347],[432,422,434],[18,313,17],[291,306,375],[259,387,260],[424,335,418],[434,364,416],[391,423,327],[301,251,298],[275,281,4],[254,373,253],[375,307,321],[280,425,411],[200,421,18],[335,321,406],[321,320,405],[314,315,17],[423,426,266],[396,377,369],[270,322,269],[413,417,464],[385,386,258],[248,456,419],[298,284,333],[168,417,8],[448,346,261],[417,413,285],[326,327,328],[277,355,329],[309,392,438],[381,382,256],[279,429,360],[365,364,379],[355,277,437],[282,443,283],[281,275,363],[395,431,369],[299,297,337],[335,273,321],[348,450,349],[359,446,467],[283,293,282],[250,458,462],[300,276,383],[292,308,325],[283,276,293],[264,372,447],[346,352,340],[354,274,19],[363,456,281],[426,436,425],[380,381,252],[267,269,393],[421,200,428],[371,266,329],[432,287,422],[290,250,328],[385,258,384],[446,265,342],[386,387,257],[422,424,430],[445,342,276],[422,273,424],[306,292,307],[352,366,345],[268,271,302],[358,423,371],[327,294,460],[331,279,294],[303,271,304],[436,432,427],[304,272,408],[395,394,431],[378,395,400],[296,334,299],[6,351,168],[376,352,411],[307,325,320],[285,295,336],[320,319,404],[329,330,349],[334,293,333],[366,323,447],[316,15,315],[331,358,279],[317,14,316],[8,285,9],[277,329,350],[253,374,252],[319,318,403],[351,6,419],[324,318,325],[397,367,365],[288,435,397],[278,344,439],[310,272,311],[248,195,281],[375,273,291],[175,396,199],[312,311,268],[276,283,445],[390,373,339],[295,282,296],[448,449,346],[356,264,454],[337,336,299],[337,338,151],[294,278,455],[308,292,415],[429,358,355],[265,340,372],[352,346,280],[295,442,282],[354,19,370],[285,441,295],[195,248,197],[457,440,274],[301,300,368],[417,351,465],[251,301,389],[394,395,379],[399,412,419],[410,436,322],[326,2,393],[354,370,461],[393,164,267],[268,302,12],[312,268,13],[298,293,301],[265,446,340],[280,330,425],[322,426,391],[420,429,437],[393,391,326],[344,440,438],[458,459,461],[364,434,394],[428,396,262],[274,354,457],[317,316,402],[316,315,403],[315,314,404],[314,313,405],[313,421,406],[323,366,361],[292,306,407],[306,291,408],[291,287,409],[287,432,410],[427,434,411],[372,264,383],[459,309,457],[366,352,401],[1,274,4],[418,421,262],[331,294,358],[435,433,367],[392,289,439],[328,462,326],[94,2,370],[289,305,455],[339,254,448],[359,255,446],[254,253,449],[253,252,450],[252,256,451],[256,341,452],[414,413,463],[286,441,414],[286,258,441],[258,257,442],[257,259,443],[259,260,444],[260,467,445],[309,459,250],[305,289,290],[305,290,460],[401,376,435],[309,250,392],[376,411,433],[453,341,464],[357,453,465],[343,357,412],[437,343,399],[344,360,440],[420,437,456],[360,420,363],[361,401,288],[265,372,353],[390,339,249],[339,448,255],[255,339,448]].flat(),z=[.5104879319667817,.33515610277652746,.5174233198165894,.43859300494194037,.5123749554157258,.406469448208809,.5423470318317414,.5244461464881898,.5190713584423066,.46557595014572145,.5194876372814179,.5006013351678849,.5178673148155213,.5855525898933411,.7009655416011811,.5918984371423721,.5193980515003205,.6528422343730926,.520683366060257,.689273599088192,.5248700261116028,.8232529717683792,.5099657952785492,.32301718473434454,.5088536620140076,.31080526888370513,.5081197202205658,.3013389307260514,.5072353065013886,.29900476515293123,.5073091566562653,.28442813932895666,.5065075337886811,.26649361431598667,.5061309516429902,.24778731942176818,.5031875848770142,.22179436564445493,.515326726436615,.4231037962436676,.5375777959823609,.4205444622039795,.8049442350864411,.6867966356873512,.6222659975290299,.570705144405365,.6496635556221009,.567776631116867,.6773027807474137,.5670208501815797,.7126377105712891,.5800703662633897,.5999099642038346,.5764724123477936,.674340370297432,.6495546865463258,.639536875486374,.6477413746714593,.703840109705925,.642201315164566,.7209078550338746,.6294069054722786,.7342745542526246,.5601695317029953,.6015644401311875,.18118685364723203,.7114282578229905,.598883952498436,.809715884923935,.5682615923881531,.7667155593633652,.5767241555452347,.6445030301809311,.45154162526130676,.541424173116684,.34213731765747074,.5359058856964112,.3113374251127243,.5710002213716507,.33134433805942537,.5891562283039093,.31890978991985325,.5585465461015702,.3096196609735489,.5759132236242295,.30601608335971836,.6229794204235077,.2713706839084626,.5398103773593903,.43802148282527925,.545369166135788,.46441581428051,.7616913348436356,.6473416510224344,.5914883643388749,.5243312466144563,.5945767045021058,.44076132655143746,.5964909076690674,.4544808346033096,.7225886166095734,.4498931097984314,.5443432211875916,.49703910827636727,.7029067009687424,.6777765545248986,.7391736537218094,.6677046212553979,.7836920201778412,.7359224516153335,.577455359697342,.6573990839719772,.6085408657789231,.6353888112306596,.6427326381206513,.298196165561676,.7550604224205018,.30743678390979773,.5732827365398407,.4262381809949875,.5523188143968583,.417594336271286,.6096987754106522,.29745593249797825,.6036115020513535,.2985246556997299,.7549919366836548,.6845966669917107,.592850747704506,.4273046988248826,.6501948565244675,.6762702855467797,.6582381755113602,.699515787065029,.682483646273613,.802994977235794,.768890205025673,.710366437137127,.6672395795583725,.752104974091053,.7775519520044327,.6584857258200645,.7920276552438736,.6709628927707671,.5397542297840119,.3256357330083847,.5643998861312867,.3199443298578262,.5826229482889176,.313130943775177,.5657853364944458,.42035281538963326,.606510478258133,.2980171996355057,.5952901721000672,.2918463486433029,.5999826073646546,.29865378022193906,.565356719493866,.4374908703565598,.570739108324051,.30172707617282873,.5532697021961213,.303354971408844,.532040822505951,.3026815611124039,.5385064661502839,.22311560392379765,.5377482950687409,.25083183526992797,.5373399734497071,.26933391273021695,.5351483404636384,.28629542768001554,.5317461371421814,.3004490631818772,.5704152762889863,.30009212374687194,.5761924862861634,.2931597578525544,.5817892730236054,.28451425909996036,.5862761169672013,.27445026516914367,.6169582635164261,.3500816184282303,.7930811375379563,.4456584650278092,.5136566936969758,.41420710563659674,.5836256474256516,.29897587478160864,.5893380820751191,.29504160165786747,.5458188831806183,.4063113230466843,.581692311167717,.41034119904041294,.5490593492984772,.4114610868692398,.6189475685358048,.5063568043708802,.6631498366594315,.48547921061515814,.5990702986717225,.44076220870018007,.7452016949653626,.7754116746783257,.729542288184166,.7380649703741073,.7152380675077439,.6996659177541733,.6012845069169999,.2532631474733353,.5908916622400284,.6924743655323982,.6002487272024155,.7558749470114707,.611236396431923,.817432113289833,.6991332352161408,.5705236423015594,.7608276635408402,.5389788854122162,.5859951555728913,.5837152945995332,.7452233761548996,.6138822454214097,.5740126550197602,.542653586268425,.5829357832670212,.45267452478408815,.7883433729410172,.5171645599603654,.7431249052286149,.5203535276651383,.7091684520244599,.5116798001527787,.6566549122333527,.5192352938652038,.6176983743906022,.532645167708397,.590181502699852,.5458893078565599,.5431278228759766,.5780327129364013,.7785866141319275,.4588600414991379,.7662802815437317,.614813904762268,.528258103132248,.42353384375572206,.5884005159139634,.49679056286811835,.8132390558719635,.5690749335289003,.5698921114206315,.5609081107378007,.5997681200504303,.4383326607942582,.7258545190095902,.5959577548503876,.5829301953315735,.4692867088317872,.7767194837331772,.37870833754539496,.5859857678413392,.5927838939428329,.5655010223388672,.4863545227050781,.7103684276342392,.24216726005077366,.7039464592933655,.21081999421119696,.7955554753541947,.45157338261604313,.7394011497497559,.27975760281085965,.8023439675569535,.6235768947005271,.6065513819456101,.1520459520816803,.5237656712532044,.4144193726778031,.6113508373498917,.4744607317447663,.7872020035982132,.5706054615974427,.6744208365678788,.5840893256664277,.6509357273578644,.5835042405128479,.599469143152237,.28584001839160916,.76683469414711,.4027401643991471,.5548133134841919,.11242247700691227,.6348527550697327,.15134210765361789,.6676738739013672,.17523885548114776,.5231557369232178,.758142014145851,.49590798020362853,.10746171355247497,.6282390981912613,.5856175380945206,.6072420954704285,.5888098138570785,.592762503027916,.5906054276227952,.7843813925981522,.61877524882555,.610203567147255,.6159668180346489,.6345708996057511,.625477318763733,.6599059730768204,.6266139122843744,.6838259130716324,.6209151762723923,.6978932946920395,.6127474161982536,.8138886868953705,.6332776087522507,.690067994594574,.587394626736641,.5115295231342316,.3814830261468887,.593753132224083,.3682318288087845,.5745513767004014,.43174642801284796,.5468618154525757,.38006519258022314,.5175330221652985,.6183956491947173,.6776301890611649,.20638245522975923,.6439310491085053,.1795444029569626,.5587406486272812,.13319884419441225,.7303948730230332,.25156523168087,.5936179041862488,.6020026791095734,.5595558166503907,.5354639637470247,.49903409481048583,.12705478847026824,.5986292988061905,.12926876127719883,.7810411036014557,.3901792484521866,.5526776045560837,.3004089254140854,.5582781463861466,.2904709684848786,.5625745087862015,.2769930589199066,.5656344175338746,.26021293580532073,.5736826092004776,.23544175803661344,.5897697389125824,.3026730704307556,.5960018962621689,.3050022739171982,.6013990819454194,.30801084220409397,.6334722220897675,.32613734483718876,.7345953911542893,.3890004771947861,.5586504369974137,.5622388321161271,.5686756849288941,.6147718372941018,.5835970371961594,.6114995065331459,.58382708132267,.30018893957138065,.7323651343584061,.3204736191034317,.5478970587253571,.6144195291399956,.5885591685771943,.20925473153591162,.5188342511653901,.5294416445493699,.5430448532104493,.5502454686164857,.5189176678657532,.5563708889484407,.5749752998352051,.4918947476148606,.5015926539897919,.1563655036687851,.5023517191410065,.19124654710292815,.5467969954013825,.1949619370698929,.6493796885013581,.2596786844730377,.6223085105419159,.4147812741994858,.6219283074140549,.2305004018545151,.6836527764797211,.41583852946758276,.6457133769989014,.38482945740222935,.7015091359615326,.3687519657611847,.5560723870992661,.1615346747636795,.5877480685710907,.4753766226768494,.672212439775467,.23758670270442966,.6372418433427811,.20715841531753537,.6714329898357392,.2934120523929596,.7559577107429505,.3546825754642487,.7028004407882691,.28965476036071774,.7641248583793641,.3323610144853592,.6633666038513184,.34586538851261145,.5732450067996979,.5168171036243439,.5740206122398377,.4420601803064346,.5862565368413926,.4328912365436554,.5658091634511948,.46056721985340127,.5935333251953125,.6414948242902756,.643502163887024,.6581727835536004,.6862205892801285,.6599488797783852,.71900634765625,.6517863023281099,.7387710094451905,.6366994085907935,.7436862468719483,.5870225805044174,.8067718029022217,.5102852332592012,.719052392244339,.549573050737381,.6912373930215836,.5426725524663925,.6540380597114563,.5452089506387712,.6191460520029068,.5529706466197968,.5933077514171601,.5624450343847276,.5760908752679825,.5711276936531067,.8037864595651627,.5079354095458986,.5832139283418656,.42433229863643646,.5602819353342057,.5111040878295898,.5571386992931366,.44193623840808877,.5406022548675538,.42711933732032775,.5550468444824219,.43675835609436037,.5743813246488572,.4152073520421982,.5367868125438691,.42474128484725954,.5321040332317353,.41727378547191624,.5769275009632111,.5919214832782747,.5631695121526719,.5864408034086228,.555830317735672,.5819090950489045,.7057080000638962,.6055842030048371,.7297580271959305,.614007951617241,.49450652599334716,.5258826154470444,.30584611296653746,.6040364730358123,.4885244846343994,.4224347966909409,.188004332780838,.7111089858412742,.3873521864414215,.5786778944730759,.3588928759098053,.5761974024772645,.32972376346588134,.5772378969192504,.29263614416122435,.5937507289648056,.4124107241630554,.5837435233592987,.3437161326408386,.6627882960438729,.3795058310031891,.6574259343743325,.3114838480949402,.657741964161396,.2904722273349762,.6461278694868089,.2668101370334625,.5759735572338105,.3916287899017334,.18396661460399627,.2956514835357666,.6133467811346054,.17441000342369078,.5913206297159195,.23045413494110106,.5952582108974458,.3695909559726715,.4586390632390976,.4777859032154083,.34189285218715665,.4799880862236023,.31095413148403167,.4436598002910614,.32987600147724155,.42009713053703307,.3173161882162094,.4536511182785034,.3079365211725235,.431768137216568,.30468503117561346,.37606616616249083,.27423435926437384,.49449856877326964,.4396295297145844,.4917183697223663,.4654612708091736,.2524005055427551,.6652582022547722,.4289156973361969,.5291139262914657,.4268526315689087,.44427823305130004,.42474048137664794,.45817836105823523,.2809027314186096,.46354105353355407,.49383275508880614,.49885324716567997,.3271153151988983,.6924127805233002,.28349151015281676,.6843035730719567,.22369228601455687,.7584647151827812,.4591939032077789,.6617383736371993,.40913431644439696,.6426751393079757,.35715471506118773,.30240225076675414,.1987894058227539,.3237072455883026,.4482724845409393,.42876928627491,.4697932779788971,.4196605491638184,.39104996919631957,.2959751355648041,.3971476137638092,.29665681600570676,.26748310327529906,.7016683402657509,.4251814365386963,.4304117369651795,.3845069885253906,.6860294970870018,.3804918110370636,.7099798905849457,.35481985211372374,.8164000543951988,.2475942552089691,.730037857890129,.37163846492767333,.7639490339159964,.23443256616592406,.677293357551098,.2116762578487396,.6924480664730073,.4783883273601532,.32515374898910526,.44883744716644286,.3184075164794922,.42566208839416503,.31092865943908693,.45405327081680297,.4228447753190994,.3932682454586029,.2964416819810867,.4071350872516632,.290535255074501,.40034677386283873,.29673135757446295,.4610676050186157,.44076672971248626,.4361940503120422,.3005809444189072,.45694692730903624,.30211268544197084,.4812539994716644,.30183855772018436,.46574126482009887,.22492808878421783,.47153966426849364,.25130698263645174,.4740802526473999,.2694691020250321,.4768980026245117,.28705804526805884,.48090897798538207,.2996276724338532,.43501039147377013,.2992805469036102,.4293511092662811,.2932880002260208,.4233271360397339,.28415390133857726,.41761367321014403,.27479386210441586,.39445154666900634,.3538810330629349,.16652100086212157,.4672100204229355,.4183532476425171,.29779809594154355,.41378535628318786,.29400077641010286,.47695048451423644,.40816306352615356,.43489335775375365,.41207451105117804,.473628032207489,.41300628066062933,.3975309908390045,.5133917200565339,.34924407601356505,.4949547010660172,.4189921498298645,.44448454558849343,.27738903760910033,.7946441161632538,.29866914749145507,.7549788492918015,.3170970857143402,.7143296006321906,.39919986128807067,.2556870716810226,.4517517566680908,.6986333075165749,.44375439286231994,.7623249980807305,.4346091330051422,.8250303360819817,.3058603286743164,.5830274391174317,.235262531042099,.5560186910629272,.4279192566871643,.5892863947153091,.2622906148433685,.6309370476007461,.45053591132164,.5464099961519242,.44443781971931456,.45605955004692084,.20207332372665404,.5370177584886551,.25663607120513915,.5358516681194305,.29581143260002135,.5243526387214661,.3525206625461578,.5284005987644196,.39442025423049926,.5392975616455078,.42579718232154845,.5511161494255066,.49076547026634215,.5801296907663345,.20957841277122496,.47626241028308874,.23929433822631835,.6331100556254388,.5024659812450409,.4247821944952011,.432133811712265,.5009672063589097,.15906893014907836,.5940177994966507,.4492078602313995,.5648097443580629,.41579030752182006,.4419312763214112,.2798506796360016,.6113770532608032,.44294874668121337,.47275686144828805,.1783646523952484,.3979667472839356,.42730753421783446,.5981915760040284,.46777849197387694,.4889896112680436,.26486464142799376,.2499848622083664,.26026474237442015,.21801546096801755,.17761032581329345,.47220298230648045,.23215438723564147,.29172880232334136,.1906857371330261,.6463678139448166,.3811529755592346,.1541750180721283,.5033367156982422,.41569132089614874,.40528597235679625,.4797393995523453,.2049500823020935,.59123428940773,.3344294309616089,.5942869651317597,.35825960636138915,.5929379391670226,.4015964150428772,.28595646202564245,.21618961095809935,.4194869863986969,.43316020369529723,.11274379968643189,.34098224639892577,.1526068884134293,.3026312172412872,.17882644414901733,.3831480026245117,.5945327538251877,.40483357310295104,.5966399866342544,.419615763425827,.5973996269702913,.2160478115081787,.6388220790028571,.40051244497299193,.6220169800519944,.37555851340293883,.6336345481872558,.3499592423439026,.6373451414704323,.32648445963859557,.6342222797870636,.3108482539653778,.6266552078723908,.16784127354621886,.6591027337312698,.3177972316741943,.5982361245155334,.4220952868461609,.3706905978918075,.4483287215232849,.43451813936233524,.4753179132938385,.38104525983333587,.30160035490989684,.21209139108657843,.33879016637802123,.18215490162372588,.4353105306625366,.1335425513982773,.22725783586502074,.2627154815196991,.4187734603881836,.6076370733976364,.471796441078186,.5377814787626267,.3835057199001312,.13003402531147007,.18837626576423644,.4081169712543488,.4558822691440582,.3006539422273636,.45070006251335143,.29020555198192594,.44506027102470397,.276558490395546,.441160249710083,.26132532536983494,.42807196378707885,.237567846775055,.413764613866806,.300301303267479,.40849854350090026,.3033808845281601,.40325652360916137,.3060078132152558,.3719393193721771,.3296157675981522,.2585947096347809,.4027331072092057,.4712364852428436,.5652889716625213,.4525624096393585,.6187475714087487,.43274884223937987,.6166740807890891,.4197424530982971,.2985221195220948,.25107048749923705,.3324888157844544,.48253663182258605,.6165598976612092,.40862621665000914,.21186126053333282,.4922338902950287,.5517929780483246,.4509614884853363,.49562425196170806,.45456190705299376,.19553345918655402,.3438455045223236,.2646773803234101,.39053775668144225,.41997271955013277,.3724295377731323,.2345973211526871,.32362549304962157,.42551548063755035,.3627460479736328,.39166522800922393,.2982912242412567,.37974442124366764,.44216259121894835,.16258520364761353,.4327280104160309,.47912641644477844,.31535937190055846,.24389803588390352,.35182328820228576,.2114975947141648,.3249718725681305,.3009969878196716,.22358919978141784,.36996547162532806,.2854694604873657,.29810287833213805,.2033691883087158,.34796677708625795,.3403308272361755,.35305335700511936,.4522935628890991,.520306442975998,.45397244691848754,.4453733104467393,.4360526978969574,.4358169931173325,.4670851409435272,.463337938785553,.430365788936615,.6462299782037735,.3818374752998352,.6678127396106721,.3376319885253906,.6731280717253685,.3007634162902832,.6677066612243652,.2756028652191162,.6542664083838463,.25909878611564635,.6035455572605133,.17238967418670653,.5322284626960754,.28373541235923766,.5632325726747514,.3148886442184448,.5544471430778504,.35481600761413573,.554238184094429,.39195387363433837,.5604119020700455,.4199950277805328,.5684955823421478,.4408359706401825,.5755523312091828,.1607656955718994,.5315613377094268,.43638269901275634,.4271241891384125,.4722903251647949,.513996543288231,.4744726598262787,.4443250972032547,.48785080313682555,.4292660462856293,.4740713119506836,.43900651216506964,.443528014421463,.4168834346532822,.49345849752426146,.4267724323272705,.49457465410232543,.4177086848020554,.438745903968811,.5969951617717744,.4560649275779724,.5900395292043685,.4670982837677002,.5844003933668136,.3021982192993164,.6197374525666237,.27794389724731444,.6304952013492584,.6290517628192902,.6082503873109817,.601810845732689,.608769752383232,.6309714198112488,.6319623801112175,.657788547873497,.6077486652135848,.6277183473110199,.5834045577049256,.333698707818985,.6181534442305565,.3082489252090454,.6187389704585076,.3358501076698303,.6419334176182747,.3613401234149933,.618020570576191,.33353258967399596,.5936576622724534],N=468,K=N*3,S=({material:e,faceIndex:n=0,numFaces:s,visible:o=!0,children:a})=>{const{ready:l,node:p}=j(M.XRModel.FACE_TRACKER,s===void 0?void 0:{numFaces:s}),{camera:u}=b.useThree(),f=t.useRef(null),E=t.useRef(null),m=t.useRef(null),R=t.useRef(null),d=t.useRef(null),x=t.useRef(new g.Vector3),h=t.useMemo(()=>{const y=new Uint16Array(X),A=new g.BufferAttribute(y,1),r=new g.Float32BufferAttribute(z,2),i=new Float32Array(K),c=new g.Float32BufferAttribute(i,3);return c.setUsage(g.DynamicDrawUsage),{indexAttr:A,uvAttr:r,positionAttr:c,positions:i}},[]);t.useEffect(()=>{R.current=h.indexAttr,d.current=h.uvAttr,m.current=h.positionAttr,E.current=h.positions;const y=f.current;if(y){const A=y.geometry;A.setAttribute("position",h.positionAttr),A.setAttribute("uv",h.uvAttr),A.setIndex(h.indexAttr)}return()=>{R.current=null,d.current=null,m.current=null,E.current=null}},[h]),b.useFrame(()=>{var C;if(!l||!p||!f.current)return;const{detectionResults:y}=p,A=(C=y==null?void 0:y.faceLandmarks)==null?void 0:C[n],r=f.current.geometry,i=E.current,c=m.current;if(!A||A.length===0||!i||!c){r.drawRange.count!==0&&r.setDrawRange(0,0);return}r.getAttribute("position")!==c&&(r.setAttribute("position",c),r.setAttribute("uv",d.current),r.setIndex(R.current)),r.drawRange.count===0&&r.setDrawRange(0,1/0),I(A,N,i,u,q,x.current),c.needsUpdate=!0,r.computeVertexNormals()});const k=a!=null&&a!==!1;return T.jsxs("mesh",{material:e,ref:f,visible:o,children:[T.jsx("bufferGeometry",{}),!e&&!k&&T.jsx("meshStandardMaterial",{attach:"material",transparent:!0,depthWrite:!1,side:g.DoubleSide,needsUpdate:!0}),!e&&k?a:null]})};S.displayName="FaceMesh";const V={"face.forehead":10,"face.noseTip":1,"face.chin":152,"face.leftEyeOuter":263,"face.rightEyeOuter":33,"face.leftCheek":425,"face.rightCheek":205,"face.mouthCenter":13},Z=({faceIndex:e=0,numFaces:n,scaleWithFace:s=!1,targetFps:o,active:a=!0,children:l})=>{const p=t.useRef(!1),u=t.useRef(null),f=t.useMemo(()=>{if(!(n===void 0&&o===void 0))return{...n===void 0?{}:{numFaces:n},...o===void 0?{}:{targetFps:o}}},[n,o]),{ready:E,node:m}=j(M.XRModel.FACE_TRACKER,f,a),{camera:R}=b.useThree(),d=t.useRef(R);d.current!==R&&(d.current=R,p.current=!1);const x=t.useRef(null);b.useFrame(()=>{if(!E||!m||!u.current)return;x.current=m,!p.current&&d.current&&(m._setCamera(d.current,e),p.current=!0);const r=m.getFace(e);if(!r){u.current.visible=!1;return}u.current.visible=!0;const{position:i,rotation:c,scale:C}=r.transform;u.current.position.set(i.x,i.y,i.z),u.current.rotation.set(c.x,c.y,c.z),s?u.current.scale.set(C.x,C.y,C.z):u.current.scale.set(1,1,1)});const h=t.useCallback(r=>{var D,F;const i=V[r];if(i===void 0)return null;const c=x.current,C=(F=(D=c==null?void 0:c.detectionResults)==null?void 0:D.faceLandmarks)==null?void 0:F[e];if(!C||C.length===0)return null;const w=C[i];return w?{position:M.unprojectToZZero(w,d.current)}:null},[e]),k=t.useMemo(()=>({type:"face",resolveLandmark:h}),[h]);let y;const A=[];return t.Children.forEach(l,r=>{var i,c;t.isValidElement(r)&&(((i=r.type)==null?void 0:i.displayName)==="FaceTracker.Mesh"||((c=r.type)==null?void 0:c.displayName)==="FaceMesh")?y=t.cloneElement(r,{faceIndex:e,numFaces:n}):A.push(r)}),T.jsxs(v.Provider,{value:k,children:[T.jsx("group",{ref:u,renderOrder:M.RENDER_LAYERS.TRACKED,children:A}),y]})},O=e=>T.jsx(S,{...e});O.displayName="FaceTracker.Mesh";const _=Z;_.Mesh=O;const B=_;exports.FaceMesh=S;exports.FaceTracker=_;exports.HeadTracker=B;exports.TrackerContext=v;exports.projectLandmarkWithDepth=H;exports.useTrackerContext=U;exports.useXRModel=j;