@vincentt-xr/sdk 2.0.0-alpha.8 → 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 (517) hide show
  1. package/GROUNDING.md +4643 -170
  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/gltfLoader.d.ts +16 -0
  18. package/dist/assets/loaders.d.ts +16 -1
  19. package/dist/body-pose/index.d.ts +521 -0
  20. package/dist/body-trigger/__fixtures__/syntheticBody.d.ts +83 -0
  21. package/dist/body-trigger/frame.d.ts +88 -0
  22. package/dist/body-trigger/index.d.ts +6 -0
  23. package/dist/body-trigger/moves.d.ts +235 -0
  24. package/dist/body-trigger/trigger.d.ts +75 -0
  25. package/dist/calibration/calibration.d.ts +11 -6
  26. package/dist/canonicalFace-BHwyCx1c.js +9 -0
  27. package/dist/canonicalFace-C83I225R.cjs +1 -0
  28. package/dist/components/BodyInstruction/BodyPoseHint.d.ts +63 -0
  29. package/dist/components/BodyInstruction/index.d.ts +69 -0
  30. package/dist/components/BodyInstruction/useBodyPose.d.ts +23 -0
  31. package/dist/components/BodyTracker/index.d.ts +10 -2
  32. package/dist/components/BodyTrigger/index.d.ts +49 -0
  33. package/dist/components/Debugger/DebuggerProvider.d.ts +14 -1
  34. package/dist/components/Debugger/DebuggerUI.d.ts +3 -1
  35. package/dist/components/FaceAtlas/FaceAtlasLayer.d.ts +114 -0
  36. package/dist/components/FaceAtlas/MadeUpCamera.d.ts +80 -0
  37. package/dist/components/FaceAtlas/constants.d.ts +8 -0
  38. package/dist/components/FaceAtlas/index.d.ts +7 -0
  39. package/dist/components/FaceAtlas/useFaceAtlasSurface.d.ts +84 -0
  40. package/dist/components/FaceAtlas/useFaceSkin.d.ts +84 -0
  41. package/dist/components/FaceCharacter/ExternalFaceMesh.d.ts +109 -0
  42. package/dist/components/FaceCharacter/FaceExpressionController.d.ts +53 -0
  43. package/dist/components/FaceCharacter/FaceMorph.d.ts +71 -0
  44. package/dist/components/FaceCharacter/FacePiercing.d.ts +65 -0
  45. package/dist/components/FaceCharacter/FaceReprojection.d.ts +85 -0
  46. package/dist/components/FaceCharacter/FaceRig.d.ts +38 -0
  47. package/dist/components/FaceCharacter/FaceSurface.d.ts +49 -0
  48. package/dist/components/FaceCharacter/FaceSurfaceOccluder.d.ts +39 -0
  49. package/dist/components/FaceCharacter/PinToFaceMesh.d.ts +68 -0
  50. package/dist/components/FaceCharacter/index.d.ts +18 -0
  51. package/dist/components/FaceCharacter/useFaceReprojector.d.ts +10 -0
  52. package/dist/components/FaceInset/FaceInset.d.ts +68 -0
  53. package/dist/components/FaceInset/frame.d.ts +94 -0
  54. package/dist/components/FaceInset/index.d.ts +6 -0
  55. package/dist/components/FaceInset/material.d.ts +40 -0
  56. package/dist/components/FaceInset/useFaceInsetTexture.d.ts +37 -0
  57. package/dist/components/FaceInstruction/FaceExpressionHint.d.ts +43 -0
  58. package/dist/components/FaceInstruction/index.d.ts +56 -0
  59. package/dist/components/FaceInstruction/useFaceExpression.d.ts +20 -0
  60. package/dist/components/FaceLiquify/FaceLiquify.d.ts +49 -0
  61. package/dist/components/FaceLiquify/debug.d.ts +37 -0
  62. package/dist/components/FaceLiquify/frame.d.ts +55 -0
  63. package/dist/components/FaceLiquify/index.d.ts +10 -0
  64. package/dist/components/FaceLiquify/material.d.ts +39 -0
  65. package/dist/components/FaceLiquify/pass.d.ts +49 -0
  66. package/dist/components/FaceLiquify/presence.d.ts +25 -0
  67. package/dist/components/FaceLiquify/presets.d.ts +82 -0
  68. package/dist/components/FaceLiquify/selfTest.d.ts +66 -0
  69. package/dist/components/FaceLiquify/target.d.ts +85 -0
  70. package/dist/components/FaceLiquify/warp.d.ts +72 -0
  71. package/dist/components/FaceMesh/canonical/CanonicalFaceMeshRenderer.d.ts +5 -3
  72. package/dist/components/FaceMesh/canonical/geometryGroups.d.ts +21 -0
  73. package/dist/components/FaceMesh/canonical/parseCanonicalFaceModel.d.ts +9 -0
  74. package/dist/components/FaceMesh/index.d.ts +1 -1
  75. package/dist/components/FaceRetouch/Background.d.ts +3 -1
  76. package/dist/components/FaceRetouch/FaceRetouch.d.ts +5 -0
  77. package/dist/components/FaceRetouch/renderState.d.ts +19 -0
  78. package/dist/components/FaceSwap/FaceMirror.d.ts +46 -0
  79. package/dist/components/FaceSwap/FaceSwap.d.ts +58 -0
  80. package/dist/components/FaceSwap/FaceTextureLayer.d.ts +72 -0
  81. package/dist/components/FaceSwap/faceSwapPlan.d.ts +91 -0
  82. package/dist/components/FaceSwap/index.d.ts +13 -0
  83. package/dist/components/FaceSwap/settings.d.ts +300 -0
  84. package/dist/components/FaceSwap/useFaceTexture.d.ts +35 -0
  85. package/dist/components/FaceSwap/useLiveFace.d.ts +38 -0
  86. package/dist/components/FaceSwap/useLiveFaceTexture.d.ts +31 -0
  87. package/dist/components/FaceWarp3D/FaceWarp3D.d.ts +50 -0
  88. package/dist/components/FaceWarp3D/index.d.ts +2 -3
  89. package/dist/components/Faceless/Faceless.d.ts +51 -0
  90. package/dist/components/Faceless/index.d.ts +2 -0
  91. package/dist/components/HairLock/HairLock.d.ts +39 -0
  92. package/dist/components/HairLock/index.d.ts +2 -0
  93. package/dist/components/HairLock/lockGeometry.d.ts +15 -0
  94. package/dist/components/HandCutout/index.d.ts +35 -0
  95. package/dist/components/HandInstruction/HandGestureHint.d.ts +70 -0
  96. package/dist/components/HandInstruction/index.d.ts +74 -0
  97. package/dist/components/HandInstruction/useHandGesture.d.ts +22 -0
  98. package/dist/components/HandRig/ForearmOccluder.d.ts +29 -0
  99. package/dist/components/HandRig/HandAttachment.d.ts +34 -0
  100. package/dist/components/HandRig/HandOccluder.d.ts +55 -0
  101. package/dist/components/HandRig/HandTattoo.d.ts +61 -0
  102. package/dist/components/HandRig/WristAttachment.d.ts +34 -0
  103. package/dist/components/HandRig/index.d.ts +101 -0
  104. package/dist/components/HandRig/useArmMask.d.ts +29 -0
  105. package/dist/components/HandRig/wristSolve.d.ts +69 -0
  106. package/dist/components/HandTouch/HandTouch.d.ts +62 -0
  107. package/dist/components/HandTouch/Touchable.d.ts +36 -0
  108. package/dist/components/HandTouch/index.d.ts +2 -0
  109. package/dist/components/HeadBinding/index.d.ts +14 -0
  110. package/dist/components/HeadOccluder/CanonicalHeadFrame.d.ts +22 -0
  111. package/dist/components/HeadOccluder/Earrings.d.ts +55 -0
  112. package/dist/components/HeadOccluder/HeadAttachment.d.ts +38 -0
  113. package/dist/components/HeadOccluder/NeckOccluder.d.ts +64 -0
  114. package/dist/components/HeadOccluder/earringPlacement.d.ts +31 -0
  115. package/dist/components/HeadOccluder/headAttachmentPoints.d.ts +69 -0
  116. package/dist/components/HeadOccluder/index.d.ts +57 -3
  117. package/dist/components/HeadOccluder/useCanonicalHeadFit.d.ts +36 -0
  118. package/dist/components/HeadOccluder/useLandmarkPoseFit.d.ts +80 -0
  119. package/dist/components/Instruction/HintStage.d.ts +29 -0
  120. package/dist/components/Instruction/InstructionCue.d.ts +126 -0
  121. package/dist/components/Instruction/gestureHold.d.ts +20 -0
  122. package/dist/components/Instruction/ghost.d.ts +129 -0
  123. package/dist/components/Instruction/hintBlend.d.ts +19 -0
  124. package/dist/components/Instruction/hintLook.d.ts +81 -0
  125. package/dist/components/Instruction/hintLoop.d.ts +36 -0
  126. package/dist/components/Instruction/index.d.ts +41 -0
  127. package/dist/components/Instruction/useGhostModel.d.ts +33 -0
  128. package/dist/components/Instruction/useInstructionHold.d.ts +72 -0
  129. package/dist/components/LipEffect/LipEffect.d.ts +22 -2
  130. package/dist/components/LipEffect/LipEffectMaterial.d.ts +62 -10
  131. package/dist/components/LipEffect/LipEffects.d.ts +5 -2
  132. package/dist/components/LipEffect/defaults.d.ts +21 -2
  133. package/dist/components/LipEffect/index.d.ts +1 -1
  134. package/dist/components/LipEffect/lipShading.d.ts +73 -0
  135. package/dist/components/LipEffect/settings.d.ts +117 -13
  136. package/dist/components/LipEffect/shader.d.ts +39 -0
  137. package/dist/components/LipEffect/types.d.ts +82 -10
  138. package/dist/components/LipEffect/useLipDesignTextures.d.ts +6 -0
  139. package/dist/components/LipEffect/uvGuide.d.ts +31 -16
  140. package/dist/components/Makeup/Blush.d.ts +18 -0
  141. package/dist/components/Makeup/Brows.d.ts +20 -0
  142. package/dist/components/Makeup/Contour.d.ts +17 -0
  143. package/dist/components/Makeup/Eyeliner.d.ts +20 -0
  144. package/dist/components/Makeup/Eyeshadow.d.ts +20 -0
  145. package/dist/components/Makeup/Highlighter.d.ts +18 -0
  146. package/dist/components/Makeup/MakeupDesign.d.ts +37 -0
  147. package/dist/components/Makeup/MakeupRegion.d.ts +132 -0
  148. package/dist/components/Makeup/constants.d.ts +44 -0
  149. package/dist/components/Makeup/design.d.ts +106 -0
  150. package/dist/components/Makeup/designSamples.d.ts +42 -0
  151. package/dist/components/Makeup/eyes.d.ts +114 -0
  152. package/dist/components/Makeup/fields.d.ts +10 -0
  153. package/dist/components/Makeup/geometry.d.ts +106 -0
  154. package/dist/components/Makeup/index.d.ts +26 -0
  155. package/dist/components/Makeup/looks.d.ts +28 -0
  156. package/dist/components/Makeup/material.d.ts +239 -0
  157. package/dist/components/Makeup/settings.d.ts +54 -0
  158. package/dist/components/Makeup/shades.d.ts +143 -0
  159. package/dist/components/Makeup/shapes.d.ts +27 -0
  160. package/dist/components/Makeup/skinTone.d.ts +135 -0
  161. package/dist/components/Makeup/types.d.ts +110 -0
  162. package/dist/components/Makeup/useMakeupSkinTone.d.ts +40 -0
  163. package/dist/components/Necklace/Necklace.d.ts +44 -0
  164. package/dist/components/Necklace/index.d.ts +1 -0
  165. package/dist/components/ParticleEmitter/ParticleEmitter.d.ts +69 -0
  166. package/dist/components/ParticleEmitter/index.d.ts +1 -0
  167. package/dist/components/ShoulderOccluder/index.d.ts +43 -0
  168. package/dist/components/ShoulderOccluder/useCanonicalTorsoFit.d.ts +24 -0
  169. package/dist/components/SpringSwing/SpringSwing.d.ts +22 -0
  170. package/dist/components/SpringSwing/index.d.ts +1 -0
  171. package/dist/components/XRScene/renderOutputTarget.d.ts +12 -0
  172. package/dist/components/index.d.ts +8 -0
  173. package/dist/config/index.d.ts +0 -1
  174. package/dist/context-DTxSQvp4.js +13 -0
  175. package/dist/context-hA0Rb2Xa.cjs +1 -0
  176. package/dist/contexts-BH7PdKFS.cjs +1 -0
  177. package/dist/contexts-jak8-tND.js +667 -0
  178. package/dist/coordinates/index.d.ts +2 -0
  179. package/dist/coordinates/side.d.ts +40 -0
  180. package/dist/debug-ui/default-setting.cjs +2 -2
  181. package/dist/debug-ui/face-swap-settings/index.d.ts +22 -0
  182. package/dist/debug-ui/hierarchy-panel/index.d.ts +3 -2
  183. package/dist/debug-ui/index.d.ts +4 -3
  184. package/dist/debug-ui/media-source/index.d.ts +1 -1
  185. package/dist/debug-ui/media-source/session.d.ts +30 -2
  186. package/dist/debug-ui/media-source.cjs +1 -1
  187. package/dist/debug-ui/media-source.js +1 -1
  188. package/dist/debug-ui/object-inspector-panel/index.d.ts +3 -2
  189. package/dist/debug-ui/product-hotspots/index.d.ts +3 -2
  190. package/dist/debug-ui/scene-editor/hierarchy-panel.d.ts +3 -1
  191. package/dist/debug-ui/scene-editor/inspector-panel.d.ts +3 -1
  192. package/dist/debug-ui/screen-image-settings/index.d.ts +3 -1
  193. package/dist/debug-ui/screen-text-settings/ScreenTextSettingsPanel.d.ts +1 -1
  194. package/dist/debug-ui/screen-text-settings/types.d.ts +2 -0
  195. package/dist/debug-ui/settings-panel/index.d.ts +6 -1
  196. package/dist/debug-ui/shared/debugWindow.d.ts +51 -0
  197. package/dist/debug-ui/xr-diagnostics/index.d.ts +3 -2
  198. package/dist/debug-ui.cjs +3 -3
  199. package/dist/debug-ui.js +2250 -2472
  200. package/dist/entries/all.d.ts +3 -1
  201. package/dist/entries/core.d.ts +3 -2
  202. package/dist/entries/face-effects.d.ts +114 -8
  203. package/dist/entries/instructions.d.ts +48 -0
  204. package/dist/entries/internal.d.ts +2 -1
  205. package/dist/entries/low-level.d.ts +28 -1
  206. package/dist/entries/particles.d.ts +11 -0
  207. package/dist/entries/tracking.d.ts +37 -2
  208. package/dist/face-atlas/attributes.d.ts +30 -0
  209. package/dist/face-atlas/eyes.d.ts +272 -0
  210. package/dist/face-atlas/faceAtlas.generated.d.ts +46 -0
  211. package/dist/face-atlas/glsl/atlasVertex.d.ts +46 -0
  212. package/dist/face-atlas/glsl/common.d.ts +55 -0
  213. package/dist/face-atlas/glsl/design.d.ts +49 -0
  214. package/dist/face-atlas/glsl/eyes.d.ts +73 -0
  215. package/dist/face-atlas/glsl/finish.d.ts +24 -0
  216. package/dist/face-atlas/glsl/format.d.ts +4 -0
  217. package/dist/face-atlas/glsl/index.d.ts +59 -0
  218. package/dist/face-atlas/glsl/shading.d.ts +15 -0
  219. package/dist/face-atlas/glsl/shapes.d.ts +66 -0
  220. package/dist/face-atlas/glsl/sparkle.d.ts +19 -0
  221. package/dist/face-atlas/glsl/uniforms.d.ts +106 -0
  222. package/dist/face-atlas/guide.d.ts +51 -0
  223. package/dist/face-atlas/index.d.ts +25 -0
  224. package/dist/face-atlas/lead.d.ts +117 -0
  225. package/dist/face-atlas/madeUpCamera.d.ts +125 -0
  226. package/dist/face-atlas/masks.d.ts +53 -0
  227. package/dist/face-atlas/obj.d.ts +69 -0
  228. package/dist/face-atlas/polylines.d.ts +63 -0
  229. package/dist/face-atlas/probe/FaceSkinProbe.d.ts +208 -0
  230. package/dist/face-atlas/probe/__fixtures__/emulate.d.ts +9 -0
  231. package/dist/face-atlas/probe/__fixtures__/face.d.ts +24 -0
  232. package/dist/face-atlas/probe/constants.d.ts +137 -0
  233. package/dist/face-atlas/probe/glsl.d.ts +43 -0
  234. package/dist/face-atlas/probe/lightFit.d.ts +108 -0
  235. package/dist/face-atlas/probe/schedule.d.ts +44 -0
  236. package/dist/face-atlas/probe/selfTest.d.ts +87 -0
  237. package/dist/face-atlas/probe/stats.d.ts +143 -0
  238. package/dist/face-atlas/probe/targets.d.ts +70 -0
  239. package/dist/face-atlas/probe/unwrap.d.ts +76 -0
  240. package/dist/face-atlas/quality.d.ts +28 -0
  241. package/dist/face-atlas/regions.d.ts +31 -0
  242. package/dist/face-atlas/registry.d.ts +252 -0
  243. package/dist/face-atlas/renderState.d.ts +86 -0
  244. package/dist/face-atlas/selfOcclusion.d.ts +62 -0
  245. package/dist/face-atlas/shading.d.ts +406 -0
  246. package/dist/face-atlas/shapes.d.ts +86 -0
  247. package/dist/face-atlas/sides.d.ts +41 -0
  248. package/dist/face-atlas/skinMask.d.ts +35 -0
  249. package/dist/face-atlas/surface.d.ts +155 -0
  250. package/dist/face-atlas/topology.d.ts +44 -0
  251. package/dist/face-character/__fixtures__/faceImageDetections.d.ts +25 -0
  252. package/dist/face-character/__fixtures__/faceNode.d.ts +22 -0
  253. package/dist/face-character/bindFaceModel.d.ts +106 -0
  254. package/dist/face-character/canonicalFace.d.ts +17 -0
  255. package/dist/face-character/canonicalFaceGeometry.d.ts +11 -0
  256. package/dist/face-character/canonicalFacePositions.d.ts +7 -0
  257. package/dist/face-character/driveFaceModel.d.ts +57 -0
  258. package/dist/face-character/expressionOutputs.d.ts +45 -0
  259. package/dist/face-character/faceExpressions.d.ts +104 -0
  260. package/dist/face-character/faceImageLandmarker.d.ts +93 -0
  261. package/dist/face-character/faceMeshBinding.d.ts +62 -0
  262. package/dist/face-character/faceMorph.d.ts +77 -0
  263. package/dist/face-character/faceMorphs.d.ts +46 -0
  264. package/dist/face-character/facePhoto.d.ts +138 -0
  265. package/dist/face-character/facePiercings.d.ts +116 -0
  266. package/dist/face-character/facePin.d.ts +131 -0
  267. package/dist/face-character/faceReprojection.d.ts +273 -0
  268. package/dist/face-character/faceReprojector.d.ts +171 -0
  269. package/dist/face-character/faceRig.d.ts +176 -0
  270. package/dist/face-character/faceSwapPresence.d.ts +85 -0
  271. package/dist/face-character/faceTexture.d.ts +169 -0
  272. package/dist/face-character/faceTextureBaker.d.ts +86 -0
  273. package/dist/face-character/faceTextureGuide.d.ts +106 -0
  274. package/dist/face-character/faceTextureStats.d.ts +298 -0
  275. package/dist/face-character/faceTransfer.d.ts +396 -0
  276. package/dist/face-character/faceTransferGeometry.d.ts +109 -0
  277. package/dist/face-character/faceTransferSelfTest.d.ts +94 -0
  278. package/dist/face-character/faceWarp3D.d.ts +101 -0
  279. package/dist/face-character/faceless.d.ts +79 -0
  280. package/dist/face-character/featureWarp.d.ts +28 -0
  281. package/dist/face-character/liveFaceRegistry.d.ts +370 -0
  282. package/dist/face-character/liveValue.d.ts +12 -0
  283. package/dist/face-character/memo.d.ts +15 -0
  284. package/dist/face-effects.cjs +2252 -83
  285. package/dist/face-effects.js +14234 -1231
  286. package/dist/face-expression/index.d.ts +182 -0
  287. package/dist/face-info/landmarks.d.ts +17 -3
  288. package/dist/face-info/types.d.ts +20 -3
  289. package/dist/gestures/definitions.d.ts +15 -2
  290. package/dist/gestures/index.d.ts +1 -1
  291. package/dist/gestures/measures.d.ts +21 -8
  292. package/dist/getFaceInfo-B1otSDMX.cjs +1 -0
  293. package/dist/getFaceInfo-Cu4xDWiL.js +62 -0
  294. package/dist/hand/armFit.d.ts +46 -0
  295. package/dist/hand/armMask.d.ts +178 -0
  296. package/dist/hand/handCutout.d.ts +23 -0
  297. package/dist/hand/handCutoutRegistry.d.ts +7 -0
  298. package/dist/hand/handGestures.d.ts +524 -0
  299. package/dist/hand/handPose.d.ts +98 -0
  300. package/dist/hand/handRigSolver.d.ts +159 -0
  301. package/dist/hand/handTattoo.d.ts +81 -0
  302. package/dist/hand/handTouch.d.ts +240 -0
  303. package/dist/hand/wrist.d.ts +44 -0
  304. package/dist/hand/wristFilter.d.ts +44 -0
  305. package/dist/hooks/selectors.d.ts +8 -0
  306. package/dist/hooks/useFaceModelAcquisition.d.ts +38 -0
  307. package/dist/hooks/useTrackerContext.d.ts +6 -0
  308. package/dist/index-B1_TzJaI.js +1104 -0
  309. package/dist/index-BavF06C6.js +190 -0
  310. package/dist/index-BfFmpddl.cjs +21 -0
  311. package/dist/index-BuBzneeW.cjs +46 -0
  312. package/dist/index-CGsQWodV.cjs +1 -0
  313. package/dist/index-CIe7eCMH.js +3200 -0
  314. package/dist/index-CfSF8LXa.cjs +1 -0
  315. package/dist/index-D5GTzOzD.cjs +1 -0
  316. package/dist/index-DBhQzvVa.js +314 -0
  317. package/dist/index-DE17y0ZI.cjs +1 -0
  318. package/dist/index-JII7huPk.js +442 -0
  319. package/dist/index-tpCr9CLj.cjs +1 -0
  320. package/dist/{renderPasses-NnKZVfBy.js → index-w1S7fI2B.js} +219 -247
  321. package/dist/index-zGaqrz_K.js +188 -0
  322. package/dist/instructions.cjs +30 -0
  323. package/dist/instructions.js +1507 -0
  324. package/dist/{internal-vsfNQycj.js → internal-B90P-clC.js} +138 -118
  325. package/dist/internal-Cjinca64.cjs +1 -0
  326. package/dist/internal.cjs +1 -1
  327. package/dist/internal.js +15 -10
  328. package/dist/iris/compute.d.ts +7 -5
  329. package/dist/iris/types.d.ts +6 -4
  330. package/dist/{landmarkMask-CbTFzBYG.js → landmarkMask-BFDyBnKM.js} +6 -6
  331. package/dist/landmarks-BlUqf5MZ.cjs +1 -0
  332. package/dist/landmarks-bftdwq6Z.js +76 -0
  333. package/dist/loaders-BGAUACsd.js +363 -0
  334. package/dist/loaders-BJ1_QCHt.cjs +1 -0
  335. package/dist/low-level.cjs +1 -1
  336. package/dist/low-level.js +666 -602
  337. package/dist/main.cjs +1 -1
  338. package/dist/main.js +866 -1182
  339. package/dist/models/Body/index.d.ts +2 -0
  340. package/dist/models/Face/constants.d.ts +8 -0
  341. package/dist/models/Face/index.d.ts +3 -11
  342. package/dist/models/Face/rotation.d.ts +18 -3
  343. package/dist/models/Hand/HandTracking.d.ts +17 -1
  344. package/dist/models/Segmentation/index.d.ts +2 -0
  345. package/dist/models/nodeSource.d.ts +9 -0
  346. package/dist/particles/emission.d.ts +24 -0
  347. package/dist/particles/eyes.d.ts +24 -0
  348. package/dist/particles/glsl.d.ts +14 -0
  349. package/dist/particles/index.d.ts +10 -0
  350. package/dist/particles/motion.d.ts +42 -0
  351. package/dist/particles/presets.d.ts +12 -0
  352. package/dist/particles/ring.d.ts +58 -0
  353. package/dist/particles/selfTest.d.ts +53 -0
  354. package/dist/particles/settings.d.ts +127 -0
  355. package/dist/particles/shapes.d.ts +29 -0
  356. package/dist/particles/spawner.d.ts +60 -0
  357. package/dist/particles/system.d.ts +64 -0
  358. package/dist/particles.cjs +122 -0
  359. package/dist/particles.js +774 -0
  360. package/dist/product.cjs +1 -1
  361. package/dist/product.js +29 -29
  362. package/dist/{providers-C0Dlhh9Z.js → providers-C8rE26Uf.js} +127 -126
  363. package/dist/providers-DHsrhDI2.cjs +62 -0
  364. package/dist/render/renderPasses.d.ts +8 -0
  365. package/dist/render/sceneBeforeRender.d.ts +12 -0
  366. package/dist/{renderGroups-CN1cGFUo.js → renderGroups-B38pUaX2.js} +1 -1
  367. package/dist/{renderGroups-O4KmaMl9.cjs → renderGroups-Cb_4Ar1Q.cjs} +1 -1
  368. package/dist/renderPasses-B6l8IpJv.js +1290 -0
  369. package/dist/renderPasses-dqmkft4P.cjs +158 -0
  370. package/dist/renderState-CJNmj5jz.js +39 -0
  371. package/dist/renderState-apSfg4eR.cjs +1 -0
  372. package/dist/scene-object.cjs +1 -1
  373. package/dist/scene-object.js +2 -2
  374. package/dist/segmentation-Cb3ouK6Z.js +1758 -0
  375. package/dist/segmentation-D9pYO6aR.cjs +1 -0
  376. package/dist/segmentation2d/types.d.ts +6 -0
  377. package/dist/select-Ck5LGz-J.cjs +1 -0
  378. package/dist/select-pYRo_win.js +233 -0
  379. package/dist/selectors-C4X71aoD.cjs +1 -0
  380. package/dist/selectors-DmNaKIwE.js +196 -0
  381. package/dist/session-BrH8G7iJ.cjs +31 -0
  382. package/dist/session-DgA_z6O1.js +418 -0
  383. package/dist/{settings-aQk845NJ.js → settings-BJ7FMBsO.js} +53 -15
  384. package/dist/settings-C63FMBlF.cjs +1 -0
  385. package/dist/similarityFit-BFqHND2e.cjs +1 -0
  386. package/dist/similarityFit-Bbz-R8AY.js +91 -0
  387. package/dist/spring/index.d.ts +2 -0
  388. package/dist/spring/spring.d.ts +69 -0
  389. package/dist/spring/swing.d.ts +54 -0
  390. package/dist/tracking.cjs +10 -1
  391. package/dist/tracking.js +1002 -855
  392. package/dist/trigger-D0Pm9noT.cjs +49 -0
  393. package/dist/trigger-IQeys0oS.js +2128 -0
  394. package/dist/types/face.d.ts +20 -1
  395. package/dist/types/hand-tracking.d.ts +9 -0
  396. package/dist/types/nodes.d.ts +20 -1
  397. package/dist/types/segmentation.d.ts +5 -0
  398. package/dist/updateThrottle-BseecYag.js +4 -0
  399. package/dist/updateThrottle-Of5Y4SVa.cjs +1 -0
  400. package/dist/useFaceInfo-BHDNCvsJ.cjs +1 -0
  401. package/dist/useFaceInfo-J4x7LsqL.js +76 -0
  402. package/dist/useFaceResultReader-BvEo5REG.js +61 -0
  403. package/dist/useFaceResultReader-DuaL1KJG.cjs +1 -0
  404. package/dist/useInstructionHold-DOu-RpCM.js +53 -0
  405. package/dist/useInstructionHold-DwJY1Alr.cjs +1 -0
  406. package/dist/useLandmarkPoseFit-Bg-h9BPb.cjs +1 -0
  407. package/dist/useLandmarkPoseFit-Bmb3h6Mw.js +87 -0
  408. package/dist/{useXRCapabilities-B1R2ghy-.cjs → useXRCapabilities-Cr3RzuAW.cjs} +1 -1
  409. package/dist/{useXRCapabilities-C68v__wB.js → useXRCapabilities-Cxmlmpbd.js} +1 -1
  410. package/dist/utils/canonicalRigidLandmarks.d.ts +8 -0
  411. package/dist/utils/headOccluderFit.d.ts +42 -0
  412. package/dist/utils/integrity.d.ts +17 -0
  413. package/dist/utils/resolveNumFaces.d.ts +13 -0
  414. package/dist/utils/shoulderOccluderFit.d.ts +38 -0
  415. package/dist/utils/similarityFit.d.ts +23 -0
  416. package/dist/uv-BMFt19bg.cjs +1 -0
  417. package/dist/{index-CsUdQ-pn.js → uv-DJU_XfmN.js} +15 -249
  418. package/docs/SDK_DOCUMENTATION.md +1 -2
  419. package/docs/api/adaptive-quality.mdx +1 -1
  420. package/docs/api/body-instructions.mdx +285 -0
  421. package/docs/api/body-triggers.mdx +234 -0
  422. package/docs/api/camera-permission.mdx +1 -1
  423. package/docs/api/coordinate-spaces.mdx +7 -4
  424. package/docs/api/cross-camera.mdx +3 -2
  425. package/docs/api/debug-ui-scene-editor.mdx +23 -2
  426. package/docs/api/external-face-mesh.mdx +231 -0
  427. package/docs/api/face-actions.mdx +20 -16
  428. package/docs/api/face-attribute-expression.mdx +1 -1
  429. package/docs/api/face-binding-anchors.mdx +4 -2
  430. package/docs/api/face-character.mdx +157 -0
  431. package/docs/api/face-effects.mdx +3 -0
  432. package/docs/api/face-expression-controller.mdx +153 -0
  433. package/docs/api/face-info.mdx +17 -11
  434. package/docs/api/face-inset.mdx +204 -0
  435. package/docs/api/face-instructions.mdx +183 -0
  436. package/docs/api/face-liquify.mdx +196 -0
  437. package/docs/api/face-mesh.mdx +4 -7
  438. package/docs/api/face-morph.mdx +117 -0
  439. package/docs/api/face-painting.mdx +7 -0
  440. package/docs/api/face-reprojection.mdx +154 -0
  441. package/docs/api/face-retouching.mdx +18 -10
  442. package/docs/api/face-swap.mdx +350 -0
  443. package/docs/api/face-warp-3d.mdx +166 -0
  444. package/docs/api/faceless.mdx +143 -0
  445. package/docs/api/gestures.mdx +68 -32
  446. package/docs/api/hair.mdx +97 -0
  447. package/docs/api/hand-instructions.mdx +222 -0
  448. package/docs/api/hand-rig.mdx +535 -0
  449. package/docs/api/hand-touch.mdx +162 -0
  450. package/docs/api/head-occluder.mdx +563 -0
  451. package/docs/api/holistic-tracker.mdx +6 -1
  452. package/docs/api/instructions.mdx +323 -0
  453. package/docs/api/iris-tracking.mdx +24 -19
  454. package/docs/api/made-up-camera.mdx +131 -0
  455. package/docs/api/makeup-skin-tone.mdx +135 -0
  456. package/docs/api/makeup.mdx +353 -0
  457. package/docs/api/multi-subject.mdx +4 -1
  458. package/docs/api/particles.mdx +155 -0
  459. package/docs/api/person-cutout.mdx +1 -1
  460. package/docs/api/pin-to-face-mesh.mdx +274 -0
  461. package/docs/api/product-ar.mdx +5 -2
  462. package/docs/api/segmentation-overlay.mdx +1 -1
  463. package/docs/docs.json +29 -1
  464. package/docs/examples/lip-shaders.mdx +82 -33
  465. package/docs/guides/face-atlas-template.svg +1 -0
  466. package/docs/guides/face-atlas-textures.mdx +186 -0
  467. package/docs/guides/face-texture-template.svg +1 -0
  468. package/docs/guides/harness-debug-ui.mdx +4 -4
  469. package/docs/guides/lip-effect-textures.mdx +178 -102
  470. package/docs/guides/lip-uv-template.png +0 -0
  471. package/docs/guides/lip-uv-template.svg +1 -1
  472. package/docs/guides/makeup-design-textures.mdx +109 -0
  473. package/docs/introduction.mdx +1 -2
  474. package/package.json +11 -1
  475. package/dist/DebuggerUI-C-ldiozL.js +0 -269
  476. package/dist/DebuggerUI-CWX5EtQv.cjs +0 -1
  477. package/dist/FaceMeshRenderer-BEEXZwS6.cjs +0 -158
  478. package/dist/FaceMeshRenderer-UuH5sTXG.js +0 -1322
  479. package/dist/FaceRetouch-C7h7x9kd.js +0 -683
  480. package/dist/FaceRetouch-DqftT26Y.cjs +0 -134
  481. package/dist/GLTFLoader-C5q63sKO.js +0 -1633
  482. package/dist/GLTFLoader-Cb_CRwmG.cjs +0 -1
  483. package/dist/SegmentationOverlay-DQuW3dsc.js +0 -133
  484. package/dist/SegmentationOverlay-aWVod8Kl.cjs +0 -1
  485. package/dist/components/FaceWarp3D/FaceWarp3DHead.d.ts +0 -15
  486. package/dist/components/FaceWarp3D/defaults.d.ts +0 -37
  487. package/dist/components/FaceWarp3D/warp.d.ts +0 -13
  488. package/dist/contexts-CO0sd4JQ.cjs +0 -1
  489. package/dist/contexts-FzlnnMYD.js +0 -669
  490. package/dist/debug-ui/face-warp-3d/index.d.ts +0 -6
  491. package/dist/getFaceInfo-BkZfaQs-.js +0 -118
  492. package/dist/getFaceInfo-ahPxQFGu.cjs +0 -1
  493. package/dist/index--RgGzZ6X.cjs +0 -47
  494. package/dist/index-CHVbH0hz.js +0 -214
  495. package/dist/index-CeVkgsag.cjs +0 -1
  496. package/dist/index-CnGox6Xr.js +0 -3054
  497. package/dist/index-DKBAh6hV.cjs +0 -1
  498. package/dist/index-DsZwTfG0.cjs +0 -1
  499. package/dist/index-Dw6tj2Mi.js +0 -144
  500. package/dist/index-OCPjOaeP.cjs +0 -1
  501. package/dist/index-s9pF4zkG.js +0 -2053
  502. package/dist/internal-BYza1h8_.cjs +0 -1
  503. package/dist/measures-9dQPdw96.js +0 -154
  504. package/dist/measures-KfJzpvod.cjs +0 -1
  505. package/dist/providers-YNwkmNeK.cjs +0 -62
  506. package/dist/renderPasses-Cg-zqmEz.cjs +0 -21
  507. package/dist/screenTransform-BenfCtZt.js +0 -44
  508. package/dist/screenTransform-BiXdpVf0.cjs +0 -1
  509. package/dist/segmentation-9PhSvc-R.cjs +0 -1
  510. package/dist/segmentation-CeOTKemr.js +0 -5
  511. package/dist/selectors-C5G1PMYL.js +0 -195
  512. package/dist/selectors-Du_PsVnW.cjs +0 -1
  513. package/dist/session-BBr0yN8h.cjs +0 -31
  514. package/dist/session-Cy0m7l7-.js +0 -363
  515. package/dist/settings-DRR7-snV.cjs +0 -1
  516. package/dist/useFaceInfo-Blf7FCu3.js +0 -303
  517. package/dist/useFaceInfo-C5mO8NQY.cjs +0 -1
