@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
@@ -1,15 +1,16 @@
1
1
  ---
2
2
  title: "Lip Effect Textures"
3
- description: "How to author a design texture for LipEffect: the canvas contract, the lip UV template, orientation, mask modes, and the custom material context."
3
+ description: "How to author a design texture for LipEffect: the canvas contract, the lip template, sides, shading and finishes, mask modes, and the custom material context."
4
4
  sidebarTitle: "Lip Effect Textures"
5
5
  icon: "palette"
6
6
  ---
7
7
 
8
8
  `LipEffect` (from `@vincentt-xr/sdk/face-effects`) paints a design texture onto
9
- the lips of a tracked face. The texture lives in the **canonical face UV
10
- atlas**, but only the lip triangles are ever sampled. Everything this page
11
- describes is derived from the canonical mesh's own `uv` attribute: the mesh is
12
- the design contract, not a hand-drawn diagram.
9
+ the lips of a tracked face. The texture lives in the **face atlas**
10
+ (`FACE_ATLAS_UVS`, the canonical face model's UV layout, bundled with the
11
+ SDK), but only the lip triangles are ever sampled. Everything this page
12
+ describes is drawn from that bundled atlas data: the data the effect samples
13
+ is the design contract, not a hand-drawn diagram.
13
14
 
14
15
  ## The canvas contract
15
16
 
@@ -25,103 +26,126 @@ the design contract, not a hand-drawn diagram.
25
26
  multiplied by `color`; at `intensity={0}` the design colours show as painted.
26
27
  Paint white or light grey for a pure tint, or paint real colour and lower
27
28
  `intensity`.
29
+ - **Paint in sRGB.** Images load without a colour space and the lip material
30
+ decodes their sRGB itself; a `THREE.Texture` you tag `SRGBColorSpace` is
31
+ decoded by the GPU instead. Cached textures are never re-tagged.
28
32
  - **Image top is `v = 1`.** Textures load with `flipY`, so the top row of the
29
- image is the top of the UV atlas and the upper lip sits above the lower lip
30
- in the image, as you would expect.
33
+ image is the top of the atlas and the upper lip sits above the lower lip in
34
+ the image, as you would expect.
31
35
 
32
- ## The lip UV template
36
+ ## The lip template
33
37
 
34
- <img
35
- src="/guides/lip-uv-template.svg"
36
- alt="Lip UV template generated from the canonical face mesh"
37
- />
38
+ <img src="/guides/lip-uv-template.svg" alt="Lip template generated from the bundled face atlas" />
38
39
 
39
- The template is generated from `canonical_face_model.obj`:
40
+ The template is the face atlas guide (`createFaceAtlasGuideSvg`) for the lips
41
+ and the mouth:
40
42
 
41
- - **Solid pink ring** — the outer lip ring (MediaPipe `FACEMESH_LIPS` outer
42
- contour). This is the painted edge.
43
- - **Dashed blue ring and blue fill** — the inner lip ring and the mouth
44
- interior. In the default `outer-and-inner-lips` mask mode this area is cut
45
- out, so teeth and tongue stay clean when the mouth opens.
43
+ - **Pink outline and fill** — the lips (between MediaPipe's outer and inner
44
+ lip rings). The outer outline is the painted edge.
45
+ - **Blue outline and fill** — the mouth interior. In the default
46
+ `outer-and-inner-lips` mask mode this area is cut out, so teeth and tongue
47
+ stay clean when the mouth opens.
46
48
  - **Grey wireframe** — the lip triangles that are actually sampled.
47
- - **Orientation labels** — image **left** is the subject's **right** lip corner.
49
+ - **Side labels** — image **left** is the person's **right**, on every feed.
48
50
 
49
- Regenerate it after the canonical OBJ changes on the CDN; the script verifies
50
- the download against the hash pinned in `lib/utils/integrity.ts`:
51
+ Regenerate it after the atlas data changes (`scripts/generate-face-atlas.ts`);
52
+ it needs no download:
51
53
 
52
54
  ```bash
53
55
  pnpm dlx tsx scripts/generate-lip-uv-guide.ts --png
54
56
  ```
55
57
 
56
- ### Mirrored camera behaviour
58
+ ### Sides on every feed
57
59
 
58
- The design is always mapped in the **subject's** frame: the left edge of the
59
- lip region is the subject's right lip corner, whatever is on screen.
60
+ Paint the design as on an unmirrored photo of the person: **image-left is the
61
+ person's right**. `LipEffect` keeps those sides on every feed (GROUNDING "Left
62
+ and right"):
60
63
 
61
- - With the **webcam**, the session mirrors the feed once (selfie view), so the
62
- subject's right appears on **screen right**. The left side of your design
63
- therefore lands on the right side of the screen.
64
- - With **image or video sources**, nothing is mirrored, so the subject's right
65
- (and the left side of your design) appears on **screen left**.
64
+ - With **image, video or rear-camera sources** nothing is mirrored: the
65
+ design's left half lands on the person's right lip half, on the screen's left.
66
+ - With the **webcam** the session mirrors the feed (selfie view). The lip
67
+ material reads the design at `(1 − u, v)` there, so the design's left half
68
+ still lands on the person's own **right** lip half (on the screen's right).
66
69
 
67
- Do not add a second mirror in CSS, canvas, or a shader; see "Camera, layout,
68
- mirror, and capture parity" in `GROUNDING.md`.
70
+ The atlas is symmetric, so the flip is exact. Text therefore reads mirrored in
71
+ the selfie view, as text on a real face would. Do not add a mirror of your own
72
+ in CSS, canvas or a shader; see "Camera, layout, mirror, and capture parity"
73
+ in `GROUNDING.md`.
69
74
 
70
75
  ### Generating the guide at runtime
71
76
 
72
- The same renderer is exported, so an editor or a debug panel can draw the guide
73
- from the live mesh:
77
+ The same renderer is exported, so an editor or a debug panel can draw the
78
+ guide; it needs no mesh:
74
79
 
75
80
  ```tsx
76
81
  import {
77
82
  createLipUvGuideDataUrl,
78
83
  createLipUvGuideSvg,
79
84
  getLipUvBounds,
80
- useCanonicalFaceMesh,
81
85
  } from "@vincentt-xr/sdk/face-effects";
82
86
 
83
- const mesh = useCanonicalFaceMesh();
84
- const svg = mesh ? createLipUvGuideSvg(mesh, { size: 1024 }) : null;
85
- const zoomed = mesh ? createLipUvGuideDataUrl(mesh, { region: "lips" }) : null;
86
- const bounds = mesh ? getLipUvBounds(mesh) : null; // { minU, maxU, minV, maxV }
87
+ const svg = createLipUvGuideSvg({ size: 1024 });
88
+ const zoomed = createLipUvGuideDataUrl({ region: "lips" });
89
+ const bounds = getLipUvBounds(); // { minU, maxU, minV, maxV, mouthV }
87
90
  ```
88
91
 
89
92
  Options: `size` (canvas pixels), `region` (`"canvas"` or `"lips"`),
90
93
  `wireframe`, `labels`, `background`. `lipUvToPixel(u, v, size)` converts a UV
91
- to image pixels with the `flipY` convention.
94
+ to image pixels with the `flipY` convention. The alpha.8 calls with a parsed
95
+ mesh first (`createLipUvGuideSvg(mesh, options)`) still work and draw the same
96
+ guide.
92
97
 
93
- The example playground's `/lip-effect` page has a **Texture preview / UV
98
+ The example playground's `/makeup` page has a **Texture preview / UV
94
99
  guide** toggle: it overlays the guide on the current design texture, shows a
95
100
  zoomed crop of the lip region, and paints the template itself onto the tracked
96
- lips so the labelled rings can be checked against a real mouth.
101
+ lips so the labelled sides can be checked against a real mouth.
97
102
 
98
- ## Presets and material controls
103
+ ## Presets, finishes and shading
99
104
 
100
105
  `LipEffect` takes flat, serializable settings (`LipEffectSettings`). Start from
101
106
  a preset and override what you need; explicit props always win over the preset:
102
107
 
103
108
  ```tsx
104
- <LipEffect preset="matte" color="#8b2635" designTexture="/lips/matte.png" />
109
+ <LipEffect preset="matte" shade="brick" designTexture="/lips/matte.png" />
105
110
  ```
106
111
 
