@vincentt-xr/sdk 2.0.0-alpha.1 → 2.0.0-alpha.2
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 +1588 -20
- package/dist/{DebuggerUI-CatYc-RG.cjs → DebuggerUI-B45_Gb9d.cjs} +1 -1
- package/dist/{DebuggerUI-gLMKiVwJ.js → DebuggerUI-Cq28c18s.js} +1 -1
- package/dist/FaceMeshRenderer-6t8OsQhK.js +1195 -0
- package/dist/FaceMeshRenderer-lQLhYIW-.cjs +155 -0
- package/dist/FaceRetouch-CDrL0pXg.js +551 -0
- package/dist/FaceRetouch-DtNl8-4e.cjs +134 -0
- package/dist/audio/AudioEngine.d.ts +3 -1
- package/dist/audio/AudioPlayer.d.ts +29 -0
- package/dist/audio/AudioPlayerLogic.d.ts +4 -0
- package/dist/audio/index.d.ts +2 -0
- package/dist/components/Axes/index.d.ts +6 -0
- package/dist/components/FaceMesh/FaceMeshRenderer.d.ts +17 -0
- package/dist/components/FaceMesh/canonical/CanonicalFaceMeshRenderer.d.ts +17 -1
- package/dist/components/FaceMesh/canonical/FaceMeshMaterial.d.ts +25 -0
- package/dist/components/FaceMesh/canonical/assets.d.ts +3 -0
- package/dist/components/FaceMesh/canonical/geometryGroups.d.ts +9 -0
- package/dist/components/FaceMesh/canonical/parseCanonicalFaceModel.d.ts +2 -0
- package/dist/components/FaceMesh/canonical/shaders.d.ts +2 -0
- package/dist/components/FaceMesh/deform.d.ts +3 -0
- package/dist/components/FaceMesh/index.d.ts +5 -0
- package/dist/components/FaceMesh/material/defaults.d.ts +70 -0
- package/dist/components/FaceMesh/material/index.d.ts +1 -0
- package/dist/components/FaceMesh/material/options.d.ts +5 -1
- package/dist/components/FaceMesh/material/support.d.ts +7 -2
- package/dist/components/FaceMesh/material/textures.d.ts +4 -0
- package/dist/components/FaceMesh/material/types.d.ts +2 -2
- package/dist/components/FaceRetouch/Background.d.ts +5 -6
- package/dist/components/FaceRetouch/FaceRetouch.d.ts +47 -0
- package/dist/components/FaceRetouch/index.d.ts +2 -8
- package/dist/components/FaceRetouch/landmarkMask.d.ts +0 -5
- package/dist/components/FaceRetouch/useFaceRetouchMask.d.ts +3 -7
- package/dist/components/FaceTracker/index.d.ts +5 -3
- package/dist/components/FaceWarp3D/FaceWarp3DHead.d.ts +1 -1
- package/dist/components/HandJoints2D/index.d.ts +1 -1
- package/dist/components/HandTracking2D/HandVisual.d.ts +1 -1
- package/dist/components/HandTracking2D/index.d.ts +1 -1
- package/dist/components/HandTracking2DController/index.d.ts +1 -1
- package/dist/components/HandTracking3D/index.d.ts +1 -1
- package/dist/components/LightObject/index.d.ts +20 -0
- package/dist/components/LookAt/index.d.ts +23 -0
- package/dist/components/MeshRenderer/index.d.ts +58 -0
- package/dist/components/PerspectiveCamera/index.d.ts +2 -8
- package/dist/components/PinToMesh/index.d.ts +47 -0
- package/dist/components/RenderGroupLayer/index.d.ts +6 -0
- package/dist/components/SceneObjectRenderer/index.d.ts +16 -0
- package/dist/components/Screen2D/ScreenTransformFrame.d.ts +11 -0
- package/dist/components/Screen2D/ScreenTransformHelpers.d.ts +19 -0
- package/dist/components/Screen2D/ScreenTransformInteraction.d.ts +18 -0
- package/dist/components/Screen2D/index.d.ts +5 -0
- package/dist/components/ScreenGlass/defaults.d.ts +3 -0
- package/dist/components/ScreenGlass/index.d.ts +5 -0
- package/dist/components/ScreenGlass/shaders.d.ts +2 -0
- package/dist/components/ScreenGlass/types.d.ts +10 -0
- package/dist/components/ScreenGradient/defaults.d.ts +5 -0
- package/dist/components/ScreenGradient/index.d.ts +5 -0
- package/dist/components/ScreenGradient/shaders.d.ts +2 -0
- package/dist/components/ScreenGradient/types.d.ts +19 -0
- package/dist/components/ScreenImage/ScreenImage.d.ts +4 -0
- package/dist/components/ScreenImage/components/DynamicTextureSync.d.ts +9 -0
- package/dist/components/ScreenImage/components/ScreenImageBody.d.ts +9 -0
- package/dist/components/ScreenImage/components/ScreenImageFrame.d.ts +9 -0
- package/dist/components/ScreenImage/components/ScreenImageTransformFrame.d.ts +9 -0
- package/dist/components/ScreenImage/fit.d.ts +52 -0
- package/dist/components/ScreenImage/index.d.ts +8 -87
- package/dist/components/ScreenImage/materials/ScreenImageBlendMaterial.d.ts +9 -0
- package/dist/components/ScreenImage/materials/ScreenImageMatcap.d.ts +3 -0
- package/dist/components/ScreenImage/source.d.ts +16 -0
- package/dist/components/ScreenImage/types.d.ts +37 -0
- package/dist/components/ScreenImage/utils/ScreenImageConstants.d.ts +9 -0
- package/dist/components/ScreenImage/utils/ScreenImageHelpers.d.ts +4 -0
- package/dist/components/ScreenShape/geometry.d.ts +5 -0
- package/dist/components/ScreenShape/index.d.ts +5 -0
- package/dist/components/ScreenShape/types.d.ts +41 -0
- package/dist/components/ScreenSpaceUI/ScreenTransformGuide.d.ts +15 -0
- package/dist/components/ScreenSpaceUI/ScreenTransformOverlayGuide.d.ts +9 -0
- package/dist/components/ScreenSpaceUI/index.d.ts +2 -0
- package/dist/components/ScreenText/components/ScreenTextBody.d.ts +2 -0
- package/dist/components/ScreenText/components/ScreenTextTransformFrame.d.ts +9 -0
- package/dist/components/ScreenText/constants.d.ts +5 -0
- package/dist/components/ScreenText/index.d.ts +6 -20
- package/dist/components/ScreenText/types.d.ts +31 -0
- package/dist/components/ScreenText/utils/ScreenTextHelpers.d.ts +14 -0
- package/dist/components/ScreenText/utils/ScreenTextMappings.d.ts +17 -0
- package/dist/components/SequentialRenderPasses/index.d.ts +6 -0
- package/dist/components/TextLabel/TextLabel.d.ts +5 -0
- package/dist/components/TextLabel/alignment.d.ts +4 -0
- package/dist/components/TextLabel/bend.d.ts +9 -0
- package/dist/components/TextLabel/canvas/buildTextLabelTexture.d.ts +4 -0
- package/dist/components/TextLabel/canvas/canvasTypography.d.ts +13 -0
- package/dist/components/TextLabel/canvas/drawBackground.d.ts +21 -0
- package/dist/components/TextLabel/canvas/drawEffects.d.ts +34 -0
- package/dist/components/TextLabel/canvas/drawText.d.ts +19 -0
- package/dist/components/TextLabel/components/TextLabelMesh.d.ts +13 -0
- package/dist/components/TextLabel/constants.d.ts +2 -0
- package/dist/components/TextLabel/hooks/useTextLabelTexture.d.ts +7 -0
- package/dist/components/TextLabel/index.d.ts +2 -161
- package/dist/components/TextLabel/layout/measurement.d.ts +8 -0
- package/dist/components/TextLabel/layout/resolveTextLayout.d.ts +25 -0
- package/dist/components/TextLabel/layout/wrapText.d.ts +6 -0
- package/dist/components/TextLabel/types.d.ts +227 -0
- package/dist/components/TrackingAnchor/index.d.ts +18 -2
- package/dist/components/Transform3D/index.d.ts +30 -0
- package/dist/components/XRMediaSurface/index.d.ts +6 -6
- package/dist/components/XRViewport/XRViewport.d.ts +11 -0
- package/dist/components/XRViewport/components/HiddenMedia.d.ts +7 -0
- package/dist/components/XRViewport/components/MediaAssetPicker.d.ts +8 -0
- package/dist/components/XRViewport/components/MediaControlStack.d.ts +13 -0
- package/dist/components/XRViewport/components/XRViewportLayers.d.ts +30 -0
- package/dist/components/XRViewport/constants.d.ts +24 -0
- package/dist/components/XRViewport/contexts.d.ts +6 -0
- package/dist/components/XRViewport/hooks/useViewportExternalFaces.d.ts +13 -0
- package/dist/components/XRViewport/hooks/useViewportMediaSource.d.ts +16 -0
- package/dist/components/XRViewport/hooks/useViewportMediaTexture.d.ts +10 -0
- package/dist/components/XRViewport/hooks/useViewportPipeline.d.ts +41 -0
- package/dist/components/XRViewport/hooks/useViewportRenderState.d.ts +47 -0
- package/dist/components/XRViewport/index.d.ts +3 -118
- package/dist/components/XRViewport/layout.d.ts +16 -0
- package/dist/components/XRViewport/slots.d.ts +16 -0
- package/dist/components/XRViewport/types.d.ts +89 -0
- package/dist/components/XRViewport/useViewportSize.d.ts +3 -0
- package/dist/components/index.d.ts +12 -0
- package/dist/contexts-BKvTIayr.cjs +1 -0
- package/dist/contexts-Bk5zz_VR.js +214 -0
- package/dist/debug-ui/component-editor/index.d.ts +19 -0
- package/dist/debug-ui/face-mesh-renderer-settings/index.d.ts +8 -0
- package/dist/debug-ui/face-retouch/index.d.ts +11 -0
- package/dist/debug-ui/hand-joints-2d/index.d.ts +1 -1
- package/dist/debug-ui/hand-tracking-2d/index.d.ts +1 -1
- package/dist/debug-ui/hand-tracking-2d-controller/index.d.ts +1 -1
- package/dist/debug-ui/hand-tracking-3d/index.d.ts +1 -1
- package/dist/debug-ui/hierarchy-panel/index.d.ts +29 -0
- package/dist/debug-ui/index.d.ts +25 -2
- package/dist/debug-ui/layer-panel/index.d.ts +3 -2
- package/dist/debug-ui/media-source/index.d.ts +2 -0
- package/dist/debug-ui/media-source/session.d.ts +12 -0
- package/dist/debug-ui/media-source.cjs +1 -1
- package/dist/debug-ui/media-source.js +6 -4
- package/dist/debug-ui/mesh-renderer-settings/index.d.ts +6 -0
- package/dist/debug-ui/object-inspector-panel/index.d.ts +25 -0
- package/dist/debug-ui/pin-to-mesh-settings/index.d.ts +10 -0
- package/dist/debug-ui/scene-editor/context.d.ts +38 -0
- package/dist/debug-ui/scene-editor/hierarchy-panel.d.ts +9 -0
- package/dist/debug-ui/scene-editor/index.d.ts +11 -0
- package/dist/debug-ui/scene-editor/inspector-panel.d.ts +7 -0
- package/dist/debug-ui/scene-editor/store-utils.d.ts +2 -0
- package/dist/debug-ui/scene-editor/viewport-toolbar.d.ts +4 -0
- package/dist/debug-ui/scene-editor/viewport.d.ts +21 -0
- package/dist/debug-ui/screen-glass-settings/index.d.ts +6 -0
- package/dist/debug-ui/screen-gradient-settings/GradientStopsEditor.d.ts +5 -0
- package/dist/debug-ui/screen-gradient-settings/index.d.ts +6 -0
- package/dist/debug-ui/screen-gradient-settings/styles.d.ts +3 -0
- package/dist/debug-ui/screen-image-settings/index.d.ts +4 -2
- package/dist/debug-ui/screen-shape-settings/index.d.ts +6 -0
- package/dist/debug-ui/screen-text-settings/NumberField.d.ts +9 -0
- package/dist/debug-ui/screen-text-settings/ScreenTextSettingsPanel.d.ts +3 -0
- package/dist/debug-ui/screen-text-settings/controls/NestedSection.d.ts +7 -0
- package/dist/debug-ui/screen-text-settings/controls/Section.d.ts +8 -0
- package/dist/debug-ui/screen-text-settings/controls/icons.d.ts +4 -0
- package/dist/debug-ui/screen-text-settings/index.d.ts +2 -122
- package/dist/debug-ui/screen-text-settings/sections/BackgroundSection.d.ts +8 -0
- package/dist/debug-ui/screen-text-settings/sections/ContentSection.d.ts +5 -0
- package/dist/debug-ui/screen-text-settings/sections/EffectsSection.d.ts +25 -0
- package/dist/debug-ui/screen-text-settings/sections/StyleSection.d.ts +5 -0
- package/dist/debug-ui/screen-text-settings/sections/TransformSection.d.ts +5 -0
- package/dist/debug-ui/screen-text-settings/sections/background/BackgroundFillControls.d.ts +2 -0
- package/dist/debug-ui/screen-text-settings/sections/background/BackgroundSizeControls.d.ts +2 -0
- package/dist/debug-ui/screen-text-settings/sections/background/BackgroundStrokeControls.d.ts +2 -0
- package/dist/debug-ui/screen-text-settings/sections/background/types.d.ts +7 -0
- package/dist/debug-ui/screen-text-settings/sections/effects/BendEffectSection.d.ts +4 -0
- package/dist/debug-ui/screen-text-settings/sections/effects/EffectChrome.d.ts +21 -0
- package/dist/debug-ui/screen-text-settings/sections/effects/GlowEffectSection.d.ts +4 -0
- package/dist/debug-ui/screen-text-settings/sections/effects/InnerShadowEffectSection.d.ts +4 -0
- package/dist/debug-ui/screen-text-settings/sections/effects/OutlineEffectSection.d.ts +4 -0
- package/dist/debug-ui/screen-text-settings/sections/effects/ShadowEffectSection.d.ts +4 -0
- package/dist/debug-ui/screen-text-settings/sections/effects/types.d.ts +14 -0
- package/dist/debug-ui/screen-text-settings/settings.d.ts +90 -0
- package/dist/debug-ui/screen-text-settings/styles.d.ts +26 -0
- package/dist/debug-ui/screen-text-settings/transform.d.ts +6 -0
- package/dist/debug-ui/screen-text-settings/types.d.ts +9 -0
- package/dist/debug-ui/shared/ScreenTransformSection.d.ts +6 -3
- package/dist/debug-ui/transform-3d-settings/index.d.ts +11 -0
- package/dist/debug-ui.cjs +3 -13
- package/dist/debug-ui.js +7896 -5098
- package/dist/drawNormalizedCrop-B-7zU-Xw.cjs +1 -0
- package/dist/drawNormalizedCrop-CRdIDyl1.js +44 -0
- package/dist/entries/all.d.ts +1 -0
- package/dist/entries/core.d.ts +53 -6
- package/dist/entries/face-effects.d.ts +10 -8
- package/dist/entries/internal.d.ts +1 -1
- package/dist/entries/low-level.d.ts +18 -4
- package/dist/entries/scene-object.d.ts +10 -0
- package/dist/entries/tracking.d.ts +25 -2
- package/dist/face-action/index.d.ts +34 -0
- package/dist/face-attribute-expression/index.d.ts +10 -0
- package/dist/face-effects.cjs +1 -342
- package/dist/face-effects.js +1391 -2767
- package/dist/face-info/blendshapes.d.ts +3 -0
- package/dist/face-info/derive.d.ts +8 -0
- package/dist/face-info/drawFaceCrop.d.ts +10 -0
- package/dist/face-info/getFaceInfo.d.ts +8 -0
- package/dist/face-info/index.d.ts +8 -0
- package/dist/face-info/landmarks.d.ts +21 -0
- package/dist/face-info/types.d.ts +52 -0
- package/dist/getFaceInfo-CyPAKh3h.cjs +1 -0
- package/dist/getFaceInfo-hUKMLFcr.js +118 -0
- package/dist/{handJoints2d.d.ts → hand/handJoints2d.d.ts} +1 -1
- package/dist/{handTracking2d.d.ts → hand/handTracking2d.d.ts} +1 -1
- package/dist/{handTracking2dController.d.ts → hand/handTracking2dController.d.ts} +1 -1
- package/dist/{handTracking3d.d.ts → hand/handTracking3d.d.ts} +1 -1
- package/dist/hooks/faceResults.d.ts +1 -1
- package/dist/hooks/useCalibrationFaceTracker.d.ts +1 -1
- package/dist/hooks/useFaceAction.d.ts +3 -0
- package/dist/hooks/useFaceAttributeExpression.d.ts +16 -0
- package/dist/hooks/useFaceDetection.d.ts +18 -0
- package/dist/hooks/useFaceInfo.d.ts +7 -0
- package/dist/hooks/useFaceInfos.d.ts +15 -0
- package/dist/hooks/useFaceResultReader.d.ts +10 -0
- package/dist/hooks/useFrameCapture.d.ts +18 -0
- package/dist/hooks/useMediaRecorder.d.ts +14 -2
- package/dist/hooks/useOwnedTexture.d.ts +6 -0
- package/dist/hooks/useTrackerContext.d.ts +2 -2
- package/dist/hooks/useXRSession/facade.d.ts +3 -0
- package/dist/hooks/useXRSession/registry.d.ts +9 -0
- package/dist/index-82aENaRq.cjs +1 -0
- package/dist/{index-BGNbrc4C.js → index-BgQAX8rs.js} +213 -125
- package/dist/index-CEc1CAmB.cjs +1 -0
- package/dist/index-CTHeBQOs.js +178 -0
- package/dist/index-D4bLzBr6.cjs +1 -0
- package/dist/index-DSpzjuqd.cjs +1 -0
- package/dist/index-Di70KWuY.js +2049 -0
- package/dist/index-DzEzkBIH.cjs +17 -0
- package/dist/{index-safCs_af.js → index-JygePOwo.js} +565 -508
- package/dist/index-UC0Ux38E.js +111 -0
- package/dist/{internal-Cae1ps15.js → internal-DuMPpcbp.js} +86 -80
- package/dist/internal-i2JkM85N.cjs +1 -0
- package/dist/internal.cjs +1 -1
- package/dist/internal.js +2 -2
- package/dist/low-level.cjs +1 -1
- package/dist/low-level.js +1229 -86
- package/dist/main.cjs +1 -73
- package/dist/main.js +545 -1693
- package/dist/material/MaterialFill.d.ts +20 -0
- package/dist/material/MeshMaterial.d.ts +14 -0
- package/dist/material/index.d.ts +2 -0
- package/dist/models/Body/index.d.ts +1 -1
- package/dist/models/Face/index.d.ts +1 -0
- package/dist/models/Face/rotation.d.ts +3 -0
- package/dist/render/renderGroups.d.ts +47 -0
- package/dist/render/renderPasses.d.ts +18 -0
- package/dist/renderGroups-C9QJrAXu.js +152 -0
- package/dist/renderGroups-Dvm1J4lW.cjs +1 -0
- package/dist/renderLayers-lDtL0_43.cjs +1 -0
- package/dist/renderLayers-zrK2pv5O.js +13 -0
- package/dist/renderPasses-CT5iBwtg.cjs +21 -0
- package/dist/renderPasses-CjgG_6kQ.js +1500 -0
- package/dist/scene-object/index.d.ts +146 -0
- package/dist/scene-object/runtimeRegistry.d.ts +14 -0
- package/dist/scene-object.cjs +1 -0
- package/dist/scene-object.js +40 -0
- package/dist/{screenImageSettings.d.ts → screen-image/screenImageSettings.d.ts} +9 -2
- package/dist/{screenTextSettings.d.ts → screen-text/screenTextSettings.d.ts} +18 -2
- package/dist/screen2d/coordinates.d.ts +87 -0
- package/dist/screen2d/index.d.ts +3 -0
- package/dist/screen2d/screenTransform.d.ts +47 -0
- package/dist/screen2d/smoothing.d.ts +5 -0
- package/dist/{selectors-BLl2JUWW.cjs → selectors-2QvO5RYY.cjs} +1 -1
- package/dist/{selectors-CXd_x-6t.js → selectors-Dw3C-gSk.js} +3 -3
- package/dist/services/MetricsCollector/index.d.ts +7 -1
- package/dist/services/MetricsCollector/utils.d.ts +1 -1
- package/dist/session-BChR4TgK.cjs +31 -0
- package/dist/session-C1StwN0f.js +363 -0
- package/dist/texture/animatedTexture.d.ts +61 -0
- package/dist/texture/animationMath.d.ts +8 -0
- package/dist/texture/sourceResolver.d.ts +30 -0
- package/dist/tracking.cjs +1 -1
- package/dist/tracking.js +580 -321
- package/dist/types/face.d.ts +1 -13
- package/dist/types/index.d.ts +0 -1
- package/dist/types/nodes.d.ts +2 -1
- package/dist/types/session.d.ts +2 -0
- package/dist/types/tracking.d.ts +8 -2
- package/dist/types/util-types.d.ts +1 -1
- package/dist/useFaceInfo-C-WfMlYp.cjs +1 -0
- package/dist/useFaceInfo-CwsHZedC.js +62 -0
- package/dist/useFaceResults-CkFc1egZ.js +19 -0
- package/dist/useFaceResults-VcFdOUFV.cjs +1 -0
- package/dist/utils/drawNormalizedCrop.d.ts +22 -0
- package/dist/utils/integrity.d.ts +4 -25
- package/dist/utils/landmarkBounds.d.ts +1 -1
- package/dist/utils/logger.d.ts +2 -2
- package/docs/MIGRATION_GUIDE.md +589 -0
- package/docs/SDK_DOCUMENTATION.md +1155 -0
- package/docs/api/audio.mdx +36 -0
- package/docs/api/behavior-components.mdx +164 -0
- package/docs/api/capture-recording.mdx +103 -0
- package/docs/api/debug-ui-scene-editor.mdx +249 -0
- package/docs/api/face-actions.mdx +104 -0
- package/docs/api/face-attribute-expression.mdx +87 -0
- package/docs/api/face-binding-anchors.mdx +53 -0
- package/docs/api/face-effects.mdx +19 -0
- package/docs/api/face-info.mdx +112 -0
- package/docs/api/face-mesh.mdx +98 -0
- package/docs/api/face-painting.mdx +33 -0
- package/docs/api/face-retouching.mdx +73 -0
- package/docs/api/material-render-state.mdx +132 -0
- package/docs/api/runtime-3d.mdx +311 -0
- package/docs/api/scene-object-store.mdx +213 -0
- package/docs/api/screen-image.mdx +41 -0
- package/docs/api/screen-shape.mdx +64 -0
- package/docs/api/screen-space-coordinates.mdx +41 -0
- package/docs/api/screen-text.mdx +39 -0
- package/docs/api/texture-sources.mdx +55 -0
- package/docs/api/trackers.mdx +46 -0
- package/docs/docs.json +70 -0
- package/docs/examples/scene-object-recipes.mdx +194 -0
- package/docs/guides/harness-debug-ui.mdx +139 -0
- package/docs/inspector/hierarchy-panel.mdx +51 -0
- package/docs/inspector/object-inspector-panel.mdx +51 -0
- package/docs/introduction.mdx +121 -0
- package/docs/scene-objects/overview.mdx +127 -0
- package/docs/scene-objects/render-groups.mdx +77 -0
- package/docs/scene-objects/runtime-rendering.mdx +75 -0
- package/docs/texture-api-consumer.md +58 -0
- package/package.json +37 -7
- package/dist/MediaSourceSwitcher-C-xYg0nQ.js +0 -317
- package/dist/MediaSourceSwitcher-Cq3g4IKw.cjs +0 -31
- package/dist/components/FaceRetouch/defaults.d.ts +0 -13
- package/dist/components/FaceRetouch/retouchRegions.d.ts +0 -23
- package/dist/components/FaceRetouch/useFaceRetouchRegions.d.ts +0 -12
- package/dist/defaults-BLpcN3pG.cjs +0 -1
- package/dist/defaults-LtY4M7dg.js +0 -55
- package/dist/index-BXyObVHF.cjs +0 -1
- package/dist/index-CY3bUAcW.js +0 -12
- package/dist/index-C_Duh13c.cjs +0 -1
- package/dist/index-D8fpPQkC.cjs +0 -1
- package/dist/index-DxshgBu0.cjs +0 -1
- package/dist/index-O-2crZ3M.js +0 -1102
- package/dist/internal-BjyhBP8i.cjs +0 -1
- package/dist/modules/XRClient/index.d.ts +0 -9
- package/dist/modules/index.d.ts +0 -1
- package/dist/screenImageSettings-6NRg4cx9.js +0 -39
- package/dist/screenImageSettings-y_B4_767.cjs +0 -1
- package/dist/services/ApiService.d.ts +0 -12
- package/dist/types/client.d.ts +0 -3
- package/dist/useFaceResults-cpsSmKKc.js +0 -81
- package/dist/useFaceResults-hVUJYSEY.cjs +0 -1
- package/dist/useXRModel-3DcUa28n.cjs +0 -1
- package/dist/useXRModel-BMJE1hrk.js +0 -28
- /package/dist/{layerStack.d.ts → render/layerStack.d.ts} +0 -0
- /package/dist/{screenImagePresets.d.ts → screen-image/screenImagePresets.d.ts} +0 -0
- /package/dist/{screenTextPresets.d.ts → screen-text/screenTextPresets.d.ts} +0 -0
|
@@ -0,0 +1,1155 @@
|
|
|
1
|
+
# XR SDK Documentation
|
|
2
|
+
|
|
3
|
+
## Table of Contents
|
|
4
|
+
|
|
5
|
+
- [Introduction](#introduction)
|
|
6
|
+
- [Installation](#installation)
|
|
7
|
+
- [Quick Start](#quick-start)
|
|
8
|
+
- [XRViewport Quick Start](#xrviewport-quick-start)
|
|
9
|
+
- [Architecture](#architecture)
|
|
10
|
+
- [Core Concepts](#core-concepts)
|
|
11
|
+
- [Components](#components)
|
|
12
|
+
- [Tracking Models](#tracking-models)
|
|
13
|
+
- [Complete Example](#complete-example)
|
|
14
|
+
- [API Reference](#api-reference)
|
|
15
|
+
|
|
16
|
+
## Introduction
|
|
17
|
+
|
|
18
|
+
The XR SDK (`@vincentt-xr/sdk`) is a WebAR SDK that provides AI-powered tracking capabilities for React Three Fiber applications. It integrates MediaPipe models for face, hand, body, and gesture tracking with a declarative React component API.
|
|
19
|
+
|
|
20
|
+
### Key Features
|
|
21
|
+
|
|
22
|
+
- **AI-Powered Tracking**: Face, hand, body, and gesture recognition using MediaPipe
|
|
23
|
+
- **React Three Fiber Integration**: Seamless integration with R3F ecosystem
|
|
24
|
+
- **Unified Architecture**: Single scene rendering with proper event handling
|
|
25
|
+
- **Background Segmentation**: Real-time person segmentation for custom backgrounds
|
|
26
|
+
- **Screen-Space UI**: 2D UI positioning system
|
|
27
|
+
- **TypeScript Support**: Full type safety and IntelliSense support
|
|
28
|
+
|
|
29
|
+
### Current Example Routes
|
|
30
|
+
|
|
31
|
+
Source of truth: `example/src/navigation/routes.tsx`. This list is a readable summary only.
|
|
32
|
+
|
|
33
|
+
- `/unified-architecture`: debug-ui scene editor composition for face tracking
|
|
34
|
+
- `/testing-hook`: multi-face face-mesh sanity example
|
|
35
|
+
- `/body`: visible body-tracking anchors
|
|
36
|
+
- `/debugger`: debugger overlay and metrics example
|
|
37
|
+
- `/viewport-editor`: reusable 3D scene editor fixture
|
|
38
|
+
- `/face-retouch-legacy`: legacy face-retouch shader settings example
|
|
39
|
+
|
|
40
|
+
## Installation
|
|
41
|
+
|
|
42
|
+
```bash
|
|
43
|
+
npm install @vincentt-xr/sdk
|
|
44
|
+
# or
|
|
45
|
+
pnpm add @vincentt-xr/sdk
|
|
46
|
+
# or
|
|
47
|
+
yarn add @vincentt-xr/sdk
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### Peer Dependencies
|
|
51
|
+
|
|
52
|
+
The SDK requires the following peer dependencies:
|
|
53
|
+
|
|
54
|
+
```json
|
|
55
|
+
{
|
|
56
|
+
"react": "^18.0.0",
|
|
57
|
+
"react-dom": "^18.0.0",
|
|
58
|
+
"@react-three/fiber": "8.18.0",
|
|
59
|
+
"@react-three/drei": "9.105.6",
|
|
60
|
+
"three": "0.173.0"
|
|
61
|
+
}
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
## Quick Start
|
|
65
|
+
|
|
66
|
+
For new responsive builds, prefer `XRViewport`.
|
|
67
|
+
|
|
68
|
+
`XRScene` is now legacy-first:
|
|
69
|
+
|
|
70
|
+
- supported for compatibility
|
|
71
|
+
- still used internally by `XRViewport mode="r3f"` / `mode="hybrid"`
|
|
72
|
+
- not recommended as new app root
|
|
73
|
+
- deprecation path: new examples and responsive features should land on `XRViewport`
|
|
74
|
+
|
|
75
|
+
## XRViewport Quick Start
|
|
76
|
+
|
|
77
|
+
### DOM Mode
|
|
78
|
+
|
|
79
|
+
```tsx
|
|
80
|
+
import { XRProvider, XRViewport } from "@vincentt-xr/sdk";
|
|
81
|
+
|
|
82
|
+
export default function App() {
|
|
83
|
+
return (
|
|
84
|
+
<XRProvider>
|
|
85
|
+
<XRViewport mode="dom" source={{ kind: "webcam" }} fitMode="auto" />
|
|
86
|
+
</XRProvider>
|
|
87
|
+
);
|
|
88
|
+
}
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### R3F Mode
|
|
92
|
+
|
|
93
|
+
```tsx
|
|
94
|
+
import { PerspectiveCamera } from "@react-three/drei";
|
|
95
|
+
import { XRProvider, XRViewport, VideoBackground } from "@vincentt-xr/sdk";
|
|
96
|
+
|
|
97
|
+
export default function App() {
|
|
98
|
+
return (
|
|
99
|
+
<XRProvider>
|
|
100
|
+
<XRViewport mode="r3f" mediaStrategy="external" showMediaControlsByDefault={false}>
|
|
101
|
+
<XRViewport.Scene>
|
|
102
|
+
<PerspectiveCamera makeDefault position={[0, 0, 5]} fov={45} />
|
|
103
|
+
<VideoBackground />
|
|
104
|
+
</XRViewport.Scene>
|
|
105
|
+
</XRViewport>
|
|
106
|
+
</XRProvider>
|
|
107
|
+
);
|
|
108
|
+
}
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
### Hybrid Mode
|
|
112
|
+
|
|
113
|
+
```tsx
|
|
114
|
+
import { PerspectiveCamera } from "@react-three/drei";
|
|
115
|
+
import { XRProvider, XRViewport, VideoBackground, BoundingBoxOverlay } from "@vincentt-xr/sdk";
|
|
116
|
+
|
|
117
|
+
export default function App() {
|
|
118
|
+
return (
|
|
119
|
+
<XRProvider>
|
|
120
|
+
<XRViewport mode="hybrid" mediaStrategy="external">
|
|
121
|
+
<XRViewport.Scene>
|
|
122
|
+
<PerspectiveCamera makeDefault position={[0, 0, 5]} fov={45} />
|
|
123
|
+
<VideoBackground />
|
|
124
|
+
</XRViewport.Scene>
|
|
125
|
+
<XRViewport.Overlay>
|
|
126
|
+
<BoundingBoxOverlay boundingBox={{ left: 0.2, top: 0.2, width: 0.3, height: 0.4 }} />
|
|
127
|
+
</XRViewport.Overlay>
|
|
128
|
+
</XRViewport>
|
|
129
|
+
</XRProvider>
|
|
130
|
+
);
|
|
131
|
+
}
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
Here's a minimal example to get you started with face tracking:
|
|
135
|
+
|
|
136
|
+
```tsx
|
|
137
|
+
import { PerspectiveCamera } from "@react-three/drei";
|
|
138
|
+
import { useEffect } from "react";
|
|
139
|
+
import {
|
|
140
|
+
XRProvider,
|
|
141
|
+
XRScene,
|
|
142
|
+
useXRContext,
|
|
143
|
+
HeadTracker,
|
|
144
|
+
VideoBackground,
|
|
145
|
+
XRMediaSource,
|
|
146
|
+
XRModel,
|
|
147
|
+
} from "@vincentt-xr/sdk";
|
|
148
|
+
|
|
149
|
+
const App = () => {
|
|
150
|
+
const { session } = useXRContext();
|
|
151
|
+
|
|
152
|
+
useEffect(() => {
|
|
153
|
+
const initSession = async () => {
|
|
154
|
+
// 1. Set media source (webcam)
|
|
155
|
+
await session.setMediaSource({ source: XRMediaSource.WEBCAM });
|
|
156
|
+
|
|
157
|
+
// 2. Register tracking models
|
|
158
|
+
await session.registerXRPipeline([{ model: XRModel.FACE_TRACKER }]);
|
|
159
|
+
|
|
160
|
+
// 3. Start the session
|
|
161
|
+
await session.start();
|
|
162
|
+
};
|
|
163
|
+
|
|
164
|
+
initSession();
|
|
165
|
+
}, []);
|
|
166
|
+
|
|
167
|
+
return (
|
|
168
|
+
<XRScene>
|
|
169
|
+
<PerspectiveCamera makeDefault position={[0, 0, 5]} fov={45} />
|
|
170
|
+
<VideoBackground />
|
|
171
|
+
|
|
172
|
+
<ambientLight intensity={1} />
|
|
173
|
+
|
|
174
|
+
<HeadTracker>
|
|
175
|
+
<mesh>
|
|
176
|
+
<boxGeometry args={[1, 1, 1]} />
|
|
177
|
+
<meshStandardMaterial color="hotpink" />
|
|
178
|
+
</mesh>
|
|
179
|
+
</HeadTracker>
|
|
180
|
+
</XRScene>
|
|
181
|
+
);
|
|
182
|
+
};
|
|
183
|
+
|
|
184
|
+
export default function MyApp() {
|
|
185
|
+
return (
|
|
186
|
+
<XRProvider>
|
|
187
|
+
<App />
|
|
188
|
+
</XRProvider>
|
|
189
|
+
);
|
|
190
|
+
}
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
## Architecture
|
|
194
|
+
|
|
195
|
+
The XR SDK is built on a layered architecture:
|
|
196
|
+
|
|
197
|
+
```
|
|
198
|
+
┌─────────────────────────────────────────┐
|
|
199
|
+
│ React Components Layer │
|
|
200
|
+
│ (XRProvider, XRScene, HeadTracker) │
|
|
201
|
+
├─────────────────────────────────────────┤
|
|
202
|
+
│ Session Management Layer │
|
|
203
|
+
│ (useXRSession, XRPipeline) │
|
|
204
|
+
├─────────────────────────────────────────┤
|
|
205
|
+
│ AI Models Layer │
|
|
206
|
+
│ (MediaPipe: Face, Hand, Body, etc.) │
|
|
207
|
+
├─────────────────────────────────────────┤
|
|
208
|
+
│ Video Processing Layer │
|
|
209
|
+
│ (MediaStream → Canvas → Texture) │
|
|
210
|
+
└─────────────────────────────────────────┘
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
### Rendering Architecture
|
|
214
|
+
|
|
215
|
+
The SDK uses a **unified scene with layer-based compositing**:
|
|
216
|
+
|
|
217
|
+
```
|
|
218
|
+
Layer: Background (-1000 to -900)
|
|
219
|
+
└── Video feed, custom backgrounds, segmentation
|
|
220
|
+
|
|
221
|
+
Layer: AR Content (0 to 900)
|
|
222
|
+
└── Face/hand/body tracked objects, 3D content
|
|
223
|
+
|
|
224
|
+
Layer: UI (900+)
|
|
225
|
+
└── Screen-space 2D UI, text overlays
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
**Benefits:**
|
|
229
|
+
|
|
230
|
+
- ✅ Standard R3F events work (onClick, onPointerOver, etc.)
|
|
231
|
+
- ✅ Postprocessing works (EffectComposer, Bloom, etc.)
|
|
232
|
+
- ✅ All Drei components work (Html, Text, etc.)
|
|
233
|
+
- ✅ Single perspective camera (no portal isolation)
|
|
234
|
+
|
|
235
|
+
## Core Concepts
|
|
236
|
+
|
|
237
|
+
### XRProvider
|
|
238
|
+
|
|
239
|
+
The `XRProvider` component wraps your application and provides the XR session context to all child components.
|
|
240
|
+
|
|
241
|
+
```tsx
|
|
242
|
+
import { XRProvider } from "@vincentt-xr/sdk";
|
|
243
|
+
|
|
244
|
+
function App() {
|
|
245
|
+
return (
|
|
246
|
+
<XRProvider>
|
|
247
|
+
{/* Your XR content */}
|
|
248
|
+
<XRProvider>
|
|
249
|
+
);
|
|
250
|
+
}
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
### XRSession
|
|
254
|
+
|
|
255
|
+
The session object manages the lifecycle of your XR experience. Access it via `useXRContext()`:
|
|
256
|
+
|
|
257
|
+
```tsx
|
|
258
|
+
const { session } = useXRContext();
|
|
259
|
+
|
|
260
|
+
// Session lifecycle
|
|
261
|
+
await session.setMediaSource({ source: XRMediaSource.WEBCAM });
|
|
262
|
+
await session.registerXRPipeline([{ model: XRModel.FACE_TRACKER }]);
|
|
263
|
+
await session.start();
|
|
264
|
+
|
|
265
|
+
// Check readiness
|
|
266
|
+
if (session.ready) {
|
|
267
|
+
// Access model data
|
|
268
|
+
const faceNode = session.getModelNode<XRModelNodeFaceTracking>(XRModel.FACE_TRACKER);
|
|
269
|
+
}
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
### XR Pipeline
|
|
273
|
+
|
|
274
|
+
The pipeline is an array of models that will process the video stream:
|
|
275
|
+
|
|
276
|
+
```tsx
|
|
277
|
+
await session.registerXRPipeline([
|
|
278
|
+
{ model: XRModel.FACE_TRACKER },
|
|
279
|
+
{ model: XRModel.HAND_TRACKER },
|
|
280
|
+
{ model: XRModel.BACKGROUND_SEGMENTATION },
|
|
281
|
+
]);
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
### Raw MediaPipe Data Access
|
|
285
|
+
|
|
286
|
+
The SDK exposes raw tracking data for low-level effect work, debugging, and
|
|
287
|
+
AI-assisted development. Use `useXRModelNode()` to read the live model node,
|
|
288
|
+
then pull raw data from the face node directly.
|
|
289
|
+
|
|
290
|
+
```tsx
|
|
291
|
+
import { XRModel, useXRModelNode, type XRModelNodeFaceTracking } from "@vincentt-xr/sdk";
|
|
292
|
+
|
|
293
|
+
const faceNode = useXRModelNode<XRModelNodeFaceTracking>(XRModel.FACE_TRACKER);
|
|
294
|
+
const rawFace = faceNode?.getRawFaceTrackingData(0);
|
|
295
|
+
|
|
296
|
+
const landmarks = rawFace?.landmarks;
|
|
297
|
+
const blendshapes = rawFace?.blendshapes;
|
|
298
|
+
const matrix = rawFace?.transformationMatrix;
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
Use high-level tracker components for composition and the raw-data accessors
|
|
302
|
+
when you need direct MediaPipe-level inspection.
|
|
303
|
+
|
|
304
|
+
Segmentation nodes also expose low-level accessors:
|
|
305
|
+
|
|
306
|
+
```tsx
|
|
307
|
+
const segNode = useXRModelNode<XRModelNodeSegmentation>(XRModel.BACKGROUND_SEGMENTATION);
|
|
308
|
+
const maskCanvas = segNode?.getMaskCanvas();
|
|
309
|
+
const rawSegmentation = segNode?.getRawSegmentationData();
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
This gives custom workflows access to the rendered mask canvas and the raw
|
|
313
|
+
category-mask bytes coming from the segmentation pipeline.
|
|
314
|
+
|
|
315
|
+
## Components
|
|
316
|
+
|
|
317
|
+
### XRScene
|
|
318
|
+
|
|
319
|
+
The main canvas component that renders your XR experience.
|
|
320
|
+
|
|
321
|
+
`XRScene` remains supported, but for new work prefer `XRViewport mode="r3f"` or
|
|
322
|
+
`mode="hybrid"` so media, layout, and overlays share one root.
|
|
323
|
+
|
|
324
|
+
Migration window:
|
|
325
|
+
|
|
326
|
+
- direct `XRScene` entry stays supported while old demos and downstream apps migrate
|
|
327
|
+
- new viewport-first examples are the default reference
|
|
328
|
+
- removal should only happen after viewport parity is validated for webcam, image, and video flows
|
|
329
|
+
|
|
330
|
+
```tsx
|
|
331
|
+
import { XRScene } from "@vincentt-xr/sdk";
|
|
332
|
+
|
|
333
|
+
<XRScene>{/* Your 3D content */}</XRScene>;
|
|
334
|
+
```
|
|
335
|
+
|
|
336
|
+
### XRViewport
|
|
337
|
+
|
|
338
|
+
`XRViewport` is the responsive public entry point for new workflows. It owns:
|
|
339
|
+
|
|
340
|
+
- viewport sizing
|
|
341
|
+
- media source selection
|
|
342
|
+
- cover/contain fitting
|
|
343
|
+
- mirror state
|
|
344
|
+
- DOM overlay composition
|
|
345
|
+
- optional scene adapter mounting
|
|
346
|
+
|
|
347
|
+
Shared viewport state:
|
|
348
|
+
|
|
349
|
+
- `useXRViewportState()` returns the live viewport render state for descendants
|
|
350
|
+
- scene content and overlay content can both consume the same media/layout/mirror truth
|
|
351
|
+
- `XRViewport.Scene` and `XRViewport.Overlay` slot children may be render functions
|
|
352
|
+
- in `mediaStrategy="external"` flows, viewport state can now bridge session face results into `faces` for scene/overlay consumers
|
|
353
|
+
|
|
354
|
+
Modes:
|
|
355
|
+
|
|
356
|
+
- `dom` — responsive preview + DOM/canvas overlays
|
|
357
|
+
- `r3f` — responsive viewport + internal `XRScene` adapter
|
|
358
|
+
- `hybrid` — scene adapter plus overlay layer under one root
|
|
359
|
+
|
|
360
|
+
Media strategies:
|
|
361
|
+
|
|
362
|
+
- `internal` — viewport owns webcam/image/video and tracking preview lifecycle
|
|
363
|
+
- `external` — legacy session/media owner stays in control while viewport provides responsive scene/overlay composition
|
|
364
|
+
|
|
365
|
+
Core props:
|
|
366
|
+
|
|
367
|
+
- `source`
|
|
368
|
+
- `{ kind: "webcam" }`
|
|
369
|
+
- `{ kind: "image", assetId?: string }`
|
|
370
|
+
- `{ kind: "video", assetId?: string }`
|
|
371
|
+
- `mode` — `dom`, `r3f`, or `hybrid`
|
|
372
|
+
- `fitMode` — `auto`, `cover`, or `contain`
|
|
373
|
+
- `initialMirrored` — initial mirror toggle state
|
|
374
|
+
- `mediaStrategy` — `internal` or `external`
|
|
375
|
+
- `imageOptions` / `videoOptions` — selectable assets for internal viewport-owned media
|
|
376
|
+
|
|
377
|
+
Legacy compatibility props still exist:
|
|
378
|
+
|
|
379
|
+
- `initialSource`
|
|
380
|
+
- `initialImageId`
|
|
381
|
+
- `initialVideoId`
|
|
382
|
+
|
|
383
|
+
Prefer `source` for new code so one prop owns the initial media selection contract.
|
|
384
|
+
|
|
385
|
+
### VideoBackground
|
|
386
|
+
|
|
387
|
+
Renders the camera feed with optional segmentation masking and custom backgrounds.
|
|
388
|
+
|
|
389
|
+
```tsx
|
|
390
|
+
import { VideoBackground } from "@vincentt-xr/sdk";
|
|
391
|
+
|
|
392
|
+
<VideoBackground
|
|
393
|
+
segmentationMask={mask} // Optional: Three.js Texture from segmentation
|
|
394
|
+
customBackground="#6366f1" // Optional: Color/image shows through transparent areas
|
|
395
|
+
renderOrder={-999} // Optional: Default is -999
|
|
396
|
+
/>;
|
|
397
|
+
```
|
|
398
|
+
|
|
399
|
+
**Features:**
|
|
400
|
+
|
|
401
|
+
- Automatically calculates screen-filling dimensions
|
|
402
|
+
- Supports background segmentation for person cutout effects
|
|
403
|
+
- Custom background color/texture shown through transparent areas
|
|
404
|
+
- Proper depth ordering with `renderOrder`
|
|
405
|
+
- Flat background semantics: the material keeps depth testing and depth writing
|
|
406
|
+
disabled. Use the debug-ui `XRSceneViewport` editor plane when the camera feed
|
|
407
|
+
should behave as 3D geometry.
|
|
408
|
+
|
|
409
|
+
### XRLayer
|
|
410
|
+
|
|
411
|
+
`XRLayer` is a lightweight DOM composition primitive for stacking display
|
|
412
|
+
surfaces, debug overlays, and screen-space canvases without introducing a
|
|
413
|
+
temporary `v3`-named API surface.
|
|
414
|
+
|
|
415
|
+
```tsx
|
|
416
|
+
<XRLayer
|
|
417
|
+
config={{
|
|
418
|
+
name: "overlay-target",
|
|
419
|
+
clearColor: "transparent",
|
|
420
|
+
pointerEvents: "none",
|
|
421
|
+
zIndex: 2,
|
|
422
|
+
}}
|
|
423
|
+
>
|
|
424
|
+
<div>Overlay content</div>
|
|
425
|
+
</XRLayer>
|
|
426
|
+
```
|
|
427
|
+
|
|
428
|
+
### XRMediaSurface and XRTrackingOverlay
|
|
429
|
+
|
|
430
|
+
These components provide production-named canvas-based media rendering and
|
|
431
|
+
tracking-preview rendering for workflows that still need DOM/canvas layering
|
|
432
|
+
outside the main R3F scene.
|
|
433
|
+
|
|
434
|
+
```tsx
|
|
435
|
+
<XRMediaSurface
|
|
436
|
+
canvasRef={displayCanvasRef}
|
|
437
|
+
imageRef={imageRef}
|
|
438
|
+
videoRef={videoRef}
|
|
439
|
+
layer={liveLayer}
|
|
440
|
+
layout={layout}
|
|
441
|
+
mirrored
|
|
442
|
+
sourceKind="video"
|
|
443
|
+
/>
|
|
444
|
+
|
|
445
|
+
<XRTrackingOverlay
|
|
446
|
+
canvasRef={trackingCanvasRef}
|
|
447
|
+
imageRef={imageRef}
|
|
448
|
+
videoRef={videoRef}
|
|
449
|
+
layer={trackingLayer}
|
|
450
|
+
layout={layout}
|
|
451
|
+
mirrored
|
|
452
|
+
sourceKind="video"
|
|
453
|
+
debugVisible={showTrackingCanvas}
|
|
454
|
+
viewportSize={viewportSize}
|
|
455
|
+
/>
|
|
456
|
+
```
|
|
457
|
+
|
|
458
|
+
### HeadTracker
|
|
459
|
+
|
|
460
|
+
A component that automatically follows the detected face position and rotation.
|
|
461
|
+
|
|
462
|
+
```tsx
|
|
463
|
+
import { HeadTracker } from "@vincentt-xr/sdk";
|
|
464
|
+
|
|
465
|
+
<HeadTracker faceIndex={0}>
|
|
466
|
+
{" "}
|
|
467
|
+
{/* Optional: which face to track (default: 0) */}
|
|
468
|
+
<mesh>
|
|
469
|
+
<boxGeometry args={[1, 1, 1]} />
|
|
470
|
+
<meshStandardMaterial color="red" />
|
|
471
|
+
</mesh>
|
|
472
|
+
</HeadTracker>;
|
|
473
|
+
```
|
|
474
|
+
|
|
475
|
+
**How it works:**
|
|
476
|
+
|
|
477
|
+
- Uses `useFrame` to continuously update position/rotation from face tracking data
|
|
478
|
+
- Automatically converts MediaPipe coordinates to Three.js world space
|
|
479
|
+
- Supports all standard R3F events (onClick, onPointerOver, etc.)
|
|
480
|
+
|
|
481
|
+
### MeshRenderer render state
|
|
482
|
+
|
|
483
|
+
`MeshRenderer` supports primitive meshes and asset-backed GLTF/GLB meshes through
|
|
484
|
+
serialized `MeshRendererSettings`.
|
|
485
|
+
|
|
486
|
+
Advanced draw state lives under `material.renderState`:
|
|
487
|
+
|
|
488
|
+
```ts
|
|
489
|
+
material: {
|
|
490
|
+
type: "standard",
|
|
491
|
+
color: "#ffffff",
|
|
492
|
+
opacity: 1,
|
|
493
|
+
wireframe: false,
|
|
494
|
+
roughness: 0.42,
|
|
495
|
+
metalness: 0.08,
|
|
496
|
+
renderState: {
|
|
497
|
+
depthTest: true,
|
|
498
|
+
depthWrite: true,
|
|
499
|
+
depthFunc: "lessEqual",
|
|
500
|
+
colorWrite: true,
|
|
501
|
+
colorMask: { r: true, g: true, b: true, a: true },
|
|
502
|
+
cullMode: "back",
|
|
503
|
+
blendMode: "normal",
|
|
504
|
+
polygonOffset: { enabled: false, factor: 0, units: 0 },
|
|
505
|
+
},
|
|
506
|
+
}
|
|
507
|
+
```
|
|
508
|
+
|
|
509
|
+
`colorMask` controls per-channel RGBA writes. It is applied as scoped WebGL draw
|
|
510
|
+
state and restored after the mesh renders. `instanceCount` is not part of
|
|
511
|
+
material render state; it belongs to a future instanced-mesh API.
|
|
512
|
+
|
|
513
|
+
### PinToMesh
|
|
514
|
+
|
|
515
|
+
`PinToMesh` pins a wrapper object to a target mesh surface resolved from a
|
|
516
|
+
scene-object ID or direct `Object3D` target.
|
|
517
|
+
|
|
518
|
+
```ts
|
|
519
|
+
{
|
|
520
|
+
enabled: false,
|
|
521
|
+
targetObjectId: null,
|
|
522
|
+
orientation: "none",
|
|
523
|
+
uv: { x: 0.5, y: 0.5 },
|
|
524
|
+
vertexNormal: false,
|
|
525
|
+
offsetSpace: "local",
|
|
526
|
+
offsetPosition: { x: 0, y: 0, z: 0 },
|
|
527
|
+
offsetRotation: { x: 0, y: 0, z: 0 },
|
|
528
|
+
}
|
|
529
|
+
```
|
|
530
|
+
|
|
531
|
+
When disabled, or when the target is unavailable, the runtime wrapper resets to
|
|
532
|
+
local position `0,0,0` and identity rotation. Authored object placement stays in
|
|
533
|
+
the child `Transform3D`.
|
|
534
|
+
|
|
535
|
+
`PinToMeshSettingsPanel` in `@vincentt-xr/sdk/debug-ui` uses Transform-style text
|
|
536
|
+
number inputs for UV and offsets: visible zero defaults, decimal validation, and
|
|
537
|
+
0.1 arrow-step increments.
|
|
538
|
+
|
|
539
|
+
### Reusable XR scene editor debug UI
|
|
540
|
+
|
|
541
|
+
Temporary editor surfaces should use `@vincentt-xr/sdk/debug-ui` instead of
|
|
542
|
+
rewriting hierarchy, inspector, viewport, and toolbar wiring per app.
|
|
543
|
+
|
|
544
|
+
```tsx
|
|
545
|
+
import {
|
|
546
|
+
SceneHierarchyPanel,
|
|
547
|
+
SceneInspectorPanel,
|
|
548
|
+
ViewportToolbar,
|
|
549
|
+
XRSceneEditorProvider,
|
|
550
|
+
XRSceneViewport,
|
|
551
|
+
} from "@vincentt-xr/sdk/debug-ui";
|
|
552
|
+
|
|
553
|
+
<XRSceneEditorProvider
|
|
554
|
+
store={store}
|
|
555
|
+
selectedObjectId={selectedObjectId}
|
|
556
|
+
onSelectObject={setSelectedObjectId}
|
|
557
|
+
onStoreChange={setStore}
|
|
558
|
+
onComponentChange={replaceComponent}
|
|
559
|
+
onObjectChange={replaceObject}
|
|
560
|
+
>
|
|
561
|
+
<XRSceneViewport />
|
|
562
|
+
<ViewportToolbar />
|
|
563
|
+
<SceneHierarchyPanel />
|
|
564
|
+
<SceneInspectorPanel />
|
|
565
|
+
</XRSceneEditorProvider>;
|
|
566
|
+
```
|
|
567
|
+
|
|
568
|
+
The editor components adapt to `SceneObjectStore`; they do not own persistent
|
|
569
|
+
scene data. Selection, orbit controls, grid visibility, and editor camera state
|
|
570
|
+
are transient editor state. `XRSceneViewport` owns a separate camera-texture
|
|
571
|
+
plane with `depthTest` and `depthWrite` so the camera feed behaves as real
|
|
572
|
+
editor-scene geometry without changing core `VideoBackground` behavior.
|
|
573
|
+
|
|
574
|
+
### ScreenSpaceUI
|
|
575
|
+
|
|
576
|
+
Provides 2D UI positioning with helper components for common positions.
|
|
577
|
+
|
|
578
|
+
```tsx
|
|
579
|
+
import { ScreenSpaceUI } from "@vincentt-xr/sdk";
|
|
580
|
+
import { Text } from "@react-three/drei";
|
|
581
|
+
|
|
582
|
+
<ScreenSpaceUI>
|
|
583
|
+
<ScreenSpaceUI.TopLeft>
|
|
584
|
+
<Text fontSize={0.15} color="white">
|
|
585
|
+
Top Left UI
|
|
586
|
+
</Text>
|
|
587
|
+
</ScreenSpaceUI.TopLeft>
|
|
588
|
+
|
|
589
|
+
<ScreenSpaceUI.BottomCenter>
|
|
590
|
+
<mesh onClick={() => console.log("clicked")}>
|
|
591
|
+
<planeGeometry args={[1, 0.4]} />
|
|
592
|
+
<meshBasicMaterial color="blue" depthTest={false} />
|
|
593
|
+
</mesh>
|
|
594
|
+
</ScreenSpaceUI.BottomCenter>
|
|
595
|
+
|
|
596
|
+
<ScreenSpaceUI.TopRight>
|
|
597
|
+
<Text fontSize={0.1} color="green">
|
|
598
|
+
Top Right Status
|
|
599
|
+
</Text>
|
|
600
|
+
</ScreenSpaceUI.TopRight>
|
|
601
|
+
</ScreenSpaceUI>;
|
|
602
|
+
```
|
|
603
|
+
|
|
604
|
+
**Available positions:**
|
|
605
|
+
|
|
606
|
+
- `TopLeft`, `TopCenter`, `TopRight`
|
|
607
|
+
- `CenterLeft`, `Center`, `CenterRight`
|
|
608
|
+
- `BottomLeft`, `BottomCenter`, `BottomRight`
|
|
609
|
+
|
|
610
|
+
**Features:**
|
|
611
|
+
|
|
612
|
+
- Calculates screen dimensions based on camera FOV
|
|
613
|
+
- Uses `depthTest={false}` for always-on-top rendering
|
|
614
|
+
- Supports all R3F events
|
|
615
|
+
- High `renderOrder` (999+) for proper layering
|
|
616
|
+
|
|
617
|
+
### FaceMesh
|
|
618
|
+
|
|
619
|
+
Renders a 3D mesh that follows the face geometry.
|
|
620
|
+
|
|
621
|
+
```tsx
|
|
622
|
+
import { FaceMesh } from "@vincentt-xr/sdk";
|
|
623
|
+
|
|
624
|
+
<FaceMesh faceIndex={0} wireframe={true} color="blue" />;
|
|
625
|
+
```
|
|
626
|
+
|
|
627
|
+
### HeadOccluder
|
|
628
|
+
|
|
629
|
+
Renders an invisible mesh that occludes objects behind the head.
|
|
630
|
+
|
|
631
|
+
```tsx
|
|
632
|
+
import { HeadOccluder } from "@vincentt-xr/sdk";
|
|
633
|
+
|
|
634
|
+
<HeadOccluder faceIndex={0} />;
|
|
635
|
+
```
|
|
636
|
+
|
|
637
|
+
## Tracking Models
|
|
638
|
+
|
|
639
|
+
### Available Models
|
|
640
|
+
|
|
641
|
+
The SDK provides five tracking models through the `XRModel` enum:
|
|
642
|
+
|
|
643
|
+
```tsx
|
|
644
|
+
enum XRModel {
|
|
645
|
+
FACE_TRACKER = "vincentt.xr.face-tracker",
|
|
646
|
+
HAND_TRACKER = "vincentt.xr.hand-tracker",
|
|
647
|
+
GESTURE_TRACKER = "vincentt.xr.gesture-tracker",
|
|
648
|
+
BODY_TRACKER = "vincentt.xr.body-tracker",
|
|
649
|
+
BACKGROUND_SEGMENTATION = "vincentt.xr.background-segmentation",
|
|
650
|
+
}
|
|
651
|
+
```
|
|
652
|
+
|
|
653
|
+
### Face Tracking
|
|
654
|
+
|
|
655
|
+
Provides 478 facial landmarks, face blendshapes, and rotation matrices.
|
|
656
|
+
|
|
657
|
+
```tsx
|
|
658
|
+
import { XRModel, XRModelNodeFaceTracking } from "@vincentt-xr/sdk";
|
|
659
|
+
|
|
660
|
+
// Register model
|
|
661
|
+
await session.registerXRPipeline([{ model: XRModel.FACE_TRACKER }]);
|
|
662
|
+
|
|
663
|
+
// Access face data
|
|
664
|
+
const faceNode = session.getModelNode<XRModelNodeFaceTracking>(XRModel.FACE_TRACKER);
|
|
665
|
+
|
|
666
|
+
const face = faceNode?.getFace(0); // Get first detected face
|
|
667
|
+
if (face) {
|
|
668
|
+
console.log("Position:", face.position); // { x, y, z }
|
|
669
|
+
console.log("Rotation:", face.rotation); // { x, y, z }
|
|
670
|
+
console.log("Scale:", face.scale); // number
|
|
671
|
+
console.log("Blendshapes:", face.blendshapes); // Map of facial expressions
|
|
672
|
+
}
|
|
673
|
+
```
|
|
674
|
+
|
|
675
|
+
**Face Object Structure:**
|
|
676
|
+
|
|
677
|
+
```typescript
|
|
678
|
+
type Face = {
|
|
679
|
+
position: { x: number; y: number; z: number };
|
|
680
|
+
rotation: { x: number; y: number; z: number };
|
|
681
|
+
scale: number;
|
|
682
|
+
blendshapes?: Map<string, number>;
|
|
683
|
+
transformationMatrices?: Matrix[];
|
|
684
|
+
};
|
|
685
|
+
```
|
|
686
|
+
|
|
687
|
+
### Hand Tracking
|
|
688
|
+
|
|
689
|
+
Provides 21 hand landmarks per hand.
|
|
690
|
+
|
|
691
|
+
```tsx
|
|
692
|
+
import { XRModel, XRModelNodeHandTracking } from "@vincentt-xr/sdk";
|
|
693
|
+
|
|
694
|
+
// Register model
|
|
695
|
+
await session.registerXRPipeline([{ model: XRModel.HAND_TRACKER }]);
|
|
696
|
+
|
|
697
|
+
// Access hand data
|
|
698
|
+
const handNode = session.getModelNode<XRModelNodeHandTracking>(XRModel.HAND_TRACKER);
|
|
699
|
+
|
|
700
|
+
if (handNode?.coordinates) {
|
|
701
|
+
const { left, right } = handNode.coordinates;
|
|
702
|
+
|
|
703
|
+
if (left) {
|
|
704
|
+
console.log("Left hand landmarks:", left); // Array of 21 coordinates
|
|
705
|
+
}
|
|
706
|
+
|
|
707
|
+
if (right) {
|
|
708
|
+
console.log("Right hand landmarks:", right); // Array of 21 coordinates
|
|
709
|
+
}
|
|
710
|
+
}
|
|
711
|
+
|
|
712
|
+
// Gesture detection (simple open/closed)
|
|
713
|
+
console.log("Gesture:", handNode?.gesture);
|
|
714
|
+
```
|
|
715
|
+
|
|
716
|
+
### Gesture Tracking
|
|
717
|
+
|
|
718
|
+
Hand landmarks with advanced gesture recognition.
|
|
719
|
+
|
|
720
|
+
```tsx
|
|
721
|
+
import { XRModel, XRModelNodeGestureTracking } from "@vincentt-xr/sdk";
|
|
722
|
+
|
|
723
|
+
// Register model
|
|
724
|
+
await session.registerXRPipeline([{ model: XRModel.GESTURE_TRACKER }]);
|
|
725
|
+
|
|
726
|
+
// Access gesture data
|
|
727
|
+
const gestureNode = session.getModelNode<XRModelNodeGestureTracking>(XRModel.GESTURE_TRACKER);
|
|
728
|
+
|
|
729
|
+
if (gestureNode?.gesture) {
|
|
730
|
+
const { left, right } = gestureNode.gesture;
|
|
731
|
+
|
|
732
|
+
// Recognized gestures:
|
|
733
|
+
// - ClosedFist
|
|
734
|
+
// - OpenPalm
|
|
735
|
+
// - PointingUp
|
|
736
|
+
// - ThumbDown
|
|
737
|
+
// - ThumbUp
|
|
738
|
+
// - Victory
|
|
739
|
+
// - ILoveYou
|
|
740
|
+
|
|
741
|
+
console.log("Left hand gesture:", left);
|
|
742
|
+
console.log("Right hand gesture:", right);
|
|
743
|
+
}
|
|
744
|
+
```
|
|
745
|
+
|
|
746
|
+
### Body Tracking
|
|
747
|
+
|
|
748
|
+
Provides 33 body landmarks using BlazePose.
|
|
749
|
+
|
|
750
|
+
```tsx
|
|
751
|
+
import { XRModel, XRModelNodeBodyTracking } from "@vincentt-xr/sdk";
|
|
752
|
+
|
|
753
|
+
// Register model
|
|
754
|
+
await session.registerXRPipeline([{ model: XRModel.BODY_TRACKER }]);
|
|
755
|
+
|
|
756
|
+
// Access body data
|
|
757
|
+
const bodyNode = session.getModelNode<XRModelNodeBodyTracking>(XRModel.BODY_TRACKER);
|
|
758
|
+
|
|
759
|
+
const landmarks = bodyNode?.getLandmarks2D(0); // Get first detected person
|
|
760
|
+
if (landmarks) {
|
|
761
|
+
console.log("Body landmarks:", landmarks); // Array of 33 2D coordinates
|
|
762
|
+
}
|
|
763
|
+
```
|
|
764
|
+
|
|
765
|
+
### Background Segmentation
|
|
766
|
+
|
|
767
|
+
Provides real-time person segmentation mask with configurable quality settings.
|
|
768
|
+
|
|
769
|
+
```tsx
|
|
770
|
+
import { useState, useEffect } from "react";
|
|
771
|
+
import { Texture } from "three";
|
|
772
|
+
import { XRModel, XRModelNodeSegmentation } from "@vincentt-xr/sdk";
|
|
773
|
+
|
|
774
|
+
const [segmentationMask, setSegmentationMask] = useState<Texture | undefined>();
|
|
775
|
+
|
|
776
|
+
// Register model with quality option
|
|
777
|
+
await session.registerXRPipeline([
|
|
778
|
+
{
|
|
779
|
+
model: XRModel.BACKGROUND_SEGMENTATION,
|
|
780
|
+
options: { quality: "high" }, // 'low' | 'medium' | 'high'
|
|
781
|
+
},
|
|
782
|
+
]);
|
|
783
|
+
|
|
784
|
+
// Get segmentation mask
|
|
785
|
+
useEffect(() => {
|
|
786
|
+
if (session.ready) {
|
|
787
|
+
const segmentationNode = session.getModelNode<XRModelNodeSegmentation>(
|
|
788
|
+
XRModel.BACKGROUND_SEGMENTATION,
|
|
789
|
+
);
|
|
790
|
+
setSegmentationMask(segmentationNode?.backgroundSegmentationMask);
|
|
791
|
+
}
|
|
792
|
+
}, [session.ready]);
|
|
793
|
+
|
|
794
|
+
// Use with VideoBackground
|
|
795
|
+
<VideoBackground
|
|
796
|
+
segmentationMask={segmentationMask}
|
|
797
|
+
customBackground="#6366f1" // Background color shows through transparent areas
|
|
798
|
+
/>;
|
|
799
|
+
```
|
|
800
|
+
|
|
801
|
+
**Quality Options:**
|
|
802
|
+
|
|
803
|
+
- `quality: "low"` (default) - 0.5x resolution, fastest performance, lower quality edges
|
|
804
|
+
- `quality: "medium"` - 0.75x resolution, balanced performance and quality
|
|
805
|
+
- `quality: "high"` - 1.0x resolution, best quality edges, higher GPU usage
|
|
806
|
+
|
|
807
|
+
**Performance Impact:**
|
|
808
|
+
|
|
809
|
+
- Low: Processes 4x fewer pixels, recommended for mobile devices
|
|
810
|
+
- Medium: Good balance for most desktop applications
|
|
811
|
+
- High: Best quality for high-end devices or when quality is critical
|
|
812
|
+
|
|
813
|
+
**Example with different quality levels:**
|
|
814
|
+
|
|
815
|
+
```tsx
|
|
816
|
+
// Mobile/low-end devices
|
|
817
|
+
await session.registerXRPipeline([
|
|
818
|
+
{ model: XRModel.BACKGROUND_SEGMENTATION, options: { quality: "low" } },
|
|
819
|
+
]);
|
|
820
|
+
|
|
821
|
+
// Desktop/balanced
|
|
822
|
+
await session.registerXRPipeline([
|
|
823
|
+
{ model: XRModel.BACKGROUND_SEGMENTATION, options: { quality: "medium" } },
|
|
824
|
+
]);
|
|
825
|
+
|
|
826
|
+
// High-end/quality-critical
|
|
827
|
+
await session.registerXRPipeline([
|
|
828
|
+
{ model: XRModel.BACKGROUND_SEGMENTATION, options: { quality: "high" } },
|
|
829
|
+
]);
|
|
830
|
+
```
|
|
831
|
+
|
|
832
|
+
## Complete Example
|
|
833
|
+
|
|
834
|
+
Here's a complete example demonstrating face tracking, segmentation, and screen-space UI:
|
|
835
|
+
|
|
836
|
+
```tsx
|
|
837
|
+
import { PerspectiveCamera } from "@react-three/drei";
|
|
838
|
+
import { useEffect, useState } from "react";
|
|
839
|
+
import { Texture } from "three";
|
|
840
|
+
import {
|
|
841
|
+
HeadTracker,
|
|
842
|
+
ScreenSpaceUI,
|
|
843
|
+
useXRContext,
|
|
844
|
+
VideoBackground,
|
|
845
|
+
XRMediaSource,
|
|
846
|
+
XRModel,
|
|
847
|
+
XRModelNodeSegmentation,
|
|
848
|
+
XRProvider,
|
|
849
|
+
XRScene,
|
|
850
|
+
} from "@vincentt-xr/sdk";
|
|
851
|
+
|
|
852
|
+
const Content = () => {
|
|
853
|
+
const { session } = useXRContext();
|
|
854
|
+
const [segmentationMask, setSegmentationMask] = useState<Texture | undefined>();
|
|
855
|
+
const [clickCount, setClickCount] = useState(0);
|
|
856
|
+
|
|
857
|
+
// Initialize XR session
|
|
858
|
+
useEffect(() => {
|
|
859
|
+
const initSession = async () => {
|
|
860
|
+
await session.setMediaSource({ source: XRMediaSource.WEBCAM });
|
|
861
|
+
await session.registerXRPipeline([
|
|
862
|
+
{ model: XRModel.FACE_TRACKER },
|
|
863
|
+
{ model: XRModel.BACKGROUND_SEGMENTATION, options: { quality: "high" } },
|
|
864
|
+
]);
|
|
865
|
+
await session.start();
|
|
866
|
+
};
|
|
867
|
+
|
|
868
|
+
initSession();
|
|
869
|
+
}, []);
|
|
870
|
+
|
|
871
|
+
// Get segmentation mask when ready
|
|
872
|
+
useEffect(() => {
|
|
873
|
+
if (session.ready) {
|
|
874
|
+
const segmentationNode = session.getModelNode<XRModelNodeSegmentation>(
|
|
875
|
+
XRModel.BACKGROUND_SEGMENTATION,
|
|
876
|
+
);
|
|
877
|
+
setSegmentationMask(segmentationNode?.backgroundSegmentationMask);
|
|
878
|
+
}
|
|
879
|
+
}, [session.ready]);
|
|
880
|
+
|
|
881
|
+
return (
|
|
882
|
+
<XRScene>
|
|
883
|
+
{/* Camera */}
|
|
884
|
+
<PerspectiveCamera makeDefault position={[0, 0, 5]} fov={45} />
|
|
885
|
+
|
|
886
|
+
{/* Video background with segmentation */}
|
|
887
|
+
<VideoBackground segmentationMask={segmentationMask} customBackground="#6366f1" />
|
|
888
|
+
|
|
889
|
+
{/* Lighting */}
|
|
890
|
+
<ambientLight intensity={1} />
|
|
891
|
+
<directionalLight position={[5, 5, 5]} intensity={1} />
|
|
892
|
+
|
|
893
|
+
{/* Face-tracked 3D content with events */}
|
|
894
|
+
<HeadTracker>
|
|
895
|
+
<mesh onClick={() => setClickCount((prev) => prev + 1)} position={[0, 0, -5]}>
|
|
896
|
+
<boxGeometry args={[10, 10, 1]} />
|
|
897
|
+
<meshStandardMaterial color="hotpink" />
|
|
898
|
+
</mesh>
|
|
899
|
+
</HeadTracker>
|
|
900
|
+
|
|
901
|
+
{/* Screen-space UI */}
|
|
902
|
+
<ScreenSpaceUI>
|
|
903
|
+
<ScreenSpaceUI.TopLeft>
|
|
904
|
+
<Text
|
|
905
|
+
fontSize={0.15}
|
|
906
|
+
color="white"
|
|
907
|
+
anchorX="left"
|
|
908
|
+
anchorY="top"
|
|
909
|
+
material-depthTest={false}
|
|
910
|
+
>
|
|
911
|
+
{`Clicks: ${clickCount}`}
|
|
912
|
+
</Text>
|
|
913
|
+
</ScreenSpaceUI.TopLeft>
|
|
914
|
+
</ScreenSpaceUI>
|
|
915
|
+
</XRScene>
|
|
916
|
+
);
|
|
917
|
+
};
|
|
918
|
+
|
|
919
|
+
export default function App() {
|
|
920
|
+
return (
|
|
921
|
+
<XRProvider>
|
|
922
|
+
<Content />
|
|
923
|
+
</XRProvider>
|
|
924
|
+
);
|
|
925
|
+
}
|
|
926
|
+
```
|
|
927
|
+
|
|
928
|
+
## API Reference
|
|
929
|
+
|
|
930
|
+
### Components
|
|
931
|
+
|
|
932
|
+
#### `<XRProvider>`
|
|
933
|
+
|
|
934
|
+
Provides XR session context to child components.
|
|
935
|
+
|
|
936
|
+
**Props:** None
|
|
937
|
+
|
|
938
|
+
**Usage:**
|
|
939
|
+
|
|
940
|
+
```tsx
|
|
941
|
+
<XRProvider>
|
|
942
|
+
<App />
|
|
943
|
+
</XRProvider>
|
|
944
|
+
```
|
|
945
|
+
|
|
946
|
+
#### `<XRScene>`
|
|
947
|
+
|
|
948
|
+
Main canvas component for rendering XR content.
|
|
949
|
+
|
|
950
|
+
**Props:** Accepts all standard R3F Canvas props
|
|
951
|
+
|
|
952
|
+
**Usage:**
|
|
953
|
+
|
|
954
|
+
```tsx
|
|
955
|
+
<XRScene>{/* Your 3D content */}</XRScene>
|
|
956
|
+
```
|
|
957
|
+
|
|
958
|
+
#### `<VideoBackground>`
|
|
959
|
+
|
|
960
|
+
Renders the camera feed with optional effects.
|
|
961
|
+
|
|
962
|
+
**Props:**
|
|
963
|
+
|
|
964
|
+
- `segmentationMask?: Texture` - Segmentation mask texture
|
|
965
|
+
- `customBackground?: string | Texture` - Background shown through transparent areas
|
|
966
|
+
- `renderOrder?: number` - Default: -999
|
|
967
|
+
|
|
968
|
+
#### `<HeadTracker>`
|
|
969
|
+
|
|
970
|
+
Container that follows face tracking data.
|
|
971
|
+
|
|
972
|
+
**Props:**
|
|
973
|
+
|
|
974
|
+
- `faceIndex?: number` - Which face to track (default: 0)
|
|
975
|
+
- `children: ReactNode` - 3D objects to track
|
|
976
|
+
|
|
977
|
+
#### `<ScreenSpaceUI>`
|
|
978
|
+
|
|
979
|
+
Container for screen-space UI elements.
|
|
980
|
+
|
|
981
|
+
**Props:** None
|
|
982
|
+
|
|
983
|
+
**Helper Components:**
|
|
984
|
+
|
|
985
|
+
- `ScreenSpaceUI.TopLeft`
|
|
986
|
+
- `ScreenSpaceUI.TopCenter`
|
|
987
|
+
- `ScreenSpaceUI.TopRight`
|
|
988
|
+
- `ScreenSpaceUI.CenterLeft`
|
|
989
|
+
- `ScreenSpaceUI.Center`
|
|
990
|
+
- `ScreenSpaceUI.CenterRight`
|
|
991
|
+
- `ScreenSpaceUI.BottomLeft`
|
|
992
|
+
- `ScreenSpaceUI.BottomCenter`
|
|
993
|
+
- `ScreenSpaceUI.BottomRight`
|
|
994
|
+
|
|
995
|
+
#### `<FaceMesh>`
|
|
996
|
+
|
|
997
|
+
Renders a 3D mesh following face geometry.
|
|
998
|
+
|
|
999
|
+
**Props:**
|
|
1000
|
+
|
|
1001
|
+
- `faceIndex?: number` - Which face to render (default: 0)
|
|
1002
|
+
- `wireframe?: boolean` - Render as wireframe
|
|
1003
|
+
- `color?: string` - Mesh color
|
|
1004
|
+
|
|
1005
|
+
#### `<HeadOccluder>`
|
|
1006
|
+
|
|
1007
|
+
Invisible mesh for occluding objects behind the head.
|
|
1008
|
+
|
|
1009
|
+
**Props:**
|
|
1010
|
+
|
|
1011
|
+
- `faceIndex?: number` - Which face to occlude (default: 0)
|
|
1012
|
+
|
|
1013
|
+
### Hooks
|
|
1014
|
+
|
|
1015
|
+
#### `useXRContext()`
|
|
1016
|
+
|
|
1017
|
+
Access the XR session context.
|
|
1018
|
+
|
|
1019
|
+
**Returns:**
|
|
1020
|
+
|
|
1021
|
+
```typescript
|
|
1022
|
+
{
|
|
1023
|
+
session: XRSession;
|
|
1024
|
+
}
|
|
1025
|
+
```
|
|
1026
|
+
|
|
1027
|
+
**XRSession Methods:**
|
|
1028
|
+
|
|
1029
|
+
- `setMediaSource(options: { source: XRMediaSource })` - Set video source
|
|
1030
|
+
- `registerXRPipeline(models: Array<{ model: XRModel }>)` - Register tracking models
|
|
1031
|
+
- `start()` - Start the XR session
|
|
1032
|
+
- `getModelNode<T>(model: XRModel): T | undefined` - Get model data
|
|
1033
|
+
|
|
1034
|
+
**XRSession Properties:**
|
|
1035
|
+
|
|
1036
|
+
- `ready: boolean` - Whether session is ready
|
|
1037
|
+
- `error: object | null` - Error state if any
|
|
1038
|
+
|
|
1039
|
+
#### `useScreenSpace()`
|
|
1040
|
+
|
|
1041
|
+
Access screen space dimensions for custom UI positioning.
|
|
1042
|
+
|
|
1043
|
+
**Returns:**
|
|
1044
|
+
|
|
1045
|
+
```typescript
|
|
1046
|
+
{
|
|
1047
|
+
screenWidth: number,
|
|
1048
|
+
screenHeight: number
|
|
1049
|
+
}
|
|
1050
|
+
```
|
|
1051
|
+
|
|
1052
|
+
### Enums
|
|
1053
|
+
|
|
1054
|
+
#### `XRMediaSource`
|
|
1055
|
+
|
|
1056
|
+
```typescript
|
|
1057
|
+
enum XRMediaSource {
|
|
1058
|
+
WEBCAM = "webcam",
|
|
1059
|
+
STREAM = "stream",
|
|
1060
|
+
}
|
|
1061
|
+
```
|
|
1062
|
+
|
|
1063
|
+
#### `XRModel`
|
|
1064
|
+
|
|
1065
|
+
```typescript
|
|
1066
|
+
enum XRModel {
|
|
1067
|
+
FACE_TRACKER = "vincentt.xr.face-tracker",
|
|
1068
|
+
HAND_TRACKER = "vincentt.xr.hand-tracker",
|
|
1069
|
+
GESTURE_TRACKER = "vincentt.xr.gesture-tracker",
|
|
1070
|
+
BODY_TRACKER = "vincentt.xr.body-tracker",
|
|
1071
|
+
BACKGROUND_SEGMENTATION = "vincentt.xr.background-segmentation",
|
|
1072
|
+
}
|
|
1073
|
+
```
|
|
1074
|
+
|
|
1075
|
+
### Types
|
|
1076
|
+
|
|
1077
|
+
#### `XRModelNodeFaceTracking`
|
|
1078
|
+
|
|
1079
|
+
```typescript
|
|
1080
|
+
type XRModelNodeFaceTracking = {
|
|
1081
|
+
detectionResults?: FaceLandmarkerResult;
|
|
1082
|
+
getFace: (faceIndex?: number) => Face | undefined;
|
|
1083
|
+
};
|
|
1084
|
+
|
|
1085
|
+
type Face = {
|
|
1086
|
+
position: { x: number; y: number; z: number };
|
|
1087
|
+
rotation: { x: number; y: number; z: number };
|
|
1088
|
+
scale: number;
|
|
1089
|
+
blendshapes?: Map<string, number>;
|
|
1090
|
+
transformationMatrices?: Matrix[];
|
|
1091
|
+
};
|
|
1092
|
+
```
|
|
1093
|
+
|
|
1094
|
+
#### `XRModelNodeHandTracking`
|
|
1095
|
+
|
|
1096
|
+
```typescript
|
|
1097
|
+
type XRModelNodeHandTracking = {
|
|
1098
|
+
coordinates?: {
|
|
1099
|
+
left?: Coordinate[];
|
|
1100
|
+
right?: Coordinate[];
|
|
1101
|
+
};
|
|
1102
|
+
gesture?: {
|
|
1103
|
+
left?: string;
|
|
1104
|
+
right?: string;
|
|
1105
|
+
};
|
|
1106
|
+
};
|
|
1107
|
+
```
|
|
1108
|
+
|
|
1109
|
+
#### `XRModelNodeGestureTracking`
|
|
1110
|
+
|
|
1111
|
+
```typescript
|
|
1112
|
+
type XRModelNodeGestureTracking = {
|
|
1113
|
+
coordinates?: {
|
|
1114
|
+
left?: Coordinate[];
|
|
1115
|
+
right?: Coordinate[];
|
|
1116
|
+
};
|
|
1117
|
+
gesture?: {
|
|
1118
|
+
left?: GestureType;
|
|
1119
|
+
right?: GestureType;
|
|
1120
|
+
};
|
|
1121
|
+
};
|
|
1122
|
+
|
|
1123
|
+
type GestureType =
|
|
1124
|
+
| "ClosedFist"
|
|
1125
|
+
| "OpenPalm"
|
|
1126
|
+
| "PointingUp"
|
|
1127
|
+
| "ThumbDown"
|
|
1128
|
+
| "ThumbUp"
|
|
1129
|
+
| "Victory"
|
|
1130
|
+
| "ILoveYou";
|
|
1131
|
+
```
|
|
1132
|
+
|
|
1133
|
+
#### `XRModelNodeBodyTracking`
|
|
1134
|
+
|
|
1135
|
+
```typescript
|
|
1136
|
+
type XRModelNodeBodyTracking = {
|
|
1137
|
+
getLandmarks2D: (bodyIndex?: number) => Coordinate[] | undefined;
|
|
1138
|
+
};
|
|
1139
|
+
```
|
|
1140
|
+
|
|
1141
|
+
#### `XRModelNodeSegmentation`
|
|
1142
|
+
|
|
1143
|
+
```typescript
|
|
1144
|
+
type XRModelNodeSegmentation = {
|
|
1145
|
+
backgroundSegmentationMask?: Texture;
|
|
1146
|
+
};
|
|
1147
|
+
```
|
|
1148
|
+
|
|
1149
|
+
---
|
|
1150
|
+
|
|
1151
|
+
For more examples, check the `example/src/pages/` directory in the repository.
|
|
1152
|
+
|
|
1153
|
+
**Additional Resources:**
|
|
1154
|
+
|
|
1155
|
+
- [Migration Guide](./MIGRATION_GUIDE.md) - Migrating from older versions
|