@vincentt-xr/sdk 2.0.0-alpha.7 → 2.0.0-alpha.8

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 (275) hide show
  1. package/GROUNDING.md +1109 -13
  2. package/dist/{DebuggerUI-BjOMr8q_.js → DebuggerUI-C-ldiozL.js} +1 -1
  3. package/dist/{DebuggerUI-B6bP6P9r.cjs → DebuggerUI-CWX5EtQv.cjs} +1 -1
  4. package/dist/FaceMeshRenderer-BEEXZwS6.cjs +158 -0
  5. package/dist/FaceMeshRenderer-UuH5sTXG.js +1322 -0
  6. package/dist/FaceRetouch-C7h7x9kd.js +683 -0
  7. package/dist/FaceRetouch-DqftT26Y.cjs +134 -0
  8. package/dist/GLTFLoader-C5q63sKO.js +1633 -0
  9. package/dist/GLTFLoader-Cb_CRwmG.cjs +1 -0
  10. package/dist/SegmentationOverlay-DQuW3dsc.js +133 -0
  11. package/dist/SegmentationOverlay-aWVod8Kl.cjs +1 -0
  12. package/dist/assets/cache.d.ts +99 -0
  13. package/dist/assets/estimate.d.ts +11 -0
  14. package/dist/assets/index.d.ts +7 -0
  15. package/dist/assets/loaders.d.ts +28 -0
  16. package/dist/assets/react.d.ts +33 -0
  17. package/dist/calibration/calibration.d.ts +70 -0
  18. package/dist/calibration/index.d.ts +6 -0
  19. package/dist/calibration/storage.d.ts +13 -0
  20. package/dist/calibration/types.d.ts +53 -0
  21. package/dist/calibration/useXRCalibration.d.ts +46 -0
  22. package/dist/camera/CameraPermissionGate.d.ts +26 -0
  23. package/dist/camera/devices.d.ts +26 -0
  24. package/dist/camera/index.d.ts +8 -0
  25. package/dist/camera/permission.d.ts +86 -0
  26. package/dist/camera/useCameraPermission.d.ts +35 -0
  27. package/dist/capabilities/detect.d.ts +45 -0
  28. package/dist/capabilities/index.d.ts +5 -0
  29. package/dist/capabilities/types.d.ts +120 -0
  30. package/dist/capabilities/useXRCapabilities.d.ts +18 -0
  31. package/dist/compat/environment.d.ts +5 -0
  32. package/dist/compat/index.d.ts +4 -0
  33. package/dist/compat/run.d.ts +18 -0
  34. package/dist/compat/scenarios.d.ts +10 -0
  35. package/dist/compat/types.d.ts +101 -0
  36. package/dist/components/BodyTracker/index.d.ts +9 -0
  37. package/dist/components/FaceMesh/canonical/CanonicalFaceMeshRenderer.d.ts +33 -3
  38. package/dist/components/FaceMesh/canonical/parseCanonicalFaceModel.d.ts +12 -0
  39. package/dist/components/FaceMesh/canonical/shaders.d.ts +1 -1
  40. package/dist/components/FaceMesh/index.d.ts +1 -1
  41. package/dist/components/GestureListener/index.d.ts +11 -0
  42. package/dist/components/HandTracker/index.d.ts +10 -0
  43. package/dist/components/HolisticTracker/index.d.ts +69 -0
  44. package/dist/components/HolisticTracker/settings.d.ts +58 -0
  45. package/dist/components/HolisticTracker/signals.d.ts +49 -0
  46. package/dist/components/IrisEffect/IrisMaterial.d.ts +73 -0
  47. package/dist/components/IrisEffect/index.d.ts +51 -0
  48. package/dist/components/IrisEffect/settings.d.ts +117 -0
  49. package/dist/components/LipEffect/LipEffect.d.ts +7 -1
  50. package/dist/components/LipEffect/LipEffectMaterial.d.ts +43 -7
  51. package/dist/components/LipEffect/LipEffects.d.ts +9 -0
  52. package/dist/components/LipEffect/defaults.d.ts +27 -4
  53. package/dist/components/LipEffect/index.d.ts +11 -3
  54. package/dist/components/LipEffect/settings.d.ts +271 -0
  55. package/dist/components/LipEffect/types.d.ts +56 -9
  56. package/dist/components/LipEffect/useLipDesignTextures.d.ts +11 -0
  57. package/dist/components/LipEffect/uvGuide.d.ts +59 -0
  58. package/dist/components/PersonCutout/index.d.ts +50 -0
  59. package/dist/components/PersonCutout/personCutout.d.ts +16 -0
  60. package/dist/components/ScreenImage/components/ScreenImageBody.d.ts +1 -1
  61. package/dist/components/ScreenImage/index.d.ts +3 -1
  62. package/dist/components/ScreenImage/materials/ScreenImageBlendMaterial.d.ts +1 -1
  63. package/dist/components/ScreenImage/materials/ScreenImageMaskMaterial.d.ts +11 -0
  64. package/dist/components/ScreenImage/source.d.ts +6 -0
  65. package/dist/components/ScreenImage/types.d.ts +18 -0
  66. package/dist/components/SegmentationOverlay/SegmentationOverlay.d.ts +37 -0
  67. package/dist/components/SegmentationOverlay/SegmentationOverlayMaterial.d.ts +31 -0
  68. package/dist/components/SegmentationOverlay/index.d.ts +9 -0
  69. package/dist/components/SegmentationOverlay/maskTexture.d.ts +23 -0
  70. package/dist/components/SegmentationOverlay/providers.d.ts +72 -0
  71. package/dist/components/SegmentationOverlay/settings.d.ts +65 -0
  72. package/dist/components/XRProvider/index.d.ts +16 -2
  73. package/dist/components/XRViewport/hooks/useViewportExternalFaces.d.ts +1 -1
  74. package/dist/components/XRViewport/hooks/useViewportMediaSource.d.ts +1 -1
  75. package/dist/components/XRViewport/hooks/useViewportPipeline.d.ts +1 -1
  76. package/dist/components/index.d.ts +3 -0
  77. package/dist/constants/index.d.ts +4 -1
  78. package/dist/contexts-CO0sd4JQ.cjs +1 -0
  79. package/dist/{contexts-ByhzppYl.js → contexts-FzlnnMYD.js} +252 -246
  80. package/dist/coordinates/feed.d.ts +52 -0
  81. package/dist/coordinates/index.d.ts +5 -0
  82. package/dist/coordinates/spaces.d.ts +49 -0
  83. package/dist/coordinates/viewport.d.ts +22 -0
  84. package/dist/coordinates/world.d.ts +15 -0
  85. package/dist/debug-ui/gesture-settings/index.d.ts +14 -0
  86. package/dist/debug-ui/holistic-tracker-settings/index.d.ts +16 -0
  87. package/dist/debug-ui/index.d.ts +14 -0
  88. package/dist/debug-ui/iris-effect-settings/index.d.ts +12 -0
  89. package/dist/debug-ui/lip-effect-settings/index.d.ts +15 -0
  90. package/dist/debug-ui/media-source.cjs +1 -1
  91. package/dist/debug-ui/media-source.js +1 -1
  92. package/dist/debug-ui/product-hotspots/index.d.ts +24 -0
  93. package/dist/debug-ui/segmentation-overlay-settings/index.d.ts +12 -0
  94. package/dist/debug-ui/xr-diagnostics/index.d.ts +25 -0
  95. package/dist/debug-ui.cjs +3 -3
  96. package/dist/debug-ui.js +2057 -1687
  97. package/dist/detector-K8aej4MB.js +59 -0
  98. package/dist/detector-ijypGtse.cjs +1 -0
  99. package/dist/entries/core.d.ts +18 -1
  100. package/dist/entries/face-effects.d.ts +11 -3
  101. package/dist/entries/low-level.d.ts +22 -3
  102. package/dist/entries/product.d.ts +11 -0
  103. package/dist/entries/tracking.d.ts +24 -1
  104. package/dist/face-effects.cjs +155 -1
  105. package/dist/face-effects.js +1134 -2197
  106. package/dist/gestures/definitions.d.ts +85 -0
  107. package/dist/gestures/detector.d.ts +87 -0
  108. package/dist/gestures/index.d.ts +8 -0
  109. package/dist/gestures/measures.d.ts +101 -0
  110. package/dist/gestures/settings.d.ts +49 -0
  111. package/dist/{getFaceInfo-C4QpCQIY.js → getFaceInfo-BkZfaQs-.js} +5 -5
  112. package/dist/{getFaceInfo-fA1bFBub.cjs → getFaceInfo-ahPxQFGu.cjs} +1 -1
  113. package/dist/hooks/selectors.d.ts +68 -1
  114. package/dist/hooks/useCalibrationFaceTracker.d.ts +1 -1
  115. package/dist/hooks/useFaceInfo.d.ts +13 -1
  116. package/dist/hooks/useFaceInfos.d.ts +1 -1
  117. package/dist/hooks/useGesture.d.ts +32 -0
  118. package/dist/hooks/useIrisTracking.d.ts +45 -0
  119. package/dist/hooks/useXRDiagnostics.d.ts +81 -0
  120. package/dist/hooks/useXRModel.d.ts +7 -0
  121. package/dist/hooks/useXRSession/facade.d.ts +42 -2
  122. package/dist/hooks/useXRSession/index.d.ts +2 -2
  123. package/dist/hooks/useXRSession/reason.d.ts +3 -1
  124. package/dist/hooks/useXRSession/registry.d.ts +14 -0
  125. package/dist/hooks/useXRSession/store.d.ts +52 -3
  126. package/dist/index--RgGzZ6X.cjs +47 -0
  127. package/dist/{index-VJ0SJwmG.js → index-CHVbH0hz.js} +4 -4
  128. package/dist/index-CeVkgsag.cjs +1 -0
  129. package/dist/index-CnGox6Xr.js +3054 -0
  130. package/dist/{index-ByoNj0QP.js → index-CsUdQ-pn.js} +113 -111
  131. package/dist/{index-BjmTe9eM.cjs → index-DKBAh6hV.cjs} +1 -1
  132. package/dist/index-DsZwTfG0.cjs +1 -0
  133. package/dist/index-Dw6tj2Mi.js +144 -0
  134. package/dist/index-OCPjOaeP.cjs +1 -0
  135. package/dist/{index-DXT3WccE.js → index-s9pF4zkG.js} +1065 -1101
  136. package/dist/internal-BYza1h8_.cjs +1 -0
  137. package/dist/{internal-Dmk1cTXq.js → internal-vsfNQycj.js} +15 -16
  138. package/dist/internal.cjs +1 -1
  139. package/dist/internal.js +2 -2
  140. package/dist/iris/compute.d.ts +25 -0
  141. package/dist/iris/index.d.ts +4 -0
  142. package/dist/iris/lead.d.ts +19 -0
  143. package/dist/iris/types.d.ts +87 -0
  144. package/dist/landmarkMask-CbTFzBYG.js +224 -0
  145. package/dist/landmarkMask-u7es2k4X.cjs +1 -0
  146. package/dist/low-level.cjs +1 -1
  147. package/dist/low-level.js +1085 -634
  148. package/dist/main.cjs +1 -1
  149. package/dist/main.js +1519 -465
  150. package/dist/measures-9dQPdw96.js +154 -0
  151. package/dist/measures-KfJzpvod.cjs +1 -0
  152. package/dist/models/Base/index.d.ts +49 -0
  153. package/dist/models/Body/index.d.ts +1 -1
  154. package/dist/models/Face/index.d.ts +1 -1
  155. package/dist/models/Hand/GestureTracking.d.ts +1 -1
  156. package/dist/models/Hand/HandTracking.d.ts +1 -1
  157. package/dist/models/Holistic/index.d.ts +49 -0
  158. package/dist/models/Holistic/result.d.ts +68 -0
  159. package/dist/models/SemanticSegmentation/index.d.ts +31 -0
  160. package/dist/models/SemanticSegmentation/presets.d.ts +28 -0
  161. package/dist/models/index.d.ts +2 -0
  162. package/dist/product/ProductDimensions.d.ts +16 -0
  163. package/dist/product/ProductHotspot.d.ts +16 -0
  164. package/dist/product/ProductViewer.d.ts +9 -0
  165. package/dist/product/details.d.ts +53 -0
  166. package/dist/product/index.d.ts +14 -0
  167. package/dist/product/loadModelViewer.d.ts +4 -0
  168. package/dist/product/types.d.ts +71 -0
  169. package/dist/product/useProductAr.d.ts +37 -0
  170. package/dist/product/useProductDetails.d.ts +60 -0
  171. package/dist/product.cjs +1 -0
  172. package/dist/product.js +414 -0
  173. package/dist/providers-C0Dlhh9Z.js +365 -0
  174. package/dist/providers-YNwkmNeK.cjs +62 -0
  175. package/dist/quality/XRQualityController.d.ts +25 -0
  176. package/dist/quality/controller.d.ts +33 -0
  177. package/dist/quality/index.d.ts +6 -0
  178. package/dist/quality/types.d.ts +100 -0
  179. package/dist/quality/useXRQuality.d.ts +28 -0
  180. package/dist/{renderGroups-KZk6eRiY.js → renderGroups-CN1cGFUo.js} +1 -1
  181. package/dist/{renderGroups-80H3DpTl.cjs → renderGroups-O4KmaMl9.cjs} +1 -1
  182. package/dist/renderPasses-Cg-zqmEz.cjs +21 -0
  183. package/dist/renderPasses-NnKZVfBy.js +1460 -0
  184. package/dist/scene-object.cjs +1 -1
  185. package/dist/scene-object.js +2 -2
  186. package/dist/screenTransform-BenfCtZt.js +44 -0
  187. package/dist/screenTransform-BiXdpVf0.cjs +1 -0
  188. package/dist/segmentation-9PhSvc-R.cjs +1 -0
  189. package/dist/segmentation-CeOTKemr.js +5 -0
  190. package/dist/segmentation2d/faceMemory.d.ts +28 -0
  191. package/dist/segmentation2d/faceRegions.d.ts +24 -0
  192. package/dist/segmentation2d/index.d.ts +9 -0
  193. package/dist/segmentation2d/maskUv.d.ts +23 -0
  194. package/dist/segmentation2d/rasterize.d.ts +14 -0
  195. package/dist/segmentation2d/types.d.ts +46 -0
  196. package/dist/selectors-C5G1PMYL.js +195 -0
  197. package/dist/selectors-Du_PsVnW.cjs +1 -0
  198. package/dist/{session-CpkiK5YA.cjs → session-BBr0yN8h.cjs} +7 -7
  199. package/dist/{session-DLFN_VII.js → session-Cy0m7l7-.js} +76 -76
  200. package/dist/settings-DRR7-snV.cjs +1 -0
  201. package/dist/settings-aQk845NJ.js +73 -0
  202. package/dist/subjects/index.d.ts +2 -0
  203. package/dist/subjects/select.d.ts +62 -0
  204. package/dist/subjects/types.d.ts +55 -0
  205. package/dist/tracking-config/apply.d.ts +57 -0
  206. package/dist/tracking-config/index.d.ts +7 -0
  207. package/dist/tracking-config/resolve.d.ts +25 -0
  208. package/dist/tracking-config/storage.d.ts +8 -0
  209. package/dist/tracking-config/types.d.ts +106 -0
  210. package/dist/tracking-config/useXRTrackingConfig.d.ts +38 -0
  211. package/dist/tracking.cjs +1 -1
  212. package/dist/tracking.js +1056 -383
  213. package/dist/types/compositor.d.ts +21 -0
  214. package/dist/types/holistic.d.ts +121 -0
  215. package/dist/types/index.d.ts +1 -0
  216. package/dist/types/model.d.ts +22 -2
  217. package/dist/types/nodes.d.ts +27 -2
  218. package/dist/types/segmentation.d.ts +19 -0
  219. package/dist/types/session.d.ts +41 -3
  220. package/dist/useFaceInfo-Blf7FCu3.js +303 -0
  221. package/dist/useFaceInfo-C5mO8NQY.cjs +1 -0
  222. package/dist/useXRCapabilities-B1R2ghy-.cjs +1 -0
  223. package/dist/useXRCapabilities-C68v__wB.js +30 -0
  224. package/dist/utils/fns.d.ts +6 -3
  225. package/dist/utils/integrity.d.ts +4 -1
  226. package/dist/utils/updateThrottle.d.ts +2 -0
  227. package/dist/utils/useStableUniforms.d.ts +18 -0
  228. package/docs/api/adaptive-quality.mdx +104 -0
  229. package/docs/api/asset-lifecycle.mdx +78 -0
  230. package/docs/api/camera-permission.mdx +142 -0
  231. package/docs/api/coordinate-spaces.mdx +165 -0
  232. package/docs/api/cross-camera.mdx +88 -0
  233. package/docs/api/diagnostics-calibration.mdx +97 -0
  234. package/docs/api/face-effects.mdx +6 -0
  235. package/docs/api/face-mesh.mdx +4 -2
  236. package/docs/api/gestures.mdx +173 -0
  237. package/docs/api/holistic-tracker.mdx +159 -0
  238. package/docs/api/iris-tracking.mdx +242 -0
  239. package/docs/api/multi-subject.mdx +95 -0
  240. package/docs/api/person-cutout.mdx +136 -0
  241. package/docs/api/product-ar.mdx +111 -0
  242. package/docs/api/product-details.mdx +78 -0
  243. package/docs/api/screen-space-coordinates.mdx +4 -1
  244. package/docs/api/segmentation-overlay.mdx +301 -0
  245. package/docs/api/session-lifecycle.mdx +136 -0
  246. package/docs/api/trackers.mdx +5 -0
  247. package/docs/api/tracking-config.mdx +108 -0
  248. package/docs/docs.json +23 -1
  249. package/docs/examples/lip-shaders.mdx +224 -0
  250. package/docs/guides/lip-effect-textures.mdx +292 -0
  251. package/docs/guides/lip-uv-template.png +0 -0
  252. package/docs/guides/lip-uv-template.svg +1 -0
  253. package/package.json +13 -1
  254. package/dist/FaceMeshRenderer-C5l6VLdO.cjs +0 -155
  255. package/dist/FaceMeshRenderer-wjAHrJzP.js +0 -1270
  256. package/dist/FaceRetouch-BkJzoA79.cjs +0 -134
  257. package/dist/FaceRetouch-DwbKQJAN.js +0 -551
  258. package/dist/contexts-Dr62It_K.cjs +0 -1
  259. package/dist/index-9dlAQAhy.js +0 -1462
  260. package/dist/index-BpEf2BBb.cjs +0 -1
  261. package/dist/index-CyUUurQT.cjs +0 -1
  262. package/dist/index-DCiMbxC3.cjs +0 -1
  263. package/dist/index-DpI-qo5X.cjs +0 -17
  264. package/dist/index-DyVF4vEW.js +0 -111
  265. package/dist/internal-Cq-TEQ5Y.cjs +0 -1
  266. package/dist/renderLayers-lDtL0_43.cjs +0 -1
  267. package/dist/renderLayers-zrK2pv5O.js +0 -13
  268. package/dist/renderPasses-BOoBSr8z.cjs +0 -21
  269. package/dist/renderPasses-BcquyVtu.js +0 -1500
  270. package/dist/selectors-B8H97CKA.js +0 -59
  271. package/dist/selectors-CZLKT2Iv.cjs +0 -1
  272. package/dist/useFaceInfo-BJ8-_MOs.cjs +0 -1
  273. package/dist/useFaceInfo-Dk426LTu.js +0 -62
  274. package/dist/useFaceResults-CtetsO9M.js +0 -19
  275. package/dist/useFaceResults-wBJF3zyp.cjs +0 -1
