framefields 2.13.1 → 2.15.0

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 (339) hide show
  1. package/NOTICE.md +5 -1
  2. package/dist/audio/index.d.mts +5 -5
  3. package/dist/audio/index.mjs +10 -10
  4. package/dist/{audio-DIvi6hTD.mjs → audio-6TfPlfl4.mjs} +3 -3
  5. package/dist/{audio-DIvi6hTD.mjs.map → audio-6TfPlfl4.mjs.map} +1 -1
  6. package/dist/{audio-C4B9p_yq.d.mts → audio-7oqTUi4G.d.mts} +3 -3
  7. package/dist/{audio-C4B9p_yq.d.mts.map → audio-7oqTUi4G.d.mts.map} +1 -1
  8. package/dist/cli/check-worker.mjs +44 -44
  9. package/dist/cli.mjs +1 -1
  10. package/dist/cloud/index.d.mts.map +1 -1
  11. package/dist/cloud/index.mjs +1 -1
  12. package/dist/{cloud-Cj1TIme8.mjs → cloud-jnk1hPYf.mjs} +2 -2
  13. package/dist/{cloud-Cj1TIme8.mjs.map → cloud-jnk1hPYf.mjs.map} +1 -1
  14. package/dist/components/index.d.mts +13 -13
  15. package/dist/components/index.mjs +43 -43
  16. package/dist/{dist-Kbf-JTry.mjs → dist-BtI6ukB5.mjs} +2 -2
  17. package/dist/{dist-Kbf-JTry.mjs.map → dist-BtI6ukB5.mjs.map} +1 -1
  18. package/dist/{dist-CCrYOkcc.mjs → dist-COOpgG9G.mjs} +4 -3
  19. package/dist/{dist-CCrYOkcc.mjs.map → dist-COOpgG9G.mjs.map} +1 -1
  20. package/dist/{dist-DtPPPsZV.mjs → dist-XqlFM2a8.mjs} +14063 -5308
  21. package/dist/dist-XqlFM2a8.mjs.map +1 -0
  22. package/dist/{dist-CiTgmfUw.mjs → dist-f1zkl69f.mjs} +4 -4
  23. package/dist/dist-f1zkl69f.mjs.map +1 -0
  24. package/dist/{dist-B_rSWeOz.mjs → dist-umQOWz0a.mjs} +1 -1
  25. package/dist/effects/index.d.mts +5 -5
  26. package/dist/effects/index.mjs +35 -35
  27. package/dist/{effects-B-L3rLs6.mjs → effects-DlRMovU5.mjs} +2 -2
  28. package/dist/{effects-B-L3rLs6.mjs.map → effects-DlRMovU5.mjs.map} +1 -1
  29. package/dist/fonts/index.d.mts +1 -1
  30. package/dist/fonts/index.mjs +2 -2
  31. package/dist/{fonts-k5ll8NTE.mjs → fonts-BWYcXjyK.mjs} +3 -3
  32. package/dist/fonts-BWYcXjyK.mjs.map +1 -0
  33. package/dist/{gpu-D2HT3KcE.mjs → gpu-CH1PdM4T.mjs} +2 -2
  34. package/dist/{gpu-D2HT3KcE.mjs.map → gpu-CH1PdM4T.mjs.map} +1 -1
  35. package/dist/{index-rtCXNxGO.d.mts → index-BHTycml5.d.mts} +2 -2
  36. package/dist/{index-rtCXNxGO.d.mts.map → index-BHTycml5.d.mts.map} +1 -1
  37. package/dist/{index-BFTtXosj.d.mts → index-BVd6nXd5.d.mts} +2 -2
  38. package/dist/{index-BFTtXosj.d.mts.map → index-BVd6nXd5.d.mts.map} +1 -1
  39. package/dist/{index-ByhlTwxh.d.mts → index-BcxxxwhV.d.mts} +5 -5
  40. package/dist/{index-ByhlTwxh.d.mts.map → index-BcxxxwhV.d.mts.map} +1 -1
  41. package/dist/{index-CnZhBlob.d.mts → index-BnB_Ou2y.d.mts} +2 -2
  42. package/dist/index-BnB_Ou2y.d.mts.map +1 -0
  43. package/dist/{index-a6JrbAK0.d.mts → index-C-V6CAhP.d.mts} +32 -2
  44. package/dist/index-C-V6CAhP.d.mts.map +1 -0
  45. package/dist/{index-DBh3WphX.d.mts → index-CMhkkc56.d.mts} +44 -12
  46. package/dist/index-CMhkkc56.d.mts.map +1 -0
  47. package/dist/{index-BGlaws7-.d.mts → index-CYVpYGM-.d.mts} +3 -3
  48. package/dist/{index-BGlaws7-.d.mts.map → index-CYVpYGM-.d.mts.map} +1 -1
  49. package/dist/{index-DQ1U3HC3.d.mts → index-DhL7ckvs.d.mts} +7 -7
  50. package/dist/index-DhL7ckvs.d.mts.map +1 -0
  51. package/dist/{index-CtKUQ2VG.d.mts → index-DkAjKnhW.d.mts} +1487 -533
  52. package/dist/index-DkAjKnhW.d.mts.map +1 -0
  53. package/dist/{index-B08eSpaI.d.mts → index-RILu3ULT.d.mts} +2 -2
  54. package/dist/{index-B08eSpaI.d.mts.map → index-RILu3ULT.d.mts.map} +1 -1
  55. package/dist/{index-C5sgRLlG.d.mts → index-TCtdSXd7.d.mts} +3 -1
  56. package/dist/index-TCtdSXd7.d.mts.map +1 -0
  57. package/dist/{index-C2yaponf.d.mts → index-s2qQ8ifZ.d.mts} +911 -57
  58. package/dist/index-s2qQ8ifZ.d.mts.map +1 -0
  59. package/dist/index.d.mts +15 -15
  60. package/dist/index.mjs +52 -52
  61. package/dist/preview/index.d.mts +5 -5
  62. package/dist/preview/index.mjs +10 -10
  63. package/dist/preview-BeGF1Bb1.mjs +1002 -0
  64. package/dist/preview-BeGF1Bb1.mjs.map +1 -0
  65. package/dist/preview-engine/audio.mjs +1 -1
  66. package/dist/preview-engine/{chunk-64L4GUOF.mjs → chunk-4F3DG6YB.mjs} +2 -2
  67. package/dist/preview-engine/chunk-A2OTOW3B.mjs +4694 -0
  68. package/dist/preview-engine/chunk-BR56TQBP.mjs +5 -0
  69. package/dist/preview-engine/{chunk-ADLIF544.mjs → chunk-H2XKXXAU.mjs} +1 -1
  70. package/dist/preview-engine/chunk-NDUODAY2.mjs +3 -0
  71. package/dist/preview-engine/{chunk-FZ4RD7HV.mjs → chunk-QAQJSWUT.mjs} +1 -1
  72. package/dist/preview-engine/chunk-SWRGQTVC.mjs +138 -0
  73. package/dist/preview-engine/{chunk-52X7SURQ.mjs → chunk-TEA3GVBJ.mjs} +1 -1
  74. package/dist/preview-engine/chunk-VM2ZBPLM.mjs +644 -0
  75. package/dist/preview-engine/{chunk-UBY2UYEL.mjs → chunk-XSHNQJ7L.mjs} +1 -1
  76. package/dist/preview-engine/components.mjs +1 -1
  77. package/dist/preview-engine/effects.mjs +1 -1
  78. package/dist/preview-engine/fonts.mjs +1 -1
  79. package/dist/preview-engine/framefields.mjs +1 -1
  80. package/dist/preview-engine/player.mjs +2 -2
  81. package/dist/preview-engine/{renderers-DU7KPFVV.mjs → renderers-6C7NWWDX.mjs} +1 -1
  82. package/dist/preview-engine/renderers-HHVGNMSJ.mjs +206 -0
  83. package/dist/preview-engine/{src-YXNX4MLK.mjs → src-RCNEKIRP.mjs} +1 -1
  84. package/dist/preview-page/index.html +19 -0
  85. package/dist/preview-page/main.css +1 -0
  86. package/dist/preview-page/main.js +327 -0
  87. package/dist/{program-BfiB9ttP.mjs → program-CMigyfso.mjs} +919 -58
  88. package/dist/program-CMigyfso.mjs.map +1 -0
  89. package/dist/renderer/index.d.mts +4 -4
  90. package/dist/renderer/index.mjs +2 -2
  91. package/dist/{renderer-CoC64eam.mjs → renderer-0GMEL_Zi.mjs} +3 -3
  92. package/dist/{renderer-CoC64eam.mjs.map → renderer-0GMEL_Zi.mjs.map} +1 -1
  93. package/dist/{renderer-CSu_vYPn.mjs → renderer-3Wv2ZBJG.mjs} +3 -3
  94. package/dist/{renderer-CSu_vYPn.mjs.map → renderer-3Wv2ZBJG.mjs.map} +1 -1
  95. package/dist/{renderer-Dv_iRIyx.mjs → renderer-4nXkaAWu.mjs} +1280 -285
  96. package/dist/renderer-4nXkaAWu.mjs.map +1 -0
  97. package/dist/{renderer-TfeohPxt.mjs → renderer-6SnfLXeg.mjs} +3 -3
  98. package/dist/{renderer-TfeohPxt.mjs.map → renderer-6SnfLXeg.mjs.map} +1 -1
  99. package/dist/{renderer-D0xM67cK.mjs → renderer-8gHw3O0P.mjs} +2 -2
  100. package/dist/{renderer-D0xM67cK.mjs.map → renderer-8gHw3O0P.mjs.map} +1 -1
  101. package/dist/{renderer-C64_B8It.mjs → renderer-AOBglZHC.mjs} +2 -2
  102. package/dist/{renderer-B10HDC13.mjs → renderer-B0bSARK3.mjs} +3 -3
  103. package/dist/{renderer-B10HDC13.mjs.map → renderer-B0bSARK3.mjs.map} +1 -1
  104. package/dist/{renderer-DWYmJSrl.mjs → renderer-B2_tuRfl.mjs} +2 -2
  105. package/dist/{renderer-DWYmJSrl.mjs.map → renderer-B2_tuRfl.mjs.map} +1 -1
  106. package/dist/{renderer-mDBoz0zT.mjs → renderer-B82FhkEr.mjs} +3 -3
  107. package/dist/{renderer-mDBoz0zT.mjs.map → renderer-B82FhkEr.mjs.map} +1 -1
  108. package/dist/{renderer-DYeNNc_G.mjs → renderer-B9lzA0PY.mjs} +3 -3
  109. package/dist/{renderer-DYeNNc_G.mjs.map → renderer-B9lzA0PY.mjs.map} +1 -1
  110. package/dist/{renderer-BGchUBW_.mjs → renderer-BBSIWSry.mjs} +2 -2
  111. package/dist/{renderer-BGchUBW_.mjs.map → renderer-BBSIWSry.mjs.map} +1 -1
  112. package/dist/{renderer-GIlQ9lZq.mjs → renderer-BEKDMxbi.mjs} +2 -2
  113. package/dist/{renderer-GIlQ9lZq.mjs.map → renderer-BEKDMxbi.mjs.map} +1 -1
  114. package/dist/renderer-BERGAxqA.mjs +5 -0
  115. package/dist/{renderer-Bw0O--gW.mjs → renderer-BF960HY8.mjs} +3 -3
  116. package/dist/{renderer-Bw0O--gW.mjs.map → renderer-BF960HY8.mjs.map} +1 -1
  117. package/dist/{renderer-BhcTYhaP.mjs → renderer-BFwyVxCu.mjs} +3 -3
  118. package/dist/{renderer-BhcTYhaP.mjs.map → renderer-BFwyVxCu.mjs.map} +1 -1
  119. package/dist/{renderer-DYlx7VHo.mjs → renderer-BNiwcI3-.mjs} +2 -2
  120. package/dist/{renderer-DYlx7VHo.mjs.map → renderer-BNiwcI3-.mjs.map} +1 -1
  121. package/dist/{renderer-B3_GddgJ.mjs → renderer-BPbVb2Q4.mjs} +2 -2
  122. package/dist/{renderer-B3_GddgJ.mjs.map → renderer-BPbVb2Q4.mjs.map} +1 -1
  123. package/dist/renderer-BQ_YkBMt.mjs +6 -0
  124. package/dist/{renderer-Y1kjtOto.mjs → renderer-BUWxlA8T.mjs} +3 -3
  125. package/dist/{renderer-Y1kjtOto.mjs.map → renderer-BUWxlA8T.mjs.map} +1 -1
  126. package/dist/renderer-BW0Tjsv9.mjs +5 -0
  127. package/dist/{renderer-DtFZbE1j.mjs → renderer-BX8liu-e.mjs} +2 -2
  128. package/dist/{renderer-BOlHW3Mi.mjs → renderer-BXIwDAr_.mjs} +2 -2
  129. package/dist/{renderer-BOlHW3Mi.mjs.map → renderer-BXIwDAr_.mjs.map} +1 -1
  130. package/dist/{renderer-DzON3wDZ.mjs → renderer-B_Hy1W-g.mjs} +3 -3
  131. package/dist/{renderer-DzON3wDZ.mjs.map → renderer-B_Hy1W-g.mjs.map} +1 -1
  132. package/dist/{renderer-BM19iK8v.mjs → renderer-Bb6cvSgh.mjs} +2 -2
  133. package/dist/{renderer-BM19iK8v.mjs.map → renderer-Bb6cvSgh.mjs.map} +1 -1
  134. package/dist/{renderer-D0h1hTOo.mjs → renderer-BdppwWC9.mjs} +2 -2
  135. package/dist/{renderer-D0h1hTOo.mjs.map → renderer-BdppwWC9.mjs.map} +1 -1
  136. package/dist/{renderer-BTwuM9u-.mjs → renderer-Bhc24HVe.mjs} +3 -3
  137. package/dist/{renderer-BTwuM9u-.mjs.map → renderer-Bhc24HVe.mjs.map} +1 -1
  138. package/dist/{renderer-BZX932Lj.mjs → renderer-BiNA2wF0.mjs} +2 -2
  139. package/dist/{renderer-BZX932Lj.mjs.map → renderer-BiNA2wF0.mjs.map} +1 -1
  140. package/dist/{renderer-CkTehyRX.mjs → renderer-BmoBgTp5.mjs} +3 -3
  141. package/dist/{renderer-CkTehyRX.mjs.map → renderer-BmoBgTp5.mjs.map} +1 -1
  142. package/dist/{renderer-B3un4Pdi.mjs → renderer-BmqFmCWS.mjs} +3 -3
  143. package/dist/{renderer-B3un4Pdi.mjs.map → renderer-BmqFmCWS.mjs.map} +1 -1
  144. package/dist/{renderer-CHCRcCKw.mjs → renderer-BnVwAObV.mjs} +2 -2
  145. package/dist/{renderer-CHCRcCKw.mjs.map → renderer-BnVwAObV.mjs.map} +1 -1
  146. package/dist/{renderer-Cv9CKKWG.mjs → renderer-BxttZHme.mjs} +2 -2
  147. package/dist/{renderer-Cv9CKKWG.mjs.map → renderer-BxttZHme.mjs.map} +1 -1
  148. package/dist/renderer-BzyPdUD1.mjs +5 -0
  149. package/dist/renderer-C0hM-mtY.mjs +5 -0
  150. package/dist/renderer-C6cyUTvk.mjs +5 -0
  151. package/dist/{renderer-B6bK9rXm.mjs → renderer-C8E4XsSg.mjs} +2 -2
  152. package/dist/{renderer-B6bK9rXm.mjs.map → renderer-C8E4XsSg.mjs.map} +1 -1
  153. package/dist/renderer-C8zY3pzk.mjs +5 -0
  154. package/dist/{renderer-4nsuReW2.mjs → renderer-C9U-LY50.mjs} +3 -3
  155. package/dist/{renderer-4nsuReW2.mjs.map → renderer-C9U-LY50.mjs.map} +1 -1
  156. package/dist/{renderer-BvBqTAtk.mjs → renderer-CB2JVu5x.mjs} +3 -3
  157. package/dist/{renderer-BvBqTAtk.mjs.map → renderer-CB2JVu5x.mjs.map} +1 -1
  158. package/dist/{renderer-CQ4h8n7p.mjs → renderer-CC4YBJ8Z.mjs} +3 -3
  159. package/dist/{renderer-CQ4h8n7p.mjs.map → renderer-CC4YBJ8Z.mjs.map} +1 -1
  160. package/dist/renderer-CEkSOyKu.mjs +5 -0
  161. package/dist/{renderer-zLi2qFGT.mjs → renderer-CIycc5O-.mjs} +2 -2
  162. package/dist/{renderer-zLi2qFGT.mjs.map → renderer-CIycc5O-.mjs.map} +1 -1
  163. package/dist/renderer-CJYtfa4x.mjs +5 -0
  164. package/dist/{renderer-yNWYqvvq.mjs → renderer-CJraQlV-.mjs} +2 -2
  165. package/dist/{renderer-yNWYqvvq.mjs.map → renderer-CJraQlV-.mjs.map} +1 -1
  166. package/dist/renderer-CKMtHGZh.mjs +5 -0
  167. package/dist/renderer-CLzicoiy.mjs +5 -0
  168. package/dist/renderer-CM2A4BHd.mjs +5 -0
  169. package/dist/{renderer-BrEeUw7T.mjs → renderer-COWGWtob.mjs} +2 -2
  170. package/dist/{renderer-BrEeUw7T.mjs.map → renderer-COWGWtob.mjs.map} +1 -1
  171. package/dist/{renderer-uER8kn7f.mjs → renderer-COxG2XGf.mjs} +2 -2
  172. package/dist/{renderer-uER8kn7f.mjs.map → renderer-COxG2XGf.mjs.map} +1 -1
  173. package/dist/{renderer-C4hd6Cqi.mjs → renderer-CQDCIsQm.mjs} +2 -2
  174. package/dist/{renderer-C4hd6Cqi.mjs.map → renderer-CQDCIsQm.mjs.map} +1 -1
  175. package/dist/{renderer-Cfx_FCSf.mjs → renderer-CRUeag8i.mjs} +3 -3
  176. package/dist/{renderer-Cfx_FCSf.mjs.map → renderer-CRUeag8i.mjs.map} +1 -1
  177. package/dist/{renderer-CXrnzihz.mjs → renderer-CWVput06.mjs} +3 -3
  178. package/dist/{renderer-CXrnzihz.mjs.map → renderer-CWVput06.mjs.map} +1 -1
  179. package/dist/renderer-CZlHjcxr.mjs +5 -0
  180. package/dist/{renderer-BmyFfvVA.mjs → renderer-CbbnBLOB.mjs} +3 -3
  181. package/dist/{renderer-BmyFfvVA.mjs.map → renderer-CbbnBLOB.mjs.map} +1 -1
  182. package/dist/renderer-CbimvSU8.mjs +5 -0
  183. package/dist/renderer-Ccvc63yd.mjs +5 -0
  184. package/dist/renderer-Cdp-SGfq.mjs +5 -0
  185. package/dist/renderer-CeTcSs3e.mjs +5 -0
  186. package/dist/{renderer-_J9JcCMR.mjs → renderer-CfLZein2.mjs} +3 -3
  187. package/dist/{renderer-_J9JcCMR.mjs.map → renderer-CfLZein2.mjs.map} +1 -1
  188. package/dist/{renderer-D-mX1EVA.mjs → renderer-Ch-q1O-q.mjs} +3 -3
  189. package/dist/{renderer-D-mX1EVA.mjs.map → renderer-Ch-q1O-q.mjs.map} +1 -1
  190. package/dist/{renderer-uzU6dsdR.mjs → renderer-Ch5JvJWl.mjs} +2 -2
  191. package/dist/{renderer-uzU6dsdR.mjs.map → renderer-Ch5JvJWl.mjs.map} +1 -1
  192. package/dist/{renderer-BZMh2io2.mjs → renderer-ChtEzq-R.mjs} +2 -2
  193. package/dist/{renderer-BZMh2io2.mjs.map → renderer-ChtEzq-R.mjs.map} +1 -1
  194. package/dist/{renderer-B2IUPjhw.mjs → renderer-Cj9nTC5l.mjs} +3 -3
  195. package/dist/{renderer-B2IUPjhw.mjs.map → renderer-Cj9nTC5l.mjs.map} +1 -1
  196. package/dist/{renderer-CdXBRdFf.mjs → renderer-CqT8HsSS.mjs} +2 -2
  197. package/dist/{renderer-CdXBRdFf.mjs.map → renderer-CqT8HsSS.mjs.map} +1 -1
  198. package/dist/{renderer-CldjJmRR.mjs → renderer-CuQjMhdV.mjs} +2 -2
  199. package/dist/renderer-CvNuu52U.mjs +5 -0
  200. package/dist/renderer-CwciC0oI.mjs +5 -0
  201. package/dist/renderer-CysLUbIr.mjs +5 -0
  202. package/dist/{renderer-BsrKj6Td.mjs → renderer-Cz30EVws.mjs} +2 -2
  203. package/dist/{renderer-BsrKj6Td.mjs.map → renderer-Cz30EVws.mjs.map} +1 -1
  204. package/dist/renderer-D3A22Vxb.mjs +5 -0
  205. package/dist/renderer-D5SY9EmA.mjs +5 -0
  206. package/dist/renderer-D8h3ZvaE.mjs +5 -0
  207. package/dist/renderer-DE-B6N9n.mjs +5 -0
  208. package/dist/renderer-DETZTI7t.mjs +5 -0
  209. package/dist/{renderer-CC22Djgi.mjs → renderer-DHoX-5U_.mjs} +3 -3
  210. package/dist/{renderer-CC22Djgi.mjs.map → renderer-DHoX-5U_.mjs.map} +1 -1
  211. package/dist/{renderer-HKv5cBdp.mjs → renderer-DOkm0Ycd.mjs} +2 -2
  212. package/dist/{renderer-HKv5cBdp.mjs.map → renderer-DOkm0Ycd.mjs.map} +1 -1
  213. package/dist/{renderer-fG8Jy8Rx.d.mts → renderer-DU3f6ZrS.d.mts} +2 -2
  214. package/dist/{renderer-fG8Jy8Rx.d.mts.map → renderer-DU3f6ZrS.d.mts.map} +1 -1
  215. package/dist/{renderer-C98XwEIr.mjs → renderer-DUzv-shq.mjs} +2 -2
  216. package/dist/{renderer-C98XwEIr.mjs.map → renderer-DUzv-shq.mjs.map} +1 -1
  217. package/dist/renderer-DWnDj0IM.mjs +5 -0
  218. package/dist/renderer-DcGUIbQF.mjs +5 -0
  219. package/dist/renderer-Dfq6FoNO.mjs +5 -0
  220. package/dist/renderer-DhasXW6S.mjs +3 -0
  221. package/dist/{renderer-BEuXJY-C.mjs → renderer-DhnOWnEA.mjs} +3 -3
  222. package/dist/{renderer-BEuXJY-C.mjs.map → renderer-DhnOWnEA.mjs.map} +1 -1
  223. package/dist/{renderer-BIKkxw_Z.mjs → renderer-Dhy1XHzz.mjs} +3 -3
  224. package/dist/{renderer-BIKkxw_Z.mjs.map → renderer-Dhy1XHzz.mjs.map} +1 -1
  225. package/dist/renderer-DjCvpsV_.mjs +5 -0
  226. package/dist/{renderer-pn52dzZz.mjs → renderer-DjJshz9Y.mjs} +2 -2
  227. package/dist/{renderer-pn52dzZz.mjs.map → renderer-DjJshz9Y.mjs.map} +1 -1
  228. package/dist/{renderer-DhGZ41hQ.mjs → renderer-DmTUIdus.mjs} +3 -3
  229. package/dist/{renderer-DhGZ41hQ.mjs.map → renderer-DmTUIdus.mjs.map} +1 -1
  230. package/dist/{renderer-D_m6Qbsi.mjs → renderer-Dq7AioJa.mjs} +2 -2
  231. package/dist/{renderer-D_m6Qbsi.mjs.map → renderer-Dq7AioJa.mjs.map} +1 -1
  232. package/dist/renderer-DrAaM6JD.mjs +5 -0
  233. package/dist/{renderer-D-GWBoVT.mjs → renderer-Dt4sqNEu.mjs} +2 -2
  234. package/dist/{renderer-D-GWBoVT.mjs.map → renderer-Dt4sqNEu.mjs.map} +1 -1
  235. package/dist/{renderer-DCrKEVjb.mjs → renderer-Dtcs4idV.mjs} +3 -3
  236. package/dist/{renderer-DCrKEVjb.mjs.map → renderer-Dtcs4idV.mjs.map} +1 -1
  237. package/dist/renderer-Dxlv8LYm.mjs +5 -0
  238. package/dist/{renderer-CO9vE3sd.mjs → renderer-Gj8SrE2W.mjs} +2 -2
  239. package/dist/{renderer-CO9vE3sd.mjs.map → renderer-Gj8SrE2W.mjs.map} +1 -1
  240. package/dist/{renderer-DvHi_wXE.mjs → renderer-KfnXDJS0.mjs} +3 -3
  241. package/dist/{renderer-DvHi_wXE.mjs.map → renderer-KfnXDJS0.mjs.map} +1 -1
  242. package/dist/{renderer-7xQmXXMH.mjs → renderer-MXVlg4p5.mjs} +3 -3
  243. package/dist/{renderer-7xQmXXMH.mjs.map → renderer-MXVlg4p5.mjs.map} +1 -1
  244. package/dist/{renderer-YONlI6W-.mjs → renderer-N2b6QZ1E.mjs} +3 -3
  245. package/dist/{renderer-YONlI6W-.mjs.map → renderer-N2b6QZ1E.mjs.map} +1 -1
  246. package/dist/renderer-Pb43OO2t.mjs +5 -0
  247. package/dist/{renderer-DNynPM6X.mjs → renderer-Q7gDzm8c.mjs} +2 -2
  248. package/dist/{renderer-DNynPM6X.mjs.map → renderer-Q7gDzm8c.mjs.map} +1 -1
  249. package/dist/{renderer-BEhZiOT4.mjs → renderer-RCiANtRV.mjs} +2 -2
  250. package/dist/{renderer-BEhZiOT4.mjs.map → renderer-RCiANtRV.mjs.map} +1 -1
  251. package/dist/{renderer-Dm57W73p.mjs → renderer-Sig9nZcI.mjs} +2 -2
  252. package/dist/renderer-VQbm-cGr.mjs +5 -0
  253. package/dist/{renderer-DiZkZ0Pr.mjs → renderer-fabBgwQX.mjs} +3 -3
  254. package/dist/{renderer-DiZkZ0Pr.mjs.map → renderer-fabBgwQX.mjs.map} +1 -1
  255. package/dist/{renderer-Bw-_GZVw.mjs → renderer-g-0PCNoo.mjs} +3 -3
  256. package/dist/{renderer-Bw-_GZVw.mjs.map → renderer-g-0PCNoo.mjs.map} +1 -1
  257. package/dist/{renderer-QbSrnPZU.mjs → renderer-gmHKIbKI.mjs} +3 -3
  258. package/dist/{renderer-QbSrnPZU.mjs.map → renderer-gmHKIbKI.mjs.map} +1 -1
  259. package/dist/{renderer-CU6WT5jW.mjs → renderer-kVZwiRoK.mjs} +3 -3
  260. package/dist/{renderer-CU6WT5jW.mjs.map → renderer-kVZwiRoK.mjs.map} +1 -1
  261. package/dist/renderer-oPMypDM1.mjs +5 -0
  262. package/dist/{renderer-CRhEGqW4.mjs → renderer-p7tgxP-A.mjs} +3 -3
  263. package/dist/{renderer-CRhEGqW4.mjs.map → renderer-p7tgxP-A.mjs.map} +1 -1
  264. package/dist/{renderer-CO4NGvAh.mjs → renderer-tvYj306A.mjs} +81 -78
  265. package/dist/renderer-tvYj306A.mjs.map +1 -0
  266. package/dist/renderer-xvWGpVyp.mjs +5 -0
  267. package/dist/renderer-zafZbD6Q.mjs +5 -0
  268. package/dist/{renderers-CP8CFWDs-BufiCyn7.mjs → renderers-CP8CFWDs-DLjtjrwx.mjs} +2 -2
  269. package/dist/{renderers-CP8CFWDs-BufiCyn7.mjs.map → renderers-CP8CFWDs-DLjtjrwx.mjs.map} +1 -1
  270. package/dist/sam/index.d.mts +3 -3
  271. package/dist/sam/index.mjs +1 -1
  272. package/dist/signals/index.d.mts +5 -5
  273. package/dist/signals/index.mjs +4 -4
  274. package/dist/{src-BU6vm9sP-DdTHmCr4.mjs → src-B23p_eh7-Cj6-lvV6.mjs} +293 -6
  275. package/dist/src-B23p_eh7-Cj6-lvV6.mjs.map +1 -0
  276. package/dist/{src-DrP7fGJX.mjs → src-CoHAjviq.mjs} +1355 -178
  277. package/dist/src-CoHAjviq.mjs.map +1 -0
  278. package/dist/storage/index.mjs +1 -1
  279. package/package.json +63 -60
  280. package/dist/dist-CiTgmfUw.mjs.map +0 -1
  281. package/dist/dist-DtPPPsZV.mjs.map +0 -1
  282. package/dist/fonts-k5ll8NTE.mjs.map +0 -1
  283. package/dist/index-C2yaponf.d.mts.map +0 -1
  284. package/dist/index-C5sgRLlG.d.mts.map +0 -1
  285. package/dist/index-CnZhBlob.d.mts.map +0 -1
  286. package/dist/index-CtKUQ2VG.d.mts.map +0 -1
  287. package/dist/index-DBh3WphX.d.mts.map +0 -1
  288. package/dist/index-DQ1U3HC3.d.mts.map +0 -1
  289. package/dist/index-a6JrbAK0.d.mts.map +0 -1
  290. package/dist/preview-engine/chunk-5ZS46EFB.mjs +0 -5
  291. package/dist/preview-engine/chunk-N3XTDAL6.mjs +0 -2227
  292. package/dist/preview-engine/chunk-NCQHOGZK.mjs +0 -3
  293. package/dist/preview-engine/chunk-PH3UUX6A.mjs +0 -138
  294. package/dist/preview-engine/chunk-XCPRRMMW.mjs +0 -2462
  295. package/dist/preview-engine/renderers-ZMMQ7S2A.mjs +0 -228
  296. package/dist/preview-lHH8Tv4j.mjs +0 -2446
  297. package/dist/preview-lHH8Tv4j.mjs.map +0 -1
  298. package/dist/program-BfiB9ttP.mjs.map +0 -1
  299. package/dist/renderer-0rLmztAv.mjs +0 -5
  300. package/dist/renderer-B0pjOXFY.mjs +0 -5
  301. package/dist/renderer-B7J13reL.mjs +0 -5
  302. package/dist/renderer-BPGIKGgl.mjs +0 -5
  303. package/dist/renderer-Bv-Artj1.mjs +0 -5
  304. package/dist/renderer-BvLjbhcL.mjs +0 -5
  305. package/dist/renderer-By6awWaf.mjs +0 -5
  306. package/dist/renderer-C0rvsz7m.mjs +0 -5
  307. package/dist/renderer-CDgud_HB.mjs +0 -5
  308. package/dist/renderer-CDiRF3bG.mjs +0 -6
  309. package/dist/renderer-CIIEQd4B.mjs +0 -5
  310. package/dist/renderer-CJblwOA9.mjs +0 -5
  311. package/dist/renderer-CNMOXtXE.mjs +0 -5
  312. package/dist/renderer-CO4NGvAh.mjs.map +0 -1
  313. package/dist/renderer-COeSeNGg.mjs +0 -5
  314. package/dist/renderer-CUfElmtZ.mjs +0 -5
  315. package/dist/renderer-CYh2lFoJ.mjs +0 -5
  316. package/dist/renderer-CYtVZYMH.mjs +0 -5
  317. package/dist/renderer-CjxZlkjb.mjs +0 -5
  318. package/dist/renderer-Cpd6TvTC.mjs +0 -5
  319. package/dist/renderer-D3ziOPhX.mjs +0 -5
  320. package/dist/renderer-D5yp74NL.mjs +0 -3
  321. package/dist/renderer-DL-phtL5.mjs +0 -5
  322. package/dist/renderer-DSnmYnHg.mjs +0 -5
  323. package/dist/renderer-DUGfsT-E.mjs +0 -5
  324. package/dist/renderer-DW5af9x1.mjs +0 -5
  325. package/dist/renderer-DYMrol1t.mjs +0 -5
  326. package/dist/renderer-DekeUHaz.mjs +0 -5
  327. package/dist/renderer-Dt5uyJdZ.mjs +0 -5
  328. package/dist/renderer-Dv_iRIyx.mjs.map +0 -1
  329. package/dist/renderer-DwLQAnaK.mjs +0 -5
  330. package/dist/renderer-IXQP2CWM.mjs +0 -5
  331. package/dist/renderer-K-Pkw63O.mjs +0 -5
  332. package/dist/renderer-MPw2KH9P.mjs +0 -5
  333. package/dist/renderer-RPu8RMav.mjs +0 -5
  334. package/dist/renderer-dCqxd5N2.mjs +0 -5
  335. package/dist/renderer-lhjmE-Fp.mjs +0 -5
  336. package/dist/renderer-u9cmBuvM.mjs +0 -5
  337. package/dist/renderer-vH12jcpz.mjs +0 -5
  338. package/dist/src-BU6vm9sP-DdTHmCr4.mjs.map +0 -1
  339. package/dist/src-DrP7fGJX.mjs.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-D_m6Qbsi.mjs","names":[],"sources":["../../../nodes/node-vignette/dist/renderers-B_pue82_.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { unwrapFrameParam } from \"@framefields/node-sdk\";\nimport { FULLSCREEN_QUAD_WGSL, createFullscreenPipeline, drawChildToTexture, drawFullscreenPass, drawTextureToTarget, fragmentBindGroupLayout, perDevice, signalTextureView, signalTiming, texturesLayout } from \"@framefields/node-sdk/gpu\";\n\n//#region src/renderers/webgpu-renderer.ts\nconst VIGNETTE_SHADER = `\nstruct VignetteUniforms {\n strength : f32,\n radius : f32,\n softness : f32,\n roundness : f32,\n\n centerX : f32,\n centerY : f32,\n hasStrengthSig : f32,\n hasRadiusSig : f32,\n\n hasSoftnessSig : f32,\n hasRoundnessSig: f32,\n hasCenterXSig : f32,\n hasCenterYSig : f32,\n};\n\n@group(0) @binding(0) var<uniform> u : VignetteUniforms;\n@group(1) @binding(0) var tex : texture_2d<f32>;\n@group(1) @binding(1) var samp : sampler;\n\n@group(2) @binding(0) var strengthSigTex : texture_2d<f32>;\n@group(2) @binding(1) var radiusSigTex : texture_2d<f32>;\n@group(2) @binding(2) var softnessSigTex : texture_2d<f32>;\n@group(2) @binding(3) var roundnessSigTex : texture_2d<f32>;\n@group(2) @binding(4) var centerXSigTex : texture_2d<f32>;\n@group(2) @binding(5) var centerYSigTex : texture_2d<f32>;\n@group(2) @binding(6) var signalSamp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n let color = textureSampleLevel(tex, samp, in.uv, 0.0);\n\n if (color.a < 1e-5) {\n return color;\n }\n\n // Resolve parameter overrides or dynamic signals\n var strength = u.strength;\n if (u.hasStrengthSig > 0.5) {\n strength = textureSampleLevel(strengthSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n\n var radius = u.radius;\n if (u.hasRadiusSig > 0.5) {\n radius = textureSampleLevel(radiusSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n\n var softness = u.softness;\n if (u.hasSoftnessSig > 0.5) {\n softness = textureSampleLevel(softnessSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n\n var roundness = u.roundness;\n if (u.hasRoundnessSig > 0.5) {\n roundness = textureSampleLevel(roundnessSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n\n var centerX = u.centerX;\n if (u.hasCenterXSig > 0.5) {\n centerX = textureSampleLevel(centerXSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n\n var centerY = u.centerY;\n if (u.hasCenterYSig > 0.5) {\n centerY = textureSampleLevel(centerYSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n\n let center = vec2<f32>(centerX, centerY);\n let dimensions = vec2<f32>(textureDimensions(tex));\n let aspect = dimensions.x / dimensions.y;\n let uvOffset = in.uv - center;\n\n // Calculate aspect ratio corrected coordinate for circle\n let correctedOffset = vec2<f32>(\n uvOffset.x * mix(1.0, aspect, roundness),\n uvOffset.y\n );\n let dist = length(correctedOffset);\n\n // Calculate vignette edge falloff\n let edge0 = radius;\n let edge1 = max(0.0, radius - softness);\n let vignetteFactor = smoothstep(edge0, edge1, dist);\n\n // Blend based on strength\n let intensity = strength / 100.0;\n let finalVignette = mix(1.0, vignetteFactor, intensity);\n\n // Unpremultiply, apply vignette, and repremultiply\n let unpremult_rgb = color.rgb / color.a;\n let final_rgb = unpremult_rgb * finalVignette;\n\n return vec4<f32>(clamp(final_rgb, vec3<f32>(0.0), vec3<f32>(1.0)) * color.a, color.a);\n}\n`;\nconst vignetteUniformData = new Float32Array(12);\nconst getDeviceLayouts = perDevice((device) => ({\n\tuniformLayout: fragmentBindGroupLayout(device, [\"uniform\"]),\n\tsingleTextureLayout: fragmentBindGroupLayout(device, [\"texture\", \"sampler\"]),\n\tsignalTextureLayout: texturesLayout(device, 6),\n\tpipelineCache: /* @__PURE__ */ new Map()\n}));\nfunction getVignetteResources(device, format) {\n\tconst layouts = getDeviceLayouts(device);\n\tconst cacheKey = `vignette_${format}`;\n\tlet pipeline = layouts.pipelineCache.get(cacheKey);\n\tif (!pipeline) {\n\t\tconst vignetteModule = device.createShaderModule({\n\t\t\tlabel: `vignette_${format}.wgsl`,\n\t\t\tcode: VIGNETTE_SHADER\n\t\t});\n\t\tpipeline = createFullscreenPipeline(device, {\n\t\t\tlabel: `VignettePipeline_${format}`,\n\t\t\tmodule: vignetteModule,\n\t\t\tlayouts: [\n\t\t\t\tlayouts.uniformLayout,\n\t\t\t\tlayouts.singleTextureLayout,\n\t\t\t\tlayouts.signalTextureLayout\n\t\t\t],\n\t\t\tformat\n\t\t});\n\t\tlayouts.pipelineCache.set(cacheKey, pipeline);\n\t}\n\treturn {\n\t\tvignettePipeline: pipeline,\n\t\tuniformLayout: layouts.uniformLayout,\n\t\tsingleTextureLayout: layouts.singleTextureLayout,\n\t\tsignalTextureLayout: layouts.signalTextureLayout\n\t};\n}\nconst VignetteWebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetTexture, targetWidth, targetHeight, props } = args;\n\tconst frame = props.frame ?? 0;\n\tconst compositionFrame = props.compositionFrame ?? frame;\n\tconst fps = props.fps || 30;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"Vignette\" || !op) return;\n\tconst childMedia = props.virtualMedia.children?.[0];\n\tif (!childMedia) return;\n\tpass.end();\n\tconst width = targetWidth;\n\tconst height = targetHeight;\n\tconst nodeId = op.inputs ? Object.keys(op.inputs)[0] : \"vignette_node\";\n\tconst resolveBindable = (configKey, defaultValue, minVal, maxVal) => {\n\t\tconst handleId = op[`${configKey}HandleId`];\n\t\tconst input = handleId ? op.inputs?.[handleId] : null;\n\t\tconst hasSignal = !!(input?.connectionValid && (input.outputItem?.type === \"Signal\" || input.outputItem?.type === \"Numeric\"));\n\t\tconst sd = hasSignal && input?.outputItem?.data ? input.outputItem.data : null;\n\t\tlet val = defaultValue;\n\t\tlet hasStaticSig = false;\n\t\tlet gpuTextureView;\n\t\tif (!hasSignal) if (input?.connectionValid && input.outputItem?.type === \"Number\") val = Math.max(minVal, Math.min(maxVal, Number(input.outputItem.data ?? defaultValue)));\n\t\telse {\n\t\t\tconst unwrapped = unwrapFrameParam(op[configKey], compositionFrame, fps);\n\t\t\tif (unwrapped.gpuTextureView) {\n\t\t\t\tgpuTextureView = unwrapped.gpuTextureView;\n\t\t\t\thasStaticSig = true;\n\t\t\t}\n\t\t\tconst rawVal = unwrapped.value;\n\t\t\tconst numVal = Number(rawVal ?? defaultValue);\n\t\t\tval = Math.max(minVal, Math.min(maxVal, isNaN(numVal) ? defaultValue : numVal));\n\t\t}\n\t\telse if (sd) {\n\t\t\tval = Math.max(minVal, Math.min(maxVal, Number(sd.offset ?? 0)));\n\t\t\thasStaticSig = true;\n\t\t}\n\t\treturn {\n\t\t\tval,\n\t\t\thasStaticSig,\n\t\t\tsd,\n\t\t\tgpuTextureView\n\t\t};\n\t};\n\tconst strengthRes = resolveBindable(\"strength\", 50, 0, 100);\n\tconst radiusRes = resolveBindable(\"radius\", 1, .1, 2);\n\tconst softnessRes = resolveBindable(\"softness\", .5, 0, 1);\n\tconst roundnessRes = resolveBindable(\"roundness\", .5, 0, 1);\n\tconst centerXRes = resolveBindable(\"centerX\", .5, 0, 1);\n\tconst centerYRes = resolveBindable(\"centerY\", .5, 0, 1);\n\tconst { texture: tmpTex } = await drawChildToTexture(args, childMedia);\n\targs.pass.end();\n\tconst { vignettePipeline: pipeline, uniformLayout: uLayout, singleTextureLayout: tLayout, signalTextureLayout: sigLayout } = getVignetteResources(ctx.device, ctx.renderer.format);\n\tconst sampler = ctx.renderer.samplerCache.getSampler(ctx.device);\n\tconst { elapsedSeconds, durationSeconds } = signalTiming(props, frame, fps);\n\tconst signalContext = {\n\t\targs,\n\t\twidth,\n\t\theight,\n\t\tframe,\n\t\tfps,\n\t\telapsedSeconds,\n\t\tdurationSeconds\n\t};\n\tconst getSignalView = (res, suffix) => signalTextureView(signalContext, res, `${nodeId}_${suffix}`);\n\tconst strengthView = getSignalView(strengthRes, \"strength_sig\");\n\tconst radiusView = getSignalView(radiusRes, \"radius_sig\");\n\tconst softnessView = getSignalView(softnessRes, \"softness_sig\");\n\tconst roundnessView = getSignalView(roundnessRes, \"roundness_sig\");\n\tconst centerXView = getSignalView(centerXRes, \"centerX_sig\");\n\tconst centerYView = getSignalView(centerYRes, \"centerY_sig\");\n\tvignetteUniformData[0] = strengthRes.val;\n\tvignetteUniformData[1] = radiusRes.val;\n\tvignetteUniformData[2] = softnessRes.val;\n\tvignetteUniformData[3] = roundnessRes.val;\n\tvignetteUniformData[4] = centerXRes.val;\n\tvignetteUniformData[5] = centerYRes.val;\n\tvignetteUniformData[6] = strengthRes.hasStaticSig ? 1 : 0;\n\tvignetteUniformData[7] = radiusRes.hasStaticSig ? 1 : 0;\n\tvignetteUniformData[8] = softnessRes.hasStaticSig ? 1 : 0;\n\tvignetteUniformData[9] = roundnessRes.hasStaticSig ? 1 : 0;\n\tvignetteUniformData[10] = centerXRes.hasStaticSig ? 1 : 0;\n\tvignetteUniformData[11] = centerYRes.hasStaticSig ? 1 : 0;\n\tconst uniformBuffer = ctx.renderer.getTemporaryBuffer(vignetteUniformData);\n\tconst outTex = ctx.renderer.getTemporaryTexture(width, height, [\n\t\ttmpTex,\n\t\ttargetTexture,\n\t\t...props.excludeTextures || []\n\t]);\n\tdrawFullscreenPass(encoder, outTex.createView(), pipeline, [\n\t\tctx.device.createBindGroup({\n\t\t\tlayout: uLayout,\n\t\t\tentries: [{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: { buffer: uniformBuffer }\n\t\t\t}]\n\t\t}),\n\t\tctx.renderer.bindGroupCache.getBindGroup(ctx.device, tLayout, tmpTex, sampler),\n\t\tctx.device.createBindGroup({\n\t\t\tlayout: sigLayout,\n\t\t\tentries: [\n\t\t\t\t{\n\t\t\t\t\tbinding: 0,\n\t\t\t\t\tresource: strengthView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 1,\n\t\t\t\t\tresource: radiusView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 2,\n\t\t\t\t\tresource: softnessView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 3,\n\t\t\t\t\tresource: roundnessView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 4,\n\t\t\t\t\tresource: centerXView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 5,\n\t\t\t\t\tresource: centerYView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 6,\n\t\t\t\t\tresource: sampler\n\t\t\t\t}\n\t\t\t]\n\t\t})\n\t]);\n\tdrawTextureToTarget(args, outTex, op.opacity ?? 1);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: VignetteWebGPURenderer });\n\n//#endregion\nexport { renderers_default as t };\n//# sourceMappingURL=renderers-B_pue82_.mjs.map"],"mappings":"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"}
