@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
@@ -23,16 +23,22 @@ function FaceLogic() {
23
23
 
24
24
  ## Coordinate contract
25
25
 
26
- | Field | Contract |
27
- | --------------- | --------------------------------------------------------- |
28
- | `index` | Current result-array index, not a persistent identity |
29
- | `landmarks` | Normalized tracker-input coordinates with top-left origin |
30
- | `bounds` | Bounds in the same normalized coordinate system |
31
- | `pose.position` | Three.js world position |
32
- | `pose.rotation` | Radians: pitch X (+up), yaw Y (+left), roll Z |
33
- | `pose.scale` | Smoothed uniform face-sizing heuristic |
34
- | `eyeDistance` | Outer-eye distance in normalized coordinates |
35
- | `blendshapes` | Typed MediaPipe category scores in `[0, 1]` |
26
+ | Field | Contract |
27
+ | --------------- | ---------------------------------------------------------------------------------------------------------- |
28
+ | `index` | Current result-array index, not a persistent identity |
29
+ | `landmarks` | Normalized tracker-input coordinates with top-left origin; MediaPipe's indices and sides |
30
+ | `bounds` | Bounds in the same normalized coordinate system |
31
+ | `pose.position` | Three.js world position |
32
+ | `pose.rotation` | Radians: pitch X (+up), yaw Y (+ the person's own left), roll Z (+ toward their left shoulder), every feed |
33
+ | `pose.scale` | Smoothed uniform face-sizing heuristic |
34
+ | `eyeDistance` | Outer-eye distance in normalized coordinates |
35
+ | `blendshapes` | Typed MediaPipe category scores in `[0, 1]`; raw `…Left` is MediaPipe's left |
36
+ | `mirrored` | The face came from a mirrored feed (the front webcam) |
37
+
38
+ Left and right are the person's own side in every SDK name and reading
39
+ (GROUNDING "Left and right"). Raw MediaPipe indices and blendshape names keep
40
+ MediaPipe's side: the person's own on an unmirrored feed, their other side on
41
+ the mirrored webcam; `mirrored` tells you which.
36
42
 
37
43
  `useFaceInfo({ faceIndex })` reads one face. `useFaceInfos({ numFaces })` reads
38
44
  all current faces. Both share the SDK face model and support `active`,
@@ -63,7 +69,7 @@ if (detection.justLost) hideEffect();
63
69
 
64
70
  The result also includes `faces`. The default `holdMs: 250` suppresses brief
65
71
  one-frame losses before `End`; pass `holdMs: 0` for immediate disappearance.
66
- Use the verified `/face-detection` page to test five face slots,
72
+ Use the verified `/face-info` page to test five face slots,
67
73
  Begin/Stay/End/None, selected-face presence, count, and edge history. Its
68
74
  real-camera lifecycle flow was verified on 26 July 2026.
69
75
 
@@ -0,0 +1,204 @@
1
+ ---
2
+ title: "Face Inset"
3
+ description: "Cut an eye, both eyes, the mouth, the nose or the whole face out of the live camera image and show it magnified in place, on another face point, on a 3D object or on screen."
4
+ sidebarTitle: "Face Inset"
5
+ icon: "magnifying-glass-plus"
6
+ ---
7
+
8
+ `FaceInset` cuts a face part out of the live camera image with a soft edge and shows it somewhere,
9
+ following the face every frame. It is Lens Studio's Face Inset.
10
+
11
+ - **Giant parts.** Magnify the eyes or the mouth in place, the cartoon look.
12
+ - **Big head, tiny face.** The whole face, scaled up or down.
13
+ - **Moved parts.** The mouth talking on the forehead, an eye on the chin.
14
+ - **On an object.** A talking mouth on a product box, eyes on a package, a face on a card.
15
+ - **On screen.** A picture-in-picture eye or mouth in a corner.
16
+
17
+ Every pixel is the camera image itself. Import from `@vincentt-xr/sdk/face-effects`.
18
+
19
+ ## Quick start
20
+
21
+ ```tsx
22
+ import { FaceInset } from "@vincentt-xr/sdk/face-effects";
23
+ import { FaceTracker } from "@vincentt-xr/sdk/tracking";
24
+
25
+ <FaceTracker>
26
+ {/* Giant eyes, each magnified about its own middle */}
27
+ <FaceInset part="eyes" magnify={1.8} />
28
+ {/* The mouth again, on the forehead */}
29
+ <FaceInset part="mouth" at="face.forehead" magnify={0.8} />
30
+ </FaceTracker>;
31
+ ```
32
+
33
+ ## Placements
34
+
35
+ There are three ways to show an inset. They cut the same part the same way.
36
+
37
+ | Placement | Where it shows | Its size |
38
+ | ------------------------------- | ------------------------------------------------------------------------------------ | ------------------------------------------------------- |
39
+ | `placement="face"` (default) | Over the live face, at the part's own place, or centred on another face point (`at`) | `magnify`: times bigger about the part's middle (1.5) |
40
+ | `placement="plane"` | A plane in its parent's frame: on an object, beside the head, anywhere in the scene | `height`: the plane's height in local units (1) |
41
+ | `useFaceInsetTexture({ part })` | A texture for your own material or a `ScreenImage` | `resolution`: the texture's longer side in pixels (256) |
42
+
43
+ ### On the face
44
+
45
+ The part is drawn over the live face at `FACE_INSET_RENDER_ORDER` (-1.5): after the face and any
46
+ face effect on it (`FaceWarp3D`, `FaceMorph`, a character, at -2), before the head occluder (-1)
47
+ and accessories (0). A `HandCutout` keeps hands in front.
48
+
49
+ - **`magnify` above 1** magnifies the part about its own middle. With `part="eyes"`, each eye is
50
+ magnified about its own middle.
51
+ - **`magnify` below 1** shrinks it. The real part shows around a shrunk one.
52
+ - **`at`** draws it centred on another face point: `"face.forehead"`, `"face.chin"`,
53
+ `"face.leftCheek"`, `"face.rightCheek"`, `"face.noseTip"`, `"face.mouthCenter"`, … With `at`,
54
+ `"eyes"` is one strip, both eyes together. The original part stays where it is.
55
+
56
+ ### As a plane
57
+
58
+ A plane, `height` units tall and as wide as the part's shape, in its parent's frame. Put it inside a
59
+ `FaceTracker` to follow the head, or anywhere else in the scene.
60
+
61
+ ```tsx
62
+ <FaceTracker>
63
+ {/* A card beside the head, turning with it */}
64
+ <group position={[1.2, 0, 0]}>
65
+ <FaceInset part="mouth" placement="plane" height={0.8} />
66
+ </group>
67
+ </FaceTracker>;
68
+
69
+ // On a product box, outside the tracker: name the face
70
+ <group position={[0, -1, 0.5]}>
71
+ <mesh>
72
+ <boxGeometry args={[1.2, 1.1, 0.4]} />
73
+ <meshStandardMaterial color="#ffcf4a" />
74
+ </mesh>
75
+ <group position={[0, 0, 0.201]}>
76
+ <FaceInset part="mouth" placement="plane" faceIndex={0} height={0.8} />
77
+ </group>
78
+ </group>;
79
+ ```
80
+
81
+ ### As a texture
82
+
83
+ `useFaceInsetTexture` returns the part as a live `THREE.Texture`: straight alpha, sRGB, shaped like
84
+ the part's box (`faceInsetAspect(part)`). Use it on any material, or on screen with a
85
+ `ScreenImage`:
86
+
87
+ ```tsx
88
+ import { ScreenImage, ScreenSpaceUI } from "@vincentt-xr/sdk";
89
+ import { useFaceInsetTexture } from "@vincentt-xr/sdk/face-effects";
90
+
91
+ const EyeCorner = () => {
92
+ const eye = useFaceInsetTexture({ part: "leftEye", resolution: 384 });
93
+ return (
94
+ <ScreenSpaceUI>
95
+ <ScreenImage
96
+ source={{ kind: "texture", texture: eye }}
97
+ anchors={{ left: 0.2, right: 0.95, top: 0.95, bottom: 0.55 }}
98
+ fit="contain"
99
+ />
100
+ </ScreenSpaceUI>
101
+ );
102
+ };
103
+
104
+ // On your own mesh
105
+ const label = useFaceInsetTexture({ part: "mouth" });
106
+ <meshBasicMaterial map={label} transparent toneMapped={false} />;
107
+ ```
108
+
109
+ ## Parts
110
+
111
+ | `part` | Cut around | Box (eye distances, before `size`) |
112
+ | ------------ | -------------------------------- | ---------------------------------- |
113
+ | `"leftEye"` | the person's own left eye | 0.8 × 0.55 |
114
+ | `"rightEye"` | the person's own right eye | 0.8 × 0.55 |
115
+ | `"eyes"` | both eyes (two soft ellipses) | 1.8 × 0.55 |
116
+ | `"mouth"` | the lips | 1.2 × 1 |
117
+ | `"nose"` | the nose, bridge to nostrils | 0.8 × 1 |
118
+ | `"face"` | the whole face, forehead to chin | 2.5 × 3 |
119
+
120
+ The sizes are in eye distances: the 3D distance between the eye centres. The box therefore keeps its
121
+ size while the mouth opens or the head turns, and a talking mouth opens inside it. `size` scales the
122
+ box: more or less skin around the part. Left and right are the person's own eyes on every feed, the
123
+ same eyes as `face.leftEye` / `face.rightEye` (GROUNDING "Left and right"): `"leftEye"` is on the
124
+ screen's left in the mirrored webcam view and on its right in a video. Sided `at` targets
125
+ (`"face.leftCheek"`) follow the same rule.
126
+
127
+ ## Props
128
+
129
+ | Prop | Default | What it does |
130
+ | ------------- | -------------------------------- | --------------------------------------------------------------- |
131
+ | `part` | — | Which part (`FACE_INSET_PARTS`). |
132
+ | `placement` | `"face"` | `"face"` or `"plane"`. |
133
+ | `magnify` | `1.5` | `"face"` only: times bigger than life, about the part's middle. |
134
+ | `height` | `1` | `"plane"` only: the plane's height in local units. |
135
+ | `at` | — | `"face"` only: another face point to centre it on. |
136
+ | `feather` | `0.4` | Soft edge: 0 is hard (antialiased), 1 fades from the middle. |
137
+ | `size` | `1` | How much around the part is cut, a multiple of its box. |
138
+ | `opacity` | `1` | 0..1. |
139
+ | `faceIndex` | the enclosing `FaceTracker`'s | Which tracked face (else 0). |
140
+ | `resolution` | `256` | `"plane"` only: the texture's longer side, px. |
141
+ | `renderOrder` | `-1.5` on the face, `0` as plane | Draw order. |
142
+
143
+ `useFaceInsetTexture({ part, feather, size, resolution, faceIndex, active })` takes the same
144
+ options; `active: false` stops updating.
145
+
146
+ ## Tracking, faces and mirroring
147
+
148
+ - **A `FaceTracker` must be mounted.** `FaceInset` reads the face model and starts none. Inside a
149
+ `FaceTracker` it follows that tracker's face; elsewhere pass `faceIndex`.
150
+ - **Several faces.** Mount one per face, each in its own `FaceTracker faceIndex={i}`.
151
+ - **Face lost.** On the face, the inset hides at once. A texture (and a plane) keeps its last image
152
+ for `FACE_INSET_HOLD_MS` (250 ms), then turns transparent.
153
+ - **Upright.** The box turns with the head's roll. On the face it lines up with the real part; a
154
+ texture shows the part upright. This holds on the mirrored webcam, the rear camera and clips: the
155
+ camera image and the landmarks share one space, and the box takes its up from the face.
156
+ - **Turning away.** An eye fades out as the head turns away from it, so its far side never smears
157
+ over the nose.
158
+
159
+ ## How it works
160
+
161
+ 1. **Box.** Each frame, `writeFaceInsetFrame` places the part's box on the camera image: centred on
162
+ the part (eye corners, lips, nose, forehead-to-chin), along the eye line, sized in eye distances.
163
+ 2. **Mask.** A soft ellipse fills the box (two for `"eyes"`). `feather` sets its soft edge.
164
+ 3. **On the face.** One quad per part is drawn straight to clip space. It samples the camera inside
165
+ the box and draws it `magnify` times larger about the part's middle (or at `at`). No offscreen pass.
166
+ 4. **As a texture.** The same quad fills a small render target (one pass, only on a new camera frame
167
+ or new landmarks), copied on the GPU into the texture handed out. That texture is a plain one
168
+ (a `FramebufferTexture`, not a render target's), so it can be cloned: `ScreenImage` clones its
169
+ source.
170
+
171
+ **Performance.** No per-frame allocation and no CPU image work. On the face it costs one or two small
172
+ quads; as a texture, one small offscreen pass and a GPU copy per new camera frame.
173
+
174
+ **Pure pieces:** `writeFaceInsetFrame(landmarks, part, aspect, { size, mirrored }, out)` (`mirrored`:
175
+ the feed's, so `"leftEye"` is the person's own; the component passes the face's) with
176
+ `createFaceInsetFrame()`, `FACE_INSET_BOXES`, `faceInsetAspect(part)`.
177
+
178
+ ## Example
179
+
180
+ `/face-inset` has part, placement (face, beside the head, on a product box, on screen), magnify or
181
+ card height, feather, cut size, opacity, `at`, texture resolution and one or two faces. Options are
182
+ in the URL: `?part=mouth&place=object`.
183
+
184
+ ## Manual visual test plan
185
+
186
+ Open `/face-inset` on the webcam.
187
+
188
+ 1. **Giant eyes** (both eyes, magnify 1.6): your eyes are big and still blink and look around. The
189
+ edge is soft, with no seam or shimmer while you move.
190
+ 2. **Feather**: 0 gives a crisp oval with a smooth edge; 1 fades from the middle.
191
+ 3. **Mouth on the forehead** (mouth, show at forehead): the mouth talks on the forehead while the
192
+ real one moves too.
193
+ 4. **Big head** (whole face, magnify 1.4, feather 0.3) and **tiny face** (magnify 0.5).
194
+ 5. **Head tilt**: insets on the face turn with it; the texture placements stay upright.
195
+ 6. **Head turn**: the eye turning away fades out; the box keeps its size.
196
+ 7. **Mouth open wide**: the box keeps its size; the mouth opens inside it.
197
+ 8. **Beside / object / screen**: the part shows on the card, on the box front and in the corner,
198
+ live, upright and soft-edged.
199
+ 9. **Two faces** (faces: two, the two-people clip): each person gets their own inset.
200
+ 10. **Rear camera / clip**: the same results unmirrored.
201
+ 11. **Sides**: part "left eye" on the webcam magnifies your real left eye (on the screen's left).
202
+ On a clip it is the person's left eye (on the screen's right).
203
+ 12. **Dropout**: cover the camera. The face insets hide at once; the textures hold briefly, then
204
+ clear.
@@ -0,0 +1,183 @@
1
+ ---
2
+ title: "Face Instructions"
3
+ description: "Ask for a face expression with a 3D hint face and your own copy, detect it from the face blendshapes, and complete when it is held."
4
+ sidebarTitle: "Face Instructions"
5
+ icon: "face-smile-wink"
6
+ ---
7
+
8
+ `FaceInstruction` asks the person for a face expression and waits for it. A cute, translucent 3D face
9
+ loops into the expression, your copy sits under it, and holding the expression for `holdMs` completes
10
+ it. It is the face counterpart of [Hand Instructions](/api/hand-instructions), with the same layout
11
+ and feedback. The pieces underneath are exported too: `useFaceExpression` (the detection alone) and
12
+ `FaceExpressionHint` (the face alone).
13
+
14
+ Import from `@vincentt-xr/sdk/instructions`. Everything is customisable: your own expressions,
15
+ detection logic, 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 { MeshoptDecoder } from "three/examples/jsm/libs/meshopt_decoder.module.js";
23
+ import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader.js";
24
+ import { FaceInstruction } from "@vincentt-xr/sdk/instructions";
25
+
26
+ const SmileToStart = ({ onStart }: { onStart: () => void }) => {
27
+ // face-v1.glb is meshopt-compressed, so the loader needs the meshopt decoder.
28
+ const face = useLoader(GLTFLoader, faceUrl, (loader) => loader.setMeshoptDecoder(MeshoptDecoder));
29
+ return (
30
+ <FaceInstruction
31
+ expression="smile"
32
+ text="Smile to start"
33
+ model={face.scene}
34
+ onComplete={onStart}
35
+ />
36
+ );
37
+ };
38
+ ```
39
+
40
+ Mount it inside `XRScene`. It acquires the face model itself, so you don't need a `FaceTracker`, and
41
+ draws over the AR content in its own screen-space layer (`INSTRUCTION_RENDER_ORDER` = 2000 and up).
42
+ Detection reads MediaPipe's face blendshapes.
43
+
44
+ ## `FaceInstruction`
45
+
46
+ | Prop | Default | What it does |
47
+ | ---------------- | -------------------------------- | ------------------------------------------------------------------------------------------------------- |
48
+ | `expression` | — | What to ask for: a `FACE_EXPRESSIONS` name or your own `defineFaceExpression(…)`. |
49
+ | `model` | — | The hint face: morph targets named like the expressions (e.g. `face-v1.glb`'s scene). |
50
+ | `text` | the expression's `label` | Your copy, in any language. Long text shrinks to fit. |
51
+ | `doneText` | keep `text` | Copy shown once completed, while it fades out. |
52
+ | `nudgeText` | `"Show your face to the camera"` | Second line after `nudgeAfterMs` with no face in view; the hint pulses. `null` turns it off. |
53
+ | `nudgeAfterMs` | `3000` | How long without a face before the nudge. |
54
+ | `faceIndex` | `0` | Which detected face to read. |
55
+ | `holdMs` | `400` | How long the expression must be held. |
56
+ | `graceMs` | `150` | Dropouts shorter than this don't restart the hold. |
57
+ | `size` | `"md"` | `"sm"`, `"md"`, `"lg"`: 10 / 14 / 19 % of the screen height; or a fraction of it. |
58
+ | `placement` | `"center"` | `"top"`, `"center"` or `"bottom"`. |
59
+ | `offset` | `[0, 0]` | Shift from the placement, in half-screens. |
60
+ | `orbit` | `30` | The hint's auto orbit, degrees to each side. `0` holds it still. |
61
+ | `look` | `FACE_HINT_LOOK` | The hint's look, merged over the default: ghost, per-part tints, halo, glow, material. |
62
+ | `loop` | `FACE_HINT_LOOP` | The hint's loop: `seconds`, `hold`, `from`, `easing`. |
63
+ | `color` | `"#ffffff"` | Text colour, with a soft dark shadow so it reads on any camera feed. |
64
+ | `textStyle` … | — | `textStyle`, `nudgeTextStyle`, `renderText`, `motion`, `layout`: see [Instructions](/api/instructions). |
65
+ | `onComplete` | — | Called once when the expression is held long enough. |
66
+ | `onStatusChange` | — | Called once with the first status, then on every change. |
67
+ | `hideOnComplete` | `true` | Fade out after completing. A small pop and a white ring play either way. |
68
+ | `active` | `true` | `false` hides it and pauses detection. |
69
+
70
+ `onStatusChange` reports an `InstructionStatus`:
71
+
72
+ - `"waiting"`: no face in view.
73
+ - `"detected"`: a face in view, not making the expression.
74
+ - `"holding"`: making it; the hold is running.
75
+ - `"done"`: completed.
76
+
77
+ ## Expressions
78
+
79
+ | Name | Default copy | Recognised when (MediaPipe blendshapes, 0..1) |
80
+ | ------------ | ------------------ | ----------------------------------------------------------------------------- |
81
+ | `smile` | Give a big smile | `mouthSmileLeft` and `mouthSmileRight` ≥ 0.45 |
82
+ | `wink` | Wink at the camera | one `eyeBlink` ≥ 0.55 and the other ≤ 0.3 (either eye) |
83
+ | `surprised` | Look surprised | `jawOpen` ≥ 0.35 and `browInnerUp` ≥ 0.4 |
84
+ | `kiss` | Blow a kiss | `mouthPucker` ≥ 0.5 and `jawOpen` ≤ 0.3 |
85
+ | `puffCheeks` | Puff your cheeks | `cheekPuff` ≥ 0.3 |
86
+ | `frown` | Frown | `browDownLeft` and `browDownRight` ≥ 0.4 |
87
+ | `scrunch` | Scrunch your face | both `noseSneer` ≥ 0.3, or both `eyeSquint` ≥ 0.45 with both `browDown` ≥ 0.3 |
88
+
89
+ Several can match at once: a scrunch usually also counts as a frown.
90
+
91
+ ## Detection only: `useFaceExpression`
92
+
93
+ ```tsx
94
+ import { useFaceExpression } from "@vincentt-xr/sdk/instructions";
95
+
96
+ const { status, holdRef, matchedRef, faceRef, isInView, reset } = useFaceExpression("wink", {
97
+ holdMs: 400,
98
+ onComplete: () => unlock(),
99
+ });
100
+ ```
101
+
102
+ `status` (`"waiting"` → `"holding"` → `"done"`) re-renders only when it changes. Read
103
+ `holdRef.current.progress` (0..1) and `faceRef.current` (the latest `FaceInfo`, or `null`) inside
104
+ `useFrame`. `reset()` asks again. The result is an `InstructionDetector`, so it can drive a custom
105
+ `<Instruction>`.
106
+
107
+ A rule, a match function `(blendshapes, face) => boolean` or a definition works anywhere an
108
+ expression name does. A `FaceExpressionRule` has:
109
+
110
+ - `atLeast`: per blendshape, the minimum score.
111
+ - `atMost`: per blendshape, the maximum score.
112
+ - `anyOf`: sub-rules, one of which must pass.
113
+
114
+ ```tsx
115
+ useFaceExpression({ atLeast: { jawOpen: 0.6 }, atMost: { mouthSmileLeft: 0.2 } });
116
+ useFaceExpression((b) => (b.mouthSmileLeft ?? 0) - (b.mouthSmileRight ?? 0) > 0.4); // a half smile
117
+ ```
118
+
119
+ The checks are pure: `matchFaceExpression(face.blendshapes, nameOrRule)` and
120
+ `matchingFaceExpressions(face.blendshapes)`.
121
+
122
+ ## The hint face: `FaceExpressionHint`
123
+
124
+ ```tsx
125
+ <FaceExpressionHint expression="surprised" model={face.scene} height={0.4} />
126
+ ```
127
+
128
+ The face alone, for your own layout. It is fitted to `height` (parent units) and plays the
129
+ expression's morph target (`FACE_EXPRESSIONS[name].hint.target`, or pass `expression={{ target }}`,
130
+ or a weighted mix `expression={{ targets: { surprised: 1, wink: 1 } }}`)
131
+ from the idle face and back, while slowly orbiting side to side. The default look:
132
+
133
+ - **Ghost:** translucent white with a brighter rim, the same as the hand hint.
134
+ - **Tinted features:** each part is tinted by its material name (`iris`, `brow`, `lash`, `lip`,
135
+ `mouth_inside`, `tongue`, `sparkle`, `eye_white`), so the expression reads at small size.
136
+ - **Halo:** a soft dark edge so it reads on light backgrounds (`look.halo`).
137
+ - **Glow:** a soft light from behind the head, brightening as the expression forms (`look.glow`). It
138
+ is a separate disc behind the face, so it never shows as inner layers.
139
+
140
+ `look` is merged over `FACE_HINT_LOOK` (retint a part with `look.parts.iris`, drop a tint with
141
+ `null`, `false` turns a layer off, `look.material` replaces the ghost). A custom face works if its meshes carry morph targets named like the
142
+ expressions and it faces +Z.
143
+
144
+ ## The example model
145
+
146
+ `assets-src/faces/face-v1.blend` and `build_face.py` (README beside them) build the face from scratch,
147
+ with no third-party asset. The model is one mesh with nine materials and one fixed morph target per
148
+ expression: `smile`, `wink`, `surprised`, `kiss`, `puffCheeks`, `frown`, `scrunch`. The idle face is
149
+ the base shape, and the cheek blush is in `COLOR_0`.
150
+
151
+ Each expression is computed exactly rather than mixed from smaller keys, so the eyelids never cut
152
+ through the eyes. The raw export is ~1.8 MB; `gltf-transform meshopt` brings it to ~255 KB (~105 KB
153
+ gzipped) with every shape within 0.02 mm.
154
+
155
+ ## Example
156
+
157
+ `/face-instructions` covers:
158
+
159
+ - every expression as a chip, and a sequence mode that moves to the next expression when one
160
+ completes;
161
+ - text, nudge, size, placement and hold-time controls;
162
+ - a live readout of the status, the blendshapes the rules read, and the matching expressions.
163
+
164
+ ## Manual visual test plan
165
+
166
+ Open `/face-instructions`.
167
+
168
+ 1. **Every hint reads**: step through all seven chips. The face loops into each expression: closed
169
+ happy eyes and an open smile, a left wink, wide eyes with an O, a pucker, puffed cheeks (clearest
170
+ mid-orbit), slanted brows with a downturned mouth, squinted slits. It stays inside its slot through
171
+ the orbit.
172
+ 2. **Looks**: the ghost is translucent with no back layers showing through, the eyes, brows and
173
+ mouth stay clear, and the halo separates it from a white shirt.
174
+ 3. **Detection**: on the webcam, make each expression. The readout's matches list it and the status
175
+ goes `holding` → `done`. A resting face matches nothing; a wink with either eye works; blinking
176
+ both eyes is not a wink.
177
+ 4. **Completion**: on done, a small pop and a white ring play. With sequence on, it fades out and the
178
+ next expression comes in.
179
+ 5. **Nudge**: turn away for 3 s. The second line fades in and the hint pulses; it fades out when your
180
+ face is back. With the nudge off it never appears.
181
+ 6. **Copy and layout**: type custom text, switch sizes and top / center / bottom placement. Nothing
182
+ overlaps the screen edge.
183
+ 7. **Hands unchanged**: `/hand-instructions` looks and behaves as before (both use the same layout).
@@ -0,0 +1,196 @@
1
+ ---
2
+ title: "Face Liquify"
3
+ description: "2D liquify on the live face: bigger eyes, a slimmer jaw, a smile, a swirl. Eleven presets by weight, your own warps on named face points, every tracked face, with makeup, glasses and hats warping along."
4
+ sidebarTitle: "Face Liquify"
5
+ icon: "face-grin-stars"
6
+ ---
7
+
8
+ `FaceLiquify` reshapes faces on screen with local 2D warps, like a liquify brush that follows the
9
+ face.
10
+
11
+ - **Everything on the face warps together.** It warps the picture after everything 3D is drawn: the
12
+ camera, makeup and lips, face effects, glasses, hats and earrings.
13
+ - **Screen UI stays sharp.** `ScreenImage`, `ScreenText` and other screen UI draw after it.
14
+ - **Weight 0 is the untouched image**, byte for byte.
15
+
16
+ Import from `@vincentt-xr/sdk/face-effects`.
17
+
18
+ ## Quick start
19
+
20
+ ```tsx
21
+ import { VideoBackground, XRScene } from "@vincentt-xr/sdk";
22
+ import { FaceLiquify } from "@vincentt-xr/sdk/face-effects";
23
+
24
+ <XRScene>
25
+ <VideoBackground />
26
+ <FaceLiquify weights={{ bigEyes: 1, slimJaw: 1 }} />
27
+ </XRScene>;
28
+ ```
29
+
30
+ It starts the face model itself; no `FaceTracker` is needed.
31
+
32
+ ## FaceLiquify or FaceWarp3D?
33
+
34
+ | | `FaceLiquify` | [`FaceWarp3D`](/api/face-warp-3d) |
35
+ | --------- | ----------------------------------------------------------------- | ------------------------------------------------------- |
36
+ | How | 2D warps of the screen image around the face | Blend shapes on the face mesh, wearing the camera image |
37
+ | Warps | Everything drawn on the face: makeup, face effects, accessories | The face surface; makeup nested in it rides it |
38
+ | Authoring | Presets and warps in code, no model | Shape keys sculpted in Blender |
39
+ | Best for | Beauty tweaks, cartoon eyes and mouths, swirls, quick fun filters | Character proportions that follow the face in 3D |
40
+
41
+ They combine: the liquify warps the `FaceWarp3D` face too.
42
+
43
+ ## Presets and weights
44
+
45
+ `weights` sets each preset from 0 to 3:
46
+
47
+ - **1** is a subtle, natural look.
48
+ - **2** is clearly stylised.
49
+ - **3** is the strongest cartoon look before the image would fold over itself.
50
+
51
+ There are no negative weights; out-of-range values clamp.
52
+
53
+ | Preset | Does |
54
+ | -------------- | -------------------------------- |
55
+ | `bigEyes` | Magnifies both eyes |
56
+ | `smallNose` | Shrinks the nose |
57
+ | `bigMouth` | Magnifies the mouth |
58
+ | `smile` | Lifts both mouth corners |
59
+ | `chubbyCheeks` | Puffs both cheeks |
60
+ | `slimJaw` | Pushes both jaw angles in and up |
61
+ | `slimFace` | Pushes both sides of the face in |
62
+ | `longChin` | Pulls the chin down |
63
+ | `bigForehead` | Magnifies the forehead |
64
+ | `bigHead` | Magnifies the whole face |
65
+ | `swirl` | Twists the face about its centre |
66
+
67
+ `weight` (0..1) fades everything at once, linearly. Pass a ref to animate it without re-rendering:
68
+
69
+ ```tsx
70
+ const amount = useRef(0);
71
+ useFrame(({ clock }) => {
72
+ amount.current = (1 - Math.cos(clock.elapsedTime * 1.6)) / 2;
73
+ });
74
+ <FaceLiquify weights={{ bigEyes: 3 }} weight={amount} />;
75
+ ```
76
+
77
+ `weights` takes a ref too.
78
+
79
+ ## Your own warps
80
+
81
+ `warps` adds warps by name; set their weight in `weights` (a custom warp without a weight draws as
82
+ authored, at weight 3).
83
+
84
+ ```tsx
85
+ <FaceLiquify
86
+ warps={{
87
+ pointyChin: { kind: "stretch", at: "chin", radius: 0.6, strength: 0.8, direction: [0, -1] },
88
+ elfEars: {
89
+ kind: "push",
90
+ at: "leftFaceSide",
91
+ offset: [0.2, 0.6],
92
+ radius: 0.4,
93
+ strength: 0.7,
94
+ direction: [0.6, 1],
95
+ mirror: true,
96
+ },
97
+ }}
98
+ weights={{ pointyChin: 2, elfEars: 3 }}
99
+ />
100
+ ```
101
+
102
+ | Field | Meaning |
103
+ | ----------- | -------------------------------------------------------------------------------------------------------------------- |
104
+ | `kind` | `bulge` (magnify), `pinch` (shrink), `push` (move along `direction`), `stretch` (magnify along `direction`), `swirl` |
105
+ | `at` | A named point (below) or `{ landmark: n }`, a MediaPipe face landmark |
106
+ | `offset` | From `at`, in eye distances: x toward the person's own left, y up the face |
107
+ | `radius` | The circle it changes, in eye distances (the 3D distance between the eye centres) |
108
+ | `strength` | 0..1: the share of the kind's limit at weight 3. At 1 it is the most that kind can do without folding |
109
+ | `direction` | `push` and `stretch`: the way the content moves, in face axes. Default up the face |
110
+ | `clockwise` | `swirl`: turn the other way |
111
+ | `mirror` | Also apply it on the other side of the face |
112
+
113
+ Named points: `leftEye`, `rightEye`, `noseTip`, `noseBridge`, `mouth`, `leftMouthCorner`,
114
+ `rightMouthCorner`, `chin`, `leftJaw`, `rightJaw`, `leftCheek`, `rightCheek`, `leftFaceSide`,
115
+ `rightFaceSide`, `forehead`, `faceCenter`. Left and right are the person's own sides on every feed.
116
+
117
+ Warps apply one after another, so together they never fold either. A face holds at most 32 warps.
118
+ Memoise the `warps` object: a new object re-resolves the warps.
119
+
120
+ ## Faces, fades and turned heads
121
+
122
+ - **Every tracked face** warps, up to four, each its own pass. `faceIndex` picks one; `numFaces` sets
123
+ how many faces the face model tracks.
124
+ - **Fades:** a face fades in over 150 ms when found, holds through a dropout of up to 250 ms, then
125
+ fades out over 120 ms.
126
+ - **Turned heads:** a warp on one side of the face fades as that side turns away, so the far cheek
127
+ never smears over the nose.
128
+ - **Smoothing:** landmarks are smoothed as face swap's are (`smoothing`, default 0.35; 0 is raw).
129
+
130
+ ## Hands in front (experimental)
131
+
132
+ With `HandCutout` in the scene, a hand over the face stays sharp: hand pixels are never warped, and a
133
+ warp never pulls a hand into the face.
134
+
135
+ ```tsx
136
+ import { HandCutout, HandTracker } from "@vincentt-xr/sdk/tracking";
137
+
138
+ <>
139
+ <HandTracker>
140
+ <HandCutout />
141
+ </HandTracker>
142
+ <FaceLiquify weights={{ bigMouth: 2 }} />
143
+ </>;
144
+ ```
145
+
146
+ Without `HandCutout`, a hand over the face warps with it.
147
+
148
+ ## Props
149
+
150
+ | Prop | Default | Meaning |
151
+ | ------------- | ------------------ | ----------------------------------------------------------------------------- |
152
+ | `weights` | `{}` (nothing) | Preset and custom-warp weights by name, 0..3, or a ref read every frame |
153
+ | `warps` | none | Your own warps by name |
154
+ | `weight` | 1 | Overall fade 0..1, or a ref |
155
+ | `faceIndex` | every tracked face | Only this face (default: the enclosing `FaceTracker`'s face, else every face) |
156
+ | `numFaces` | 1 | Faces the face model tracks when this starts it |
157
+ | `smoothing` | 0.35 | Landmark smoothing 0..1 |
158
+ | `active` | true | False: no model, no copy, nothing drawn |
159
+ | `debug` | false | Draws each warp's circle and direction, and the face's points |
160
+ | `renderOrder` | 998 | The pass's render order |
161
+
162
+ ## Limits
163
+
164
+ - **Draw order.** The warp draws at render order 998. Content drawn after it stays sharp: screen UI
165
+ (999+), a transparent mesh placed directly inside a tracker (wrap it in a `<group>` to warp it),
166
+ your own content at 998 or above.
167
+ - **Opaque screen UI** (`transparent={false}`) draws before it and warps.
168
+ - **Render targets.** Multisampled or float targets (effect composers), WebXR and multi-target passes
169
+ are drawn unwarped, with one console warning.
170
+ - **Cost.** Each face copies and redraws only its warp area. Check phone performance before shipping a
171
+ multi-face effect.
172
+
173
+ ## Example
174
+
175
+ `/face-warp` in the SDK playground, mode "2D liquify", has the preset sliders, a custom-warp editor
176
+ that shows the code to paste, an animate toggle, one or two faces, hands in front and the debug
177
+ circles. Settings are in the URL: `?lq=bigEyes:1,smile:2`, `?lqdebug=1`, `?lqanim=1`,
178
+ `?lqfaces=2`, `?hands=0`. Mode "both" adds the 3D shape keys under the liquify.
179
+
180
+ ## Manual visual test plan
181
+
182
+ Open `/face-warp` on the webcam.
183
+
184
+ 1. **Weight 0** (all presets off): the image is untouched. No edge, band or shimmer around the face.
185
+ 2. **Each preset at 1, then 3**: 1 looks natural, 3 is a strong cartoon. No tearing, no fold, no hard
186
+ circle edge.
187
+ 3. **Sides**: with debug on, the circles sit on your own eyes, mouth corners, jaw and chin, and follow
188
+ tilt and turn.
189
+ 4. **Turned head**: turn far to one side with `chubbyCheeks` at 3. The far cheek fades instead of
190
+ smearing over the nose.
191
+ 5. **Dropout**: cover the camera for a moment. The warp holds briefly, then fades out; it fades back
192
+ in when you reappear.
193
+ 6. **Hands**: with hands in front, put a hand over your mouth with `bigMouth` at 3. The hand keeps its
194
+ real size, with no hand colour spreading into the face. Show a hand away from your face: no hole
195
+ appears in the warp.
196
+ 7. **Two faces**: faces "two" on the two-people clip warps both people.