@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,183 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Face Instructions"
|
|
3
|
+
description: "Ask for a face expression with a 3D hint face and your own copy, detect it from the face blendshapes, and complete when it is held."
|
|
4
|
+
sidebarTitle: "Face Instructions"
|
|
5
|
+
icon: "face-smile-wink"
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
`FaceInstruction` asks the person for a face expression and waits for it. A cute, translucent 3D face
|
|
9
|
+
loops into the expression, your copy sits under it, and holding the expression for `holdMs` completes
|
|
10
|
+
it. It is the face counterpart of [Hand Instructions](/api/hand-instructions), with the same layout
|
|
11
|
+
and feedback. The pieces underneath are exported too: `useFaceExpression` (the detection alone) and
|
|
12
|
+
`FaceExpressionHint` (the face alone).
|
|
13
|
+
|
|
14
|
+
Import from `@vincentt-xr/sdk/instructions`. Everything is customisable: your own expressions,
|
|
15
|
+
detection logic, hint look and motion, text style, or a fully custom prompt. See
|
|
16
|
+
[Instructions](/api/instructions).
|
|
17
|
+
|
|
18
|
+
## Quick start
|
|
19
|
+
|
|
20
|
+
```tsx
|
|
21
|
+
import { useLoader } from "@react-three/fiber";
|
|
22
|
+
import { MeshoptDecoder } from "three/examples/jsm/libs/meshopt_decoder.module.js";
|
|
23
|
+
import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader.js";
|
|
24
|
+
import { FaceInstruction } from "@vincentt-xr/sdk/instructions";
|
|
25
|
+
|
|
26
|
+
const SmileToStart = ({ onStart }: { onStart: () => void }) => {
|
|
27
|
+
// face-v1.glb is meshopt-compressed, so the loader needs the meshopt decoder.
|
|
28
|
+
const face = useLoader(GLTFLoader, faceUrl, (loader) => loader.setMeshoptDecoder(MeshoptDecoder));
|
|
29
|
+
return (
|
|
30
|
+
<FaceInstruction
|
|
31
|
+
expression="smile"
|
|
32
|
+
text="Smile to start"
|
|
33
|
+
model={face.scene}
|
|
34
|
+
onComplete={onStart}
|
|
35
|
+
/>
|
|
36
|
+
);
|
|
37
|
+
};
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
Mount it inside `XRScene`. It acquires the face model itself, so you don't need a `FaceTracker`, and
|
|
41
|
+
draws over the AR content in its own screen-space layer (`INSTRUCTION_RENDER_ORDER` = 2000 and up).
|
|
42
|
+
Detection reads MediaPipe's face blendshapes.
|
|
43
|
+
|
|
44
|
+
## `FaceInstruction`
|
|
45
|
+
|
|
46
|
+
| Prop | Default | What it does |
|
|
47
|
+
| ---------------- | -------------------------------- | ------------------------------------------------------------------------------------------------------- |
|
|
48
|
+
| `expression` | — | What to ask for: a `FACE_EXPRESSIONS` name or your own `defineFaceExpression(…)`. |
|
|
49
|
+
| `model` | — | The hint face: morph targets named like the expressions (e.g. `face-v1.glb`'s scene). |
|
|
50
|
+
| `text` | the expression's `label` | Your copy, in any language. Long text shrinks to fit. |
|
|
51
|
+
| `doneText` | keep `text` | Copy shown once completed, while it fades out. |
|
|
52
|
+
| `nudgeText` | `"Show your face to the camera"` | Second line after `nudgeAfterMs` with no face in view; the hint pulses. `null` turns it off. |
|
|
53
|
+
| `nudgeAfterMs` | `3000` | How long without a face before the nudge. |
|
|
54
|
+
| `faceIndex` | `0` | Which detected face to read. |
|
|
55
|
+
| `holdMs` | `400` | How long the expression must be held. |
|
|
56
|
+
| `graceMs` | `150` | Dropouts shorter than this don't restart the hold. |
|
|
57
|
+
| `size` | `"md"` | `"sm"`, `"md"`, `"lg"`: 10 / 14 / 19 % of the screen height; or a fraction of it. |
|
|
58
|
+
| `placement` | `"center"` | `"top"`, `"center"` or `"bottom"`. |
|
|
59
|
+
| `offset` | `[0, 0]` | Shift from the placement, in half-screens. |
|
|
60
|
+
| `orbit` | `30` | The hint's auto orbit, degrees to each side. `0` holds it still. |
|
|
61
|
+
| `look` | `FACE_HINT_LOOK` | The hint's look, merged over the default: ghost, per-part tints, halo, glow, material. |
|
|
62
|
+
| `loop` | `FACE_HINT_LOOP` | The hint's loop: `seconds`, `hold`, `from`, `easing`. |
|
|
63
|
+
| `color` | `"#ffffff"` | Text colour, with a soft dark shadow so it reads on any camera feed. |
|
|
64
|
+
| `textStyle` … | — | `textStyle`, `nudgeTextStyle`, `renderText`, `motion`, `layout`: see [Instructions](/api/instructions). |
|
|
65
|
+
| `onComplete` | — | Called once when the expression is held long enough. |
|
|
66
|
+
| `onStatusChange` | — | Called once with the first status, then on every change. |
|
|
67
|
+
| `hideOnComplete` | `true` | Fade out after completing. A small pop and a white ring play either way. |
|
|
68
|
+
| `active` | `true` | `false` hides it and pauses detection. |
|
|
69
|
+
|
|
70
|
+
`onStatusChange` reports an `InstructionStatus`:
|
|
71
|
+
|
|
72
|
+
- `"waiting"`: no face in view.
|
|
73
|
+
- `"detected"`: a face in view, not making the expression.
|
|
74
|
+
- `"holding"`: making it; the hold is running.
|
|
75
|
+
- `"done"`: completed.
|
|
76
|
+
|
|
77
|
+
## Expressions
|
|
78
|
+
|
|
79
|
+
| Name | Default copy | Recognised when (MediaPipe blendshapes, 0..1) |
|
|
80
|
+
| ------------ | ------------------ | ----------------------------------------------------------------------------- |
|
|
81
|
+
| `smile` | Give a big smile | `mouthSmileLeft` and `mouthSmileRight` ≥ 0.45 |
|
|
82
|
+
| `wink` | Wink at the camera | one `eyeBlink` ≥ 0.55 and the other ≤ 0.3 (either eye) |
|
|
83
|
+
| `surprised` | Look surprised | `jawOpen` ≥ 0.35 and `browInnerUp` ≥ 0.4 |
|
|
84
|
+
| `kiss` | Blow a kiss | `mouthPucker` ≥ 0.5 and `jawOpen` ≤ 0.3 |
|
|
85
|
+
| `puffCheeks` | Puff your cheeks | `cheekPuff` ≥ 0.3 |
|
|
86
|
+
| `frown` | Frown | `browDownLeft` and `browDownRight` ≥ 0.4 |
|
|
87
|
+
| `scrunch` | Scrunch your face | both `noseSneer` ≥ 0.3, or both `eyeSquint` ≥ 0.45 with both `browDown` ≥ 0.3 |
|
|
88
|
+
|
|
89
|
+
Several can match at once: a scrunch usually also counts as a frown.
|
|
90
|
+
|
|
91
|
+
## Detection only: `useFaceExpression`
|
|
92
|
+
|
|
93
|
+
```tsx
|
|
94
|
+
import { useFaceExpression } from "@vincentt-xr/sdk/instructions";
|
|
95
|
+
|
|
96
|
+
const { status, holdRef, matchedRef, faceRef, isInView, reset } = useFaceExpression("wink", {
|
|
97
|
+
holdMs: 400,
|
|
98
|
+
onComplete: () => unlock(),
|
|
99
|
+
});
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
`status` (`"waiting"` → `"holding"` → `"done"`) re-renders only when it changes. Read
|
|
103
|
+
`holdRef.current.progress` (0..1) and `faceRef.current` (the latest `FaceInfo`, or `null`) inside
|
|
104
|
+
`useFrame`. `reset()` asks again. The result is an `InstructionDetector`, so it can drive a custom
|
|
105
|
+
`<Instruction>`.
|
|
106
|
+
|
|
107
|
+
A rule, a match function `(blendshapes, face) => boolean` or a definition works anywhere an
|
|
108
|
+
expression name does. A `FaceExpressionRule` has:
|
|
109
|
+
|
|
110
|
+
- `atLeast`: per blendshape, the minimum score.
|
|
111
|
+
- `atMost`: per blendshape, the maximum score.
|
|
112
|
+
- `anyOf`: sub-rules, one of which must pass.
|
|
113
|
+
|
|
114
|
+
```tsx
|
|
115
|
+
useFaceExpression({ atLeast: { jawOpen: 0.6 }, atMost: { mouthSmileLeft: 0.2 } });
|
|
116
|
+
useFaceExpression((b) => (b.mouthSmileLeft ?? 0) - (b.mouthSmileRight ?? 0) > 0.4); // a half smile
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
The checks are pure: `matchFaceExpression(face.blendshapes, nameOrRule)` and
|
|
120
|
+
`matchingFaceExpressions(face.blendshapes)`.
|
|
121
|
+
|
|
122
|
+
## The hint face: `FaceExpressionHint`
|
|
123
|
+
|
|
124
|
+
```tsx
|
|
125
|
+
<FaceExpressionHint expression="surprised" model={face.scene} height={0.4} />
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
The face alone, for your own layout. It is fitted to `height` (parent units) and plays the
|
|
129
|
+
expression's morph target (`FACE_EXPRESSIONS[name].hint.target`, or pass `expression={{ target }}`,
|
|
130
|
+
or a weighted mix `expression={{ targets: { surprised: 1, wink: 1 } }}`)
|
|
131
|
+
from the idle face and back, while slowly orbiting side to side. The default look:
|
|
132
|
+
|
|
133
|
+
- **Ghost:** translucent white with a brighter rim, the same as the hand hint.
|
|
134
|
+
- **Tinted features:** each part is tinted by its material name (`iris`, `brow`, `lash`, `lip`,
|
|
135
|
+
`mouth_inside`, `tongue`, `sparkle`, `eye_white`), so the expression reads at small size.
|
|
136
|
+
- **Halo:** a soft dark edge so it reads on light backgrounds (`look.halo`).
|
|
137
|
+
- **Glow:** a soft light from behind the head, brightening as the expression forms (`look.glow`). It
|
|
138
|
+
is a separate disc behind the face, so it never shows as inner layers.
|
|
139
|
+
|
|
140
|
+
`look` is merged over `FACE_HINT_LOOK` (retint a part with `look.parts.iris`, drop a tint with
|
|
141
|
+
`null`, `false` turns a layer off, `look.material` replaces the ghost). A custom face works if its meshes carry morph targets named like the
|
|
142
|
+
expressions and it faces +Z.
|
|
143
|
+
|
|
144
|
+
## The example model
|
|
145
|
+
|
|
146
|
+
`assets-src/faces/face-v1.blend` and `build_face.py` (README beside them) build the face from scratch,
|
|
147
|
+
with no third-party asset. The model is one mesh with nine materials and one fixed morph target per
|
|
148
|
+
expression: `smile`, `wink`, `surprised`, `kiss`, `puffCheeks`, `frown`, `scrunch`. The idle face is
|
|
149
|
+
the base shape, and the cheek blush is in `COLOR_0`.
|
|
150
|
+
|
|
151
|
+
Each expression is computed exactly rather than mixed from smaller keys, so the eyelids never cut
|
|
152
|
+
through the eyes. The raw export is ~1.8 MB; `gltf-transform meshopt` brings it to ~255 KB (~105 KB
|
|
153
|
+
gzipped) with every shape within 0.02 mm.
|
|
154
|
+
|
|
155
|
+
## Example
|
|
156
|
+
|
|
157
|
+
`/face-instructions` covers:
|
|
158
|
+
|
|
159
|
+
- every expression as a chip, and a sequence mode that moves to the next expression when one
|
|
160
|
+
completes;
|
|
161
|
+
- text, nudge, size, placement and hold-time controls;
|
|
162
|
+
- a live readout of the status, the blendshapes the rules read, and the matching expressions.
|
|
163
|
+
|
|
164
|
+
## Manual visual test plan
|
|
165
|
+
|
|
166
|
+
Open `/face-instructions`.
|
|
167
|
+
|
|
168
|
+
1. **Every hint reads**: step through all seven chips. The face loops into each expression: closed
|
|
169
|
+
happy eyes and an open smile, a left wink, wide eyes with an O, a pucker, puffed cheeks (clearest
|
|
170
|
+
mid-orbit), slanted brows with a downturned mouth, squinted slits. It stays inside its slot through
|
|
171
|
+
the orbit.
|
|
172
|
+
2. **Looks**: the ghost is translucent with no back layers showing through, the eyes, brows and
|
|
173
|
+
mouth stay clear, and the halo separates it from a white shirt.
|
|
174
|
+
3. **Detection**: on the webcam, make each expression. The readout's matches list it and the status
|
|
175
|
+
goes `holding` → `done`. A resting face matches nothing; a wink with either eye works; blinking
|
|
176
|
+
both eyes is not a wink.
|
|
177
|
+
4. **Completion**: on done, a small pop and a white ring play. With sequence on, it fades out and the
|
|
178
|
+
next expression comes in.
|
|
179
|
+
5. **Nudge**: turn away for 3 s. The second line fades in and the hint pulses; it fades out when your
|
|
180
|
+
face is back. With the nudge off it never appears.
|
|
181
|
+
6. **Copy and layout**: type custom text, switch sizes and top / center / bottom placement. Nothing
|
|
182
|
+
overlaps the screen edge.
|
|
183
|
+
7. **Hands unchanged**: `/hand-instructions` looks and behaves as before (both use the same layout).
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Face Liquify"
|
|
3
|
+
description: "2D liquify on the live face: bigger eyes, a slimmer jaw, a smile, a swirl. Eleven presets by weight, your own warps on named face points, every tracked face, with makeup, glasses and hats warping along."
|
|
4
|
+
sidebarTitle: "Face Liquify"
|
|
5
|
+
icon: "face-grin-stars"
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
`FaceLiquify` reshapes faces on screen with local 2D warps, like a liquify brush that follows the
|
|
9
|
+
face.
|
|
10
|
+
|
|
11
|
+
- **Everything on the face warps together.** It warps the picture after everything 3D is drawn: the
|
|
12
|
+
camera, makeup and lips, face effects, glasses, hats and earrings.
|
|
13
|
+
- **Screen UI stays sharp.** `ScreenImage`, `ScreenText` and other screen UI draw after it.
|
|
14
|
+
- **Weight 0 is the untouched image**, byte for byte.
|
|
15
|
+
|
|
16
|
+
Import from `@vincentt-xr/sdk/face-effects`.
|
|
17
|
+
|
|
18
|
+
## Quick start
|
|
19
|
+
|
|
20
|
+
```tsx
|
|
21
|
+
import { VideoBackground, XRScene } from "@vincentt-xr/sdk";
|
|
22
|
+
import { FaceLiquify } from "@vincentt-xr/sdk/face-effects";
|
|
23
|
+
|
|
24
|
+
<XRScene>
|
|
25
|
+
<VideoBackground />
|
|
26
|
+
<FaceLiquify weights={{ bigEyes: 1, slimJaw: 1 }} />
|
|
27
|
+
</XRScene>;
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
It starts the face model itself; no `FaceTracker` is needed.
|
|
31
|
+
|
|
32
|
+
## FaceLiquify or FaceWarp3D?
|
|
33
|
+
|
|
34
|
+
| | `FaceLiquify` | [`FaceWarp3D`](/api/face-warp-3d) |
|
|
35
|
+
| --------- | ----------------------------------------------------------------- | ------------------------------------------------------- |
|
|
36
|
+
| How | 2D warps of the screen image around the face | Blend shapes on the face mesh, wearing the camera image |
|
|
37
|
+
| Warps | Everything drawn on the face: makeup, face effects, accessories | The face surface; makeup nested in it rides it |
|
|
38
|
+
| Authoring | Presets and warps in code, no model | Shape keys sculpted in Blender |
|
|
39
|
+
| Best for | Beauty tweaks, cartoon eyes and mouths, swirls, quick fun filters | Character proportions that follow the face in 3D |
|
|
40
|
+
|
|
41
|
+
They combine: the liquify warps the `FaceWarp3D` face too.
|
|
42
|
+
|
|
43
|
+
## Presets and weights
|
|
44
|
+
|
|
45
|
+
`weights` sets each preset from 0 to 3:
|
|
46
|
+
|
|
47
|
+
- **1** is a subtle, natural look.
|
|
48
|
+
- **2** is clearly stylised.
|
|
49
|
+
- **3** is the strongest cartoon look before the image would fold over itself.
|
|
50
|
+
|
|
51
|
+
There are no negative weights; out-of-range values clamp.
|
|
52
|
+
|
|
53
|
+
| Preset | Does |
|
|
54
|
+
| -------------- | -------------------------------- |
|
|
55
|
+
| `bigEyes` | Magnifies both eyes |
|
|
56
|
+
| `smallNose` | Shrinks the nose |
|
|
57
|
+
| `bigMouth` | Magnifies the mouth |
|
|
58
|
+
| `smile` | Lifts both mouth corners |
|
|
59
|
+
| `chubbyCheeks` | Puffs both cheeks |
|
|
60
|
+
| `slimJaw` | Pushes both jaw angles in and up |
|
|
61
|
+
| `slimFace` | Pushes both sides of the face in |
|
|
62
|
+
| `longChin` | Pulls the chin down |
|
|
63
|
+
| `bigForehead` | Magnifies the forehead |
|
|
64
|
+
| `bigHead` | Magnifies the whole face |
|
|
65
|
+
| `swirl` | Twists the face about its centre |
|
|
66
|
+
|
|
67
|
+
`weight` (0..1) fades everything at once, linearly. Pass a ref to animate it without re-rendering:
|
|
68
|
+
|
|
69
|
+
```tsx
|
|
70
|
+
const amount = useRef(0);
|
|
71
|
+
useFrame(({ clock }) => {
|
|
72
|
+
amount.current = (1 - Math.cos(clock.elapsedTime * 1.6)) / 2;
|
|
73
|
+
});
|
|
74
|
+
<FaceLiquify weights={{ bigEyes: 3 }} weight={amount} />;
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
`weights` takes a ref too.
|
|
78
|
+
|
|
79
|
+
## Your own warps
|
|
80
|
+
|
|
81
|
+
`warps` adds warps by name; set their weight in `weights` (a custom warp without a weight draws as
|
|
82
|
+
authored, at weight 3).
|
|
83
|
+
|
|
84
|
+
```tsx
|
|
85
|
+
<FaceLiquify
|
|
86
|
+
warps={{
|
|
87
|
+
pointyChin: { kind: "stretch", at: "chin", radius: 0.6, strength: 0.8, direction: [0, -1] },
|
|
88
|
+
elfEars: {
|
|
89
|
+
kind: "push",
|
|
90
|
+
at: "leftFaceSide",
|
|
91
|
+
offset: [0.2, 0.6],
|
|
92
|
+
radius: 0.4,
|
|
93
|
+
strength: 0.7,
|
|
94
|
+
direction: [0.6, 1],
|
|
95
|
+
mirror: true,
|
|
96
|
+
},
|
|
97
|
+
}}
|
|
98
|
+
weights={{ pointyChin: 2, elfEars: 3 }}
|
|
99
|
+
/>
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
| Field | Meaning |
|
|
103
|
+
| ----------- | -------------------------------------------------------------------------------------------------------------------- |
|
|
104
|
+
| `kind` | `bulge` (magnify), `pinch` (shrink), `push` (move along `direction`), `stretch` (magnify along `direction`), `swirl` |
|
|
105
|
+
| `at` | A named point (below) or `{ landmark: n }`, a MediaPipe face landmark |
|
|
106
|
+
| `offset` | From `at`, in eye distances: x toward the person's own left, y up the face |
|
|
107
|
+
| `radius` | The circle it changes, in eye distances (the 3D distance between the eye centres) |
|
|
108
|
+
| `strength` | 0..1: the share of the kind's limit at weight 3. At 1 it is the most that kind can do without folding |
|
|
109
|
+
| `direction` | `push` and `stretch`: the way the content moves, in face axes. Default up the face |
|
|
110
|
+
| `clockwise` | `swirl`: turn the other way |
|
|
111
|
+
| `mirror` | Also apply it on the other side of the face |
|
|
112
|
+
|
|
113
|
+
Named points: `leftEye`, `rightEye`, `noseTip`, `noseBridge`, `mouth`, `leftMouthCorner`,
|
|
114
|
+
`rightMouthCorner`, `chin`, `leftJaw`, `rightJaw`, `leftCheek`, `rightCheek`, `leftFaceSide`,
|
|
115
|
+
`rightFaceSide`, `forehead`, `faceCenter`. Left and right are the person's own sides on every feed.
|
|
116
|
+
|
|
117
|
+
Warps apply one after another, so together they never fold either. A face holds at most 32 warps.
|
|
118
|
+
Memoise the `warps` object: a new object re-resolves the warps.
|
|
119
|
+
|
|
120
|
+
## Faces, fades and turned heads
|
|
121
|
+
|
|
122
|
+
- **Every tracked face** warps, up to four, each its own pass. `faceIndex` picks one; `numFaces` sets
|
|
123
|
+
how many faces the face model tracks.
|
|
124
|
+
- **Fades:** a face fades in over 150 ms when found, holds through a dropout of up to 250 ms, then
|
|
125
|
+
fades out over 120 ms.
|
|
126
|
+
- **Turned heads:** a warp on one side of the face fades as that side turns away, so the far cheek
|
|
127
|
+
never smears over the nose.
|
|
128
|
+
- **Smoothing:** landmarks are smoothed as face swap's are (`smoothing`, default 0.35; 0 is raw).
|
|
129
|
+
|
|
130
|
+
## Hands in front (experimental)
|
|
131
|
+
|
|
132
|
+
With `HandCutout` in the scene, a hand over the face stays sharp: hand pixels are never warped, and a
|
|
133
|
+
warp never pulls a hand into the face.
|
|
134
|
+
|
|
135
|
+
```tsx
|
|
136
|
+
import { HandCutout, HandTracker } from "@vincentt-xr/sdk/tracking";
|
|
137
|
+
|
|
138
|
+
<>
|
|
139
|
+
<HandTracker>
|
|
140
|
+
<HandCutout />
|
|
141
|
+
</HandTracker>
|
|
142
|
+
<FaceLiquify weights={{ bigMouth: 2 }} />
|
|
143
|
+
</>;
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
Without `HandCutout`, a hand over the face warps with it.
|
|
147
|
+
|
|
148
|
+
## Props
|
|
149
|
+
|
|
150
|
+
| Prop | Default | Meaning |
|
|
151
|
+
| ------------- | ------------------ | ----------------------------------------------------------------------------- |
|
|
152
|
+
| `weights` | `{}` (nothing) | Preset and custom-warp weights by name, 0..3, or a ref read every frame |
|
|
153
|
+
| `warps` | none | Your own warps by name |
|
|
154
|
+
| `weight` | 1 | Overall fade 0..1, or a ref |
|
|
155
|
+
| `faceIndex` | every tracked face | Only this face (default: the enclosing `FaceTracker`'s face, else every face) |
|
|
156
|
+
| `numFaces` | 1 | Faces the face model tracks when this starts it |
|
|
157
|
+
| `smoothing` | 0.35 | Landmark smoothing 0..1 |
|
|
158
|
+
| `active` | true | False: no model, no copy, nothing drawn |
|
|
159
|
+
| `debug` | false | Draws each warp's circle and direction, and the face's points |
|
|
160
|
+
| `renderOrder` | 998 | The pass's render order |
|
|
161
|
+
|
|
162
|
+
## Limits
|
|
163
|
+
|
|
164
|
+
- **Draw order.** The warp draws at render order 998. Content drawn after it stays sharp: screen UI
|
|
165
|
+
(999+), a transparent mesh placed directly inside a tracker (wrap it in a `<group>` to warp it),
|
|
166
|
+
your own content at 998 or above.
|
|
167
|
+
- **Opaque screen UI** (`transparent={false}`) draws before it and warps.
|
|
168
|
+
- **Render targets.** Multisampled or float targets (effect composers), WebXR and multi-target passes
|
|
169
|
+
are drawn unwarped, with one console warning.
|
|
170
|
+
- **Cost.** Each face copies and redraws only its warp area. Check phone performance before shipping a
|
|
171
|
+
multi-face effect.
|
|
172
|
+
|
|
173
|
+
## Example
|
|
174
|
+
|
|
175
|
+
`/face-warp` in the SDK playground, mode "2D liquify", has the preset sliders, a custom-warp editor
|
|
176
|
+
that shows the code to paste, an animate toggle, one or two faces, hands in front and the debug
|
|
177
|
+
circles. Settings are in the URL: `?lq=bigEyes:1,smile:2`, `?lqdebug=1`, `?lqanim=1`,
|
|
178
|
+
`?lqfaces=2`, `?hands=0`. Mode "both" adds the 3D shape keys under the liquify.
|
|
179
|
+
|
|
180
|
+
## Manual visual test plan
|
|
181
|
+
|
|
182
|
+
Open `/face-warp` on the webcam.
|
|
183
|
+
|
|
184
|
+
1. **Weight 0** (all presets off): the image is untouched. No edge, band or shimmer around the face.
|
|
185
|
+
2. **Each preset at 1, then 3**: 1 looks natural, 3 is a strong cartoon. No tearing, no fold, no hard
|
|
186
|
+
circle edge.
|
|
187
|
+
3. **Sides**: with debug on, the circles sit on your own eyes, mouth corners, jaw and chin, and follow
|
|
188
|
+
tilt and turn.
|
|
189
|
+
4. **Turned head**: turn far to one side with `chubbyCheeks` at 3. The far cheek fades instead of
|
|
190
|
+
smearing over the nose.
|
|
191
|
+
5. **Dropout**: cover the camera for a moment. The warp holds briefly, then fades out; it fades back
|
|
192
|
+
in when you reappear.
|
|
193
|
+
6. **Hands**: with hands in front, put a hand over your mouth with `bigMouth` at 3. The hand keeps its
|
|
194
|
+
real size, with no hand colour spreading into the face. Show a hand away from your face: no hole
|
|
195
|
+
appears in the warp.
|
|
196
|
+
7. **Two faces**: faces "two" on the two-people clip warps both people.
|
package/docs/api/face-mesh.mdx
CHANGED
|
@@ -108,14 +108,13 @@ subtracts Y while adding X/Z. `DEFAULT_FACE_MESH_TRANSFORM.position.y` is
|
|
|
108
108
|
backwards compatibility. New scene-object work should use `FaceMeshRenderer`.
|
|
109
109
|
|
|
110
110
|
```tsx
|
|
111
|
-
import { CanonicalFaceMeshRenderer
|
|
111
|
+
import { CanonicalFaceMeshRenderer } from "@vincentt-xr/sdk/face-effects";
|
|
112
112
|
|
|
113
113
|
<CanonicalFaceMeshRenderer
|
|
114
114
|
materialType="shader"
|
|
115
115
|
shaderPreset="originalFace"
|
|
116
116
|
textureMap="none"
|
|
117
117
|
alphaMap="canonical"
|
|
118
|
-
faceWarp3D={FACE_WARP_3D_PRESET}
|
|
119
118
|
/>;
|
|
120
119
|
```
|
|
121
120
|
|
|
@@ -126,8 +125,6 @@ import { CanonicalFaceMeshRenderer, FACE_WARP_3D_PRESET } from "@vincentt-xr/sdk
|
|
|
126
125
|
|
|
127
126
|
## FaceWarp3D
|
|
128
127
|
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
`CanonicalFaceMeshRenderer` or `FaceMeshRenderer` settings instead of writing a
|
|
133
|
-
second landmark deformation path.
|
|
128
|
+
To reshape the face (bigger eyes, a longer nose), use [`FaceWarp3D`](/api/face-warp-3d). It applies
|
|
129
|
+
blend shapes on the live face, with the camera image itself as the texture. It replaces the old
|
|
130
|
+
proportion sliders and `CanonicalFaceMeshRenderer`'s `faceWarp3D` prop.
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Face Morph"
|
|
3
|
+
description: "The person's face morphs into another shape (a sphere, a cube, a character), wearing their live camera face all the way."
|
|
4
|
+
sidebarTitle: "Face Morph"
|
|
5
|
+
icon: "wand-magic-sparkles"
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
`FaceMorph` morphs the person's face into another shape: a sphere, a cube, or a character. The shape
|
|
9
|
+
wears their live camera face all the way, as in Snap Lens Studio's Face Morph.
|
|
10
|
+
|
|
11
|
+
- `weight` 0 is the live face itself, so the image is unchanged.
|
|
12
|
+
- `weight` 1 is the shape, which still moves with the person's expression.
|
|
13
|
+
|
|
14
|
+
Animate the weight for the transformation.
|
|
15
|
+
|
|
16
|
+
It is part of the face-character pipeline ([#194](https://github.com/vincentt-xr/sdk/issues/194)).
|
|
17
|
+
Import from `@vincentt-xr/sdk/face-effects`.
|
|
18
|
+
|
|
19
|
+
## Quick start
|
|
20
|
+
|
|
21
|
+
```tsx
|
|
22
|
+
import { FaceMorph } from "@vincentt-xr/sdk/face-effects";
|
|
23
|
+
import { FaceTracker } from "@vincentt-xr/sdk/tracking";
|
|
24
|
+
|
|
25
|
+
<FaceTracker>
|
|
26
|
+
<FaceMorph shape="sphere" weight={0.8} />
|
|
27
|
+
</FaceTracker>;
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## FaceMorph or FaceWarp3D?
|
|
31
|
+
|
|
32
|
+
`FaceMorph` turns the face into another object (a ball, a box, a stylised character) that wears the camera
|
|
33
|
+
face. To reshape the person's real face instead (bigger eyes, a longer nose, a cartoon's proportions,
|
|
34
|
+
photoreal, with their own hair and skin), use [`FaceWarp3D`](/api/face-warp-3d). On a realistic head model,
|
|
35
|
+
`FaceMorph` shows the model's own material on the skull and ears, while `FaceWarp3D` keeps the person's
|
|
36
|
+
real hair. Use one face effect per face.
|
|
37
|
+
|
|
38
|
+
## Shapes
|
|
39
|
+
|
|
40
|
+
- **Built-in `"sphere"` and `"cube"`.** These are the face itself, with the eyes and mouth closed
|
|
41
|
+
over, subdivided and pushed out onto the shape. They fade out at the edge of the face.
|
|
42
|
+
- **Your own model**, authored in the canonical head frame (centimetres, as for
|
|
43
|
+
[`ExternalFaceMesh`](/api/external-face-mesh)). Two things matter:
|
|
44
|
+
|
|
45
|
+
- its **base positions**: where it sits on a face. These bind it.
|
|
46
|
+
- a **shape key** named `"morph"` (`morphKey`): what it becomes.
|
|
47
|
+
|
|
48
|
+
In Blender, start from a mesh fitted to the face (the basis), sculpt the shape key, and export
|
|
49
|
+
glTF. A model without the key is its own base. For example, facecap morphs into its own shape.
|
|
50
|
+
|
|
51
|
+
Every vertex is bound through its base pose to its closest point on the face, within `falloff` cm:
|
|
52
|
+
|
|
53
|
+
- A vertex beyond that keeps to the shape, so a skull or the back of a head stays put.
|
|
54
|
+
- Parts named `eye…` wear your eyes.
|
|
55
|
+
- Teeth keep their own material.
|
|
56
|
+
|
|
57
|
+
## Props
|
|
58
|
+
|
|
59
|
+
| Prop | Default | What it does |
|
|
60
|
+
| ----------------------------------- | --------- | ---------------------------------------------------------------------------------------------------- |
|
|
61
|
+
| `shape` | — | `"sphere"`, `"cube"`, or a model (`THREE.Object3D`). |
|
|
62
|
+
| `weight` | `1` | 0 = the live face, 1 = the shape. Also a ref (`LiveValue`), read every frame. |
|
|
63
|
+
| `expression` | `1` | How strongly the shape takes the expression (Snap's Expression Multiplier). Also a ref. |
|
|
64
|
+
| `scale` | `1` | Scale of the shape around the head (Snap's External Scale). |
|
|
65
|
+
| `morphKey` | `"morph"` | The shape key a model morphs into. |
|
|
66
|
+
| `faceTexture` | `1` | How much of the camera face it wears: 0 shows the model's own material (a character's skin). |
|
|
67
|
+
| `region` | `"face"` | `"face"`, `"eyes"`, `"mouth"` or `"eyesAndMouth"` (see [Face Reprojection](/api/face-reprojection)). |
|
|
68
|
+
| `shading` | `"unlit"` | `"unlit"`: the camera's colours. `"lit"`: shaded by the scene lights. |
|
|
69
|
+
| `color` | `#f1c6a8` | A built-in shape's colour where it shows no face. |
|
|
70
|
+
| `subdivisions` | `2` | Smoothness of a built-in shape. |
|
|
71
|
+
| `falloff` | `[1, 3]` | How far from the face (cm, base pose) a vertex still morphs and wears it. |
|
|
72
|
+
| `facing`, `fps`, `unwrapResolution` | — | As for Face Reprojection. |
|
|
73
|
+
| rig props | — | `faceIndex`, `smoothing`, `holdMs`, `neutral` … (when it runs its own `FaceRig`). |
|
|
74
|
+
|
|
75
|
+
## How it works
|
|
76
|
+
|
|
77
|
+
1. **Live face.** Every frame, the live face (`FaceRigState.local`) and its expression
|
|
78
|
+
(`residual`) are read on the filled canonical face. The eye and mouth centres are the
|
|
79
|
+
averages of their rings.
|
|
80
|
+
2. **Blend.** Each vertex blends from its bound point on the live face to its shape position plus
|
|
81
|
+
the expression, by `weight` and by how close it is to the face.
|
|
82
|
+
3. **Texture.** The face texture is the reprojector's unwrap, the camera face in the canonical
|
|
83
|
+
layout. Each vertex reads it through its `faceUv` / `faceCoverage` attributes, so no remap pass
|
|
84
|
+
is needed.
|
|
85
|
+
|
|
86
|
+
**Pure pieces:** `createFaceMorphShape`, `createFaceMorphLive`, `writeFaceMorphLive` and
|
|
87
|
+
`stepFaceMorph`.
|
|
88
|
+
|
|
89
|
+
## Example
|
|
90
|
+
|
|
91
|
+
`/face-morph` offers four shapes:
|
|
92
|
+
|
|
93
|
+
- the sphere;
|
|
94
|
+
- the cube;
|
|
95
|
+
- a **Lens Studio-style head**, sculpted from Snap's face + skull + ears mesh (a "chibi" shape key
|
|
96
|
+
with a bigger skull, puffed cheeks, a small chin and bigger ears);
|
|
97
|
+
- the **facecap** character.
|
|
98
|
+
|
|
99
|
+
The last two are local, git-ignored files. The page has controls for weight (or a looping
|
|
100
|
+
animation), expression, scale, face texture, region and shading.
|
|
101
|
+
|
|
102
|
+
## Manual visual test plan
|
|
103
|
+
|
|
104
|
+
Open `/face-morph` on the webcam.
|
|
105
|
+
|
|
106
|
+
1. **Weight 0**: nothing changes. The mesh is exactly your face, with no edge or band.
|
|
107
|
+
2. **Sphere / cube at 1**: your face is on a ball or a box, sharp and centred. The edges fade into
|
|
108
|
+
the camera image.
|
|
109
|
+
3. **Animate**: the face swells into the shape and back, smoothly and without popping.
|
|
110
|
+
4. **Expressions**: at weight 1, open your mouth, smile, blink and raise your brows. The shape does
|
|
111
|
+
too, and `expression` scales it.
|
|
112
|
+
5. **Lens Studio head**: the skull, cheeks and ears grow as the weight rises. Your face stays on it
|
|
113
|
+
and the ears stay on the head.
|
|
114
|
+
6. **facecap + face texture**: lower "face texture" and your face fades into facecap's skin. Your
|
|
115
|
+
eyes stay on its eyeballs until it is fully faded.
|
|
116
|
+
7. **Head turn and dropout**: the shape turns with the head, holds through a short dropout, hides
|
|
117
|
+
when the face is lost, and comes back.
|
|
@@ -31,3 +31,10 @@ inspector controls to show for the active material state.
|
|
|
31
31
|
Geometry visibility is grouped by FaceMesh part: left eye, right eye, mouth,
|
|
32
32
|
and nose. Use `CANONICAL_FACE_MESH_GEOMETRY_SPECS` when an inspector needs the
|
|
33
33
|
runtime group order instead of hardcoding another list.
|
|
34
|
+
|
|
35
|
+
The `showLeftEye…` / `showRightEye…` settings are the person's own eyes on
|
|
36
|
+
every feed (GROUNDING "Left and right"). The mesh's `"left-eye"` /
|
|
37
|
+
`"right-eye"` groups are screen sides (`"left-eye"` is always the eye on the
|
|
38
|
+
screen's left); the renderer maps the settings onto them with
|
|
39
|
+
`resolveFaceMeshEyeVisibility(person, mirrored)`, which swaps them on
|
|
40
|
+
unmirrored feeds.
|