@vincentt-xr/sdk 2.0.0-alpha.7 → 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 +5651 -82
- 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/cache.d.ts +99 -0
- package/dist/assets/estimate.d.ts +11 -0
- package/dist/assets/gltfLoader.d.ts +16 -0
- package/dist/assets/index.d.ts +7 -0
- package/dist/assets/loaders.d.ts +43 -0
- package/dist/assets/react.d.ts +33 -0
- 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 +75 -0
- package/dist/calibration/index.d.ts +6 -0
- package/dist/calibration/storage.d.ts +13 -0
- package/dist/calibration/types.d.ts +53 -0
- package/dist/calibration/useXRCalibration.d.ts +46 -0
- package/dist/camera/CameraPermissionGate.d.ts +26 -0
- package/dist/camera/devices.d.ts +26 -0
- package/dist/camera/index.d.ts +8 -0
- package/dist/camera/permission.d.ts +86 -0
- package/dist/camera/useCameraPermission.d.ts +35 -0
- package/dist/canonicalFace-BHwyCx1c.js +9 -0
- package/dist/canonicalFace-C83I225R.cjs +1 -0
- package/dist/capabilities/detect.d.ts +45 -0
- package/dist/capabilities/index.d.ts +5 -0
- package/dist/capabilities/types.d.ts +120 -0
- package/dist/capabilities/useXRCapabilities.d.ts +18 -0
- package/dist/compat/environment.d.ts +5 -0
- package/dist/compat/index.d.ts +4 -0
- package/dist/compat/run.d.ts +18 -0
- package/dist/compat/scenarios.d.ts +10 -0
- package/dist/compat/types.d.ts +101 -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 +17 -0
- 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 +37 -5
- package/dist/components/FaceMesh/canonical/geometryGroups.d.ts +21 -0
- package/dist/components/FaceMesh/canonical/parseCanonicalFaceModel.d.ts +21 -0
- package/dist/components/FaceMesh/canonical/shaders.d.ts +1 -1
- package/dist/components/FaceMesh/index.d.ts +2 -2
- 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/GestureListener/index.d.ts +11 -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/HandTracker/index.d.ts +10 -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/HolisticTracker/index.d.ts +69 -0
- package/dist/components/HolisticTracker/settings.d.ts +58 -0
- package/dist/components/HolisticTracker/signals.d.ts +49 -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/IrisEffect/IrisMaterial.d.ts +73 -0
- package/dist/components/IrisEffect/index.d.ts +51 -0
- package/dist/components/IrisEffect/settings.d.ts +117 -0
- package/dist/components/LipEffect/LipEffect.d.ts +27 -1
- package/dist/components/LipEffect/LipEffectMaterial.d.ts +95 -7
- package/dist/components/LipEffect/LipEffects.d.ts +12 -0
- package/dist/components/LipEffect/defaults.d.ts +46 -4
- package/dist/components/LipEffect/index.d.ts +11 -3
- package/dist/components/LipEffect/lipShading.d.ts +73 -0
- package/dist/components/LipEffect/settings.d.ts +375 -0
- package/dist/components/LipEffect/shader.d.ts +39 -0
- package/dist/components/LipEffect/types.d.ts +128 -9
- package/dist/components/LipEffect/useLipDesignTextures.d.ts +17 -0
- package/dist/components/LipEffect/uvGuide.d.ts +74 -0
- 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/PersonCutout/index.d.ts +50 -0
- package/dist/components/PersonCutout/personCutout.d.ts +16 -0
- package/dist/components/ScreenImage/components/ScreenImageBody.d.ts +1 -1
- package/dist/components/ScreenImage/index.d.ts +3 -1
- package/dist/components/ScreenImage/materials/ScreenImageBlendMaterial.d.ts +1 -1
- package/dist/components/ScreenImage/materials/ScreenImageMaskMaterial.d.ts +11 -0
- package/dist/components/ScreenImage/source.d.ts +6 -0
- package/dist/components/ScreenImage/types.d.ts +18 -0
- package/dist/components/SegmentationOverlay/SegmentationOverlay.d.ts +37 -0
- package/dist/components/SegmentationOverlay/SegmentationOverlayMaterial.d.ts +31 -0
- package/dist/components/SegmentationOverlay/index.d.ts +9 -0
- package/dist/components/SegmentationOverlay/maskTexture.d.ts +23 -0
- package/dist/components/SegmentationOverlay/providers.d.ts +72 -0
- package/dist/components/SegmentationOverlay/settings.d.ts +65 -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/XRProvider/index.d.ts +16 -2
- package/dist/components/XRScene/renderOutputTarget.d.ts +12 -0
- package/dist/components/XRViewport/hooks/useViewportExternalFaces.d.ts +1 -1
- package/dist/components/XRViewport/hooks/useViewportMediaSource.d.ts +1 -1
- package/dist/components/XRViewport/hooks/useViewportPipeline.d.ts +1 -1
- package/dist/components/index.d.ts +11 -0
- package/dist/config/index.d.ts +0 -1
- package/dist/constants/index.d.ts +4 -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/feed.d.ts +52 -0
- package/dist/coordinates/index.d.ts +7 -0
- package/dist/coordinates/side.d.ts +40 -0
- package/dist/coordinates/spaces.d.ts +49 -0
- package/dist/coordinates/viewport.d.ts +22 -0
- package/dist/coordinates/world.d.ts +15 -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/gesture-settings/index.d.ts +14 -0
- package/dist/debug-ui/hierarchy-panel/index.d.ts +3 -2
- package/dist/debug-ui/holistic-tracker-settings/index.d.ts +16 -0
- package/dist/debug-ui/index.d.ts +18 -3
- package/dist/debug-ui/iris-effect-settings/index.d.ts +12 -0
- package/dist/debug-ui/lip-effect-settings/index.d.ts +15 -0
- 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 +25 -0
- 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/segmentation-overlay-settings/index.d.ts +12 -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 +26 -0
- package/dist/debug-ui.cjs +3 -3
- package/dist/debug-ui.js +2695 -2547
- package/dist/detector-K8aej4MB.js +59 -0
- package/dist/detector-ijypGtse.cjs +1 -0
- package/dist/entries/all.d.ts +3 -1
- package/dist/entries/core.d.ts +20 -2
- package/dist/entries/face-effects.d.ts +123 -9
- package/dist/entries/instructions.d.ts +48 -0
- package/dist/entries/internal.d.ts +2 -1
- package/dist/entries/low-level.d.ts +49 -3
- package/dist/entries/particles.d.ts +11 -0
- package/dist/entries/product.d.ts +11 -0
- package/dist/entries/tracking.d.ts +60 -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 +2324 -1
- package/dist/face-effects.js +14208 -2268
- 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 +98 -0
- package/dist/gestures/detector.d.ts +87 -0
- package/dist/gestures/index.d.ts +8 -0
- package/dist/gestures/measures.d.ts +114 -0
- package/dist/gestures/settings.d.ts +49 -0
- 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 +76 -1
- package/dist/hooks/useCalibrationFaceTracker.d.ts +1 -1
- package/dist/hooks/useFaceInfo.d.ts +13 -1
- package/dist/hooks/useFaceInfos.d.ts +1 -1
- package/dist/hooks/useFaceModelAcquisition.d.ts +38 -0
- package/dist/hooks/useGesture.d.ts +32 -0
- package/dist/hooks/useIrisTracking.d.ts +45 -0
- package/dist/hooks/useTrackerContext.d.ts +6 -0
- package/dist/hooks/useXRDiagnostics.d.ts +81 -0
- package/dist/hooks/useXRModel.d.ts +7 -0
- package/dist/hooks/useXRSession/facade.d.ts +42 -2
- package/dist/hooks/useXRSession/index.d.ts +2 -2
- package/dist/hooks/useXRSession/reason.d.ts +3 -1
- package/dist/hooks/useXRSession/registry.d.ts +14 -0
- package/dist/hooks/useXRSession/store.d.ts +52 -3
- 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/index-w1S7fI2B.js +1432 -0
- package/dist/index-zGaqrz_K.js +188 -0
- package/dist/instructions.cjs +30 -0
- package/dist/instructions.js +1507 -0
- package/dist/{internal-Dmk1cTXq.js → internal-B90P-clC.js} +138 -119
- 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 +27 -0
- package/dist/iris/index.d.ts +4 -0
- package/dist/iris/lead.d.ts +19 -0
- package/dist/iris/types.d.ts +89 -0
- package/dist/landmarkMask-BFDyBnKM.js +224 -0
- package/dist/landmarkMask-u7es2k4X.cjs +1 -0
- 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 +1190 -675
- package/dist/main.cjs +1 -1
- package/dist/main.js +1190 -452
- package/dist/models/Base/index.d.ts +49 -0
- package/dist/models/Body/index.d.ts +3 -1
- package/dist/models/Face/constants.d.ts +8 -0
- package/dist/models/Face/index.d.ts +4 -12
- package/dist/models/Face/rotation.d.ts +18 -3
- package/dist/models/Hand/GestureTracking.d.ts +1 -1
- package/dist/models/Hand/HandTracking.d.ts +17 -1
- package/dist/models/Holistic/index.d.ts +49 -0
- package/dist/models/Holistic/result.d.ts +68 -0
- package/dist/models/Segmentation/index.d.ts +2 -0
- package/dist/models/SemanticSegmentation/index.d.ts +31 -0
- package/dist/models/SemanticSegmentation/presets.d.ts +28 -0
- package/dist/models/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/ProductDimensions.d.ts +16 -0
- package/dist/product/ProductHotspot.d.ts +16 -0
- package/dist/product/ProductViewer.d.ts +9 -0
- package/dist/product/details.d.ts +53 -0
- package/dist/product/index.d.ts +14 -0
- package/dist/product/loadModelViewer.d.ts +4 -0
- package/dist/product/types.d.ts +71 -0
- package/dist/product/useProductAr.d.ts +37 -0
- package/dist/product/useProductDetails.d.ts +60 -0
- package/dist/product.cjs +1 -0
- package/dist/product.js +414 -0
- package/dist/providers-C8rE26Uf.js +366 -0
- package/dist/providers-DHsrhDI2.cjs +62 -0
- package/dist/quality/XRQualityController.d.ts +25 -0
- package/dist/quality/controller.d.ts +33 -0
- package/dist/quality/index.d.ts +6 -0
- package/dist/quality/types.d.ts +100 -0
- package/dist/quality/useXRQuality.d.ts +28 -0
- package/dist/render/renderPasses.d.ts +8 -0
- package/dist/render/sceneBeforeRender.d.ts +12 -0
- package/dist/{renderGroups-KZk6eRiY.js → renderGroups-B38pUaX2.js} +1 -1
- package/dist/{renderGroups-80H3DpTl.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/faceMemory.d.ts +28 -0
- package/dist/segmentation2d/faceRegions.d.ts +24 -0
- package/dist/segmentation2d/index.d.ts +9 -0
- package/dist/segmentation2d/maskUv.d.ts +23 -0
- package/dist/segmentation2d/rasterize.d.ts +14 -0
- package/dist/segmentation2d/types.d.ts +52 -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-BJ7FMBsO.js +111 -0
- 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/subjects/index.d.ts +2 -0
- package/dist/subjects/select.d.ts +62 -0
- package/dist/subjects/types.d.ts +55 -0
- package/dist/tracking-config/apply.d.ts +57 -0
- package/dist/tracking-config/index.d.ts +7 -0
- package/dist/tracking-config/resolve.d.ts +25 -0
- package/dist/tracking-config/storage.d.ts +8 -0
- package/dist/tracking-config/types.d.ts +106 -0
- package/dist/tracking-config/useXRTrackingConfig.d.ts +38 -0
- package/dist/tracking.cjs +10 -1
- package/dist/tracking.js +1326 -506
- package/dist/trigger-D0Pm9noT.cjs +49 -0
- package/dist/trigger-IQeys0oS.js +2128 -0
- package/dist/types/compositor.d.ts +21 -0
- package/dist/types/face.d.ts +20 -1
- package/dist/types/hand-tracking.d.ts +9 -0
- package/dist/types/holistic.d.ts +121 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/model.d.ts +22 -2
- package/dist/types/nodes.d.ts +47 -3
- package/dist/types/segmentation.d.ts +24 -0
- package/dist/types/session.d.ts +41 -3
- 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-Cr3RzuAW.cjs +1 -0
- package/dist/useXRCapabilities-Cxmlmpbd.js +30 -0
- package/dist/utils/canonicalRigidLandmarks.d.ts +8 -0
- package/dist/utils/fns.d.ts +6 -3
- package/dist/utils/headOccluderFit.d.ts +42 -0
- package/dist/utils/integrity.d.ts +21 -1
- 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/utils/updateThrottle.d.ts +2 -0
- package/dist/utils/useStableUniforms.d.ts +18 -0
- package/dist/uv-BMFt19bg.cjs +1 -0
- package/dist/{index-ByoNj0QP.js → uv-DJU_XfmN.js} +15 -247
- package/docs/SDK_DOCUMENTATION.md +1 -2
- package/docs/api/adaptive-quality.mdx +104 -0
- package/docs/api/asset-lifecycle.mdx +78 -0
- package/docs/api/body-instructions.mdx +285 -0
- package/docs/api/body-triggers.mdx +234 -0
- package/docs/api/camera-permission.mdx +142 -0
- package/docs/api/coordinate-spaces.mdx +168 -0
- package/docs/api/cross-camera.mdx +89 -0
- package/docs/api/debug-ui-scene-editor.mdx +23 -2
- package/docs/api/diagnostics-calibration.mdx +97 -0
- 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 +9 -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 +8 -9
- 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 +209 -0
- 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 +164 -0
- package/docs/api/instructions.mdx +323 -0
- package/docs/api/iris-tracking.mdx +247 -0
- 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 +98 -0
- package/docs/api/particles.mdx +155 -0
- package/docs/api/person-cutout.mdx +136 -0
- package/docs/api/pin-to-face-mesh.mdx +274 -0
- package/docs/api/product-ar.mdx +114 -0
- package/docs/api/product-details.mdx +78 -0
- package/docs/api/screen-space-coordinates.mdx +4 -1
- package/docs/api/segmentation-overlay.mdx +301 -0
- package/docs/api/session-lifecycle.mdx +136 -0
- package/docs/api/trackers.mdx +5 -0
- package/docs/api/tracking-config.mdx +108 -0
- package/docs/docs.json +51 -1
- package/docs/examples/lip-shaders.mdx +273 -0
- 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 +368 -0
- package/docs/guides/lip-uv-template.png +0 -0
- package/docs/guides/lip-uv-template.svg +1 -0
- package/docs/guides/makeup-design-textures.mdx +109 -0
- package/docs/introduction.mdx +1 -2
- package/package.json +23 -1
- package/dist/DebuggerUI-B6bP6P9r.cjs +0 -1
- package/dist/DebuggerUI-BjOMr8q_.js +0 -269
- package/dist/FaceMeshRenderer-C5l6VLdO.cjs +0 -155
- package/dist/FaceMeshRenderer-wjAHrJzP.js +0 -1270
- package/dist/FaceRetouch-BkJzoA79.cjs +0 -134
- package/dist/FaceRetouch-DwbKQJAN.js +0 -551
- 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-ByhzppYl.js +0 -663
- package/dist/contexts-Dr62It_K.cjs +0 -1
- package/dist/debug-ui/face-warp-3d/index.d.ts +0 -6
- package/dist/getFaceInfo-C4QpCQIY.js +0 -118
- package/dist/getFaceInfo-fA1bFBub.cjs +0 -1
- package/dist/index-9dlAQAhy.js +0 -1462
- package/dist/index-BjmTe9eM.cjs +0 -1
- package/dist/index-BpEf2BBb.cjs +0 -1
- package/dist/index-CyUUurQT.cjs +0 -1
- package/dist/index-DCiMbxC3.cjs +0 -1
- package/dist/index-DXT3WccE.js +0 -2089
- package/dist/index-DpI-qo5X.cjs +0 -17
- package/dist/index-DyVF4vEW.js +0 -111
- package/dist/index-VJ0SJwmG.js +0 -214
- package/dist/internal-Cq-TEQ5Y.cjs +0 -1
- package/dist/renderLayers-lDtL0_43.cjs +0 -1
- package/dist/renderLayers-zrK2pv5O.js +0 -13
- package/dist/renderPasses-BOoBSr8z.cjs +0 -21
- package/dist/renderPasses-BcquyVtu.js +0 -1500
- package/dist/selectors-B8H97CKA.js +0 -59
- package/dist/selectors-CZLKT2Iv.cjs +0 -1
- package/dist/session-CpkiK5YA.cjs +0 -31
- package/dist/session-DLFN_VII.js +0 -363
- package/dist/useFaceInfo-BJ8-_MOs.cjs +0 -1
- package/dist/useFaceInfo-Dk426LTu.js +0 -62
- package/dist/useFaceResults-CtetsO9M.js +0 -19
- package/dist/useFaceResults-wBJF3zyp.cjs +0 -1
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { FaceInsetFrame } from './frame';
|
|
2
|
+
import * as THREE from "three";
|
|
3
|
+
export type FaceInsetUniforms = {
|
|
4
|
+
insetCamera: THREE.IUniform<THREE.Texture | null>;
|
|
5
|
+
insetCenter: THREE.IUniform<THREE.Vector2>;
|
|
6
|
+
insetAxisX: THREE.IUniform<THREE.Vector2>;
|
|
7
|
+
insetAxisY: THREE.IUniform<THREE.Vector2>;
|
|
8
|
+
insetDraw: THREE.IUniform<THREE.Vector2>;
|
|
9
|
+
insetMagnify: THREE.IUniform<number>;
|
|
10
|
+
insetEllipses: THREE.IUniform<THREE.Vector4[]>;
|
|
11
|
+
insetEllipseAlpha: THREE.IUniform<THREE.Vector2>;
|
|
12
|
+
insetFeather: THREE.IUniform<number>;
|
|
13
|
+
insetOpacity: THREE.IUniform<number>;
|
|
14
|
+
};
|
|
15
|
+
export type FaceInsetMaterial = THREE.ShaderMaterial & {
|
|
16
|
+
uniforms: FaceInsetUniforms;
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* The inset material. `"face"`: drawn over the face (the opaque pass with soft
|
|
20
|
+
* edges, like `FaceWarp3D`; the mesh's render order is
|
|
21
|
+
* `FACE_INSET_RENDER_ORDER`). `"fill"`: fills a render target with the box,
|
|
22
|
+
* straight (not premultiplied) alpha.
|
|
23
|
+
*/
|
|
24
|
+
export declare const createFaceInsetMaterial: (mode: "face" | "fill") => FaceInsetMaterial;
|
|
25
|
+
/** How an inset is drawn (one object per inset, written every frame). */
|
|
26
|
+
export type FaceInsetLook = {
|
|
27
|
+
camera: THREE.Texture | null;
|
|
28
|
+
feather: number;
|
|
29
|
+
opacity: number;
|
|
30
|
+
/** Where its middle is drawn on the image; `null`: the part's own. */
|
|
31
|
+
draw: {
|
|
32
|
+
x: number;
|
|
33
|
+
y: number;
|
|
34
|
+
} | null;
|
|
35
|
+
/** How much bigger than life it is drawn about `draw`. */
|
|
36
|
+
magnify: number;
|
|
37
|
+
};
|
|
38
|
+
export declare const createFaceInsetLook: () => FaceInsetLook;
|
|
39
|
+
/** Writes a frame and the look into an inset material's uniforms. */
|
|
40
|
+
export declare const updateFaceInsetUniforms: (uniforms: FaceInsetUniforms, frame: FaceInsetFrame, look: FaceInsetLook) => void;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { FaceInsetPart } from './frame';
|
|
2
|
+
import * as THREE from "three";
|
|
3
|
+
export type FaceInsetTextureOptions = {
|
|
4
|
+
/** Which part to cut (see `FACE_INSET_PARTS`). */
|
|
5
|
+
part: FaceInsetPart;
|
|
6
|
+
/** Soft edge, 0 (hard) .. 1 (fades from the middle). Default 0.4. */
|
|
7
|
+
feather?: number;
|
|
8
|
+
/** How much around the part is cut, a multiple of its box. Default 1. */
|
|
9
|
+
size?: number;
|
|
10
|
+
/** The texture's longer side, px. Its shape is the part's box (`faceInsetAspect`). Default 256. */
|
|
11
|
+
resolution?: number;
|
|
12
|
+
/** Which tracked face. Default: the enclosing `FaceTracker`'s, else 0. */
|
|
13
|
+
faceIndex?: number;
|
|
14
|
+
/** `false` stops updating (the texture keeps its last image). Default `true`. */
|
|
15
|
+
active?: boolean;
|
|
16
|
+
};
|
|
17
|
+
/** After the face is lost for this long (ms), the inset texture is cleared to transparent. */
|
|
18
|
+
export declare const FACE_INSET_HOLD_MS = 250;
|
|
19
|
+
/** The face a face inset follows: its own `faceIndex`, else the enclosing `FaceTracker`'s, else 0. */
|
|
20
|
+
export declare const useFaceInsetFaceIndex: (faceIndex?: number) => number;
|
|
21
|
+
/** The camera image's width / height (the canvas's, before the first camera frame). */
|
|
22
|
+
export declare const cameraImageAspect: (texture: THREE.Texture | null | undefined, canvas: {
|
|
23
|
+
width: number;
|
|
24
|
+
height: number;
|
|
25
|
+
}) => number;
|
|
26
|
+
/**
|
|
27
|
+
* A face part cut from the live camera image, as a texture: the part's box
|
|
28
|
+
* (upright on the face), soft-edged, straight (not premultiplied) alpha, sRGB.
|
|
29
|
+
* Put it on any material (`map`, `transparent`) or in a `ScreenImage`
|
|
30
|
+
* (`source={{ kind: "texture", texture }}`). It updates on every new camera
|
|
31
|
+
* frame while the face is tracked, keeps its last image through a short
|
|
32
|
+
* dropout and is cleared to transparent after `FACE_INSET_HOLD_MS`. A new
|
|
33
|
+
* part or resolution makes a new texture. Reads the face model: a
|
|
34
|
+
* `FaceTracker` must be mounted (it starts none). Inside a `<MadeUpCamera>`
|
|
35
|
+
* it cuts the part from the made-up camera (the makeup shows).
|
|
36
|
+
*/
|
|
37
|
+
export declare const useFaceInsetTexture: ({ part, feather, size, resolution, faceIndex: faceIndexOption, active, }: FaceInsetTextureOptions) => THREE.Texture;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { FaceExpressionDefinition, FaceExpressionHintPose, FaceExpressionName } from '../../face-expression';
|
|
2
|
+
import { HintLook } from '../Instruction/hintLook';
|
|
3
|
+
import { HintLoop } from '../Instruction/hintLoop';
|
|
4
|
+
import * as THREE from "three";
|
|
5
|
+
export type FaceExpressionHintProps = {
|
|
6
|
+
/**
|
|
7
|
+
* An expression name, your own definition (`defineFaceExpression`), or just
|
|
8
|
+
* its hint: `{ target }` (one morph target) or `{ targets }` (a weighted mix).
|
|
9
|
+
*/
|
|
10
|
+
expression: FaceExpressionName | FaceExpressionDefinition | FaceExpressionHintPose;
|
|
11
|
+
/**
|
|
12
|
+
* The hint face: a model whose meshes carry one morph target per expression
|
|
13
|
+
* (e.g. the SDK example `face-v1.glb`'s scene, loaded with the meshopt
|
|
14
|
+
* decoder), facing +Z.
|
|
15
|
+
*/
|
|
16
|
+
model: THREE.Object3D;
|
|
17
|
+
/** Height of the face in the parent's units (the hint is fitted to it). Default `1`. */
|
|
18
|
+
height?: number;
|
|
19
|
+
/** Loop timing, merged over `FACE_HINT_LOOP` (2.4 s per cycle). */
|
|
20
|
+
loop?: HintLoop;
|
|
21
|
+
/** The look, merged over `FACE_HINT_LOOK` (ghost, feature tints, halo, glow). */
|
|
22
|
+
look?: HintLook;
|
|
23
|
+
/** Auto orbit: degrees to each side about the vertical (ping-pong). `0` = still. Default `30`. */
|
|
24
|
+
orbit?: number;
|
|
25
|
+
/** Seconds per orbit swing (side to side and back). Default `6`. */
|
|
26
|
+
orbitSeconds?: number;
|
|
27
|
+
/** Render order of the face (keep it above the AR content it may overlap). */
|
|
28
|
+
renderOrder?: number;
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* The face's default look: plain ghost, tinted per part by `face-v1`'s
|
|
32
|
+
* material names so the eyes, brows, lashes and mouth stay readable.
|
|
33
|
+
*/
|
|
34
|
+
export declare const FACE_HINT_LOOK: HintLook;
|
|
35
|
+
/** The face's default loop. */
|
|
36
|
+
export declare const FACE_HINT_LOOP: HintLoop;
|
|
37
|
+
/**
|
|
38
|
+
* A 3D face showing an expression — the face instruction's demonstration.
|
|
39
|
+
* Plays the expression's morph target(s) from the idle face and back, slowly
|
|
40
|
+
* orbiting side to side. Drawn as a ghost (`look`). Place it where the hint
|
|
41
|
+
* should appear (e.g. inside `ScreenSpaceUI`); `FaceInstruction` does this.
|
|
42
|
+
*/
|
|
43
|
+
export declare const FaceExpressionHint: ({ expression, model, height, loop, look, orbit, orbitSeconds, renderOrder, }: FaceExpressionHintProps) => import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { FaceExpressionDefinition, FaceExpressionName } from '../../face-expression';
|
|
2
|
+
import { HintLook } from '../Instruction/hintLook';
|
|
3
|
+
import { HintLoop } from '../Instruction/hintLoop';
|
|
4
|
+
import { InstructionOptions } from '../Instruction/InstructionCue';
|
|
5
|
+
import type * as THREE from "three";
|
|
6
|
+
export { FACE_HINT_LOOK, FACE_HINT_LOOP, FaceExpressionHint } from './FaceExpressionHint';
|
|
7
|
+
export type { FaceExpressionHintProps } from './FaceExpressionHint';
|
|
8
|
+
export { useFaceExpression } from './useFaceExpression';
|
|
9
|
+
export type { UseFaceExpressionOptions, UseFaceExpressionResult } from './useFaceExpression';
|
|
10
|
+
/** The instruction draws in this renderOrder band, over the AR scene (= `INSTRUCTION_RENDER_ORDER`). */
|
|
11
|
+
export declare const FACE_INSTRUCTION_RENDER_ORDER = 2000;
|
|
12
|
+
/** Default nudge copy when no face has been seen for `nudgeAfterMs`. */
|
|
13
|
+
export declare const FACE_INSTRUCTION_NUDGE_TEXT = "Show your face to the camera";
|
|
14
|
+
export type FaceInstructionProps = InstructionOptions & {
|
|
15
|
+
/** What to ask for: a `FACE_EXPRESSIONS` name or your own `defineFaceExpression(…)`. */
|
|
16
|
+
expression: FaceExpressionName | FaceExpressionDefinition;
|
|
17
|
+
/**
|
|
18
|
+
* The hint face: one morph target per expression (e.g. `face-v1.glb`'s
|
|
19
|
+
* scene, loaded with the meshopt decoder); see `FaceExpressionHint`.
|
|
20
|
+
*/
|
|
21
|
+
model: THREE.Object3D;
|
|
22
|
+
/** Instruction copy. Default: the expression's `label` ("Give a big smile"). */
|
|
23
|
+
text?: string;
|
|
24
|
+
/** Which detected face to read. Default 0. */
|
|
25
|
+
faceIndex?: number;
|
|
26
|
+
/** Hold time to complete. Default 400 ms. */
|
|
27
|
+
holdMs?: number;
|
|
28
|
+
/** Dropouts shorter than this do not restart the hold. Default 150 ms. */
|
|
29
|
+
graceMs?: number;
|
|
30
|
+
/** The hint's auto orbit, degrees to each side. Default `30`; `0` = still. */
|
|
31
|
+
orbit?: number;
|
|
32
|
+
/** The hint's look, merged over `FACE_HINT_LOOK`. */
|
|
33
|
+
look?: HintLook;
|
|
34
|
+
/** The hint's loop, merged over `FACE_HINT_LOOP`. */
|
|
35
|
+
loop?: HintLoop;
|
|
36
|
+
/** Called once when the expression is held long enough. */
|
|
37
|
+
onComplete?: () => void;
|
|
38
|
+
/** `false` hides it and pauses detection. Default `true`. */
|
|
39
|
+
active?: boolean;
|
|
40
|
+
};
|
|
41
|
+
/**
|
|
42
|
+
* A minimal on-screen instruction that asks for a face expression and waits
|
|
43
|
+
* for it: a looping ghost face (`FaceExpressionHint`) making the expression,
|
|
44
|
+
* with the copy under it — the same layout and feedback as `HandInstruction`.
|
|
45
|
+
* Holding the expression for `holdMs` completes it (`onComplete`, a small pop
|
|
46
|
+
* and a white ring, then it fades out); with no face in view for a while it
|
|
47
|
+
* adds a nudge line. Mount inside the R3F scene (`XRScene`); it acquires the
|
|
48
|
+
* face model itself. Every part is customisable (`look`, `loop`, `textStyle`,
|
|
49
|
+
* `motion`, `renderText` …); for a fully custom one, compose `<Instruction>`
|
|
50
|
+
* with `useFaceExpression` and any symbol.
|
|
51
|
+
*
|
|
52
|
+
* ```tsx
|
|
53
|
+
* <FaceInstruction expression="smile" text="Smile to start" model={faceGltf.scene} onComplete={start} />
|
|
54
|
+
* ```
|
|
55
|
+
*/
|
|
56
|
+
export declare const FaceInstruction: ({ active, text, ...props }: FaceInstructionProps) => import("react/jsx-runtime").JSX.Element | null;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { MutableRefObject } from 'react';
|
|
2
|
+
import { FaceExpressionSpec } from '../../face-expression';
|
|
3
|
+
import { FaceInfo } from '../../face-info';
|
|
4
|
+
import { InstructionDetector, InstructionHoldOptions } from '../Instruction/useInstructionHold';
|
|
5
|
+
export type UseFaceExpressionOptions = InstructionHoldOptions & {
|
|
6
|
+
/** Which detected face to read (result-array position). Default 0. */
|
|
7
|
+
faceIndex?: number;
|
|
8
|
+
};
|
|
9
|
+
export type UseFaceExpressionResult = InstructionDetector & {
|
|
10
|
+
/** The latest face (`null` while none is in view) — read it in `useFrame`. */
|
|
11
|
+
faceRef: MutableRefObject<FaceInfo | null>;
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Detects a face expression with hold-to-complete: a `FACE_EXPRESSIONS` name,
|
|
15
|
+
* a rule over MediaPipe blendshapes, a match function `(blendshapes, face) =>
|
|
16
|
+
* boolean` or a definition (`defineFaceExpression`). Returns an
|
|
17
|
+
* `InstructionDetector` (pass it to `<Instruction detector>`). Mount inside
|
|
18
|
+
* the R3F scene; it acquires the face model itself.
|
|
19
|
+
*/
|
|
20
|
+
export declare const useFaceExpression: (expression: FaceExpressionSpec, { faceIndex, active, ...hold }?: UseFaceExpressionOptions) => UseFaceExpressionResult;
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { LiveValue } from '../../face-character/liveValue';
|
|
2
|
+
import { FaceLiquifyCustomWarps, FaceLiquifyWeights } from './presets';
|
|
3
|
+
export { FACE_LIQUIFY_RENDER_ORDER } from './pass';
|
|
4
|
+
/** Its `useFrame` priority: before XRScene's capture (−100), so both use the same warps. */
|
|
5
|
+
export declare const FACE_LIQUIFY_FRAME_PRIORITY = -101;
|
|
6
|
+
/** Faces it warps at most (one screen pass each). */
|
|
7
|
+
export declare const FACE_LIQUIFY_MAX_FACES = 4;
|
|
8
|
+
/** Landmark smoothing by default (as face swap's): steady at rest, little lag while moving. */
|
|
9
|
+
export declare const FACE_LIQUIFY_DEFAULT_SMOOTHING = 0.35;
|
|
10
|
+
export type FaceLiquifyProps = {
|
|
11
|
+
/**
|
|
12
|
+
* Preset (and custom warp) weights by name, 0..3 (1 subtle, 3 cartoon, the
|
|
13
|
+
* most before the image folds), or a ref read every frame. Default `{}`:
|
|
14
|
+
* nothing drawn.
|
|
15
|
+
*/
|
|
16
|
+
weights?: LiveValue<FaceLiquifyWeights>;
|
|
17
|
+
/** Your own warps by name; their weight is `weights[name]`, else 3. Re-resolved when the object changes. */
|
|
18
|
+
warps?: FaceLiquifyCustomWarps;
|
|
19
|
+
/** Overall fade, 0..1 (linear in every warp's strength), or a ref read every frame. Default 1. */
|
|
20
|
+
weight?: LiveValue<number>;
|
|
21
|
+
/**
|
|
22
|
+
* Only this face. Default: the enclosing `FaceTracker`'s face, else every
|
|
23
|
+
* tracked face (up to `FACE_LIQUIFY_MAX_FACES`).
|
|
24
|
+
*/
|
|
25
|
+
faceIndex?: number;
|
|
26
|
+
/** Faces the face model tracks when this starts it. Default 1. */
|
|
27
|
+
numFaces?: number;
|
|
28
|
+
/** Landmark smoothing, 0..1 (0 raw). Default `FACE_LIQUIFY_DEFAULT_SMOOTHING` (0.35). */
|
|
29
|
+
smoothing?: number;
|
|
30
|
+
/** False: no model, no copy, nothing drawn. Default true. */
|
|
31
|
+
active?: boolean;
|
|
32
|
+
/** The pass mesh's render order (inside a plain group). Default `FACE_LIQUIFY_RENDER_ORDER`. */
|
|
33
|
+
renderOrder?: number;
|
|
34
|
+
/**
|
|
35
|
+
* Draw each live warp over the image (its circle, arrows for the way the
|
|
36
|
+
* content moves; green bulge, orange pinch, cyan push, magenta stretch,
|
|
37
|
+
* yellow swirl; brighter when stronger) and the face's named points.
|
|
38
|
+
* Default false.
|
|
39
|
+
*/
|
|
40
|
+
debug?: boolean;
|
|
41
|
+
};
|
|
42
|
+
/**
|
|
43
|
+
* Liquifies faces on screen (big eyes, slim face, stretch, swirl): one screen
|
|
44
|
+
* pass per face that warps everything drawn so far in the face box (camera,
|
|
45
|
+
* makeup, face effects, glasses and hats) and draws before screen UI. Each
|
|
46
|
+
* face fades in when found, holds through a short dropout, then fades out;
|
|
47
|
+
* a warp on one side fades as that side turns away.
|
|
48
|
+
*/
|
|
49
|
+
export declare const FaceLiquify: ({ weights, warps, weight, faceIndex, numFaces: numFacesProp, smoothing, active, renderOrder, debug, }: FaceLiquifyProps) => import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { FaceLiquifyFrame } from './frame';
|
|
2
|
+
import { FaceLiquifyKind } from './warp';
|
|
3
|
+
import * as THREE from "three";
|
|
4
|
+
/**
|
|
5
|
+
* `<FaceLiquify debug>` (internal): line segments in clip space, drawn after
|
|
6
|
+
* the warp, showing each live warp (its circle; arrows for the way content
|
|
7
|
+
* moves; colour by kind, brighter when stronger, fading with the face and
|
|
8
|
+
* the side) and the face's named points.
|
|
9
|
+
*/
|
|
10
|
+
/** Debug colours by warp kind. */
|
|
11
|
+
export declare const FACE_LIQUIFY_DEBUG_COLORS: Readonly<Record<FaceLiquifyKind, string>>;
|
|
12
|
+
export declare class FaceLiquifyDebugLines {
|
|
13
|
+
readonly geometry: THREE.BufferGeometry<THREE.NormalBufferAttributes>;
|
|
14
|
+
readonly material: THREE.ShaderMaterial;
|
|
15
|
+
readonly mesh: THREE.LineSegments;
|
|
16
|
+
private readonly positions;
|
|
17
|
+
private readonly colors;
|
|
18
|
+
private count;
|
|
19
|
+
private aspect;
|
|
20
|
+
constructor(renderOrder: number);
|
|
21
|
+
/** Starts a frame's lines (`aspect`: the image's width / height). */
|
|
22
|
+
begin(aspect: number): void;
|
|
23
|
+
/** One segment between two aspect-space points. */
|
|
24
|
+
private line;
|
|
25
|
+
private vertex;
|
|
26
|
+
private arc;
|
|
27
|
+
private arrow;
|
|
28
|
+
/** The face's named points as small crosses. */
|
|
29
|
+
drawPoints(frame: FaceLiquifyFrame): void;
|
|
30
|
+
/** `count` warps of `ops` (as `writeFaceLiquifyOps` wrote them). */
|
|
31
|
+
drawOps(ops: ArrayLike<number>, count: number): void;
|
|
32
|
+
/** Ends the frame: draws what was added since `begin`. */
|
|
33
|
+
end(): void;
|
|
34
|
+
/** The number of vertices this frame (2 per segment). */
|
|
35
|
+
get vertices(): number;
|
|
36
|
+
dispose(): void;
|
|
37
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { FaceImageLandmark } from '../../face-character/faceReprojection';
|
|
2
|
+
import { FaceLiquifyPoint2 } from './warp';
|
|
3
|
+
/**
|
|
4
|
+
* A face's liquify frame (pure): where its named points are on the screen,
|
|
5
|
+
* the face's own axes there, and its size. Aspect space: `x` in image heights
|
|
6
|
+
* (`u × aspect`), `y` in image heights, down. The screen shows the feed
|
|
7
|
+
* exactly, so feed landmarks are screen points.
|
|
8
|
+
*/
|
|
9
|
+
/** The named points a warp can sit at. Sided names are the person's own side on every feed. */
|
|
10
|
+
export declare const FACE_LIQUIFY_POINTS: readonly ["leftEye", "rightEye", "noseTip", "noseBridge", "mouth", "leftMouthCorner", "rightMouthCorner", "chin", "leftJaw", "rightJaw", "leftCheek", "rightCheek", "leftFaceSide", "rightFaceSide", "forehead", "faceCenter"];
|
|
11
|
+
export type FaceLiquifyPointName = (typeof FACE_LIQUIFY_POINTS)[number];
|
|
12
|
+
/**
|
|
13
|
+
* The canonical face's height (forehead top to chin) in eye distances: the
|
|
14
|
+
* up axis is that projected span over this, so both axes are one eye
|
|
15
|
+
* distance long on a face looking at the camera.
|
|
16
|
+
*/
|
|
17
|
+
export declare const FACE_LIQUIFY_FACE_HEIGHT = 2.803;
|
|
18
|
+
/**
|
|
19
|
+
* A side turning away fades its warps (its far half smears over the nose):
|
|
20
|
+
* gone when its eye is this narrow next to the other eye, full from this wide.
|
|
21
|
+
*/
|
|
22
|
+
export declare const FACE_LIQUIFY_FAR_SIDE: readonly [number, number];
|
|
23
|
+
/** The person's own sides. */
|
|
24
|
+
export type FaceLiquifySide = "left" | "right";
|
|
25
|
+
export type FaceLiquifyFrame = {
|
|
26
|
+
/** The image's width / height. */
|
|
27
|
+
aspect: number;
|
|
28
|
+
/** The feed is mirrored (the webcam): which mesh side is the person's left. */
|
|
29
|
+
mirrored: boolean;
|
|
30
|
+
/** 0..1 per person's side: 1 facing the camera, 0 turned away (`FACE_LIQUIFY_FAR_SIDE`). */
|
|
31
|
+
visibility: Record<FaceLiquifySide, number>;
|
|
32
|
+
/** The face's size: the 3D distance between the eye centres, in image heights (0: no face). */
|
|
33
|
+
unit: number;
|
|
34
|
+
/** One eye distance toward the person's own left, on screen (foreshortened as the head turns). */
|
|
35
|
+
axisX: FaceLiquifyPoint2;
|
|
36
|
+
/** One eye distance up the face, on screen (foreshortened as the head nods). */
|
|
37
|
+
axisY: FaceLiquifyPoint2;
|
|
38
|
+
/** The named points on screen. */
|
|
39
|
+
points: Record<FaceLiquifyPointName, FaceLiquifyPoint2>;
|
|
40
|
+
/** The landmarks of the last write (for warps at a raw `landmark`), or null. */
|
|
41
|
+
landmarks: ArrayLike<FaceImageLandmark> | null;
|
|
42
|
+
};
|
|
43
|
+
export declare const createFaceLiquifyFrame: () => FaceLiquifyFrame;
|
|
44
|
+
/** How much of a side shows, 0..1, from its eye's width next to the wider eye. */
|
|
45
|
+
export declare const faceLiquifySideVisibility: (width: number, widest: number) => number;
|
|
46
|
+
/**
|
|
47
|
+
* One frame of a face: writes its points, axes and size into `out`.
|
|
48
|
+
* `landmarks` are the tracker's for one face (≥ 468, feed space: 0..1, y
|
|
49
|
+
* down, `z` in x units); `aspect` is the image's width / height; `mirrored`
|
|
50
|
+
* is the feed's mirroring (`useXRMirrored()`), so "left" is the person's own
|
|
51
|
+
* left. Returns false (and leaves `out`) without a usable face.
|
|
52
|
+
*/
|
|
53
|
+
export declare const writeFaceLiquifyFrame: (landmarks: ArrayLike<FaceImageLandmark> | null | undefined, aspect: number, mirrored: boolean, out: FaceLiquifyFrame) => boolean;
|
|
54
|
+
/** A raw landmark's point on screen (aspect space), or false when the frame has none. */
|
|
55
|
+
export declare const faceLiquifyLandmarkPoint: (frame: FaceLiquifyFrame, index: number, out: FaceLiquifyPoint2) => boolean;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export { FACE_LIQUIFY_DEFAULT_SMOOTHING, FACE_LIQUIFY_FRAME_PRIORITY, FACE_LIQUIFY_MAX_FACES, FACE_LIQUIFY_RENDER_ORDER, FaceLiquify, } from './FaceLiquify';
|
|
2
|
+
export { FACE_LIQUIFY_FADE, createFaceLiquifyPresence, resetFaceLiquifyPresence, stepFaceLiquifyPresence, } from './presence';
|
|
3
|
+
export type { FaceLiquifyPresence } from './presence';
|
|
4
|
+
export type { FaceLiquifyProps } from './FaceLiquify';
|
|
5
|
+
export { FACE_LIQUIFY_KINDS, FACE_LIQUIFY_KIND_CODE, FACE_LIQUIFY_KIND_LIMITS, FACE_LIQUIFY_MAX_OPS, FACE_LIQUIFY_MAX_WEIGHT, FACE_LIQUIFY_OP_FLOATS, FACE_LIQUIFY_WEIGHT_EXPONENT, applyFaceLiquifyOp, faceLiquifyAmount, faceLiquifyBounds, faceLiquifyFalloff, sampleFaceLiquify, } from './warp';
|
|
6
|
+
export type { FaceLiquifyBounds, FaceLiquifyKind, FaceLiquifyPoint2 } from './warp';
|
|
7
|
+
export { FACE_LIQUIFY_FACE_HEIGHT, FACE_LIQUIFY_FAR_SIDE, FACE_LIQUIFY_POINTS, createFaceLiquifyFrame, faceLiquifyLandmarkPoint, faceLiquifySideVisibility, writeFaceLiquifyFrame, } from './frame';
|
|
8
|
+
export type { FaceLiquifyFrame, FaceLiquifyPointName, FaceLiquifySide } from './frame';
|
|
9
|
+
export { FACE_LIQUIFY_PRESETS, FACE_LIQUIFY_PRESET_NAMES, faceLiquifyWarpSide, resolveFaceLiquifyWarps, writeFaceLiquifyOps, } from './presets';
|
|
10
|
+
export type { FaceLiquifyCustomWarps, FaceLiquifyPresetName, FaceLiquifyResolution, FaceLiquifyResolvedWarp, FaceLiquifyWarp, FaceLiquifyWeights, } from './presets';
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import * as THREE from "three";
|
|
2
|
+
/**
|
|
3
|
+
* The face liquify pass's material (internal): one quad over the face box
|
|
4
|
+
* that samples a copy of what is drawn so far through the warps. The GLSL
|
|
5
|
+
* apply is a line-by-line port of `applyFaceLiquifyOp` (warp.ts).
|
|
6
|
+
*/
|
|
7
|
+
/** The defines the shader takes from the TS constants. */
|
|
8
|
+
export declare const FACE_LIQUIFY_DEFINES: Readonly<Record<string, number>>;
|
|
9
|
+
/**
|
|
10
|
+
* One warp's backward map (the GLSL copy of `applyFaceLiquifyOp`). `uOps`
|
|
11
|
+
* holds two vec4 per warp: (cx, cy, radius, kind), (strength, dir x, dir y, 0).
|
|
12
|
+
*/
|
|
13
|
+
export declare const FACE_LIQUIFY_WARP_GLSL = "\nuniform vec4 uOps[FACE_LIQUIFY_MAX_OPS * 2];\n\nvec2 faceLiquifyApply(int i, vec2 q, inout bool moved) {\n vec4 a = uOps[i * 2];\n vec4 b = uOps[i * 2 + 1];\n float radius = a.z;\n float k = b.x;\n if (!(radius > 0.0) || !(k > 0.0)) return q;\n vec2 c = a.xy;\n vec2 p = q - c;\n float r2 = dot(p, p) / (radius * radius);\n if (!(r2 < 1.0)) return q;\n float t = 1.0 - r2;\n float w = t * t;\n if (w <= 0.0) return q;\n moved = true;\n int kind = int(a.w + 0.5);\n vec2 d = b.yz;\n if (kind == KIND_BULGE) return c + p * (1.0 - k * w);\n if (kind == KIND_PINCH) return c + p * (1.0 + k * w);\n if (kind == KIND_PUSH) return q - k * radius * w * d;\n if (kind == KIND_STRETCH) return q - dot(p, d) * k * w * d;\n // swirl: dir.x is the signed turn\n float an = -d.x * k * 3.141592653589793 * w;\n float cs = cos(an);\n float sn = sin(an);\n return c + vec2(p.x * cs - p.y * sn, p.x * sn + p.y * cs);\n}\n";
|
|
14
|
+
export declare const FACE_LIQUIFY_VERTEX = "\nuniform vec4 uRect;\nvoid main() {\n // On the near plane (depth 0), tested with LESS: it draws everywhere except\n // where HandCutout wrote the near plane, so hand pixels stay as they are.\n gl_Position = vec4(mix(uRect.xy, uRect.zw, position.xy), -1.0, 1.0);\n}\n";
|
|
15
|
+
export declare const FACE_LIQUIFY_FRAGMENT = "\nuniform sampler2D uCopy;\nuniform int uCount;\nuniform float uAspect;\nuniform vec2 uTarget;\nuniform vec2 uCopyOrigin;\nuniform vec2 uCopySize;\nuniform sampler2D uHandMask;\nuniform float uHands;\n\nuniform vec4 uOps[FACE_LIQUIFY_MAX_OPS * 2];\n\nvec2 faceLiquifyApply(int i, vec2 q, inout bool moved) {\n vec4 a = uOps[i * 2];\n vec4 b = uOps[i * 2 + 1];\n float radius = a.z;\n float k = b.x;\n if (!(radius > 0.0) || !(k > 0.0)) return q;\n vec2 c = a.xy;\n vec2 p = q - c;\n float r2 = dot(p, p) / (radius * radius);\n if (!(r2 < 1.0)) return q;\n float t = 1.0 - r2;\n float w = t * t;\n if (w <= 0.0) return q;\n moved = true;\n int kind = int(a.w + 0.5);\n vec2 d = b.yz;\n if (kind == KIND_BULGE) return c + p * (1.0 - k * w);\n if (kind == KIND_PINCH) return c + p * (1.0 + k * w);\n if (kind == KIND_PUSH) return q - k * radius * w * d;\n if (kind == KIND_STRETCH) return q - dot(p, d) * k * w * d;\n // swirl: dir.x is the signed turn\n float an = -d.x * k * 3.141592653589793 * w;\n float cs = cos(an);\n float sn = sin(an);\n return c + vec2(p.x * cs - p.y * sn, p.x * sn + p.y * cs);\n}\n\nvoid main() {\n vec2 frag = gl_FragCoord.xy;\n // Aspect space, y down.\n vec2 p = vec2(frag.x / uTarget.x * uAspect, 1.0 - frag.y / uTarget.y);\n bool moved = false;\n // As sampleFaceLiquify: the screen point goes through the warps last to first.\n for (int i = FACE_LIQUIFY_MAX_OPS - 1; i >= 0; --i) {\n if (i < uCount) p = faceLiquifyApply(i, p, moved);\n }\n if (!moved) {\n gl_FragColor = texelFetch(uCopy, ivec2(frag - uCopyOrigin), 0);\n return;\n }\n vec2 px = vec2(p.x / uAspect * uTarget.x, (1.0 - p.y) * uTarget.y);\n vec4 color = texture2D(uCopy, (px - uCopyOrigin) / uCopySize);\n if (uHands > 0.5) {\n // Never pull a hand into the face: where the warped point lands on a hand\n // (HandCutout's silhouettes), keep this pixel's own, unmoved colour.\n float hand = texture2D(uHandMask, vec2(p.x / uAspect, 1.0 - p.y)).r;\n if (hand > 0.0) color = mix(color, texelFetch(uCopy, ivec2(frag - uCopyOrigin), 0), hand);\n }\n gl_FragColor = color;\n}\n";
|
|
16
|
+
export type FaceLiquifyUniforms = {
|
|
17
|
+
uCopy: THREE.IUniform<THREE.Texture>;
|
|
18
|
+
uOps: THREE.IUniform<Float32Array>;
|
|
19
|
+
uCount: THREE.IUniform<number>;
|
|
20
|
+
uAspect: THREE.IUniform<number>;
|
|
21
|
+
uTarget: THREE.IUniform<THREE.Vector2>;
|
|
22
|
+
uCopyOrigin: THREE.IUniform<THREE.Vector2>;
|
|
23
|
+
uCopySize: THREE.IUniform<THREE.Vector2>;
|
|
24
|
+
uRect: THREE.IUniform<THREE.Vector4>;
|
|
25
|
+
/** The hands' silhouettes over the whole image (red: 1 on a hand), when `uHands` is 1. */
|
|
26
|
+
uHandMask: THREE.IUniform<THREE.Texture>;
|
|
27
|
+
uHands: THREE.IUniform<number>;
|
|
28
|
+
};
|
|
29
|
+
export type FaceLiquifyMaterial = THREE.ShaderMaterial & {
|
|
30
|
+
uniforms: FaceLiquifyUniforms;
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* The pass's material. Transparent (drawn after every opaque item and every
|
|
34
|
+
* earlier transparent one), no blending, no colour-space or tone-mapping
|
|
35
|
+
* includes: unmoved pixels come back byte-exact. Depth is tested (LESS
|
|
36
|
+
* against the quad's depth 0), never written: `HandCutout`'s near-plane depth
|
|
37
|
+
* keeps hand pixels out; a target without a depth buffer warps them too.
|
|
38
|
+
*/
|
|
39
|
+
export declare const createFaceLiquifyMaterial: (placeholder: THREE.Texture) => FaceLiquifyMaterial;
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { FaceLiquifyMaterial } from './material';
|
|
2
|
+
import { FaceLiquifyBounds } from './warp';
|
|
3
|
+
import * as THREE from "three";
|
|
4
|
+
/**
|
|
5
|
+
* The face liquify screen pass (internal): one quad over the face box. Just
|
|
6
|
+
* before it draws (`onBeforeRender`, after every earlier draw is issued) it
|
|
7
|
+
* copies the face box of the bound framebuffer into a texture, then samples
|
|
8
|
+
* that copy through the warps. Anything it cannot copy safely is left
|
|
9
|
+
* unwarped (draw range 0).
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* The face liquify pass's render order: after every accessory (tracked
|
|
13
|
+
* content, opaque and transparent, below it) and before screen UI (999+).
|
|
14
|
+
*/
|
|
15
|
+
export declare const FACE_LIQUIFY_RENDER_ORDER: number;
|
|
16
|
+
/** The hand mask's size: the whole image, sampled with linear filtering (≈ 4 screen px per texel on a phone). */
|
|
17
|
+
export declare const FACE_LIQUIFY_HAND_MASK_SIZE = 256;
|
|
18
|
+
export declare class FaceLiquifyPass {
|
|
19
|
+
/** One face slot (step 3 draws one face). */
|
|
20
|
+
readonly geometry: THREE.BufferGeometry<THREE.NormalBufferAttributes>;
|
|
21
|
+
readonly placeholder: THREE.DataTexture;
|
|
22
|
+
readonly material: FaceLiquifyMaterial;
|
|
23
|
+
readonly mesh: THREE.Mesh<THREE.BufferGeometry, FaceLiquifyMaterial>;
|
|
24
|
+
/** The warp data the shader reads (`writeFaceLiquifyOps` writes into it). */
|
|
25
|
+
readonly ops: Float32Array;
|
|
26
|
+
/** Whether this frame's warps are set (a face, a weight, warps). */
|
|
27
|
+
live: boolean;
|
|
28
|
+
private readonly bounds;
|
|
29
|
+
private canvasSlot;
|
|
30
|
+
private readonly targets;
|
|
31
|
+
private readonly broken;
|
|
32
|
+
private readonly warned;
|
|
33
|
+
private restoreListener;
|
|
34
|
+
private readonly origin;
|
|
35
|
+
private readonly copyOrigin;
|
|
36
|
+
private handMask;
|
|
37
|
+
/** The scene whose shared hand mask `handMask` is. */
|
|
38
|
+
private handScene;
|
|
39
|
+
constructor();
|
|
40
|
+
/** This frame's warps: `count` ops (already in `ops`) inside `bounds`, or none (hidden). */
|
|
41
|
+
update(count: number, aspect: number, bounds: FaceLiquifyBounds | null): void;
|
|
42
|
+
hide(): void;
|
|
43
|
+
private warnOnce;
|
|
44
|
+
private watchRestore;
|
|
45
|
+
private slotFor;
|
|
46
|
+
private readonly onBeforeRender;
|
|
47
|
+
private disposeSlots;
|
|
48
|
+
dispose(): void;
|
|
49
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A face's liquify presence (pure): it fades in when the face is found,
|
|
3
|
+
* holds through a short dropout (MediaPipe often misses a face for a result
|
|
4
|
+
* or two), then fades out.
|
|
5
|
+
*/
|
|
6
|
+
/** Fade timings, ms: in when found, hold when lost, then out. */
|
|
7
|
+
export declare const FACE_LIQUIFY_FADE: Readonly<{
|
|
8
|
+
inMs: 150;
|
|
9
|
+
holdMs: 250;
|
|
10
|
+
outMs: 120;
|
|
11
|
+
}>;
|
|
12
|
+
export type FaceLiquifyPresence = {
|
|
13
|
+
/** 0..1: how much of the warp shows. */
|
|
14
|
+
fade: number;
|
|
15
|
+
/** Ms since the face was lost, or null while it is tracked (or was never seen). */
|
|
16
|
+
lostMs: number | null;
|
|
17
|
+
};
|
|
18
|
+
export declare const createFaceLiquifyPresence: () => FaceLiquifyPresence;
|
|
19
|
+
/** Starts again from hidden (a reordered or new face). */
|
|
20
|
+
export declare const resetFaceLiquifyPresence: (presence: FaceLiquifyPresence) => void;
|
|
21
|
+
/**
|
|
22
|
+
* One frame, `dtMs` after the last: `tracked` is whether the face model has
|
|
23
|
+
* the face now. Returns the fade (0..1).
|
|
24
|
+
*/
|
|
25
|
+
export declare const stepFaceLiquifyPresence: (presence: FaceLiquifyPresence, tracked: boolean, dtMs: number) => number;
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { FaceLiquifyFrame, FaceLiquifyPointName, FaceLiquifySide } from './frame';
|
|
2
|
+
import { FaceLiquifyKind } from './warp';
|
|
3
|
+
/**
|
|
4
|
+
* One warp on a face, in the face's own terms. Units are eye distances (the
|
|
5
|
+
* 3D distance between the eye centres); `x` is toward the person's own left,
|
|
6
|
+
* `y` up the face.
|
|
7
|
+
*/
|
|
8
|
+
export type FaceLiquifyWarp = {
|
|
9
|
+
kind: FaceLiquifyKind;
|
|
10
|
+
/** A named point (`FACE_LIQUIFY_POINTS`, the person's own sides) or a raw MediaPipe landmark. */
|
|
11
|
+
at: FaceLiquifyPointName | {
|
|
12
|
+
landmark: number;
|
|
13
|
+
};
|
|
14
|
+
/** Moved from `at` by this, in eye distances (x toward the person's own left, y up the face). */
|
|
15
|
+
offset?: readonly [number, number];
|
|
16
|
+
/** The circle it changes, in eye distances. */
|
|
17
|
+
radius: number;
|
|
18
|
+
/** 0..1: the share of the kind's limit (`FACE_LIQUIFY_KIND_LIMITS`) it applies at weight 3. */
|
|
19
|
+
strength: number;
|
|
20
|
+
/** `push` and `stretch`: the way the content moves, in face axes. Default up the face. */
|
|
21
|
+
direction?: readonly [number, number];
|
|
22
|
+
/**
|
|
23
|
+
* `swirl`: turn the other way. By default it turns from the person's own
|
|
24
|
+
* left toward up: counter-clockwise on an unmirrored image, clockwise on the
|
|
25
|
+
* mirrored webcam (as in a mirror).
|
|
26
|
+
*/
|
|
27
|
+
clockwise?: boolean;
|
|
28
|
+
/** Also apply it mirrored on the other side of the face. */
|
|
29
|
+
mirror?: boolean;
|
|
30
|
+
};
|
|
31
|
+
/** The built-in presets, in the order they apply (local warps first, whole-face last). */
|
|
32
|
+
export declare const FACE_LIQUIFY_PRESET_NAMES: readonly ["bigEyes", "smallNose", "bigMouth", "smile", "chubbyCheeks", "slimJaw", "slimFace", "longChin", "bigForehead", "bigHead", "swirl"];
|
|
33
|
+
export type FaceLiquifyPresetName = (typeof FACE_LIQUIFY_PRESET_NAMES)[number];
|
|
34
|
+
/** Each preset's warps. Weight 1 is subtle, 3 the strongest look before the image folds. */
|
|
35
|
+
export declare const FACE_LIQUIFY_PRESETS: Readonly<Record<FaceLiquifyPresetName, readonly FaceLiquifyWarp[]>>;
|
|
36
|
+
/** Weights by preset (or custom warp) name: 0..3, 0 off. */
|
|
37
|
+
export type FaceLiquifyWeights = Readonly<Partial<Record<string, number>>>;
|
|
38
|
+
/** Custom warps by name: one warp or several. Their weight is `weights[name]`, else 3 (as authored). */
|
|
39
|
+
export type FaceLiquifyCustomWarps = Readonly<Record<string, FaceLiquifyWarp | readonly FaceLiquifyWarp[]>>;
|
|
40
|
+
/**
|
|
41
|
+
* A warp ready to place on a face: mirrors expanded (one entry per side), its
|
|
42
|
+
* strength the kind's absolute amount at the given weight.
|
|
43
|
+
*/
|
|
44
|
+
export type FaceLiquifyResolvedWarp = {
|
|
45
|
+
/** The preset or custom warp it came from. */
|
|
46
|
+
name: string;
|
|
47
|
+
kind: FaceLiquifyKind;
|
|
48
|
+
at: FaceLiquifyPointName | {
|
|
49
|
+
landmark: number;
|
|
50
|
+
};
|
|
51
|
+
offset: readonly [number, number];
|
|
52
|
+
radius: number;
|
|
53
|
+
/** The kind's absolute strength (warp `strength` × kind limit × the weight's amount). */
|
|
54
|
+
strength: number;
|
|
55
|
+
/** Unit direction in face axes (push, stretch); for swirl, x is +1 the default turn, −1 `clockwise`. */
|
|
56
|
+
direction: readonly [number, number];
|
|
57
|
+
};
|
|
58
|
+
export type FaceLiquifyResolution = {
|
|
59
|
+
warps: FaceLiquifyResolvedWarp[];
|
|
60
|
+
/** Warps past `FACE_LIQUIFY_MAX_OPS`, left out. */
|
|
61
|
+
dropped: number;
|
|
62
|
+
};
|
|
63
|
+
/**
|
|
64
|
+
* The warps to apply for `weights` (presets and `custom` warps by name, 0..3):
|
|
65
|
+
* presets in `FACE_LIQUIFY_PRESET_NAMES` order, then the custom warps; a
|
|
66
|
+
* weight of 0 (or none, for a preset) leaves its warps out. At most
|
|
67
|
+
* `FACE_LIQUIFY_MAX_OPS`; the rest are counted in `dropped`.
|
|
68
|
+
*/
|
|
69
|
+
export declare const resolveFaceLiquifyWarps: (weights?: FaceLiquifyWeights, custom?: FaceLiquifyCustomWarps) => FaceLiquifyResolution;
|
|
70
|
+
/**
|
|
71
|
+
* The person's side a warp sits on (its warps fade as that side turns
|
|
72
|
+
* away), or null for one on the middle of the face.
|
|
73
|
+
*/
|
|
74
|
+
export declare const faceLiquifyWarpSide: (warp: Pick<FaceLiquifyResolvedWarp, "at">, mirrored: boolean) => FaceLiquifySide | null;
|
|
75
|
+
/**
|
|
76
|
+
* Places resolved warps on a face: writes each into `out`
|
|
77
|
+
* (`FACE_LIQUIFY_OP_FLOATS` floats per warp, aspect space) and returns how
|
|
78
|
+
* many it wrote. `scale` (0..1) fades every warp's strength; a warp on one
|
|
79
|
+
* side of the face also fades as that side turns away
|
|
80
|
+
* (`frame.visibility`). A warp at a raw landmark the frame lacks is skipped.
|
|
81
|
+
*/
|
|
82
|
+
export declare const writeFaceLiquifyOps: (frame: FaceLiquifyFrame, warps: readonly FaceLiquifyResolvedWarp[], out: Float32Array, scale?: number) => number;
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { FaceLiquifyKind } from './warp';
|
|
2
|
+
import * as THREE from "three";
|
|
3
|
+
/**
|
|
4
|
+
* A GPU self-test of the face liquify pass (FACE-3, internal) on this
|
|
5
|
+
* device's WebGL2. It drives the real `FaceLiquifyPass` over an analytic
|
|
6
|
+
* gradient (R = GL x, G = GL y) and reads the pixels back:
|
|
7
|
+
*
|
|
8
|
+
* 1. **compile**: the pass's shader links and draws with no shader or GL error.
|
|
9
|
+
* 2. **identity**: zero warps (count 0 forced on) and a zero-strength warp
|
|
10
|
+
* give the image back byte-exact on an RGBA8 target, an sRGB target and an
|
|
11
|
+
* `antialias: true` canvas (the pass must have drawn: draw range 6).
|
|
12
|
+
* 3. **parity**: bulge, pinch, push, stretch and swirl at their limits (and
|
|
13
|
+
* all five chained) match `sampleFaceLiquify` plus a bilinear tap of the
|
|
14
|
+
* unwarped image within 2/255.
|
|
15
|
+
* 4. **orientation**: a push down-right takes its content from up-left on
|
|
16
|
+
* screen; the vertically mirrored spot is untouched.
|
|
17
|
+
* 5. **sequential**: three `renderSequentialPasses` layers equal one warp.
|
|
18
|
+
* 6. **msaa**: a multisampled target is drawn unwarped with no GL error.
|
|
19
|
+
* 7. **resize**: a target resized 64 → 96 still warps correctly.
|
|
20
|
+
* 8. **order**: a transparent accessory below 998 is warped; a UI square at
|
|
21
|
+
* 999 is byte-equal to the unwarped image.
|
|
22
|
+
*
|
|
23
|
+
* The headless smoke run drives it (`example/smoke/face-liquify.spec.ts`);
|
|
24
|
+
* open `/smoke/face-liquify.html` on the dev server to run it on a device.
|
|
25
|
+
*/
|
|
26
|
+
export type FaceLiquifySelfTestCheck = {
|
|
27
|
+
name: string;
|
|
28
|
+
ok: boolean;
|
|
29
|
+
detail: string;
|
|
30
|
+
};
|
|
31
|
+
export type FaceLiquifySelfTestResult = {
|
|
32
|
+
ok: boolean;
|
|
33
|
+
/** A thrown error, if the test could not run. */
|
|
34
|
+
error: string | null;
|
|
35
|
+
checks: FaceLiquifySelfTestCheck[];
|
|
36
|
+
};
|
|
37
|
+
/** The test image and the pass thresholds. */
|
|
38
|
+
export declare const FACE_LIQUIFY_SELF_TEST_SCENE: Readonly<{
|
|
39
|
+
width: 256;
|
|
40
|
+
height: 192;
|
|
41
|
+
/** Largest byte error against the CPU reference. */
|
|
42
|
+
tolerance: 2;
|
|
43
|
+
/** Share of pixels allowed over the tolerance (float32 vs float64 at disc rims). */
|
|
44
|
+
outlierShare: 0.0005;
|
|
45
|
+
}>;
|
|
46
|
+
/** One op (aspect space, y down) as `writeFaceLiquifyOps` lays it out. */
|
|
47
|
+
export declare const faceLiquifySelfTestOp: (kind: FaceLiquifyKind, cx: number, cy: number, radius: number, strength: number, dx?: number, dy?: number) => number[];
|
|
48
|
+
/**
|
|
49
|
+
* The CPU reference for one pixel (GL x, y from the bottom-left) of a
|
|
50
|
+
* `W × H` RGBA image `source` under `count` ops: the unwarped pixel when no
|
|
51
|
+
* warp moves it, else a bilinear tap (clamped to the edge) at the sampled
|
|
52
|
+
* point. Writes 4 bytes (unrounded floats) into `out`.
|
|
53
|
+
*/
|
|
54
|
+
export declare const faceLiquifyReferencePixel: (source: ArrayLike<number>, W: number, H: number, ops: ArrayLike<number>, count: number, x: number, y: number, out: number[], scratch?: {
|
|
55
|
+
x: number;
|
|
56
|
+
y: number;
|
|
57
|
+
}) => number[];
|
|
58
|
+
/** Byte errors of `actual` against the reference: the largest, and how many exceed `tolerance`. */
|
|
59
|
+
export declare const compareFaceLiquifyReference: (source: ArrayLike<number>, actual: ArrayLike<number>, W: number, H: number, ops: ArrayLike<number>, count: number, tolerance: number) => {
|
|
60
|
+
max: number;
|
|
61
|
+
over: number;
|
|
62
|
+
};
|
|
63
|
+
/** Runs every check on `options.renderer`, or on a renderer of its own. */
|
|
64
|
+
export declare const runFaceLiquifySelfTest: (options?: {
|
|
65
|
+
renderer?: THREE.WebGLRenderer;
|
|
66
|
+
}) => Promise<FaceLiquifySelfTestResult>;
|