@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
@@ -0,0 +1,365 @@
1
+ var W = Object.defineProperty;
2
+ var Y = (e, r, t) => r in e ? W(e, r, { enumerable: !0, configurable: !0, writable: !0, value: t }) : e[r] = t;
3
+ var y = (e, r, t) => Y(e, typeof r != "symbol" ? r + "" : r, t);
4
+ import { n as B, a as V, b as N, f as H, X as x, e as b, S as X, F as K } from "./index-CnGox6Xr.js";
5
+ import { useMemo as g, useEffect as L, useState as j, useRef as T } from "react";
6
+ import * as d from "three";
7
+ import { p as q, S as J, a as Q, L as Z, R as $, b as ee, c as te, O as re, I as ae } from "./landmarkMask-CbTFzBYG.js";
8
+ import { useFrame as S } from "@react-three/fiber";
9
+ import { a as w, u as se } from "./selectors-C5G1PMYL.js";
10
+ import { u as U, s as z } from "./index-CsUdQ-pn.js";
11
+ const ne = {
12
+ left: {
13
+ /** Iris center. */
14
+ center: 473,
15
+ /** Iris ring: outer, top, inner, bottom (image order: right, up, left, down for the left eye). */
16
+ ring: [474, 475, 476, 477],
17
+ innerCorner: 362,
18
+ outerCorner: 263,
19
+ upperLid: 386,
20
+ lowerLid: 374
21
+ },
22
+ right: {
23
+ center: 468,
24
+ ring: [469, 470, 471, 472],
25
+ innerCorner: 133,
26
+ outerCorner: 33,
27
+ upperLid: 159,
28
+ lowerLid: 145
29
+ }
30
+ }, oe = 478, ie = 0.2, p = () => ({ x: 0, y: 0, z: 0 }), A = (e) => ({
31
+ side: e,
32
+ detected: !1,
33
+ center: p(),
34
+ trackerCenter: { x: 0, y: 0, z: 0 },
35
+ ring: [p(), p(), p(), p()],
36
+ radius: 0,
37
+ eyeCenter: p(),
38
+ eyeWidth: 0,
39
+ openness: 0,
40
+ offset: { x: 0, y: 0 },
41
+ confidence: 0
42
+ }), Ne = (e = 0) => ({
43
+ version: 0,
44
+ timestampMs: 0,
45
+ faceIndex: e,
46
+ detected: !1,
47
+ held: !1,
48
+ confidence: 1,
49
+ left: A("left"),
50
+ right: A("right")
51
+ }), C = (e, r) => {
52
+ e.x = r.x, e.y = r.y, e.z = r.z;
53
+ }, I = (e) => Math.max(-1, Math.min(1, e)), O = (e, r, t, s = 1, a = !1) => {
54
+ const n = ne[r];
55
+ if (!e || e.length < oe)
56
+ return t.detected = !1, t.confidence = 0, !1;
57
+ const o = e[n.center];
58
+ C(t.center, o), B(o, t.trackerCenter);
59
+ for (let f = 0; f < 4; f += 1) C(t.ring[f], e[n.ring[f]]);
60
+ t.radius = Math.abs(t.ring[0].x - t.ring[2].x) / 2;
61
+ const c = e[n.innerCorner], i = e[n.outerCorner];
62
+ t.eyeCenter.x = (c.x + i.x) / 2, t.eyeCenter.y = (c.y + i.y) / 2, t.eyeCenter.z = (c.z + i.z) / 2, t.eyeWidth = Math.hypot(c.x - i.x, c.y - i.y);
63
+ const u = Math.abs(e[n.lowerLid].y - e[n.upperLid].y);
64
+ t.openness = t.eyeWidth > 0 ? u / t.eyeWidth : 0;
65
+ const l = t.eyeWidth / 2, h = a ? -1 : 1;
66
+ return t.offset.x = l > 0 ? I(h * (o.x - t.eyeCenter.x) / l) : 0, t.offset.y = l > 0 ? I((t.eyeCenter.y - o.y) / l) : 0, t.detected = !0, t.confidence = Math.max(0, Math.min(1, t.openness / ie)) * s, !0;
67
+ }, Le = (e, r, t, s = {}) => {
68
+ const a = s.held ?? !1, n = s.faceConfidence ?? (a ? 0 : 1), o = s.mirrored ?? !1;
69
+ e.faceIndex = s.faceIndex ?? e.faceIndex;
70
+ const c = O(r, "left", e.left, n, o), i = O(r, "right", e.right, n, o);
71
+ return e.detected = c && i, e.held = e.detected && a, e.confidence = e.detected ? n : 0, e.timestampMs = t, e.version += 1, e;
72
+ }, ce = () => ({ x: 0, y: 0, z: 0, vx: 0, vy: 0, vz: 0, sampleMs: 0, seen: !1 });
73
+ class Ue {
74
+ constructor(r = 250) {
75
+ y(this, "slots", {});
76
+ y(this, "maxGapMs");
77
+ this.maxGapMs = r;
78
+ }
79
+ reset() {
80
+ this.slots = {};
81
+ }
82
+ /** Record a fresh inference sample for `key` (e.g. "left"). */
83
+ observe(r, t, s) {
84
+ const a = this.slots[r] ?? (this.slots[r] = ce()), n = (s - a.sampleMs) / 1e3;
85
+ a.seen && n > 0 && n * 1e3 <= this.maxGapMs ? (a.vx = 0.5 * a.vx + 0.5 * ((t.x - a.x) / n), a.vy = 0.5 * a.vy + 0.5 * ((t.y - a.y) / n), a.vz = 0.5 * a.vz + 0.5 * ((t.z - a.z) / n)) : (a.vx = 0, a.vy = 0, a.vz = 0), a.x = t.x, a.y = t.y, a.z = t.z, a.sampleMs = s, a.seen = !0;
86
+ }
87
+ /** Write the extrapolated position of `key` into `out`; a no-op before the first sample. */
88
+ apply(r, t, s, a) {
89
+ const n = this.slots[r];
90
+ if (!n || !n.seen || s <= 0) return a;
91
+ const o = Math.max(0, Math.min(t - n.sampleMs, s)) / 1e3;
92
+ return a.x = n.x + n.vx * o, a.y = n.y + n.vy * o, a.z = n.z + n.vz * o, a;
93
+ }
94
+ }
95
+ const D = (e = 1, r = 1) => {
96
+ const t = new d.DataTexture(
97
+ new Uint8Array(e * r),
98
+ e,
99
+ r,
100
+ d.RedFormat,
101
+ d.UnsignedByteType
102
+ );
103
+ return t.minFilter = d.NearestFilter, t.magFilter = d.NearestFilter, t.generateMipmaps = !1, t.flipY = !1, t.unpackAlignment = 1, t.needsUpdate = !0, t;
104
+ }, le = (e, r) => {
105
+ const t = e.image;
106
+ if (t.width !== r.width || t.height !== r.height) {
107
+ e.dispose();
108
+ const s = D(r.width, r.height);
109
+ return s.image.data.set(r.indices), s.needsUpdate = !0, s;
110
+ }
111
+ return t.data.set(r.indices), e.needsUpdate = !0, e;
112
+ }, ze = (e) => {
113
+ const r = g(
114
+ () => ({ texture: D(), version: -1, mask: null }),
115
+ []
116
+ );
117
+ return L(() => () => r.texture.dispose(), [r]), { holder: r, sync: () => (e && (r.mask !== e || r.version !== e.version) && (r.texture = le(r.texture, e), r.mask = e, r.version = e.version), r.texture) };
118
+ }, ue = ({
119
+ space: e = "feed",
120
+ mirrored: r = !1,
121
+ maskWidth: t,
122
+ maskHeight: s,
123
+ feedWidth: a,
124
+ feedHeight: n,
125
+ zoom: o = 1
126
+ }, c = new d.Matrix3()) => {
127
+ let i = 1, u = 1;
128
+ if (e === "source") {
129
+ const m = V(
130
+ { width: t, height: s },
131
+ { width: a, height: n },
132
+ "cover",
133
+ o
134
+ );
135
+ m && (i = a / m.drawWidth, u = n / m.drawHeight);
136
+ }
137
+ const l = r ? -i : i, h = 0.5 - 0.5 * l, f = -u, v = 0.5 + 0.5 * u;
138
+ return c.set(l, 0, h, 0, f, v, 0, 0, 1);
139
+ }, de = 4, fe = `
140
+ varying vec2 vUv;
141
+ void main() {
142
+ vUv = uv;
143
+ gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
144
+ }`, he = `
145
+ uniform sampler2D cameraTexture;
146
+ uniform sampler2D maskTexture;
147
+ uniform sampler2D designTexture;
148
+ uniform float useDesign;
149
+ uniform vec4 labels;
150
+ uniform float labelCount;
151
+ uniform float invert;
152
+ uniform vec3 tint;
153
+ uniform float opacity;
154
+ uniform float blendMode;
155
+ uniform float feather;
156
+ uniform vec2 maskTexel;
157
+ uniform mat3 maskTransform;
158
+ varying vec2 vUv;
159
+
160
+ float member(vec2 uv) {
161
+ if (uv.x < 0.0 || uv.x > 1.0 || uv.y < 0.0 || uv.y > 1.0) return 0.0;
162
+ float index = floor(texture2D(maskTexture, uv).r * 255.0 + 0.5);
163
+ float m = 0.0;
164
+ if (labelCount > 0.5 && abs(index - labels.x) < 0.5) m = 1.0;
165
+ if (labelCount > 1.5 && abs(index - labels.y) < 0.5) m = 1.0;
166
+ if (labelCount > 2.5 && abs(index - labels.z) < 0.5) m = 1.0;
167
+ if (labelCount > 3.5 && abs(index - labels.w) < 0.5) m = 1.0;
168
+ return invert > 0.5 ? 1.0 - m : m;
169
+ }
170
+
171
+ void main() {
172
+ vec2 maskUv = (maskTransform * vec3(vUv, 1.0)).xy;
173
+ float coverage;
174
+ if (feather > 0.0) {
175
+ vec2 step = maskTexel * feather;
176
+ coverage = 0.0;
177
+ for (int y = -1; y <= 1; y++) {
178
+ for (int x = -1; x <= 1; x++) {
179
+ coverage += member(maskUv + vec2(float(x), float(y)) * step);
180
+ }
181
+ }
182
+ coverage /= 9.0;
183
+ } else {
184
+ coverage = member(maskUv);
185
+ }
186
+
187
+ vec3 base = texture2D(cameraTexture, vUv).rgb;
188
+ vec4 design = useDesign > 0.5 ? texture2D(designTexture, vUv) : vec4(1.0);
189
+ vec3 paint = tint * design.rgb;
190
+ vec3 blended = blendMode < 0.5
191
+ ? paint
192
+ : blendMode < 1.5
193
+ ? base * paint
194
+ : blendMode < 2.5
195
+ ? 1.0 - (1.0 - base) * (1.0 - paint)
196
+ : mix(2.0 * base * paint, 1.0 - 2.0 * (1.0 - base) * (1.0 - paint), step(0.5, base));
197
+
198
+ gl_FragColor = vec4(blended, coverage * opacity * design.a);
199
+ #include <colorspace_fragment>
200
+ }`;
201
+ let M = null;
202
+ const F = () => (M || (M = new d.DataTexture(new Uint8Array([255, 255, 255, 255]), 1, 1), M.needsUpdate = !0), M), ve = () => {
203
+ const e = {
204
+ cameraTexture: { value: null },
205
+ maskTexture: { value: null },
206
+ designTexture: { value: F() },
207
+ useDesign: { value: 0 },
208
+ labels: { value: new d.Vector4(-1, -1, -1, -1) },
209
+ labelCount: { value: 0 },
210
+ invert: { value: 0 },
211
+ tint: { value: new d.Color() },
212
+ opacity: { value: 1 },
213
+ blendMode: { value: 0 },
214
+ feather: { value: 0 },
215
+ maskTexel: { value: new d.Vector2(1, 1) },
216
+ maskTransform: { value: new d.Matrix3() }
217
+ };
218
+ return new d.ShaderMaterial({
219
+ uniforms: e,
220
+ vertexShader: fe,
221
+ fragmentShader: he,
222
+ transparent: !0,
223
+ depthTest: !1,
224
+ depthWrite: !1,
225
+ toneMapped: !1,
226
+ side: d.DoubleSide
227
+ });
228
+ }, me = (e, r) => q(r).map((t) => e ? e.labels.indexOf(t) : -1).filter((t) => t >= 0).slice(0, de), pe = (e, r) => e && e.version > 0 ? me(e, r) : [], xe = (e, {
229
+ cameraTexture: r,
230
+ maskTexture: t,
231
+ mask: s,
232
+ settings: a,
233
+ designTexture: n = null,
234
+ feedWidth: o = 0,
235
+ feedHeight: c = 0
236
+ }) => {
237
+ const i = e.uniforms, u = pe(s, a.label);
238
+ i.cameraTexture.value = r, i.maskTexture.value = t, i.designTexture.value = n ?? F(), i.useDesign.value = n ? 1 : 0, i.labels.value.set(u[0] ?? -1, u[1] ?? -1, u[2] ?? -1, u[3] ?? -1), i.labelCount.value = u.length, i.invert.value = a.invert ? 1 : 0, i.tint.value.set(a.color), i.opacity.value = a.opacity, i.blendMode.value = J.indexOf(a.blendMode), i.feather.value = a.feather;
239
+ const l = (s == null ? void 0 : s.width) ?? 1, h = (s == null ? void 0 : s.height) ?? 1;
240
+ return i.maskTexel.value.set(1 / l, 1 / h), ue(
241
+ {
242
+ space: (s == null ? void 0 : s.space) ?? "feed",
243
+ mirrored: a.mirrored,
244
+ maskWidth: l,
245
+ maskHeight: h,
246
+ feedWidth: o,
247
+ feedHeight: c
248
+ },
249
+ i.maskTransform.value
250
+ ), e;
251
+ }, De = (e) => {
252
+ const r = g(ve, []);
253
+ return L(() => () => r.dispose(), [r]), xe(r, e), r;
254
+ }, ge = ["bg", "face_skin", "brows", "eyes", "lips", "mouth"], Me = [
255
+ { label: "face_skin", polygons: [Q] },
256
+ { label: "brows", polygons: [Z, $] },
257
+ { label: "eyes", polygons: [ee, te] },
258
+ { label: "lips", polygons: [re] },
259
+ { label: "mouth", polygons: [ae] }
260
+ ], Te = (e, r, { regions: t, clear: s = !0 } = {}, a = []) => {
261
+ s && N(e), Me.forEach(({ label: n, polygons: o }) => {
262
+ if (t && !t.includes(n)) return;
263
+ const c = e.labels.indexOf(n);
264
+ c < 0 || o.forEach(
265
+ (i) => H(e, r, i, c, a)
266
+ );
267
+ });
268
+ }, Ee = (e) => {
269
+ const r = e == null ? void 0 : e.image, t = (r == null ? void 0 : r.width) ?? 0, s = (r == null ? void 0 : r.height) ?? 0;
270
+ return t > 0 && s > 0 ? { width: t, height: s } : { width: 1, height: 1 };
271
+ }, ye = (e, r) => {
272
+ const t = r / Math.max(e.width, e.height, 1);
273
+ return {
274
+ width: Math.max(1, Math.round(e.width * t)),
275
+ height: Math.max(1, Math.round(e.height * t))
276
+ };
277
+ }, Fe = ({
278
+ faceIndex: e = "all",
279
+ regions: r,
280
+ resolution: t = 256,
281
+ maxUpdateFps: s,
282
+ holdMs: a = 250,
283
+ predictMs: n = 0
284
+ } = {}) => {
285
+ const o = w(x.FACE_TRACKER), c = se(), i = Ee(c), u = ye(i, t), l = g(
286
+ () => b(u.width, u.height, ge),
287
+ [u.width, u.height]
288
+ ), h = T([]), f = T(-1 / 0), v = T(null);
289
+ v.current || (v.current = new K({ holdMs: a, predictMs: n }));
290
+ const m = v.current;
291
+ return m.setOptions({ holdMs: a, predictMs: n }), S((E) => {
292
+ var _;
293
+ if (z(E.clock.elapsedTime, f.current, s)) return;
294
+ f.current = E.clock.elapsedTime;
295
+ const R = ((_ = o == null ? void 0 : o.detectionResults) == null ? void 0 : _.faceLandmarks) ?? [], G = e === "all" ? R : [R[e] ?? []], k = m.update(G, E.clock.elapsedTime * 1e3);
296
+ N(l), k.forEach(
297
+ (P) => Te(l, P, { regions: r, clear: !1 }, h.current)
298
+ ), l.version += 1;
299
+ }), l;
300
+ }, be = ["bg", "person"], Ge = ({
301
+ maxUpdateFps: e = 15,
302
+ active: r = !0
303
+ } = {}) => {
304
+ U(x.BACKGROUND_SEGMENTATION, { type: "portrait" }, r);
305
+ const t = w(x.BACKGROUND_SEGMENTATION), s = g(() => b(1, 1, be), []), a = T(-1 / 0);
306
+ return S((n) => {
307
+ var u;
308
+ if (z(n.clock.elapsedTime, a.current, e)) return;
309
+ const o = (u = t == null ? void 0 : t.getRawSegmentationData) == null ? void 0 : u.call(t);
310
+ if (!(o != null && o.maskData) || o.width <= 0 || o.height <= 0) return;
311
+ a.current = n.clock.elapsedTime, (s.width !== o.width || s.height !== o.height) && (s.width = o.width, s.height = o.height, s.indices = new Uint8Array(o.width * o.height));
312
+ const c = o.maskData, i = s.indices;
313
+ for (let l = 0; l < i.length; l += 1) i[l] = c[l] > 127 ? 0 : 1;
314
+ s.version += 1;
315
+ }), s;
316
+ }, Se = ({
317
+ active: e = !0,
318
+ ...r
319
+ } = {}) => {
320
+ const { ready: t, error: s } = U(
321
+ x.SEMANTIC_SEGMENTATION,
322
+ r,
323
+ e
324
+ ), a = w(x.SEMANTIC_SEGMENTATION), n = r.preset ?? "hair", o = g(
325
+ () => b(1, 1, X[n].labels),
326
+ [n]
327
+ ), [c, i] = j({ status: "loading", error: null });
328
+ S(() => {
329
+ const f = (a == null ? void 0 : a.getStatus()) ?? "loading", v = (a == null ? void 0 : a.getError()) ?? null;
330
+ (f !== c.status || v !== c.error) && i({ status: f, error: v });
331
+ });
332
+ const u = (a == null ? void 0 : a.getMask()) ?? o, l = s ?? c.error, h = l ? "error" : t ? c.status : "loading";
333
+ return { mask: u, status: h, error: l, labels: u.labels };
334
+ }, ke = (e = {}) => Se({ ...e, preset: "hair" });
335
+ export {
336
+ ge as F,
337
+ Ue as I,
338
+ de as M,
339
+ be as P,
340
+ he as S,
341
+ ze as a,
342
+ De as b,
343
+ Ne as c,
344
+ Fe as d,
345
+ ke as e,
346
+ Ge as f,
347
+ Se as g,
348
+ ne as h,
349
+ oe as i,
350
+ ie as j,
351
+ O as k,
352
+ A as l,
353
+ fe as m,
354
+ ve as n,
355
+ me as o,
356
+ xe as p,
357
+ D as q,
358
+ pe as r,
359
+ le as s,
360
+ ye as t,
361
+ Le as u,
362
+ Me as v,
363
+ ue as w,
364
+ Te as x
365
+ };
@@ -0,0 +1,62 @@
1
+ "use strict";var te=Object.defineProperty;var re=(e,r,t)=>r in e?te(e,r,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[r]=t;var R=(e,r,t)=>re(e,typeof r!="symbol"?r+"":r,t);const d=require("./index-CeVkgsag.cjs"),h=require("react"),ne=require("three"),M=require("./landmarkMask-u7es2k4X.cjs"),A=require("@react-three/fiber"),T=require("./selectors-Du_PsVnW.cjs"),S=require("./index-OCPjOaeP.cjs");function ae(e){const r=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const t in e)if(t!=="default"){const a=Object.getOwnPropertyDescriptor(e,t);Object.defineProperty(r,t,a.get?a:{enumerable:!0,get:()=>e[t]})}}return r.default=e,Object.freeze(r)}const f=ae(ne),C={left:{center:473,ring:[474,475,476,477],innerCorner:362,outerCorner:263,upperLid:386,lowerLid:374},right:{center:468,ring:[469,470,471,472],innerCorner:133,outerCorner:33,upperLid:159,lowerLid:145}},U=478,k=.2,g=()=>({x:0,y:0,z:0}),b=e=>({side:e,detected:!1,center:g(),trackerCenter:{x:0,y:0,z:0},ring:[g(),g(),g(),g()],radius:0,eyeCenter:g(),eyeWidth:0,openness:0,offset:{x:0,y:0},confidence:0}),se=(e=0)=>({version:0,timestampMs:0,faceIndex:e,detected:!1,held:!1,confidence:1,left:b("left"),right:b("right")}),L=(e,r)=>{e.x=r.x,e.y=r.y,e.z=r.z},w=e=>Math.max(-1,Math.min(1,e)),_=(e,r,t,a=1,n=!1)=>{const s=C[r];if(!e||e.length<U)return t.detected=!1,t.confidence=0,!1;const i=e[s.center];L(t.center,i),d.normalizedTrackerPointToTrackerPoint(i,t.trackerCenter);for(let v=0;v<4;v+=1)L(t.ring[v],e[s.ring[v]]);t.radius=Math.abs(t.ring[0].x-t.ring[2].x)/2;const c=e[s.innerCorner],o=e[s.outerCorner];t.eyeCenter.x=(c.x+o.x)/2,t.eyeCenter.y=(c.y+o.y)/2,t.eyeCenter.z=(c.z+o.z)/2,t.eyeWidth=Math.hypot(c.x-o.x,c.y-o.y);const u=Math.abs(e[s.lowerLid].y-e[s.upperLid].y);t.openness=t.eyeWidth>0?u/t.eyeWidth:0;const l=t.eyeWidth/2,m=n?-1:1;return t.offset.x=l>0?w(m*(i.x-t.eyeCenter.x)/l):0,t.offset.y=l>0?w((t.eyeCenter.y-i.y)/l):0,t.detected=!0,t.confidence=Math.max(0,Math.min(1,t.openness/k))*a,!0},ie=(e,r,t,a={})=>{const n=a.held??!1,s=a.faceConfidence??(n?0:1),i=a.mirrored??!1;e.faceIndex=a.faceIndex??e.faceIndex;const c=_(r,"left",e.left,s,i),o=_(r,"right",e.right,s,i);return e.detected=c&&o,e.held=e.detected&&n,e.confidence=e.detected?s:0,e.timestampMs=t,e.version+=1,e},oe=()=>({x:0,y:0,z:0,vx:0,vy:0,vz:0,sampleMs:0,seen:!1});class ce{constructor(r=250){R(this,"slots",{});R(this,"maxGapMs");this.maxGapMs=r}reset(){this.slots={}}observe(r,t,a){const n=this.slots[r]??(this.slots[r]=oe()),s=(a-n.sampleMs)/1e3;n.seen&&s>0&&s*1e3<=this.maxGapMs?(n.vx=.5*n.vx+.5*((t.x-n.x)/s),n.vy=.5*n.vy+.5*((t.y-n.y)/s),n.vz=.5*n.vz+.5*((t.z-n.z)/s)):(n.vx=0,n.vy=0,n.vz=0),n.x=t.x,n.y=t.y,n.z=t.z,n.sampleMs=a,n.seen=!0}apply(r,t,a,n){const s=this.slots[r];if(!s||!s.seen||a<=0)return n;const i=Math.max(0,Math.min(t-s.sampleMs,a))/1e3;return n.x=s.x+s.vx*i,n.y=s.y+s.vy*i,n.z=s.z+s.vz*i,n}}const O=(e=1,r=1)=>{const t=new f.DataTexture(new Uint8Array(e*r),e,r,f.RedFormat,f.UnsignedByteType);return t.minFilter=f.NearestFilter,t.magFilter=f.NearestFilter,t.generateMipmaps=!1,t.flipY=!1,t.unpackAlignment=1,t.needsUpdate=!0,t},D=(e,r)=>{const t=e.image;if(t.width!==r.width||t.height!==r.height){e.dispose();const a=O(r.width,r.height);return a.image.data.set(r.indices),a.needsUpdate=!0,a}return t.data.set(r.indices),e.needsUpdate=!0,e},le=e=>{const r=h.useMemo(()=>({texture:O(),version:-1,mask:null}),[]);return h.useEffect(()=>()=>r.texture.dispose(),[r]),{holder:r,sync:()=>(e&&(r.mask!==e||r.version!==e.version)&&(r.texture=D(r.texture,e),r.mask=e,r.version=e.version),r.texture)}},z=({space:e="feed",mirrored:r=!1,maskWidth:t,maskHeight:a,feedWidth:n,feedHeight:s,zoom:i=1},c=new f.Matrix3)=>{let o=1,u=1;if(e==="source"){const E=d.computeFitLayout({width:t,height:a},{width:n,height:s},"cover",i);E&&(o=n/E.drawWidth,u=s/E.drawHeight)}const l=r?-o:o,m=.5-.5*l,v=-u,p=.5+.5*u;return c.set(l,0,m,0,v,p,0,0,1)},F=4,G=`
2
+ varying vec2 vUv;
3
+ void main() {
4
+ vUv = uv;
5
+ gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
6
+ }`,P=`
7
+ uniform sampler2D cameraTexture;
8
+ uniform sampler2D maskTexture;
9
+ uniform sampler2D designTexture;
10
+ uniform float useDesign;
11
+ uniform vec4 labels;
12
+ uniform float labelCount;
13
+ uniform float invert;
14
+ uniform vec3 tint;
15
+ uniform float opacity;
16
+ uniform float blendMode;
17
+ uniform float feather;
18
+ uniform vec2 maskTexel;
19
+ uniform mat3 maskTransform;
20
+ varying vec2 vUv;
21
+
22
+ float member(vec2 uv) {
23
+ if (uv.x < 0.0 || uv.x > 1.0 || uv.y < 0.0 || uv.y > 1.0) return 0.0;
24
+ float index = floor(texture2D(maskTexture, uv).r * 255.0 + 0.5);
25
+ float m = 0.0;
26
+ if (labelCount > 0.5 && abs(index - labels.x) < 0.5) m = 1.0;
27
+ if (labelCount > 1.5 && abs(index - labels.y) < 0.5) m = 1.0;
28
+ if (labelCount > 2.5 && abs(index - labels.z) < 0.5) m = 1.0;
29
+ if (labelCount > 3.5 && abs(index - labels.w) < 0.5) m = 1.0;
30
+ return invert > 0.5 ? 1.0 - m : m;
31
+ }
32
+
33
+ void main() {
34
+ vec2 maskUv = (maskTransform * vec3(vUv, 1.0)).xy;
35
+ float coverage;
36
+ if (feather > 0.0) {
37
+ vec2 step = maskTexel * feather;
38
+ coverage = 0.0;
39
+ for (int y = -1; y <= 1; y++) {
40
+ for (int x = -1; x <= 1; x++) {
41
+ coverage += member(maskUv + vec2(float(x), float(y)) * step);
42
+ }
43
+ }
44
+ coverage /= 9.0;
45
+ } else {
46
+ coverage = member(maskUv);
47
+ }
48
+
49
+ vec3 base = texture2D(cameraTexture, vUv).rgb;
50
+ vec4 design = useDesign > 0.5 ? texture2D(designTexture, vUv) : vec4(1.0);
51
+ vec3 paint = tint * design.rgb;
52
+ vec3 blended = blendMode < 0.5
53
+ ? paint
54
+ : blendMode < 1.5
55
+ ? base * paint
56
+ : blendMode < 2.5
57
+ ? 1.0 - (1.0 - base) * (1.0 - paint)
58
+ : mix(2.0 * base * paint, 1.0 - 2.0 * (1.0 - base) * (1.0 - paint), step(0.5, base));
59
+
60
+ gl_FragColor = vec4(blended, coverage * opacity * design.a);
61
+ #include <colorspace_fragment>
62
+ }`;let x=null;const X=()=>(x||(x=new f.DataTexture(new Uint8Array([255,255,255,255]),1,1),x.needsUpdate=!0),x),Y=()=>{const e={cameraTexture:{value:null},maskTexture:{value:null},designTexture:{value:X()},useDesign:{value:0},labels:{value:new f.Vector4(-1,-1,-1,-1)},labelCount:{value:0},invert:{value:0},tint:{value:new f.Color},opacity:{value:1},blendMode:{value:0},feather:{value:0},maskTexel:{value:new f.Vector2(1,1)},maskTransform:{value:new f.Matrix3}};return new f.ShaderMaterial({uniforms:e,vertexShader:G,fragmentShader:P,transparent:!0,depthTest:!1,depthWrite:!1,toneMapped:!1,side:f.DoubleSide})},V=(e,r)=>M.parseOverlayLabels(r).map(t=>e?e.labels.indexOf(t):-1).filter(t=>t>=0).slice(0,F),B=(e,r)=>e&&e.version>0?V(e,r):[],H=(e,{cameraTexture:r,maskTexture:t,mask:a,settings:n,designTexture:s=null,feedWidth:i=0,feedHeight:c=0})=>{const o=e.uniforms,u=B(a,n.label);o.cameraTexture.value=r,o.maskTexture.value=t,o.designTexture.value=s??X(),o.useDesign.value=s?1:0,o.labels.value.set(u[0]??-1,u[1]??-1,u[2]??-1,u[3]??-1),o.labelCount.value=u.length,o.invert.value=n.invert?1:0,o.tint.value.set(n.color),o.opacity.value=n.opacity,o.blendMode.value=M.SEGMENTATION_OVERLAY_BLEND_MODES.indexOf(n.blendMode),o.feather.value=n.feather;const l=(a==null?void 0:a.width)??1,m=(a==null?void 0:a.height)??1;return o.maskTexel.value.set(1/l,1/m),z({space:(a==null?void 0:a.space)??"feed",mirrored:n.mirrored,maskWidth:l,maskHeight:m,feedWidth:i,feedHeight:c},o.maskTransform.value),e},ue=e=>{const r=h.useMemo(Y,[]);return h.useEffect(()=>()=>r.dispose(),[r]),H(r,e),r},W=["bg","face_skin","brows","eyes","lips","mouth"],K=[{label:"face_skin",polygons:[M.FACE_OVAL]},{label:"brows",polygons:[M.LEFT_EYEBROW,M.RIGHT_EYEBROW]},{label:"eyes",polygons:[M.LEFT_EYE,M.RIGHT_EYE]},{label:"lips",polygons:[M.OUTER_LIPS]},{label:"mouth",polygons:[M.INNER_MOUTH]}],q=(e,r,{regions:t,clear:a=!0}={},n=[])=>{a&&d.clearSemanticMask(e),K.forEach(({label:s,polygons:i})=>{if(t&&!t.includes(s))return;const c=e.labels.indexOf(s);c<0||i.forEach(o=>d.fillLandmarkPolygon(e,r,o,c,n))})},de=e=>{const r=e==null?void 0:e.image,t=(r==null?void 0:r.width)??0,a=(r==null?void 0:r.height)??0;return t>0&&a>0?{width:t,height:a}:{width:1,height:1}},j=(e,r)=>{const t=r/Math.max(e.width,e.height,1);return{width:Math.max(1,Math.round(e.width*t)),height:Math.max(1,Math.round(e.height*t))}},fe=({faceIndex:e="all",regions:r,resolution:t=256,maxUpdateFps:a,holdMs:n=250,predictMs:s=0}={})=>{const i=T.useXRModelNode(d.XRModel.FACE_TRACKER),c=T.useXRCameraTexture(),o=de(c),u=j(o,t),l=h.useMemo(()=>d.createSemanticMask(u.width,u.height,W),[u.width,u.height]),m=h.useRef([]),v=h.useRef(-1/0),p=h.useRef(null);p.current||(p.current=new d.FaceTrackMemory({holdMs:n,predictMs:s}));const E=p.current;return E.setOptions({holdMs:n,predictMs:s}),A.useFrame(y=>{var I;if(S.shouldSkipUpdate(y.clock.elapsedTime,v.current,a))return;v.current=y.clock.elapsedTime;const N=((I=i==null?void 0:i.detectionResults)==null?void 0:I.faceLandmarks)??[],Q=e==="all"?N:[N[e]??[]],Z=E.update(Q,y.clock.elapsedTime*1e3);d.clearSemanticMask(l),Z.forEach(ee=>q(l,ee,{regions:r,clear:!1},m.current)),l.version+=1}),l},$=["bg","person"],ve=({maxUpdateFps:e=15,active:r=!0}={})=>{S.useXRModel(d.XRModel.BACKGROUND_SEGMENTATION,{type:"portrait"},r);const t=T.useXRModelNode(d.XRModel.BACKGROUND_SEGMENTATION),a=h.useMemo(()=>d.createSemanticMask(1,1,$),[]),n=h.useRef(-1/0);return A.useFrame(s=>{var u;if(S.shouldSkipUpdate(s.clock.elapsedTime,n.current,e))return;const i=(u=t==null?void 0:t.getRawSegmentationData)==null?void 0:u.call(t);if(!(i!=null&&i.maskData)||i.width<=0||i.height<=0)return;n.current=s.clock.elapsedTime,(a.width!==i.width||a.height!==i.height)&&(a.width=i.width,a.height=i.height,a.indices=new Uint8Array(i.width*i.height));const c=i.maskData,o=a.indices;for(let l=0;l<o.length;l+=1)o[l]=c[l]>127?0:1;a.version+=1}),a},J=({active:e=!0,...r}={})=>{const{ready:t,error:a}=S.useXRModel(d.XRModel.SEMANTIC_SEGMENTATION,r,e),n=T.useXRModelNode(d.XRModel.SEMANTIC_SEGMENTATION),s=r.preset??"hair",i=h.useMemo(()=>d.createSemanticMask(1,1,d.SEMANTIC_SEGMENTATION_PRESET_SPECS[s].labels),[s]),[c,o]=h.useState({status:"loading",error:null});A.useFrame(()=>{const v=(n==null?void 0:n.getStatus())??"loading",p=(n==null?void 0:n.getError())??null;(v!==c.status||p!==c.error)&&o({status:v,error:p})});const u=(n==null?void 0:n.getMask())??i,l=a??c.error,m=l?"error":t?c.status:"loading";return{mask:u,status:m,error:l,labels:u.labels}},he=(e={})=>J({...e,preset:"hair"});exports.FACE_REGION_LABELS=W;exports.FACE_REGION_POLYGONS=K;exports.IRIS_FULL_OPENNESS=k;exports.IRIS_LANDMARKS=C;exports.IRIS_LANDMARK_COUNT=U;exports.IrisLead=ce;exports.MAX_OVERLAY_LABELS=F;exports.PERSON_MASK_LABELS=$;exports.SEGMENTATION_OVERLAY_FRAGMENT_SHADER=P;exports.SEGMENTATION_OVERLAY_VERTEX_SHADER=G;exports.computeIrisEye=_;exports.computeMaskUvTransform=z;exports.createIrisEye=b;exports.createIrisResult=se;exports.createSegmentationOverlayMaterial=Y;exports.createSemanticMaskTexture=O;exports.rasterizeFaceRegions=q;exports.resolveActiveOverlayLabelIndices=B;exports.resolveMaskSize=j;exports.resolveOverlayLabelIndices=V;exports.updateIrisResult=ie;exports.updateSegmentationOverlayMaterial=H;exports.uploadSemanticMask=D;exports.useFaceRegionMask=fe;exports.useHairMask=he;exports.usePersonMask=ve;exports.useSegmentationOverlayMaterial=ue;exports.useSemanticMaskTexture=le;exports.useSemanticSegmentationMask=J;
@@ -0,0 +1,25 @@
1
+ import { XRQualityConfigInput, XRQualitySignals, XRQualityState } from './types';
2
+ /** Static device signals (memory, cores) read once. */
3
+ export declare const readDeviceSignals: () => Pick<XRQualitySignals, "deviceMemoryGb" | "hardwareConcurrency">;
4
+ export type XRQualityControllerProps = {
5
+ /** Partial config merged over the defaults (`resolveQualityConfig`). */
6
+ config?: XRQualityConfigInput;
7
+ /** Externally supplied thermal state (a native shell can forward the OS value). */
8
+ thermal?: XRQualitySignals["thermal"];
9
+ /**
10
+ * Called whenever a different tier is applied (automatic or manual). The
11
+ * floor-level `signals.thermal === "suspected"` flag changes no tier, so it
12
+ * does not fire this; read `useXRQuality().signals` to react to it.
13
+ */
14
+ onDecision?: (state: XRQualityState) => void;
15
+ };
16
+ /**
17
+ * Samples main-thread frame time, tracker inference and memory on
18
+ * `budget.sampleMs`, steps the pure controller, publishes the state to the
19
+ * session store and applies the tier: `targetFps` + `analysisScale` through
20
+ * the session perf config, `renderScale` through `<XRScene>` (which reads
21
+ * the state), and `camRes` only when the tier sets `rebindCamera`. Mounted by
22
+ * `<XRProvider>` by default; mount it yourself with `quality={false}` on the
23
+ * provider to place it or configure it differently.
24
+ */
25
+ export declare const XRQualityController: ({ config, thermal, onDecision }: XRQualityControllerProps) => null;
@@ -0,0 +1,33 @@
1
+ import { XRPerformanceBudget, XRQualityConfig, XRQualityConfigInput, XRQualityReason, XRQualitySignals, XRQualityState, XRQualityTier } from './types';
2
+ export declare const DEFAULT_QUALITY_TIERS: XRQualityTier[];
3
+ export declare const DEFAULT_PERFORMANCE_BUDGET: XRPerformanceBudget;
4
+ export declare const DEFAULT_QUALITY_CONFIG: XRQualityConfig;
5
+ export declare const EMPTY_QUALITY_SIGNALS: XRQualitySignals;
6
+ /** Validate a tier; invalid knobs are dropped, out-of-range ones clamped. */
7
+ export declare const resolveQualityTier: (tier: Partial<XRQualityTier>, index: number) => XRQualityTier;
8
+ export declare const resolvePerformanceBudget: (budget?: Partial<XRPerformanceBudget>) => XRPerformanceBudget;
9
+ /** Validate a partial config into a complete, serializable one. */
10
+ export declare const resolveQualityConfig: (config?: XRQualityConfigInput) => XRQualityConfig;
11
+ /** Starting tier from static device signals: low-memory / few-core devices start one step down. */
12
+ export declare const resolveInitialTierIndex: (config: XRQualityConfig, signals: XRQualitySignals) => number;
13
+ export declare const createQualityState: (config: XRQualityConfig, signals?: XRQualitySignals, now?: number) => XRQualityState;
14
+ /** Why a sample is over budget, most severe first; `null` when within budget. */
15
+ export declare const judgeSample: (signals: XRQualitySignals, budget: XRPerformanceBudget) => Exclude<XRQualityReason, "init" | "recovered" | "manual" | "locked" | "reset"> | null;
16
+ /**
17
+ * One controller step. Pure: returns the next state (same object when
18
+ * nothing changed). Bounded to `[maxTier, minTier]`, hysteretic (streaks),
19
+ * rate-limited (cooldown), reversible (steps back up after `upgradeAfter`
20
+ * good samples), and inert while `locked` or `adaptive: false`.
21
+ */
22
+ export declare const stepQualityController: (state: XRQualityState, signals: XRQualitySignals, config: XRQualityConfig, now: number) => XRQualityState;
23
+ /** Manual tier selection (does not lock). */
24
+ export declare const setQualityTier: (state: XRQualityState, config: XRQualityConfig, ref: number | string, now: number) => XRQualityState;
25
+ export declare const lockQuality: (state: XRQualityState, config: XRQualityConfig, locked: boolean, now: number) => XRQualityState;
26
+ /**
27
+ * The tier the controller must apply now, or `null` when `lastApplied` is
28
+ * already it. Compares tier identity (the decision may have been written to
29
+ * the store by `useXRQuality().setTier` between two samples, so comparing
30
+ * decisions would miss it).
31
+ */
32
+ export declare const tierToApply: (state: XRQualityState, lastApplied: XRQualityTier | null) => XRQualityTier | null;
33
+ export declare const resetQuality: (config: XRQualityConfig, signals: XRQualitySignals, now: number) => XRQualityState;
@@ -0,0 +1,6 @@
1
+ export type { XRPerformanceBudget, XRQualityConfig, XRQualityConfigInput, XRQualityDecision, XRQualityReason, XRQualitySignals, XRQualityState, XRQualityTier, } from './types';
2
+ export { XRQualityController, readDeviceSignals } from './XRQualityController';
3
+ export type { XRQualityControllerProps } from './XRQualityController';
4
+ export { useXRQuality } from './useXRQuality';
5
+ export type { UseXRQualityResult } from './useXRQuality';
6
+ export { DEFAULT_PERFORMANCE_BUDGET, DEFAULT_QUALITY_CONFIG, DEFAULT_QUALITY_TIERS, EMPTY_QUALITY_SIGNALS, createQualityState, judgeSample, lockQuality, resetQuality, resolveInitialTierIndex, resolvePerformanceBudget, resolveQualityConfig, resolveQualityTier, setQualityTier, stepQualityController, tierToApply, } from './controller';
@@ -0,0 +1,100 @@
1
+ /**
2
+ * One quality level. Every knob is optional; an omitted knob keeps the
3
+ * session's own value. Tiers are plain JSON so they can be persisted.
4
+ */
5
+ export type XRQualityTier = {
6
+ name: string;
7
+ /** Inference cap applied to every tracker without its own `targetFps`. */
8
+ targetFps?: number;
9
+ /** Multiplier on the renderer's device pixel ratio cap (0.25..1). */
10
+ renderScale?: number;
11
+ /** Multiplier on every model's analysis resolution (0.25..1). */
12
+ analysisScale?: number;
13
+ /** Camera capture width; applied only when `rebindCamera` is true (a rebind re-opens the camera). */
14
+ camRes?: number;
15
+ /** Allow this tier to re-open the webcam to apply `camRes`. Default false. */
16
+ rebindCamera?: boolean;
17
+ };
18
+ /** Thresholds the controller judges samples against. Plain JSON. */
19
+ export type XRPerformanceBudget = {
20
+ /** Frame time above which a sample is "bad" (ms). Default 1000 / 24. */
21
+ maxFrameMs: number;
22
+ /** Total tracker inference per frame above which a sample is "bad" (ms). Default 24. */
23
+ maxInferenceMs: number;
24
+ /** JS heap usage above which a sample is "bad" (MB); `null` ignores memory. Default null. */
25
+ maxMemoryMb: number | null;
26
+ /** Sampling period (ms). Default 1000. */
27
+ sampleMs: number;
28
+ /** Consecutive bad samples before stepping down. Default 2. */
29
+ downgradeAfter: number;
30
+ /** Consecutive good samples (frame time under `maxFrameMs × upgradeHeadroom`) before stepping up. Default 6. */
31
+ upgradeAfter: number;
32
+ /** A "good" sample must leave this much headroom (0..1 of `maxFrameMs`). Default 0.75. */
33
+ upgradeHeadroom: number;
34
+ /** Minimum time between two automatic changes (ms). Default 4000. */
35
+ cooldownMs: number;
36
+ };
37
+ /** What the controller measured in one sample. */
38
+ export type XRQualitySignals = {
39
+ /** Mean main-thread frame time over the sample (ms); `null` before the first sample. */
40
+ frameMs: number | null;
41
+ /** Frames per second over the sample. */
42
+ fps: number | null;
43
+ /** Sum of the last inference of every running model (ms). */
44
+ inferenceMs: number | null;
45
+ /** Feed frames per second the session blitted. */
46
+ feedFps: number | null;
47
+ /** JS heap in use (MB) where `performance.memory` exists. */
48
+ memoryMb: number | null;
49
+ /** `navigator.deviceMemory` (GB) where exposed. */
50
+ deviceMemoryGb: number | null;
51
+ hardwareConcurrency: number | null;
52
+ /**
53
+ * Thermal state. Browsers expose none, so this is `"unknown"` unless the
54
+ * app supplies one (a native shell can); `"suspected"` is set by the
55
+ * controller when frame time keeps degrading at the lowest tier.
56
+ */
57
+ thermal: "unknown" | "nominal" | "suspected" | "critical";
58
+ };
59
+ export type XRQualityReason = "init" | "frame-time" | "inference" | "memory" | "thermal" | "recovered" | "manual" | "locked" | "reset";
60
+ export type XRQualityDecision = {
61
+ /** Index into `tiers`. */
62
+ index: number;
63
+ tier: XRQualityTier;
64
+ reason: XRQualityReason;
65
+ /** `performance.now()` of the decision. */
66
+ at: number;
67
+ };
68
+ /** Controller state; serializable except for nothing (plain data). */
69
+ export type XRQualityState = {
70
+ index: number;
71
+ /** When true the controller stops adjusting; `setTier` still works. */
72
+ locked: boolean;
73
+ badStreak: number;
74
+ goodStreak: number;
75
+ lastChangeAt: number;
76
+ decision: XRQualityDecision;
77
+ /** Last decisions, newest first (bounded). */
78
+ history: XRQualityDecision[];
79
+ signals: XRQualitySignals;
80
+ };
81
+ export type XRQualityConfig = {
82
+ /** Ordered best → worst. Default `DEFAULT_QUALITY_TIERS`. */
83
+ tiers: XRQualityTier[];
84
+ budget: XRPerformanceBudget;
85
+ /** Start here (index or name); default: picked from device signals. */
86
+ initialTier?: number | string;
87
+ /** The controller may step down to this tier at most (index or name). Default the last. */
88
+ minTier?: number | string;
89
+ /** The controller may step up to this tier at most. Default the first. */
90
+ maxTier?: number | string;
91
+ /** `false` keeps the initial tier and never adjusts (still observable). Default true. */
92
+ adaptive: boolean;
93
+ /** Bound of `history`. Default 20. */
94
+ historySize: number;
95
+ };
96
+ /** What creators pass: everything optional, tiers and budget partial. `resolveQualityConfig` fills it in. */
97
+ export type XRQualityConfigInput = Partial<Omit<XRQualityConfig, "tiers" | "budget">> & {
98
+ tiers?: Array<Partial<XRQualityTier>>;
99
+ budget?: Partial<XRPerformanceBudget>;
100
+ };
@@ -0,0 +1,28 @@
1
+ import { XRQualityConfigInput, XRQualityDecision, XRQualitySignals, XRQualityState, XRQualityTier } from './types';
2
+ export type UseXRQualityResult = {
3
+ /** Current tier (`null` until the controller publishes). */
4
+ tier: XRQualityTier | null;
5
+ index: number;
6
+ tiers: XRQualityTier[];
7
+ decision: XRQualityDecision | null;
8
+ history: XRQualityDecision[];
9
+ signals: XRQualitySignals | null;
10
+ locked: boolean;
11
+ /** Pick a tier by index or name (does not lock; the controller may move again after the cooldown). */
12
+ setTier: (ref: number | string) => void;
13
+ /** Freeze the current tier (`lock()`), or let the controller adjust again (`unlock()`). */
14
+ lock: () => void;
15
+ unlock: () => void;
16
+ /** Back to the initial tier for this device; clears the lock. */
17
+ reset: () => void;
18
+ state: XRQualityState | null;
19
+ };
20
+ /**
21
+ * Observe and steer adaptive quality. The controller (mounted by
22
+ * `<XRProvider>` by default) publishes its state AND its resolved config to
23
+ * the session store; this hook reads both, so `tiers` and name-based
24
+ * `setTier("medium")` resolve against the provider's tiers without passing
25
+ * the config again. Manual decisions are written back through the store and
26
+ * applied by the controller on its next sample.
27
+ */
28
+ export declare const useXRQuality: (config?: XRQualityConfigInput) => UseXRQualityResult;
@@ -1,4 +1,4 @@
1
- import { M as D, B as I } from "./renderPasses-BcquyVtu.js";
1
+ import { M as D, B as I } from "./renderPasses-NnKZVfBy.js";
2
2
  const p = {
3
3
  background: "background",
4
4
  scene3d: "general",
@@ -1 +1 @@
1
- "use strict";const E=require("./renderPasses-BOoBSr8z.cjs"),p={background:"background",scene3d:"general",tracking:"ar-tracking",screen2d:"2d-foreground",post:"post-effects"},u=(e,...r)=>{const t=new Set(e.map(c=>c.type));return r.every(c=>t.has(c))},b=e=>u(e,"ScreenTransform")&&(u(e,"ScreenText")||u(e,"ScreenImage")||u(e,"ScreenShape")||e.every(r=>["ScreenTransform","TrackingAnchor"].includes(r.type))),h=e=>(u(e,"Transform")||u(e,"FaceMeshRenderer"))&&!b(e),l={background:{domain:"background",accepts:()=>!1,defaultFor:()=>!1,renderMode:"background"},scene3d:{domain:"scene3d",accepts:h,defaultFor:h,renderMode:"depth3d"},tracking:{domain:"tracking",accepts:()=>!1,defaultFor:()=>!1,renderMode:"tracking"},screen2d:{domain:"screen2d",accepts:b,defaultFor:b,renderMode:"screenOverlay"},post:{domain:"post",accepts:()=>!1,defaultFor:()=>!1,renderMode:"post"}},y={background:"Background",scene3d:"General / 3D Scene",tracking:"AR Tracking",screen2d:"2D Foreground",post:"Post Effects"},D=e=>({id:p[e],name:y[e],domain:e,enabled:!0,objectIds:[]}),G=(e,r)=>r.componentIds.map(t=>e.components[t]).filter(t=>!!t),I=e=>{var r;return p[((r=Object.values(l).find(t=>t.defaultFor(e)))==null?void 0:r.domain)??"scene3d"]},S=(e,r,t)=>{const c=e.objects[r],n=e.renderGroups[t];return!c||!n?!1:l[n.domain].accepts(G(e,c))},k=(e,r,t)=>{if(r<0||r>=e.length)return e;const c=Math.max(0,Math.min(t,e.length-1));if(r===c)return e;const n=[...e],[s]=n.splice(r,1);return n.splice(c,0,s),n},T=(e,r,t)=>{const c=e.renderGroupOrder.indexOf(r),n=k(e.renderGroupOrder,c,t);return n===e.renderGroupOrder?e:{...e,renderGroupOrder:n}},P=(e,r,t,c)=>{const n=e.renderGroups[r];if(!n)return e;const s=n.objectIds.indexOf(t),o=k(n.objectIds,s,c);return o===n.objectIds?e:{...e,renderGroups:{...e.renderGroups,[r]:{...n,objectIds:o}}}},v=(e,r,t,c)=>{if(!S(e,r,t))return e;const n=Object.fromEntries(Object.entries(e.renderGroups).map(([o,d])=>[o,{...d,objectIds:d.objectIds.filter(a=>a!==r)}])),s=n[t].objectIds;return s.splice(Math.max(0,Math.min(c??s.length,s.length)),0,r),{...e,objects:{...e.objects,[r]:{...e.objects[r],renderGroupId:t}},renderGroups:n}},F=(e,r=Object.keys(e.objects))=>{const t={},c=[],n={...e.objects};return[...r,...Object.keys(n).filter(o=>!r.includes(o))].forEach(o=>{var g,m;const d=n[o];if(!d)return;const a=d.renderGroupId??d.layerId,M=I(G(e,d)),_=(g=Object.entries(p).find(([,f])=>f===a))==null?void 0:g[0],O=(m=Object.entries(p).find(([,f])=>f===M))==null?void 0:m[0],R=D(_??O),j=l[R.domain].accepts(G(e,d))?R:D(O),i=j.id;t[i]||(t[i]=j,c.push(i)),t[i].objectIds.push(o),n[o]={...d,renderGroupId:i}}),{...e,objects:n,renderGroups:t,renderGroupOrder:c}},U=(e,r=1e3)=>e.renderGroupOrder.flatMap((t,c)=>{if(c>=E.MAX_RENDER_GROUP_PASSES)return[];const n=e.renderGroups[t];if(!n||!n.enabled)return[];const s=l[n.domain];return n.objectIds.flatMap((o,d)=>{const a=e.objects[o];return!a||!a.enabled?[]:a.parentObjectId&&e.objects[a.parentObjectId]?[]:[{groupId:t,groupIndex:c,objectId:o,objectIndex:d,renderMode:s.renderMode,renderOrder:c*r+d,renderLayer:E.getRenderGroupLayer(c)}]})});exports.DEFAULT_RENDER_GROUP_IDS=p;exports.RENDER_GROUP_POLICIES=l;exports.createRenderPlan=U;exports.getDefaultRenderGroupId=I;exports.migrateToRenderGroups=F;exports.moveObjectToGroup=v;exports.reorderObjectWithinGroup=P;exports.reorderRenderGroup=T;exports.validateGroupCompatibility=S;
1
+ "use strict";const E=require("./renderPasses-Cg-zqmEz.cjs"),p={background:"background",scene3d:"general",tracking:"ar-tracking",screen2d:"2d-foreground",post:"post-effects"},u=(e,...r)=>{const t=new Set(e.map(c=>c.type));return r.every(c=>t.has(c))},b=e=>u(e,"ScreenTransform")&&(u(e,"ScreenText")||u(e,"ScreenImage")||u(e,"ScreenShape")||e.every(r=>["ScreenTransform","TrackingAnchor"].includes(r.type))),h=e=>(u(e,"Transform")||u(e,"FaceMeshRenderer"))&&!b(e),l={background:{domain:"background",accepts:()=>!1,defaultFor:()=>!1,renderMode:"background"},scene3d:{domain:"scene3d",accepts:h,defaultFor:h,renderMode:"depth3d"},tracking:{domain:"tracking",accepts:()=>!1,defaultFor:()=>!1,renderMode:"tracking"},screen2d:{domain:"screen2d",accepts:b,defaultFor:b,renderMode:"screenOverlay"},post:{domain:"post",accepts:()=>!1,defaultFor:()=>!1,renderMode:"post"}},y={background:"Background",scene3d:"General / 3D Scene",tracking:"AR Tracking",screen2d:"2D Foreground",post:"Post Effects"},D=e=>({id:p[e],name:y[e],domain:e,enabled:!0,objectIds:[]}),G=(e,r)=>r.componentIds.map(t=>e.components[t]).filter(t=>!!t),I=e=>{var r;return p[((r=Object.values(l).find(t=>t.defaultFor(e)))==null?void 0:r.domain)??"scene3d"]},S=(e,r,t)=>{const c=e.objects[r],n=e.renderGroups[t];return!c||!n?!1:l[n.domain].accepts(G(e,c))},k=(e,r,t)=>{if(r<0||r>=e.length)return e;const c=Math.max(0,Math.min(t,e.length-1));if(r===c)return e;const n=[...e],[s]=n.splice(r,1);return n.splice(c,0,s),n},T=(e,r,t)=>{const c=e.renderGroupOrder.indexOf(r),n=k(e.renderGroupOrder,c,t);return n===e.renderGroupOrder?e:{...e,renderGroupOrder:n}},P=(e,r,t,c)=>{const n=e.renderGroups[r];if(!n)return e;const s=n.objectIds.indexOf(t),o=k(n.objectIds,s,c);return o===n.objectIds?e:{...e,renderGroups:{...e.renderGroups,[r]:{...n,objectIds:o}}}},v=(e,r,t,c)=>{if(!S(e,r,t))return e;const n=Object.fromEntries(Object.entries(e.renderGroups).map(([o,d])=>[o,{...d,objectIds:d.objectIds.filter(a=>a!==r)}])),s=n[t].objectIds;return s.splice(Math.max(0,Math.min(c??s.length,s.length)),0,r),{...e,objects:{...e.objects,[r]:{...e.objects[r],renderGroupId:t}},renderGroups:n}},F=(e,r=Object.keys(e.objects))=>{const t={},c=[],n={...e.objects};return[...r,...Object.keys(n).filter(o=>!r.includes(o))].forEach(o=>{var g,m;const d=n[o];if(!d)return;const a=d.renderGroupId??d.layerId,M=I(G(e,d)),_=(g=Object.entries(p).find(([,f])=>f===a))==null?void 0:g[0],O=(m=Object.entries(p).find(([,f])=>f===M))==null?void 0:m[0],R=D(_??O),j=l[R.domain].accepts(G(e,d))?R:D(O),i=j.id;t[i]||(t[i]=j,c.push(i)),t[i].objectIds.push(o),n[o]={...d,renderGroupId:i}}),{...e,objects:n,renderGroups:t,renderGroupOrder:c}},U=(e,r=1e3)=>e.renderGroupOrder.flatMap((t,c)=>{if(c>=E.MAX_RENDER_GROUP_PASSES)return[];const n=e.renderGroups[t];if(!n||!n.enabled)return[];const s=l[n.domain];return n.objectIds.flatMap((o,d)=>{const a=e.objects[o];return!a||!a.enabled?[]:a.parentObjectId&&e.objects[a.parentObjectId]?[]:[{groupId:t,groupIndex:c,objectId:o,objectIndex:d,renderMode:s.renderMode,renderOrder:c*r+d,renderLayer:E.getRenderGroupLayer(c)}]})});exports.DEFAULT_RENDER_GROUP_IDS=p;exports.RENDER_GROUP_POLICIES=l;exports.createRenderPlan=U;exports.getDefaultRenderGroupId=I;exports.migrateToRenderGroups=F;exports.moveObjectToGroup=v;exports.reorderObjectWithinGroup=P;exports.reorderRenderGroup=T;exports.validateGroupCompatibility=S;