@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.
Files changed (352) hide show
  1. package/GROUNDING.md +1588 -20
  2. package/dist/{DebuggerUI-CatYc-RG.cjs → DebuggerUI-B45_Gb9d.cjs} +1 -1
  3. package/dist/{DebuggerUI-gLMKiVwJ.js → DebuggerUI-Cq28c18s.js} +1 -1
  4. package/dist/FaceMeshRenderer-6t8OsQhK.js +1195 -0
  5. package/dist/FaceMeshRenderer-lQLhYIW-.cjs +155 -0
  6. package/dist/FaceRetouch-CDrL0pXg.js +551 -0
  7. package/dist/FaceRetouch-DtNl8-4e.cjs +134 -0
  8. package/dist/audio/AudioEngine.d.ts +3 -1
  9. package/dist/audio/AudioPlayer.d.ts +29 -0
  10. package/dist/audio/AudioPlayerLogic.d.ts +4 -0
  11. package/dist/audio/index.d.ts +2 -0
  12. package/dist/components/Axes/index.d.ts +6 -0
  13. package/dist/components/FaceMesh/FaceMeshRenderer.d.ts +17 -0
  14. package/dist/components/FaceMesh/canonical/CanonicalFaceMeshRenderer.d.ts +17 -1
  15. package/dist/components/FaceMesh/canonical/FaceMeshMaterial.d.ts +25 -0
  16. package/dist/components/FaceMesh/canonical/assets.d.ts +3 -0
  17. package/dist/components/FaceMesh/canonical/geometryGroups.d.ts +9 -0
  18. package/dist/components/FaceMesh/canonical/parseCanonicalFaceModel.d.ts +2 -0
  19. package/dist/components/FaceMesh/canonical/shaders.d.ts +2 -0
  20. package/dist/components/FaceMesh/deform.d.ts +3 -0
  21. package/dist/components/FaceMesh/index.d.ts +5 -0
  22. package/dist/components/FaceMesh/material/defaults.d.ts +70 -0
  23. package/dist/components/FaceMesh/material/index.d.ts +1 -0
  24. package/dist/components/FaceMesh/material/options.d.ts +5 -1
  25. package/dist/components/FaceMesh/material/support.d.ts +7 -2
  26. package/dist/components/FaceMesh/material/textures.d.ts +4 -0
  27. package/dist/components/FaceMesh/material/types.d.ts +2 -2
  28. package/dist/components/FaceRetouch/Background.d.ts +5 -6
  29. package/dist/components/FaceRetouch/FaceRetouch.d.ts +47 -0
  30. package/dist/components/FaceRetouch/index.d.ts +2 -8
  31. package/dist/components/FaceRetouch/landmarkMask.d.ts +0 -5
  32. package/dist/components/FaceRetouch/useFaceRetouchMask.d.ts +3 -7
  33. package/dist/components/FaceTracker/index.d.ts +5 -3
  34. package/dist/components/FaceWarp3D/FaceWarp3DHead.d.ts +1 -1
  35. package/dist/components/HandJoints2D/index.d.ts +1 -1
  36. package/dist/components/HandTracking2D/HandVisual.d.ts +1 -1
  37. package/dist/components/HandTracking2D/index.d.ts +1 -1
  38. package/dist/components/HandTracking2DController/index.d.ts +1 -1
  39. package/dist/components/HandTracking3D/index.d.ts +1 -1
  40. package/dist/components/LightObject/index.d.ts +20 -0
  41. package/dist/components/LookAt/index.d.ts +23 -0
  42. package/dist/components/MeshRenderer/index.d.ts +58 -0
  43. package/dist/components/PerspectiveCamera/index.d.ts +2 -8
  44. package/dist/components/PinToMesh/index.d.ts +47 -0
  45. package/dist/components/RenderGroupLayer/index.d.ts +6 -0
  46. package/dist/components/SceneObjectRenderer/index.d.ts +16 -0
  47. package/dist/components/Screen2D/ScreenTransformFrame.d.ts +11 -0
  48. package/dist/components/Screen2D/ScreenTransformHelpers.d.ts +19 -0
  49. package/dist/components/Screen2D/ScreenTransformInteraction.d.ts +18 -0
  50. package/dist/components/Screen2D/index.d.ts +5 -0
  51. package/dist/components/ScreenGlass/defaults.d.ts +3 -0
  52. package/dist/components/ScreenGlass/index.d.ts +5 -0
  53. package/dist/components/ScreenGlass/shaders.d.ts +2 -0
  54. package/dist/components/ScreenGlass/types.d.ts +10 -0
  55. package/dist/components/ScreenGradient/defaults.d.ts +5 -0
  56. package/dist/components/ScreenGradient/index.d.ts +5 -0
  57. package/dist/components/ScreenGradient/shaders.d.ts +2 -0
  58. package/dist/components/ScreenGradient/types.d.ts +19 -0
  59. package/dist/components/ScreenImage/ScreenImage.d.ts +4 -0
  60. package/dist/components/ScreenImage/components/DynamicTextureSync.d.ts +9 -0
  61. package/dist/components/ScreenImage/components/ScreenImageBody.d.ts +9 -0
  62. package/dist/components/ScreenImage/components/ScreenImageFrame.d.ts +9 -0
  63. package/dist/components/ScreenImage/components/ScreenImageTransformFrame.d.ts +9 -0
  64. package/dist/components/ScreenImage/fit.d.ts +52 -0
  65. package/dist/components/ScreenImage/index.d.ts +8 -87
  66. package/dist/components/ScreenImage/materials/ScreenImageBlendMaterial.d.ts +9 -0
  67. package/dist/components/ScreenImage/materials/ScreenImageMatcap.d.ts +3 -0
  68. package/dist/components/ScreenImage/source.d.ts +16 -0
  69. package/dist/components/ScreenImage/types.d.ts +37 -0
  70. package/dist/components/ScreenImage/utils/ScreenImageConstants.d.ts +9 -0
  71. package/dist/components/ScreenImage/utils/ScreenImageHelpers.d.ts +4 -0
  72. package/dist/components/ScreenShape/geometry.d.ts +5 -0
  73. package/dist/components/ScreenShape/index.d.ts +5 -0
  74. package/dist/components/ScreenShape/types.d.ts +41 -0
  75. package/dist/components/ScreenSpaceUI/ScreenTransformGuide.d.ts +15 -0
  76. package/dist/components/ScreenSpaceUI/ScreenTransformOverlayGuide.d.ts +9 -0
  77. package/dist/components/ScreenSpaceUI/index.d.ts +2 -0
  78. package/dist/components/ScreenText/components/ScreenTextBody.d.ts +2 -0
  79. package/dist/components/ScreenText/components/ScreenTextTransformFrame.d.ts +9 -0
  80. package/dist/components/ScreenText/constants.d.ts +5 -0
  81. package/dist/components/ScreenText/index.d.ts +6 -20
  82. package/dist/components/ScreenText/types.d.ts +31 -0
  83. package/dist/components/ScreenText/utils/ScreenTextHelpers.d.ts +14 -0
  84. package/dist/components/ScreenText/utils/ScreenTextMappings.d.ts +17 -0
  85. package/dist/components/SequentialRenderPasses/index.d.ts +6 -0
  86. package/dist/components/TextLabel/TextLabel.d.ts +5 -0
  87. package/dist/components/TextLabel/alignment.d.ts +4 -0
  88. package/dist/components/TextLabel/bend.d.ts +9 -0
  89. package/dist/components/TextLabel/canvas/buildTextLabelTexture.d.ts +4 -0
  90. package/dist/components/TextLabel/canvas/canvasTypography.d.ts +13 -0
  91. package/dist/components/TextLabel/canvas/drawBackground.d.ts +21 -0
  92. package/dist/components/TextLabel/canvas/drawEffects.d.ts +34 -0
  93. package/dist/components/TextLabel/canvas/drawText.d.ts +19 -0
  94. package/dist/components/TextLabel/components/TextLabelMesh.d.ts +13 -0
  95. package/dist/components/TextLabel/constants.d.ts +2 -0
  96. package/dist/components/TextLabel/hooks/useTextLabelTexture.d.ts +7 -0
  97. package/dist/components/TextLabel/index.d.ts +2 -161
  98. package/dist/components/TextLabel/layout/measurement.d.ts +8 -0
  99. package/dist/components/TextLabel/layout/resolveTextLayout.d.ts +25 -0
  100. package/dist/components/TextLabel/layout/wrapText.d.ts +6 -0
  101. package/dist/components/TextLabel/types.d.ts +227 -0
  102. package/dist/components/TrackingAnchor/index.d.ts +18 -2
  103. package/dist/components/Transform3D/index.d.ts +30 -0
  104. package/dist/components/XRMediaSurface/index.d.ts +6 -6
  105. package/dist/components/XRViewport/XRViewport.d.ts +11 -0
  106. package/dist/components/XRViewport/components/HiddenMedia.d.ts +7 -0
  107. package/dist/components/XRViewport/components/MediaAssetPicker.d.ts +8 -0
  108. package/dist/components/XRViewport/components/MediaControlStack.d.ts +13 -0
  109. package/dist/components/XRViewport/components/XRViewportLayers.d.ts +30 -0
  110. package/dist/components/XRViewport/constants.d.ts +24 -0
  111. package/dist/components/XRViewport/contexts.d.ts +6 -0
  112. package/dist/components/XRViewport/hooks/useViewportExternalFaces.d.ts +13 -0
  113. package/dist/components/XRViewport/hooks/useViewportMediaSource.d.ts +16 -0
  114. package/dist/components/XRViewport/hooks/useViewportMediaTexture.d.ts +10 -0
  115. package/dist/components/XRViewport/hooks/useViewportPipeline.d.ts +41 -0
  116. package/dist/components/XRViewport/hooks/useViewportRenderState.d.ts +47 -0
  117. package/dist/components/XRViewport/index.d.ts +3 -118
  118. package/dist/components/XRViewport/layout.d.ts +16 -0
  119. package/dist/components/XRViewport/slots.d.ts +16 -0
  120. package/dist/components/XRViewport/types.d.ts +89 -0
  121. package/dist/components/XRViewport/useViewportSize.d.ts +3 -0
  122. package/dist/components/index.d.ts +12 -0
  123. package/dist/contexts-BKvTIayr.cjs +1 -0
  124. package/dist/contexts-Bk5zz_VR.js +214 -0
  125. package/dist/debug-ui/component-editor/index.d.ts +19 -0
  126. package/dist/debug-ui/face-mesh-renderer-settings/index.d.ts +8 -0
  127. package/dist/debug-ui/face-retouch/index.d.ts +11 -0
  128. package/dist/debug-ui/hand-joints-2d/index.d.ts +1 -1
  129. package/dist/debug-ui/hand-tracking-2d/index.d.ts +1 -1
  130. package/dist/debug-ui/hand-tracking-2d-controller/index.d.ts +1 -1
  131. package/dist/debug-ui/hand-tracking-3d/index.d.ts +1 -1
  132. package/dist/debug-ui/hierarchy-panel/index.d.ts +29 -0
  133. package/dist/debug-ui/index.d.ts +25 -2
  134. package/dist/debug-ui/layer-panel/index.d.ts +3 -2
  135. package/dist/debug-ui/media-source/index.d.ts +2 -0
  136. package/dist/debug-ui/media-source/session.d.ts +12 -0
  137. package/dist/debug-ui/media-source.cjs +1 -1
  138. package/dist/debug-ui/media-source.js +6 -4
  139. package/dist/debug-ui/mesh-renderer-settings/index.d.ts +6 -0
  140. package/dist/debug-ui/object-inspector-panel/index.d.ts +25 -0
  141. package/dist/debug-ui/pin-to-mesh-settings/index.d.ts +10 -0
  142. package/dist/debug-ui/scene-editor/context.d.ts +38 -0
  143. package/dist/debug-ui/scene-editor/hierarchy-panel.d.ts +9 -0
  144. package/dist/debug-ui/scene-editor/index.d.ts +11 -0
  145. package/dist/debug-ui/scene-editor/inspector-panel.d.ts +7 -0
  146. package/dist/debug-ui/scene-editor/store-utils.d.ts +2 -0
  147. package/dist/debug-ui/scene-editor/viewport-toolbar.d.ts +4 -0
  148. package/dist/debug-ui/scene-editor/viewport.d.ts +21 -0
  149. package/dist/debug-ui/screen-glass-settings/index.d.ts +6 -0
  150. package/dist/debug-ui/screen-gradient-settings/GradientStopsEditor.d.ts +5 -0
  151. package/dist/debug-ui/screen-gradient-settings/index.d.ts +6 -0
  152. package/dist/debug-ui/screen-gradient-settings/styles.d.ts +3 -0
  153. package/dist/debug-ui/screen-image-settings/index.d.ts +4 -2
  154. package/dist/debug-ui/screen-shape-settings/index.d.ts +6 -0
  155. package/dist/debug-ui/screen-text-settings/NumberField.d.ts +9 -0
  156. package/dist/debug-ui/screen-text-settings/ScreenTextSettingsPanel.d.ts +3 -0
  157. package/dist/debug-ui/screen-text-settings/controls/NestedSection.d.ts +7 -0
  158. package/dist/debug-ui/screen-text-settings/controls/Section.d.ts +8 -0
  159. package/dist/debug-ui/screen-text-settings/controls/icons.d.ts +4 -0
  160. package/dist/debug-ui/screen-text-settings/index.d.ts +2 -122
  161. package/dist/debug-ui/screen-text-settings/sections/BackgroundSection.d.ts +8 -0
  162. package/dist/debug-ui/screen-text-settings/sections/ContentSection.d.ts +5 -0
  163. package/dist/debug-ui/screen-text-settings/sections/EffectsSection.d.ts +25 -0
  164. package/dist/debug-ui/screen-text-settings/sections/StyleSection.d.ts +5 -0
  165. package/dist/debug-ui/screen-text-settings/sections/TransformSection.d.ts +5 -0
  166. package/dist/debug-ui/screen-text-settings/sections/background/BackgroundFillControls.d.ts +2 -0
  167. package/dist/debug-ui/screen-text-settings/sections/background/BackgroundSizeControls.d.ts +2 -0
  168. package/dist/debug-ui/screen-text-settings/sections/background/BackgroundStrokeControls.d.ts +2 -0
  169. package/dist/debug-ui/screen-text-settings/sections/background/types.d.ts +7 -0
  170. package/dist/debug-ui/screen-text-settings/sections/effects/BendEffectSection.d.ts +4 -0
  171. package/dist/debug-ui/screen-text-settings/sections/effects/EffectChrome.d.ts +21 -0
  172. package/dist/debug-ui/screen-text-settings/sections/effects/GlowEffectSection.d.ts +4 -0
  173. package/dist/debug-ui/screen-text-settings/sections/effects/InnerShadowEffectSection.d.ts +4 -0
  174. package/dist/debug-ui/screen-text-settings/sections/effects/OutlineEffectSection.d.ts +4 -0
  175. package/dist/debug-ui/screen-text-settings/sections/effects/ShadowEffectSection.d.ts +4 -0
  176. package/dist/debug-ui/screen-text-settings/sections/effects/types.d.ts +14 -0
  177. package/dist/debug-ui/screen-text-settings/settings.d.ts +90 -0
  178. package/dist/debug-ui/screen-text-settings/styles.d.ts +26 -0
  179. package/dist/debug-ui/screen-text-settings/transform.d.ts +6 -0
  180. package/dist/debug-ui/screen-text-settings/types.d.ts +9 -0
  181. package/dist/debug-ui/shared/ScreenTransformSection.d.ts +6 -3
  182. package/dist/debug-ui/transform-3d-settings/index.d.ts +11 -0
  183. package/dist/debug-ui.cjs +3 -13
  184. package/dist/debug-ui.js +7896 -5098
  185. package/dist/drawNormalizedCrop-B-7zU-Xw.cjs +1 -0
  186. package/dist/drawNormalizedCrop-CRdIDyl1.js +44 -0
  187. package/dist/entries/all.d.ts +1 -0
  188. package/dist/entries/core.d.ts +53 -6
  189. package/dist/entries/face-effects.d.ts +10 -8
  190. package/dist/entries/internal.d.ts +1 -1
  191. package/dist/entries/low-level.d.ts +18 -4
  192. package/dist/entries/scene-object.d.ts +10 -0
  193. package/dist/entries/tracking.d.ts +25 -2
  194. package/dist/face-action/index.d.ts +34 -0
  195. package/dist/face-attribute-expression/index.d.ts +10 -0
  196. package/dist/face-effects.cjs +1 -342
  197. package/dist/face-effects.js +1391 -2767
  198. package/dist/face-info/blendshapes.d.ts +3 -0
  199. package/dist/face-info/derive.d.ts +8 -0
  200. package/dist/face-info/drawFaceCrop.d.ts +10 -0
  201. package/dist/face-info/getFaceInfo.d.ts +8 -0
  202. package/dist/face-info/index.d.ts +8 -0
  203. package/dist/face-info/landmarks.d.ts +21 -0
  204. package/dist/face-info/types.d.ts +52 -0
  205. package/dist/getFaceInfo-CyPAKh3h.cjs +1 -0
  206. package/dist/getFaceInfo-hUKMLFcr.js +118 -0
  207. package/dist/{handJoints2d.d.ts → hand/handJoints2d.d.ts} +1 -1
  208. package/dist/{handTracking2d.d.ts → hand/handTracking2d.d.ts} +1 -1
  209. package/dist/{handTracking2dController.d.ts → hand/handTracking2dController.d.ts} +1 -1
  210. package/dist/{handTracking3d.d.ts → hand/handTracking3d.d.ts} +1 -1
  211. package/dist/hooks/faceResults.d.ts +1 -1
  212. package/dist/hooks/useCalibrationFaceTracker.d.ts +1 -1
  213. package/dist/hooks/useFaceAction.d.ts +3 -0
  214. package/dist/hooks/useFaceAttributeExpression.d.ts +16 -0
  215. package/dist/hooks/useFaceDetection.d.ts +18 -0
  216. package/dist/hooks/useFaceInfo.d.ts +7 -0
  217. package/dist/hooks/useFaceInfos.d.ts +15 -0
  218. package/dist/hooks/useFaceResultReader.d.ts +10 -0
  219. package/dist/hooks/useFrameCapture.d.ts +18 -0
  220. package/dist/hooks/useMediaRecorder.d.ts +14 -2
  221. package/dist/hooks/useOwnedTexture.d.ts +6 -0
  222. package/dist/hooks/useTrackerContext.d.ts +2 -2
  223. package/dist/hooks/useXRSession/facade.d.ts +3 -0
  224. package/dist/hooks/useXRSession/registry.d.ts +9 -0
  225. package/dist/index-82aENaRq.cjs +1 -0
  226. package/dist/{index-BGNbrc4C.js → index-BgQAX8rs.js} +213 -125
  227. package/dist/index-CEc1CAmB.cjs +1 -0
  228. package/dist/index-CTHeBQOs.js +178 -0
  229. package/dist/index-D4bLzBr6.cjs +1 -0
  230. package/dist/index-DSpzjuqd.cjs +1 -0
  231. package/dist/index-Di70KWuY.js +2049 -0
  232. package/dist/index-DzEzkBIH.cjs +17 -0
  233. package/dist/{index-safCs_af.js → index-JygePOwo.js} +565 -508
  234. package/dist/index-UC0Ux38E.js +111 -0
  235. package/dist/{internal-Cae1ps15.js → internal-DuMPpcbp.js} +86 -80
  236. package/dist/internal-i2JkM85N.cjs +1 -0
  237. package/dist/internal.cjs +1 -1
  238. package/dist/internal.js +2 -2
  239. package/dist/low-level.cjs +1 -1
  240. package/dist/low-level.js +1229 -86
  241. package/dist/main.cjs +1 -73
  242. package/dist/main.js +545 -1693
  243. package/dist/material/MaterialFill.d.ts +20 -0
  244. package/dist/material/MeshMaterial.d.ts +14 -0
  245. package/dist/material/index.d.ts +2 -0
  246. package/dist/models/Body/index.d.ts +1 -1
  247. package/dist/models/Face/index.d.ts +1 -0
  248. package/dist/models/Face/rotation.d.ts +3 -0
  249. package/dist/render/renderGroups.d.ts +47 -0
  250. package/dist/render/renderPasses.d.ts +18 -0
  251. package/dist/renderGroups-C9QJrAXu.js +152 -0
  252. package/dist/renderGroups-Dvm1J4lW.cjs +1 -0
  253. package/dist/renderLayers-lDtL0_43.cjs +1 -0
  254. package/dist/renderLayers-zrK2pv5O.js +13 -0
  255. package/dist/renderPasses-CT5iBwtg.cjs +21 -0
  256. package/dist/renderPasses-CjgG_6kQ.js +1500 -0
  257. package/dist/scene-object/index.d.ts +146 -0
  258. package/dist/scene-object/runtimeRegistry.d.ts +14 -0
  259. package/dist/scene-object.cjs +1 -0
  260. package/dist/scene-object.js +40 -0
  261. package/dist/{screenImageSettings.d.ts → screen-image/screenImageSettings.d.ts} +9 -2
  262. package/dist/{screenTextSettings.d.ts → screen-text/screenTextSettings.d.ts} +18 -2
  263. package/dist/screen2d/coordinates.d.ts +87 -0
  264. package/dist/screen2d/index.d.ts +3 -0
  265. package/dist/screen2d/screenTransform.d.ts +47 -0
  266. package/dist/screen2d/smoothing.d.ts +5 -0
  267. package/dist/{selectors-BLl2JUWW.cjs → selectors-2QvO5RYY.cjs} +1 -1
  268. package/dist/{selectors-CXd_x-6t.js → selectors-Dw3C-gSk.js} +3 -3
  269. package/dist/services/MetricsCollector/index.d.ts +7 -1
  270. package/dist/services/MetricsCollector/utils.d.ts +1 -1
  271. package/dist/session-BChR4TgK.cjs +31 -0
  272. package/dist/session-C1StwN0f.js +363 -0
  273. package/dist/texture/animatedTexture.d.ts +61 -0
  274. package/dist/texture/animationMath.d.ts +8 -0
  275. package/dist/texture/sourceResolver.d.ts +30 -0
  276. package/dist/tracking.cjs +1 -1
  277. package/dist/tracking.js +580 -321
  278. package/dist/types/face.d.ts +1 -13
  279. package/dist/types/index.d.ts +0 -1
  280. package/dist/types/nodes.d.ts +2 -1
  281. package/dist/types/session.d.ts +2 -0
  282. package/dist/types/tracking.d.ts +8 -2
  283. package/dist/types/util-types.d.ts +1 -1
  284. package/dist/useFaceInfo-C-WfMlYp.cjs +1 -0
  285. package/dist/useFaceInfo-CwsHZedC.js +62 -0
  286. package/dist/useFaceResults-CkFc1egZ.js +19 -0
  287. package/dist/useFaceResults-VcFdOUFV.cjs +1 -0
  288. package/dist/utils/drawNormalizedCrop.d.ts +22 -0
  289. package/dist/utils/integrity.d.ts +4 -25
  290. package/dist/utils/landmarkBounds.d.ts +1 -1
  291. package/dist/utils/logger.d.ts +2 -2
  292. package/docs/MIGRATION_GUIDE.md +589 -0
  293. package/docs/SDK_DOCUMENTATION.md +1155 -0
  294. package/docs/api/audio.mdx +36 -0
  295. package/docs/api/behavior-components.mdx +164 -0
  296. package/docs/api/capture-recording.mdx +103 -0
  297. package/docs/api/debug-ui-scene-editor.mdx +249 -0
  298. package/docs/api/face-actions.mdx +104 -0
  299. package/docs/api/face-attribute-expression.mdx +87 -0
  300. package/docs/api/face-binding-anchors.mdx +53 -0
  301. package/docs/api/face-effects.mdx +19 -0
  302. package/docs/api/face-info.mdx +112 -0
  303. package/docs/api/face-mesh.mdx +98 -0
  304. package/docs/api/face-painting.mdx +33 -0
  305. package/docs/api/face-retouching.mdx +73 -0
  306. package/docs/api/material-render-state.mdx +132 -0
  307. package/docs/api/runtime-3d.mdx +311 -0
  308. package/docs/api/scene-object-store.mdx +213 -0
  309. package/docs/api/screen-image.mdx +41 -0
  310. package/docs/api/screen-shape.mdx +64 -0
  311. package/docs/api/screen-space-coordinates.mdx +41 -0
  312. package/docs/api/screen-text.mdx +39 -0
  313. package/docs/api/texture-sources.mdx +55 -0
  314. package/docs/api/trackers.mdx +46 -0
  315. package/docs/docs.json +70 -0
  316. package/docs/examples/scene-object-recipes.mdx +194 -0
  317. package/docs/guides/harness-debug-ui.mdx +139 -0
  318. package/docs/inspector/hierarchy-panel.mdx +51 -0
  319. package/docs/inspector/object-inspector-panel.mdx +51 -0
  320. package/docs/introduction.mdx +121 -0
  321. package/docs/scene-objects/overview.mdx +127 -0
  322. package/docs/scene-objects/render-groups.mdx +77 -0
  323. package/docs/scene-objects/runtime-rendering.mdx +75 -0
  324. package/docs/texture-api-consumer.md +58 -0
  325. package/package.json +37 -7
  326. package/dist/MediaSourceSwitcher-C-xYg0nQ.js +0 -317
  327. package/dist/MediaSourceSwitcher-Cq3g4IKw.cjs +0 -31
  328. package/dist/components/FaceRetouch/defaults.d.ts +0 -13
  329. package/dist/components/FaceRetouch/retouchRegions.d.ts +0 -23
  330. package/dist/components/FaceRetouch/useFaceRetouchRegions.d.ts +0 -12
  331. package/dist/defaults-BLpcN3pG.cjs +0 -1
  332. package/dist/defaults-LtY4M7dg.js +0 -55
  333. package/dist/index-BXyObVHF.cjs +0 -1
  334. package/dist/index-CY3bUAcW.js +0 -12
  335. package/dist/index-C_Duh13c.cjs +0 -1
  336. package/dist/index-D8fpPQkC.cjs +0 -1
  337. package/dist/index-DxshgBu0.cjs +0 -1
  338. package/dist/index-O-2crZ3M.js +0 -1102
  339. package/dist/internal-BjyhBP8i.cjs +0 -1
  340. package/dist/modules/XRClient/index.d.ts +0 -9
  341. package/dist/modules/index.d.ts +0 -1
  342. package/dist/screenImageSettings-6NRg4cx9.js +0 -39
  343. package/dist/screenImageSettings-y_B4_767.cjs +0 -1
  344. package/dist/services/ApiService.d.ts +0 -12
  345. package/dist/types/client.d.ts +0 -3
  346. package/dist/useFaceResults-cpsSmKKc.js +0 -81
  347. package/dist/useFaceResults-hVUJYSEY.cjs +0 -1
  348. package/dist/useXRModel-3DcUa28n.cjs +0 -1
  349. package/dist/useXRModel-BMJE1hrk.js +0 -28
  350. /package/dist/{layerStack.d.ts → render/layerStack.d.ts} +0 -0
  351. /package/dist/{screenImagePresets.d.ts → screen-image/screenImagePresets.d.ts} +0 -0
  352. /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