@@ -1,4 +1,5 @@
1
1
  import { XRModel } from '../constants';
2
+ import { XRFallbackReason } from '../capabilities/types';
2
3
  /**
3
4
  * Serialize model options to a value-stable key. Exported for tests: the
4
5
  * acquire effect must key on this, not on the options object's identity.
@@ -8,6 +9,12 @@ export type UseXRModelResult<T extends Record<string, unknown>> = {
8
9
  ready: boolean;
9
10
  node: T | null;
10
11
  error: Error | null;
12
+ /**
13
+ * Structured cause when `error` is set (`model-unreachable`,
14
+ * `model-integrity`, `model-init-failed`, …); `null` while healthy. Camera
15
+ * failures are session-level: read `useXRError()` / `useXRTrackerStatus()`.
16
+ */
17
+ fallback: XRFallbackReason | null;
11
18
  };
12
19
  export declare function useXRModel<T extends Record<string, unknown>>(modelName: XRModel, options?: Record<string, unknown>,
13
20
  /**
@@ -1,6 +1,8 @@
1
1
  import { Camera, Scene, WebGLRenderer } from 'three';
2
2
  import { XRModel } from '../../constants';
3
- import { RegisterXRPipelineParams, SetFrameSourceParams, SetMediaSourceParams, XRPerfConfig } from '../../types';
3
+ import { XRCameraFacing, XRCameraRequest } from '../../types/compositor';
4
+ import { XRQualityConfig, XRQualityState } from '../../quality/types';
5
+ import { RegisterXRPipelineParams, SetFrameSourceParams, SetMediaSourceParams, XRLifecycleConfig, XRPerfConfig } from '../../types';
4
6
  import { ModelRegistry } from './registry';
5
7
  import { SessionStore } from './store';
6
8
  export type SessionFacade = {
@@ -11,6 +13,15 @@ export type SessionFacade = {
11
13
  start: () => Promise<void>;
12
14
  stop: () => Promise<void>;
13
15
  reset: () => Promise<void>;
16
+ pause: () => void;
17
+ resume: () => Promise<void>;
18
+ /**
19
+ * Open another camera (facing or device) on a live session, keeping every
20
+ * model and the lifecycle: a `setMediaSource({ source: WEBCAM, ...request })`
21
+ * that also starts a `media-bound` / `stopped` session. Resolves to the
22
+ * facing the session ended up with.
23
+ */
24
+ switchCamera: (request?: XRCameraRequest) => Promise<XRCameraFacing>;
14
25
  /** @deprecated prefer `useXRModel` */
15
26
  registerXRPipeline: (params: RegisterXRPipelineParams) => Promise<void>;
16
27
  getModelNode: <T extends Record<string, unknown>>(modelCode: XRModel) => T;
@@ -31,7 +42,36 @@ export type SessionFacade = {
31
42
  /** Update the session perf config (targetFps / camRes). Applied to models on
32
43
  * their next run; camRes takes effect on the next media (re)bind. */
33
44
  _setPerf: (perf: XRPerfConfig | undefined) => void;
45
+ /** Update the lifecycle config (visibility handling). */
46
+ _setLifecycle: (lifecycle: XRLifecycleConfig | undefined) => void;
47
+ /**
48
+ * Re-open the current webcam with the current perf config (a changed
49
+ * `camRes`). Keeps lifecycle and models; no-op for stream / canvas sources.
50
+ */
51
+ _rebindMedia: () => Promise<void>;
52
+ /** Publish adaptive-quality state (the controller owns it). */
53
+ _setQuality: (quality: XRQualityState | null) => void;
54
+ /** Publish the controller's resolved config so `useXRQuality()` resolves tiers against it. */
55
+ _setQualityConfig: (config: XRQualityConfig | null) => void;
56
+ /** Current perf config as applied (`_setPerf` merges tier knobs into it). */
57
+ _getPerf: () => XRPerfConfig | undefined;
58
+ /**
59
+ * Final teardown: `reset()` plus listener removal. The provider calls this
60
+ * on unmount; afterwards every bind/start is rejected until `rearm()`.
61
+ * Idempotent.
62
+ */
63
+ dispose: () => Promise<void>;
64
+ /**
65
+ * Undo `dispose()`'s rejection so the same facade can bind again. The
66
+ * provider calls it on every mount: React StrictMode runs mount → unmount →
67
+ * mount against one memoized facade, so a sticky `disposed` would poison it.
68
+ */
69
+ rearm: () => void;
70
+ /** True after `dispose()` (until `rearm()`). */
71
+ isDisposed: () => boolean;
34
72
  };
73
+ /** The front camera is mirrored unless the caller says otherwise; the rear camera is drawn straight. */
74
+ export declare const resolveWebcamMirror: (facingMode: XRCameraFacing, mirrored?: boolean) => boolean;
35
75
  export declare const resolveSourceCanvasSize: ({ renderHeight, renderWidth, videoHeight, videoWidth, }: {
36
76
  renderHeight: number;
37
77
  renderWidth: number;
@@ -41,4 +81,4 @@ export declare const resolveSourceCanvasSize: ({ renderHeight, renderWidth, vide
41
81
  height: number;
42
82
  width: number;
43
83
  };
44
- export declare const createSessionFacade: (perf?: XRPerfConfig) => SessionFacade;
84
+ export declare const createSessionFacade: (perf?: XRPerfConfig, lifecycle?: XRLifecycleConfig) => SessionFacade;
@@ -1,4 +1,4 @@
1
- import { XRPerfConfig } from '../../types';
1
+ import { XRLifecycleConfig, XRPerfConfig } from '../../types';
2
2
  import { SessionFacade } from './facade';
3
3
  export type { SessionFacade } from './facade';
4
- export declare const useXRSession: (perf?: XRPerfConfig) => SessionFacade;
4
+ export declare const useXRSession: (perf?: XRPerfConfig, lifecycle?: XRLifecycleConfig) => SessionFacade;
@@ -14,6 +14,8 @@
14
14
  * Depends on: nothing.
15
15
  * Depended on by: `facade.ts`, `store.ts`, `../selectors.ts`.
16
16
  */
17
- export type XRErrorReason = "permission-denied" | "camera-in-use" | "no-camera" | "unsupported" | "unknown";
17
+ export type XRErrorReason = "permission-denied" | "camera-in-use" | "no-camera" | "unsupported"
18
+ /** The camera stopped mid-session: unplugged, revoked, or taken by another app. */
19
+ | "camera-lost" | "unknown";
18
20
  export declare const mapDomExceptionToReason: (err: unknown) => XRErrorReason;
19
21
  export declare const MESSAGE_FOR: Record<XRErrorReason, string>;
@@ -2,6 +2,13 @@ import { XRModel } from '../../constants';
2
2
  import { BaseXRModel } from '../../models/Base';
3
3
  import { Class } from '../../types';
4
4
  import { SessionStore } from './store';
5
+ /**
6
+ * Where a model is in its life: `idle` (never acquired, or released),
7
+ * `initializing` (acquired, `initialize()` in flight), `ready` (initialized
8
+ * and published), `error` (the last initialize rejected; the next acquire
9
+ * retries).
10
+ */
11
+ export type ModelRegistryState = "idle" | "initializing" | "ready" | "error";
5
12
  export type ModelRegistry = {
6
13
  /**
7
14
  * Acquire a model by name on behalf of `ownerId`. Increments the refcount,
@@ -50,6 +57,13 @@ export type ModelRegistry = {
50
57
  * Force-release every model. Used by `session.reset()`.
51
58
  */
52
59
  releaseAll: () => void;
60
+ /** Lifecycle state of a model (see `ModelRegistryState`). */
61
+ getState: (modelName: XRModel) => ModelRegistryState;
62
+ /** Owner ids currently holding the model, and those that want it running. */
63
+ getOwners: (modelName: XRModel) => {
64
+ refs: string[];
65
+ active: string[];
66
+ };
53
67
  };
54
68
  export declare const createModelRegistry: (store: SessionStore, modelCodeMap: Record<XRModel, Class<BaseXRModel>>,
55
69
  /**
@@ -1,9 +1,17 @@
1
1
  import { CanvasTexture } from 'three';
2
2
  import { XRMediaSource, XRModel } from '../../constants';
3
- import { XRMediaSourceKind } from '../../types/compositor';
3
+ import { XRCameraFacing, XROrientation, XRSessionSourceKind } from '../../types/compositor';
4
4
  import { BaseXRModel } from '../../models/Base';
5
+ import { XRFallbackReason } from '../../capabilities/types';
6
+ import { XRCameraPermissionState } from '../../camera/permission';
7
+ import { XRQualityConfig, XRQualityState } from '../../quality/types';
5
8
  import { XRErrorReason } from './reason';
6
- export type SessionLifecycleState = "idle" | "media-bound" | "running" | "stopped";
9
+ /**
10
+ * `paused` is a running session whose blit loop and models are suspended by
11
+ * `session.pause()` (or a hidden tab with `lifecycle.pauseWhenHidden`); the
12
+ * media stream stays open and `resume()` continues without a rebind.
13
+ */
14
+ export type SessionLifecycleState = "idle" | "media-bound" | "running" | "paused" | "stopped";
7
15
  /**
8
16
  * `message` is human prose and may be reworded at any time; `reason` is the
9
17
  * stable machine-readable identity. `error` is a legacy constant kept for
@@ -14,6 +22,13 @@ export type XRSessionError = {
14
22
  message: string;
15
23
  reason: XRErrorReason;
16
24
  };
25
+ /** Why a model failed to initialize; cleared when the model is acquired again. */
26
+ export type XRModelError = {
27
+ model: XRModel;
28
+ error: Error;
29
+ /** `performance.now()` when the failure was recorded. */
30
+ at: number;
31
+ };
17
32
  export type SessionState = {
18
33
  lifecycle: SessionLifecycleState;
19
34
  ready: boolean;
@@ -22,13 +37,47 @@ export type SessionState = {
22
37
  renderWidth: number;
23
38
  renderHeight: number;
24
39
  source: XRMediaSource | undefined;
25
- sourceKind: "webcam" | XRMediaSourceKind | undefined;
40
+ sourceKind: XRSessionSourceKind | undefined;
41
+ /** Facing of the bound live camera; `null` for stream / canvas sources. */
42
+ cameraFacing: XRCameraFacing | null;
43
+ /** Device id of the bound live camera when one was requested or reported by the track. */
44
+ cameraDeviceId: string | null;
45
+ /** Current device orientation; updated on `screen.orientation` / resize changes. */
46
+ orientation: XROrientation;
47
+ /** Adaptive-quality controller state (`null` until a controller publishes). */
48
+ quality: XRQualityState | null;
49
+ /** The resolved config the mounted controller runs with (tiers, budget, bounds); `null` without one. */
50
+ qualityConfig: XRQualityConfig | null;
51
+ /** Native pixel size of the bound media frame (0 until bound). */
52
+ sourceWidth: number;
53
+ sourceHeight: number;
54
+ /** Framing zoom the blit loop applies when cover-cropping the source into the feed. */
55
+ cameraZoom: number;
26
56
  /**
27
57
  * Active model instances by `XRModel` code. The Map identity is replaced
28
58
  * (not mutated in place) on every add/remove so subscribers comparing
29
59
  * snapshots see a change.
30
60
  */
31
61
  pipeline: ReadonlyMap<XRModel, BaseXRModel>;
62
+ /**
63
+ * Models whose last `initialize()` rejected. Replaced (not mutated) on every
64
+ * change so subscribers comparing snapshots see it. A successful re-acquire
65
+ * removes the entry.
66
+ */
67
+ modelErrors: ReadonlyMap<XRModel, XRModelError>;
68
+ /**
69
+ * Live camera permission as the session experiences it: `requesting`
70
+ * while a webcam `getUserMedia` is pending, then `granted`, or the
71
+ * classified failure. Stays `unknown` for stream / canvas sources.
72
+ */
73
+ cameraPermission: XRCameraPermissionState;
74
+ cameraPermissionReason: XRFallbackReason | null;
75
+ /**
76
+ * Monotonic count of frames the session blitted into the tracker feed.
77
+ * Diagnostics derive the camera frame rate from its delta; it is not a
78
+ * per-frame React signal (published at most a few times per second).
79
+ */
80
+ feedFrames: number;
32
81
  };
33
82
  export type SessionStore = {
34
83
  getSnapshot: () => SessionState;
@@ -0,0 +1,47 @@
1
+ "use strict";const s=require("react/jsx-runtime"),H=require("@react-three/fiber"),C=require("react"),z=require("three"),N=require("./index-DKBAh6hV.cjs"),te=require("./FaceMeshRenderer-BEEXZwS6.cjs"),P=require("./renderPasses-Cg-zqmEz.cjs"),ie=require("./contexts-CO0sd4JQ.cjs"),ve=require("./screenTransform-BiXdpVf0.cjs"),De=require("./index-OCPjOaeP.cjs"),We=require("./index-DsZwTfG0.cjs"),ye=require("./useFaceInfo-C5mO8NQY.cjs"),Se=require("./index-CeVkgsag.cjs"),Ze=require("@react-three/drei");function _e(t){const e=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(t){for(const n in t)if(n!=="default"){const i=Object.getOwnPropertyDescriptor(t,n);Object.defineProperty(e,n,i.get?i:{enumerable:!0,get:()=>t[n]})}}return e.default=t,Object.freeze(e)}const B=_e(z),se={width:720,height:1280},$e=(t=[.5,.5])=>[t[0]*2-1,t[1]*2-1],Ce=({position:t=[0,0],size:e=[1,1]})=>{const n=e[0]/2,i=e[1]/2;return{left:t[0]-n,right:t[0]+n,top:t[1]+i,bottom:t[1]-i}},et=({position:t=[0,0],size:e,canvasSize:n=se})=>{const i=n.width/2||se.width/2,a=n.height/2||se.height/2,r=e??[n.width,n.height];return Ce({position:[t[0]/i,t[1]/a],size:[r[0]/i,r[1]/a]})},Ye=({coordinateSpace:t="normalized",canvasSize:e=se,position:n,size:i,fallbackAnchors:a})=>a||(!n&&!i?Ce({}):t==="canvas"?et({position:n,size:i,canvasSize:e}):Ce({position:n,size:i})),Xe=({children:t,depth:e=0})=>{const{camera:n,size:i}=H.useThree(),a=C.useMemo(()=>{if(!n.isPerspectiveCamera)return{width:10,height:10};const r=n,o=Math.abs(r.position.z-e),l=r.fov*Math.PI/180,c=2*Math.tan(l/2)*o;return{width:c*(i.width/i.height),height:c}},[n,i,e]);return s.jsx(N.ScreenSpaceContext.Provider,{value:a,children:s.jsx("group",{position:[0,0,e],children:t})})},Re=C.forwardRef(({texture:t,name:e,overlay:n,opacity:i,position:a,rotation:r,scale:o,visible:l,renderOrder:c},A)=>s.jsxs("mesh",{ref:A,name:e,position:a,rotation:r,scale:o,visible:l,renderOrder:c,children:[s.jsx("planeGeometry",{args:[1,1]}),s.jsx("meshBasicMaterial",{map:t,transparent:!0,opacity:i,depthTest:!n,depthWrite:!n})]}));Re.displayName="TextLabelMesh";const tt={color:"#ffffff",strokeWidth:0,strokeOpacity:1,shadowBlur:0,shadowOffsetX:0,shadowOffsetY:0,shadowOpacity:1,fontWeight:"bold",fontStyle:"normal",fontFamily:"Arial, sans-serif",fontSize:48,textAlign:"center",verticalAlign:"center",minFontSize:12,letterSpacing:0,lineSpacing:.3,bgColor:"rgba(20,40,110,0.88)",bgFillMode:"solid",bgOpacity:1,bgFit:"full",bgTextureFit:"cover",bgTextureFlipX:!1,bgTextureFlipY:!1,borderWidth:0,borderRadius:24,padding:32,aspect:2.5,resolution:512,opacity:1,underline:!1,strikethrough:!1,bendPreset:"arc",bendStrength:0},Ee=t=>{C.useEffect(()=>()=>{t==null||t.dispose()},[t])};function nt(t,e,n){return n==="left"?e:n==="right"?t-e:t/2}function rt(t,e,n,i,a){return a==="top"?e+n/2:a==="bottom"?t-e-i+n/2:t/2-(i-n)/2}function it(t,e,n,i){return i==="full"||n==="left"?0:n==="right"?t-e:(t-e)/2}function je(t,e,n,i){return`${t} ${e} ${n}px ${i}`}function ce(t,e){const n=Math.max(0,Math.min(e,1));return t*n*.08}function Pe(t,e){const n=Math.max(0,Math.min(e,1));return t*(1.2+n*.6)}function Ge(t,e){"letterSpacing"in t&&(t.letterSpacing=`${e}px`)}function Oe(t){"letterSpacing"in t&&(t.letterSpacing="0px")}function ae(t,e,n){Ge(t,n);const i=t.measureText(e).width;return Oe(t),i}function Ie(t,e,n,i){return Math.max(1,Math.floor((t-e*2)/Pe(n,i)))}function at(t,e,n,i,a){return e.length<=i&&e.every(r=>ae(t,r,a)<=n)}function be(t,e,n,i,a,r,o,l){t.font=je(i,a,r,o);const c=e.split(" "),A=[];let g="";for(const f of c){const d=g?`${g} ${f}`:f;ae(t,d,l)>n&&g?(A.push(g),g=f):g=d}return g&&A.push(g),A}function Be(t,e,n,i,a,r,o,l){const A=e.split(/\r?\n/).flatMap(g=>g.trim().length===0?[""]:be(t,g,n,i,a,r,o,l));return A.length>0?A:[e]}function ze(t,e,n,i,a){const r=i?"...":"";let o=e.trimEnd();for(;o.length>0&&ae(t,`${o}${r}`,a)>n;)o=o.slice(0,-1).trimEnd();return`${o}${r}`}function pe(t,e,n,i,a){return e.map((r,o)=>{if(ae(t,r,a)<=n)return r;const l=o===e.length-1;return ze(t,r,n,i==="ellipsis"&&l,a)})}function Me(t,e,n,i,a,r){if(e.length<=n)return pe(t,e,i,a?"ellipsis":"clip",r);const o=e.slice(0,n),l=o[n-1];return o[n-1]=ze(t,l,i,a,r),pe(t,o,i,a?"ellipsis":"clip",r)}function ot(t){const{ctx:e,text:n,explicitLines:i,maxWidth:a,maxHeight:r,padding:o,fontStyle:l,fontWeight:c,fontSize:A,fontFamily:g,letterSpacing:f,lineSpacing:d,overflow:h,resizeToFit:m,minFontSize:S}=t;let v=A,E=ce(v,f),b=i??Be(e,n,a,l,c,v,g,E),I=Ie(r,o,v,d);const M=m===!0||h==="shrink";for(;M&&!at(e,b,a,I,E)&&v>S&&(v=Math.max(S,v-4),E=ce(v,f),b=i??Be(e,n,a,l,c,v,g,E),I=Ie(r,o,v,d),v!==S););return h==="ellipsis"?b=Me(e,b,I,a,!0,E):h==="clamp"||h==="shrink"?b=Me(e,b,I,a,!1,E):h!=="clip"&&(b=pe(e,b,a,void 0,E)),{fontSize:v,lines:b}}function st(t){const{ctx:e,text:n,maxWidth:i,maxHeight:a,padding:r,fontStyle:o,fontWeight:l,fontSize:c,fontFamily:A,letterSpacing:g,lineSpacing:f}=t;let d=c,h=be(e,n,i,o,l,d,A,ce(d,g));const m=Ie(a,r,d,f);return h.length>m&&(d=Math.max(12,Math.round(d*.75)),h=be(e,n,i,o,l,d,A,ce(d,g))),{fontSize:d,lines:h}}function xe(t,e){return typeof OffscreenCanvas<"u"?new OffscreenCanvas(t,e):(()=>{const n=document.createElement("canvas");return n.width=t,n.height=e,n})()}function lt(t,e){const n=e.width-e.padding*2,a=Array.isArray(e.lines)||e.text.includes(`
2
+ `)||e.overflow!==void 0||e.resizeToFit!==void 0?ot({ctx:t,text:e.text,explicitLines:e.lines,maxWidth:n,maxHeight:e.height,padding:e.padding,fontStyle:e.fontStyle,fontWeight:e.fontWeight,fontSize:e.fontSize,fontFamily:e.fontFamily,overflow:e.overflow,resizeToFit:e.resizeToFit,minFontSize:e.minFontSize,letterSpacing:e.letterSpacing,lineSpacing:e.lineSpacing}):st({ctx:t,text:e.text,maxWidth:n,maxHeight:e.height,padding:e.padding,fontStyle:e.fontStyle,fontWeight:e.fontWeight,fontSize:e.fontSize,fontFamily:e.fontFamily,letterSpacing:e.letterSpacing,lineSpacing:e.lineSpacing}),r=a.fontSize,o=a.lines;t.font=je(e.fontStyle,e.fontWeight,r,e.fontFamily);const l=ce(r,e.letterSpacing),c=Pe(r,e.lineSpacing),A=Math.max(r,r+(o.length-1)*c),g=rt(e.height,e.padding,r,A,e.verticalAlign),f=o.map(d=>ae(t,d,l));return{fontSize:r,resolvedLines:o,letterSpacingPx:l,lineHeight:c,startY:g,textBlockWidth:Math.min(e.width,Math.max(0,Math.max(...f,0))+e.padding*2),textBlockHeight:Math.min(e.height,A+e.padding*2),textX:nt(e.width,e.padding,e.textAlign)}}function ct(t,e,n,i,a,r){t.beginPath(),t.moveTo(e+r,n),t.lineTo(e+i-r,n),t.quadraticCurveTo(e+i,n,e+i,n+r),t.lineTo(e+i,n+a-r),t.quadraticCurveTo(e+i,n+a,e+i-r,n+a),t.lineTo(e+r,n+a),t.quadraticCurveTo(e,n+a,e,n+a-r),t.lineTo(e,n+r),t.quadraticCurveTo(e,n,e+r,n),t.closePath()}function Qe(t,e,n){return typeof t!="number"||Number.isNaN(t)||t<=0?e:Math.min(t,n)}function At(t,e){const n=it(e.canvasWidth,e.panelWidth,e.textAlign,e.bgFit),i=(e.canvasHeight-e.panelHeight)/2,a=Math.min(e.borderRadius,Math.min(e.panelWidth,e.panelHeight)/2);ct(t,n,i,e.panelWidth,e.panelHeight,a),gt(t,{panelX:n,panelY:i,panelWidth:e.panelWidth,panelHeight:e.panelHeight,bgColor:e.bgColor,bgFillMode:e.bgFillMode,bgOpacity:e.bgOpacity,bgGradientStops:e.bgGradientStops,bgTextureImage:e.bgTextureImage,bgTextureFit:e.bgTextureFit,bgTextureFlipX:e.bgTextureFlipX,bgTextureFlipY:e.bgTextureFlipY}),e.borderColor&&e.borderWidth>0&&(t.lineWidth=e.borderWidth,t.strokeStyle=e.borderColor,t.stroke())}function gt(t,e){if(t.save(),t.globalAlpha=Math.max(0,Math.min(e.bgOpacity,1)),e.bgFillMode==="gradient"&&e.bgGradientStops&&e.bgGradientStops.length>1){const n=t.createLinearGradient(e.panelX,e.panelY,e.panelX+e.panelWidth,e.panelY+e.panelHeight);[...e.bgGradientStops].sort((i,a)=>i.position-a.position).forEach(i=>n.addColorStop(Math.max(0,Math.min(i.position,1)),i.color)),t.fillStyle=n,t.fill(),t.restore();return}if(e.bgTextureImage){t.clip(),ut(t,{image:e.bgTextureImage,x:e.panelX,y:e.panelY,width:e.panelWidth,height:e.panelHeight,fit:e.bgTextureFit,flipX:e.bgTextureFlipX,flipY:e.bgTextureFlipY}),t.restore();return}t.fillStyle=e.bgColor,t.fill(),t.restore()}function ut(t,e){const{image:n,x:i,y:a,width:r,height:o,fit:l,flipX:c,flipY:A}=e,g="naturalWidth"in n?n.naturalWidth:"videoWidth"in n?n.videoWidth:n.width,f="naturalHeight"in n?n.naturalHeight:"videoHeight"in n?n.videoHeight:n.height;let d=r,h=o,m=i,S=a;if(l!=="stretch"&&g>0&&f>0){const v=l==="cover"?Math.max(r/g,o/f):Math.min(r/g,o/f);d=g*v,h=f*v,m=i+(r-d)/2,S=a+(o-h)/2}t.save(),(c||A)&&(t.translate(c?i+r:0,A?a+o:0),t.scale(c?-1:1,A?-1:1),m=c?-(m-i)-d+i:m,S=A?-(S-a)-h+a:S),t.drawImage(n,m,S,d,h),t.restore()}function dt(t,e,n,i,a,r){const o=a/72,l=Math.abs(o),c=1-Math.min(1,Math.abs(e)),A=Math.min(1,Math.abs(e)),g=i<=1?.5:n/(i-1),f=Math.sin(g*Math.PI*2-Math.PI/2),d=Math.sin(g*Math.PI*2.7-Math.PI/2)*(.65+g*.35),h=a*e*e,m=2*a*e/r,S={xOffset:0,yOffset:0,rotation:0,scaleX:1,scaleY:1};switch(t){case"arc":return{...S,yOffset:h,rotation:Math.atan(m)};case"arc-lower":return{...S,yOffset:h*.55,scaleY:Math.max(.2,1+o*e*e*.45)};case"arc-upper":return{...S,yOffset:-h*.55,scaleY:Math.max(.2,1-o*e*e*.45)};case"arch":return{...S,yOffset:h};case"bulge":return{...S,scaleY:Math.max(.2,1+o*c*.75)};case"shell-lower":return{...S,yOffset:a*.45*g*c,scaleY:Math.max(.2,1+o*g*c)};case"shell-upper":return{...S,yOffset:-a*.45*(1-g)*c,scaleY:Math.max(.2,1+o*(1-g)*c)};case"flag":return{...S,yOffset:a*.65*d,rotation:Math.atan(a/Math.max(r,1)*Math.cos(g*Math.PI*2.7)*1.6)};case"wave":return{...S,yOffset:a*.6*f,rotation:Math.atan(a/Math.max(r,1)*Math.cos(g*Math.PI*2)*1.4)};case"fish":return{...S,scaleX:Math.max(.25,1-l*A*.55),scaleY:Math.max(.2,1+o*c)};case"rise":return{...S,yOffset:a*e};case"fisheye":return{...S,yOffset:a*.18*e*c,scaleX:Math.max(.25,1+o*c*.7),scaleY:Math.max(.2,1+o*c*.7)};case"inflate":return{...S,scaleX:Math.max(.25,1+o*c*.6),scaleY:Math.max(.2,1+o*c*.6)};case"squeeze":return{...S,scaleY:Math.max(.2,1-o*c*.8)};case"twist":return{...S,yOffset:a*e,rotation:o*e*.45,scaleY:Math.max(.2,1+o*e*.25)};default:return S}}function re(t,e,n,i,a,r,o="arc",l=0){if(l!==0){ft(t,e,n,i,a,r,o,l);return}Ge(t,a),r==="fill"?t.fillText(e,n,i):t.strokeText(e,n,i),Oe(t)}function ft(t,e,n,i,a,r,o,l){const c=Array.from(e);if(c.length===0)return;const A=c.map(E=>t.measureText(E).width),g=A.reduce((E,b)=>E+b,0)+a*Math.max(0,c.length-1),f=t.textAlign,d=f==="right"?n-g:f==="center"?n-g/2:n,m=Math.max(-100,Math.min(l,100))/100*72,S=Math.max(g/2,1);let v=d;for(let E=0;E<c.length;E++){const b=c[E],I=A[E],M=v+I/2,p=(M-d-g/2)/S,y=dt(o,p,E,c.length,m,S);t.save(),t.translate(M+y.xOffset,i+y.yOffset),t.rotate(y.rotation),t.scale(y.scaleX,y.scaleY),t.textAlign="center",r==="fill"?t.fillText(b,0,0):t.strokeText(b,0,0),t.restore(),v+=I+a}}function ke(t,e,n,i,a,r,o,l,c){const A=ae(t,e,l),g=a==="center"?n-A/2:a==="right"?n-A:n,f=c==="underline"?o*.42:-o*.08,d=i+f;t.save(),t.strokeStyle=r,t.lineWidth=Math.max(2,o*.06),t.lineCap="round",t.beginPath(),t.moveTo(g,d),t.lineTo(g+A,d),t.stroke(),t.restore()}function ht(t,e){for(let n=0;n<e.lines.length;n++){const i=e.lines[n],a=e.startY+n*e.lineHeight;for(const r of e.shadowLayers)t.save(),t.shadowColor=r.color,t.shadowBlur=r.blur,t.shadowOffsetX=r.offsetX??0,t.shadowOffsetY=r.offsetY??0,t.globalAlpha=r.opacity??1,t.fillStyle=e.color,re(t,i,e.textX,a,e.letterSpacingPx,"fill",e.bendPreset,e.bendStrength),t.restore();for(const r of e.strokeLayers)t.save(),t.lineJoin="round",t.miterLimit=2,t.lineWidth=r.width,t.strokeStyle=r.color,t.globalAlpha=r.opacity??1,re(t,i,e.textX,a,e.letterSpacingPx,"stroke",e.bendPreset,e.bendStrength),t.restore();t.save(),t.fillStyle=e.color,t.globalAlpha=1,re(t,i,e.textX,a,e.letterSpacingPx,"fill",e.bendPreset,e.bendStrength),t.restore(),e.underline&&ke(t,i,e.textX,a,e.textAlign,e.color,e.fontSize,e.letterSpacingPx,"underline"),e.strikethrough&&ke(t,i,e.textX,a,e.textAlign,e.color,e.fontSize,e.letterSpacingPx,"strikethrough")}}function mt(t,e){const n=Math.max(0,Math.min(e.intensity,1));if(n<=0)return;const i=Math.max(0,Math.min(e.range,1)),a=i*72,r=Math.max(-.5,Math.min(e.horizontalAngle,.5))*80,o=Math.max(-.5,Math.min(e.verticalAngle,.5))*80;for(let l=0;l<e.lines.length;l++){const c=e.startY+l*e.lineHeight;t.save(),t.globalAlpha=n,t.shadowColor=e.color,t.shadowBlur=a,t.shadowOffsetX=r,t.shadowOffsetY=o,e.style==="contoured"?(t.lineJoin="round",t.miterLimit=2,t.lineWidth=Math.max(2,i*42),t.strokeStyle=e.color,re(t,e.lines[l],e.textX,c,e.letterSpacingPx,"stroke",e.bendPreset,e.bendStrength)):(t.fillStyle=e.color,re(t,e.lines[l],e.textX,c,e.letterSpacingPx,"fill",e.bendPreset,e.bendStrength)),t.restore()}}function vt(t,e){const n=xe(e.width,e.height),i=n.getContext("2d");i.clearRect(0,0,e.width,e.height),i.font=e.font,i.fillStyle="#ffffff",i.textAlign=e.textAlign,i.textBaseline="middle";for(let o=0;o<e.lines.length;o++)re(i,e.lines[o],e.textX,e.startY+o*e.lineHeight,e.letterSpacingPx,"fill",e.bendPreset,e.bendStrength);const a=xe(e.width,e.height),r=a.getContext("2d");r.clearRect(0,0,e.width,e.height),r.save(),r.globalAlpha=e.opacity,r.filter=e.blur>0?`blur(${e.blur}px)`:"none",r.drawImage(n,e.offsetX,e.offsetY),r.restore(),r.globalCompositeOperation="destination-in",r.drawImage(n,0,0),r.globalCompositeOperation="source-in",r.globalAlpha=e.opacity,r.fillStyle=e.color,r.fillRect(0,0,e.width,e.height),t.drawImage(a,0,0)}function St(t){const{width:e,height:n,color:i,strokeLayers:a,strokeColor:r,strokeWidth:o,strokeOpacity:l,shadowLayers:c,innerShadow:A,glow:g,shadowColor:f,shadowBlur:d,shadowOffsetX:h,shadowOffsetY:m,shadowOpacity:S,textAlign:v,bgFillMode:E,bgOpacity:b,bgFit:I,bgAutoSize:M,bgWidth:p,bgHeight:y,bgGradientStops:L,bgTextureImage:x,bgTextureFit:u,bgTextureFlipX:k,bgTextureFlipY:J,underline:X,strikethrough:K,bendPreset:D,bendStrength:G}=t;let{fontSize:V,bgColor:U}=t;const q=[...a??[],...r&&o>0?[{color:r,width:o,opacity:l}]:[]].filter(Q=>Q.width>0),Z=[...c??[],...f&&(d>0||h!==0||m!==0)?[{color:f,blur:d,offsetX:h,offsetY:m,opacity:S}]:[]].filter(Q=>Q.blur>0||(Q.offsetX??0)!==0||(Q.offsetY??0)!==0);let Y;const _=xe(e,n),W=_.getContext("2d");W.clearRect(0,0,e,n),W.fillStyle=i,W.textAlign=v,W.textBaseline="middle";const T=lt(W,t);if(V=T.fontSize,U!=="transparent"){const Q=M===!0,F=Qe(Q?void 0:p,I==="text"||Q?T.textBlockWidth:e,e),O=Qe(Q?void 0:y,I==="text"||Q?T.textBlockHeight:n,n);At(W,{canvasWidth:e,canvasHeight:n,textAlign:v,bgFit:I,panelWidth:F,panelHeight:O,bgColor:U,bgFillMode:E,bgOpacity:b,bgGradientStops:L,bgTextureImage:x,bgTextureFit:u,bgTextureFlipX:k,bgTextureFlipY:J,borderColor:t.borderColor,borderWidth:t.borderWidth,borderRadius:t.borderRadius})}return g&&mt(W,{lines:T.resolvedLines,textX:T.textX,startY:T.startY,lineHeight:T.lineHeight,letterSpacingPx:T.letterSpacingPx,bendPreset:D,bendStrength:G,color:g.color,style:g.style,intensity:g.intensity??.5,range:g.range??.5,horizontalAngle:g.horizontalAngle??0,verticalAngle:g.verticalAngle??0}),ht(W,{lines:T.resolvedLines,textX:T.textX,startY:T.startY,lineHeight:T.lineHeight,textAlign:v,color:i,fontSize:V,letterSpacingPx:T.letterSpacingPx,bendPreset:D,bendStrength:G,shadowLayers:Z,strokeLayers:q,underline:X,strikethrough:K}),A&&vt(W,{width:e,height:n,font:W.font,lines:T.resolvedLines,textX:T.textX,startY:T.startY,lineHeight:T.lineHeight,letterSpacingPx:T.letterSpacingPx,bendPreset:D,bendStrength:G,textAlign:v,color:A.color,opacity:A.opacity??1,blur:A.blur,offsetX:A.offsetX??0,offsetY:A.offsetY??0}),Y=new B.CanvasTexture(_),Y.needsUpdate=!0,Y}function Ct(t,e){const{lines:n,color:i,strokeLayers:a,outlineEnabled:r,strokeColor:o,strokeWidth:l,strokeOpacity:c,shadowLayers:A,shadowEnabled:g,innerShadow:f,glow:d,shadowColor:h,shadowBlur:m,shadowOffsetX:S,shadowOffsetY:v,shadowOpacity:E,fontWeight:b,fontStyle:I,fontFamily:M,fontSize:p,textAlign:y,verticalAlign:L,overflow:x,resizeToFit:u,minFontSize:k,letterSpacing:J,lineSpacing:X,bgFillMode:K,bgOpacity:D,bgFit:G,bgAutoSize:V,bgWidth:U,bgHeight:q,bgGradientStops:Z,bgTextureFit:Y,bgTextureFlipX:_,bgTextureFlipY:W,borderColor:T,borderWidth:Q,borderRadius:F,padding:O,aspect:$,resolution:ee,underline:Ae,strikethrough:ge,bendPreset:ue,bendStrength:oe}=t,de=C.useMemo(()=>r===!1?[]:a,[r,a]),fe=C.useMemo(()=>g===!1?[]:A,[g,A]),R=void 0,he=C.useMemo(()=>({text:e.text,lines:n,color:i,strokeLayers:de,strokeColor:r===!1?void 0:o,strokeWidth:r===!1?0:l,strokeOpacity:c,shadowLayers:fe,innerShadow:f,glow:d,shadowColor:g===!1?void 0:h,shadowBlur:g===!1?0:m,shadowOffsetX:g===!1?0:S,shadowOffsetY:g===!1?0:v,shadowOpacity:E,fontWeight:b,fontStyle:I,fontFamily:M,fontSize:p,textAlign:y,verticalAlign:L,overflow:x,resizeToFit:u,minFontSize:k,letterSpacing:J,lineSpacing:X,bgColor:e.bgColor,bgFillMode:K,bgOpacity:D,bgFit:G,bgAutoSize:V,bgWidth:U,bgHeight:q,bgGradientStops:Z,bgTextureImage:R,bgTextureFit:Y,bgTextureFlipX:_,bgTextureFlipY:W,borderColor:T,borderWidth:Q,borderRadius:F,padding:O,height:ee,width:Math.round(ee*Math.max($,.1)),underline:Ae,strikethrough:ge,bendPreset:ue,bendStrength:oe}),[e.text,e.bgColor,n,i,de,r,o,l,c,fe,f,d,g,h,m,S,v,E,b,I,M,p,y,L,x,u,k,J,X,K,D,G,V,U,q,Z,R,Y,_,W,T,Q,F,O,$,ee,Ae,ge,ue,oe]),Te=C.useMemo(()=>St(he),[he]);return Ee(Te),Te}function He(t){const e={...tt,...t},{text:n,bgColor:i,opacity:a,name:r,overlay:o=!0,position:l,rotation:c,scale:A,visible:g,renderOrder:f}=e,[d,h]=C.useState(null),[m,S]=C.useState(null),v=C.useRef(n);v.current!==n&&(v.current=n,d!==null&&h(null));const E=C.useRef(i);E.current!==i&&(E.current=i,m!==null&&S(null));const b=C.useRef(null),p=Ct(e,{text:d??n,bgColor:m??i});return C.useEffect(()=>{const y=b.current;if(y)return y.userData.setText=L=>h(L),y.userData.setBgColor=L=>S(L),()=>{delete y.userData.setText,delete y.userData.setBgColor}},[]),s.jsx(Re,{ref:b,name:r,texture:p,overlay:o,opacity:a,position:l,rotation:c,scale:A,visible:g,renderOrder:f})}const Et="data:image/png;base64,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";function me(t,e){return!Number.isFinite(t)||!Number.isFinite(e)||t<=0||e<=0?[1,1,1]:Math.abs(t-e)<1e-6?[1,1,1]:t>e?[e/t,1,1]:[1,t/e,1]}const It=(t,e)=>t||(e==="cover"?"fill":e==="stretch"?"stretch":"fit"),we=(t,e)=>{const[n,i]=me(t,e);return n===1&&i===1?[1,1,1]:n<1?[1,1/n,1]:[1/i,1,1]},bt=(t,e,n,i,a,r,o)=>{let l=[1,1,1],c=[1,1,1],A=[1,1],g=[0,0];switch(t){case"fit":l=me(e,n),c=l;break;case"fitWidth":l=[1,e>0&&n>0?e/n:1,1],c=l;break;case"fitHeight":l=[e>0&&n>0?n/e:1,1,1],c=l;break;case"center":l=r&&o&&r.width>0&&r.height>0&&o.width>0&&o.height>0?[o.width/r.width,o.height/r.height,1]:me(e,n),c=l;break;case"fill":l=we(e,n),c=l;break;case"fillAndCut":if(c=we(e,n),n>e){const f=e/n;A=[f,1],g=[(1-f)/2,0]}else if(n<e){const f=n/e;A=[1,f],g=[0,(1-f)/2]}break}return{meshScale:[l[0]*(i?-1:1),l[1]*(a?-1:1),1],guideScale:c,repeat:A,offset:g}},pt=(t,e)=>t??(e?{kind:"image",src:e}:{kind:"default"}),ne=t=>{const e=t.image;return{width:(e==null?void 0:e.videoWidth)??(e==null?void 0:e.width)??1,height:(e==null?void 0:e.videoHeight)??(e==null?void 0:e.height)??1}},xt=t=>{if(t.isVideoTexture||t.isCanvasTexture)return!0;const e=t.image;return typeof HTMLCanvasElement<"u"&&e instanceof HTMLCanvasElement||typeof OffscreenCanvas<"u"&&e instanceof OffscreenCanvas},Tt=t=>{const{width:e,height:n}=ne(t);return e>0&&n>0?e/n:1},yt=new Set(["overlay","softLight","hardLight","difference","exclusion"]),Bt={overlay:0,softLight:1,hardLight:2,difference:3,exclusion:4},Mt=t=>{switch(t){case"add":return{blending:B.AdditiveBlending};case"subtract":return{blending:B.SubtractiveBlending};case"multiply":return{blending:B.MultiplyBlending};case"screen":return{blending:B.CustomBlending,blendSrc:B.OneFactor,blendDst:B.OneMinusSrcColorFactor,blendEquation:B.AddEquation};case"lighten":return{blending:B.CustomBlending,blendSrc:B.OneFactor,blendDst:B.OneFactor,blendEquation:B.MaxEquation};case"darken":return{blending:B.CustomBlending,blendSrc:B.OneFactor,blendDst:B.OneFactor,blendEquation:B.MinEquation};default:return{blending:B.NormalBlending}}},Qt=`
3
+ varying vec2 vUv;
4
+ void main(){vUv=uv;gl_Position=projectionMatrix*modelViewMatrix*vec4(position,1.0);}`,kt=`
5
+ uniform sampler2D imageMap;uniform sampler2D backdropMap;uniform vec2 resolution;
6
+ uniform vec3 tint;uniform float opacity;uniform float alphaTest;uniform int blendMode;varying vec2 vUv;
7
+ float overlayChannel(float b,float s){return b<.5?2.*b*s:1.-2.*(1.-b)*(1.-s);}
8
+ float hardLightChannel(float b,float s){return s<.5?2.*b*s:1.-2.*(1.-b)*(1.-s);}
9
+ float softLightChannel(float b,float s){return s<.5?b-(1.-2.*s)*b*(1.-b):b+(2.*s-1.)*(sqrt(max(b,0.))-b);}
10
+ vec3 applyAdvancedBlend(vec3 b,vec3 s){
11
+ if(blendMode==0)return vec3(overlayChannel(b.r,s.r),overlayChannel(b.g,s.g),overlayChannel(b.b,s.b));
12
+ if(blendMode==1)return vec3(softLightChannel(b.r,s.r),softLightChannel(b.g,s.g),softLightChannel(b.b,s.b));
13
+ if(blendMode==2)return vec3(hardLightChannel(b.r,s.r),hardLightChannel(b.g,s.g),hardLightChannel(b.b,s.b));
14
+ if(blendMode==3)return abs(b-s);return b+s-2.*b*s;}
15
+ void main(){vec4 image=texture2D(imageMap,vUv)*vec4(tint,opacity);if(image.a<=alphaTest)discard;
16
+ vec2 uv=gl_FragCoord.xy/max(resolution,vec2(1.));vec3 base=texture2D(backdropMap,uv).rgb;
17
+ vec3 mixed=applyAdvancedBlend(base,image.rgb);gl_FragColor=vec4(mix(base,mixed,image.a),1.);
18
+ #include <colorspace_fragment>
19
+ }`,wt=()=>{const t=document.createElement("canvas");t.width=256,t.height=256;const e=t.getContext("2d");if(!e)return new B.CanvasTexture(t);const n=e.createRadialGradient(96,80,10,128,128,128);n.addColorStop(0,"#ffffff"),n.addColorStop(.18,"#f8fafc"),n.addColorStop(.44,"#cbd5e1"),n.addColorStop(.72,"#475569"),n.addColorStop(1,"#0f172a"),e.fillStyle=n,e.fillRect(0,0,t.width,t.height);const i=new B.CanvasTexture(t);return i.needsUpdate=!0,i},Je=["alpha","red","green","luminance"],Ft=t=>{const e=Je.indexOf(t??"alpha");return e<0?0:e},Lt=`
20
+ varying vec2 vUv;
21
+ void main(){vUv=uv;gl_Position=projectionMatrix*modelViewMatrix*vec4(position,1.0);}`,Dt=`
22
+ uniform sampler2D imageMap;uniform sampler2D maskMap;uniform mat3 mapTransform;
23
+ uniform vec3 tint;uniform float opacity;uniform float alphaTest;uniform int maskChannel;uniform float maskInvert;
24
+ uniform float maskFeather;uniform float maskErode;uniform vec2 maskTexel;
25
+ varying vec2 vUv;
26
+ float coverageAt(vec2 uv){
27
+ vec4 m=texture2D(maskMap,uv);
28
+ float c=maskChannel==0?m.a:maskChannel==1?m.r:maskChannel==2?m.g:dot(m.rgb,vec3(0.299,0.587,0.114));
29
+ return mix(c,1.0-c,maskInvert);}
30
+ void main(){
31
+ vec2 uv=(mapTransform*vec3(vUv,1.0)).xy;
32
+ vec4 image=texture2D(imageMap,uv);
33
+ float coverage;
34
+ if(maskFeather>0.0){
35
+ vec2 step=maskTexel*maskFeather;
36
+ coverage=0.0;
37
+ for(int y=-1;y<=1;y++){for(int x=-1;x<=1;x++){coverage+=coverageAt(uv+vec2(float(x),float(y))*step);}}
38
+ coverage/=9.0;
39
+ // Erode: raise the threshold on the blurred edge so the silhouette shrinks
40
+ // by up to the feather radius (maskErode is a fraction of that width).
41
+ coverage=smoothstep(clamp(maskErode,0.0,0.95),1.0,coverage);
42
+ }else{coverage=coverageAt(uv);}
43
+ float alpha=image.a*opacity*coverage;
44
+ if(alpha<=alphaTest)discard;
45
+ gl_FragColor=vec4(image.rgb*tint,alpha);
46
+ #include <colorspace_fragment>
47
+ }`;function Wt({materialTexture:t,sourceTexture:e,onSourceSizeChange:n}){const i=C.useRef(ne(e));return H.useFrame(()=>{t.needsUpdate=!0;const a=ne(e);(a.width!==i.current.width||a.height!==i.current.height)&&(i.current=a,n(a))}),null}const Yt=999,Xt=Math.PI/180,Rt=ie.createTextureSourceResolver([ie.gifTextureSourceProvider]);function jt(t){const[e,n]=C.useState(null);return C.useEffect(()=>{if(n(null),!t||typeof document>"u")return;const i=new AbortController;let a;return Rt({kind:"gif",src:t},i.signal).then(r=>{a=r,n(r)}).catch(r=>{r instanceof DOMException&&r.name==="AbortError"||console.warn("[xr-sdk] Failed to load GIF ScreenImage source",r)}),()=>{i.abort(),ie.disposeResolvedTextureSource(a)}},[t]),e}function Fe({name:t,source:e,src:n,fit:i,stretchMode:a,materialType:r="unlit",blendMode:o="normal",backdropTexture:l=null,rotation:c=0,opacity:A=1,color:g="#ffffff",maskTexture:f=null,maskChannel:d,maskInvert:h=!1,maskFeather:m=0,maskErode:S=0,flipX:v=!1,flipY:E=!1,renderOrder:b=Yt,transparent:I=!0,alphaTest:M=0,overlay:p=!0,visible:y,layoutSize:L}){const{size:x}=H.useThree(),u=ie.useXRViewportRenderOutputs(),k=pt(e,n),J=k.kind==="image"?k.src:Et,X=Ze.useTexture(J),K=jt(k.kind==="gif"?k.src:void 0),D=k.kind==="texture"?k.texture:k.kind==="gif"?(K==null?void 0:K.texture)??X:X,G=N.useScreenRectAspect(),V=It(a,i),[U,q]=C.useState(()=>ne(D));C.useEffect(()=>{q(ne(D))},[D]);const Z=xt(D),Y=Z?U:ne(D),_=C.useCallback(R=>q(R),[]),W=Y.width>0&&Y.height>0?Y.width/Y.height:Tt(D),T=C.useMemo(()=>wt(),[]),Q=C.useMemo(()=>bt(V,G,W,v,E,L,Y),[V,G,W,v,E,L,Y]),F=C.useMemo(()=>{const R=D.clone();return R.needsUpdate=!0,R.repeat.set(Q.repeat[0],Q.repeat[1]),R.offset.set(Q.offset[0],Q.offset[1]),R},[D,Q.repeat,Q.offset]);Ee(F),Ee(T);const O=C.useMemo(()=>Mt(o),[o]),$=yt.has(o)?o:null,ee=l??(u==null?void 0:u.finalColorTexture)??(u==null?void 0:u.sceneColorTexture)??null,Ae=$!==null&&ee!==null,ge=C.useMemo(()=>({imageMap:F,backdropMap:ee,resolution:new B.Vector2(x.width,x.height),tint:new B.Color(g),opacity:A,alphaTest:M,blendMode:$===null?0:Bt[$]}),[$,M,ee,x.height,x.width,g,F,A]),ue=te.useStableUniforms(ge),oe=C.useMemo(()=>(F.updateMatrix(),F.matrix.clone()),[F]),de=C.useMemo(()=>({imageMap:F,maskMap:f,mapTransform:oe,tint:new B.Color(g),opacity:A,alphaTest:M,maskChannel:Ft(d),maskInvert:h?1:0,maskFeather:m,maskErode:S,maskTexel:(()=>{const{width:R,height:he}=ne(f??F);return new B.Vector2(1/Math.max(R,1),1/Math.max(he,1))})()}),[M,g,oe,d,S,m,h,f,F,A]),fe=te.useStableUniforms(de);return s.jsxs("group",{visible:y,children:[Z?s.jsx(Wt,{materialTexture:F,sourceTexture:D,onSourceSizeChange:_}):null,s.jsxs("mesh",{name:t,scale:Q.meshScale,rotation:[0,0,c*Xt],renderOrder:b,children:[s.jsx("planeGeometry",{args:[1,1]}),f?s.jsx("shaderMaterial",{uniforms:fe,vertexShader:Lt,fragmentShader:Dt,transparent:!0,depthTest:!p,depthWrite:!p,toneMapped:!1,...O}):Ae?s.jsx("shaderMaterial",{uniforms:ue,vertexShader:Qt,fragmentShader:kt,transparent:!1,depthTest:!p,depthWrite:!p,toneMapped:!1}):r==="standardPBR"?s.jsx("meshStandardMaterial",{map:F,transparent:I||A<1,opacity:A,color:g,alphaTest:M,depthTest:!p,depthWrite:!p,toneMapped:!1,roughness:.72,metalness:.08,emissive:g,emissiveIntensity:.18,...O}):r==="matcap"?s.jsx("meshMatcapMaterial",{map:F,matcap:T,transparent:I||A<1,opacity:A,color:g,alphaTest:M,depthTest:!p,depthWrite:!p,toneMapped:!1,...O}):s.jsx("meshBasicMaterial",{map:F,transparent:I||A<1,opacity:A,color:g,alphaTest:M,depthTest:!p,depthWrite:!p,toneMapped:!1,...O})]})]})}const Pt={left:0,right:0,top:0,bottom:0},Gt=Math.PI/180;function Ot({anchors:t,offsets:e,pivot:n,rotation:i,children:a}){const{width:r,height:o}=N.useScreenSpace(),l=C.useMemo(()=>({left:-1,right:1,top:1,bottom:-1,...t}),[t]),c=C.useMemo(()=>({...Pt,...e}),[e]),A=C.useMemo(()=>ie.computeScreenTransform(r,o,l,c,n),[o,n,l,c,r]),g=A.width>0&&A.height>0?A.width/A.height:null;return s.jsx("group",{position:[A.centerX-A.pivotX,A.centerY-A.pivotY,0],rotation:[0,0,i*Gt],scale:[A.width,A.height,1],children:s.jsx(N.ScreenRectAspectContext.Provider,{value:g,children:a})})}function zt({transform:t,guideLayer:e,onChange:n,children:i}){return s.jsx(P.ScreenTransformFrame,{guideColor:"#22d3ee",guideLayer:e,transform:t,onChange:n,children:i})}const Ht={left:-1,right:1,top:1,bottom:-1},Jt={},Kt=[.5,.5];[["Normal","normal"],["Add","add"],["Subtract","subtract"],["Multiply","multiply"],["Screen","screen"],["Lighten","lighten"],["Darken","darken"],["Overlay","overlay"],["Soft Light","softLight"],["Hard Light","hardLight"],["Difference","difference"],["Exclusion","exclusion"]].map(([t,e])=>({label:t,value:e}));const Vt=t=>[t[0]*2-1,t[1]*2-1],Nt=(t,e,n,i,a)=>t||(!i&&!a?Ht:Ye({coordinateSpace:e,canvasSize:n??se,position:i,size:a}));function Ke({anchors:t,coordinateSpace:e,canvasSize:n,position:i,size:a,offsets:r=Jt,pivot:o=Kt,rotation:l=0,transform:c,onScreenTransformChange:A,transformGuideLayer:g="scene",...f}){const d=C.useMemo(()=>Nt(t,e,n,i,a),[t,n,e,i,a]),h=C.useMemo(()=>Vt(o),[o]);if(c){const m=ve.mergeScreenTransform2D(c);return m.enabled?s.jsx(zt,{guideLayer:g,transform:m,onChange:A,children:s.jsx(Fe,{...f,layoutSize:m.size,renderOrder:f.renderOrder??m.renderOrder,overlay:f.overlay??m.overlay,visible:f.visible??m.visible,rotation:0})}):null}return s.jsx(Ot,{anchors:d,offsets:r,pivot:h,rotation:l,children:s.jsx(Fe,{...f,layoutSize:a?{width:a[0],height:a[1]}:void 0,rotation:0})})}const Ut=2.5,qt="#38bdf8",Zt={top:{left:-.92,right:.92,top:.92,bottom:.56},center:{left:-.92,right:.92,top:.18,bottom:-.18},bottom:{left:-.92,right:.92,top:-.56,bottom:-.92}};function _t({bend:t,bendPreset:e,bendStrength:n}){return{bendPreset:(t==null?void 0:t.preset)??e,bendStrength:(t==null?void 0:t.strength)??n}}function $t({width:t,height:e}){const n=Math.max(1,t),i=Math.max(1,e);return{aspect:n/i,resolution:i}}function Le(t){const e=N.useScreenRectAspect(),{bend:n,layoutSize:i,renderOrder:a,overlay:r=!0,...o}=t,l=i?$t(i):void 0,c=Math.max((l==null?void 0:l.aspect)??e??Ut,.1),A=_t({bend:n,bendPreset:o.bendPreset,bendStrength:o.bendStrength});return s.jsx(He,{...o,aspect:c,resolution:(l==null?void 0:l.resolution)??o.resolution,...A,overlay:r,renderOrder:a})}function en({transform:t,guideLayer:e,onChange:n,children:i}){return s.jsx(P.ScreenTransformFrame,{guideColor:qt,guideLayer:e,transform:t,onChange:n,children:i})}function tn(t="center"){return Zt[t]}function nn({anchors:t,coordinateSpace:e,canvasSize:n,position:i,size:a,transform:r,pivot:o,verticalAlign:l}){return{resolvedAnchors:r!=null&&r.anchors?r.anchors:t||(r!=null&&r.position||r!=null&&r.size||i||a?Ye({coordinateSpace:(r==null?void 0:r.coordinateSpace)??e,canvasSize:(r==null?void 0:r.canvasSize)??n,position:(r==null?void 0:r.position)??i,size:(r==null?void 0:r.size)??a}):tn(l)),resolvedOffsets:r==null?void 0:r.offsets,resolvedPivot:$e((r==null?void 0:r.pivot)??o??[.5,.5])}}function Ve({anchors:t,coordinateSpace:e,canvasSize:n,offsets:i,pivot:a,position:r,rotation:o=0,size:l,transform:c,screenTransform:A,onScreenTransformChange:g,transformGuideLayer:f="scene",verticalAlign:d="center",...h}){const{resolvedAnchors:m,resolvedOffsets:S,resolvedPivot:v}=C.useMemo(()=>nn({anchors:t,coordinateSpace:e,canvasSize:n,position:r,size:l,transform:c,pivot:a,verticalAlign:d}),[t,n,e,a,r,l,c,d]),E=(c==null?void 0:c.offsets)??i??S,b=(c==null?void 0:c.rotation)??o;if(A){const I=ve.mergeScreenTransform2D(A);return I.enabled?s.jsx(en,{guideLayer:f,transform:I,onChange:g,children:s.jsx(Le,{...h,layoutSize:I.size,verticalAlign:d,renderOrder:h.renderOrder??I.renderOrder,overlay:h.overlay??I.overlay,visible:h.visible??I.visible})}):null}return s.jsx(ie.ScreenTransform,{anchors:m,offsets:E,pivot:v,children:s.jsx("group",{rotation:[0,0,b*Math.PI/180],children:s.jsx(Le,{...h,verticalAlign:d})})})}const Ne=({settings:t,transform:e})=>{const n=C.useMemo(()=>s.jsxs("group",{name:"LightEditorGizmo",visible:t.showHelper,children:[s.jsxs("mesh",{renderOrder:1e3,children:[s.jsx("sphereGeometry",{args:[.12,12,8]}),s.jsx("meshBasicMaterial",{color:"#facc15",wireframe:!0,depthTest:!1,depthWrite:!1})]}),s.jsxs("mesh",{position:[0,0,-.35],rotation:[Math.PI/2,0,0],renderOrder:1e3,children:[s.jsx("coneGeometry",{args:[.08,.45,12]}),s.jsx("meshBasicMaterial",{color:"#fde047",wireframe:!0,depthTest:!1,depthWrite:!1})]})]}),[t.showHelper]);return t.enabled?s.jsxs(te.Transform3D,{value:e,children:[n,t.type==="ambient"?s.jsx("ambientLight",{color:t.color,intensity:t.intensity}):null,t.type==="directional"?s.jsx("directionalLight",{color:t.color,intensity:t.intensity,castShadow:t.castShadow}):null,t.type==="point"?s.jsx("pointLight",{color:t.color,intensity:t.intensity,distance:t.distance,decay:t.decay,castShadow:t.castShadow}):null,t.type==="spot"?s.jsx("spotLight",{color:t.color,intensity:t.intensity,distance:t.distance,angle:t.angle,penumbra:t.penumbra,decay:t.decay,castShadow:t.castShadow}):null]}):null},rn=({source:t,target:e,settings:n})=>{if(!n.enabled||!e)return!1;const i=new z.Quaternion;if(n.mode==="point"){const r=new z.Vector3;e.getWorldPosition(r),t.lookAt(r),i.copy(t.quaternion)}else e.getWorldQuaternion(i);const a=new z.Quaternion().setFromEuler(new z.Euler(n.offsetRotation.x*Math.PI/180,n.offsetRotation.y*Math.PI/180,n.offsetRotation.z*Math.PI/180));return t.quaternion.copy(i).multiply(a),!0},Ue=({target:t,settings:e,children:n})=>{const i=C.useRef(null);return H.useFrame(()=>{i.current&&rn({source:i.current,target:t,settings:e})}),s.jsx("group",{ref:i,children:n})},an=(t,e)=>{let n=t;for(;n&&n!==e;){if("isTransformControls"in n&&n.isTransformControls===!0)return!0;n=n.parent}return!1},j=({children:t,layer:e})=>{const n=C.useRef(null),i=C.useRef(0),a=C.useCallback(()=>{e===void 0||!n.current||n.current.traverse(r=>{an(r,n.current)||r.layers.set(e)})},[e]);return C.useLayoutEffect(()=>{a(),i.current=2},[a,t]),H.useFrame(()=>{i.current<=0||(a(),i.current-=1)},-1e3),s.jsx("group",{ref:n,children:t})},w=(t,e)=>(t==null?void 0:t.type)===e,on=t=>null,le=({children:t,inside:e})=>e?s.jsx(s.Fragment,{children:t}):s.jsx(Xe,{children:t}),sn=({children:t,insideScreenSpaceUI:e,objectRef:n,renderOrder:i,settings:a})=>s.jsx(le,{inside:e,children:s.jsx(ln,{settings:a,renderOrder:i,objectRef:n,children:t})}),ln=({children:t,objectRef:e,renderOrder:n,settings:i})=>{const a=N.useScreenSpace();if(!i.enabled||!i.visible)return null;const r=ve.resolveScreenTransform2D({transform:i,parentSize:a});return s.jsx("group",{ref:e,position:r.center,rotation:r.rotation,scale:r.size,renderOrder:n??i.renderOrder,children:t})},cn=({anchor:t,children:e,insideScreenSpaceUI:n,objectRef:i,renderOrder:a,settings:r})=>s.jsx(le,{inside:n,children:s.jsx(An,{anchor:t,settings:r,renderOrder:a,objectRef:i,children:e})}),An=({anchor:t,children:e,objectRef:n,renderOrder:i,settings:a})=>{const r=ye.useFaceInfo({targetFps:24}),{size:o}=H.useThree(),l=N.useScreenSpace(),c=C.useRef(null),A=C.useRef(new z.Vector3),g=C.useRef({pos:new z.Vector3,prevRaw:new z.Vector3,dxHat:new z.Vector3,initialized:!1}),f=C.useRef(!1),d=C.useRef({x:0,y:0,z:0,visibility:0}),h=C.useRef({x:0,y:0}),m=r?De.resolveFaceAnchorPoint(t.target,r.landmarks,t.customAnchorPoint,d.current):null,S=m?ye.normalizedToScreenPixels({point:m,viewportSize:o,target:h.current}):null,v=S?ve.resolveScreenTransform2D({transform:{...a,position:{x:S.x+a.position.x+t.offset.x,y:S.y+a.position.y+t.offset.y}},parentSize:l}):null;return H.useFrame((E,b)=>{const I=c.current;if(I){if(I.visible=!!(v&&a.enabled&&a.visible),!v){f.current=!1,g.current.initialized=!1;return}A.current.set(v.center[0],v.center[1],t.offset.z),t.smoothing>0?(We.stepTrackingSmoothing(g.current,A.current,f.current?b:0,t.smoothing),I.position.copy(g.current.pos)):I.position.copy(A.current),f.current=!0}}),s.jsx("group",{ref:E=>{c.current=E,n==null||n(E)},rotation:[(v==null?void 0:v.rotation[0])??0,(v==null?void 0:v.rotation[1])??0,((v==null?void 0:v.rotation[2])??0)+(t.followFaceRoll?(r==null?void 0:r.pose.rotation.z)??0:0)],scale:[a.size.width/100*a.scale2D.x,a.size.height/100*a.scale2D.y,1],renderOrder:i??a.renderOrder,children:e})},qe=({editorMode:t=!1,faceMeshMaterialOverrides:e,fallback:n=on,insideScreenSpaceUI:i=!1,objectId:a,onComponentChange:r,renderLayer:o,renderOrder:l,store:c})=>{const A=Se.useRegisterRuntimeObject(),g=Se.useResolveRuntimeObject(),f=c.objects[a];if(!f||!f.enabled)return null;const d=P.getOrderedComponents(c,a).filter(u=>u.enabled),h=d.find(u=>u.type==="Transform"),m=d.find(u=>u.type==="ScreenTransform"),S=d.find(u=>u.type==="ScreenImage"),v=d.find(u=>u.type==="ScreenText"),E=d.find(u=>u.type==="ScreenShape"),b=d.find(u=>u.type==="MeshRenderer"),I=d.find(u=>u.type==="FaceMeshRenderer"),M=d.find(u=>u.type==="Light"),p=d.find(u=>u.type==="LookAt"),y=d.find(u=>u.type==="PinToMesh"),L=d.find(u=>u.type==="TrackingAnchor"),x=P.getSceneObjectChildren(c,a).map(u=>s.jsx(qe,{objectId:u.id,store:c,editorMode:t,renderOrder:l,renderLayer:o,onComponentChange:r,fallback:n,faceMeshMaterialOverrides:e,insideScreenSpaceUI:i||!!m},u.id));if(w(h,"Transform")&&w(M,"Light"))return s.jsx(j,{layer:o,children:s.jsxs("group",{ref:u=>A(a,u),children:[s.jsx(Ne,{settings:M.settings,transform:h.settings}),x]})});if(w(h,"Transform")&&w(b,"MeshRenderer")){const u=w(p,"LookAt")?p.settings:P.createDefaultComponent("LookAt",a).settings,k=u.inheritChildren?x:null,J=u.inheritChildren?null:x;return s.jsx(j,{layer:o,children:s.jsx("group",{ref:X=>A(a,X),children:s.jsx(P.PinToMesh,{target:w(y,"PinToMesh")?g(y.settings.targetObjectId):null,settings:w(y,"PinToMesh")?y.settings:P.createDefaultComponent("PinToMesh",a).settings,children:s.jsxs(te.Transform3D,{value:h.settings,onChange:r?X=>r({...h,settings:X}):void 0,children:[s.jsxs(Ue,{target:w(p,"LookAt")?g(p.settings.targetObjectId):null,settings:u,children:[s.jsx(N.MeshRenderer,{value:b.settings,renderOrder:l}),k]}),J]})})})})}if(w(I,"FaceMeshRenderer"))return s.jsx(j,{layer:o,children:s.jsxs("group",{ref:u=>A(a,u),children:[s.jsx(te.FaceMeshRenderer,{value:I.settings,materialOverride:e==null?void 0:e[I.id],transform:w(h,"Transform")?h.settings:void 0}),x]})});if(w(h,"Transform")){if(w(L,"TrackingAnchor")){const u=L.settings;return s.jsx(j,{layer:o,children:s.jsx(De.FaceTracker,{followFaceRoll:u.followFaceRoll,children:s.jsx(We.TrackingAnchor,{target:u.target,customAnchorPoint:u.customAnchorPoint,offset:[u.offset.x,u.offset.y,u.offset.z],smoothing:u.smoothing,children:s.jsx(te.Transform3D,{objectRef:k=>A(a,k),value:h.settings,children:x})})})})}return s.jsx(j,{layer:o,children:s.jsx("group",{children:s.jsx(te.Transform3D,{objectRef:u=>A(a,u),value:h.settings,onChange:r?u=>r({...h,settings:u}):void 0,children:x})})})}if(w(m,"ScreenTransform")&&w(S,"ScreenImage")){const u=P.mapScreenImageSettingsToProps({screenSpaceUI:{enabled:!0},screenImage:{...S.settings,screenTransform:m.settings}});return u.shouldRender?s.jsx(j,{layer:o,children:s.jsx("group",{renderOrder:l,children:s.jsxs(le,{inside:i,children:[s.jsx(Ke,{...u.props,renderOrder:l??u.props.renderOrder,onScreenTransformChange:r?k=>r({...m,settings:k}):void 0}),x]})})}):null}if(w(m,"ScreenTransform")&&w(v,"ScreenText")){const u=P.mapScreenTextSettingsToProps({screenSpaceUI:{enabled:!0},screenText:{...v.settings,screenTransform:m.settings}});return u.shouldRender?s.jsx(j,{layer:o,children:s.jsx("group",{renderOrder:l,children:s.jsxs(le,{inside:i,children:[s.jsx(Ve,{...u.props,renderOrder:l??u.props.renderOrder,onScreenTransformChange:r?k=>r({...m,settings:k}):void 0}),x]})})}):null}return w(m,"ScreenTransform")&&w(E,"ScreenShape")?s.jsx(j,{layer:o,children:s.jsx("group",{ref:u=>A(a,u),renderOrder:l,children:s.jsxs(le,{inside:i,children:[s.jsx(P.ScreenShape,{name:f.name,settings:E.settings,transform:m.settings,renderOrder:l,onScreenTransformChange:r?u=>r({...m,settings:u}):void 0}),x]})})}):w(m,"ScreenTransform")?w(L,"TrackingAnchor")?s.jsx(j,{layer:o,children:s.jsx("group",{children:s.jsx(cn,{anchor:L.settings,settings:m.settings,renderOrder:l,insideScreenSpaceUI:i,objectRef:u=>A(a,u),children:x})})}):s.jsx(j,{layer:o,children:s.jsx("group",{children:s.jsx(sn,{settings:m.settings,renderOrder:l,insideScreenSpaceUI:i,objectRef:u=>A(a,u),children:x})})}):t?s.jsxs(s.Fragment,{children:[x,n(`Object "${f.name}" has unsupported components: ${d.map(u=>u.type).join(", ")}`)]}):x.length?s.jsx(s.Fragment,{children:x}):null},gn=({layers:t})=>{const{camera:e,gl:n,raycaster:i,scene:a}=H.useThree(),{session:r}=Se.useXRContext(),o=C.useCallback(()=>P.renderSequentialPasses({renderer:n,scene:a,camera:e,layers:t}),[e,n,t,a]);return H.useFrame(o,1),C.useEffect(()=>{const l=i.layers.mask;return t.forEach(c=>i.layers.enable(c)),()=>{i.layers.mask=l}},[t,i]),C.useEffect(()=>(r._setR3FState({renderer:n,scene:a,camera:e,renderFrame:o}),()=>r._setR3FState({renderer:n,scene:a,camera:e})),[e,n,o,a,r]),null};exports.LightObject=Ne;exports.LookAt=Ue;exports.RenderGroupLayer=j;exports.SCREEN_IMAGE_MASK_CHANNELS=Je;exports.SceneObjectRenderer=qe;exports.ScreenImage=Ke;exports.ScreenSpaceUI=Xe;exports.ScreenText=Ve;exports.SequentialRenderPasses=gn;exports.TextLabel=He;exports.computeContainScale=me;
@@ -3,7 +3,7 @@ import { jsx as p, jsxs as L } from "react/jsx-runtime";
3
3
  import { useGLTF as P } from "@react-three/drei";
4
4
  import { useFrame as U } from "@react-three/fiber";
5
5
  import { AdditiveBlending as W, SubtractiveBlending as q, MultiplyBlending as K, NoBlending as N, NormalBlending as G, NeverDepth as F, LessDepth as I, EqualDepth as z, GreaterDepth as H, NotEqualDepth as Y, GreaterEqualDepth as V, AlwaysDepth as $, LessEqualDepth as J, BackSide as Q, DoubleSide as X, FrontSide as Z, AnimationMixer as j, LoopRepeat as ee } from "three";
6
- import { M as re } from "./index-ByoNj0QP.js";
6
+ import { M as re } from "./index-CsUdQ-pn.js";
7
7
  const te = A(null), ke = () => {
8
8
  const e = _(te);
9
9
  if (!e)
@@ -204,9 +204,9 @@ export {
204
204
  Ee as M,
205
205
  oe as S,
206
206
  Re as a,
207
- k as b,
208
- se as c,
209
- ae as d,
207
+ se as b,
208
+ ae as c,
209
+ k as d,
210
210
  te as e,
211
211
  ie as g,
212
212
  h as n,