@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,274 @@
1
+ ---
2
+ title: "Pin to Face Mesh"
3
+ description: "Pin content to a point on the live face surface: it follows the head and the skin under it through expressions, turning with the skin. Named piercing presets for the nose, septum, lip and brow."
4
+ sidebarTitle: "Pin to Face Mesh"
5
+ icon: "thumbtack"
6
+ ---
7
+
8
+ `PinToFaceMesh` pins content to a point on the face. It follows the head and the skin under it
9
+ through expressions:
10
+
11
+ - a sticker on the cheek rides a smile;
12
+ - a stud by the mouth follows the corner as it moves;
13
+ - the content turns with the skin.
14
+
15
+ It is part of the face-character pipeline ([#194](https://github.com/vincentt-xr/sdk/issues/194),
16
+ #198) and runs on a [`FaceRig`](/api/external-face-mesh#facerig).
17
+
18
+ The generic [`PinToMesh`](/api/behavior-components) resolves its point once against a static mesh.
19
+ That is still the tool for a static mesh; this one follows a surface that moves every frame.
20
+
21
+ Import from `@vincentt-xr/sdk/face-effects`.
22
+
23
+ ## Quick start
24
+
25
+ ```tsx
26
+ import { PinToFaceMesh } from "@vincentt-xr/sdk/face-effects";
27
+ import { FaceTracker } from "@vincentt-xr/sdk/tracking";
28
+
29
+ <FaceTracker>
30
+ <PinToFaceMesh anchor="face.leftCheek" offset={{ position: [0, 0, 0.1] }}>
31
+ <mesh>
32
+ <circleGeometry args={[1.2, 32]} />
33
+ <meshBasicMaterial color="hotpink" />
34
+ </mesh>
35
+ </PinToFaceMesh>
36
+ </FaceTracker>;
37
+ ```
38
+
39
+ Author the content in **centimetres** around its origin. The pin's frame is:
40
+
41
+ - **X** along the face, toward the screen's right on a face looking at the camera;
42
+ - **Y** up;
43
+ - **Z** out of the skin.
44
+
45
+ ## Anchors
46
+
47
+ | `anchor` | Where |
48
+ | ----------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- |
49
+ | `"face.leftCheek"` … | A face target (`FACE_PIN_TARGETS`): left and right are the person's own on every feed. Composites project onto the skin. |
50
+ | `{ landmark: 278 }` | A MediaPipe face landmark, 0–467 (MediaPipe's side; never swapped). |
51
+ | `{ point: [x, y, z] }` | A point in the canonical head frame (cm, `+X` = MediaPipe's left; never swapped), e.g. measured in the head-occluder `.blend`. It binds to the skin under it. |
52
+ | `{ triangle, weights }` | An exact surface point: a canonical face triangle and barycentric weights. |
53
+
54
+ Every anchor is bound once to the canonical face surface. A `point` that lies off the skin keeps its
55
+ offset in the pin frame. An unknown name or an out-of-range index throws, listing the valid forms.
56
+
57
+ A named left / right anchor follows the person's real side (GROUNDING "Left and right"): the
58
+ canonical face's sides are MediaPipe's, which the mirrored webcam swaps, so `PinToFaceMesh` binds
59
+ `facePinAnchorForFeed(anchor, mirrored)` with the session's mirror state. Pass `mirrored` to
60
+ override. `"face.leftCheek"` is on the screen's left in the mirrored selfie view and on its right in
61
+ a video.
62
+
63
+ ## Props
64
+
65
+ | Prop | Default | What it does |
66
+ | ----------- | ----------- | ----------------------------------------------------------------------------------------------------------------------------------------------- |
67
+ | `anchor` | — | Where on the face (see above). |
68
+ | `surface` | `"face"` | `"face"`: the person's real face (shape + expression). `"model"`: the canonical face + expression, as an `ExternalFaceMesh` character wears it. |
69
+ | `orient` | `"surface"` | `"surface"`: turns with the skin (normal averaged over the triangles within 1.2 cm). `"head"`: keeps the head's orientation. |
70
+ | `offset` | — | `{ position (cm), rotation (degrees), scale }` in the pin frame. |
71
+ | `smoothing` | `1` | A per-frame EMA on the pin's position and turn (`1` = none; the rig already smooths the expression). |
72
+ | `onto` | — | A face model to sit on (a ref to the group around an `ExternalFaceMesh`). See below. |
73
+ | rig props | — | `faceIndex`, `expressionSmoothing`, `holdMs`, `neutral`, `neutralMs`, `neutralKey`, `leadMs`, `onTrackingChange` (when it runs its own rig). |
74
+
75
+ **Pins on a character.** A character's skin is never exactly the canonical surface: its cheek may sit
76
+ a few millimetres in front of it. Pass the character as `onto`. Once the model can be hit, the pin
77
+ moves along its rest normal onto that skin, then rides the expression from there.
78
+
79
+ Anchor at the exact spot (a `point`, a landmark or a triangle) rather than at a nearby landmark plus a
80
+ sideways offset. The projection happens at the anchor; a sideways offset can land inside a curved
81
+ cheek.
82
+
83
+ ```tsx
84
+ const character = useRef<THREE.Group>(null);
85
+ <FaceRig>
86
+ <group ref={character}>
87
+ <ExternalFaceMesh model={head.scene} />
88
+ </group>
89
+ <PinToFaceMesh anchor="face.rightCheek" surface="model" onto={character}>
90
+ <Star />
91
+ </PinToFaceMesh>
92
+ </FaceRig>;
93
+ ```
94
+
95
+ **Tracking.** The pin is hidden while the face is lost, holds through short dropouts (the rig's
96
+ `holdMs`), and snaps into place on reacquire.
97
+
98
+ ## Pure pieces
99
+
100
+ - **`bindFacePin(anchor, { patchRadius })`** → `FacePinBinding`, with `triangle`, `weights`,
101
+ `offset` and the normal `patch`.
102
+ - **`stepFacePin(binding, rig, { surface, orient }, out)`** gives the pin's position and quaternion in
103
+ the head frame for this frame.
104
+ - **`projectFacePinOnto(binding, model, headFrame)`** gives how far (cm) the pin must move along its
105
+ normal to sit on a model's skin.
106
+
107
+ ## Piercings
108
+
109
+ `FacePiercing` puts jewellery on a named piercing spot. It is a preset over `PinToFaceMesh`: it
110
+ knows where the hole is on the face mesh and how a stud or a ring sits there, so you never look up a
111
+ landmark.
112
+
113
+ ```tsx
114
+ import { FacePiercing, FaceRig } from "@vincentt-xr/sdk/face-effects";
115
+ import { FaceTracker } from "@vincentt-xr/sdk/tracking";
116
+
117
+ <FaceTracker>
118
+ <FaceRig>
119
+ <FacePiercing preset="nose.left" />
120
+ <FacePiercing preset="septum" />
121
+ <FacePiercing preset="brow.right" kind="stud">
122
+ <primitive object={myStud} />
123
+ </FacePiercing>
124
+ </FaceRig>
125
+ </FaceTracker>;
126
+ ```
127
+
128
+ Without children it draws a plain silver stud or ring sized for the spot. Wrap several piercings in
129
+ one `FaceRig`; on its own each one runs its own rig.
130
+
131
+ ### Spots
132
+
133
+ | `preset` | Where | Classic `kind` | Typical size |
134
+ | -------------- | ----------------------------------------------------------- | -------------- | ------------- |
135
+ | `"nose.left"` | The alar crease of the left nostril. | `"stud"` | 2.5 mm / 8 mm |
136
+ | `"nose.right"` | The same on the right nostril. | `"stud"` | 2.5 mm / 8 mm |
137
+ | `"septum"` | Through the septum, above the base of the nose. | `"ring"` | 3 mm / 10 mm |
138
+ | `"lip.centre"` | Below the centre of the lower lip (labret). | `"stud"` | 3 mm / 9 mm |
139
+ | `"lip.left"` | Below the outer third of the lower lip, left. | `"ring"` | 3 mm / 9 mm |
140
+ | `"lip.right"` | The same on the right. | `"ring"` | 3 mm / 9 mm |
141
+ | `"brow.left"` | The outer third of the left brow; a ring enters at its top. | `"ring"` | 3 mm / 10 mm |
142
+ | `"brow.right"` | The same on the right brow. | `"ring"` | 3 mm / 10 mm |
143
+
144
+ Sizes are a stud's face diameter and a ring's inner diameter (`FACE_PIERCINGS[preset].size`, in
145
+ cm).
146
+
147
+ How each kind sits:
148
+
149
+ - **Stud:** on the skin at the hole, its face out of the skin (the septum bead faces forward, just
150
+ under the nose).
151
+ - **Nostril ring:** through the nostril wing, hanging over the rim.
152
+ - **Septum ring:** through the septum from side to side, hanging below the nose and tipped slightly
153
+ forward.
154
+ - **Lip ring:** in below the lip, wrapping up over its edge.
155
+ - **Brow ring:** in at the top of the brow and out under it, mostly outside the skin, leaning toward
156
+ the temple.
157
+
158
+ Every spot is bound to the face surface, so it rides expressions: the lip spots follow the jaw when
159
+ the mouth opens, the brow spots rise with the brows.
160
+
161
+ **Left and right are the person's real sides on every feed.** The face mesh's own sides are those of
162
+ the face as the tracker sees it, which a mirrored feed (the front webcam) swaps. `FacePiercing` reads
163
+ the session's mirroring (`useXRMirrored`) and takes the other side's placement there, so
164
+ `"nose.left"` is always the person's left nostril: on the screen's left in the mirrored selfie view,
165
+ on its right in a video. Pass `mirrored` to override.
166
+
167
+ ### The piercing frame
168
+
169
+ Author jewellery in centimetres in the piercing frame; it then needs no offset:
170
+
171
+ - the origin is the hole, on the skin;
172
+ - **+Z** is the piercing axis, out of the skin: a stud's face looks along +Z, its back on the origin;
173
+ - **+Y** is up;
174
+ - a ring lies in the **YZ plane**, its wire passing through the origin, and hangs toward −Y (its
175
+ centre at `(0, −r, 0)` for a centre-line radius `r`).
176
+
177
+ In Blender (glTF `+Y Up` export) that is: a stud facing −Y, a ring around the X axis hanging below
178
+ the origin. The example sets in `assets-src/accessories/piercings-v1.blend` follow it.
179
+
180
+ ### Props
181
+
182
+ | Prop | Default | What it does |
183
+ | ----------- | ------------- | -------------------------------------------------------------------------------------------------- |
184
+ | `preset` | — | The spot (`FACE_PIERCING_NAMES`). |
185
+ | `kind` | the spot's | `"stud"` or `"ring"`. |
186
+ | `mirrored` | the session's | Whether the feed is mirrored; decides which mesh side is the person's left. |
187
+ | `occlude` | `true` | Hides what passes behind the skin (a ring's inner half) with a depth-only patch of the live face. |
188
+ | `offset` | — | `{ position (cm), rotation (degrees), scale }` in the piercing frame, mirrored on the other side. |
189
+ | `surface` | `"face"` | As on `PinToFaceMesh`. |
190
+ | `smoothing` | `1` | As on `PinToFaceMesh`. |
191
+ | `onto` | — | A worn character to sit on, as on `PinToFaceMesh` (no skin patch; the character hides the inside). |
192
+ | rig props | — | Used when it runs its own rig, as on `PinToFaceMesh`. |
193
+
194
+ **Metals.** Gold and silver need something to reflect: give the scene an environment map (for
195
+ example three's `RoomEnvironment` through a `PMREMGenerator`, as `/pin-to-face-mesh` does).
196
+
197
+ ### The skin occluder
198
+
199
+ `FaceSurfaceOccluder` is the depth-only mesh of the live face that `FacePiercing` mounts around each
200
+ hole. Use it with your own `PinToFaceMesh` content that passes through the skin:
201
+
202
+ ```tsx
203
+ <FaceRig>
204
+ <FaceSurfaceOccluder around={{ landmark: 334 }} radius={2} />
205
+ <PinToFaceMesh anchor={{ landmark: 334 }}>
206
+ <MyRing />
207
+ </PinToFaceMesh>
208
+ </FaceRig>
209
+ ```
210
+
211
+ It follows the same surface as the pins (face shape, expression, and a `FaceWarp3D` / `FaceMorph`
212
+ surface when inside one). Props: `surface`, `around` (an anchor; the whole face when omitted;
213
+ resolved for the feed like a pin's, so a named `"face.leftCheek"` covers the same cheek as the pin),
214
+ `mirrored` (default the session's), `radius` (cm, default 2.5), `renderOrder` (default `-1`, the
215
+ head occluder's tier), `debug` (a visible wireframe).
216
+
217
+ ### Pure pieces
218
+
219
+ - **`FACE_PIERCINGS`**: the presets, each with `label`, `region`, `side`, `kind`, `size` and a
220
+ `stud` and a `ring` placement (`at`, the hole in canonical cm as on an unmirrored source; `orient`;
221
+ `offset`, the piercing frame in the pin frame).
222
+ - **`resolveFacePiercing(preset, { kind, mirrored })`** gives the exact surface `anchor`, `orient`,
223
+ `offset`, `size` and `flip` (the placement is the mirror image of the left-side authoring) for a
224
+ feed.
225
+ - **`mirrorFacePiercingOffset(offset)`** and **`mirrorFacePiercingPlacement(placement)`** mirror an
226
+ offset or a placement across the face.
227
+
228
+ ## Example
229
+
230
+ `/pin-to-face-mesh` has:
231
+
232
+ - **Accessories:** a forehead gem, a brow ring, a nose stud, a star sticker on the cheek, and a beauty
233
+ mark just outside the mouth corner.
234
+ - **A custom pin with debug controls:** anchor by face target, landmark index or triangle; surface;
235
+ orient; offsets; roll; smoothing. An axes gizmo shows X red, Y green, Z blue.
236
+ - **A live point cloud** of the 468-landmark surface the pins follow.
237
+ - **The facecap character** (local, see [External Face Mesh](/api/external-face-mesh#example)), with
238
+ the accessories projected onto its skin.
239
+ - **Piercings** (off by default): a style chip (realistic gold and silver, or playful stars, hearts,
240
+ gems and candy hoops), a jewellery chip (classic, studs or rings) and a toggle per spot. URL:
241
+ `?p.nose.left=1&p.septum=1&pstyle=playful&pkind=ring`; `?pocclude=0` turns the skin patch off.
242
+
243
+ ## Manual visual test plan
244
+
245
+ Open `/pin-to-face-mesh` on the webcam.
246
+
247
+ 1. **Placement**: the gem sits mid-forehead; the ring through a brow, the stud on a nostril and the
248
+ mark just above a mouth corner, all on the screen's right (landmark / point anchors keep
249
+ MediaPipe's side: your right on the mirrored webcam); the star on your real left cheek, on the
250
+ screen's left (a named anchor, the person's own side). Each sits on the skin, not floating.
251
+ Switch to a video: the star moves to the person's left cheek, now on the screen's right; the
252
+ other pieces stay on the screen's right.
253
+ 2. **Head motion**: turn and tilt. Every piece stays on its spot. The star turns with the cheek and
254
+ shows its edge at a steep angle.
255
+ 3. **Expressions**: smile, and the star rises with the cheek. Open your mouth, and the mark follows
256
+ the corner. Raise your brows, and the ring rises.
257
+ 4. **Custom pin**: switch the anchor between face targets, landmark indices and triangles. The gizmo
258
+ jumps there, Z out of the skin. With orient "head", the gizmo keeps the head's axes. Offsets move
259
+ it in the pin frame.
260
+ 5. **Surface**: tick "show the live face surface". The dots sit on your face and move with it. With
261
+ surface "model", the pin drifts onto the canonical face.
262
+ 6. **Character**: tick "on the facecap character". Every accessory sits on the character's own skin,
263
+ nothing buried, and follows its expression.
264
+ 7. **Dropouts**: cover the camera briefly and the pins hold. Cover it longer and they hide, then snap
265
+ back.
266
+ 8. **Piercings**: turn off the accessories and press "all" under piercings. Each piece sits on its
267
+ spot: studs on the skin, the nostril ring over the rim, the septum ring below the nose, the lip
268
+ rings over the lower lip, the brow rings through the outer brows. No ring shows its inner half.
269
+ 9. **Piercing sides**: on the webcam, the left nostril piece is on the screen's left (your left).
270
+ Switch to a video and it is on the person's left, the screen's right.
271
+ 10. **Piercings through expressions**: open your mouth wide; the lip pieces follow the jaw. Raise your
272
+ brows; the brow rings rise. Turn your head; nothing slides off.
273
+ 11. **Styles**: switch realistic / playful and classic / studs / rings. With realistic, the metals
274
+ reflect. With "skin hides the inside" off, the inner half of each ring appears.
@@ -93,7 +93,10 @@ canvas sources are left alone. The pure form is
93
93
 
94
94
  ## Assets
95
95
 
96
- - GLB for every platform; keep it under a few MB, Draco / KTX2 compressed.
96
+ - GLB for every platform; keep it under a few MB. Compress with meshopt
97
+ (geometry) + WebP (textures); never Draco or KTX2. model-viewer would fetch
98
+ Draco / KTX2 decoders from Google's CDN at view time, and the same GLB fails
99
+ to load in the SDK's own model paths (`defineGltfAsset`, `MeshRenderer`).
97
100
  - USDZ for iOS Quick Look via `iosSrc`; without it model-viewer exports one
98
101
  on the fly (slower, lower fidelity). The GLB → USDZ step is a publishing
99
102
  step (see the asset pipeline issue), never runtime code.
@@ -101,7 +104,7 @@ canvas sources are left alone. The pure form is
101
104
 
102
105
  ## Manual validation
103
106
 
104
- Run `/product-ar`:
107
+ Run `/product-details?model=astronaut`:
105
108
 
106
109
  | Device | Expect |
107
110
  | ------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
@@ -275,7 +275,7 @@ one overlay paints all lips. For per-face looks, create one provider per face
275
275
 
276
276
  ## Manual visual test plan
277
277
 
278
- Run `/segmentation-overlay` in the playground and check each row with the
278
+ Run `/segmentation` in the playground and check each row with the
279
279
  region picker, on a webcam and on an image/video source:
280
280
 
281
281
  | Mask / region | Source | Expect |
package/docs/docs.json CHANGED
@@ -33,12 +33,14 @@
33
33
  "api/screen-image",
34
34
  "api/screen-text",
35
35
  "api/screen-shape",
36
+ "api/particles",
36
37
  "api/trackers",
37
38
  "api/holistic-tracker",
38
39
  "api/face-info",
39
40
  "api/iris-tracking",
40
41
  "api/face-actions",
41
42
  "api/gestures",
43
+ "api/body-triggers",
42
44
  "api/session-lifecycle",
43
45
  "api/product-ar",
44
46
  "api/product-details",
@@ -53,6 +55,28 @@
53
55
  "api/face-attribute-expression",
54
56
  "api/face-binding-anchors",
55
57
  "api/face-effects",
58
+ "api/head-occluder",
59
+ "api/hair",
60
+ "api/external-face-mesh",
61
+ "api/face-expression-controller",
62
+ "api/pin-to-face-mesh",
63
+ "api/face-reprojection",
64
+ "api/face-swap",
65
+ "api/face-morph",
66
+ "api/face-warp-3d",
67
+ "api/face-liquify",
68
+ "api/faceless",
69
+ "api/face-inset",
70
+ "api/made-up-camera",
71
+ "api/makeup",
72
+ "api/makeup-skin-tone",
73
+ "api/face-character",
74
+ "api/hand-rig",
75
+ "api/hand-touch",
76
+ "api/instructions",
77
+ "api/hand-instructions",
78
+ "api/face-instructions",
79
+ "api/body-instructions",
56
80
  "api/face-mesh",
57
81
  "api/face-painting",
58
82
  "api/face-retouching",
@@ -80,7 +104,11 @@
80
104
  {
81
105
  "group": "Creator Guides",
82
106
  "icon": "palette",
83
- "pages": ["guides/lip-effect-textures"]
107
+ "pages": [
108
+ "guides/face-atlas-textures",
109
+ "guides/lip-effect-textures",
110
+ "guides/makeup-design-textures"
111
+ ]
84
112
  },
85
113
  {
86
114
  "group": "Examples",
@@ -5,39 +5,63 @@ sidebarTitle: "Lip Shaders"
5
5
  icon: "wand-magic-sparkles"
6
6
  ---
7
7
 
8
- {/* Generated by scripts/generate-lip-shader-docs.mjs from example/src/pages/LipEffect/customMaterials.tsx. Edit the source, then re-run. */}
8
+ {/* Generated by scripts/generate-lip-shader-docs.mjs from example/src/pages/Makeup/customMaterials.tsx. Edit the source, then re-run. */}
9
9
 
10
10
  `LipEffect`'s `material` prop accepts a factory. It receives a
11
11
  `LipEffectMaterialContext` and returns a material node or a three.js material
12
12
  instance. These four examples share one component shell and differ only in
13
- their fragment shader. They are live on the example playground's `/lip-effect`
13
+ their fragment shader. They are live on the example playground's `/makeup`
14
14
  page under the material picker; the source is
15
- `example/src/pages/LipEffect/customMaterials.tsx`.
15
+ `example/src/pages/Makeup/customMaterials.tsx`.
16
16
 
17
17
  ## What every example relies on
18
18
 
19
19
  - `LIP_EFFECT_VERTEX_SHADER` from `@vincentt-xr/sdk/face-effects` provides
20
- `vUv` (canonical UV), `vFaceUv` (live camera UV), `vLipEdge` (0 at the outer
21
- ring, 1 at the mouth line), `vNormal` and `vViewDir`.
20
+ `vUv` (the face-atlas uv, `FACE_ATLAS_UVS`), `vFaceUv` (the live camera uv;
21
+ `LipEffect` keeps the `faceUv` attribute current while a custom material is
22
+ in use), `vLipEdge` (0 at the outer ring, 1 at the mouth line), `vNormal`
23
+ and `vViewDir`.
24
+ - **The face layer.** The lips draw in the opaque face layer at
25
+ `MAKEUP_RENDER_ORDER.lips` (-1.64), so hands, glasses and the head occluder
26
+ draw over them. Spread `MAKEUP_BLENDING` (premultiplied over), keep
27
+ `depthWrite={false}`, and write premultiplied colour: `writeLips(paint, c)`
28
+ below encodes the paint and multiplies it by the coverage, so opacity is
29
+ linear. A `transparent` material still draws, but in the transparent pass
30
+ after the head occluder, which can hide it.
31
+ - **Sides.** Designs are painted as on an unmirrored photo (image-left is the
32
+ person's right). `context.uniforms.uPersonLeftSign` is -1 on the mirrored
33
+ webcam, where `designUv()` reads `(1 - u, v)`. Design images load without a
34
+ colour space (the SDK never re-tags a cached texture), so `design()`
35
+ decodes their sRGB when `lipEffectDesignDecode(texture)` says so (the
36
+ built-in material's rule: not for an `SRGBColorSpace` texture, which the GPU
37
+ decodes, a linear one or a render target).
38
+ - **Presence.** `context.uniforms.uPresence` fades the lips in when the face
39
+ is found and out when it is lost; coverage multiplies by it.
22
40
  - One `uniforms` object per material, created with `useMemo` and mutated on
23
41
  each render. three.js binds the uniforms object when the program compiles,
24
- so a new object per render would be ignored.
42
+ so a new object per render would be ignored. `uPresence` and
43
+ `uPersonLeftSign` are the layer's own uniform objects, kept current by the SDK.
25
44
  - `useFrame` advances `uTime` for the animated looks.
26
- - The stencil test follows `context.maskMode`: `stencilWrite` must be true for
27
- three.js to run the comparison at all, and the keep-ops stop the material
28
- from altering the mouth stencil it tests against.
29
- - Coverage is design alpha × opacity × a feather from `vLipEdge`, read from
30
- `context.settings`, so the panel controls still apply.
45
+ - The stencil test follows `context.maskMode` on the mouth bit alone
46
+ (`stencilRef` and `stencilFuncMask` = `FACE_ATLAS_STENCIL.mouth`; the face
47
+ pre-pass owns bit 0x80). `stencilWrite` must be true for three.js to run
48
+ the comparison at all; the keep-ops and `stencilWriteMask={0}` stop the
49
+ material from altering the stencil it tests against.
50
+ - Coverage is design alpha × opacity × a feather from `vLipEdge` × presence,
51
+ read from `context.settings`, so the panel controls still apply.
31
52
 
32
53
  ```glsl
33
54
  const COMMON_HEAD = `
34
55
  uniform sampler2D cameraTexture;
35
56
  uniform sampler2D designTexture;
36
57
  uniform float useDesign;
58
+ uniform float decodeDesign;
37
59
  uniform vec3 tint;
38
60
  uniform float opacity;
39
61
  uniform float edgeSoftness;
40
62
  uniform float uTime;
63
+ uniform float uPresence;
64
+ uniform float uPersonLeftSign;
41
65
  varying vec2 vFaceUv;
42
66
  varying vec2 vUv;
43
67
  varying float vLipEdge;
@@ -57,15 +81,28 @@ float noise(vec2 p) {
57
81
  f.y
58
82
  );
59
83
  }
84
+ // Designs are painted as on an unmirrored photo: flip u on the mirrored webcam.
85
+ vec2 designUv() {
86
+ return uPersonLeftSign < 0.0 ? vec2(1.0 - vUv.x, vUv.y) : vUv;
87
+ }
88
+ vec4 design() {
89
+ vec4 texel = texture2D(designTexture, designUv());
90
+ vec3 linear = pow(max(texel.rgb, vec3(0.0)), vec3(2.2));
91
+ return vec4(mix(texel.rgb, linear, decodeDesign), texel.a);
92
+ }
60
93
  float coverage() {
61
- vec4 design = mix(vec4(1.0), texture2D(designTexture, vUv), useDesign);
94
+ vec4 art = mix(vec4(1.0), design(), useDesign);
62
95
  float fade = smoothstep(0.0, max(edgeSoftness, 1e-4), vLipEdge);
63
- return design.a * opacity * fade;
96
+ return art.a * opacity * fade * uPresence;
64
97
  }
65
98
  vec3 facing() {
66
99
  vec3 n = normalize(vNormal);
67
100
  return gl_FrontFacing ? n : -n;
68
101
  }
102
+ // Premultiplied output for MAKEUP_BLENDING: the paint covers c of the lips.
103
+ void writeLips(vec3 paint, float c) {
104
+ gl_FragColor = vec4(linearToOutputTexel(vec4(paint, 1.0)).rgb * c, c);
105
+ }
69
106
  `;
70
107
  ```
71
108
 
@@ -82,9 +119,7 @@ void main() {
82
119
  float specular = pow(max(dot(facing(), h), 0.0), 48.0);
83
120
  float pulse = 0.75 + 0.25 * sin(uTime * 2.0);
84
121
  vec3 painted = tint * (0.6 + 0.8 * dot(base, vec3(0.333)));
85
- float c = coverage();
86
- gl_FragColor = vec4(mix(base, painted, c) + specular * pulse * c, c);
87
- #include <colorspace_fragment>
122
+ writeLips(painted + specular * pulse, coverage());
88
123
  }```
89
124
 
90
125
  ## Noise texture
@@ -100,9 +135,7 @@ void main() {
100
135
  float glitter = step(0.985, hash(floor(vUv * 900.0)));
101
136
  vec3 painted = tint * (0.75 + 0.5 * grain) + glitter * 0.6;
102
137
  painted *= 0.5 + dot(base, vec3(0.333));
103
- float c = coverage();
104
- gl_FragColor = vec4(mix(base, painted, c), c);
105
- #include <colorspace_fragment>
138
+ writeLips(painted, coverage());
106
139
  }```
107
140
 
108
141
  ## Iridescence
@@ -124,9 +157,7 @@ void main() {
124
157
  vec3 painted = mix(tint, sheen, 0.55 + 0.45 * fresnel) * (0.6 + 0.8 * dot(base, vec3(0.333)));
125
158
  vec3 h = normalize(vec3(0.3, 0.6, 1.0) + v);
126
159
  float specular = pow(max(dot(n, h), 0.0), 64.0) * 0.8;
127
- float c = coverage();
128
- gl_FragColor = vec4(mix(base, painted, c) + specular * c, c);
129
- #include <colorspace_fragment>
160
+ writeLips(painted + specular, coverage());
130
161
  }```
131
162
 
132
163
  ## Time-based shimmer
@@ -143,9 +174,7 @@ void main() {
143
174
  float sparkle = smoothstep(0.96, 1.0, seed * twinkle);
144
175
  float band = smoothstep(0.08, 0.0, abs(fract(vUv.x * 2.5 - uTime * 0.25) - 0.5));
145
176
  vec3 painted = tint * (0.7 + 0.6 * dot(base, vec3(0.333))) + vec3(sparkle) + band * 0.25;
146
- float c = coverage();
147
- gl_FragColor = vec4(mix(base, painted, c), c);
148
- #include <colorspace_fragment>
177
+ writeLips(painted, coverage());
149
178
  }```
150
179
 
151
180
  ## The factory component
@@ -159,22 +188,31 @@ export const CustomLipShader = ({
159
188
  context: LipEffectMaterialContext;
160
189
  shader: CustomLipShaderKey;
161
190
  }) => {
162
- // One uniforms object for the material's lifetime; values are mutated.
191
+ // One uniforms object for the material's lifetime; values are mutated. The
192
+ // layer's presence and side sign are shared objects the SDK keeps current.
163
193
  const uniforms = useMemo(
164
194
  () => ({
165
195
  cameraTexture: { value: null as THREE.Texture | null },
166
196
  designTexture: { value: null as THREE.Texture | null },
167
197
  useDesign: { value: 0 },
198
+ decodeDesign: { value: 0 },
168
199
  tint: { value: new THREE.Color() },
169
200
  opacity: { value: 1 },
170
201
  edgeSoftness: { value: 0.12 },
171
202
  uTime: { value: 0 },
203
+ uPresence: context.uniforms.uPresence,
204
+ uPersonLeftSign: context.uniforms.uPersonLeftSign,
172
205
  }),
173
- [],
206
+ [context.uniforms],
174
207
  );
208
+ const design = context.designTexture;
175
209
  uniforms.cameraTexture.value = context.cameraTexture;
176
- uniforms.designTexture.value = context.designTexture;
177
- uniforms.useDesign.value = context.designTexture ? 1 : 0;
210
+ uniforms.designTexture.value = design;
211
+ uniforms.useDesign.value = design ? 1 : 0;
212
+ // The built-in material's rule: an image loaded without a colour space is
213
+ // decoded here; an SRGBColorSpace texture (decoded by the GPU), a linear
214
+ // one or a render target is read as is.
215
+ uniforms.decodeDesign.value = design ? lipEffectDesignDecode(design) : 0;
178
216
  uniforms.tint.value.set(context.settings.color);
179
217
  uniforms.opacity.value = context.settings.opacity;
180
218
  uniforms.edgeSoftness.value = context.settings.edgeSoftness;
@@ -188,14 +226,16 @@ export const CustomLipShader = ({
188
226
  uniforms={uniforms}
189
227
  vertexShader={LIP_EFFECT_VERTEX_SHADER}
190
228
  fragmentShader={SHADERS[shader]}
191
- transparent
229
+ {...MAKEUP_BLENDING}
192
230
  side={THREE.DoubleSide}
193
231
  depthWrite={false}
194
232
  toneMapped={false}
195
- // The stencil test only runs while stencilWrite is true; keep-ops make
196
- // it a pure comparison against the mouth stencil, writing nothing back.
233
+ // The stencil test only runs while stencilWrite is true. It reads the
234
+ // mouth bit alone; keep-ops and a zero write mask leave the buffer as it is.
197
235
  stencilWrite
198
- stencilRef={1}
236
+ stencilRef={FACE_ATLAS_STENCIL.mouth}
237
+ stencilFuncMask={FACE_ATLAS_STENCIL.mouth}
238
+ stencilWriteMask={0}
199
239
  stencilFunc={
200
240
  context.maskMode === "outer-and-inner-lips"
201
241
  ? THREE.NotEqualStencilFunc
@@ -222,3 +262,12 @@ To share one custom material across several faces, build a
222
262
  `THREE.ShaderMaterial` yourself, update its uniforms in `useFrame`, and return
223
263
  the instance from the factory (or pass it as `sharedMaterial`); the renderer
224
264
  sets a material instance on the mesh directly, so several meshes can use it.
265
+ Per-face values (`uPresence`, the skin probe) then come from one face only;
266
+ the built-in material (`useLipEffectMaterial`) reads each draw's own face.
267
+
268
+ To shade like the built-in material (against the person's skin, light and
269
+ lip colour, with the six finishes) but with other settings, return
270
+ `<LipEffectMaterial … settings={…} />` from the factory. A custom shader can
271
+ read the person's skin, light and lip colour itself: include
272
+ `FACE_SKIN_STATS_GLSL` and spread `context.skin.uniforms` into its uniforms
273
+ (see GROUNDING "Face skin probe").