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

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 (639) hide show
  1. package/GROUNDING.md +5651 -82
  2. package/README.md +1 -0
  3. package/dist/CanonicalHeadFrame-BHcWyaiK.js +1506 -0
  4. package/dist/CanonicalHeadFrame-D-_T1OMU.cjs +1 -0
  5. package/dist/DebuggerUI-7ngnJsBe.js +275 -0
  6. package/dist/DebuggerUI-CoglgKdO.cjs +1 -0
  7. package/dist/FaceRetouch-CLoTfrcs.js +1071 -0
  8. package/dist/FaceRetouch-J1lC1WbS.cjs +134 -0
  9. package/dist/FaceSurface-CHAMEeG1.cjs +1 -0
  10. package/dist/FaceSurface-DmP9AEeC.js +27 -0
  11. package/dist/SegmentationOverlay-D_FWkcyP.cjs +35 -0
  12. package/dist/SegmentationOverlay-vn5x_knv.js +6237 -0
  13. package/dist/SkeletonUtils-C2r90MtN.js +21 -0
  14. package/dist/SkeletonUtils-CddIup1F.cjs +1 -0
  15. package/dist/TextLabel-XE0rQSDn.cjs +2 -0
  16. package/dist/TextLabel-c9BCucOI.js +961 -0
  17. package/dist/assets/cache.d.ts +99 -0
  18. package/dist/assets/estimate.d.ts +11 -0
  19. package/dist/assets/gltfLoader.d.ts +16 -0
  20. package/dist/assets/index.d.ts +7 -0
  21. package/dist/assets/loaders.d.ts +43 -0
  22. package/dist/assets/react.d.ts +33 -0
  23. package/dist/body-pose/index.d.ts +521 -0
  24. package/dist/body-trigger/__fixtures__/syntheticBody.d.ts +83 -0
  25. package/dist/body-trigger/frame.d.ts +88 -0
  26. package/dist/body-trigger/index.d.ts +6 -0
  27. package/dist/body-trigger/moves.d.ts +235 -0
  28. package/dist/body-trigger/trigger.d.ts +75 -0
  29. package/dist/calibration/calibration.d.ts +75 -0
  30. package/dist/calibration/index.d.ts +6 -0
  31. package/dist/calibration/storage.d.ts +13 -0
  32. package/dist/calibration/types.d.ts +53 -0
  33. package/dist/calibration/useXRCalibration.d.ts +46 -0
  34. package/dist/camera/CameraPermissionGate.d.ts +26 -0
  35. package/dist/camera/devices.d.ts +26 -0
  36. package/dist/camera/index.d.ts +8 -0
  37. package/dist/camera/permission.d.ts +86 -0
  38. package/dist/camera/useCameraPermission.d.ts +35 -0
  39. package/dist/canonicalFace-BHwyCx1c.js +9 -0
  40. package/dist/canonicalFace-C83I225R.cjs +1 -0
  41. package/dist/capabilities/detect.d.ts +45 -0
  42. package/dist/capabilities/index.d.ts +5 -0
  43. package/dist/capabilities/types.d.ts +120 -0
  44. package/dist/capabilities/useXRCapabilities.d.ts +18 -0
  45. package/dist/compat/environment.d.ts +5 -0
  46. package/dist/compat/index.d.ts +4 -0
  47. package/dist/compat/run.d.ts +18 -0
  48. package/dist/compat/scenarios.d.ts +10 -0
  49. package/dist/compat/types.d.ts +101 -0
  50. package/dist/components/BodyInstruction/BodyPoseHint.d.ts +63 -0
  51. package/dist/components/BodyInstruction/index.d.ts +69 -0
  52. package/dist/components/BodyInstruction/useBodyPose.d.ts +23 -0
  53. package/dist/components/BodyTracker/index.d.ts +17 -0
  54. package/dist/components/BodyTrigger/index.d.ts +49 -0
  55. package/dist/components/Debugger/DebuggerProvider.d.ts +14 -1
  56. package/dist/components/Debugger/DebuggerUI.d.ts +3 -1
  57. package/dist/components/FaceAtlas/FaceAtlasLayer.d.ts +114 -0
  58. package/dist/components/FaceAtlas/MadeUpCamera.d.ts +80 -0
  59. package/dist/components/FaceAtlas/constants.d.ts +8 -0
  60. package/dist/components/FaceAtlas/index.d.ts +7 -0
  61. package/dist/components/FaceAtlas/useFaceAtlasSurface.d.ts +84 -0
  62. package/dist/components/FaceAtlas/useFaceSkin.d.ts +84 -0
  63. package/dist/components/FaceCharacter/ExternalFaceMesh.d.ts +109 -0
  64. package/dist/components/FaceCharacter/FaceExpressionController.d.ts +53 -0
  65. package/dist/components/FaceCharacter/FaceMorph.d.ts +71 -0
  66. package/dist/components/FaceCharacter/FacePiercing.d.ts +65 -0
  67. package/dist/components/FaceCharacter/FaceReprojection.d.ts +85 -0
  68. package/dist/components/FaceCharacter/FaceRig.d.ts +38 -0
  69. package/dist/components/FaceCharacter/FaceSurface.d.ts +49 -0
  70. package/dist/components/FaceCharacter/FaceSurfaceOccluder.d.ts +39 -0
  71. package/dist/components/FaceCharacter/PinToFaceMesh.d.ts +68 -0
  72. package/dist/components/FaceCharacter/index.d.ts +18 -0
  73. package/dist/components/FaceCharacter/useFaceReprojector.d.ts +10 -0
  74. package/dist/components/FaceInset/FaceInset.d.ts +68 -0
  75. package/dist/components/FaceInset/frame.d.ts +94 -0
  76. package/dist/components/FaceInset/index.d.ts +6 -0
  77. package/dist/components/FaceInset/material.d.ts +40 -0
  78. package/dist/components/FaceInset/useFaceInsetTexture.d.ts +37 -0
  79. package/dist/components/FaceInstruction/FaceExpressionHint.d.ts +43 -0
  80. package/dist/components/FaceInstruction/index.d.ts +56 -0
  81. package/dist/components/FaceInstruction/useFaceExpression.d.ts +20 -0
  82. package/dist/components/FaceLiquify/FaceLiquify.d.ts +49 -0
  83. package/dist/components/FaceLiquify/debug.d.ts +37 -0
  84. package/dist/components/FaceLiquify/frame.d.ts +55 -0
  85. package/dist/components/FaceLiquify/index.d.ts +10 -0
  86. package/dist/components/FaceLiquify/material.d.ts +39 -0
  87. package/dist/components/FaceLiquify/pass.d.ts +49 -0
  88. package/dist/components/FaceLiquify/presence.d.ts +25 -0
  89. package/dist/components/FaceLiquify/presets.d.ts +82 -0
  90. package/dist/components/FaceLiquify/selfTest.d.ts +66 -0
  91. package/dist/components/FaceLiquify/target.d.ts +85 -0
  92. package/dist/components/FaceLiquify/warp.d.ts +72 -0
  93. package/dist/components/FaceMesh/canonical/CanonicalFaceMeshRenderer.d.ts +37 -5
  94. package/dist/components/FaceMesh/canonical/geometryGroups.d.ts +21 -0
  95. package/dist/components/FaceMesh/canonical/parseCanonicalFaceModel.d.ts +21 -0
  96. package/dist/components/FaceMesh/canonical/shaders.d.ts +1 -1
  97. package/dist/components/FaceMesh/index.d.ts +2 -2
  98. package/dist/components/FaceRetouch/Background.d.ts +3 -1
  99. package/dist/components/FaceRetouch/FaceRetouch.d.ts +5 -0
  100. package/dist/components/FaceRetouch/renderState.d.ts +19 -0
  101. package/dist/components/FaceSwap/FaceMirror.d.ts +46 -0
  102. package/dist/components/FaceSwap/FaceSwap.d.ts +58 -0
  103. package/dist/components/FaceSwap/FaceTextureLayer.d.ts +72 -0
  104. package/dist/components/FaceSwap/faceSwapPlan.d.ts +91 -0
  105. package/dist/components/FaceSwap/index.d.ts +13 -0
  106. package/dist/components/FaceSwap/settings.d.ts +300 -0
  107. package/dist/components/FaceSwap/useFaceTexture.d.ts +35 -0
  108. package/dist/components/FaceSwap/useLiveFace.d.ts +38 -0
  109. package/dist/components/FaceSwap/useLiveFaceTexture.d.ts +31 -0
  110. package/dist/components/FaceWarp3D/FaceWarp3D.d.ts +50 -0
  111. package/dist/components/FaceWarp3D/index.d.ts +2 -3
  112. package/dist/components/Faceless/Faceless.d.ts +51 -0
  113. package/dist/components/Faceless/index.d.ts +2 -0
  114. package/dist/components/GestureListener/index.d.ts +11 -0
  115. package/dist/components/HairLock/HairLock.d.ts +39 -0
  116. package/dist/components/HairLock/index.d.ts +2 -0
  117. package/dist/components/HairLock/lockGeometry.d.ts +15 -0
  118. package/dist/components/HandCutout/index.d.ts +35 -0
  119. package/dist/components/HandInstruction/HandGestureHint.d.ts +70 -0
  120. package/dist/components/HandInstruction/index.d.ts +74 -0
  121. package/dist/components/HandInstruction/useHandGesture.d.ts +22 -0
  122. package/dist/components/HandRig/ForearmOccluder.d.ts +29 -0
  123. package/dist/components/HandRig/HandAttachment.d.ts +34 -0
  124. package/dist/components/HandRig/HandOccluder.d.ts +55 -0
  125. package/dist/components/HandRig/HandTattoo.d.ts +61 -0
  126. package/dist/components/HandRig/WristAttachment.d.ts +34 -0
  127. package/dist/components/HandRig/index.d.ts +101 -0
  128. package/dist/components/HandRig/useArmMask.d.ts +29 -0
  129. package/dist/components/HandRig/wristSolve.d.ts +69 -0
  130. package/dist/components/HandTouch/HandTouch.d.ts +62 -0
  131. package/dist/components/HandTouch/Touchable.d.ts +36 -0
  132. package/dist/components/HandTouch/index.d.ts +2 -0
  133. package/dist/components/HandTracker/index.d.ts +10 -0
  134. package/dist/components/HeadBinding/index.d.ts +14 -0
  135. package/dist/components/HeadOccluder/CanonicalHeadFrame.d.ts +22 -0
  136. package/dist/components/HeadOccluder/Earrings.d.ts +55 -0
  137. package/dist/components/HeadOccluder/HeadAttachment.d.ts +38 -0
  138. package/dist/components/HeadOccluder/NeckOccluder.d.ts +64 -0
  139. package/dist/components/HeadOccluder/earringPlacement.d.ts +31 -0
  140. package/dist/components/HeadOccluder/headAttachmentPoints.d.ts +69 -0
  141. package/dist/components/HeadOccluder/index.d.ts +57 -3
  142. package/dist/components/HeadOccluder/useCanonicalHeadFit.d.ts +36 -0
  143. package/dist/components/HeadOccluder/useLandmarkPoseFit.d.ts +80 -0
  144. package/dist/components/HolisticTracker/index.d.ts +69 -0
  145. package/dist/components/HolisticTracker/settings.d.ts +58 -0
  146. package/dist/components/HolisticTracker/signals.d.ts +49 -0
  147. package/dist/components/Instruction/HintStage.d.ts +29 -0
  148. package/dist/components/Instruction/InstructionCue.d.ts +126 -0
  149. package/dist/components/Instruction/gestureHold.d.ts +20 -0
  150. package/dist/components/Instruction/ghost.d.ts +129 -0
  151. package/dist/components/Instruction/hintBlend.d.ts +19 -0
  152. package/dist/components/Instruction/hintLook.d.ts +81 -0
  153. package/dist/components/Instruction/hintLoop.d.ts +36 -0
  154. package/dist/components/Instruction/index.d.ts +41 -0
  155. package/dist/components/Instruction/useGhostModel.d.ts +33 -0
  156. package/dist/components/Instruction/useInstructionHold.d.ts +72 -0
  157. package/dist/components/IrisEffect/IrisMaterial.d.ts +73 -0
  158. package/dist/components/IrisEffect/index.d.ts +51 -0
  159. package/dist/components/IrisEffect/settings.d.ts +117 -0
  160. package/dist/components/LipEffect/LipEffect.d.ts +27 -1
  161. package/dist/components/LipEffect/LipEffectMaterial.d.ts +95 -7
  162. package/dist/components/LipEffect/LipEffects.d.ts +12 -0
  163. package/dist/components/LipEffect/defaults.d.ts +46 -4
  164. package/dist/components/LipEffect/index.d.ts +11 -3
  165. package/dist/components/LipEffect/lipShading.d.ts +73 -0
  166. package/dist/components/LipEffect/settings.d.ts +375 -0
  167. package/dist/components/LipEffect/shader.d.ts +39 -0
  168. package/dist/components/LipEffect/types.d.ts +128 -9
  169. package/dist/components/LipEffect/useLipDesignTextures.d.ts +17 -0
  170. package/dist/components/LipEffect/uvGuide.d.ts +74 -0
  171. package/dist/components/Makeup/Blush.d.ts +18 -0
  172. package/dist/components/Makeup/Brows.d.ts +20 -0
  173. package/dist/components/Makeup/Contour.d.ts +17 -0
  174. package/dist/components/Makeup/Eyeliner.d.ts +20 -0
  175. package/dist/components/Makeup/Eyeshadow.d.ts +20 -0
  176. package/dist/components/Makeup/Highlighter.d.ts +18 -0
  177. package/dist/components/Makeup/MakeupDesign.d.ts +37 -0
  178. package/dist/components/Makeup/MakeupRegion.d.ts +132 -0
  179. package/dist/components/Makeup/constants.d.ts +44 -0
  180. package/dist/components/Makeup/design.d.ts +106 -0
  181. package/dist/components/Makeup/designSamples.d.ts +42 -0
  182. package/dist/components/Makeup/eyes.d.ts +114 -0
  183. package/dist/components/Makeup/fields.d.ts +10 -0
  184. package/dist/components/Makeup/geometry.d.ts +106 -0
  185. package/dist/components/Makeup/index.d.ts +26 -0
  186. package/dist/components/Makeup/looks.d.ts +28 -0
  187. package/dist/components/Makeup/material.d.ts +239 -0
  188. package/dist/components/Makeup/settings.d.ts +54 -0
  189. package/dist/components/Makeup/shades.d.ts +143 -0
  190. package/dist/components/Makeup/shapes.d.ts +27 -0
  191. package/dist/components/Makeup/skinTone.d.ts +135 -0
  192. package/dist/components/Makeup/types.d.ts +110 -0
  193. package/dist/components/Makeup/useMakeupSkinTone.d.ts +40 -0
  194. package/dist/components/Necklace/Necklace.d.ts +44 -0
  195. package/dist/components/Necklace/index.d.ts +1 -0
  196. package/dist/components/ParticleEmitter/ParticleEmitter.d.ts +69 -0
  197. package/dist/components/ParticleEmitter/index.d.ts +1 -0
  198. package/dist/components/PersonCutout/index.d.ts +50 -0
  199. package/dist/components/PersonCutout/personCutout.d.ts +16 -0
  200. package/dist/components/ScreenImage/components/ScreenImageBody.d.ts +1 -1
  201. package/dist/components/ScreenImage/index.d.ts +3 -1
  202. package/dist/components/ScreenImage/materials/ScreenImageBlendMaterial.d.ts +1 -1
  203. package/dist/components/ScreenImage/materials/ScreenImageMaskMaterial.d.ts +11 -0
  204. package/dist/components/ScreenImage/source.d.ts +6 -0
  205. package/dist/components/ScreenImage/types.d.ts +18 -0
  206. package/dist/components/SegmentationOverlay/SegmentationOverlay.d.ts +37 -0
  207. package/dist/components/SegmentationOverlay/SegmentationOverlayMaterial.d.ts +31 -0
  208. package/dist/components/SegmentationOverlay/index.d.ts +9 -0
  209. package/dist/components/SegmentationOverlay/maskTexture.d.ts +23 -0
  210. package/dist/components/SegmentationOverlay/providers.d.ts +72 -0
  211. package/dist/components/SegmentationOverlay/settings.d.ts +65 -0
  212. package/dist/components/ShoulderOccluder/index.d.ts +43 -0
  213. package/dist/components/ShoulderOccluder/useCanonicalTorsoFit.d.ts +24 -0
  214. package/dist/components/SpringSwing/SpringSwing.d.ts +22 -0
  215. package/dist/components/SpringSwing/index.d.ts +1 -0
  216. package/dist/components/XRProvider/index.d.ts +16 -2
  217. package/dist/components/XRScene/renderOutputTarget.d.ts +12 -0
  218. package/dist/components/XRViewport/hooks/useViewportExternalFaces.d.ts +1 -1
  219. package/dist/components/XRViewport/hooks/useViewportMediaSource.d.ts +1 -1
  220. package/dist/components/XRViewport/hooks/useViewportPipeline.d.ts +1 -1
  221. package/dist/components/index.d.ts +11 -0
  222. package/dist/config/index.d.ts +0 -1
  223. package/dist/constants/index.d.ts +4 -1
  224. package/dist/context-DTxSQvp4.js +13 -0
  225. package/dist/context-hA0Rb2Xa.cjs +1 -0
  226. package/dist/contexts-BH7PdKFS.cjs +1 -0
  227. package/dist/contexts-jak8-tND.js +667 -0
  228. package/dist/coordinates/feed.d.ts +52 -0
  229. package/dist/coordinates/index.d.ts +7 -0
  230. package/dist/coordinates/side.d.ts +40 -0
  231. package/dist/coordinates/spaces.d.ts +49 -0
  232. package/dist/coordinates/viewport.d.ts +22 -0
  233. package/dist/coordinates/world.d.ts +15 -0
  234. package/dist/debug-ui/default-setting.cjs +2 -2
  235. package/dist/debug-ui/face-swap-settings/index.d.ts +22 -0
  236. package/dist/debug-ui/gesture-settings/index.d.ts +14 -0
  237. package/dist/debug-ui/hierarchy-panel/index.d.ts +3 -2
  238. package/dist/debug-ui/holistic-tracker-settings/index.d.ts +16 -0
  239. package/dist/debug-ui/index.d.ts +18 -3
  240. package/dist/debug-ui/iris-effect-settings/index.d.ts +12 -0
  241. package/dist/debug-ui/lip-effect-settings/index.d.ts +15 -0
  242. package/dist/debug-ui/media-source/index.d.ts +1 -1
  243. package/dist/debug-ui/media-source/session.d.ts +30 -2
  244. package/dist/debug-ui/media-source.cjs +1 -1
  245. package/dist/debug-ui/media-source.js +1 -1
  246. package/dist/debug-ui/object-inspector-panel/index.d.ts +3 -2
  247. package/dist/debug-ui/product-hotspots/index.d.ts +25 -0
  248. package/dist/debug-ui/scene-editor/hierarchy-panel.d.ts +3 -1
  249. package/dist/debug-ui/scene-editor/inspector-panel.d.ts +3 -1
  250. package/dist/debug-ui/screen-image-settings/index.d.ts +3 -1
  251. package/dist/debug-ui/screen-text-settings/ScreenTextSettingsPanel.d.ts +1 -1
  252. package/dist/debug-ui/screen-text-settings/types.d.ts +2 -0
  253. package/dist/debug-ui/segmentation-overlay-settings/index.d.ts +12 -0
  254. package/dist/debug-ui/settings-panel/index.d.ts +6 -1
  255. package/dist/debug-ui/shared/debugWindow.d.ts +51 -0
  256. package/dist/debug-ui/xr-diagnostics/index.d.ts +26 -0
  257. package/dist/debug-ui.cjs +3 -3
  258. package/dist/debug-ui.js +2695 -2547
  259. package/dist/detector-K8aej4MB.js +59 -0
  260. package/dist/detector-ijypGtse.cjs +1 -0
  261. package/dist/entries/all.d.ts +3 -1
  262. package/dist/entries/core.d.ts +20 -2
  263. package/dist/entries/face-effects.d.ts +123 -9
  264. package/dist/entries/instructions.d.ts +48 -0
  265. package/dist/entries/internal.d.ts +2 -1
  266. package/dist/entries/low-level.d.ts +49 -3
  267. package/dist/entries/particles.d.ts +11 -0
  268. package/dist/entries/product.d.ts +11 -0
  269. package/dist/entries/tracking.d.ts +60 -2
  270. package/dist/face-atlas/attributes.d.ts +30 -0
  271. package/dist/face-atlas/eyes.d.ts +272 -0
  272. package/dist/face-atlas/faceAtlas.generated.d.ts +46 -0
  273. package/dist/face-atlas/glsl/atlasVertex.d.ts +46 -0
  274. package/dist/face-atlas/glsl/common.d.ts +55 -0
  275. package/dist/face-atlas/glsl/design.d.ts +49 -0
  276. package/dist/face-atlas/glsl/eyes.d.ts +73 -0
  277. package/dist/face-atlas/glsl/finish.d.ts +24 -0
  278. package/dist/face-atlas/glsl/format.d.ts +4 -0
  279. package/dist/face-atlas/glsl/index.d.ts +59 -0
  280. package/dist/face-atlas/glsl/shading.d.ts +15 -0
  281. package/dist/face-atlas/glsl/shapes.d.ts +66 -0
  282. package/dist/face-atlas/glsl/sparkle.d.ts +19 -0
  283. package/dist/face-atlas/glsl/uniforms.d.ts +106 -0
  284. package/dist/face-atlas/guide.d.ts +51 -0
  285. package/dist/face-atlas/index.d.ts +25 -0
  286. package/dist/face-atlas/lead.d.ts +117 -0
  287. package/dist/face-atlas/madeUpCamera.d.ts +125 -0
  288. package/dist/face-atlas/masks.d.ts +53 -0
  289. package/dist/face-atlas/obj.d.ts +69 -0
  290. package/dist/face-atlas/polylines.d.ts +63 -0
  291. package/dist/face-atlas/probe/FaceSkinProbe.d.ts +208 -0
  292. package/dist/face-atlas/probe/__fixtures__/emulate.d.ts +9 -0
  293. package/dist/face-atlas/probe/__fixtures__/face.d.ts +24 -0
  294. package/dist/face-atlas/probe/constants.d.ts +137 -0
  295. package/dist/face-atlas/probe/glsl.d.ts +43 -0
  296. package/dist/face-atlas/probe/lightFit.d.ts +108 -0
  297. package/dist/face-atlas/probe/schedule.d.ts +44 -0
  298. package/dist/face-atlas/probe/selfTest.d.ts +87 -0
  299. package/dist/face-atlas/probe/stats.d.ts +143 -0
  300. package/dist/face-atlas/probe/targets.d.ts +70 -0
  301. package/dist/face-atlas/probe/unwrap.d.ts +76 -0
  302. package/dist/face-atlas/quality.d.ts +28 -0
  303. package/dist/face-atlas/regions.d.ts +31 -0
  304. package/dist/face-atlas/registry.d.ts +252 -0
  305. package/dist/face-atlas/renderState.d.ts +86 -0
  306. package/dist/face-atlas/selfOcclusion.d.ts +62 -0
  307. package/dist/face-atlas/shading.d.ts +406 -0
  308. package/dist/face-atlas/shapes.d.ts +86 -0
  309. package/dist/face-atlas/sides.d.ts +41 -0
  310. package/dist/face-atlas/skinMask.d.ts +35 -0
  311. package/dist/face-atlas/surface.d.ts +155 -0
  312. package/dist/face-atlas/topology.d.ts +44 -0
  313. package/dist/face-character/__fixtures__/faceImageDetections.d.ts +25 -0
  314. package/dist/face-character/__fixtures__/faceNode.d.ts +22 -0
  315. package/dist/face-character/bindFaceModel.d.ts +106 -0
  316. package/dist/face-character/canonicalFace.d.ts +17 -0
  317. package/dist/face-character/canonicalFaceGeometry.d.ts +11 -0
  318. package/dist/face-character/canonicalFacePositions.d.ts +7 -0
  319. package/dist/face-character/driveFaceModel.d.ts +57 -0
  320. package/dist/face-character/expressionOutputs.d.ts +45 -0
  321. package/dist/face-character/faceExpressions.d.ts +104 -0
  322. package/dist/face-character/faceImageLandmarker.d.ts +93 -0
  323. package/dist/face-character/faceMeshBinding.d.ts +62 -0
  324. package/dist/face-character/faceMorph.d.ts +77 -0
  325. package/dist/face-character/faceMorphs.d.ts +46 -0
  326. package/dist/face-character/facePhoto.d.ts +138 -0
  327. package/dist/face-character/facePiercings.d.ts +116 -0
  328. package/dist/face-character/facePin.d.ts +131 -0
  329. package/dist/face-character/faceReprojection.d.ts +273 -0
  330. package/dist/face-character/faceReprojector.d.ts +171 -0
  331. package/dist/face-character/faceRig.d.ts +176 -0
  332. package/dist/face-character/faceSwapPresence.d.ts +85 -0
  333. package/dist/face-character/faceTexture.d.ts +169 -0
  334. package/dist/face-character/faceTextureBaker.d.ts +86 -0
  335. package/dist/face-character/faceTextureGuide.d.ts +106 -0
  336. package/dist/face-character/faceTextureStats.d.ts +298 -0
  337. package/dist/face-character/faceTransfer.d.ts +396 -0
  338. package/dist/face-character/faceTransferGeometry.d.ts +109 -0
  339. package/dist/face-character/faceTransferSelfTest.d.ts +94 -0
  340. package/dist/face-character/faceWarp3D.d.ts +101 -0
  341. package/dist/face-character/faceless.d.ts +79 -0
  342. package/dist/face-character/featureWarp.d.ts +28 -0
  343. package/dist/face-character/liveFaceRegistry.d.ts +370 -0
  344. package/dist/face-character/liveValue.d.ts +12 -0
  345. package/dist/face-character/memo.d.ts +15 -0
  346. package/dist/face-effects.cjs +2324 -1
  347. package/dist/face-effects.js +14208 -2268
  348. package/dist/face-expression/index.d.ts +182 -0
  349. package/dist/face-info/landmarks.d.ts +17 -3
  350. package/dist/face-info/types.d.ts +20 -3
  351. package/dist/gestures/definitions.d.ts +98 -0
  352. package/dist/gestures/detector.d.ts +87 -0
  353. package/dist/gestures/index.d.ts +8 -0
  354. package/dist/gestures/measures.d.ts +114 -0
  355. package/dist/gestures/settings.d.ts +49 -0
  356. package/dist/getFaceInfo-B1otSDMX.cjs +1 -0
  357. package/dist/getFaceInfo-Cu4xDWiL.js +62 -0
  358. package/dist/hand/armFit.d.ts +46 -0
  359. package/dist/hand/armMask.d.ts +178 -0
  360. package/dist/hand/handCutout.d.ts +23 -0
  361. package/dist/hand/handCutoutRegistry.d.ts +7 -0
  362. package/dist/hand/handGestures.d.ts +524 -0
  363. package/dist/hand/handPose.d.ts +98 -0
  364. package/dist/hand/handRigSolver.d.ts +159 -0
  365. package/dist/hand/handTattoo.d.ts +81 -0
  366. package/dist/hand/handTouch.d.ts +240 -0
  367. package/dist/hand/wrist.d.ts +44 -0
  368. package/dist/hand/wristFilter.d.ts +44 -0
  369. package/dist/hooks/selectors.d.ts +76 -1
  370. package/dist/hooks/useCalibrationFaceTracker.d.ts +1 -1
  371. package/dist/hooks/useFaceInfo.d.ts +13 -1
  372. package/dist/hooks/useFaceInfos.d.ts +1 -1
  373. package/dist/hooks/useFaceModelAcquisition.d.ts +38 -0
  374. package/dist/hooks/useGesture.d.ts +32 -0
  375. package/dist/hooks/useIrisTracking.d.ts +45 -0
  376. package/dist/hooks/useTrackerContext.d.ts +6 -0
  377. package/dist/hooks/useXRDiagnostics.d.ts +81 -0
  378. package/dist/hooks/useXRModel.d.ts +7 -0
  379. package/dist/hooks/useXRSession/facade.d.ts +42 -2
  380. package/dist/hooks/useXRSession/index.d.ts +2 -2
  381. package/dist/hooks/useXRSession/reason.d.ts +3 -1
  382. package/dist/hooks/useXRSession/registry.d.ts +14 -0
  383. package/dist/hooks/useXRSession/store.d.ts +52 -3
  384. package/dist/index-B1_TzJaI.js +1104 -0
  385. package/dist/index-BavF06C6.js +190 -0
  386. package/dist/index-BfFmpddl.cjs +21 -0
  387. package/dist/index-BuBzneeW.cjs +46 -0
  388. package/dist/index-CGsQWodV.cjs +1 -0
  389. package/dist/index-CIe7eCMH.js +3200 -0
  390. package/dist/index-CfSF8LXa.cjs +1 -0
  391. package/dist/index-D5GTzOzD.cjs +1 -0
  392. package/dist/index-DBhQzvVa.js +314 -0
  393. package/dist/index-DE17y0ZI.cjs +1 -0
  394. package/dist/index-JII7huPk.js +442 -0
  395. package/dist/index-tpCr9CLj.cjs +1 -0
  396. package/dist/index-w1S7fI2B.js +1432 -0
  397. package/dist/index-zGaqrz_K.js +188 -0
  398. package/dist/instructions.cjs +30 -0
  399. package/dist/instructions.js +1507 -0
  400. package/dist/{internal-Dmk1cTXq.js → internal-B90P-clC.js} +138 -119
  401. package/dist/internal-Cjinca64.cjs +1 -0
  402. package/dist/internal.cjs +1 -1
  403. package/dist/internal.js +15 -10
  404. package/dist/iris/compute.d.ts +27 -0
  405. package/dist/iris/index.d.ts +4 -0
  406. package/dist/iris/lead.d.ts +19 -0
  407. package/dist/iris/types.d.ts +89 -0
  408. package/dist/landmarkMask-BFDyBnKM.js +224 -0
  409. package/dist/landmarkMask-u7es2k4X.cjs +1 -0
  410. package/dist/landmarks-BlUqf5MZ.cjs +1 -0
  411. package/dist/landmarks-bftdwq6Z.js +76 -0
  412. package/dist/loaders-BGAUACsd.js +363 -0
  413. package/dist/loaders-BJ1_QCHt.cjs +1 -0
  414. package/dist/low-level.cjs +1 -1
  415. package/dist/low-level.js +1190 -675
  416. package/dist/main.cjs +1 -1
  417. package/dist/main.js +1190 -452
  418. package/dist/models/Base/index.d.ts +49 -0
  419. package/dist/models/Body/index.d.ts +3 -1
  420. package/dist/models/Face/constants.d.ts +8 -0
  421. package/dist/models/Face/index.d.ts +4 -12
  422. package/dist/models/Face/rotation.d.ts +18 -3
  423. package/dist/models/Hand/GestureTracking.d.ts +1 -1
  424. package/dist/models/Hand/HandTracking.d.ts +17 -1
  425. package/dist/models/Holistic/index.d.ts +49 -0
  426. package/dist/models/Holistic/result.d.ts +68 -0
  427. package/dist/models/Segmentation/index.d.ts +2 -0
  428. package/dist/models/SemanticSegmentation/index.d.ts +31 -0
  429. package/dist/models/SemanticSegmentation/presets.d.ts +28 -0
  430. package/dist/models/index.d.ts +2 -0
  431. package/dist/models/nodeSource.d.ts +9 -0
  432. package/dist/particles/emission.d.ts +24 -0
  433. package/dist/particles/eyes.d.ts +24 -0
  434. package/dist/particles/glsl.d.ts +14 -0
  435. package/dist/particles/index.d.ts +10 -0
  436. package/dist/particles/motion.d.ts +42 -0
  437. package/dist/particles/presets.d.ts +12 -0
  438. package/dist/particles/ring.d.ts +58 -0
  439. package/dist/particles/selfTest.d.ts +53 -0
  440. package/dist/particles/settings.d.ts +127 -0
  441. package/dist/particles/shapes.d.ts +29 -0
  442. package/dist/particles/spawner.d.ts +60 -0
  443. package/dist/particles/system.d.ts +64 -0
  444. package/dist/particles.cjs +122 -0
  445. package/dist/particles.js +774 -0
  446. package/dist/product/ProductDimensions.d.ts +16 -0
  447. package/dist/product/ProductHotspot.d.ts +16 -0
  448. package/dist/product/ProductViewer.d.ts +9 -0
  449. package/dist/product/details.d.ts +53 -0
  450. package/dist/product/index.d.ts +14 -0
  451. package/dist/product/loadModelViewer.d.ts +4 -0
  452. package/dist/product/types.d.ts +71 -0
  453. package/dist/product/useProductAr.d.ts +37 -0
  454. package/dist/product/useProductDetails.d.ts +60 -0
  455. package/dist/product.cjs +1 -0
  456. package/dist/product.js +414 -0
  457. package/dist/providers-C8rE26Uf.js +366 -0
  458. package/dist/providers-DHsrhDI2.cjs +62 -0
  459. package/dist/quality/XRQualityController.d.ts +25 -0
  460. package/dist/quality/controller.d.ts +33 -0
  461. package/dist/quality/index.d.ts +6 -0
  462. package/dist/quality/types.d.ts +100 -0
  463. package/dist/quality/useXRQuality.d.ts +28 -0
  464. package/dist/render/renderPasses.d.ts +8 -0
  465. package/dist/render/sceneBeforeRender.d.ts +12 -0
  466. package/dist/{renderGroups-KZk6eRiY.js → renderGroups-B38pUaX2.js} +1 -1
  467. package/dist/{renderGroups-80H3DpTl.cjs → renderGroups-Cb_4Ar1Q.cjs} +1 -1
  468. package/dist/renderPasses-B6l8IpJv.js +1290 -0
  469. package/dist/renderPasses-dqmkft4P.cjs +158 -0
  470. package/dist/renderState-CJNmj5jz.js +39 -0
  471. package/dist/renderState-apSfg4eR.cjs +1 -0
  472. package/dist/scene-object.cjs +1 -1
  473. package/dist/scene-object.js +2 -2
  474. package/dist/segmentation-Cb3ouK6Z.js +1758 -0
  475. package/dist/segmentation-D9pYO6aR.cjs +1 -0
  476. package/dist/segmentation2d/faceMemory.d.ts +28 -0
  477. package/dist/segmentation2d/faceRegions.d.ts +24 -0
  478. package/dist/segmentation2d/index.d.ts +9 -0
  479. package/dist/segmentation2d/maskUv.d.ts +23 -0
  480. package/dist/segmentation2d/rasterize.d.ts +14 -0
  481. package/dist/segmentation2d/types.d.ts +52 -0
  482. package/dist/select-Ck5LGz-J.cjs +1 -0
  483. package/dist/select-pYRo_win.js +233 -0
  484. package/dist/selectors-C4X71aoD.cjs +1 -0
  485. package/dist/selectors-DmNaKIwE.js +196 -0
  486. package/dist/session-BrH8G7iJ.cjs +31 -0
  487. package/dist/session-DgA_z6O1.js +418 -0
  488. package/dist/settings-BJ7FMBsO.js +111 -0
  489. package/dist/settings-C63FMBlF.cjs +1 -0
  490. package/dist/similarityFit-BFqHND2e.cjs +1 -0
  491. package/dist/similarityFit-Bbz-R8AY.js +91 -0
  492. package/dist/spring/index.d.ts +2 -0
  493. package/dist/spring/spring.d.ts +69 -0
  494. package/dist/spring/swing.d.ts +54 -0
  495. package/dist/subjects/index.d.ts +2 -0
  496. package/dist/subjects/select.d.ts +62 -0
  497. package/dist/subjects/types.d.ts +55 -0
  498. package/dist/tracking-config/apply.d.ts +57 -0
  499. package/dist/tracking-config/index.d.ts +7 -0
  500. package/dist/tracking-config/resolve.d.ts +25 -0
  501. package/dist/tracking-config/storage.d.ts +8 -0
  502. package/dist/tracking-config/types.d.ts +106 -0
  503. package/dist/tracking-config/useXRTrackingConfig.d.ts +38 -0
  504. package/dist/tracking.cjs +10 -1
  505. package/dist/tracking.js +1326 -506
  506. package/dist/trigger-D0Pm9noT.cjs +49 -0
  507. package/dist/trigger-IQeys0oS.js +2128 -0
  508. package/dist/types/compositor.d.ts +21 -0
  509. package/dist/types/face.d.ts +20 -1
  510. package/dist/types/hand-tracking.d.ts +9 -0
  511. package/dist/types/holistic.d.ts +121 -0
  512. package/dist/types/index.d.ts +1 -0
  513. package/dist/types/model.d.ts +22 -2
  514. package/dist/types/nodes.d.ts +47 -3
  515. package/dist/types/segmentation.d.ts +24 -0
  516. package/dist/types/session.d.ts +41 -3
  517. package/dist/updateThrottle-BseecYag.js +4 -0
  518. package/dist/updateThrottle-Of5Y4SVa.cjs +1 -0
  519. package/dist/useFaceInfo-BHDNCvsJ.cjs +1 -0
  520. package/dist/useFaceInfo-J4x7LsqL.js +76 -0
  521. package/dist/useFaceResultReader-BvEo5REG.js +61 -0
  522. package/dist/useFaceResultReader-DuaL1KJG.cjs +1 -0
  523. package/dist/useInstructionHold-DOu-RpCM.js +53 -0
  524. package/dist/useInstructionHold-DwJY1Alr.cjs +1 -0
  525. package/dist/useLandmarkPoseFit-Bg-h9BPb.cjs +1 -0
  526. package/dist/useLandmarkPoseFit-Bmb3h6Mw.js +87 -0
  527. package/dist/useXRCapabilities-Cr3RzuAW.cjs +1 -0
  528. package/dist/useXRCapabilities-Cxmlmpbd.js +30 -0
  529. package/dist/utils/canonicalRigidLandmarks.d.ts +8 -0
  530. package/dist/utils/fns.d.ts +6 -3
  531. package/dist/utils/headOccluderFit.d.ts +42 -0
  532. package/dist/utils/integrity.d.ts +21 -1
  533. package/dist/utils/resolveNumFaces.d.ts +13 -0
  534. package/dist/utils/shoulderOccluderFit.d.ts +38 -0
  535. package/dist/utils/similarityFit.d.ts +23 -0
  536. package/dist/utils/updateThrottle.d.ts +2 -0
  537. package/dist/utils/useStableUniforms.d.ts +18 -0
  538. package/dist/uv-BMFt19bg.cjs +1 -0
  539. package/dist/{index-ByoNj0QP.js → uv-DJU_XfmN.js} +15 -247
  540. package/docs/SDK_DOCUMENTATION.md +1 -2
  541. package/docs/api/adaptive-quality.mdx +104 -0
  542. package/docs/api/asset-lifecycle.mdx +78 -0
  543. package/docs/api/body-instructions.mdx +285 -0
  544. package/docs/api/body-triggers.mdx +234 -0
  545. package/docs/api/camera-permission.mdx +142 -0
  546. package/docs/api/coordinate-spaces.mdx +168 -0
  547. package/docs/api/cross-camera.mdx +89 -0
  548. package/docs/api/debug-ui-scene-editor.mdx +23 -2
  549. package/docs/api/diagnostics-calibration.mdx +97 -0
  550. package/docs/api/external-face-mesh.mdx +231 -0
  551. package/docs/api/face-actions.mdx +20 -16
  552. package/docs/api/face-attribute-expression.mdx +1 -1
  553. package/docs/api/face-binding-anchors.mdx +4 -2
  554. package/docs/api/face-character.mdx +157 -0
  555. package/docs/api/face-effects.mdx +9 -0
  556. package/docs/api/face-expression-controller.mdx +153 -0
  557. package/docs/api/face-info.mdx +17 -11
  558. package/docs/api/face-inset.mdx +204 -0
  559. package/docs/api/face-instructions.mdx +183 -0
  560. package/docs/api/face-liquify.mdx +196 -0
  561. package/docs/api/face-mesh.mdx +8 -9
  562. package/docs/api/face-morph.mdx +117 -0
  563. package/docs/api/face-painting.mdx +7 -0
  564. package/docs/api/face-reprojection.mdx +154 -0
  565. package/docs/api/face-retouching.mdx +18 -10
  566. package/docs/api/face-swap.mdx +350 -0
  567. package/docs/api/face-warp-3d.mdx +166 -0
  568. package/docs/api/faceless.mdx +143 -0
  569. package/docs/api/gestures.mdx +209 -0
  570. package/docs/api/hair.mdx +97 -0
  571. package/docs/api/hand-instructions.mdx +222 -0
  572. package/docs/api/hand-rig.mdx +535 -0
  573. package/docs/api/hand-touch.mdx +162 -0
  574. package/docs/api/head-occluder.mdx +563 -0
  575. package/docs/api/holistic-tracker.mdx +164 -0
  576. package/docs/api/instructions.mdx +323 -0
  577. package/docs/api/iris-tracking.mdx +247 -0
  578. package/docs/api/made-up-camera.mdx +131 -0
  579. package/docs/api/makeup-skin-tone.mdx +135 -0
  580. package/docs/api/makeup.mdx +353 -0
  581. package/docs/api/multi-subject.mdx +98 -0
  582. package/docs/api/particles.mdx +155 -0
  583. package/docs/api/person-cutout.mdx +136 -0
  584. package/docs/api/pin-to-face-mesh.mdx +274 -0
  585. package/docs/api/product-ar.mdx +114 -0
  586. package/docs/api/product-details.mdx +78 -0
  587. package/docs/api/screen-space-coordinates.mdx +4 -1
  588. package/docs/api/segmentation-overlay.mdx +301 -0
  589. package/docs/api/session-lifecycle.mdx +136 -0
  590. package/docs/api/trackers.mdx +5 -0
  591. package/docs/api/tracking-config.mdx +108 -0
  592. package/docs/docs.json +51 -1
  593. package/docs/examples/lip-shaders.mdx +273 -0
  594. package/docs/guides/face-atlas-template.svg +1 -0
  595. package/docs/guides/face-atlas-textures.mdx +186 -0
  596. package/docs/guides/face-texture-template.svg +1 -0
  597. package/docs/guides/harness-debug-ui.mdx +4 -4
  598. package/docs/guides/lip-effect-textures.mdx +368 -0
  599. package/docs/guides/lip-uv-template.png +0 -0
  600. package/docs/guides/lip-uv-template.svg +1 -0
  601. package/docs/guides/makeup-design-textures.mdx +109 -0
  602. package/docs/introduction.mdx +1 -2
  603. package/package.json +23 -1
  604. package/dist/DebuggerUI-B6bP6P9r.cjs +0 -1
  605. package/dist/DebuggerUI-BjOMr8q_.js +0 -269
  606. package/dist/FaceMeshRenderer-C5l6VLdO.cjs +0 -155
  607. package/dist/FaceMeshRenderer-wjAHrJzP.js +0 -1270
  608. package/dist/FaceRetouch-BkJzoA79.cjs +0 -134
  609. package/dist/FaceRetouch-DwbKQJAN.js +0 -551
  610. package/dist/components/FaceWarp3D/FaceWarp3DHead.d.ts +0 -15
  611. package/dist/components/FaceWarp3D/defaults.d.ts +0 -37
  612. package/dist/components/FaceWarp3D/warp.d.ts +0 -13
  613. package/dist/contexts-ByhzppYl.js +0 -663
  614. package/dist/contexts-Dr62It_K.cjs +0 -1
  615. package/dist/debug-ui/face-warp-3d/index.d.ts +0 -6
  616. package/dist/getFaceInfo-C4QpCQIY.js +0 -118
  617. package/dist/getFaceInfo-fA1bFBub.cjs +0 -1
  618. package/dist/index-9dlAQAhy.js +0 -1462
  619. package/dist/index-BjmTe9eM.cjs +0 -1
  620. package/dist/index-BpEf2BBb.cjs +0 -1
  621. package/dist/index-CyUUurQT.cjs +0 -1
  622. package/dist/index-DCiMbxC3.cjs +0 -1
  623. package/dist/index-DXT3WccE.js +0 -2089
  624. package/dist/index-DpI-qo5X.cjs +0 -17
  625. package/dist/index-DyVF4vEW.js +0 -111
  626. package/dist/index-VJ0SJwmG.js +0 -214
  627. package/dist/internal-Cq-TEQ5Y.cjs +0 -1
  628. package/dist/renderLayers-lDtL0_43.cjs +0 -1
  629. package/dist/renderLayers-zrK2pv5O.js +0 -13
  630. package/dist/renderPasses-BOoBSr8z.cjs +0 -21
  631. package/dist/renderPasses-BcquyVtu.js +0 -1500
  632. package/dist/selectors-B8H97CKA.js +0 -59
  633. package/dist/selectors-CZLKT2Iv.cjs +0 -1
  634. package/dist/session-CpkiK5YA.cjs +0 -31
  635. package/dist/session-DLFN_VII.js +0 -363
  636. package/dist/useFaceInfo-BJ8-_MOs.cjs +0 -1
  637. package/dist/useFaceInfo-Dk426LTu.js +0 -62
  638. package/dist/useFaceResults-CtetsO9M.js +0 -19
  639. package/dist/useFaceResults-wBJF3zyp.cjs +0 -1
