@vincentt-xr/sdk 2.0.0-alpha.7 → 2.0.0-alpha.8

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 (275) hide show
  1. package/GROUNDING.md +1109 -13
  2. package/dist/{DebuggerUI-BjOMr8q_.js → DebuggerUI-C-ldiozL.js} +1 -1
  3. package/dist/{DebuggerUI-B6bP6P9r.cjs → DebuggerUI-CWX5EtQv.cjs} +1 -1
  4. package/dist/FaceMeshRenderer-BEEXZwS6.cjs +158 -0
  5. package/dist/FaceMeshRenderer-UuH5sTXG.js +1322 -0
  6. package/dist/FaceRetouch-C7h7x9kd.js +683 -0
  7. package/dist/FaceRetouch-DqftT26Y.cjs +134 -0
  8. package/dist/GLTFLoader-C5q63sKO.js +1633 -0
  9. package/dist/GLTFLoader-Cb_CRwmG.cjs +1 -0
  10. package/dist/SegmentationOverlay-DQuW3dsc.js +133 -0
  11. package/dist/SegmentationOverlay-aWVod8Kl.cjs +1 -0
  12. package/dist/assets/cache.d.ts +99 -0
  13. package/dist/assets/estimate.d.ts +11 -0
  14. package/dist/assets/index.d.ts +7 -0
  15. package/dist/assets/loaders.d.ts +28 -0
  16. package/dist/assets/react.d.ts +33 -0
  17. package/dist/calibration/calibration.d.ts +70 -0
  18. package/dist/calibration/index.d.ts +6 -0
  19. package/dist/calibration/storage.d.ts +13 -0
  20. package/dist/calibration/types.d.ts +53 -0
  21. package/dist/calibration/useXRCalibration.d.ts +46 -0
  22. package/dist/camera/CameraPermissionGate.d.ts +26 -0
  23. package/dist/camera/devices.d.ts +26 -0
  24. package/dist/camera/index.d.ts +8 -0
  25. package/dist/camera/permission.d.ts +86 -0
  26. package/dist/camera/useCameraPermission.d.ts +35 -0
  27. package/dist/capabilities/detect.d.ts +45 -0
  28. package/dist/capabilities/index.d.ts +5 -0
  29. package/dist/capabilities/types.d.ts +120 -0
  30. package/dist/capabilities/useXRCapabilities.d.ts +18 -0
  31. package/dist/compat/environment.d.ts +5 -0
  32. package/dist/compat/index.d.ts +4 -0
  33. package/dist/compat/run.d.ts +18 -0
  34. package/dist/compat/scenarios.d.ts +10 -0
  35. package/dist/compat/types.d.ts +101 -0
  36. package/dist/components/BodyTracker/index.d.ts +9 -0
  37. package/dist/components/FaceMesh/canonical/CanonicalFaceMeshRenderer.d.ts +33 -3
  38. package/dist/components/FaceMesh/canonical/parseCanonicalFaceModel.d.ts +12 -0
  39. package/dist/components/FaceMesh/canonical/shaders.d.ts +1 -1
  40. package/dist/components/FaceMesh/index.d.ts +1 -1
  41. package/dist/components/GestureListener/index.d.ts +11 -0
  42. package/dist/components/HandTracker/index.d.ts +10 -0
  43. package/dist/components/HolisticTracker/index.d.ts +69 -0
  44. package/dist/components/HolisticTracker/settings.d.ts +58 -0
  45. package/dist/components/HolisticTracker/signals.d.ts +49 -0
  46. package/dist/components/IrisEffect/IrisMaterial.d.ts +73 -0
  47. package/dist/components/IrisEffect/index.d.ts +51 -0
  48. package/dist/components/IrisEffect/settings.d.ts +117 -0
  49. package/dist/components/LipEffect/LipEffect.d.ts +7 -1
  50. package/dist/components/LipEffect/LipEffectMaterial.d.ts +43 -7
  51. package/dist/components/LipEffect/LipEffects.d.ts +9 -0
  52. package/dist/components/LipEffect/defaults.d.ts +27 -4
  53. package/dist/components/LipEffect/index.d.ts +11 -3
  54. package/dist/components/LipEffect/settings.d.ts +271 -0
  55. package/dist/components/LipEffect/types.d.ts +56 -9
  56. package/dist/components/LipEffect/useLipDesignTextures.d.ts +11 -0
  57. package/dist/components/LipEffect/uvGuide.d.ts +59 -0
  58. package/dist/components/PersonCutout/index.d.ts +50 -0
  59. package/dist/components/PersonCutout/personCutout.d.ts +16 -0
  60. package/dist/components/ScreenImage/components/ScreenImageBody.d.ts +1 -1
  61. package/dist/components/ScreenImage/index.d.ts +3 -1
  62. package/dist/components/ScreenImage/materials/ScreenImageBlendMaterial.d.ts +1 -1
  63. package/dist/components/ScreenImage/materials/ScreenImageMaskMaterial.d.ts +11 -0
  64. package/dist/components/ScreenImage/source.d.ts +6 -0
  65. package/dist/components/ScreenImage/types.d.ts +18 -0
  66. package/dist/components/SegmentationOverlay/SegmentationOverlay.d.ts +37 -0
  67. package/dist/components/SegmentationOverlay/SegmentationOverlayMaterial.d.ts +31 -0
  68. package/dist/components/SegmentationOverlay/index.d.ts +9 -0
  69. package/dist/components/SegmentationOverlay/maskTexture.d.ts +23 -0
  70. package/dist/components/SegmentationOverlay/providers.d.ts +72 -0
  71. package/dist/components/SegmentationOverlay/settings.d.ts +65 -0
  72. package/dist/components/XRProvider/index.d.ts +16 -2
  73. package/dist/components/XRViewport/hooks/useViewportExternalFaces.d.ts +1 -1
  74. package/dist/components/XRViewport/hooks/useViewportMediaSource.d.ts +1 -1
  75. package/dist/components/XRViewport/hooks/useViewportPipeline.d.ts +1 -1
  76. package/dist/components/index.d.ts +3 -0
  77. package/dist/constants/index.d.ts +4 -1
  78. package/dist/contexts-CO0sd4JQ.cjs +1 -0
  79. package/dist/{contexts-ByhzppYl.js → contexts-FzlnnMYD.js} +252 -246
  80. package/dist/coordinates/feed.d.ts +52 -0
  81. package/dist/coordinates/index.d.ts +5 -0
  82. package/dist/coordinates/spaces.d.ts +49 -0
  83. package/dist/coordinates/viewport.d.ts +22 -0
  84. package/dist/coordinates/world.d.ts +15 -0
  85. package/dist/debug-ui/gesture-settings/index.d.ts +14 -0
  86. package/dist/debug-ui/holistic-tracker-settings/index.d.ts +16 -0
  87. package/dist/debug-ui/index.d.ts +14 -0
  88. package/dist/debug-ui/iris-effect-settings/index.d.ts +12 -0
  89. package/dist/debug-ui/lip-effect-settings/index.d.ts +15 -0
  90. package/dist/debug-ui/media-source.cjs +1 -1
  91. package/dist/debug-ui/media-source.js +1 -1
  92. package/dist/debug-ui/product-hotspots/index.d.ts +24 -0
  93. package/dist/debug-ui/segmentation-overlay-settings/index.d.ts +12 -0
  94. package/dist/debug-ui/xr-diagnostics/index.d.ts +25 -0
  95. package/dist/debug-ui.cjs +3 -3
  96. package/dist/debug-ui.js +2057 -1687
  97. package/dist/detector-K8aej4MB.js +59 -0
  98. package/dist/detector-ijypGtse.cjs +1 -0
  99. package/dist/entries/core.d.ts +18 -1
  100. package/dist/entries/face-effects.d.ts +11 -3
  101. package/dist/entries/low-level.d.ts +22 -3
  102. package/dist/entries/product.d.ts +11 -0
  103. package/dist/entries/tracking.d.ts +24 -1
  104. package/dist/face-effects.cjs +155 -1
  105. package/dist/face-effects.js +1134 -2197
  106. package/dist/gestures/definitions.d.ts +85 -0
  107. package/dist/gestures/detector.d.ts +87 -0
  108. package/dist/gestures/index.d.ts +8 -0
  109. package/dist/gestures/measures.d.ts +101 -0
  110. package/dist/gestures/settings.d.ts +49 -0
  111. package/dist/{getFaceInfo-C4QpCQIY.js → getFaceInfo-BkZfaQs-.js} +5 -5
  112. package/dist/{getFaceInfo-fA1bFBub.cjs → getFaceInfo-ahPxQFGu.cjs} +1 -1
  113. package/dist/hooks/selectors.d.ts +68 -1
  114. package/dist/hooks/useCalibrationFaceTracker.d.ts +1 -1
  115. package/dist/hooks/useFaceInfo.d.ts +13 -1
  116. package/dist/hooks/useFaceInfos.d.ts +1 -1
  117. package/dist/hooks/useGesture.d.ts +32 -0
  118. package/dist/hooks/useIrisTracking.d.ts +45 -0
  119. package/dist/hooks/useXRDiagnostics.d.ts +81 -0
  120. package/dist/hooks/useXRModel.d.ts +7 -0
  121. package/dist/hooks/useXRSession/facade.d.ts +42 -2
  122. package/dist/hooks/useXRSession/index.d.ts +2 -2
  123. package/dist/hooks/useXRSession/reason.d.ts +3 -1
  124. package/dist/hooks/useXRSession/registry.d.ts +14 -0
  125. package/dist/hooks/useXRSession/store.d.ts +52 -3
  126. package/dist/index--RgGzZ6X.cjs +47 -0
  127. package/dist/{index-VJ0SJwmG.js → index-CHVbH0hz.js} +4 -4
  128. package/dist/index-CeVkgsag.cjs +1 -0
  129. package/dist/index-CnGox6Xr.js +3054 -0
  130. package/dist/{index-ByoNj0QP.js → index-CsUdQ-pn.js} +113 -111
  131. package/dist/{index-BjmTe9eM.cjs → index-DKBAh6hV.cjs} +1 -1
  132. package/dist/index-DsZwTfG0.cjs +1 -0
  133. package/dist/index-Dw6tj2Mi.js +144 -0
  134. package/dist/index-OCPjOaeP.cjs +1 -0
  135. package/dist/{index-DXT3WccE.js → index-s9pF4zkG.js} +1065 -1101
  136. package/dist/internal-BYza1h8_.cjs +1 -0
  137. package/dist/{internal-Dmk1cTXq.js → internal-vsfNQycj.js} +15 -16
  138. package/dist/internal.cjs +1 -1
  139. package/dist/internal.js +2 -2
  140. package/dist/iris/compute.d.ts +25 -0
  141. package/dist/iris/index.d.ts +4 -0
  142. package/dist/iris/lead.d.ts +19 -0
  143. package/dist/iris/types.d.ts +87 -0
  144. package/dist/landmarkMask-CbTFzBYG.js +224 -0
  145. package/dist/landmarkMask-u7es2k4X.cjs +1 -0
  146. package/dist/low-level.cjs +1 -1
  147. package/dist/low-level.js +1085 -634
  148. package/dist/main.cjs +1 -1
  149. package/dist/main.js +1519 -465
  150. package/dist/measures-9dQPdw96.js +154 -0
  151. package/dist/measures-KfJzpvod.cjs +1 -0
  152. package/dist/models/Base/index.d.ts +49 -0
  153. package/dist/models/Body/index.d.ts +1 -1
  154. package/dist/models/Face/index.d.ts +1 -1
  155. package/dist/models/Hand/GestureTracking.d.ts +1 -1
  156. package/dist/models/Hand/HandTracking.d.ts +1 -1
  157. package/dist/models/Holistic/index.d.ts +49 -0
  158. package/dist/models/Holistic/result.d.ts +68 -0
  159. package/dist/models/SemanticSegmentation/index.d.ts +31 -0
  160. package/dist/models/SemanticSegmentation/presets.d.ts +28 -0
  161. package/dist/models/index.d.ts +2 -0
  162. package/dist/product/ProductDimensions.d.ts +16 -0
  163. package/dist/product/ProductHotspot.d.ts +16 -0
  164. package/dist/product/ProductViewer.d.ts +9 -0
  165. package/dist/product/details.d.ts +53 -0
  166. package/dist/product/index.d.ts +14 -0
  167. package/dist/product/loadModelViewer.d.ts +4 -0
  168. package/dist/product/types.d.ts +71 -0
  169. package/dist/product/useProductAr.d.ts +37 -0
  170. package/dist/product/useProductDetails.d.ts +60 -0
  171. package/dist/product.cjs +1 -0
  172. package/dist/product.js +414 -0
  173. package/dist/providers-C0Dlhh9Z.js +365 -0
  174. package/dist/providers-YNwkmNeK.cjs +62 -0
  175. package/dist/quality/XRQualityController.d.ts +25 -0
  176. package/dist/quality/controller.d.ts +33 -0
  177. package/dist/quality/index.d.ts +6 -0
  178. package/dist/quality/types.d.ts +100 -0
  179. package/dist/quality/useXRQuality.d.ts +28 -0
  180. package/dist/{renderGroups-KZk6eRiY.js → renderGroups-CN1cGFUo.js} +1 -1
  181. package/dist/{renderGroups-80H3DpTl.cjs → renderGroups-O4KmaMl9.cjs} +1 -1
  182. package/dist/renderPasses-Cg-zqmEz.cjs +21 -0
  183. package/dist/renderPasses-NnKZVfBy.js +1460 -0
  184. package/dist/scene-object.cjs +1 -1
  185. package/dist/scene-object.js +2 -2
  186. package/dist/screenTransform-BenfCtZt.js +44 -0
  187. package/dist/screenTransform-BiXdpVf0.cjs +1 -0
  188. package/dist/segmentation-9PhSvc-R.cjs +1 -0
  189. package/dist/segmentation-CeOTKemr.js +5 -0
  190. package/dist/segmentation2d/faceMemory.d.ts +28 -0
  191. package/dist/segmentation2d/faceRegions.d.ts +24 -0
  192. package/dist/segmentation2d/index.d.ts +9 -0
  193. package/dist/segmentation2d/maskUv.d.ts +23 -0
  194. package/dist/segmentation2d/rasterize.d.ts +14 -0
  195. package/dist/segmentation2d/types.d.ts +46 -0
  196. package/dist/selectors-C5G1PMYL.js +195 -0
  197. package/dist/selectors-Du_PsVnW.cjs +1 -0
  198. package/dist/{session-CpkiK5YA.cjs → session-BBr0yN8h.cjs} +7 -7
  199. package/dist/{session-DLFN_VII.js → session-Cy0m7l7-.js} +76 -76
  200. package/dist/settings-DRR7-snV.cjs +1 -0
  201. package/dist/settings-aQk845NJ.js +73 -0
  202. package/dist/subjects/index.d.ts +2 -0
  203. package/dist/subjects/select.d.ts +62 -0
  204. package/dist/subjects/types.d.ts +55 -0
  205. package/dist/tracking-config/apply.d.ts +57 -0
  206. package/dist/tracking-config/index.d.ts +7 -0
  207. package/dist/tracking-config/resolve.d.ts +25 -0
  208. package/dist/tracking-config/storage.d.ts +8 -0
  209. package/dist/tracking-config/types.d.ts +106 -0
  210. package/dist/tracking-config/useXRTrackingConfig.d.ts +38 -0
  211. package/dist/tracking.cjs +1 -1
  212. package/dist/tracking.js +1056 -383
  213. package/dist/types/compositor.d.ts +21 -0
  214. package/dist/types/holistic.d.ts +121 -0
  215. package/dist/types/index.d.ts +1 -0
  216. package/dist/types/model.d.ts +22 -2
  217. package/dist/types/nodes.d.ts +27 -2
  218. package/dist/types/segmentation.d.ts +19 -0
  219. package/dist/types/session.d.ts +41 -3
  220. package/dist/useFaceInfo-Blf7FCu3.js +303 -0
  221. package/dist/useFaceInfo-C5mO8NQY.cjs +1 -0
  222. package/dist/useXRCapabilities-B1R2ghy-.cjs +1 -0
  223. package/dist/useXRCapabilities-C68v__wB.js +30 -0
  224. package/dist/utils/fns.d.ts +6 -3
  225. package/dist/utils/integrity.d.ts +4 -1
  226. package/dist/utils/updateThrottle.d.ts +2 -0
  227. package/dist/utils/useStableUniforms.d.ts +18 -0
  228. package/docs/api/adaptive-quality.mdx +104 -0
  229. package/docs/api/asset-lifecycle.mdx +78 -0
  230. package/docs/api/camera-permission.mdx +142 -0
  231. package/docs/api/coordinate-spaces.mdx +165 -0
  232. package/docs/api/cross-camera.mdx +88 -0
  233. package/docs/api/diagnostics-calibration.mdx +97 -0
  234. package/docs/api/face-effects.mdx +6 -0
  235. package/docs/api/face-mesh.mdx +4 -2
  236. package/docs/api/gestures.mdx +173 -0
  237. package/docs/api/holistic-tracker.mdx +159 -0
  238. package/docs/api/iris-tracking.mdx +242 -0
  239. package/docs/api/multi-subject.mdx +95 -0
  240. package/docs/api/person-cutout.mdx +136 -0
  241. package/docs/api/product-ar.mdx +111 -0
  242. package/docs/api/product-details.mdx +78 -0
  243. package/docs/api/screen-space-coordinates.mdx +4 -1
  244. package/docs/api/segmentation-overlay.mdx +301 -0
  245. package/docs/api/session-lifecycle.mdx +136 -0
  246. package/docs/api/trackers.mdx +5 -0
  247. package/docs/api/tracking-config.mdx +108 -0
  248. package/docs/docs.json +23 -1
  249. package/docs/examples/lip-shaders.mdx +224 -0
  250. package/docs/guides/lip-effect-textures.mdx +292 -0
  251. package/docs/guides/lip-uv-template.png +0 -0
  252. package/docs/guides/lip-uv-template.svg +1 -0
  253. package/package.json +13 -1
  254. package/dist/FaceMeshRenderer-C5l6VLdO.cjs +0 -155
  255. package/dist/FaceMeshRenderer-wjAHrJzP.js +0 -1270
  256. package/dist/FaceRetouch-BkJzoA79.cjs +0 -134
  257. package/dist/FaceRetouch-DwbKQJAN.js +0 -551
  258. package/dist/contexts-Dr62It_K.cjs +0 -1
  259. package/dist/index-9dlAQAhy.js +0 -1462
  260. package/dist/index-BpEf2BBb.cjs +0 -1
  261. package/dist/index-CyUUurQT.cjs +0 -1
  262. package/dist/index-DCiMbxC3.cjs +0 -1
  263. package/dist/index-DpI-qo5X.cjs +0 -17
  264. package/dist/index-DyVF4vEW.js +0 -111
  265. package/dist/internal-Cq-TEQ5Y.cjs +0 -1
  266. package/dist/renderLayers-lDtL0_43.cjs +0 -1
  267. package/dist/renderLayers-zrK2pv5O.js +0 -13
  268. package/dist/renderPasses-BOoBSr8z.cjs +0 -21
  269. package/dist/renderPasses-BcquyVtu.js +0 -1500
  270. package/dist/selectors-B8H97CKA.js +0 -59
  271. package/dist/selectors-CZLKT2Iv.cjs +0 -1
  272. package/dist/useFaceInfo-BJ8-_MOs.cjs +0 -1
  273. package/dist/useFaceInfo-Dk426LTu.js +0 -62
  274. package/dist/useFaceResults-CtetsO9M.js +0 -19
  275. package/dist/useFaceResults-wBJF3zyp.cjs +0 -1
