@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
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
export { ScreenImage, defaultScreenImageUrl } from './ScreenImage';
|
|
2
2
|
export { screenImageBlendModeOptions } from './utils/ScreenImageConstants';
|
|
3
3
|
export { resolveBlendProps } from './materials/ScreenImageBlendMaterial';
|
|
4
|
+
export { SCREEN_IMAGE_MASK_CHANNELS, resolveMaskChannelIndex, } from './materials/ScreenImageMaskMaterial';
|
|
5
|
+
export type { ScreenImageMaskChannel } from './materials/ScreenImageMaskMaterial';
|
|
4
6
|
export type { ScreenImageBlendMode, ScreenImageMaterialType, ScreenImageProps } from './types';
|
|
5
7
|
export type { ScreenImageSource } from './source';
|
|
6
|
-
export { getScreenImageTextureAspect, getScreenImageTextureSize, resolveScreenImageSource, } from './source';
|
|
8
|
+
export { getScreenImageTextureAspect, getScreenImageTextureSize, isDynamicScreenImageTexture, resolveScreenImageSource, } from './source';
|
|
7
9
|
export { computeScreenImageFitResolution, computeScreenImageFittedRect, resolveScreenImageStretchMode, } from './fit';
|
|
8
10
|
export type { ScreenImageFit, ScreenImageFittedRect, ScreenImageFittedRectInput, ScreenImageStretchMode, } from './fit';
|
|
@@ -6,4 +6,4 @@ export declare const advancedBlendModeIndices: Record<AdvancedBlendMode, number>
|
|
|
6
6
|
export type BlendMaterialProps = Partial<Pick<THREE.Material, "blending" | "blendSrc" | "blendDst" | "blendEquation">>;
|
|
7
7
|
export declare const resolveBlendProps: (mode: ScreenImageBlendMode) => BlendMaterialProps;
|
|
8
8
|
export declare const advancedBlendVertexShader = "\nvarying vec2 vUv;\nvoid main(){vUv=uv;gl_Position=projectionMatrix*modelViewMatrix*vec4(position,1.0);}";
|
|
9
|
-
export declare const advancedBlendFragmentShader = "\nuniform sampler2D imageMap;uniform sampler2D backdropMap;uniform vec2 resolution;\nuniform vec3 tint;uniform float opacity;uniform float alphaTest;uniform int blendMode;varying vec2 vUv;\nfloat overlayChannel(float b,float s){return b<.5?2.*b*s:1.-2.*(1.-b)*(1.-s);}\nfloat hardLightChannel(float b,float s){return s<.5?2.*b*s:1.-2.*(1.-b)*(1.-s);}\nfloat softLightChannel(float b,float s){return s<.5?b-(1.-2.*s)*b*(1.-b):b+(2.*s-1.)*(sqrt(max(b,0.))-b);}\nvec3 applyAdvancedBlend(vec3 b,vec3 s){\nif(blendMode==0)return vec3(overlayChannel(b.r,s.r),overlayChannel(b.g,s.g),overlayChannel(b.b,s.b));\nif(blendMode==1)return vec3(softLightChannel(b.r,s.r),softLightChannel(b.g,s.g),softLightChannel(b.b,s.b));\nif(blendMode==2)return vec3(hardLightChannel(b.r,s.r),hardLightChannel(b.g,s.g),hardLightChannel(b.b,s.b));\nif(blendMode==3)return abs(b-s);return b+s-2.*b*s;}\nvoid main(){vec4 image=texture2D(imageMap,vUv)*vec4(tint,opacity);if(image.a<=alphaTest)discard;\nvec2 uv=gl_FragCoord.xy/max(resolution,vec2(1.));vec3 base=texture2D(backdropMap,uv).rgb;\nvec3 mixed=applyAdvancedBlend(base,image.rgb);gl_FragColor=vec4(mix(base,mixed,image.a),1.)
|
|
9
|
+
export declare const advancedBlendFragmentShader = "\nuniform sampler2D imageMap;uniform sampler2D backdropMap;uniform vec2 resolution;\nuniform vec3 tint;uniform float opacity;uniform float alphaTest;uniform int blendMode;varying vec2 vUv;\nfloat overlayChannel(float b,float s){return b<.5?2.*b*s:1.-2.*(1.-b)*(1.-s);}\nfloat hardLightChannel(float b,float s){return s<.5?2.*b*s:1.-2.*(1.-b)*(1.-s);}\nfloat softLightChannel(float b,float s){return s<.5?b-(1.-2.*s)*b*(1.-b):b+(2.*s-1.)*(sqrt(max(b,0.))-b);}\nvec3 applyAdvancedBlend(vec3 b,vec3 s){\nif(blendMode==0)return vec3(overlayChannel(b.r,s.r),overlayChannel(b.g,s.g),overlayChannel(b.b,s.b));\nif(blendMode==1)return vec3(softLightChannel(b.r,s.r),softLightChannel(b.g,s.g),softLightChannel(b.b,s.b));\nif(blendMode==2)return vec3(hardLightChannel(b.r,s.r),hardLightChannel(b.g,s.g),hardLightChannel(b.b,s.b));\nif(blendMode==3)return abs(b-s);return b+s-2.*b*s;}\nvoid main(){vec4 image=texture2D(imageMap,vUv)*vec4(tint,opacity);if(image.a<=alphaTest)discard;\nvec2 uv=gl_FragCoord.xy/max(resolution,vec2(1.));vec3 base=texture2D(backdropMap,uv).rgb;\nvec3 mixed=applyAdvancedBlend(base,image.rgb);gl_FragColor=vec4(mix(base,mixed,image.a),1.);\n#include <colorspace_fragment>\n}";
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/** Which channel of a `maskTexture` carries coverage. */
|
|
2
|
+
export declare const SCREEN_IMAGE_MASK_CHANNELS: readonly ["alpha", "red", "green", "luminance"];
|
|
3
|
+
export type ScreenImageMaskChannel = (typeof SCREEN_IMAGE_MASK_CHANNELS)[number];
|
|
4
|
+
export declare const resolveMaskChannelIndex: (channel: ScreenImageMaskChannel | undefined) => number;
|
|
5
|
+
export declare const maskedVertexShader = "\nvarying vec2 vUv;\nvoid main(){vUv=uv;gl_Position=projectionMatrix*modelViewMatrix*vec4(position,1.0);}";
|
|
6
|
+
/**
|
|
7
|
+
* Image × mask. Both are sampled through the image's fit transform (repeat /
|
|
8
|
+
* offset / flips), so a mask authored in the image's own space — a camera
|
|
9
|
+
* frame and its segmentation mask — stays aligned under cover-cropping.
|
|
10
|
+
*/
|
|
11
|
+
export declare const maskedFragmentShader = "\nuniform sampler2D imageMap;uniform sampler2D maskMap;uniform mat3 mapTransform;\nuniform vec3 tint;uniform float opacity;uniform float alphaTest;uniform int maskChannel;uniform float maskInvert;\nuniform float maskFeather;uniform float maskErode;uniform vec2 maskTexel;\nvarying vec2 vUv;\nfloat coverageAt(vec2 uv){\nvec4 m=texture2D(maskMap,uv);\nfloat c=maskChannel==0?m.a:maskChannel==1?m.r:maskChannel==2?m.g:dot(m.rgb,vec3(0.299,0.587,0.114));\nreturn mix(c,1.0-c,maskInvert);}\nvoid main(){\nvec2 uv=(mapTransform*vec3(vUv,1.0)).xy;\nvec4 image=texture2D(imageMap,uv);\nfloat coverage;\nif(maskFeather>0.0){\nvec2 step=maskTexel*maskFeather;\ncoverage=0.0;\nfor(int y=-1;y<=1;y++){for(int x=-1;x<=1;x++){coverage+=coverageAt(uv+vec2(float(x),float(y))*step);}}\ncoverage/=9.0;\n// Erode: raise the threshold on the blurred edge so the silhouette shrinks\n// by up to the feather radius (maskErode is a fraction of that width).\ncoverage=smoothstep(clamp(maskErode,0.0,0.95),1.0,coverage);\n}else{coverage=coverageAt(uv);}\nfloat alpha=image.a*opacity*coverage;\nif(alpha<=alphaTest)discard;\ngl_FragColor=vec4(image.rgb*tint,alpha);\n#include <colorspace_fragment>\n}";
|
|
@@ -16,4 +16,10 @@ export declare const getScreenImageTextureSize: (texture: THREE.Texture) => {
|
|
|
16
16
|
width: number;
|
|
17
17
|
height: number;
|
|
18
18
|
};
|
|
19
|
+
/**
|
|
20
|
+
* Textures whose pixels change after upload: videos and any canvas-backed
|
|
21
|
+
* texture, including `OffscreenCanvas` sources such as the session camera
|
|
22
|
+
* feed. These need `needsUpdate` every frame to stay live.
|
|
23
|
+
*/
|
|
24
|
+
export declare const isDynamicScreenImageTexture: (texture: THREE.Texture) => boolean;
|
|
19
25
|
export declare const getScreenImageTextureAspect: (texture: THREE.Texture) => number;
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { ScreenAnchorEdges, ScreenOffsetEdges, ScreenTransformGuideLayer } from '../ScreenSpaceUI';
|
|
2
2
|
import { ScreenCanvasSize, ScreenCoordinateSpace, ScreenTransform2DSettings } from '../../screen2d';
|
|
3
3
|
import { ScreenImageFit, ScreenImageStretchMode } from './fit';
|
|
4
|
+
import { ScreenImageMaskChannel } from './materials/ScreenImageMaskMaterial';
|
|
4
5
|
import { ScreenImageSource } from './source';
|
|
5
6
|
import type * as THREE from "three";
|
|
6
7
|
export type ScreenImageMaterialType = "unlit" | "standardPBR" | "matcap";
|
|
@@ -27,6 +28,23 @@ export type ScreenImageProps = {
|
|
|
27
28
|
backdropTexture?: THREE.Texture | null;
|
|
28
29
|
opacity?: number;
|
|
29
30
|
color?: THREE.ColorRepresentation;
|
|
31
|
+
/**
|
|
32
|
+
* Alpha mask in the image's own texture space: it is sampled through the
|
|
33
|
+
* same fit / crop / flip transform as the image, so a camera frame and its
|
|
34
|
+
* segmentation mask stay aligned. Takes precedence over advanced blend modes.
|
|
35
|
+
*/
|
|
36
|
+
maskTexture?: THREE.Texture | null;
|
|
37
|
+
/** Channel of `maskTexture` that carries coverage. Default `"alpha"`. */
|
|
38
|
+
maskChannel?: ScreenImageMaskChannel;
|
|
39
|
+
/** Keep where the mask is 0 instead of 1. */
|
|
40
|
+
maskInvert?: boolean;
|
|
41
|
+
/** Soften mask edges: 3×3 blur radius in mask texels. 0 = hard. */
|
|
42
|
+
maskFeather?: number;
|
|
43
|
+
/**
|
|
44
|
+
* Shrink the kept region into the feathered edge, 0..1 of the feather
|
|
45
|
+
* width; removes fringe from the source. Needs `maskFeather` > 0.
|
|
46
|
+
*/
|
|
47
|
+
maskErode?: number;
|
|
30
48
|
flipX?: boolean;
|
|
31
49
|
flipY?: boolean;
|
|
32
50
|
renderOrder?: number;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
import { SemanticMask } from '../../segmentation2d/types';
|
|
3
|
+
import { SegmentationOverlaySettings } from './settings';
|
|
4
|
+
import * as THREE from "three";
|
|
5
|
+
export type SegmentationOverlayMaterialContext = {
|
|
6
|
+
cameraTexture: THREE.Texture | null;
|
|
7
|
+
/**
|
|
8
|
+
* Class-index texture (red channel, 0..255 → index); nearest-filtered.
|
|
9
|
+
* Re-allocated when the mask changes size; the factory is re-run with the
|
|
10
|
+
* new texture, so read it from the context rather than caching it.
|
|
11
|
+
*/
|
|
12
|
+
maskTexture: THREE.Texture;
|
|
13
|
+
/** Feed UV → mask UV, including the row flip, mirror and source cover-fit. */
|
|
14
|
+
maskTransform: THREE.Matrix3;
|
|
15
|
+
/** Class indices the overlay selects, resolved from `label` against the mask; empty until the mask has data. */
|
|
16
|
+
labelIndices: number[];
|
|
17
|
+
mask: SemanticMask | null;
|
|
18
|
+
settings: SegmentationOverlaySettings;
|
|
19
|
+
};
|
|
20
|
+
export type SegmentationOverlayMaterialSpec = ReactNode | THREE.Material | ((context: SegmentationOverlayMaterialContext) => ReactNode | THREE.Material);
|
|
21
|
+
export type SegmentationOverlayProps = Partial<SegmentationOverlaySettings> & {
|
|
22
|
+
/** The mask to draw from: a provider hook's result or your own `SemanticMask`. */
|
|
23
|
+
mask: SemanticMask | null;
|
|
24
|
+
/** Optional image multiplied into the paint, sampled in screen UV (cover of the viewport). */
|
|
25
|
+
texture?: THREE.Texture | string;
|
|
26
|
+
/** Custom material (node, instance, or factory). Replaces the built-in look. */
|
|
27
|
+
material?: SegmentationOverlayMaterialSpec;
|
|
28
|
+
/** Default: just above the video background. */
|
|
29
|
+
renderOrder?: number;
|
|
30
|
+
visible?: boolean;
|
|
31
|
+
};
|
|
32
|
+
/**
|
|
33
|
+
* Draw one or more semantic regions of a mask as a screen-aligned 2D layer,
|
|
34
|
+
* tinted and composited over the camera feed. Covers the viewport exactly
|
|
35
|
+
* like `VideoBackground`, so feed-space masks need no coordinate work.
|
|
36
|
+
*/
|
|
37
|
+
export declare const SegmentationOverlay: ({ mask, texture, material, renderOrder, visible, ...settingsInput }: SegmentationOverlayProps) => import("react/jsx-runtime").JSX.Element | null;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { SemanticMask } from '../../segmentation2d/types';
|
|
2
|
+
import { SegmentationOverlaySettings } from './settings';
|
|
3
|
+
import * as THREE from "three";
|
|
4
|
+
/** Up to this many labels can be selected by one overlay. */
|
|
5
|
+
export declare const MAX_OVERLAY_LABELS = 4;
|
|
6
|
+
export type SegmentationOverlayMaterialInputs = {
|
|
7
|
+
cameraTexture: THREE.Texture | null;
|
|
8
|
+
maskTexture: THREE.Texture;
|
|
9
|
+
mask: SemanticMask | null;
|
|
10
|
+
settings: SegmentationOverlaySettings;
|
|
11
|
+
/** Optional image sampled in screen UV and multiplied into the paint. */
|
|
12
|
+
designTexture?: THREE.Texture | null;
|
|
13
|
+
/** Feed (camera texture) size, for cover-fitting source-space masks. */
|
|
14
|
+
feedWidth?: number;
|
|
15
|
+
feedHeight?: number;
|
|
16
|
+
};
|
|
17
|
+
export declare const SEGMENTATION_OVERLAY_VERTEX_SHADER = "\nvarying vec2 vUv;\nvoid main() {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n}";
|
|
18
|
+
export declare const SEGMENTATION_OVERLAY_FRAGMENT_SHADER = "\nuniform sampler2D cameraTexture;\nuniform sampler2D maskTexture;\nuniform sampler2D designTexture;\nuniform float useDesign;\nuniform vec4 labels;\nuniform float labelCount;\nuniform float invert;\nuniform vec3 tint;\nuniform float opacity;\nuniform float blendMode;\nuniform float feather;\nuniform vec2 maskTexel;\nuniform mat3 maskTransform;\nvarying vec2 vUv;\n\nfloat member(vec2 uv) {\n if (uv.x < 0.0 || uv.x > 1.0 || uv.y < 0.0 || uv.y > 1.0) return 0.0;\n float index = floor(texture2D(maskTexture, uv).r * 255.0 + 0.5);\n float m = 0.0;\n if (labelCount > 0.5 && abs(index - labels.x) < 0.5) m = 1.0;\n if (labelCount > 1.5 && abs(index - labels.y) < 0.5) m = 1.0;\n if (labelCount > 2.5 && abs(index - labels.z) < 0.5) m = 1.0;\n if (labelCount > 3.5 && abs(index - labels.w) < 0.5) m = 1.0;\n return invert > 0.5 ? 1.0 - m : m;\n}\n\nvoid main() {\n vec2 maskUv = (maskTransform * vec3(vUv, 1.0)).xy;\n float coverage;\n if (feather > 0.0) {\n vec2 step = maskTexel * feather;\n coverage = 0.0;\n for (int y = -1; y <= 1; y++) {\n for (int x = -1; x <= 1; x++) {\n coverage += member(maskUv + vec2(float(x), float(y)) * step);\n }\n }\n coverage /= 9.0;\n } else {\n coverage = member(maskUv);\n }\n\n vec3 base = texture2D(cameraTexture, vUv).rgb;\n vec4 design = useDesign > 0.5 ? texture2D(designTexture, vUv) : vec4(1.0);\n vec3 paint = tint * design.rgb;\n vec3 blended = blendMode < 0.5\n ? paint\n : blendMode < 1.5\n ? base * paint\n : blendMode < 2.5\n ? 1.0 - (1.0 - base) * (1.0 - paint)\n : mix(2.0 * base * paint, 1.0 - 2.0 * (1.0 - base) * (1.0 - paint), step(0.5, base));\n\n gl_FragColor = vec4(blended, coverage * opacity * design.a);\n #include <colorspace_fragment>\n}";
|
|
19
|
+
/** The built-in overlay material as a plain three.js object (shareable across meshes). */
|
|
20
|
+
export declare const createSegmentationOverlayMaterial: () => THREE.ShaderMaterial;
|
|
21
|
+
/** Resolve the selected labels to class indices for a mask (unknown labels are skipped). */
|
|
22
|
+
export declare const resolveOverlayLabelIndices: (mask: Pick<SemanticMask, "labels"> | null, label: string | readonly string[]) => number[];
|
|
23
|
+
/**
|
|
24
|
+
* The class indices an overlay should draw right now: the resolved labels,
|
|
25
|
+
* or none while the mask is still at `version` 0 (no data yet). Shared by
|
|
26
|
+
* the built-in material and the custom-material context so both agree.
|
|
27
|
+
*/
|
|
28
|
+
export declare const resolveActiveOverlayLabelIndices: (mask: SemanticMask | null, label: string | readonly string[]) => number[];
|
|
29
|
+
export declare const updateSegmentationOverlayMaterial: (material: THREE.ShaderMaterial, { cameraTexture, maskTexture, mask, settings, designTexture, feedWidth, feedHeight, }: SegmentationOverlayMaterialInputs) => THREE.ShaderMaterial;
|
|
30
|
+
/** Own one overlay material and keep it in sync with the inputs on every render. */
|
|
31
|
+
export declare const useSegmentationOverlayMaterial: (inputs: SegmentationOverlayMaterialInputs) => THREE.ShaderMaterial;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export { SegmentationOverlay } from './SegmentationOverlay';
|
|
2
|
+
export type { SegmentationOverlayMaterialContext, SegmentationOverlayMaterialSpec, SegmentationOverlayProps, } from './SegmentationOverlay';
|
|
3
|
+
export { MAX_OVERLAY_LABELS, SEGMENTATION_OVERLAY_FRAGMENT_SHADER, SEGMENTATION_OVERLAY_VERTEX_SHADER, createSegmentationOverlayMaterial, resolveActiveOverlayLabelIndices, resolveOverlayLabelIndices, updateSegmentationOverlayMaterial, useSegmentationOverlayMaterial, } from './SegmentationOverlayMaterial';
|
|
4
|
+
export type { SegmentationOverlayMaterialInputs } from './SegmentationOverlayMaterial';
|
|
5
|
+
export { createSemanticMaskTexture, uploadSemanticMask, useSemanticMaskTexture, } from './maskTexture';
|
|
6
|
+
export { PERSON_MASK_LABELS, resolveMaskSize, useFaceRegionMask, useHairMask, usePersonMask, useSemanticSegmentationMask, } from './providers';
|
|
7
|
+
export type { SemanticSegmentationMaskResult, UseFaceRegionMaskOptions, UsePersonMaskOptions, UseSemanticSegmentationMaskOptions, } from './providers';
|
|
8
|
+
export { DEFAULT_SEGMENTATION_OVERLAY_SETTINGS, SEGMENTATION_OVERLAY_BLEND_MODES, SEGMENTATION_OVERLAY_SETTINGS_FIELDS, parseOverlayLabels, patchSegmentationOverlaySettings, resolveSegmentationOverlaySettings, } from './settings';
|
|
9
|
+
export type { SegmentationOverlayBlendMode, SegmentationOverlaySettings } from './settings';
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { SemanticMask } from '../../segmentation2d/types';
|
|
2
|
+
import * as THREE from "three";
|
|
3
|
+
/** One red byte per pixel holding the class index; nearest filtering keeps classes crisp. */
|
|
4
|
+
export declare const createSemanticMaskTexture: (width?: number, height?: number) => THREE.DataTexture;
|
|
5
|
+
/**
|
|
6
|
+
* Copy a mask into the texture, re-allocating when its size changed. Returns
|
|
7
|
+
* the texture to use (a new one when re-allocated; dispose the old one).
|
|
8
|
+
*/
|
|
9
|
+
export declare const uploadSemanticMask: (texture: THREE.DataTexture, mask: SemanticMask) => THREE.DataTexture;
|
|
10
|
+
type Uploaded = {
|
|
11
|
+
texture: THREE.DataTexture;
|
|
12
|
+
version: number;
|
|
13
|
+
mask: SemanticMask | null;
|
|
14
|
+
};
|
|
15
|
+
/**
|
|
16
|
+
* Keep a GPU copy of a mask in sync with its `version`. The returned holder
|
|
17
|
+
* is stable; call `sync()` once per frame (or render) before drawing.
|
|
18
|
+
*/
|
|
19
|
+
export declare const useSemanticMaskTexture: (mask: SemanticMask | null) => {
|
|
20
|
+
holder: Uploaded;
|
|
21
|
+
sync: () => THREE.DataTexture;
|
|
22
|
+
};
|
|
23
|
+
export {};
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { FaceRegionLabel } from '../../segmentation2d/faceRegions';
|
|
2
|
+
import { SemanticMask } from '../../segmentation2d/types';
|
|
3
|
+
import { SemanticSegmentationModelOptions, SemanticSegmentationStatus } from '../../types/segmentation';
|
|
4
|
+
/** Mask size for a long edge, keeping the feed's aspect ratio. */
|
|
5
|
+
export declare const resolveMaskSize: (feed: {
|
|
6
|
+
width: number;
|
|
7
|
+
height: number;
|
|
8
|
+
}, longEdge: number) => {
|
|
9
|
+
width: number;
|
|
10
|
+
height: number;
|
|
11
|
+
};
|
|
12
|
+
export type UseFaceRegionMaskOptions = {
|
|
13
|
+
/** Which face, or `"all"` to stack every tracked face into one mask. Default `"all"`. */
|
|
14
|
+
faceIndex?: number | "all";
|
|
15
|
+
/** Only rasterize these regions. Default: all of `FACE_REGION_LABELS`. */
|
|
16
|
+
regions?: readonly FaceRegionLabel[];
|
|
17
|
+
/** Mask long edge in pixels. Default 256. */
|
|
18
|
+
resolution?: number;
|
|
19
|
+
/** Cap how often the mask is re-rasterized. Omit for every frame. */
|
|
20
|
+
maxUpdateFps?: number;
|
|
21
|
+
/**
|
|
22
|
+
* Keep a face's last mask for this long (ms) when the tracker drops it,
|
|
23
|
+
* bridging the brief dropouts small or fast faces cause. Default 250,
|
|
24
|
+
* matching `useFaceInfos`. 0 clears the mask on the first missing frame.
|
|
25
|
+
*/
|
|
26
|
+
holdMs?: number;
|
|
27
|
+
/**
|
|
28
|
+
* While a face is held, move it along its last velocity for up to this
|
|
29
|
+
* long (ms) so the mask keeps up with a moving subject. Default 0.
|
|
30
|
+
*/
|
|
31
|
+
predictMs?: number;
|
|
32
|
+
};
|
|
33
|
+
/**
|
|
34
|
+
* A semantic mask of `face_skin`, `brows`, `eyes`, `lips` and `mouth`
|
|
35
|
+
* rasterized from the face tracker's landmarks every frame. The returned
|
|
36
|
+
* object is stable and mutated in place; its `version` changes on updates.
|
|
37
|
+
* Requires a face tracker in the session.
|
|
38
|
+
*/
|
|
39
|
+
export declare const useFaceRegionMask: ({ faceIndex, regions, resolution, maxUpdateFps, holdMs, predictMs, }?: UseFaceRegionMaskOptions) => SemanticMask;
|
|
40
|
+
export declare const PERSON_MASK_LABELS: readonly ["bg", "person"];
|
|
41
|
+
export type UsePersonMaskOptions = {
|
|
42
|
+
/** Cap how often the mask is read back from the GPU. Default 15. */
|
|
43
|
+
maxUpdateFps?: number;
|
|
44
|
+
/** Keep the segmentation model running. Default true. */
|
|
45
|
+
active?: boolean;
|
|
46
|
+
};
|
|
47
|
+
/**
|
|
48
|
+
* The SDK's portrait segmentation as a semantic mask (`bg` / `person`) in
|
|
49
|
+
* feed space. Acquires the segmentation model itself. Each update is a
|
|
50
|
+
* GPU→CPU readback, so it is rate-limited by default.
|
|
51
|
+
*/
|
|
52
|
+
export declare const usePersonMask: ({ maxUpdateFps, active, }?: UsePersonMaskOptions) => SemanticMask;
|
|
53
|
+
export type UseSemanticSegmentationMaskOptions = SemanticSegmentationModelOptions & {
|
|
54
|
+
/** Keep the model running. Default true. */
|
|
55
|
+
active?: boolean;
|
|
56
|
+
};
|
|
57
|
+
export type SemanticSegmentationMaskResult = {
|
|
58
|
+
/** Stable mask in feed space; `version` stays 0 until the first inference. */
|
|
59
|
+
mask: SemanticMask;
|
|
60
|
+
status: SemanticSegmentationStatus;
|
|
61
|
+
error: Error | null;
|
|
62
|
+
labels: readonly string[];
|
|
63
|
+
};
|
|
64
|
+
/**
|
|
65
|
+
* A category-segmentation mask from `XRModel.SEMANTIC_SEGMENTATION` (hair or
|
|
66
|
+
* multiclass). Acquires the model itself; the first acquirer in a session
|
|
67
|
+
* picks the preset and model URL. The mask is produced on the model's own
|
|
68
|
+
* loop at its `targetFps` (15 by default), so no extra throttle is needed.
|
|
69
|
+
*/
|
|
70
|
+
export declare const useSemanticSegmentationMask: ({ active, ...modelOptions }?: UseSemanticSegmentationMaskOptions) => SemanticSegmentationMaskResult;
|
|
71
|
+
/** MediaPipe Hair Segmenter as a `bg` / `hair` mask in feed space. */
|
|
72
|
+
export declare const useHairMask: (options?: Omit<UseSemanticSegmentationMaskOptions, "preset">) => SemanticSegmentationMaskResult;
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
export declare const SEGMENTATION_OVERLAY_BLEND_MODES: readonly ["normal", "multiply", "screen", "overlay"];
|
|
2
|
+
export type SegmentationOverlayBlendMode = (typeof SEGMENTATION_OVERLAY_BLEND_MODES)[number];
|
|
3
|
+
/** Serializable look of a `SegmentationOverlay`. */
|
|
4
|
+
export type SegmentationOverlaySettings = {
|
|
5
|
+
/** Region label to show (comma-separate several, e.g. `"lips,mouth"`). */
|
|
6
|
+
label: string;
|
|
7
|
+
/** Show everything except the selected labels. */
|
|
8
|
+
invert: boolean;
|
|
9
|
+
color: string;
|
|
10
|
+
opacity: number;
|
|
11
|
+
/** How the paint combines with the camera pixels underneath. */
|
|
12
|
+
blendMode: SegmentationOverlayBlendMode;
|
|
13
|
+
/** Edge feather radius in mask texels (0 = hard class edges). */
|
|
14
|
+
feather: number;
|
|
15
|
+
/** Flip the mask horizontally (source-space masks on a mirrored feed). */
|
|
16
|
+
mirrored: boolean;
|
|
17
|
+
};
|
|
18
|
+
export declare const DEFAULT_SEGMENTATION_OVERLAY_SETTINGS: SegmentationOverlaySettings;
|
|
19
|
+
export declare const resolveSegmentationOverlaySettings: (input?: Partial<SegmentationOverlaySettings>) => SegmentationOverlaySettings;
|
|
20
|
+
export declare const patchSegmentationOverlaySettings: (current: SegmentationOverlaySettings, patch: Partial<SegmentationOverlaySettings>) => SegmentationOverlaySettings;
|
|
21
|
+
/** Split a `label` setting into the individual labels it names. */
|
|
22
|
+
export declare const parseOverlayLabels: (label: string | readonly string[]) => string[];
|
|
23
|
+
export declare const SEGMENTATION_OVERLAY_SETTINGS_FIELDS: [{
|
|
24
|
+
readonly key: "label";
|
|
25
|
+
readonly label: "Region";
|
|
26
|
+
readonly type: "select";
|
|
27
|
+
readonly options: {
|
|
28
|
+
label: "bg" | "brows" | "eyes" | "face_skin" | "hair" | "lips" | "mouth" | "person";
|
|
29
|
+
value: "bg" | "brows" | "eyes" | "face_skin" | "hair" | "lips" | "mouth" | "person";
|
|
30
|
+
}[];
|
|
31
|
+
}, {
|
|
32
|
+
readonly key: "invert";
|
|
33
|
+
readonly label: "Invert selection";
|
|
34
|
+
readonly type: "boolean";
|
|
35
|
+
}, {
|
|
36
|
+
readonly key: "color";
|
|
37
|
+
readonly label: "Color";
|
|
38
|
+
readonly type: "color";
|
|
39
|
+
}, {
|
|
40
|
+
readonly key: "opacity";
|
|
41
|
+
readonly label: "Opacity";
|
|
42
|
+
readonly type: "number";
|
|
43
|
+
readonly min: 0;
|
|
44
|
+
readonly max: 1;
|
|
45
|
+
readonly step: 0.01;
|
|
46
|
+
}, {
|
|
47
|
+
readonly key: "blendMode";
|
|
48
|
+
readonly label: "Blend";
|
|
49
|
+
readonly type: "select";
|
|
50
|
+
readonly options: {
|
|
51
|
+
label: "multiply" | "overlay" | "screen" | "normal";
|
|
52
|
+
value: "multiply" | "overlay" | "screen" | "normal";
|
|
53
|
+
}[];
|
|
54
|
+
}, {
|
|
55
|
+
readonly key: "feather";
|
|
56
|
+
readonly label: "Feather (texels)";
|
|
57
|
+
readonly type: "number";
|
|
58
|
+
readonly min: 0;
|
|
59
|
+
readonly max: 8;
|
|
60
|
+
readonly step: 0.5;
|
|
61
|
+
}, {
|
|
62
|
+
readonly key: "mirrored";
|
|
63
|
+
readonly label: "Mirror mask";
|
|
64
|
+
readonly type: "boolean";
|
|
65
|
+
}];
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { PropsWithChildren } from 'react';
|
|
2
|
+
import { CanonicalOffset } from '../HeadOccluder/useLandmarkPoseFit';
|
|
3
|
+
import { CanonicalTorsoFitOptions } from './useCanonicalTorsoFit';
|
|
4
|
+
export { CANONICAL_TORSO_FIT_DEFAULT_SMOOTHING, useCanonicalTorsoFit, } from './useCanonicalTorsoFit';
|
|
5
|
+
export type { CanonicalTorsoFitOptions } from './useCanonicalTorsoFit';
|
|
6
|
+
/** The canonical-frame shoulder / upper-torso mesh. */
|
|
7
|
+
export declare const SHOULDER_OCCLUDER_V1_PATH = "/assets/xr/3d-models/shoulder-occluder-v1.glb";
|
|
8
|
+
export declare const SHOULDER_OCCLUDER_DEFAULT_OPACITY = 1;
|
|
9
|
+
export declare const shoulderOccluderUrl: () => string;
|
|
10
|
+
export type ShoulderOccluderProps = {
|
|
11
|
+
/** Which tracked body feeds the fit. Matches the parent `BodyTracker`'s `bodyIndex`. */
|
|
12
|
+
bodyIndex?: number;
|
|
13
|
+
/** Adjustments on top of the fit, in torso centimetres. */
|
|
14
|
+
offset?: CanonicalOffset;
|
|
15
|
+
/** Override the mesh. The fit expects a torso-frame mesh. */
|
|
16
|
+
url?: string;
|
|
17
|
+
/** Draw the mesh visibly (calibration). Production keeps it depth-only. */
|
|
18
|
+
showDebugMaterial?: boolean;
|
|
19
|
+
opacity?: number;
|
|
20
|
+
/** Per-frame EMA factor for the fitted pose, `1` = no smoothing. */
|
|
21
|
+
smoothing?: number;
|
|
22
|
+
onFit?: CanonicalTorsoFitOptions["onFit"];
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Depth-only shoulder and upper-torso mesh under a `BodyTracker`, so
|
|
26
|
+
* accessories around the neck and shoulders (necklaces, scarves, straps,
|
|
27
|
+
* wings, capes) pass behind the body. Same contract as `HeadOccluder`:
|
|
28
|
+
* `colorWrite: false`, `depthWrite: true`, `renderOrder: -1`,
|
|
29
|
+
* `frustumCulled: false`, fitted every frame from the two shoulder
|
|
30
|
+
* landmarks only (selfie mode; nothing below them is read). Mount it beside a `HeadBinding` / `HeadOccluder` for a full
|
|
31
|
+
* head-and-shoulders occluder; the two necks overlap on purpose.
|
|
32
|
+
*/
|
|
33
|
+
export declare const ShoulderOccluder: ({ bodyIndex, offset, url, showDebugMaterial, opacity, smoothing, onFit, }: ShoulderOccluderProps) => import("react/jsx-runtime").JSX.Element | null;
|
|
34
|
+
export type CanonicalTorsoFrameProps = PropsWithChildren<CanonicalTorsoFitOptions>;
|
|
35
|
+
/**
|
|
36
|
+
* A group, inside a `BodyTracker`, whose children are authored in torso
|
|
37
|
+
* centimetres: origin between the shoulder joints, +X screen right (the
|
|
38
|
+
* person's right in the mirrored selfie view), +Y up, +Z toward the camera;
|
|
39
|
+
* shoulders at `x = ±18`. Fitted with
|
|
40
|
+
* the same solver as `ShoulderOccluder`, so a necklace placed here sits where
|
|
41
|
+
* the occluder expects it.
|
|
42
|
+
*/
|
|
43
|
+
export declare const CanonicalTorsoFrame: ({ children, ...options }: CanonicalTorsoFrameProps) => import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { MutableRefObject } from 'react';
|
|
2
|
+
import { CanonicalOffset, LandmarkPoseFit } from '../HeadOccluder/useLandmarkPoseFit';
|
|
3
|
+
import * as THREE from "three";
|
|
4
|
+
export type CanonicalTorsoFitOptions = {
|
|
5
|
+
/** Which tracked body feeds the fit. Matches the parent `BodyTracker`'s `bodyIndex`. */
|
|
6
|
+
bodyIndex?: number;
|
|
7
|
+
offset?: CanonicalOffset;
|
|
8
|
+
/** Per-frame EMA factor for the fitted pose, `1` = no smoothing. */
|
|
9
|
+
smoothing?: number;
|
|
10
|
+
enabled?: boolean;
|
|
11
|
+
onFit?: (fit: LandmarkPoseFit) => void;
|
|
12
|
+
/** Fires once on body found (`true`) and once on body lost (`false`). */
|
|
13
|
+
onTrackingChange?: (tracked: boolean) => void;
|
|
14
|
+
};
|
|
15
|
+
export declare const CANONICAL_TORSO_FIT_DEFAULT_SMOOTHING = 0.5;
|
|
16
|
+
/**
|
|
17
|
+
* Drives `target` (a child of a `BodyTracker` group) with the canonical torso
|
|
18
|
+
* pose from the two shoulder joints: scale from their distance, roll from the
|
|
19
|
+
* line between them, yaw from their depth difference, no pitch. Nothing below
|
|
20
|
+
* the shoulders is read (selfie mode: the hips are out of frame and their
|
|
21
|
+
* predicted positions inflated the torso at close range). Written as a local
|
|
22
|
+
* transform re-expressed in the parent's frame, like the head fit.
|
|
23
|
+
*/
|
|
24
|
+
export declare const useCanonicalTorsoFit: (target: MutableRefObject<THREE.Object3D | null>, { bodyIndex, offset, smoothing, enabled, onFit, onTrackingChange, }?: CanonicalTorsoFitOptions) => void;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { Euler, Vector3 } from '@react-three/fiber';
|
|
2
|
+
import { ReactNode } from 'react';
|
|
3
|
+
import { SpringSwingOptions } from '../../spring/swing';
|
|
4
|
+
export type SpringSwingProps = SpringSwingOptions & {
|
|
5
|
+
/** False: the children hang still at rest. Default true. */
|
|
6
|
+
enabled?: boolean;
|
|
7
|
+
/** The pivot in the parent (the children swing about it). */
|
|
8
|
+
position?: Vector3;
|
|
9
|
+
/** Turns the rest direction (the children hang along this group's −Y). */
|
|
10
|
+
rotation?: Euler;
|
|
11
|
+
children?: ReactNode;
|
|
12
|
+
};
|
|
13
|
+
/**
|
|
14
|
+
* Its children swing about its origin, hanging along its own −Y, as
|
|
15
|
+
* whatever it sits in moves and turns, then settle: drop earrings,
|
|
16
|
+
* pendants, charms. `frequency`, `damping`, `maxAngle` and `length` set the
|
|
17
|
+
* feel (gentle jewellery by default). The rest direction is the parent's own
|
|
18
|
+
* down, so a tilt of the head tilts them too; only motion swings them. It
|
|
19
|
+
* swings from the pose it is drawn at (the scene's before-render hook) and
|
|
20
|
+
* rests while hidden.
|
|
21
|
+
*/
|
|
22
|
+
export declare const SpringSwing: ({ enabled, position, rotation, children, ...options }: SpringSwingProps) => import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { SpringSwing, type SpringSwingProps } from './SpringSwing';
|
|
@@ -1,13 +1,27 @@
|
|
|
1
1
|
import { PropsWithChildren } from 'react';
|
|
2
2
|
import { SessionFacade } from '../../hooks/useXRSession';
|
|
3
|
-
import { XRPerfConfig } from '../../types';
|
|
3
|
+
import { XRLifecycleConfig, XRPerfConfig } from '../../types';
|
|
4
|
+
import { XRQualityConfigInput } from '../../quality/types';
|
|
4
5
|
export type XRContextType = {
|
|
5
6
|
session: SessionFacade;
|
|
6
7
|
};
|
|
7
8
|
export declare const useXRContext: () => XRContextType;
|
|
9
|
+
/** The session facade when inside an `<XRProvider>`, else `null` (for components that work with or without a session). */
|
|
10
|
+
export declare const useOptionalXRContext: () => XRContextType | null;
|
|
8
11
|
export type XRProviderProps = PropsWithChildren<{
|
|
9
12
|
/** Performance config: cap ML inference fps and camera resolution to reduce
|
|
10
13
|
* GPU/CPU load and heat. See {@link XRPerfConfig}. */
|
|
11
14
|
perf?: XRPerfConfig;
|
|
15
|
+
/** Lifecycle behaviour (pause while hidden). See {@link XRLifecycleConfig}. */
|
|
16
|
+
lifecycle?: XRLifecycleConfig;
|
|
17
|
+
/**
|
|
18
|
+
* Adaptive quality. ON by default with `DEFAULT_QUALITY_TIERS` and
|
|
19
|
+
* `DEFAULT_PERFORMANCE_BUDGET`: tracker fps, analysis resolution and the
|
|
20
|
+
* render pixel ratio step down under load and back up when it clears.
|
|
21
|
+
* Pass a partial config ({@link XRQualityConfigInput}) to customise (tiers, budget,
|
|
22
|
+
* bounds, `adaptive: false` to pin), or `false` to mount no controller
|
|
23
|
+
* (mount `<XRQualityController>` yourself, or manage `perf` by hand).
|
|
24
|
+
*/
|
|
25
|
+
quality?: XRQualityConfigInput | false;
|
|
12
26
|
}>;
|
|
13
|
-
export declare const XRProvider: ({ children, perf }: XRProviderProps) => import("react/jsx-runtime").JSX.Element;
|
|
27
|
+
export declare const XRProvider: ({ children, perf, lifecycle, quality }: XRProviderProps) => import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import * as THREE from "three";
|
|
2
|
+
/**
|
|
3
|
+
* The render target `XRScene` captures the scene into for `renderOutputs`
|
|
4
|
+
* (scene colour and/or depth). It has a stencil buffer, as the canvas does:
|
|
5
|
+
* the captured frame must match the screen, and face effects use stencil
|
|
6
|
+
* bits (the mouth cut-out 0x01, the face surface's self-occlusion 0x80).
|
|
7
|
+
* With `sceneDepth` a depth texture replaces the depth renderbuffer, so it
|
|
8
|
+
* carries the stencil too (DEPTH24_STENCIL8); sampling it still reads depth.
|
|
9
|
+
*/
|
|
10
|
+
export declare const createXRSceneRenderOutputTarget: (width: number, height: number, { sceneDepth }?: {
|
|
11
|
+
sceneDepth?: boolean;
|
|
12
|
+
}) => THREE.WebGLRenderTarget;
|
|
@@ -9,5 +9,5 @@ export declare const useViewportExternalFaces: ({ enabled, selectedSource, }: {
|
|
|
9
9
|
selectedSource: CalibrationMediaSourceKind;
|
|
10
10
|
}) => {
|
|
11
11
|
faces: import('../../../types').FaceTrackingResult[];
|
|
12
|
-
trackerStatus: "
|
|
12
|
+
trackerStatus: "ready" | "idle";
|
|
13
13
|
};
|
|
@@ -11,6 +11,6 @@ export declare const useViewportMediaSource: ({ enabled, imageAsset, selectedSou
|
|
|
11
11
|
imageRef: import('react').RefObject<HTMLImageElement>;
|
|
12
12
|
stream: MediaStream | null;
|
|
13
13
|
mediaSize: XRViewportSize;
|
|
14
|
-
status: "
|
|
14
|
+
status: "ready" | "error" | "requesting" | "idle";
|
|
15
15
|
error: string | null;
|
|
16
16
|
};
|
|
@@ -24,7 +24,7 @@ export declare const useViewportPipeline: ({ fitMode, imageOptions, initialImage
|
|
|
24
24
|
imageRef: import('react').RefObject<HTMLImageElement>;
|
|
25
25
|
stream: MediaStream | null;
|
|
26
26
|
mediaSize: import('..').XRViewportSize;
|
|
27
|
-
status: "
|
|
27
|
+
status: "ready" | "error" | "requesting" | "idle";
|
|
28
28
|
error: string | null;
|
|
29
29
|
};
|
|
30
30
|
renderOutputState: import('..').XRViewportRenderOutputs;
|
|
@@ -5,9 +5,15 @@ export * from './FaceTracker';
|
|
|
5
5
|
export * from './FaceMesh';
|
|
6
6
|
export * from './FaceRetouch';
|
|
7
7
|
export * from './FaceWarp3D';
|
|
8
|
+
export * from './FaceInset';
|
|
9
|
+
export * from './FaceLiquify';
|
|
10
|
+
export * from './Faceless';
|
|
8
11
|
export * from './GestureTracker';
|
|
12
|
+
export * from './GestureListener';
|
|
9
13
|
export * from './GestureTrigger';
|
|
10
14
|
export * from './HandTracker';
|
|
15
|
+
export * from './IrisEffect';
|
|
16
|
+
export * from './HolisticTracker';
|
|
11
17
|
export * from './HandTracking3D';
|
|
12
18
|
export * from './HandTracking2DController';
|
|
13
19
|
export * from './HandTracking2D';
|
|
@@ -15,11 +21,16 @@ export * from './HandJoints2D';
|
|
|
15
21
|
export * from './HeadBinding';
|
|
16
22
|
export * from './HeadBindingOccluder';
|
|
17
23
|
export * from './HeadOccluder';
|
|
24
|
+
export * from './ShoulderOccluder';
|
|
25
|
+
export * from './SpringSwing';
|
|
26
|
+
export * from './Necklace';
|
|
27
|
+
export * from './HairLock';
|
|
18
28
|
export * from './MeshRenderer';
|
|
19
29
|
export * from './LightObject';
|
|
20
30
|
export * from './LookAt';
|
|
21
31
|
export * from './Panel';
|
|
22
32
|
export * from './PinToMesh';
|
|
33
|
+
export * from './ParticleEmitter';
|
|
23
34
|
export * from './PerspectiveCamera';
|
|
24
35
|
export * from './RenderGroupLayer';
|
|
25
36
|
export * from './ScreenImage';
|
package/dist/config/index.d.ts
CHANGED
|
@@ -8,7 +8,10 @@ export declare enum XRModel {
|
|
|
8
8
|
GESTURE_TRACKER = "vincentt.xr.gesture-tracker",
|
|
9
9
|
FACE_TRACKER = "vincentt.xr.face-tracker",
|
|
10
10
|
BODY_TRACKER = "vincentt.xr.body-tracker",
|
|
11
|
-
|
|
11
|
+
/** One MediaPipe Holistic inference for face + both hands + pose (single person). */
|
|
12
|
+
HOLISTIC_TRACKER = "vincentt.xr.holistic-tracker",
|
|
13
|
+
BACKGROUND_SEGMENTATION = "vincentt.xr.background-segmentation",
|
|
14
|
+
SEMANTIC_SEGMENTATION = "vincentt.xr.semantic-segmentation"
|
|
12
15
|
}
|
|
13
16
|
export declare enum XRComponentEnum {
|
|
14
17
|
CAMERA = "vincentt.component.camera",
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { createContext as t, useContext as c } from "react";
|
|
2
|
+
const n = t(null), o = () => {
|
|
3
|
+
const e = c(n);
|
|
4
|
+
if (!e)
|
|
5
|
+
throw new Error("useScreenSpace must be used within ScreenSpaceUI");
|
|
6
|
+
return e;
|
|
7
|
+
}, s = t(null), a = () => c(s) ?? 1;
|
|
8
|
+
export {
|
|
9
|
+
s as S,
|
|
10
|
+
a,
|
|
11
|
+
n as b,
|
|
12
|
+
o as u
|
|
13
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";const e=require("react"),c=e.createContext(null),s=()=>{const t=e.useContext(c);if(!t)throw new Error("useScreenSpace must be used within ScreenSpaceUI");return t},n=e.createContext(null),r=()=>e.useContext(n)??1;exports.ScreenRectAspectContext=n;exports.ScreenSpaceContext=c;exports.useScreenRectAspect=r;exports.useScreenSpace=s;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var Ee=Object.defineProperty;var Te=(e,t,n)=>t in e?Ee(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n;var O=(e,t,n)=>Te(e,typeof t!="symbol"?t+"":t,n);const B=require("react/jsx-runtime"),ae=require("@react-three/fiber"),C=require("react"),Ae=require("three"),fe=require("./uv-BMFt19bg.cjs"),K=require("./selectors-C4X71aoD.cjs"),ue=require("./index-CfSF8LXa.cjs"),se=require("./context-hA0Rb2Xa.cjs");function Me(e){const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const n in e)if(n!=="default"){const a=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(t,n,a.get?a:{enumerable:!0,get:()=>e[n]})}}return t.default=e,Object.freeze(t)}const j=Me(Ae),xe={display:"flex",alignItems:"center",justifyContent:"center",height:"100%",background:"#363636",color:"white",fontFamily:"monospace"},Ce=()=>B.jsx("div",{style:xe,children:"Loading..."}),Fe=e=>B.jsx("div",{style:xe,children:e.error}),ke=(e,t,{sceneDepth:n=!1}={})=>{const a=new j.WebGLRenderTarget(e,t,{colorSpace:j.SRGBColorSpace,depthBuffer:!0,stencilBuffer:!0});return n&&(a.depthTexture=new j.DepthTexture(e,t),a.depthTexture.format=j.DepthStencilFormat,a.depthTexture.type=j.UnsignedInt248Type),a},Ie=e=>typeof e=="number"?e:Array.isArray(e)?e[1]:3,le={position:"absolute",top:0,left:0,width:"100%",height:"100%",zIndex:10},ce={sceneColorTexture:null,sceneDepthTexture:null},Le=e=>{const t=K.useXRQualityState(),a=K.useXRQualityConfig()?(t==null?void 0:t.decision.tier.renderScale)??1:1,r=typeof window<"u"&&window.devicePixelRatio||1;return Math.max(.5,Math.min(r,e)*a)},Xe=({onRenderOutputs:e,renderOutputs:t,size:n})=>{const{gl:a,scene:r,size:i}=ae.useThree(),{session:c}=ue.useXRContext(),o=Math.max(1,Math.round((n==null?void 0:n.width)??i.width)),h=Math.max(1,Math.round((n==null?void 0:n.height)??i.height)),f=!!(t.sceneColor||t.sceneDepth),s=C.useMemo(()=>f?ke(o,h,{sceneDepth:!!t.sceneDepth}):null,[f,h,t.sceneDepth,o]);return C.useEffect(()=>{if(!s){e==null||e(ce);return}return e==null||e({sceneColorTexture:t.sceneColor?s.texture:null,sceneDepthTexture:t.sceneDepth&&s.depthTexture?s.depthTexture:null}),()=>{var l;s.dispose(),(l=s.depthTexture)==null||l.dispose(),e==null||e(ce)}},[e,t.sceneColor,t.sceneDepth,s]),ae.useFrame(()=>{if(!s)return;const l=[];t.excludeScreenUI!==!1&&r.traverse(u=>{u.visible&&u.renderOrder>=fe.RENDER_LAYERS.SCREEN_UI&&(l.push(u),u.visible=!1)});const p=a.getRenderTarget(),m=a.xr.enabled;a.xr.enabled=!1,a.setRenderTarget(s),a.clear(),c._renderFrame(),a.setRenderTarget(p),a.xr.enabled=m,l.forEach(u=>{u.visible=!0})},-100),null},Be=({style:e,canvasProps:t,children:n,loadingComponent:a,loadingTransitionDuration:r,errorComponent:i,renderTargetSize:c,renderOutputs:o={},onRenderOutputs:h})=>{const f=C.useRef(null),s=C.useRef(null),l=C.useRef(null),p=C.useRef(!1),m=Le(Ie(t==null?void 0:t.dpr)),{session:u}=ue.useXRContext(),x=K.useXRReady(),d=K.useXRError(),[g,R]=C.useState(!0);return C.useEffect(()=>{if(c){u._setRenderSize(Math.round(c.width),Math.round(c.height));return}const v=(E,F)=>{E<=0||F<=0||u._setRenderSize(Math.round(E),Math.round(F))},A=()=>{!s.current||p.current||(p.current=!0,u._setRenderTarget(s.current))},S=(E,F)=>{l.current!==null&&cancelAnimationFrame(l.current),l.current=requestAnimationFrame(()=>{l.current=null,v(E,F)})},y=new ResizeObserver(E=>{const F=E[0];if(!F)return;const{width:L,height:G}=F.contentRect;A(),S(L,G)});return f.current&&y.observe(f.current),A(),()=>{y.disconnect(),l.current!==null&&(cancelAnimationFrame(l.current),l.current=null),p.current=!1}},[c,u]),C.useEffect(()=>{x&&(r?setTimeout(()=>{R(!1)},r):R(!1))},[x,r]),B.jsxs("div",{id:"vincentt-xr-container",ref:f,style:{width:"100%",height:"100%",...e,position:"relative"},children:[g&&B.jsx("div",{style:le,children:a||B.jsx(Ce,{})}),d&&B.jsx("div",{style:le,children:i||B.jsx(Fe,{error:d.message})}),B.jsxs(ae.Canvas,{id:"vincentt-xr-canvas",ref:s,gl:{alpha:!0,preserveDrawingBuffer:!1,antialias:!0,stencil:!0,premultipliedAlpha:!1,toneMapping:j.NoToneMapping},...t,dpr:m,onCreated:v=>{c?u._setRenderSize(Math.round(c.width),Math.round(c.height)):u._setRenderTarget(s.current),u._setR3FState({renderer:v.gl,scene:v.scene,camera:v.camera}),v.gl.outputColorSpace=j.SRGBColorSpace,t!=null&&t.onCreated&&t.onCreated(v)},children:[B.jsx(Xe,{onRenderOutputs:h,renderOutputs:o,size:c}),n]})]})},ve=(e,t,n,a,r)=>{const i=e/2,c=t/2,o=n.left*i+a.left,h=n.right*i-a.right,f=n.bottom*c+a.bottom,s=n.top*c-a.top,l=h-o,p=s-f,m=(o+h)/2,u=(f+s)/2,x=r[0]*l/2,d=r[1]*p/2;return{centerX:m,centerY:u,width:l,height:p,pivotX:x,pivotY:d}},Ge={left:0,right:0,top:0,bottom:0},De={left:0,right:0,top:0,bottom:0},Ue=[0,0],je=({anchors:e,offsets:t,pivot:n=Ue,children:a})=>{const{width:r,height:i}=se.useScreenSpace(),c=C.useMemo(()=>({anchors:{...Ge,...e??{}},offsets:{...De,...t??{}}}),[e,t]),o=C.useMemo(()=>ve(r,i,c.anchors,c.offsets,n),[r,i,c,n]);C.useEffect(()=>{const l=c.anchors;l.left>l.right&&console.warn(`[ScreenTransform] inverted X axis: anchors.left (${l.left}) > anchors.right (${l.right})`),l.bottom>l.top&&console.warn(`[ScreenTransform] inverted Y axis: anchors.bottom (${l.bottom}) > anchors.top (${l.top})`),o.width<=0&&console.warn(`[ScreenTransform] zero or negative width (${o.width.toFixed(3)}) — anchors + offsets collapse the X extent`),o.height<=0&&console.warn(`[ScreenTransform] zero or negative height (${o.height.toFixed(3)}) — anchors + offsets collapse the Y extent`)},[c,o.width,o.height]);const h=n[0]!==0||n[1]!==0,f=h?[1,1,1]:[o.width,o.height,1],s=!h&&o.width>0&&o.height>0?o.width/o.height:null;return B.jsx("group",{position:[o.centerX-o.pivotX,o.centerY-o.pivotY,0],scale:f,renderOrder:fe.RENDER_LAYERS.SCREEN_UI,children:B.jsx(se.ScreenRectAspectContext.Provider,{value:s,children:a})})};class pe{constructor(t,n){O(this,"capabilities");O(this,"snapshot");O(this,"listeners",new Set);O(this,"eventListeners",new Map);this.capabilities=t,this.snapshot={state:"idle",frame:0,time:0,playMode:"forward",loop:!0,loopCount:0,...n}}play(){const t=this.snapshot.state==="paused";this.update({state:"playing"}),this.emit(t?"Resume":"PlayBegin")}pause(){this.update({state:"paused"}),this.emit("Pause")}restart(){this.update({state:"playing",frame:0,time:0}),this.emit("PlayBegin")}setPlayMode(t){!this.capabilities.canReverse&&(t==="reverse"||t==="ping-pong"||t==="random")||this.update({playMode:t})}setLoop(t,n=0){this.update({loop:t,loopCount:n})}seek(t){this.capabilities.canSeek&&this.update({frame:Math.max(0,Math.floor(t)),time:Math.max(0,t)})}subscribe(t){return this.listeners.add(t),()=>this.listeners.delete(t)}on(t,n){const a=this.eventListeners.get(t)??new Set;return a.add(n),this.eventListeners.set(t,a),()=>this.off(t,n)}off(t,n){var a;(a=this.eventListeners.get(t))==null||a.delete(n)}getSnapshot(){return this.snapshot}dispose(){this.listeners.clear(),this.eventListeners.clear(),this.snapshot={...this.snapshot,state:"idle"}}updateSnapshot(t){this.update(t)}emit(t){var n;(n=this.eventListeners.get(t))==null||n.forEach(a=>a({type:t,snapshot:this.snapshot}))}update(t){this.snapshot={...this.snapshot,...t},this.listeners.forEach(n=>n(this.snapshot))}}const ge=(e,t,n,a,r)=>{const i=Math.max(1,Math.floor(t)),c=Math.max(0,Math.floor(e)),o=n==="ping-pong"&&i>1?i*2-2:i,h=Math.floor(c/o),f=r>0?h>=r:!a&&c>=o,s=f?o-1:c%o;return{frame:n==="reverse"?i-1-s%i:n==="random"?s*7919%i:n==="ping-pong"&&s>=i?o-s:s,ended:f,loop:h}},$e=(e,t,n)=>{const a=Math.max(1,Math.floor(n));return Math.floor(Math.max(0,e)*Math.max(0,t))%a};var de={},me,qe;function We(e,t,n,i){var r=0,i=i===void 0?{}:i,c=i.loop===void 0?null:i.loop,o=i.palette===void 0?null:i.palette;if(t<=0||n<=0||t>65535||n>65535)throw new Error("Width/Height invalid.");function h(d){var g=d.length;if(g<2||g>256||g&g-1)throw new Error("Invalid code/color length, must be power of 2 and 2 .. 256.");return g}e[r++]=71,e[r++]=73,e[r++]=70,e[r++]=56,e[r++]=57,e[r++]=97;var f=0,s=0;if(o!==null){for(var l=h(o);l>>=1;)++f;if(l=1<<f,--f,i.background!==void 0){if(s=i.background,s>=l)throw new Error("Background index out of range.");if(s===0)throw new Error("Background index explicitly passed as 0.")}}if(e[r++]=t&255,e[r++]=t>>8&255,e[r++]=n&255,e[r++]=n>>8&255,e[r++]=(o!==null?128:0)|f,e[r++]=s,e[r++]=0,o!==null)for(var p=0,m=o.length;p<m;++p){var u=o[p];e[r++]=u>>16&255,e[r++]=u>>8&255,e[r++]=u&255}if(c!==null){if(c<0||c>65535)throw new Error("Loop count invalid.");e[r++]=33,e[r++]=255,e[r++]=11,e[r++]=78,e[r++]=69,e[r++]=84,e[r++]=83,e[r++]=67,e[r++]=65,e[r++]=80,e[r++]=69,e[r++]=50,e[r++]=46,e[r++]=48,e[r++]=3,e[r++]=1,e[r++]=c&255,e[r++]=c>>8&255,e[r++]=0}var x=!1;this.addFrame=function(d,g,R,v,A,S){if(x===!0&&(--r,x=!1),S=S===void 0?{}:S,d<0||g<0||d>65535||g>65535)throw new Error("x/y invalid.");if(R<=0||v<=0||R>65535||v>65535)throw new Error("Width/Height invalid.");if(A.length<R*v)throw new Error("Not enough pixels for the frame size.");var y=!0,E=S.palette;if(E==null&&(y=!1,E=o),E==null)throw new Error("Must supply either a local or global palette.");for(var F=h(E),L=0;F>>=1;)++L;F=1<<L;var G=S.delay===void 0?0:S.delay,_=S.disposal===void 0?0:S.disposal;if(_<0||_>3)throw new Error("Disposal out of range.");var T=!1,I=0;if(S.transparent!==void 0&&S.transparent!==null&&(T=!0,I=S.transparent,I<0||I>=F))throw new Error("Transparent color index.");if((_!==0||T||G!==0)&&(e[r++]=33,e[r++]=249,e[r++]=4,e[r++]=_<<2|(T===!0?1:0),e[r++]=G&255,e[r++]=G>>8&255,e[r++]=I,e[r++]=0),e[r++]=44,e[r++]=d&255,e[r++]=d>>8&255,e[r++]=g&255,e[r++]=g>>8&255,e[r++]=R&255,e[r++]=R>>8&255,e[r++]=v&255,e[r++]=v>>8&255,e[r++]=y===!0?128|L-1:0,y===!0)for(var $=0,X=E.length;$<X;++$){var k=E[$];e[r++]=k>>16&255,e[r++]=k>>8&255,e[r++]=k&255}return r=Pe(e,r,L<2?2:L,A),r},this.end=function(){return x===!1&&(e[r++]=59,x=!0),r},this.getOutputBuffer=function(){return e},this.setOutputBuffer=function(d){e=d},this.getOutputBufferPosition=function(){return r},this.setOutputBufferPosition=function(d){r=d}}function Pe(e,t,n,a){e[t++]=n;var r=t++,i=1<<n,c=i-1,o=i+1,h=o+1,f=n+1,s=0,l=0;function p(S){for(;s>=S;)e[t++]=l&255,l>>=8,s-=8,t===r+256&&(e[r]=255,r=t++)}function m(S){l|=S<<s,s+=f,p(8)}var u=a[0]&c,x={};m(i);for(var d=1,g=a.length;d<g;++d){var R=a[d]&c,v=u<<8|R,A=x[v];if(A===void 0){for(l|=u<<s,s+=f;s>=8;)e[t++]=l&255,l>>=8,s-=8,t===r+256&&(e[r]=255,r=t++);h===4096?(m(i),h=o+1,f=n+1,x={}):(h>=1<<f&&++f,x[v]=h++),u=R}else u=A}return m(u),m(o),p(1),r+1===t?e[r]=0:(e[r]=t-r-1,e[t++]=0),t}function Ne(e){var t=0;if(e[t++]!==71||e[t++]!==73||e[t++]!==70||e[t++]!==56||(e[t++]+1&253)!==56||e[t++]!==97)throw new Error("Invalid GIF 87a/89a header.");var n=e[t++]|e[t++]<<8,a=e[t++]|e[t++]<<8,r=e[t++],i=r>>7,c=r&7,o=1<<c+1;e[t++],e[t++];var h=null,f=null;i&&(h=t,f=o,t+=o*3);var s=!0,l=[],p=0,m=null,u=0,x=null;for(this.width=n,this.height=a;s&&t<e.length;)switch(e[t++]){case 33:switch(e[t++]){case 255:if(e[t]!==11||e[t+1]==78&&e[t+2]==69&&e[t+3]==84&&e[t+4]==83&&e[t+5]==67&&e[t+6]==65&&e[t+7]==80&&e[t+8]==69&&e[t+9]==50&&e[t+10]==46&&e[t+11]==48&&e[t+12]==3&&e[t+13]==1&&e[t+16]==0)t+=14,x=e[t++]|e[t++]<<8,t++;else for(t+=12;;){var d=e[t++];if(!(d>=0))throw Error("Invalid block size");if(d===0)break;t+=d}break;case 249:if(e[t++]!==4||e[t+4]!==0)throw new Error("Invalid graphics extension block.");var g=e[t++];p=e[t++]|e[t++]<<8,m=e[t++],g&1||(m=null),u=g>>2&7,t++;break;case 254:for(;;){var d=e[t++];if(!(d>=0))throw Error("Invalid block size");if(d===0)break;t+=d}break;default:throw new Error("Unknown graphic control label: 0x"+e[t-1].toString(16))}break;case 44:var R=e[t++]|e[t++]<<8,v=e[t++]|e[t++]<<8,A=e[t++]|e[t++]<<8,S=e[t++]|e[t++]<<8,y=e[t++],E=y>>7,F=y>>6&1,L=y&7,G=1<<L+1,_=h,T=f,I=!1;if(E){var I=!0;_=t,T=G,t+=G*3}var $=t;for(t++;;){var d=e[t++];if(!(d>=0))throw Error("Invalid block size");if(d===0)break;t+=d}l.push({x:R,y:v,width:A,height:S,has_local_palette:I,palette_offset:_,palette_size:T,data_offset:$,data_length:t-$,transparent_index:m,interlaced:!!F,delay:p,disposal:u});break;case 59:s=!1;break;default:throw new Error("Unknown gif block: 0x"+e[t-1].toString(16))}this.numFrames=function(){return l.length},this.loopCount=function(){return x},this.frameInfo=function(X){if(X<0||X>=l.length)throw new Error("Frame index out of range.");return l[X]},this.decodeAndBlitFrameBGRA=function(X,k){var w=this.frameInfo(X),Q=w.width*w.height,q=new Uint8Array(Q);he(e,w.data_offset,q,Q);var W=w.palette_offset,P=w.transparent_index;P===null&&(P=256);var D=w.width,N=n-D,Y=D,Z=(w.y*n+w.x)*4,b=((w.y+w.height)*n+w.x)*4,M=Z,V=N*4;w.interlaced===!0&&(V+=n*4*7);for(var H=8,z=0,ee=q.length;z<ee;++z){var U=q[z];if(Y===0&&(M+=V,Y=D,M>=b&&(V=N*4+n*4*(H-1),M=Z+(D+N)*(H<<1),H>>=1)),U===P)M+=4;else{var te=e[W+U*3],re=e[W+U*3+1],ne=e[W+U*3+2];k[M++]=ne,k[M++]=re,k[M++]=te,k[M++]=255}--Y}},this.decodeAndBlitFrameRGBA=function(X,k){var w=this.frameInfo(X),Q=w.width*w.height,q=new Uint8Array(Q);he(e,w.data_offset,q,Q);var W=w.palette_offset,P=w.transparent_index;P===null&&(P=256);var D=w.width,N=n-D,Y=D,Z=(w.y*n+w.x)*4,b=((w.y+w.height)*n+w.x)*4,M=Z,V=N*4;w.interlaced===!0&&(V+=n*4*7);for(var H=8,z=0,ee=q.length;z<ee;++z){var U=q[z];if(Y===0&&(M+=V,Y=D,M>=b&&(V=N*4+n*4*(H-1),M=Z+(D+N)*(H<<1),H>>=1)),U===P)M+=4;else{var te=e[W+U*3],re=e[W+U*3+1],ne=e[W+U*3+2];k[M++]=te,k[M++]=re,k[M++]=ne,k[M++]=255}--Y}}}function he(e,t,n,a){for(var r=e[t++],i=1<<r,c=i+1,o=c+1,h=r+1,f=(1<<h)-1,s=0,l=0,p=0,m=e[t++],u=new Int32Array(4096),x=null;;){for(;s<16&&m!==0;)l|=e[t++]<<s,s+=8,m===1?m=e[t++]:--m;if(s<h)break;var d=l&f;if(l>>=h,s-=h,d===i){o=c+1,h=r+1,f=(1<<h)-1,x=null;continue}else if(d===c)break;for(var g=d<o?d:x,R=0,v=g;v>i;)v=u[v]>>8,++R;var A=v,S=p+R+(g!==d?1:0);if(S>a){console.log("Warning, gif stream longer than expected.");return}n[p++]=A,p+=R;var y=p;for(g!==d&&(n[p++]=A),v=g;R--;)v=u[v],n[--y]=v&255,v>>=8;x!==null&&o<4096&&(u[o++]=x<<8|A,o>=f+1&&h<12&&(++h,f=f<<1|1)),x=d}return p!==a&&console.log("Warning, gif stream shorter than expected."),n}try{qe=de.GifWriter=We,me=de.GifReader=Ne}catch{}const Ye=me;function Ve(e){return async(t,n)=>{const a=e.find(r=>r.canResolve(t));if(!a)throw new we("No texture provider matched source",t);return Se(a.resolve.bind(a),t,n)}}class we extends Error{constructor(n,a){super(n);O(this,"source");this.name="TextureSourceLoadError",this.source=a}}function J(e){if(e.aborted)throw new DOMException("Texture source load aborted","AbortError")}async function Se(e,t,n){J(n);const a=await e(t,n);return n.aborted&&(a.dispose(),J(n)),a}function He(e){e==null||e.dispose()}const ye=5*1024*1024,oe=1e6,ie=180,ze=(e,t,n)=>{for(let a=n.y;a<n.y+n.height;a+=1)e.fill(0,(a*t+n.x)*4,(a*t+n.x+n.width)*4)},Oe=(e,t,n,a,r)=>t.byteLength>ye?`file is ${(t.byteLength/1024/1024).toFixed(1)} MB; max is 5 MB`:n*a>oe?`canvas is ${n}x${a}; max area is ${oe}`:r>ie?`frame count is ${r}; max is ${ie}`:r===0?"frame count is 0":e?null:"source URL is empty",Qe=e=>typeof e=="string"?e:e.src,Ze={canResolve:e=>typeof e=="string"?/\.gif(?:[?#].*)?$/i.test(e):e.kind==="gif",async resolve(e,t){const n=Qe(e),a=await fetch(n,{signal:t});if(!a.ok)throw new Error(`GIF request failed with ${a.status}`);const r=new Uint8Array(await a.arrayBuffer());J(t);const i=new Ye(r),c=i.numFrames(),o=Oe(n,r,i.width,i.height,c);if(o)throw console.warn(`[xr-sdk] GIF ScreenImage source rejected: ${o}`,n),new Error(`GIF source rejected: ${o}`);const h=document.createElement("canvas");h.width=i.width,h.height=i.height;const f=h.getContext("2d");if(!f)throw new Error("Could not create GIF canvas context");const s=new j.CanvasTexture(h);s.colorSpace=j.SRGBColorSpace;const l=new Uint8Array(i.width*i.height*4),p=new ImageData(new Uint8ClampedArray(l.buffer),i.width,i.height),m=Array.from({length:c},(_,T)=>i.frameInfo(T)),u=m.reduce((_,T)=>_+Math.max(20,T.delay*10),0)/1e3,x=new pe({canSeek:!1,canReverse:!1,supportsLoopCount:!0},{state:"ready",duration:u,frameCount:c});let d=0,g=0,R=!1,v=!1,A=0,S=0,y=null;const E=(_,T=!1)=>{T&&(l.fill(0),y=null),(y==null?void 0:y.info.disposal)===2?ze(l,i.width,y.info):y!=null&&y.restorePixels&&l.set(y.restorePixels);const I=m[_],$=I.disposal===3?new Uint8Array(l):null;return i.decodeAndBlitFrameRGBA(_,l),f.putImageData(p,0,0),s.needsUpdate=!0,y={info:I,restorePixels:$},v=!0,x.updateSnapshot({frame:_,time:m.slice(0,_).reduce((X,k)=>X+Math.max(20,k.delay*10),0)/1e3}),v=!1,x.emit("KeyFrameInSecond"),Math.max(20,I.delay*10)},F=_=>{g=window.setTimeout(()=>{d=requestAnimationFrame(L)},_)},L=()=>{if(R||x.getSnapshot().state!=="playing")return;const _=x.getSnapshot(),T=ge(A,c,_.playMode,_.loop,_.loopCount);if(T.ended){x.updateSnapshot({state:"ended",frame:T.frame,time:u}),x.emit("PlayEnd");return}const I=T.loop!==S;S=T.loop,A+=1,F(E(T.frame,I))},G=x.subscribe(_=>{v||(clearTimeout(g),cancelAnimationFrame(d),_.state==="playing"&&(d=requestAnimationFrame(L)))});return E(0),x.play(),{texture:s,controller:x,metadata:{width:i.width,height:i.height,duration:u,frameCount:c},dispose(){R=!0,G(),clearTimeout(g),cancelAnimationFrame(d),x.dispose(),s.dispose()}}}},_e=C.createContext(null),Re=C.createContext(null),Ke=()=>C.useContext(_e),Je=()=>C.useContext(Re);exports.BasicAnimatedTextureController=pe;exports.MAX_GIF_BYTES=ye;exports.MAX_GIF_FRAMES=ie;exports.MAX_GIF_PIXELS=oe;exports.ScreenTransform=je;exports.TextureSourceLoadError=we;exports.XRScene=Be;exports.XRViewportRenderOutputsContext=Re;exports.XRViewportStateContext=_e;exports.computeScreenTransform=ve;exports.createTextureSourceResolver=Ve;exports.disposeResolvedTextureSource=He;exports.getPlaybackFrame=ge;exports.getSequenceFrame=$e;exports.gifTextureSourceProvider=Ze;exports.resolveTextureSource=Se;exports.throwIfAborted=J;exports.useXRViewportRenderOutputs=Je;exports.useXRViewportState=Ke;
|