@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,157 @@
1
+ ---
2
+ title: "Face Character (end to end)"
3
+ description: "Every face-character piece together: a cute warp of your real face, a transform into a character, the character with your eyes and mouth, pins, a hat behind the head and hands in front."
4
+ sidebarTitle: "Face Character"
5
+ icon: "masks-theater"
6
+ ---
7
+
8
+ This page puts the face-character pipeline ([#194](https://github.com/vincentt-xr/sdk/issues/194),
9
+ #200) together in one lens, for up to two people at once. Each piece has its own page:
10
+
11
+ | Piece | What it does here |
12
+ | ------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- |
13
+ | [`FaceWarp3D`](/api/face-warp-3d) | "You": your real face made cute (a bigger-eyes shape key), photoreal |
14
+ | [`FaceMorph`](/api/face-morph) | "Transform": your face swells into the character, your eyes flowing into its eyes |
15
+ | [`ExternalFaceMesh`](/api/external-face-mesh) | "Character": the character head, following your head |
16
+ | [`FaceExpressionController`](/api/face-expression-controller) | Plays the character's shape keys from your expression, plus blush, sparkles and a wink counter |
17
+ | [`FaceReprojection`](/api/face-reprojection) | Your eyes and mouth on the character (`align` for its cartoon proportions) |
18
+ | [`PinToFaceMesh`](/api/pin-to-face-mesh) | A bow and a star that ride the warp, the morph and the character's skin |
19
+ | [`HeadAttachment`](/api/head-occluder) + occluder | A party hat whose back goes behind your head |
20
+ | `HandCutout` | Your hands stay in front of all of it |
21
+
22
+ ## The structure
23
+
24
+ ```tsx
25
+ import {
26
+ ExternalFaceMesh,
27
+ FaceExpressionController,
28
+ FaceMorph,
29
+ FaceReprojection,
30
+ FaceRig,
31
+ FaceWarp3D,
32
+ HeadAttachment,
33
+ HeadBinding,
34
+ PinToFaceMesh,
35
+ } from "@vincentt-xr/sdk/face-effects";
36
+ import { HandCutout, HandTracker } from "@vincentt-xr/sdk/tracking";
37
+
38
+ <HandTracker>
39
+ <HandCutout />
40
+ </HandTracker>;
41
+
42
+ {
43
+ [0, 1].map((faceIndex) => (
44
+ <HeadBinding key={faceIndex} faceIndex={faceIndex} numFaces={2} occluder={{ url: occluderUrl }}>
45
+ <FaceRig>
46
+ {phase === "you" && (
47
+ <FaceWarp3D deformation={cuteShapes} weights={{ cute: 0.7 }}>
48
+ <Pins /> {/* children ride the warp */}
49
+ </FaceWarp3D>
50
+ )}
51
+ {phase === "transform" && (
52
+ <FaceMorph shape={character} align={GHOST_ALIGN} weight={sweepRef} falloff={[4, 9]}>
53
+ <Pins /> {/* children ride the morph */}
54
+ </FaceMorph>
55
+ )}
56
+ {phase === "character" && (
57
+ <FaceExpressionController rules={ghostRules}>
58
+ <group ref={characterRef}>
59
+ <ExternalFaceMesh model={character} drive="none">
60
+ <FaceReprojection region="eyesAndMouth" align={GHOST_ALIGN} meshes={GHOST_WEARS} />
61
+ </ExternalFaceMesh>
62
+ </group>
63
+ <Pins onto={characterRef} /> {/* on the character's skin */}
64
+ </FaceExpressionController>
65
+ )}
66
+ </FaceRig>
67
+ <HeadAttachment point="crown" offset={{ position: [0, 0.6, 0.4] }}>
68
+ <PartyHat />
69
+ </HeadAttachment>
70
+ </HeadBinding>
71
+ ));
72
+ }
73
+ ```
74
+
75
+ ### Stylised characters
76
+
77
+ The SDK ghost head (`face-v1.glb`) has cartoon proportions: big eyes 3 cm lower than a real face's.
78
+ Pass its own eye and mouth centres as `align` (`{ leftEye, rightEye, mouth }`). `FaceReprojection` and
79
+ `FaceMorph` then bind it as if those sat on your face, so your eyes land on its eyes.
80
+
81
+ Being rounder than a real face, it also needs a wider `FaceMorph` `falloff` (`[4, 9]`). Name the parts
82
+ that wear your face with `meshes`. Eye parts are found by mesh or material name (`eye…`, `iris…`).
83
+
84
+ ### Expressions on a character's own shape keys
85
+
86
+ The ghost's shape keys (`smile`, `wink`, `surprised`, `kiss`, `puffCheeks`, `frown`, `scrunch`) are
87
+ played by `FaceExpressionController` rules from ARKit channels. That's why the `ExternalFaceMesh` uses
88
+ `drive="none"`.
89
+
90
+ The same controller also handles the extras:
91
+
92
+ - the blush's opacity follows your smile;
93
+ - sparkles show while your mouth is open;
94
+ - each wink triggers a counter.
95
+
96
+ ### Draw order and the head occluder
97
+
98
+ The occluder is your real head, skull included. It must hide what is behind your head, like the
99
+ hat's back. It must never hide the face effects, including a character head smaller than your skull.
100
+
101
+ Everything that is the face draws first, at `FACE_SURFACE_RENDER_ORDER` (-2), before the occluder
102
+ (-1, on its meshes). Accessories come after (0). Set render orders on meshes, never on a `Group`:
103
+ three sorts by the nearest group first.
104
+
105
+ ### Hands in front
106
+
107
+ `HandCutout` draws your hands' silhouettes as near-plane depth before everything else. A hand over your
108
+ face shows the real hand in front of the warp, the character, the pins and the hat.
109
+
110
+ ## Example
111
+
112
+ `/face-character` has:
113
+
114
+ - **A Transform button.**
115
+ - **Controls:**
116
+ - the character (the ghost head, or facecap when the local file is present);
117
+ - "cute you";
118
+ - your eyes and mouth on the character;
119
+ - a toon material;
120
+ - the head occluder;
121
+ - hands in front;
122
+ - one or two people.
123
+ - **Badges** for each face's tracking and a wink count.
124
+
125
+ URL options:
126
+
127
+ - `?phase=character` starts as the character;
128
+ - `?hold=0.5` freezes the transform at that weight, for inspection;
129
+ - `?faces=1`, `?occluder=0`, `?hands=0`, `?wear=0` and `?toon=1` set the controls.
130
+
131
+ ## Manual visual test plan
132
+
133
+ Open `/face-character` on the webcam.
134
+
135
+ 1. **You**: your eyes are bigger and the face looks real. The bow sits on the side of your forehead
136
+ and the star on your cheek; both move with your face. The hat sits on your crown, and turning your
137
+ head hides its back behind your head.
138
+ 2. **Transform**: your face swells into the ghost over about 1.5 s. Your eyes flow into its eyes, and
139
+ the bow and star ride along. "Back to you" reverses it.
140
+ 3. **Character**:
141
+ - the whole round ghost is visible, with nothing cut away by the occluder;
142
+ - your eyes and mouth are on it;
143
+ - smile: it smiles and blushes;
144
+ - wink: the counter goes up;
145
+ - open your mouth: sparkles;
146
+ - puff your cheeks, kiss, frown and scrunch: it does too.
147
+ 4. **Occluder**: toggle the head occluder. The face effects never change; only the hat's back hides
148
+ or shows.
149
+ 5. **Hands**: put a hand over your face in every phase. The real hand stays in front of the warp, the
150
+ character, the pins and the hat. Turn the toggle off and they draw over your hand.
151
+ 6. **Two people**: with two faces in view, each gets its own lens. The badges follow each face.
152
+ 7. **Tracking loss**: cover your face. The lens holds briefly, then hides (the badge says "lost") and
153
+ comes back on reacquire.
154
+ 8. **Mirror**: switch between the webcam and the sample media. Everything stays on the right side of
155
+ the face.
156
+ 9. **facecap** (local): pick facecap. The transform and the character work on a realistic head, with
157
+ no `align` needed.
@@ -9,6 +9,9 @@ This section is split into focused pages:
9
9
 
10
10
  - [Face Mesh](/api/face-mesh) for the base 3D face mesh, canonical renderer,
11
11
  and face mesh material settings.
12
+ - [Head Occluder](/api/head-occluder) for `HeadBinding`, the canonical-fit
13
+ depth-only head mesh and `CanonicalHeadFrame`, so 3D accessories pass behind
14
+ the tracked head.
12
15
  - [Face Painting](/api/face-painting) for the composite shader variant used to
13
16
  paint onto the live face mesh.
14
17
  - [Face Retouching](/api/face-retouching) for the legacy skin-retouch shader
@@ -0,0 +1,153 @@
1
+ ---
2
+ title: "Face Expression Controller"
3
+ description: "Turn the tracked expression into behaviour with typed rules: morph targets, material values, visibility, transforms, triggers and your own setters."
4
+ sidebarTitle: "Face Expression Controller"
5
+ icon: "sliders"
6
+ ---
7
+
8
+ `FaceExpressionController` turns the tracked face's expression into behaviour. Each rule has three
9
+ parts:
10
+
11
+ - an **input**, such as a blendshape, a combination of them, a Face Action or your own function;
12
+ - its **shaping**: range, curve, multiplier, clamp and smoothing;
13
+ - its **outputs**: morph targets, material values, visibility, transforms, triggers or a setter.
14
+
15
+ It is part of the face-character pipeline ([#194](https://github.com/vincentt-xr/sdk/issues/194)):
16
+ #196 is the controller, and #197 is custom morph mapping. It runs on a
17
+ [`FaceRig`](/api/external-face-mesh#facerig).
18
+
19
+ Import from `@vincentt-xr/sdk/face-effects`.
20
+
21
+ ## Quick start
22
+
23
+ ```tsx
24
+ import { ExternalFaceMesh, FaceExpressionController, FaceRig } from "@vincentt-xr/sdk/face-effects";
25
+ import { FaceTracker } from "@vincentt-xr/sdk/tracking";
26
+
27
+ <FaceTracker>
28
+ <FaceRig>
29
+ <FaceExpressionController
30
+ rules={[
31
+ { input: "jawOpen", morph: "jawOpen", multiplier: 1.4 },
32
+ { input: { action: "mouthOpen" }, target: "bubble", visible: { above: 0.45 } },
33
+ { input: { action: "eyeBlink" }, onStart: () => playBlinkSound() },
34
+ ]}
35
+ >
36
+ <ExternalFaceMesh model={head.scene} drive="none" />
37
+ <group name="bubble">…</group>
38
+ </FaceExpressionController>
39
+ </FaceRig>
40
+ </FaceTracker>;
41
+ ```
42
+
43
+ The outputs act on the controller's children, which sit in the canonical head frame (centimetres).
44
+ Inside a `FaceRig` the controller shares that rig; otherwise it runs its own, so mount it in a
45
+ `FaceTracker`.
46
+
47
+ ## Inputs
48
+
49
+ | `input` | Reads |
50
+ | ------------------------------------- | -------------------------------------------------------------------------------------------- |
51
+ | `"jawOpen"` | A blendshape channel (ARKit names, `FACE_MORPH_NAMES`), with the person's neutral removed. |
52
+ | `{ channels: [...], combine: "avg" }` | Several channels: `"max"` (default), `"min"`, `"avg"` or `"sum"`. |
53
+ | `{ action: "mouthOpen" }` | A Face Action's value, as `useFaceAction` reads it (raw blendshapes, head turns in radians). |
54
+ | `(frame) => number` | Your own function of `{ morphs, face, live }`. |
55
+
56
+ An unknown channel or action reads 0 and warns once, listing the valid names.
57
+
58
+ ## Shaping
59
+
60
+ Every frame, a rule's value goes through these steps in order:
61
+
62
+ ```text
63
+ input → range (→ 0..1) → curve → × multiplier → clamp → smoothing
64
+ ```
65
+
66
+ | Field | Default | What it does |
67
+ | ------------ | ---------------- | ----------------------------------------------------------------------------------------- |
68
+ | `range` | `[0, 1]` | The input span mapped onto 0..1: below the first value reads 0, above the second reads 1. |
69
+ | `curve` | `1` | An exponent: above 1 eases in (subtle until strong), below 1 eases out. |
70
+ | `multiplier` | `1` | A scale after the curve: above 1 exaggerates. |
71
+ | `clamp` | `[0, max(1, ×)]` | Limits after the multiplier. |
72
+ | `smoothing` | `0.6` | A per-frame EMA factor, or `{ attack, release }` to rise and fall at different speeds. |
73
+ | `rest` | `0` | The value at rest: after a reset, and on face loss. |
74
+ | `onLost` | `"rest"` | On face loss, ease back to `rest`, or `"hold"` the last value. |
75
+
76
+ ## Outputs
77
+
78
+ Outputs act on the object named `target` in the subtree; without a `target`, on the whole subtree.
79
+
80
+ | Output | Writes |
81
+ | ------------------- | ------------------------------------------------------------------------------------------------------------- |
82
+ | `morph` | Morph target name(s) on every mesh under it. An ARKit name also matches the Face Cap spelling (`eyeBlink_L`). |
83
+ | `property` | A material uniform (`uniforms[name].value`) or a numeric property (`opacity`, `emissiveIntensity`). |
84
+ | `visible` | Shown while the value is ≥ `above` and/or ≤ `below` (default: ≥ 0.5). |
85
+ | `transform` | An offset from the target's rest at value 1: `position`, `rotation` (degrees), `scale` (factor). |
86
+ | `set` | Your own setter, called every frame with the value. |
87
+ | `onStart` / `onEnd` | Edge callbacks, with `trigger: [on, off]` hysteresis (default `[0.5, 0.35]`). |
88
+
89
+ Several `transform` rules on one target add up, and the target returns to its rest pose every frame
90
+ before they apply. Bindings re-resolve once a second, so children that load later (a GLTF behind
91
+ `Suspense`) are picked up. A target, morph or property that is still missing after that warns once.
92
+
93
+ **Morphs and `ExternalFaceMesh`.** When the controller drives a face model's morphs, set that
94
+ model's `drive` to `"none"` or `"landmarks"`. Otherwise both write the morphs. For a simple gain on
95
+ the automatic mapping, `ExternalFaceMesh`'s `morphGain` is enough.
96
+
97
+ ## Reset and face loss
98
+
99
+ - **Reset:** a new `resetKey` puts every rule back at `rest` and ends active triggers, firing
100
+ `onEnd`.
101
+ - **Face loss:** values ease back to `rest`, unless a rule sets `onLost: "hold"`.
102
+ - **Neutral:** recalibrating the person's neutral is the rig's job (`FaceRig`'s `neutralKey`).
103
+
104
+ ## Headless use
105
+
106
+ `useExpressionValues(rules)` runs the same rules without outputs. Read the values in `useFrame`:
107
+
108
+ ```tsx
109
+ const expr = useExpressionValues([
110
+ { id: "smile", input: { channels: ["mouthSmileLeft", "mouthSmileRight"], combine: "avg" } },
111
+ ]);
112
+ useFrame(() => {
113
+ shader.uniforms.uSmile.value = expr.get("smile");
114
+ });
115
+ ```
116
+
117
+ The engine is pure and exported:
118
+
119
+ - `compileExpressionInput`, `createExpressionState` and
120
+ `stepExpressions(state, rules, readers, frame)`;
121
+ - `shapeExpressionValue` and `resetExpressions`;
122
+ - `expressionFrame(rig)`;
123
+ - `createExpressionOutputs(root)`, which has `resolve(rules, warn)` and `apply(rules, state)`.
124
+
125
+ ## Example
126
+
127
+ `/external-face-mesh?rules=1` runs on the facecap head when it is present locally (see
128
+ [External Face Mesh](/api/external-face-mesh#example)). It shows:
129
+
130
+ - **Custom morph mapping:** a cartoon mapping with an "exaggerate" slider. A toggle compares it with
131
+ `ExternalFaceMesh`'s automatic mapping.
132
+ - **Props:** a hat that lifts and tilts with the brows, a bubble that appears when the mouth opens,
133
+ and a cheek blush that follows the smile.
134
+ - **Triggers:** blink and mouth-open counters.
135
+ - **Readout:** the live rule values.
136
+
137
+ ## Manual visual test plan
138
+
139
+ Open `/external-face-mesh?rules=1` on the webcam and look at the camera, relaxed, when the head
140
+ appears. That captures the neutral.
141
+
142
+ 1. **At rest**: every bar reads 0. The hat sits on the crown, there is no bubble and no blush.
143
+ 2. **Mouth**: open your mouth wide. With the custom mapping on, the model's jaw opens wider than
144
+ yours (exaggerate 1.4), and the bubble pops up. The mouth counter goes up once per opening, not
145
+ once per frame.
146
+ 3. **Blink**: each blink snaps the lids shut and reopens them softly, and the blink counter goes up
147
+ once.
148
+ 4. **Brows and smile**: raising your brows lifts and tilts the hat. Smiling brings up the blush,
149
+ up to 0.75 opacity.
150
+ 5. **Exaggerate**: at 0.5 everything is subdued; at 2 it is cartoonish but clamped.
151
+ 6. **Auto vs custom**: untick "custom morph mapping". `ExternalFaceMesh` drives the morphs one to
152
+ one, with no exaggeration and no soft reopen.
153
+ 7. **Face loss**: cover the camera. Everything eases back to rest, and the hat comes down.
@@ -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.