@@ -0,0 +1,106 @@
1
+ import { XRQualityConfigInput } from '../quality/types';
2
+ import { XRCameraRequest } from '../types/compositor';
3
+ import { HolisticDelegate, HolisticHandsOption } from '../types/holistic';
4
+ import { XRLifecycleConfig, XRPerfConfig } from '../types/model';
5
+ import { SegmentationQuality, SemanticSegmentationPreset } from '../types/segmentation';
6
+ /**
7
+ * Persistent, creator-facing tracking configuration: which trackers an
8
+ * experience uses and how they are tuned. Plain JSON only — no streams,
9
+ * textures, model instances, calibration measurements or session state
10
+ * (those are runtime resources with their own owners). `version` gates
11
+ * migration; unknown fields are dropped on parse.
12
+ */
13
+ export type XRTrackingConfig = {
14
+ version: 1;
15
+ trackers: {
16
+ face: {
17
+ enabled: boolean;
18
+ numFaces: number;
19
+ targetFps: number | null;
20
+ holdMs: number;
21
+ predictMs: number;
22
+ smoothing: number;
23
+ };
24
+ hand: {
25
+ enabled: boolean;
26
+ targetFps: number | null;
27
+ };
28
+ gesture: {
29
+ enabled: boolean;
30
+ targetFps: number | null;
31
+ };
32
+ body: {
33
+ enabled: boolean;
34
+ targetFps: number | null;
35
+ };
36
+ holistic: {
37
+ enabled: boolean;
38
+ targetFps: number | null;
39
+ hands: HolisticHandsOption;
40
+ holdMs: number;
41
+ predictMs: number;
42
+ analysisMaxDimension: number;
43
+ outputFaceBlendshapes: boolean;
44
+ /** Detector / presence / landmark confidences, 0..1. */
45
+ confidence: number;
46
+ delegate: HolisticDelegate;
47
+ };
48
+ segmentation: {
49
+ enabled: boolean;
50
+ quality: SegmentationQuality;
51
+ };
52
+ semanticSegmentation: {
53
+ enabled: boolean;
54
+ preset: SemanticSegmentationPreset;
55
+ quality: SegmentationQuality;
56
+ };
57
+ };
58
+ /** Session perf config (`<XRProvider perf>`). */
59
+ perf: Required<Pick<XRPerfConfig, "targetFps" | "camRes" | "cameraZoom">> & {
60
+ analysisScale: number;
61
+ };
62
+ lifecycle: Required<XRLifecycleConfig>;
63
+ /** Adaptive quality: a partial config, or `false` to run without the controller. */
64
+ quality: XRQualityConfigInput | false;
65
+ /** Which camera to open and how to mirror it. */
66
+ camera: {
67
+ facingMode: NonNullable<XRCameraRequest["facingMode"]>;
68
+ deviceId: string | null;
69
+ mirrored: boolean | "auto";
70
+ };
71
+ fallbacks: {
72
+ /** What the app does when the capability check blocks tracking: refuse, or run without trackers. */
73
+ onUnsupported: "block" | "degrade";
74
+ /** Preferred MediaPipe backend for models that offer the choice. */
75
+ delegate: HolisticDelegate;
76
+ };
77
+ /** Model asset overrides by tracker (URL); `null` keeps the SDK default. */
78
+ assets: {
79
+ holisticModelUrl: string | null;
80
+ semanticSegmentationModelUrl: string | null;
81
+ };
82
+ /** Wall-clock ms of the last change (0 for defaults). */
83
+ updatedAt: number;
84
+ };
85
+ /** Deep partial: every leaf optional. */
86
+ export type XRTrackingConfigInput = {
87
+ version?: number;
88
+ trackers?: {
89
+ [K in keyof XRTrackingConfig["trackers"]]?: Partial<XRTrackingConfig["trackers"][K]>;
90
+ };
91
+ perf?: Partial<XRTrackingConfig["perf"]>;
92
+ lifecycle?: Partial<XRTrackingConfig["lifecycle"]>;
93
+ quality?: XRQualityConfigInput | false;
94
+ camera?: Partial<XRTrackingConfig["camera"]>;
95
+ fallbacks?: Partial<XRTrackingConfig["fallbacks"]>;
96
+ assets?: Partial<XRTrackingConfig["assets"]>;
97
+ updatedAt?: number;
98
+ };
99
+ export type XRTrackerKind = keyof XRTrackingConfig["trackers"];
100
+ export type XRTrackingConfigParseResult = {
101
+ config: XRTrackingConfig;
102
+ /** True when the stored document came from another version (or none) and was migrated / defaulted. */
103
+ migrated: boolean;
104
+ /** Fields that were dropped or clamped. */
105
+ warnings: string[];
106
+ };
@@ -0,0 +1,38 @@
1
+ import { XRModel } from '../constants';
2
+ import { toCameraRequest, toProviderProps, toTrackerProps } from './apply';
3
+ import { TrackingConfigStorage } from './storage';
4
+ import { XRTrackerKind, XRTrackingConfig, XRTrackingConfigInput } from './types';
5
+ export type UseXRTrackingConfigOptions = {
6
+ storageKey?: string;
7
+ /** `false` keeps the config in memory only. Default `true`. */
8
+ persist?: boolean;
9
+ storage?: TrackingConfigStorage | null;
10
+ /** Defaults for this app, applied under anything persisted. */
11
+ initial?: XRTrackingConfigInput;
12
+ };
13
+ export type UseXRTrackingConfigResult = {
14
+ config: XRTrackingConfig;
15
+ /** True once storage was read (or persistence is off). */
16
+ hydrated: boolean;
17
+ /** Warnings from the last load / update (dropped or clamped fields, migration). */
18
+ warnings: string[];
19
+ update: (patch: XRTrackingConfigInput) => XRTrackingConfig;
20
+ /** Back to `initial` over the defaults; clears storage. */
21
+ reset: () => XRTrackingConfig;
22
+ /** Replace from a JSON string (an import); invalid input keeps the current config and reports warnings. */
23
+ importJson: (json: string) => XRTrackingConfig;
24
+ /** The serialized document. */
25
+ json: string;
26
+ providerProps: ReturnType<typeof toProviderProps>;
27
+ cameraRequest: ReturnType<typeof toCameraRequest>;
28
+ trackerProps: <K extends XRTrackerKind>(kind: K) => ReturnType<typeof toTrackerProps<K>>;
29
+ modelOptions: (model: XRModel) => Record<string, unknown>;
30
+ enabledModels: XRModel[];
31
+ };
32
+ /**
33
+ * Persistent tracking configuration for an app: load (with migration),
34
+ * validate, update, reset, serialize, and project onto `<XRProvider>`,
35
+ * tracker components and model options. Mount it ABOVE `<XRProvider>` so the
36
+ * provider props come from it; it needs no session.
37
+ */
38
+ export declare const useXRTrackingConfig: (options?: UseXRTrackingConfigOptions) => UseXRTrackingConfigResult;
package/dist/tracking.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";var Q=Object.create;var U=Object.defineProperty;var ee=Object.getOwnPropertyDescriptor;var te=Object.getOwnPropertyNames;var ne=Object.getPrototypeOf,re=Object.prototype.hasOwnProperty;var oe=(e,t,r,n)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of te(t))!re.call(e,o)&&o!==r&&U(e,o,{get:()=>t[o],enumerable:!(n=ee(t,o))||n.enumerable});return e};var z=(e,t,r)=>(r=e!=null?Q(ne(e)):{},oe(t||!e||!e.__esModule?U(r,"default",{value:e,enumerable:!0}):r,e));Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const A=require("./index-CyUUurQT.cjs"),L=require("react/jsx-runtime"),y=require("@react-three/fiber"),s=require("react"),se=require("three"),F=require("./index-DCiMbxC3.cjs"),j=require("./renderLayers-lDtL0_43.cjs"),w=require("./index-BpEf2BBb.cjs"),ue=require("./useFaceResults-wBJF3zyp.cjs"),I=require("./useFaceInfo-BJ8-_MOs.cjs"),S=require("./getFaceInfo-fA1bFBub.cjs"),ce=require("./drawNormalizedCrop-B-7zU-Xw.cjs");function ae(e){const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const r in e)if(r!=="default"){const n=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,n.get?n:{enumerable:!0,get:()=>e[r]})}}return t.default=e,Object.freeze(t)}const P=ae(se),ie={"hand.wrist":0,"hand.thumbTip":4,"hand.indexTip":8,"hand.middleTip":12,"hand.ringTip":16,"hand.pinkyTip":20,"hand.indexBase":5,"hand.middleBase":9,"hand.ringBase":13,"hand.pinkyBase":17};function le(e,t,r=0){var o;const n=(o=e==null?void 0:e.hands)!=null&&o.length?e.hands:e!=null&&e.coordinates?[{coordinates:e.coordinates,gesture:e.gesture,handedness:e.handedness}]:[];if(n.length){if(t){const c=n.find(a=>a.handedness===t);if(c)return c}return n[r]??n[0]}}const de=({children:e,hand:t,handIndex:r=0,targetFps:n,active:o=!0})=>{const c=s.useRef(null),a=s.useMemo(()=>n===void 0?void 0:{targetFps:n},[n]),{ready:l,node:m}=A.useXRModel(F.XRModel.HAND_TRACKER,a,o),{camera:u}=y.useThree(),i=s.useRef(u);i.current!==u&&(i.current=u);const d=s.useRef(null);y.useFrame(()=>{var E;if(!l||!m||!c.current)return;const T=le(m,t,r);d.current=T??null;const h=(E=T==null?void 0:T.coordinates)==null?void 0:E[0];if(!h){c.current.visible=!1;return}const R=G(h,i.current);c.current.visible=!0,c.current.position.copy(R)});const p=s.useCallback(T=>{var E,g;const h=ie[T];if(h===void 0)return null;const R=(g=(E=d.current)==null?void 0:E.coordinates)==null?void 0:g[h];return R?{position:G(R,i.current)}:null},[]),f=s.useMemo(()=>({type:"hand",resolveLandmark:p}),[p]);return L.jsx(A.TrackerContext.Provider,{value:f,children:L.jsx("group",{ref:c,renderOrder:j.RENDER_LAYERS.TRACKED,children:e})})},G=(e,t)=>{const r=new P.Vector3(e.x,e.y,e.z);r.unproject(t);const n=r.sub(t.position).normalize(),o=-t.position.z/n.z;return t.position.clone().add(n.multiplyScalar(o))},he={"hand.wrist":0,"hand.thumbTip":4,"hand.indexTip":8,"hand.middleTip":12,"hand.ringTip":16,"hand.pinkyTip":20,"hand.indexBase":5,"hand.middleBase":9,"hand.ringBase":13,"hand.pinkyBase":17},fe=({children:e,targetFps:t,active:r=!0})=>{const n=s.useRef(null),o=s.useMemo(()=>t===void 0?void 0:{targetFps:t},[t]),{ready:c,node:a}=A.useXRModel(F.XRModel.GESTURE_TRACKER,o,r),{camera:l}=y.useThree(),m=s.useRef(l);m.current!==l&&(m.current=l);const u=s.useRef(null);y.useFrame(()=>{var T;if(!c||!a||!n.current)return;u.current=a;const p=(T=a==null?void 0:a.coordinates)==null?void 0:T[0];if(!p){n.current.visible=!1;return}const f=H(p,m.current);n.current.visible=!0,n.current.position.copy(f)});const i=s.useCallback(p=>{var h,R;const f=he[p];if(f===void 0)return null;const T=(R=(h=u.current)==null?void 0:h.coordinates)==null?void 0:R[f];return T?{position:H(T,m.current)}:null},[]),d=s.useMemo(()=>({type:"hand",resolveLandmark:i}),[i]);return L.jsx(A.TrackerContext.Provider,{value:d,children:L.jsx("group",{ref:n,renderOrder:j.RENDER_LAYERS.TRACKED,children:e})})},H=(e,t)=>{const r=new P.Vector3(e.x,e.y,e.z);r.unproject(t);const n=r.sub(t.position).normalize(),o=-t.position.z/n.z;return t.position.clone().add(n.multiplyScalar(o))},pe={"body.head":0,"body.leftShoulder":11,"body.rightShoulder":12,"body.leftElbow":13,"body.rightElbow":14,"body.leftWrist":15,"body.rightWrist":16,"body.leftHip":23,"body.rightHip":24,"body.leftKnee":25,"body.rightKnee":26,"body.leftAnkle":27,"body.rightAnkle":28},Re=({bodyIndex:e=0,active:t=!0,children:r})=>{const n=s.useRef(null),{ready:o,node:c}=A.useXRModel(F.XRModel.BODY_TRACKER,void 0,t),{camera:a}=y.useThree(),l=s.useRef(a);l.current!==a&&(l.current=a);const m=s.useRef(null);y.useFrame(()=>{if(!o||!c||!n.current)return;const d=c;m.current=d;const p=d.getLandmarks2D(e),f=p==null?void 0:p[0];if(!f){n.current.visible=!1;return}const T=B(f,l.current);n.current.visible=!0,n.current.position.copy(T)});const u=s.useCallback(d=>{const p=m.current;if(!p)return null;const f=p.getLandmarks2D(e);if(!f)return null;if(d==="body.neck"){const R=f[11],E=f[12];if(!R||!E)return null;const g={x:(R.x+E.x)/2,y:(R.y+E.y)/2,z:(R.z+E.z)/2};return{position:B(g,l.current)}}const T=pe[d];if(T===void 0)return null;const h=f[T];return h?{position:B(h,l.current)}:null},[e]),i=s.useMemo(()=>({type:"body",resolveLandmark:u}),[u]);return L.jsx(A.TrackerContext.Provider,{value:i,children:L.jsx("group",{ref:n,renderOrder:j.RENDER_LAYERS.TRACKED,children:r})})},B=(e,t)=>{const r=new P.Vector3(e.x,e.y,e.z);r.unproject(t);const n=r.sub(t.position).normalize(),o=-t.position.z/n.z;return t.position.clone().add(n.multiplyScalar(o))},O=["portrait"],Ee=({type:e,active:t=!0,children:r})=>(A.useXRModel(F.XRModel.BACKGROUND_SEGMENTATION,{type:e},t),s.useEffect(()=>{O.includes(e)||console.warn(`[Segmentation] unsupported type "${e}"; valid values: ${O.join(", ")}`)},[e]),L.jsx(L.Fragment,{children:r})),me=800,Te=200,ge=()=>({armed:!1,armStart:null,holdStart:null,fired:!1}),Se=(e,{isTrigger:t,gesture:r,now:n,mode:o,debounceMs:c,holdMs:a})=>{if(e.fired)return null;if(o==="hold"){if(t&&r){if(e.holdStart===null&&(e.holdStart=n),n-e.holdStart>=a)return e.fired=!0,r}else e.holdStart=null;return null}return e.armed?t&&r?(e.fired=!0,r):null:(t?e.armStart=null:(e.armStart===null&&(e.armStart=n),n-e.armStart>=c&&(e.armed=!0)),null)};function Ae({gestures:e,mode:t="arm",debounceMs:r=me,holdMs:n=Te,onTrigger:o,enabled:c=!0}){const{ready:a,node:l}=A.useXRModel(F.XRModel.GESTURE_TRACKER),m=s.useRef(o);s.useEffect(()=>{m.current=o},[o]);const u=s.useRef(new Set);s.useEffect(()=>{u.current=new Set(Array.isArray(e)?e:[e])},[e]);const i=s.useRef(ge());y.useFrame(()=>{if(!c||!a||!l)return;const d=l.gesture,p=!!(d&&u.current.has(d)),f=Se(i.current,{isTrigger:p,gesture:d,now:performance.now(),mode:t,debounceMs:r,holdMs:n});f&&m.current(f)})}const ye=e=>(Ae(e),null),Fe=(e,t)=>t&&!e?"begin":!t&&e?"end":t?"stay":"none",Le={face:null,faces:[],faceCount:0,detected:!1,justDetected:!1,justLost:!1,phase:"none"},_e=({faceIndex:e=0,numFaces:t,...r}={})=>{const n=Number.isFinite(e)?Math.max(0,Math.round(e)):0,o=I.useFaceInfos({...r,numFaces:Math.max(t??n+1,n+1)}),c=s.useRef([]),a=s.useRef(n),l=s.useRef({detected:!1,faceIndex:n}),[m,u]=s.useState(Le),i=s.useRef(m);return s.useEffect(()=>{c.current=o,a.current=n},[o,n]),y.useFrame(()=>{const d=c.current,p=a.current,f=d[p]??null,T=!!f,h=l.current.faceIndex===p&&l.current.detected,R=Fe(h,T);l.current={detected:T,faceIndex:p};const E={face:f,faces:d,faceCount:d.length,detected:T,justDetected:R==="begin",justLost:R==="end",phase:R},g=i.current;g.face===E.face&&g.faces===E.faces&&g.faceCount===E.faceCount&&g.detected===E.detected&&g.justDetected===E.justDetected&&g.justLost===E.justLost&&g.phase===E.phase||(i.current=E,u(E))}),m},be=["_neutral","browDownLeft","browDownRight","browInnerUp","browOuterUpLeft","browOuterUpRight","cheekPuff","cheekSquintLeft","cheekSquintRight","eyeBlinkLeft","eyeBlinkRight","eyeLookDownLeft","eyeLookDownRight","eyeLookInLeft","eyeLookInRight","eyeLookOutLeft","eyeLookOutRight","eyeLookUpLeft","eyeLookUpRight","eyeSquintLeft","eyeSquintRight","eyeWideLeft","eyeWideRight","jawForward","jawLeft","jawOpen","jawRight","mouthClose","mouthDimpleLeft","mouthDimpleRight","mouthFrownLeft","mouthFrownRight","mouthFunnel","mouthLeft","mouthLowerDownLeft","mouthLowerDownRight","mouthPressLeft","mouthPressRight","mouthPucker","mouthRight","mouthRollLower","mouthRollUpper","mouthShrugLower","mouthShrugUpper","mouthSmileLeft","mouthSmileRight","mouthStretchLeft","mouthStretchRight","mouthUpperUpLeft","mouthUpperUpRight","noseSneerLeft","noseSneerRight"],K=({source:e,face:t,canvas:r,outputSize:n,padding:o=.2})=>ce.drawNormalizedCrop({source:e,bounds:t.bounds,canvas:r,outputSize:n,padding:o}),ke=["browRaise","eyeBlink","eyeBlinkLeft","eyeBlinkRight","eyeBlinkEither","headUp","headDown","headTurnLeft","headTurnRight","mouthOpen","mouthPout","headTiltLeft","headTiltRight"],_=(e=.5)=>({threshold:e,releaseThreshold:Math.max(0,e-.15),holdMs:50}),b={threshold:Math.PI/18,releaseThreshold:Math.PI/30,holdMs:80},Y={browRaise:_(.45),eyeBlink:_(.55),eyeBlinkLeft:_(.55),eyeBlinkRight:_(.55),eyeBlinkEither:_(.55),headUp:b,headDown:b,headTurnLeft:b,headTurnRight:b,mouthOpen:_(.45),mouthPout:_(.5),headTiltLeft:b,headTiltRight:b},k=e=>Math.max(0,e),N=(e,t)=>e!==void 0&&Number.isFinite(e)?e:t,V=(e,t={})=>{const r=Y[e],n=Math.max(0,N(t.threshold,r.threshold));return{threshold:n,releaseThreshold:Math.min(n,Math.max(0,N(t.releaseThreshold,r.releaseThreshold))),holdMs:Math.max(0,N(t.holdMs,r.holdMs))}},M=(e,t,{neutralRotation:r={x:0,y:0,z:0}}={})=>{const n=N(r.x,0),o=N(r.y,0),c=N(r.z,0);switch(t){case"browRaise":return Math.max(S.getFaceBlendshape(e,"browInnerUp"),S.getFaceBlendshape(e,"browOuterUpLeft"),S.getFaceBlendshape(e,"browOuterUpRight"));case"eyeBlink":return Math.min(S.getFaceBlendshape(e,"eyeBlinkLeft"),S.getFaceBlendshape(e,"eyeBlinkRight"));case"eyeBlinkLeft":return S.getFaceBlendshape(e,"eyeBlinkRight");case"eyeBlinkRight":return S.getFaceBlendshape(e,"eyeBlinkLeft");case"eyeBlinkEither":return Math.max(S.getFaceBlendshape(e,"eyeBlinkLeft"),S.getFaceBlendshape(e,"eyeBlinkRight"));case"mouthOpen":return S.getFaceBlendshape(e,"jawOpen");case"mouthPout":return S.getFaceBlendshape(e,"mouthPucker");case"headUp":return k(e.pose.rotation.x-n);case"headDown":return k(n-e.pose.rotation.x);case"headTurnLeft":return k(e.pose.rotation.y-o);case"headTurnRight":return k(o-e.pose.rotation.y);case"headTiltLeft":return k(e.pose.rotation.z-c);case"headTiltRight":return k(c-e.pose.rotation.z)}},De=(e,t,r={})=>M(e,t,r)>=V(t,r).threshold,Ne=(e,t,r={})=>{let n=null,o=0;for(const c of e){const a=M(c,t,r);(!n||a>o)&&(n=c,o=a)}return{face:n,value:o}},X=e=>({action:e,active:!1,value:0,justStarted:!1,justEnded:!1,phase:"none",holdStartedAt:null}),we=(e,t,r,n,o)=>{const c=e.phase==="begin";if(e.value=t,e.justStarted=!1,e.justEnded=!1,e.phase=e.active?"stay":"none",!n)return e.holdStartedAt=null,e.active&&(e.active=!1,e.justEnded=!0,e.phase="end"),e;if(e.active){if(t<=o.releaseThreshold){if(c)return e;e.active=!1,e.justEnded=!0,e.phase="end"}return e}return t<o.threshold?(e.holdStartedAt=null,e):(e.holdStartedAt===null&&(e.holdStartedAt=r),r-e.holdStartedAt>=o.holdMs&&(e.active=!0,e.justStarted=!0,e.phase="begin",e.holdStartedAt=null),e)},q=e=>({action:e,active:!1,value:0,justStarted:!1,justEnded:!1,phase:"none"}),xe=(e,t,r={})=>{const n=s.useRef(X(t)),o=s.useRef(null),c=s.useRef(t),a=s.useRef({}),[l,m]=s.useState(()=>q(t)),u=s.useRef(l);return s.useEffect(()=>{o.current=e,a.current=r},[e,r]),s.useEffect(()=>{c.current=t,n.current=X(t);const i=q(t);u.current=i,m(i)},[t]),y.useFrame(({clock:i})=>{const d=o.current,p=c.current,f=a.current,T=d?M(d,p,f):0,h=we(n.current,T,i.elapsedTime*1e3,!!d,V(p,f)),R=u.current;if(R.action===h.action&&R.active===h.active&&R.value===h.value&&R.justStarted===h.justStarted&&R.justEnded===h.justEnded&&R.phase===h.phase)return;const E={action:h.action,active:h.active,value:h.value,justStarted:h.justStarted,justEnded:h.justEnded,phase:h.phase};u.current=E,m(E)}),l},Me=["angry","disgust","fear","happy","neutral","sad","surprise","unknown"],D=["angry","disgust","fear","happy","neutral","sad","surprise"],ve=(e,t=.55)=>{let r=-1/0;for(let u=0;u<D.length;u+=1)r=Math.max(r,Number(e[u])||0);const n=new Array(D.length);let o=0;for(let u=0;u<D.length;u+=1){const i=Math.exp((Number(e[u])||0)-r);n[u]=i,o+=i}const c=Object.fromEntries(D.map(u=>[u,0]));let a="unknown",l=0;for(let u=0;u<D.length;u+=1){const i=o?n[u]/o:0,d=D[u];c[d]=i,i>l&&(a=d,l=i)}const m=Number.isFinite(t)?Math.min(1,Math.max(0,t)):.55;return{expression:l>=m?a:"unknown",confidence:l,scores:c}},Be=e=>{const t=e.width*e.height,r=new Float32Array(t*3);for(let n=0,o=0;n<t;n+=1,o+=4)r[n]=e.data[o]/127.5-1,r[t+n]=e.data[o+1]/127.5-1,r[t*2+n]=e.data[o+2]/127.5-1;return r},W="https://huggingface.co/opencv/facial_expression_recognition/resolve/main/facial_expression_recognition_mobilefacenet_2022july_int8.onnx",Ce=e=>`https://cdn.jsdelivr.net/npm/onnxruntime-web@${e.env.versions.web}/dist/`,C=new Map,Oe=e=>{let t=C.get(e);return t||(t=Promise.all([import("onnxruntime-web/wasm"),F.fetchAndVerify(e)]).then(([r,n])=>(r.env.wasm.wasmPaths=Ce(r),r.InferenceSession.create(n,{executionProviders:["wasm"]}))).catch(r=>{throw C.delete(e),r}),C.set(e,t)),t},je=(e,{active:t=!0,targetFps:r=5,minConfidence:n=.55,modelUrl:o=W}={})=>{const{session:c}=F.useXRContext(),a=s.useRef(null),l=s.useRef(null),m=s.useRef(!1),u=s.useRef(-1/0),i=s.useRef(!0),[d,p]=s.useState({status:"idle",result:null,error:null});return s.useEffect(()=>{const f=document.createElement("canvas");return a.current=f,l.current=f.getContext("2d",{willReadFrequently:!0}),i.current=!0,()=>{i.current=!1,a.current=null,l.current=null}},[]),y.useFrame(({clock:f})=>{if(!t||!e||m.current||d.status==="error")return;const T=Number.isFinite(r)&&r>0?r:5,h=f.elapsedTime*1e3;if(h-u.current<1e3/T)return;const R=c.getInputFrame(),E=a.current,g=l.current;if(!R||!E||!g||!K({source:R,face:e,canvas:E,outputSize:{width:112,height:112}}))return;u.current=h,m.current=!0,d.status==="idle"&&p({status:"loading",result:null,error:null});const $=Be(g.getImageData(0,0,112,112));Promise.all([import("onnxruntime-web/wasm"),Oe(o)]).then(async([x,v])=>{const Z=await v.run({[v.inputNames[0]]:new x.Tensor("float32",$,[1,3,112,112])}),J=ve(Z[v.outputNames[0]].data,n);i.current&&p({status:"ready",result:J,error:null})}).catch(x=>{i.current&&p({status:"error",result:null,error:x instanceof Error?x:new Error(String(x))})}).finally(()=>{m.current=!1})}),d};exports.FACE_LANDMARK_INDICES=A.FACE_LANDMARK_INDICES;exports.FaceMesh=A.FaceMesh;exports.FaceTracker=A.FaceTracker;exports.normalizedTrackerPointToTrackerPoint=F.normalizedTrackerPointToTrackerPoint;exports.trackerPointToNormalizedTrackerPoint=F.trackerPointToNormalizedTrackerPoint;exports.BODY_TARGETS=w.BODY_TARGETS;exports.DEFAULT_TRACKING_ANCHOR=w.DEFAULT_TRACKING_ANCHOR;exports.FACE_TARGETS=w.FACE_TARGETS;exports.HAND_TARGETS=w.HAND_TARGETS;exports.TrackingAnchor=w.TrackingAnchor;exports.getTargetNamespace=w.getTargetNamespace;exports.useFaceResults=ue.useFaceResults;exports.useFaceInfo=I.useFaceInfo;exports.useFaceInfos=I.useFaceInfos;exports.DEFAULT_FACE_EXPRESSION_THRESHOLD=S.DEFAULT_FACE_EXPRESSION_THRESHOLD;exports.getFaceBlendshape=S.getFaceBlendshape;exports.getFaceEyeDistance=S.getFaceEyeDistance;exports.hasFaceExpression=S.hasFaceExpression;exports.BodyTracker=Re;exports.DEFAULT_FACE_ACTION_OPTIONS=Y;exports.DEFAULT_FACE_ATTRIBUTE_EXPRESSION_MODEL_URL=W;exports.FACE_ACTION_NAMES=ke;exports.FACE_ATTRIBUTE_EXPRESSION_NAMES=Me;exports.FACE_BLENDSHAPE_NAMES=be;exports.GestureTracker=fe;exports.GestureTrigger=ye;exports.HandTracker=de;exports.SEGMENTATION_TYPES=O;exports.Segmentation=Ee;exports.drawFaceCrop=K;exports.getFaceActionValue=M;exports.getStrongestFaceAction=Ne;exports.hasFaceAction=De;exports.useFaceAction=xe;exports.useFaceAttributeExpression=je;exports.useFaceDetection=_e;
1
+ "use strict";var lt=Object.create;var Fe=Object.defineProperty;var dt=Object.getOwnPropertyDescriptor;var ht=Object.getOwnPropertyNames;var ft=Object.getPrototypeOf,Tt=Object.prototype.hasOwnProperty;var mt=(e,r,t,n)=>{if(r&&typeof r=="object"||typeof r=="function")for(let s of ht(r))!Tt.call(e,s)&&s!==t&&Fe(e,s,{get:()=>r[s],enumerable:!(n=dt(r,s))||n.enumerable});return e};var De=(e,r,t)=>(t=e!=null?lt(ft(e)):{},mt(r||!e||!e.__esModule?Fe(t,"default",{value:e,enumerable:!0}):t,e));Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const I=require("./index-OCPjOaeP.cjs"),O=require("react/jsx-runtime"),L=require("@react-three/fiber"),o=require("react"),E=require("./index-CeVkgsag.cjs"),Y=require("./selectors-Du_PsVnW.cjs"),re=require("./segmentation-9PhSvc-R.cjs"),q=require("./index-DsZwTfG0.cjs"),C=require("./detector-ijypGtse.cjs"),y=require("./getFaceInfo-ahPxQFGu.cjs"),A=require("./measures-KfJzpvod.cjs"),F=require("./useFaceInfo-C5mO8NQY.cjs"),Pe=require("./SegmentationOverlay-aWVod8Kl.cjs"),St=require("./drawNormalizedCrop-B-7zU-Xw.cjs"),N=require("./settings-DRR7-snV.cjs"),z=require("./providers-YNwkmNeK.cjs"),Ee=require("./landmarkMask-u7es2k4X.cjs"),He={"hand.wrist":0,"hand.thumbTip":4,"hand.indexTip":8,"hand.middleTip":12,"hand.ringTip":16,"hand.pinkyTip":20,"hand.indexBase":5,"hand.middleBase":9,"hand.ringBase":13,"hand.pinkyBase":17};function Be(e,r,t=0){var s;const n=(s=e==null?void 0:e.hands)!=null&&s.length?e.hands:e!=null&&e.coordinates?[{coordinates:e.coordinates,gesture:e.gesture,handedness:e.handedness}]:[];if(n.length){if(r){const i=n.find(u=>u.handedness===r);if(i)return i}return n[t]??n[0]}}const Rt=({children:e,hand:r,handIndex:t=0,targetFps:n,active:s=!0})=>{const i=o.useRef(null),u=o.useMemo(()=>n===void 0?void 0:{targetFps:n},[n]),{ready:a,node:l}=I.useXRModel(E.XRModel.HAND_TRACKER,u,s),{camera:c}=L.useThree(),f=o.useRef(c);f.current!==c&&(f.current=c);const h=o.useRef(null);L.useFrame(()=>{var d;if(!a||!l||!i.current)return;const p=Be(l,r,t);h.current=p??null;const R=(d=p==null?void 0:p.coordinates)==null?void 0:d[0];if(!R){i.current.visible=!1;return}const g=E.trackerToWorld(R,f.current);i.current.visible=!0,i.current.position.copy(g)});const m=o.useCallback(p=>{var d,S;const R=He[p];if(R===void 0)return null;const g=(S=(d=h.current)==null?void 0:d.coordinates)==null?void 0:S[R];return g?{position:E.trackerToWorld(g,f.current)}:null},[]),T=o.useMemo(()=>({type:"hand",resolveLandmark:m}),[m]);return O.jsx(I.TrackerContext.Provider,{value:T,children:O.jsx("group",{ref:i,renderOrder:Y.RENDER_LAYERS.TRACKED,children:e})})},Et={"hand.wrist":0,"hand.thumbTip":4,"hand.indexTip":8,"hand.middleTip":12,"hand.ringTip":16,"hand.pinkyTip":20,"hand.indexBase":5,"hand.middleBase":9,"hand.ringBase":13,"hand.pinkyBase":17},pt=({children:e,targetFps:r,active:t=!0})=>{const n=o.useRef(null),s=o.useMemo(()=>r===void 0?void 0:{targetFps:r},[r]),{ready:i,node:u}=I.useXRModel(E.XRModel.GESTURE_TRACKER,s,t),{camera:a}=L.useThree(),l=o.useRef(a);l.current!==a&&(l.current=a);const c=o.useRef(null);L.useFrame(()=>{var p;if(!i||!u||!n.current)return;c.current=u;const m=(p=u==null?void 0:u.coordinates)==null?void 0:p[0];if(!m){n.current.visible=!1;return}const T=E.trackerToWorld(m,l.current);n.current.visible=!0,n.current.position.copy(T)});const f=o.useCallback(m=>{var R,g;const T=Et[m];if(T===void 0)return null;const p=(g=(R=c.current)==null?void 0:R.coordinates)==null?void 0:g[T];return p?{position:E.trackerToWorld(p,l.current)}:null},[]),h=o.useMemo(()=>({type:"hand",resolveLandmark:f}),[f]);return O.jsx(I.TrackerContext.Provider,{value:h,children:O.jsx("group",{ref:n,renderOrder:Y.RENDER_LAYERS.TRACKED,children:e})})},Ue={"body.head":0,"body.leftShoulder":11,"body.rightShoulder":12,"body.leftElbow":13,"body.rightElbow":14,"body.leftWrist":15,"body.rightWrist":16,"body.leftHip":23,"body.rightHip":24,"body.leftKnee":25,"body.rightKnee":26,"body.leftAnkle":27,"body.rightAnkle":28},gt=({bodyIndex:e=0,active:r=!0,children:t})=>{const n=o.useRef(null),{ready:s,node:i}=I.useXRModel(E.XRModel.BODY_TRACKER,void 0,r),{camera:u}=L.useThree(),a=o.useRef(u);a.current!==u&&(a.current=u);const l=o.useRef(null);L.useFrame(()=>{if(!s||!i||!n.current)return;const h=i;l.current=h;const m=h.getLandmarks2D(e),T=m==null?void 0:m[0];if(!T){n.current.visible=!1;return}const p=E.trackerToWorld(T,a.current);n.current.visible=!0,n.current.position.copy(p)});const c=o.useCallback(h=>{const m=l.current;if(!m)return null;const T=m.getLandmarks2D(e);if(!T)return null;if(h==="body.neck"){const g=T[11],d=T[12];if(!g||!d)return null;const S={x:(g.x+d.x)/2,y:(g.y+d.y)/2,z:(g.z+d.z)/2};return{position:E.trackerToWorld(S,a.current)}}const p=Ue[h];if(p===void 0)return null;const R=T[p];return R?{position:E.trackerToWorld(R,a.current)}:null},[e]),f=o.useMemo(()=>({type:"body",resolveLandmark:c}),[c]);return O.jsx(I.TrackerContext.Provider,{value:f,children:O.jsx("group",{ref:n,renderOrder:Y.RENDER_LAYERS.TRACKED,children:t})})},ee={leftShoulder:11,rightShoulder:12,leftWrist:15,rightWrist:16},At=0,_t=[[5,8],[9,12],[13,16],[17,20]],se={smile:.3,mouthOpen:.25,minVisibility:.5,fingerExtension:1.25},Ge=()=>({facePresent:!1,leftHandPresent:!1,rightHandPresent:!1,posePresent:!1,smile:0,mouthOpen:0,smiling:!1,mouthIsOpen:!1,leftHandRaised:!1,rightHandRaised:!1,leftPalmOpen:!1,rightPalmOpen:!1,greeting:null}),xe=(e,r)=>Math.hypot(e.x-r.x,e.y-r.y),Se=(e,r=se.fingerExtension)=>{if(!e||e.landmarks.length<21)return!1;const t=e.landmarks[At];let n=0;for(const[s,i]of _t){const u=xe(e.landmarks[s],t),a=xe(e.landmarks[i],t);u>0&&a>=u*r&&(n+=1)}return n>=3},Re=(e,r,t=se.minVisibility)=>{const{pose:n}=e;if(!n||n.landmarks.length<33)return!1;const s=r==="left"?ee.leftWrist:ee.rightWrist,i=r==="left"?ee.leftShoulder:ee.rightShoulder;return n.visibility[s]<t||n.visibility[i]<t?!1:n.landmarks[s].y>n.landmarks[i].y},yt=(e,r={},t=Ge())=>{const n={...se,...r},{face:s,leftHand:i,rightHand:u,pose:a}=e;t.facePresent=s!==null,t.leftHandPresent=i!==null,t.rightHandPresent=u!==null,t.posePresent=a!==null;const l=s==null?void 0:s.blendshapes;return t.smile=l?((l.mouthSmileLeft??0)+(l.mouthSmileRight??0))/2:0,t.mouthOpen=(l==null?void 0:l.jawOpen)??0,t.smiling=s!==null&&t.smile>=n.smile,t.mouthIsOpen=s!==null&&t.mouthOpen>=n.mouthOpen,t.leftHandRaised=Re(e,"left",n.minVisibility),t.rightHandRaised=Re(e,"right",n.minVisibility),t.leftPalmOpen=Se(i,n.fingerExtension),t.rightPalmOpen=Se(u,n.fingerExtension),t.smiling&&t.rightHandRaised&&t.rightPalmOpen?t.greeting="right":t.smiling&&t.leftHandRaised&&t.leftPalmOpen?t.greeting="left":t.greeting=null,t},It={node:null,ready:!1,status:"loading",error:null},je=o.createContext(null),Ke=()=>o.useContext(je)??It,Ne=(e,r)=>r?"error":e?e.getStatus():"loading",Ot=({children:e,active:r=!0,onStatusChange:t,modelUrl:n,delegate:s,minFaceDetectionConfidence:i,minFacePresenceConfidence:u,minPoseDetectionConfidence:a,minPosePresenceConfidence:l,minHandLandmarksConfidence:c,outputFaceBlendshapes:f,targetFps:h,hands:m,analysisMaxDimension:T,holdMs:p,predictMs:R})=>{const g=o.useMemo(()=>{const _={};return n!==void 0&&(_.modelUrl=n),s!==void 0&&(_.delegate=s),i!==void 0&&(_.minFaceDetectionConfidence=i),u!==void 0&&(_.minFacePresenceConfidence=u),a!==void 0&&(_.minPoseDetectionConfidence=a),l!==void 0&&(_.minPosePresenceConfidence=l),c!==void 0&&(_.minHandLandmarksConfidence=c),f!==void 0&&(_.outputFaceBlendshapes=f),h!==void 0&&(_.targetFps=h),Object.keys(_).length>0?_:void 0},[s,i,u,c,a,l,n,f,h]),{ready:d,node:S,error:D}=I.useXRModel(E.XRModel.HOLISTIC_TRACKER,g,r);o.useEffect(()=>{S&&S.setOptions(E.resolveHolisticRuntimeOptions({hands:m,analysisMaxDimension:T,holdMs:p,predictMs:R}))},[S,m,T,p,R]);const[b,M]=o.useState(()=>Ne(S,D)),P=o.useRef(b),v=o.useRef(t);v.current=t,L.useFrame(()=>{var G;const _=Ne(S,D);_!==P.current&&(P.current=_,M(_),(G=v.current)==null||G.call(v,_,D??(S==null?void 0:S.getError())??null))});const Z=o.useMemo(()=>({node:S,ready:d&&b==="ready",status:b,error:D??(S==null?void 0:S.getError())??null}),[S,d,b,D]);return O.jsx(je.Provider,{value:Z,children:e})},Lt=()=>{const{camera:e}=L.useThree(),r=o.useRef(e);return r.current!==e&&(r.current=e),r},pe=(e,r)=>{const t=o.useRef(null),{node:n,ready:s}=Ke(),i=Lt();return L.useFrame(()=>{const u=t.current;if(!u)return;const a=s&&n?e(n.getResult()):null;if(!a){u.visible=!1;return}u.visible=!0,u.position.copy(r(a,i.current))}),{groupRef:t,cameraRef:i,node:n}},Xe=({children:e})=>{const r=o.useRef({x:0,y:0,z:0,visibility:0}),{groupRef:t,cameraRef:n,node:s}=pe(a=>{var l;return((l=a.face)==null?void 0:l.landmarks[4])??null},(a,l)=>E.feedToWorld(a,l)),i=o.useCallback((a,l)=>{var h;const c=(h=s==null?void 0:s.getResult().face)==null?void 0:h.landmarks;if(!c||c.length===0)return null;const f=I.resolveFaceAnchorPoint(a,c,l,r.current);return f?{position:E.feedToWorld(f,n.current)}:null},[n,s]),u=o.useMemo(()=>({type:"face",resolveLandmark:i}),[i]);return O.jsx(I.TrackerContext.Provider,{value:u,children:O.jsx("group",{ref:t,renderOrder:Y.RENDER_LAYERS.TRACKED,visible:!1,children:e})})};Xe.displayName="HolisticTracker.Face";const We=({hand:e,children:r})=>{const t=o.useCallback(l=>e==="left"?l.leftHand:l.rightHand,[e]),{groupRef:n,cameraRef:s,node:i}=pe(l=>{var c;return((c=t(l))==null?void 0:c.landmarks[0])??null},E.trackerToWorld),u=o.useCallback(l=>{var h;const c=He[l];if(c===void 0||!i)return null;const f=(h=t(i.getResult()))==null?void 0:h.landmarks[c];return f?{position:E.trackerToWorld(f,s.current)}:null},[s,i,t]),a=o.useMemo(()=>({type:"hand",resolveLandmark:u}),[u]);return O.jsx(I.TrackerContext.Provider,{value:a,children:O.jsx("group",{ref:n,renderOrder:Y.RENDER_LAYERS.TRACKED,visible:!1,children:r})})};We.displayName="HolisticTracker.Hand";const Ye=({children:e})=>{const{groupRef:r,cameraRef:t,node:n}=pe(u=>{var a;return((a=u.pose)==null?void 0:a.landmarks[0])??null},E.trackerToWorld),s=o.useCallback(u=>{var f;const a=(f=n==null?void 0:n.getResult().pose)==null?void 0:f.landmarks;if(!a)return null;if(u==="body.neck"){const h=a[11],m=a[12];if(!h||!m)return null;const T={x:(h.x+m.x)/2,y:(h.y+m.y)/2,z:(h.z+m.z)/2};return{position:E.trackerToWorld(T,t.current)}}const l=Ue[u];if(l===void 0)return null;const c=a[l];return c?{position:E.trackerToWorld(c,t.current)}:null},[t,n]),i=o.useMemo(()=>({type:"body",resolveLandmark:s}),[s]);return O.jsx(I.TrackerContext.Provider,{value:i,children:O.jsx("group",{ref:r,renderOrder:Y.RENDER_LAYERS.TRACKED,visible:!1,children:e})})};Ye.displayName="HolisticTracker.Body";const oe=Ot;oe.Face=Xe;oe.Hand=We;oe.Body=Ye;const bt=({type:e,active:r=!0,children:t})=>(I.useXRModel(E.XRModel.BACKGROUND_SEGMENTATION,{type:e},r),o.useEffect(()=>{re.SEGMENTATION_TYPES.includes(e)||console.warn(`[Segmentation] unsupported type "${e}"; valid values: ${re.SEGMENTATION_TYPES.join(", ")}`)},[e]),O.jsx(O.Fragment,{children:t})),kt=800,Ct=200,Ft=()=>({armed:!1,armStart:null,holdStart:null,fired:!1}),Dt=(e,{isTrigger:r,gesture:t,now:n,mode:s,debounceMs:i,holdMs:u})=>{if(e.fired)return null;if(s==="hold"){if(r&&t){if(e.holdStart===null&&(e.holdStart=n),n-e.holdStart>=u)return e.fired=!0,t}else e.holdStart=null;return null}return e.armed?r&&t?(e.fired=!0,t):null:(r?e.armStart=null:(e.armStart===null&&(e.armStart=n),n-e.armStart>=i&&(e.armed=!0)),null)};function xt({gestures:e,mode:r="arm",debounceMs:t=kt,holdMs:n=Ct,onTrigger:s,enabled:i=!0}){const{ready:u,node:a}=I.useXRModel(E.XRModel.GESTURE_TRACKER),l=o.useRef(s);o.useEffect(()=>{l.current=s},[s]);const c=o.useRef(new Set);o.useEffect(()=>{c.current=new Set(Array.isArray(e)?e:[e])},[e]);const f=o.useRef(Ft());L.useFrame(()=>{if(!i||!u||!a)return;const h=a.gesture,m=!!(h&&c.current.has(h)),T=Dt(f.current,{isTrigger:m,gesture:h,now:performance.now(),mode:r,debounceMs:t,holdMs:n});T&&l.current(T)})}const Nt=e=>(xt(e),null),Mt=["_neutral","browDownLeft","browDownRight","browInnerUp","browOuterUpLeft","browOuterUpRight","cheekPuff","cheekSquintLeft","cheekSquintRight","eyeBlinkLeft","eyeBlinkRight","eyeLookDownLeft","eyeLookDownRight","eyeLookInLeft","eyeLookInRight","eyeLookOutLeft","eyeLookOutRight","eyeLookUpLeft","eyeLookUpRight","eyeSquintLeft","eyeSquintRight","eyeWideLeft","eyeWideRight","jawForward","jawLeft","jawOpen","jawRight","mouthClose","mouthDimpleLeft","mouthDimpleRight","mouthFrownLeft","mouthFrownRight","mouthFunnel","mouthLeft","mouthLowerDownLeft","mouthLowerDownRight","mouthPressLeft","mouthPressRight","mouthPucker","mouthRight","mouthRollLower","mouthRollUpper","mouthShrugLower","mouthShrugUpper","mouthSmileLeft","mouthSmileRight","mouthStretchLeft","mouthStretchRight","mouthUpperUpLeft","mouthUpperUpRight","noseSneerLeft","noseSneerRight"],qe=({source:e,face:r,canvas:t,outputSize:n,padding:s=.2})=>St.drawNormalizedCrop({source:e,bounds:r.bounds,canvas:t,outputSize:n,padding:s}),vt=["browRaise","eyeBlink","eyeBlinkLeft","eyeBlinkRight","eyeBlinkEither","headUp","headDown","headTurnLeft","headTurnRight","mouthOpen","mouthPout","headTiltLeft","headTiltRight"],B=(e=.5)=>({threshold:e,releaseThreshold:Math.max(0,e-.15),holdMs:50}),j={threshold:Math.PI/18,releaseThreshold:Math.PI/30,holdMs:80},ze={browRaise:B(.45),eyeBlink:B(.55),eyeBlinkLeft:B(.55),eyeBlinkRight:B(.55),eyeBlinkEither:B(.55),headUp:j,headDown:j,headTurnLeft:j,headTurnRight:j,mouthOpen:B(.45),mouthPout:B(.5),headTiltLeft:j,headTiltRight:j},K=e=>Math.max(0,e),W=(e,r)=>e!==void 0&&Number.isFinite(e)?e:r,Ve=(e,r={})=>{const t=ze[e],n=Math.max(0,W(r.threshold,t.threshold));return{threshold:n,releaseThreshold:Math.min(n,Math.max(0,W(r.releaseThreshold,t.releaseThreshold))),holdMs:Math.max(0,W(r.holdMs,t.holdMs))}},U=(e,r,{neutralRotation:t={x:0,y:0,z:0}}={})=>{const n=W(t.x,0),s=W(t.y,0),i=W(t.z,0);switch(r){case"browRaise":return Math.max(y.getFaceBlendshape(e,"browInnerUp"),y.getFaceBlendshape(e,"browOuterUpLeft"),y.getFaceBlendshape(e,"browOuterUpRight"));case"eyeBlink":return Math.min(y.getFaceBlendshape(e,"eyeBlinkLeft"),y.getFaceBlendshape(e,"eyeBlinkRight"));case"eyeBlinkLeft":return y.getFaceBlendshape(e,"eyeBlinkRight");case"eyeBlinkRight":return y.getFaceBlendshape(e,"eyeBlinkLeft");case"eyeBlinkEither":return Math.max(y.getFaceBlendshape(e,"eyeBlinkLeft"),y.getFaceBlendshape(e,"eyeBlinkRight"));case"mouthOpen":return y.getFaceBlendshape(e,"jawOpen");case"mouthPout":return y.getFaceBlendshape(e,"mouthPucker");case"headUp":return K(e.pose.rotation.x-n);case"headDown":return K(n-e.pose.rotation.x);case"headTurnLeft":return K(e.pose.rotation.y-s);case"headTurnRight":return K(s-e.pose.rotation.y);case"headTiltLeft":return K(e.pose.rotation.z-i);case"headTiltRight":return K(i-e.pose.rotation.z)}},wt=(e,r,t={})=>U(e,r,t)>=Ve(r,t).threshold,Pt=(e,r,t={})=>{let n=null,s=0;for(const i of e){const u=U(i,r,t);(!n||u>s)&&(n=i,s=u)}return{face:n,value:s}},Me=e=>({action:e,active:!1,value:0,justStarted:!1,justEnded:!1,phase:"none",holdStartedAt:null}),Ht=(e,r,t,n,s)=>{const i=e.phase==="begin";if(e.value=r,e.justStarted=!1,e.justEnded=!1,e.phase=e.active?"stay":"none",!n)return e.holdStartedAt=null,e.active&&(e.active=!1,e.justEnded=!0,e.phase="end"),e;if(e.active){if(r<=s.releaseThreshold){if(i)return e;e.active=!1,e.justEnded=!0,e.phase="end"}return e}return r<s.threshold?(e.holdStartedAt=null,e):(e.holdStartedAt===null&&(e.holdStartedAt=t),t-e.holdStartedAt>=s.holdMs&&(e.active=!0,e.justStarted=!0,e.phase="begin",e.holdStartedAt=null),e)},ie=e=>({value:e,confidence:1}),te=(e,r,t,n)=>({name:e,kind:"face",description:r,defaults:n,measure:s=>s?ie(t(s)):null}),k=(e,r,t,n)=>({name:e,kind:"hand",description:r,defaults:n,measure:s=>s&&s.length>=21?ie(t(s)):null}),V=(e,r,t,n)=>({name:e,kind:"body",description:r,defaults:n,measure:s=>s&&s.length>=33?ie(t(s)):null}),he=e=>()=>({tracker:new A.OscillationTracker(e),wasPresent:!1}),fe=(e,r,t)=>r===null?(e.wasPresent=!1,null):(e.wasPresent||e.tracker.reset(),e.wasPresent=!0,ie(e.tracker.push(r,t))),Te={enterThreshold:.99,exitThreshold:.3,cooldownMs:600},ge={mouthOpen:te("mouthOpen","Jaw open (blendshape jawOpen).",e=>U(e,"mouthOpen")),smile:te("smile","Mean of the two mouthSmile blendshapes.",e=>(y.getFaceBlendshape(e,"mouthSmileLeft")+y.getFaceBlendshape(e,"mouthSmileRight"))/2,{enterThreshold:.4}),blink:te("blink","Both eyes closed (min of the eyeBlink blendshapes).",e=>U(e,"eyeBlink"),{enterThreshold:.55,holdMs:50}),browRaise:te("browRaise","Eyebrows raised (max of the brow-up blendshapes).",e=>U(e,"browRaise"),{enterThreshold:.45}),headNod:{name:"headNod",kind:"face",description:"Pitch oscillation: three turning points of at least 0.12 rad within 1.5 s.",defaults:Te,createMemory:he({minAmplitude:.12,requiredReversals:3,windowMs:1500}),measure:(e,r,t)=>fe(r,e?e.pose.rotation.x:null,t)},headShake:{name:"headShake",kind:"face",description:"Yaw oscillation: three turning points of at least 0.15 rad within 1.5 s.",defaults:Te,createMemory:he({minAmplitude:.15,requiredReversals:3,windowMs:1500}),measure:(e,r,t)=>fe(r,e?e.pose.rotation.y:null,t)},pinch:k("pinch","Thumb and index tips touching, relative to palm size.",A.measurePinch,{enterThreshold:.75,exitThreshold:.5}),grab:k("grab","Fist: index to pinky curled toward the wrist.",A.measureGrab,{enterThreshold:.7,exitThreshold:.45}),openPalm:k("openPalm","Index to pinky extended.",A.measureOpenPalm,{enterThreshold:.7,exitThreshold:.45}),handRaised:k("handRaised","Wrist in the upper part of the frame (0 bottom edge, 1 top edge).",A.measureHandHeight,{enterThreshold:.7,exitThreshold:.6}),oneFinger:k("oneFinger","Index extended, other fingers curled (pointing).",e=>A.measureFingerPattern(e,{fingers:[!0,!1,!1,!1]}),{enterThreshold:.65,exitThreshold:.45}),peaceSign:k("peaceSign","Index and middle extended, ring and pinky curled.",e=>A.measureFingerPattern(e,{fingers:[!0,!0,!1,!1]}),{enterThreshold:.65,exitThreshold:.45}),threeFingers:k("threeFingers","Index, middle and ring extended, pinky curled.",e=>A.measureFingerPattern(e,{fingers:[!0,!0,!0,!1]}),{enterThreshold:.65,exitThreshold:.45}),fourFingers:k("fourFingers","Index to pinky extended, thumb tucked.",e=>A.measureFingerPattern(e,{fingers:[!0,!0,!0,!0],thumb:!1}),{enterThreshold:.65,exitThreshold:.45}),fist:k("fist","All four fingers curled and the thumb tucked.",e=>A.measureFingerPattern(e,{fingers:[!1,!1,!1,!1],thumb:!1}),{enterThreshold:.65,exitThreshold:.45}),palm:k("palm","All four fingers extended and the thumb out.",e=>A.measureFingerPattern(e,{fingers:[!0,!0,!0,!0],thumb:!0}),{enterThreshold:.65,exitThreshold:.45}),thumbUp:k("thumbUp","Thumb out and pointing up, fingers curled.",e=>A.measureThumb(e,"up"),{enterThreshold:.6,exitThreshold:.4}),thumbDown:k("thumbDown","Thumb out and pointing down, fingers curled.",e=>A.measureThumb(e,"down"),{enterThreshold:.6,exitThreshold:.4}),wave:{name:"wave",kind:"hand",description:"Wrist swinging side to side: three turning points of at least 0.08 within 1.2 s.",defaults:Te,createMemory:he({minAmplitude:.08,requiredReversals:3,windowMs:1200}),measure:(e,r,t)=>fe(r,e&&e.length>=21?e[0].x:null,t)},armRaisedLeft:V("armRaisedLeft","Person's left wrist above the left shoulder, in shoulder widths.",e=>A.measureArmRaise(e,"left"),{enterThreshold:.3,exitThreshold:.15}),armRaisedRight:V("armRaisedRight","Person's right wrist above the right shoulder, in shoulder widths.",e=>A.measureArmRaise(e,"right"),{enterThreshold:.3,exitThreshold:.15}),armRaised:V("armRaised","Either wrist above its shoulder.",e=>Math.max(A.measureArmRaise(e,"left"),A.measureArmRaise(e,"right")),{enterThreshold:.3,exitThreshold:.15}),bothArmsRaised:V("bothArmsRaised","Both wrists above their shoulders.",e=>Math.min(A.measureArmRaise(e,"left"),A.measureArmRaise(e,"right")),{enterThreshold:.3,exitThreshold:.15}),tPose:V("tPose","Both arms level and outstretched.",A.measureTPose,{enterThreshold:.6,exitThreshold:.4,holdMs:150})},Bt=Object.keys(ge),Je=e=>typeof e=="string"?ge[e]:e,Ut=e=>e,Gt={face:E.XRModel.FACE_TRACKER,hand:E.XRModel.HAND_TRACKER,body:E.XRModel.BODY_TRACKER},ve=e=>C.snapshotGestureState(C.createGestureDetectorState(e)),$e=(e,r={})=>{var Le;const t=o.useMemo(()=>Je(e),[e]),{active:n=!0,faceIndex:s=0,numFaces:i,hand:u,handIndex:a=0,bodyIndex:l=0,targetFps:c,onBegin:f,onEnd:h,onChange:m,...T}=r,p=Gt[t.kind],R=Math.max(i??s+1,s+1),g=o.useMemo(()=>{const x={};return t.kind==="face"&&(x.numFaces=R),c!==void 0&&c>0&&(x.targetFps=c),Object.keys(x).length>0?x:void 0},[t.kind,R,c]),{node:d,ready:S}=I.useXRModel(p,g,n),{camera:D}=L.useThree();o.useEffect(()=>{!d||t.kind!=="face"||d.setCamera(D,s)},[D,t.kind,s,d]);const b=o.useMemo(()=>C.resolveGestureDetectorOptions(T,C.resolveGestureDetectorOptions(t.defaults)),[t,T.enterThreshold,T.exitThreshold,T.holdMs,T.cooldownMs,T.minConfidence,T.lostGraceMs]),M=o.useRef(C.createGestureDetectorState(t.name)),P=o.useRef((Le=t.createMemory)==null?void 0:Le.call(t)),v=o.useRef(y.createFaceInfoTarget()),[Z,_]=o.useState(()=>ve(t.name)),G=o.useRef(Z);o.useEffect(()=>{var w;M.current=C.createGestureDetectorState(t.name),P.current=(w=t.createMemory)==null?void 0:w.call(t);const x=ve(t.name);G.current=x,_(x)},[t]);const Ie=o.useRef({onBegin:f,onEnd:h,onChange:m});Ie.current={onBegin:f,onEnd:h,onChange:m};const Oe=o.useRef({faceIndex:s,hand:u,handIndex:a,bodyIndex:l,active:n});return Oe.current={faceIndex:s,hand:u,handIndex:a,bodyIndex:l,active:n},L.useFrame(()=>{var Ce;const x=performance.now(),w=Oe.current;let be=null;if(w.active&&S&&d){let Q;t.kind==="face"?Q=y.getFaceInfo(d,w.faceIndex,v.current):t.kind==="hand"?Q=(Ce=Be(d,w.hand,w.handIndex))==null?void 0:Ce.coordinates:Q=d.getLandmarks2D(w.bodyIndex),be=t.measure(Q,P.current,x)}const ke=C.stepGestureDetector(M.current,be,x,b);if(C.gestureStatesEqual(G.current,ke))return;const H=C.snapshotGestureState(ke);G.current=H,_(H);const{onBegin:ce,onEnd:le,onChange:de}=Ie.current;H.justBegan&&(ce==null||ce(H)),H.justEnded&&(le==null||le(H)),de==null||de(H)}),Z},jt=({gesture:e,...r})=>($e(e,r),null),ae=1,ue=Object.freeze({version:ae,orientation:0,mirrored:"auto",scale:1,offset:Object.freeze({x:0,y:0}),face:null,body:null,updatedAt:0}),Ze=(e={})=>J(ue,e,0),Kt=[0,90,180,270],Xt=e=>Math.min(4,Math.max(.25,e)),J=(e,r,t=Date.now())=>({version:ae,orientation:r.orientation!==void 0&&Kt.includes(r.orientation)?r.orientation:e.orientation,mirrored:r.mirrored===!0||r.mirrored===!1||r.mirrored==="auto"?r.mirrored:e.mirrored,scale:r.scale!==void 0&&Number.isFinite(r.scale)&&r.scale>0?Xt(r.scale):e.scale,offset:r.offset&&Number.isFinite(r.offset.x)&&Number.isFinite(r.offset.y)?{x:r.offset.x,y:r.offset.y}:{...e.offset},face:r.face!==void 0?r.face:e.face,body:r.body!==void 0?r.body:e.body,updatedAt:t}),Qe=(e=Date.now())=>J(ue,{},e),Wt=e=>e.orientation===0&&e.mirrored==="auto"&&e.scale===1&&e.offset.x===0&&e.offset.y===0,et=(e,r)=>e.mirrored==="auto"?!1:e.mirrored!==E.isMirroredSourceKind(r),tt=(e,r,t,n={x:0,y:0})=>{let{x:s,y:i}=e;switch(r.orientation){case 90:[s,i]=[1-i,s];break;case 180:[s,i]=[1-s,1-i];break;case 270:[s,i]=[i,1-s];break}return et(r,t)&&(s=1-s),s=.5+(s-.5)*r.scale+r.offset.x,i=.5+(i-.5)*r.scale+r.offset.y,n.x=s,n.y=i,e.z!==void 0&&(n.z=e.z),n},ne=(e,r)=>e&&r?Math.hypot(e.x-r.x,e.y-r.y):null,rt=Object.freeze({leftTemple:234,rightTemple:454,leftEyeOuter:33,rightEyeOuter:263}),Ae=(e,r=Date.now())=>{if(!e||e.length<468)return null;const{leftTemple:t,rightTemple:n,leftEyeOuter:s,rightEyeOuter:i}=rt,u=ne(e[t],e[n]),a=ne(e[s],e[i]);return!u||!a?null:{faceWidth:u,eyeDistance:a,capturedAt:r}},nt=Object.freeze({leftShoulder:11,rightShoulder:12,leftHip:23,rightHip:24}),_e=(e,r=Date.now())=>{if(!e||e.length<33)return null;const{leftShoulder:t,rightShoulder:n,leftHip:s,rightHip:i}=nt,u=ne(e[t],e[n]),a=ne(e[s],e[i]),l=e[t],c=e[n],f=e[s],h=e[i];if(!u||!a||!l||!c||!f||!h)return null;const m=Math.hypot((l.x+c.x)/2-(f.x+h.x)/2,(l.y+c.y)/2-(f.y+h.y)/2);return{shoulderWidth:u,hipWidth:a,torsoLength:m,capturedAt:r}},st=(e,r)=>{const t=r.face,n=Ae(e,0);return!t||!n?null:t.faceWidth>0&&n.faceWidth>0?n.faceWidth/t.faceWidth:t.eyeDistance>0&&n.eyeDistance>0?n.eyeDistance/t.eyeDistance:null},ot=(e,r)=>{const t=r.body,n=_e(e,0);return!t||!n||t.shoulderWidth<=0?null:n.shoulderWidth/t.shoulderWidth},$="vincentt.xr.calibration",ye=()=>{try{return typeof localStorage<"u"?localStorage:null}catch{return null}},it=(e=$,r=ye())=>{if(!r)return null;try{const t=r.getItem(e);if(!t)return null;const n=JSON.parse(t);return!n||typeof n!="object"||n.version!==ae?null:J(ue,{orientation:n.orientation,mirrored:n.mirrored,scale:n.scale,offset:n.offset,face:n.face??null,body:n.body??null},typeof n.updatedAt=="number"?n.updatedAt:0)}catch{return null}},at=(e,r=$,t=ye())=>{if(!t)return!1;try{return t.setItem(r,JSON.stringify(e)),!0}catch{return!1}},ut=(e=$,r=ye())=>{if(r)try{r.removeItem(e)}catch{}},Yt=(e={})=>{const{storageKey:r=$,persist:t=!0}=e,n=e.storage===void 0?void 0:e.storage,s=o.useRef(e.initial),{session:i}=E.useXRContext(),u=o.useSyncExternalStore(d=>i.store.subscribe(d),()=>i.store.getSnapshot().sourceKind,()=>{}),[a,l]=o.useState(()=>Ze(s.current)),[c,f]=o.useState(!t),h=o.useRef(a);h.current=a,o.useEffect(()=>{if(!t){f(!0);return}const d=it(r,n);d&&(h.current=d,l(d)),f(!0)},[t,r,n]);const m=o.useCallback(d=>(h.current=d,l(d),t&&at(d,r,n),d),[t,r,n]),T=o.useCallback(d=>m(J(h.current,d)),[m]),p=o.useCallback(()=>{const d=Qe();return h.current=d,l(d),t&&ut(r,n),d},[t,r,n]),R=o.useCallback(d=>{const S=Ae(d);return S?(T({face:S}),!0):!1},[T]),g=o.useCallback(d=>{const S=_e(d);return S?(T({body:S}),!0):!1},[T]);return o.useMemo(()=>({calibration:a,hydrated:c,update:T,reset:p,calibrateFace:R,calibrateBody:g,applyToFeedPoint:(d,S)=>tt(d,a,u,S),faceDistance:d=>st(d,a),bodyScale:d=>ot(d,a),sourceKind:u}),[a,c,T,p,R,g,u])},qt=(e,r)=>r&&!e?"begin":!r&&e?"end":r?"stay":"none",zt={face:null,faces:[],faceCount:0,detected:!1,justDetected:!1,justLost:!1,phase:"none"},Vt=({faceIndex:e=0,numFaces:r,...t}={})=>{const n=Number.isFinite(e)?Math.max(0,Math.round(e)):0,s=F.useFaceInfos({...t,numFaces:Math.max(r??n+1,n+1)}),i=o.useRef([]),u=o.useRef(n),a=o.useRef({detected:!1,faceIndex:n}),[l,c]=o.useState(zt),f=o.useRef(l);return o.useEffect(()=>{i.current=s,u.current=n},[s,n]),L.useFrame(()=>{const h=i.current,m=u.current,T=h[m]??null,p=!!T,R=a.current.faceIndex===m&&a.current.detected,g=qt(R,p);a.current={detected:p,faceIndex:m};const d={face:T,faces:h,faceCount:h.length,detected:p,justDetected:g==="begin",justLost:g==="end",phase:g},S=f.current;S.face===d.face&&S.faces===d.faces&&S.faceCount===d.faceCount&&S.detected===d.detected&&S.justDetected===d.justDetected&&S.justLost===d.justLost&&S.phase===d.phase||(f.current=d,c(d))}),l},we=e=>({action:e,active:!1,value:0,justStarted:!1,justEnded:!1,phase:"none"}),Jt=(e,r,t={})=>{const n=o.useRef(Me(r)),s=o.useRef(null),i=o.useRef(r),u=o.useRef({}),[a,l]=o.useState(()=>we(r)),c=o.useRef(a);return o.useEffect(()=>{s.current=e,u.current=t},[e,t]),o.useEffect(()=>{i.current=r,n.current=Me(r);const f=we(r);c.current=f,l(f)},[r]),L.useFrame(({clock:f})=>{const h=s.current,m=i.current,T=u.current,p=h?U(h,m,T):0,R=Ht(n.current,p,f.elapsedTime*1e3,!!h,Ve(m,T)),g=c.current;if(g.action===R.action&&g.active===R.active&&g.value===R.value&&g.justStarted===R.justStarted&&g.justEnded===R.justEnded&&g.phase===R.phase)return;const d={action:R.action,active:R.active,value:R.value,justStarted:R.justStarted,justEnded:R.justEnded,phase:R.phase};c.current=d,l(d)}),a},$t=["angry","disgust","fear","happy","neutral","sad","surprise","unknown"],X=["angry","disgust","fear","happy","neutral","sad","surprise"],Zt=(e,r=.55)=>{let t=-1/0;for(let c=0;c<X.length;c+=1)t=Math.max(t,Number(e[c])||0);const n=new Array(X.length);let s=0;for(let c=0;c<X.length;c+=1){const f=Math.exp((Number(e[c])||0)-t);n[c]=f,s+=f}const i=Object.fromEntries(X.map(c=>[c,0]));let u="unknown",a=0;for(let c=0;c<X.length;c+=1){const f=s?n[c]/s:0,h=X[c];i[h]=f,f>a&&(u=h,a=f)}const l=Number.isFinite(r)?Math.min(1,Math.max(0,r)):.55;return{expression:a>=l?u:"unknown",confidence:a,scores:i}},Qt=e=>{const r=e.width*e.height,t=new Float32Array(r*3);for(let n=0,s=0;n<r;n+=1,s+=4)t[n]=e.data[s]/127.5-1,t[r+n]=e.data[s+1]/127.5-1,t[r*2+n]=e.data[s+2]/127.5-1;return t},ct="https://huggingface.co/opencv/facial_expression_recognition/resolve/main/facial_expression_recognition_mobilefacenet_2022july_int8.onnx",er=e=>`https://cdn.jsdelivr.net/npm/onnxruntime-web@${e.env.versions.web}/dist/`,me=new Map,tr=e=>{let r=me.get(e);return r||(r=Promise.all([import("onnxruntime-web/wasm"),E.fetchAndVerify(e)]).then(([t,n])=>(t.env.wasm.wasmPaths=er(t),t.InferenceSession.create(n,{executionProviders:["wasm"]}))).catch(t=>{throw me.delete(e),t}),me.set(e,r)),r},rr=(e,{active:r=!0,targetFps:t=5,minConfidence:n=.55,modelUrl:s=ct}={})=>{const{session:i}=E.useXRContext(),u=o.useRef(null),a=o.useRef(null),l=o.useRef(!1),c=o.useRef(-1/0),f=o.useRef(!0),[h,m]=o.useState({status:"idle",result:null,error:null});return o.useEffect(()=>{const T=document.createElement("canvas");return u.current=T,a.current=T.getContext("2d",{willReadFrequently:!0}),f.current=!0,()=>{f.current=!1,u.current=null,a.current=null}},[]),L.useFrame(({clock:T})=>{if(!r||!e||l.current||h.status==="error")return;const p=Number.isFinite(t)&&t>0?t:5,R=T.elapsedTime*1e3;if(R-c.current<1e3/p)return;const g=i.getInputFrame(),d=u.current,S=a.current;if(!g||!d||!S||!qe({source:g,face:e,canvas:d,outputSize:{width:112,height:112}}))return;c.current=R,l.current=!0,h.status==="idle"&&m({status:"loading",result:null,error:null});const D=Qt(S.getImageData(0,0,112,112));Promise.all([import("onnxruntime-web/wasm"),tr(s)]).then(async([b,M])=>{const P=await M.run({[M.inputNames[0]]:new b.Tensor("float32",D,[1,3,112,112])}),v=Zt(P[M.outputNames[0]].data,n);f.current&&m({status:"ready",result:v,error:null})}).catch(b=>{f.current&&m({status:"error",result:null,error:b instanceof Error?b:new Error(String(b))})}).finally(()=>{l.current=!1})}),h};exports.FACE_LANDMARK_INDICES=I.FACE_LANDMARK_INDICES;exports.FaceMesh=I.FaceMesh;exports.FaceTracker=I.FaceTracker;exports.DEFAULT_HOLISTIC_ANALYSIS_MAX_DIMENSION=E.DEFAULT_HOLISTIC_ANALYSIS_MAX_DIMENSION;exports.DEFAULT_HOLISTIC_HOLD_MS=E.DEFAULT_HOLISTIC_HOLD_MS;exports.DEFAULT_HOLISTIC_MODEL_URL=E.DEFAULT_HOLISTIC_MODEL_URL;exports.DEFAULT_HOLISTIC_PREDICT_MS=E.DEFAULT_HOLISTIC_PREDICT_MS;exports.clearSemanticMask=E.clearSemanticMask;exports.createSemanticMask=E.createSemanticMask;exports.normalizedTrackerPointToTrackerPoint=E.normalizedTrackerPointToTrackerPoint;exports.trackerPointToNormalizedTrackerPoint=E.trackerPointToNormalizedTrackerPoint;exports.SEGMENTATION_TYPES=re.SEGMENTATION_TYPES;exports.SEMANTIC_SEGMENTATION_PRESETS=re.SEMANTIC_SEGMENTATION_PRESETS;exports.BODY_TARGETS=q.BODY_TARGETS;exports.DEFAULT_TRACKING_ANCHOR=q.DEFAULT_TRACKING_ANCHOR;exports.FACE_TARGETS=q.FACE_TARGETS;exports.HAND_TARGETS=q.HAND_TARGETS;exports.TrackingAnchor=q.TrackingAnchor;exports.getTargetNamespace=q.getTargetNamespace;exports.DEFAULT_GESTURE_DETECTOR_OPTIONS=C.DEFAULT_GESTURE_DETECTOR_OPTIONS;exports.resolveGestureDetectorOptions=C.resolveGestureDetectorOptions;exports.DEFAULT_FACE_EXPRESSION_THRESHOLD=y.DEFAULT_FACE_EXPRESSION_THRESHOLD;exports.getFaceBlendshape=y.getFaceBlendshape;exports.getFaceEyeDistance=y.getFaceEyeDistance;exports.hasFaceExpression=y.hasFaceExpression;exports.useFaceResults=A.useFaceResults;exports.DEFAULT_POLICY_NUM_FACES=F.DEFAULT_POLICY_NUM_FACES;exports.DEFAULT_SUBJECT_POLICY=F.DEFAULT_SUBJECT_POLICY;exports.EMPTY_SUBJECT_MEMORY=F.EMPTY_SUBJECT_MEMORY;exports.XR_MAX_SUBJECTS=F.XR_MAX_SUBJECTS;exports.associateSubjects=F.associateSubjects;exports.faceCandidates=F.faceCandidates;exports.jointCandidates=F.jointCandidates;exports.selectSubject=F.selectSubject;exports.useFaceInfo=F.useFaceInfo;exports.useFaceInfos=F.useFaceInfos;exports.SegmentationOverlay=Pe.SegmentationOverlay;exports.useIrisTracking=Pe.useIrisTracking;exports.DEFAULT_GESTURE_SETTINGS=N.DEFAULT_GESTURE_SETTINGS;exports.DEFAULT_HOLISTIC_TRACKER_SETTINGS=N.DEFAULT_HOLISTIC_TRACKER_SETTINGS;exports.GESTURE_SETTINGS_FIELDS=N.GESTURE_SETTINGS_FIELDS;exports.HOLISTIC_HANDS_OPTIONS=N.HOLISTIC_HANDS_OPTIONS;exports.HOLISTIC_TRACKER_SETTINGS_FIELDS=N.HOLISTIC_TRACKER_SETTINGS_FIELDS;exports.patchGestureSettings=N.patchGestureSettings;exports.patchHolisticTrackerSettings=N.patchHolisticTrackerSettings;exports.resolveGestureSettings=N.resolveGestureSettings;exports.resolveHolisticTrackerSettings=N.resolveHolisticTrackerSettings;exports.toHolisticTrackerProps=N.toHolisticTrackerProps;exports.IRIS_LANDMARKS=z.IRIS_LANDMARKS;exports.IRIS_LANDMARK_COUNT=z.IRIS_LANDMARK_COUNT;exports.PERSON_MASK_LABELS=z.PERSON_MASK_LABELS;exports.useHairMask=z.useHairMask;exports.usePersonMask=z.usePersonMask;exports.useSemanticSegmentationMask=z.useSemanticSegmentationMask;exports.DEFAULT_SEGMENTATION_OVERLAY_SETTINGS=Ee.DEFAULT_SEGMENTATION_OVERLAY_SETTINGS;exports.patchSegmentationOverlaySettings=Ee.patchSegmentationOverlaySettings;exports.resolveSegmentationOverlaySettings=Ee.resolveSegmentationOverlaySettings;exports.BODY_CALIBRATION_LANDMARKS=nt;exports.BodyTracker=gt;exports.CALIBRATION_STORAGE_KEY=$;exports.CALIBRATION_VERSION=ae;exports.DEFAULT_CALIBRATION=ue;exports.DEFAULT_FACE_ACTION_OPTIONS=ze;exports.DEFAULT_FACE_ATTRIBUTE_EXPRESSION_MODEL_URL=ct;exports.DEFAULT_HOLISTIC_SIGNAL_THRESHOLDS=se;exports.FACE_ACTION_NAMES=vt;exports.FACE_ATTRIBUTE_EXPRESSION_NAMES=$t;exports.FACE_BLENDSHAPE_NAMES=Mt;exports.FACE_CALIBRATION_LANDMARKS=rt;exports.GESTURES=ge;exports.GESTURE_NAMES=Bt;exports.GestureListener=jt;exports.GestureTracker=pt;exports.GestureTrigger=Nt;exports.HandTracker=Rt;exports.HolisticTracker=oe;exports.Segmentation=bt;exports.applyCalibrationToFeedPoint=tt;exports.clearCalibration=ut;exports.createCalibration=Ze;exports.createHolisticSignals=Ge;exports.defineGesture=Ut;exports.drawFaceCrop=qe;exports.estimateBodyScale=ot;exports.estimateFaceDistance=st;exports.getFaceActionValue=U;exports.getHolisticSignals=yt;exports.getStrongestFaceAction=Pt;exports.hasFaceAction=wt;exports.isHandRaised=Re;exports.isIdentityCalibration=Wt;exports.isPalmOpen=Se;exports.loadCalibration=it;exports.measureBodyCalibration=_e;exports.measureFaceCalibration=Ae;exports.resetCalibration=Qe;exports.resolveCalibrationMirror=et;exports.resolveGestureDefinition=Je;exports.saveCalibration=at;exports.updateCalibration=J;exports.useFaceAction=Jt;exports.useFaceAttributeExpression=rr;exports.useFaceDetection=Vt;exports.useGesture=$e;exports.useHolisticTracking=Ke;exports.useXRCalibration=Yt;