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