@@ -0,0 +1,182 @@
1
+ import { FaceInfo } from '../face-info';
2
+ import { FaceBlendshapeName } from '../face-info/blendshapes';
3
+ /** A face's blendshape scores (MediaPipe names, 0..1), as `FaceInfo.blendshapes`. */
4
+ export type FaceBlendshapes = Readonly<Partial<Record<FaceBlendshapeName, number>>>;
5
+ /**
6
+ * What an expression requires of the blendshapes; omitted fields are "any".
7
+ * `atLeast` / `atMost` are per-blendshape bounds (all must hold); `anyOf`
8
+ * passes when one of its rules does (e.g. a wink with either eye).
9
+ */
10
+ export type FaceExpressionRule = {
11
+ atLeast?: Partial<Record<FaceBlendshapeName, number>>;
12
+ atMost?: Partial<Record<FaceBlendshapeName, number>>;
13
+ anyOf?: readonly FaceExpressionRule[];
14
+ };
15
+ /**
16
+ * Your own test of the face (any logic over the blendshapes; `face` is the
17
+ * full `FaceInfo` when a hook calls it).
18
+ */
19
+ export type FaceExpressionMatch = (blendshapes: FaceBlendshapes, face?: FaceInfo) => boolean;
20
+ /**
21
+ * How the hint face shows an expression: one morph target played 0 → 1, or a
22
+ * mix of several (`{ smile: 1, wink: 0.6 }`, each weight reached at the peak).
23
+ */
24
+ export type FaceExpressionHintPose = {
25
+ target: string;
26
+ } | {
27
+ targets: Record<string, number>;
28
+ };
29
+ /**
30
+ * An expression: its default copy, how it is detected (`rule`, or `match`
31
+ * for logic a rule cannot express; with both, both must pass) and how the
32
+ * hint face shows it. Make your own with `defineFaceExpression`.
33
+ */
34
+ export type FaceExpressionDefinition = {
35
+ /** Default instruction copy. */
36
+ label: string;
37
+ rule?: FaceExpressionRule;
38
+ match?: FaceExpressionMatch;
39
+ /** The hint face's morph target(s) that show it (`face-v1.glb` ships one per expression). */
40
+ hint: FaceExpressionHintPose;
41
+ };
42
+ /**
43
+ * Anything that names an expression to detect: a built-in name, a rule, a
44
+ * match function or a full definition.
45
+ */
46
+ export type FaceExpressionSpec = FaceExpressionName | FaceExpressionRule | FaceExpressionMatch | FaceExpressionDefinition;
47
+ /**
48
+ * Checks and returns your own expression definition (it needs a `rule` or a
49
+ * `match`). Pass it anywhere an expression name goes.
50
+ *
51
+ * ```ts
52
+ * const yawn = defineFaceExpression({
53
+ * label: "Big yawn",
54
+ * rule: { atLeast: { jawOpen: 0.7 } },
55
+ * hint: { target: "surprised" },
56
+ * });
57
+ * ```
58
+ */
59
+ export declare const defineFaceExpression: <T extends FaceExpressionDefinition>(definition: T) => T;
60
+ /**
61
+ * The face instruction vocabulary. Rules read MediaPipe's face blendshapes;
62
+ * thresholds follow the SDK's face gestures (mouth open 0.5, smile 0.4, blink
63
+ * 0.55, brow raise 0.45). A wink accepts either eye, with the other one open.
64
+ */
65
+ export declare const FACE_EXPRESSIONS: {
66
+ readonly smile: {
67
+ readonly label: "Give a big smile";
68
+ readonly rule: {
69
+ readonly atLeast: {
70
+ readonly mouthSmileLeft: 0.45;
71
+ readonly mouthSmileRight: 0.45;
72
+ };
73
+ };
74
+ readonly hint: {
75
+ readonly target: "smile";
76
+ };
77
+ };
78
+ readonly wink: {
79
+ readonly label: "Wink at the camera";
80
+ readonly rule: {
81
+ readonly anyOf: readonly [{
82
+ readonly atLeast: {
83
+ readonly eyeBlinkLeft: 0.55;
84
+ };
85
+ readonly atMost: {
86
+ readonly eyeBlinkRight: 0.3;
87
+ };
88
+ }, {
89
+ readonly atLeast: {
90
+ readonly eyeBlinkRight: 0.55;
91
+ };
92
+ readonly atMost: {
93
+ readonly eyeBlinkLeft: 0.3;
94
+ };
95
+ }];
96
+ };
97
+ readonly hint: {
98
+ readonly target: "wink";
99
+ };
100
+ };
101
+ readonly surprised: {
102
+ readonly label: "Look surprised";
103
+ readonly rule: {
104
+ readonly atLeast: {
105
+ readonly jawOpen: 0.35;
106
+ readonly browInnerUp: 0.4;
107
+ };
108
+ };
109
+ readonly hint: {
110
+ readonly target: "surprised";
111
+ };
112
+ };
113
+ readonly kiss: {
114
+ readonly label: "Blow a kiss";
115
+ readonly rule: {
116
+ readonly atLeast: {
117
+ readonly mouthPucker: 0.5;
118
+ };
119
+ readonly atMost: {
120
+ readonly jawOpen: 0.3;
121
+ };
122
+ };
123
+ readonly hint: {
124
+ readonly target: "kiss";
125
+ };
126
+ };
127
+ readonly puffCheeks: {
128
+ readonly label: "Puff your cheeks";
129
+ readonly rule: {
130
+ readonly atLeast: {
131
+ readonly cheekPuff: 0.3;
132
+ };
133
+ };
134
+ readonly hint: {
135
+ readonly target: "puffCheeks";
136
+ };
137
+ };
138
+ readonly frown: {
139
+ readonly label: "Frown";
140
+ readonly rule: {
141
+ readonly atLeast: {
142
+ readonly browDownLeft: 0.4;
143
+ readonly browDownRight: 0.4;
144
+ };
145
+ };
146
+ readonly hint: {
147
+ readonly target: "frown";
148
+ };
149
+ };
150
+ readonly scrunch: {
151
+ readonly label: "Scrunch your face";
152
+ readonly rule: {
153
+ readonly anyOf: readonly [{
154
+ readonly atLeast: {
155
+ readonly noseSneerLeft: 0.3;
156
+ readonly noseSneerRight: 0.3;
157
+ };
158
+ }, {
159
+ readonly atLeast: {
160
+ readonly eyeSquintLeft: 0.45;
161
+ readonly eyeSquintRight: 0.45;
162
+ readonly browDownLeft: 0.3;
163
+ readonly browDownRight: 0.3;
164
+ };
165
+ }];
166
+ };
167
+ readonly hint: {
168
+ readonly target: "scrunch";
169
+ };
170
+ };
171
+ };
172
+ export type FaceExpressionName = keyof typeof FACE_EXPRESSIONS;
173
+ export declare const FACE_EXPRESSION_NAMES: FaceExpressionName[];
174
+ /** The full definition a spec names (`undefined` for a bare rule or match function). */
175
+ export declare const resolveFaceExpression: (expression: FaceExpressionSpec) => FaceExpressionDefinition | undefined;
176
+ /**
177
+ * Whether blendshapes satisfy an expression: a name from `FACE_EXPRESSIONS`, a
178
+ * rule, a match function or a definition. `face` is passed on to match functions.
179
+ */
180
+ export declare const matchFaceExpression: (blendshapes: FaceBlendshapes, expression: FaceExpressionSpec, face?: FaceInfo) => boolean;
181
+ /** Every named expression the blendshapes satisfy (several can: a scrunch is often also a frown). */
182
+ export declare const matchingFaceExpressions: (blendshapes: FaceBlendshapes) => FaceExpressionName[];
@@ -1,6 +1,13 @@
1
1
  import { NormalizedLandmark } from '@mediapipe/tasks-vision';
