@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.
- package/GROUNDING.md +4643 -170
- package/README.md +1 -0
- package/dist/CanonicalHeadFrame-BHcWyaiK.js +1506 -0
- package/dist/CanonicalHeadFrame-D-_T1OMU.cjs +1 -0
- package/dist/DebuggerUI-7ngnJsBe.js +275 -0
- package/dist/DebuggerUI-CoglgKdO.cjs +1 -0
- package/dist/FaceRetouch-CLoTfrcs.js +1071 -0
- package/dist/FaceRetouch-J1lC1WbS.cjs +134 -0
- package/dist/FaceSurface-CHAMEeG1.cjs +1 -0
- package/dist/FaceSurface-DmP9AEeC.js +27 -0
- package/dist/SegmentationOverlay-D_FWkcyP.cjs +35 -0
- package/dist/SegmentationOverlay-vn5x_knv.js +6237 -0
- package/dist/SkeletonUtils-C2r90MtN.js +21 -0
- package/dist/SkeletonUtils-CddIup1F.cjs +1 -0
- package/dist/TextLabel-XE0rQSDn.cjs +2 -0
- package/dist/TextLabel-c9BCucOI.js +961 -0
- package/dist/assets/gltfLoader.d.ts +16 -0
- package/dist/assets/loaders.d.ts +16 -1
- package/dist/body-pose/index.d.ts +521 -0
- package/dist/body-trigger/__fixtures__/syntheticBody.d.ts +83 -0
- package/dist/body-trigger/frame.d.ts +88 -0
- package/dist/body-trigger/index.d.ts +6 -0
- package/dist/body-trigger/moves.d.ts +235 -0
- package/dist/body-trigger/trigger.d.ts +75 -0
- package/dist/calibration/calibration.d.ts +11 -6
- package/dist/canonicalFace-BHwyCx1c.js +9 -0
- package/dist/canonicalFace-C83I225R.cjs +1 -0
- package/dist/components/BodyInstruction/BodyPoseHint.d.ts +63 -0
- package/dist/components/BodyInstruction/index.d.ts +69 -0
- package/dist/components/BodyInstruction/useBodyPose.d.ts +23 -0
- package/dist/components/BodyTracker/index.d.ts +10 -2
- package/dist/components/BodyTrigger/index.d.ts +49 -0
- package/dist/components/Debugger/DebuggerProvider.d.ts +14 -1
- package/dist/components/Debugger/DebuggerUI.d.ts +3 -1
- package/dist/components/FaceAtlas/FaceAtlasLayer.d.ts +114 -0
- package/dist/components/FaceAtlas/MadeUpCamera.d.ts +80 -0
- package/dist/components/FaceAtlas/constants.d.ts +8 -0
- package/dist/components/FaceAtlas/index.d.ts +7 -0
- package/dist/components/FaceAtlas/useFaceAtlasSurface.d.ts +84 -0
- package/dist/components/FaceAtlas/useFaceSkin.d.ts +84 -0
- package/dist/components/FaceCharacter/ExternalFaceMesh.d.ts +109 -0
- package/dist/components/FaceCharacter/FaceExpressionController.d.ts +53 -0
- package/dist/components/FaceCharacter/FaceMorph.d.ts +71 -0
- package/dist/components/FaceCharacter/FacePiercing.d.ts +65 -0
- package/dist/components/FaceCharacter/FaceReprojection.d.ts +85 -0
- package/dist/components/FaceCharacter/FaceRig.d.ts +38 -0
- package/dist/components/FaceCharacter/FaceSurface.d.ts +49 -0
- package/dist/components/FaceCharacter/FaceSurfaceOccluder.d.ts +39 -0
- package/dist/components/FaceCharacter/PinToFaceMesh.d.ts +68 -0
- package/dist/components/FaceCharacter/index.d.ts +18 -0
- package/dist/components/FaceCharacter/useFaceReprojector.d.ts +10 -0
- package/dist/components/FaceInset/FaceInset.d.ts +68 -0
- package/dist/components/FaceInset/frame.d.ts +94 -0
- package/dist/components/FaceInset/index.d.ts +6 -0
- package/dist/components/FaceInset/material.d.ts +40 -0
- package/dist/components/FaceInset/useFaceInsetTexture.d.ts +37 -0
- package/dist/components/FaceInstruction/FaceExpressionHint.d.ts +43 -0
- package/dist/components/FaceInstruction/index.d.ts +56 -0
- package/dist/components/FaceInstruction/useFaceExpression.d.ts +20 -0
- package/dist/components/FaceLiquify/FaceLiquify.d.ts +49 -0
- package/dist/components/FaceLiquify/debug.d.ts +37 -0
- package/dist/components/FaceLiquify/frame.d.ts +55 -0
- package/dist/components/FaceLiquify/index.d.ts +10 -0
- package/dist/components/FaceLiquify/material.d.ts +39 -0
- package/dist/components/FaceLiquify/pass.d.ts +49 -0
- package/dist/components/FaceLiquify/presence.d.ts +25 -0
- package/dist/components/FaceLiquify/presets.d.ts +82 -0
- package/dist/components/FaceLiquify/selfTest.d.ts +66 -0
- package/dist/components/FaceLiquify/target.d.ts +85 -0
- package/dist/components/FaceLiquify/warp.d.ts +72 -0
- package/dist/components/FaceMesh/canonical/CanonicalFaceMeshRenderer.d.ts +5 -3
- package/dist/components/FaceMesh/canonical/geometryGroups.d.ts +21 -0
- package/dist/components/FaceMesh/canonical/parseCanonicalFaceModel.d.ts +9 -0
- package/dist/components/FaceMesh/index.d.ts +1 -1
- package/dist/components/FaceRetouch/Background.d.ts +3 -1
- package/dist/components/FaceRetouch/FaceRetouch.d.ts +5 -0
- package/dist/components/FaceRetouch/renderState.d.ts +19 -0
- package/dist/components/FaceSwap/FaceMirror.d.ts +46 -0
- package/dist/components/FaceSwap/FaceSwap.d.ts +58 -0
- package/dist/components/FaceSwap/FaceTextureLayer.d.ts +72 -0
- package/dist/components/FaceSwap/faceSwapPlan.d.ts +91 -0
- package/dist/components/FaceSwap/index.d.ts +13 -0
- package/dist/components/FaceSwap/settings.d.ts +300 -0
- package/dist/components/FaceSwap/useFaceTexture.d.ts +35 -0
- package/dist/components/FaceSwap/useLiveFace.d.ts +38 -0
- package/dist/components/FaceSwap/useLiveFaceTexture.d.ts +31 -0
- package/dist/components/FaceWarp3D/FaceWarp3D.d.ts +50 -0
- package/dist/components/FaceWarp3D/index.d.ts +2 -3
- package/dist/components/Faceless/Faceless.d.ts +51 -0
- package/dist/components/Faceless/index.d.ts +2 -0
- package/dist/components/HairLock/HairLock.d.ts +39 -0
- package/dist/components/HairLock/index.d.ts +2 -0
- package/dist/components/HairLock/lockGeometry.d.ts +15 -0
- package/dist/components/HandCutout/index.d.ts +35 -0
- package/dist/components/HandInstruction/HandGestureHint.d.ts +70 -0
- package/dist/components/HandInstruction/index.d.ts +74 -0
- package/dist/components/HandInstruction/useHandGesture.d.ts +22 -0
- package/dist/components/HandRig/ForearmOccluder.d.ts +29 -0
- package/dist/components/HandRig/HandAttachment.d.ts +34 -0
- package/dist/components/HandRig/HandOccluder.d.ts +55 -0
- package/dist/components/HandRig/HandTattoo.d.ts +61 -0
- package/dist/components/HandRig/WristAttachment.d.ts +34 -0
- package/dist/components/HandRig/index.d.ts +101 -0
- package/dist/components/HandRig/useArmMask.d.ts +29 -0
- package/dist/components/HandRig/wristSolve.d.ts +69 -0
- package/dist/components/HandTouch/HandTouch.d.ts +62 -0
- package/dist/components/HandTouch/Touchable.d.ts +36 -0
- package/dist/components/HandTouch/index.d.ts +2 -0
- package/dist/components/HeadBinding/index.d.ts +14 -0
- package/dist/components/HeadOccluder/CanonicalHeadFrame.d.ts +22 -0
- package/dist/components/HeadOccluder/Earrings.d.ts +55 -0
- package/dist/components/HeadOccluder/HeadAttachment.d.ts +38 -0
- package/dist/components/HeadOccluder/NeckOccluder.d.ts +64 -0
- package/dist/components/HeadOccluder/earringPlacement.d.ts +31 -0
- package/dist/components/HeadOccluder/headAttachmentPoints.d.ts +69 -0
- package/dist/components/HeadOccluder/index.d.ts +57 -3
- package/dist/components/HeadOccluder/useCanonicalHeadFit.d.ts +36 -0
- package/dist/components/HeadOccluder/useLandmarkPoseFit.d.ts +80 -0
- package/dist/components/Instruction/HintStage.d.ts +29 -0
- package/dist/components/Instruction/InstructionCue.d.ts +126 -0
- package/dist/components/Instruction/gestureHold.d.ts +20 -0
- package/dist/components/Instruction/ghost.d.ts +129 -0
- package/dist/components/Instruction/hintBlend.d.ts +19 -0
- package/dist/components/Instruction/hintLook.d.ts +81 -0
- package/dist/components/Instruction/hintLoop.d.ts +36 -0
- package/dist/components/Instruction/index.d.ts +41 -0
- package/dist/components/Instruction/useGhostModel.d.ts +33 -0
- package/dist/components/Instruction/useInstructionHold.d.ts +72 -0
- package/dist/components/LipEffect/LipEffect.d.ts +22 -2
- package/dist/components/LipEffect/LipEffectMaterial.d.ts +62 -10
- package/dist/components/LipEffect/LipEffects.d.ts +5 -2
- package/dist/components/LipEffect/defaults.d.ts +21 -2
- package/dist/components/LipEffect/index.d.ts +1 -1
- package/dist/components/LipEffect/lipShading.d.ts +73 -0
- package/dist/components/LipEffect/settings.d.ts +117 -13
- package/dist/components/LipEffect/shader.d.ts +39 -0
- package/dist/components/LipEffect/types.d.ts +82 -10
- package/dist/components/LipEffect/useLipDesignTextures.d.ts +6 -0
- package/dist/components/LipEffect/uvGuide.d.ts +31 -16
- package/dist/components/Makeup/Blush.d.ts +18 -0
- package/dist/components/Makeup/Brows.d.ts +20 -0
- package/dist/components/Makeup/Contour.d.ts +17 -0
- package/dist/components/Makeup/Eyeliner.d.ts +20 -0
- package/dist/components/Makeup/Eyeshadow.d.ts +20 -0
- package/dist/components/Makeup/Highlighter.d.ts +18 -0
- package/dist/components/Makeup/MakeupDesign.d.ts +37 -0
- package/dist/components/Makeup/MakeupRegion.d.ts +132 -0
- package/dist/components/Makeup/constants.d.ts +44 -0
- package/dist/components/Makeup/design.d.ts +106 -0
- package/dist/components/Makeup/designSamples.d.ts +42 -0
- package/dist/components/Makeup/eyes.d.ts +114 -0
- package/dist/components/Makeup/fields.d.ts +10 -0
- package/dist/components/Makeup/geometry.d.ts +106 -0
- package/dist/components/Makeup/index.d.ts +26 -0
- package/dist/components/Makeup/looks.d.ts +28 -0
- package/dist/components/Makeup/material.d.ts +239 -0
- package/dist/components/Makeup/settings.d.ts +54 -0
- package/dist/components/Makeup/shades.d.ts +143 -0
- package/dist/components/Makeup/shapes.d.ts +27 -0
- package/dist/components/Makeup/skinTone.d.ts +135 -0
- package/dist/components/Makeup/types.d.ts +110 -0
- package/dist/components/Makeup/useMakeupSkinTone.d.ts +40 -0
- package/dist/components/Necklace/Necklace.d.ts +44 -0
- package/dist/components/Necklace/index.d.ts +1 -0
- package/dist/components/ParticleEmitter/ParticleEmitter.d.ts +69 -0
- package/dist/components/ParticleEmitter/index.d.ts +1 -0
- package/dist/components/ShoulderOccluder/index.d.ts +43 -0
- package/dist/components/ShoulderOccluder/useCanonicalTorsoFit.d.ts +24 -0
- package/dist/components/SpringSwing/SpringSwing.d.ts +22 -0
- package/dist/components/SpringSwing/index.d.ts +1 -0
- package/dist/components/XRScene/renderOutputTarget.d.ts +12 -0
- package/dist/components/index.d.ts +8 -0
- package/dist/config/index.d.ts +0 -1
- package/dist/context-DTxSQvp4.js +13 -0
- package/dist/context-hA0Rb2Xa.cjs +1 -0
- package/dist/contexts-BH7PdKFS.cjs +1 -0
- package/dist/contexts-jak8-tND.js +667 -0
- package/dist/coordinates/index.d.ts +2 -0
- package/dist/coordinates/side.d.ts +40 -0
- package/dist/debug-ui/default-setting.cjs +2 -2
- package/dist/debug-ui/face-swap-settings/index.d.ts +22 -0
- package/dist/debug-ui/hierarchy-panel/index.d.ts +3 -2
- package/dist/debug-ui/index.d.ts +4 -3
- package/dist/debug-ui/media-source/index.d.ts +1 -1
- package/dist/debug-ui/media-source/session.d.ts +30 -2
- package/dist/debug-ui/media-source.cjs +1 -1
- package/dist/debug-ui/media-source.js +1 -1
- package/dist/debug-ui/object-inspector-panel/index.d.ts +3 -2
- package/dist/debug-ui/product-hotspots/index.d.ts +3 -2
- package/dist/debug-ui/scene-editor/hierarchy-panel.d.ts +3 -1
- package/dist/debug-ui/scene-editor/inspector-panel.d.ts +3 -1
- package/dist/debug-ui/screen-image-settings/index.d.ts +3 -1
- package/dist/debug-ui/screen-text-settings/ScreenTextSettingsPanel.d.ts +1 -1
- package/dist/debug-ui/screen-text-settings/types.d.ts +2 -0
- package/dist/debug-ui/settings-panel/index.d.ts +6 -1
- package/dist/debug-ui/shared/debugWindow.d.ts +51 -0
- package/dist/debug-ui/xr-diagnostics/index.d.ts +3 -2
- package/dist/debug-ui.cjs +3 -3
- package/dist/debug-ui.js +2250 -2472
- package/dist/entries/all.d.ts +3 -1
- package/dist/entries/core.d.ts +3 -2
- package/dist/entries/face-effects.d.ts +114 -8
- package/dist/entries/instructions.d.ts +48 -0
- package/dist/entries/internal.d.ts +2 -1
- package/dist/entries/low-level.d.ts +28 -1
- package/dist/entries/particles.d.ts +11 -0
- package/dist/entries/tracking.d.ts +37 -2
- package/dist/face-atlas/attributes.d.ts +30 -0
- package/dist/face-atlas/eyes.d.ts +272 -0
- package/dist/face-atlas/faceAtlas.generated.d.ts +46 -0
- package/dist/face-atlas/glsl/atlasVertex.d.ts +46 -0
- package/dist/face-atlas/glsl/common.d.ts +55 -0
- package/dist/face-atlas/glsl/design.d.ts +49 -0
- package/dist/face-atlas/glsl/eyes.d.ts +73 -0
- package/dist/face-atlas/glsl/finish.d.ts +24 -0
- package/dist/face-atlas/glsl/format.d.ts +4 -0
- package/dist/face-atlas/glsl/index.d.ts +59 -0
- package/dist/face-atlas/glsl/shading.d.ts +15 -0
- package/dist/face-atlas/glsl/shapes.d.ts +66 -0
- package/dist/face-atlas/glsl/sparkle.d.ts +19 -0
- package/dist/face-atlas/glsl/uniforms.d.ts +106 -0
- package/dist/face-atlas/guide.d.ts +51 -0
- package/dist/face-atlas/index.d.ts +25 -0
- package/dist/face-atlas/lead.d.ts +117 -0
- package/dist/face-atlas/madeUpCamera.d.ts +125 -0
- package/dist/face-atlas/masks.d.ts +53 -0
- package/dist/face-atlas/obj.d.ts +69 -0
- package/dist/face-atlas/polylines.d.ts +63 -0
- package/dist/face-atlas/probe/FaceSkinProbe.d.ts +208 -0
- package/dist/face-atlas/probe/__fixtures__/emulate.d.ts +9 -0
- package/dist/face-atlas/probe/__fixtures__/face.d.ts +24 -0
- package/dist/face-atlas/probe/constants.d.ts +137 -0
- package/dist/face-atlas/probe/glsl.d.ts +43 -0
- package/dist/face-atlas/probe/lightFit.d.ts +108 -0
- package/dist/face-atlas/probe/schedule.d.ts +44 -0
- package/dist/face-atlas/probe/selfTest.d.ts +87 -0
- package/dist/face-atlas/probe/stats.d.ts +143 -0
- package/dist/face-atlas/probe/targets.d.ts +70 -0
- package/dist/face-atlas/probe/unwrap.d.ts +76 -0
- package/dist/face-atlas/quality.d.ts +28 -0
- package/dist/face-atlas/regions.d.ts +31 -0
- package/dist/face-atlas/registry.d.ts +252 -0
- package/dist/face-atlas/renderState.d.ts +86 -0
- package/dist/face-atlas/selfOcclusion.d.ts +62 -0
- package/dist/face-atlas/shading.d.ts +406 -0
- package/dist/face-atlas/shapes.d.ts +86 -0
- package/dist/face-atlas/sides.d.ts +41 -0
- package/dist/face-atlas/skinMask.d.ts +35 -0
- package/dist/face-atlas/surface.d.ts +155 -0
- package/dist/face-atlas/topology.d.ts +44 -0
- package/dist/face-character/__fixtures__/faceImageDetections.d.ts +25 -0
- package/dist/face-character/__fixtures__/faceNode.d.ts +22 -0
- package/dist/face-character/bindFaceModel.d.ts +106 -0
- package/dist/face-character/canonicalFace.d.ts +17 -0
- package/dist/face-character/canonicalFaceGeometry.d.ts +11 -0
- package/dist/face-character/canonicalFacePositions.d.ts +7 -0
- package/dist/face-character/driveFaceModel.d.ts +57 -0
- package/dist/face-character/expressionOutputs.d.ts +45 -0
- package/dist/face-character/faceExpressions.d.ts +104 -0
- package/dist/face-character/faceImageLandmarker.d.ts +93 -0
- package/dist/face-character/faceMeshBinding.d.ts +62 -0
- package/dist/face-character/faceMorph.d.ts +77 -0
- package/dist/face-character/faceMorphs.d.ts +46 -0
- package/dist/face-character/facePhoto.d.ts +138 -0
- package/dist/face-character/facePiercings.d.ts +116 -0
- package/dist/face-character/facePin.d.ts +131 -0
- package/dist/face-character/faceReprojection.d.ts +273 -0
- package/dist/face-character/faceReprojector.d.ts +171 -0
- package/dist/face-character/faceRig.d.ts +176 -0
- package/dist/face-character/faceSwapPresence.d.ts +85 -0
- package/dist/face-character/faceTexture.d.ts +169 -0
- package/dist/face-character/faceTextureBaker.d.ts +86 -0
- package/dist/face-character/faceTextureGuide.d.ts +106 -0
- package/dist/face-character/faceTextureStats.d.ts +298 -0
- package/dist/face-character/faceTransfer.d.ts +396 -0
- package/dist/face-character/faceTransferGeometry.d.ts +109 -0
- package/dist/face-character/faceTransferSelfTest.d.ts +94 -0
- package/dist/face-character/faceWarp3D.d.ts +101 -0
- package/dist/face-character/faceless.d.ts +79 -0
- package/dist/face-character/featureWarp.d.ts +28 -0
- package/dist/face-character/liveFaceRegistry.d.ts +370 -0
- package/dist/face-character/liveValue.d.ts +12 -0
- package/dist/face-character/memo.d.ts +15 -0
- package/dist/face-effects.cjs +2252 -83
- package/dist/face-effects.js +14234 -1231
- package/dist/face-expression/index.d.ts +182 -0
- package/dist/face-info/landmarks.d.ts +17 -3
- package/dist/face-info/types.d.ts +20 -3
- package/dist/gestures/definitions.d.ts +15 -2
- package/dist/gestures/index.d.ts +1 -1
- package/dist/gestures/measures.d.ts +21 -8
- package/dist/getFaceInfo-B1otSDMX.cjs +1 -0
- package/dist/getFaceInfo-Cu4xDWiL.js +62 -0
- package/dist/hand/armFit.d.ts +46 -0
- package/dist/hand/armMask.d.ts +178 -0
- package/dist/hand/handCutout.d.ts +23 -0
- package/dist/hand/handCutoutRegistry.d.ts +7 -0
- package/dist/hand/handGestures.d.ts +524 -0
- package/dist/hand/handPose.d.ts +98 -0
- package/dist/hand/handRigSolver.d.ts +159 -0
- package/dist/hand/handTattoo.d.ts +81 -0
- package/dist/hand/handTouch.d.ts +240 -0
- package/dist/hand/wrist.d.ts +44 -0
- package/dist/hand/wristFilter.d.ts +44 -0
- package/dist/hooks/selectors.d.ts +8 -0
- package/dist/hooks/useFaceModelAcquisition.d.ts +38 -0
- package/dist/hooks/useTrackerContext.d.ts +6 -0
- package/dist/index-B1_TzJaI.js +1104 -0
- package/dist/index-BavF06C6.js +190 -0
- package/dist/index-BfFmpddl.cjs +21 -0
- package/dist/index-BuBzneeW.cjs +46 -0
- package/dist/index-CGsQWodV.cjs +1 -0
- package/dist/index-CIe7eCMH.js +3200 -0
- package/dist/index-CfSF8LXa.cjs +1 -0
- package/dist/index-D5GTzOzD.cjs +1 -0
- package/dist/index-DBhQzvVa.js +314 -0
- package/dist/index-DE17y0ZI.cjs +1 -0
- package/dist/index-JII7huPk.js +442 -0
- package/dist/index-tpCr9CLj.cjs +1 -0
- package/dist/{renderPasses-NnKZVfBy.js → index-w1S7fI2B.js} +219 -247
- package/dist/index-zGaqrz_K.js +188 -0
- package/dist/instructions.cjs +30 -0
- package/dist/instructions.js +1507 -0
- package/dist/{internal-vsfNQycj.js → internal-B90P-clC.js} +138 -118
- package/dist/internal-Cjinca64.cjs +1 -0
- package/dist/internal.cjs +1 -1
- package/dist/internal.js +15 -10
- package/dist/iris/compute.d.ts +7 -5
- package/dist/iris/types.d.ts +6 -4
- package/dist/{landmarkMask-CbTFzBYG.js → landmarkMask-BFDyBnKM.js} +6 -6
- package/dist/landmarks-BlUqf5MZ.cjs +1 -0
- package/dist/landmarks-bftdwq6Z.js +76 -0
- package/dist/loaders-BGAUACsd.js +363 -0
- package/dist/loaders-BJ1_QCHt.cjs +1 -0
- package/dist/low-level.cjs +1 -1
- package/dist/low-level.js +666 -602
- package/dist/main.cjs +1 -1
- package/dist/main.js +866 -1182
- package/dist/models/Body/index.d.ts +2 -0
- package/dist/models/Face/constants.d.ts +8 -0
- package/dist/models/Face/index.d.ts +3 -11
- package/dist/models/Face/rotation.d.ts +18 -3
- package/dist/models/Hand/HandTracking.d.ts +17 -1
- package/dist/models/Segmentation/index.d.ts +2 -0
- package/dist/models/nodeSource.d.ts +9 -0
- package/dist/particles/emission.d.ts +24 -0
- package/dist/particles/eyes.d.ts +24 -0
- package/dist/particles/glsl.d.ts +14 -0
- package/dist/particles/index.d.ts +10 -0
- package/dist/particles/motion.d.ts +42 -0
- package/dist/particles/presets.d.ts +12 -0
- package/dist/particles/ring.d.ts +58 -0
- package/dist/particles/selfTest.d.ts +53 -0
- package/dist/particles/settings.d.ts +127 -0
- package/dist/particles/shapes.d.ts +29 -0
- package/dist/particles/spawner.d.ts +60 -0
- package/dist/particles/system.d.ts +64 -0
- package/dist/particles.cjs +122 -0
- package/dist/particles.js +774 -0
- package/dist/product.cjs +1 -1
- package/dist/product.js +29 -29
- package/dist/{providers-C0Dlhh9Z.js → providers-C8rE26Uf.js} +127 -126
- package/dist/providers-DHsrhDI2.cjs +62 -0
- package/dist/render/renderPasses.d.ts +8 -0
- package/dist/render/sceneBeforeRender.d.ts +12 -0
- package/dist/{renderGroups-CN1cGFUo.js → renderGroups-B38pUaX2.js} +1 -1
- package/dist/{renderGroups-O4KmaMl9.cjs → renderGroups-Cb_4Ar1Q.cjs} +1 -1
- package/dist/renderPasses-B6l8IpJv.js +1290 -0
- package/dist/renderPasses-dqmkft4P.cjs +158 -0
- package/dist/renderState-CJNmj5jz.js +39 -0
- package/dist/renderState-apSfg4eR.cjs +1 -0
- package/dist/scene-object.cjs +1 -1
- package/dist/scene-object.js +2 -2
- package/dist/segmentation-Cb3ouK6Z.js +1758 -0
- package/dist/segmentation-D9pYO6aR.cjs +1 -0
- package/dist/segmentation2d/types.d.ts +6 -0
- package/dist/select-Ck5LGz-J.cjs +1 -0
- package/dist/select-pYRo_win.js +233 -0
- package/dist/selectors-C4X71aoD.cjs +1 -0
- package/dist/selectors-DmNaKIwE.js +196 -0
- package/dist/session-BrH8G7iJ.cjs +31 -0
- package/dist/session-DgA_z6O1.js +418 -0
- package/dist/{settings-aQk845NJ.js → settings-BJ7FMBsO.js} +53 -15
- package/dist/settings-C63FMBlF.cjs +1 -0
- package/dist/similarityFit-BFqHND2e.cjs +1 -0
- package/dist/similarityFit-Bbz-R8AY.js +91 -0
- package/dist/spring/index.d.ts +2 -0
- package/dist/spring/spring.d.ts +69 -0
- package/dist/spring/swing.d.ts +54 -0
- package/dist/tracking.cjs +10 -1
- package/dist/tracking.js +1002 -855
- package/dist/trigger-D0Pm9noT.cjs +49 -0
- package/dist/trigger-IQeys0oS.js +2128 -0
- package/dist/types/face.d.ts +20 -1
- package/dist/types/hand-tracking.d.ts +9 -0
- package/dist/types/nodes.d.ts +20 -1
- package/dist/types/segmentation.d.ts +5 -0
- package/dist/updateThrottle-BseecYag.js +4 -0
- package/dist/updateThrottle-Of5Y4SVa.cjs +1 -0
- package/dist/useFaceInfo-BHDNCvsJ.cjs +1 -0
- package/dist/useFaceInfo-J4x7LsqL.js +76 -0
- package/dist/useFaceResultReader-BvEo5REG.js +61 -0
- package/dist/useFaceResultReader-DuaL1KJG.cjs +1 -0
- package/dist/useInstructionHold-DOu-RpCM.js +53 -0
- package/dist/useInstructionHold-DwJY1Alr.cjs +1 -0
- package/dist/useLandmarkPoseFit-Bg-h9BPb.cjs +1 -0
- package/dist/useLandmarkPoseFit-Bmb3h6Mw.js +87 -0
- package/dist/{useXRCapabilities-B1R2ghy-.cjs → useXRCapabilities-Cr3RzuAW.cjs} +1 -1
- package/dist/{useXRCapabilities-C68v__wB.js → useXRCapabilities-Cxmlmpbd.js} +1 -1
- package/dist/utils/canonicalRigidLandmarks.d.ts +8 -0
- package/dist/utils/headOccluderFit.d.ts +42 -0
- package/dist/utils/integrity.d.ts +17 -0
- package/dist/utils/resolveNumFaces.d.ts +13 -0
- package/dist/utils/shoulderOccluderFit.d.ts +38 -0
- package/dist/utils/similarityFit.d.ts +23 -0
- package/dist/uv-BMFt19bg.cjs +1 -0
- package/dist/{index-CsUdQ-pn.js → uv-DJU_XfmN.js} +15 -249
- package/docs/SDK_DOCUMENTATION.md +1 -2
- package/docs/api/adaptive-quality.mdx +1 -1
- package/docs/api/body-instructions.mdx +285 -0
- package/docs/api/body-triggers.mdx +234 -0
- package/docs/api/camera-permission.mdx +1 -1
- package/docs/api/coordinate-spaces.mdx +7 -4
- package/docs/api/cross-camera.mdx +3 -2
- package/docs/api/debug-ui-scene-editor.mdx +23 -2
- package/docs/api/external-face-mesh.mdx +231 -0
- package/docs/api/face-actions.mdx +20 -16
- package/docs/api/face-attribute-expression.mdx +1 -1
- package/docs/api/face-binding-anchors.mdx +4 -2
- package/docs/api/face-character.mdx +157 -0
- package/docs/api/face-effects.mdx +3 -0
- package/docs/api/face-expression-controller.mdx +153 -0
- package/docs/api/face-info.mdx +17 -11
- package/docs/api/face-inset.mdx +204 -0
- package/docs/api/face-instructions.mdx +183 -0
- package/docs/api/face-liquify.mdx +196 -0
- package/docs/api/face-mesh.mdx +4 -7
- package/docs/api/face-morph.mdx +117 -0
- package/docs/api/face-painting.mdx +7 -0
- package/docs/api/face-reprojection.mdx +154 -0
- package/docs/api/face-retouching.mdx +18 -10
- package/docs/api/face-swap.mdx +350 -0
- package/docs/api/face-warp-3d.mdx +166 -0
- package/docs/api/faceless.mdx +143 -0
- package/docs/api/gestures.mdx +68 -32
- package/docs/api/hair.mdx +97 -0
- package/docs/api/hand-instructions.mdx +222 -0
- package/docs/api/hand-rig.mdx +535 -0
- package/docs/api/hand-touch.mdx +162 -0
- package/docs/api/head-occluder.mdx +563 -0
- package/docs/api/holistic-tracker.mdx +6 -1
- package/docs/api/instructions.mdx +323 -0
- package/docs/api/iris-tracking.mdx +24 -19
- package/docs/api/made-up-camera.mdx +131 -0
- package/docs/api/makeup-skin-tone.mdx +135 -0
- package/docs/api/makeup.mdx +353 -0
- package/docs/api/multi-subject.mdx +4 -1
- package/docs/api/particles.mdx +155 -0
- package/docs/api/person-cutout.mdx +1 -1
- package/docs/api/pin-to-face-mesh.mdx +274 -0
- package/docs/api/product-ar.mdx +5 -2
- package/docs/api/segmentation-overlay.mdx +1 -1
- package/docs/docs.json +29 -1
- package/docs/examples/lip-shaders.mdx +82 -33
- package/docs/guides/face-atlas-template.svg +1 -0
- package/docs/guides/face-atlas-textures.mdx +186 -0
- package/docs/guides/face-texture-template.svg +1 -0
- package/docs/guides/harness-debug-ui.mdx +4 -4
- package/docs/guides/lip-effect-textures.mdx +178 -102
- package/docs/guides/lip-uv-template.png +0 -0
- package/docs/guides/lip-uv-template.svg +1 -1
- package/docs/guides/makeup-design-textures.mdx +109 -0
- package/docs/introduction.mdx +1 -2
- package/package.json +11 -1
- package/dist/DebuggerUI-C-ldiozL.js +0 -269
- package/dist/DebuggerUI-CWX5EtQv.cjs +0 -1
- package/dist/FaceMeshRenderer-BEEXZwS6.cjs +0 -158
- package/dist/FaceMeshRenderer-UuH5sTXG.js +0 -1322
- package/dist/FaceRetouch-C7h7x9kd.js +0 -683
- package/dist/FaceRetouch-DqftT26Y.cjs +0 -134
- package/dist/GLTFLoader-C5q63sKO.js +0 -1633
- package/dist/GLTFLoader-Cb_CRwmG.cjs +0 -1
- package/dist/SegmentationOverlay-DQuW3dsc.js +0 -133
- package/dist/SegmentationOverlay-aWVod8Kl.cjs +0 -1
- package/dist/components/FaceWarp3D/FaceWarp3DHead.d.ts +0 -15
- package/dist/components/FaceWarp3D/defaults.d.ts +0 -37
- package/dist/components/FaceWarp3D/warp.d.ts +0 -13
- package/dist/contexts-CO0sd4JQ.cjs +0 -1
- package/dist/contexts-FzlnnMYD.js +0 -669
- package/dist/debug-ui/face-warp-3d/index.d.ts +0 -6
- package/dist/getFaceInfo-BkZfaQs-.js +0 -118
- package/dist/getFaceInfo-ahPxQFGu.cjs +0 -1
- package/dist/index--RgGzZ6X.cjs +0 -47
- package/dist/index-CHVbH0hz.js +0 -214
- package/dist/index-CeVkgsag.cjs +0 -1
- package/dist/index-CnGox6Xr.js +0 -3054
- package/dist/index-DKBAh6hV.cjs +0 -1
- package/dist/index-DsZwTfG0.cjs +0 -1
- package/dist/index-Dw6tj2Mi.js +0 -144
- package/dist/index-OCPjOaeP.cjs +0 -1
- package/dist/index-s9pF4zkG.js +0 -2053
- package/dist/internal-BYza1h8_.cjs +0 -1
- package/dist/measures-9dQPdw96.js +0 -154
- package/dist/measures-KfJzpvod.cjs +0 -1
- package/dist/providers-YNwkmNeK.cjs +0 -62
- package/dist/renderPasses-Cg-zqmEz.cjs +0 -21
- package/dist/screenTransform-BenfCtZt.js +0 -44
- package/dist/screenTransform-BiXdpVf0.cjs +0 -1
- package/dist/segmentation-9PhSvc-R.cjs +0 -1
- package/dist/segmentation-CeOTKemr.js +0 -5
- package/dist/selectors-C5G1PMYL.js +0 -195
- package/dist/selectors-Du_PsVnW.cjs +0 -1
- package/dist/session-BBr0yN8h.cjs +0 -31
- package/dist/session-Cy0m7l7-.js +0 -363
- package/dist/settings-DRR7-snV.cjs +0 -1
- package/dist/useFaceInfo-Blf7FCu3.js +0 -303
- 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
|
|
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 **
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
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
|
|
30
|
-
|
|
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
|
|
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
|
|
40
|
+
The template is the face atlas guide (`createFaceAtlasGuideSvg`) for the lips
|
|
41
|
+
and the mouth:
|
|
40
42
|
|
|
41
|
-
- **
|
|
42
|
-
|
|
43
|
-
- **
|
|
44
|
-
|
|
45
|
-
|
|
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
|
-
- **
|
|
49
|
+
- **Side labels** — image **left** is the person's **right**, on every feed.
|
|
48
50
|
|
|
49
|
-
Regenerate it after the
|
|
50
|
-
|
|
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
|
-
###
|
|
58
|
+
### Sides on every feed
|
|
57
59
|
|
|
58
|
-
|
|
59
|
-
|
|
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
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
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
|
-
|
|
68
|
-
|
|
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
|
|
73
|
-
|
|
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
|
|
84
|
-
const
|
|
85
|
-
const
|
|
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 `/
|
|
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
|
|
101
|
+
lips so the labelled sides can be checked against a real mouth.
|
|
97
102
|
|
|
98
|
-
## Presets and
|
|
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"
|
|
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
|
|
110
|
-
| `gloss` | Translucent colour with a strong,
|
|
111
|
-
| `matte` | Opaque,
|
|
112
|
-
| `tint` | Sheer wash of colour that keeps the natural lip |
|
|
113
|
-
| `metallic` |
|
|
114
|
-
| `gradient` | Ombre: strong colour at the mouth line fading at the outer edge |
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
`
|
|
120
|
-
`
|
|
121
|
-
|
|
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 `/
|
|
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
|
|
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,
|
|
157
|
-
|
|
158
|
-
`
|
|
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 `/
|
|
163
|
-
export the guide at 2048 px
|
|
164
|
-
`
|
|
165
|
-
|
|
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
|
|
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
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
`
|
|
199
|
-
|
|
200
|
-
|
|
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
|
|
206
|
-
|
|
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
|
|
228
|
-
|
|
229
|
-
|
|
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
|
-
|
|
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
|
-
|
|
318
|
+
float c = design.a * uPresence;
|
|
319
|
+
gl_FragColor = vec4(linearToOutputTexel(vec4(skin * paint, 1.0)).rgb * c, c);
|
|
254
320
|
}`}
|
|
255
|
-
|
|
321
|
+
{...MAKEUP_BLENDING}
|
|
256
322
|
depthWrite={false}
|
|
257
323
|
stencilWrite
|
|
258
|
-
stencilRef={
|
|
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 `/
|
|
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.
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
without ever writing to
|
|
279
|
-
|
|
280
|
-
exported so you can reuse
|
|
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
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
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.
|
package/docs/introduction.mdx
CHANGED
|
@@ -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
|
-
- `/
|
|
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
|
|