107
- | Preset | Look |
108
- | ---------- | --------------------------------------------------------------- |
109
- | `lipstick` | Opaque colour with a soft highlight |
110
- | `gloss` | Translucent colour with a strong, tight highlight |
111
- | `matte` | Opaque, no highlight, heavy skin shading |
112
- | `tint` | Sheer wash of colour that keeps the natural lip |
113
- | `metallic` | Full-strength, tight gold-tinted highlight |
114
- | `gradient` | Ombre: strong colour at the mouth line fading at the outer edge |
115
-
116
- Controls: `color`, `opacity`, `intensity` (0 shows the design as painted, 1
117
- multiplies it by `color`), `shading` (how much the camera's own lip light and
118
- shadow show through), `gloss` and `roughness` (highlight amount and spread),
119
- `highlightColor`, and `gradientColor` with `gradientAmount`. Without a
120
- `designTexture` the lips are filled with `color`, so every preset works on its
121
- own.
112
+ | Preset | Finish | Look |
113
+ | ---------- | -------- | --------------------------------------------------------------- |
114
+ | `lipstick` | satin | Opaque colour with a soft sheen |
115
+ | `gloss` | gloss | Translucent colour with a strong, wet highlight |
116
+ | `matte` | matte | Opaque, the lips' own shine removed |
117
+ | `tint` | matte | Sheer wash of colour that keeps the natural lip |
118
+ | `metallic` | metallic | A highlight tinted by the shade, gold-tinted extra highlight |
119
+ | `gradient` | satin | Ombre: strong colour at the mouth line fading at the outer edge |
120
+ | `shimmer` | shimmer | Fine flakes over a satin colour |
121
+ | `glitter` | glitter | Sparse, large flakes over a sheer colour |
122
+
123
+ Pick a colour by name with `shade` (`MAKEUP_SHADES.lips`: `nude`, `rosewood`,
124
+ `mauve`, `softPink`, `coral`, `peach`, `classicRed`, `brick`, `berry`, `plum`,
125
+ `wine`, `chocolate`; or `"auto"` for the person's own lip colour, deepened,
126
+ measured on the GPU). A `color` that differs from the shade wins. `finish`
127
+ (`matte`, `satin`, `gloss`, `shimmer`, `metallic`, `glitter`) sets `shine` and
128
+ the sparkle fields (`sparkleColor`, `sparkleDensity`, `sparkleSize`);
129
+ `coverage` runs from sheer (0: filters the lips' own colour and never lightens
130
+ them) to opaque (1: covers them); `enabled={false}` draws nothing.
131
+
132
+ **Shading.** The paint is shaded by the makeup core against the person's own
133
+ skin, light and lip colour (`useFaceSkin`), so the same shade looks the same on
134
+ every skin tone and follows the room's light: the lips' own shadow and
135
+ highlights, a lamp switched off, a warm or cool cast. `shading` sets how much
136
+ of that light the paint follows: 1 (the default) fully, 0 flattens the opaque
137
+ part (the shade as picked, with only the finish's own highlight). A sheer part
138
+ (`coverage` below 1) still filters the live lips, so their own light and
139
+ texture show through; set `coverage: 1` as well for a fully flat fill.
140
+
141
+ Other controls: `opacity` (linear: 0.8 paints 80 %), `intensity` (0 shows the
142
+ design as painted, 1 multiplies it by `color`), `gloss`, `roughness` and
143
+ `highlightColor` (an extra lip highlight on top of the finish: amount, spread,
144
+ colour), and `gradientColor` with `gradientAmount`. Without a `designTexture`
145
+ the lips are filled with `color`, so every preset works on its own.
122
146
 
123
147
  The `LipEffectSettingsPanel` from `@vincentt-xr/sdk/debug-ui` edits all of these
124
- live, including the mask mode and the texture transform, and the `/lip-effect`
148
+ live, including the mask mode and the texture transform, and the `/makeup`
125
149
  example page mounts it next to the design-texture picker.
126
150
 
127
151
  ## Procedural colour, edges, inner lip and split lips
@@ -130,7 +154,8 @@ example page mounts it next to the design-texture picker.
130
154
  `colorMode="solid"` to ignore one, and the lips are filled with `color`.
131
155
  Add `gradientColor` with `gradientAmount` and pick `gradientDirection`:
132
156
  `outward` runs from the mouth line to the outer edge, `vertical` and
133
- `horizontal` span the lip box.
157
+ `horizontal` span the lip box (`horizontal` from the person's right corner
158
+ to their left).
134
159
  - **Edge softness.** `edgeSoftness` feathers the outer lip boundary as a
135
160
  fraction of the lip band (default `0.12`; `0` is a hard polygon edge). It
136
161
  uses the mesh's own band position, so it follows the tracked lip shape.
@@ -140,7 +165,7 @@ example page mounts it next to the design-texture picker.
140
165
  - **Separate lower lip.** Turn on `splitLips` to give the lower lip its own
141
166
  `lowerLipColor` and `lowerLipOpacity`, and pass `lowerDesignTexture` for a
142
167
  separate texture (it falls back to `designTexture`). The split happens at the
143
- mouth line of the canonical UV atlas with a thin blend at the corners.
168
+ mouth line of the atlas with a thin blend at the corners.
144
169
 
145
170
  ## Texture transform
146
171
 
@@ -153,17 +178,17 @@ A design that does not line up can be fitted without repainting:
153
178
  | `textureRotation` | Degrees, counter-clockwise as seen on the face |
154
179
  | `textureFlipX`, `textureFlipY` | Mirror across the lip centre |
155
180
 
156
- The transform is applied to the sampled UV, so the gradient and the mask are
157
- unaffected. `createLipTextureTransform(settings, bounds)` returns the same
158
- `Matrix3` the shader uses if a custom material wants it.
181
+ The transform is applied to the sampled UV, in the design's own (person-side)
182
+ frame, so the gradient and the mask are unaffected.
183
+ `createLipTextureTransform(settings, bounds)` returns the same `Matrix3` the
184
+ shader uses if a custom material wants it.
159
185
 
160
186
  ## Downloading the template
161
187
 
162
- The `/lip-effect` page has **Download SVG** and **Download PNG** buttons that
163
- export the guide at 2048 px straight from the loaded mesh. In code,
164
- `createLipUvGuideSvg(mesh, { size })` returns the SVG string and
165
- `createLipUvGuidePngBlob(mesh, { size })` resolves to a PNG `Blob` (browser
166
- only). The shipped copies are `docs/guides/lip-uv-template.svg` and
188
+ The `/makeup` page has **Download SVG** and **Download PNG** buttons that
189
+ export the guide at 2048 px. In code, `createLipUvGuideSvg({ size })` returns
190
+ the SVG string and `createLipUvGuidePngBlob({ size })` resolves to a PNG `Blob`
191
+ (browser only). The shipped copies are `docs/guides/lip-uv-template.svg` and
167
192
  `docs/guides/lip-uv-template.png`.
168
193
 
169
194
  ## Mask modes
@@ -173,10 +198,20 @@ only). The shipped copies are `docs/guides/lip-uv-template.svg` and
173
198
  ```
174
199
 
175
200
  - `outer-and-inner-lips` (default) — paint the lip surface only. The mouth
176
- interior writes the shared stencil buffer and the lip material skips it.
201
+ interior sets the mouth stencil bit (`FACE_ATLAS_STENCIL.mouth`, 0x01) and
202
+ the lip material skips those pixels.
177
203
  - `outer-lips` — paint everything inside the outer ring, mouth interior
178
204
  included.
179
205
 
206
+ ## Draw order
207
+
208
+ The lips draw in the opaque face layer at `MAKEUP_RENDER_ORDER.lips` (-1.64):
209
+ after `FaceRetouch`, the face effects and the other makeup regions, before
210
+ `FaceInset`, the head occluder and accessories. Hands (`HandCutout`) and
211
+ glasses draw over the lips, and on a turned head the far half of the lips
212
+ stops at the nose (the face's self-occlusion pass, on the high and medium
213
+ quality tiers).
214
+
180
215
  ## Several faces and performance
181
216
 
182
217
  `LipEffects` renders one lip effect per face slot. Pass one config for every
@@ -192,18 +227,27 @@ face or a picker per face:
192
227
  />
193
228
  ```
194
229
 