2
2
  import { FaceCustomAnchorPoint, FaceTarget } from '../types/tracking';
3
- /** MediaPipe canonical face-mesh indices. Left/right follow the person's perspective. */
3
+ /**
4
+ * MediaPipe canonical face-mesh index of each single-landmark face target, as
5
+ * MediaPipe names the side (263 = its left eye): the person's own side on an
6
+ * unmirrored feed. On the mirrored webcam the person's side is the other
7
+ * entry — read `FACE_LANDMARK_INDICES[feedSidedName(target, mirrored)]`, or
8
+ * let `resolveFaceAnchorPoint` / `TrackingAnchor` pick it (GROUNDING "Left and
9
+ * right").
10
+ */
4
11
  export declare const FACE_LANDMARK_INDICES: {
5
12
  readonly "face.forehead": 10;
6
13
  readonly "face.noseTip": 1;
@@ -13,8 +20,15 @@ export declare const FACE_LANDMARK_INDICES: {
13
20
  readonly "face.leftEarlobe": 454;
14
21
  readonly "face.rightEarlobe": 234;
15
22
  };
16
- /** Resolves a semantic face target in normalized tracker-input coordinates. */
17
- export declare const resolveFaceAnchorPoint: (faceTarget: FaceTarget, landmarks: readonly NormalizedLandmark[], customAnchorPoint?: FaceCustomAnchorPoint, target?: NormalizedLandmark) => NormalizedLandmark | null;
23
+ /**
24
+ * Resolves a semantic face target in normalized tracker-input coordinates.
25
+ * Left / right (`face.leftCheek`, `face.custom`'s −x) are the person's own
26
+ * side: pass `feedMirrored` (`useXRMirrored()`; the front webcam is mirrored)
27
+ * so the target is read from the mesh side the person's side has on this
28
+ * feed. Defaults to an unmirrored feed.
29
+ */
30
+ export declare const resolveFaceAnchorPoint: (faceTarget: FaceTarget, landmarks: readonly NormalizedLandmark[], customAnchorPoint?: FaceCustomAnchorPoint, target?: NormalizedLandmark, feedMirrored?: boolean) => NormalizedLandmark | null;
31
+ /** The outer eye corners (MediaPipe's sides; only their distance is read). */
18
32
  export declare const FACE_EYE_DISTANCE_LANDMARKS: {
19
33
  readonly left: 263;
20
34
  readonly right: 33;
@@ -9,22 +9,38 @@ export type FaceVector3 = Readonly<{
9
9
  export type FaceInfo = {
10
10
  /** Current result-array index. This is not a persistent identity. */
11
11
  readonly index: number;
12
- /** MediaPipe landmarks in normalized tracker-input coordinates; top-left origin. */
12
+ /**
13
+ * MediaPipe landmarks in normalized tracker-input coordinates; top-left
14
+ * origin. Indices keep MediaPipe's sides (263 = MediaPipe's left eye): the
15
+ * person's own side on an unmirrored feed, the opposite on the mirrored
16
+ * webcam (see `mirrored`).
17
+ */
13
18
  readonly landmarks: readonly NormalizedLandmark[];
14
19
  /** Axis-aligned bounds in the same normalized tracker-input coordinates. */
15
20
  readonly bounds: Readonly<FaceBounds>;
16
21
  readonly pose: {
17
22
  /** Three.js world position from the existing face tracker. */
18
23
  readonly position: FaceVector3;
19
- /** Radians: X pitch (+up), Y yaw (+left), Z roll. */
24
+ /**
25
+ * Radians: X pitch (+ = looking up), Y yaw (+ = turning to the person's
26
+ * own left), Z roll (+ = tilting toward the person's own left shoulder),
27
+ * on every feed.
28
+ */
20
29
  readonly rotation: FaceVector3;
21
30
  /** Smoothed uniform sizing heuristic used by the face occluder/tracker anchor. */
22
31
  readonly scale: FaceVector3;
23
32
  };
24
33
  /** Outer-eye distance in normalized tracker-input coordinates. */
25
34
  readonly eyeDistance: number;
26
- /** MediaPipe blendshape category names mapped to scores in [0, 1]. */
35
+ /**
36
+ * MediaPipe blendshape category names mapped to scores in [0, 1], raw:
37
+ * `…Left` is MediaPipe's left (the person's own left on an unmirrored feed,
38
+ * their right on the mirrored webcam). Face actions (`eyeBlinkLeft` …) read
39
+ * the person's side for you.
40
+ */
27
41
  readonly blendshapes: Readonly<Partial<Record<FaceBlendshapeName, number>>>;
42
+ /** The face was read from a mirrored feed (the front webcam): MediaPipe's sides are the person's opposite sides. */
43
+ readonly mirrored: boolean;
28
44
  };
29
45
  export type FaceInfoTarget = {
30
46
  index: number;
@@ -49,4 +65,5 @@ export type FaceInfoTarget = {
49
65
  };
50
66
  eyeDistance: number;
51
67
  blendshapes: Record<string, number>;
68
+ mirrored: boolean;
52
69
  };
@@ -5,6 +5,15 @@ import { OscillationTracker } from './measures';
5
5
  export type GestureKind = "face" | "hand" | "body";
6
6
  /** What each tracker hands a definition per frame. */
7
7
  export type GestureInputOf<K extends GestureKind> = K extends "face" ? FaceInfo | null : ReadonlyArray<TrackerPoint> | undefined;
8
+ /**
9
+ * The feed a frame came from. `mirrored`: the front webcam, where MediaPipe's
10
+ * left / right labels (pose 11 / 12 …, face mesh sides, `…Left` blendshapes)
11
+ * name the person's opposite side. A sided gesture reads the person's own
12
+ * side with it (`personSide(side, mirrored)`).
13
+ */
14
+ export type GestureContext = {
15
+ mirrored: boolean;
16
+ };
8
17
  /**
9
18
  * A gesture: which tracker it reads, how to turn one frame of that tracker
10
19
  * into a `{ value, confidence }` sample, and its default detector options.
@@ -17,8 +26,12 @@ export type GestureDefinition<K extends GestureKind = GestureKind, M = unknown>
17
26
  /** Overrides of `DEFAULT_GESTURE_DETECTOR_OPTIONS` for this gesture. */
18
27
  defaults?: Partial<GestureDetectorOptions>;
19
28
  createMemory?: () => M;
20
- /** `null` when the tracker has no subject this frame. Confidence 1 unless the source knows better. */
21
- measure: (input: GestureInputOf<K>, memory: M, nowMs: number) => GestureSample;
29
+ /**
30
+ * `null` when the tracker has no subject this frame. Confidence 1 unless
31
+ * the source knows better. `context` is the feed (`useGesture` passes it;
32
+ * missing = an unmirrored feed).
33
+ */
34
+ measure: (input: GestureInputOf<K>, memory: M, nowMs: number, context?: GestureContext) => GestureSample;
22
35
  };
23
36
  type OscillationMemory = {
24
37
  tracker: OscillationTracker;
@@ -1,7 +1,7 @@
1
1
  export { DEFAULT_GESTURE_DETECTOR_OPTIONS, createGestureDetectorState, gestureStatesEqual, resolveGestureDetectorOptions, snapshotGestureState, stepGestureDetector, } from './detector';
2
2
  export type { GestureDetectorOptions, GestureDetectorState, GestureEndReason, GesturePhase, GestureSample, GestureState, } from './detector';
3
3
  export { GESTURES, GESTURE_NAMES, defineGesture, resolveGestureDefinition } from './definitions';
4
- export type { AnyGestureDefinition, BuiltInGestureName, GestureDefinition, GestureInputOf, GestureKind, GestureRef, } from './definitions';
4
+ export type { AnyGestureDefinition, BuiltInGestureName, GestureContext, GestureDefinition, GestureInputOf, GestureKind, GestureRef, } from './definitions';
5
5
  export { HAND_JOINTS, OscillationTracker, POSE_JOINTS, measureArmRaise, fingerExtensions, measureFingerPattern, measureGrab, measureHandHeight, measureOpenPalm, measurePinch, measureTPose, measureThumb, thumbDirection, thumbExtension, } from './measures';
6
6
  export type { FingerPattern } from './measures';
7
7
  export { DEFAULT_GESTURE_SETTINGS, GESTURE_SETTINGS_FIELDS, patchGestureSettings, resolveGestureSettings, } from './settings';
@@ -54,7 +54,12 @@ export declare const measureGrab: (hand: ReadonlyArray<TrackerPoint> | undefined
54
54
  export declare const measureOpenPalm: (hand: ReadonlyArray<TrackerPoint> | undefined) => number;
55
55
  /** Hand height on screen: 0 at the bottom edge, 0.5 at the centre, 1 at the top (tracker Y up). */
56
56
  export declare const measureHandHeight: (hand: ReadonlyArray<TrackerPoint> | undefined) => number;
57
- /** MediaPipe pose landmarks used by the body measures (person's perspective). */
57
+ /**
58
+ * MediaPipe pose landmarks used by the body measures, as MediaPipe labels
59
+ * them (11 = its left shoulder): the person's own side on an unmirrored feed,
60
+ * the opposite on the mirrored webcam. Sided measures take the feed's
61
+ * `mirrored` to read the person's own side.
62
+ */
58
63
  export declare const POSE_JOINTS: {
59
64
  readonly leftShoulder: 11;
60
65
  readonly rightShoulder: 12;
@@ -68,10 +73,13 @@ export declare const POSE_JOINTS: {
68
73
  /** Shoulder width in tracker units; the body's scale reference. */
69
74
  export declare const shoulderWidth: (pose: ReadonlyArray<TrackerPoint>) => number;
70
75
  /**
71
- * How far a wrist is raised above its shoulder, in shoulder widths: 0 at
72
- * shoulder level or below, 1 at one shoulder width above.
76
+ * How far the person's own `side` wrist is raised above its shoulder, in
77
+ * shoulder widths: 0 at shoulder level or below, 1 at one shoulder width
78
+ * above. `mirrored` is the feed's mirror state (the front webcam; default
79
+ * `false`): MediaPipe's labels name the person's opposite side there, so the
80
+ * other label is read (#298).
73
81
  */
74
- export declare const measureArmRaise: (pose: ReadonlyArray<TrackerPoint> | undefined, side: "left" | "right") => number;
82
+ export declare const measureArmRaise: (pose: ReadonlyArray<TrackerPoint> | undefined, side: "left" | "right", mirrored?: boolean) => number;
75
83
  /**
76
84
  * T-pose: both wrists level with the shoulders and stretched outward by at
77
85
  * least a shoulder width. 1 when fully extended and level.
@@ -79,15 +87,20 @@ export declare const measureArmRaise: (pose: ReadonlyArray<TrackerPoint> | undef
79
87
  export declare const measureTPose: (pose: ReadonlyArray<TrackerPoint> | undefined) => number;
80
88
  /**
81
89
  * Counts direction reversals of a scalar over a sliding window: the engine
82
- * behind nod, head shake and wave. A reversal counts when the signal has
83
- * moved at least `minAmplitude` from the last turning point. `measure`
90
+ * behind nod, head shake and wave. It follows the running extreme in the
91
+ * current direction; a turning point counts once the signal has come back
92
+ * at least `minAmplitude` from it (so jitter below the amplitude never
93
+ * counts, and a small first half-swing does not stall the count). `push`
84
94
  * returns `min(1, reversals / requiredReversals)` within `windowMs`.
85
95
  */
86
96
  export declare class OscillationTracker {
87
97
  private readonly options;
88
98
  private reversals;
89
- private lastExtremum;
90
- private lastValue;
99
+ /** Running extreme in the current direction (max rising, min falling). */
100
+ private extreme;
101
+ /** Range seen before the first swing (direction still unknown). */
102
+ private low;
103
+ private high;
91
104
  private direction;
92
105
  constructor(options: {
93
106
  minAmplitude: number;
@@ -0,0 +1 @@
1
+ "use strict";const f=require("./landmarks-BlUqf5MZ.cjs"),d=(s,e={minX:0,minY:0,maxX:0,maxY:0,width:0,height:0,centerX:0,centerY:0})=>{if(s.length===0)return e.minX=0,e.minY=0,e.maxX=0,e.maxY=0,e.width=0,e.height=0,e.centerX=0,e.centerY=0,e;let n=1,t=1,i=0,c=0;for(let r=0;r<s.length;r++){const{x:a,y:h}=s[r];a<n&&(n=a),h<t&&(t=h),a>i&&(i=a),h>c&&(c=h)}const o=Math.max(0,i-n),m=Math.max(0,c-t);return e.minX=n,e.minY=t,e.maxX=i,e.maxY=c,e.width=o,e.height=m,e.centerX=n+o*.5,e.centerY=t+m*.5,e},u=.5,X=(s,e)=>{for(const n in e)delete e[n];if(s)for(const n of s)e[n.categoryName]=n.score;return e},E=(s,e)=>s.blendshapes[e]??0,Y=(s,e,n=u)=>E(s,e)>=n,F=s=>{const e=s[f.FACE_EYE_DISTANCE_LANDMARKS.left],n=s[f.FACE_EYE_DISTANCE_LANDMARKS.right];return!e||!n?0:Math.hypot(e.x-n.x,e.y-n.y)},x=()=>({index:0,landmarks:[],bounds:{minX:0,minY:0,maxX:0,maxY:0,width:0,height:0,centerX:0,centerY:0},pose:{position:{x:0,y:0,z:0},rotation:{x:0,y:0,z:0},scale:{x:0,y:0,z:0}},eyeDistance:0,blendshapes:{},mirrored:!0}),l=(s,e)=>{e.x=s.x,e.y=s.y,e.z=s.z},p=(s,e,n=0,t)=>{var m,r,a;const i=(m=e.faceLandmarks)==null?void 0:m[n],c=s.getFace(n);if(!i||!c)return null;const o=t??x();return o.index=n,o.landmarks=i,d(i,o.bounds),l(c.transform.position,o.pose.position),l(c.transform.rotation,o.pose.rotation),l(c.transform.scale,o.pose.scale),o.eyeDistance=F(i),X((a=(r=e.faceBlendshapes)==null?void 0:r[n])==null?void 0:a.categories,o.blendshapes),o.mirrored=c.mirrored!==!1,o},y=(s,e=0,n)=>{const t=s.getDetectionResults();return t?p(s,t,e,n):null};exports.DEFAULT_FACE_EXPRESSION_THRESHOLD=u;exports.computeLandmarkBounds=d;exports.createFaceInfoTarget=x;exports.getFaceBlendshape=E;exports.getFaceEyeDistance=F;exports.getFaceInfo=y;exports.getFaceInfoFromResults=p;exports.hasFaceExpression=Y;
@@ -0,0 +1,62 @@
1
+ import { F as f } from "./landmarks-bftdwq6Z.js";
2
+ const x = (s, e = {
3
+ minX: 0,
4
+ minY: 0,
5
+ maxX: 0,
6
+ maxY: 0,
7
+ width: 0,
8
+ height: 0,
9
+ centerX: 0,
10
+ centerY: 0
11
+ }) => {
12
+ if (s.length === 0)
13
+ return e.minX = 0, e.minY = 0, e.maxX = 0, e.maxY = 0, e.width = 0, e.height = 0, e.centerX = 0, e.centerY = 0, e;
14
+ let n = 1, t = 1, c = 0, i = 0;
15
+ for (let r = 0; r < s.length; r++) {
16
+ const { x: a, y: h } = s[r];
17
+ a < n && (n = a), h < t && (t = h), a > c && (c = a), h > i && (i = h);
18
+ }
19
+ const o = Math.max(0, c - n), m = Math.max(0, i - t);
20
+ return e.minX = n, e.minY = t, e.maxX = c, e.maxY = i, e.width = o, e.height = m, e.centerX = n + o * 0.5, e.centerY = t + m * 0.5, e;
21
+ }, d = 0.5, p = (s, e) => {
22
+ for (const n in e) delete e[n];
23
+ if (s)
24
+ for (const n of s) e[n.categoryName] = n.score;
25
+ return e;
26
+ }, u = (s, e) => s.blendshapes[e] ?? 0, E = (s, e, n = d) => u(s, e) >= n, X = (s) => {
27
+ const e = s[f.left], n = s[f.right];
28
+ return !e || !n ? 0 : Math.hypot(e.x - n.x, e.y - n.y);
29
+ }, Y = () => ({
30
+ index: 0,
31
+ landmarks: [],
32
+ bounds: { minX: 0, minY: 0, maxX: 0, maxY: 0, width: 0, height: 0, centerX: 0, centerY: 0 },
33
+ pose: {
34
+ position: { x: 0, y: 0, z: 0 },
35
+ rotation: { x: 0, y: 0, z: 0 },
36
+ scale: { x: 0, y: 0, z: 0 }
37
+ },
38
+ eyeDistance: 0,
39
+ blendshapes: {},
40
+ mirrored: !0
41
+ }), l = (s, e) => {
42
+ e.x = s.x, e.y = s.y, e.z = s.z;
43
+ }, y = (s, e, n = 0, t) => {
44
+ var m, r, a;
45
+ const c = (m = e.faceLandmarks) == null ? void 0 : m[n], i = s.getFace(n);
46
+ if (!c || !i) return null;
47
+ const o = t ?? Y();
48
+ return o.index = n, o.landmarks = c, x(c, o.bounds), l(i.transform.position, o.pose.position), l(i.transform.rotation, o.pose.rotation), l(i.transform.scale, o.pose.scale), o.eyeDistance = X(c), p((a = (r = e.faceBlendshapes) == null ? void 0 : r[n]) == null ? void 0 : a.categories, o.blendshapes), o.mirrored = i.mirrored !== !1, o;
49
+ }, D = (s, e = 0, n) => {
50
+ const t = s.getDetectionResults();
51
+ return t ? y(s, t, e, n) : null;
52
+ };
53
+ export {
54
+ d as D,
55
+ Y as a,
56
+ D as b,
57
+ x as c,
58
+ u as d,
59
+ X as e,
60
+ y as g,
61
+ E as h
62
+ };
@@ -0,0 +1,46 @@
1
+ import { FeedVec } from './armMask';
2
+ import * as THREE from "three";
3
+ /**
4
+ * Experimental (vincentt-xr/sdk#319): may change in a later alpha.
5
+ *
6
+ * Puts a wrist frame on the arm found in a mask, on screen: turns it about the
7
+ * camera ray through the wrist so its −Y (up the arm) runs along the arm,
8
+ * moves it across to the arm's middle, and scales its cross-section (X, Z) so
9
+ * the wrist's ellipse is as wide on screen as the arm. Depth and roll stay the
10
+ * hand's: one camera only sees the arm's outline.
11
+ */
12
+ export type WristFitTarget = {
13
+ /** Unit, up the arm (toward the elbow), feed units (x right, y down). */
14
+ up: FeedVec;
15
+ /** Move across the arm this far, feed units (+ = clockwise side of `up`). */
16
+ shift: number;
17
+ /** The arm's width on screen, feed units; null: keep the size. */
18
+ width: number | null;
19
+ /** The wrist's half-width (X) and half-depth (Z) in the frame's own units. */
20
+ halfWidth: number;
21
+ halfDepth: number;
22
+ /** Clamp for the width scale: a gentle nudge. Default `[0.85, 1.2]`. */
23
+ scaleRange?: readonly [number, number];
24
+ };
25
+ /** World point → feed units (x right 0..aspect, y down 0..1). */
26
+ export declare const worldToFeedUnits: (point: THREE.Vector3, camera: THREE.Camera, aspect: number, out?: FeedVec) => FeedVec;
27
+ /** Signed angle from `a` to `b`, radians, positive clockwise on screen (y down). */
28
+ export declare const screenAngle: (a: FeedVec, b: FeedVec) => number;
29
+ /** The frame's −Y (up the arm) on screen, unit, feed units. */
30
+ export declare const frameUpOnScreen: (frame: THREE.Matrix4, camera: THREE.Camera, aspect: number, out?: FeedVec) => FeedVec;
31
+ /**
32
+ * How much of the frame's arm axis (Y) shows on screen, 0..1: 1 while it runs
33
+ * across the view, 0 when it points at (or away from) the camera. From its
34
+ * on-screen length against the longer of X and Z (across the arm).
35
+ */
36
+ export declare const axisOnScreen: (frame: THREE.Matrix4, camera: THREE.Camera, aspect: number) => number;
37
+ /** The frame's local ellipse (`halfWidth` × `halfDepth` in X / Z) across `up` on screen, feed units. */
38
+ export declare const ellipseWidthOnScreen: (frame: THREE.Matrix4, halfWidth: number, halfDepth: number, up: FeedVec, camera: THREE.Camera, aspect: number) => number;
39
+ /**
40
+ * The wrist frame (`frame`, world; origin on the wrist, +Y toward the
41
+ * fingers) fitted to `target`, blended in by `weight` (0..1). Writes the
42
+ * fitted frame into `out` (turned and moved: a rigid change) and returns the
43
+ * scale across the arm (X, Z) that fits its width, `1` without one: applied
44
+ * by what sits on the frame, so a bone never takes a shearing scale.
45
+ */
46
+ export declare const fitWristFrame: (frame: THREE.Matrix4, camera: THREE.Camera, aspect: number, target: WristFitTarget, weight: number, out: THREE.Matrix4) => number;
@@ -0,0 +1,178 @@
1
+ import { HandPose } from './handPose';
2
+ /**
3
+ * Experimental (vincentt-xr/sdk#319): may change in a later alpha.
4
+ *
5
+ * The forearm in a segmentation mask (the portrait mask's person, or the
6
+ * multiclass mask's bare skin), measured from the tracked wrist: which way the
7
+ * arm runs on screen and how wide it is. Wristwear uses it so a strap lines up
8
+ * with the real arm, not just the hand's axis, and fits its width.
9
+ *
10
+ * Units: "feed units", isotropic, x right and y down, 1 = the feed's height
11
+ * (x runs 0..aspect). Lengths along and across the arm are given in cm and
12
+ * converted with the hand's own scale (`unitsPerCm`), so they don't depend on
13
+ * how far the hand is.
14
+ */
15
+ export type FeedVec = {
16
+ x: number;
17
+ y: number;
18
+ };
19
+ /** A mask to look for the arm in: `inside(i)` for the row-major pixel `i` (row 0 at the top). */
20
+ export type ArmMaskSource = {
21
+ width: number;
22
+ height: number;
23
+ inside: (index: number) => boolean;
24
+ };
25
+ /** Where to look: from the hand. */
26
+ export type ArmQuery = {
27
+ /** The wrist joint, feed units. */
28
+ wrist: FeedVec;
29
+ /** Unit, from the middle knuckle to the wrist: the hand's axis, pointing up the arm. */
30
+ toElbow: FeedVec;
31
+ /** Feed units per cm at the hand. */
32
+ unitsPerCm: number;
33
+ /** Feed width / height. */
34
+ aspect: number;
35
+ };
36
+ export type ArmMeasureOptions = {
37
+ /** Cross-sections up the arm from the wrist, cm. Default `[2, 4, 6, 8]`. */
38
+ along?: readonly number[];
39
+ /** Where the width is measured, cm up the arm. Default 1.5. */
40
+ widthAt?: number;
41
+ /**
42
+ * A cross-section wider than this isn't the arm (it runs into the body or a
43
+ * sleeve's surroundings), cm. Default 11.
44
+ */
45
+ maxWidth?: number;
46
+ /** Narrower than this isn't the arm (noise, a finger), cm. Default 2.5. */
47
+ minWidth?: number;
48
+ /**
49
+ * The arm may turn at most this far from the hand's axis, degrees: a wrist
50
+ * bends up to about 80–90° (a fist hanging from a level arm). Default 95.
51
+ */
52
+ maxTurn?: number;
53
+ };
54
+ export declare const ARM_MASK_DEFAULTS: Readonly<{
55
+ along: readonly number[];
56
+ widthAt: 1.5;
57
+ maxWidth: 11;
58
+ minWidth: 2.5;
59
+ maxTurn: 95;
60
+ }>;
61
+ /** One cross-section across the arm, for debugging: its edges, feed units. */
62
+ export type ArmSection = {
63
+ a: FeedVec;
64
+ b: FeedVec;
65
+ ok: boolean;
66
+ };
67
+ export type ArmMeasure = {
68
+ /** Unit, up the arm (toward the elbow), feed units. */
69
+ direction: FeedVec;
70
+ /**
71
+ * Signed angle from the hand's axis (`toElbow`) to `direction`, radians;
72
+ * positive turns clockwise on screen. The arm's bend at the wrist, which
73
+ * changes slowly: apply it to the hand's current axis.
74
+ */
75
+ bend: number;
76
+ /**
77
+ * The arm's width across, cm: the narrowest closed cross-section from
78
+ * `widthAt` up the arm (the wrist is the narrowest part, and a cross-section
79
+ * by a bent wrist can clip the hand).
80
+ */
81
+ width: number;
82
+ /** The arm's middle at `widthAt`, feed units. */
83
+ center: FeedVec;
84
+ /** Cross-sections that found the arm, of those tried (0..1). */
85
+ confidence: number;
86
+ /** The last pass's cross-sections and the width one, for drawing. */
87
+ sections: ArmSection[];
88
+ };
89
+ /**
90
+ * The hand's wrist, axis and scale in feed units, from its pose (`image` in
91
+ * tracker space, `world` in cm). `null` when the hand points at the camera
92
+ * (its axis is too short on screen to trust).
93
+ */
94
+ export declare const armQueryOf: (pose: Pick<HandPose, "image" | "world">, aspect: number) => ArmQuery | null;
95
+ /**
96
+ * Measures the arm in `source` from the hand (`query`): cross-sections up the
97
+ * arm find its edges, a line through their middles (and the wrist) gives its
98
+ * direction, and a second pass across that direction refines it and the
99
+ * width. `null` when fewer than two cross-sections find a closed arm (it runs
100
+ * into the body or off the screen), or it turns implausibly far from the hand.
101
+ */
102
+ export declare const measureArm: (source: ArmMaskSource, query: ArmQuery, options?: ArmMeasureOptions) => ArmMeasure | null;
103
+ export type ArmFitSettings = {
104
+ /** Each new measure eases the fit this far, 0..1. Default 0.4. */
105
+ smoothing: number;
106
+ /** After the arm is lost, keep the last fit this long, ms. Default 400. */
107
+ holdMs: number;
108
+ /** Then ease back to the hand's own axis over about this long, ms. Default 300. */
109
+ fadeMs: number;
110
+ /**
111
+ * Measure a mask against the hand pose nearest its time, at most this far
112
+ * apart, ms; further apart (the hand moved on) it waits for the next mask.
113
+ * Default 70.
114
+ */
115
+ maxSkewMs: number;
116
+ /** The fit may move the strap at most this far across the arm, cm. Default 2. */
117
+ maxShift: number;
118
+ };
119
+ export declare const ARM_FIT_DEFAULTS: Readonly<ArmFitSettings>;
120
+ /**
121
+ * Follows the arm across masks for one hand: each new mask is measured against
122
+ * the hand pose from the same moment (masks arrive later than hand poses), and
123
+ * the result is kept relative to the hand (a bend, a width, a sideways shift),
124
+ * so it stays right while the hand moves between masks. `weight` (0..1) says
125
+ * how much of it to apply: 1 once the arm is found, until a mask comes
126
+ * without it; then held for `holdMs` and faded to 0 over `fadeMs`.
127
+ */
128
+ export declare class ArmTracker {
129
+ /** Radians, clockwise on screen, from the hand's axis to the arm's. */
130
+ bend: number;
131
+ /** The arm's width, cm (null until measured). */
132
+ width: number | null;
133
+ /** How far the arm's middle is from the hand's axis, across it, cm (+ = clockwise side). */
134
+ shift: number;
135
+ /** 0..1, how much of the fit applies (found, held or fading). */
136
+ weight: number;
137
+ /** 0..1, how sure the measures are (closed cross-sections, eased): blends the fit with the hand. */
138
+ confidence: number;
139
+ /** The last measure, for drawing. */
140
+ last: ArmMeasure | null;
141
+ settings: ArmFitSettings;
142
+ private history;
143
+ /** There is a fit (measured, not yet faded out). */
144
+ private found;
145
+ /** When a mask first came without the arm since the last fit. */
146
+ private lostAtMs;
147
+ constructor(settings?: Partial<ArmFitSettings>);
148
+ /**
149
+ * The hand's query at a detection (`HandPose.timestampMs`); `null` when the
150
+ * hand's axis can't be used (it points at the camera): `query` reads null
151
+ * then, and nothing steers by an old axis.
152
+ */
153
+ pushHand(timeMs: number, query: ArmQuery | null): void;
154
+ /** The newest hand query (the hand now), null while its axis is unusable. */
155
+ get query(): ArmQuery | null;
156
+ /**
157
+ * The hand hasn't moved over the kept history (within 0.5 cm and 3°): any
158
+ * of its poses matches a mask from within that time.
159
+ */
160
+ private still;
161
+ /**
162
+ * Measures a new mask (taken at `maskTimeMs`, or now when unknown) against
163
+ * the hand from the same moment (or the newest, while the hand is still).
164
+ * Returns the measure, or null when the arm wasn't found (that starts the
165
+ * hold, then the fade) or no hand pose matches the mask's time (nothing
166
+ * changes: wait for the next mask).
167
+ */
168
+ measure(mask: ArmMaskSource, maskTimeMs: number | undefined, options?: ArmMeasureOptions): ArmMeasure | null;
169
+ /**
170
+ * Advances the hold and fade (call every frame with `performance.now()`).
171
+ * A fit holds until a mask comes without the arm, then for `holdMs`, then
172
+ * fades over `fadeMs`; no new mask changes nothing.
173
+ */
174
+ step(nowMs: number): void;
175
+ private clear;
176
+ /** Forget everything (the hand was lost). */
177
+ reset(): void;
178
+ }