@@ -0,0 +1,285 @@
1
+ ---
2
+ title: "Body Instructions"
3
+ description: "Ask for a body pose (arms, thumbs, squat, lean, one leg, star) with a 3D hint figure and your own copy, detect it from the pose landmarks, and complete when it is held."
4
+ sidebarTitle: "Body Instructions"
5
+ icon: "person"
6
+ ---
7
+
8
+ `BodyInstruction` asks the person for a body pose and waits for it. A translucent 3D figure loops from
9
+ standing into the pose, your copy sits under it, and holding the pose for `holdMs` completes it. It is
10
+ the body member of the instruction family, with the same layout and feedback as
11
+ [Hand Instructions](/api/hand-instructions) and [Face Instructions](/api/face-instructions). The
12
+ pieces underneath are exported too: `useBodyPose` (the detection alone) and `BodyPoseHint` (the figure
13
+ alone).
14
+
15
+ Import from `@vincentt-xr/sdk/instructions`. Everything is customisable: your own poses and
16
+ figure, detection logic, thresholds, hint look and motion, text style, or a fully custom prompt. See
17
+ [Instructions](/api/instructions).
18
+
19
+ ## Quick start
20
+
21
+ ```tsx
22
+ import { useLoader } from "@react-three/fiber";
23
+ import { MeshoptDecoder } from "three/examples/jsm/libs/meshopt_decoder.module.js";
24
+ import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader.js";
25
+ import { BodyInstruction } from "@vincentt-xr/sdk/instructions";
26
+
27
+ const ArmsUpToStart = ({ onStart }: { onStart: () => void }) => {
28
+ // A Mixamo-rig figure with one clip per pose plus "idle", meshopt-compressed.
29
+ const figure = useLoader(GLTFLoader, figureUrl, (loader) =>
30
+ loader.setMeshoptDecoder(MeshoptDecoder),
31
+ );
32
+ return (
33
+ <BodyInstruction
34
+ pose="hooray"
35
+ text="Arms up to start"
36
+ model={figure.scene}
37
+ poses={figure.animations}
38
+ onComplete={onStart}
39
+ />
40
+ );
41
+ };
42
+ ```
43
+
44
+ Mount it inside `XRScene`. It acquires the body model itself, so you don't need a `BodyTracker`, and
45
+ draws over the AR content in its own screen-space layer (`BODY_INSTRUCTION_RENDER_ORDER` =
46
+ `INSTRUCTION_RENDER_ORDER` = 2000 and up).
47
+
48
+ **Left and right** are the person's own sides on every camera. MediaPipe's pose labels follow the image
49
+ as given, so on the mirrored webcam they name the opposite side; the detector swaps them. On that feed
50
+ the figure is also drawn mirrored, so "raise your left arm" shows the raised arm on the same screen side
51
+ as the person's real left arm.
52
+
53
+ ## `BodyInstruction`
54
+
55
+ | Prop | Default | What it does |
56
+ | ---------------- | ------------------------------------------- | ------------------------------------------------------------------------------------------------------- |
57
+ | `pose` | — | What to ask for: a `BODY_POSES` name or your own `defineBodyPose(…)`. A new value is a new prompt. |
58
+ | `model` | — | The hint figure: a skinned Mixamo-rig character facing +Z. |
59
+ | `poses` | — | The figure's clips: one per pose (named like `BODY_POSES[name].hint.clip`) plus `idle`. |
60
+ | `idleClip` | `"idle"` | The rest clip the hint loops from. |
61
+ | `text` | the pose's `label` | Your copy, in any language. Long text shrinks to fit. |
62
+ | `doneText` | keep `text` | Copy shown once completed, while it fades out. |
63
+ | `nudgeText` | `"Step back so your upper body is in view"` | Second line after `nudgeAfterMs` out of view. Leg poses default to "…whole body…". `null` turns it off. |
64
+ | `nudgeAfterMs` | `3000` | How long before the nudge. |
65
+ | `bodyIndex` | `0` | Which detected body to read. |
66
+ | `holdMs` | `400` | How long the pose must be held. |
67
+ | `graceMs` | `150` | Dropouts shorter than this don't restart the hold. |
68
+ | `limits` | — | Classifier thresholds to override for this prompt (see `BODY_SHAPE_LIMITS`). |
69
+ | `size` | `"md"` | `"sm"`, `"md"`, `"lg"`, or a fraction of the screen height. |
70
+ | `symbolAspect` | `2.1` | The figure's slot height × the hand / face slot (it stands tall). |
71
+ | `placement` | `"center"` | `"top"`, `"center"` or `"bottom"`. |
72
+ | `offset` | `[0, 0]` | Shift from the placement, in half-screens. |
73
+ | `orbit` | `25` | The figure's auto orbit, degrees to each side. `0` holds it still. |
74
+ | `look` | `BODY_HINT_LOOK` | The figure's look, merged over the default: ghost, part tints, halo, glow, highlight, material. |
75
+ | `loop` | `BODY_HINT_LOOP` | The figure's loop: `seconds`, `hold`, `from`, `easing`. |
76
+ | `boneSide` | Mixamo names | Which arm a bone belongs to, for the highlight (another rig's naming). |
77
+ | `legBoneSide` | Mixamo names | Which leg a bone belongs to, for the highlight. |
78
+ | `color` | `"#ffffff"` | Text colour, with a soft dark shadow so it reads on any camera feed. |
79
+ | `textStyle` … | — | `textStyle`, `nudgeTextStyle`, `renderText`, `motion`, `layout`: see [Instructions](/api/instructions). |
80
+ | `onComplete` | — | Called once when the pose is held long enough. |
81
+ | `onStatusChange` | — | Called once with the first status, then on every change (`"waiting"` = not in view). |
82
+ | `hideOnComplete` | `true` | Fade out after completing. A small pop and a white ring play either way. |
83
+ | `active` | `true` | `false` hides it and pauses detection. |
84
+
85
+ ## Poses
86
+
87
+ | Name | Default copy | Recognised when |
88
+ | -------------- | -------------------- | ------------------------------------------------------- |
89
+ | `hooray` | Raise both arms | both arms `raised` |
90
+ | `handsUp` | Hands up | alias of `hooray` (the same rule and hint) |
91
+ | `tPose` | Make a T-pose | both arms `out` |
92
+ | `raiseLeft` | Raise your left arm | left arm `raised`; right arm `down`, `other` or `onHip` |
93
+ | `raiseRight` | Raise your right arm | right arm `raised`; left arm `down`, `other` or `onHip` |
94
+ | `handsOnHips` | Hands on your hips | both arms `onHip` |
95
+ | `armsCrossed` | Cross your arms | both arms `crossed` |
96
+ | `handsOnHead` | Hands on your head | both arms `onHead` |
97
+ | `thumbUp` | Give a thumbs up | either arm `thumbUp` (the hint shows the right hand) |
98
+ | `bothThumbsUp` | Two thumbs up | both arms `thumbUp` |
99
+ | `salute` | Salute | right arm `onHead`; left arm `down`, `other` or `onHip` |
100
+
101
+ | `squat` | Squat down | hips low over both feet (`squat`) |
102
+ | `leanLeft` | Lean to your left | the torso tilts toward your left (`lean: "left"`) |
103
+ | `leanRight` | Lean to your right | the torso tilts toward your right (`lean: "right"`) |
104
+ | `oneLeg` | Stand on one leg | one leg `raised`, the other `down` (either leg) |
105
+ | `star` | Make a star | feet spread wide and both arms `raised` or `out` |
106
+
107
+ Two thumbs up also answers a `thumbUp` prompt, a star answers `hooray`, and `handsUp` and `hooray`
108
+ answer each other. A salute and one hand on the
109
+ head look the same to the pose model. `raiseLeft` / `raiseRight` need you upright, so a side bend
110
+ with the far arm over the head is a lean, not a raise.
111
+
112
+ **The leg poses need the whole body in view**: hips, knees and ankles (`BODY_POSES[name].view` is
113
+ `"full"`). For them `BodyInstruction` waits for the whole body and nudges with
114
+ `BODY_INSTRUCTION_FULL_NUDGE_TEXT`, "Step back so your whole body is in view".
115
+
116
+ Each arm gets one state, measured in shoulder widths so distance from the camera doesn't matter:
117
+
118
+ - **`raised`**: the wrist is at least 0.75 shoulder widths above its shoulder, at any angle. A real full
119
+ raise leans forward, keeps a soft elbow and turns the arm outward; none of that is required to be
120
+ straight.
121
+ - **`out`**: level with the shoulder (within 0.5), reaching at least 0.9 out, elbow nearly straight.
122
+ - **`onHead`**: the wrist is up near the nose (not reaching far above it), elbow bent.
123
+ - **`onHip`**: the wrist is at the waist, above the hip line, with the elbow well out. Hands in front
124
+ pockets sit on the hip line with the elbows in, so they don't count.
125
+ - **`thumbUp`**: a fist held up in front of its own side (elbow bent, the wrist between belly and
126
+ shoulder height), the thumb point clearly above the index and pinky knuckles and the wrist. It reads
127
+ MediaPipe's hand points on the pose (thumb, index, pinky), which must be visible.
128
+ - **`crossed`**: the wrist is past the body's midline at chest or belly height.
129
+ - **`down`**: the wrist is well below the shoulder.
130
+ - **`other`**: anything else, such as a half raise or a reach forward.
131
+
132
+ With the lower body in view, each leg gets a state too, and the body some whole-body readings:
133
+
134
+ - **Leg `raised`**: the knee lifted to near hip height (no more than 0.6 below it) and the foot at least
135
+ 0.4 above the other one, off the ground.
136
+ - **Leg `down`**: standing, the knee at least 0.8 below the hip. Anything else is `other` (a squat's
137
+ bent knees, a step).
138
+ - **`squat`**: the hips at most 1.65 shoulder widths above the ankles, with both feet down. Standing
139
+ reads about 2.2, a deep squat about 1.1, so a half squat counts.
140
+ - **`lean`**: the hips → shoulders line tilted at least 8° from upright, toward the person's own left
141
+ or right on either camera. It needs only the hips and shoulders.
142
+ - **`wideStance`**: the ankles at least 1.4 shoulder widths apart, both feet down. Standing reads
143
+ about 0.5.
144
+
145
+ The default thresholds are `BODY_SHAPE_LIMITS` (read-only); override them per call with
146
+ `analyzeBodyShape(landmarks, { limits })` or the `limits` prop / option.
147
+
148
+ ## Detection only: `useBodyPose`
149
+
150
+ ```tsx
151
+ import { useBodyPose } from "@vincentt-xr/sdk/instructions";
152
+
153
+ const { status, holdRef, matchedRef, shapeRef, isInView, reset } = useBodyPose("raiseRight", {
154
+ holdMs: 400,
155
+ onComplete: () => next(),
156
+ });
157
+ ```
158
+
159
+ `status` (`"waiting"` → `"holding"` → `"done"`) re-renders only when it changes. Read
160
+ `holdRef.current.progress` and `shapeRef.current` (the latest `BodyShape`, or `null`) in `useFrame`. A
161
+ pose only counts while the upper body (nose, shoulders, elbows, wrists) is visible.
162
+
163
+ The result is an `InstructionDetector`, so it can drive a custom `<Instruction>`. A rule names a
164
+ state per arm or leg (an array accepts any of them), plus `lean` (`"left"`, `"right"` or `"none"`),
165
+ `squat` and `wideStance`; `anyOf` passes when one of its rules does. A rule that names the legs,
166
+ `squat` or `wideStance` needs the lower body in view. A definition with `view: "full"` makes
167
+ `isInView` wait for the whole body; that sets the `"waiting"` status and the nudge, while completion
168
+ needs only the rule. The leans read just the hips and shoulders, so a waist-up lean still completes,
169
+ but their prompts ask for the whole body. A match function reads the measurements; a definition works too:
170
+
171
+ ```tsx
172
+ useBodyPose({ arms: { left: "raised", right: ["down", "onHip"] } });
173
+ useBodyPose({ squat: true, arms: { left: "out", right: "out" } }); // squat with arms out
174
+ useBodyPose({ legs: { left: "raised" }, lean: "none" }); // left knee up, standing tall
175
+ useBodyPose({ anyOf: [{ arms: { left: "out" } }, { arms: { right: "out" } }] }); // either arm out
176
+ useBodyPose((shape) => shape.arms.left.up > 1.2); // reach really high
177
+ ```
178
+
179
+ The classifier is pure: `analyzeBodyShape(landmarks, { mirrored, visibility, aspect })` reads the
180
+ body tracker's `getLandmarks2D()` points and returns a `BodyShape`. Pass `aspect`, the tracked frame's
181
+ width ÷ height (`useXRFeedAspect()` from `@vincentt-xr/sdk/low-level`): tracker x and y each span the
182
+ frame, so the landmarks are first scaled to square units (`squareLandmarks`) and every pose reads
183
+ the same on portrait, landscape and square frames. Without it (default 1) a 9:16 portrait frame reads
184
+ a person standing upright as a squat. `useBodyPose` and `BodyInstruction` pass it themselves. The
185
+ shape:
186
+
187
+ - `arms.left` and `arms.right`, each with `state`, `up`, `out`, `bend`, `elbowOut`, `aboveHip` and
188
+ `thumbLift`;
189
+ - `legs.left` and `legs.right` (or `null` without the lower body), each with `state`, `kneeLift`,
190
+ `ankleLift` and `bend`;
191
+ - `lean` (degrees, + toward the person's left) and `leanSide`, `hipHeight`, `stance`, `squat` and
192
+ `wideStance`;
193
+ - `shoulderWidth`;
194
+ - `upperBodyVisible`, `hipsVisible` and `lowerBodyVisible`.
195
+
196
+ `matchBodyPose(shape, nameOrRule)` tests one pose; `matchingBodyPoses(shape)` lists every pose that
197
+ matches. The body tracker's node now also exposes `getVisibility(bodyIndex)`, MediaPipe's per-landmark
198
+ visibility from 0 to 1.
199
+
200
+ ## The hint figure: `BodyPoseHint`
201
+
202
+ ```tsx
203
+ <BodyPoseHint pose="tPose" model={figure.scene} poses={figure.animations} height={0.8} />
204
+ ```
205
+
206
+ The figure alone, fitted to `height` over its loop and orbit. It blends every bone from the `idle` clip
207
+ into the pose's clip and back. The default look:
208
+
209
+ - **Ghost:** translucent white, with the material named `joints` tinted blue-grey.
210
+ - **Highlight:** the arms and legs that make the pose are drawn brighter (`highlight`).
211
+ - **Whole-body moves:** a clip can move the hips as well as turn the bones (`Hips.position`), so the
212
+ squat sinks and the star widens its stance.
213
+ - **Halo and glow:** a soft dark halo (`look.halo`) and a soft light from behind (`look.glow`).
214
+ - **Orbit:** a slow ±25° side-to-side turn (`orbit`, `orbitSeconds`).
215
+ - **Mirroring:** `mirrored` draws it like a mirror image; `BodyInstruction` passes the session's
216
+ mirroring.
217
+
218
+ `look` is merged over `BODY_HINT_LOOK` and `loop` over `BODY_HINT_LOOP`. Any skinned character facing
219
+ +Z works: name its rest clip with `idleClip`, its pose clips in your definitions' `hint.clip`, and,
220
+ if it isn't a Mixamo rig, map its arm bones with `boneSide` for the highlight. A missing clip leaves
221
+ the figure in its rest pose and logs a warning once, naming the clip and the clips the model has.
222
+ Models without vertex colours, like Y Bot, are handled automatically.
223
+
224
+ ## The example figure
225
+
226
+ `ybot.glb`:
227
+
228
+ - **Character:** "Y Bot" by Mixamo (Adobe), from the Sketchfab model "Y Bot" by Moises D Sanabria
229
+ (CC BY 4.0), using Kiev's (KinderKiev) upload "Y Bot from mixamo".
230
+ - **Edits:** cleaned up to centimetres, with plain Mixamo bone names and the non-hand parts reduced.
231
+ - **Poses:** authored in Blender (`assets-src/bodies/`).
232
+ - **Size:** ~410 KB with meshopt (~155 KB gzipped; most of the growth is per-clip animation metadata,
233
+ which gzips well).
234
+
235
+ It keeps all 68 bones, including every finger joint and fingertip. The finger chain maps one-to-one onto
236
+ MediaPipe's 21 hand landmarks, so a future driver can pose its fingers from hand tracking; the mapping
237
+ is in `assets-src/bodies/README.md`.
238
+
239
+ <Note>
240
+ The GLB lives only in the example app. Adobe's Mixamo terms allow Mixamo characters inside your
241
+ projects but not redistributing the raw asset, and the npm package ships only `dist/` and
242
+ `GROUNDING.md`. Load your own figure.
243
+ </Note>
244
+
245
+ ## Example
246
+
247
+ `/body-instructions` covers:
248
+
249
+ - every pose as a chip, and a sequence mode that moves to the next pose when one completes;
250
+ - text, nudge, size, placement and hold-time controls;
251
+ - a live readout of each arm's state and measurements, whether the upper body and hips are in view, and
252
+ the matching poses.
253
+
254
+ Local clips in the git-ignored `example/src/assets/media/local/` are listed first.
255
+
256
+ ## Manual visual test plan
257
+
258
+ Open `/body-instructions`.
259
+
260
+ 1. **Every hint reads**: step through the fifteen chips. The figure moves from standing into each pose
261
+ and back, the posing arms brighter. Raised arms turn outward (palms toward the head). Hands sit on
262
+ the waist, on the head, or tuck around the other arm, and the fingers rest naturally. The thumbs-up
263
+ fists stand clear of the body with the thumb straight up; the salute's flat hand is at the brow.
264
+ The squat sinks with flat feet, the leans bend toward the named side (on the mirrored webcam, the
265
+ same screen side as yours), one leg lifts the right knee, and the star spreads arms and legs; the
266
+ legs that make the pose are brighter.
267
+ 2. **Size and look**: the figure fills a tall slot above the copy and stays inside it through the
268
+ orbit. The ghost is white (not grey), with tinted joints, a halo and a back-glow.
269
+ 3. **Detection on the webcam**: stand back until the readout says upper body in view, then make each
270
+ pose. The readout's matches list it and the status goes `holding` → `done`. Hands in pockets don't
271
+ count as hands on hips, and a half raise isn't a raise. A thumbs up works with either hand (watch
272
+ `thumb` in the readout climb above ~0.1); a thumb to the side or an open hand doesn't count.
273
+ For the leg poses, step back until the readout says legs in view: a half squat reads `squat`
274
+ (hip height under 1.65), a lean of about 10° reads the side, a knee lift on either leg is one leg,
275
+ and a wide stance with arms up is a star.
276
+ 4. **Left and right**: on the mirrored webcam, raise your own left arm for "raise your left arm". The
277
+ figure's raised arm is on the same screen side as yours, and it completes. Raising the right arm
278
+ doesn't.
279
+ 5. **Unmirrored source** (a video, image or rear camera): the person's left arm still counts as left.
280
+ 6. **Nudge**: step out of frame, or so your wrists are cut off, for 3 s. "Step back so your upper body
281
+ is in view" fades in and the figure pulses.
282
+ 7. **Completion and sequence**: on done, a pop and a white ring play. With sequence on, the next pose
283
+ comes in.
284
+ 8. **Hands and faces unchanged**: `/hand-instructions` and `/face-instructions` look and behave as
285
+ before.
@@ -0,0 +1,234 @@
1
+ ---
2
+ title: "Body Triggers"
3
+ description: "Fire on full-body poses (T-pose, hands up, squat) and moves over time (jump, squat reps, wave, clap, punch, arm flap, kick, step, march) with begin / end events."
4
+ sidebarTitle: "Body Triggers"
5
+ icon: "person-running"
6
+ ---
7
+
8
+ `BodyTrigger` fires when the person holds a body pose or performs a body move. It reads the body
9
+ model's 33 pose landmarks (it acquires the model itself; no `BodyTracker` needed) and runs the same
10
+ lifecycle as [`useGesture`](/api/gestures): begin / end events, hold, cooldown, loss grace and a
11
+ count.
12
+
13
+ Import from `@vincentt-xr/sdk/tracking`.
14
+
15
+ ```tsx
16
+ import { BodyTrigger, useBodyTrigger } from "@vincentt-xr/sdk/tracking";
17
+
18
+ // Declarative: mount inside the scene, act on the events.
19
+ <BodyTrigger pose="tPose" onBegin={() => takeOff()} onEnd={() => land()} />;
20
+ <BodyTrigger move="jump" onBegin={() => hop()} />;
21
+ <BodyTrigger move="punch" side="right" onBegin={(state) => hit(state.side)} />;
22
+
23
+ // Hook: React state that changes only when the trigger's state changes.
24
+ const squats = useBodyTrigger({ move: "squat" });
25
+ // squats.count = reps so far; squats.active = at the bottom of a rep.
26
+ ```
27
+
28
+ Pass exactly one of `pose` or `move`. Left / right are the person's own sides on every camera.
29
+
30
+ ## Poses
31
+
32
+ `pose` takes BodyInstruction's vocabulary (`BODY_POSES` from `@vincentt-xr/sdk/instructions`) and
33
+ its classifier (`analyzeBodyShape` + `matchBodyPose`), so a pose that completes a
34
+ [`BodyInstruction`](/api/body-instructions) also fires a `BodyTrigger`.
35
+
36
+ | You want | `pose` | Needs |
37
+ | -------------------------------- | ---------------------------------------------------------- | ---------- |
38
+ | T-pose | `"tPose"` | upper body |
39
+ | Hands up | `"handsUp"` (alias of `"hooray"`) | upper body |
40
+ | Hands on hips | `"handsOnHips"` | upper body |
41
+ | Arms crossed | `"armsCrossed"` | upper body |
42
+ | Squat position | `"squat"` | whole body |
43
+ | Raise one arm | `"raiseLeft"` / `"raiseRight"` | upper body |
44
+ | Hands on head, thumbs up, salute | `"handsOnHead"`, `"thumbUp"`, `"bothThumbsUp"`, `"salute"` | upper body |
45
+ | Lean, one leg, star | `"leanLeft"` / `"leanRight"`, `"oneLeg"`, `"star"` | whole body |
46
+
47
+ `pose` also takes a rule, a match function or a `defineBodyPose` definition:
48
+
49
+ ```tsx
50
+ <BodyTrigger pose={{ arms: { left: "raised", right: "out" } }} onBegin={point} />
51
+ <BodyTrigger pose={(shape) => shape.arms.left.up > 1.2} onBegin={reach} />
52
+ ```
53
+
54
+ A pose begins once it has been held (the match is smoothed over about 80 ms, then `holdMs`, 150 by
55
+ default) and ends when it is released. A one-frame flicker of the classifier neither ends nor
56
+ restarts it. Pose defaults: `BODY_POSE_TRIGGER_DEFAULTS` (enter 0.6, exit 0.25, hold 150 ms, loss
57
+ grace 250 ms).
58
+
59
+ Poses read the same on portrait, landscape and square feeds. Tracker x and y each span the frame,
60
+ so on a 9:16 portrait feed a horizontal distance reads 1.78 times too long next to a vertical one;
61
+ the trigger multiplies x by the frame's aspect ratio (`useXRFeedAspect()`) before classifying.
62
+ `handsUp` and `hooray` are the same pose: each answers the other.
63
+
64
+ ## Moves
65
+
66
+ `move` takes a `BODY_MOVES` name (`BODY_MOVE_NAMES`) or your own `defineBodyMove` definition.
67
+
68
+ | `move` | Begins | Ends | Needs | `side` | Cooldown |
69
+ | ---------------------------- | ----------------------------------------------------------------------------------------------- | ------------------------ | ---------- | ------ | -------- |
70
+ | `"jump"` | shoulders, hips and both feet rise together above the standing level (take-off) | on landing | whole body | – | 150 ms |
71
+ | `"squat"` | from standing, both thighs drop toward level (bottom of a rep) | back up standing | whole body | – | 200 ms |
72
+ | `"wave"` | a raised forearm swings side to side (three turning points within 1.5 s) | when the swinging stops | the arm | yes | 600 ms |
73
+ | `"clap"` | the hands meet fast (apart to touching within 0.25 s) | when they part | both arms | – | 100 ms |
74
+ | `"punch"` | an arm snaps from bent to straight (within 0.2 s) at shoulder height, to the camera or the side | when it bends back | the arm | yes | 150 ms |
75
+ | `"armFlap"` | both arms, out like wings, beat down together | when the arms rise again | both arms | – | 100 ms |
76
+ | `"kick"` | one foot swings up fast with the knee lifted and the lower leg raised | when the foot is down | whole body | yes | 300 ms |
77
+ | `"stepLeft"` / `"stepRight"` | hips and both feet move to the person's own left / right by half a shoulder width within 0.7 s | when the body settles | whole body | – | 300 ms |
78
+ | `"march"` | each alternating knee (or foot) lift; the first lift only starts the count | when that foot is down | whole body | – | 0 |
79
+
80
+ Every move counts: `state.count` goes up on each begin (jumps, reps, claps, punches, flaps, kicks,
81
+ steps, march steps). `onEnd` with `endReason: "released"` means the move completed. `state.side` is the
82
+ limb behind the begin (`wave`, `punch`, `kick`, `march`) or the step direction.
83
+
84
+ `side` (`"left"`, `"right"`, default `"either"`) picks the limb a `wave`, `punch` or `kick` watches.
85
+
86
+ ### Telling moves apart
87
+
88
+ The moves are built not to answer each other: a squat is not a jump (the feet stay down), a march
89
+ step is not a kick (the foot hangs under the knee), a heel kick is not a kick (the knee stays down),
90
+ lowering the arms from the front is not a flap, dropping or raising a bent arm is not a punch, a slow
91
+ reach is not a punch, hands brought together slowly are not a clap, walking toward the camera is not
92
+ a step, and a single knee raise is not marching.
93
+
94
+ Moves read body motion in the frame, so a camera that moves fast reads as motion too: a jerked
95
+ handheld phone can look like a jump or a step. Slow drift never does. For leg moves, prop the phone up.
96
+
97
+ ## Whole body in view
98
+
99
+ Leg moves need shoulders, hips, knees and ankles in view. A joint counts when MediaPipe's visibility
100
+ is at least 0.2 and it sits no more than 0.12 past the frame edge (`BODY_MOVE_VIEW_LIMITS`; the
101
+ frame spans −1..1). Both bars are deliberate: MediaPipe often reports 0.2 to 0.5 for ankles that are
102
+ in frame, and an ankle can sit just past the edge when the feet are partly cropped. Legs cut off by a
103
+ front camera held close sit far past the edge with visibility near 0, so leg moves never fire.
104
+ Tune per trigger with `view`:
105
+
106
+ ```tsx
107
+ <BodyTrigger move="jump" view={{ visible: 0.3, edge: 0.05 }} onBegin={hop} />
108
+ ```
109
+
110
+ The leg poses (`squat`, `leanLeft`, `leanRight`, `oneLeg`, `star`) use BodyInstruction's own check
111
+ (visibility at least `BODY_SHAPE_LIMITS.visible`, 0.5). The trigger reports what it needs:
112
+
113
+ - `state.view`: `"full"` (needs the whole body) or `"upper"`.
114
+ - `state.inView`: whether what it needs is in view now.
115
+
116
+ ```tsx
117
+ const jump = useBodyTrigger({ move: "jump", onBegin: hop });
118
+ // Show "Step back so your whole body is in view" while this is true.
119
+ const needsStepBack = jump.view === "full" && !jump.inView;
120
+ ```
121
+
122
+ Leaving view while a move is active is tracking loss: after `lostGraceMs` it ends with
123
+ `endReason: "lost"`, and the move's memory starts fresh when the body is back.
124
+
125
+ ## Thresholds
126
+
127
+ Arm moves measure in shoulder widths (like BodyInstruction's classifier). Leg moves measure vertical
128
+ against vertical (torso length, the standing shin), so distance from the camera and the frame's aspect
129
+ ratio cancel. Defaults are in `BODY_MOVE_LIMITS`; each move lists the keys it reads in
130
+ `BODY_MOVES[name].limitKeys`. Override per trigger:
131
+
132
+ ```tsx
133
+ <BodyTrigger move="jump" limits={{ jumpRise: 0.2 }} onBegin={hop} />
134
+ <BodyTrigger move="squat" limits={{ squatDown: 0.75 }} onBegin={rep} /> {/* shallower squats count */}
135
+ ```
136
+
137
+ | Key | Default | Meaning |
138
+ | ----------------------------------------------------------------- | -------------------- | --------------------------------------------------------------------------------------------------------- |
139
+ | `jumpRise` / `jumpLand` | 0.12 / 0.06 | take-off rise and landing tolerance, torso lengths |
140
+ | `jumpMaxAirMs` / `jumpLevelMs` | 900 / 300 | longest air time; how fast the standing level follows slow drift |
141
+ | `squatDown` / `squatUp` | 0.6 / 0.85 | thigh height ÷ shin height at the bottom / back up (standing ≈ 1) |
142
+ | `waveForearmUp`, `waveAmplitude`, `waveReversals`, `waveWindowMs` | 0.25, 0.3, 3, 1500 | forearm raised; swing between turning points; turning points within the window |
143
+ | `clapApart`, `clapTogether`, `clapWithinMs`, `clapRelease` | 0.6, 0.3, 250, 0.45 | hands apart, then together within the time; parted again |
144
+ | `punchBent`, `punchStraight`, `punchWithinMs`, `punchBand` | 0.75, 0.93, 200, 0.9 | arm straightness (shoulder → wrist ÷ arm length, in 3D) from bent to straight; wrist near shoulder height |
145
+ | `flapStroke`, `flapWithinMs`, `flapTop`, `flapOut` | 0.7, 500, −0.4, 0.3 | both wrists drop this far, from a top near shoulder level, out to the sides |
146
+ | `kickLift`, `kickKnee`, `kickShin`, `kickWithinMs` | 0.35, 0.15, 0.6, 600 | foot and knee above the standing ones; the foot not hanging under the knee |
147
+ | `stepShift`, `stepWithinMs` | 0.5, 700 | sideways travel of hips and feet, shoulder widths |
148
+ | `marchLift`, `marchDrop`, `marchWithinMs` | 0.2, 0.08, 1200 | knee or foot above the other one; alternation window |
149
+
150
+ For poses, `limits` also takes BodyInstruction's classifier thresholds (`BODY_SHAPE_LIMITS` keys).
151
+ The lifecycle options are the gesture engine's (`enterThreshold`, `exitThreshold`, `holdMs`,
152
+ `cooldownMs`, `minConfidence`, `lostGraceMs`), per trigger.
153
+
154
+ ## Options
155
+
156
+ `useBodyTrigger({ pose | move, … })` and `<BodyTrigger … />` take:
157
+
158
+ - `pose` or `move` (exactly one).
159
+ - `side`: `"either"` (default), `"left"`, `"right"`.
160
+ - `limits`: `Partial<BodyMoveLimits & BodyShapeLimits>`.
161
+ - `view`: `Partial<BodyMoveViewLimits>` (`{ visible, edge }`, the leg moves' view gate).
162
+ - The lifecycle options above.
163
+ - `bodyIndex` (default 0), `active` (default `true`; `false` pauses and releases the body model),
164
+ `targetFps`.
165
+ - `onBegin`, `onEnd`, `onChange`: called from the frame loop with that frame's `BodyTriggerState`.
166
+
167
+ `BodyTriggerState` is `GestureState` (`active`, `value`, `confidence`, `tracked`, `phase`,
168
+ `justBegan`, `justEnded`, `endReason`, `startedAtMs`, `durationMs`, `count`) plus `kind`
169
+ (`"pose"` | `"move"`), `view`, `inView` and `side`.
170
+
171
+ ## Custom moves
172
+
173
+ ```ts
174
+ import { defineBodyMove } from "@vincentt-xr/sdk/tracking";
175
+
176
+ // Both wrists above the head, then down below the hips within a second: a "touch the floor".
177
+ const touchFloor = defineBodyMove({
178
+ name: "touchFloor",
179
+ label: "Touch the floor",
180
+ description: "Hands from overhead to below the knees within 1 s.",
181
+ view: "full",
182
+ createMemory: () => ({ upAt: -Infinity }),
183
+ measure: (frame, memory, nowMs) => {
184
+ const { joints: j } = frame;
185
+ if (j.leftWrist.y > j.nose.y && j.rightWrist.y > j.nose.y) memory.upAt = nowMs;
186
+ const down = j.leftWrist.y < j.leftKnee.y && j.rightWrist.y < j.rightKnee.y;
187
+ return { value: down && nowMs - memory.upAt < 1000 ? 1 : 0 };
188
+ },
189
+ });
190
+
191
+ <BodyTrigger move={touchFloor} onBegin={celebrate} />;
192
+ ```
193
+
194
+ `measure(frame, memory, nowMs, { side, limits })` runs once per new tracker sample of a body in
195
+ view and returns `{ value, side? }` (`value` ≥ 0.5 while the move is happening, for the default
196
+ thresholds). `frame` (`BodyMoveFrame`) carries BodyInstruction's `shape`, the person's own `joints`
197
+ (`joints.leftWrist` is their left wrist) in square units (x multiplied by the frame's aspect, so x and
198
+ y compare), `visibility` and `seen` per joint (the view gate above), `shoulderWidth`, `torso`
199
+ (vertical shoulder-to-hip length), `leftward` (the tracker-x direction of the person's left),
200
+ `upperInView`, `fullInView` and `aspect`. Memory is recreated whenever the body is lost or leaves
201
+ view. Define moves at module scope: a definition is keyed by its `name`.
202
+
203
+ The pure layer is on `@vincentt-xr/sdk/low-level` for tests and custom runners:
204
+ `createBodyMoveFrame(landmarks, { mirrored, visibility, aspect, view })`, `createBodyTrigger(target, options)`,
205
+ `stepBodyTrigger(machine, frame | null, nowMs, fresh?)`, `snapshotBodyTriggerState`,
206
+ `bodyTriggerStatesEqual`, `setBodyTriggerOptions`, `resolveBodyTriggerOptions`,
207
+ `resolveBodyMoveLimits`, `BODY_POSE_TRIGGER_DEFAULTS`, `sideJoint` and `TimedSeries` (windowed
208
+ min / max over a fixed ring, for custom moves).
209
+
210
+ ## Performance
211
+
212
+ All body triggers read one shared body model; each tracker sample is analysed once and shared by
213
+ every trigger reading it. Moves keep a short fixed-size history and measure only new tracker samples,
214
+ not every rendered frame.
215
+
216
+ ## Manual validation
217
+
218
+ Run `/gestures` (webcam by default; the fallback clip shows a full body). The body triggers section
219
+ lists every pose and move with a light and, for moves, a count.
220
+
221
+ | Case | Steps | Expect |
222
+ | ---------------- | ----------------------------------------------------------- | -------------------------------------------------------------- |
223
+ | Poses | hold a T-pose, hands up, hands on hips, arms crossed, squat | That row lights while held, off when released |
224
+ | Jump | stand back (whole body in view), jump three times | `jump` ×3; no `squat`, `march` or `step` |
225
+ | Squat reps | three squats | `squat` ×3, counted at the bottom |
226
+ | Wave | wave with your left hand, `side` = right | No count; set `side` = left, it counts with side `left` |
227
+ | Clap | clap four times | `clap` ×4; slowly pressing the palms together: no count |
228
+ | Punch | jab at the camera with each hand | `punch` counts with the right side |
229
+ | Arm flap | flap both arms like wings | `armFlap` counts each downstroke |
230
+ | Kick, march | kick once; then march in place | `kick` ×1; `march` counts steps, `kick` stays still |
231
+ | Steps | step to your left, then to your right | `stepLeft` then `stepRight`, on the webcam and rear camera |
232
+ | Legs out of view | come close so only the upper body shows | Leg rows turn amber ("needs full body") and never count |
233
+ | Fallback clip | "Person Fullbody" (portrait, standing still) | No pose lit (not `squat`); leg rows in view, counts at 0 |
234
+ | Feed shape | switch the stage between portrait and landscape | The same poses light; the "leg view gate" readout says in view |