195
- With a single config the faces share one built-in material. The material is a
196
- plain three.js object underneath: `useLipEffectMaterial(inputs)` returns one you
197
- can pass as `sharedMaterial` to any number of `LipEffect`s, or return from a
198
- `material` factory. `maxUpdateFps` caps how often the lip mesh follows the
199
- landmarks, and `<XRProvider perf={{ targetFps, camRes }}>` lowers the tracking
200
- rate and the analysed camera resolution for the whole session.
230
+ With a single config the faces share one built-in material; each draw still
231
+ reads its own face (fade, skin, light). The material is a plain three.js
232
+ object underneath: `useLipEffectMaterial(inputs)` returns one you can pass as
233
+ `sharedMaterial` to any number of `LipEffect`s, or return from a `material`
234
+ factory. `LipEffect` needs no `FaceTracker`: it starts the face model itself
235
+ (`numFaces`; `LipEffects` asks for `maxFaces`). A `FaceTracker` mounted beside
236
+ it in the same commit starts the model first, with its own `numFaces` and
237
+ `targetFps`; one that mounts later (under a later `Suspense`) does not, so
238
+ give the lips the same `numFaces`. `holdMs` is the face's: every layer on it
239
+ shares one hold, and the largest `holdMs` asked for wins (a `FaceRig` above
240
+ keeps its own). The lips ride the face's
241
+ shared surface, which every makeup layer on that face shares (one landmark
242
+ update and one skin probe per face); `maxUpdateFps` and `predictMs` are
243
+ deprecated and ignored. `<XRProvider perf={{ targetFps, camRes }}>` lowers the
244
+ tracking rate and the analysed camera resolution for the whole session.
201
245
 
202
246
  ## Custom materials
203
247
 
204
248
  `material` accepts a React material node or a factory. The factory receives a
205
- stable context and is called once per lip geometry group (plus the mouth
206
- interior in `outer-lips` mode), only after the canonical mesh has loaded:
249
+ stable context and is called for the lips (plus the mouth interior in
250
+ `outer-lips` mode):
207
251
 
208
252
  ```ts
209
253
  type LipEffectMaterialContext = {
@@ -211,11 +255,15 @@ type LipEffectMaterialContext = {
211
255
  designTexture: THREE.Texture | null;
212
256
  faceUv: THREE.BufferAttribute;
213
257
  lipEdge: THREE.BufferAttribute;
258
+ restPosition: THREE.BufferAttribute;
214
259
  lowerDesignTexture: THREE.Texture | null;
215
260
  faceIndex: number;
216
261
  maskMode: LipMaskMode;
217
262
  lipUvBounds: LipUvBounds;
218
263
  settings: LipEffectSettings;
264
+ personLeftSign: 1 | -1;
265
+ skin: FaceSkinReference;
266
+ uniforms: FaceAtlasUniforms & FaceSkinUniforms;
219
267
  };
220
268
  ```
221
269
 
@@ -224,18 +272,32 @@ outer ring, `1` on the mouth line. It is bound as `attribute float lipEdge`
224
272
  and is what the built-in material uses for feathering, the outward gradient
225
273
  and the inner-lip tint. `lipUvBounds.mouthV` is the mouth line in UV space.
226
274
 
227
- `faceUv` is the live per-vertex camera-texture UV. It is already bound to the
228
- geometry, so a custom vertex shader reads it as `attribute vec2 faceUv`; the
229
- attribute object is exposed for uniforms, debugging, or readback.
275
+ `faceUv` is the live per-vertex camera-texture UV, bound as `attribute vec2
276
+ faceUv` and kept current while a custom material is in use. `restPosition` is
277
+ the canonical position in cm. `personLeftSign` is −1 on the mirrored webcam:
278
+ read the design at `(1 − u, v)` there. `uniforms` holds the layer's
279
+ `uPresence` (spread it to fade with the face), `uPersonLeftSign` and the face's
280
+ live skin probe uniforms (`skin.uniforms`: `uSkinStats`, `uSkinStatsPacked`,
281
+ `uSkinMap`, `uSkinLod`, `uSkinSqrt`), so spreading `uniforms` whole is enough;
282
+ `skin` is the face's skin probe.
283
+
284
+ Draw in the face layer: spread `MAKEUP_BLENDING`, keep `depthWrite={false}`
285
+ and write premultiplied colour (`rgb × coverage, coverage`); a `transparent`
286
+ material draws in the later transparent pass, where the head occluder can
287
+ hide it.
230
288
 
231
289
  ```tsx
232
290
  <LipEffect
233
291
  designTexture={texture}
234
- material={({ cameraTexture, designTexture, maskMode }) => (
292
+ material={({ cameraTexture, designTexture, maskMode, uniforms }) => (
235
293
  <shaderMaterial
236
294
  uniforms={{
237
295
  cameraTexture: { value: cameraTexture },
238
296
  designTexture: { value: designTexture },
297
+ // 1: decode the design's sRGB here (the built-in material's rule).
298
+ decodeDesign: { value: designTexture ? lipEffectDesignDecode(designTexture) : 0 },
299
+ uPresence: uniforms.uPresence,
300
+ uPersonLeftSign: uniforms.uPersonLeftSign,
239
301
  }}
240
302
  vertexShader={`
241
303
  attribute vec2 faceUv;
@@ -246,16 +308,22 @@ attribute object is exposed for uniforms, debugging, or readback.
246
308
  }`}
247
309
  fragmentShader={`
248
310
  uniform sampler2D cameraTexture; uniform sampler2D designTexture;
311
+ uniform float decodeDesign; uniform float uPresence; uniform float uPersonLeftSign;
249
312
  varying vec2 vFaceUv; varying vec2 vUv;
250
313
  void main() {
251
- vec4 design = texture2D(designTexture, vUv);
314
+ vec2 uv = uPersonLeftSign < 0.0 ? vec2(1.0 - vUv.x, vUv.y) : vUv;
315
+ vec4 design = texture2D(designTexture, uv);
316
+ vec3 paint = mix(design.rgb, pow(max(design.rgb, vec3(0.0)), vec3(2.2)), decodeDesign);
252
317
  vec3 skin = texture2D(cameraTexture, vFaceUv).rgb;
253
- gl_FragColor = vec4(skin * design.rgb, design.a);
318
+ float c = design.a * uPresence;
319
+ gl_FragColor = vec4(linearToOutputTexel(vec4(skin * paint, 1.0)).rgb * c, c);
254
320
  }`}
255
- transparent
321
+ {...MAKEUP_BLENDING}
256
322
  depthWrite={false}
257
323
  stencilWrite
258
- stencilRef={1}
324
+ stencilRef={FACE_ATLAS_STENCIL.mouth}
325
+ stencilFuncMask={FACE_ATLAS_STENCIL.mouth}
326
+ stencilWriteMask={0}
259
327
  stencilFunc={
260
328
  maskMode === "outer-and-inner-lips" ? THREE.NotEqualStencilFunc : THREE.AlwaysStencilFunc
261
329
  }
@@ -269,24 +337,32 @@ attribute object is exposed for uniforms, debugging, or readback.
269
337
 
270
338
  Four complete factories (animated gloss, noise texture, iridescence, time-based
271
339
  shimmer) are documented in [Lip Shader Examples](/examples/lip-shaders) and run
272
- on the `/lip-effect` page.
340
+ on the `/makeup` page; they use `LIP_EFFECT_VERTEX_SHADER`, which provides
341
+ `vUv`, `vFaceUv`, `vLipEdge`, `vNormal` and `vViewDir`.
273
342
 
274
343
  Honour `maskMode` with the stencil test shown above; that is exactly what the
275
- built-in `LipEffectMaterial` does through its `subtractMouth` prop. Note that
276
- three.js only evaluates `stencilFunc` while `stencilWrite` is true, so keep it
277
- on and use the keep-ops: the material then compares against the mouth stencil
278
- without ever writing to it. The lip triangles already exclude the mouth cavity,
279
- so the stencil is the guard for anything that reaches past them. It is
280
- exported so you can reuse the default shader with different settings:
344
+ built-in `LipEffectMaterial` does through its `subtractMouth` prop. three.js
345
+ only evaluates `stencilFunc` while `stencilWrite` is true, so keep it on and
346
+ use the keep-ops and a zero write mask: the material then compares the mouth
347
+ bit without ever writing to the stencil (the face's self-occlusion pass owns
348
+ bit 0x80, so always test with `stencilFuncMask={FACE_ATLAS_STENCIL.mouth}`).
349
+ The built-in material is exported so you can reuse it with different settings.
350
+ It never reads the camera uv per vertex, so pass `faceUv={false}` with a factory
351
+ that returns it (a factory cannot be inspected in advance; a
352
+ `<LipEffectMaterial>` node or a `useLipEffectMaterial` instance passed directly
353
+ needs nothing):
281
354
 
282
355
  ```tsx
