@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 @@
1
+ "use strict";var H=Object.defineProperty;var z=(t,e,r)=>e in t?H(t,e,{enumerable:!0,configurable:!0,writable:!0,value:r}):t[e]=r;var i=(t,e,r)=>z(t,typeof e!="symbol"?e+"":e,r);const m=require("react/jsx-runtime"),n=require("react"),O=require("./selectors-Du_PsVnW.cjs"),$=require("./index-CeVkgsag.cjs"),B=require("@react-three/fiber");require("./hasFullUnitUVBounds-p1Dl0ejX.cjs");const K=({children:t,defaultCollapsed:e=!0,title:r,width:s=320})=>{const[o,a]=n.useState(e);return o?m.jsx("button",{type:"button",onClick:()=>a(!1),"aria-label":`Open ${r}`,title:`Open ${r}`,style:{position:"absolute",right:16,bottom:16,zIndex:40,width:40,height:40,border:"1px solid rgba(255,255,255,0.12)",borderRadius:999,background:"rgba(15, 23, 42, 0.72)",color:"#e5eefb",boxShadow:"0 12px 30px rgba(0,0,0,0.18)",backdropFilter:"blur(10px)",cursor:"pointer",pointerEvents:"auto"},children:"◫"}):m.jsxs("div",{style:{position:"absolute",right:16,bottom:16,zIndex:40,width:s,maxWidth:"calc(100vw - 32px)",padding:14,borderRadius:14,boxShadow:"0 12px 30px rgba(0,0,0,0.26)",backdropFilter:"blur(10px)",pointerEvents:"auto",background:"rgba(15, 23, 42, 0.78)",border:"1px solid rgba(255,255,255,0.12)",color:"#e5eefb"},children:[m.jsxs("div",{style:{display:"flex",alignItems:"center",justifyContent:"space-between",gap:12,marginBottom:10},children:[m.jsx("div",{style:{fontSize:13,fontWeight:700},children:r}),m.jsx("button",{type:"button",onClick:()=>a(!0),"aria-label":`Close ${r}`,title:`Close ${r}`,style:{width:32,height:32,border:"1px solid rgba(255,255,255,0.12)",borderRadius:999,background:"rgba(255,255,255,0.04)",color:"#e5eefb",cursor:"pointer",flex:"0 0 auto"},children:"×"})]}),t]})};class V{constructor(){i(this,"frameTimestamps",[]);i(this,"lastUpdateTime",0);i(this,"currentFPS",0);i(this,"updateInterval",500);this.lastUpdateTime=performance.now()}trackFrame(){const e=performance.now();this.frameTimestamps.push(e);const r=e-this.updateInterval;this.frameTimestamps=this.frameTimestamps.filter(s=>s>r),e-this.lastUpdateTime>=this.updateInterval&&(this.currentFPS=this.frameTimestamps.length*2,this.lastUpdateTime=e)}getFPS(){return this.currentFPS}reset(){this.frameTimestamps=[],this.lastUpdateTime=performance.now(),this.currentFPS=0}}function W(t,e=1){return t.toFixed(e)}function x(t){return t/(1024*1024)}function X(t,e){return e===0?0:t/e*100}class J{constructor(e=1e3){i(this,"intervalId",null);i(this,"memoryUsage",null);i(this,"updateInterval");i(this,"isSupported",!1);this.updateInterval=e,this.checkSupport()}checkSupport(){const e=performance;this.isSupported="memory"in e&&e.memory!==void 0,this.isSupported||console.warn("[MemoryTracker] performance.memory not available (Chrome-only API)")}start(){if(this.intervalId!==null){console.warn("[MemoryTracker] Already running");return}if(!this.isSupported){this.memoryUsage=null;return}this.updateMemory(),this.intervalId=window.setInterval(()=>{this.updateMemory()},this.updateInterval)}stop(){this.intervalId!==null&&(clearInterval(this.intervalId),this.intervalId=null)}updateMemory(){if(!this.isSupported)return;const e=performance;if(!e.memory)return;const r=e.memory.usedJSHeapSize,s=e.memory.jsHeapSizeLimit;this.memoryUsage={used:x(r),total:x(s),percentage:X(r,s)}}getMemoryUsage(){return this.memoryUsage}isMemorySupported(){return this.isSupported}}class G{constructor(){i(this,"resolution","N/A");i(this,"videoElement",null);i(this,"metadataListener",null)}start(e){if(!e){this.resolution="N/A";return}this.videoElement=e,e.videoWidth>0&&e.videoHeight>0&&this.updateResolution(),this.metadataListener=()=>{this.updateResolution()},e.addEventListener("loadedmetadata",this.metadataListener)}stop(){this.videoElement&&this.metadataListener&&(this.videoElement.removeEventListener("loadedmetadata",this.metadataListener),this.metadataListener=null),this.videoElement=null,this.resolution="N/A"}updateResolution(){if(!this.videoElement){this.resolution="N/A";return}const e=this.videoElement.videoWidth,r=this.videoElement.videoHeight;e>0&&r>0?this.resolution=`${e}x${r}`:this.resolution="N/A"}getResolution(){return this.videoElement&&this.updateResolution(),this.resolution}}class Q{constructor(e={}){i(this,"options");i(this,"isRunning",!1);i(this,"metrics",{cameraFPS:0,detectionTime:0,modelPerformance:[],renderTime:0,effectiveFPS:0,memory:null,resolution:"N/A"});i(this,"cameraFPSTracker");i(this,"memoryTracker");i(this,"resolutionTracker");i(this,"frameTimes",[]);i(this,"lastEffectiveFPSUpdate",0);this.options={enableMemoryTracking:e.enableMemoryTracking??!0,memoryUpdateInterval:e.memoryUpdateInterval??1e3},this.cameraFPSTracker=new V,this.memoryTracker=new J(this.options.memoryUpdateInterval),this.resolutionTracker=new G}start(e){if(this.isRunning){console.warn("[MetricsCollector] Already running");return}this.isRunning=!0,this.lastEffectiveFPSUpdate=performance.now(),this.options.enableMemoryTracking&&this.memoryTracker.start(),e&&this.resolutionTracker.start(e),this.setupCameraFPSHook(),console.info("[MetricsCollector] Started")}stop(){this.isRunning&&(this.isRunning=!1,this.memoryTracker.stop(),this.resolutionTracker.stop(),this.cameraFPSTracker.reset(),this.cleanupCameraFPSHook(),console.info("[MetricsCollector] Stopped"))}setupCameraFPSHook(){const e=window;e.__xr_debugger_metrics||(e.__xr_debugger_metrics={trackCameraFrame:()=>{this.cameraFPSTracker.trackFrame(),this.metrics.cameraFPS=this.cameraFPSTracker.getFPS()}})}cleanupCameraFPSHook(){const e=window;e.__xr_debugger_metrics&&delete e.__xr_debugger_metrics}getMetrics(){return this.updateMetricsFromTrackers(),{...this.metrics}}updateMetricsFromTrackers(){this.isRunning&&(this.metrics.memory=this.memoryTracker.getMemoryUsage(),this.metrics.resolution=this.resolutionTracker.getResolution(),this.updateEffectiveFPS())}updateRenderTime(e){this.metrics.renderTime=e,this.updateEffectiveFPS()}async updateDetectionTime(e){if(!e||!this.isRunning){this.metrics.detectionTime=0,this.metrics.modelPerformance=[];return}try{const r=Object.values(e).filter(Boolean);if(r.length===0){this.metrics.detectionTime=0,this.metrics.modelPerformance=[];return}const s=r.map(c=>c&&typeof c.getPerformanceData=="function"?c.getPerformanceData():Promise.resolve({name:"unknown",processingTime:0})),o=await Promise.all(s);this.metrics.modelPerformance=o.map(c=>({name:c.name,processingTime:c.processingTime||0}));const a=o.reduce((c,p)=>c+(p.processingTime||0),0);this.metrics.detectionTime=a,this.updateEffectiveFPS()}catch(r){console.warn("[MetricsCollector] Error updating detection time:",r),this.metrics.detectionTime=0,this.metrics.modelPerformance=[]}}updateEffectiveFPS(){const e=performance.now(),r=this.metrics.detectionTime+this.metrics.renderTime;if(this.frameTimes.push(r),e-this.lastEffectiveFPSUpdate>=1e3){if(this.frameTimes.length>0){const s=this.frameTimes.reduce((o,a)=>o+a,0)/this.frameTimes.length;this.metrics.effectiveFPS=s>0?1e3/s:0}this.frameTimes=[],this.lastEffectiveFPSUpdate=e}}isActive(){return this.isRunning}}const Y=n.lazy(async()=>({default:(await Promise.resolve().then(()=>require("./DebuggerUI-CWX5EtQv.cjs"))).DebuggerUI})),k=n.createContext(null);function Z({children:t,keyboardShortcut:e="ctrl+shift+d",initialEnabled:r=!1,position:s="top-left"}){const[o,a]=n.useState(r),[c,p]=n.useState(!1),[y,_]=n.useState({cameraFPS:0,detectionTime:0,modelPerformance:[],renderTime:0,effectiveFPS:0,memory:null,resolution:"N/A"}),f=n.useRef(null),u=n.useRef(null),g=n.useRef(!1),{session:b}=$.useXRContext(),T=O.useXRReady();n.useEffect(()=>(f.current||(f.current=new Q,window.__xr_metrics_collector=f.current),()=>{f.current&&f.current.stop(),u.current&&clearInterval(u.current),window.__xr_metrics_collector&&delete window.__xr_metrics_collector}),[]),n.useEffect(()=>{const l=f.current;if(l){if(o&&T){const d=b._getVideoElement();l.start(d),u.current=window.setInterval(async()=>{if(!g.current){g.current=!0;try{const S=Object.fromEntries(b.store.getSnapshot().pipeline);await l.updateDetectionTime(S),_(l.getMetrics())}finally{g.current=!1}}},100)}else l.stop(),u.current&&(clearInterval(u.current),u.current=null),g.current=!1;return()=>{u.current&&(clearInterval(u.current),u.current=null)}}},[o,T,b]),n.useEffect(()=>{const l=d=>{const h=e.toLowerCase().split("+"),D=h.includes("ctrl")||h.includes("control"),I=h.includes("shift"),M=h.includes("alt"),U=h[h.length-1],j=D?d.ctrlKey||d.metaKey:!0,L=I?d.shiftKey:!0,A=M?d.altKey:!0,q=d.key.toLowerCase()===U;j&&L&&A&&q&&(d.preventDefault(),a(N=>!N))};return window.addEventListener("keydown",l),()=>{window.removeEventListener("keydown",l)}},[e]);const C=n.useCallback(()=>{a(l=>!l)},[]),R=n.useCallback(()=>{a(!0)},[]),w=n.useCallback(()=>{a(!1)},[]),E={state:{enabled:o,collapsed:c,metrics:y},toggle:C,setCollapsed:p,enable:R,disable:w};return m.jsxs(k.Provider,{value:E,children:[t,o&&m.jsx(n.Suspense,{fallback:null,children:m.jsx(Y,{metrics:y,collapsed:c,onCollapse:p,onClose:w,position:s,keyboardShortcut:e})})]})}function ee(){const t=n.useContext(k);if(!t)throw new Error("useDebuggerContext must be used within a DebuggerProvider");return t}function te({onUpdate:t}){const e=n.useRef(0),r=n.useRef(!0);return B.useFrame(()=>{if(r.current)r.current=!1;else{const o=performance.now()-e.current;t(o)}e.current=performance.now()},-1e3),null}function P(){const t=ee();return{metrics:t.state.metrics,enabled:t.state.enabled,collapsed:t.state.collapsed,toggle:t.toggle,setCollapsed:t.setCollapsed,enable:t.enable,disable:t.disable}}function re(){const{enabled:t}=P(),e=r=>{const s=window;s.__xr_metrics_collector&&s.__xr_metrics_collector.updateRenderTime(r)};return t?m.jsx(te,{onUpdate:e}):null}const v=600;function F(){if(typeof window>"u")return;const t=window;return t.__xrCalibrationDebugState||(t.__xrCalibrationDebugState={events:[]}),t.__xrCalibrationDebugState}function se(t,e,r){const s=F();s&&(s.events.push({source:t,label:e,payload:r,ts:performance.now()}),s.events.length>v&&s.events.splice(0,s.events.length-v))}function ie(t=v){const e=F();return e?e.events.slice(Math.max(0,e.events.length-t)):[]}exports.DebuggerOverlay=re;exports.DebuggerProvider=Z;exports.XRDebugView=K;exports.formatNumber=W;exports.readCalibrationDebugEvents=ie;exports.recordCalibrationDebugEvent=se;exports.useDebugger=P;
@@ -3,12 +3,11 @@ var O = (t, e, r) => e in t ? K(t, e, { enumerable: !0, configurable: !0, writab
3
3
  var s = (t, e, r) => O(t, typeof e != "symbol" ? e + "" : e, r);
4
4
  import { jsx as f, jsxs as w } from "react/jsx-runtime";
5
5
  import W, { useState as b, useRef as h, useEffect as T, useCallback as y, createContext as X, Suspense as V, lazy as q } from "react";
6
- import { a as J } from "./selectors-B8H97CKA.js";
7
- import { u as G } from "./index-9dlAQAhy.js";
6
+ import { b as J } from "./selectors-C5G1PMYL.js";
7
+ import { u as G } from "./index-CnGox6Xr.js";
8
8
  import { useFrame as Q } from "@react-three/fiber";
9
9
  import "./hasFullUnitUVBounds-BGvcFsQM.js";
10
- import "./renderLayers-zrK2pv5O.js";
11
- const pe = ({
10
+ const he = ({
12
11
  children: t,
13
12
  defaultCollapsed: e = !0,
14
13
  title: r,
@@ -132,7 +131,7 @@ class Y {
132
131
  this.frameTimestamps = [], this.lastUpdateTime = performance.now(), this.currentFPS = 0;
133
132
  }
134
133
  }
135
- function ge(t, e = 1) {
134
+ function pe(t, e = 1) {
136
135
  return t.toFixed(e);
137
136
  }
138
137
  function _(t) {
@@ -376,8 +375,8 @@ class re {
376
375
  return this.isRunning;
377
376
  }
378
377
  }
379
- const ie = q(async () => ({ default: (await import("./DebuggerUI-BjOMr8q_.js")).DebuggerUI })), C = X(null);
380
- function be({
378
+ const ie = q(async () => ({ default: (await import("./DebuggerUI-C-ldiozL.js")).DebuggerUI })), C = X(null);
379
+ function ge({
381
380
  children: t,
382
381
  keyboardShortcut: e = "ctrl+shift+d",
383
382
  initialEnabled: r = !1,
@@ -487,7 +486,7 @@ function oe() {
487
486
  disable: t.disable
488
487
  };
489
488
  }
490
- function ve() {
489
+ function be() {
491
490
  const { enabled: t } = oe(), e = (r) => {
492
491
  const i = window;
493
492
  i.__xr_metrics_collector && i.__xr_metrics_collector.updateRenderTime(r);
@@ -501,7 +500,7 @@ function R() {
501
500
  const t = window;
502
501
  return t.__xrCalibrationDebugState || (t.__xrCalibrationDebugState = { events: [] }), t.__xrCalibrationDebugState;
503
502
  }
504
- function Te(t, e, r) {
503
+ function ve(t, e, r) {
505
504
  const i = R();
506
505
  i && (i.events.push({
507
506
  source: t,
@@ -510,16 +509,16 @@ function Te(t, e, r) {
510
509
  ts: performance.now()
511
510
  }), i.events.length > S && i.events.splice(0, i.events.length - S));
512
511
  }
513
- function ye(t = S) {
512
+ function Te(t = S) {
514
513
  const e = R();
515
514
  return e ? e.events.slice(Math.max(0, e.events.length - t)) : [];
516
515
  }
517
516
  export {
518
- be as D,
519
- pe as X,
520
- ve as a,
521
- Te as b,
522
- ge as f,
523
- ye as r,
517
+ ge as D,
518
+ he as X,
519
+ be as a,
520
+ ve as b,
521
+ pe as f,
522
+ Te as r,
524
523
  oe as u
525
524
  };
package/dist/internal.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./internal-Cq-TEQ5Y.cjs"),r=require("./hasFullUnitUVBounds-p1Dl0ejX.cjs"),n=require("./renderLayers-lDtL0_43.cjs");exports.DebuggerOverlay=e.DebuggerOverlay;exports.DebuggerProvider=e.DebuggerProvider;exports.XRDebugView=e.XRDebugView;exports.readCalibrationDebugEvents=e.readCalibrationDebugEvents;exports.recordCalibrationDebugEvent=e.recordCalibrationDebugEvent;exports.useDebugger=e.useDebugger;exports._resetUVBoundsWarnings=r._resetUVBoundsWarnings;exports.logUVBoundsWarningOnce=r.logUVBoundsWarningOnce;exports.RENDER_LAYERS=n.RENDER_LAYERS;
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./internal-BYza1h8_.cjs"),r=require("./hasFullUnitUVBounds-p1Dl0ejX.cjs"),n=require("./selectors-Du_PsVnW.cjs");exports.DebuggerOverlay=e.DebuggerOverlay;exports.DebuggerProvider=e.DebuggerProvider;exports.XRDebugView=e.XRDebugView;exports.readCalibrationDebugEvents=e.readCalibrationDebugEvents;exports.recordCalibrationDebugEvent=e.recordCalibrationDebugEvent;exports.useDebugger=e.useDebugger;exports._resetUVBoundsWarnings=r._resetUVBoundsWarnings;exports.logUVBoundsWarningOnce=r.logUVBoundsWarningOnce;exports.RENDER_LAYERS=n.RENDER_LAYERS;
package/dist/internal.js CHANGED
@@ -1,6 +1,6 @@
1
- import { a, D as s, X as o, r as g, b as n, u } from "./internal-Dmk1cTXq.js";
1
+ import { a, D as s, X as o, r as g, b as n, u } from "./internal-vsfNQycj.js";
2
2
  import { _ as i, l as t } from "./hasFullUnitUVBounds-BGvcFsQM.js";
3
- import { R as d } from "./renderLayers-zrK2pv5O.js";
3
+ import { R as d } from "./selectors-C5G1PMYL.js";
4
4
  export {
5
5
  a as DebuggerOverlay,
6
6
  s as DebuggerProvider,
@@ -0,0 +1,25 @@
1
+ import { IrisEye, IrisPoint, IrisResult, IrisSide } from './types';
2
+ /** Eyelid opening (gap / eye width) at or above which an eye counts as fully open. */
3
+ export declare const IRIS_FULL_OPENNESS = 0.2;
4
+ export declare const createIrisEye: (side: IrisSide) => IrisEye;
5
+ export declare const createIrisResult: (faceIndex?: number) => IrisResult;
6
+ /**
7
+ * Derive one eye's iris data from a refined face-mesh landmark set (478
8
+ * points, MediaPipe image space). Returns `false`, and marks the eye
9
+ * undetected, when the landmarks are missing. Allocation-free: writes into
10
+ * `eye`.
11
+ */
12
+ export declare const computeIrisEye: (landmarks: ReadonlyArray<IrisPoint> | undefined, side: IrisSide, eye: IrisEye, confidenceScale?: number, mirrored?: boolean) => boolean;
13
+ /**
14
+ * Update a full `IrisResult` from one face's landmarks. `faceConfidence` is
15
+ * 1 for a live face and the hold decay while held; it scales both eyes'
16
+ * confidence. `mirrored` says the frame is a mirror of the person (the
17
+ * session's webcam feed) so `offset.x` keeps its anatomical sign. Pass
18
+ * `undefined` landmarks for an absent face.
19
+ */
20
+ export declare const updateIrisResult: (result: IrisResult, landmarks: ReadonlyArray<IrisPoint> | undefined, nowMs: number, options?: {
21
+ faceIndex?: number;
22
+ held?: boolean;
23
+ faceConfidence?: number;
24
+ mirrored?: boolean;
25
+ }) => IrisResult;
@@ -0,0 +1,4 @@
1
+ export { IRIS_FULL_OPENNESS, computeIrisEye, createIrisEye, createIrisResult, updateIrisResult, } from './compute';
2
+ export { IrisLead } from './lead';
3
+ export { IRIS_LANDMARKS, IRIS_LANDMARK_COUNT } from './types';
4
+ export type { IrisEye, IrisPoint, IrisResult, IrisSide } from './types';
@@ -0,0 +1,19 @@
1
+ import { IrisPoint } from './types';
2
+ /**
3
+ * Bridges the gap between throttled inference samples and the render rate.
4
+ * Inference lands at, say, 24 fps while frames render at 60+, so a point
5
+ * that only updates on new samples holds then jumps. `observe` records each
6
+ * new sample and its velocity; `apply` advances the point along that
7
+ * velocity by the time since the sample, capped at `leadMs`, so motion
8
+ * reads continuous between samples. Reset on re-acquire.
9
+ */
10
+ export declare class IrisLead {
11
+ private slots;
12
+ private readonly maxGapMs;
13
+ constructor(maxGapMs?: number);
14
+ reset(): void;
15
+ /** Record a fresh inference sample for `key` (e.g. "left"). */
16
+ observe(key: string, point: IrisPoint, nowMs: number): void;
17
+ /** Write the extrapolated position of `key` into `out`; a no-op before the first sample. */
18
+ apply(key: string, nowMs: number, leadMs: number, out: IrisPoint): IrisPoint;
19
+ }
@@ -0,0 +1,87 @@
1
+ import { TrackerPoint } from '../types/common';
2
+ /** Person's perspective: `left` is the person's left eye (MediaPipe mesh indices 473–477). */
3
+ export type IrisSide = "left" | "right";
4
+ /**
5
+ * MediaPipe face-mesh indices used for iris tracking, per side. Sides follow
6
+ * the mesh topology, so they are the person's anatomical sides on every
7
+ * source, mirrored webcam included.
8
+ */
9
+ export declare const IRIS_LANDMARKS: {
10
+ readonly left: {
11
+ /** Iris center. */
12
+ readonly center: 473;
13
+ /** Iris ring: outer, top, inner, bottom (image order: right, up, left, down for the left eye). */
14
+ readonly ring: readonly [474, 475, 476, 477];
15
+ readonly innerCorner: 362;
16
+ readonly outerCorner: 263;
17
+ readonly upperLid: 386;
18
+ readonly lowerLid: 374;
19
+ };
20
+ readonly right: {
21
+ readonly center: 468;
22
+ readonly ring: readonly [469, 470, 471, 472];
23
+ readonly innerCorner: 133;
24
+ readonly outerCorner: 33;
25
+ readonly upperLid: 159;
26
+ readonly lowerLid: 145;
27
+ };
28
+ };
29
+ /** Minimum landmark count for iris data: the refined face mesh (468 + 10 iris points). */
30
+ export declare const IRIS_LANDMARK_COUNT = 478;
31
+ export type IrisPoint = {
32
+ x: number;
33
+ y: number;
34
+ z: number;
35
+ };
36
+ export type IrisEye = {
37
+ side: IrisSide;
38
+ /** False when the face has no iris landmarks (fewer than 478 points) or the face is absent. */
39
+ detected: boolean;
40
+ /** Iris center in MediaPipe image space: 0..1, top-left origin, Y down; `z` is tracker-relative depth. */
41
+ center: IrisPoint;
42
+ /** The same center in SDK tracker space: center origin, X right, Y up, Z toward the viewer. */
43
+ trackerCenter: TrackerPoint;
44
+ /** The four iris ring landmarks in image space (outer, top, inner, bottom). */
45
+ ring: [IrisPoint, IrisPoint, IrisPoint, IrisPoint];
46
+ /** Iris radius as half the horizontal ring diameter, in image-width units (0..1). */
47
+ radius: number;
48
+ /** Midpoint of the eye corners in image space. */
49
+ eyeCenter: IrisPoint;
50
+ /** Corner-to-corner eye width in image-width units. */
51
+ eyeWidth: number;
52
+ /** Eyelid gap divided by eye width; ~0.25–0.35 open, ~0 closed. */
53
+ openness: number;
54
+ /**
55
+ * Iris center relative to the eye center, each axis divided by half the
56
+ * eye width and clamped to [-1, 1]; +x toward the person's left, +y up,
57
+ * on every source (the sign is corrected on the mirrored webcam feed).
58
+ * This is where the iris sits inside the eyelid opening, NOT a gaze
59
+ * direction: it ignores head pose and eye geometry.
60
+ */
61
+ offset: {
62
+ x: number;
63
+ y: number;
64
+ };
65
+ /**
66
+ * 0..1 from eyelid opening (full at `openness` >= 0.2, zero when closed),
67
+ * scaled by the hold decay while the face is held. MediaPipe emits iris
68
+ * points even for a closed eye, so this is the signal to gate effects on.
69
+ */
70
+ confidence: number;
71
+ };
72
+ export type IrisResult = {
73
+ /** Bumped on every update. 0 until the first face is seen. */
74
+ version: number;
75
+ /** `performance.now()` of the last update. */
76
+ timestampMs: number;
77
+ /** Result-array index of the face read (not a persistent identity). */
78
+ faceIndex: number;
79
+ /** True while a face with iris landmarks is live or held. */
80
+ detected: boolean;
81
+ /** True while the face is replayed from memory after a dropout. */
82
+ held: boolean;
83
+ /** 1 while live, decaying to 0 over `holdMs` while held. */
84
+ confidence: number;
85
+ left: IrisEye;
86
+ right: IrisEye;
87
+ };
@@ -0,0 +1,224 @@
1
+ const S = [
2
+ "bg",
3
+ "brows",
4
+ "eyes",
5
+ "face_skin",
6
+ "hair",
7
+ "lips",
8
+ "mouth",
9
+ "person"
10
+ ], g = [
11
+ "normal",
12
+ "multiply",
13
+ "screen",
14
+ "overlay"
15
+ ], O = {
16
+ label: "lips",
17
+ invert: !1,
18
+ color: "#e85d75",
19
+ opacity: 0.8,
20
+ blendMode: "multiply",
21
+ feather: 1,
22
+ mirrored: !1
23
+ }, p = (e, o, r, l) => typeof e == "number" && Number.isFinite(e) ? Math.min(r, Math.max(o, e)) : l, M = (e = {}) => {
24
+ const o = O;
25
+ return {
26
+ label: typeof e.label == "string" && e.label.trim() ? e.label : o.label,
27
+ invert: typeof e.invert == "boolean" ? e.invert : o.invert,
28
+ color: typeof e.color == "string" && e.color.trim() ? e.color : o.color,
29
+ opacity: p(e.opacity, 0, 1, o.opacity),
30
+ blendMode: g.includes(
31
+ e.blendMode
32
+ ) ? e.blendMode : o.blendMode,
33
+ feather: p(e.feather, 0, 8, o.feather),
34
+ mirrored: typeof e.mirrored == "boolean" ? e.mirrored : o.mirrored
35
+ };
36
+ }, Y = (e, o) => M({ ...e, ...o }), w = (e) => (typeof e == "string" ? e.split(",") : e).map((o) => o.trim()).filter(Boolean), P = [
37
+ {
38
+ key: "label",
39
+ label: "Region",
40
+ type: "select",
41
+ options: S.map((e) => ({ label: e, value: e }))
42
+ },
43
+ { key: "invert", label: "Invert selection", type: "boolean" },
44
+ { key: "color", label: "Color", type: "color" },
45
+ { key: "opacity", label: "Opacity", type: "number", min: 0, max: 1, step: 0.01 },
46
+ {
47
+ key: "blendMode",
48
+ label: "Blend",
49
+ type: "select",
50
+ options: g.map((e) => ({ label: e, value: e }))
51
+ },
52
+ { key: "feather", label: "Feather (texels)", type: "number", min: 0, max: 8, step: 0.5 },
53
+ { key: "mirrored", label: "Mirror mask", type: "boolean" }
54
+ ], _ = 512, d = [
55
+ 10,
56
+ 338,
57
+ 297,
58
+ 332,
59
+ 284,
60
+ 251,
61
+ 389,
62
+ 356,
63
+ 454,
64
+ 323,
65
+ 361,
66
+ 288,
67
+ 397,
68
+ 365,
69
+ 379,
70
+ 378,
71
+ 400,
72
+ 377,
73
+ 152,
74
+ 148,
75
+ 176,
76
+ 149,
77
+ 150,
78
+ 136,
79
+ 172,
80
+ 58,
81
+ 132,
82
+ 93,
83
+ 234,
84
+ 127,
85
+ 162,
86
+ 21,
87
+ 54,
88
+ 103,
89
+ 67,
90
+ 109
91
+ ], v = [
92
+ 33,
93
+ 246,
94
+ 161,
95
+ 160,
96
+ 159,
97
+ 158,
98
+ 157,
99
+ 173,
100
+ 133,
101
+ 155,
102
+ 154,
103
+ 153,
104
+ 145,
105
+ 144,
106
+ 163,
107
+ 7
108
+ ], L = [
109
+ 362,
110
+ 398,
111
+ 384,
112
+ 385,
113
+ 386,
114
+ 387,
115
+ 388,
116
+ 466,
117
+ 263,
118
+ 249,
119
+ 390,
120
+ 373,
121
+ 374,
122
+ 380,
123
+ 381,
124
+ 382
125
+ ], A = [
126
+ 61,
127
+ 146,
128
+ 91,
129
+ 181,
130
+ 84,
131
+ 17,
132
+ 314,
133
+ 405,
134
+ 321,
135
+ 375,
136
+ 291,
137
+ 409,
138
+ 270,
139
+ 269,
140
+ 267,
141
+ 0,
142
+ 37,
143
+ 39,
144
+ 40,
145
+ 185
146
+ ], F = [
147
+ 78,
148
+ 95,
149
+ 88,
150
+ 178,
151
+ 87,
152
+ 14,
153
+ 317,
154
+ 402,
155
+ 318,
156
+ 324,
157
+ 308,
158
+ 415,
159
+ 310,
160
+ 311,
161
+ 312,
162
+ 13,
163
+ 82,
164
+ 81,
165
+ 80,
166
+ 191
167
+ ], I = [70, 63, 105, 66, 107, 55, 65, 52, 53, 46], N = [336, 296, 334, 293, 300, 276, 283, 282, 295, 285], R = [
168
+ v,
169
+ L,
170
+ A,
171
+ F,
172
+ I,
173
+ N
174
+ ], E = (e, o, r) => {
175
+ T(e, o, d, r);
176
+ }, h = (e, o, r) => {
177
+ const l = i(o, 10, r), a = i(o, 103, r), t = i(o, 332, r), s = i(o, 105, r), b = i(o, 334, r);
178
+ if (!l || !a || !t || !s || !b) return;
179
+ const y = (s.y + b.y) * 0.5, m = Math.abs(t.x - a.x), c = Math.max(Math.abs(y - l.y) * 0.72, m * 0.08), n = Math.max(0, l.y - c), f = c * 0.34;
180
+ e.beginPath(), e.moveTo(a.x, a.y - f), e.quadraticCurveTo((a.x + l.x) * 0.5, n, l.x, n), e.quadraticCurveTo(
181
+ (t.x + l.x) * 0.5,
182
+ n,
183
+ t.x,
184
+ t.y - f
185
+ ), e.lineTo(b.x, y), e.quadraticCurveTo(l.x, y + c * 0.16, s.x, y), e.closePath(), e.fill();
186
+ }, C = (e, o, r) => {
187
+ R.forEach((l) => T(e, o, l, r));
188
+ }, i = (e, o, r) => {
189
+ const l = e[o];
190
+ return l ? {
191
+ x: l.x * r,
192
+ y: l.y * r
193
+ } : null;
194
+ }, T = (e, o, r, l) => {
195
+ const a = i(o, r[0], l);
196
+ if (a) {
197
+ e.beginPath(), e.moveTo(a.x, a.y);
198
+ for (let t = 1; t < r.length; t += 1) {
199
+ const s = i(o, r[t], l);
200
+ s && e.lineTo(s.x, s.y);
201
+ }
202
+ e.closePath(), e.fill();
203
+ }
204
+ }, u = (e, o, r = _, l = {}) => {
205
+ e.clearRect(0, 0, r, r), o != null && o.length && (e.save(), e.globalCompositeOperation = "lighter", e.fillStyle = "rgb(0, 0, 255)", E(e, o, r), l.foreheadCoverage && h(e, o, r), e.restore(), e.save(), e.globalCompositeOperation = "lighter", e.filter = "blur(8px)", e.fillStyle = "rgb(255, 0, 0)", E(e, o, r), l.foreheadCoverage && h(e, o, r), e.restore(), e.save(), e.globalCompositeOperation = "lighter", e.filter = "blur(3px)", e.fillStyle = "rgb(0, 255, 0)", C(e, o, r), e.restore());
206
+ };
207
+ export {
208
+ O as D,
209
+ _ as F,
210
+ F as I,
211
+ I as L,
212
+ A as O,
213
+ N as R,
214
+ g as S,
215
+ d as a,
216
+ v as b,
217
+ L as c,
218
+ u as d,
219
+ P as e,
220
+ Y as f,
221
+ S as g,
222
+ w as p,
223
+ M as r
224
+ };
@@ -0,0 +1 @@
1
+ "use strict";const O=["bg","brows","eyes","face_skin","hair","lips","mouth","person"],T=["normal","multiply","screen","overlay"],p={label:"lips",invert:!1,color:"#e85d75",opacity:.8,blendMode:"multiply",feather:1,mirrored:!1},S=(e,o,r,l)=>typeof e=="number"&&Number.isFinite(e)?Math.min(r,Math.max(o,e)):l,h=(e={})=>{const o=p;return{label:typeof e.label=="string"&&e.label.trim()?e.label:o.label,invert:typeof e.invert=="boolean"?e.invert:o.invert,color:typeof e.color=="string"&&e.color.trim()?e.color:o.color,opacity:S(e.opacity,0,1,o.opacity),blendMode:T.includes(e.blendMode)?e.blendMode:o.blendMode,feather:S(e.feather,0,8,o.feather),mirrored:typeof e.mirrored=="boolean"?e.mirrored:o.mirrored}},F=(e,o)=>h({...e,...o}),Y=e=>(typeof e=="string"?e.split(","):e).map(o=>o.trim()).filter(Boolean),C=[{key:"label",label:"Region",type:"select",options:O.map(e=>({label:e,value:e}))},{key:"invert",label:"Invert selection",type:"boolean"},{key:"color",label:"Color",type:"color"},{key:"opacity",label:"Opacity",type:"number",min:0,max:1,step:.01},{key:"blendMode",label:"Blend",type:"select",options:T.map(e=>({label:e,value:e}))},{key:"feather",label:"Feather (texels)",type:"number",min:0,max:8,step:.5},{key:"mirrored",label:"Mirror mask",type:"boolean"}],g=512,M=[10,338,297,332,284,251,389,356,454,323,361,288,397,365,379,378,400,377,152,148,176,149,150,136,172,58,132,93,234,127,162,21,54,103,67,109],A=[33,246,161,160,159,158,157,173,133,155,154,153,145,144,163,7],m=[362,398,384,385,386,387,388,466,263,249,390,373,374,380,381,382],L=[61,146,91,181,84,17,314,405,321,375,291,409,270,269,267,0,37,39,40,185],N=[78,95,88,178,87,14,317,402,318,324,308,415,310,311,312,13,82,81,80,191],I=[70,63,105,66,107,55,65,52,53,46],v=[336,296,334,293,300,276,283,282,295,285],G=[A,m,L,N,I,v],_=(e,o,r)=>{R(e,o,M,r)},f=(e,o,r)=>{const l=i(o,10,r),t=i(o,103,r),a=i(o,332,r),E=i(o,105,r),y=i(o,334,r);if(!l||!t||!a||!E||!y)return;const s=(E.y+y.y)*.5,d=Math.abs(a.x-t.x),n=Math.max(Math.abs(s-l.y)*.72,d*.08),b=Math.max(0,l.y-n),c=n*.34;e.beginPath(),e.moveTo(t.x,t.y-c),e.quadraticCurveTo((t.x+l.x)*.5,b,l.x,b),e.quadraticCurveTo((a.x+l.x)*.5,b,a.x,a.y-c),e.lineTo(y.x,s),e.quadraticCurveTo(l.x,s+n*.16,E.x,s),e.closePath(),e.fill()},B=(e,o,r)=>{G.forEach(l=>R(e,o,l,r))},i=(e,o,r)=>{const l=e[o];return l?{x:l.x*r,y:l.y*r}:null},R=(e,o,r,l)=>{const t=i(o,r[0],l);if(t){e.beginPath(),e.moveTo(t.x,t.y);for(let a=1;a<r.length;a+=1){const E=i(o,r[a],l);E&&e.lineTo(E.x,E.y)}e.closePath(),e.fill()}},u=(e,o,r=g,l={})=>{e.clearRect(0,0,r,r),o!=null&&o.length&&(e.save(),e.globalCompositeOperation="lighter",e.fillStyle="rgb(0, 0, 255)",_(e,o,r),l.foreheadCoverage&&f(e,o,r),e.restore(),e.save(),e.globalCompositeOperation="lighter",e.filter="blur(8px)",e.fillStyle="rgb(255, 0, 0)",_(e,o,r),l.foreheadCoverage&&f(e,o,r),e.restore(),e.save(),e.globalCompositeOperation="lighter",e.filter="blur(3px)",e.fillStyle="rgb(0, 255, 0)",B(e,o,r),e.restore())};exports.DEFAULT_SEGMENTATION_OVERLAY_SETTINGS=p;exports.FACE_MASK_SIZE=g;exports.FACE_OVAL=M;exports.INNER_MOUTH=N;exports.LEFT_EYE=A;exports.LEFT_EYEBROW=I;exports.OUTER_LIPS=L;exports.RIGHT_EYE=m;exports.RIGHT_EYEBROW=v;exports.SEGMENTATION_OVERLAY_BLEND_MODES=T;exports.SEGMENTATION_OVERLAY_SETTINGS_FIELDS=C;exports.SEMANTIC_MASK_LABELS=O;exports.drawFaceRetouchMask=u;exports.parseOverlayLabels=Y;exports.patchSegmentationOverlaySettings=F;exports.resolveSegmentationOverlaySettings=h;