@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,134 @@
|
|
|
1
|
+
"use strict";const i=require("./renderPasses-dqmkft4P.cjs"),xe=require("three"),M=require("react/jsx-runtime"),_=require("react"),Ce=require("./index-CfSF8LXa.cjs"),Le=require("./landmarks-BlUqf5MZ.cjs"),Y=require("./renderState-apSfg4eR.cjs"),oe=require("@react-three/fiber"),we=require("./selectors-C4X71aoD.cjs"),Ie=require("./FaceSurface-CHAMEeG1.cjs"),re=require("./landmarkMask-u7es2k4X.cjs");function Pe(e){const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const o in e)if(o!=="default"){const r=Object.getOwnPropertyDescriptor(e,o);Object.defineProperty(t,o,r.get?r:{enumerable:!0,get:()=>e[o]})}}return t.default=e,Object.freeze(t)}const f=Pe(xe),Oe=[{label:"Wireframe",value:i.FACE_MESH_MATERIAL_TYPES.wireframe},{label:"Basic",value:i.FACE_MESH_MATERIAL_TYPES.basic},{label:"Standard",value:i.FACE_MESH_MATERIAL_TYPES.standard},{label:"Physical",value:i.FACE_MESH_MATERIAL_TYPES.physical},{label:"Toon",value:i.FACE_MESH_MATERIAL_TYPES.toon},{label:"Normal",value:i.FACE_MESH_MATERIAL_TYPES.normal},{label:"Matcap",value:i.FACE_MESH_MATERIAL_TYPES.matcap},{label:"Shader",value:i.FACE_MESH_MATERIAL_TYPES.shader}],De=[{label:"Original Face",value:i.FACE_MESH_SHADER_PRESETS.originalFace},{label:"Composite",value:i.FACE_MESH_SHADER_PRESETS.composite}],Ue=[{label:"Front",value:i.FACE_MESH_SIDES.front},{label:"Back",value:i.FACE_MESH_SIDES.back},{label:"Double",value:i.FACE_MESH_SIDES.double}],Ne=[{label:"None",value:i.FACE_MESH_TEXTURE_MAPS.none},{label:"UV Map 1",value:i.FACE_MESH_TEXTURE_MAPS.canonical},{label:"UV Map 2",value:i.FACE_MESH_TEXTURE_MAPS.style2}],He=[{label:"None",value:i.FACE_MESH_ALPHA_MAPS.none},{label:"Default Mask",value:i.FACE_MESH_ALPHA_MAPS.canonical}],Be=[{label:"Solid",value:i.FACE_MESH_MASK_TEXTURE_SOURCES.solid},{label:"Gradient",value:i.FACE_MESH_MASK_TEXTURE_SOURCES.gradient},{label:"Image URL",value:i.FACE_MESH_MASK_TEXTURE_SOURCES.imageUrl},{label:"Media URL",value:i.FACE_MESH_MASK_TEXTURE_SOURCES.mediaUrl}],Xe=[{label:"Normal",value:i.FACE_MESH_BLEND_MODES.normal},{label:"Add",value:i.FACE_MESH_BLEND_MODES.add},{label:"Subtract",value:i.FACE_MESH_BLEND_MODES.subtract},{label:"Multiply",value:i.FACE_MESH_BLEND_MODES.multiply},{label:"Screen",value:i.FACE_MESH_BLEND_MODES.screen},{label:"Overlay",value:i.FACE_MESH_BLEND_MODES.overlay},{label:"Soft Light",value:i.FACE_MESH_BLEND_MODES.softLight},{label:"Hard Light",value:i.FACE_MESH_BLEND_MODES.hardLight},{label:"Lighten",value:i.FACE_MESH_BLEND_MODES.lighten},{label:"Darken",value:i.FACE_MESH_BLEND_MODES.darken},{label:"Difference",value:i.FACE_MESH_BLEND_MODES.difference},{label:"Exclusion",value:i.FACE_MESH_BLEND_MODES.exclusion}],ie=["both","left","right"],le=["shader","image"],ce={eye:"both",mode:"shader",color:"#4fa3ff",textureUrl:"",tintImage:!1,scale:1,opacity:.85,targetFps:0,smoothing:0,leadMs:80,mirrored:!1,faceIndex:0,holdMs:250},Ke=[{key:"eye",label:"Eye",type:"select",options:ie.map(e=>({label:e,value:e}))},{key:"mode",label:"Material",type:"select",options:le.map(e=>({label:e,value:e}))},{key:"color",label:"Color / tint",type:"color"},{key:"textureUrl",label:"Image URL (image mode)",type:"text"},{key:"tintImage",label:"Tint image with color",type:"boolean"},{key:"scale",label:"Scale (× iris radius)",type:"number",min:.2,max:4,step:.05},{key:"opacity",label:"Opacity",type:"number",min:0,max:1,step:.05},{key:"targetFps",label:"Face FPS (0 = session)",type:"number",min:0,max:60,step:1},{key:"smoothing",label:"Smoothing (0 = raw)",type:"number",min:0,max:60,step:1},{key:"leadMs",label:"Lead between samples (ms)",type:"number",min:0,max:200,step:10},{key:"mirrored",label:"Mirror material",type:"boolean"},{key:"faceIndex",label:"Face index",type:"number",min:0,max:3,step:1},{key:"holdMs",label:"Hold (ms)",type:"number",min:0,max:1e3,step:10}],Ge=e=>({...ce,...e}),Ye=(e,t)=>({...e,...t}),je=["lips","contour","blush","highlighter","eyeshadow","eyeliner","brows"],O=["matte","satin","gloss","shimmer","metallic","glitter"],ze=["both","left","right"],ue=["lips","blush","contour","highlighter","brows"],D={matte:{shine:0,sparkleDensity:0,sparkleSize:.25},satin:{shine:.3,sparkleDensity:0,sparkleSize:.25},gloss:{shine:.8,sparkleDensity:0,sparkleSize:.25},shimmer:{shine:.5,sparkleDensity:.6,sparkleSize:.25},metallic:{shine:.7,sparkleDensity:0,sparkleSize:.25},glitter:{shine:.7,sparkleDensity:.35,sparkleSize:.8}},me=["shine","sparkleDensity","sparkleSize"],P=[.1,1.5],T={lips:{nude:"#b9826f",rosewood:"#9e5a5a",mauve:"#a0606e",softPink:"#d88a95",coral:"#e0645a",peach:"#e8907a",classicRed:"#a3202d",brick:"#8e3b2c",berry:"#7b2846",plum:"#5e2a45",wine:"#5a1a28",chocolate:"#5b3a2e"},contour:{fair:"#c9a08a",light:"#b48a72",medium:"#98705a",tan:"#7f5a45",deep:"#5e4032",rich:"#432c22",bronzeLight:"#b9805a",bronzeDeep:"#8a5532"},blush:{softPink:"#e8a0a8",rose:"#d97a85",peach:"#f0a07c",coral:"#ec7b67",apricot:"#f2a86b",mauve:"#c0828f",berry:"#b04a68",brick:"#b4574a",terracotta:"#c4694c",plum:"#8f4a68"},highlighter:{pearl:"#f6eee6",champagne:"#f2dcc0",gold:"#e9c27a",roseGold:"#eab3a0",bronzeGlow:"#d29a66",lilacPearl:"#e6d6ef"},eyeshadow:{ivory:"#f3e6d3",champagne:"#e9d2b0",sand:"#d2b48c",taupe:"#8f7a6e",warmBrown:"#8b5a3c",coolBrown:"#6e5a50",espresso:"#3e2a22",charcoal:"#3a3a3c",black:"#141414",bronze:"#a8743f",copper:"#b5653a",gold:"#d4ae5a",roseGold:"#d49a8a",plum:"#6b3a5a",burgundy:"#6e2433",olive:"#6f6a3a",navy:"#23314f",emerald:"#1f6b52",teal:"#1f6f73",lilac:"#b8a0cf",silver:"#c5c7cb"},eyeliner:{black:"#0d0d0d",brownBlack:"#231a16",brown:"#4a3226",charcoal:"#33343a",navy:"#1c2848",plum:"#4f2442",emerald:"#145a44",bronze:"#8a5a2e",gold:"#c9a14e",white:"#f5f3ef"},brows:{blonde:"#a88a62",taupe:"#7c6a5c",softBrown:"#6b4f3c",mediumBrown:"#57402f",darkBrown:"#3d2c22",softBlack:"#252020",auburn:"#7a4030",grey:"#8a8580"}},v=e=>Object.keys(T[e]),pe={lips:v("lips"),contour:v("contour"),blush:v("blush"),highlighter:v("highlighter"),eyeshadow:v("eyeshadow"),eyeliner:v("eyeliner"),brows:v("brows")},U=e=>ue.includes(e),z=(e,t)=>typeof t=="string"&&Object.prototype.hasOwnProperty.call(T[e],t),se=(e,t)=>t==="custom"||t==="auto"&&U(e)||z(e,t);function de(e,t){return t==="auto"?U(e)?"auto":void 0:z(e,t)?T[e][t]:void 0}const w=e=>{const t=e.trim().toLowerCase(),o=/^#([0-9a-f])([0-9a-f])([0-9a-f])$/.exec(t);return o?`#${o[1]}${o[1]}${o[2]}${o[2]}${o[3]}${o[3]}`:t},We=(e,t)=>Object.values(T[e]).some(o=>w(o)===t),he=(e,t,o,r,n)=>{const a=se(e,t),s=a?t:se(e,r)?r:"custom",l=typeof o=="string"&&o.trim()?o.trim():void 0;if(s==="custom")return{shade:s,color:l??n};const u=s==="auto"?n:de(e,s)??n;if(l!==void 0){const c=w(l),g=a&&(We(e,c)||c===w(n));if(c!==w(u)&&!g)return{shade:"custom",color:l}}return{shade:s,color:u}},W=e=>{const t=e.replace(/([a-z])([A-Z])/g,"$1 $2").toLowerCase();return t[0].toUpperCase()+t.slice(1)},Se=e=>[{label:"Custom color",value:"custom"},...U(e)?[{label:"Auto (own color)",value:"auto"}]:[],...pe[e].map(t=>({label:W(t),value:t}))],V=["lipstick","gloss","matte","tint","metallic","gradient","shimmer","glitter"],ge=["texture","solid"],Ee=["outward","vertical","horizontal"],fe={enabled:!0,preset:"custom",shade:"custom",maskMode:"outer-and-inner-lips",colorMode:"texture",color:"#e85d75",opacity:.8,coverage:.8,finish:"satin",...D.satin,sparkleColor:"",intensity:1,shading:1,gloss:.35,roughness:.5,highlightColor:"#ffffff",gradientColor:"#ffd6de",gradientAmount:0,gradientDirection:"outward",edgeSoftness:.12,innerLipColor:"#7a1f36",innerLipAmount:0,innerLipWidth:.35,splitLips:!1,lowerLipColor:"#e85d75",lowerLipOpacity:.8,textureScaleX:1,textureScaleY:1,textureOffsetX:0,textureOffsetY:0,textureRotation:0,textureFlipX:!1,textureFlipY:!1},q={lipstick:{finish:"satin",coverage:.85,color:"#c0304f",opacity:.85,intensity:1,shading:1,gloss:.35,roughness:.5,highlightColor:"#ffffff",gradientAmount:0},gloss:{finish:"gloss",coverage:.45,color:"#e05a7a",opacity:.7,intensity:1,shading:1,gloss:.95,roughness:.12,highlightColor:"#ffffff",gradientAmount:0},matte:{finish:"matte",coverage:.95,color:"#a8323e",opacity:.92,intensity:1,shading:1,gloss:0,roughness:1,highlightColor:"#ffffff",gradientAmount:0},tint:{finish:"matte",coverage:.3,color:"#ff6b81",opacity:.4,intensity:1,shading:1,gloss:.1,roughness:.7,highlightColor:"#ffffff",gradientAmount:0},metallic:{finish:"metallic",coverage:.9,color:"#b5485a",opacity:.9,intensity:1,shading:1,gloss:1,roughness:.3,highlightColor:"#f3c46b",gradientAmount:0},gradient:{finish:"satin",coverage:.8,color:"#d6336c",opacity:.8,intensity:1,shading:1,gloss:.3,roughness:.5,highlightColor:"#ffffff",gradientColor:"#f9c2cf",gradientAmount:.85,gradientDirection:"outward"},shimmer:{finish:"shimmer",coverage:.7,color:"#c8577a",opacity:.8,intensity:1,shading:1,gloss:.4,roughness:.45,highlightColor:"#ffffff",gradientAmount:0},glitter:{finish:"glitter",coverage:.5,color:"#b8406a",opacity:.8,intensity:1,shading:1,gloss:.5,roughness:.35,highlightColor:"#ffffff",gradientAmount:0}},$=e=>typeof e=="string"&&V.includes(e),p=(e,t,o,r)=>typeof e=="number"&&Number.isFinite(e)?Math.min(o,Math.max(t,e)):r,Ve=(e,t)=>typeof e=="number"&&Number.isFinite(e)?e:t,x=(e,t)=>typeof e=="string"&&e.trim()?e:t,qe=(e,t)=>typeof e=="string"?e.trim():t,C=(e,t)=>typeof e=="boolean"?e:t,K=(e,t,o)=>typeof t=="string"&&e.includes(t)?t:o,$e=e=>Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0)),be=(e={})=>{const t=$(e.preset)?e.preset:"custom",o=$e(e),r={...fe,...t==="custom"?{}:q[t]},n=K(O,o.finish,r.finish),a={...r,...D[n]},s={...a,...o},{shade:l,color:u}=he("lips",o.shade,o.color,a.shade,a.color);return{enabled:C(s.enabled,a.enabled),preset:t,shade:l,maskMode:s.maskMode==="outer-lips"?"outer-lips":"outer-and-inner-lips",colorMode:K(ge,s.colorMode,a.colorMode),color:u,opacity:p(s.opacity,0,1,a.opacity),coverage:p(s.coverage,0,1,a.coverage),finish:n,shine:p(s.shine,0,1,a.shine),sparkleDensity:p(s.sparkleDensity,0,1,a.sparkleDensity),sparkleSize:p(s.sparkleSize,...P,a.sparkleSize),sparkleColor:qe(s.sparkleColor,a.sparkleColor),intensity:p(s.intensity,0,1,a.intensity),shading:p(s.shading,0,1,a.shading),gloss:p(s.gloss,0,1,a.gloss),roughness:p(s.roughness,0,1,a.roughness),highlightColor:x(s.highlightColor,a.highlightColor),gradientColor:x(s.gradientColor,a.gradientColor),gradientAmount:p(s.gradientAmount,0,1,a.gradientAmount),gradientDirection:K(Ee,s.gradientDirection,a.gradientDirection),edgeSoftness:p(s.edgeSoftness,0,1,a.edgeSoftness),innerLipColor:x(s.innerLipColor,a.innerLipColor),innerLipAmount:p(s.innerLipAmount,0,1,a.innerLipAmount),innerLipWidth:p(s.innerLipWidth,0,1,a.innerLipWidth),splitLips:C(s.splitLips,a.splitLips),lowerLipColor:x(s.lowerLipColor,a.lowerLipColor),lowerLipOpacity:p(s.lowerLipOpacity,0,1,a.lowerLipOpacity),textureScaleX:p(s.textureScaleX,.05,20,a.textureScaleX),textureScaleY:p(s.textureScaleY,.05,20,a.textureScaleY),textureOffsetX:p(s.textureOffsetX,-2,2,a.textureOffsetX),textureOffsetY:p(s.textureOffsetY,-2,2,a.textureOffsetY),textureRotation:Ve(s.textureRotation,a.textureRotation),textureFlipX:C(s.textureFlipX,a.textureFlipX),textureFlipY:C(s.textureFlipY,a.textureFlipY)}},Ze=(e,t)=>{const o=Object.keys(e).some(a=>t[a]===void 0),r=Object.fromEntries(Object.entries(t).filter(([a,s])=>s!==void 0&&(o||s!==e[a]))),n={...e};if(r.preset!==e.preset&&$(r.preset)&&Object.assign(n,q[r.preset]),Object.assign(n,r),n.finish!==e.finish&&O.includes(n.finish)){Object.assign(n,D[n.finish]);for(const a of me)r[a]!==void 0&&(n[a]=r[a])}return r.color===void 0?n.shade!=="custom"&&delete n.color:r.shade===void 0&&r.color!==e.color&&(n.shade="custom"),be(n)},d={min:0,max:1,step:.01},Je=[{key:"enabled",label:"On",type:"boolean"},{key:"preset",label:"Preset",type:"select",options:[{label:"Custom",value:"custom"},...V.map(e=>({label:e[0].toUpperCase()+e.slice(1),value:e}))]},{key:"shade",label:"Shade",type:"select",options:Se("lips")},{key:"maskMode",label:"Mask mode",type:"select",options:[{label:"Outer + inner lips (mouth cut out)",value:"outer-and-inner-lips"},{label:"Outer lips (mouth included)",value:"outer-lips"}]},{key:"colorMode",label:"Color mode",type:"select",options:[{label:"Design texture",value:"texture"},{label:"Procedural (solid / gradient)",value:"solid"}]},{key:"color",label:"Tint color",type:"color"},{key:"opacity",label:"Opacity",type:"number",...d},{key:"coverage",label:"Coverage (sheer → opaque)",type:"number",...d},{key:"finish",label:"Finish",type:"select",options:O.map(e=>({label:W(e),value:e}))},{key:"shine",label:"Shine",type:"number",...d},{key:"sparkleColor",label:"Sparkle color (blank = from shade)",type:"text"},{key:"sparkleDensity",label:"Sparkle density",type:"number",...d},{key:"sparkleSize",label:"Sparkle size (mm)",type:"number",min:P[0],max:P[1],step:.05},{key:"intensity",label:"Tint intensity",type:"number",...d},{key:"shading",label:"Follow light (0 = flat)",type:"number",...d},{key:"gloss",label:"Gloss",type:"number",...d},{key:"roughness",label:"Roughness",type:"number",...d},{key:"highlightColor",label:"Highlight color",type:"color"},{key:"gradientColor",label:"Gradient color",type:"color"},{key:"gradientAmount",label:"Gradient amount",type:"number",...d},{key:"gradientDirection",label:"Gradient direction",type:"select",options:[{label:"Mouth line → outer edge",value:"outward"},{label:"Bottom → top",value:"vertical"},{label:"Person's right → left corner",value:"horizontal"}]},{key:"edgeSoftness",label:"Edge softness",type:"number",...d},{key:"innerLipColor",label:"Inner lip color",type:"color"},{key:"innerLipAmount",label:"Inner lip amount",type:"number",...d},{key:"innerLipWidth",label:"Inner lip width",type:"number",...d},{key:"splitLips",label:"Separate lower lip",type:"boolean"},{key:"lowerLipColor",label:"Lower lip color",type:"color"},{key:"lowerLipOpacity",label:"Lower lip opacity",type:"number",...d},{key:"textureScaleX",label:"Texture scale X",type:"number",min:.1,max:10,step:.05},{key:"textureScaleY",label:"Texture scale Y",type:"number",min:.1,max:10,step:.05},{key:"textureOffsetX",label:"Texture offset X",type:"number",min:-1,max:1,step:.01},{key:"textureOffsetY",label:"Texture offset Y",type:"number",min:-1,max:1,step:.01},{key:"textureRotation",label:"Texture rotation°",type:"number",min:-180,max:180,step:1},{key:"textureFlipX",label:"Flip horizontal",type:"boolean"},{key:"textureFlipY",label:"Flip vertical",type:"boolean"}],Qe=(e,t,o=new f.Matrix3)=>{const r=(t.minU+t.maxU)/2,n=(t.minV+t.maxV)/2,a=t.maxU-t.minU,s=t.maxV-t.minV,l=-f.MathUtils.degToRad(e.textureRotation),u=Math.cos(l),c=Math.sin(l),g=(e.textureFlipX?-1:1)/Math.max(e.textureScaleX,.001),h=(e.textureFlipY?-1:1)/Math.max(e.textureScaleY,.001),S=g*u,b=-g*c,m=h*c,y=h*u,k=r+e.textureOffsetX*a,B=n+e.textureOffsetY*s,te=r-(S*k+b*B),X=n-(m*k+y*B);return o.set(S,b,te,m,y,X,0,0,1)},et=["eachOther","photo","canonicalTexture","faceTexture"],Z=["natural","keepColors","raw"],F={preset:"natural",matchSkinTone:1,matchLighting:1,edgeMatch:1,edgeSoftness:1.2,edgeInset:.3,ownEyes:!0,ownMouth:!0,featureSoftness:.25,detail:1,smoothing:.35,amount:1},N={natural:{matchSkinTone:1,matchLighting:1,edgeMatch:1,edgeSoftness:1.2,ownEyes:!0,ownMouth:!0,detail:1},keepColors:{matchSkinTone:0,matchLighting:.7,edgeMatch:1,edgeSoftness:1},raw:{matchSkinTone:0,matchLighting:0,edgeMatch:0,edgeSoftness:.4}},J=e=>typeof e=="string"&&Z.includes(e),ve=e=>_e(e)?"keepColors":"natural",_e=e=>{var t;return(e==null?void 0:e.kind)==="canonicalTexture"||(e==null?void 0:e.kind)==="faceTexture"&&((t=e.face)==null?void 0:t.kind)==="canonical"},ye=.1,ke=(e,t,o,r)=>typeof e=="number"&&Number.isFinite(e)?Math.min(o,Math.max(t,e)):r,ne=(e,t)=>typeof e=="boolean"?e:t,tt=(e,t,o)=>typeof t=="string"&&e.includes(t)?t:o,Q=e=>Object.fromEntries(Object.entries(e).filter(([,t])=>t!==void 0)),R={matchSkinTone:[0,1],matchLighting:[0,1],edgeMatch:[0,1],edgeSoftness:[.3,3],edgeInset:[0,1.5],featureSoftness:[.1,.6],detail:[0,1],smoothing:[0,1],amount:[0,1]},Me=(e,t)=>Object.entries(N[t]).every(([o,r])=>e[o]===r),j=(e={},t={})=>{const o=e.preset??ve(t.source),r=J(o)?o:"custom",n={...F,..._e(t.source)?{featureSoftness:ye}:{},...r==="custom"?{}:N[r]},a={...n,...Q(e)},s=R,l=c=>ke(a[c],s[c][0],s[c][1],n[c]),u={preset:r,matchSkinTone:l("matchSkinTone"),matchLighting:l("matchLighting"),edgeMatch:l("edgeMatch"),edgeSoftness:l("edgeSoftness"),edgeInset:l("edgeInset"),ownEyes:ne(a.ownEyes,n.ownEyes),ownMouth:ne(a.ownMouth,n.ownMouth),featureSoftness:l("featureSoftness"),detail:l("detail"),smoothing:l("smoothing"),amount:l("amount")};return r!=="custom"&&!Me(u,r)&&(u.preset="custom"),u},at=(e,t)=>{const o=Object.fromEntries(Object.entries(t).filter(([n,a])=>n!=="preset"&&a!==void 0&&a!==e[n])),r=t.preset;return J(r)&&(r!==e.preset||!Me(e,r))?j({...e,...N[r],...o,preset:r}):j({...e,...o,preset:r==="custom"?"custom":e.preset})},E={min:0,max:1,step:.01},I=(e,t)=>({min:R[e][0],max:R[e][1],step:t}),ot={natural:"Natural",keepColors:"Keep colors",raw:"Raw"},rt=[{key:"preset",label:"Preset",type:"select",options:[{label:"Custom",value:"custom"},...Z.map(e=>({label:ot[e],value:e}))]},{key:"matchSkinTone",label:"Match skin tone",type:"number",...E},{key:"matchLighting",label:"Match lighting",type:"number",...E},{key:"edgeMatch",label:"Match at the edge",type:"number",...E},{key:"edgeSoftness",label:"Edge softness (cm)",type:"number",...I("edgeSoftness",.05)},{key:"edgeInset",label:"Edge inset (cm)",type:"number",...I("edgeInset",.05)},{key:"ownEyes",label:"Keep own eyes",type:"boolean"},{key:"ownMouth",label:"Keep own mouth",type:"boolean"},{key:"featureSoftness",label:"Eye and mouth rim (cm)",type:"number",...I("featureSoftness",.01)},{key:"detail",label:"Detail",type:"number",...E},{key:"smoothing",label:"Smoothing",type:"number",...E},{key:"amount",label:"Amount",type:"number",...E}],H=["leftLeft","rightRight","flip","upsideDown"],Ae={leftLeft:"your left half twice",rightRight:"your right half twice",flip:"left and right swapped",upsideDown:"eyes and mouth upside down"},st=e=>typeof e=="string"&&H.includes(e),Fe={variant:"leftLeft",matchLighting:1,edgeSoftness:1.2,smoothing:.35,amount:1},Re=(e={})=>{const t=Fe,o={...t,...Q(e)},r=R,n=a=>ke(o[a],r[a][0],r[a][1],t[a]);return{variant:tt(H,o.variant,t.variant),matchLighting:n("matchLighting"),edgeSoftness:n("edgeSoftness"),smoothing:n("smoothing"),amount:n("amount")}},nt=(e,t)=>Re({...e,...Q(t)}),it=[{key:"variant",label:"Variant",type:"select",options:H.map(e=>({label:Ae[e],value:e}))},{key:"matchLighting",label:"Match lighting",type:"number",...E},{key:"edgeSoftness",label:"Edge softness (cm)",type:"number",...I("edgeSoftness",.05)},{key:"smoothing",label:"Smoothing",type:"number",...E},{key:"amount",label:"Amount",type:"number",...E}],lt=e=>({matchSkinTone:0,matchLighting:e.matchLighting,edgeMatch:e.matchLighting,edgeSoftness:e.edgeSoftness,edgeInset:F.edgeInset,ownEyes:!1,ownMouth:!1,featureSoftness:F.featureSoftness,detail:F.detail,smoothing:e.smoothing,amount:e.amount}),ct=Object.freeze({...Ie.faceSurfaceBlending,transparent:!1,depthTest:!0,depthWrite:!1,toneMapped:!1}),ut=`
|
|
2
|
+
varying vec2 vUv;
|
|
3
|
+
|
|
4
|
+
void main() {
|
|
5
|
+
vUv = uv;
|
|
6
|
+
gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
|
|
7
|
+
}
|
|
8
|
+
`,mt=`
|
|
9
|
+
uniform sampler2D cameraTexture;
|
|
10
|
+
uniform sampler2D retouchMaskTexture;
|
|
11
|
+
uniform vec2 texelSize;
|
|
12
|
+
uniform float retouchAmount;
|
|
13
|
+
uniform float blurRadius;
|
|
14
|
+
uniform float detailPreservation;
|
|
15
|
+
uniform float blemishReduction;
|
|
16
|
+
uniform float blemishRadius;
|
|
17
|
+
uniform float previewMask;
|
|
18
|
+
uniform float protectLandmarks;
|
|
19
|
+
uniform float clipMinX;
|
|
20
|
+
uniform float clipMaxX;
|
|
21
|
+
varying vec2 vUv;
|
|
22
|
+
|
|
23
|
+
vec3 sampleCamera(vec2 uv) {
|
|
24
|
+
return texture2D(cameraTexture, clamp(uv, vec2(0.0), vec2(1.0))).rgb;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
vec3 readRetouchMask(vec2 uv) {
|
|
28
|
+
vec4 mask = texture2D(retouchMaskTexture, uv);
|
|
29
|
+
float faceRegion = clamp(mask.b, 0.0, 1.0);
|
|
30
|
+
float softFaceRegion = min(mask.r, faceRegion);
|
|
31
|
+
float protectedRegion = min(mask.g, faceRegion) * protectLandmarks;
|
|
32
|
+
float hardProtectedRegion = step(0.08, protectedRegion);
|
|
33
|
+
float softRetouchRegion = softFaceRegion * (1.0 - protectedRegion);
|
|
34
|
+
float hardRetouchRegion = step(0.5, faceRegion) * (1.0 - hardProtectedRegion);
|
|
35
|
+
|
|
36
|
+
return vec3(
|
|
37
|
+
clamp(softRetouchRegion, 0.0, 1.0),
|
|
38
|
+
clamp(protectedRegion, 0.0, 1.0),
|
|
39
|
+
clamp(hardRetouchRegion, 0.0, 1.0)
|
|
40
|
+
);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
float retouchCoverage(vec2 uv) {
|
|
44
|
+
return step(0.001, readRetouchMask(uv).x);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
void addMaskedBlurSample(inout vec3 color, inout float weightSum, vec2 centerUv, vec2 sampleUv, float weight) {
|
|
48
|
+
float coverage = retouchCoverage(sampleUv);
|
|
49
|
+
vec3 sampleColor = mix(sampleCamera(centerUv), sampleCamera(sampleUv), coverage);
|
|
50
|
+
color += sampleColor * weight;
|
|
51
|
+
weightSum += weight;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
vec3 maskedBlurCamera(vec2 uv, float radius) {
|
|
55
|
+
vec2 r = texelSize * radius;
|
|
56
|
+
vec3 color = sampleCamera(uv) * 0.2;
|
|
57
|
+
float weightSum = 0.2;
|
|
58
|
+
|
|
59
|
+
addMaskedBlurSample(color, weightSum, uv, uv + vec2(r.x, 0.0), 0.1);
|
|
60
|
+
addMaskedBlurSample(color, weightSum, uv, uv - vec2(r.x, 0.0), 0.1);
|
|
61
|
+
addMaskedBlurSample(color, weightSum, uv, uv + vec2(0.0, r.y), 0.1);
|
|
62
|
+
addMaskedBlurSample(color, weightSum, uv, uv - vec2(0.0, r.y), 0.1);
|
|
63
|
+
addMaskedBlurSample(color, weightSum, uv, uv + r, 0.075);
|
|
64
|
+
addMaskedBlurSample(color, weightSum, uv, uv - r, 0.075);
|
|
65
|
+
addMaskedBlurSample(color, weightSum, uv, uv + vec2(r.x, -r.y), 0.075);
|
|
66
|
+
addMaskedBlurSample(color, weightSum, uv, uv + vec2(-r.x, r.y), 0.075);
|
|
67
|
+
addMaskedBlurSample(color, weightSum, uv, uv + r * 2.0, 0.05);
|
|
68
|
+
addMaskedBlurSample(color, weightSum, uv, uv - r * 2.0, 0.05);
|
|
69
|
+
|
|
70
|
+
return color / max(weightSum, 0.001);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
float retouchLuminance(vec3 color) {
|
|
74
|
+
return dot(color, vec3(0.299, 0.587, 0.114));
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
vec3 reduceBlemishes(vec3 current, vec3 source, vec3 localAverage, vec3 skinBase, float skinMask) {
|
|
78
|
+
float originalLum = retouchLuminance(source);
|
|
79
|
+
float localLum = retouchLuminance(localAverage);
|
|
80
|
+
float redness = max(source.r - max(source.g, source.b), 0.0);
|
|
81
|
+
float localRedness = max(localAverage.r - max(localAverage.g, localAverage.b), 0.0);
|
|
82
|
+
float excessRedness = max(redness - localRedness * 0.72, 0.0);
|
|
83
|
+
float darkSpot = max(localLum - originalLum, 0.0);
|
|
84
|
+
float contrast = length(source - localAverage);
|
|
85
|
+
float candidate =
|
|
86
|
+
smoothstep(0.012, 0.09, excessRedness) +
|
|
87
|
+
smoothstep(0.018, 0.13, darkSpot) +
|
|
88
|
+
smoothstep(0.03, 0.16, contrast);
|
|
89
|
+
float blemishMask = clamp(candidate * 0.72, 0.0, 1.0) * skinMask * blemishReduction;
|
|
90
|
+
|
|
91
|
+
vec3 chromaReduced = vec3(
|
|
92
|
+
mix(current.r, min(current.r, localAverage.r * 1.04), blemishMask),
|
|
93
|
+
mix(current.g, max(current.g, localAverage.g * 0.98), 0.35 * blemishMask),
|
|
94
|
+
mix(current.b, max(current.b, localAverage.b * 0.98), 0.35 * blemishMask)
|
|
95
|
+
);
|
|
96
|
+
vec3 texture = source - localAverage;
|
|
97
|
+
vec3 repaired = clamp(skinBase + texture * detailPreservation * 0.18, 0.0, 1.0);
|
|
98
|
+
|
|
99
|
+
return mix(chromaReduced, repaired, min(blemishMask * 1.15, 1.0));
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
void main() {
|
|
103
|
+
if (vUv.x < clipMinX || vUv.x > clipMaxX) discard;
|
|
104
|
+
|
|
105
|
+
vec3 original = sampleCamera(vUv);
|
|
106
|
+
vec3 masks = readRetouchMask(vUv);
|
|
107
|
+
float faceAlpha = max(max(masks.x, masks.y), masks.z);
|
|
108
|
+
|
|
109
|
+
if (previewMask > 0.5) {
|
|
110
|
+
float sharpPreview = 1.0 - step(0.001, retouchAmount + blurRadius);
|
|
111
|
+
float retouchPreview = mix(masks.x, masks.z, sharpPreview);
|
|
112
|
+
float protectedPreview = mix(masks.y, step(0.08, masks.y), sharpPreview);
|
|
113
|
+
vec3 facePreview = vec3(retouchPreview, 0.08, 0.08);
|
|
114
|
+
vec3 featurePreview = vec3(0.05, protectedPreview, 0.1);
|
|
115
|
+
vec3 maskPreview = max(facePreview, featurePreview);
|
|
116
|
+
vec3 debugColor = mix(original * 0.18, maskPreview, max(retouchPreview, protectedPreview));
|
|
117
|
+
gl_FragColor = vec4(debugColor, faceAlpha);
|
|
118
|
+
#include <colorspace_fragment>
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
float effectiveBlurRadius = min(blurRadius, 12.0);
|
|
123
|
+
vec3 smallBlur = maskedBlurCamera(vUv, max(0.0, effectiveBlurRadius * 0.45));
|
|
124
|
+
vec3 largeBlur = maskedBlurCamera(vUv, max(0.0, effectiveBlurRadius));
|
|
125
|
+
vec3 detail = original - smallBlur;
|
|
126
|
+
float detailAmount = mix(detailPreservation, 0.9, masks.y);
|
|
127
|
+
vec3 smoothed = clamp(largeBlur + detail * detailAmount, 0.0, 1.0);
|
|
128
|
+
vec3 color = mix(original, smoothed, min(retouchAmount, 0.72) * masks.x);
|
|
129
|
+
vec3 blemishAverage = maskedBlurCamera(vUv, max(1.0, blemishRadius));
|
|
130
|
+
color = reduceBlemishes(color, original, blemishAverage, smoothed, masks.x);
|
|
131
|
+
gl_FragColor = vec4(color, faceAlpha);
|
|
132
|
+
#include <colorspace_fragment>
|
|
133
|
+
}
|
|
134
|
+
`,pt=({retouchMask:e,retouchAmount:t,blurRadius:o,detailPreservation:r=.62,blemishReduction:n=.35,blemishRadius:a=3,previewMask:s,protectLandmarks:l,clipMinX:u=0,clipMaxX:c=1,renderOrder:g=Y.FACE_RETOUCH_RENDER_ORDER})=>{const{camera:h,size:S}=oe.useThree(),b=we.useXRCameraTexture(),m=_.useMemo(()=>({cameraTexture:{value:null},retouchMaskTexture:{value:null},texelSize:{value:new f.Vector2(1/1280,1/720)},retouchAmount:{value:0},blurRadius:{value:0},detailPreservation:{value:0},blemishReduction:{value:0},blemishRadius:{value:0},previewMask:{value:0},protectLandmarks:{value:1},clipMinX:{value:0},clipMaxX:{value:1}}),[]),y=_.useMemo(()=>{if(!h.isPerspectiveCamera)return[10,10];const k=h,X=(k.position.z||5)- -1,Te=f.MathUtils.degToRad(k.fov),ae=2*Math.tan(Te/2)*X;return[ae*(S.width/S.height),ae]},[h,S]);return oe.useFrame(()=>{m.cameraTexture.value=b??null,m.retouchMaskTexture.value=e,m.texelSize.value.set(1/Math.max(S.width,1),1/Math.max(S.height,1)),m.retouchAmount.value=t,m.blurRadius.value=o,m.detailPreservation.value=r,m.blemishReduction.value=n,m.blemishRadius.value=a,m.previewMask.value=s?1:0,m.protectLandmarks.value=l?1:0,m.clipMinX.value=u,m.clipMaxX.value=c}),b?M.jsx("group",{position:[0,0,-1],children:M.jsxs("mesh",{renderOrder:g,children:[M.jsx("planeGeometry",{args:y}),M.jsx("shaderMaterial",{uniforms:m,vertexShader:ut,fragmentShader:mt,...ct})]})}):null},dt=e=>{const t=document.createElement("canvas");t.width=e,t.height=e;const o=t.getContext("2d",{willReadFrequently:!1});if(!o)throw new Error("Unable to create face retouch mask context");const r=new f.CanvasTexture(t);return r.colorSpace=f.NoColorSpace,r.minFilter=f.LinearFilter,r.magFilter=f.LinearFilter,r.generateMipmaps=!1,r.needsUpdate=!0,{canvas:t,context:o,texture:r}},ht=(e,t=re.FACE_MASK_SIZE,o={},r=0)=>{const n=_.useMemo(()=>dt(t),[t]);return _.useEffect(()=>{let a=0;const s=()=>{var u,c;a=requestAnimationFrame(s);const l=(c=(u=e==null?void 0:e.detectionResults)==null?void 0:u.faceLandmarks)==null?void 0:c[r];re.drawFaceRetouchMask(n.context,l,t,o),n.texture.needsUpdate=!0};return s(),()=>{cancelAnimationFrame(a)}},[r,e,n.context,n.texture,o,t]),_.useEffect(()=>()=>{n.texture.dispose()},[n.texture]),{canvas:n.canvas,texture:n.texture}},St=[{key:"skinSmoothing",label:"Skin smoothing",type:"number",min:0,max:1,step:.01},{key:"skinRealism",label:"Skin realism",type:"number",min:0,max:1,step:.01},{key:"blemishReduction",label:"Blemish reduction",type:"number",min:0,max:1,step:.01},{key:"previewMask",label:"Preview mask",type:"boolean"}],A={skinSmoothing:.55,skinRealism:.62,blemishReduction:.35,previewMask:!1},L={blurRadius:8,blemishRadius:3,protectLandmarks:!0,foreheadCoverage:!0},G=(e,t)=>{const o=Number(e);return Number.isFinite(o)?Math.min(1,Math.max(0,o)):t},ee=(e={})=>({skinSmoothing:G(e.skinSmoothing,A.skinSmoothing),skinRealism:G(e.skinRealism,A.skinRealism),blemishReduction:G(e.blemishReduction,A.blemishReduction),previewMask:typeof e.previewMask=="boolean"?e.previewMask:A.previewMask}),gt=(e,t)=>ee({...e,...t}),Et=({faceIndex:e,numFaces:t,skinSmoothing:o,skinRealism:r,blemishReduction:n,previewMask:a,clipMinX:s=0,clipMaxX:l=1,renderOrder:u})=>{const c=Y.resolveFaceIndex(e),g=Y.resolveNumFaces(c,t),h=ee({skinSmoothing:o,skinRealism:r,blemishReduction:n,previewMask:a}),S=_.useMemo(()=>({numFaces:g}),[g]),{node:b}=Le.useXRModel(Ce.XRModel.FACE_TRACKER,S),m=_.useMemo(()=>({foreheadCoverage:L.foreheadCoverage}),[]),y=ht(b,void 0,m,c);return M.jsx(pt,{retouchMask:y.texture,retouchAmount:h.skinSmoothing,blurRadius:L.blurRadius,detailPreservation:h.skinRealism,blemishReduction:h.blemishReduction,blemishRadius:L.blemishRadius,previewMask:h.previewMask,protectLandmarks:L.protectLandmarks,clipMinX:s,clipMaxX:l,renderOrder:u})};exports.DEFAULT_FACE_MIRROR_SETTINGS=Fe;exports.DEFAULT_FACE_SWAP_SETTINGS=F;exports.DEFAULT_IRIS_EFFECT_SETTINGS=ce;exports.DEFAULT_LIP_EFFECT_SETTINGS=fe;exports.FACE_MIRROR_SETTINGS_FIELDS=it;exports.FACE_MIRROR_VARIANTS=H;exports.FACE_MIRROR_VARIANT_LABELS=Ae;exports.FACE_RETOUCH_DEFAULT_CONTROLS=A;exports.FACE_RETOUCH_SETTINGS_FIELDS=St;exports.FACE_SWAP_PAINTED_FEATURE_SOFTNESS=ye;exports.FACE_SWAP_PRESETS=N;exports.FACE_SWAP_PRESET_KEYS=Z;exports.FACE_SWAP_SETTINGS_FIELDS=rt;exports.FACE_SWAP_SETTINGS_RANGES=R;exports.FACE_SWAP_SOURCE_KINDS=et;exports.FaceRetouch=Et;exports.IRIS_EFFECT_EYES=ie;exports.IRIS_EFFECT_MODES=le;exports.IRIS_EFFECT_SETTINGS_FIELDS=Ke;exports.LIP_EFFECT_COLOR_MODES=ge;exports.LIP_EFFECT_GRADIENT_DIRECTIONS=Ee;exports.LIP_EFFECT_PRESETS=q;exports.LIP_EFFECT_PRESET_KEYS=V;exports.LIP_EFFECT_SETTINGS_FIELDS=Je;exports.MAKEUP_AUTO_SHADE_REGIONS=ue;exports.MAKEUP_FINISHES=O;exports.MAKEUP_FINISH_DEFAULTS=D;exports.MAKEUP_FINISH_KEYS=me;exports.MAKEUP_REGIONS=je;exports.MAKEUP_SHADES=T;exports.MAKEUP_SHADE_NAMES=pe;exports.MAKEUP_SIDES=ze;exports.MAKEUP_SPARKLE_SIZE_RANGE=P;exports.alphaMapOptions=He;exports.blendModeOptions=Xe;exports.createLipTextureTransform=Qe;exports.defaultFaceSwapPreset=ve;exports.faceMirrorTransferSettings=lt;exports.isFaceMirrorVariant=st;exports.isFaceSwapPresetKey=J;exports.isLipEffectPresetKey=$;exports.isMakeupShadeName=z;exports.makeupNameLabel=W;exports.makeupShadeOptions=Se;exports.maskTextureSourceOptions=Be;exports.materialTypeOptions=Oe;exports.patchFaceMirrorSettings=nt;exports.patchFaceRetouchControls=gt;exports.patchFaceSwapSettings=at;exports.patchIrisEffectSettings=Ye;exports.patchLipEffectSettings=Ze;exports.resolveFaceMirrorSettings=Re;exports.resolveFaceRetouchControls=ee;exports.resolveFaceSwapSettings=j;exports.resolveIrisEffectSettings=Ge;exports.resolveLipEffectSettings=be;exports.resolveMakeupShade=de;exports.resolveMakeupShadePair=he;exports.shaderPresetOptions=De;exports.sideOptions=Ue;exports.supportsAutoMakeupShade=U;exports.textureMapOptions=Ne;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";const a=require("react"),e=require("three"),s=require("./canonicalFace-C83I225R.cjs"),F=()=>({offsets:new Float32Array(s.CANONICAL_FACE_LANDMARK_COUNT*3),active:!1}),r=a.createContext(null),o=()=>a.useContext(r),u=-.5,t=-2,A=n=>{n.traverse(c=>{c.isGroup||(c.renderOrder=t)})},R={blending:e.CustomBlending,blendSrc:e.SrcAlphaFactor,blendDst:e.OneMinusSrcAlphaFactor,blendSrcAlpha:e.OneFactor,blendDstAlpha:e.OneMinusSrcAlphaFactor};exports.FACE_SURFACE_FRAME_PRIORITY=u;exports.FACE_SURFACE_RENDER_ORDER=t;exports.FaceSurfaceContext=r;exports.createFaceSurfaceState=F;exports.faceSurfaceBlending=R;exports.markFaceSurface=A;exports.useFaceSurface=o;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { useContext as t, createContext as c } from "react";
|
|
2
|
+
import { OneMinusSrcAlphaFactor as a, OneFactor as n, SrcAlphaFactor as s, CustomBlending as o } from "three";
|
|
3
|
+
import { C as l } from "./canonicalFace-BHwyCx1c.js";
|
|
4
|
+
const S = () => ({
|
|
5
|
+
offsets: new Float32Array(l * 3),
|
|
6
|
+
active: !1
|
|
7
|
+
}), A = c(null), i = () => t(A), R = -0.5, F = -2, d = (r) => {
|
|
8
|
+
r.traverse((e) => {
|
|
9
|
+
e.isGroup || (e.renderOrder = F);
|
|
10
|
+
});
|
|
11
|
+
}, m = {
|
|
12
|
+
blending: o,
|
|
13
|
+
blendSrc: s,
|
|
14
|
+
blendDst: a,
|
|
15
|
+
// Alpha as three's normal blending: the canvas stays opaque under a soft edge.
|
|
16
|
+
blendSrcAlpha: n,
|
|
17
|
+
blendDstAlpha: a
|
|
18
|
+
};
|
|
19
|
+
export {
|
|
20
|
+
R as F,
|
|
21
|
+
A as a,
|
|
22
|
+
F as b,
|
|
23
|
+
S as c,
|
|
24
|
+
m as f,
|
|
25
|
+
d as m,
|
|
26
|
+
i as u
|
|
27
|
+
};
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";var p0=Object.defineProperty;var A0=(t,e,r)=>e in t?p0(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r;var p=(t,e,r)=>A0(t,typeof e!="symbol"?e+"":e,r);const g0=require("three"),L=require("./index-CfSF8LXa.cjs"),F=require("./CanonicalHeadFrame-D-_T1OMU.cjs"),P=require("./index-D5GTzOzD.cjs"),D=require("./getFaceInfo-B1otSDMX.cjs"),fe=require("./useLandmarkPoseFit-Bg-h9BPb.cjs"),m0=require("./similarityFit-BFqHND2e.cjs"),z=require("./canonicalFace-C83I225R.cjs"),H=require("./renderState-apSfg4eR.cjs"),b=require("react/jsx-runtime"),R=require("react"),Ke=require("./segmentation-D9pYO6aR.cjs"),j=require("@react-three/fiber"),S0=require("./SkeletonUtils-CddIup1F.cjs"),Mt=require("./index-DE17y0ZI.cjs"),vt=require("./uv-BMFt19bg.cjs"),Xe=require("./selectors-C4X71aoD.cjs"),bt=require("./landmarks-BlUqf5MZ.cjs"),ee=require("./providers-DHsrhDI2.cjs"),C0=require("./landmarkMask-u7es2k4X.cjs");function _0(t){const e=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(t){for(const r in t)if(r!=="default"){const s=Object.getOwnPropertyDescriptor(t,r);Object.defineProperty(e,r,s.get?s:{enumerable:!0,get:()=>t[r]})}}return e.default=t,Object.freeze(e)}const a=_0(g0),xt={"body.head":0,"body.leftShoulder":11,"body.rightShoulder":12,"body.leftElbow":13,"body.rightElbow":14,"body.leftWrist":15,"body.rightWrist":16,"body.leftHip":23,"body.rightHip":24,"body.leftKnee":25,"body.rightKnee":26,"body.leftAnkle":27,"body.rightAnkle":28},It=(t,e)=>xt[L.feedSidedName(t,e)],Ut=({bodyIndex:t=0,active:e=!0,children:r})=>{const s=R.useRef(null),{ready:n,node:o}=bt.useXRModel(L.XRModel.BODY_TRACKER,void 0,e),{camera:i}=j.useThree(),c=Xe.useXRMirrored(),l=R.useRef(i);l.current!==i&&(l.current=i);const u=R.useRef(null);j.useFrame(()=>{if(!n||!o||!s.current)return;const d=o;u.current=d;const g=d.getLandmarks2D(t),O=g==null?void 0:g[0];if(!O){s.current.visible=!1;return}const C=L.trackerToWorld(O,l.current);s.current.visible=!0,s.current.position.copy(C)});const m=R.useCallback(d=>{const g=u.current;if(!g)return null;const O=g.getLandmarks2D(t);if(!O)return null;if(d==="body.neck"){const h=O[11],A=O[12];if(!h||!A)return null;const f={x:(h.x+A.x)/2,y:(h.y+A.y)/2,z:(h.z+A.z)/2};return{position:L.trackerToWorld(f,l.current)}}const C=It(d,c);if(C===void 0)return null;const w=O[C];return w?{position:L.trackerToWorld(w,l.current)}:null},[t,c]),S=R.useMemo(()=>({type:"body",resolveLandmark:m}),[m]);return b.jsx(Mt.TrackerContext.Provider,{value:S,children:b.jsx("group",{ref:s,renderOrder:vt.RENDER_LAYERS.TRACKED,children:r})})},me={path:"/assets/sdk/face/v1/canonical_face_model.obj",integrity:"sha384-xP8YM/72TXKvbMptXB9a8JUlUf3MZQ8uLurExrsZc05v6/P5RrsaNGMUYS/BZx8A",vertexCount:468,triangleCount:898},Me=Float32Array.from([.499977,.347466,.500026,.452513,.499974,.397628,.482113,.528021,.500151,.472844,.49991,.501747,.499523,.598938,.289712,.619236,.499955,.687602,.499987,.730081,.500023,.89295,.500023,.333766,.500016,.320776,.500023,.307652,.499977,.304722,.499977,.294066,.499977,.280615,.499977,.262981,.499968,.218629,.499816,.437019,.473773,.42609,.104907,.745859,.36593,.590424,.338758,.586975,.31112,.59054,.274658,.610869,.393362,.596294,.345234,.655989,.370094,.653924,.319322,.652735,.297903,.646409,.247792,.58919,.396889,.157245,.280098,.6244,.10631,.600044,.209925,.608647,.355808,.465594,.471751,.349596,.474155,.319808,.439785,.342771,.414617,.333459,.450374,.319139,.428771,.317309,.374971,.272195,.486717,.452371,.485301,.472605,.257765,.68551,.401223,.544828,.429819,.451385,.421352,.466259,.276896,.467943,.48337,.500413,.337212,.717117,.296392,.706757,.169295,.806186,.44758,.69739,.39239,.646112,.35449,.303216,.067305,.269895,.442739,.427174,.457098,.415208,.381974,.305289,.392389,.305797,.277076,.728068,.422552,.436767,.385919,.718636,.383103,.74416,.331431,.880286,.229924,.767997,.364501,.810886,.229622,.700459,.173287,.721252,.472879,.333802,.446828,.331473,.422762,.32611,.445308,.419934,.388103,.306039,.403039,.29346,.403629,.306047,.460042,.442861,.431158,.307634,.452182,.307634,.475387,.307634,.465828,.22081,.472329,.263774,.473087,.282143,.473122,.295374,.473033,.304722,.427942,.304722,.426479,.29646,.423162,.288154,.418309,.279937,.390095,.360427,.013954,.439966,.499914,.419853,.4132,.3046,.409626,.298177,.46808,.398465,.422729,.414015,.46308,.406216,.37212,.526586,.334562,.503927,.411671,.453035,.242176,.852324,.290777,.798554,.327338,.743473,.39951,.251079,.441728,.738324,.429765,.812166,.412198,.891099,.288955,.601048,.218937,.564589,.412782,.60103,.257135,.64456,.427685,.562039,.44834,.463064,.17856,.542446,.247308,.542806,.286267,.532325,.332828,.539288,.368756,.552793,.398964,.567345,.47641,.594194,.189241,.476076,.228962,.651049,.490726,.437599,.40467,.514867,.019469,.598436,.426243,.579569,.396993,.451203,.26647,.623023,.439121,.481042,.032314,.355643,.419054,.612845,.462783,.494253,.238979,.220255,.198221,.168062,.10755,.459245,.18361,.259743,.13441,.666317,.385764,.116846,.490967,.420622,.382385,.491427,.174399,.602329,.318785,.603765,.343364,.599403,.3961,.289783,.187885,.411462,.430987,.055935,.318993,.101715,.266248,.130299,.500023,.809424,.499977,.045547,.36617,.601178,.393207,.604463,.410373,.60892,.194993,.657898,.388665,.637716,.365962,.644029,.343364,.644643,.318785,.64166,.301415,.636844,.058133,.680924,.301415,.612551,.499988,.381566,.415838,.375804,.445682,.433923,.465844,.379359,.499923,.648476,.288719,.180054,.335279,.14718,.440512,.097581,.128294,.208059,.408772,.626106,.455607,.548199,.499877,.09101,.375437,.075808,.11421,.384978,.448662,.304722,.44802,.295368,.447112,.284192,.444832,.269206,.430012,.233191,.406787,.314327,.400738,.318931,.3924,.322297,.367856,.336081,.247923,.398667,.45277,.57915,.436392,.640113,.416164,.631286,.413386,.307634,.228018,.316428,.468268,.647329,.411362,.195673,.499989,.530175,.479154,.557346,.499974,.560363,.432112,.506411,.499886,.133083,.499913,.178271,.456549,.180799,.344549,.254561,.378909,.42599,.374293,.219815,.319688,.429262,.357155,.39573,.295284,.378419,.44775,.137523,.410986,.491277,.313951,.224692,.354128,.187447,.324548,.296007,.189096,.3537,.279777,.285342,.133823,.317299,.336768,.355267,.429884,.533478,.455528,.451377,.437114,.441104,.467288,.470075,.414712,.66478,.377046,.677222,.344108,.679849,.312876,.677668,.283526,.66681,.241246,.617214,.102986,.531237,.267612,.57544,.297879,.566824,.333434,.566122,.366427,.573884,.396012,.583304,.420121,.589772,.007561,.519223,.432949,.430482,.458639,.520911,.473466,.454256,.476088,.43617,.468472,.444943,.433991,.417638,.483518,.437016,.482483,.422151,.42645,.610201,.438999,.603505,.450067,.599566,.289712,.631747,.27667,.636627,.517862,.528052,.710288,.619236,.526227,.42609,.895093,.745859,.63407,.590424,.661242,.586975,.68888,.59054,.725342,.610869,.60663,.596295,.654766,.655989,.629906,.653924,.680678,.652735,.702097,.646409,.752212,.589195,.602918,.157137,.719902,.6244,.893693,.60004,.790082,.608646,.643998,.465512,.528249,.349596,.52585,.319809,.560215,.342771,.585384,.333459,.549626,.319139,.571228,.317308,.624852,.271901,.51305,.452718,.515097,.472748,.742247,.685493,.598631,.545021,.570338,.451425,.578632,.466377,.723087,.467946,.516446,.500361,.662801,.717082,.703624,.706729,.830705,.806186,.552386,.697432,.60761,.646112,.645429,.303293,.932695,.269895,.557261,.427174,.542902,.415208,.618026,.305289,.607591,.305797,.722943,.728037,.577414,.436833,.614083,.718613,.616907,.744114,.668509,.880086,.770092,.767979,.635536,.810751,.770391,.700444,.826722,.721245,.527121,.333802,.553172,.331473,.577238,.32611,.554692,.419934,.611897,.306039,.596961,.29346,.596371,.306047,.539958,.442861,.568842,.307634,.547818,.307634,.524613,.307634,.53409,.220859,.527671,.263774,.526913,.282143,.526878,.295374,.526967,.304722,.572058,.304722,.573521,.29646,.576838,.288154,.581691,.279937,.609945,.36009,.986046,.439966,.5868,.3046,.590372,.298177,.531915,.398463,.577268,.414065,.536915,.406214,.627543,.526648,.665586,.504049,.588354,.453138,.757824,.852324,.70925,.798492,.672684,.743419,.600409,.250995,.558266,.738328,.570304,.812129,.588166,.890956,.711045,.601048,.78107,.564595,.587247,.601068,.74287,.644554,.572156,.562348,.551868,.46343,.821442,.542444,.752702,.542818,.713757,.532373,.667113,.539327,.631101,.552846,.600862,.567527,.523481,.594373,.810748,.476074,.771046,.651041,.509127,.437282,.595293,.514976,.980531,.598436,.5735,.58,.602995,.451312,.73353,.623023,.560611,.480983,.967686,.355643,.580985,.61284,.537728,.494615,.760966,.220247,.801779,.168062,.892441,.459239,.816351,.25974,.865595,.666313,.614074,.116754,.508953,.420562,.617942,.491684,.825608,.602325,.681215,.603765,.656636,.599403,.6039,.289783,.812086,.411461,.568013,.055435,.681008,.101715,.733752,.130299,.63383,.601178,.606793,.604463,.58966,.608938,.805016,.657892,.611335,.637716,.634038,.644029,.656636,.644643,.681215,.64166,.698585,.636844,.941867,.680924,.698585,.612551,.584177,.375893,.554318,.433923,.534154,.37936,.711218,.180025,.66463,.147129,.5591,.097368,.871706,.208059,.591234,.626106,.544341,.548416,.624563,.075808,.88577,.384971,.551338,.304722,.55198,.295368,.552888,.284192,.555168,.269206,.569944,.232965,.593203,.314324,.599262,.318931,.6076,.322297,.631938,.3365,.752033,.398685,.547226,.579605,.563544,.640172,.583841,.631286,.586614,.307634,.771915,.316422,.531597,.647517,.588371,.195559,.520797,.557435,.567985,.506521,.543283,.180745,.655317,.254485,.621009,.425982,.62556,.219688,.680198,.429281,.642764,.395662,.704663,.37847,.552012,.137408,.589072,.491363,.685945,.224643,.645735,.18736,.675343,.296022,.810858,.353695,.720122,.285333,.866152,.317295,.663187,.355403,.570082,.533674,.544562,.451624,.562759,.441215,.531987,.46986,.585271,.664823,.622953,.677221,.655896,.679837,.687132,.677654,.716482,.666799,.758757,.617213,.897013,.531231,.732392,.575453,.702114,.566837,.666525,.566134,.633505,.573912,.603876,.583413,.579658,.590055,.99244,.519223,.567192,.43058,.541366,.521101,.526564,.453882,.523913,.43617,.531529,.444943,.566036,.417671,.516311,.436946,.517472,.422123,.573595,.610193,.560698,.604668,.549756,.600249,.710288,.631747,.72333,.636627]),x=Uint16Array.from([173,155,133,246,33,7,382,398,362,263,466,249,308,415,324,78,95,191,356,389,264,127,34,162,368,264,389,139,162,34,267,0,302,37,72,0,11,302,0,11,0,72,349,451,350,120,121,231,452,350,451,232,231,121,267,302,269,37,39,72,303,269,302,73,72,39,357,343,350,128,121,114,277,350,343,47,114,121,350,452,357,121,128,232,453,357,452,233,232,128,299,333,297,69,67,104,332,297,333,103,104,67,175,152,396,175,171,152,377,396,152,148,152,171,381,384,382,154,155,157,398,382,384,173,157,155,280,347,330,50,101,118,348,330,347,119,118,101,269,303,270,39,40,73,304,270,303,74,73,40,9,336,151,9,151,107,337,151,336,108,107,151,344,278,360,115,131,48,279,360,278,49,48,131,262,431,418,32,194,211,424,418,431,204,211,194,304,408,270,74,40,184,409,270,408,185,184,40,272,310,407,42,183,80,415,407,310,191,80,183,322,270,410,92,186,40,409,410,270,185,40,186,347,449,348,118,119,229,450,348,449,230,229,119,434,432,430,214,210,212,422,430,432,202,212,210,313,314,18,83,18,84,17,18,314,17,84,18,307,375,306,77,76,146,291,306,375,61,146,76,259,387,260,29,30,160,388,260,387,161,160,30,286,414,384,56,157,190,398,384,414,173,190,157,418,424,406,194,182,204,335,406,424,106,204,182,367,416,364,138,135,192,434,364,416,214,192,135,391,423,327,165,98,203,358,327,423,129,203,98,298,301,284,68,54,71,251,284,301,21,71,54,4,275,5,4,5,45,281,5,275,51,45,5,254,373,253,24,23,144,374,253,373,145,144,23,320,321,307,90,77,91,375,307,321,146,91,77,280,425,411,50,187,205,427,411,425,207,205,187,421,313,200,201,200,83,18,200,313,18,83,200,335,321,406,106,182,91,405,406,321,181,91,182,405,321,404,181,180,91,320,404,321,90,91,180,17,314,16,17,16,84,315,16,314,85,84,16,425,266,426,205,206,36,423,426,266,203,36,206,369,396,400,140,176,171,377,400,396,148,171,176,391,269,322,165,92,39,270,322,269,40,39,92,417,465,413,193,189,245,464,413,465,244,245,189,257,258,386,27,159,28,385,386,258,158,28,159,260,388,467,30,247,161,466,467,388,246,161,247,248,456,419,3,196,236,399,419,456,174,236,196,333,298,332,104,103,68,284,332,298,54,68,103,285,8,417,55,193,8,168,417,8,168,8,193,340,261,346,111,117,31,448,346,261,228,31,117,285,417,441,55,221,193,413,441,417,189,193,221,327,460,326,98,97,240,328,326,460,99,240,97,277,355,329,47,100,126,371,329,355,142,126,100,309,392,438,79,218,166,439,438,392,219,166,218,381,382,256,154,26,155,341,256,382,112,155,26,360,279,420,131,198,49,429,420,279,209,49,198,365,364,379,136,150,135,394,379,364,169,135,150,355,277,437,126,217,47,343,437,277,114,47,217,443,444,282,223,52,224,283,282,444,53,224,52,281,275,363,51,134,45,440,363,275,220,45,134,431,262,395,211,170,32,369,395,262,140,32,170,337,299,338,108,109,69,297,338,299,67,69,109,335,273,321,106,91,43,375,321,273,146,43,91,348,450,349,119,120,230,451,349,450,231,230,120,467,359,342,247,113,130,446,342,359,226,130,113,282,283,334,52,105,53,293,334,283,63,53,105,250,458,462,20,242,238,461,462,458,241,238,242,276,353,300,46,70,124,383,300,353,156,124,70,325,292,324,96,95,62,308,324,292,78,62,95,283,276,293,53,63,46,300,293,276,70,46,63,447,264,345,227,116,34,372,345,264,143,34,116,352,345,346,123,117,116,340,346,345,111,116,117,1,19,274,1,44,19,354,274,19,125,19,44,248,281,456,3,236,51,363,456,281,134,51,236,425,426,427,205,207,206,436,427,426,216,206,207,380,381,252,153,22,154,256,252,381,26,154,22,391,393,269,165,39,167,267,269,393,37,167,39,199,428,200,199,200,208,421,200,428,201,208,200,330,329,266,101,36,100,371,266,329,142,100,36,422,432,273,202,43,212,287,273,432,57,212,43,290,250,328,60,99,20,462,328,250,242,20,99,258,286,385,28,158,56,384,385,286,157,56,158,342,446,353,113,124,226,265,353,446,35,226,124,257,386,259,27,29,159,387,259,386,160,159,29,430,422,431,210,211,202,424,431,422,204,202,211,445,342,276,225,46,113,353,276,342,124,113,46,424,422,335,204,106,202,273,335,422,43,202,106,306,292,307,76,77,62,325,307,292,96,62,77,366,447,352,137,123,227,345,352,447,116,227,123,302,268,303,72,73,38,271,303,268,41,38,73,371,358,266,142,36,129,423,266,358,203,129,36,327,294,460,98,240,64,455,460,294,235,64,240,294,331,278,64,48,102,279,278,331,49,102,48,303,271,304,73,74,41,272,304,271,42,41,74,427,436,434,207,214,216,432,434,436,212,216,214,304,272,408,74,184,42,407,408,272,183,42,184,394,430,395,169,170,210,431,395,430,211,210,170,395,369,378,170,149,140,400,378,369,176,140,149,296,334,299,66,69,105,333,299,334,104,105,69,417,168,351,193,122,168,6,351,168,6,168,122,280,411,352,50,123,187,376,352,411,147,187,123,319,320,325,89,96,90,307,325,320,77,90,96,285,295,336,55,107,65,296,336,295,66,65,107,404,320,403,180,179,90,319,403,320,89,90,179,330,348,329,101,100,119,349,329,348,120,119,100,334,293,333,105,104,63,298,333,293,68,63,104,323,454,366,93,137,234,447,366,454,227,234,137,16,315,15,16,15,85,316,15,315,86,85,15,429,279,358,209,129,49,331,358,279,102,49,129,15,316,14,15,14,86,317,14,316,87,86,14,8,285,9,8,9,55,336,9,285,107,55,9,329,349,277,100,47,120,350,277,349,121,120,47,252,253,380,22,153,23,374,380,253,145,23,153,402,403,318,178,88,179,319,318,403,89,179,88,351,6,419,122,196,6,197,419,6,197,6,196,324,318,325,95,96,88,319,325,318,89,88,96,397,367,365,172,136,138,364,365,367,135,138,136,288,435,397,58,172,215,367,397,435,138,215,172,438,439,344,218,115,219,278,344,439,48,219,115,271,311,272,41,42,81,310,272,311,80,81,42,5,281,195,5,195,51,248,195,281,3,51,195,273,287,375,43,146,57,291,375,287,61,57,146,396,428,175,171,175,208,199,175,428,199,208,175,268,312,271,38,41,82,311,271,312,81,82,41,444,445,283,224,53,225,276,283,445,46,225,53,254,339,373,24,144,110,390,373,339,163,110,144,295,282,296,65,66,52,334,296,282,105,52,66,346,448,347,117,118,228,449,347,448,229,228,118,454,356,447,234,227,127,264,447,356,34,127,227,336,296,337,107,108,66,299,337,296,69,66,108,151,337,10,151,10,108,338,10,337,109,108,10,278,439,294,48,64,219,455,294,439,235,219,64,407,415,292,183,62,191,308,292,415,78,191,62,358,371,429,129,209,142,355,429,371,126,142,209,345,372,340,116,111,143,265,340,372,35,143,111,388,390,466,161,246,163,249,466,390,7,163,246,352,346,280,123,50,117,347,280,346,118,117,50,295,442,282,65,52,222,443,282,442,223,222,52,19,94,354,19,125,94,370,354,94,141,94,125,295,285,442,65,222,55,441,442,285,221,55,222,419,197,248,196,3,197,195,248,197,195,197,3,359,263,255,130,25,33,249,255,263,7,33,25,275,274,440,45,220,44,457,440,274,237,44,220,300,383,301,70,71,156,368,301,383,139,156,71,417,351,465,193,245,122,412,465,351,188,122,245,466,263,467,246,247,33,359,467,263,130,33,247,389,251,368,162,139,21,301,368,251,71,21,139,374,386,380,145,153,159,385,380,386,158,159,153,379,394,378,150,149,169,395,378,394,170,169,149,351,419,412,122,188,196,399,412,419,174,196,188,426,322,436,206,216,92,410,436,322,186,92,216,387,373,388,160,161,144,390,388,373,163,144,161,393,326,164,167,164,97,2,164,326,2,97,164,354,370,461,125,241,141,462,461,370,242,141,241,0,267,164,0,164,37,393,164,267,167,37,164,11,12,302,11,72,12,268,302,12,38,12,72,386,374,387,159,160,145,373,387,374,144,145,160,12,13,268,12,38,13,312,268,13,82,13,38,293,300,298,63,68,70,301,298,300,71,70,68,340,265,261,111,31,35,446,261,265,226,35,31,380,385,381,153,154,158,384,381,385,157,158,154,280,330,425,50,205,101,266,425,330,36,101,205,423,391,426,203,206,165,322,426,391,92,165,206,429,355,420,209,198,126,437,420,355,217,126,198,391,327,393,165,167,98,326,393,327,97,98,167,457,438,440,237,220,218,344,440,438,115,218,220,382,362,341,155,112,133,463,341,362,243,133,112,457,461,459,237,239,241,458,459,461,238,241,239,434,430,364,214,135,210,394,364,430,169,210,135,414,463,398,190,173,243,362,398,463,133,243,173,262,428,369,32,140,208,396,369,428,171,208,140,457,274,461,237,241,44,354,461,274,125,44,241,316,403,317,86,87,179,402,317,403,178,179,87,315,404,316,85,86,180,403,316,404,179,180,86,314,405,315,84,85,181,404,315,405,180,181,85,313,406,314,83,84,182,405,314,406,181,182,84,418,406,421,194,201,182,313,421,406,83,182,201,366,401,323,137,93,177,361,323,401,132,177,93,408,407,306,184,76,183,292,306,407,62,183,76,408,306,409,184,185,76,291,409,306,61,76,185,410,409,287,186,57,185,291,287,409,61,185,57,436,410,432,216,212,186,287,432,410,57,186,212,434,416,427,214,207,192,411,427,416,187,192,207,264,368,372,34,143,139,383,372,368,156,139,143,457,459,438,237,218,239,309,438,459,79,239,218,352,376,366,123,137,147,401,366,376,177,147,137,4,1,275,4,45,1,274,275,1,44,1,45,428,262,421,208,201,32,418,421,262,194,32,201,327,358,294,98,64,129,331,294,358,102,129,64,367,435,416,138,192,215,433,416,435,213,215,192,455,439,289,235,59,219,392,289,439,166,219,59,328,462,326,99,97,242,370,326,462,141,242,97,326,370,2,97,2,141,94,2,370,94,141,2,460,455,305,240,75,235,289,305,455,59,235,75,448,339,449,228,229,110,254,449,339,24,110,229,261,446,255,31,25,226,359,255,446,130,226,25,449,254,450,229,230,24,253,450,254,23,24,230,450,253,451,230,231,23,252,451,253,22,23,231,451,252,452,231,232,22,256,452,252,26,22,232,256,341,452,26,232,112,453,452,341,233,112,232,413,464,414,189,190,244,463,414,464,243,244,190,441,413,286,221,56,189,414,286,413,190,189,56,441,286,442,221,222,56,258,442,286,28,56,222,442,258,443,222,223,28,257,443,258,27,28,223,444,443,259,224,29,223,257,259,443,27,223,29,259,260,444,29,224,30,445,444,260,225,30,224,260,467,445,30,225,247,342,445,467,113,247,225,250,309,458,20,238,79,459,458,309,239,79,238,290,305,392,60,166,75,289,392,305,59,75,166,460,305,328,240,99,75,290,328,305,60,75,99,376,433,401,147,177,213,435,401,433,215,213,177,250,290,309,20,79,60,392,309,290,166,60,79,411,416,376,187,147,192,433,376,416,213,192,147,341,463,453,112,233,243,464,453,463,244,243,233,453,464,357,233,128,244,465,357,464,245,244,128,412,343,465,188,245,114,357,465,343,128,114,245,437,343,399,217,174,114,412,399,343,188,114,174,363,440,360,134,131,220,344,360,440,115,220,131,456,420,399,236,174,198,437,399,420,217,198,174,456,363,420,236,198,134,360,420,363,131,134,198,361,401,288,132,58,177,435,288,401,215,177,58,353,265,383,124,156,35,372,383,265,143,35,156,255,249,339,25,110,7,390,339,249,163,7,110,261,255,448,31,228,25,339,448,255,110,25,228,14,317,13,14,13,87,312,13,317,82,87,13,317,402,312,87,82,178,311,312,402,81,178,82,402,318,311,178,81,88,310,311,318,80,88,81,318,324,310,88,80,95,415,310,324,191,95,80]),E0=Uint16Array.from([0,1,2,248,4,5,6,249,8,9,10,11,12,13,14,15,16,17,18,19,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,94,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,151,152,380,381,382,383,384,385,386,387,388,389,390,164,391,392,393,168,394,395,396,397,398,399,175,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,195,419,197,420,199,200,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,3,7,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,153,154,155,156,157,158,159,160,161,162,163,165,166,167,169,170,171,172,173,174,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,196,198,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247]),ve={negX:Uint16Array.from([0,1,39,41,527,529,575,577,591,593,611,613,627,629]),posX:Uint16Array.from([2,3,38,40,526,528,574,576,590,592,610,612,626,628])},kt=Uint16Array.from([4,5,882,883,884,885,886,887,888,889,890,891,892,893,894,895,896,897]),R0=Uint16Array.from([814,815,816,817,818,819,830,831,832,833]),Dt=[10,109,67,103,54,21,162,127,234,93,132,58,172,136,150,149,176,148,152,377,400,378,379,365,397,288,361,323,454,356,389,251,284,332,297,338],Ve={negX:[33,7,163,144,145,153,154,155,133,173,157,158,159,160,161,246],posX:[263,249,390,373,374,380,381,382,362,398,384,385,386,387,388,466]},pe={outer:[61,146,91,181,84,17,314,405,321,375,291,409,270,269,267,0,37,39,40,185],inner:[78,95,88,178,87,14,317,402,318,324,308,415,310,311,312,13,82,81,80,191]},Ye=()=>{const t=new Set([...ve.negX,...ve.posX,...kt]),e=[];for(let r=0;r<me.triangleCount;r+=1)t.has(r)||e.push(r);return e};let st=null;const Pt=()=>(st??(st=P.collectRingBandTriangles(x,pe.outer,pe.inner)),st);let _e=null;const $e=()=>{if(_e)return _e;const{vertexCount:t}=me;return _e={restPosition:F.CANONICAL_FACE_POSITIONS.slice(0,t*3),restNormal:P.computeVertexNormals(F.CANONICAL_FACE_POSITIONS,x,t),edge:P.computeEdgeDistance(F.CANONICAL_FACE_POSITIONS,x,t,Dt),lipEdge:P.computeRingDistance(P.triangleIdsToVertices(Pt(),x),t,pe.outer,pe.inner),eyeRing:P.computeHopDistance(P.triangleIdsToVertices(Ye(),x),t,[...Ve.negX,...Ve.posX])},_e},Qe=468,O0=Object.freeze({minCutoffHz:.5,beta:200,derivativeCutoffHz:2,speedFloor:.03,velocityBlend:.5,maxGapMs:500,snapJump:.1}),N0=(t,e)=>{const r=Array.from({length:e},()=>new Set);for(let o=0;o+2<t.length;o+=3){const i=t[o],c=t[o+1],l=t[o+2];i>=e||c>=e||l>=e||(r[i].add(c).add(l),r[c].add(i).add(l),r[l].add(i).add(c))}const s=new Uint32Array(e+1);r.forEach((o,i)=>{s[i+1]=s[i]+o.size});const n=new Uint16Array(s[e]);return r.forEach((o,i)=>n.set([...o].sort((c,l)=>c-l),s[i])),{offsets:s,indices:n}},nt=(t,e)=>1/(1+1/(2*Math.PI*t*e));class T0{constructor(e=Qe,{neighbours:r=null,...s}={}){p(this,"count");p(this,"points");p(this,"filtered");p(this,"derivative");p(this,"velocity");p(this,"lagMs");p(this,"tuning");p(this,"neighbours");p(this,"initialized",!1);p(this,"sampleMs",0);p(this,"centreX",0);p(this,"centreY",0);this.count=e,this.tuning={...O0,...s},this.neighbours=r,this.points=new Float32Array(e*3),this.filtered=new Float32Array(e*3),this.derivative=new Float32Array(e*3),this.velocity=new Float32Array(e*3),this.lagMs=new Float32Array(e)}get ready(){return this.initialized}get lastSampleMs(){return this.sampleMs}reset(){this.initialized=!1}observe(e,r,s=1){const n=this.count;if(e.length<n)return"skip";const o=s>0?1/s:1;let i=0,c=0;for(let N=0;N<n;N+=1)i+=e[N].x,c+=e[N].y;const l=i/n,u=c/n*o,m=r-this.sampleMs,{maxGapMs:S,snapJump:d}=this.tuning;if(!this.initialized||m>S||Math.hypot(l-this.centreX,u-this.centreY)>d)return this.snap(e,r,l,u);if(!(m>0))return"skip";const g=m/1e3,{minCutoffHz:O,beta:C,derivativeCutoffHz:w,velocityBlend:h,speedFloor:A}=this.tuning,f=nt(w,g),_=this.filtered,y=this.derivative,M=this.velocity;for(let N=0;N<n;N+=1){const E=N*3,U=e[N];y[E]+=f*((U.x-_[E])/g-y[E]),y[E+1]+=f*((U.y-_[E+1])/g-y[E+1]),y[E+2]+=f*(((U.z??0)-_[E+2])/g-y[E+2])}const T=this.neighbours;for(let N=0;N<n;N+=1){const E=N*3;let U=y[E],re=y[E+1],B=y[E+2];if(T){const Ce=T.offsets[N],ue=T.offsets[N+1];for(let V=Ce;V<ue;V+=1){const v=T.indices[V]*3;U+=y[v],re+=y[v+1],B+=y[v+2]}const $=1/(1+ue-Ce);U*=$,re*=$,B*=$}const K=Math.max(0,Math.hypot(U,re*o,B)-A),q=nt(O+C*K,g),X=e[N],le=_[E]+q*(X.x-_[E]),Y=_[E+1]+q*(X.y-_[E+1]),Se=_[E+2]+q*((X.z??0)-_[E+2]);M[E]+=h*((le-_[E])/g-M[E]),M[E+1]+=h*((Y-_[E+1])/g-M[E+1]),M[E+2]+=h*((Se-_[E+2])/g-M[E+2]),_[E]=le,_[E+1]=Y,_[E+2]=Se,this.lagMs[N]=m*(1-q)/q}return this.sampleMs=r,this.centreX=l,this.centreY=u,"smooth"}apply(e,r){if(!this.initialized)return this.points;const s=this.points,n=this.filtered,o=this.velocity,i=Math.max(0,r),c=Math.max(0,e-this.sampleMs);for(let l=0;l<this.count;l+=1){const u=l*3,m=Math.min(i,this.lagMs[l]+c)/1e3;s[u]=n[u]+o[u]*m,s[u+1]=n[u+1]+o[u+1]*m,s[u+2]=n[u+2]+o[u+2]*m}return s}snap(e,r,s,n){const o=this.filtered;for(let i=0;i<this.count;i+=1){const c=e[i];o[i*3]=c.x,o[i*3+1]=c.y,o[i*3+2]=c.z??0}return this.points.set(o),this.derivative.fill(0),this.velocity.fill(0),this.lagMs.fill(0),this.initialized=!0,this.sampleMs=r,this.centreX=s,this.centreY=n,"snap"}}let ot=null;const L0=()=>(ot??(ot=N0(P.triangleIdsToVertices(Ye(),x),Qe)),ot),w0=(t={})=>new T0(Qe,{...t,neighbours:L0()}),Bt=["_neutral","browDownLeft","browDownRight","browInnerUp","browOuterUpLeft","browOuterUpRight","cheekPuff","cheekSquintLeft","cheekSquintRight","eyeBlinkLeft","eyeBlinkRight","eyeLookDownLeft","eyeLookDownRight","eyeLookInLeft","eyeLookInRight","eyeLookOutLeft","eyeLookOutRight","eyeLookUpLeft","eyeLookUpRight","eyeSquintLeft","eyeSquintRight","eyeWideLeft","eyeWideRight","jawForward","jawLeft","jawOpen","jawRight","mouthClose","mouthDimpleLeft","mouthDimpleRight","mouthFrownLeft","mouthFrownRight","mouthFunnel","mouthLeft","mouthLowerDownLeft","mouthLowerDownRight","mouthPressLeft","mouthPressRight","mouthPucker","mouthRight","mouthRollLower","mouthRollUpper","mouthShrugLower","mouthShrugUpper","mouthSmileLeft","mouthSmileRight","mouthStretchLeft","mouthStretchRight","mouthUpperUpLeft","mouthUpperUpRight","noseSneerLeft","noseSneerRight"],k=Bt.filter(t=>t!=="_neutral"),at=new Map(k.map((t,e)=>[t.toLowerCase(),e])),y0=t=>{const e=t.split(/[.:|]/);let r=e.pop().trim();/^(l|r|left|right)$/i.test(r)&&e.length&&(r=`${e.pop()}_${r}`);const s=at.get(r.toLowerCase().replace(/[^a-z]/g,""));if(s!==void 0)return s;const n=/^(.*?)[\s_-]*(l|r|left|right)$/i.exec(r);if(!n)return-1;const o=n[2].toLowerCase().startsWith("l")?"left":"right";return at.get(n[1].toLowerCase().replace(/[^a-z]/g,"")+o)??-1},F0=t=>{const e=k[t];return e.startsWith("eye")?"eyes":e.startsWith("brow")?"brows":e.startsWith("tongue")?"tongue":"mouth"},M0={left:{in:k.indexOf("eyeLookInLeft"),out:k.indexOf("eyeLookOutLeft"),up:k.indexOf("eyeLookUpLeft"),down:k.indexOf("eyeLookDownLeft")},right:{in:k.indexOf("eyeLookInRight"),out:k.indexOf("eyeLookOutRight"),up:k.indexOf("eyeLookUpRight"),down:k.indexOf("eyeLookDownRight")}},v0=[33,7,163,144,145,153,154,155,133,173,157,158,159,160,161,246],b0=[263,249,390,373,374,380,381,382,362,398,384,385,386,387,388,466],x0=[70,63,105,66,107,55,65,52,53,46],I0=[300,293,334,296,336,285,295,282,283,276],it=t=>{const e=[0,0,0];for(const r of t)for(let s=0;s<3;s+=1)e[s]+=F.CANONICAL_FACE_POSITIONS[r*3+s]/t.length;return e},ct=(t,e)=>Math.hypot(F.CANONICAL_FACE_POSITIONS[t*3]-e[0],F.CANONICAL_FACE_POSITIONS[t*3+1]-e[1],F.CANONICAL_FACE_POSITIONS[t*3+2]-e[2]),lt=(t,e,r)=>{if(t<=e)return 1;if(t>=r)return 0;const s=(t-e)/(r-e);return 1-s*s*(3-2*s)},ut=t=>Float32Array.from({length:z.CANONICAL_FACE_LANDMARK_COUNT},(e,r)=>t(r)),U0={eyes:(()=>{const t=[it(v0),it(b0)];return ut(e=>Math.max(...t.map(r=>lt(ct(e,r),2,2.8))))})(),brows:(()=>{const t=[...x0,...I0].map(e=>[F.CANONICAL_FACE_POSITIONS[e*3],F.CANONICAL_FACE_POSITIONS[e*3+1],F.CANONICAL_FACE_POSITIONS[e*3+2]]);return ut(e=>Math.max(...t.map(r=>lt(ct(e,r),.9,1.6))))})()},Ae=k.length,Ht=()=>({tracking:"lost",faceIndex:0,lastSeenMs:null,pose:{tracked:!1,quaternion:new a.Quaternion,position:new a.Vector3,scale:1},local:new Float32Array(z.CANONICAL_FACE_LANDMARK_COUNT*3),view:new Float32Array(z.CANONICAL_FACE_LANDMARK_COUNT*3),residual:new Float32Array(z.CANONICAL_FACE_LANDMARK_COUNT*3),neutral:new Float32Array(z.CANONICAL_FACE_LANDMARK_COUNT*3),morphs:new Float32Array(Ae),morphNeutral:new Float32Array(Ae),face:null,neutralState:"capturing",neutralSince:null,neutralFrames:0}),Ze=t=>{t.neutralState="capturing",t.neutralSince=null,t.neutralFrames=0,t.neutral.fill(0),t.morphNeutral.fill(0)},Vt=6,qt=1.5,Ee=new Float64Array(F.CANONICAL_RIGID_INDICES.length*3),se={scale:1,quaternion:new a.Quaternion,translation:new a.Vector3,rms:0},dt=new a.Quaternion,ht=new a.Quaternion,Re=new a.Vector3,Oe=new a.Vector3,zt=(t,e,r,{smoothing:s=.5,expressionSmoothing:n=.6,holdMs:o=250,neutral:i="auto",neutralMs:c=600}={},l)=>{if(!e)return t.tracking==="lost"?null:t.lastSeenMs!==null&&r-t.lastSeenMs<=o?(t.tracking="held",null):(t.tracking="lost",t.residual.fill(0),t.morphs.fill(0),t.face=null,i==="auto"&&Ze(t),fe.stepLandmarkPoseSmoothing(t.pose,null,s),"lost");for(let h=0;h<F.CANONICAL_RIGID_INDICES.length;h+=1){const A=F.CANONICAL_RIGID_INDICES[h]*3;Ee[h*3]=e[A],Ee[h*3+1]=e[A+1],Ee[h*3+2]=e[A+2]}m0.solveSimilarity(F.CANONICAL_RIGID_POINTS,Ee,se);const u=t.tracking==="lost";let m=s;if(t.pose.tracked){const h=a.MathUtils.radToDeg(t.pose.quaternion.angleTo(se.quaternion)),A=t.pose.position.distanceTo(se.translation)/Math.max(se.scale,1e-9),f=Math.min(1,Math.max(h/Vt,A/qt));m=s+(1-a.MathUtils.clamp(s,0,1))*f}fe.stepLandmarkPoseSmoothing(t.pose,se,m),t.tracking="tracked",t.lastSeenMs=r,i==="none"?(t.neutralState="ready",t.neutral.fill(0),t.morphNeutral.fill(0)):t.neutralState==="capturing"&&(t.neutralSince??(t.neutralSince=r),t.neutralFrames+=1);const S=t.neutralState==="capturing",d=S?1/t.neutralFrames:0,{quaternion:g,translation:O,scale:C}=se;dt.copy(g).invert(),ht.copy(t.pose.quaternion).invert();const w=u?1:a.MathUtils.clamp(n,.01,1);for(let h=0;h<z.CANONICAL_FACE_LANDMARK_COUNT;h+=1){Oe.set(e[h*3],e[h*3+1],e[h*3+2]).sub(O).applyQuaternion(dt).divideScalar(C),t.local[h*3]=Oe.x,t.local[h*3+1]=Oe.y,t.local[h*3+2]=Oe.z,Re.set(e[h*3],e[h*3+1],e[h*3+2]).sub(t.pose.position).applyQuaternion(ht).divideScalar(t.pose.scale||1),t.view[h*3]=Re.x,t.view[h*3+1]=Re.y,t.view[h*3+2]=Re.z;for(let A=0;A<3;A+=1){const f=h*3+A,_=t.local[f]-F.CANONICAL_FACE_POSITIONS[f];S?(t.neutral[f]+=(_-t.neutral[f])*d,t.residual[f]=0):t.residual[f]+=(_-t.neutral[f]-t.residual[f])*w}}for(let h=0;h<Ae;h+=1){const A=l?a.MathUtils.clamp(l[h]??0,0,1):0;if(S)t.morphNeutral[h]+=(A-t.morphNeutral[h])*d,t.morphs[h]=0;else{const f=t.morphNeutral[h],_=f<.98?a.MathUtils.clamp((A-f)/(1-f),0,1):0;t.morphs[h]+=(_-t.morphs[h])*w}}return S&&r-(t.neutralSince??r)>=c&&(t.neutralState="ready"),u?"found":null},jt=(t=Ht())=>({rig:t,world:new Float64Array(z.CANONICAL_FACE_LANDMARK_COUNT*3),scores:new Float32Array(Ae),faceInfo:D.createFaceInfoTarget(),lead:null,leadSample:null}),Gt=t=>{var e;Ze(t.rig),t.rig.pose.tracked=!1,(e=t.lead)==null||e.reset(),t.leadSample=null},k0=new Map(k.map((t,e)=>[t,e])),D0={x:0,y:.5},P0={x:1,y:.5},Ue={x:0,y:0},de=new a.Vector3,ft=new a.Vector3,Wt=(t,e,r,s,n,o={})=>{var d,g,O,C;const{rig:i}=t;i.faceIndex=r;const c=e==null?void 0:e.detectionResults,l=(d=c==null?void 0:c.faceLandmarks)==null?void 0:d[r];let u=null;if(l&&l.length>=z.CANONICAL_FACE_LANDMARK_COUNT){L.feedToWorld(D0,s,de,0),L.feedToWorld(P0,s,ft,0);const w=de.distanceTo(ft),h=o.leadMs??0;let A=null;if(h>0){if(t.lead??(t.lead=w0()),i.tracking==="lost"&&(t.lead.reset(),t.leadSample=null),l!==t.leadSample){t.leadSample=l;const f=s.aspect;t.lead.observe(l,n,f>0?f:1)}A=t.lead.apply(n,h)}else(g=t.lead)!=null&&g.ready&&(t.lead.reset(),t.leadSample=null);u=t.world;for(let f=0;f<z.CANONICAL_FACE_LANDMARK_COUNT;f+=1){let _,y,M;if(A)_=A[f*3],y=A[f*3+1],M=A[f*3+2];else{const N=l[f];_=N.x,y=N.y,M=N.z??0}const T=-M*w;Ue.x=_,Ue.y=y,L.feedToWorld(Ue,s,de,T),u[f*3]=de.x,u[f*3+1]=de.y,u[f*3+2]=T}}const m=u?(C=(O=c==null?void 0:c.faceBlendshapes)==null?void 0:O[r])==null?void 0:C.categories:void 0;if(m){t.scores.fill(0);for(const{categoryName:w,score:h}of m){const A=k0.get(w);A!==void 0&&(t.scores[A]=h)}}const S=zt(i,u,n,o,m?t.scores:null);return u&&e&&c&&(i.face=D.getFaceInfoFromResults(e,c,r,t.faceInfo)),S},B0=`
|
|
2
|
+
void main() {
|
|
3
|
+
gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
|
|
4
|
+
}
|
|
5
|
+
`,H0=`
|
|
6
|
+
void main() {
|
|
7
|
+
vec4 clip = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
|
|
8
|
+
// On the far plane: depth 1, the cleared value, with no gl_FragDepth.
|
|
9
|
+
clip.z = clip.w;
|
|
10
|
+
gl_Position = clip;
|
|
11
|
+
}
|
|
12
|
+
`,Kt=`
|
|
13
|
+
void main() {
|
|
14
|
+
gl_FragColor = vec4(0.0);
|
|
15
|
+
}
|
|
16
|
+
`,V0=Object.freeze({colorWrite:!1,depthTest:!0,depthWrite:!0,depthFunc:a.LessEqualDepth,polygonOffset:!0,polygonOffsetFactor:1,polygonOffsetUnits:1,stencilWrite:!0,stencilRef:H.FACE_ATLAS_STENCIL.surface,stencilFunc:a.AlwaysStencilFunc,stencilFuncMask:255,stencilWriteMask:H.FACE_ATLAS_STENCIL.surface,stencilFail:a.KeepStencilOp,stencilZFail:a.KeepStencilOp,stencilZPass:a.ReplaceStencilOp,side:a.FrontSide,toneMapped:!1}),q0=Object.freeze({colorWrite:!1,depthTest:!0,depthWrite:!0,depthFunc:a.AlwaysDepth,polygonOffset:!1,stencilWrite:!0,stencilRef:H.FACE_ATLAS_STENCIL.surface,stencilFunc:a.EqualStencilFunc,stencilFuncMask:H.FACE_ATLAS_STENCIL.surface,stencilWriteMask:H.FACE_ATLAS_STENCIL.surface,stencilFail:a.KeepStencilOp,stencilZFail:a.KeepStencilOp,stencilZPass:a.ZeroStencilOp,side:a.FrontSide,toneMapped:!1}),z0=()=>new a.ShaderMaterial({name:"FaceAtlasPrepass",vertexShader:B0,fragmentShader:Kt,...V0}),j0=()=>new a.ShaderMaterial({name:"FaceAtlasRestore",vertexShader:H0,fragmentShader:Kt,...q0}),pt=new WeakMap,G0=t=>{var n;const e=t.getRenderTarget();if(e)return e.depthTexture?e.depthTexture.format===a.DepthStencilFormat:e.depthBuffer&&e.stencilBuffer;const r=t.getContext();let s=pt.get(r);return s===void 0&&(s=((n=r.getContextAttributes())==null?void 0:n.stencil)===!0,pt.set(r,s)),s},W0=(t,e)=>{const r=t.material;t.onBeforeRender=s=>{r.depthFunc=G0(s)?e:a.NeverDepth}},K0=["face","skin","lips","mouth","eyes","lids","brows","cheeks","nose","forehead","jaw"],X0={brows:[70,63,105,66,107,55,65,52,53,46],forehead:[10,109,67,103,54,21,162,127,34,143,111,46,53,52,65,55,9,[1,4.89],[1,8.4]],nose:[9,55,193,245,128,114,217,198,129,98,97,2,[1,-2.09],[1,4.89]],cheeks:[127,34,143,111,117,118,119,120,121,128,114,217,198,129,98,165,92,186,57,212,214,138,58,132,93,234],jaw:[58,138,214,212,57,43,106,182,83,18,[1,-6.15],[1,-9.6],152,148,176,149,150,136,172]},Y0=3,$0=t=>t.map(e=>typeof e=="number"?[F.CANONICAL_FACE_POSITIONS[e*3],F.CANONICAL_FACE_POSITIONS[e*3+1]]:e),Q0=(t,e,r)=>{let s=!1;for(let n=0,o=r.length-1;n<r.length;o=n++){const[i,c]=r[n],[l,u]=r[o];c>e!=u>e&&t<(l-i)*(e-c)/(u-c)+i&&(s=!s)}return s},Z0=t=>{let e=0,r=0;for(let s=0;s<3;s+=1){const n=x[t*3+s];e+=F.CANONICAL_FACE_POSITIONS[n*3],r+=F.CANONICAL_FACE_POSITIONS[n*3+1]}return[e/3,r/3]},At=new Map,J0=t=>{const e=new Set(R0),r=()=>Ye().filter(o=>!e.has(o)),s=(o,...i)=>{const c=new Set(i.flatMap(l=>Array.from(qe(l))));return o.filter(l=>!c.has(l))},n=o=>{const i=$0(X0[t]);return o.filter(c=>{const[l,u]=Z0(c);return Q0(-Math.abs(l),u,i)})};switch(t){case"face":return r();case"skin":return s(r(),"lips","brows");case"lips":return[...Pt()];case"mouth":return Array.from(kt);case"eyes":return[...ve.negX,...ve.posX];case"lids":{const{eyeRing:o}=$e();return r().filter(i=>[0,1,2].every(c=>o[x[i*3+c]]<=Y0))}case"brows":return n(r());case"cheeks":return s(n(r()),"lids","lips");case"nose":case"forehead":return s(n(r()),"brows","lids");case"jaw":return s(n(r()),"lips");default:throw new Error(`unknown face atlas region "${t}"`)}};function qe(t){let e=At.get(t);return e||(e=Uint16Array.from(J0(t)).sort(),At.set(t,e)),e}const e1=t=>typeof t=="string"?[t]:t,Ie=t=>{const e=e1(t);if(e.length===1)return qe(e[0]);const r=new Set;return e.forEach(s=>qe(s).forEach(n=>r.add(n))),Uint16Array.from(r).sort()},t1=t=>P.triangleIdsToVertices(Ie(t),x),r1=t=>{const e={minU:1/0,maxU:-1/0,minV:1/0,maxV:-1/0};return Ie(t).forEach(r=>{for(let s=0;s<3;s+=1){const n=x[r*3+s],o=Me[n*2],i=Me[n*2+1];e.minU=Math.min(e.minU,o),e.maxU=Math.max(e.maxU,o),e.minV=Math.min(e.minV,i),e.maxV=Math.max(e.maxV,i)}}),e},Ne=Object.freeze({normalSmoothing:.5,fadeInMs:150,fadeOutMs:120}),ke=["position","basePosition","normal","uv","restPosition","restNormal","edge","lipEdge","eyeRing","faceUv"],Q=me.vertexCount,be=me.triangleCount,s1=t=>{const e=typeof t=="object"&&!Array.isArray(t)&&"triangles"in t?t.triangles:Ie(t),r=new Uint16Array(e.length*3);for(let s=0;s<e.length;s+=1){const n=e[s];if(!(n>=0&&n<be))throw new Error(`face atlas triangle ${n} is out of range (0…${be-1})`);r[s*3]=x[n*3],r[s*3+1]=x[n*3+1],r[s*3+2]=x[n*3+2]}return r},n1=()=>{const t=new Uint16Array(be);for(let e=0;e<be;e+=1)t[e]=e;return t},gt=(t,e)=>{e.fill(0);const r=x;for(let s=0;s<r.length;s+=3){const n=r[s]*3,o=r[s+1]*3,i=r[s+2]*3,c=t[o]-t[n],l=t[o+1]-t[n+1],u=t[o+2]-t[n+2],m=t[i]-t[n],S=t[i+1]-t[n+1],d=t[i+2]-t[n+2],g=l*d-u*S,O=u*m-c*d,C=c*S-l*m;e[n]+=g,e[n+1]+=O,e[n+2]+=C,e[o]+=g,e[o+1]+=O,e[o+2]+=C,e[i]+=g,e[i+1]+=O,e[i+2]+=C}for(let s=0;s<e.length;s+=3){const n=Math.hypot(e[s],e[s+1],e[s+2]);n>0?(e[s]/=n,e[s+1]/=n,e[s+2]/=n):e[s+2]=1}},mt=(t,e,r)=>{if(r>=1){t.set(e);return}for(let s=0;s<t.length;s+=3){const n=t[s]+(e[s]-t[s])*r,o=t[s+1]+(e[s+1]-t[s+1])*r,i=t[s+2]+(e[s+2]-t[s+2])*r,c=Math.hypot(n,o,i)||1;t[s]=n/c,t[s+1]=o/c,t[s+2]=i/c}},he=new a.Vector4,o1=t=>{var r;const e=t._listeners;return(((r=e==null?void 0:e.dispose)==null?void 0:r.length)??0)>0};class a1{constructor(){p(this,"attributes");p(this,"geometry");p(this,"presence",0);p(this,"visible",!1);p(this,"version",0);p(this,"tracking","lost");p(this,"normalScratch",new Float32Array(Q*3));p(this,"normalsReady",!1);p(this,"faceUvRequests",0);p(this,"geometries",new Set);p(this,"isDisposed",!1);p(this,"offsetsApplied",!1);p(this,"warpedPositions",null);p(this,"warpedNormals",null);p(this,"baseNormals",null);p(this,"baseNormalsVersion",-1);p(this,"unwarped",!1);const e=$e(),r=n=>{const o=new a.BufferAttribute(new Float32Array(Q*n),n);return o.setUsage(a.DynamicDrawUsage),o},s=r(3);s.array.set(e.restNormal),this.attributes=Object.freeze({position:r(3),basePosition:r(3),normal:s,uv:new a.BufferAttribute(Me,2),restPosition:new a.BufferAttribute(e.restPosition,3),restNormal:new a.BufferAttribute(e.restNormal,3),edge:new a.BufferAttribute(e.edge,1),lipEdge:new a.BufferAttribute(e.lipEdge,1),eyeRing:new a.BufferAttribute(e.eyeRing,1),faceUv:r(2)}),["uv","restPosition","restNormal","edge","lipEdge","eyeRing"].forEach(n=>this.attributes[n].setUsage(a.StaticDrawUsage)),this.geometry=this.createGeometry({triangles:n1()})}get disposed(){return this.isDisposed}get wantsFaceUv(){return this.faceUvRequests>0}createGeometry(e="face",r={}){if(this.isDisposed)throw new Error("FaceAtlasSurface: createGeometry after dispose");const s=new a.BufferGeometry;return ke.forEach(n=>s.setAttribute(n,this.attributes[n])),Object.entries(r).forEach(([n,o])=>{if(ke.includes(n))throw new Error(`FaceAtlasSurface: "${n}" is a shared surface attribute`);if(o.count!==Q)throw new Error(`FaceAtlasSurface: attribute "${n}" has ${o.count} items, not ${Q}`);s.setAttribute(n,o)}),s.setIndex(new a.BufferAttribute(s1(e),1)),s.boundingSphere=new a.Sphere(new a.Vector3(0,0,0),20),s.boundingBox=new a.Box3(new a.Vector3(-12,-14,-10),new a.Vector3(12,14,12)),this.geometries.add(s),s}releaseGeometry(e){if(!this.geometries.delete(e))return;let r=!1;this.geometries.forEach(s=>{o1(s)&&(r=!0)}),r&&ke.forEach(s=>e.deleteAttribute(s)),e.dispose()}snapNormals(){this.normalsReady=!1}requestFaceUv(){this.faceUvRequests+=1;let e=!1;return()=>{e||(e=!0,this.faceUvRequests-=1)}}update({view:e,offsets:r=null,tracking:s,dtMs:n}){const o=s==="lost";if(!o&&e.length>=Q*3){const c=this.attributes.position.array,l=this.attributes.basePosition.array;for(let d=0;d<Q*3;d+=1){const g=e[d];l[d]=g,c[d]=r?g+r[d]:g}this.attributes.position.needsUpdate=!0,this.attributes.basePosition.needsUpdate=!0,this.offsetsApplied=r!==null,this.unwarped=!1;const u=this.attributes.normal.array,m=this.normalScratch;gt(c,m);const S=!this.normalsReady||this.tracking==="lost";mt(u,m,S?1:Ne.normalSmoothing),S&&(this.baseNormalsVersion=-1),this.normalsReady=!0,this.attributes.normal.needsUpdate=!0,this.version+=1}const i=Math.max(0,n);o?this.presence=Math.max(0,this.presence-i/Ne.fadeOutMs):this.version>0&&(this.presence=Math.min(1,this.presence+i/Ne.fadeInMs)),this.tracking=s,this.visible=this.presence>0&&this.version>0}setUnwarped(e){if(e===this.unwarped)return;const r=this.attributes.position.array,s=this.attributes.normal.array;if(e){if(!this.offsetsApplied)return;this.warpedPositions??(this.warpedPositions=new Float32Array(r.length)),this.warpedPositions.set(r),this.warpedNormals??(this.warpedNormals=new Float32Array(s.length)),this.warpedNormals.set(s),r.set(this.attributes.basePosition.array),s.set(this.unwarpedNormals())}else this.warpedPositions&&this.warpedNormals&&(r.set(this.warpedPositions),s.set(this.warpedNormals));this.unwarped=e,this.attributes.position.needsUpdate=!0,this.attributes.normal.needsUpdate=!0}unwarpedNormals(){if(this.baseNormalsVersion===this.version&&this.baseNormals)return this.baseNormals;const e=this.normalScratch;gt(this.attributes.basePosition.array,e);const r=!this.baseNormals||this.baseNormalsVersion!==this.version-1;return this.baseNormals??(this.baseNormals=new Float32Array(e.length)),mt(this.baseNormals,e,r?1:Ne.normalSmoothing),this.baseNormalsVersion=this.version,this.baseNormals}updateFaceUv(e){if(!this.wantsFaceUv||this.version===0)return!1;const r=this.attributes.basePosition.array,s=this.attributes.faceUv.array;for(let n=0;n<Q;n+=1){he.set(r[n*3],r[n*3+1],r[n*3+2],1).applyMatrix4(e);const o=Math.abs(he.w)>1e-9?he.w:1e-9;s[n*2]=he.x/o*.5+.5,s[n*2+1]=he.y/o*.5+.5}return this.attributes.faceUv.needsUpdate=!0,!0}dispose(){this.isDisposed||([...this.geometries].forEach(e=>this.releaseGeometry(e)),this.isDisposed=!0)}}const ie=Object.freeze({uSkinStats:{value:null},uSkinStatsPacked:{value:0},uSkinMap:{value:null},uSkinLod:{value:2},uSkinSqrt:{value:0}}),i1=()=>({uCameraMap:{value:null},uPresence:{value:0},uPersonLeftSign:{value:1},uSkinStats:{value:ie.uSkinStats.value},uSkinStatsPacked:{value:ie.uSkinStatsPacked.value},uSkinMap:{value:ie.uSkinMap.value},uSkinLod:{value:ie.uSkinLod.value},uSkinSqrt:{value:ie.uSkinSqrt.value}}),De=new a.Matrix4,St=new a.Matrix4,Pe=new a.Matrix4,Ct=new a.Matrix4,c1=new a.Vector3;class _t{constructor(e){p(this,"key");p(this,"surface",new a1);p(this,"group",new a.Group);p(this,"rig");p(this,"uniforms",i1());p(this,"refs",0);p(this,"driver");p(this,"prepass");p(this,"restore");p(this,"rigStamp",Number.NaN);p(this,"surfaceStamp",Number.NaN);p(this,"lastNowMs",null);p(this,"selfOcclusionRequests",0);p(this,"holdRequests",new Map);p(this,"requestedHoldMs");p(this,"stepOptions",{});p(this,"scene",null);p(this,"lastCameraTexture",null);this.key=e,e.kind==="borrowed"?(this.driver=null,this.rig=e.rig):(this.driver=jt(),this.driver.rig.faceIndex=e.faceIndex,this.rig={current:this.driver.rig}),this.group.name="FaceAtlasSurface",this.group.visible=!1,this.prepass=this.depthMesh("FaceAtlasPrepass",z0(),H.MAKEUP_RENDER_ORDER.prepass),this.restore=this.depthMesh("FaceAtlasRestore",j0(),H.MAKEUP_RENDER_ORDER.restore)}get owned(){return this.driver!==null}get faceIndex(){return this.key.kind==="owned"?this.key.faceIndex:this.rig.current.faceIndex}get wantsSelfOcclusion(){return this.selfOcclusionRequests>0}requestSelfOcclusion(){this.selfOcclusionRequests+=1;let e=!1;return()=>{e||(e=!0,this.selfOcclusionRequests-=1)}}get holdMs(){return this.requestedHoldMs}requestHold(e){if(!Number.isFinite(e))return()=>{};const r={};return this.holdRequests.set(r,Math.max(0,e)),this.updateHold(),()=>{this.holdRequests.delete(r)&&this.updateHold()}}updateHold(){let e;this.holdRequests.forEach(r=>{e=e===void 0?r:Math.max(e,r)}),this.requestedHoldMs=e}stepRig(e,r,s,n,o={},i=null){if(!this.driver||this.rigStamp===e)return null;this.rigStamp=e,this.followCameraTexture(i);const c=Object.assign(this.stepOptions,o);return c.holdMs=this.requestedHoldMs??o.holdMs,Wt(this.driver,r,this.key.kind==="owned"?this.key.faceIndex:0,s,n,c)}update({stamp:e,nowMs:r,cameraTexture:s,selfOcclusion:n,camera:o}){var S;if(this.surfaceStamp===e)return!1;this.surfaceStamp=e,this.followCameraTexture(s);const i=this.lastNowMs===null?0:r-this.lastNowMs;this.lastNowMs=r;const c=this.rig.current,l=this.key.kind==="borrowed"?(S=this.key.offsets)==null?void 0:S.current:null;this.surface.update({view:c.view,offsets:l!=null&&l.active?l.offsets:null,tracking:c.tracking,dtMs:i}),c.tracking!=="lost"&&this.pose(c);const u=this.surface.visible;this.group.visible=u;const m=u&&n&&this.wantsSelfOcclusion;return this.prepass.visible=m,this.restore.visible=m,this.uniforms.uCameraMap.value=s,this.uniforms.uPresence.value=this.surface.presence,o&&this.surface.wantsFaceUv&&u&&(this.group.updateMatrixWorld(),Ct.multiplyMatrices(o.projectionMatrix,o.matrixWorldInverse).multiply(this.group.matrixWorld),this.surface.updateFaceUv(Ct)),!0}updateSkin(e){const r=e??ie,s=this.uniforms;s.uSkinStats.value=r.uSkinStats.value,s.uSkinStatsPacked.value=r.uSkinStatsPacked.value,s.uSkinMap.value=r.uSkinMap.value,s.uSkinLod.value=r.uSkinLod.value,s.uSkinSqrt.value=r.uSkinSqrt.value}followCameraTexture(e){if(!e||e===this.lastCameraTexture)return;const r=this.lastCameraTexture;this.lastCameraTexture=e,r&&(this.driver&&Gt(this.driver),this.surface.snapNormals())}attach(e){this.scene!==e&&(this.detach(),this.scene=e,e.add(this.group))}detach(){this.scene&&(this.scene.remove(this.group),this.scene=null)}dispose(){this.detach(),this.surface.dispose(),this.prepass.material.dispose(),this.restore.material.dispose()}pose(e){const{position:r,quaternion:s,scale:n}=e.pose;De.compose(r,s,c1.setScalar(n||1));const o=this.group.parent;o?(o.updateWorldMatrix(!0,!1),St.copy(o.matrixWorld).invert(),Pe.multiplyMatrices(St,De)):Pe.copy(De),Pe.decompose(this.group.position,this.group.quaternion,this.group.scale)}depthMesh(e,r,s){const n=new a.Mesh(this.surface.createGeometry("face"),r);return n.name=e,n.renderOrder=s,n.frustumCulled=!1,n.visible=!1,W0(n,r.depthFunc),this.group.add(n),n}}const Et=()=>{};class l1{constructor(){p(this,"owned",new Map);p(this,"borrowed",new Map);p(this,"visit",Et);p(this,"visitBorrowed",e=>e.forEach(this.visit))}get(e){if(e.kind==="owned"){let n=this.owned.get(e.faceIndex);return n||(n=new _t({kind:"owned",faceIndex:e.faceIndex}),this.owned.set(e.faceIndex,n)),n}let r=this.borrowed.get(e.rig);r||(r=new Map,this.borrowed.set(e.rig,r));let s=r.get(e.offsets);return s||(s=new _t({kind:"borrowed",rig:e.rig,offsets:e.offsets}),r.set(e.offsets,s)),s}retain(e,r){e.refs+=1,e.attach(r)}release(e){if(e.refs=Math.max(0,e.refs-1),e.refs>0)return;const{key:r}=e;if(r.kind==="owned")this.owned.get(r.faceIndex)===e&&this.owned.delete(r.faceIndex);else{const s=this.borrowed.get(r.rig);(s==null?void 0:s.get(r.offsets))===e&&s.delete(r.offsets),(s==null?void 0:s.size)===0&&this.borrowed.delete(r.rig)}e.dispose()}forEachEntry(e){this.owned.forEach(e),this.visit=e,this.borrowed.forEach(this.visitBorrowed),this.visit=Et}get size(){let e=this.owned.size;return this.borrowed.forEach(r=>{e+=r.size}),e}}const u1=({faceIndex:t,numFaces:e,rigFaceIndex:r,trackerFaceIndex:s})=>{const n=t===void 0?void 0:H.resolveFaceIndex(t),o=r!==null&&(n===void 0||n===r),i=o?r:n??s??0;return{faceIndex:i,borrow:o,acquire:!o&&r===null&&s===null,numFaces:H.resolveNumFaces(i,e)}},Rt=new WeakMap,Xt=t=>{let e=Rt.get(t);return e||(e=new l1,Rt.set(t,e)),e},te=30,d1=-.3,h1=t=>t>=H.MAKEUP_RENDER_ORDER.prepass&&t<=H.MAKEUP_RENDER_ORDER.restore;let ze=!1;const f1=t=>{const{children:e}=t.group;for(let r=0;r<e.length;r+=1){const s=e[r];h1(s.renderOrder)?s.layers.enable(te):s.layers.disable(te)}t.surface.setUnwarped(ze)},Te=[],Be=(t,e)=>{if(e===null){for(let r=0;r<Te.length;r+=1)Te[r].layers.disable(te);Te.length=0;return}t.traverseVisible(r=>{r.isLight&&r.layers.mask&e&&!r.layers.isEnabled(te)&&(r.layers.enable(te),Te.push(r))})},Ot=(t,e)=>{ze=e,Xt(t).forEachEntry(f1),ze=!1},p1=`
|
|
17
|
+
varying vec2 vUv;
|
|
18
|
+
void main() {
|
|
19
|
+
vUv = position.xy * 0.5 + 0.5;
|
|
20
|
+
gl_Position = vec4(position.xy, 0.0, 1.0);
|
|
21
|
+
}
|
|
22
|
+
`,A1=`
|
|
23
|
+
uniform sampler2D uMap;
|
|
24
|
+
varying vec2 vUv;
|
|
25
|
+
void main() {
|
|
26
|
+
gl_FragColor = vec4(texture2D(uMap, vUv).rgb, 1.0);
|
|
27
|
+
#include <colorspace_fragment>
|
|
28
|
+
}
|
|
29
|
+
`,g1=`
|
|
30
|
+
uniform sampler2D uMap;
|
|
31
|
+
varying vec2 vUv;
|
|
32
|
+
void main() {
|
|
33
|
+
gl_FragColor = vec4(sRGBTransferEOTF(texture2D(uMap, vUv)).rgb, 1.0);
|
|
34
|
+
}
|
|
35
|
+
`,Nt=(t,e)=>{const r={uMap:{value:null}},s=new a.ShaderMaterial({name:e,uniforms:r,vertexShader:p1,fragmentShader:t,depthTest:!1,depthWrite:!1,blending:a.NoBlending,toneMapped:!1}),n=new a.BufferGeometry;n.setAttribute("position",new a.BufferAttribute(new Float32Array([-1,-1,0,3,-1,0,-1,3,0]),3));const o=new a.Mesh(n,s);o.frustumCulled=!1;const i=new a.Scene;return i.add(o),{uniforms:r,material:s,geometry:n,scene:i}},m1=(t,e)=>{const r=new a.WebGLRenderTarget(t,e,{colorSpace:a.SRGBColorSpace,depthBuffer:!0,stencilBuffer:!0,generateMipmaps:!1,minFilter:a.NearestFilter,magFilter:a.NearestFilter});return r.texture.internalFormat="RGBA8",r.texture.name="MadeUpCamera.work",r.isXRRenderTarget=!0,r},S1=(t,e)=>{const r=new a.WebGLRenderTarget(t,e,{colorSpace:a.SRGBColorSpace,depthBuffer:!1,stencilBuffer:!1,generateMipmaps:!1,minFilter:a.LinearFilter,magFilter:a.LinearFilter});return r.texture.name="MadeUpCamera",r},je=new WeakMap,C1=t=>{var e;return((e=je.get(t))==null?void 0:e.frame)??t.version},Tt=new a.Color,He=new a.Vector2;class _1{constructor(){p(this,"work");p(this,"output");p(this,"cameraPass",Nt(A1,"MadeUpCamera.camera"));p(this,"decodePass",Nt(g1,"MadeUpCamera.decode"));p(this,"quadCamera",new a.OrthographicCamera(-1,1,1,-1,0,1));p(this,"passes",0);p(this,"live",!1);p(this,"stamp",Number.NaN);this.work=m1(1,1),this.output=S1(1,1),je.set(this.output.texture,this)}get texture(){return this.output.texture}get frame(){return this.passes}get ready(){return this.live}get width(){return this.output.width}get height(){return this.output.height}renderOnce(e,r,s,n,o){return e===this.stamp?!1:(this.stamp=e,this.render(r,s,n,o))}render(e,r,s,n){if(!n)return this.live=!1,!1;this.fitSize(e,n);const o=r,i=e.getRenderTarget();e.getClearColor(Tt);const c=e.getClearAlpha(),l=e.xr.enabled,u=e.autoClear,m=e.shadowMap.autoUpdate,S=s.layers.mask,d=o.background??null,g=o.overrideMaterial??null;Ot(r,!0);try{e.xr.enabled=!1,e.autoClear=!1,e.shadowMap.autoUpdate=!1,e.setRenderTarget(this.work),e.setClearColor(0,1),e.clear(!0,!0,!0),this.cameraPass.uniforms.uMap.value=n,e.render(this.cameraPass.scene,this.quadCamera),o.isScene&&(o.background=null,o.overrideMaterial=null),s.layers.set(te),Be(r,S),e.render(r,s),Be(r,null),s.layers.mask=S,e.setRenderTarget(this.output),this.decodePass.uniforms.uMap.value=this.work.texture,e.render(this.decodePass.scene,this.quadCamera)}finally{Be(r,null),s.layers.mask=S,o.isScene&&(o.background=d,o.overrideMaterial=g),this.cameraPass.uniforms.uMap.value=null,e.setRenderTarget(i),e.setClearColor(Tt,c),e.xr.enabled=l,e.autoClear=u,e.shadowMap.autoUpdate=m,Ot(r,!1)}return this.passes+=1,this.live=!0,!0}dispose(){je.delete(this.output.texture),this.work.dispose(),this.output.dispose(),[this.cameraPass,this.decodePass].forEach(e=>{e.material.dispose(),e.geometry.dispose()})}fitSize(e,r){var l;const s=r.image;let n=(s==null?void 0:s.videoWidth)||(s==null?void 0:s.width)||0,o=(s==null?void 0:s.videoHeight)||(s==null?void 0:s.height)||0;n>0&&o>0||(e.getDrawingBufferSize(He),n=He.x,o=He.y);const i=((l=e.capabilities)==null?void 0:l.maxTextureSize)??4096,c=Math.min(1,i/Math.max(n,o,1));n=Math.max(1,Math.round(n*c)),o=Math.max(1,Math.round(o*c)),!(n===this.output.width&&o===this.output.height)&&(this.work.setSize(n,o),this.output.setSize(n,o))}}const ge=new WeakMap,E1=t=>{let e=ge.get(t);return e||(e={target:new _1,refs:0},ge.set(t,e)),e.refs+=1,e.target},R1=(t,e)=>{const r=ge.get(t);!r||r.target!==e||(r.refs-=1,!(r.refs>0)&&(ge.delete(t),e.dispose()))},O1=t=>{var r;const e=((r=ge.get(t))==null?void 0:r.target)??null;return e!=null&&e.ready?e:null},we=new WeakMap,N1=(t,e)=>{let r=we.get(t);return r||(r=new Set,we.set(t,r)),r.add(e),()=>{var s;(s=we.get(t))==null||s.delete(e)}},T1=new Set,L1=t=>we.get(t)??T1,w1=["bust"],y1=["head","torso"],Ge="/assets/xr/3d-models/neck-occluder-bust-v1.glb",Yt=(t="bust")=>new URL({bust:Ge}[t]??Ge,L.libConfig.assetStorageEndpoint).toString(),$t=Object.freeze([0,12.86,3.45]),Qt=.25,F1=Ke.createVerifiedGltfLoader(),M1=-1,I={head:new a.Quaternion,camera:new a.Quaternion,relative:new a.Quaternion,level:new a.Quaternion,twist:new a.Quaternion,euler:new a.Euler(0,0,0,"YXZ"),position:new a.Vector3,scale:new a.Vector3},Zt=(t,e,r,s)=>{I.relative.copy(e).invert().multiply(t),I.euler.setFromQuaternion(I.relative,"YXZ");const n=a.MathUtils.clamp(r,0,1);return I.level.setFromEuler(I.euler.set(0,I.euler.y*n,0,"YXZ")).premultiply(e),s.copy(t).invert().multiply(I.level),s.slerp(I.twist.identity(),.5)},Jt=({type:t="bust",follow:e="head",shoulderTurn:r=Qt,url:s,offset:n,bodyIndex:o=0,faceIndex:i,showDebugMaterial:c=!1,opacity:l=.5})=>{const u=s??Yt(t),[m,S]=R.useState(null);R.useEffect(()=>{let A=!1;return F1(u).then(f=>{A||S(f.scene)}).catch(f=>{A||console.error(`${L.libConfig.loggerPrefix} neck occluder load failed`,f)}),()=>{A=!0}},[u]);const d=R.useMemo(()=>{if(!m)return null;const A=S0.clone(m),f=new a.MeshStandardMaterial({color:15132390,colorWrite:c,depthWrite:!0,opacity:c?l:1,transparent:c,side:a.DoubleSide});A.traverse(T=>{T.frustumCulled=!1,T instanceof a.Mesh&&(T.material=f,T.renderOrder=M1)});const _=T=>A.getObjectByName(T),y=_("neck_mid"),M=_("neck_base");return{root:A,material:f,bones:[y,M].filter(T=>!!T).map(T=>({bone:T,rest:T.quaternion.clone()}))}},[m,c,l]);R.useEffect(()=>()=>d==null?void 0:d.material.dispose(),[d]);const g=j.useThree(A=>A.scene),O=j.useThree(A=>A.camera);R.useEffect(()=>{if(!d||e!=="head"||d.bones.length===0)return;const A=new a.Quaternion;return fe.addSceneBeforeRender(g,()=>{const f=d.root.parent;f&&(f.matrixWorld.decompose(I.position,I.head,I.scale),O.getWorldQuaternion(I.camera),Zt(I.head,I.camera,r,A),d.bones.forEach(({bone:_,rest:y})=>_.quaternion.copy(y).multiply(A)),d.root.updateMatrixWorld(!0))})},[d,e,g,O,r]);const C=R.useContext(F.CanonicalHeadFrameContext),w=Mt.useTrackerContext();if(!d)return null;if(e==="torso"){const A=b.jsx(d0,{bodyIndex:o,offset:n,children:b.jsx("group",{position:$t,children:b.jsx("primitive",{object:d.root})})});return(w==null?void 0:w.type)==="body"?A:b.jsx(Ut,{bodyIndex:o,children:A})}const h=b.jsx("group",{position:n==null?void 0:n.position,rotation:n==null?void 0:n.rotation,scale:n==null?void 0:n.scale,children:b.jsx("primitive",{object:d.root})});return C?h:b.jsx(F.CanonicalHeadFrame,{faceIndex:i,children:h})},ye=[0,0,-10],Fe=[.5,.5,.5],e0=1,t0=F.CANONICAL_HEAD_FIT_DEFAULT_SMOOTHING,r0="/assets/xr/3d-models/head-occluder-v2.glb",s0="/assets/xr/3d-models/head-occluder-v3.glb",xe=-1,n0=(t="canonical")=>new URL(t==="canonical"?s0:r0,L.libConfig.assetStorageEndpoint).toString(),v1=Ke.createVerifiedGltfLoader(),b1=({fit:t="canonical",faceIndex:e,offset:r,position:s,rotation:n,scale:o,url:i,showDebugMaterial:c=!1,opacity:l=e0,smoothing:u=t0,onFit:m,neck:S})=>{const d=i??n0(t),[g,O]=R.useState(null);R.useEffect(()=>{let f=!1;return v1(d).then(_=>{f||O(_.scene)}).catch(_=>{f||console.error(`${L.libConfig.loggerPrefix} head occluder load failed`,_)}),()=>{f=!0}},[d]);const C=R.useMemo(()=>{if(!g)return null;const f=g.clone();return f.traverse(_=>{_ instanceof a.Mesh&&(_.material=new a.MeshStandardMaterial({color:15132390,colorWrite:c,depthWrite:!0,opacity:c?l:1,side:a.DoubleSide,transparent:c}),_.frustumCulled=!1,_.renderOrder=xe)}),f},[g,c,l]);R.useEffect(()=>{if(C)return()=>{C.traverse(f=>{f instanceof a.Mesh&&f.material.dispose()})}},[C]);const w=t==="canonical",h=R.useRef(null);if(h.current=C,F.useCanonicalHeadFit(h,{faceIndex:e,offset:r,smoothing:u,enabled:w,onFit:m}),!C)return null;w||(s?C.position.set(s[0],s[1],s[2]):C.position.set(ye[0],ye[1],ye[2]),n&&C.rotation.set(n[0],n[1],n[2]),o?C.scale.set(o[0],o[1],o[2]):C.scale.set(Fe[0],Fe[1],Fe[2]));const A=S?S===!0?{}:typeof S=="string"?{type:S}:S:null;return b.jsxs(b.Fragment,{children:[b.jsx("primitive",{object:C}),A&&b.jsx(Jt,{faceIndex:e,showDebugMaterial:c,opacity:l,...A})]})},Je=[[11,18,0,0],[12,-18,0,0]],o0=Float64Array.from(Je.flatMap(([,t,e,r])=>[t,e,r])),We=Je.map(([t])=>t),a0=36,Z=new a.Vector3,ne=new a.Vector3,Lt=new a.Vector3,wt=new a.Matrix4,yt=new a.Vector3(0,1,0),i0=(t,e)=>{Z.set(t[0]-t[3],t[1]-t[4],t[2]-t[5]);const r=Z.length(),s=r>1e-9?r:1e-9;return Z.divideScalar(s),ne.copy(yt).addScaledVector(Z,-yt.dot(Z)),ne.lengthSq()<1e-9&&ne.set(0,0,1),ne.normalize(),Lt.crossVectors(Z,ne).normalize(),wt.makeBasis(Z,ne,Lt),e.quaternion.setFromRotationMatrix(wt),e.scale=s/a0,e.worldUnitsPerCm=e.scale,e.translation.set((t[0]+t[3])/2,(t[1]+t[4])/2,(t[2]+t[5])/2),e.rms=0,e.count=2,e},et=fe.LANDMARK_POSE_FIT_DEFAULT_SMOOTHING,x1={x:-1,y:0},I1={x:1,y:0},W=new a.Vector3,Ft=new a.Vector3,tt=(t,{bodyIndex:e=0,offset:r,smoothing:s=et,enabled:n=!0,onFit:o,onTrackingChange:i}={})=>{const c=Xe.useXRModelNode(L.XRModel.BODY_TRACKER),{camera:l}=j.useThree(),u=R.useCallback(m=>{const S=c==null?void 0:c.getLandmarks2D(e);if(!S||S.length<13)return!1;L.trackerToWorld(x1,l,W,0),L.trackerToWorld(I1,l,Ft,0);const d=W.distanceTo(Ft),g=S[We[0]],O=S[We[1]];if(!g||!O)return!1;const C=(g.z-O.z)*d/2;return L.trackerToWorld(g,l,W,C),m[0]=W.x,m[1]=W.y,m[2]=C,L.trackerToWorld(O,l,W,-C),m[3]=W.x,m[4]=W.y,m[5]=-C,!0},[e,c,l]);fe.useLandmarkPoseFit(t,{canonical:o0,readLive:u,offset:r,smoothing:s,enabled:n,onFit:o,onTrackingChange:i,solve:i0})},c0="/assets/xr/3d-models/shoulder-occluder-v1.glb",l0=1,u0=()=>new URL(c0,L.libConfig.assetStorageEndpoint).toString(),U1=Ke.createVerifiedGltfLoader(),k1=({bodyIndex:t=0,offset:e,url:r,showDebugMaterial:s=!1,opacity:n=l0,smoothing:o=et,onFit:i})=>{const c=r??u0(),[l,u]=R.useState(null);R.useEffect(()=>{let d=!1;return U1(c).then(g=>{d||u(g.scene)}).catch(g=>{d||console.error(`${L.libConfig.loggerPrefix} shoulder occluder load failed`,g)}),()=>{d=!0}},[c]);const m=R.useMemo(()=>{if(!l)return null;const d=l.clone();return d.traverse(g=>{g instanceof a.Mesh&&(g.material=new a.MeshStandardMaterial({color:15132390,colorWrite:s,depthWrite:!0,opacity:s?n:1,side:a.DoubleSide,transparent:s}),g.frustumCulled=!1,g.renderOrder=xe)}),d.renderOrder=xe,d},[l,s,n]);R.useEffect(()=>{if(m)return()=>{m.traverse(d=>{d instanceof a.Mesh&&d.material.dispose()})}},[m]);const S=R.useRef(null);return S.current=m,tt(S,{bodyIndex:t,offset:e,smoothing:o,onFit:i}),m?b.jsx("primitive",{object:m}):null},d0=({children:t,...e})=>{const r=R.useRef(null);return tt(r,e),b.jsx("group",{ref:r,children:t})},D1=["browRaise","eyeBlink","eyeBlinkLeft","eyeBlinkRight","eyeBlinkEither","headUp","headDown","headTurnLeft","headTurnRight","mouthOpen","mouthPout","headTiltLeft","headTiltRight"],J=(t=.5)=>({threshold:t,releaseThreshold:Math.max(0,t-.15),holdMs:50}),oe={threshold:Math.PI/18,releaseThreshold:Math.PI/30,holdMs:80},h0={browRaise:J(.45),eyeBlink:J(.55),eyeBlinkLeft:J(.55),eyeBlinkRight:J(.55),eyeBlinkEither:J(.55),headUp:oe,headDown:oe,headTurnLeft:oe,headTurnRight:oe,mouthOpen:J(.45),mouthPout:J(.5),headTiltLeft:oe,headTiltRight:oe},ae=t=>Math.max(0,t),ce=(t,e)=>t!==void 0&&Number.isFinite(t)?t:e,f0=(t,e={})=>{const r=h0[t],s=Math.max(0,ce(e.threshold,r.threshold));return{threshold:s,releaseThreshold:Math.min(s,Math.max(0,ce(e.releaseThreshold,r.releaseThreshold))),holdMs:Math.max(0,ce(e.holdMs,r.holdMs))}},rt=(t,e,{neutralRotation:r={x:0,y:0,z:0}}={})=>{const s=ce(r.x,0),n=ce(r.y,0),o=ce(r.z,0);switch(e){case"browRaise":return Math.max(D.getFaceBlendshape(t,"browInnerUp"),D.getFaceBlendshape(t,"browOuterUpLeft"),D.getFaceBlendshape(t,"browOuterUpRight"));case"eyeBlink":return Math.min(D.getFaceBlendshape(t,"eyeBlinkLeft"),D.getFaceBlendshape(t,"eyeBlinkRight"));case"eyeBlinkLeft":case"eyeBlinkRight":return D.getFaceBlendshape(t,L.feedSidedName(e,t.mirrored!==!1));case"eyeBlinkEither":return Math.max(D.getFaceBlendshape(t,"eyeBlinkLeft"),D.getFaceBlendshape(t,"eyeBlinkRight"));case"mouthOpen":return D.getFaceBlendshape(t,"jawOpen");case"mouthPout":return D.getFaceBlendshape(t,"mouthPucker");case"headUp":return ae(t.pose.rotation.x-s);case"headDown":return ae(s-t.pose.rotation.x);case"headTurnLeft":return ae(t.pose.rotation.y-n);case"headTurnRight":return ae(n-t.pose.rotation.y);case"headTiltLeft":return ae(t.pose.rotation.z-o);case"headTiltRight":return ae(o-t.pose.rotation.z)}},P1=(t,e,r={})=>rt(t,e,r)>=f0(e,r).threshold,B1=(t,e,r={})=>{let s=null,n=0;for(const o of t){const i=rt(o,e,r);(!s||i>n)&&(s=o,n=i)}return{face:s,value:n}},H1=t=>({action:t,active:!1,value:0,justStarted:!1,justEnded:!1,phase:"none",holdStartedAt:null}),V1=(t,e,r,s,n)=>{const o=t.phase==="begin";if(t.value=e,t.justStarted=!1,t.justEnded=!1,t.phase=t.active?"stay":"none",!s)return t.holdStartedAt=null,t.active&&(t.active=!1,t.justEnded=!0,t.phase="end"),t;if(t.active){if(e<=n.releaseThreshold){if(o)return t;t.active=!1,t.justEnded=!0,t.phase="end"}return t}return e<n.threshold?(t.holdStartedAt=null,t):(t.holdStartedAt===null&&(t.holdStartedAt=r),r-t.holdStartedAt>=n.holdMs&&(t.active=!0,t.justStarted=!0,t.phase="begin",t.holdStartedAt=null),t)},Le=()=>({pos:new a.Vector3,prevRaw:new a.Vector3,dxHat:new a.Vector3,initialized:!1}),q1=({faceIndex:t=0,numFaces:e,active:r=!0,targetFps:s,holdMs:n=250,predictMs:o=0,smoothing:i=0,leadMs:c=80}={})=>{const l=Number.isFinite(t)?Math.max(0,Math.round(t)):0,u=Math.max(e??l+1,l+1),m=R.useMemo(()=>({numFaces:u,...s!==void 0&&s>0?{targetFps:s}:{}}),[u,s]),{node:S,ready:d,error:g}=bt.useXRModel(L.XRModel.FACE_TRACKER,m,r),{session:O}=L.useXRContext(),C=R.useMemo(()=>ee.createIrisResult(l),[l]),w=R.useRef(null);w.current||(w.current=new L.FaceTrackMemory({holdMs:n,predictMs:o})),R.useEffect(()=>{var E;(E=w.current)==null||E.setOptions({holdMs:Math.max(0,n),predictMs:Math.max(0,o)})},[n,o]);const h=R.useRef({left:{center:Le(),radius:Le()},right:{center:Le(),radius:Le()}}),A=R.useRef(new a.Vector3),f=R.useRef(new ee.IrisLead),_=R.useRef(null),y=R.useRef(-1/0),M=R.useRef(!1),[T,N]=R.useState("loading");return j.useFrame((E,U)=>{var ue;const re=g?"error":d&&S?"ready":"loading";re!==T&&N(re);const B=performance.now(),K=r&&S?S.getDetectionResults():void 0,q=(ue=K==null?void 0:K.faceLandmarks)==null?void 0:ue[l],X=q&&q.length>0?q:void 0,le=w.current.update(X?[X]:[],B)[0];if(!le){(C.detected||C.version===0)&&ee.updateIrisResult(C,void 0,B,{faceIndex:l}),M.current=!1,f.current.reset();return}const Y=!X;Y||(y.current=B);const Se=Y?Math.max(0,n>0?1-(B-y.current)/n:0):1,Ce=L.isMirroredSourceKind(O.store.getSnapshot().sourceKind);if(ee.updateIrisResult(C,le,B,{faceIndex:l,held:Y,faceConfidence:Se,mirrored:Ce}),C.detected&&!Y){const $=K!==_.current;_.current=K,M.current||f.current.reset();for(const V of["left","right"]){const v=C[V];$&&f.current.observe(V,v.center,B),f.current.apply(V,B,c,v.center),L.normalizedTrackerPointToTrackerPoint(v.center,v.trackerCenter)}}if(i>0&&C.detected){const $=!M.current;for(const V of["left","right"]){const v=C[V],G=h.current[V];$&&(G.center.initialized=!1,G.radius.initialized=!1),A.current.set(v.center.x,v.center.y,v.center.z),P.stepTrackingSmoothing(G.center,A.current,U,i),v.center.x=G.center.pos.x,v.center.y=G.center.pos.y,v.center.z=G.center.pos.z,L.normalizedTrackerPointToTrackerPoint(v.center,v.trackerCenter),A.current.set(v.radius,0,0),P.stepTrackingSmoothing(G.radius,A.current,U,i),v.radius=G.radius.pos.x}}M.current=C.detected}),{result:C,ready:d&&T==="ready",status:T,error:g}},z1=({mask:t,texture:e,material:r,renderOrder:s=vt.RENDER_LAYERS.BACKGROUND+10,visible:n=!0,...o})=>{const i=C0.resolveSegmentationOverlaySettings(o),{camera:c,size:l}=j.useThree(),u=Xe.useXRCameraTexture()??null,m=j.useLoader(a.TextureLoader,typeof e=="string"?e:P.TRANSPARENT_TEXTURE_DATA_URL),S=typeof e=="string"?m:e??null;S&&S.colorSpace!==a.SRGBColorSpace&&(S.colorSpace=a.SRGBColorSpace,S.needsUpdate=!0);const{holder:d,sync:g}=ee.useSemanticMaskTexture(t),O=u==null?void 0:u.image,C=(O==null?void 0:O.width)??0,w=(O==null?void 0:O.height)??0,h=ee.useSegmentationOverlayMaterial({cameraTexture:u,maskTexture:d.texture,mask:t,settings:i,designTexture:S,feedWidth:C,feedHeight:w}),A=R.useRef(null),[,f]=R.useState(0);j.useFrame(()=>{const N=g();A.current!==N&&(A.current=N,h.uniforms.maskTexture.value=N,f(E=>E+1))});const _=R.useMemo(()=>{const N=c;if(!N.isPerspectiveCamera)return[10,10];const E=(N.position.z||5)+1,U=2*Math.tan(N.fov*Math.PI/360)*E;return[U*(l.width/l.height),U]},[c,l]);if(!u||!n)return null;const y={cameraTexture:u,maskTexture:d.texture,maskTransform:h.uniforms.maskTransform.value,labelIndices:ee.resolveActiveOverlayLabelIndices(t,i.label),mask:t,settings:i},M=r?typeof r=="function"?r(y):r:h,T=M instanceof a.Material?M:void 0;return b.jsx("group",{position:[0,0,-1],children:b.jsxs("mesh",{renderOrder:s,frustumCulled:!1,material:T,children:[b.jsx("planeGeometry",{args:_}),T?null:M]},T?"instance":"node")})};exports.BODY_LANDMARK_INDEX=xt;exports.BodyTracker=Ut;exports.CANONICAL_SHOULDER_DISTANCE=a0;exports.CANONICAL_TORSO_FIT_DEFAULT_SMOOTHING=et;exports.CANONICAL_TORSO_INDICES=We;exports.CANONICAL_TORSO_LANDMARKS=Je;exports.CANONICAL_TORSO_POINTS=o0;exports.CanonicalTorsoFrame=d0;exports.DEFAULT_FACE_ACTION_OPTIONS=h0;exports.FACE_ACTION_NAMES=D1;exports.FACE_ATLAS_EYE_RINGS=Ve;exports.FACE_ATLAS_LIP_RINGS=pe;exports.FACE_ATLAS_MIRROR=E0;exports.FACE_ATLAS_OVAL_RING=Dt;exports.FACE_ATLAS_REGIONS=K0;exports.FACE_ATLAS_SOURCE=me;exports.FACE_ATLAS_TRIANGLES=x;exports.FACE_ATLAS_UVS=Me;exports.FACE_BLENDSHAPE_NAMES=Bt;exports.FACE_GAZE_CHANNELS=M0;exports.FACE_MORPH_COUNT=Ae;exports.FACE_MORPH_NAMES=k;exports.FACE_REGION_MASKS=U0;exports.FACE_RIG_FAST_MOVE_CM=qt;exports.FACE_RIG_FAST_TURN_DEG=Vt;exports.HEAD_OCCLUDER_DEFAULT_OPACITY=e0;exports.HEAD_OCCLUDER_DEFAULT_POSITION=ye;exports.HEAD_OCCLUDER_DEFAULT_SCALE=Fe;exports.HEAD_OCCLUDER_DEFAULT_SMOOTHING=t0;exports.HEAD_OCCLUDER_RENDER_ORDER=xe;exports.HEAD_OCCLUDER_V2_PATH=r0;exports.HEAD_OCCLUDER_V3_PATH=s0;exports.HeadOccluder=b1;exports.MADE_UP_CAMERA_FRAME_PRIORITY=d1;exports.MADE_UP_CAMERA_LAYER=te;exports.NECK_BUST_TORSO_POSITION=$t;exports.NECK_OCCLUDER_BUST_PATH=Ge;exports.NECK_OCCLUDER_FOLLOWS=y1;exports.NECK_OCCLUDER_SHOULDER_TURN=Qt;exports.NECK_OCCLUDER_TYPES=w1;exports.NeckOccluder=Jt;exports.SHOULDER_OCCLUDER_DEFAULT_OPACITY=l0;exports.SHOULDER_OCCLUDER_V1_PATH=c0;exports.SegmentationOverlay=z1;exports.ShoulderOccluder=k1;exports.acquireMadeUpCamera=E1;exports.bodyLandmarkIndex=It;exports.createFaceActionStepState=H1;exports.createFaceRigDriver=jt;exports.createFaceRigState=Ht;exports.faceMorphChannel=y0;exports.faceMorphRegion=F0;exports.feedTextureVersion=C1;exports.getFaceActionValue=rt;exports.getFaceAtlasAttributes=$e;exports.getFaceAtlasRegionBounds=r1;exports.getFaceAtlasRegionIndices=t1;exports.getFaceAtlasRegionTriangles=Ie;exports.getFaceAtlasRegistry=Xt;exports.getHandCutoutShapes=L1;exports.getStrongestFaceAction=B1;exports.hasFaceAction=P1;exports.headOccluderUrl=n0;exports.neckBoneTwist=Zt;exports.neckOccluderUrl=Yt;exports.peekMadeUpCamera=O1;exports.recalibrateFaceRig=Ze;exports.registerHandCutoutShape=N1;exports.releaseMadeUpCamera=R1;exports.resetFaceRigDriver=Gt;exports.resolveFaceActionOptions=f0;exports.resolveFaceAtlasBinding=u1;exports.shoulderOccluderUrl=u0;exports.solveShoulderPose=i0;exports.stepFaceActionState=V1;exports.stepFaceRig=zt;exports.stepFaceRigFromModel=Wt;exports.useCanonicalTorsoFit=tt;exports.useIrisTracking=q1;
|