283
- material={(context) => (
284
- <LipEffectMaterial
285
- cameraTexture={context.cameraTexture}
286
- designTexture={context.designTexture}
287
- settings={resolveLipEffectSettings({ ...context.settings, preset: "metallic" })}
288
- lipUvBounds={context.lipUvBounds}
289
- subtractMouth={context.maskMode === "outer-and-inner-lips"}
290
- />
291
- )}
356
+ <LipEffect
357
+ faceUv={false}
358
+ material={(context) => (
359
+ <LipEffectMaterial
360
+ cameraTexture={context.cameraTexture}
361
+ designTexture={context.designTexture}
362
+ settings={resolveLipEffectSettings({ ...context.settings, preset: "metallic" })}
363
+ lipUvBounds={context.lipUvBounds}
364
+ subtractMouth={context.maskMode === "outer-and-inner-lips"}
365
+ />
366
+ )}
367
+ />
292
368
  ```
Binary file
@@ -1 +1 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" width="1024" height="1024" viewBox="0 0 1024 1024"><rect x="1.28" y="1.28" width="1021.44" height="1021.44" fill="none" stroke="#cbd5e1" stroke-width="2.56"/><path d="M540.93,666.01L511.98,668.19L539.77,682.19ZM483.07,666.01L484.23,682.19L511.98,668.19ZM512.02,682.22L539.77,682.19L511.98,668.19ZM512.02,682.22L511.98,668.19L484.23,682.19ZM540.93,666.01L539.77,682.19L573.66,673ZM483.07,666.01L450.34,673L484.23,682.19ZM566.45,684.57L573.66,673L539.77,682.19ZM457.55,684.57L484.23,682.19L450.34,673ZM573.66,673L566.45,684.57L599.43,682.54ZM450.34,673L424.57,682.54L457.55,684.57ZM591.09,690.06L599.43,682.54L566.45,684.57ZM432.91,690.06L457.55,684.57L424.57,682.54ZM591.09,690.06L613.64,697.41L599.43,682.54ZM432.91,690.06L424.57,682.54L410.36,697.41ZM622.18,693.97L599.43,682.54L613.64,697.41ZM401.82,693.97L410.36,697.41L424.57,682.54ZM584.94,699.08L582.49,708.98L607.44,702.13ZM439.06,699.08L416.55,702.13L441.51,708.98ZM600.69,708.98L607.44,702.13L582.49,708.98ZM423.31,708.98L441.51,708.98L416.55,702.13ZM611.29,723.5L618.39,727.26L626.58,710.62ZM412.71,723.5L397.42,710.62L405.61,727.26ZM632.86,711.38L626.58,710.62L618.39,727.26ZM391.14,711.38L405.61,727.26L397.42,710.62ZM590.68,728.93L595.65,737.34L611.29,723.5ZM433.32,728.93L412.71,723.5L428.35,737.34ZM618.39,727.26L611.29,723.5L595.65,737.34ZM405.61,727.26L428.35,737.34L412.71,723.5ZM568.49,748.33L595.65,737.34L566.16,732.99ZM455.51,748.33L457.84,732.99L428.35,737.34ZM590.68,728.93L566.16,732.99L595.65,737.34ZM433.32,728.93L428.35,737.34L457.84,732.99ZM511.98,754.71L540.34,753.9L511.98,736.65ZM511.98,754.71L511.98,736.65L483.66,753.9ZM539.56,735.09L511.98,736.65L540.34,753.9ZM484.44,735.09L483.66,753.9L511.98,736.65ZM604.54,718.67L622.17,710.86L600.88,712.09ZM419.46,718.67L423.12,712.09L401.81,710.86ZM610.68,710.61L600.88,712.09L622.17,710.86ZM413.32,710.61L401.81,710.86L423.12,712.09ZM626.58,710.62L622.17,710.86L611.29,723.5ZM397.42,710.62L412.71,723.5L401.81,710.86ZM604.54,718.67L611.29,723.5L622.17,710.86ZM419.46,718.67L401.81,710.86L412.71,723.5ZM539.77,682.19L538.47,696.52L566.45,684.57ZM484.23,682.19L457.55,684.57L485.53,696.52ZM562.82,697.2L566.45,684.57L538.47,696.52ZM461.18,697.2L485.53,696.52L457.55,684.57ZM566.45,684.57L562.82,697.2L591.09,690.06ZM457.55,684.57L432.91,690.06L461.18,697.2ZM584.94,699.08L591.09,690.06L562.82,697.2ZM439.06,699.08L461.18,697.2L432.91,690.06ZM591.09,690.06L584.94,699.08L613.64,697.41ZM432.91,690.06L410.36,697.41L439.06,699.08ZM607.44,702.13L613.64,697.41L584.94,699.08ZM416.55,702.13L439.06,699.08L410.36,697.41ZM587.29,720.42L590.68,728.93L604.54,718.67ZM436.71,720.42L419.46,718.67L433.32,728.93ZM611.29,723.5L604.54,718.67L590.68,728.93ZM412.71,723.5L433.32,728.93L419.46,718.67ZM566.16,732.99L590.68,728.93L565.23,721.54ZM457.84,732.99L458.77,721.54L433.32,728.93ZM587.29,720.42L565.23,721.54L590.68,728.93ZM436.71,720.42L433.32,728.93L458.77,721.54ZM511.98,736.65L539.56,735.09L511.98,722.88ZM511.98,736.65L511.98,722.88L484.44,735.09ZM539.52,721.54L511.98,722.88L539.56,735.09ZM484.48,721.54L484.44,735.09L511.98,722.88ZM511.98,722.88L539.52,721.54L511.98,711.96ZM511.98,722.88L511.98,711.96L484.48,721.54ZM539.61,711.96L511.98,711.96L539.52,721.54ZM484.39,711.96L484.48,721.54L511.98,711.96ZM564.57,711.96L565.23,721.54L585.79,711.96ZM459.43,711.96L438.21,711.96L458.77,721.54ZM587.29,720.42L585.79,711.96L565.23,721.54ZM436.71,720.42L458.77,721.54L438.21,711.96ZM600.88,712.09L585.79,711.96L604.54,718.67ZM423.12,712.09L419.46,718.67L438.21,711.96ZM587.29,720.42L604.54,718.67L585.79,711.96ZM436.71,720.42L438.21,711.96L419.46,718.67ZM562.82,697.2L560.97,708.98L584.94,699.08ZM461.18,697.2L439.06,699.08L463.03,708.98ZM582.49,708.98L584.94,699.08L560.97,708.98ZM441.51,708.98L463.03,708.98L439.06,699.08ZM538.47,696.52L537.2,708.98L562.82,697.2ZM485.53,696.52L461.18,697.2L486.8,708.98ZM560.97,708.98L562.82,697.2L537.2,708.98ZM463.03,708.98L486.8,708.98L461.18,697.2ZM607.44,702.13L600.69,708.98L622.17,710.86ZM416.55,702.13L401.81,710.86L423.31,708.98ZM610.68,710.61L622.17,710.86L600.69,708.98ZM413.32,710.61L423.31,708.98L401.81,710.86ZM512.02,682.22L512.02,695.53L539.77,682.19ZM512.02,682.22L484.23,682.19L512.02,695.53ZM538.47,696.52L539.77,682.19L512.02,695.53ZM485.53,696.52L512.02,695.53L484.23,682.19ZM512.02,695.53L512.02,708.96L538.47,696.52ZM512.02,695.53L485.53,696.52L512.02,708.96ZM537.2,708.98L538.47,696.52L512.02,708.96ZM486.8,708.98L512.02,708.96L485.53,696.52ZM539.52,721.54L565.23,721.54L539.61,711.96ZM484.48,721.54L484.39,711.96L458.77,721.54ZM564.57,711.96L539.61,711.96L565.23,721.54ZM459.43,711.96L458.77,721.54L484.39,711.96ZM539.56,735.09L566.16,732.99L539.52,721.54ZM484.44,735.09L484.48,721.54L457.84,732.99ZM565.23,721.54L539.52,721.54L566.16,732.99ZM458.77,721.54L457.84,732.99L484.48,721.54ZM540.34,753.9L568.49,748.33L539.56,735.09ZM483.66,753.9L484.44,735.09L455.51,748.33ZM566.16,732.99L539.56,735.09L568.49,748.33ZM457.84,732.99L455.51,748.33L484.44,735.09ZM613.64,697.41L607.44,702.13L626.58,710.62ZM410.36,697.41L397.42,710.62L416.55,702.13ZM622.17,710.86L626.58,710.62L607.44,702.13ZM401.81,710.86L416.55,702.13L397.42,710.62ZM613.64,697.41L626.58,710.62L622.18,693.97ZM410.36,697.41L401.82,693.97L397.42,710.62ZM632.86,711.38L622.18,693.97L626.58,710.62ZM391.14,711.38L397.42,710.62L401.82,693.97Z" fill="#e85d75" fill-opacity="0.08" stroke="#94a3b8" stroke-width="1.28" stroke-linejoin="round"/><path d="M610.68,710.61L600.69,708.98L600.88,712.09ZM413.32,710.61L423.12,712.09L423.31,708.98ZM511.98,711.96L539.61,711.96L512.02,708.96ZM511.98,711.96L512.02,708.96L484.39,711.96ZM537.2,708.98L512.02,708.96L539.61,711.96ZM486.8,708.98L484.39,711.96L512.02,708.96ZM539.61,711.96L564.57,711.96L537.2,708.98ZM484.39,711.96L486.8,708.98L459.43,711.96ZM560.97,708.98L537.2,708.98L564.57,711.96ZM463.03,708.98L459.43,711.96L486.8,708.98ZM564.57,711.96L585.79,711.96L560.97,708.98ZM459.43,711.96L463.03,708.98L438.21,711.96ZM582.49,708.98L560.97,708.98L585.79,711.96ZM441.51,708.98L438.21,711.96L463.03,708.98ZM585.79,711.96L600.88,712.09L582.49,708.98ZM438.21,711.96L441.51,708.98L423.12,712.09ZM600.69,708.98L582.49,708.98L600.88,712.09ZM423.31,708.98L423.12,712.09L441.51,708.98Z" fill="#2563eb" fill-opacity="0.25" stroke="none"/><polygon points="391.14,711.38 405.61,727.26 428.35,737.34 455.51,748.33 483.66,753.9 511.98,754.71 540.34,753.9 568.49,748.33 595.65,737.34 618.39,727.26 632.86,711.38 622.18,693.97 599.43,682.54 573.66,673 540.93,666.01 511.98,668.19 483.07,666.01 450.34,673 424.57,682.54 401.82,693.97" fill="none" stroke="#e85d75" stroke-width="2.56" stroke-linejoin="round"/><polygon points="413.32,710.61 423.12,712.09 438.21,711.96 459.43,711.96 484.39,711.96 511.98,711.96 539.61,711.96 564.57,711.96 585.79,711.96 600.88,712.09 610.68,710.61 600.69,708.98 582.49,708.98 560.97,708.98 537.2,708.98 512.02,708.96 486.8,708.98 463.03,708.98 441.51,708.98 423.31,708.98" fill="none" stroke="#2563eb" stroke-width="2.56" stroke-dasharray="7.68 5.12" stroke-linejoin="round"/><text x="378.85" y="710.36" text-anchor="end" font-family="ui-monospace, SFMono-Regular, Menlo, monospace" font-size="16.38" fill="#0f172a">subject's RIGHT ▸</text><text x="645.15" y="710.36" text-anchor="start" font-family="ui-monospace, SFMono-Regular, Menlo, monospace" font-size="16.38" fill="#0f172a">◂ subject's LEFT</text><text x="512" y="653.73" text-anchor="middle" font-family="ui-monospace, SFMono-Regular, Menlo, monospace" font-size="16.38" fill="#0f172a">upper lip (outer ring = painted edge)</text><text x="512" y="783.38" text-anchor="middle" font-family="ui-monospace, SFMono-Regular, Menlo, monospace" font-size="16.38" fill="#0f172a">lower lip · dashed ring = mouth interior, hidden in outer-and-inner-lips mode</text><text x="512" y="804.68" text-anchor="middle" font-family="ui-monospace, SFMono-Regular, Menlo, monospace" font-size="16.38" fill="#0f172a">lip region: u 0.38–0.62, v 0.26–0.35 (image x 38–62%, y 65–74%)</text><text x="25.6" y="41.98" text-anchor="start" font-family="ui-monospace, SFMono-Regular, Menlo, monospace" font-size="16.38" fill="#0f172a" font-weight="bold">Lip UV template — canonical face UV atlas</text><text x="25.6" y="63.28" text-anchor="start" font-family="ui-monospace, SFMono-Regular, Menlo, monospace" font-size="16.38" fill="#0f172a">1024×1024 canvas, same layout as Canonical_Face_Color.png.</text><text x="25.6" y="84.58" text-anchor="start" font-family="ui-monospace, SFMono-Regular, Menlo, monospace" font-size="16.38" fill="#0f172a">Only the lip triangles are sampled; transparent pixels leave the skin untouched.</text><text x="25.6" y="105.88" text-anchor="start" font-family="ui-monospace, SFMono-Regular, Menlo, monospace" font-size="16.38" fill="#0f172a">Image LEFT = subject's RIGHT (screen-right on a mirrored webcam view).</text><text x="25.6" y="998.4" text-anchor="start" font-family="ui-monospace, SFMono-Regular, Menlo, monospace" font-size="16.38" fill="#0f172a">generated from canonical_face_model.obj uv attributes</text></svg>
1
+ <svg xmlns="http://www.w3.org/2000/svg" width="1024" height="1024" viewBox="0 0 1024 1024"><rect x="1.28" y="1.28" width="1021.44" height="1021.44" fill="none" stroke="#cbd5e1" stroke-width="2.56"/><path d="M540.93,666.01L511.98,668.19L539.77,682.19ZM483.07,666.01L484.23,682.19L511.98,668.19ZM512.02,682.22L539.77,682.19L511.98,668.19ZM512.02,682.22L511.98,668.19L484.23,682.19ZM540.93,666.01L539.77,682.19L573.66,673ZM483.07,666.01L450.34,673L484.23,682.19ZM566.45,684.57L573.66,673L539.77,682.19ZM457.55,684.57L484.23,682.19L450.34,673ZM573.66,673L566.45,684.57L599.43,682.54ZM450.34,673L424.57,682.54L457.55,684.57ZM591.09,690.06L599.43,682.54L566.45,684.57ZM432.91,690.06L457.55,684.57L424.57,682.54ZM591.09,690.06L613.64,697.41L599.43,682.54ZM432.91,690.06L424.57,682.54L410.36,697.41ZM622.18,693.97L599.43,682.54L613.64,697.41ZM401.82,693.97L410.36,697.41L424.57,682.54ZM584.94,699.08L582.49,708.98L607.44,702.13ZM439.06,699.08L416.55,702.13L441.51,708.98ZM600.69,708.98L607.44,702.13L582.49,708.98ZM423.31,708.98L441.51,708.98L416.55,702.13ZM611.29,723.5L618.39,727.26L626.58,710.62ZM412.71,723.5L397.42,710.62L405.61,727.26ZM632.86,711.38L626.58,710.62L618.39,727.26ZM391.14,711.38L405.61,727.26L397.42,710.62ZM590.68,728.93L595.65,737.34L611.29,723.5ZM433.32,728.93L412.71,723.5L428.35,737.34ZM618.39,727.26L611.29,723.5L595.65,737.34ZM405.61,727.26L428.35,737.34L412.71,723.5ZM568.49,748.33L595.65,737.34L566.16,732.99ZM455.51,748.33L457.84,732.99L428.35,737.34ZM590.68,728.93L566.16,732.99L595.65,737.34ZM433.32,728.93L428.35,737.34L457.84,732.99ZM511.98,754.71L540.34,753.9L511.98,736.65ZM511.98,754.71L511.98,736.65L483.66,753.9ZM539.56,735.09L511.98,736.65L540.34,753.9ZM484.44,735.09L483.66,753.9L511.98,736.65ZM604.54,718.67L622.17,710.86L600.88,712.09ZM419.46,718.67L423.12,712.09L401.81,710.86ZM610.68,710.61L600.88,712.09L622.17,710.86ZM413.32,710.61L401.81,710.86L423.12,712.09ZM626.58,710.62L622.17,710.86L611.29,723.5ZM397.42,710.62L412.71,723.5L401.81,710.86ZM604.54,718.67L611.29,723.5L622.17,710.86ZM419.46,718.67L401.81,710.86L412.71,723.5ZM539.77,682.19L538.47,696.52L566.45,684.57ZM484.23,682.19L457.55,684.57L485.53,696.52ZM562.82,697.2L566.45,684.57L538.47,696.52ZM461.18,697.2L485.53,696.52L457.55,684.57ZM566.45,684.57L562.82,697.2L591.09,690.06ZM457.55,684.57L432.91,690.06L461.18,697.2ZM584.94,699.08L591.09,690.06L562.82,697.2ZM439.06,699.08L461.18,697.2L432.91,690.06ZM591.09,690.06L584.94,699.08L613.64,697.41ZM432.91,690.06L410.36,697.41L439.06,699.08ZM607.44,702.13L613.64,697.41L584.94,699.08ZM416.55,702.13L439.06,699.08L410.36,697.41ZM587.29,720.42L590.68,728.93L604.54,718.67ZM436.71,720.42L419.46,718.67L433.32,728.93ZM611.29,723.5L604.54,718.67L590.68,728.93ZM412.71,723.5L433.32,728.93L419.46,718.67ZM566.16,732.99L590.68,728.93L565.23,721.54ZM457.84,732.99L458.77,721.54L433.32,728.93ZM587.29,720.42L565.23,721.54L590.68,728.93ZM436.71,720.42L433.32,728.93L458.77,721.54ZM511.98,736.65L539.56,735.09L511.98,722.88ZM511.98,736.65L511.98,722.88L484.44,735.09ZM539.52,721.54L511.98,722.88L539.56,735.09ZM484.48,721.54L484.44,735.09L511.98,722.88ZM511.98,722.88L539.52,721.54L511.98,711.96ZM511.98,722.88L511.98,711.96L484.48,721.54ZM539.61,711.96L511.98,711.96L539.52,721.54ZM484.39,711.96L484.48,721.54L511.98,711.96ZM564.57,711.96L565.23,721.54L585.79,711.96ZM459.43,711.96L438.21,711.96L458.77,721.54ZM587.29,720.42L585.79,711.96L565.23,721.54ZM436.71,720.42L458.77,721.54L438.21,711.96ZM600.88,712.09L585.79,711.96L604.54,718.67ZM423.12,712.09L419.46,718.67L438.21,711.96ZM587.29,720.42L604.54,718.67L585.79,711.96ZM436.71,720.42L438.21,711.96L419.46,718.67ZM562.82,697.2L560.97,708.98L584.94,699.08ZM461.18,697.2L439.06,699.08L463.03,708.98ZM582.49,708.98L584.94,699.08L560.97,708.98ZM441.51,708.98L463.03,708.98L439.06,699.08ZM538.47,696.52L537.2,708.98L562.82,697.2ZM485.53,696.52L461.18,697.2L486.8,708.98ZM560.97,708.98L562.82,697.2L537.2,708.98ZM463.03,708.98L486.8,708.98L461.18,697.2ZM607.44,702.13L600.69,708.98L622.17,710.86ZM416.55,702.13L401.81,710.86L423.31,708.98ZM610.68,710.61L622.17,710.86L600.69,708.98ZM413.32,710.61L423.31,708.98L401.81,710.86ZM512.02,682.22L512.02,695.53L539.77,682.19ZM512.02,682.22L484.23,682.19L512.02,695.53ZM538.47,696.52L539.77,682.19L512.02,695.53ZM485.53,696.52L512.02,695.53L484.23,682.19ZM512.02,695.53L512.02,708.96L538.47,696.52ZM512.02,695.53L485.53,696.52L512.02,708.96ZM537.2,708.98L538.47,696.52L512.02,708.96ZM486.8,708.98L512.02,708.96L485.53,696.52ZM539.52,721.54L565.23,721.54L539.61,711.96ZM484.48,721.54L484.39,711.96L458.77,721.54ZM564.57,711.96L539.61,711.96L565.23,721.54ZM459.43,711.96L458.77,721.54L484.39,711.96ZM539.56,735.09L566.16,732.99L539.52,721.54ZM484.44,735.09L484.48,721.54L457.84,732.99ZM565.23,721.54L539.52,721.54L566.16,732.99ZM458.77,721.54L457.84,732.99L484.48,721.54ZM540.34,753.9L568.49,748.33L539.56,735.09ZM483.66,753.9L484.44,735.09L455.51,748.33ZM566.16,732.99L539.56,735.09L568.49,748.33ZM457.84,732.99L455.51,748.33L484.44,735.09ZM613.64,697.41L607.44,702.13L626.58,710.62ZM410.36,697.41L397.42,710.62L416.55,702.13ZM622.17,710.86L626.58,710.62L607.44,702.13ZM401.81,710.86L416.55,702.13L397.42,710.62ZM613.64,697.41L626.58,710.62L622.18,693.97ZM410.36,697.41L401.82,693.97L397.42,710.62ZM632.86,711.38L622.18,693.97L626.58,710.62ZM391.14,711.38L397.42,710.62L401.82,693.97Z" fill="#e85d75" fill-opacity="0.18" stroke="none"/><path d="M540.93,666.01L511.98,668.19M511.98,668.19L483.07,666.01M573.66,673L540.93,666.01M483.07,666.01L450.34,673M599.43,682.54L573.66,673M450.34,673L424.57,682.54M622.18,693.97L599.43,682.54M424.57,682.54L401.82,693.97M582.49,708.98L600.69,708.98M423.31,708.98L441.51,708.98M618.39,727.26L632.86,711.38M391.14,711.38L405.61,727.26M595.65,737.34L618.39,727.26M405.61,727.26L428.35,737.34M568.49,748.33L595.65,737.34M428.35,737.34L455.51,748.33M511.98,754.71L540.34,753.9M483.66,753.9L511.98,754.71M610.68,710.61L600.88,712.09M423.12,712.09L413.32,710.61M539.61,711.96L511.98,711.96M511.98,711.96L484.39,711.96M585.79,711.96L564.57,711.96M459.43,711.96L438.21,711.96M600.88,712.09L585.79,711.96M438.21,711.96L423.12,712.09M560.97,708.98L582.49,708.98M441.51,708.98L463.03,708.98M537.2,708.98L560.97,708.98M463.03,708.98L486.8,708.98M600.69,708.98L610.68,710.61M413.32,710.61L423.31,708.98M512.02,708.96L537.2,708.98M486.8,708.98L512.02,708.96M564.57,711.96L539.61,711.96M484.39,711.96L459.43,711.96M540.34,753.9L568.49,748.33M455.51,748.33L483.66,753.9M632.86,711.38L622.18,693.97M401.82,693.97L391.14,711.38" fill="none" stroke="#e85d75" stroke-width="2.56" stroke-linecap="round"/><path d="M610.68,710.61L600.69,708.98L600.88,712.09ZM413.32,710.61L423.12,712.09L423.31,708.98ZM511.98,711.96L539.61,711.96L512.02,708.96ZM511.98,711.96L512.02,708.96L484.39,711.96ZM537.2,708.98L512.02,708.96L539.61,711.96ZM486.8,708.98L484.39,711.96L512.02,708.96ZM539.61,711.96L564.57,711.96L537.2,708.98ZM484.39,711.96L486.8,708.98L459.43,711.96ZM560.97,708.98L537.2,708.98L564.57,711.96ZM463.03,708.98L459.43,711.96L486.8,708.98ZM564.57,711.96L585.79,711.96L560.97,708.98ZM459.43,711.96L463.03,708.98L438.21,711.96ZM582.49,708.98L560.97,708.98L585.79,711.96ZM441.51,708.98L438.21,711.96L463.03,708.98ZM585.79,711.96L600.88,712.09L582.49,708.98ZM438.21,711.96L441.51,708.98L423.12,712.09ZM600.69,708.98L582.49,708.98L600.88,712.09ZM423.31,708.98L423.12,712.09L441.51,708.98Z" fill="#2563eb" fill-opacity="0.18" stroke="none"/><path d="M610.68,710.61L600.69,708.98M600.88,712.09L610.68,710.61M413.32,710.61L423.12,712.09M423.31,708.98L413.32,710.61M511.98,711.96L539.61,711.96M484.39,711.96L511.98,711.96M537.2,708.98L512.02,708.96M512.02,708.96L486.8,708.98M539.61,711.96L564.57,711.96M459.43,711.96L484.39,711.96M560.97,708.98L537.2,708.98M486.8,708.98L463.03,708.98M564.57,711.96L585.79,711.96M438.21,711.96L459.43,711.96M582.49,708.98L560.97,708.98M463.03,708.98L441.51,708.98M585.79,711.96L600.88,712.09M423.12,712.09L438.21,711.96M600.69,708.98L582.49,708.98M441.51,708.98L423.31,708.98" fill="none" stroke="#2563eb" stroke-width="2.56" stroke-linecap="round"/><path d="M540.93,666.01L511.98,668.19L539.77,682.19ZM483.07,666.01L484.23,682.19L511.98,668.19ZM512.02,682.22L539.77,682.19L511.98,668.19ZM512.02,682.22L511.98,668.19L484.23,682.19ZM540.93,666.01L539.77,682.19L573.66,673ZM483.07,666.01L450.34,673L484.23,682.19ZM566.45,684.57L573.66,673L539.77,682.19ZM457.55,684.57L484.23,682.19L450.34,673ZM573.66,673L566.45,684.57L599.43,682.54ZM450.34,673L424.57,682.54L457.55,684.57ZM591.09,690.06L599.43,682.54L566.45,684.57ZM432.91,690.06L457.55,684.57L424.57,682.54ZM591.09,690.06L613.64,697.41L599.43,682.54ZM432.91,690.06L424.57,682.54L410.36,697.41ZM622.18,693.97L599.43,682.54L613.64,697.41ZM401.82,693.97L410.36,697.41L424.57,682.54ZM584.94,699.08L582.49,708.98L607.44,702.13ZM439.06,699.08L416.55,702.13L441.51,708.98ZM600.69,708.98L607.44,702.13L582.49,708.98ZM423.31,708.98L441.51,708.98L416.55,702.13ZM611.29,723.5L618.39,727.26L626.58,710.62ZM412.71,723.5L397.42,710.62L405.61,727.26ZM632.86,711.38L626.58,710.62L618.39,727.26ZM391.14,711.38L405.61,727.26L397.42,710.62ZM590.68,728.93L595.65,737.34L611.29,723.5ZM433.32,728.93L412.71,723.5L428.35,737.34ZM618.39,727.26L611.29,723.5L595.65,737.34ZM405.61,727.26L428.35,737.34L412.71,723.5ZM568.49,748.33L595.65,737.34L566.16,732.99ZM455.51,748.33L457.84,732.99L428.35,737.34ZM590.68,728.93L566.16,732.99L595.65,737.34ZM433.32,728.93L428.35,737.34L457.84,732.99ZM511.98,754.71L540.34,753.9L511.98,736.65ZM511.98,754.71L511.98,736.65L483.66,753.9ZM539.56,735.09L511.98,736.65L540.34,753.9ZM484.44,735.09L483.66,753.9L511.98,736.65ZM604.54,718.67L622.17,710.86L600.88,712.09ZM419.46,718.67L423.12,712.09L401.81,710.86ZM610.68,710.61L600.88,712.09L622.17,710.86ZM413.32,710.61L401.81,710.86L423.12,712.09ZM626.58,710.62L622.17,710.86L611.29,723.5ZM397.42,710.62L412.71,723.5L401.81,710.86ZM604.54,718.67L611.29,723.5L622.17,710.86ZM419.46,718.67L401.81,710.86L412.71,723.5ZM539.77,682.19L538.47,696.52L566.45,684.57ZM484.23,682.19L457.55,684.57L485.53,696.52ZM562.82,697.2L566.45,684.57L538.47,696.52ZM461.18,697.2L485.53,696.52L457.55,684.57ZM566.45,684.57L562.82,697.2L591.09,690.06ZM457.55,684.57L432.91,690.06L461.18,697.2ZM584.94,699.08L591.09,690.06L562.82,697.2ZM439.06,699.08L461.18,697.2L432.91,690.06ZM591.09,690.06L584.94,699.08L613.64,697.41ZM432.91,690.06L410.36,697.41L439.06,699.08ZM607.44,702.13L613.64,697.41L584.94,699.08ZM416.55,702.13L439.06,699.08L410.36,697.41ZM587.29,720.42L590.68,728.93L604.54,718.67ZM436.71,720.42L419.46,718.67L433.32,728.93ZM611.29,723.5L604.54,718.67L590.68,728.93ZM412.71,723.5L433.32,728.93L419.46,718.67ZM566.16,732.99L590.68,728.93L565.23,721.54ZM457.84,732.99L458.77,721.54L433.32,728.93ZM587.29,720.42L565.23,721.54L590.68,728.93ZM436.71,720.42L433.32,728.93L458.77,721.54ZM511.98,736.65L539.56,735.09L511.98,722.88ZM511.98,736.65L511.98,722.88L484.44,735.09ZM539.52,721.54L511.98,722.88L539.56,735.09ZM484.48,721.54L484.44,735.09L511.98,722.88ZM511.98,722.88L539.52,721.54L511.98,711.96ZM511.98,722.88L511.98,711.96L484.48,721.54ZM539.61,711.96L511.98,711.96L539.52,721.54ZM484.39,711.96L484.48,721.54L511.98,711.96ZM564.57,711.96L565.23,721.54L585.79,711.96ZM459.43,711.96L438.21,711.96L458.77,721.54ZM587.29,720.42L585.79,711.96L565.23,721.54ZM436.71,720.42L458.77,721.54L438.21,711.96ZM600.88,712.09L585.79,711.96L604.54,718.67ZM423.12,712.09L419.46,718.67L438.21,711.96ZM587.29,720.42L604.54,718.67L585.79,711.96ZM436.71,720.42L438.21,711.96L419.46,718.67ZM562.82,697.2L560.97,708.98L584.94,699.08ZM461.18,697.2L439.06,699.08L463.03,708.98ZM582.49,708.98L584.94,699.08L560.97,708.98ZM441.51,708.98L463.03,708.98L439.06,699.08ZM538.47,696.52L537.2,708.98L562.82,697.2ZM485.53,696.52L461.18,697.2L486.8,708.98ZM560.97,708.98L562.82,697.2L537.2,708.98ZM463.03,708.98L486.8,708.98L461.18,697.2ZM607.44,702.13L600.69,708.98L622.17,710.86ZM416.55,702.13L401.81,710.86L423.31,708.98ZM610.68,710.61L622.17,710.86L600.69,708.98ZM413.32,710.61L423.31,708.98L401.81,710.86ZM512.02,682.22L512.02,695.53L539.77,682.19ZM512.02,682.22L484.23,682.19L512.02,695.53ZM538.47,696.52L539.77,682.19L512.02,695.53ZM485.53,696.52L512.02,695.53L484.23,682.19ZM512.02,695.53L512.02,708.96L538.47,696.52ZM512.02,695.53L485.53,696.52L512.02,708.96ZM537.2,708.98L538.47,696.52L512.02,708.96ZM486.8,708.98L512.02,708.96L485.53,696.52ZM539.52,721.54L565.23,721.54L539.61,711.96ZM484.48,721.54L484.39,711.96L458.77,721.54ZM564.57,711.96L539.61,711.96L565.23,721.54ZM459.43,711.96L458.77,721.54L484.39,711.96ZM539.56,735.09L566.16,732.99L539.52,721.54ZM484.44,735.09L484.48,721.54L457.84,732.99ZM565.23,721.54L539.52,721.54L566.16,732.99ZM458.77,721.54L457.84,732.99L484.48,721.54ZM540.34,753.9L568.49,748.33L539.56,735.09ZM483.66,753.9L484.44,735.09L455.51,748.33ZM566.16,732.99L539.56,735.09L568.49,748.33ZM457.84,732.99L455.51,748.33L484.44,735.09ZM613.64,697.41L607.44,702.13L626.58,710.62ZM410.36,697.41L397.42,710.62L416.55,702.13ZM622.17,710.86L626.58,710.62L607.44,702.13ZM401.81,710.86L416.55,702.13L397.42,710.62ZM613.64,697.41L626.58,710.62L622.18,693.97ZM410.36,697.41L401.82,693.97L397.42,710.62ZM632.86,711.38L622.18,693.97L626.58,710.62ZM391.14,711.38L397.42,710.62L401.82,693.97Z" fill="none" stroke="#94a3b8" stroke-width="1.28" stroke-linejoin="round"/><text x="378.85" y="710.36" text-anchor="end" font-family="ui-monospace, SFMono-Regular, Menlo, monospace" font-size="16.38" fill="#0f172a">person's RIGHT ▸</text><text x="645.15" y="710.36" text-anchor="start" font-family="ui-monospace, SFMono-Regular, Menlo, monospace" font-size="16.38" fill="#0f172a">◂ person's LEFT</text><text x="512" y="653.73" text-anchor="middle" font-family="ui-monospace, SFMono-Regular, Menlo, monospace" font-size="16.38" fill="#0f172a">upper lip (pink outline = painted edge)</text><text x="512" y="783.38" text-anchor="middle" font-family="ui-monospace, SFMono-Regular, Menlo, monospace" font-size="16.38" fill="#0f172a">lower lip · blue = mouth interior, cut out in outer-and-inner-lips mode</text><text x="512" y="804.68" text-anchor="middle" font-family="ui-monospace, SFMono-Regular, Menlo, monospace" font-size="16.38" fill="#0f172a">lip region: u 0.38–0.62, v 0.26–0.35 (image x 38–62%, y 65–74%)</text><text x="25.6" y="41.98" text-anchor="start" font-family="ui-monospace, SFMono-Regular, Menlo, monospace" font-size="16.38" fill="#0f172a" font-weight="bold">Lip template: the face atlas</text><text x="25.6" y="63.28" text-anchor="start" font-family="ui-monospace, SFMono-Regular, Menlo, monospace" font-size="16.38" fill="#0f172a">1024×1024 canvas: the face atlas (FACE_ATLAS_UVS, as Canonical_Face_Color.png).</text><text x="25.6" y="84.58" text-anchor="start" font-family="ui-monospace, SFMono-Regular, Menlo, monospace" font-size="16.38" fill="#0f172a">Only the lip triangles are sampled; transparent pixels leave the skin untouched.</text><text x="25.6" y="105.88" text-anchor="start" font-family="ui-monospace, SFMono-Regular, Menlo, monospace" font-size="16.38" fill="#0f172a">Paint as on an unmirrored photo: image LEFT = the person's RIGHT on every feed</text><text x="25.6" y="127.18" text-anchor="start" font-family="ui-monospace, SFMono-Regular, Menlo, monospace" font-size="16.38" fill="#0f172a">(the SDK flips the design on the mirrored webcam).</text><text x="25.6" y="998.4" text-anchor="start" font-family="ui-monospace, SFMono-Regular, Menlo, monospace" font-size="16.38" fill="#0f172a">generated from the bundled face atlas data</text></svg>
@@ -0,0 +1,109 @@
1
+ ---
2
+ title: "Makeup Design Textures"
3
+ description: "How to paint art for MakeupDesign: the face atlas canvas, sides on every feed, alpha and colour, regions, finishes, and the example art."
4
+ sidebarTitle: "Makeup Design Textures"
5
+ icon: "palette"
6
+ ---
7
+
8
+ `MakeupDesign` (from `@vincentt-xr/sdk/face-effects`) paints your art on the
9
+ live face: freckles, face gems, graphic liner, face paint. The art is shaded
10
+ like makeup, relative to the person's own skin and light, with a finish.
11
+
12
+ ```tsx
13
+ import { MakeupDesign } from "@vincentt-xr/sdk/face-effects";
14
+
15
+ <MakeupDesign
16
+ texture="/makeup/freckles.svg"
17
+ region={["cheeks", "nose"]}
18
+ coverage={0.45}
19
+ opacity={0.8}
20
+ />;
21
+ ```
22
+
23
+ ## The canvas
24
+
25
+ The layout, templates and loading rules are in
26
+ [Face Atlas Textures](/guides/face-atlas-textures); props and finishes are in
27
+ [Makeup](/api/makeup).
28
+
29
+ - **One square image in the face atlas** (`FACE_ATLAS_UVS`): the layout of the
30
+ canonical face OBJ, the same one LipEffect designs and face swap use. 1024×1024
31
+ is enough; 2048×2048 for fine detail.
32
+ - **Upright, as on an unmirrored photo.** Image-left is the person's **right**,
33
+ image-right is their **left**; the forehead is at the top.
34
+ - **Transparent where nothing is painted.** Alpha is where the art paints;
35
+ soft alpha gives soft edges.
36
+ - **Colours are the paint**, in sRGB. `color` multiplies them: paint white art
37
+ to recolour it from code.
38
+
39
+ <img
40
+ src="/guides/face-atlas-template.svg"
41
+ alt="Face atlas template: every region outlined, with the person's sides labelled"
42
+ />
43
+
44
+ The template is generated from the bundled atlas data
45
+ (`pnpm dlx tsx scripts/generate-face-atlas.ts`); in an app,
46
+ `createFaceAtlasGuideSvg()` / `createFaceAtlasGuidePngBlob()` draw the same
47
+ guide. Put it on a layer under your art and hide it before exporting.
48
+
49
+ ## Sides on every feed
50
+
51
+ Each side of the art stays on the person's own side on every feed. On the rear
52
+ camera, images and video the art is used as painted; on the mirrored webcam it
53
+ is sampled at `(1 − u, v)`. The atlas is symmetric to 0.001, so the flip is
54
+ exact. A mark on the skin therefore reads backwards on the mirrored webcam, as
55
+ it does in a mirror.
56
+
57
+ To check a setup, use the side-test art: an L on the person's own left cheek.
58
+ It must sit on the person's left cheek on the webcam and on the rear camera.
59
+
60
+ ## Regions
61
+
62
+ `region` limits where the art may paint, as one `FaceAtlasRegion` or a list:
63
+ `face` (default: everything but the eye and mouth openings and the nostrils),
64
+ `skin`, `lips`, `mouth`, `eyes`, `lids`, `brows`, `cheeks`, `nose`,
65
+ `forehead`, `jaw`. Art outside the region is never drawn, and a smaller region
66
+ draws fewer pixels. `eyes` and `mouth` are the openings: art there covers the
67
+ eyeballs or the inside of the mouth.
68
+
69
+ Liner drawn on the lash line is cut there by the eye opening; draw it just
70
+ above the line.
71
+
72
+ ## Finish and coverage
73
+
74
+ | Setting | Use |
75
+ | ---------- | ------------------------------------------------------------------------------------------------ |
76
+ | `coverage` | 0 sheer: the art filters the skin and never lightens it (freckles). 1 opaque: it covers the skin |
77
+ | `finish` | `matte`, `satin`, `gloss` (gems, wet looks), `shimmer`, `metallic`, `glitter` |
78
+ | `opacity` | Linear amount, times the art's alpha |
79
+ | `side` | `both`, or the person's own `left` / `right` half of the art |
80
+
81
+ Finishes add their highlight from the live face's normals and the room light,
82
+ so painted facets (on gems) and the finish's highlight work together.
83
+
84
+ ## Texture inputs
85
+
86
+ - **URL**: PNG, WebP or SVG with `width` and `height`. Loaded without Suspense,
87
+ premultiplied and mipmapped, and disposed by the component. A URL that
88
+ fails to load draws nothing (and warns once).
89
+ - **`THREE.Texture`** you own: read as sRGB unless tagged
90
+ `LinearSRGBColorSpace`, and as premultiplied when `premultiplyAlpha` is set.
91
+ Leave a premultiplied texture untagged: tagged `SRGBColorSpace`, the GPU
92
+ decodes it before the alpha is divided out, which darkens soft edges (it
93
+ warns). It must sample upright as an image loaded with `flipY` does
94
+ (`TextureLoader`, `CanvasTexture`). The component never changes it.
95
+ - **Material API**: `setMakeupDesignTexture(createMakeupMaterial("design").uniforms, texture)`.
96
+
97
+ ## Example art
98
+
99
+ The SDK playground ships four examples in `example/public/makeup/`, drawn in
100
+ atlas coordinates by `scripts/generate-makeup-samples.ts` (CC0, Vincentt):
101
+
102
+ | File | Settings |
103
+ | ------------------- | ----------------------------------------------------------- |
104
+ | `freckles.svg` | `region={["cheeks", "nose"]} coverage={0.45} opacity={0.8}` |
105
+ | `face-gems.svg` | `region={["lids", "cheeks", "forehead"]} finish="gloss"` |
106
+ | `graphic-liner.svg` | `region={["lids", "forehead"]} opacity={0.95}` |
107
+ | `side-test.svg` | `region="cheeks"` |
108
+
109
+ They are not part of the npm package: copy one into your app's public folder.
@@ -106,13 +106,12 @@ summary only.
106
106
 
107
107
  - `/unified-architecture`: current debug-ui composition for a unified
108
108
  face-tracking scene.
109
- - `/testing-hook`: multi-face face-mesh sanity example using reusable
109
+ - `/face-mesh?faces=two`: multi-face face-mesh sanity example using reusable
110
110
  scene-object/debug-ui APIs.
111
111
  - `/body`: visible body-tracking anchors using `BodyTracker` and
112
112
  `TrackingAnchor`.
113
113
  - `/debugger`: minimal debugger overlay example for metrics and runtime
114
114
  inspection.
115
- - `/viewport-editor`: reusable 3D scene editor fixture.
116
115
  - `/face-retouch-legacy`: legacy face-retouch shader controls with debug-ui
117
116
  settings.
118
117