@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,209 @@
1
+ ---
2
+ title: "Gestures"
3
+ description: "Reusable face, hand and body gesture detection with thresholds, hysteresis, confidence, cooldown and lifecycle events."
4
+ sidebarTitle: "Gestures"
5
+ icon: "hand-sparkles"
6
+ ---
7
+
8
+ `useGesture` turns raw tracking into stable gesture events: pinch, grab,
9
+ open palm, wave, hand raise, nod, head shake, mouth open, smile, blink,
10
+ brow raise, arm raise and T-pose, plus your own. One engine handles the
11
+ thresholds, hysteresis, hold, cooldown, confidence and tracking loss, so
12
+ scenes stop re-implementing them. For full-body poses and moves (jump,
13
+ squat, wave, clap, punch, kick, steps, march) use
14
+ [Body Triggers](/api/body-triggers), which run on the same engine.
15
+
16
+ ```tsx
17
+ import { GestureListener, useGesture } from "@vincentt-xr/sdk/tracking";
18
+
19
+ // Hook: React state that changes only when the gesture's state changes.
20
+ const pinch = useGesture("pinch", { hand: "right", onBegin: () => grab(), onEnd: () => drop() });
21
+ if (pinch.active) {
22
+ /* … */
23
+ }
24
+
25
+ // Declarative: mount and act on events.
26
+ <GestureListener gesture="headNod" onBegin={() => confirm()} />;
27
+ ```
28
+
29
+ Each gesture acquires the shared face, hand or body model it needs; no
30
+ second detector starts. Mount gesture hooks once above scene switches, like
31
+ any tracker.
32
+
33
+ ## Built-in gestures
34
+
35
+ | Name | Kind | Measures | Default enter / exit / hold / cooldown |
36
+ | ---------------------------------- | ---- | -------------------------------------------------------------------------------------- | -------------------------------------- |
37
+ | `mouthOpen` | face | `jawOpen` blendshape | 0.5 / 0.35 / 0 / 0 |
38
+ | `smile` | face | mean of `mouthSmileLeft` / `mouthSmileRight` | 0.4 / 0.25 / 0 / 0 |
39
+ | `blink` | face | both eyes closed (min of the `eyeBlink` blendshapes) | 0.55 / 0.4 / 50 ms / 0 |
40
+ | `browRaise` | face | max of the brow-up blendshapes | 0.45 / 0.3 / 0 / 0 |
41
+ | `headNod` | face | pitch oscillation: 3 turning points ≥ 0.12 rad within 1.5 s | 0.99 / 0.3 / 0 / 600 ms |
42
+ | `headShake` | face | yaw oscillation: 3 turning points ≥ 0.15 rad within 1.5 s | 0.99 / 0.3 / 0 / 600 ms |
43
+ | `pinch` | hand | thumb–index tip gap relative to palm size (1 = touching) | 0.75 / 0.5 / 0 / 0 |
44
+ | `grab` | hand | mean curl of index..pinky (1 = fist) | 0.7 / 0.45 / 0 / 0 |
45
+ | `openPalm` | hand | mean extension of index..pinky | 0.7 / 0.45 / 0 / 0 |
46
+ | `handRaised` | hand | wrist height in the frame (0 bottom, 1 top) | 0.7 / 0.6 / 0 / 0 |
47
+ | `oneFinger` | hand | index extended, middle..pinky curled (pointing) | 0.65 / 0.45 / 0 / 0 |
48
+ | `peaceSign` | hand | index + middle extended, ring + pinky curled | 0.65 / 0.45 / 0 / 0 |
49
+ | `threeFingers` | hand | index + middle + ring extended, pinky curled | 0.65 / 0.45 / 0 / 0 |
50
+ | `fourFingers` | hand | index..pinky extended, thumb tucked | 0.65 / 0.45 / 0 / 0 |
51
+ | `fist` | hand | all four curled and the thumb tucked | 0.65 / 0.45 / 0 / 0 |
52
+ | `palm` | hand | all four extended and the thumb out | 0.65 / 0.45 / 0 / 0 |
53
+ | `thumbUp` / `thumbDown` | hand | thumb out and pointing up / down, fingers curled | 0.6 / 0.4 / 0 / 0 |
54
+ | `wave` | hand | wrist x oscillation: 3 turning points ≥ 0.08 within 1.2 s | 0.99 / 0.3 / 0 / 600 ms |
55
+ | `armRaisedLeft` / `armRaisedRight` | body | the person's own left / right wrist above its shoulder, in shoulder widths, every feed | 0.3 / 0.15 / 0 / 0 |
56
+ | `armRaised` / `bothArmsRaised` | body | either / both wrists above their shoulders | 0.3 / 0.15 / 0 / 0 |
57
+ | `tPose` | body | both arms level and outstretched by a shoulder width | 0.6 / 0.4 / 150 ms / 0 |
58
+
59
+ Hand measures are scale-free (divided by the palm size) and body measures
60
+ are in shoulder widths, so distance from the camera does not change the
61
+ thresholds. `GESTURES[name].description` carries each line of the table.
62
+
63
+ The finger-count signs score the _weakest_ required finger, so a pattern is
64
+ 1 only when every finger agrees: `peaceSign` needs index and middle extended
65
+ _and_ ring and pinky curled. `grab` and `openPalm` are the softer, mean-curl
66
+ versions of `fist` and `palm` that ignore the thumb; `measureFingerPattern`
67
+ builds any other pattern (`{ fingers: [true, null, null, false], thumb: true }`
68
+ uses `null` for "either").
69
+
70
+ ## The engine contract
71
+
72
+ Every frame the definition measures a `{ value, confidence }` sample (or
73
+ `null` when the tracker has no subject). The detector then applies, in order:
74
+
75
+ 1. **Confidence gate**: a sample below `minConfidence` (default 0.5), or no
76
+ sample, is tracking loss.
77
+ 2. **Loss grace**: an active gesture survives loss for `lostGraceMs`
78
+ (default 250, the SDK's hold window) with its value frozen, then ends
79
+ with `endReason: "lost"`. An inactive gesture just resets its hold timer.
80
+ 3. **Hysteresis**: inactive → `begin` when `value >= enterThreshold`;
81
+ active → `end` (`endReason: "released"`) when `value <= exitThreshold`.
82
+ The band between them is where the gesture is stable; the default exit is
83
+ 0.15 below enter.
84
+ 4. **Hold**: the value must stay at or above enter for `holdMs` before
85
+ `begin`; a dip resets the clock.
86
+ 5. **Cooldown**: after `end`, no `begin` for `cooldownMs`.
87
+
88
+ A `begin` is always followed by at least one `stay` frame, so a one-frame
89
+ gesture still surfaces both edges to an effect that watches `justBegan` and
90
+ `justEnded`.
91
+
92
+ `GestureState`: `active`, `value`, `confidence`, `tracked`, `phase`
93
+ (`begin` | `stay` | `end` | `none`), `justBegan`, `justEnded`, `endReason`
94
+ (`released` | `lost` | null), `startedAtMs`, `durationMs`, `count`. The hook
95
+ publishes a new state only when one of these changes, and `durationMs` is
96
+ excluded from that comparison so an active gesture does not re-render every
97
+ frame: it reads as of the last published change (an ending gesture carries
98
+ its full length). Derive a live duration from `startedAtMs`.
99
+
100
+ Confidence is presence-based for the face, hand and body trackers, which
101
+ report no per-landmark score: 1 while the subject is tracked. A custom
102
+ definition can supply a real score (the holistic result's `confidence`, for
103
+ example).
104
+
105
+ ## Options
106
+
107
+ `useGesture(gesture, options)` takes the detector options above plus
108
+ `active`, `faceIndex` / `numFaces` (face), `hand` / `handIndex` (hand),
109
+ `bodyIndex` (body), `targetFps`, and `onBegin` / `onEnd` / `onChange`
110
+ callbacks, which fire from the frame loop with that frame's state.
111
+
112
+ ```tsx
113
+ const nod = useGesture("headNod", { faceIndex: 1, numFaces: 2, cooldownMs: 1000 });
114
+ const wave = useGesture("wave", { hand: "left", lostGraceMs: 400 });
115
+ ```
116
+
117
+ Per-gesture defaults are the ones in the table; `resolveGestureDetectorOptions(overrides, defaults)`
118
+ is what the hook applies.
119
+
120
+ ## Custom gestures
121
+
122
+ ```ts
123
+ import { defineGesture, HAND_JOINTS } from "@vincentt-xr/sdk/tracking";
124
+
125
+ // A "thumbs up": thumb tip well above the wrist while the other fingers curl.
126
+ const thumbsUp = defineGesture({
127
+ name: "thumbsUp",
128
+ kind: "hand",
129
+ description: "Thumb up, fingers curled.",
130
+ defaults: { enterThreshold: 0.7, exitThreshold: 0.5 },
131
+ measure: (hand) => {
132
+ if (!hand || hand.length < 21) return null;
133
+ const lift = hand[HAND_JOINTS.thumbTip].y - hand[HAND_JOINTS.wrist].y;
134
+ return { value: Math.min(1, Math.max(0, lift / 0.3)), confidence: 1 };
135
+ },
136
+ });
137
+
138
+ const up = useGesture(thumbsUp);
139
+ ```
140
+
141
+ Temporal gestures add `createMemory` and read it in `measure`; the built-in
142
+ `OscillationTracker` (on `/low-level`) counts direction reversals for nods,
143
+ shakes and waves.
144
+
145
+ **Sides.** `measure(input, memory, nowMs, context)` also gets the feed
146
+ (`GestureContext` `{ mirrored }`). Body input keeps MediaPipe's labels
147
+ (`POSE_JOINTS.leftWrist` is MediaPipe's left: the person's right on the
148
+ mirrored webcam), so read a person's side through the feed:
149
+
150
+ ```ts
151
+ import { personSide } from "@vincentt-xr/sdk";
152
+ import { POSE_JOINTS } from "@vincentt-xr/sdk/low-level";
153
+ import { defineGesture } from "@vincentt-xr/sdk/tracking";
154
+
155
+ const leftHandOnHead = defineGesture({
156
+ name: "leftHandOnHead",
157
+ kind: "body",
158
+ description: "The person's own left wrist above the nose.",
159
+ measure: (pose, _memory, _now, context) => {
160
+ if (!pose || pose.length < 33) return null;
161
+ const label = personSide("left", context?.mirrored ?? false);
162
+ const wrist = pose[label === "left" ? POSE_JOINTS.leftWrist : POSE_JOINTS.rightWrist];
163
+ return { value: wrist.y > pose[0].y ? 1 : 0, confidence: 1 };
164
+ },
165
+ });
166
+ ```
167
+
168
+ Face input is a `FaceInfo`, which carries `mirrored`; hand input is already
169
+ the person's hand (`hand: "left"`).
170
+
171
+ ## Relation to the other gesture APIs
172
+
173
+ - `<GestureTrigger>` fires once on a **named static hand pose** from the
174
+ gesture-recognizer model (`victory`, `thumb_up`, …). Use it for "show ✌️ to
175
+ start". `useGesture` measures **continuous and temporal** gestures from the
176
+ landmark trackers with thresholds you can tune.
177
+ - `useFaceAction` is the face-only predecessor with the same hysteresis idea;
178
+ the face gestures here reuse its measurements, and add cooldown,
179
+ confidence, loss grace and the temporal nod / shake.
180
+ - `<BodyTrigger>` / `useBodyTrigger` fire on **full-body poses and moves**
181
+ with this same lifecycle: BodyInstruction's poses (T-pose, hands up, hands
182
+ on hips, arms crossed, squat …) and moves over time (jump, squat reps, wave,
183
+ clap, punch, arm flap, kick, step left / right, march). Left / right are the
184
+ person's own sides on every camera, and leg moves need the whole body in
185
+ view. See [Body Triggers](/api/body-triggers).
186
+
187
+ ## Tracking loss and confidence
188
+
189
+ Losing the subject never leaves a gesture stuck: within `lostGraceMs` the
190
+ state holds (value frozen, `tracked: false`), after it the gesture ends with
191
+ `endReason: "lost"` so an effect can clean up differently from a deliberate
192
+ release. A subject that reappears starts cold: hold timers restart and
193
+ temporal memories reset, so a nod half-done before the dropout does not
194
+ complete on return.
195
+
196
+ ## Manual validation
197
+
198
+ Run `/gestures`:
199
+
200
+ | Case | Steps | Expect |
201
+ | ------------- | --------------------------------------- | ----------------------------------------------------------------------------------------- |
202
+ | Hysteresis | hold a half pinch around the threshold | Row stays active until the value drops below the exit threshold |
203
+ | Hold | set hold 300 ms on `pinch`, tap quickly | No begin for taps shorter than 300 ms |
204
+ | Cooldown | `headNod`, nod twice quickly | One begin; the second counts after 600 ms |
205
+ | Tracking loss | cover the hand mid-pinch | Row shows "lost" then ends with `lost` after the grace window |
206
+ | Confidence | set min confidence above 1 | Gesture never begins |
207
+ | Body | "Person Fullbody" clip, raise an arm | `armRaised` / side rows activate |
208
+ | Body sides | webcam, raise your real left arm | `armRaisedLeft` activates, not `armRaisedRight`; same on a clip for the person's left arm |
209
+ | Body triggers | see [Body Triggers](/api/body-triggers) | The "body triggers" section lights and counts poses and moves |
@@ -0,0 +1,97 @@
1
+ ---
2
+ title: "Hair (experimental)"
3
+ description: "Locks of hair that swing with the head: pigtails, ponytails, strands, on spring chains, rooted on the tracked head, with the real hair's mask beside them."
4
+ sidebarTitle: "Hair"
5
+ icon: "wind"
6
+ ---
7
+
8
+ `HairLock` adds a lock of hair to a tracked head: a pigtail, a ponytail, a strand. It swings as the
9
+ head turns and nods, then settles.
10
+
11
+ - **Procedural.** No model to make: a tapered tube along a chain of springs, its colour, length,
12
+ thickness and swing all props.
13
+ - **On the head.** Rooted in the canonical head frame, in centimetres; a `HeadBinding`'s occluder
14
+ hides the part that passes behind the head.
15
+ - **With the head.** It hangs along the head's own down, so a head tilt tilts it; only motion swings
16
+ it.
17
+
18
+ Experimental: its props and look may change in a later alpha. Import from
19
+ `@vincentt-xr/sdk/face-effects`.
20
+
21
+ ## Quick start: pigtails
22
+
23
+ ```tsx
24
+ import { VideoBackground, XRScene } from "@vincentt-xr/sdk";
25
+ import { HairLock, HeadBinding } from "@vincentt-xr/sdk/face-effects";
26
+
27
+ <XRScene>
28
+ <VideoBackground />
29
+ <HeadBinding faceIndex={0}>
30
+ <HairLock position={[8, 8.5, -3.5]} direction={[0.55, -0.7, -0.45]} />
31
+ <HairLock position={[-8, 8.5, -3.5]} direction={[-0.55, -0.7, -0.45]} />
32
+ </HeadBinding>
33
+ </XRScene>;
34
+ ```
35
+
36
+ A high ponytail, rising over the crown before it falls (it shows from the front):
37
+
38
+ ```tsx
39
+ <HairLock position={[0, 12.8, -6.5]} direction={[0, 0.8, -0.6]} length={26} segments={10} />
40
+ ```
41
+
42
+ ## Placing a lock
43
+
44
+ The head frame: centimetres, +X MediaPipe's left (the screen's right on an unmirrored feed), +Y up,
45
+ +Z out of the face; the ears are at x ≈ ±8.8, the crown at y ≈ 13.3 (`HEAD_ATTACHMENT_POINTS`).
46
+ `position` is the root, `direction` the way the lock leaves it; from there it curves down toward its
47
+ tip. Put roots on or just outside the head: inside it, the occluder hides them.
48
+
49
+ ## Props
50
+
51
+ | Prop | Default | Meaning |
52
+ | ---------------------------------- | ------------- | -------------------------------------------------------------------- |
53
+ | `position` | `[0, 0, 0]` | The root, head centimetres |
54
+ | `direction` | `[0, -1, 0]` | The way it leaves the root (head frame) |
55
+ | `length` | 16 | Length, cm |
56
+ | `segments` | 8 | Joints along it (2–32): more is smoother and floppier |
57
+ | `thickness` | `[1.2, 0.3]` | Radius at the root and the tip, cm (one number: even) |
58
+ | `color` | `"#3b2416"` | Any three.js colour |
59
+ | `frequency`, `damping`, `maxAngle` | 1.4, 0.45, 25 | The swing: swings per second, how fast it settles, degrees per joint |
60
+ | `enabled` | true | False: it hangs still |
61
+ | `faceIndex` | 0 | The face, when it runs its own head fit |
62
+
63
+ Inside a `CanonicalHeadFrame` (a `HeadBinding`) it reuses that fit; anywhere else under a
64
+ `FaceTracker` it runs its own. It is hidden while the face is lost and until the first fit.
65
+
66
+ The swing is the shared spring solver (`SpringChain`, the same as swinging earrings and necklace
67
+ pendants): see [Head occluder → Swinging](/api/head-occluder).
68
+
69
+ ## The real hair
70
+
71
+ `useHairMask()` (MediaPipe's hair segmenter) with `SegmentationOverlay label="hair"` shows where the
72
+ person's real hair is, as a 2D layer: see [Segmentation overlay](/api/segmentation-overlay).
73
+
74
+ ## Limits
75
+
76
+ - A smooth tube, no strands or texture; flat colour.
77
+ - Locks pass through each other and through the shoulders; only the head occluder hides them.
78
+ - The swing follows the head, not gravity: lying down, the locks still hang along the head.
79
+
80
+ ## Example
81
+
82
+ `/hair` in the SDK playground: pigtails, a high ponytail or both; swing on or off; the hair mask;
83
+ and a customise panel (colour, length, thickness, joints, swing) with the JSX to paste. Settings are
84
+ in the URL: `?style=both`, `?mask=1`, `?lock={"color":"#c0392b","lengthScale":1.5}`.
85
+
86
+ ## Manual visual test plan
87
+
88
+ Open `/hair` on the webcam.
89
+
90
+ 1. **Pigtails**: they hang beside your head; shake your head and nod: they swing and settle within
91
+ a couple of seconds; tilt: they tilt with you.
92
+ 2. **Occlusion**: turn your head: the part behind the head hides.
93
+ 3. **Ponytail**: it rises over the crown and swings out to the sides as you turn.
94
+ 4. **Hair mask**: your real hair turns pink; the locks draw over it.
95
+ 5. **Customise**: change colour, length, thickness and swing; the code shown matches what you see;
96
+ reset brings the start back.
97
+ 6. **Phone**: about 30 fps on a mid-range phone with both styles on.
@@ -0,0 +1,222 @@
1
+ ---
2
+ title: "Hand Instructions"
3
+ description: "Ask for a hand gesture with a 3D hint hand and your own copy, detect it on the tracked hands, and complete when it is held."
4
+ sidebarTitle: "Hand Instructions"
5
+ icon: "hand-peace"
6
+ ---
7
+
8
+ `HandInstruction` asks the person for a hand gesture and waits for it. A looping, translucent 3D hand
9
+ demonstrates the gesture, your copy sits under it, and holding the gesture for `holdMs` completes it.
10
+ There is no card and no progress bar. The pieces underneath are exported too: `useHandGesture` (the
11
+ detection alone) and `HandGestureHint` (the hand alone). For face expressions, see [Face Instructions](/api/face-instructions):
12
+ same layout and feedback.
13
+
14
+ Import from `@vincentt-xr/sdk/instructions`. Everything is customisable: your own gestures, detection
15
+ logic, thresholds, hint look and motion, text style, or a fully custom prompt. See
16
+ [Instructions](/api/instructions).
17
+
18
+ ## Quick start
19
+
20
+ ```tsx
21
+ import { useLoader } from "@react-three/fiber";
22
+ import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader.js";
23
+ import { HandInstruction } from "@vincentt-xr/sdk/instructions";
24
+
25
+ const PeaceToStart = ({ onStart }: { onStart: () => void }) => {
26
+ const hand = useLoader(GLTFLoader, handUrl); // hand-v1.glb, or any hand following the rig contract
27
+ return (
28
+ <HandInstruction
29
+ gesture="peace"
30
+ text="Peace to start"
31
+ model={hand.scene}
32
+ poses={hand.animations}
33
+ onComplete={onStart}
34
+ />
35
+ );
36
+ };
37
+ ```
38
+
39
+ Mount it inside `XRScene`. It acquires the hand model itself, so you don't need a `HandTracker`, and
40
+ draws over the AR content in its own screen-space layer (`HAND_INSTRUCTION_RENDER_ORDER` = 2000 and
41
+ up). Detection reads the hand model's world poses. It is separate from `GestureTracker` and its
42
+ MediaPipe gesture names.
43
+
44
+ ## `HandInstruction`
45
+
46
+ | Prop | Default | What it does |
47
+ | ---------------- | -------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------- |
48
+ | `gesture` | — | What to ask for: a name from `HAND_GESTURES` or your own `defineHandGesture(…)`. A new value is a new prompt. |
49
+ | `model` | — | The hint hand: a skinned hand following the [rig contract](/api/hand-rig#the-rig-contract-for-your-own-hand-model). |
50
+ | `poses` | — | The model's authored poses (the GLB's `animations`). Without them the hint is posed procedurally. |
51
+ | `modelHand` | `"right"` | The chirality the model is authored as. |
52
+ | `text` | the gesture's `label` | Your copy, in any language. Long text shrinks to fit. |
53
+ | `doneText` | keep `text` | Copy shown once completed, while it fades out. |
54
+ | `nudgeText` | `"Show your hand to the camera"` | Second line after `nudgeAfterMs` with no hand in view; the hint pulses. `null` turns it off. |
55
+ | `nudgeAfterMs` | `3000` | How long without a hand before the nudge. |
56
+ | `hand` | `"any"` | Which of the person's hands may do it: `"left"`, `"right"` or `"any"`. |
57
+ | `holdMs` | `400` | How long the gesture must be held. |
58
+ | `graceMs` | `150` | Dropouts shorter than this don't restart the hold. |
59
+ | `limits` | — | Classifier thresholds to override for this prompt (see `HAND_SHAPE_LIMITS`). |
60
+ | `size` | `"md"` | `"sm"`, `"md"`, `"lg"`: the hint is 10 / 14 / 19 % of the screen height; or a fraction of it (`0.22`). |
61
+ | `placement` | `"center"` | `"top"`, `"center"` or `"bottom"`. |
62
+ | `offset` | `[0, 0]` | Shift from the placement, in half-screens (`[0.5, 0]` = a quarter screen right). |
63
+ | `orbit` | `35` | The hint's auto orbit, degrees to each side. `0` holds it still. |
64
+ | `look` | `HAND_HINT_LOOK` | The hint's look, merged over the default: ghost tint and opacities, halo, glow, highlight, your own material. |
65
+ | `loop` | `HAND_HINT_LOOP` | The hint's loop: `seconds`, `hold`, `from`, `easing`, finger `stagger`. |
66
+ | `highlight` | picked from the gesture | The digits drawn brighter, or `false`. |
67
+ | `color` | `"#ffffff"` | Text colour. The text has a soft dark shadow so it reads on any camera feed. |
68
+ | `textStyle` … | — | `textStyle`, `nudgeTextStyle`, `renderText`, `motion`, `layout`: restyle the text, timings and proportions. See [Instructions](/api/instructions). |
69
+ | `onComplete` | — | Called once when the gesture is held long enough. |
70
+ | `onStatusChange` | — | Called once with the first status, then on every change (see below). |
71
+ | `hideOnComplete` | `true` | Fade out after completing. A small pop and a white ring play either way. |
72
+ | `active` | `true` | `false` hides it and pauses detection. |
73
+
74
+ `onStatusChange` reports a `HandInstructionStatus`:
75
+
76
+ - `"waiting"`: no usable hand in view.
77
+ - `"detected"`: a hand in view, not doing the gesture.
78
+ - `"holding"`: doing it; the hold is running.
79
+ - `"done"`: completed.
80
+
81
+ Use it for app logic or to announce progress to a screen reader. The instruction is drawn in WebGL, so
82
+ it is invisible to assistive technology on its own.
83
+
84
+ ## Gestures
85
+
86
+ | Name | Default copy | Recognised when |
87
+ | -------------- | ----------------------- | --------------------------------------------------------- |
88
+ | `palm` | Show your palm | All five digits up. |
89
+ | `fist` | Make a fist | No digit up. |
90
+ | `peace` | Show a peace sign | Index and middle up, ring and pinky folded (thumb any). |
91
+ | `thumbUp` | Give a thumbs up | Thumb up and pointing up on screen, fingers folded. |
92
+ | `thumbDown` | Give a thumbs down | Thumb up and pointing down on screen, fingers folded. |
93
+ | `point` | Point your index finger | Index up, the other fingers folded (thumb any). |
94
+ | `one` … `five` | Show 1 finger … | Exactly that many digits up, thumb included, any of them. |
95
+ | `rock` | Rock on | Index and pinky up, middle and ring folded. |
96
+ | `loveYou` | Sign I love you | Thumb, index and pinky up, middle and ring folded. |
97
+ | `callMe` | Call me | Thumb and pinky up, the rest folded. |
98
+ | `ok` | Make an OK sign | Thumb and index tips touching, middle, ring and pinky up. |
99
+
100
+ Several can match at once: a peace sign is also `two`. There is deliberately no gesture for the
101
+ middle finger alone.
102
+
103
+ ## Detection only: `useHandGesture`
104
+
105
+ ```tsx
106
+ import { useHandGesture } from "@vincentt-xr/sdk/instructions";
107
+
108
+ const { status, holdRef, matchedRef, shapesRef, isInView, reset } = useHandGesture("thumbUp", {
109
+ hand: "any",
110
+ holdMs: 400,
111
+ limits: { thumbReach: 0.9 }, // optional, this detector only
112
+ onComplete: () => unlock(),
113
+ });
114
+ ```
115
+
116
+ `status` (`"waiting"` → `"holding"` → `"done"`) re-renders only when it changes. Read
117
+ `holdRef.current.progress` (0..1), `matchedRef.current` (matched this frame) and
118
+ `shapesRef.current.left` / `.right` (`HandShape`) inside `useFrame`, not in render. `reset()` asks
119
+ again. The result is an `InstructionDetector`, so it can drive a custom `<Instruction>`.
120
+
121
+ A rule, a match function or a definition works anywhere a gesture name does:
122
+
123
+ ```tsx
124
+ useHandGesture({ digits: { index: true, pinky: true, middle: false }, thumbIndexTouch: false });
125
+ useHandGesture((shape, side) => side === "left" && shape.curl.index > 0.8);
126
+ ```
127
+
128
+ A `HandGestureRule` has these fields:
129
+
130
+ - `digits`: per digit, `true` = up, `false` = folded, omitted = any.
131
+ - `count`: the exact number of digits up.
132
+ - `thumbDirection`: `"up"` or `"down"`.
133
+ - `thumbIndexTouch`: whether the thumb and index tips touch.
134
+
135
+ The classifier is pure. `analyzeHandShape(pose.world)` returns a `HandShape` with:
136
+
137
+ - `extended` and `curl` (0..1) per digit;
138
+ - `count`;
139
+ - `thumbDirection`, relative to the screen;
140
+ - `thumbIndexTouch`.
141
+
142
+ `matchHandGesture(shape, nameOrRule)` tests one gesture; `matchingHandGestures(shape)` lists every
143
+ name the shape satisfies. The default thresholds are `HAND_SHAPE_LIMITS` (read-only); override them per
144
+ call with `analyzeHandShape(world, { limits })` or the hook's `limits`.
145
+
146
+ ## The hint hand: `HandGestureHint`
147
+
148
+ ```tsx
149
+ <HandGestureHint gesture="ok" model={hand.scene} poses={hand.animations} height={0.4} />
150
+ ```
151
+
152
+ The hand alone, for your own layout. It is fitted to `height` (parent units) and loops from a relaxed
153
+ hand into the pose and back. The default look:
154
+
155
+ - **Ghost:** translucent white, with a brighter rim.
156
+ - **Highlight:** the gesture's key digits are brighter. Peace lights the index and middle, OK the
157
+ thumb and index, thumbs up the thumb. `highlight` overrides with a digit list or `false`.
158
+ - **Halo:** a soft dark edge so it reads on light backgrounds (`look.halo`).
159
+ - **Glow:** a soft white light from behind the hand, brightening as the gesture forms (`look.glow`).
160
+ It is a separate disc behind the hand, so it never shows as inner layers.
161
+ - **Motion:** the fingers close one after another, pinky first (`loop`).
162
+ - **Orbit:** a slow ±35° side-to-side turn (`orbit`, `orbitSeconds`).
163
+
164
+ `look` is merged over `HAND_HINT_LOOK` (`false` turns a layer off; `look.material` replaces the
165
+ ghost). `showHand` picks the chirality to show; the other one is the model
166
+ mirrored.
167
+
168
+ **Authored poses.** Each gesture's `hint.clip` names a single-key animation clip on the model.
169
+ `hand-v1.glb` ships 11, posed in Blender: `palm`, `fist`, `peace`, `one`, `three`, `four`, `rock`,
170
+ `loveYou`, `callMe`, `thumbUp`, `ok`. `two`, `point`, `five` and `thumbDown` reuse them. Pass the
171
+ GLB's `animations` as `poses`. A model without the clip is posed procedurally from the same
172
+ `HandHintPose`.
173
+
174
+ **The view** is part of the hint too:
175
+
176
+ - `yaw` turns the hand about the fingers' axis: 0 shows the palm (most gestures, including peace,
177
+ point and the counts), 180 the back of the hand (rock), 124 the thumb side (OK).
178
+ - `roll` turns it in the screen plane: call me is held sideways, thumb up.
179
+ - `aimThumb` turns a thumbs up or down until the thumb points that way.
180
+
181
+ Every hint pose, authored and procedural, is tested to be recognised by the detector as its own
182
+ gesture.
183
+
184
+ The pieces underneath, also in `/instructions`:
185
+
186
+ - `applyHandHintPose(binding, hint, amount, clips)`: `amount` 0..1, or one per digit
187
+ (`HandHintAmount`).
188
+ - `readHandClipPose(clip)`.
189
+ - The hold timing: `GESTURE_HOLD_DEFAULT_MS`, `GESTURE_HOLD_GRACE_MS`, `createGestureHoldState`,
190
+ `stepGestureHold`.
191
+
192
+ ## Example
193
+
194
+ `/hand-instructions` covers:
195
+
196
+ - every gesture as a chip, and a sequence mode that moves to the next gesture when one completes;
197
+ - text, nudge, size, placement and hold-time controls;
198
+ - a live readout of the status and what the classifier sees on each hand: digits up, count, thumb
199
+ direction, touch, matching gestures.
200
+
201
+ Local clips in the git-ignored `example/src/assets/media/local/` are listed first.
202
+
203
+ ## Manual visual test plan
204
+
205
+ Open `/hand-instructions`.
206
+
207
+ 1. **Every hint reads**: step through all 15 chips. Each hand forms its gesture, at its view: the palm
208
+ for peace, point and the counts, the back of the hand for rock, thumb side for OK, sideways for call me, thumb vertical for
209
+ thumbs up / down. The key digits are brighter, and it stays inside its slot through the orbit.
210
+ 2. **Looks**: the ghost is translucent with no inner fingers showing through, the halo separates it
211
+ from a white shirt, and the wrist fades out.
212
+ 3. **Motion**: the fingers close pinky first and settle. The hand swings about 35° each way.
213
+ 4. **Detection**: on the webcam, make each gesture with either hand. The readout shows `holding`,
214
+ then `done`. A wrong gesture stays `detected`. Peace also lists `two`.
215
+ 5. **Completion**: on done, a small pop and a white ring play. With sequence on, it fades out and the
216
+ next gesture comes in.
217
+ 6. **Nudge**: hide your hands for 3 s. The second line fades in and the hint pulses. Show a hand and
218
+ it fades out. With the nudge off it never appears.
219
+ 7. **Copy and layout**: type custom text (long text shrinks to fit), switch the sizes and top /
220
+ center / bottom placement. Nothing overlaps the screen edge.
221
+ 8. **Mirroring**: on the mirrored webcam the hint shows the hand you'd use, mirrored to match the
222
+ screen, with the thumb on the correct side.