1
+ {"version":3,"file":"renderer-Dq7AioJa.mjs","names":[],"sources":["../../../nodes/node-vignette/dist/renderers-B_pue82_.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { unwrapFrameParam } from \"@framefields/node-sdk\";\nimport { FULLSCREEN_QUAD_WGSL, createFullscreenPipeline, drawChildToTexture, drawFullscreenPass, drawTextureToTarget, fragmentBindGroupLayout, perDevice, signalTextureView, signalTiming, texturesLayout } from \"@framefields/node-sdk/gpu\";\n\n//#region src/renderers/webgpu-renderer.ts\nconst VIGNETTE_SHADER = `\nstruct VignetteUniforms {\n strength : f32,\n radius : f32,\n softness : f32,\n roundness : f32,\n\n centerX : f32,\n centerY : f32,\n hasStrengthSig : f32,\n hasRadiusSig : f32,\n\n hasSoftnessSig : f32,\n hasRoundnessSig: f32,\n hasCenterXSig : f32,\n hasCenterYSig : f32,\n};\n\n@group(0) @binding(0) var<uniform> u : VignetteUniforms;\n@group(1) @binding(0) var tex : texture_2d<f32>;\n@group(1) @binding(1) var samp : sampler;\n\n@group(2) @binding(0) var strengthSigTex : texture_2d<f32>;\n@group(2) @binding(1) var radiusSigTex : texture_2d<f32>;\n@group(2) @binding(2) var softnessSigTex : texture_2d<f32>;\n@group(2) @binding(3) var roundnessSigTex : texture_2d<f32>;\n@group(2) @binding(4) var centerXSigTex : texture_2d<f32>;\n@group(2) @binding(5) var centerYSigTex : texture_2d<f32>;\n@group(2) @binding(6) var signalSamp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n let color = textureSampleLevel(tex, samp, in.uv, 0.0);\n\n if (color.a < 1e-5) {\n return color;\n }\n\n // Resolve parameter overrides or dynamic signals\n var strength = u.strength;\n if (u.hasStrengthSig > 0.5) {\n strength = textureSampleLevel(strengthSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n\n var radius = u.radius;\n if (u.hasRadiusSig > 0.5) {\n radius = textureSampleLevel(radiusSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n\n var softness = u.softness;\n if (u.hasSoftnessSig > 0.5) {\n softness = textureSampleLevel(softnessSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n\n var roundness = u.roundness;\n if (u.hasRoundnessSig > 0.5) {\n roundness = textureSampleLevel(roundnessSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n\n var centerX = u.centerX;\n if (u.hasCenterXSig > 0.5) {\n centerX = textureSampleLevel(centerXSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n\n var centerY = u.centerY;\n if (u.hasCenterYSig > 0.5) {\n centerY = textureSampleLevel(centerYSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n }\n\n let center = vec2<f32>(centerX, centerY);\n let dimensions = vec2<f32>(textureDimensions(tex));\n let aspect = dimensions.x / dimensions.y;\n let uvOffset = in.uv - center;\n\n // Calculate aspect ratio corrected coordinate for circle\n let correctedOffset = vec2<f32>(\n uvOffset.x * mix(1.0, aspect, roundness),\n uvOffset.y\n );\n let dist = length(correctedOffset);\n\n // Calculate vignette edge falloff\n let edge0 = radius;\n let edge1 = max(0.0, radius - softness);\n let vignetteFactor = smoothstep(edge0, edge1, dist);\n\n // Blend based on strength\n let intensity = strength / 100.0;\n let finalVignette = mix(1.0, vignetteFactor, intensity);\n\n // Unpremultiply, apply vignette, and repremultiply\n let unpremult_rgb = color.rgb / color.a;\n let final_rgb = unpremult_rgb * finalVignette;\n\n return vec4<f32>(clamp(final_rgb, vec3<f32>(0.0), vec3<f32>(1.0)) * color.a, color.a);\n}\n`;\nconst vignetteUniformData = new Float32Array(12);\nconst getDeviceLayouts = perDevice((device) => ({\n\tuniformLayout: fragmentBindGroupLayout(device, [\"uniform\"]),\n\tsingleTextureLayout: fragmentBindGroupLayout(device, [\"texture\", \"sampler\"]),\n\tsignalTextureLayout: texturesLayout(device, 6),\n\tpipelineCache: /* @__PURE__ */ new Map()\n}));\nfunction getVignetteResources(device, format) {\n\tconst layouts = getDeviceLayouts(device);\n\tconst cacheKey = `vignette_${format}`;\n\tlet pipeline = layouts.pipelineCache.get(cacheKey);\n\tif (!pipeline) {\n\t\tconst vignetteModule = device.createShaderModule({\n\t\t\tlabel: `vignette_${format}.wgsl`,\n\t\t\tcode: VIGNETTE_SHADER\n\t\t});\n\t\tpipeline = createFullscreenPipeline(device, {\n\t\t\tlabel: `VignettePipeline_${format}`,\n\t\t\tmodule: vignetteModule,\n\t\t\tlayouts: [\n\t\t\t\tlayouts.uniformLayout,\n\t\t\t\tlayouts.singleTextureLayout,\n\t\t\t\tlayouts.signalTextureLayout\n\t\t\t],\n\t\t\tformat\n\t\t});\n\t\tlayouts.pipelineCache.set(cacheKey, pipeline);\n\t}\n\treturn {\n\t\tvignettePipeline: pipeline,\n\t\tuniformLayout: layouts.uniformLayout,\n\t\tsingleTextureLayout: layouts.singleTextureLayout,\n\t\tsignalTextureLayout: layouts.signalTextureLayout\n\t};\n}\nconst VignetteWebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetTexture, targetWidth, targetHeight, props } = args;\n\tconst frame = props.frame ?? 0;\n\tconst compositionFrame = props.compositionFrame ?? frame;\n\tconst fps = props.fps || 30;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"Vignette\" || !op) return;\n\tconst childMedia = props.virtualMedia.children?.[0];\n\tif (!childMedia) return;\n\tpass.end();\n\tconst width = targetWidth;\n\tconst height = targetHeight;\n\tconst nodeId = op.inputs ? Object.keys(op.inputs)[0] : \"vignette_node\";\n\tconst resolveBindable = (configKey, defaultValue, minVal, maxVal) => {\n\t\tconst handleId = op[`${configKey}HandleId`];\n\t\tconst input = handleId ? op.inputs?.[handleId] : null;\n\t\tconst hasSignal = !!(input?.connectionValid && (input.outputItem?.type === \"Signal\" || input.outputItem?.type === \"Numeric\"));\n\t\tconst sd = hasSignal && input?.outputItem?.data ? input.outputItem.data : null;\n\t\tlet val = defaultValue;\n\t\tlet hasStaticSig = false;\n\t\tlet gpuTextureView;\n\t\tif (!hasSignal) if (input?.connectionValid && input.outputItem?.type === \"Number\") val = Math.max(minVal, Math.min(maxVal, Number(input.outputItem.data ?? defaultValue)));\n\t\telse {\n\t\t\tconst unwrapped = unwrapFrameParam(op[configKey], compositionFrame, fps);\n\t\t\tif (unwrapped.gpuTextureView) {\n\t\t\t\tgpuTextureView = unwrapped.gpuTextureView;\n\t\t\t\thasStaticSig = true;\n\t\t\t}\n\t\t\tconst rawVal = unwrapped.value;\n\t\t\tconst numVal = Number(rawVal ?? defaultValue);\n\t\t\tval = Math.max(minVal, Math.min(maxVal, isNaN(numVal) ? defaultValue : numVal));\n\t\t}\n\t\telse if (sd) {\n\t\t\tval = Math.max(minVal, Math.min(maxVal, Number(sd.offset ?? 0)));\n\t\t\thasStaticSig = true;\n\t\t}\n\t\treturn {\n\t\t\tval,\n\t\t\thasStaticSig,\n\t\t\tsd,\n\t\t\tgpuTextureView\n\t\t};\n\t};\n\tconst strengthRes = resolveBindable(\"strength\", 50, 0, 100);\n\tconst radiusRes = resolveBindable(\"radius\", 1, .1, 2);\n\tconst softnessRes = resolveBindable(\"softness\", .5, 0, 1);\n\tconst roundnessRes = resolveBindable(\"roundness\", .5, 0, 1);\n\tconst centerXRes = resolveBindable(\"centerX\", .5, 0, 1);\n\tconst centerYRes = resolveBindable(\"centerY\", .5, 0, 1);\n\tconst { texture: tmpTex } = await drawChildToTexture(args, childMedia);\n\targs.pass.end();\n\tconst { vignettePipeline: pipeline, uniformLayout: uLayout, singleTextureLayout: tLayout, signalTextureLayout: sigLayout } = getVignetteResources(ctx.device, ctx.renderer.format);\n\tconst sampler = ctx.renderer.samplerCache.getSampler(ctx.device);\n\tconst { elapsedSeconds, durationSeconds } = signalTiming(props, frame, fps);\n\tconst signalContext = {\n\t\targs,\n\t\twidth,\n\t\theight,\n\t\tframe,\n\t\tfps,\n\t\telapsedSeconds,\n\t\tdurationSeconds\n\t};\n\tconst getSignalView = (res, suffix) => signalTextureView(signalContext, res, `${nodeId}_${suffix}`);\n\tconst strengthView = getSignalView(strengthRes, \"strength_sig\");\n\tconst radiusView = getSignalView(radiusRes, \"radius_sig\");\n\tconst softnessView = getSignalView(softnessRes, \"softness_sig\");\n\tconst roundnessView = getSignalView(roundnessRes, \"roundness_sig\");\n\tconst centerXView = getSignalView(centerXRes, \"centerX_sig\");\n\tconst centerYView = getSignalView(centerYRes, \"centerY_sig\");\n\tvignetteUniformData[0] = strengthRes.val;\n\tvignetteUniformData[1] = radiusRes.val;\n\tvignetteUniformData[2] = softnessRes.val;\n\tvignetteUniformData[3] = roundnessRes.val;\n\tvignetteUniformData[4] = centerXRes.val;\n\tvignetteUniformData[5] = centerYRes.val;\n\tvignetteUniformData[6] = strengthRes.hasStaticSig ? 1 : 0;\n\tvignetteUniformData[7] = radiusRes.hasStaticSig ? 1 : 0;\n\tvignetteUniformData[8] = softnessRes.hasStaticSig ? 1 : 0;\n\tvignetteUniformData[9] = roundnessRes.hasStaticSig ? 1 : 0;\n\tvignetteUniformData[10] = centerXRes.hasStaticSig ? 1 : 0;\n\tvignetteUniformData[11] = centerYRes.hasStaticSig ? 1 : 0;\n\tconst uniformBuffer = ctx.renderer.getTemporaryBuffer(vignetteUniformData);\n\tconst outTex = ctx.renderer.getTemporaryTexture(width, height, [\n\t\ttmpTex,\n\t\ttargetTexture,\n\t\t...props.excludeTextures || []\n\t]);\n\tdrawFullscreenPass(encoder, outTex.createView(), pipeline, [\n\t\tctx.device.createBindGroup({\n\t\t\tlayout: uLayout,\n\t\t\tentries: [{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: { buffer: uniformBuffer }\n\t\t\t}]\n\t\t}),\n\t\tctx.renderer.bindGroupCache.getBindGroup(ctx.device, tLayout, tmpTex, sampler),\n\t\tctx.device.createBindGroup({\n\t\t\tlayout: sigLayout,\n\t\t\tentries: [\n\t\t\t\t{\n\t\t\t\t\tbinding: 0,\n\t\t\t\t\tresource: strengthView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 1,\n\t\t\t\t\tresource: radiusView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 2,\n\t\t\t\t\tresource: softnessView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 3,\n\t\t\t\t\tresource: roundnessView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 4,\n\t\t\t\t\tresource: centerXView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 5,\n\t\t\t\t\tresource: centerYView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 6,\n\t\t\t\t\tresource: sampler\n\t\t\t\t}\n\t\t\t]\n\t\t})\n\t]);\n\tdrawTextureToTarget(args, outTex, op.opacity ?? 1);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: VignetteWebGPURenderer });\n\n//#endregion\nexport { renderers_default as t };\n//# sourceMappingURL=renderers-B_pue82_.mjs.map"],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import "./chunk-DOL2i2sR.mjs";
2
+ import "./dist-XqlFM2a8.mjs";
3
+ import { t as renderers_default } from "./renderer-Dq7AioJa.mjs";
4
+
5
+ export { renderers_default as default };
@@ -1,5 +1,5 @@
1
1
  import { n as defineRenderer } from "./renderer-BuvKGwk3.mjs";
2
- import { A as setVisionDevice, C as matchPoseToTracks, D as readTexturePixels, a as PoseSkeletonRenderer, c as TemporalObjectTracker, f as VisionRunner, t as CLIP_SUBJECT, w as mergeSubjectMask, x as maskBounds } from "./src-BU6vm9sP-DdTHmCr4.mjs";
2
+ import { O as readTexturePixels, S as maskBounds, T as mergeSubjectMask, a as PoseSkeletonRenderer, c as TemporalObjectTracker, f as VisionRunner, j as setVisionDevice, t as CLIP_SUBJECT, w as matchPoseToTracks } from "./src-B23p_eh7-Cj6-lvV6.mjs";
3
3
 
4
4
  //#region ../../nodes/node-vision/dist/renderers-DF17E3A-.mjs
5
5
  let scratchValues = new Uint8Array(0);
@@ -1059,4 +1059,4 @@ var renderers_default = defineRenderer({ WebGPURenderer: VisionWebGPURenderer })
1059
1059
 
1060
1060
  //#endregion
1061
1061
  export { renderers_default as t };
1062
- //# sourceMappingURL=renderer-D-GWBoVT.mjs.map
1062
+ //# sourceMappingURL=renderer-Dt4sqNEu.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-D-GWBoVT.mjs","names":[],"sources":["../../../nodes/node-vision/dist/renderers-DF17E3A-.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { CLIP_SUBJECT, PoseSkeletonRenderer, TemporalObjectTracker, VisionRunner, maskBounds, matchPoseToTracks, mergeSubjectMask, readTexturePixels, setVisionDevice } from \"@framefields/vision\";\n\n//#region src/renderers/frame-cache.ts\nlet scratchValues = new Uint8Array(0);\nlet scratchLengths = new Uint32Array(0);\nfunction encodeMask(mask, width, height) {\n\tif (scratchValues.length < mask.length) {\n\t\tscratchValues = new Uint8Array(mask.length);\n\t\tscratchLengths = new Uint32Array(mask.length);\n\t}\n\tconst values = scratchValues;\n\tconst lengths = scratchLengths;\n\tlet runs = 0;\n\tlet start = 0;\n\tfor (let i = 1; i <= mask.length; i++) if (i === mask.length || mask[i] !== mask[start]) {\n\t\tvalues[runs] = mask[start];\n\t\tlengths[runs] = i - start;\n\t\truns++;\n\t\tstart = i;\n\t}\n\treturn {\n\t\twidth,\n\t\theight,\n\t\tvalues: values.slice(0, runs),\n\t\tlengths: lengths.slice(0, runs)\n\t};\n}\nfunction decodeMask(rle) {\n\tconst out = new Uint8Array(rle.width * rle.height);\n\tlet at = 0;\n\tfor (let r = 0; r < rle.values.length; r++) {\n\t\tconst end = at + rle.lengths[r];\n\t\tif (rle.values[r] !== 0) out.fill(rle.values[r], at, end);\n\t\tat = end;\n\t}\n\treturn out;\n}\nfunction rleBytes(rle) {\n\treturn rle.values.byteLength + rle.lengths.byteLength;\n}\nfunction toCachedMask(mask) {\n\tconst { mask: data, ...rest } = mask;\n\treturn {\n\t\t...rest,\n\t\trle: encodeMask(data, mask.width, mask.height)\n\t};\n}\nfunction fromCachedMask(mask) {\n\tconst { rle, ...rest } = mask;\n\treturn {\n\t\t...rest,\n\t\tmask: decodeMask(rle)\n\t};\n}\nfunction resultBytes(result) {\n\tlet bytes = 512 + result.detections.length * 128 + result.objects.length * 256;\n\tfor (const m of result.masks ?? []) bytes += rleBytes(m.rle);\n\tif (result.subject) bytes += rleBytes(result.subject.mask.rle);\n\treturn bytes;\n}\n/** Results by source (node + inference settings) and frame, least recently used out first. */\nvar VisionFrameCache = class {\n\tentries = /* @__PURE__ */ new Map();\n\tbytes = 0;\n\tconstructor(maxBytes = 256 * 1024 * 1024) {\n\t\tthis.maxBytes = maxBytes;\n\t}\n\tget(source, frame) {\n\t\tconst key = `${source}#${frame}`;\n\t\tconst hit = this.entries.get(key);\n\t\tif (hit) {\n\t\t\tthis.entries.delete(key);\n\t\t\tthis.entries.set(key, hit);\n\t\t}\n\t\treturn hit;\n\t}\n\tset(source, frame, result) {\n\t\tconst key = `${source}#${frame}`;\n\t\tconst old = this.entries.get(key);\n\t\tif (old) {\n\t\t\tthis.bytes -= resultBytes(old);\n\t\t\tthis.entries.delete(key);\n\t\t}\n\t\tthis.entries.set(key, result);\n\t\tthis.bytes += resultBytes(result);\n\t\tfor (const [k, v] of this.entries) {\n\t\t\tif (this.bytes <= this.maxBytes) break;\n\t\t\tthis.entries.delete(k);\n\t\t\tthis.bytes -= resultBytes(v);\n\t\t}\n\t}\n\tclear() {\n\t\tthis.entries.clear();\n\t\tthis.bytes = 0;\n\t}\n\tget size() {\n\t\treturn this.entries.size;\n\t}\n};\n\n//#endregion\n//#region src/renderers/matte-compositor.ts\n/**\n* GPU composite for the mask-family modes: the picture times the subject mask,\n* in one full-screen pass. Replaces building the RGBA result on the CPU and\n* uploading it; only the 8-bit mask goes to the GPU.\n*\n* - matte: picture × mask (premultiplied, so the background is transparent)\n* - mask: white silhouette (rgb = mask, a = 1)\n* - crop: matte, with the subject's bounding box stretched to the frame\n*/\nconst WGSL = `\nstruct Params {\n\tmode: u32, // 0 matte, 1 mask, 2 crop\n\t_pad: u32,\n\tcropMin: vec2<f32>, // uv of the subject bounds (crop)\n\tcropMax: vec2<f32>,\n\t_pad2: vec2<f32>,\n};\n\n@group(0) @binding(0) var<uniform> params: Params;\n@group(0) @binding(1) var picture: texture_2d<f32>;\n@group(0) @binding(2) var mask: texture_2d<f32>;\n@group(0) @binding(3) var samp: sampler;\n\nstruct VSOut {\n\t@builtin(position) pos: vec4<f32>,\n\t@location(0) uv: vec2<f32>,\n};\n\n@vertex fn vs(@builtin(vertex_index) i: u32) -> VSOut {\n\tvar p = array<vec2<f32>, 3>(vec2(-1.0, -1.0), vec2(3.0, -1.0), vec2(-1.0, 3.0));\n\tvar out: VSOut;\n\tout.pos = vec4(p[i], 0.0, 1.0);\n\tout.uv = vec2(p[i].x * 0.5 + 0.5, 0.5 - p[i].y * 0.5);\n\treturn out;\n}\n\n@fragment fn fs(in: VSOut) -> @location(0) vec4<f32> {\n\tvar uv = in.uv;\n\tif (params.mode == 2u) {\n\t\tuv = mix(params.cropMin, params.cropMax, uv);\n\t}\n\tlet m = textureSampleLevel(mask, samp, uv, 0.0).r;\n\tif (params.mode == 1u) {\n\t\treturn vec4(m, m, m, 1.0);\n\t}\n\treturn textureSampleLevel(picture, samp, uv, 0.0) * m;\n}\n`;\nvar MatteCompositor = class {\n\tpipeline;\n\tsampler;\n\tuniforms = [];\n\tuniformIndex = 0;\n\t/** One 8-bit mask texture per node, rewritten each frame. */\n\tmasks = /* @__PURE__ */ new Map();\n\tconstructor(device, format) {\n\t\tthis.device = device;\n\t\tconst module = device.createShaderModule({\n\t\t\tlabel: \"vision_matte_composite\",\n\t\t\tcode: WGSL\n\t\t});\n\t\tthis.pipeline = device.createRenderPipeline({\n\t\t\tlabel: \"vision_matte_composite\",\n\t\t\tlayout: \"auto\",\n\t\t\tvertex: {\n\t\t\t\tmodule,\n\t\t\t\tentryPoint: \"vs\"\n\t\t\t},\n\t\t\tfragment: {\n\t\t\t\tmodule,\n\t\t\t\tentryPoint: \"fs\",\n\t\t\t\ttargets: [{ format }]\n\t\t\t},\n\t\t\tprimitive: { topology: \"triangle-list\" }\n\t\t});\n\t\tthis.sampler = device.createSampler({\n\t\t\tmagFilter: \"linear\",\n\t\t\tminFilter: \"linear\"\n\t\t});\n\t}\n\t/** Uploads a frame-sized 0..255 mask for `key` and returns its texture. */\n\tuploadMask(key, mask, width, height) {\n\t\tlet tex = this.masks.get(key);\n\t\tif (!tex || tex.width !== width || tex.height !== height) {\n\t\t\ttex?.destroy();\n\t\t\ttex = this.device.createTexture({\n\t\t\t\tlabel: `vision_mask_${key}`,\n\t\t\t\tsize: [width, height],\n\t\t\t\tformat: \"r8unorm\",\n\t\t\t\tusage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST\n\t\t\t});\n\t\t\tthis.masks.set(key, tex);\n\t\t}\n\t\tconst aligned = Math.ceil(width / 256) * 256;\n\t\tlet bytes = mask;\n\t\tif (aligned !== width) {\n\t\t\tbytes = new Uint8Array(aligned * height);\n\t\t\tfor (let y = 0; y < height; y++) bytes.set(mask.subarray(y * width, (y + 1) * width), y * aligned);\n\t\t}\n\t\tthis.device.queue.writeTexture({ texture: tex }, bytes.buffer, {\n\t\t\toffset: bytes.byteOffset,\n\t\t\tbytesPerRow: aligned,\n\t\t\trowsPerImage: height\n\t\t}, {\n\t\t\twidth,\n\t\t\theight\n\t\t});\n\t\treturn tex;\n\t}\n\t/** Clears `target` and draws `picture` through `mask` into it. */\n\tdraw(encoder, target, picture, mask, mode, bounds) {\n\t\tconst w = mask.width;\n\t\tconst h = mask.height;\n\t\tconst data = new Float32Array(8);\n\t\tconst view = new Uint32Array(data.buffer);\n\t\tview[0] = mode === \"matte\" ? 0 : mode === \"mask\" ? 1 : 2;\n\t\tif (mode === \"crop\" && bounds) {\n\t\t\tdata[2] = bounds.x0 / w;\n\t\t\tdata[3] = bounds.y0 / h;\n\t\t\tdata[4] = (bounds.x1 + 1) / w;\n\t\t\tdata[5] = (bounds.y1 + 1) / h;\n\t\t} else {\n\t\t\tdata[2] = 0;\n\t\t\tdata[3] = 0;\n\t\t\tdata[4] = 1;\n\t\t\tdata[5] = 1;\n\t\t\tif (mode === \"crop\") view[0] = 0;\n\t\t}\n\t\tif (this.uniformIndex >= this.uniforms.length) this.uniforms.push(this.device.createBuffer({\n\t\t\tsize: data.byteLength,\n\t\t\tusage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST\n\t\t}));\n\t\tconst uniform = this.uniforms[this.uniformIndex];\n\t\tthis.uniformIndex = (this.uniformIndex + 1) % 16;\n\t\tthis.device.queue.writeBuffer(uniform, 0, data);\n\t\tconst bindGroup = this.device.createBindGroup({\n\t\t\tlayout: this.pipeline.getBindGroupLayout(0),\n\t\t\tentries: [\n\t\t\t\t{\n\t\t\t\t\tbinding: 0,\n\t\t\t\t\tresource: { buffer: uniform }\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 1,\n\t\t\t\t\tresource: picture.createView()\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 2,\n\t\t\t\t\tresource: mask.createView()\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 3,\n\t\t\t\t\tresource: this.sampler\n\t\t\t\t}\n\t\t\t]\n\t\t});\n\t\tconst pass = encoder.beginRenderPass({\n\t\t\tlabel: \"vision_matte_composite\",\n\t\t\tcolorAttachments: [{\n\t\t\t\tview: target,\n\t\t\t\tloadOp: \"clear\",\n\t\t\t\tstoreOp: \"store\",\n\t\t\t\tclearValue: {\n\t\t\t\t\tr: 0,\n\t\t\t\t\tg: 0,\n\t\t\t\t\tb: 0,\n\t\t\t\t\ta: 0\n\t\t\t\t}\n\t\t\t}]\n\t\t});\n\t\tpass.setPipeline(this.pipeline);\n\t\tpass.setBindGroup(0, bindGroup);\n\t\tpass.draw(3);\n\t\tpass.end();\n\t}\n};\n\n//#endregion\n//#region src/renderers/webgpu-renderer.ts\n/**\n* Runners by model options (variant, models dir, mirror), each with the runners\n* derived from it by decode options — layers that differ only in classes or\n* confidence share sessions instead of reloading the models.\n*/\nconst sharedRunners = /* @__PURE__ */ new Map();\nconst MAX_SHARED_RUNNERS = 4;\nlet sharedSkeletonRenderer = null;\nlet sharedCompositor = null;\nlet sharedCompositorFormat = null;\n/** Analysed frames, shared by every vision node in the process. */\nconst frameCache = new VisionFrameCache();\n/** The frame each node's child texture holds (drawn on its last call). */\nconst heldFrameByNode = /* @__PURE__ */ new Map();\n/** Per node: a copy of the held frame, the frame being analysed, and the composited matte. */\nconst heldTextures = /* @__PURE__ */ new Map();\nconst analysisTextures = /* @__PURE__ */ new Map();\nconst matteTextures = /* @__PURE__ */ new Map();\n/** One tracker per vision node — track ids must not mix across nodes/sources. */\nconst objectTrackers = /* @__PURE__ */ new Map();\n/**\n* Persistent per-node child textures. The shared frame encoder is submitted at\n* the END of the frame, so a node renderer cannot read back the child it just\n* drew. We keep the texture around and read back the PREVIOUS frame's pixels at\n* the start of the next call — a stable one-frame delay instead of the\n* unpredictable multi-frame lag you get from pooled textures.\n*\n* Keyed on the stable Vision `Effect` instance (render ids change every frame),\n* with a size-keyed fallback for raw operation nodes.\n*/\nconst childTexturesByEffect = /* @__PURE__ */ new WeakMap();\nconst childTexturesByKey = /* @__PURE__ */ new Map();\n/**\n* Last successful subject mask, reused for a few frames when the model misses —\n* a transient miss then holds the silhouette instead of flashing the raw plate.\n* Keyed per node/effect so multiple vision nodes do not collide.\n*/\nconst lastSubjectByNode = /* @__PURE__ */ new Map();\nconst SUBJECT_HOLD_FRAMES = 3;\n/** A per-node texture shaped like `like`, recreated when the size changes. */\nfunction nodeTexture(textures, device, key, like, usage, label) {\n\tlet tex = textures.get(key);\n\tif (!tex || tex.width !== like.width || tex.height !== like.height || tex.format !== like.format) {\n\t\ttex?.destroy();\n\t\ttex = device.createTexture({\n\t\t\tsize: [like.width, like.height],\n\t\t\tformat: like.format,\n\t\t\tusage,\n\t\t\tlabel\n\t\t});\n\t\ttextures.set(key, tex);\n\t}\n\treturn tex;\n}\nconst heldTexture = (device, key, like) => nodeTexture(heldTextures, device, key, like, GPUTextureUsage.COPY_DST | GPUTextureUsage.TEXTURE_BINDING, \"vision_held_frame\");\nconst analysisTexture = (device, key, like) => nodeTexture(analysisTextures, device, key, like, GPUTextureUsage.COPY_DST | GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_SRC, \"vision_analysis_frame\");\nconst matteTexture = (device, key, like) => nodeTexture(matteTextures, device, key, like, GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_SRC, \"vision_matte\");\n/** Everything that decides a frame's results besides the frame itself. */\nfunction cacheSource(nodeKey, child, op, width, height) {\n\tconst c = child;\n\treturn JSON.stringify([\n\t\tnodeKey,\n\t\tc?.operation?.id ?? c?.id ?? null,\n\t\twidth,\n\t\theight,\n\t\top.mode ?? \"passthrough\",\n\t\top.variant,\n\t\top.confidence,\n\t\top.classes,\n\t\top.maskThreshold,\n\t\top.featherRadius,\n\t\top.matteSource,\n\t\top.keyBackground === true,\n\t\top.maxMissedFrames\n\t]);\n}\n/** The background-key threshold at `frame` (it may be animated). */\nfunction backgroundKeyThreshold(op, frame, fps) {\n\tconst raw = op.backgroundKeyThreshold;\n\tif (typeof raw === \"number\") return raw;\n\tif (typeof raw?.get === \"function\") return Number(raw.get({\n\t\tframe,\n\t\tfps\n\t}));\n\tif (typeof raw?._value === \"number\") return Number(raw._value);\n\treturn 70;\n}\n/**\n* The model's subject, or the last one through brief misses: a transient miss\n* then holds the silhouette instead of flashing the raw plate.\n*/\nfunction selectSubject(selected, nodeKey, frame) {\n\tif (selected) {\n\t\tlastSubjectByNode.set(nodeKey, {\n\t\t\tmask: selected,\n\t\t\tframe\n\t\t});\n\t\treturn selected;\n\t}\n\tconst last = lastSubjectByNode.get(nodeKey);\n\tif (last && frame - last.frame <= SUBJECT_HOLD_FRAMES) return last.mask;\n}\n/**\n* Lazy shared runner — `create()` is a pure constructor (zero I/O); the first frame that\n* requests a task triggers that task's model download at inference time (never at init).\n* Nodes with the same model options share sessions; decode options (classes,\n* confidence, …) get a derived runner over the same sessions.\n*/\nfunction getSharedRunner(op) {\n\tconst modelOptions = {\n\t\tvariant: op.variant,\n\t\tmodelsDir: op.modelsDir,\n\t\tbaseUrl: op.baseUrl\n\t};\n\tconst modelKey = JSON.stringify(modelOptions);\n\tlet entry = sharedRunners.get(modelKey);\n\tif (!entry) {\n\t\tif (sharedRunners.size >= MAX_SHARED_RUNNERS) {\n\t\t\tconst [oldestKey, oldest] = sharedRunners.entries().next().value;\n\t\t\toldest.runner.close();\n\t\t\tsharedRunners.delete(oldestKey);\n\t\t}\n\t\tentry = {\n\t\t\trunner: VisionRunner.create(modelOptions),\n\t\t\tderived: /* @__PURE__ */ new Map()\n\t\t};\n\t\tsharedRunners.set(modelKey, entry);\n\t}\n\tconst decodeOptions = {\n\t\tconfidence: op.confidence,\n\t\tclasses: op.classes,\n\t\tmaskThreshold: op.maskThreshold,\n\t\tfeatherRadius: op.featherRadius\n\t};\n\tconst decodeKey = JSON.stringify(decodeOptions);\n\tlet runner = entry.derived.get(decodeKey);\n\tif (!runner) {\n\t\trunner = entry.runner.derive(decodeOptions);\n\t\tentry.derived.set(decodeKey, runner);\n\t}\n\treturn runner;\n}\nfunction getObjectTracker(nodeKey, op) {\n\tlet tracker = objectTrackers.get(nodeKey);\n\tif (!tracker) {\n\t\ttracker = new TemporalObjectTracker({ maxMissedFrames: op.maxMissedFrames ?? 15 });\n\t\tobjectTrackers.set(nodeKey, tracker);\n\t}\n\treturn tracker;\n}\n/**\n* Normalizes the runner's pose keypoints (plate pixel space) to [0, 1] landmarks, which is\n* the contract the signal bundle and the skeleton pipeline expect.\n*/\nfunction normalizePoseKeypoints(result, width, height) {\n\tif (width <= 0 || height <= 0) return result;\n\treturn { people: result.people.map((person) => ({\n\t\t...person,\n\t\tkeypoints: person.keypoints.map((k) => ({\n\t\t\tx: k.x / width,\n\t\t\ty: k.y / height,\n\t\t\tvisibility: k.visibility\n\t\t}))\n\t})) };\n}\n/** Case-insensitive class filter, as the runner's decode applies it. */\nfunction matchesClasses(category, classes) {\n\tif (!classes) return true;\n\tconst c = category.toLowerCase();\n\treturn classes.some((k) => k.toLowerCase() === c);\n}\n/** Assigns each decoded instance mask to the temporal track whose box center is nearest the mask's centroid. */\nfunction assignMasksToTracks(masks, tracked) {\n\treturn masks.map((mask) => {\n\t\tconst { cx, cy } = maskCentroid(mask);\n\t\tlet best = null;\n\t\tfor (const obj of tracked) {\n\t\t\tconst dx = obj.centerX - cx;\n\t\t\tconst dy = obj.centerY - cy;\n\t\t\tconst distance = dx * dx + dy * dy;\n\t\t\tif (!best || distance < best.distance) best = {\n\t\t\t\ttrackId: obj.trackId,\n\t\t\t\tdistance\n\t\t\t};\n\t\t}\n\t\treturn best ? {\n\t\t\t...mask,\n\t\t\ttrackId: best.trackId\n\t\t} : mask;\n\t});\n}\n/**\n* Grows a subject mask into connected foreground pixels — seeding a flood fill\n* from the subject through pixels that differ from the sampled backdrop recovers\n* thin or fast-moving edges (hair, fabric) without adding a near-uniform studio\n* wall or its soft grey shadow.\n*/\nfunction fillInternalHoles(mask, width, height) {\n\tconst n = width * height;\n\tconst exterior = new Uint8Array(n);\n\tconst queue = new Int32Array(n);\n\tlet tail = 0;\n\tconst seed = (i) => {\n\t\tif (exterior[i] || mask[i] > 0) return;\n\t\texterior[i] = 1;\n\t\tqueue[tail++] = i;\n\t};\n\tfor (let x = 0; x < width; x++) {\n\t\tseed(x);\n\t\tseed((height - 1) * width + x);\n\t}\n\tfor (let y = 0; y < height; y++) {\n\t\tseed(y * width);\n\t\tseed(y * width + width - 1);\n\t}\n\tlet head = 0;\n\twhile (head < tail) {\n\t\tconst i = queue[head++];\n\t\tconst x = i % width;\n\t\tlet j = i + 1;\n\t\tif (x + 1 < width && !exterior[j] && mask[j] === 0) {\n\t\t\texterior[j] = 1;\n\t\t\tqueue[tail++] = j;\n\t\t}\n\t\tj = i - 1;\n\t\tif (x > 0 && !exterior[j] && mask[j] === 0) {\n\t\t\texterior[j] = 1;\n\t\t\tqueue[tail++] = j;\n\t\t}\n\t\tj = i + width;\n\t\tif (j < n && !exterior[j] && mask[j] === 0) {\n\t\t\texterior[j] = 1;\n\t\t\tqueue[tail++] = j;\n\t\t}\n\t\tj = i - width;\n\t\tif (j >= 0 && !exterior[j] && mask[j] === 0) {\n\t\t\texterior[j] = 1;\n\t\t\tqueue[tail++] = j;\n\t\t}\n\t}\n\tfor (let i = 0; i < n; i++) if (mask[i] === 0 && exterior[i] === 0) mask[i] = 255;\n}\nfunction smoothMaskBoundary(mask, width, height, radius = 2) {\n\tif (radius <= 0) return mask;\n\tconst temp = new Uint8Array(width * height);\n\tconst out = new Uint8Array(width * height);\n\tconst div = 2 * radius + 1;\n\tfor (let y = 0; y < height; y++) {\n\t\tconst row = y * width;\n\t\tlet sum = 0;\n\t\tfor (let k = -radius; k <= radius; k++) {\n\t\t\tconst x = Math.max(0, Math.min(width - 1, k));\n\t\t\tsum += mask[row + x];\n\t\t}\n\t\tfor (let x = 0; x < width; x++) {\n\t\t\ttemp[row + x] = Math.round(sum / div);\n\t\t\tconst xOut = Math.max(0, x - radius);\n\t\t\tconst xIn = Math.min(width - 1, x + radius + 1);\n\t\t\tsum += mask[row + xIn] - mask[row + xOut];\n\t\t}\n\t}\n\tconst sums = new Float64Array(width);\n\tfor (let k = -radius; k <= radius; k++) {\n\t\tconst row = Math.max(0, Math.min(height - 1, k)) * width;\n\t\tfor (let x = 0; x < width; x++) sums[x] += temp[row + x];\n\t}\n\tfor (let y = 0; y < height; y++) {\n\t\tconst row = y * width;\n\t\tconst rowOut = Math.max(0, y - radius) * width;\n\t\tconst rowIn = Math.min(height - 1, y + radius + 1) * width;\n\t\tfor (let x = 0; x < width; x++) {\n\t\t\tout[row + x] = Math.round(sums[x] / div);\n\t\t\tsums[x] += temp[rowIn + x] - temp[rowOut + x];\n\t\t}\n\t}\n\treturn out;\n}\nfunction growMaskIntoForeground(mask, width, height, pixels, threshold, featherRadius) {\n\tlet br = 0;\n\tlet bg = 0;\n\tlet bb = 0;\n\tlet count = 0;\n\tconst sample = (x, y) => {\n\t\tconst i = y * width + x;\n\t\tif (mask[i]) return;\n\t\tconst p = i * 4;\n\t\tbr += pixels[p];\n\t\tbg += pixels[p + 1];\n\t\tbb += pixels[p + 2];\n\t\tcount++;\n\t};\n\tfor (let x = 0; x < width; x += 4) {\n\t\tsample(x, 0);\n\t\tsample(x, height - 1);\n\t}\n\tfor (let y = 0; y < height; y += 4) {\n\t\tsample(0, y);\n\t\tsample(width - 1, y);\n\t}\n\tif (count === 0) return mask;\n\tbr /= count;\n\tbg /= count;\n\tbb /= count;\n\tconst n = width * height;\n\tconst fg = new Uint8Array(n);\n\tfor (let i = 0, p = 0; i < n; i++, p += 4) fg[i] = Math.max(Math.abs(pixels[p] - br), Math.abs(pixels[p + 1] - bg), Math.abs(pixels[p + 2] - bb)) > threshold ? 1 : 0;\n\tconst queue = new Int32Array(n);\n\tlet tail = 0;\n\tfor (let i = 0; i < n; i++) if (mask[i] > 0) {\n\t\tif (fg[i]) mask[i] = 255;\n\t\tqueue[tail++] = i;\n\t}\n\tlet head = 0;\n\twhile (head < tail) {\n\t\tconst i = queue[head++];\n\t\tconst x = i % width;\n\t\tlet j = i + 1;\n\t\tif (x + 1 < width && mask[j] !== 255 && fg[j]) {\n\t\t\tmask[j] = 255;\n\t\t\tqueue[tail++] = j;\n\t\t}\n\t\tj = i - 1;\n\t\tif (x > 0 && mask[j] !== 255 && fg[j]) {\n\t\t\tmask[j] = 255;\n\t\t\tqueue[tail++] = j;\n\t\t}\n\t\tj = i + width;\n\t\tif (j < n && mask[j] !== 255 && fg[j]) {\n\t\t\tmask[j] = 255;\n\t\t\tqueue[tail++] = j;\n\t\t}\n\t\tj = i - width;\n\t\tif (j >= 0 && mask[j] !== 255 && fg[j]) {\n\t\t\tmask[j] = 255;\n\t\t\tqueue[tail++] = j;\n\t\t}\n\t}\n\tfillInternalHoles(mask, width, height);\n\treturn smoothMaskBoundary(mask, width, height, featherRadius !== void 0 && featherRadius > 0 ? Math.max(1, Math.min(8, Math.round(featherRadius * 50))) : 2);\n}\nfunction maskCentroid(mask) {\n\tconst { mask: data, width, height } = mask;\n\tlet sumX = 0;\n\tlet sumY = 0;\n\tlet count = 0;\n\tfor (let y = 0; y < height; y++) {\n\t\tconst row = y * width;\n\t\tfor (let x = 0; x < width; x++) if (data[row + x] > 0) {\n\t\t\tsumX += x;\n\t\t\tsumY += y;\n\t\t\tcount++;\n\t\t}\n\t}\n\tif (count === 0) return {\n\t\tcx: 0,\n\t\tcy: 0\n\t};\n\treturn {\n\t\tcx: sumX / count,\n\t\tcy: sumY / count\n\t};\n}\nconst VisionWebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetView, targetWidth, targetHeight, props, drawChild } = args;\n\tconst { virtualMedia } = props;\n\tsetVisionDevice(ctx.device);\n\tconst rawOp = virtualMedia?.operation;\n\tif (rawOp?.op !== \"Vision\") return;\n\tconst op = rawOp;\n\tpass.end();\n\tconst childMedia = virtualMedia?.children?.[0];\n\tif (!childMedia) return;\n\tif (op.mode === \"depth\") {\n\t\tdrawClipDepth(ctx, encoder, targetView, targetWidth, targetHeight, op.effect, props.sourceTimeSec === void 0 ? props.frame ?? 0 : props.sourceTimeSec * (props.fps ?? 24), props.fps ?? 24);\n\t\treturn;\n\t}\n\tconst effectKey = op.effect;\n\tconst hasEffectKey = effectKey !== void 0 && effectKey !== null;\n\tconst nodeKeyStr = virtualMedia?.id ?? rawOp?.id ?? `${targetWidth}x${targetHeight}_${op.mode}_${op.variant}_${op.keyBackground}_${op.backgroundKeyThreshold}`;\n\tconst fallbackKey = `vision-${nodeKeyStr}`;\n\tlet childTex = hasEffectKey ? childTexturesByEffect.get(effectKey) : childTexturesByKey.get(fallbackKey);\n\tif (childTex && (childTex.width !== targetWidth || childTex.height !== targetHeight)) {\n\t\tchildTex.destroy();\n\t\tchildTex = void 0;\n\t\tif (hasEffectKey) childTexturesByEffect.delete(effectKey);\n\t\telse childTexturesByKey.delete(fallbackKey);\n\t}\n\tconst hasPreviousFrame = childTex !== void 0;\n\tif (!childTex) {\n\t\tchildTex = ctx.device.createTexture({\n\t\t\tsize: [targetWidth, targetHeight],\n\t\t\tformat: ctx.renderer.format,\n\t\t\tusage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_SRC,\n\t\t\tlabel: \"vision_child_persistent\"\n\t\t});\n\t\tif (hasEffectKey) childTexturesByEffect.set(effectKey, childTex);\n\t\telse childTexturesByKey.set(fallbackKey, childTex);\n\t\tif (childTexturesByKey.size > 4) {\n\t\t\tconst oldest = childTexturesByKey.keys().next().value;\n\t\t\tif (oldest && oldest !== fallbackKey) {\n\t\t\t\tchildTexturesByKey.get(oldest)?.destroy();\n\t\t\t\tchildTexturesByKey.delete(oldest);\n\t\t\t}\n\t\t}\n\t}\n\tconst frameIdx = props.frame ?? 0;\n\tconst compositionFrame = props.compositionFrame ?? frameIdx;\n\tconst fps = props.fps ?? 24;\n\tconst mode = op.mode ?? \"passthrough\";\n\tconst isMatteMode = mode === \"mask\" || mode === \"matte\" || mode === \"crop\";\n\tconst visionBundle = op.visionBundle ?? virtualMedia.visionBundle;\n\tconst wantsDetection = op.enableDetection !== false || mode === \"boxes\" || mode === \"tracking\";\n\tconst wantsSegmentation = op.enableSegmentation === true || isMatteMode && op.matteSource !== \"selfie\";\n\tconst wantsSelfie = op.enableMatte === true || isMatteMode && op.matteSource === \"selfie\";\n\tconst wantsPose = op.enablePose === true || mode === \"skeleton\";\n\tconst clipSubject = isMatteMode && !visionBundle && !wantsPose && !wantsSelfie && op.keyBackground !== true ? clipSubjectFor(effectKey, props.sourceTimeSec === void 0 ? frameIdx : props.sourceTimeSec * fps, fps, targetWidth, targetHeight) : void 0;\n\tconst clipPose = mode === \"skeleton\" && !visionBundle ? clipPoseFor(effectKey, props.sourceTimeSec === void 0 ? frameIdx : props.sourceTimeSec * fps, fps, targetWidth, targetHeight) : void 0;\n\tconst fromClip = clipSubject !== void 0 || clipPose !== void 0;\n\tconst cacheable = !fromClip && !wantsSelfie && !wantsPose && (wantsDetection || wantsSegmentation);\n\tconst source = cacheable ? cacheSource(nodeKeyStr, childMedia, op, targetWidth, targetHeight) : \"\";\n\tconst keyThresholdAt = (frame$1) => op.keyBackground === true ? backgroundKeyThreshold(op, compositionFrame - (frameIdx - frame$1), fps) : void 0;\n\tconst lookup = (frame$1) => {\n\t\tif (!cacheable || frame$1 === void 0) return void 0;\n\t\tconst hit = frameCache.get(source, frame$1);\n\t\tif (!hit || hit.keyThreshold !== keyThresholdAt(frame$1)) return void 0;\n\t\tif (wantsSegmentation && visionBundle && !hit.masks) return void 0;\n\t\treturn hit;\n\t};\n\tconst heldFrame = hasPreviousFrame ? heldFrameByNode.get(nodeKeyStr) : void 0;\n\tlet cached = lookup(frameIdx);\n\tconst exact = fromClip || cached !== void 0;\n\tif (!cached) cached = lookup(heldFrame);\n\tlet heldTex;\n\tif (isMatteMode && hasPreviousFrame && !exact) {\n\t\theldTex = heldTexture(ctx.device, nodeKeyStr, childTex);\n\t\tencoder.copyTextureToTexture({ texture: childTex }, { texture: heldTex }, [\n\t\t\ttargetWidth,\n\t\t\ttargetHeight,\n\t\t\t1\n\t\t]);\n\t}\n\tlet frame;\n\tlet framePixels = null;\n\tif (hasPreviousFrame && !cached && !fromClip) {\n\t\tconst analysis = analysisTexture(ctx.device, nodeKeyStr, childTex);\n\t\tconst copy = ctx.device.createCommandEncoder({ label: \"vision_analysis_copy\" });\n\t\tcopy.copyTextureToTexture({ texture: childTex }, { texture: analysis }, [\n\t\t\ttargetWidth,\n\t\t\ttargetHeight,\n\t\t\t1\n\t\t]);\n\t\tctx.device.queue.submit([copy.finish()]);\n\t\tframe = {\n\t\t\ttexture: analysis,\n\t\t\tdevice: ctx.device,\n\t\t\twidth: targetWidth,\n\t\t\theight: targetHeight\n\t\t};\n\t\tif (isMatteMode && op.keyBackground === true) framePixels = (await readTexturePixels(frame)).data;\n\t}\n\tconst childView = childTex.createView();\n\tctx.renderer.beginFrame(encoder, childView, {\n\t\tr: 0,\n\t\tg: 0,\n\t\tb: 0,\n\t\ta: 0\n\t}, targetWidth, targetHeight, \"clear\").end();\n\tawait drawChild(childMedia, { ...props }, childView, childTex, targetWidth, targetHeight);\n\theldFrameByNode.set(nodeKeyStr, frameIdx);\n\tlet frameObjects = [];\n\tlet frameMasks = [];\n\tlet personMatte;\n\tlet currentPoseRes;\n\tlet subject;\n\tif (fromClip) {\n\t\tsubject = clipSubject ?? void 0;\n\t\tif (subject) lastSubjectByNode.set(nodeKeyStr, {\n\t\t\tmask: subject,\n\t\t\tframe: frameIdx\n\t\t});\n\t\telse lastSubjectByNode.delete(nodeKeyStr);\n\t} else if (cached) {\n\t\tframeObjects = cached.objects;\n\t\tif (wantsDetection) visionBundle?.setObjectResult(frameIdx, {\n\t\t\tobjects: cached.objects,\n\t\t\trawDetections: cached.detections\n\t\t});\n\t\tif (wantsSegmentation && visionBundle && cached.masks) {\n\t\t\tframeMasks = cached.masks.map(fromCachedMask);\n\t\t\tvisionBundle.setMaskResult(frameIdx, frameMasks);\n\t\t}\n\t\tif (cached.subject) {\n\t\t\tsubject = fromCachedMask(cached.subject.mask);\n\t\t\tlastSubjectByNode.set(nodeKeyStr, {\n\t\t\t\tmask: subject,\n\t\t\t\tframe: frameIdx\n\t\t\t});\n\t\t}\n\t} else if (frame) {\n\t\tconst runner = getSharedRunner(op);\n\t\tconst image = frame;\n\t\tlet detections = [];\n\t\tif (wantsDetection) {\n\t\t\tdetections = await runner.detect(image);\n\t\t\tconst tracker = getObjectTracker(nodeKeyStr, op);\n\t\t\tif (frameIdx === 0) tracker.reset();\n\t\t\tframeObjects = tracker.update(detections, frameIdx, fps);\n\t\t\tvisionBundle?.setObjectResult(frameIdx, {\n\t\t\t\tobjects: frameObjects,\n\t\t\t\trawDetections: detections\n\t\t\t});\n\t\t}\n\t\tlet subjectMasks = [];\n\t\tif (wantsSegmentation) {\n\t\t\tconst subjectFromAllClasses = isMatteMode && op.matteSource !== \"selfie\" && op.classes !== void 0;\n\t\t\tconst segRes = await (subjectFromAllClasses ? getSharedRunner({\n\t\t\t\t...op,\n\t\t\t\tclasses: void 0\n\t\t\t}) : runner).segment(image);\n\t\t\tframeMasks = assignMasksToTracks(subjectFromAllClasses ? segRes.masks.filter((m) => matchesClasses(m.category, op.classes)) : segRes.masks, frameObjects);\n\t\t\tsubjectMasks = subjectFromAllClasses ? segRes.masks : frameMasks;\n\t\t\tvisionBundle?.setMaskResult(frameIdx, frameMasks);\n\t\t}\n\t\tif (wantsSelfie) {\n\t\t\tpersonMatte = await runner.matte(image);\n\t\t\tvisionBundle?.setMatteResult(frameIdx, personMatte);\n\t\t}\n\t\tif (wantsPose) {\n\t\t\tcurrentPoseRes = { people: matchPoseToTracks(normalizePoseKeypoints(await runner.pose(image), image.width, image.height).people, frameObjects) };\n\t\t\tvisionBundle?.setPoseResult(frameIdx, currentPoseRes);\n\t\t}\n\t\tif (isMatteMode) {\n\t\t\tsubject = selectSubject(op.matteSource === \"selfie\" ? personMatteAsMask(personMatte) : mergeSubjectMask(subjectMasks.length > 0 ? subjectMasks : visionBundle?.getMaskResult(frameIdx) ?? [], { classes: op.classes }), nodeKeyStr, frameIdx);\n\t\t\tconst threshold = keyThresholdAt(heldFrame ?? frameIdx);\n\t\t\tif (subject && threshold !== void 0 && framePixels) subject = {\n\t\t\t\t...subject,\n\t\t\t\tmask: growMaskIntoForeground(subject.mask, subject.width, subject.height, framePixels, threshold, op.featherRadius)\n\t\t\t};\n\t\t}\n\t\tif (cacheable && heldFrame !== void 0) frameCache.set(source, heldFrame, {\n\t\t\tdetections,\n\t\t\tobjects: frameObjects,\n\t\t\tmasks: visionBundle ? frameMasks.map(toCachedMask) : null,\n\t\t\tsubject: subject ? { mask: toCachedMask(subject) } : null,\n\t\t\tkeyThreshold: keyThresholdAt(heldFrame)\n\t\t});\n\t}\n\tif (isMatteMode) {\n\t\tconst picture = exact ? childTex : heldTex;\n\t\tif (!subject || !picture) {\n\t\t\tctx.renderer.beginFrame(encoder, targetView, {\n\t\t\t\tr: 0,\n\t\t\t\tg: 0,\n\t\t\t\tb: 0,\n\t\t\t\ta: 0\n\t\t\t}, targetWidth, targetHeight, \"clear\").end();\n\t\t\treturn;\n\t\t}\n\t\tif (!sharedCompositor || sharedCompositorFormat !== ctx.renderer.format) {\n\t\t\tsharedCompositor = new MatteCompositor(ctx.device, ctx.renderer.format);\n\t\t\tsharedCompositorFormat = ctx.renderer.format;\n\t\t}\n\t\tconst maskTex = sharedCompositor.uploadMask(nodeKeyStr, subject.mask, subject.width, subject.height);\n\t\tconst matteTex = matteTexture(ctx.device, nodeKeyStr, childTex);\n\t\tsharedCompositor.draw(encoder, matteTex.createView(), picture, maskTex, mode, mode === \"crop\" ? maskBounds(subject) ?? void 0 : void 0);\n\t\tvisionBundle?.setStencilTexture(matteTex);\n\t\tconst outPass$1 = ctx.renderer.beginFrame(encoder, targetView, {\n\t\t\tr: 0,\n\t\t\tg: 0,\n\t\t\tb: 0,\n\t\t\ta: 0\n\t\t}, targetWidth, targetHeight, \"clear\");\n\t\tctx.renderer.drawTexture(outPass$1, matteTex, {\n\t\t\tx: 0,\n\t\t\ty: 0,\n\t\t\twidth: targetWidth,\n\t\t\theight: targetHeight\n\t\t});\n\t\toutPass$1.end();\n\t\treturn;\n\t}\n\tif (mode === \"skeleton\") {\n\t\tif (!sharedSkeletonRenderer) sharedSkeletonRenderer = new PoseSkeletonRenderer(ctx.device);\n\t\tconst keypoints = clipPose !== void 0 ? clipPose : (visionBundle?.getPoseResult(frameIdx) ?? currentPoseRes)?.people[0]?.keypoints;\n\t\tconst skelPass = ctx.renderer.beginFrame(encoder, targetView, {\n\t\t\tr: 0,\n\t\t\tg: 0,\n\t\t\tb: 0,\n\t\t\ta: 0\n\t\t}, targetWidth, targetHeight, \"clear\");\n\t\tif (keypoints && keypoints.length > 0) {\n\t\t\tconst skelTex = sharedSkeletonRenderer.renderToTexture(keypoints, {\n\t\t\t\twidth: targetWidth,\n\t\t\t\theight: targetHeight\n\t\t\t});\n\t\t\tctx.renderer.drawTexture(skelPass, skelTex, {\n\t\t\t\tx: 0,\n\t\t\t\ty: 0,\n\t\t\t\twidth: targetWidth,\n\t\t\t\theight: targetHeight\n\t\t\t});\n\t\t}\n\t\tskelPass.end();\n\t\treturn;\n\t}\n\tif (mode === \"boxes\" || mode === \"tracking\") {\n\t\tconst outPass$1 = ctx.renderer.beginFrame(encoder, targetView, {\n\t\t\tr: 0,\n\t\t\tg: 0,\n\t\t\tb: 0,\n\t\t\ta: 0\n\t\t}, targetWidth, targetHeight, \"clear\");\n\t\tctx.renderer.drawTexture(outPass$1, childTex, {\n\t\t\tx: 0,\n\t\t\ty: 0,\n\t\t\twidth: targetWidth,\n\t\t\theight: targetHeight\n\t\t});\n\t\tconst objects = frameObjects.length > 0 ? frameObjects : visionBundle?.getObjectResult(frameIdx).objects ?? [];\n\t\tif (objects.length > 0) {\n\t\t\tconst boxColor = \"#38bdf8\";\n\t\t\tconst stroke = 2;\n\t\t\tfor (const obj of objects) {\n\t\t\t\tif (!obj.active) continue;\n\t\t\t\tconst b = obj.boundingBox;\n\t\t\t\tctx.renderer.drawRect(outPass$1, {\n\t\t\t\t\tx: b.originX,\n\t\t\t\t\ty: b.originY,\n\t\t\t\t\twidth: b.width,\n\t\t\t\t\theight: stroke\n\t\t\t\t}, boxColor);\n\t\t\t\tctx.renderer.drawRect(outPass$1, {\n\t\t\t\t\tx: b.originX,\n\t\t\t\t\ty: b.originY + b.height - stroke,\n\t\t\t\t\twidth: b.width,\n\t\t\t\t\theight: stroke\n\t\t\t\t}, boxColor);\n\t\t\t\tctx.renderer.drawRect(outPass$1, {\n\t\t\t\t\tx: b.originX,\n\t\t\t\t\ty: b.originY,\n\t\t\t\t\twidth: stroke,\n\t\t\t\t\theight: b.height\n\t\t\t\t}, boxColor);\n\t\t\t\tctx.renderer.drawRect(outPass$1, {\n\t\t\t\t\tx: b.originX + b.width - stroke,\n\t\t\t\t\ty: b.originY,\n\t\t\t\t\twidth: stroke,\n\t\t\t\t\theight: b.height\n\t\t\t\t}, boxColor);\n\t\t\t\tconst cornerLen = Math.min(16, b.width / 4, b.height / 4);\n\t\t\t\tctx.renderer.drawRect(outPass$1, {\n\t\t\t\t\tx: b.originX,\n\t\t\t\t\ty: b.originY,\n\t\t\t\t\twidth: cornerLen,\n\t\t\t\t\theight: stroke * 2\n\t\t\t\t}, \"#ffffff\");\n\t\t\t\tctx.renderer.drawRect(outPass$1, {\n\t\t\t\t\tx: b.originX,\n\t\t\t\t\ty: b.originY,\n\t\t\t\t\twidth: stroke * 2,\n\t\t\t\t\theight: cornerLen\n\t\t\t\t}, \"#ffffff\");\n\t\t\t\tif (mode === \"tracking\") ctx.renderer.drawRect(outPass$1, {\n\t\t\t\t\tx: obj.centerX - 3,\n\t\t\t\t\ty: obj.centerY - 3,\n\t\t\t\t\twidth: 6,\n\t\t\t\t\theight: 6\n\t\t\t\t}, \"#ef4444\", 3);\n\t\t\t}\n\t\t}\n\t\toutPass$1.end();\n\t\treturn;\n\t}\n\tconst outPass = ctx.renderer.beginFrame(encoder, targetView, {\n\t\tr: 0,\n\t\tg: 0,\n\t\tb: 0,\n\t\ta: 0\n\t}, targetWidth, targetHeight, \"clear\");\n\tctx.renderer.drawTexture(outPass, childTex, {\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth: targetWidth,\n\t\theight: targetHeight\n\t});\n\toutPass.end();\n};\n/**\n* The subject a linked `comp.vision` clip holds for a source frame (see\n* CLIP_SUBJECT). Its mask is in source pixels; the composite samples it by\n* uv, so it fits any target of the same aspect. Other shapes fall back.\n*/\nfunction clipSubjectFor(effect, frame, fps, width, height) {\n\tconst source = linkedClip(effect);\n\tconst subject = source?.subject(frame, fps);\n\tif (!subject || !source) return subject;\n\treturn fitsTarget(source, subject.width / subject.height, width / height) ? subject : void 0;\n}\n/**\n* The pose a linked `comp.vision` clip matched to its subject for a source\n* frame, normalized to the source; it fits targets of the same aspect.\n*/\nfunction clipPoseFor(effect, frame, fps, width, height) {\n\tconst source = linkedClip(effect);\n\tconst pose = source?.pose?.(frame, fps);\n\tif (!pose || !source) return pose === null ? null : void 0;\n\treturn fitsTarget(source, pose.width / pose.height, width / height) ? pose.keypoints : void 0;\n}\n/** Per-node upload target for depth frames (the depth model's resolution). */\nconst depthTextures = /* @__PURE__ */ new WeakMap();\n/**\n* Depth mode: the linked `comp.vision` clip's depth for this source frame as\n* gray (white = near), stretched over the layer. Depth is analysed ahead of\n* the render, so it belongs to this frame's pixels, never the previous one's.\n*/\nfunction drawClipDepth(ctx, encoder, targetView, width, height, effect, frame, fps) {\n\tconst source = linkedClip(effect);\n\tif (!source?.depth) throw new Error(\"A depth layer reads its clip's depth: add the video to the composition (framefields links it to a `comp.vision(src, { depth: true })` clip).\");\n\tconst depth = source.depth(frame, fps);\n\tconst pass = ctx.renderer.beginFrame(encoder, targetView, {\n\t\tr: 0,\n\t\tg: 0,\n\t\tb: 0,\n\t\ta: 0\n\t}, width, height, \"clear\");\n\tif (depth) {\n\t\tif (Math.abs(depth.width / depth.height / (width / height) - 1) > .02) throw new Error(`A depth layer keeps its clip's aspect ratio (${depth.width}×${depth.height} source vs a ${width}×${height} layer); crop after the depth layer instead.`);\n\t\tlet tex = effect ? depthTextures.get(effect) : void 0;\n\t\tif (!tex || tex.width !== depth.width || tex.height !== depth.height) {\n\t\t\ttex?.destroy();\n\t\t\ttex = ctx.device.createTexture({\n\t\t\t\tsize: [depth.width, depth.height],\n\t\t\t\tformat: \"rgba8unorm\",\n\t\t\t\tusage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST,\n\t\t\t\tlabel: \"vision_depth\"\n\t\t\t});\n\t\t\tif (effect) depthTextures.set(effect, tex);\n\t\t}\n\t\tconst gray = new Uint8Array(depth.width * depth.height * 4);\n\t\tfor (let i = 0; i < depth.data.length; i++) {\n\t\t\tconst v = Math.round(depth.data[i] * 255);\n\t\t\tgray.set([\n\t\t\t\tv,\n\t\t\t\tv,\n\t\t\t\tv,\n\t\t\t\t255\n\t\t\t], i * 4);\n\t\t}\n\t\tctx.device.queue.writeTexture({ texture: tex }, gray, { bytesPerRow: depth.width * 4 }, [depth.width, depth.height]);\n\t\tctx.renderer.drawTexture(pass, tex, {\n\t\t\tx: 0,\n\t\t\ty: 0,\n\t\t\twidth,\n\t\t\theight\n\t\t});\n\t}\n\tpass.end();\n}\nfunction linkedClip(effect) {\n\treturn effect?.[CLIP_SUBJECT];\n}\n/** Source results map onto a target of the same aspect; a prompted clip must not fall back. */\nfunction fitsTarget(source, sourceAspect, targetAspect) {\n\tif (Math.abs(sourceAspect / targetAspect - 1) < .01) return true;\n\tif (source.exact) throw new Error(\"A prompted clip matte requires the source aspect ratio. Apply layout cropping after the source matte.\");\n\treturn false;\n}\n/** Adapts a Selfie Segmenter matte to the instance-mask shape the composite path takes. */\nfunction personMatteAsMask(matte) {\n\tif (!matte || matte.coverage <= 0) return void 0;\n\tconst area = Math.round(matte.coverage * matte.width * matte.height);\n\treturn {\n\t\tcategory: \"person\",\n\t\tmask: matte.mask,\n\t\twidth: matte.width,\n\t\theight: matte.height,\n\t\tarea,\n\t\tcoverage: matte.coverage,\n\t\tdetectionIndex: -1\n\t};\n}\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: VisionWebGPURenderer });\n\n//#endregion\nexport { renderers_default as t };\n//# sourceMappingURL=renderers-DF17E3A-.mjs.map"],"mappings":"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"}
1
+ {"version":3,"file":"renderer-Dt4sqNEu.mjs","names":[],"sources":["../../../nodes/node-vision/dist/renderers-DF17E3A-.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { CLIP_SUBJECT, PoseSkeletonRenderer, TemporalObjectTracker, VisionRunner, maskBounds, matchPoseToTracks, mergeSubjectMask, readTexturePixels, setVisionDevice } from \"@framefields/vision\";\n\n//#region src/renderers/frame-cache.ts\nlet scratchValues = new Uint8Array(0);\nlet scratchLengths = new Uint32Array(0);\nfunction encodeMask(mask, width, height) {\n\tif (scratchValues.length < mask.length) {\n\t\tscratchValues = new Uint8Array(mask.length);\n\t\tscratchLengths = new Uint32Array(mask.length);\n\t}\n\tconst values = scratchValues;\n\tconst lengths = scratchLengths;\n\tlet runs = 0;\n\tlet start = 0;\n\tfor (let i = 1; i <= mask.length; i++) if (i === mask.length || mask[i] !== mask[start]) {\n\t\tvalues[runs] = mask[start];\n\t\tlengths[runs] = i - start;\n\t\truns++;\n\t\tstart = i;\n\t}\n\treturn {\n\t\twidth,\n\t\theight,\n\t\tvalues: values.slice(0, runs),\n\t\tlengths: lengths.slice(0, runs)\n\t};\n}\nfunction decodeMask(rle) {\n\tconst out = new Uint8Array(rle.width * rle.height);\n\tlet at = 0;\n\tfor (let r = 0; r < rle.values.length; r++) {\n\t\tconst end = at + rle.lengths[r];\n\t\tif (rle.values[r] !== 0) out.fill(rle.values[r], at, end);\n\t\tat = end;\n\t}\n\treturn out;\n}\nfunction rleBytes(rle) {\n\treturn rle.values.byteLength + rle.lengths.byteLength;\n}\nfunction toCachedMask(mask) {\n\tconst { mask: data, ...rest } = mask;\n\treturn {\n\t\t...rest,\n\t\trle: encodeMask(data, mask.width, mask.height)\n\t};\n}\nfunction fromCachedMask(mask) {\n\tconst { rle, ...rest } = mask;\n\treturn {\n\t\t...rest,\n\t\tmask: decodeMask(rle)\n\t};\n}\nfunction resultBytes(result) {\n\tlet bytes = 512 + result.detections.length * 128 + result.objects.length * 256;\n\tfor (const m of result.masks ?? []) bytes += rleBytes(m.rle);\n\tif (result.subject) bytes += rleBytes(result.subject.mask.rle);\n\treturn bytes;\n}\n/** Results by source (node + inference settings) and frame, least recently used out first. */\nvar VisionFrameCache = class {\n\tentries = /* @__PURE__ */ new Map();\n\tbytes = 0;\n\tconstructor(maxBytes = 256 * 1024 * 1024) {\n\t\tthis.maxBytes = maxBytes;\n\t}\n\tget(source, frame) {\n\t\tconst key = `${source}#${frame}`;\n\t\tconst hit = this.entries.get(key);\n\t\tif (hit) {\n\t\t\tthis.entries.delete(key);\n\t\t\tthis.entries.set(key, hit);\n\t\t}\n\t\treturn hit;\n\t}\n\tset(source, frame, result) {\n\t\tconst key = `${source}#${frame}`;\n\t\tconst old = this.entries.get(key);\n\t\tif (old) {\n\t\t\tthis.bytes -= resultBytes(old);\n\t\t\tthis.entries.delete(key);\n\t\t}\n\t\tthis.entries.set(key, result);\n\t\tthis.bytes += resultBytes(result);\n\t\tfor (const [k, v] of this.entries) {\n\t\t\tif (this.bytes <= this.maxBytes) break;\n\t\t\tthis.entries.delete(k);\n\t\t\tthis.bytes -= resultBytes(v);\n\t\t}\n\t}\n\tclear() {\n\t\tthis.entries.clear();\n\t\tthis.bytes = 0;\n\t}\n\tget size() {\n\t\treturn this.entries.size;\n\t}\n};\n\n//#endregion\n//#region src/renderers/matte-compositor.ts\n/**\n* GPU composite for the mask-family modes: the picture times the subject mask,\n* in one full-screen pass. Replaces building the RGBA result on the CPU and\n* uploading it; only the 8-bit mask goes to the GPU.\n*\n* - matte: picture × mask (premultiplied, so the background is transparent)\n* - mask: white silhouette (rgb = mask, a = 1)\n* - crop: matte, with the subject's bounding box stretched to the frame\n*/\nconst WGSL = `\nstruct Params {\n\tmode: u32, // 0 matte, 1 mask, 2 crop\n\t_pad: u32,\n\tcropMin: vec2<f32>, // uv of the subject bounds (crop)\n\tcropMax: vec2<f32>,\n\t_pad2: vec2<f32>,\n};\n\n@group(0) @binding(0) var<uniform> params: Params;\n@group(0) @binding(1) var picture: texture_2d<f32>;\n@group(0) @binding(2) var mask: texture_2d<f32>;\n@group(0) @binding(3) var samp: sampler;\n\nstruct VSOut {\n\t@builtin(position) pos: vec4<f32>,\n\t@location(0) uv: vec2<f32>,\n};\n\n@vertex fn vs(@builtin(vertex_index) i: u32) -> VSOut {\n\tvar p = array<vec2<f32>, 3>(vec2(-1.0, -1.0), vec2(3.0, -1.0), vec2(-1.0, 3.0));\n\tvar out: VSOut;\n\tout.pos = vec4(p[i], 0.0, 1.0);\n\tout.uv = vec2(p[i].x * 0.5 + 0.5, 0.5 - p[i].y * 0.5);\n\treturn out;\n}\n\n@fragment fn fs(in: VSOut) -> @location(0) vec4<f32> {\n\tvar uv = in.uv;\n\tif (params.mode == 2u) {\n\t\tuv = mix(params.cropMin, params.cropMax, uv);\n\t}\n\tlet m = textureSampleLevel(mask, samp, uv, 0.0).r;\n\tif (params.mode == 1u) {\n\t\treturn vec4(m, m, m, 1.0);\n\t}\n\treturn textureSampleLevel(picture, samp, uv, 0.0) * m;\n}\n`;\nvar MatteCompositor = class {\n\tpipeline;\n\tsampler;\n\tuniforms = [];\n\tuniformIndex = 0;\n\t/** One 8-bit mask texture per node, rewritten each frame. */\n\tmasks = /* @__PURE__ */ new Map();\n\tconstructor(device, format) {\n\t\tthis.device = device;\n\t\tconst module = device.createShaderModule({\n\t\t\tlabel: \"vision_matte_composite\",\n\t\t\tcode: WGSL\n\t\t});\n\t\tthis.pipeline = device.createRenderPipeline({\n\t\t\tlabel: \"vision_matte_composite\",\n\t\t\tlayout: \"auto\",\n\t\t\tvertex: {\n\t\t\t\tmodule,\n\t\t\t\tentryPoint: \"vs\"\n\t\t\t},\n\t\t\tfragment: {\n\t\t\t\tmodule,\n\t\t\t\tentryPoint: \"fs\",\n\t\t\t\ttargets: [{ format }]\n\t\t\t},\n\t\t\tprimitive: { topology: \"triangle-list\" }\n\t\t});\n\t\tthis.sampler = device.createSampler({\n\t\t\tmagFilter: \"linear\",\n\t\t\tminFilter: \"linear\"\n\t\t});\n\t}\n\t/** Uploads a frame-sized 0..255 mask for `key` and returns its texture. */\n\tuploadMask(key, mask, width, height) {\n\t\tlet tex = this.masks.get(key);\n\t\tif (!tex || tex.width !== width || tex.height !== height) {\n\t\t\ttex?.destroy();\n\t\t\ttex = this.device.createTexture({\n\t\t\t\tlabel: `vision_mask_${key}`,\n\t\t\t\tsize: [width, height],\n\t\t\t\tformat: \"r8unorm\",\n\t\t\t\tusage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST\n\t\t\t});\n\t\t\tthis.masks.set(key, tex);\n\t\t}\n\t\tconst aligned = Math.ceil(width / 256) * 256;\n\t\tlet bytes = mask;\n\t\tif (aligned !== width) {\n\t\t\tbytes = new Uint8Array(aligned * height);\n\t\t\tfor (let y = 0; y < height; y++) bytes.set(mask.subarray(y * width, (y + 1) * width), y * aligned);\n\t\t}\n\t\tthis.device.queue.writeTexture({ texture: tex }, bytes.buffer, {\n\t\t\toffset: bytes.byteOffset,\n\t\t\tbytesPerRow: aligned,\n\t\t\trowsPerImage: height\n\t\t}, {\n\t\t\twidth,\n\t\t\theight\n\t\t});\n\t\treturn tex;\n\t}\n\t/** Clears `target` and draws `picture` through `mask` into it. */\n\tdraw(encoder, target, picture, mask, mode, bounds) {\n\t\tconst w = mask.width;\n\t\tconst h = mask.height;\n\t\tconst data = new Float32Array(8);\n\t\tconst view = new Uint32Array(data.buffer);\n\t\tview[0] = mode === \"matte\" ? 0 : mode === \"mask\" ? 1 : 2;\n\t\tif (mode === \"crop\" && bounds) {\n\t\t\tdata[2] = bounds.x0 / w;\n\t\t\tdata[3] = bounds.y0 / h;\n\t\t\tdata[4] = (bounds.x1 + 1) / w;\n\t\t\tdata[5] = (bounds.y1 + 1) / h;\n\t\t} else {\n\t\t\tdata[2] = 0;\n\t\t\tdata[3] = 0;\n\t\t\tdata[4] = 1;\n\t\t\tdata[5] = 1;\n\t\t\tif (mode === \"crop\") view[0] = 0;\n\t\t}\n\t\tif (this.uniformIndex >= this.uniforms.length) this.uniforms.push(this.device.createBuffer({\n\t\t\tsize: data.byteLength,\n\t\t\tusage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST\n\t\t}));\n\t\tconst uniform = this.uniforms[this.uniformIndex];\n\t\tthis.uniformIndex = (this.uniformIndex + 1) % 16;\n\t\tthis.device.queue.writeBuffer(uniform, 0, data);\n\t\tconst bindGroup = this.device.createBindGroup({\n\t\t\tlayout: this.pipeline.getBindGroupLayout(0),\n\t\t\tentries: [\n\t\t\t\t{\n\t\t\t\t\tbinding: 0,\n\t\t\t\t\tresource: { buffer: uniform }\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 1,\n\t\t\t\t\tresource: picture.createView()\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 2,\n\t\t\t\t\tresource: mask.createView()\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 3,\n\t\t\t\t\tresource: this.sampler\n\t\t\t\t}\n\t\t\t]\n\t\t});\n\t\tconst pass = encoder.beginRenderPass({\n\t\t\tlabel: \"vision_matte_composite\",\n\t\t\tcolorAttachments: [{\n\t\t\t\tview: target,\n\t\t\t\tloadOp: \"clear\",\n\t\t\t\tstoreOp: \"store\",\n\t\t\t\tclearValue: {\n\t\t\t\t\tr: 0,\n\t\t\t\t\tg: 0,\n\t\t\t\t\tb: 0,\n\t\t\t\t\ta: 0\n\t\t\t\t}\n\t\t\t}]\n\t\t});\n\t\tpass.setPipeline(this.pipeline);\n\t\tpass.setBindGroup(0, bindGroup);\n\t\tpass.draw(3);\n\t\tpass.end();\n\t}\n};\n\n//#endregion\n//#region src/renderers/webgpu-renderer.ts\n/**\n* Runners by model options (variant, models dir, mirror), each with the runners\n* derived from it by decode options — layers that differ only in classes or\n* confidence share sessions instead of reloading the models.\n*/\nconst sharedRunners = /* @__PURE__ */ new Map();\nconst MAX_SHARED_RUNNERS = 4;\nlet sharedSkeletonRenderer = null;\nlet sharedCompositor = null;\nlet sharedCompositorFormat = null;\n/** Analysed frames, shared by every vision node in the process. */\nconst frameCache = new VisionFrameCache();\n/** The frame each node's child texture holds (drawn on its last call). */\nconst heldFrameByNode = /* @__PURE__ */ new Map();\n/** Per node: a copy of the held frame, the frame being analysed, and the composited matte. */\nconst heldTextures = /* @__PURE__ */ new Map();\nconst analysisTextures = /* @__PURE__ */ new Map();\nconst matteTextures = /* @__PURE__ */ new Map();\n/** One tracker per vision node — track ids must not mix across nodes/sources. */\nconst objectTrackers = /* @__PURE__ */ new Map();\n/**\n* Persistent per-node child textures. The shared frame encoder is submitted at\n* the END of the frame, so a node renderer cannot read back the child it just\n* drew. We keep the texture around and read back the PREVIOUS frame's pixels at\n* the start of the next call — a stable one-frame delay instead of the\n* unpredictable multi-frame lag you get from pooled textures.\n*\n* Keyed on the stable Vision `Effect` instance (render ids change every frame),\n* with a size-keyed fallback for raw operation nodes.\n*/\nconst childTexturesByEffect = /* @__PURE__ */ new WeakMap();\nconst childTexturesByKey = /* @__PURE__ */ new Map();\n/**\n* Last successful subject mask, reused for a few frames when the model misses —\n* a transient miss then holds the silhouette instead of flashing the raw plate.\n* Keyed per node/effect so multiple vision nodes do not collide.\n*/\nconst lastSubjectByNode = /* @__PURE__ */ new Map();\nconst SUBJECT_HOLD_FRAMES = 3;\n/** A per-node texture shaped like `like`, recreated when the size changes. */\nfunction nodeTexture(textures, device, key, like, usage, label) {\n\tlet tex = textures.get(key);\n\tif (!tex || tex.width !== like.width || tex.height !== like.height || tex.format !== like.format) {\n\t\ttex?.destroy();\n\t\ttex = device.createTexture({\n\t\t\tsize: [like.width, like.height],\n\t\t\tformat: like.format,\n\t\t\tusage,\n\t\t\tlabel\n\t\t});\n\t\ttextures.set(key, tex);\n\t}\n\treturn tex;\n}\nconst heldTexture = (device, key, like) => nodeTexture(heldTextures, device, key, like, GPUTextureUsage.COPY_DST | GPUTextureUsage.TEXTURE_BINDING, \"vision_held_frame\");\nconst analysisTexture = (device, key, like) => nodeTexture(analysisTextures, device, key, like, GPUTextureUsage.COPY_DST | GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_SRC, \"vision_analysis_frame\");\nconst matteTexture = (device, key, like) => nodeTexture(matteTextures, device, key, like, GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_SRC, \"vision_matte\");\n/** Everything that decides a frame's results besides the frame itself. */\nfunction cacheSource(nodeKey, child, op, width, height) {\n\tconst c = child;\n\treturn JSON.stringify([\n\t\tnodeKey,\n\t\tc?.operation?.id ?? c?.id ?? null,\n\t\twidth,\n\t\theight,\n\t\top.mode ?? \"passthrough\",\n\t\top.variant,\n\t\top.confidence,\n\t\top.classes,\n\t\top.maskThreshold,\n\t\top.featherRadius,\n\t\top.matteSource,\n\t\top.keyBackground === true,\n\t\top.maxMissedFrames\n\t]);\n}\n/** The background-key threshold at `frame` (it may be animated). */\nfunction backgroundKeyThreshold(op, frame, fps) {\n\tconst raw = op.backgroundKeyThreshold;\n\tif (typeof raw === \"number\") return raw;\n\tif (typeof raw?.get === \"function\") return Number(raw.get({\n\t\tframe,\n\t\tfps\n\t}));\n\tif (typeof raw?._value === \"number\") return Number(raw._value);\n\treturn 70;\n}\n/**\n* The model's subject, or the last one through brief misses: a transient miss\n* then holds the silhouette instead of flashing the raw plate.\n*/\nfunction selectSubject(selected, nodeKey, frame) {\n\tif (selected) {\n\t\tlastSubjectByNode.set(nodeKey, {\n\t\t\tmask: selected,\n\t\t\tframe\n\t\t});\n\t\treturn selected;\n\t}\n\tconst last = lastSubjectByNode.get(nodeKey);\n\tif (last && frame - last.frame <= SUBJECT_HOLD_FRAMES) return last.mask;\n}\n/**\n* Lazy shared runner — `create()` is a pure constructor (zero I/O); the first frame that\n* requests a task triggers that task's model download at inference time (never at init).\n* Nodes with the same model options share sessions; decode options (classes,\n* confidence, …) get a derived runner over the same sessions.\n*/\nfunction getSharedRunner(op) {\n\tconst modelOptions = {\n\t\tvariant: op.variant,\n\t\tmodelsDir: op.modelsDir,\n\t\tbaseUrl: op.baseUrl\n\t};\n\tconst modelKey = JSON.stringify(modelOptions);\n\tlet entry = sharedRunners.get(modelKey);\n\tif (!entry) {\n\t\tif (sharedRunners.size >= MAX_SHARED_RUNNERS) {\n\t\t\tconst [oldestKey, oldest] = sharedRunners.entries().next().value;\n\t\t\toldest.runner.close();\n\t\t\tsharedRunners.delete(oldestKey);\n\t\t}\n\t\tentry = {\n\t\t\trunner: VisionRunner.create(modelOptions),\n\t\t\tderived: /* @__PURE__ */ new Map()\n\t\t};\n\t\tsharedRunners.set(modelKey, entry);\n\t}\n\tconst decodeOptions = {\n\t\tconfidence: op.confidence,\n\t\tclasses: op.classes,\n\t\tmaskThreshold: op.maskThreshold,\n\t\tfeatherRadius: op.featherRadius\n\t};\n\tconst decodeKey = JSON.stringify(decodeOptions);\n\tlet runner = entry.derived.get(decodeKey);\n\tif (!runner) {\n\t\trunner = entry.runner.derive(decodeOptions);\n\t\tentry.derived.set(decodeKey, runner);\n\t}\n\treturn runner;\n}\nfunction getObjectTracker(nodeKey, op) {\n\tlet tracker = objectTrackers.get(nodeKey);\n\tif (!tracker) {\n\t\ttracker = new TemporalObjectTracker({ maxMissedFrames: op.maxMissedFrames ?? 15 });\n\t\tobjectTrackers.set(nodeKey, tracker);\n\t}\n\treturn tracker;\n}\n/**\n* Normalizes the runner's pose keypoints (plate pixel space) to [0, 1] landmarks, which is\n* the contract the signal bundle and the skeleton pipeline expect.\n*/\nfunction normalizePoseKeypoints(result, width, height) {\n\tif (width <= 0 || height <= 0) return result;\n\treturn { people: result.people.map((person) => ({\n\t\t...person,\n\t\tkeypoints: person.keypoints.map((k) => ({\n\t\t\tx: k.x / width,\n\t\t\ty: k.y / height,\n\t\t\tvisibility: k.visibility\n\t\t}))\n\t})) };\n}\n/** Case-insensitive class filter, as the runner's decode applies it. */\nfunction matchesClasses(category, classes) {\n\tif (!classes) return true;\n\tconst c = category.toLowerCase();\n\treturn classes.some((k) => k.toLowerCase() === c);\n}\n/** Assigns each decoded instance mask to the temporal track whose box center is nearest the mask's centroid. */\nfunction assignMasksToTracks(masks, tracked) {\n\treturn masks.map((mask) => {\n\t\tconst { cx, cy } = maskCentroid(mask);\n\t\tlet best = null;\n\t\tfor (const obj of tracked) {\n\t\t\tconst dx = obj.centerX - cx;\n\t\t\tconst dy = obj.centerY - cy;\n\t\t\tconst distance = dx * dx + dy * dy;\n\t\t\tif (!best || distance < best.distance) best = {\n\t\t\t\ttrackId: obj.trackId,\n\t\t\t\tdistance\n\t\t\t};\n\t\t}\n\t\treturn best ? {\n\t\t\t...mask,\n\t\t\ttrackId: best.trackId\n\t\t} : mask;\n\t});\n}\n/**\n* Grows a subject mask into connected foreground pixels — seeding a flood fill\n* from the subject through pixels that differ from the sampled backdrop recovers\n* thin or fast-moving edges (hair, fabric) without adding a near-uniform studio\n* wall or its soft grey shadow.\n*/\nfunction fillInternalHoles(mask, width, height) {\n\tconst n = width * height;\n\tconst exterior = new Uint8Array(n);\n\tconst queue = new Int32Array(n);\n\tlet tail = 0;\n\tconst seed = (i) => {\n\t\tif (exterior[i] || mask[i] > 0) return;\n\t\texterior[i] = 1;\n\t\tqueue[tail++] = i;\n\t};\n\tfor (let x = 0; x < width; x++) {\n\t\tseed(x);\n\t\tseed((height - 1) * width + x);\n\t}\n\tfor (let y = 0; y < height; y++) {\n\t\tseed(y * width);\n\t\tseed(y * width + width - 1);\n\t}\n\tlet head = 0;\n\twhile (head < tail) {\n\t\tconst i = queue[head++];\n\t\tconst x = i % width;\n\t\tlet j = i + 1;\n\t\tif (x + 1 < width && !exterior[j] && mask[j] === 0) {\n\t\t\texterior[j] = 1;\n\t\t\tqueue[tail++] = j;\n\t\t}\n\t\tj = i - 1;\n\t\tif (x > 0 && !exterior[j] && mask[j] === 0) {\n\t\t\texterior[j] = 1;\n\t\t\tqueue[tail++] = j;\n\t\t}\n\t\tj = i + width;\n\t\tif (j < n && !exterior[j] && mask[j] === 0) {\n\t\t\texterior[j] = 1;\n\t\t\tqueue[tail++] = j;\n\t\t}\n\t\tj = i - width;\n\t\tif (j >= 0 && !exterior[j] && mask[j] === 0) {\n\t\t\texterior[j] = 1;\n\t\t\tqueue[tail++] = j;\n\t\t}\n\t}\n\tfor (let i = 0; i < n; i++) if (mask[i] === 0 && exterior[i] === 0) mask[i] = 255;\n}\nfunction smoothMaskBoundary(mask, width, height, radius = 2) {\n\tif (radius <= 0) return mask;\n\tconst temp = new Uint8Array(width * height);\n\tconst out = new Uint8Array(width * height);\n\tconst div = 2 * radius + 1;\n\tfor (let y = 0; y < height; y++) {\n\t\tconst row = y * width;\n\t\tlet sum = 0;\n\t\tfor (let k = -radius; k <= radius; k++) {\n\t\t\tconst x = Math.max(0, Math.min(width - 1, k));\n\t\t\tsum += mask[row + x];\n\t\t}\n\t\tfor (let x = 0; x < width; x++) {\n\t\t\ttemp[row + x] = Math.round(sum / div);\n\t\t\tconst xOut = Math.max(0, x - radius);\n\t\t\tconst xIn = Math.min(width - 1, x + radius + 1);\n\t\t\tsum += mask[row + xIn] - mask[row + xOut];\n\t\t}\n\t}\n\tconst sums = new Float64Array(width);\n\tfor (let k = -radius; k <= radius; k++) {\n\t\tconst row = Math.max(0, Math.min(height - 1, k)) * width;\n\t\tfor (let x = 0; x < width; x++) sums[x] += temp[row + x];\n\t}\n\tfor (let y = 0; y < height; y++) {\n\t\tconst row = y * width;\n\t\tconst rowOut = Math.max(0, y - radius) * width;\n\t\tconst rowIn = Math.min(height - 1, y + radius + 1) * width;\n\t\tfor (let x = 0; x < width; x++) {\n\t\t\tout[row + x] = Math.round(sums[x] / div);\n\t\t\tsums[x] += temp[rowIn + x] - temp[rowOut + x];\n\t\t}\n\t}\n\treturn out;\n}\nfunction growMaskIntoForeground(mask, width, height, pixels, threshold, featherRadius) {\n\tlet br = 0;\n\tlet bg = 0;\n\tlet bb = 0;\n\tlet count = 0;\n\tconst sample = (x, y) => {\n\t\tconst i = y * width + x;\n\t\tif (mask[i]) return;\n\t\tconst p = i * 4;\n\t\tbr += pixels[p];\n\t\tbg += pixels[p + 1];\n\t\tbb += pixels[p + 2];\n\t\tcount++;\n\t};\n\tfor (let x = 0; x < width; x += 4) {\n\t\tsample(x, 0);\n\t\tsample(x, height - 1);\n\t}\n\tfor (let y = 0; y < height; y += 4) {\n\t\tsample(0, y);\n\t\tsample(width - 1, y);\n\t}\n\tif (count === 0) return mask;\n\tbr /= count;\n\tbg /= count;\n\tbb /= count;\n\tconst n = width * height;\n\tconst fg = new Uint8Array(n);\n\tfor (let i = 0, p = 0; i < n; i++, p += 4) fg[i] = Math.max(Math.abs(pixels[p] - br), Math.abs(pixels[p + 1] - bg), Math.abs(pixels[p + 2] - bb)) > threshold ? 1 : 0;\n\tconst queue = new Int32Array(n);\n\tlet tail = 0;\n\tfor (let i = 0; i < n; i++) if (mask[i] > 0) {\n\t\tif (fg[i]) mask[i] = 255;\n\t\tqueue[tail++] = i;\n\t}\n\tlet head = 0;\n\twhile (head < tail) {\n\t\tconst i = queue[head++];\n\t\tconst x = i % width;\n\t\tlet j = i + 1;\n\t\tif (x + 1 < width && mask[j] !== 255 && fg[j]) {\n\t\t\tmask[j] = 255;\n\t\t\tqueue[tail++] = j;\n\t\t}\n\t\tj = i - 1;\n\t\tif (x > 0 && mask[j] !== 255 && fg[j]) {\n\t\t\tmask[j] = 255;\n\t\t\tqueue[tail++] = j;\n\t\t}\n\t\tj = i + width;\n\t\tif (j < n && mask[j] !== 255 && fg[j]) {\n\t\t\tmask[j] = 255;\n\t\t\tqueue[tail++] = j;\n\t\t}\n\t\tj = i - width;\n\t\tif (j >= 0 && mask[j] !== 255 && fg[j]) {\n\t\t\tmask[j] = 255;\n\t\t\tqueue[tail++] = j;\n\t\t}\n\t}\n\tfillInternalHoles(mask, width, height);\n\treturn smoothMaskBoundary(mask, width, height, featherRadius !== void 0 && featherRadius > 0 ? Math.max(1, Math.min(8, Math.round(featherRadius * 50))) : 2);\n}\nfunction maskCentroid(mask) {\n\tconst { mask: data, width, height } = mask;\n\tlet sumX = 0;\n\tlet sumY = 0;\n\tlet count = 0;\n\tfor (let y = 0; y < height; y++) {\n\t\tconst row = y * width;\n\t\tfor (let x = 0; x < width; x++) if (data[row + x] > 0) {\n\t\t\tsumX += x;\n\t\t\tsumY += y;\n\t\t\tcount++;\n\t\t}\n\t}\n\tif (count === 0) return {\n\t\tcx: 0,\n\t\tcy: 0\n\t};\n\treturn {\n\t\tcx: sumX / count,\n\t\tcy: sumY / count\n\t};\n}\nconst VisionWebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetView, targetWidth, targetHeight, props, drawChild } = args;\n\tconst { virtualMedia } = props;\n\tsetVisionDevice(ctx.device);\n\tconst rawOp = virtualMedia?.operation;\n\tif (rawOp?.op !== \"Vision\") return;\n\tconst op = rawOp;\n\tpass.end();\n\tconst childMedia = virtualMedia?.children?.[0];\n\tif (!childMedia) return;\n\tif (op.mode === \"depth\") {\n\t\tdrawClipDepth(ctx, encoder, targetView, targetWidth, targetHeight, op.effect, props.sourceTimeSec === void 0 ? props.frame ?? 0 : props.sourceTimeSec * (props.fps ?? 24), props.fps ?? 24);\n\t\treturn;\n\t}\n\tconst effectKey = op.effect;\n\tconst hasEffectKey = effectKey !== void 0 && effectKey !== null;\n\tconst nodeKeyStr = virtualMedia?.id ?? rawOp?.id ?? `${targetWidth}x${targetHeight}_${op.mode}_${op.variant}_${op.keyBackground}_${op.backgroundKeyThreshold}`;\n\tconst fallbackKey = `vision-${nodeKeyStr}`;\n\tlet childTex = hasEffectKey ? childTexturesByEffect.get(effectKey) : childTexturesByKey.get(fallbackKey);\n\tif (childTex && (childTex.width !== targetWidth || childTex.height !== targetHeight)) {\n\t\tchildTex.destroy();\n\t\tchildTex = void 0;\n\t\tif (hasEffectKey) childTexturesByEffect.delete(effectKey);\n\t\telse childTexturesByKey.delete(fallbackKey);\n\t}\n\tconst hasPreviousFrame = childTex !== void 0;\n\tif (!childTex) {\n\t\tchildTex = ctx.device.createTexture({\n\t\t\tsize: [targetWidth, targetHeight],\n\t\t\tformat: ctx.renderer.format,\n\t\t\tusage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_SRC,\n\t\t\tlabel: \"vision_child_persistent\"\n\t\t});\n\t\tif (hasEffectKey) childTexturesByEffect.set(effectKey, childTex);\n\t\telse childTexturesByKey.set(fallbackKey, childTex);\n\t\tif (childTexturesByKey.size > 4) {\n\t\t\tconst oldest = childTexturesByKey.keys().next().value;\n\t\t\tif (oldest && oldest !== fallbackKey) {\n\t\t\t\tchildTexturesByKey.get(oldest)?.destroy();\n\t\t\t\tchildTexturesByKey.delete(oldest);\n\t\t\t}\n\t\t}\n\t}\n\tconst frameIdx = props.frame ?? 0;\n\tconst compositionFrame = props.compositionFrame ?? frameIdx;\n\tconst fps = props.fps ?? 24;\n\tconst mode = op.mode ?? \"passthrough\";\n\tconst isMatteMode = mode === \"mask\" || mode === \"matte\" || mode === \"crop\";\n\tconst visionBundle = op.visionBundle ?? virtualMedia.visionBundle;\n\tconst wantsDetection = op.enableDetection !== false || mode === \"boxes\" || mode === \"tracking\";\n\tconst wantsSegmentation = op.enableSegmentation === true || isMatteMode && op.matteSource !== \"selfie\";\n\tconst wantsSelfie = op.enableMatte === true || isMatteMode && op.matteSource === \"selfie\";\n\tconst wantsPose = op.enablePose === true || mode === \"skeleton\";\n\tconst clipSubject = isMatteMode && !visionBundle && !wantsPose && !wantsSelfie && op.keyBackground !== true ? clipSubjectFor(effectKey, props.sourceTimeSec === void 0 ? frameIdx : props.sourceTimeSec * fps, fps, targetWidth, targetHeight) : void 0;\n\tconst clipPose = mode === \"skeleton\" && !visionBundle ? clipPoseFor(effectKey, props.sourceTimeSec === void 0 ? frameIdx : props.sourceTimeSec * fps, fps, targetWidth, targetHeight) : void 0;\n\tconst fromClip = clipSubject !== void 0 || clipPose !== void 0;\n\tconst cacheable = !fromClip && !wantsSelfie && !wantsPose && (wantsDetection || wantsSegmentation);\n\tconst source = cacheable ? cacheSource(nodeKeyStr, childMedia, op, targetWidth, targetHeight) : \"\";\n\tconst keyThresholdAt = (frame$1) => op.keyBackground === true ? backgroundKeyThreshold(op, compositionFrame - (frameIdx - frame$1), fps) : void 0;\n\tconst lookup = (frame$1) => {\n\t\tif (!cacheable || frame$1 === void 0) return void 0;\n\t\tconst hit = frameCache.get(source, frame$1);\n\t\tif (!hit || hit.keyThreshold !== keyThresholdAt(frame$1)) return void 0;\n\t\tif (wantsSegmentation && visionBundle && !hit.masks) return void 0;\n\t\treturn hit;\n\t};\n\tconst heldFrame = hasPreviousFrame ? heldFrameByNode.get(nodeKeyStr) : void 0;\n\tlet cached = lookup(frameIdx);\n\tconst exact = fromClip || cached !== void 0;\n\tif (!cached) cached = lookup(heldFrame);\n\tlet heldTex;\n\tif (isMatteMode && hasPreviousFrame && !exact) {\n\t\theldTex = heldTexture(ctx.device, nodeKeyStr, childTex);\n\t\tencoder.copyTextureToTexture({ texture: childTex }, { texture: heldTex }, [\n\t\t\ttargetWidth,\n\t\t\ttargetHeight,\n\t\t\t1\n\t\t]);\n\t}\n\tlet frame;\n\tlet framePixels = null;\n\tif (hasPreviousFrame && !cached && !fromClip) {\n\t\tconst analysis = analysisTexture(ctx.device, nodeKeyStr, childTex);\n\t\tconst copy = ctx.device.createCommandEncoder({ label: \"vision_analysis_copy\" });\n\t\tcopy.copyTextureToTexture({ texture: childTex }, { texture: analysis }, [\n\t\t\ttargetWidth,\n\t\t\ttargetHeight,\n\t\t\t1\n\t\t]);\n\t\tctx.device.queue.submit([copy.finish()]);\n\t\tframe = {\n\t\t\ttexture: analysis,\n\t\t\tdevice: ctx.device,\n\t\t\twidth: targetWidth,\n\t\t\theight: targetHeight\n\t\t};\n\t\tif (isMatteMode && op.keyBackground === true) framePixels = (await readTexturePixels(frame)).data;\n\t}\n\tconst childView = childTex.createView();\n\tctx.renderer.beginFrame(encoder, childView, {\n\t\tr: 0,\n\t\tg: 0,\n\t\tb: 0,\n\t\ta: 0\n\t}, targetWidth, targetHeight, \"clear\").end();\n\tawait drawChild(childMedia, { ...props }, childView, childTex, targetWidth, targetHeight);\n\theldFrameByNode.set(nodeKeyStr, frameIdx);\n\tlet frameObjects = [];\n\tlet frameMasks = [];\n\tlet personMatte;\n\tlet currentPoseRes;\n\tlet subject;\n\tif (fromClip) {\n\t\tsubject = clipSubject ?? void 0;\n\t\tif (subject) lastSubjectByNode.set(nodeKeyStr, {\n\t\t\tmask: subject,\n\t\t\tframe: frameIdx\n\t\t});\n\t\telse lastSubjectByNode.delete(nodeKeyStr);\n\t} else if (cached) {\n\t\tframeObjects = cached.objects;\n\t\tif (wantsDetection) visionBundle?.setObjectResult(frameIdx, {\n\t\t\tobjects: cached.objects,\n\t\t\trawDetections: cached.detections\n\t\t});\n\t\tif (wantsSegmentation && visionBundle && cached.masks) {\n\t\t\tframeMasks = cached.masks.map(fromCachedMask);\n\t\t\tvisionBundle.setMaskResult(frameIdx, frameMasks);\n\t\t}\n\t\tif (cached.subject) {\n\t\t\tsubject = fromCachedMask(cached.subject.mask);\n\t\t\tlastSubjectByNode.set(nodeKeyStr, {\n\t\t\t\tmask: subject,\n\t\t\t\tframe: frameIdx\n\t\t\t});\n\t\t}\n\t} else if (frame) {\n\t\tconst runner = getSharedRunner(op);\n\t\tconst image = frame;\n\t\tlet detections = [];\n\t\tif (wantsDetection) {\n\t\t\tdetections = await runner.detect(image);\n\t\t\tconst tracker = getObjectTracker(nodeKeyStr, op);\n\t\t\tif (frameIdx === 0) tracker.reset();\n\t\t\tframeObjects = tracker.update(detections, frameIdx, fps);\n\t\t\tvisionBundle?.setObjectResult(frameIdx, {\n\t\t\t\tobjects: frameObjects,\n\t\t\t\trawDetections: detections\n\t\t\t});\n\t\t}\n\t\tlet subjectMasks = [];\n\t\tif (wantsSegmentation) {\n\t\t\tconst subjectFromAllClasses = isMatteMode && op.matteSource !== \"selfie\" && op.classes !== void 0;\n\t\t\tconst segRes = await (subjectFromAllClasses ? getSharedRunner({\n\t\t\t\t...op,\n\t\t\t\tclasses: void 0\n\t\t\t}) : runner).segment(image);\n\t\t\tframeMasks = assignMasksToTracks(subjectFromAllClasses ? segRes.masks.filter((m) => matchesClasses(m.category, op.classes)) : segRes.masks, frameObjects);\n\t\t\tsubjectMasks = subjectFromAllClasses ? segRes.masks : frameMasks;\n\t\t\tvisionBundle?.setMaskResult(frameIdx, frameMasks);\n\t\t}\n\t\tif (wantsSelfie) {\n\t\t\tpersonMatte = await runner.matte(image);\n\t\t\tvisionBundle?.setMatteResult(frameIdx, personMatte);\n\t\t}\n\t\tif (wantsPose) {\n\t\t\tcurrentPoseRes = { people: matchPoseToTracks(normalizePoseKeypoints(await runner.pose(image), image.width, image.height).people, frameObjects) };\n\t\t\tvisionBundle?.setPoseResult(frameIdx, currentPoseRes);\n\t\t}\n\t\tif (isMatteMode) {\n\t\t\tsubject = selectSubject(op.matteSource === \"selfie\" ? personMatteAsMask(personMatte) : mergeSubjectMask(subjectMasks.length > 0 ? subjectMasks : visionBundle?.getMaskResult(frameIdx) ?? [], { classes: op.classes }), nodeKeyStr, frameIdx);\n\t\t\tconst threshold = keyThresholdAt(heldFrame ?? frameIdx);\n\t\t\tif (subject && threshold !== void 0 && framePixels) subject = {\n\t\t\t\t...subject,\n\t\t\t\tmask: growMaskIntoForeground(subject.mask, subject.width, subject.height, framePixels, threshold, op.featherRadius)\n\t\t\t};\n\t\t}\n\t\tif (cacheable && heldFrame !== void 0) frameCache.set(source, heldFrame, {\n\t\t\tdetections,\n\t\t\tobjects: frameObjects,\n\t\t\tmasks: visionBundle ? frameMasks.map(toCachedMask) : null,\n\t\t\tsubject: subject ? { mask: toCachedMask(subject) } : null,\n\t\t\tkeyThreshold: keyThresholdAt(heldFrame)\n\t\t});\n\t}\n\tif (isMatteMode) {\n\t\tconst picture = exact ? childTex : heldTex;\n\t\tif (!subject || !picture) {\n\t\t\tctx.renderer.beginFrame(encoder, targetView, {\n\t\t\t\tr: 0,\n\t\t\t\tg: 0,\n\t\t\t\tb: 0,\n\t\t\t\ta: 0\n\t\t\t}, targetWidth, targetHeight, \"clear\").end();\n\t\t\treturn;\n\t\t}\n\t\tif (!sharedCompositor || sharedCompositorFormat !== ctx.renderer.format) {\n\t\t\tsharedCompositor = new MatteCompositor(ctx.device, ctx.renderer.format);\n\t\t\tsharedCompositorFormat = ctx.renderer.format;\n\t\t}\n\t\tconst maskTex = sharedCompositor.uploadMask(nodeKeyStr, subject.mask, subject.width, subject.height);\n\t\tconst matteTex = matteTexture(ctx.device, nodeKeyStr, childTex);\n\t\tsharedCompositor.draw(encoder, matteTex.createView(), picture, maskTex, mode, mode === \"crop\" ? maskBounds(subject) ?? void 0 : void 0);\n\t\tvisionBundle?.setStencilTexture(matteTex);\n\t\tconst outPass$1 = ctx.renderer.beginFrame(encoder, targetView, {\n\t\t\tr: 0,\n\t\t\tg: 0,\n\t\t\tb: 0,\n\t\t\ta: 0\n\t\t}, targetWidth, targetHeight, \"clear\");\n\t\tctx.renderer.drawTexture(outPass$1, matteTex, {\n\t\t\tx: 0,\n\t\t\ty: 0,\n\t\t\twidth: targetWidth,\n\t\t\theight: targetHeight\n\t\t});\n\t\toutPass$1.end();\n\t\treturn;\n\t}\n\tif (mode === \"skeleton\") {\n\t\tif (!sharedSkeletonRenderer) sharedSkeletonRenderer = new PoseSkeletonRenderer(ctx.device);\n\t\tconst keypoints = clipPose !== void 0 ? clipPose : (visionBundle?.getPoseResult(frameIdx) ?? currentPoseRes)?.people[0]?.keypoints;\n\t\tconst skelPass = ctx.renderer.beginFrame(encoder, targetView, {\n\t\t\tr: 0,\n\t\t\tg: 0,\n\t\t\tb: 0,\n\t\t\ta: 0\n\t\t}, targetWidth, targetHeight, \"clear\");\n\t\tif (keypoints && keypoints.length > 0) {\n\t\t\tconst skelTex = sharedSkeletonRenderer.renderToTexture(keypoints, {\n\t\t\t\twidth: targetWidth,\n\t\t\t\theight: targetHeight\n\t\t\t});\n\t\t\tctx.renderer.drawTexture(skelPass, skelTex, {\n\t\t\t\tx: 0,\n\t\t\t\ty: 0,\n\t\t\t\twidth: targetWidth,\n\t\t\t\theight: targetHeight\n\t\t\t});\n\t\t}\n\t\tskelPass.end();\n\t\treturn;\n\t}\n\tif (mode === \"boxes\" || mode === \"tracking\") {\n\t\tconst outPass$1 = ctx.renderer.beginFrame(encoder, targetView, {\n\t\t\tr: 0,\n\t\t\tg: 0,\n\t\t\tb: 0,\n\t\t\ta: 0\n\t\t}, targetWidth, targetHeight, \"clear\");\n\t\tctx.renderer.drawTexture(outPass$1, childTex, {\n\t\t\tx: 0,\n\t\t\ty: 0,\n\t\t\twidth: targetWidth,\n\t\t\theight: targetHeight\n\t\t});\n\t\tconst objects = frameObjects.length > 0 ? frameObjects : visionBundle?.getObjectResult(frameIdx).objects ?? [];\n\t\tif (objects.length > 0) {\n\t\t\tconst boxColor = \"#38bdf8\";\n\t\t\tconst stroke = 2;\n\t\t\tfor (const obj of objects) {\n\t\t\t\tif (!obj.active) continue;\n\t\t\t\tconst b = obj.boundingBox;\n\t\t\t\tctx.renderer.drawRect(outPass$1, {\n\t\t\t\t\tx: b.originX,\n\t\t\t\t\ty: b.originY,\n\t\t\t\t\twidth: b.width,\n\t\t\t\t\theight: stroke\n\t\t\t\t}, boxColor);\n\t\t\t\tctx.renderer.drawRect(outPass$1, {\n\t\t\t\t\tx: b.originX,\n\t\t\t\t\ty: b.originY + b.height - stroke,\n\t\t\t\t\twidth: b.width,\n\t\t\t\t\theight: stroke\n\t\t\t\t}, boxColor);\n\t\t\t\tctx.renderer.drawRect(outPass$1, {\n\t\t\t\t\tx: b.originX,\n\t\t\t\t\ty: b.originY,\n\t\t\t\t\twidth: stroke,\n\t\t\t\t\theight: b.height\n\t\t\t\t}, boxColor);\n\t\t\t\tctx.renderer.drawRect(outPass$1, {\n\t\t\t\t\tx: b.originX + b.width - stroke,\n\t\t\t\t\ty: b.originY,\n\t\t\t\t\twidth: stroke,\n\t\t\t\t\theight: b.height\n\t\t\t\t}, boxColor);\n\t\t\t\tconst cornerLen = Math.min(16, b.width / 4, b.height / 4);\n\t\t\t\tctx.renderer.drawRect(outPass$1, {\n\t\t\t\t\tx: b.originX,\n\t\t\t\t\ty: b.originY,\n\t\t\t\t\twidth: cornerLen,\n\t\t\t\t\theight: stroke * 2\n\t\t\t\t}, \"#ffffff\");\n\t\t\t\tctx.renderer.drawRect(outPass$1, {\n\t\t\t\t\tx: b.originX,\n\t\t\t\t\ty: b.originY,\n\t\t\t\t\twidth: stroke * 2,\n\t\t\t\t\theight: cornerLen\n\t\t\t\t}, \"#ffffff\");\n\t\t\t\tif (mode === \"tracking\") ctx.renderer.drawRect(outPass$1, {\n\t\t\t\t\tx: obj.centerX - 3,\n\t\t\t\t\ty: obj.centerY - 3,\n\t\t\t\t\twidth: 6,\n\t\t\t\t\theight: 6\n\t\t\t\t}, \"#ef4444\", 3);\n\t\t\t}\n\t\t}\n\t\toutPass$1.end();\n\t\treturn;\n\t}\n\tconst outPass = ctx.renderer.beginFrame(encoder, targetView, {\n\t\tr: 0,\n\t\tg: 0,\n\t\tb: 0,\n\t\ta: 0\n\t}, targetWidth, targetHeight, \"clear\");\n\tctx.renderer.drawTexture(outPass, childTex, {\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth: targetWidth,\n\t\theight: targetHeight\n\t});\n\toutPass.end();\n};\n/**\n* The subject a linked `comp.vision` clip holds for a source frame (see\n* CLIP_SUBJECT). Its mask is in source pixels; the composite samples it by\n* uv, so it fits any target of the same aspect. Other shapes fall back.\n*/\nfunction clipSubjectFor(effect, frame, fps, width, height) {\n\tconst source = linkedClip(effect);\n\tconst subject = source?.subject(frame, fps);\n\tif (!subject || !source) return subject;\n\treturn fitsTarget(source, subject.width / subject.height, width / height) ? subject : void 0;\n}\n/**\n* The pose a linked `comp.vision` clip matched to its subject for a source\n* frame, normalized to the source; it fits targets of the same aspect.\n*/\nfunction clipPoseFor(effect, frame, fps, width, height) {\n\tconst source = linkedClip(effect);\n\tconst pose = source?.pose?.(frame, fps);\n\tif (!pose || !source) return pose === null ? null : void 0;\n\treturn fitsTarget(source, pose.width / pose.height, width / height) ? pose.keypoints : void 0;\n}\n/** Per-node upload target for depth frames (the depth model's resolution). */\nconst depthTextures = /* @__PURE__ */ new WeakMap();\n/**\n* Depth mode: the linked `comp.vision` clip's depth for this source frame as\n* gray (white = near), stretched over the layer. Depth is analysed ahead of\n* the render, so it belongs to this frame's pixels, never the previous one's.\n*/\nfunction drawClipDepth(ctx, encoder, targetView, width, height, effect, frame, fps) {\n\tconst source = linkedClip(effect);\n\tif (!source?.depth) throw new Error(\"A depth layer reads its clip's depth: add the video to the composition (framefields links it to a `comp.vision(src, { depth: true })` clip).\");\n\tconst depth = source.depth(frame, fps);\n\tconst pass = ctx.renderer.beginFrame(encoder, targetView, {\n\t\tr: 0,\n\t\tg: 0,\n\t\tb: 0,\n\t\ta: 0\n\t}, width, height, \"clear\");\n\tif (depth) {\n\t\tif (Math.abs(depth.width / depth.height / (width / height) - 1) > .02) throw new Error(`A depth layer keeps its clip's aspect ratio (${depth.width}×${depth.height} source vs a ${width}×${height} layer); crop after the depth layer instead.`);\n\t\tlet tex = effect ? depthTextures.get(effect) : void 0;\n\t\tif (!tex || tex.width !== depth.width || tex.height !== depth.height) {\n\t\t\ttex?.destroy();\n\t\t\ttex = ctx.device.createTexture({\n\t\t\t\tsize: [depth.width, depth.height],\n\t\t\t\tformat: \"rgba8unorm\",\n\t\t\t\tusage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_DST,\n\t\t\t\tlabel: \"vision_depth\"\n\t\t\t});\n\t\t\tif (effect) depthTextures.set(effect, tex);\n\t\t}\n\t\tconst gray = new Uint8Array(depth.width * depth.height * 4);\n\t\tfor (let i = 0; i < depth.data.length; i++) {\n\t\t\tconst v = Math.round(depth.data[i] * 255);\n\t\t\tgray.set([\n\t\t\t\tv,\n\t\t\t\tv,\n\t\t\t\tv,\n\t\t\t\t255\n\t\t\t], i * 4);\n\t\t}\n\t\tctx.device.queue.writeTexture({ texture: tex }, gray, { bytesPerRow: depth.width * 4 }, [depth.width, depth.height]);\n\t\tctx.renderer.drawTexture(pass, tex, {\n\t\t\tx: 0,\n\t\t\ty: 0,\n\t\t\twidth,\n\t\t\theight\n\t\t});\n\t}\n\tpass.end();\n}\nfunction linkedClip(effect) {\n\treturn effect?.[CLIP_SUBJECT];\n}\n/** Source results map onto a target of the same aspect; a prompted clip must not fall back. */\nfunction fitsTarget(source, sourceAspect, targetAspect) {\n\tif (Math.abs(sourceAspect / targetAspect - 1) < .01) return true;\n\tif (source.exact) throw new Error(\"A prompted clip matte requires the source aspect ratio. Apply layout cropping after the source matte.\");\n\treturn false;\n}\n/** Adapts a Selfie Segmenter matte to the instance-mask shape the composite path takes. */\nfunction personMatteAsMask(matte) {\n\tif (!matte || matte.coverage <= 0) return void 0;\n\tconst area = Math.round(matte.coverage * matte.width * matte.height);\n\treturn {\n\t\tcategory: \"person\",\n\t\tmask: matte.mask,\n\t\twidth: matte.width,\n\t\theight: matte.height,\n\t\tarea,\n\t\tcoverage: matte.coverage,\n\t\tdetectionIndex: -1\n\t};\n}\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: VisionWebGPURenderer });\n\n//#endregion\nexport { renderers_default as t };\n//# sourceMappingURL=renderers-DF17E3A-.mjs.map"],"mappings":";;;;AAIA,IAAI,gBAAgB,IAAI,WAAW,EAAE;AACrC,IAAI,iBAAiB,IAAI,YAAY,EAAE;AACvC,SAAS,WAAW,MAAM,OAAO,QAAQ;AACxC,KAAI,cAAc,SAAS,KAAK,QAAQ;AACvC,kBAAgB,IAAI,WAAW,KAAK,OAAO;AAC3C,mBAAiB,IAAI,YAAY,KAAK,OAAO;;CAE9C,MAAM,SAAS;CACf,MAAM,UAAU;CAChB,IAAI,OAAO;CACX,IAAI,QAAQ;AACZ,MAAK,IAAI,IAAI,GAAG,KAAK,KAAK,QAAQ,IAAK,KAAI,MAAM,KAAK,UAAU,KAAK,OAAO,KAAK,QAAQ;AACxF,SAAO,QAAQ,KAAK;AACpB,UAAQ,QAAQ,IAAI;AACpB;AACA,UAAQ;;AAET,QAAO;EACN;EACA;EACA,QAAQ,OAAO,MAAM,GAAG,KAAK;EAC7B,SAAS,QAAQ,MAAM,GAAG,KAAK;EAC/B;;AAEF,SAAS,WAAW,KAAK;CACxB,MAAM,MAAM,IAAI,WAAW,IAAI,QAAQ,IAAI,OAAO;CAClD,IAAI,KAAK;AACT,MAAK,IAAI,IAAI,GAAG,IAAI,IAAI,OAAO,QAAQ,KAAK;EAC3C,MAAM,MAAM,KAAK,IAAI,QAAQ;AAC7B,MAAI,IAAI,OAAO,OAAO,EAAG,KAAI,KAAK,IAAI,OAAO,IAAI,IAAI,IAAI;AACzD,OAAK;;AAEN,QAAO;;AAER,SAAS,SAAS,KAAK;AACtB,QAAO,IAAI,OAAO,aAAa,IAAI,QAAQ;;AAE5C,SAAS,aAAa,MAAM;CAC3B,MAAM,EAAE,MAAM,MAAM,GAAG,SAAS;AAChC,QAAO;EACN,GAAG;EACH,KAAK,WAAW,MAAM,KAAK,OAAO,KAAK,OAAO;EAC9C;;AAEF,SAAS,eAAe,MAAM;CAC7B,MAAM,EAAE,KAAK,GAAG,SAAS;AACzB,QAAO;EACN,GAAG;EACH,MAAM,WAAW,IAAI;EACrB;;AAEF,SAAS,YAAY,QAAQ;CAC5B,IAAI,QAAQ,MAAM,OAAO,WAAW,SAAS,MAAM,OAAO,QAAQ,SAAS;AAC3E,MAAK,MAAM,KAAK,OAAO,SAAS,EAAE,CAAE,UAAS,SAAS,EAAE,IAAI;AAC5D,KAAI,OAAO,QAAS,UAAS,SAAS,OAAO,QAAQ,KAAK,IAAI;AAC9D,QAAO;;;AAGR,IAAI,mBAAmB,MAAM;CAC5B,0BAA0B,IAAI,KAAK;CACnC,QAAQ;CACR,YAAY,WAAW,MAAM,OAAO,MAAM;AACzC,OAAK,WAAW;;CAEjB,IAAI,QAAQ,OAAO;EAClB,MAAM,MAAM,GAAG,OAAO,GAAG;EACzB,MAAM,MAAM,KAAK,QAAQ,IAAI,IAAI;AACjC,MAAI,KAAK;AACR,QAAK,QAAQ,OAAO,IAAI;AACxB,QAAK,QAAQ,IAAI,KAAK,IAAI;;AAE3B,SAAO;;CAER,IAAI,QAAQ,OAAO,QAAQ;EAC1B,MAAM,MAAM,GAAG,OAAO,GAAG;EACzB,MAAM,MAAM,KAAK,QAAQ,IAAI,IAAI;AACjC,MAAI,KAAK;AACR,QAAK,SAAS,YAAY,IAAI;AAC9B,QAAK,QAAQ,OAAO,IAAI;;AAEzB,OAAK,QAAQ,IAAI,KAAK,OAAO;AAC7B,OAAK,SAAS,YAAY,OAAO;AACjC,OAAK,MAAM,CAAC,GAAG,MAAM,KAAK,SAAS;AAClC,OAAI,KAAK,SAAS,KAAK,SAAU;AACjC,QAAK,QAAQ,OAAO,EAAE;AACtB,QAAK,SAAS,YAAY,EAAE;;;CAG9B,QAAQ;AACP,OAAK,QAAQ,OAAO;AACpB,OAAK,QAAQ;;CAEd,IAAI,OAAO;AACV,SAAO,KAAK,QAAQ;;;;;;;;;;;;AAetB,MAAM,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuCb,IAAI,kBAAkB,MAAM;CAC3B;CACA;CACA,WAAW,EAAE;CACb,eAAe;;CAEf,wBAAwB,IAAI,KAAK;CACjC,YAAY,QAAQ,QAAQ;AAC3B,OAAK,SAAS;EACd,MAAM,SAAS,OAAO,mBAAmB;GACxC,OAAO;GACP,MAAM;GACN,CAAC;AACF,OAAK,WAAW,OAAO,qBAAqB;GAC3C,OAAO;GACP,QAAQ;GACR,QAAQ;IACP;IACA,YAAY;IACZ;GACD,UAAU;IACT;IACA,YAAY;IACZ,SAAS,CAAC,EAAE,QAAQ,CAAC;IACrB;GACD,WAAW,EAAE,UAAU,iBAAiB;GACxC,CAAC;AACF,OAAK,UAAU,OAAO,cAAc;GACnC,WAAW;GACX,WAAW;GACX,CAAC;;;CAGH,WAAW,KAAK,MAAM,OAAO,QAAQ;EACpC,IAAI,MAAM,KAAK,MAAM,IAAI,IAAI;AAC7B,MAAI,CAAC,OAAO,IAAI,UAAU,SAAS,IAAI,WAAW,QAAQ;AACzD,QAAK,SAAS;AACd,SAAM,KAAK,OAAO,cAAc;IAC/B,OAAO,eAAe;IACtB,MAAM,CAAC,OAAO,OAAO;IACrB,QAAQ;IACR,OAAO,gBAAgB,kBAAkB,gBAAgB;IACzD,CAAC;AACF,QAAK,MAAM,IAAI,KAAK,IAAI;;EAEzB,MAAM,UAAU,KAAK,KAAK,QAAQ,IAAI,GAAG;EACzC,IAAI,QAAQ;AACZ,MAAI,YAAY,OAAO;AACtB,WAAQ,IAAI,WAAW,UAAU,OAAO;AACxC,QAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,IAAK,OAAM,IAAI,KAAK,SAAS,IAAI,QAAQ,IAAI,KAAK,MAAM,EAAE,IAAI,QAAQ;;AAEnG,OAAK,OAAO,MAAM,aAAa,EAAE,SAAS,KAAK,EAAE,MAAM,QAAQ;GAC9D,QAAQ,MAAM;GACd,aAAa;GACb,cAAc;GACd,EAAE;GACF;GACA;GACA,CAAC;AACF,SAAO;;;CAGR,KAAK,SAAS,QAAQ,SAAS,MAAM,MAAM,QAAQ;EAClD,MAAM,IAAI,KAAK;EACf,MAAM,IAAI,KAAK;EACf,MAAM,OAAO,IAAI,aAAa,EAAE;EAChC,MAAM,OAAO,IAAI,YAAY,KAAK,OAAO;AACzC,OAAK,KAAK,SAAS,UAAU,IAAI,SAAS,SAAS,IAAI;AACvD,MAAI,SAAS,UAAU,QAAQ;AAC9B,QAAK,KAAK,OAAO,KAAK;AACtB,QAAK,KAAK,OAAO,KAAK;AACtB,QAAK,MAAM,OAAO,KAAK,KAAK;AAC5B,QAAK,MAAM,OAAO,KAAK,KAAK;SACtB;AACN,QAAK,KAAK;AACV,QAAK,KAAK;AACV,QAAK,KAAK;AACV,QAAK,KAAK;AACV,OAAI,SAAS,OAAQ,MAAK,KAAK;;AAEhC,MAAI,KAAK,gBAAgB,KAAK,SAAS,OAAQ,MAAK,SAAS,KAAK,KAAK,OAAO,aAAa;GAC1F,MAAM,KAAK;GACX,OAAO,eAAe,UAAU,eAAe;GAC/C,CAAC,CAAC;EACH,MAAM,UAAU,KAAK,SAAS,KAAK;AACnC,OAAK,gBAAgB,KAAK,eAAe,KAAK;AAC9C,OAAK,OAAO,MAAM,YAAY,SAAS,GAAG,KAAK;EAC/C,MAAM,YAAY,KAAK,OAAO,gBAAgB;GAC7C,QAAQ,KAAK,SAAS,mBAAmB,EAAE;GAC3C,SAAS;IACR;KACC,SAAS;KACT,UAAU,EAAE,QAAQ,SAAS;KAC7B;IACD;KACC,SAAS;KACT,UAAU,QAAQ,YAAY;KAC9B;IACD;KACC,SAAS;KACT,UAAU,KAAK,YAAY;KAC3B;IACD;KACC,SAAS;KACT,UAAU,KAAK;KACf;IACD;GACD,CAAC;EACF,MAAM,OAAO,QAAQ,gBAAgB;GACpC,OAAO;GACP,kBAAkB,CAAC;IAClB,MAAM;IACN,QAAQ;IACR,SAAS;IACT,YAAY;KACX,GAAG;KACH,GAAG;KACH,GAAG;KACH,GAAG;KACH;IACD,CAAC;GACF,CAAC;AACF,OAAK,YAAY,KAAK,SAAS;AAC/B,OAAK,aAAa,GAAG,UAAU;AAC/B,OAAK,KAAK,EAAE;AACZ,OAAK,KAAK;;;;;;;;AAWZ,MAAM,gCAAgC,IAAI,KAAK;AAC/C,MAAM,qBAAqB;AAC3B,IAAI,yBAAyB;AAC7B,IAAI,mBAAmB;AACvB,IAAI,yBAAyB;;AAE7B,MAAM,aAAa,IAAI,kBAAkB;;AAEzC,MAAM,kCAAkC,IAAI,KAAK;;AAEjD,MAAM,+BAA+B,IAAI,KAAK;AAC9C,MAAM,mCAAmC,IAAI,KAAK;AAClD,MAAM,gCAAgC,IAAI,KAAK;;AAE/C,MAAM,iCAAiC,IAAI,KAAK;;;;;;;;;;;AAWhD,MAAM,wCAAwC,IAAI,SAAS;AAC3D,MAAM,qCAAqC,IAAI,KAAK;;;;;;AAMpD,MAAM,oCAAoC,IAAI,KAAK;AACnD,MAAM,sBAAsB;;AAE5B,SAAS,YAAY,UAAU,QAAQ,KAAK,MAAM,OAAO,OAAO;CAC/D,IAAI,MAAM,SAAS,IAAI,IAAI;AAC3B,KAAI,CAAC,OAAO,IAAI,UAAU,KAAK,SAAS,IAAI,WAAW,KAAK,UAAU,IAAI,WAAW,KAAK,QAAQ;AACjG,OAAK,SAAS;AACd,QAAM,OAAO,cAAc;GAC1B,MAAM,CAAC,KAAK,OAAO,KAAK,OAAO;GAC/B,QAAQ,KAAK;GACb;GACA;GACA,CAAC;AACF,WAAS,IAAI,KAAK,IAAI;;AAEvB,QAAO;;AAER,MAAM,eAAe,QAAQ,KAAK,SAAS,YAAY,cAAc,QAAQ,KAAK,MAAM,gBAAgB,WAAW,gBAAgB,iBAAiB,oBAAoB;AACxK,MAAM,mBAAmB,QAAQ,KAAK,SAAS,YAAY,kBAAkB,QAAQ,KAAK,MAAM,gBAAgB,WAAW,gBAAgB,kBAAkB,gBAAgB,UAAU,wBAAwB;AAC/M,MAAM,gBAAgB,QAAQ,KAAK,SAAS,YAAY,eAAe,QAAQ,KAAK,MAAM,gBAAgB,oBAAoB,gBAAgB,kBAAkB,gBAAgB,UAAU,eAAe;;AAEzM,SAAS,YAAY,SAAS,OAAO,IAAI,OAAO,QAAQ;CACvD,MAAM,IAAI;AACV,QAAO,KAAK,UAAU;EACrB;EACA,GAAG,WAAW,MAAM,GAAG,MAAM;EAC7B;EACA;EACA,GAAG,QAAQ;EACX,GAAG;EACH,GAAG;EACH,GAAG;EACH,GAAG;EACH,GAAG;EACH,GAAG;EACH,GAAG,kBAAkB;EACrB,GAAG;EACH,CAAC;;;AAGH,SAAS,uBAAuB,IAAI,OAAO,KAAK;CAC/C,MAAM,MAAM,GAAG;AACf,KAAI,OAAO,QAAQ,SAAU,QAAO;AACpC,KAAI,OAAO,KAAK,QAAQ,WAAY,QAAO,OAAO,IAAI,IAAI;EACzD;EACA;EACA,CAAC,CAAC;AACH,KAAI,OAAO,KAAK,WAAW,SAAU,QAAO,OAAO,IAAI,OAAO;AAC9D,QAAO;;;;;;AAMR,SAAS,cAAc,UAAU,SAAS,OAAO;AAChD,KAAI,UAAU;AACb,oBAAkB,IAAI,SAAS;GAC9B,MAAM;GACN;GACA,CAAC;AACF,SAAO;;CAER,MAAM,OAAO,kBAAkB,IAAI,QAAQ;AAC3C,KAAI,QAAQ,QAAQ,KAAK,SAAS,oBAAqB,QAAO,KAAK;;;;;;;;AAQpE,SAAS,gBAAgB,IAAI;CAC5B,MAAM,eAAe;EACpB,SAAS,GAAG;EACZ,WAAW,GAAG;EACd,SAAS,GAAG;EACZ;CACD,MAAM,WAAW,KAAK,UAAU,aAAa;CAC7C,IAAI,QAAQ,cAAc,IAAI,SAAS;AACvC,KAAI,CAAC,OAAO;AACX,MAAI,cAAc,QAAQ,oBAAoB;GAC7C,MAAM,CAAC,WAAW,UAAU,cAAc,SAAS,CAAC,MAAM,CAAC;AAC3D,UAAO,OAAO,OAAO;AACrB,iBAAc,OAAO,UAAU;;AAEhC,UAAQ;GACP,QAAQ,aAAa,OAAO,aAAa;GACzC,yBAAyB,IAAI,KAAK;GAClC;AACD,gBAAc,IAAI,UAAU,MAAM;;CAEnC,MAAM,gBAAgB;EACrB,YAAY,GAAG;EACf,SAAS,GAAG;EACZ,eAAe,GAAG;EAClB,eAAe,GAAG;EAClB;CACD,MAAM,YAAY,KAAK,UAAU,cAAc;CAC/C,IAAI,SAAS,MAAM,QAAQ,IAAI,UAAU;AACzC,KAAI,CAAC,QAAQ;AACZ,WAAS,MAAM,OAAO,OAAO,cAAc;AAC3C,QAAM,QAAQ,IAAI,WAAW,OAAO;;AAErC,QAAO;;AAER,SAAS,iBAAiB,SAAS,IAAI;CACtC,IAAI,UAAU,eAAe,IAAI,QAAQ;AACzC,KAAI,CAAC,SAAS;AACb,YAAU,IAAI,sBAAsB,EAAE,iBAAiB,GAAG,mBAAmB,IAAI,CAAC;AAClF,iBAAe,IAAI,SAAS,QAAQ;;AAErC,QAAO;;;;;;AAMR,SAAS,uBAAuB,QAAQ,OAAO,QAAQ;AACtD,KAAI,SAAS,KAAK,UAAU,EAAG,QAAO;AACtC,QAAO,EAAE,QAAQ,OAAO,OAAO,KAAK,YAAY;EAC/C,GAAG;EACH,WAAW,OAAO,UAAU,KAAK,OAAO;GACvC,GAAG,EAAE,IAAI;GACT,GAAG,EAAE,IAAI;GACT,YAAY,EAAE;GACd,EAAE;EACH,EAAE,EAAE;;;AAGN,SAAS,eAAe,UAAU,SAAS;AAC1C,KAAI,CAAC,QAAS,QAAO;CACrB,MAAM,IAAI,SAAS,aAAa;AAChC,QAAO,QAAQ,MAAM,MAAM,EAAE,aAAa,KAAK,EAAE;;;AAGlD,SAAS,oBAAoB,OAAO,SAAS;AAC5C,QAAO,MAAM,KAAK,SAAS;EAC1B,MAAM,EAAE,IAAI,OAAO,aAAa,KAAK;EACrC,IAAI,OAAO;AACX,OAAK,MAAM,OAAO,SAAS;GAC1B,MAAM,KAAK,IAAI,UAAU;GACzB,MAAM,KAAK,IAAI,UAAU;GACzB,MAAM,WAAW,KAAK,KAAK,KAAK;AAChC,OAAI,CAAC,QAAQ,WAAW,KAAK,SAAU,QAAO;IAC7C,SAAS,IAAI;IACb;IACA;;AAEF,SAAO,OAAO;GACb,GAAG;GACH,SAAS,KAAK;GACd,GAAG;GACH;;;;;;;;AAQH,SAAS,kBAAkB,MAAM,OAAO,QAAQ;CAC/C,MAAM,IAAI,QAAQ;CAClB,MAAM,WAAW,IAAI,WAAW,EAAE;CAClC,MAAM,QAAQ,IAAI,WAAW,EAAE;CAC/B,IAAI,OAAO;CACX,MAAM,QAAQ,MAAM;AACnB,MAAI,SAAS,MAAM,KAAK,KAAK,EAAG;AAChC,WAAS,KAAK;AACd,QAAM,UAAU;;AAEjB,MAAK,IAAI,IAAI,GAAG,IAAI,OAAO,KAAK;AAC/B,OAAK,EAAE;AACP,QAAM,SAAS,KAAK,QAAQ,EAAE;;AAE/B,MAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,KAAK;AAChC,OAAK,IAAI,MAAM;AACf,OAAK,IAAI,QAAQ,QAAQ,EAAE;;CAE5B,IAAI,OAAO;AACX,QAAO,OAAO,MAAM;EACnB,MAAM,IAAI,MAAM;EAChB,MAAM,IAAI,IAAI;EACd,IAAI,IAAI,IAAI;AACZ,MAAI,IAAI,IAAI,SAAS,CAAC,SAAS,MAAM,KAAK,OAAO,GAAG;AACnD,YAAS,KAAK;AACd,SAAM,UAAU;;AAEjB,MAAI,IAAI;AACR,MAAI,IAAI,KAAK,CAAC,SAAS,MAAM,KAAK,OAAO,GAAG;AAC3C,YAAS,KAAK;AACd,SAAM,UAAU;;AAEjB,MAAI,IAAI;AACR,MAAI,IAAI,KAAK,CAAC,SAAS,MAAM,KAAK,OAAO,GAAG;AAC3C,YAAS,KAAK;AACd,SAAM,UAAU;;AAEjB,MAAI,IAAI;AACR,MAAI,KAAK,KAAK,CAAC,SAAS,MAAM,KAAK,OAAO,GAAG;AAC5C,YAAS,KAAK;AACd,SAAM,UAAU;;;AAGlB,MAAK,IAAI,IAAI,GAAG,IAAI,GAAG,IAAK,KAAI,KAAK,OAAO,KAAK,SAAS,OAAO,EAAG,MAAK,KAAK;;AAE/E,SAAS,mBAAmB,MAAM,OAAO,QAAQ,SAAS,GAAG;AAC5D,KAAI,UAAU,EAAG,QAAO;CACxB,MAAM,OAAO,IAAI,WAAW,QAAQ,OAAO;CAC3C,MAAM,MAAM,IAAI,WAAW,QAAQ,OAAO;CAC1C,MAAM,MAAM,IAAI,SAAS;AACzB,MAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,KAAK;EAChC,MAAM,MAAM,IAAI;EAChB,IAAI,MAAM;AACV,OAAK,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ,KAAK;GACvC,MAAM,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,QAAQ,GAAG,EAAE,CAAC;AAC7C,UAAO,KAAK,MAAM;;AAEnB,OAAK,IAAI,IAAI,GAAG,IAAI,OAAO,KAAK;AAC/B,QAAK,MAAM,KAAK,KAAK,MAAM,MAAM,IAAI;GACrC,MAAM,OAAO,KAAK,IAAI,GAAG,IAAI,OAAO;GACpC,MAAM,MAAM,KAAK,IAAI,QAAQ,GAAG,IAAI,SAAS,EAAE;AAC/C,UAAO,KAAK,MAAM,OAAO,KAAK,MAAM;;;CAGtC,MAAM,OAAO,IAAI,aAAa,MAAM;AACpC,MAAK,IAAI,IAAI,CAAC,QAAQ,KAAK,QAAQ,KAAK;EACvC,MAAM,MAAM,KAAK,IAAI,GAAG,KAAK,IAAI,SAAS,GAAG,EAAE,CAAC,GAAG;AACnD,OAAK,IAAI,IAAI,GAAG,IAAI,OAAO,IAAK,MAAK,MAAM,KAAK,MAAM;;AAEvD,MAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,KAAK;EAChC,MAAM,MAAM,IAAI;EAChB,MAAM,SAAS,KAAK,IAAI,GAAG,IAAI,OAAO,GAAG;EACzC,MAAM,QAAQ,KAAK,IAAI,SAAS,GAAG,IAAI,SAAS,EAAE,GAAG;AACrD,OAAK,IAAI,IAAI,GAAG,IAAI,OAAO,KAAK;AAC/B,OAAI,MAAM,KAAK,KAAK,MAAM,KAAK,KAAK,IAAI;AACxC,QAAK,MAAM,KAAK,QAAQ,KAAK,KAAK,SAAS;;;AAG7C,QAAO;;AAER,SAAS,uBAAuB,MAAM,OAAO,QAAQ,QAAQ,WAAW,eAAe;CACtF,IAAI,KAAK;CACT,IAAI,KAAK;CACT,IAAI,KAAK;CACT,IAAI,QAAQ;CACZ,MAAM,UAAU,GAAG,MAAM;EACxB,MAAM,IAAI,IAAI,QAAQ;AACtB,MAAI,KAAK,GAAI;EACb,MAAM,IAAI,IAAI;AACd,QAAM,OAAO;AACb,QAAM,OAAO,IAAI;AACjB,QAAM,OAAO,IAAI;AACjB;;AAED,MAAK,IAAI,IAAI,GAAG,IAAI,OAAO,KAAK,GAAG;AAClC,SAAO,GAAG,EAAE;AACZ,SAAO,GAAG,SAAS,EAAE;;AAEtB,MAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,KAAK,GAAG;AACnC,SAAO,GAAG,EAAE;AACZ,SAAO,QAAQ,GAAG,EAAE;;AAErB,KAAI,UAAU,EAAG,QAAO;AACxB,OAAM;AACN,OAAM;AACN,OAAM;CACN,MAAM,IAAI,QAAQ;CAClB,MAAM,KAAK,IAAI,WAAW,EAAE;AAC5B,MAAK,IAAI,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,KAAK,KAAK,EAAG,IAAG,KAAK,KAAK,IAAI,KAAK,IAAI,OAAO,KAAK,GAAG,EAAE,KAAK,IAAI,OAAO,IAAI,KAAK,GAAG,EAAE,KAAK,IAAI,OAAO,IAAI,KAAK,GAAG,CAAC,GAAG,YAAY,IAAI;CACpK,MAAM,QAAQ,IAAI,WAAW,EAAE;CAC/B,IAAI,OAAO;AACX,MAAK,IAAI,IAAI,GAAG,IAAI,GAAG,IAAK,KAAI,KAAK,KAAK,GAAG;AAC5C,MAAI,GAAG,GAAI,MAAK,KAAK;AACrB,QAAM,UAAU;;CAEjB,IAAI,OAAO;AACX,QAAO,OAAO,MAAM;EACnB,MAAM,IAAI,MAAM;EAChB,MAAM,IAAI,IAAI;EACd,IAAI,IAAI,IAAI;AACZ,MAAI,IAAI,IAAI,SAAS,KAAK,OAAO,OAAO,GAAG,IAAI;AAC9C,QAAK,KAAK;AACV,SAAM,UAAU;;AAEjB,MAAI,IAAI;AACR,MAAI,IAAI,KAAK,KAAK,OAAO,OAAO,GAAG,IAAI;AACtC,QAAK,KAAK;AACV,SAAM,UAAU;;AAEjB,MAAI,IAAI;AACR,MAAI,IAAI,KAAK,KAAK,OAAO,OAAO,GAAG,IAAI;AACtC,QAAK,KAAK;AACV,SAAM,UAAU;;AAEjB,MAAI,IAAI;AACR,MAAI,KAAK,KAAK,KAAK,OAAO,OAAO,GAAG,IAAI;AACvC,QAAK,KAAK;AACV,SAAM,UAAU;;;AAGlB,mBAAkB,MAAM,OAAO,OAAO;AACtC,QAAO,mBAAmB,MAAM,OAAO,QAAQ,kBAAkB,KAAK,KAAK,gBAAgB,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,KAAK,MAAM,gBAAgB,GAAG,CAAC,CAAC,GAAG,EAAE;;AAE7J,SAAS,aAAa,MAAM;CAC3B,MAAM,EAAE,MAAM,MAAM,OAAO,WAAW;CACtC,IAAI,OAAO;CACX,IAAI,OAAO;CACX,IAAI,QAAQ;AACZ,MAAK,IAAI,IAAI,GAAG,IAAI,QAAQ,KAAK;EAChC,MAAM,MAAM,IAAI;AAChB,OAAK,IAAI,IAAI,GAAG,IAAI,OAAO,IAAK,KAAI,KAAK,MAAM,KAAK,GAAG;AACtD,WAAQ;AACR,WAAQ;AACR;;;AAGF,KAAI,UAAU,EAAG,QAAO;EACvB,IAAI;EACJ,IAAI;EACJ;AACD,QAAO;EACN,IAAI,OAAO;EACX,IAAI,OAAO;EACX;;AAEF,MAAM,uBAAuB,OAAO,SAAS;CAC5C,MAAM,EAAE,KAAK,SAAS,MAAM,YAAY,aAAa,cAAc,OAAO,cAAc;CACxF,MAAM,EAAE,iBAAiB;AACzB,iBAAgB,IAAI,OAAO;CAC3B,MAAM,QAAQ,cAAc;AAC5B,KAAI,OAAO,OAAO,SAAU;CAC5B,MAAM,KAAK;AACX,MAAK,KAAK;CACV,MAAM,aAAa,cAAc,WAAW;AAC5C,KAAI,CAAC,WAAY;AACjB,KAAI,GAAG,SAAS,SAAS;AACxB,gBAAc,KAAK,SAAS,YAAY,aAAa,cAAc,GAAG,QAAQ,MAAM,kBAAkB,KAAK,IAAI,MAAM,SAAS,IAAI,MAAM,iBAAiB,MAAM,OAAO,KAAK,MAAM,OAAO,GAAG;AAC3L;;CAED,MAAM,YAAY,GAAG;CACrB,MAAM,eAAe,cAAc,KAAK,KAAK,cAAc;CAC3D,MAAM,aAAa,cAAc,MAAM,OAAO,MAAM,GAAG,YAAY,GAAG,aAAa,GAAG,GAAG,KAAK,GAAG,GAAG,QAAQ,GAAG,GAAG,cAAc,GAAG,GAAG;CACtI,MAAM,cAAc,UAAU;CAC9B,IAAI,WAAW,eAAe,sBAAsB,IAAI,UAAU,GAAG,mBAAmB,IAAI,YAAY;AACxG,KAAI,aAAa,SAAS,UAAU,eAAe,SAAS,WAAW,eAAe;AACrF,WAAS,SAAS;AAClB,aAAW,KAAK;AAChB,MAAI,aAAc,uBAAsB,OAAO,UAAU;MACpD,oBAAmB,OAAO,YAAY;;CAE5C,MAAM,mBAAmB,aAAa,KAAK;AAC3C,KAAI,CAAC,UAAU;AACd,aAAW,IAAI,OAAO,cAAc;GACnC,MAAM,CAAC,aAAa,aAAa;GACjC,QAAQ,IAAI,SAAS;GACrB,OAAO,gBAAgB,oBAAoB,gBAAgB,kBAAkB,gBAAgB;GAC7F,OAAO;GACP,CAAC;AACF,MAAI,aAAc,uBAAsB,IAAI,WAAW,SAAS;MAC3D,oBAAmB,IAAI,aAAa,SAAS;AAClD,MAAI,mBAAmB,OAAO,GAAG;GAChC,MAAM,SAAS,mBAAmB,MAAM,CAAC,MAAM,CAAC;AAChD,OAAI,UAAU,WAAW,aAAa;AACrC,uBAAmB,IAAI,OAAO,EAAE,SAAS;AACzC,uBAAmB,OAAO,OAAO;;;;CAIpC,MAAM,WAAW,MAAM,SAAS;CAChC,MAAM,mBAAmB,MAAM,oBAAoB;CACnD,MAAM,MAAM,MAAM,OAAO;CACzB,MAAM,OAAO,GAAG,QAAQ;CACxB,MAAM,cAAc,SAAS,UAAU,SAAS,WAAW,SAAS;CACpE,MAAM,eAAe,GAAG,gBAAgB,aAAa;CACrD,MAAM,iBAAiB,GAAG,oBAAoB,SAAS,SAAS,WAAW,SAAS;CACpF,MAAM,oBAAoB,GAAG,uBAAuB,QAAQ,eAAe,GAAG,gBAAgB;CAC9F,MAAM,cAAc,GAAG,gBAAgB,QAAQ,eAAe,GAAG,gBAAgB;CACjF,MAAM,YAAY,GAAG,eAAe,QAAQ,SAAS;CACrD,MAAM,cAAc,eAAe,CAAC,gBAAgB,CAAC,aAAa,CAAC,eAAe,GAAG,kBAAkB,OAAO,eAAe,WAAW,MAAM,kBAAkB,KAAK,IAAI,WAAW,MAAM,gBAAgB,KAAK,KAAK,aAAa,aAAa,GAAG,KAAK;CACtP,MAAM,WAAW,SAAS,cAAc,CAAC,eAAe,YAAY,WAAW,MAAM,kBAAkB,KAAK,IAAI,WAAW,MAAM,gBAAgB,KAAK,KAAK,aAAa,aAAa,GAAG,KAAK;CAC7L,MAAM,WAAW,gBAAgB,KAAK,KAAK,aAAa,KAAK;CAC7D,MAAM,YAAY,CAAC,YAAY,CAAC,eAAe,CAAC,cAAc,kBAAkB;CAChF,MAAM,SAAS,YAAY,YAAY,YAAY,YAAY,IAAI,aAAa,aAAa,GAAG;CAChG,MAAM,kBAAkB,YAAY,GAAG,kBAAkB,OAAO,uBAAuB,IAAI,oBAAoB,WAAW,UAAU,IAAI,GAAG,KAAK;CAChJ,MAAM,UAAU,YAAY;AAC3B,MAAI,CAAC,aAAa,YAAY,KAAK,EAAG,QAAO,KAAK;EAClD,MAAM,MAAM,WAAW,IAAI,QAAQ,QAAQ;AAC3C,MAAI,CAAC,OAAO,IAAI,iBAAiB,eAAe,QAAQ,CAAE,QAAO,KAAK;AACtE,MAAI,qBAAqB,gBAAgB,CAAC,IAAI,MAAO,QAAO,KAAK;AACjE,SAAO;;CAER,MAAM,YAAY,mBAAmB,gBAAgB,IAAI,WAAW,GAAG,KAAK;CAC5E,IAAI,SAAS,OAAO,SAAS;CAC7B,MAAM,QAAQ,YAAY,WAAW,KAAK;AAC1C,KAAI,CAAC,OAAQ,UAAS,OAAO,UAAU;CACvC,IAAI;AACJ,KAAI,eAAe,oBAAoB,CAAC,OAAO;AAC9C,YAAU,YAAY,IAAI,QAAQ,YAAY,SAAS;AACvD,UAAQ,qBAAqB,EAAE,SAAS,UAAU,EAAE,EAAE,SAAS,SAAS,EAAE;GACzE;GACA;GACA;GACA,CAAC;;CAEH,IAAI;CACJ,IAAI,cAAc;AAClB,KAAI,oBAAoB,CAAC,UAAU,CAAC,UAAU;EAC7C,MAAM,WAAW,gBAAgB,IAAI,QAAQ,YAAY,SAAS;EAClE,MAAM,OAAO,IAAI,OAAO,qBAAqB,EAAE,OAAO,wBAAwB,CAAC;AAC/E,OAAK,qBAAqB,EAAE,SAAS,UAAU,EAAE,EAAE,SAAS,UAAU,EAAE;GACvE;GACA;GACA;GACA,CAAC;AACF,MAAI,OAAO,MAAM,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC;AACxC,UAAQ;GACP,SAAS;GACT,QAAQ,IAAI;GACZ,OAAO;GACP,QAAQ;GACR;AACD,MAAI,eAAe,GAAG,kBAAkB,KAAM,gBAAe,MAAM,kBAAkB,MAAM,EAAE;;CAE9F,MAAM,YAAY,SAAS,YAAY;AACvC,KAAI,SAAS,WAAW,SAAS,WAAW;EAC3C,GAAG;EACH,GAAG;EACH,GAAG;EACH,GAAG;EACH,EAAE,aAAa,cAAc,QAAQ,CAAC,KAAK;AAC5C,OAAM,UAAU,YAAY,EAAE,GAAG,OAAO,EAAE,WAAW,UAAU,aAAa,aAAa;AACzF,iBAAgB,IAAI,YAAY,SAAS;CACzC,IAAI,eAAe,EAAE;CACrB,IAAI,aAAa,EAAE;CACnB,IAAI;CACJ,IAAI;CACJ,IAAI;AACJ,KAAI,UAAU;AACb,YAAU,eAAe,KAAK;AAC9B,MAAI,QAAS,mBAAkB,IAAI,YAAY;GAC9C,MAAM;GACN,OAAO;GACP,CAAC;MACG,mBAAkB,OAAO,WAAW;YAC/B,QAAQ;AAClB,iBAAe,OAAO;AACtB,MAAI,eAAgB,eAAc,gBAAgB,UAAU;GAC3D,SAAS,OAAO;GAChB,eAAe,OAAO;GACtB,CAAC;AACF,MAAI,qBAAqB,gBAAgB,OAAO,OAAO;AACtD,gBAAa,OAAO,MAAM,IAAI,eAAe;AAC7C,gBAAa,cAAc,UAAU,WAAW;;AAEjD,MAAI,OAAO,SAAS;AACnB,aAAU,eAAe,OAAO,QAAQ,KAAK;AAC7C,qBAAkB,IAAI,YAAY;IACjC,MAAM;IACN,OAAO;IACP,CAAC;;YAEO,OAAO;EACjB,MAAM,SAAS,gBAAgB,GAAG;EAClC,MAAM,QAAQ;EACd,IAAI,aAAa,EAAE;AACnB,MAAI,gBAAgB;AACnB,gBAAa,MAAM,OAAO,OAAO,MAAM;GACvC,MAAM,UAAU,iBAAiB,YAAY,GAAG;AAChD,OAAI,aAAa,EAAG,SAAQ,OAAO;AACnC,kBAAe,QAAQ,OAAO,YAAY,UAAU,IAAI;AACxD,iBAAc,gBAAgB,UAAU;IACvC,SAAS;IACT,eAAe;IACf,CAAC;;EAEH,IAAI,eAAe,EAAE;AACrB,MAAI,mBAAmB;GACtB,MAAM,wBAAwB,eAAe,GAAG,gBAAgB,YAAY,GAAG,YAAY,KAAK;GAChG,MAAM,SAAS,OAAO,wBAAwB,gBAAgB;IAC7D,GAAG;IACH,SAAS,KAAK;IACd,CAAC,GAAG,QAAQ,QAAQ,MAAM;AAC3B,gBAAa,oBAAoB,wBAAwB,OAAO,MAAM,QAAQ,MAAM,eAAe,EAAE,UAAU,GAAG,QAAQ,CAAC,GAAG,OAAO,OAAO,aAAa;AACzJ,kBAAe,wBAAwB,OAAO,QAAQ;AACtD,iBAAc,cAAc,UAAU,WAAW;;AAElD,MAAI,aAAa;AAChB,iBAAc,MAAM,OAAO,MAAM,MAAM;AACvC,iBAAc,eAAe,UAAU,YAAY;;AAEpD,MAAI,WAAW;AACd,oBAAiB,EAAE,QAAQ,kBAAkB,uBAAuB,MAAM,OAAO,KAAK,MAAM,EAAE,MAAM,OAAO,MAAM,OAAO,CAAC,QAAQ,aAAa,EAAE;AAChJ,iBAAc,cAAc,UAAU,eAAe;;AAEtD,MAAI,aAAa;AAChB,aAAU,cAAc,GAAG,gBAAgB,WAAW,kBAAkB,YAAY,GAAG,iBAAiB,aAAa,SAAS,IAAI,eAAe,cAAc,cAAc,SAAS,IAAI,EAAE,EAAE,EAAE,SAAS,GAAG,SAAS,CAAC,EAAE,YAAY,SAAS;GAC7O,MAAM,YAAY,eAAe,aAAa,SAAS;AACvD,OAAI,WAAW,cAAc,KAAK,KAAK,YAAa,WAAU;IAC7D,GAAG;IACH,MAAM,uBAAuB,QAAQ,MAAM,QAAQ,OAAO,QAAQ,QAAQ,aAAa,WAAW,GAAG,cAAc;IACnH;;AAEF,MAAI,aAAa,cAAc,KAAK,EAAG,YAAW,IAAI,QAAQ,WAAW;GACxE;GACA,SAAS;GACT,OAAO,eAAe,WAAW,IAAI,aAAa,GAAG;GACrD,SAAS,UAAU,EAAE,MAAM,aAAa,QAAQ,EAAE,GAAG;GACrD,cAAc,eAAe,UAAU;GACvC,CAAC;;AAEH,KAAI,aAAa;EAChB,MAAM,UAAU,QAAQ,WAAW;AACnC,MAAI,CAAC,WAAW,CAAC,SAAS;AACzB,OAAI,SAAS,WAAW,SAAS,YAAY;IAC5C,GAAG;IACH,GAAG;IACH,GAAG;IACH,GAAG;IACH,EAAE,aAAa,cAAc,QAAQ,CAAC,KAAK;AAC5C;;AAED,MAAI,CAAC,oBAAoB,2BAA2B,IAAI,SAAS,QAAQ;AACxE,sBAAmB,IAAI,gBAAgB,IAAI,QAAQ,IAAI,SAAS,OAAO;AACvE,4BAAyB,IAAI,SAAS;;EAEvC,MAAM,UAAU,iBAAiB,WAAW,YAAY,QAAQ,MAAM,QAAQ,OAAO,QAAQ,OAAO;EACpG,MAAM,WAAW,aAAa,IAAI,QAAQ,YAAY,SAAS;AAC/D,mBAAiB,KAAK,SAAS,SAAS,YAAY,EAAE,SAAS,SAAS,MAAM,SAAS,SAAS,WAAW,QAAQ,IAAI,KAAK,IAAI,KAAK,EAAE;AACvI,gBAAc,kBAAkB,SAAS;EACzC,MAAM,YAAY,IAAI,SAAS,WAAW,SAAS,YAAY;GAC9D,GAAG;GACH,GAAG;GACH,GAAG;GACH,GAAG;GACH,EAAE,aAAa,cAAc,QAAQ;AACtC,MAAI,SAAS,YAAY,WAAW,UAAU;GAC7C,GAAG;GACH,GAAG;GACH,OAAO;GACP,QAAQ;GACR,CAAC;AACF,YAAU,KAAK;AACf;;AAED,KAAI,SAAS,YAAY;AACxB,MAAI,CAAC,uBAAwB,0BAAyB,IAAI,qBAAqB,IAAI,OAAO;EAC1F,MAAM,YAAY,aAAa,KAAK,IAAI,YAAY,cAAc,cAAc,SAAS,IAAI,iBAAiB,OAAO,IAAI;EACzH,MAAM,WAAW,IAAI,SAAS,WAAW,SAAS,YAAY;GAC7D,GAAG;GACH,GAAG;GACH,GAAG;GACH,GAAG;GACH,EAAE,aAAa,cAAc,QAAQ;AACtC,MAAI,aAAa,UAAU,SAAS,GAAG;GACtC,MAAM,UAAU,uBAAuB,gBAAgB,WAAW;IACjE,OAAO;IACP,QAAQ;IACR,CAAC;AACF,OAAI,SAAS,YAAY,UAAU,SAAS;IAC3C,GAAG;IACH,GAAG;IACH,OAAO;IACP,QAAQ;IACR,CAAC;;AAEH,WAAS,KAAK;AACd;;AAED,KAAI,SAAS,WAAW,SAAS,YAAY;EAC5C,MAAM,YAAY,IAAI,SAAS,WAAW,SAAS,YAAY;GAC9D,GAAG;GACH,GAAG;GACH,GAAG;GACH,GAAG;GACH,EAAE,aAAa,cAAc,QAAQ;AACtC,MAAI,SAAS,YAAY,WAAW,UAAU;GAC7C,GAAG;GACH,GAAG;GACH,OAAO;GACP,QAAQ;GACR,CAAC;EACF,MAAM,UAAU,aAAa,SAAS,IAAI,eAAe,cAAc,gBAAgB,SAAS,CAAC,WAAW,EAAE;AAC9G,MAAI,QAAQ,SAAS,GAAG;GACvB,MAAM,WAAW;GACjB,MAAM,SAAS;AACf,QAAK,MAAM,OAAO,SAAS;AAC1B,QAAI,CAAC,IAAI,OAAQ;IACjB,MAAM,IAAI,IAAI;AACd,QAAI,SAAS,SAAS,WAAW;KAChC,GAAG,EAAE;KACL,GAAG,EAAE;KACL,OAAO,EAAE;KACT,QAAQ;KACR,EAAE,SAAS;AACZ,QAAI,SAAS,SAAS,WAAW;KAChC,GAAG,EAAE;KACL,GAAG,EAAE,UAAU,EAAE,SAAS;KAC1B,OAAO,EAAE;KACT,QAAQ;KACR,EAAE,SAAS;AACZ,QAAI,SAAS,SAAS,WAAW;KAChC,GAAG,EAAE;KACL,GAAG,EAAE;KACL,OAAO;KACP,QAAQ,EAAE;KACV,EAAE,SAAS;AACZ,QAAI,SAAS,SAAS,WAAW;KAChC,GAAG,EAAE,UAAU,EAAE,QAAQ;KACzB,GAAG,EAAE;KACL,OAAO;KACP,QAAQ,EAAE;KACV,EAAE,SAAS;IACZ,MAAM,YAAY,KAAK,IAAI,IAAI,EAAE,QAAQ,GAAG,EAAE,SAAS,EAAE;AACzD,QAAI,SAAS,SAAS,WAAW;KAChC,GAAG,EAAE;KACL,GAAG,EAAE;KACL,OAAO;KACP,QAAQ,SAAS;KACjB,EAAE,UAAU;AACb,QAAI,SAAS,SAAS,WAAW;KAChC,GAAG,EAAE;KACL,GAAG,EAAE;KACL,OAAO,SAAS;KAChB,QAAQ;KACR,EAAE,UAAU;AACb,QAAI,SAAS,WAAY,KAAI,SAAS,SAAS,WAAW;KACzD,GAAG,IAAI,UAAU;KACjB,GAAG,IAAI,UAAU;KACjB,OAAO;KACP,QAAQ;KACR,EAAE,WAAW,EAAE;;;AAGlB,YAAU,KAAK;AACf;;CAED,MAAM,UAAU,IAAI,SAAS,WAAW,SAAS,YAAY;EAC5D,GAAG;EACH,GAAG;EACH,GAAG;EACH,GAAG;EACH,EAAE,aAAa,cAAc,QAAQ;AACtC,KAAI,SAAS,YAAY,SAAS,UAAU;EAC3C,GAAG;EACH,GAAG;EACH,OAAO;EACP,QAAQ;EACR,CAAC;AACF,SAAQ,KAAK;;;;;;;AAOd,SAAS,eAAe,QAAQ,OAAO,KAAK,OAAO,QAAQ;CAC1D,MAAM,SAAS,WAAW,OAAO;CACjC,MAAM,UAAU,QAAQ,QAAQ,OAAO,IAAI;AAC3C,KAAI,CAAC,WAAW,CAAC,OAAQ,QAAO;AAChC,QAAO,WAAW,QAAQ,QAAQ,QAAQ,QAAQ,QAAQ,QAAQ,OAAO,GAAG,UAAU,KAAK;;;;;;AAM5F,SAAS,YAAY,QAAQ,OAAO,KAAK,OAAO,QAAQ;CACvD,MAAM,SAAS,WAAW,OAAO;CACjC,MAAM,OAAO,QAAQ,OAAO,OAAO,IAAI;AACvC,KAAI,CAAC,QAAQ,CAAC,OAAQ,QAAO,SAAS,OAAO,OAAO,KAAK;AACzD,QAAO,WAAW,QAAQ,KAAK,QAAQ,KAAK,QAAQ,QAAQ,OAAO,GAAG,KAAK,YAAY,KAAK;;;AAG7F,MAAM,gCAAgC,IAAI,SAAS;;;;;;AAMnD,SAAS,cAAc,KAAK,SAAS,YAAY,OAAO,QAAQ,QAAQ,OAAO,KAAK;CACnF,MAAM,SAAS,WAAW,OAAO;AACjC,KAAI,CAAC,QAAQ,MAAO,OAAM,IAAI,MAAM,+IAA+I;CACnL,MAAM,QAAQ,OAAO,MAAM,OAAO,IAAI;CACtC,MAAM,OAAO,IAAI,SAAS,WAAW,SAAS,YAAY;EACzD,GAAG;EACH,GAAG;EACH,GAAG;EACH,GAAG;EACH,EAAE,OAAO,QAAQ,QAAQ;AAC1B,KAAI,OAAO;AACV,MAAI,KAAK,IAAI,MAAM,QAAQ,MAAM,UAAU,QAAQ,UAAU,EAAE,GAAG,IAAK,OAAM,IAAI,MAAM,gDAAgD,MAAM,MAAM,GAAG,MAAM,OAAO,eAAe,MAAM,GAAG,OAAO,8CAA8C;EAChP,IAAI,MAAM,SAAS,cAAc,IAAI,OAAO,GAAG,KAAK;AACpD,MAAI,CAAC,OAAO,IAAI,UAAU,MAAM,SAAS,IAAI,WAAW,MAAM,QAAQ;AACrE,QAAK,SAAS;AACd,SAAM,IAAI,OAAO,cAAc;IAC9B,MAAM,CAAC,MAAM,OAAO,MAAM,OAAO;IACjC,QAAQ;IACR,OAAO,gBAAgB,kBAAkB,gBAAgB;IACzD,OAAO;IACP,CAAC;AACF,OAAI,OAAQ,eAAc,IAAI,QAAQ,IAAI;;EAE3C,MAAM,OAAO,IAAI,WAAW,MAAM,QAAQ,MAAM,SAAS,EAAE;AAC3D,OAAK,IAAI,IAAI,GAAG,IAAI,MAAM,KAAK,QAAQ,KAAK;GAC3C,MAAM,IAAI,KAAK,MAAM,MAAM,KAAK,KAAK,IAAI;AACzC,QAAK,IAAI;IACR;IACA;IACA;IACA;IACA,EAAE,IAAI,EAAE;;AAEV,MAAI,OAAO,MAAM,aAAa,EAAE,SAAS,KAAK,EAAE,MAAM,EAAE,aAAa,MAAM,QAAQ,GAAG,EAAE,CAAC,MAAM,OAAO,MAAM,OAAO,CAAC;AACpH,MAAI,SAAS,YAAY,MAAM,KAAK;GACnC,GAAG;GACH,GAAG;GACH;GACA;GACA,CAAC;;AAEH,MAAK,KAAK;;AAEX,SAAS,WAAW,QAAQ;AAC3B,QAAO,SAAS;;;AAGjB,SAAS,WAAW,QAAQ,cAAc,cAAc;AACvD,KAAI,KAAK,IAAI,eAAe,eAAe,EAAE,GAAG,IAAK,QAAO;AAC5D,KAAI,OAAO,MAAO,OAAM,IAAI,MAAM,wGAAwG;AAC1I,QAAO;;;AAGR,SAAS,kBAAkB,OAAO;AACjC,KAAI,CAAC,SAAS,MAAM,YAAY,EAAG,QAAO,KAAK;CAC/C,MAAM,OAAO,KAAK,MAAM,MAAM,WAAW,MAAM,QAAQ,MAAM,OAAO;AACpE,QAAO;EACN,UAAU;EACV,MAAM,MAAM;EACZ,OAAO,MAAM;EACb,QAAQ,MAAM;EACd;EACA,UAAU,MAAM;EAChB,gBAAgB;EAChB;;AAKF,IAAI,oBAAoB,eAAe,EAAE,gBAAgB,sBAAsB,CAAC"}
@@ -1,7 +1,7 @@
1
1
  import "./chunk-DOL2i2sR.mjs";
2
2
  import { n as defineRenderer } from "./renderer-BuvKGwk3.mjs";
3
- import "./dist-DtPPPsZV.mjs";
4
- import { c as drawTextureToTarget, l as fragmentBindGroupLayout, o as drawChildToTexture, s as drawFullscreenPass, t as FULLSCREEN_QUAD_WGSL, u as perDevice } from "./gpu-D2HT3KcE.mjs";
3
+ import "./dist-XqlFM2a8.mjs";
4
+ import { c as drawTextureToTarget, l as fragmentBindGroupLayout, o as drawChildToTexture, s as drawFullscreenPass, t as FULLSCREEN_QUAD_WGSL, u as perDevice } from "./gpu-CH1PdM4T.mjs";
5
5
 
6
6
  //#region ../../nodes/node-trails/dist/renderers-C37o-6Mg.mjs
7
7
  const HISTORY_FORMAT = "rgba16float";
@@ -212,4 +212,4 @@ var renderers_default = defineRenderer({ WebGPURenderer: TrailsWebGPURenderer })
212
212
 
213
213
  //#endregion
214
214
  export { TrailsWebGPURenderer, renderers_default as default };
215
- //# sourceMappingURL=renderer-DCrKEVjb.mjs.map
215
+ //# sourceMappingURL=renderer-Dtcs4idV.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-DCrKEVjb.mjs","names":[],"sources":["../../../nodes/node-trails/dist/renderers-C37o-6Mg.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { FULLSCREEN_QUAD_WGSL, drawChildToTexture, drawFullscreenPass, drawTextureToTarget, fragmentBindGroupLayout, perDevice } from \"@framefields/node-sdk/gpu\";\n\n//#region src/renderers/webgpu-renderer.ts\nconst HISTORY_FORMAT = \"rgba16float\";\nconst TRAILS_WGSL = `\nstruct U { a : vec4<f32>, b : vec4<f32> };\n@group(0) @binding(0) var<uniform> u : U;\n@group(0) @binding(1) var historyTex : texture_2d<f32>;\n@group(0) @binding(2) var currentTex : texture_2d<f32>;\n@group(0) @binding(3) var samp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\n// Hue rotation in YIQ: linear, so it works on premultiplied color.\nfn hueRotate(c : vec3<f32>, angle : f32) -> vec3<f32> {\n\tlet yiq = mat3x3<f32>(0.299, 0.596, 0.211, 0.587, -0.274, -0.523, 0.114, -0.322, 0.312) * c;\n\tlet cs = cos(angle);\n\tlet sn = sin(angle);\n\tlet rot = vec3<f32>(yiq.x, yiq.y * cs - yiq.z * sn, yiq.y * sn + yiq.z * cs);\n\treturn mat3x3<f32>(1.0, 1.0, 1.0, 0.956, -0.272, -1.106, 0.621, -0.647, 1.703) * rot;\n}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet decay = u.a.x;\n\tlet mode = u.a.y;\n\tlet zoom = max(u.a.z, 1e-3);\n\tlet angle = u.a.w;\n\tlet offset = u.b.xy;\n\tlet hue = u.b.z;\n\tlet fresh = u.b.w;\n\tlet cur = textureSampleLevel(currentTex, samp, in.uv, 0.0);\n\tif (fresh > 0.5) { return cur; }\n\tlet c = in.uv - 0.5;\n\tlet cs = cos(-angle);\n\tlet sn = sin(-angle);\n\tlet src = vec2<f32>(c.x * cs - c.y * sn, c.x * sn + c.y * cs) / zoom + 0.5 - offset;\n\tvar hist = vec4<f32>(0.0);\n\tif (all(src >= vec2<f32>(0.0)) && all(src <= vec2<f32>(1.0))) {\n\t\thist = textureSampleLevel(historyTex, samp, src, 0.0);\n\t}\n\tif (hue != 0.0) { hist = vec4<f32>(max(hueRotate(hist.rgb, hue), vec3<f32>(0.0)), hist.a); }\n\thist *= decay;\n\tif (mode < 0.5) { return cur + hist * (1.0 - cur.a); }\n\tif (mode < 1.5) { return vec4<f32>(cur.rgb + hist.rgb, min(cur.a + hist.a, 1.0)); }\n\tif (mode < 2.5) { return max(cur, hist); }\n\t// blend: a running average, so opaque footage shows its own echoes.\n\treturn mix(cur, hist / max(decay, 1e-4), decay);\n}\n`;\nconst resources = perDevice((device) => {\n\tconst layout = fragmentBindGroupLayout(device, [\n\t\t\"uniform\",\n\t\t\"texture\",\n\t\t\"texture\",\n\t\t\"sampler\"\n\t], \"trails_layout\");\n\tconst module = device.createShaderModule({\n\t\tcode: TRAILS_WGSL,\n\t\tlabel: \"trails.wgsl\"\n\t});\n\treturn {\n\t\tlayout,\n\t\tpipeline: device.createRenderPipeline({\n\t\t\tlabel: \"trails\",\n\t\t\tlayout: device.createPipelineLayout({ bindGroupLayouts: [layout] }),\n\t\t\tvertex: {\n\t\t\t\tmodule,\n\t\t\t\tentryPoint: \"vs\"\n\t\t\t},\n\t\t\tfragment: {\n\t\t\t\tmodule,\n\t\t\t\tentryPoint: \"fs\",\n\t\t\t\ttargets: [{ format: HISTORY_FORMAT }]\n\t\t\t},\n\t\t\tprimitive: { topology: \"triangle-strip\" }\n\t\t}),\n\t\tsampler: device.createSampler({\n\t\t\tmagFilter: \"linear\",\n\t\t\tminFilter: \"linear\"\n\t\t})\n\t};\n});\nfunction historyFor(effect, device, width, height) {\n\tconst h = effect.feedbackHistory;\n\tif (h && h.device === device && h.width === width && h.height === height) return h;\n\th?.front.destroy();\n\th?.back.destroy();\n\tconst make = (label) => device.createTexture({\n\t\tlabel,\n\t\tsize: [width, height],\n\t\tformat: HISTORY_FORMAT,\n\t\tusage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_SRC | GPUTextureUsage.COPY_DST\n\t});\n\tconst next = {\n\t\tdevice,\n\t\twidth,\n\t\theight,\n\t\tfront: make(\"trails_front\"),\n\t\tback: make(\"trails_back\"),\n\t\tframe: -1\n\t};\n\teffect.feedbackHistory = next;\n\treturn next;\n}\nasync function childAt(args, frame, compositionStart, h) {\n\tconst child = args.props.virtualMedia?.children?.[0];\n\tif (!child) return null;\n\treturn drawChildToTexture(args, child, {\n\t\texclude: [h.front, h.back],\n\t\tprops: {\n\t\t\t...args.props,\n\t\t\tvirtualMedia: child,\n\t\t\tframe,\n\t\t\tcompositionFrame: compositionStart + frame\n\t\t}\n\t});\n}\nfunction swap(h) {\n\tconst t = h.front;\n\th.front = h.back;\n\th.back = t;\n}\nasync function stepTrails(args, h, v, frame, compositionStart, fresh) {\n\tconst cur = await childAt(args, frame, compositionStart, h);\n\tif (!cur) return;\n\tconst r = resources(args.ctx.device);\n\tconst uniforms = new Float32Array([\n\t\tv.decay,\n\t\t{\n\t\t\tover: 0,\n\t\t\tadd: 1,\n\t\t\tmax: 2,\n\t\t\tblend: 3\n\t\t}[v.mode] ?? 0,\n\t\tv.zoom,\n\t\tv.rotation * Math.PI / 180,\n\t\tv.offsetX / h.width,\n\t\tv.offsetY / h.height,\n\t\tv.hueShift * Math.PI / 180,\n\t\tfresh ? 1 : 0\n\t]);\n\tdrawFullscreenPass(args.encoder, h.back.createView(), r.pipeline, [args.ctx.device.createBindGroup({\n\t\tlayout: r.layout,\n\t\tentries: [\n\t\t\t{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: { buffer: args.ctx.renderer.getTemporaryBuffer(uniforms) }\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 1,\n\t\t\t\tresource: h.front.createView()\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 2,\n\t\t\t\tresource: cur.view\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 3,\n\t\t\t\tresource: r.sampler\n\t\t\t}\n\t\t]\n\t})]);\n\tswap(h);\n\th.frame = frame;\n}\nfunction num(v, fallback) {\n\treturn typeof v === \"number\" && Number.isFinite(v) ? v : fallback;\n}\nconst TrailsWebGPURenderer = async (args) => {\n\tconst { ctx, pass, targetWidth, targetHeight, props } = args;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"Trails\" || !op.effect?.resolveUniforms) return;\n\tif (!props.virtualMedia?.children?.[0]) return;\n\tpass.end();\n\tconst fps = props.fps || 30;\n\tconst local = Math.max(0, Math.round(props.frame ?? 0));\n\tconst compositionFrame = Math.round(props.compositionFrame ?? local);\n\tconst compositionStart = compositionFrame - local;\n\tconst raw = op.effect.resolveUniforms({\n\t\tframe: compositionFrame,\n\t\tfps,\n\t\ttime: compositionFrame / fps\n\t});\n\tconst h = historyFor(op.effect, ctx.device, targetWidth, targetHeight);\n\t{\n\t\tconst v = {\n\t\t\tdecay: Math.min(1, Math.max(0, num(raw.decay, .9))),\n\t\t\tmode: raw.mode ?? \"blend\",\n\t\t\tzoom: num(raw.zoom, 1),\n\t\t\trotation: num(raw.rotation, 0),\n\t\t\toffsetX: num(raw.offsetX, 0),\n\t\t\toffsetY: num(raw.offsetY, 0),\n\t\t\thueShift: num(raw.hueShift, 0),\n\t\t\twarmup: Math.max(0, Math.round(num(raw.warmup, 60)))\n\t\t};\n\t\tif (h.frame !== local) {\n\t\t\tlet start = local;\n\t\t\tif (h.frame === local - 1) start = local;\n\t\t\telse {\n\t\t\t\tconst needed = v.decay > 0 && v.decay < 1 ? Math.ceil(Math.log(.005) / Math.log(v.decay)) : v.warmup;\n\t\t\t\tstart = Math.max(0, local - Math.min(v.warmup, needed));\n\t\t\t\th.frame = -1;\n\t\t\t}\n\t\t\tfor (let f = start; f <= local; f++) await stepTrails(args, h, v, f, compositionStart, h.frame < 0);\n\t\t}\n\t}\n\tdrawTextureToTarget(args, h.front);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: TrailsWebGPURenderer });\n\n//#endregion\nexport { TrailsWebGPURenderer as n, renderers_default as t };\n//# sourceMappingURL=renderers-C37o-6Mg.mjs.map"],"mappings":"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"}
1
+ {"version":3,"file":"renderer-Dtcs4idV.mjs","names":[],"sources":["../../../nodes/node-trails/dist/renderers-C37o-6Mg.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { FULLSCREEN_QUAD_WGSL, drawChildToTexture, drawFullscreenPass, drawTextureToTarget, fragmentBindGroupLayout, perDevice } from \"@framefields/node-sdk/gpu\";\n\n//#region src/renderers/webgpu-renderer.ts\nconst HISTORY_FORMAT = \"rgba16float\";\nconst TRAILS_WGSL = `\nstruct U { a : vec4<f32>, b : vec4<f32> };\n@group(0) @binding(0) var<uniform> u : U;\n@group(0) @binding(1) var historyTex : texture_2d<f32>;\n@group(0) @binding(2) var currentTex : texture_2d<f32>;\n@group(0) @binding(3) var samp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\n// Hue rotation in YIQ: linear, so it works on premultiplied color.\nfn hueRotate(c : vec3<f32>, angle : f32) -> vec3<f32> {\n\tlet yiq = mat3x3<f32>(0.299, 0.596, 0.211, 0.587, -0.274, -0.523, 0.114, -0.322, 0.312) * c;\n\tlet cs = cos(angle);\n\tlet sn = sin(angle);\n\tlet rot = vec3<f32>(yiq.x, yiq.y * cs - yiq.z * sn, yiq.y * sn + yiq.z * cs);\n\treturn mat3x3<f32>(1.0, 1.0, 1.0, 0.956, -0.272, -1.106, 0.621, -0.647, 1.703) * rot;\n}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet decay = u.a.x;\n\tlet mode = u.a.y;\n\tlet zoom = max(u.a.z, 1e-3);\n\tlet angle = u.a.w;\n\tlet offset = u.b.xy;\n\tlet hue = u.b.z;\n\tlet fresh = u.b.w;\n\tlet cur = textureSampleLevel(currentTex, samp, in.uv, 0.0);\n\tif (fresh > 0.5) { return cur; }\n\tlet c = in.uv - 0.5;\n\tlet cs = cos(-angle);\n\tlet sn = sin(-angle);\n\tlet src = vec2<f32>(c.x * cs - c.y * sn, c.x * sn + c.y * cs) / zoom + 0.5 - offset;\n\tvar hist = vec4<f32>(0.0);\n\tif (all(src >= vec2<f32>(0.0)) && all(src <= vec2<f32>(1.0))) {\n\t\thist = textureSampleLevel(historyTex, samp, src, 0.0);\n\t}\n\tif (hue != 0.0) { hist = vec4<f32>(max(hueRotate(hist.rgb, hue), vec3<f32>(0.0)), hist.a); }\n\thist *= decay;\n\tif (mode < 0.5) { return cur + hist * (1.0 - cur.a); }\n\tif (mode < 1.5) { return vec4<f32>(cur.rgb + hist.rgb, min(cur.a + hist.a, 1.0)); }\n\tif (mode < 2.5) { return max(cur, hist); }\n\t// blend: a running average, so opaque footage shows its own echoes.\n\treturn mix(cur, hist / max(decay, 1e-4), decay);\n}\n`;\nconst resources = perDevice((device) => {\n\tconst layout = fragmentBindGroupLayout(device, [\n\t\t\"uniform\",\n\t\t\"texture\",\n\t\t\"texture\",\n\t\t\"sampler\"\n\t], \"trails_layout\");\n\tconst module = device.createShaderModule({\n\t\tcode: TRAILS_WGSL,\n\t\tlabel: \"trails.wgsl\"\n\t});\n\treturn {\n\t\tlayout,\n\t\tpipeline: device.createRenderPipeline({\n\t\t\tlabel: \"trails\",\n\t\t\tlayout: device.createPipelineLayout({ bindGroupLayouts: [layout] }),\n\t\t\tvertex: {\n\t\t\t\tmodule,\n\t\t\t\tentryPoint: \"vs\"\n\t\t\t},\n\t\t\tfragment: {\n\t\t\t\tmodule,\n\t\t\t\tentryPoint: \"fs\",\n\t\t\t\ttargets: [{ format: HISTORY_FORMAT }]\n\t\t\t},\n\t\t\tprimitive: { topology: \"triangle-strip\" }\n\t\t}),\n\t\tsampler: device.createSampler({\n\t\t\tmagFilter: \"linear\",\n\t\t\tminFilter: \"linear\"\n\t\t})\n\t};\n});\nfunction historyFor(effect, device, width, height) {\n\tconst h = effect.feedbackHistory;\n\tif (h && h.device === device && h.width === width && h.height === height) return h;\n\th?.front.destroy();\n\th?.back.destroy();\n\tconst make = (label) => device.createTexture({\n\t\tlabel,\n\t\tsize: [width, height],\n\t\tformat: HISTORY_FORMAT,\n\t\tusage: GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.COPY_SRC | GPUTextureUsage.COPY_DST\n\t});\n\tconst next = {\n\t\tdevice,\n\t\twidth,\n\t\theight,\n\t\tfront: make(\"trails_front\"),\n\t\tback: make(\"trails_back\"),\n\t\tframe: -1\n\t};\n\teffect.feedbackHistory = next;\n\treturn next;\n}\nasync function childAt(args, frame, compositionStart, h) {\n\tconst child = args.props.virtualMedia?.children?.[0];\n\tif (!child) return null;\n\treturn drawChildToTexture(args, child, {\n\t\texclude: [h.front, h.back],\n\t\tprops: {\n\t\t\t...args.props,\n\t\t\tvirtualMedia: child,\n\t\t\tframe,\n\t\t\tcompositionFrame: compositionStart + frame\n\t\t}\n\t});\n}\nfunction swap(h) {\n\tconst t = h.front;\n\th.front = h.back;\n\th.back = t;\n}\nasync function stepTrails(args, h, v, frame, compositionStart, fresh) {\n\tconst cur = await childAt(args, frame, compositionStart, h);\n\tif (!cur) return;\n\tconst r = resources(args.ctx.device);\n\tconst uniforms = new Float32Array([\n\t\tv.decay,\n\t\t{\n\t\t\tover: 0,\n\t\t\tadd: 1,\n\t\t\tmax: 2,\n\t\t\tblend: 3\n\t\t}[v.mode] ?? 0,\n\t\tv.zoom,\n\t\tv.rotation * Math.PI / 180,\n\t\tv.offsetX / h.width,\n\t\tv.offsetY / h.height,\n\t\tv.hueShift * Math.PI / 180,\n\t\tfresh ? 1 : 0\n\t]);\n\tdrawFullscreenPass(args.encoder, h.back.createView(), r.pipeline, [args.ctx.device.createBindGroup({\n\t\tlayout: r.layout,\n\t\tentries: [\n\t\t\t{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: { buffer: args.ctx.renderer.getTemporaryBuffer(uniforms) }\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 1,\n\t\t\t\tresource: h.front.createView()\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 2,\n\t\t\t\tresource: cur.view\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 3,\n\t\t\t\tresource: r.sampler\n\t\t\t}\n\t\t]\n\t})]);\n\tswap(h);\n\th.frame = frame;\n}\nfunction num(v, fallback) {\n\treturn typeof v === \"number\" && Number.isFinite(v) ? v : fallback;\n}\nconst TrailsWebGPURenderer = async (args) => {\n\tconst { ctx, pass, targetWidth, targetHeight, props } = args;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"Trails\" || !op.effect?.resolveUniforms) return;\n\tif (!props.virtualMedia?.children?.[0]) return;\n\tpass.end();\n\tconst fps = props.fps || 30;\n\tconst local = Math.max(0, Math.round(props.frame ?? 0));\n\tconst compositionFrame = Math.round(props.compositionFrame ?? local);\n\tconst compositionStart = compositionFrame - local;\n\tconst raw = op.effect.resolveUniforms({\n\t\tframe: compositionFrame,\n\t\tfps,\n\t\ttime: compositionFrame / fps\n\t});\n\tconst h = historyFor(op.effect, ctx.device, targetWidth, targetHeight);\n\t{\n\t\tconst v = {\n\t\t\tdecay: Math.min(1, Math.max(0, num(raw.decay, .9))),\n\t\t\tmode: raw.mode ?? \"blend\",\n\t\t\tzoom: num(raw.zoom, 1),\n\t\t\trotation: num(raw.rotation, 0),\n\t\t\toffsetX: num(raw.offsetX, 0),\n\t\t\toffsetY: num(raw.offsetY, 0),\n\t\t\thueShift: num(raw.hueShift, 0),\n\t\t\twarmup: Math.max(0, Math.round(num(raw.warmup, 60)))\n\t\t};\n\t\tif (h.frame !== local) {\n\t\t\tlet start = local;\n\t\t\tif (h.frame === local - 1) start = local;\n\t\t\telse {\n\t\t\t\tconst needed = v.decay > 0 && v.decay < 1 ? Math.ceil(Math.log(.005) / Math.log(v.decay)) : v.warmup;\n\t\t\t\tstart = Math.max(0, local - Math.min(v.warmup, needed));\n\t\t\t\th.frame = -1;\n\t\t\t}\n\t\t\tfor (let f = start; f <= local; f++) await stepTrails(args, h, v, f, compositionStart, h.frame < 0);\n\t\t}\n\t}\n\tdrawTextureToTarget(args, h.front);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: TrailsWebGPURenderer });\n\n//#endregion\nexport { TrailsWebGPURenderer as n, renderers_default as t };\n//# sourceMappingURL=renderers-C37o-6Mg.mjs.map"],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import "./chunk-DOL2i2sR.mjs";
2
+ import "./dist-XqlFM2a8.mjs";
3
+ import { t as renderers_default } from "./renderer-CbbnBLOB.mjs";
4
+
5
+ export { renderers_default as default };
@@ -1,6 +1,6 @@
1
1
  import { xn as resolveNumber } from "./dist-C8XSqfTx.mjs";
2
2
  import { a as isHandleConnected, n as defineRenderer } from "./renderer-BuvKGwk3.mjs";
3
- import { g as WebGPUAudioProcessor } from "./dist-DtPPPsZV.mjs";
3
+ import { y as WebGPUAudioProcessor } from "./dist-XqlFM2a8.mjs";
4
4
 
5
5
  //#region ../../nodes/node-audio-noise-gate/dist/renderers-AuTJmGew.mjs
6
6
  const PARAM_ORDER = [
@@ -279,4 +279,4 @@ var renderers_default = defineRenderer({ audioProcessor: noiseGateAudioProcessor
279
279
 
280
280
  //#endregion
281
281
  export { renderers_default as t };
282
- //# sourceMappingURL=renderer-CO9vE3sd.mjs.map
282
+ //# sourceMappingURL=renderer-Gj8SrE2W.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-CO9vE3sd.mjs","names":[],"sources":["../../../nodes/node-audio-noise-gate/dist/renderers-AuTJmGew.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { isHandleConnected, resolveNumber } from \"@framefields/node-sdk\";\nimport { WebGPUAudioProcessor } from \"@framefields/webgpu-renderers\";\n\n//#region src/renderers/audio-processor.ts\nconst PARAM_ORDER = [\n\t\"threshold\",\n\t\"attack\",\n\t\"hold\",\n\t\"release\",\n\t\"range\"\n];\nconst NOISE_GATE_SHADER_TEMPLATE = () => `\nstruct Uniforms {\n sampleRate : f32,\n threshold : f32,\n attack : f32,\n hold : f32,\n release : f32,\n closedGain : f32,\n windowLength : f32,\n hasThresholdSig : f32,\n hasAttackSig : f32,\n hasHoldSig : f32,\n hasReleaseSig : f32,\n hasRangeSig : f32,\n baseTime : f32,\n frame : f32,\n numSamples : f32,\n numChannels : f32,\n};\n\n@group(0) @binding(0) var<uniform> u : Uniforms;\n@group(0) @binding(1) var<storage, read> inputChannels : array<f32>;\n@group(0) @binding(2) var<storage, read_write> outputChannels : array<f32>;\n@group(0) @binding(3) var<storage, read_write> state : array<f32>;\n@group(0) @binding(4) var<storage, read> thresholdSignal : array<f32>;\n@group(0) @binding(5) var<storage, read> attackSignal : array<f32>;\n@group(0) @binding(6) var<storage, read> holdSignal : array<f32>;\n@group(0) @binding(7) var<storage, read> releaseSignal : array<f32>;\n@group(0) @binding(8) var<storage, read> rangeSignal : array<f32>;\n\nfn log10(x: f32) -> f32 {\n return log(x) * 0.4342944819032518f;\n}\n\nfn tanh(x: f32) -> f32 {\n let exp2x = exp(2.0f * x);\n return (exp2x - 1.0f) / (exp2x + 1.0f);\n}\n\nfn is_nan_or_inf(v: f32) -> bool {\n return (v != v) || (abs(v) > 3.402823466e+38f);\n}\n\n@compute @workgroup_size(1)\nfn main(@builtin(global_invocation_id) gid : vec3<u32>) {\n if (gid.x != 0u) { return; }\n\n let numSamples = u32(u.numSamples);\n let numChannels = u32(u.numChannels);\n let windowLength = u32(u.windowLength);\n\n var gateState = u32(state[0]); // 0=CLOSED, 1=ATTACK, 2=OPEN, 3=HOLD, 4=RELEASE\n if (is_nan_or_inf(state[0])) { gateState = 0u; }\n\n var currentGain = state[1];\n if (is_nan_or_inf(currentGain)) { currentGain = 0.0f; }\n\n var gainAtTransition = state[2];\n if (is_nan_or_inf(gainAtTransition)) { gainAtTransition = 0.0f; }\n\n var attackSamplesLeft = i32(state[3]);\n var holdSamplesLeft = i32(state[4]);\n var releaseSamplesLeft = i32(state[5]);\n var writeIndex = u32(state[6]);\n var sumSquares = state[7];\n if (is_nan_or_inf(sumSquares)) { sumSquares = 0.0f; }\n\n let sampleRate = u.sampleRate;\n\n for (var index = 0u; index < numSamples; index = index + 1u) {\n // 1. Dynamic Parameter Modulation & Anti-Explosion Clamping\n var effThreshold = u.threshold;\n if (u.hasThresholdSig > 0.5f) {\n effThreshold = thresholdSignal[index];\n }\n effThreshold = clamp(effThreshold, -120.0f, 0.0f);\n\n var effAttack = u.attack;\n if (u.hasAttackSig > 0.5f) {\n effAttack = attackSignal[index];\n }\n effAttack = clamp(effAttack, 0.0001f, 5.0f);\n\n var effHold = u.hold;\n if (u.hasHoldSig > 0.5f) {\n effHold = holdSignal[index];\n }\n effHold = clamp(effHold, 0.001f, 10.0f);\n\n var effRelease = u.release;\n if (u.hasReleaseSig > 0.5f) {\n effRelease = releaseSignal[index];\n }\n effRelease = clamp(effRelease, 0.01f, 10.0f);\n\n var effRange = u.closedGain;\n if (u.hasRangeSig > 0.5f) {\n let rDb = clamp(rangeSignal[index], -120.0f, 0.0f);\n effRange = select(0.0f, pow(10.0f, rDb / 20.0f), rDb > -96.0f);\n }\n effRange = clamp(effRange, 0.0f, 1.0f);\n\n // 2. Peak & RMS Window Calculation\n var peak = 0.0f;\n for (var c = 0u; c < numChannels; c = c + 1u) {\n var val = abs(inputChannels[c * numSamples + index]);\n if (is_nan_or_inf(val)) { val = 0.0f; }\n if (val > peak) {\n peak = val;\n }\n }\n\n let inputPowerSq = peak * peak;\n let oldestSq = state[8u + writeIndex];\n state[8u + writeIndex] = inputPowerSq;\n sumSquares = max(0.0f, sumSquares - oldestSq + inputPowerSq);\n writeIndex = (writeIndex + 1u) % windowLength;\n\n if (writeIndex == 0u) {\n var sum = 0.0f;\n for (var j = 0u; j < windowLength; j = j + 1u) {\n sum = sum + state[8u + j];\n }\n sumSquares = sum;\n }\n\n let rms = sqrt(sumSquares / f32(windowLength));\n let db = 20.0f * log10(max(rms, 1e-9f));\n\n let signalAboveThreshold = db >= effThreshold;\n\n if (signalAboveThreshold) {\n if (gateState == 0u || gateState == 4u) {\n gateState = 1u; // ATTACK\n gainAtTransition = currentGain;\n var samples = i32(round(effAttack * sampleRate));\n if (samples <= 0) { samples = 1; }\n attackSamplesLeft = samples;\n } else if (gateState == 3u) {\n gateState = 2u; // OPEN\n currentGain = 1.0f;\n }\n } else {\n if (gateState == 2u || gateState == 1u) {\n gateState = 3u; // HOLD\n var samples = i32(round(effHold * sampleRate));\n if (samples <= 0) { samples = 1; }\n holdSamplesLeft = samples;\n }\n }\n\n if (gateState == 0u) {\n currentGain = effRange;\n } else if (gateState == 2u) {\n currentGain = 1.0f;\n } else if (gateState == 1u) {\n var totalAttackSamples = i32(round(effAttack * sampleRate));\n if (totalAttackSamples <= 0) { totalAttackSamples = 1; }\n let progress = 1.0f - f32(attackSamplesLeft) / f32(totalAttackSamples);\n currentGain = gainAtTransition + progress * (1.0f - gainAtTransition);\n\n attackSamplesLeft = attackSamplesLeft - 1;\n if (attackSamplesLeft <= 0) {\n gateState = 2u;\n currentGain = 1.0f;\n }\n } else if (gateState == 3u) {\n currentGain = 1.0f;\n holdSamplesLeft = holdSamplesLeft - 1;\n if (holdSamplesLeft <= 0) {\n gateState = 4u; // RELEASE\n gainAtTransition = 1.0f;\n var samples = i32(round(effRelease * sampleRate));\n if (samples <= 0) { samples = 1; }\n releaseSamplesLeft = samples;\n }\n } else if (gateState == 4u) {\n var totalReleaseSamples = i32(round(effRelease * sampleRate));\n if (totalReleaseSamples <= 0) { totalReleaseSamples = 1; }\n let progress = 1.0f - f32(releaseSamplesLeft) / f32(totalReleaseSamples);\n currentGain = gainAtTransition + progress * (effRange - gainAtTransition);\n\n releaseSamplesLeft = releaseSamplesLeft - 1;\n if (releaseSamplesLeft <= 0) {\n gateState = 0u;\n currentGain = effRange;\n }\n }\n\n currentGain = clamp(currentGain, 0.0f, 1.0f);\n\n for (var c = 0u; c < numChannels; c = c + 1u) {\n let sampleIndex = c * numSamples + index;\n var inVal = inputChannels[sampleIndex];\n if (is_nan_or_inf(inVal)) { inVal = 0.0f; }\n\n var outVal = inVal * currentGain;\n if (is_nan_or_inf(outVal)) { outVal = 0.0f; }\n\n if (outVal > 1.0f) {\n outVal = 1.0f;\n } else if (outVal < -1.0f) {\n outVal = -1.0f;\n } else if (outVal > 0.9f) {\n outVal = 0.9f + 0.1f * tanh((outVal - 0.9f) / 0.1f);\n } else if (outVal < -0.9f) {\n outVal = -0.9f + 0.1f * tanh((outVal + 0.9f) / 0.1f);\n }\n\n outputChannels[sampleIndex] = outVal;\n }\n }\n\n state[0] = f32(gateState);\n state[1] = currentGain;\n state[2] = gainAtTransition;\n state[3] = f32(attackSamplesLeft);\n state[4] = f32(holdSamplesLeft);\n state[5] = f32(releaseSamplesLeft);\n state[6] = f32(writeIndex);\n state[7] = sumSquares;\n}\n`;\nconst noiseGateAudioProcessor = async (channels, sampleRate, virtualMedia, ctx) => {\n\tif (!ctx?.device) throw new Error(\"GPUDevice is required for WebGPU Noise Gate.\");\n\tconst op = virtualMedia.operation || {};\n\tconst threshold = resolveNumber(op.threshold, -40);\n\tconst attack = resolveNumber(op.attack, .005);\n\tconst hold = resolveNumber(op.hold, .05);\n\tconst release = resolveNumber(op.release, .1);\n\tconst range = resolveNumber(op.range, -80);\n\tconst closedGain = range <= -96 ? 0 : 10 ** (range / 20);\n\tconst hasThresholdSig = isHandleConnected(op, \"thresholdHandleId\") ? 1 : 0;\n\tconst hasAttackSig = isHandleConnected(op, \"attackHandleId\") ? 1 : 0;\n\tconst hasHoldSig = isHandleConnected(op, \"holdHandleId\") ? 1 : 0;\n\tconst hasReleaseSig = isHandleConnected(op, \"releaseHandleId\") ? 1 : 0;\n\tconst hasRangeSig = isHandleConnected(op, \"rangeHandleId\") ? 1 : 0;\n\tconst numChannels = channels.length;\n\tif (numChannels === 0) return;\n\tconst numSamples = channels[0].length;\n\tif (numSamples === 0) return;\n\tconst windowLength = Math.max(1, Math.round(.01 * sampleRate));\n\tconst nodeId = op.id || \"audio-noise-gate\";\n\tconst frame = ctx.frame ?? 0;\n\tconst fps = ctx.fps ?? 24;\n\tconst stateFloatCount = 8 + windowLength;\n\tawait WebGPUAudioProcessor.process(ctx.device, nodeId, channels, sampleRate, virtualMedia, frame, fps, NOISE_GATE_SHADER_TEMPLATE, () => [\n\t\tsampleRate,\n\t\tthreshold,\n\t\tattack,\n\t\thold,\n\t\trelease,\n\t\tclosedGain,\n\t\twindowLength,\n\t\thasThresholdSig,\n\t\thasAttackSig,\n\t\thasHoldSig,\n\t\thasReleaseSig,\n\t\thasRangeSig,\n\t\t0,\n\t\tframe,\n\t\tnumSamples,\n\t\tnumChannels\n\t], 16, stateFloatCount, ctx?.renderId, true, ctx?.elapsedMs, ctx?.durationMs, void 0, void 0, PARAM_ORDER);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ audioProcessor: noiseGateAudioProcessor });\n\n//#endregion\nexport { renderers_default as t };\n//# sourceMappingURL=renderers-AuTJmGew.mjs.map"],"mappings":";;;;;AAKA,MAAM,cAAc;CACnB;CACA;CACA;CACA;CACA;CACA;AACD,MAAM,mCAAmC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+NzC,MAAM,0BAA0B,OAAO,UAAU,YAAY,cAAc,QAAQ;AAClF,KAAI,CAAC,KAAK,OAAQ,OAAM,IAAI,MAAM,+CAA+C;CACjF,MAAM,KAAK,aAAa,aAAa,EAAE;CACvC,MAAM,YAAY,cAAc,GAAG,WAAW,IAAI;CAClD,MAAM,SAAS,cAAc,GAAG,QAAQ,KAAK;CAC7C,MAAM,OAAO,cAAc,GAAG,MAAM,IAAI;CACxC,MAAM,UAAU,cAAc,GAAG,SAAS,GAAG;CAC7C,MAAM,QAAQ,cAAc,GAAG,OAAO,IAAI;CAC1C,MAAM,aAAa,SAAS,MAAM,IAAI,OAAO,QAAQ;CACrD,MAAM,kBAAkB,kBAAkB,IAAI,oBAAoB,GAAG,IAAI;CACzE,MAAM,eAAe,kBAAkB,IAAI,iBAAiB,GAAG,IAAI;CACnE,MAAM,aAAa,kBAAkB,IAAI,eAAe,GAAG,IAAI;CAC/D,MAAM,gBAAgB,kBAAkB,IAAI,kBAAkB,GAAG,IAAI;CACrE,MAAM,cAAc,kBAAkB,IAAI,gBAAgB,GAAG,IAAI;CACjE,MAAM,cAAc,SAAS;AAC7B,KAAI,gBAAgB,EAAG;CACvB,MAAM,aAAa,SAAS,GAAG;AAC/B,KAAI,eAAe,EAAG;CACtB,MAAM,eAAe,KAAK,IAAI,GAAG,KAAK,MAAM,MAAM,WAAW,CAAC;CAC9D,MAAM,SAAS,GAAG,MAAM;CACxB,MAAM,QAAQ,IAAI,SAAS;CAC3B,MAAM,MAAM,IAAI,OAAO;CACvB,MAAM,kBAAkB,IAAI;AAC5B,OAAM,qBAAqB,QAAQ,IAAI,QAAQ,QAAQ,UAAU,YAAY,cAAc,OAAO,KAAK,kCAAkC;EACxI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,EAAE,IAAI,iBAAiB,KAAK,UAAU,MAAM,KAAK,WAAW,KAAK,YAAY,KAAK,GAAG,KAAK,GAAG,YAAY;;AAK3G,IAAI,oBAAoB,eAAe,EAAE,gBAAgB,yBAAyB,CAAC"}
1
+ {"version":3,"file":"renderer-Gj8SrE2W.mjs","names":[],"sources":["../../../nodes/node-audio-noise-gate/dist/renderers-AuTJmGew.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { isHandleConnected, resolveNumber } from \"@framefields/node-sdk\";\nimport { WebGPUAudioProcessor } from \"@framefields/webgpu-renderers\";\n\n//#region src/renderers/audio-processor.ts\nconst PARAM_ORDER = [\n\t\"threshold\",\n\t\"attack\",\n\t\"hold\",\n\t\"release\",\n\t\"range\"\n];\nconst NOISE_GATE_SHADER_TEMPLATE = () => `\nstruct Uniforms {\n sampleRate : f32,\n threshold : f32,\n attack : f32,\n hold : f32,\n release : f32,\n closedGain : f32,\n windowLength : f32,\n hasThresholdSig : f32,\n hasAttackSig : f32,\n hasHoldSig : f32,\n hasReleaseSig : f32,\n hasRangeSig : f32,\n baseTime : f32,\n frame : f32,\n numSamples : f32,\n numChannels : f32,\n};\n\n@group(0) @binding(0) var<uniform> u : Uniforms;\n@group(0) @binding(1) var<storage, read> inputChannels : array<f32>;\n@group(0) @binding(2) var<storage, read_write> outputChannels : array<f32>;\n@group(0) @binding(3) var<storage, read_write> state : array<f32>;\n@group(0) @binding(4) var<storage, read> thresholdSignal : array<f32>;\n@group(0) @binding(5) var<storage, read> attackSignal : array<f32>;\n@group(0) @binding(6) var<storage, read> holdSignal : array<f32>;\n@group(0) @binding(7) var<storage, read> releaseSignal : array<f32>;\n@group(0) @binding(8) var<storage, read> rangeSignal : array<f32>;\n\nfn log10(x: f32) -> f32 {\n return log(x) * 0.4342944819032518f;\n}\n\nfn tanh(x: f32) -> f32 {\n let exp2x = exp(2.0f * x);\n return (exp2x - 1.0f) / (exp2x + 1.0f);\n}\n\nfn is_nan_or_inf(v: f32) -> bool {\n return (v != v) || (abs(v) > 3.402823466e+38f);\n}\n\n@compute @workgroup_size(1)\nfn main(@builtin(global_invocation_id) gid : vec3<u32>) {\n if (gid.x != 0u) { return; }\n\n let numSamples = u32(u.numSamples);\n let numChannels = u32(u.numChannels);\n let windowLength = u32(u.windowLength);\n\n var gateState = u32(state[0]); // 0=CLOSED, 1=ATTACK, 2=OPEN, 3=HOLD, 4=RELEASE\n if (is_nan_or_inf(state[0])) { gateState = 0u; }\n\n var currentGain = state[1];\n if (is_nan_or_inf(currentGain)) { currentGain = 0.0f; }\n\n var gainAtTransition = state[2];\n if (is_nan_or_inf(gainAtTransition)) { gainAtTransition = 0.0f; }\n\n var attackSamplesLeft = i32(state[3]);\n var holdSamplesLeft = i32(state[4]);\n var releaseSamplesLeft = i32(state[5]);\n var writeIndex = u32(state[6]);\n var sumSquares = state[7];\n if (is_nan_or_inf(sumSquares)) { sumSquares = 0.0f; }\n\n let sampleRate = u.sampleRate;\n\n for (var index = 0u; index < numSamples; index = index + 1u) {\n // 1. Dynamic Parameter Modulation & Anti-Explosion Clamping\n var effThreshold = u.threshold;\n if (u.hasThresholdSig > 0.5f) {\n effThreshold = thresholdSignal[index];\n }\n effThreshold = clamp(effThreshold, -120.0f, 0.0f);\n\n var effAttack = u.attack;\n if (u.hasAttackSig > 0.5f) {\n effAttack = attackSignal[index];\n }\n effAttack = clamp(effAttack, 0.0001f, 5.0f);\n\n var effHold = u.hold;\n if (u.hasHoldSig > 0.5f) {\n effHold = holdSignal[index];\n }\n effHold = clamp(effHold, 0.001f, 10.0f);\n\n var effRelease = u.release;\n if (u.hasReleaseSig > 0.5f) {\n effRelease = releaseSignal[index];\n }\n effRelease = clamp(effRelease, 0.01f, 10.0f);\n\n var effRange = u.closedGain;\n if (u.hasRangeSig > 0.5f) {\n let rDb = clamp(rangeSignal[index], -120.0f, 0.0f);\n effRange = select(0.0f, pow(10.0f, rDb / 20.0f), rDb > -96.0f);\n }\n effRange = clamp(effRange, 0.0f, 1.0f);\n\n // 2. Peak & RMS Window Calculation\n var peak = 0.0f;\n for (var c = 0u; c < numChannels; c = c + 1u) {\n var val = abs(inputChannels[c * numSamples + index]);\n if (is_nan_or_inf(val)) { val = 0.0f; }\n if (val > peak) {\n peak = val;\n }\n }\n\n let inputPowerSq = peak * peak;\n let oldestSq = state[8u + writeIndex];\n state[8u + writeIndex] = inputPowerSq;\n sumSquares = max(0.0f, sumSquares - oldestSq + inputPowerSq);\n writeIndex = (writeIndex + 1u) % windowLength;\n\n if (writeIndex == 0u) {\n var sum = 0.0f;\n for (var j = 0u; j < windowLength; j = j + 1u) {\n sum = sum + state[8u + j];\n }\n sumSquares = sum;\n }\n\n let rms = sqrt(sumSquares / f32(windowLength));\n let db = 20.0f * log10(max(rms, 1e-9f));\n\n let signalAboveThreshold = db >= effThreshold;\n\n if (signalAboveThreshold) {\n if (gateState == 0u || gateState == 4u) {\n gateState = 1u; // ATTACK\n gainAtTransition = currentGain;\n var samples = i32(round(effAttack * sampleRate));\n if (samples <= 0) { samples = 1; }\n attackSamplesLeft = samples;\n } else if (gateState == 3u) {\n gateState = 2u; // OPEN\n currentGain = 1.0f;\n }\n } else {\n if (gateState == 2u || gateState == 1u) {\n gateState = 3u; // HOLD\n var samples = i32(round(effHold * sampleRate));\n if (samples <= 0) { samples = 1; }\n holdSamplesLeft = samples;\n }\n }\n\n if (gateState == 0u) {\n currentGain = effRange;\n } else if (gateState == 2u) {\n currentGain = 1.0f;\n } else if (gateState == 1u) {\n var totalAttackSamples = i32(round(effAttack * sampleRate));\n if (totalAttackSamples <= 0) { totalAttackSamples = 1; }\n let progress = 1.0f - f32(attackSamplesLeft) / f32(totalAttackSamples);\n currentGain = gainAtTransition + progress * (1.0f - gainAtTransition);\n\n attackSamplesLeft = attackSamplesLeft - 1;\n if (attackSamplesLeft <= 0) {\n gateState = 2u;\n currentGain = 1.0f;\n }\n } else if (gateState == 3u) {\n currentGain = 1.0f;\n holdSamplesLeft = holdSamplesLeft - 1;\n if (holdSamplesLeft <= 0) {\n gateState = 4u; // RELEASE\n gainAtTransition = 1.0f;\n var samples = i32(round(effRelease * sampleRate));\n if (samples <= 0) { samples = 1; }\n releaseSamplesLeft = samples;\n }\n } else if (gateState == 4u) {\n var totalReleaseSamples = i32(round(effRelease * sampleRate));\n if (totalReleaseSamples <= 0) { totalReleaseSamples = 1; }\n let progress = 1.0f - f32(releaseSamplesLeft) / f32(totalReleaseSamples);\n currentGain = gainAtTransition + progress * (effRange - gainAtTransition);\n\n releaseSamplesLeft = releaseSamplesLeft - 1;\n if (releaseSamplesLeft <= 0) {\n gateState = 0u;\n currentGain = effRange;\n }\n }\n\n currentGain = clamp(currentGain, 0.0f, 1.0f);\n\n for (var c = 0u; c < numChannels; c = c + 1u) {\n let sampleIndex = c * numSamples + index;\n var inVal = inputChannels[sampleIndex];\n if (is_nan_or_inf(inVal)) { inVal = 0.0f; }\n\n var outVal = inVal * currentGain;\n if (is_nan_or_inf(outVal)) { outVal = 0.0f; }\n\n if (outVal > 1.0f) {\n outVal = 1.0f;\n } else if (outVal < -1.0f) {\n outVal = -1.0f;\n } else if (outVal > 0.9f) {\n outVal = 0.9f + 0.1f * tanh((outVal - 0.9f) / 0.1f);\n } else if (outVal < -0.9f) {\n outVal = -0.9f + 0.1f * tanh((outVal + 0.9f) / 0.1f);\n }\n\n outputChannels[sampleIndex] = outVal;\n }\n }\n\n state[0] = f32(gateState);\n state[1] = currentGain;\n state[2] = gainAtTransition;\n state[3] = f32(attackSamplesLeft);\n state[4] = f32(holdSamplesLeft);\n state[5] = f32(releaseSamplesLeft);\n state[6] = f32(writeIndex);\n state[7] = sumSquares;\n}\n`;\nconst noiseGateAudioProcessor = async (channels, sampleRate, virtualMedia, ctx) => {\n\tif (!ctx?.device) throw new Error(\"GPUDevice is required for WebGPU Noise Gate.\");\n\tconst op = virtualMedia.operation || {};\n\tconst threshold = resolveNumber(op.threshold, -40);\n\tconst attack = resolveNumber(op.attack, .005);\n\tconst hold = resolveNumber(op.hold, .05);\n\tconst release = resolveNumber(op.release, .1);\n\tconst range = resolveNumber(op.range, -80);\n\tconst closedGain = range <= -96 ? 0 : 10 ** (range / 20);\n\tconst hasThresholdSig = isHandleConnected(op, \"thresholdHandleId\") ? 1 : 0;\n\tconst hasAttackSig = isHandleConnected(op, \"attackHandleId\") ? 1 : 0;\n\tconst hasHoldSig = isHandleConnected(op, \"holdHandleId\") ? 1 : 0;\n\tconst hasReleaseSig = isHandleConnected(op, \"releaseHandleId\") ? 1 : 0;\n\tconst hasRangeSig = isHandleConnected(op, \"rangeHandleId\") ? 1 : 0;\n\tconst numChannels = channels.length;\n\tif (numChannels === 0) return;\n\tconst numSamples = channels[0].length;\n\tif (numSamples === 0) return;\n\tconst windowLength = Math.max(1, Math.round(.01 * sampleRate));\n\tconst nodeId = op.id || \"audio-noise-gate\";\n\tconst frame = ctx.frame ?? 0;\n\tconst fps = ctx.fps ?? 24;\n\tconst stateFloatCount = 8 + windowLength;\n\tawait WebGPUAudioProcessor.process(ctx.device, nodeId, channels, sampleRate, virtualMedia, frame, fps, NOISE_GATE_SHADER_TEMPLATE, () => [\n\t\tsampleRate,\n\t\tthreshold,\n\t\tattack,\n\t\thold,\n\t\trelease,\n\t\tclosedGain,\n\t\twindowLength,\n\t\thasThresholdSig,\n\t\thasAttackSig,\n\t\thasHoldSig,\n\t\thasReleaseSig,\n\t\thasRangeSig,\n\t\t0,\n\t\tframe,\n\t\tnumSamples,\n\t\tnumChannels\n\t], 16, stateFloatCount, ctx?.renderId, true, ctx?.elapsedMs, ctx?.durationMs, void 0, void 0, PARAM_ORDER);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ audioProcessor: noiseGateAudioProcessor });\n\n//#endregion\nexport { renderers_default as t };\n//# sourceMappingURL=renderers-AuTJmGew.mjs.map"],"mappings":";;;;;AAKA,MAAM,cAAc;CACnB;CACA;CACA;CACA;CACA;CACA;AACD,MAAM,mCAAmC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+NzC,MAAM,0BAA0B,OAAO,UAAU,YAAY,cAAc,QAAQ;AAClF,KAAI,CAAC,KAAK,OAAQ,OAAM,IAAI,MAAM,+CAA+C;CACjF,MAAM,KAAK,aAAa,aAAa,EAAE;CACvC,MAAM,YAAY,cAAc,GAAG,WAAW,IAAI;CAClD,MAAM,SAAS,cAAc,GAAG,QAAQ,KAAK;CAC7C,MAAM,OAAO,cAAc,GAAG,MAAM,IAAI;CACxC,MAAM,UAAU,cAAc,GAAG,SAAS,GAAG;CAC7C,MAAM,QAAQ,cAAc,GAAG,OAAO,IAAI;CAC1C,MAAM,aAAa,SAAS,MAAM,IAAI,OAAO,QAAQ;CACrD,MAAM,kBAAkB,kBAAkB,IAAI,oBAAoB,GAAG,IAAI;CACzE,MAAM,eAAe,kBAAkB,IAAI,iBAAiB,GAAG,IAAI;CACnE,MAAM,aAAa,kBAAkB,IAAI,eAAe,GAAG,IAAI;CAC/D,MAAM,gBAAgB,kBAAkB,IAAI,kBAAkB,GAAG,IAAI;CACrE,MAAM,cAAc,kBAAkB,IAAI,gBAAgB,GAAG,IAAI;CACjE,MAAM,cAAc,SAAS;AAC7B,KAAI,gBAAgB,EAAG;CACvB,MAAM,aAAa,SAAS,GAAG;AAC/B,KAAI,eAAe,EAAG;CACtB,MAAM,eAAe,KAAK,IAAI,GAAG,KAAK,MAAM,MAAM,WAAW,CAAC;CAC9D,MAAM,SAAS,GAAG,MAAM;CACxB,MAAM,QAAQ,IAAI,SAAS;CAC3B,MAAM,MAAM,IAAI,OAAO;CACvB,MAAM,kBAAkB,IAAI;AAC5B,OAAM,qBAAqB,QAAQ,IAAI,QAAQ,QAAQ,UAAU,YAAY,cAAc,OAAO,KAAK,kCAAkC;EACxI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,EAAE,IAAI,iBAAiB,KAAK,UAAU,MAAM,KAAK,WAAW,KAAK,YAAY,KAAK,GAAG,KAAK,GAAG,YAAY;;AAK3G,IAAI,oBAAoB,eAAe,EAAE,gBAAgB,yBAAyB,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import { d as unwrapFrameParam, n as defineRenderer } from "./renderer-BuvKGwk3.mjs";
2
- import { q as parseColor } from "./dist-DtPPPsZV.mjs";
3
- import { a as createFullscreenPipeline, c as drawTextureToTarget, f as signalTextureView, l as fragmentBindGroupLayout, m as texturesLayout, o as drawChildToTexture, p as signalTiming, s as drawFullscreenPass, t as FULLSCREEN_QUAD_WGSL, u as perDevice } from "./gpu-D2HT3KcE.mjs";
2
+ import { tt as parseColor } from "./dist-XqlFM2a8.mjs";
3
+ import { a as createFullscreenPipeline, c as drawTextureToTarget, f as signalTextureView, l as fragmentBindGroupLayout, m as texturesLayout, o as drawChildToTexture, p as signalTiming, s as drawFullscreenPass, t as FULLSCREEN_QUAD_WGSL, u as perDevice } from "./gpu-CH1PdM4T.mjs";
4
4
 
5
5
  //#region ../../nodes/node-halftone-screen/dist/renderers-CvluQiq3.mjs
6
6
  const WGSL_HALFTONE_SHADER = `
@@ -456,4 +456,4 @@ var renderers_default = defineRenderer({ WebGPURenderer: HalftoneScreenWebGPURen
456
456
 
457
457
  //#endregion
458
458
  export { renderers_default as t };
459
- //# sourceMappingURL=renderer-DvHi_wXE.mjs.map
459
+ //# sourceMappingURL=renderer-KfnXDJS0.mjs.map