framefields 2.9.0 → 2.9.3

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 (328) hide show
  1. package/NOTICE.md +14 -0
  2. package/README.md +1 -5
  3. package/dist/audio/index.d.mts +5 -4
  4. package/dist/audio/index.mjs +13 -13
  5. package/dist/{audio-BfQg37MW.mjs → audio-B6RmYOPe.mjs} +4 -4
  6. package/dist/{audio-BfQg37MW.mjs.map → audio-B6RmYOPe.mjs.map} +1 -1
  7. package/dist/{audio-a0MFkK6J.mjs → audio-BlDbnteH.mjs} +1 -1
  8. package/dist/{audio-a0MFkK6J.mjs.map → audio-BlDbnteH.mjs.map} +1 -1
  9. package/dist/{audio-Ccpl9mjV.d.mts → audio-D6tBMbHh.d.mts} +4 -3
  10. package/dist/audio-D6tBMbHh.d.mts.map +1 -0
  11. package/dist/{check-result-C3jlgV2i.mjs → check-result-Bj7g62ka.mjs} +1 -1
  12. package/dist/{check-result-C3jlgV2i.mjs.map → check-result-Bj7g62ka.mjs.map} +1 -1
  13. package/dist/cli/check-worker.mjs +50 -50
  14. package/dist/cli.mjs +1 -1
  15. package/dist/components/index.d.mts +14 -11
  16. package/dist/components/index.mjs +47 -47
  17. package/dist/dist-BlulwErl.mjs +3 -0
  18. package/dist/{dist-BlIrsfcn.mjs → dist-ByxHoMQI.mjs} +1 -1
  19. package/dist/{dist-BlIrsfcn.mjs.map → dist-ByxHoMQI.mjs.map} +1 -1
  20. package/dist/{dist-Buaaj-Ul.mjs → dist-Cn8bDsQF.mjs} +1 -1
  21. package/dist/{dist-Buaaj-Ul.mjs.map → dist-Cn8bDsQF.mjs.map} +1 -1
  22. package/dist/{dist-C1cCW7Bt.mjs → dist-D12-a3-x.mjs} +3 -3
  23. package/dist/{dist-C1cCW7Bt.mjs.map → dist-D12-a3-x.mjs.map} +1 -1
  24. package/dist/{dist-C8Xq3zgx.mjs → dist-DEUU6sNe.mjs} +4 -4
  25. package/dist/{dist-C8Xq3zgx.mjs.map → dist-DEUU6sNe.mjs.map} +1 -1
  26. package/dist/{dist-DVMepKaO.mjs → dist-DL1GwJvs.mjs} +2 -2
  27. package/dist/{dist-DVMepKaO.mjs.map → dist-DL1GwJvs.mjs.map} +1 -1
  28. package/dist/dist-Dq5TkNDI.mjs +1434 -0
  29. package/dist/dist-Dq5TkNDI.mjs.map +1 -0
  30. package/dist/effects/index.d.mts +6 -4
  31. package/dist/effects/index.mjs +36 -36
  32. package/dist/{effects-CemgqEPv.mjs → effects-CViUoQSV.mjs} +3 -3
  33. package/dist/{effects-CemgqEPv.mjs.map → effects-CViUoQSV.mjs.map} +1 -1
  34. package/dist/fonts/index.d.mts +1 -1
  35. package/dist/fonts/index.mjs +3 -3
  36. package/dist/{fonts-BW0pPcvJ.mjs → fonts-B0U2KO5I.mjs} +2 -2
  37. package/dist/{fonts-BW0pPcvJ.mjs.map → fonts-B0U2KO5I.mjs.map} +1 -1
  38. package/dist/{gpu-CMaa63nz.mjs → gpu-zFNrvhV9.mjs} +2 -2
  39. package/dist/{gpu-CMaa63nz.mjs.map → gpu-zFNrvhV9.mjs.map} +1 -1
  40. package/dist/index-9_4X2ro1.d.mts +2402 -0
  41. package/dist/index-9_4X2ro1.d.mts.map +1 -0
  42. package/dist/{index-CZjrnylh.d.mts → index-B9Lm1x8i.d.mts} +662 -640
  43. package/dist/index-B9Lm1x8i.d.mts.map +1 -0
  44. package/dist/{index-BfDFmIBE.d.mts → index-BuYtrhzL.d.mts} +1 -1
  45. package/dist/{index-BfDFmIBE.d.mts.map → index-BuYtrhzL.d.mts.map} +1 -1
  46. package/dist/{index-D5UDyVMb.d.mts → index-Bzo1uj8h.d.mts} +4 -2401
  47. package/dist/index-Bzo1uj8h.d.mts.map +1 -0
  48. package/dist/{index-Du5YgdzM.d.mts → index-C6GcuYVA.d.mts} +6 -1151
  49. package/dist/index-C6GcuYVA.d.mts.map +1 -0
  50. package/dist/{index-BIjMAW1h.d.mts → index-CgGM31I9.d.mts} +2 -2
  51. package/dist/{index-BIjMAW1h.d.mts.map → index-CgGM31I9.d.mts.map} +1 -1
  52. package/dist/index-DBhswLMO.d.mts +330 -0
  53. package/dist/index-DBhswLMO.d.mts.map +1 -0
  54. package/dist/{index-CJL0JAU8.d.mts → index-V0ZQ4JN6.d.mts} +2 -2
  55. package/dist/{index-CJL0JAU8.d.mts.map → index-V0ZQ4JN6.d.mts.map} +1 -1
  56. package/dist/{index-7Z9_a_iB.d.mts → index-f4IF1vRH.d.mts} +3 -3
  57. package/dist/{index-7Z9_a_iB.d.mts.map → index-f4IF1vRH.d.mts.map} +1 -1
  58. package/dist/index-svAgwTY_.d.mts +1163 -0
  59. package/dist/index-svAgwTY_.d.mts.map +1 -0
  60. package/dist/{index-CFoAmh7q.d.mts → index-w28KUM9A.d.mts} +3 -3
  61. package/dist/{index-CFoAmh7q.d.mts.map → index-w28KUM9A.d.mts.map} +1 -1
  62. package/dist/index.d.mts +15 -12
  63. package/dist/index.mjs +58 -57
  64. package/dist/preview/index.d.mts +4 -3
  65. package/dist/preview/index.mjs +12 -12
  66. package/dist/{preview-BQVgn6Ho.mjs → preview-ZKJ_zTmd.mjs} +3 -3
  67. package/dist/{preview-BQVgn6Ho.mjs.map → preview-ZKJ_zTmd.mjs.map} +1 -1
  68. package/dist/preview-engine/{chunk-GEUUXTDL.mjs → chunk-D73ZKPFN.mjs} +4 -4
  69. package/dist/preview-engine/{chunk-UQKPDGEH.mjs → chunk-EJJITH6U.mjs} +1 -1
  70. package/dist/preview-engine/{chunk-374QY63R.mjs → chunk-Q62GPWGD.mjs} +23 -23
  71. package/dist/preview-engine/chunk-XYGDTPO7.mjs +39 -0
  72. package/dist/preview-engine/components.mjs +1 -1
  73. package/dist/preview-engine/effects.mjs +1 -1
  74. package/dist/preview-engine/framefields.mjs +1 -1
  75. package/dist/preview-engine/player.mjs +1 -1
  76. package/dist/preview-engine/{renderers-O55BEDQZ.mjs → renderers-MDHPQY6D.mjs} +1 -1
  77. package/dist/preview-engine/src-4IUYUKIZ.mjs +8 -0
  78. package/dist/{program-CKpKkllV.mjs → program-xjIwjKb6.mjs} +4 -4
  79. package/dist/{program-CKpKkllV.mjs.map → program-xjIwjKb6.mjs.map} +1 -1
  80. package/dist/renderer/index.d.mts +3 -2
  81. package/dist/renderer/index.mjs +3 -3
  82. package/dist/renderer-129U3pc9.mjs +5 -0
  83. package/dist/renderer-2phFTFxQ.mjs +5 -0
  84. package/dist/{renderer-Bfk6A7UO.mjs → renderer-5qJPGvVL.mjs} +5 -5
  85. package/dist/{renderer-Bfk6A7UO.mjs.map → renderer-5qJPGvVL.mjs.map} +1 -1
  86. package/dist/renderer-9muKpDeE.mjs +5 -0
  87. package/dist/{renderer-B522Dkdk.mjs → renderer-AUK_ZS3p.mjs} +4 -4
  88. package/dist/{renderer-B522Dkdk.mjs.map → renderer-AUK_ZS3p.mjs.map} +1 -1
  89. package/dist/{renderer-DKgPVOLL.d.mts → renderer-B-inTgyb.d.mts} +2 -2
  90. package/dist/{renderer-DKgPVOLL.d.mts.map → renderer-B-inTgyb.d.mts.map} +1 -1
  91. package/dist/{renderer-BF0hx_iJ.mjs → renderer-B3IRvukr.mjs} +5 -5
  92. package/dist/{renderer-BF0hx_iJ.mjs.map → renderer-B3IRvukr.mjs.map} +1 -1
  93. package/dist/renderer-B5Dhv6j9.mjs +5 -0
  94. package/dist/{renderer-DO-KbpYZ.mjs → renderer-B6TjJi1g.mjs} +5 -5
  95. package/dist/{renderer-DO-KbpYZ.mjs.map → renderer-B6TjJi1g.mjs.map} +1 -1
  96. package/dist/{renderer-D61B9bXF.mjs → renderer-B78W9uad.mjs} +4 -4
  97. package/dist/{renderer-D61B9bXF.mjs.map → renderer-B78W9uad.mjs.map} +1 -1
  98. package/dist/{renderer-BPWDsufX.mjs → renderer-B7kOF_Az.mjs} +3 -3
  99. package/dist/{renderer-BPWDsufX.mjs.map → renderer-B7kOF_Az.mjs.map} +1 -1
  100. package/dist/renderer-BBUgCS3C.mjs +5 -0
  101. package/dist/{renderer-C7eFJf0_.mjs → renderer-BG6bkKtY.mjs} +5 -5
  102. package/dist/{renderer-C7eFJf0_.mjs.map → renderer-BG6bkKtY.mjs.map} +1 -1
  103. package/dist/{renderer-B39I6CQw.mjs → renderer-BJKzZwyn.mjs} +4 -4
  104. package/dist/{renderer-B39I6CQw.mjs.map → renderer-BJKzZwyn.mjs.map} +1 -1
  105. package/dist/{renderer-DqvoMLca.mjs → renderer-BJQt0RiZ.mjs} +5 -5
  106. package/dist/{renderer-DqvoMLca.mjs.map → renderer-BJQt0RiZ.mjs.map} +1 -1
  107. package/dist/renderer-BKXM28Mx.mjs +5 -0
  108. package/dist/renderer-BKqm6xdf.mjs +5 -0
  109. package/dist/{renderer-DiY70S8S.mjs → renderer-BMP_lYMk.mjs} +4 -4
  110. package/dist/{renderer-DiY70S8S.mjs.map → renderer-BMP_lYMk.mjs.map} +1 -1
  111. package/dist/renderer-BMfMMf0R.mjs +5 -0
  112. package/dist/{renderer-DkRSZg5g.mjs → renderer-BNbMi9CI.mjs} +5 -5
  113. package/dist/{renderer-DkRSZg5g.mjs.map → renderer-BNbMi9CI.mjs.map} +1 -1
  114. package/dist/{renderer-D7Al3_-5.mjs → renderer-BPYIqtNg.mjs} +5 -5
  115. package/dist/{renderer-D7Al3_-5.mjs.map → renderer-BPYIqtNg.mjs.map} +1 -1
  116. package/dist/renderer-BPsjEnnl.mjs +5 -0
  117. package/dist/{renderer-DDEkFbVI.mjs → renderer-BQOeeXTr.mjs} +5 -5
  118. package/dist/{renderer-DDEkFbVI.mjs.map → renderer-BQOeeXTr.mjs.map} +1 -1
  119. package/dist/{renderer-GBmWjBvy.mjs → renderer-BRWjLiHX.mjs} +3 -3
  120. package/dist/{renderer-GBmWjBvy.mjs.map → renderer-BRWjLiHX.mjs.map} +1 -1
  121. package/dist/{renderer-_iMAO698.mjs → renderer-BVql26Ay.mjs} +2 -2
  122. package/dist/{renderer-_iMAO698.mjs.map → renderer-BVql26Ay.mjs.map} +1 -1
  123. package/dist/{renderer-CHr7MiYW.mjs → renderer-BWMzjSgf.mjs} +5 -5
  124. package/dist/{renderer-CHr7MiYW.mjs.map → renderer-BWMzjSgf.mjs.map} +1 -1
  125. package/dist/{renderer-pHWEHDnM.mjs → renderer-BYqrtBvd.mjs} +5 -5
  126. package/dist/{renderer-pHWEHDnM.mjs.map → renderer-BYqrtBvd.mjs.map} +1 -1
  127. package/dist/{renderer-CwFqqpWY.mjs → renderer-BZmmekE8.mjs} +4 -4
  128. package/dist/{renderer-CwFqqpWY.mjs.map → renderer-BZmmekE8.mjs.map} +1 -1
  129. package/dist/{renderer-D47AEJE_.mjs → renderer-BcO7LUla.mjs} +3 -3
  130. package/dist/{renderer-D47AEJE_.mjs.map → renderer-BcO7LUla.mjs.map} +1 -1
  131. package/dist/{renderer-BlvGcyAN.mjs → renderer-BdbI_u9w.mjs} +3 -3
  132. package/dist/{renderer-BlvGcyAN.mjs.map → renderer-BdbI_u9w.mjs.map} +1 -1
  133. package/dist/{renderer-DsEyjwfT.mjs → renderer-Be5hfwSd.mjs} +74 -74
  134. package/dist/{renderer-DsEyjwfT.mjs.map → renderer-Be5hfwSd.mjs.map} +1 -1
  135. package/dist/{renderer-BAYTI6jj.mjs → renderer-BfbSvElt.mjs} +4 -4
  136. package/dist/{renderer-BAYTI6jj.mjs.map → renderer-BfbSvElt.mjs.map} +1 -1
  137. package/dist/{renderer-BpIF1QIE.mjs → renderer-BgDLCCuq.mjs} +5 -5
  138. package/dist/{renderer-BpIF1QIE.mjs.map → renderer-BgDLCCuq.mjs.map} +1 -1
  139. package/dist/renderer-Bofr6f88.mjs +6 -0
  140. package/dist/renderer-BqoGcujR.mjs +5 -0
  141. package/dist/renderer-BvuBt2aH.mjs +5 -0
  142. package/dist/renderer-BxTgXHu1.mjs +5 -0
  143. package/dist/renderer-Bz2Rrz60.mjs +5 -0
  144. package/dist/{renderer-g_vrrAQU.mjs → renderer-C06U4c9k.mjs} +3 -3
  145. package/dist/{renderer-g_vrrAQU.mjs.map → renderer-C06U4c9k.mjs.map} +1 -1
  146. package/dist/{renderer-D7r6onRT.mjs → renderer-C3Iev6zu.mjs} +4 -4
  147. package/dist/{renderer-D7r6onRT.mjs.map → renderer-C3Iev6zu.mjs.map} +1 -1
  148. package/dist/{renderer-CpUJBOfb.mjs → renderer-C3tVrzyT.mjs} +3 -3
  149. package/dist/{renderer-SWr3vbrV.mjs → renderer-C4yKI8MT.mjs} +3 -3
  150. package/dist/{renderer-SWr3vbrV.mjs.map → renderer-C4yKI8MT.mjs.map} +1 -1
  151. package/dist/{renderer-Xv6GfNUI.mjs → renderer-C6st34I6.mjs} +3 -3
  152. package/dist/{renderer-Xv6GfNUI.mjs.map → renderer-C6st34I6.mjs.map} +1 -1
  153. package/dist/{renderer-sCovEubT.mjs → renderer-C7MAqpIS.mjs} +4 -4
  154. package/dist/{renderer-sCovEubT.mjs.map → renderer-C7MAqpIS.mjs.map} +1 -1
  155. package/dist/renderer-CBjG8rjE.mjs +5 -0
  156. package/dist/{renderer-BAusZ6Vu.mjs → renderer-CCFHnafT.mjs} +4 -4
  157. package/dist/{renderer-BAusZ6Vu.mjs.map → renderer-CCFHnafT.mjs.map} +1 -1
  158. package/dist/{renderer-DVCJjVn7.mjs → renderer-CDVb4OfJ.mjs} +5 -5
  159. package/dist/{renderer-DVCJjVn7.mjs.map → renderer-CDVb4OfJ.mjs.map} +1 -1
  160. package/dist/{renderer-DpruWmZU.mjs → renderer-CEfVvcw-.mjs} +4 -4
  161. package/dist/{renderer-DpruWmZU.mjs.map → renderer-CEfVvcw-.mjs.map} +1 -1
  162. package/dist/{renderer-DbRZe0Re.mjs → renderer-CIB5L_C4.mjs} +5 -5
  163. package/dist/{renderer-DbRZe0Re.mjs.map → renderer-CIB5L_C4.mjs.map} +1 -1
  164. package/dist/{renderer-ktWXVYka.mjs → renderer-CPTXJs0n.mjs} +6 -6
  165. package/dist/{renderer-ktWXVYka.mjs.map → renderer-CPTXJs0n.mjs.map} +1 -1
  166. package/dist/renderer-CS2zyPyZ.mjs +5 -0
  167. package/dist/{renderer-CcvvoKiZ.mjs → renderer-CUBDxuxh.mjs} +5 -5
  168. package/dist/{renderer-CcvvoKiZ.mjs.map → renderer-CUBDxuxh.mjs.map} +1 -1
  169. package/dist/renderer-CWLF6cAz.mjs +1008 -0
  170. package/dist/renderer-CWLF6cAz.mjs.map +1 -0
  171. package/dist/{renderer-EaLUCobW.mjs → renderer-CXLugAe8.mjs} +4 -4
  172. package/dist/{renderer-EaLUCobW.mjs.map → renderer-CXLugAe8.mjs.map} +1 -1
  173. package/dist/renderer-CXnbl_jR.mjs +5 -0
  174. package/dist/{renderer-C7L8Ceqr.mjs → renderer-CYX9vKZ-.mjs} +4 -4
  175. package/dist/{renderer-C7L8Ceqr.mjs.map → renderer-CYX9vKZ-.mjs.map} +1 -1
  176. package/dist/{renderer-8QIwXh7O.mjs → renderer-C_2UDMEG.mjs} +6 -6
  177. package/dist/{renderer-8QIwXh7O.mjs.map → renderer-C_2UDMEG.mjs.map} +1 -1
  178. package/dist/renderer-CaF9vod_.mjs +5 -0
  179. package/dist/renderer-CbSBH3lp.mjs +5 -0
  180. package/dist/{renderer-B2jjxsjO.mjs → renderer-CbhnJi_8.mjs} +4 -4
  181. package/dist/{renderer-B2jjxsjO.mjs.map → renderer-CbhnJi_8.mjs.map} +1 -1
  182. package/dist/{renderer-BdyopiLC.mjs → renderer-CcJyD9Q5.mjs} +4 -4
  183. package/dist/{renderer-BdyopiLC.mjs.map → renderer-CcJyD9Q5.mjs.map} +1 -1
  184. package/dist/renderer-CdjuGRbO.mjs +5 -0
  185. package/dist/{renderer-DF-yvIrV.mjs → renderer-Cl8r1LJe.mjs} +4 -4
  186. package/dist/{renderer-DF-yvIrV.mjs.map → renderer-Cl8r1LJe.mjs.map} +1 -1
  187. package/dist/renderer-CoLbxC13.mjs +5 -0
  188. package/dist/{renderer-BgO6BA_z.mjs → renderer-CpedZNEG.mjs} +3 -3
  189. package/dist/{renderer-BgO6BA_z.mjs.map → renderer-CpedZNEG.mjs.map} +1 -1
  190. package/dist/renderer-Cr9G0dXB.mjs +5 -0
  191. package/dist/{renderer-bAKUeHF3.mjs → renderer-CwVbHki6.mjs} +5 -5
  192. package/dist/{renderer-bAKUeHF3.mjs.map → renderer-CwVbHki6.mjs.map} +1 -1
  193. package/dist/{renderer-DTqDy2m9.mjs → renderer-CyCtm0UV.mjs} +3 -3
  194. package/dist/{renderer-DTqDy2m9.mjs.map → renderer-CyCtm0UV.mjs.map} +1 -1
  195. package/dist/{renderer-CYC32bDW.mjs → renderer-D1VsqFf4.mjs} +5 -5
  196. package/dist/{renderer-CYC32bDW.mjs.map → renderer-D1VsqFf4.mjs.map} +1 -1
  197. package/dist/{renderer-CCycwCEB.mjs → renderer-D2TTDcgh.mjs} +3 -3
  198. package/dist/{renderer-CCycwCEB.mjs.map → renderer-D2TTDcgh.mjs.map} +1 -1
  199. package/dist/renderer-D63l6_UC.mjs +5 -0
  200. package/dist/renderer-DCJqnzER.mjs +5 -0
  201. package/dist/{renderer-cod5Ona9.mjs → renderer-DEQeONTd.mjs} +3 -3
  202. package/dist/renderer-DFBOR5J3.mjs +5 -0
  203. package/dist/renderer-DGAZSzw6.mjs +5 -0
  204. package/dist/{renderer-oKRF4A0M.mjs → renderer-DH7l5WFr.mjs} +4 -4
  205. package/dist/{renderer-oKRF4A0M.mjs.map → renderer-DH7l5WFr.mjs.map} +1 -1
  206. package/dist/{renderer-DNQvOrkY.mjs → renderer-DIEmK57T.mjs} +5 -5
  207. package/dist/{renderer-DNQvOrkY.mjs.map → renderer-DIEmK57T.mjs.map} +1 -1
  208. package/dist/{renderer-DEmYyaqj.mjs → renderer-DIqkhsLI.mjs} +4 -4
  209. package/dist/{renderer-DEmYyaqj.mjs.map → renderer-DIqkhsLI.mjs.map} +1 -1
  210. package/dist/{renderer-DX41niRU.mjs → renderer-DOKHd37M.mjs} +4 -4
  211. package/dist/{renderer-DX41niRU.mjs.map → renderer-DOKHd37M.mjs.map} +1 -1
  212. package/dist/renderer-DPLGk1Qk.mjs +5 -0
  213. package/dist/renderer-DTCUzByS.mjs +5 -0
  214. package/dist/{renderer-BXJXziIt.mjs → renderer-DW7hbluw.mjs} +3 -3
  215. package/dist/{renderer-BXJXziIt.mjs.map → renderer-DW7hbluw.mjs.map} +1 -1
  216. package/dist/{renderer--fkmiVjl.mjs → renderer-Dat8opUZ.mjs} +4 -4
  217. package/dist/{renderer--fkmiVjl.mjs.map → renderer-Dat8opUZ.mjs.map} +1 -1
  218. package/dist/renderer-DdGahYi1.mjs +5 -0
  219. package/dist/{renderer-DmkWrWAk.mjs → renderer-Dee8ksIV.mjs} +3 -3
  220. package/dist/{renderer-DmkWrWAk.mjs.map → renderer-Dee8ksIV.mjs.map} +1 -1
  221. package/dist/renderer-DhL4nNPk.mjs +5 -0
  222. package/dist/renderer-DkyTbiVz.mjs +3 -0
  223. package/dist/renderer-DnAZweRX.mjs +5 -0
  224. package/dist/{renderer-BX7jS14r.d.mts → renderer-DoPEPlbG.d.mts} +3 -2
  225. package/dist/{renderer-BX7jS14r.d.mts.map → renderer-DoPEPlbG.d.mts.map} +1 -1
  226. package/dist/renderer-DpisVnT2.mjs +5 -0
  227. package/dist/{renderer-mNSyac1V.mjs → renderer-DrWeb39d.mjs} +1 -1
  228. package/dist/{renderer-mNSyac1V.mjs.map → renderer-DrWeb39d.mjs.map} +1 -1
  229. package/dist/renderer-Ds7pAKnE.mjs +3 -0
  230. package/dist/{renderer-CiQhD8Gg.mjs → renderer-Dss7T71q.mjs} +5 -5
  231. package/dist/{renderer-CiQhD8Gg.mjs.map → renderer-Dss7T71q.mjs.map} +1 -1
  232. package/dist/{renderer-C41U1tK6.mjs → renderer-Du-GnKLb.mjs} +9 -9
  233. package/dist/{renderer-C41U1tK6.mjs.map → renderer-Du-GnKLb.mjs.map} +1 -1
  234. package/dist/renderer-DxZD5B54.mjs +5 -0
  235. package/dist/{renderer-WCZu2Rf5.mjs → renderer-ESkPj6pk.mjs} +4 -4
  236. package/dist/{renderer-WCZu2Rf5.mjs.map → renderer-ESkPj6pk.mjs.map} +1 -1
  237. package/dist/{renderer-DMvmf3T2.mjs → renderer-F1D9ZJ8I.mjs} +3 -3
  238. package/dist/{renderer-BlPqTEii.mjs → renderer-HnSiwSW8.mjs} +4 -4
  239. package/dist/{renderer-BlPqTEii.mjs.map → renderer-HnSiwSW8.mjs.map} +1 -1
  240. package/dist/{renderer-1r-Uq-Ae.mjs → renderer-IQ97z2rw.mjs} +3 -3
  241. package/dist/{renderer-1r-Uq-Ae.mjs.map → renderer-IQ97z2rw.mjs.map} +1 -1
  242. package/dist/{renderer-DFzI3yI_.mjs → renderer-NTCk1Srf.mjs} +3 -3
  243. package/dist/{renderer-DFzI3yI_.mjs.map → renderer-NTCk1Srf.mjs.map} +1 -1
  244. package/dist/{renderer-D8bBHrWC.mjs → renderer-OsQRvOle.mjs} +5 -5
  245. package/dist/{renderer-D8bBHrWC.mjs.map → renderer-OsQRvOle.mjs.map} +1 -1
  246. package/dist/renderer-PMHOnbnA.mjs +5 -0
  247. package/dist/renderer-STufNpMx.mjs +5 -0
  248. package/dist/renderer-SdrgfCxH.mjs +5 -0
  249. package/dist/{renderer-Lth37j17.mjs → renderer-US4GsamT.mjs} +3 -3
  250. package/dist/{renderer-zXPVLRlD.mjs → renderer-VhkubIx_.mjs} +5 -5
  251. package/dist/{renderer-zXPVLRlD.mjs.map → renderer-VhkubIx_.mjs.map} +1 -1
  252. package/dist/{renderer-DIw3UtEU.mjs → renderer-bbaMOD4I.mjs} +5 -5
  253. package/dist/{renderer-DIw3UtEU.mjs.map → renderer-bbaMOD4I.mjs.map} +1 -1
  254. package/dist/{renderer-hSCfnvaK.mjs → renderer-eT7Gp7FS.mjs} +5 -5
  255. package/dist/{renderer-hSCfnvaK.mjs.map → renderer-eT7Gp7FS.mjs.map} +1 -1
  256. package/dist/{renderer-CQvmbRQ5.mjs → renderer-g7fF2AYk.mjs} +5 -5
  257. package/dist/{renderer-CQvmbRQ5.mjs.map → renderer-g7fF2AYk.mjs.map} +1 -1
  258. package/dist/{renderer-B-ur0Ej8.mjs → renderer-mLlgfM7X.mjs} +4 -4
  259. package/dist/{renderer-B-ur0Ej8.mjs.map → renderer-mLlgfM7X.mjs.map} +1 -1
  260. package/dist/{renderer-SSBL4M1o.mjs → renderer-mQt-y49D.mjs} +5 -5
  261. package/dist/{renderer-SSBL4M1o.mjs.map → renderer-mQt-y49D.mjs.map} +1 -1
  262. package/dist/{renderer-BIGFP1cF.mjs → renderer-q4zMFfnY.mjs} +2 -2
  263. package/dist/{renderer-BIGFP1cF.mjs.map → renderer-q4zMFfnY.mjs.map} +1 -1
  264. package/dist/{renderer-DXEWbnRF.mjs → renderer-sPI7aY6c.mjs} +4 -4
  265. package/dist/{renderer-DXEWbnRF.mjs.map → renderer-sPI7aY6c.mjs.map} +1 -1
  266. package/dist/{renderer-sYSkIUfo.mjs → renderer-xDV2cCkX.mjs} +5 -5
  267. package/dist/{renderer-sYSkIUfo.mjs.map → renderer-xDV2cCkX.mjs.map} +1 -1
  268. package/dist/{renderers-CP8CFWDs-DH2oktaC.mjs → renderers-CP8CFWDs-BH1gUTYa.mjs} +4 -4
  269. package/dist/{renderers-CP8CFWDs-DH2oktaC.mjs.map → renderers-CP8CFWDs-BH1gUTYa.mjs.map} +1 -1
  270. package/dist/sam/index.d.mts +4 -0
  271. package/dist/sam/index.mjs +3 -0
  272. package/dist/signals/index.d.mts +7 -6
  273. package/dist/signals/index.mjs +8 -8
  274. package/dist/{signals-CXwgAUp-.mjs → signals-gOd0Ui9B.mjs} +4 -4
  275. package/dist/{signals-CXwgAUp-.mjs.map → signals-gOd0Ui9B.mjs.map} +1 -1
  276. package/dist/{src-CK5rGVbh.mjs → src-BU1VOWSk.mjs} +81 -39
  277. package/dist/src-BU1VOWSk.mjs.map +1 -0
  278. package/dist/{renderer-B0piZg9r.mjs → src-Bnr8DUC--DzkRGA62.mjs} +12 -993
  279. package/dist/src-Bnr8DUC--DzkRGA62.mjs.map +1 -0
  280. package/package.json +69 -69
  281. package/dist/audio-Ccpl9mjV.d.mts.map +0 -1
  282. package/dist/index-CZjrnylh.d.mts.map +0 -1
  283. package/dist/index-D5UDyVMb.d.mts.map +0 -1
  284. package/dist/index-Du5YgdzM.d.mts.map +0 -1
  285. package/dist/preview-engine/chunk-CCB3VTY2.mjs +0 -39
  286. package/dist/preview-engine/src-NGVAJYHC.mjs +0 -8
  287. package/dist/renderer--Ac-dg4A.mjs +0 -5
  288. package/dist/renderer--N7TMqzU.mjs +0 -5
  289. package/dist/renderer-2ecmdOae.mjs +0 -5
  290. package/dist/renderer-B0piZg9r.mjs.map +0 -1
  291. package/dist/renderer-B5RJp5g-.mjs +0 -5
  292. package/dist/renderer-B7xyT1Vb.mjs +0 -5
  293. package/dist/renderer-BBeArN_x.mjs +0 -5
  294. package/dist/renderer-BCAZDu-r.mjs +0 -5
  295. package/dist/renderer-BJnhik7Y.mjs +0 -5
  296. package/dist/renderer-BxRW8MZO.mjs +0 -5
  297. package/dist/renderer-C-lfsEAN.mjs +0 -5
  298. package/dist/renderer-C6nOFN4-.mjs +0 -5
  299. package/dist/renderer-C84TSQmS.mjs +0 -5
  300. package/dist/renderer-C8_6YofT.mjs +0 -5
  301. package/dist/renderer-COR66Sby.mjs +0 -3
  302. package/dist/renderer-COb3tOPG.mjs +0 -5
  303. package/dist/renderer-CSCIzaLy.mjs +0 -5
  304. package/dist/renderer-CmI4c8MS.mjs +0 -5
  305. package/dist/renderer-CqVltdX9.mjs +0 -5
  306. package/dist/renderer-D-FpMzLY.mjs +0 -5
  307. package/dist/renderer-D-Oyn9mG.mjs +0 -5
  308. package/dist/renderer-D2QrkA8_.mjs +0 -5
  309. package/dist/renderer-D64r4iN-.mjs +0 -5
  310. package/dist/renderer-DCq6YkgP.mjs +0 -5
  311. package/dist/renderer-DDHG3GdR.mjs +0 -5
  312. package/dist/renderer-DMdNfcud.mjs +0 -6
  313. package/dist/renderer-DZQXZ4lK.mjs +0 -5
  314. package/dist/renderer-DczJJLA1.mjs +0 -5
  315. package/dist/renderer-DfqJj9oe.mjs +0 -5
  316. package/dist/renderer-DgO9ihVJ.mjs +0 -5
  317. package/dist/renderer-DhgnQZYb.mjs +0 -5
  318. package/dist/renderer-DjxKjHMf.mjs +0 -5
  319. package/dist/renderer-DnRDW2Oz.mjs +0 -3
  320. package/dist/renderer-DqLA5cdR.mjs +0 -5
  321. package/dist/renderer-Dudp6ZlH.mjs +0 -5
  322. package/dist/renderer-_jC5KIT1.mjs +0 -5
  323. package/dist/renderer-cTgAuVmJ.mjs +0 -5
  324. package/dist/renderer-nVKDvDLO.mjs +0 -5
  325. package/dist/renderer-pZ6_pUo1.mjs +0 -5
  326. package/dist/src-CK5rGVbh.mjs.map +0 -1
  327. /package/dist/{chunk-BcJoO4Nm.mjs → chunk-D8S17ehY.mjs} +0 -0
  328. /package/dist/{renderer-COqFNSfV.mjs → renderer-Cputd36d.mjs} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderer-CWLF6cAz.mjs","names":[],"sources":["../../../nodes/node-vision/dist/renderers-Ao0SpHQm.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\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}\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-Ao0SpHQm.mjs.map"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
- import { n as defineRenderer, s as resolveHandleParam } from "./renderer-mNSyac1V.mjs";
2
- import { a as configBuilder, i as VideoResultSchema, n as ImageResultSchema } from "./dist-DVMepKaO.mjs";
3
- import { a as createFullscreenPipeline, c as drawTextureToTarget, d as signalTextureView, f as signalTiming, l as fragmentBindGroupLayout, o as drawChildToTexture, p as texturesLayout, s as drawFullscreenPass, t as FULLSCREEN_QUAD_WGSL } from "./gpu-CMaa63nz.mjs";
1
+ import { n as defineRenderer, s as resolveHandleParam } from "./renderer-DrWeb39d.mjs";
2
+ import { a as configBuilder, i as VideoResultSchema, n as ImageResultSchema } from "./dist-DL1GwJvs.mjs";
3
+ import { a as createFullscreenPipeline, c as drawTextureToTarget, d as signalTextureView, f as signalTiming, l as fragmentBindGroupLayout, o as drawChildToTexture, p as texturesLayout, s as drawFullscreenPass, t as FULLSCREEN_QUAD_WGSL } from "./gpu-zFNrvhV9.mjs";
4
4
  import { z } from "zod";
5
5
 
6
6
  //#region ../../nodes/node-high-pass/dist/renderers-DUL8Peaw.mjs
@@ -253,4 +253,4 @@ var renderers_default = defineRenderer({ WebGPURenderer });
253
253
 
254
254
  //#endregion
255
255
  export { renderers_default as t };
256
- //# sourceMappingURL=renderer-EaLUCobW.mjs.map
256
+ //# sourceMappingURL=renderer-CXLugAe8.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-EaLUCobW.mjs","names":[],"sources":["../../../nodes/node-high-pass/dist/renderers-DUL8Peaw.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { ImageResultSchema, VideoResultSchema, configBuilder, resolveHandleParam } from \"@framefields/node-sdk\";\nimport { FULLSCREEN_QUAD_WGSL, createFullscreenPipeline, drawChildToTexture, drawFullscreenPass, drawTextureToTarget, fragmentBindGroupLayout, signalTextureView, signalTiming, texturesLayout } from \"@framefields/node-sdk/gpu\";\nimport { z } from \"zod\";\n\n//#region src/shared/config.ts\nconst MAX_RADIUS = 250;\nconst highPassConfig = configBuilder().field(\"radius\", z.number().min(.1).max(MAX_RADIUS).default(3), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Radius Signal\",\n\tdescription: \"The cutoff radius in pixels. Frequencies smaller than this radius are preserved.\"\n}).field(\"contrastBoost\", z.number().multipleOf(.01).min(1).max(10).default(1), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Contrast Boost Signal\",\n\tdescription: \"Multiplier applied to the extracted high-frequency detail delta.\"\n}).field(\"monochrome\", z.boolean().default(true), { description: \"When enabled, high-pass delta is converted to luminance before centering on 50% neutral gray.\" }).build();\nconst HighPassNodeConfigSchema = highPassConfig.schema;\nconst HighPassResultSchema = z.union([ImageResultSchema, VideoResultSchema]);\nconst HIGH_PASS_OUTPUT_TYPE_MAP = {\n\tVideo: \"Video\",\n\tLottie: \"Video\",\n\tGIF: \"GIF\",\n\tImage: \"Image\",\n\tSVG: \"Image\"\n};\n\n//#endregion\n//#region src/renderers/webgpu-renderer.ts\nconst WGSL_HIGHPASS_UNIFORMS = `\nstruct HighPassUniforms {\n\tdirX : f32,\n\tdirY : f32,\n\tradius : f32,\n\tcontrastBoost : f32,\n\n\tmonochrome : f32,\n\thasRadiusSig : f32,\n\thasContrastSig : f32,\n\tisSecondPass : f32,\n};\n\n@group(0) @binding(0) var<uniform> u : HighPassUniforms;\n@group(1) @binding(0) var tex : texture_2d<f32>;\n@group(1) @binding(1) var samp : sampler;\n@group(1) @binding(2) var origTex : texture_2d<f32>;\n\n@group(2) @binding(0) var radiusSigTex : texture_2d<f32>;\n@group(2) @binding(1) var contrastSigTex : texture_2d<f32>;\n@group(2) @binding(2) var signalSamp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet dimensions = vec2<f32>(textureDimensions(tex));\n\tvar radius = u.radius;\n\tif (u.hasRadiusSig > 0.5) {\n\t\tradius = textureSampleLevel(radiusSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\tvar contrastBoost = u.contrastBoost;\n\tif (u.hasContrastSig > 0.5) {\n\t\tcontrastBoost = textureSampleLevel(contrastSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\n\tlet origCol = textureSampleLevel(origTex, samp, in.uv, 0.0);\n\tif (radius <= 0.0) {\n\t\tif (u.isSecondPass > 0.5) {\n\t\t\treturn vec4<f32>(vec3<f32>(0.5) * origCol.a, origCol.a);\n\t\t}\n\t\treturn origCol;\n\t}\n\n\tlet texelSize = 1.0 / dimensions;\n\tlet spatial_sigma = radius;\n\tlet stepScale = max(1.0, spatial_sigma / 20.0);\n\tlet effectiveSigma = spatial_sigma / stepScale;\n\tlet sampleRadius = min(i32(ceil(3.0 * effectiveSigma)), 64);\n\tlet direction = vec2<f32>(u.dirX, u.dirY);\n\n\tvar blurred = vec4<f32>(0.0);\n\tvar totalWeight = 0.0;\n\n\tfor (var i = -sampleRadius; i <= sampleRadius; i++) {\n\t\tlet offset = vec2<f32>(f32(i) * stepScale) * direction * texelSize;\n\t\tlet x = f32(i) * stepScale;\n\t\tlet weight = exp(-0.5 * (x / spatial_sigma) * (x / spatial_sigma));\n\t\tblurred += textureSampleLevel(tex, samp, in.uv + offset, 0.0) * weight;\n\t\ttotalWeight += weight;\n\t}\n\n\tlet blurResult = blurred / max(totalWeight, 1e-5);\n\n\tif (u.isSecondPass <= 0.5) {\n\t\t// Pass 1: Intermediate horizontal blur\n\t\treturn blurResult;\n\t}\n\n\t// Pass 2: Vertical blur complete -> Calculate High Pass difference against original\n\tif (origCol.a < 1e-5) {\n\t\treturn vec4<f32>(0.0, 0.0, 0.0, 0.0);\n\t}\n\n\tlet origUnpremult = origCol.rgb / origCol.a;\n\tlet blurUnpremult = blurResult.rgb / max(blurResult.a, 1e-5);\n\tlet diff = origUnpremult - blurUnpremult;\n\n\tvar highPassRgb : vec3<f32>;\n\tif (u.monochrome > 0.5) {\n\t\tlet lumaDiff = dot(diff, vec3<f32>(0.2126, 0.7152, 0.0722));\n\t\thighPassRgb = vec3<f32>(0.5) + vec3<f32>(lumaDiff * contrastBoost);\n\t} else {\n\t\thighPassRgb = vec3<f32>(0.5) + diff * contrastBoost;\n\t}\n\n\tlet clampedRgb = clamp(highPassRgb, vec3<f32>(0.0), vec3<f32>(1.0));\n\treturn vec4<f32>(clampedRgb * origCol.a, origCol.a);\n}\n`;\nconst deviceResourceCache = /* @__PURE__ */ new WeakMap();\nconst highPassUniformData = new Float32Array(8);\nfunction getHighPassResources(device, targetFormat) {\n\tconst cached = deviceResourceCache.get(device);\n\tif (cached) return cached;\n\tconst highPassUniformLayout = fragmentBindGroupLayout(device, [\"uniform\"]);\n\tconst singleTextureLayout = fragmentBindGroupLayout(device, [\n\t\t\"texture\",\n\t\t\"sampler\",\n\t\t\"texture\"\n\t]);\n\tconst signalTextureLayout = texturesLayout(device, 2);\n\tconst res = {\n\t\thighPassUniformLayout,\n\t\tsingleTextureLayout,\n\t\tsignalTextureLayout,\n\t\thighPassPipeline: createFullscreenPipeline(device, {\n\t\t\tmodule: device.createShaderModule({ code: WGSL_HIGHPASS_UNIFORMS }),\n\t\t\tlayouts: device.createPipelineLayout({ bindGroupLayouts: [\n\t\t\t\thighPassUniformLayout,\n\t\t\t\tsingleTextureLayout,\n\t\t\t\tsignalTextureLayout\n\t\t\t] }),\n\t\t\tformat: targetFormat\n\t\t})\n\t};\n\tdeviceResourceCache.set(device, res);\n\treturn res;\n}\nconst WebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetTexture, targetWidth, targetHeight, props } = args;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"HighPass\" || !op) return;\n\tconst childMedia = props.virtualMedia.children?.[0];\n\tif (!childMedia) return;\n\tpass.end();\n\tconst frame = props.frame ?? 0;\n\tconst fps = props.fps || 30;\n\tconst width = targetWidth;\n\tconst height = targetHeight;\n\tconst nodeId = op.inputs ? Object.keys(op.inputs)[0] : \"highpass_node\";\n\tconst resolveField = (handleId, fallbackVal, clampMin = 0, clampMax = 1e3) => resolveHandleParam(op.inputs, handleId, fallbackVal, clampMin, clampMax);\n\tconst radiusRes = resolveField(op.radiusHandleId, Number(op.radius ?? 3), .1, MAX_RADIUS);\n\tconst contrastRes = resolveField(op.contrastBoostHandleId, Number(op.contrastBoost ?? 1), 1, 10);\n\tconst { texture: tmpTex } = await drawChildToTexture(args, childMedia);\n\tconst { highPassPipeline: pipeline, highPassUniformLayout: uLayout, singleTextureLayout: tLayout, signalTextureLayout: sigLayout } = getHighPassResources(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 radiusView = getSignalView(radiusRes, \"radius_sig\");\n\tconst contrastView = getSignalView(contrastRes, \"contrast_sig\");\n\tconst createHighPassBindGroup1 = (inputTex, origTexture) => ctx.device.createBindGroup({\n\t\tlayout: tLayout,\n\t\tentries: [\n\t\t\t{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: inputTex.createView()\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 1,\n\t\t\t\tresource: sampler\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 2,\n\t\t\t\tresource: origTexture.createView()\n\t\t\t}\n\t\t]\n\t});\n\thighPassUniformData[2] = radiusRes.val;\n\thighPassUniformData[3] = contrastRes.val;\n\thighPassUniformData[4] = op.monochrome ?? true ? 1 : 0;\n\thighPassUniformData[5] = radiusRes.hasStaticSig ? 1 : 0;\n\thighPassUniformData[6] = contrastRes.hasStaticSig ? 1 : 0;\n\thighPassUniformData[7] = 0;\n\tconst outTex1 = ctx.renderer.getTemporaryTexture(width, height, [\n\t\ttmpTex,\n\t\ttargetTexture,\n\t\t...props.excludeTextures || []\n\t]);\n\tconst outTex2 = ctx.renderer.getTemporaryTexture(width, height, [\n\t\ttmpTex,\n\t\toutTex1,\n\t\ttargetTexture,\n\t\t...props.excludeTextures || []\n\t]);\n\tconst sigBindGroup = ctx.device.createBindGroup({\n\t\tlayout: sigLayout,\n\t\tentries: [\n\t\t\t{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: radiusView\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 1,\n\t\t\t\tresource: contrastView\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 2,\n\t\t\t\tresource: sampler\n\t\t\t}\n\t\t]\n\t});\n\thighPassUniformData[0] = 1;\n\thighPassUniformData[1] = 0;\n\thighPassUniformData[7] = 0;\n\tconst hBuffer = ctx.renderer.getTemporaryBuffer(highPassUniformData);\n\tdrawFullscreenPass(encoder, outTex1.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: hBuffer }\n\t\t\t}]\n\t\t}),\n\t\tcreateHighPassBindGroup1(tmpTex, tmpTex),\n\t\tsigBindGroup\n\t]);\n\thighPassUniformData[0] = 0;\n\thighPassUniformData[1] = 1;\n\thighPassUniformData[7] = 1;\n\tconst vBuffer = ctx.renderer.getTemporaryBuffer(highPassUniformData);\n\tdrawFullscreenPass(encoder, outTex2.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: vBuffer }\n\t\t\t}]\n\t\t}),\n\t\tcreateHighPassBindGroup1(outTex1, tmpTex),\n\t\tsigBindGroup\n\t]);\n\tdrawTextureToTarget(args, outTex2, op.opacity ?? 1);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer });\n\n//#endregion\nexport { MAX_RADIUS as a, HighPassResultSchema as i, HIGH_PASS_OUTPUT_TYPE_MAP as n, highPassConfig as o, HighPassNodeConfigSchema as r, renderers_default as t };\n//# sourceMappingURL=renderers-DUL8Peaw.mjs.map"],"mappings":";;;;;;AAMA,MAAM,aAAa;AACnB,MAAM,iBAAiB,eAAe,CAAC,MAAM,UAAU,EAAE,QAAQ,CAAC,IAAI,GAAG,CAAC,IAAI,WAAW,CAAC,QAAQ,EAAE,EAAE;CACrG,UAAU;CACV,WAAW,CAAC,UAAU,SAAS;CAC/B,OAAO;CACP,aAAa;CACb,CAAC,CAAC,MAAM,iBAAiB,EAAE,QAAQ,CAAC,WAAW,IAAI,CAAC,IAAI,EAAE,CAAC,IAAI,GAAG,CAAC,QAAQ,EAAE,EAAE;CAC/E,UAAU;CACV,WAAW,CAAC,UAAU,SAAS;CAC/B,OAAO;CACP,aAAa;CACb,CAAC,CAAC,MAAM,cAAc,EAAE,SAAS,CAAC,QAAQ,KAAK,EAAE,EAAE,aAAa,iGAAiG,CAAC,CAAC,OAAO;AAC3K,MAAM,2BAA2B,eAAe;AAChD,MAAM,uBAAuB,EAAE,MAAM,CAAC,mBAAmB,kBAAkB,CAAC;AAW5E,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;EAqB7B,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmEvB,MAAM,sCAAsC,IAAI,SAAS;AACzD,MAAM,sBAAsB,IAAI,aAAa,EAAE;AAC/C,SAAS,qBAAqB,QAAQ,cAAc;CACnD,MAAM,SAAS,oBAAoB,IAAI,OAAO;AAC9C,KAAI,OAAQ,QAAO;CACnB,MAAM,wBAAwB,wBAAwB,QAAQ,CAAC,UAAU,CAAC;CAC1E,MAAM,sBAAsB,wBAAwB,QAAQ;EAC3D;EACA;EACA;EACA,CAAC;CACF,MAAM,sBAAsB,eAAe,QAAQ,EAAE;CACrD,MAAM,MAAM;EACX;EACA;EACA;EACA,kBAAkB,yBAAyB,QAAQ;GAClD,QAAQ,OAAO,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;GACnE,SAAS,OAAO,qBAAqB,EAAE,kBAAkB;IACxD;IACA;IACA;IACA,EAAE,CAAC;GACJ,QAAQ;GACR,CAAC;EACF;AACD,qBAAoB,IAAI,QAAQ,IAAI;AACpC,QAAO;;AAER,MAAM,iBAAiB,OAAO,SAAS;CACtC,MAAM,EAAE,KAAK,SAAS,MAAM,eAAe,aAAa,cAAc,UAAU;CAChF,MAAM,KAAK,MAAM,cAAc;AAC/B,KAAI,IAAI,OAAO,cAAc,CAAC,GAAI;CAClC,MAAM,aAAa,MAAM,aAAa,WAAW;AACjD,KAAI,CAAC,WAAY;AACjB,MAAK,KAAK;CACV,MAAM,QAAQ,MAAM,SAAS;CAC7B,MAAM,MAAM,MAAM,OAAO;CACzB,MAAM,QAAQ;CACd,MAAM,SAAS;CACf,MAAM,SAAS,GAAG,SAAS,OAAO,KAAK,GAAG,OAAO,CAAC,KAAK;CACvD,MAAM,gBAAgB,UAAU,aAAa,WAAW,GAAG,WAAW,QAAQ,mBAAmB,GAAG,QAAQ,UAAU,aAAa,UAAU,SAAS;CACtJ,MAAM,YAAY,aAAa,GAAG,gBAAgB,OAAO,GAAG,UAAU,EAAE,EAAE,IAAI,WAAW;CACzF,MAAM,cAAc,aAAa,GAAG,uBAAuB,OAAO,GAAG,iBAAiB,EAAE,EAAE,GAAG,GAAG;CAChG,MAAM,EAAE,SAAS,WAAW,MAAM,mBAAmB,MAAM,WAAW;CACtE,MAAM,EAAE,kBAAkB,UAAU,uBAAuB,SAAS,qBAAqB,SAAS,qBAAqB,cAAc,qBAAqB,IAAI,QAAQ,IAAI,SAAS,OAAO;CAC1L,MAAM,UAAU,IAAI,SAAS,aAAa,WAAW,IAAI,OAAO;CAChE,MAAM,EAAE,gBAAgB,oBAAoB,aAAa,OAAO,OAAO,IAAI;CAC3E,MAAM,gBAAgB;EACrB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACD,MAAM,iBAAiB,KAAK,WAAW,kBAAkB,eAAe,KAAK,GAAG,OAAO,GAAG,SAAS;CACnG,MAAM,aAAa,cAAc,WAAW,aAAa;CACzD,MAAM,eAAe,cAAc,aAAa,eAAe;CAC/D,MAAM,4BAA4B,UAAU,gBAAgB,IAAI,OAAO,gBAAgB;EACtF,QAAQ;EACR,SAAS;GACR;IACC,SAAS;IACT,UAAU,SAAS,YAAY;IAC/B;GACD;IACC,SAAS;IACT,UAAU;IACV;GACD;IACC,SAAS;IACT,UAAU,YAAY,YAAY;IAClC;GACD;EACD,CAAC;AACF,qBAAoB,KAAK,UAAU;AACnC,qBAAoB,KAAK,YAAY;AACrC,qBAAoB,KAAK,GAAG,cAAc,OAAO,IAAI;AACrD,qBAAoB,KAAK,UAAU,eAAe,IAAI;AACtD,qBAAoB,KAAK,YAAY,eAAe,IAAI;AACxD,qBAAoB,KAAK;CACzB,MAAM,UAAU,IAAI,SAAS,oBAAoB,OAAO,QAAQ;EAC/D;EACA;EACA,GAAG,MAAM,mBAAmB,EAAE;EAC9B,CAAC;CACF,MAAM,UAAU,IAAI,SAAS,oBAAoB,OAAO,QAAQ;EAC/D;EACA;EACA;EACA,GAAG,MAAM,mBAAmB,EAAE;EAC9B,CAAC;CACF,MAAM,eAAe,IAAI,OAAO,gBAAgB;EAC/C,QAAQ;EACR,SAAS;GACR;IACC,SAAS;IACT,UAAU;IACV;GACD;IACC,SAAS;IACT,UAAU;IACV;GACD;IACC,SAAS;IACT,UAAU;IACV;GACD;EACD,CAAC;AACF,qBAAoB,KAAK;AACzB,qBAAoB,KAAK;AACzB,qBAAoB,KAAK;CACzB,MAAM,UAAU,IAAI,SAAS,mBAAmB,oBAAoB;AACpE,oBAAmB,SAAS,QAAQ,YAAY,EAAE,UAAU;EAC3D,IAAI,OAAO,gBAAgB;GAC1B,QAAQ;GACR,SAAS,CAAC;IACT,SAAS;IACT,UAAU,EAAE,QAAQ,SAAS;IAC7B,CAAC;GACF,CAAC;EACF,yBAAyB,QAAQ,OAAO;EACxC;EACA,CAAC;AACF,qBAAoB,KAAK;AACzB,qBAAoB,KAAK;AACzB,qBAAoB,KAAK;CACzB,MAAM,UAAU,IAAI,SAAS,mBAAmB,oBAAoB;AACpE,oBAAmB,SAAS,QAAQ,YAAY,EAAE,UAAU;EAC3D,IAAI,OAAO,gBAAgB;GAC1B,QAAQ;GACR,SAAS,CAAC;IACT,SAAS;IACT,UAAU,EAAE,QAAQ,SAAS;IAC7B,CAAC;GACF,CAAC;EACF,yBAAyB,SAAS,OAAO;EACzC;EACA,CAAC;AACF,qBAAoB,MAAM,SAAS,GAAG,WAAW,EAAE;;AAKpD,IAAI,oBAAoB,eAAe,EAAE,gBAAgB,CAAC"}
1
+ {"version":3,"file":"renderer-CXLugAe8.mjs","names":[],"sources":["../../../nodes/node-high-pass/dist/renderers-DUL8Peaw.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { ImageResultSchema, VideoResultSchema, configBuilder, resolveHandleParam } from \"@framefields/node-sdk\";\nimport { FULLSCREEN_QUAD_WGSL, createFullscreenPipeline, drawChildToTexture, drawFullscreenPass, drawTextureToTarget, fragmentBindGroupLayout, signalTextureView, signalTiming, texturesLayout } from \"@framefields/node-sdk/gpu\";\nimport { z } from \"zod\";\n\n//#region src/shared/config.ts\nconst MAX_RADIUS = 250;\nconst highPassConfig = configBuilder().field(\"radius\", z.number().min(.1).max(MAX_RADIUS).default(3), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Radius Signal\",\n\tdescription: \"The cutoff radius in pixels. Frequencies smaller than this radius are preserved.\"\n}).field(\"contrastBoost\", z.number().multipleOf(.01).min(1).max(10).default(1), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Contrast Boost Signal\",\n\tdescription: \"Multiplier applied to the extracted high-frequency detail delta.\"\n}).field(\"monochrome\", z.boolean().default(true), { description: \"When enabled, high-pass delta is converted to luminance before centering on 50% neutral gray.\" }).build();\nconst HighPassNodeConfigSchema = highPassConfig.schema;\nconst HighPassResultSchema = z.union([ImageResultSchema, VideoResultSchema]);\nconst HIGH_PASS_OUTPUT_TYPE_MAP = {\n\tVideo: \"Video\",\n\tLottie: \"Video\",\n\tGIF: \"GIF\",\n\tImage: \"Image\",\n\tSVG: \"Image\"\n};\n\n//#endregion\n//#region src/renderers/webgpu-renderer.ts\nconst WGSL_HIGHPASS_UNIFORMS = `\nstruct HighPassUniforms {\n\tdirX : f32,\n\tdirY : f32,\n\tradius : f32,\n\tcontrastBoost : f32,\n\n\tmonochrome : f32,\n\thasRadiusSig : f32,\n\thasContrastSig : f32,\n\tisSecondPass : f32,\n};\n\n@group(0) @binding(0) var<uniform> u : HighPassUniforms;\n@group(1) @binding(0) var tex : texture_2d<f32>;\n@group(1) @binding(1) var samp : sampler;\n@group(1) @binding(2) var origTex : texture_2d<f32>;\n\n@group(2) @binding(0) var radiusSigTex : texture_2d<f32>;\n@group(2) @binding(1) var contrastSigTex : texture_2d<f32>;\n@group(2) @binding(2) var signalSamp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet dimensions = vec2<f32>(textureDimensions(tex));\n\tvar radius = u.radius;\n\tif (u.hasRadiusSig > 0.5) {\n\t\tradius = textureSampleLevel(radiusSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\tvar contrastBoost = u.contrastBoost;\n\tif (u.hasContrastSig > 0.5) {\n\t\tcontrastBoost = textureSampleLevel(contrastSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\n\tlet origCol = textureSampleLevel(origTex, samp, in.uv, 0.0);\n\tif (radius <= 0.0) {\n\t\tif (u.isSecondPass > 0.5) {\n\t\t\treturn vec4<f32>(vec3<f32>(0.5) * origCol.a, origCol.a);\n\t\t}\n\t\treturn origCol;\n\t}\n\n\tlet texelSize = 1.0 / dimensions;\n\tlet spatial_sigma = radius;\n\tlet stepScale = max(1.0, spatial_sigma / 20.0);\n\tlet effectiveSigma = spatial_sigma / stepScale;\n\tlet sampleRadius = min(i32(ceil(3.0 * effectiveSigma)), 64);\n\tlet direction = vec2<f32>(u.dirX, u.dirY);\n\n\tvar blurred = vec4<f32>(0.0);\n\tvar totalWeight = 0.0;\n\n\tfor (var i = -sampleRadius; i <= sampleRadius; i++) {\n\t\tlet offset = vec2<f32>(f32(i) * stepScale) * direction * texelSize;\n\t\tlet x = f32(i) * stepScale;\n\t\tlet weight = exp(-0.5 * (x / spatial_sigma) * (x / spatial_sigma));\n\t\tblurred += textureSampleLevel(tex, samp, in.uv + offset, 0.0) * weight;\n\t\ttotalWeight += weight;\n\t}\n\n\tlet blurResult = blurred / max(totalWeight, 1e-5);\n\n\tif (u.isSecondPass <= 0.5) {\n\t\t// Pass 1: Intermediate horizontal blur\n\t\treturn blurResult;\n\t}\n\n\t// Pass 2: Vertical blur complete -> Calculate High Pass difference against original\n\tif (origCol.a < 1e-5) {\n\t\treturn vec4<f32>(0.0, 0.0, 0.0, 0.0);\n\t}\n\n\tlet origUnpremult = origCol.rgb / origCol.a;\n\tlet blurUnpremult = blurResult.rgb / max(blurResult.a, 1e-5);\n\tlet diff = origUnpremult - blurUnpremult;\n\n\tvar highPassRgb : vec3<f32>;\n\tif (u.monochrome > 0.5) {\n\t\tlet lumaDiff = dot(diff, vec3<f32>(0.2126, 0.7152, 0.0722));\n\t\thighPassRgb = vec3<f32>(0.5) + vec3<f32>(lumaDiff * contrastBoost);\n\t} else {\n\t\thighPassRgb = vec3<f32>(0.5) + diff * contrastBoost;\n\t}\n\n\tlet clampedRgb = clamp(highPassRgb, vec3<f32>(0.0), vec3<f32>(1.0));\n\treturn vec4<f32>(clampedRgb * origCol.a, origCol.a);\n}\n`;\nconst deviceResourceCache = /* @__PURE__ */ new WeakMap();\nconst highPassUniformData = new Float32Array(8);\nfunction getHighPassResources(device, targetFormat) {\n\tconst cached = deviceResourceCache.get(device);\n\tif (cached) return cached;\n\tconst highPassUniformLayout = fragmentBindGroupLayout(device, [\"uniform\"]);\n\tconst singleTextureLayout = fragmentBindGroupLayout(device, [\n\t\t\"texture\",\n\t\t\"sampler\",\n\t\t\"texture\"\n\t]);\n\tconst signalTextureLayout = texturesLayout(device, 2);\n\tconst res = {\n\t\thighPassUniformLayout,\n\t\tsingleTextureLayout,\n\t\tsignalTextureLayout,\n\t\thighPassPipeline: createFullscreenPipeline(device, {\n\t\t\tmodule: device.createShaderModule({ code: WGSL_HIGHPASS_UNIFORMS }),\n\t\t\tlayouts: device.createPipelineLayout({ bindGroupLayouts: [\n\t\t\t\thighPassUniformLayout,\n\t\t\t\tsingleTextureLayout,\n\t\t\t\tsignalTextureLayout\n\t\t\t] }),\n\t\t\tformat: targetFormat\n\t\t})\n\t};\n\tdeviceResourceCache.set(device, res);\n\treturn res;\n}\nconst WebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetTexture, targetWidth, targetHeight, props } = args;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"HighPass\" || !op) return;\n\tconst childMedia = props.virtualMedia.children?.[0];\n\tif (!childMedia) return;\n\tpass.end();\n\tconst frame = props.frame ?? 0;\n\tconst fps = props.fps || 30;\n\tconst width = targetWidth;\n\tconst height = targetHeight;\n\tconst nodeId = op.inputs ? Object.keys(op.inputs)[0] : \"highpass_node\";\n\tconst resolveField = (handleId, fallbackVal, clampMin = 0, clampMax = 1e3) => resolveHandleParam(op.inputs, handleId, fallbackVal, clampMin, clampMax);\n\tconst radiusRes = resolveField(op.radiusHandleId, Number(op.radius ?? 3), .1, MAX_RADIUS);\n\tconst contrastRes = resolveField(op.contrastBoostHandleId, Number(op.contrastBoost ?? 1), 1, 10);\n\tconst { texture: tmpTex } = await drawChildToTexture(args, childMedia);\n\tconst { highPassPipeline: pipeline, highPassUniformLayout: uLayout, singleTextureLayout: tLayout, signalTextureLayout: sigLayout } = getHighPassResources(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 radiusView = getSignalView(radiusRes, \"radius_sig\");\n\tconst contrastView = getSignalView(contrastRes, \"contrast_sig\");\n\tconst createHighPassBindGroup1 = (inputTex, origTexture) => ctx.device.createBindGroup({\n\t\tlayout: tLayout,\n\t\tentries: [\n\t\t\t{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: inputTex.createView()\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 1,\n\t\t\t\tresource: sampler\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 2,\n\t\t\t\tresource: origTexture.createView()\n\t\t\t}\n\t\t]\n\t});\n\thighPassUniformData[2] = radiusRes.val;\n\thighPassUniformData[3] = contrastRes.val;\n\thighPassUniformData[4] = op.monochrome ?? true ? 1 : 0;\n\thighPassUniformData[5] = radiusRes.hasStaticSig ? 1 : 0;\n\thighPassUniformData[6] = contrastRes.hasStaticSig ? 1 : 0;\n\thighPassUniformData[7] = 0;\n\tconst outTex1 = ctx.renderer.getTemporaryTexture(width, height, [\n\t\ttmpTex,\n\t\ttargetTexture,\n\t\t...props.excludeTextures || []\n\t]);\n\tconst outTex2 = ctx.renderer.getTemporaryTexture(width, height, [\n\t\ttmpTex,\n\t\toutTex1,\n\t\ttargetTexture,\n\t\t...props.excludeTextures || []\n\t]);\n\tconst sigBindGroup = ctx.device.createBindGroup({\n\t\tlayout: sigLayout,\n\t\tentries: [\n\t\t\t{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: radiusView\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 1,\n\t\t\t\tresource: contrastView\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 2,\n\t\t\t\tresource: sampler\n\t\t\t}\n\t\t]\n\t});\n\thighPassUniformData[0] = 1;\n\thighPassUniformData[1] = 0;\n\thighPassUniformData[7] = 0;\n\tconst hBuffer = ctx.renderer.getTemporaryBuffer(highPassUniformData);\n\tdrawFullscreenPass(encoder, outTex1.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: hBuffer }\n\t\t\t}]\n\t\t}),\n\t\tcreateHighPassBindGroup1(tmpTex, tmpTex),\n\t\tsigBindGroup\n\t]);\n\thighPassUniformData[0] = 0;\n\thighPassUniformData[1] = 1;\n\thighPassUniformData[7] = 1;\n\tconst vBuffer = ctx.renderer.getTemporaryBuffer(highPassUniformData);\n\tdrawFullscreenPass(encoder, outTex2.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: vBuffer }\n\t\t\t}]\n\t\t}),\n\t\tcreateHighPassBindGroup1(outTex1, tmpTex),\n\t\tsigBindGroup\n\t]);\n\tdrawTextureToTarget(args, outTex2, op.opacity ?? 1);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer });\n\n//#endregion\nexport { MAX_RADIUS as a, HighPassResultSchema as i, HIGH_PASS_OUTPUT_TYPE_MAP as n, highPassConfig as o, HighPassNodeConfigSchema as r, renderers_default as t };\n//# sourceMappingURL=renderers-DUL8Peaw.mjs.map"],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import "./chunk-D8S17ehY.mjs";
2
+ import "./dist-D12-a3-x.mjs";
3
+ import { t as renderers_default } from "./renderer-Dat8opUZ.mjs";
4
+
5
+ export { renderers_default as default };
@@ -1,6 +1,6 @@
1
- import { Cn as resolveString, xn as resolveNumber } from "./dist-BlIrsfcn.mjs";
2
- import { i as isHandleConnected, n as defineRenderer } from "./renderer-mNSyac1V.mjs";
3
- import { g as WebGPUAudioProcessor } from "./dist-C1cCW7Bt.mjs";
1
+ import { Cn as resolveString, xn as resolveNumber } from "./dist-ByxHoMQI.mjs";
2
+ import { i as isHandleConnected, n as defineRenderer } from "./renderer-DrWeb39d.mjs";
3
+ import { g as WebGPUAudioProcessor } from "./dist-D12-a3-x.mjs";
4
4
 
5
5
  //#region ../../nodes/node-audio-parametric-eq/dist/renderers-Dt34aC_m.mjs
6
6
  const PARAM_ORDER = [
@@ -262,4 +262,4 @@ var renderers_default = defineRenderer({ audioProcessor: parametricEqAudioProces
262
262
 
263
263
  //#endregion
264
264
  export { renderers_default as t };
265
- //# sourceMappingURL=renderer-C7L8Ceqr.mjs.map
265
+ //# sourceMappingURL=renderer-CYX9vKZ-.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-C7L8Ceqr.mjs","names":[],"sources":["../../../nodes/node-audio-parametric-eq/dist/renderers-Dt34aC_m.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { isHandleConnected, resolveNumber, resolveString } from \"@framefields/node-sdk\";\nimport { WebGPUAudioProcessor } from \"@framefields/webgpu-renderers\";\n\n//#region src/renderers/audio-processor.ts\nconst PARAM_ORDER = [\n\t\"frequency\",\n\t\"gain\",\n\t\"q\"\n];\nconst PARAMETRIC_EQ_SHADER_TEMPLATE = () => `\nstruct Uniforms {\n sampleRate : f32,\n numBands : f32,\n frequency : f32,\n gain : f32,\n q : f32,\n bandType : f32,\n hasFrequencySig : f32,\n hasGainSig : f32,\n hasQSig : f32,\n baseTime : f32,\n frame : f32,\n numSamples : f32,\n numChannels : f32,\n pad1 : f32,\n pad2 : f32,\n pad3 : 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> frequencySignal : array<f32>;\n@group(0) @binding(5) var<storage, read> gainSignal : array<f32>;\n@group(0) @binding(6) var<storage, read> qSignal : array<f32>;\n\nconst PI: f32 = 3.141592653589793f;\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 sampleRate = u.sampleRate;\n let bandType = u.bandType; // 0=peak, 1=lowShelf, 2=highShelf, 3=lowPass, 4=highPass, 5=notch\n\n let biquadStateOffset = 4u;\n\n for (var c = 0u; c < numChannels; c = c + 1u) {\n let offset = biquadStateOffset + c * 4u;\n var x1 = state[offset];\n var x2 = state[offset + 1u];\n var y1 = state[offset + 2u];\n var y2 = state[offset + 3u];\n\n if (is_nan_or_inf(x1)) { x1 = 0.0f; }\n if (is_nan_or_inf(x2)) { x2 = 0.0f; }\n if (is_nan_or_inf(y1)) { y1 = 0.0f; }\n if (is_nan_or_inf(y2)) { y2 = 0.0f; }\n\n for (var index = 0u; index < numSamples; index = index + 1u) {\n let sampleIndex = c * numSamples + index;\n var x = inputChannels[sampleIndex];\n if (is_nan_or_inf(x)) { x = 0.0f; }\n\n // 1. Dynamic Parameter Signal Resolution & Clamping\n var effFreq = u.frequency;\n if (u.hasFrequencySig > 0.5f) {\n effFreq = frequencySignal[index];\n }\n effFreq = clamp(effFreq, 20.0f, sampleRate / 2.0f - 1.0f);\n\n var effQ = u.q;\n if (u.hasQSig > 0.5f) {\n effQ = qSignal[index];\n }\n effQ = clamp(effQ, 0.01f, 10.0f);\n\n var effGain = u.gain;\n if (u.hasGainSig > 0.5f) {\n effGain = gainSignal[index];\n }\n effGain = clamp(effGain, -24.0f, 24.0f);\n\n if (bandType == 0.0f && abs(effGain) < 1e-5f) {\n // Bypass filter if peak gain is zero\n outputChannels[sampleIndex] = x;\n continue;\n }\n\n // 2. Biquad Coefficients Calculation\n let w0 = (2.0f * PI * effFreq) / sampleRate;\n let cos_w0 = cos(w0);\n let sin_w0 = sin(w0);\n let A = clamp(pow(10.0f, effGain / 40.0f), 0.25f, 4.0f);\n let alpha = sin_w0 / (2.0f * effQ);\n\n var b0 = 0.0f; var b1 = 0.0f; var b2 = 0.0f;\n var a0 = 0.0f; var a1 = 0.0f; var a2 = 0.0f;\n\n if (bandType == 0.0f) { // peak\n b0 = 1.0f + alpha * A;\n b1 = -2.0f * cos_w0;\n b2 = 1.0f - alpha * A;\n a0 = 1.0f + alpha / A;\n a1 = -2.0f * cos_w0;\n a2 = 1.0f - alpha / A;\n } else if (bandType == 1.0f) { // lowShelf\n let sqrtA = sqrt(A);\n let twoSqrtAAlpha = 2.0f * sqrtA * alpha;\n b0 = A * (A + 1.0f - (A - 1.0f) * cos_w0 + twoSqrtAAlpha);\n b1 = 2.0f * A * (A - 1.0f - (A + 1.0f) * cos_w0);\n b2 = A * (A + 1.0f - (A - 1.0f) * cos_w0 - twoSqrtAAlpha);\n a0 = A + 1.0f + (A - 1.0f) * cos_w0 + twoSqrtAAlpha;\n a1 = -2.0f * (A - 1.0f + (A + 1.0f) * cos_w0);\n a2 = A + 1.0f + (A - 1.0f) * cos_w0 - twoSqrtAAlpha;\n } else if (bandType == 2.0f) { // highShelf\n let sqrtA = sqrt(A);\n let twoSqrtAAlpha = 2.0f * sqrtA * alpha;\n b0 = A * (A + 1.0f + (A - 1.0f) * cos_w0 + twoSqrtAAlpha);\n b1 = -2.0f * A * (A - 1.0f + (A + 1.0f) * cos_w0);\n b2 = A * (A + 1.0f + (A - 1.0f) * cos_w0 - twoSqrtAAlpha);\n a0 = A + 1.0f - (A - 1.0f) * cos_w0 + twoSqrtAAlpha;\n a1 = 2.0f * (A - 1.0f - (A + 1.0f) * cos_w0);\n a2 = A + 1.0f - (A - 1.0f) * cos_w0 - twoSqrtAAlpha;\n } else if (bandType == 3.0f) { // lowPass\n b0 = (1.0f - cos_w0) / 2.0f;\n b1 = 1.0f - cos_w0;\n b2 = (1.0f - cos_w0) / 2.0f;\n a0 = 1.0f + alpha;\n a1 = -2.0f * cos_w0;\n a2 = 1.0f - alpha;\n } else if (bandType == 4.0f) { // highPass\n b0 = (1.0f + cos_w0) / 2.0f;\n b1 = -(1.0f + cos_w0);\n b2 = (1.0f + cos_w0) / 2.0f;\n a0 = 1.0f + alpha;\n a1 = -2.0f * cos_w0;\n a2 = 1.0f - alpha;\n } else if (bandType == 5.0f) { // notch\n b0 = 1.0f;\n b1 = -2.0f * cos_w0;\n b2 = 1.0f;\n a0 = 1.0f + alpha;\n a1 = -2.0f * cos_w0;\n a2 = 1.0f - alpha;\n }\n\n if (abs(a0) < 1e-9f) {\n outputChannels[sampleIndex] = x;\n continue;\n }\n\n let b0_norm = b0 / a0;\n let b1_norm = b1 / a0;\n let b2_norm = b2 / a0;\n let a1_norm = a1 / a0;\n let a2_norm = a2 / a0;\n\n var y = b0_norm * x + b1_norm * x1 + b2_norm * x2 - a1_norm * y1 - a2_norm * y2;\n if (is_nan_or_inf(y)) { y = 0.0f; }\n\n // Biquad State History Update with Soft Anti-Explosion Clamping\n x2 = x1;\n x1 = x;\n y2 = clamp(y1, -4.0f, 4.0f);\n y1 = clamp(y, -4.0f, 4.0f);\n\n // Output Soft Clipping\n if (y > 1.0f) {\n y = 1.0f;\n } else if (y < -1.0f) {\n y = -1.0f;\n } else if (y > 0.9f) {\n y = 0.9f + 0.1f * tanh((y - 0.9f) / 0.1f);\n } else if (y < -0.9f) {\n y = -0.9f + 0.1f * tanh((y + 0.9f) / 0.1f);\n }\n\n outputChannels[sampleIndex] = y;\n }\n\n state[offset] = x1;\n state[offset + 1u] = x2;\n state[offset + 2u] = y1;\n state[offset + 3u] = y2;\n }\n}\n`;\nconst getBandTypeVal = (type) => {\n\tif (type === \"peak\") return 0;\n\tif (type === \"lowShelf\") return 1;\n\tif (type === \"highShelf\") return 2;\n\tif (type === \"lowPass\") return 3;\n\tif (type === \"highPass\") return 4;\n\tif (type === \"notch\") return 5;\n\treturn 0;\n};\nconst parametricEqAudioProcessor = async (channels, sampleRate, virtualMedia, ctx) => {\n\tif (!ctx?.device) throw new Error(\"GPUDevice is required for WebGPU Parametric EQ.\");\n\tconst op = virtualMedia.operation || {};\n\tconst rawType = resolveString(op.type, \"peak\");\n\tconst config = {\n\t\ttype: [\n\t\t\t\"lowShelf\",\n\t\t\t\"highShelf\",\n\t\t\t\"peak\",\n\t\t\t\"lowPass\",\n\t\t\t\"highPass\",\n\t\t\t\"notch\"\n\t\t].includes(rawType) ? rawType : \"peak\",\n\t\tfrequency: resolveNumber(op.frequency, 1e3),\n\t\tfrequencyHandleId: typeof op.frequencyHandleId === \"string\" ? op.frequencyHandleId : null,\n\t\tgain: resolveNumber(op.gain, 0),\n\t\tgainHandleId: typeof op.gainHandleId === \"string\" ? op.gainHandleId : null,\n\t\tq: resolveNumber(op.q, 1),\n\t\tqHandleId: typeof op.qHandleId === \"string\" ? op.qHandleId : null\n\t};\n\tconst hasFrequencySig = isHandleConnected(op, \"frequencyHandleId\") ? 1 : 0;\n\tconst hasGainSig = isHandleConnected(op, \"gainHandleId\") ? 1 : 0;\n\tconst hasQSig = isHandleConnected(op, \"qHandleId\") ? 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 nodeId = op.id || \"audio-parametric-eq\";\n\tconst frame = ctx.frame ?? 0;\n\tconst fps = ctx.fps ?? 24;\n\tconst stateFloatCount = 4 + numChannels * 4;\n\tawait WebGPUAudioProcessor.process(ctx.device, nodeId, channels, sampleRate, virtualMedia, frame, fps, PARAMETRIC_EQ_SHADER_TEMPLATE, () => [\n\t\tsampleRate,\n\t\t1,\n\t\tconfig.frequency,\n\t\tconfig.gain,\n\t\tconfig.q,\n\t\tgetBandTypeVal(config.type),\n\t\thasFrequencySig,\n\t\thasGainSig,\n\t\thasQSig,\n\t\t0,\n\t\tframe,\n\t\tnumSamples,\n\t\tnumChannels,\n\t\t0,\n\t\t0,\n\t\t0\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: parametricEqAudioProcessor });\n\n//#endregion\nexport { renderers_default as t };\n//# sourceMappingURL=renderers-Dt34aC_m.mjs.map"],"mappings":";;;;;AAKA,MAAM,cAAc;CACnB;CACA;CACA;CACA;AACD,MAAM,sCAAsC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+L5C,MAAM,kBAAkB,SAAS;AAChC,KAAI,SAAS,OAAQ,QAAO;AAC5B,KAAI,SAAS,WAAY,QAAO;AAChC,KAAI,SAAS,YAAa,QAAO;AACjC,KAAI,SAAS,UAAW,QAAO;AAC/B,KAAI,SAAS,WAAY,QAAO;AAChC,KAAI,SAAS,QAAS,QAAO;AAC7B,QAAO;;AAER,MAAM,6BAA6B,OAAO,UAAU,YAAY,cAAc,QAAQ;AACrF,KAAI,CAAC,KAAK,OAAQ,OAAM,IAAI,MAAM,kDAAkD;CACpF,MAAM,KAAK,aAAa,aAAa,EAAE;CACvC,MAAM,UAAU,cAAc,GAAG,MAAM,OAAO;CAC9C,MAAM,SAAS;EACd,MAAM;GACL;GACA;GACA;GACA;GACA;GACA;GACA,CAAC,SAAS,QAAQ,GAAG,UAAU;EAChC,WAAW,cAAc,GAAG,WAAW,IAAI;EAC3C,mBAAmB,OAAO,GAAG,sBAAsB,WAAW,GAAG,oBAAoB;EACrF,MAAM,cAAc,GAAG,MAAM,EAAE;EAC/B,cAAc,OAAO,GAAG,iBAAiB,WAAW,GAAG,eAAe;EACtE,GAAG,cAAc,GAAG,GAAG,EAAE;EACzB,WAAW,OAAO,GAAG,cAAc,WAAW,GAAG,YAAY;EAC7D;CACD,MAAM,kBAAkB,kBAAkB,IAAI,oBAAoB,GAAG,IAAI;CACzE,MAAM,aAAa,kBAAkB,IAAI,eAAe,GAAG,IAAI;CAC/D,MAAM,UAAU,kBAAkB,IAAI,YAAY,GAAG,IAAI;CACzD,MAAM,cAAc,SAAS;AAC7B,KAAI,gBAAgB,EAAG;CACvB,MAAM,aAAa,SAAS,GAAG;AAC/B,KAAI,eAAe,EAAG;CACtB,MAAM,SAAS,GAAG,MAAM;CACxB,MAAM,QAAQ,IAAI,SAAS;CAC3B,MAAM,MAAM,IAAI,OAAO;CACvB,MAAM,kBAAkB,IAAI,cAAc;AAC1C,OAAM,qBAAqB,QAAQ,IAAI,QAAQ,QAAQ,UAAU,YAAY,cAAc,OAAO,KAAK,qCAAqC;EAC3I;EACA;EACA,OAAO;EACP,OAAO;EACP,OAAO;EACP,eAAe,OAAO,KAAK;EAC3B;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,4BAA4B,CAAC"}
1
+ {"version":3,"file":"renderer-CYX9vKZ-.mjs","names":[],"sources":["../../../nodes/node-audio-parametric-eq/dist/renderers-Dt34aC_m.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { isHandleConnected, resolveNumber, resolveString } from \"@framefields/node-sdk\";\nimport { WebGPUAudioProcessor } from \"@framefields/webgpu-renderers\";\n\n//#region src/renderers/audio-processor.ts\nconst PARAM_ORDER = [\n\t\"frequency\",\n\t\"gain\",\n\t\"q\"\n];\nconst PARAMETRIC_EQ_SHADER_TEMPLATE = () => `\nstruct Uniforms {\n sampleRate : f32,\n numBands : f32,\n frequency : f32,\n gain : f32,\n q : f32,\n bandType : f32,\n hasFrequencySig : f32,\n hasGainSig : f32,\n hasQSig : f32,\n baseTime : f32,\n frame : f32,\n numSamples : f32,\n numChannels : f32,\n pad1 : f32,\n pad2 : f32,\n pad3 : 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> frequencySignal : array<f32>;\n@group(0) @binding(5) var<storage, read> gainSignal : array<f32>;\n@group(0) @binding(6) var<storage, read> qSignal : array<f32>;\n\nconst PI: f32 = 3.141592653589793f;\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 sampleRate = u.sampleRate;\n let bandType = u.bandType; // 0=peak, 1=lowShelf, 2=highShelf, 3=lowPass, 4=highPass, 5=notch\n\n let biquadStateOffset = 4u;\n\n for (var c = 0u; c < numChannels; c = c + 1u) {\n let offset = biquadStateOffset + c * 4u;\n var x1 = state[offset];\n var x2 = state[offset + 1u];\n var y1 = state[offset + 2u];\n var y2 = state[offset + 3u];\n\n if (is_nan_or_inf(x1)) { x1 = 0.0f; }\n if (is_nan_or_inf(x2)) { x2 = 0.0f; }\n if (is_nan_or_inf(y1)) { y1 = 0.0f; }\n if (is_nan_or_inf(y2)) { y2 = 0.0f; }\n\n for (var index = 0u; index < numSamples; index = index + 1u) {\n let sampleIndex = c * numSamples + index;\n var x = inputChannels[sampleIndex];\n if (is_nan_or_inf(x)) { x = 0.0f; }\n\n // 1. Dynamic Parameter Signal Resolution & Clamping\n var effFreq = u.frequency;\n if (u.hasFrequencySig > 0.5f) {\n effFreq = frequencySignal[index];\n }\n effFreq = clamp(effFreq, 20.0f, sampleRate / 2.0f - 1.0f);\n\n var effQ = u.q;\n if (u.hasQSig > 0.5f) {\n effQ = qSignal[index];\n }\n effQ = clamp(effQ, 0.01f, 10.0f);\n\n var effGain = u.gain;\n if (u.hasGainSig > 0.5f) {\n effGain = gainSignal[index];\n }\n effGain = clamp(effGain, -24.0f, 24.0f);\n\n if (bandType == 0.0f && abs(effGain) < 1e-5f) {\n // Bypass filter if peak gain is zero\n outputChannels[sampleIndex] = x;\n continue;\n }\n\n // 2. Biquad Coefficients Calculation\n let w0 = (2.0f * PI * effFreq) / sampleRate;\n let cos_w0 = cos(w0);\n let sin_w0 = sin(w0);\n let A = clamp(pow(10.0f, effGain / 40.0f), 0.25f, 4.0f);\n let alpha = sin_w0 / (2.0f * effQ);\n\n var b0 = 0.0f; var b1 = 0.0f; var b2 = 0.0f;\n var a0 = 0.0f; var a1 = 0.0f; var a2 = 0.0f;\n\n if (bandType == 0.0f) { // peak\n b0 = 1.0f + alpha * A;\n b1 = -2.0f * cos_w0;\n b2 = 1.0f - alpha * A;\n a0 = 1.0f + alpha / A;\n a1 = -2.0f * cos_w0;\n a2 = 1.0f - alpha / A;\n } else if (bandType == 1.0f) { // lowShelf\n let sqrtA = sqrt(A);\n let twoSqrtAAlpha = 2.0f * sqrtA * alpha;\n b0 = A * (A + 1.0f - (A - 1.0f) * cos_w0 + twoSqrtAAlpha);\n b1 = 2.0f * A * (A - 1.0f - (A + 1.0f) * cos_w0);\n b2 = A * (A + 1.0f - (A - 1.0f) * cos_w0 - twoSqrtAAlpha);\n a0 = A + 1.0f + (A - 1.0f) * cos_w0 + twoSqrtAAlpha;\n a1 = -2.0f * (A - 1.0f + (A + 1.0f) * cos_w0);\n a2 = A + 1.0f + (A - 1.0f) * cos_w0 - twoSqrtAAlpha;\n } else if (bandType == 2.0f) { // highShelf\n let sqrtA = sqrt(A);\n let twoSqrtAAlpha = 2.0f * sqrtA * alpha;\n b0 = A * (A + 1.0f + (A - 1.0f) * cos_w0 + twoSqrtAAlpha);\n b1 = -2.0f * A * (A - 1.0f + (A + 1.0f) * cos_w0);\n b2 = A * (A + 1.0f + (A - 1.0f) * cos_w0 - twoSqrtAAlpha);\n a0 = A + 1.0f - (A - 1.0f) * cos_w0 + twoSqrtAAlpha;\n a1 = 2.0f * (A - 1.0f - (A + 1.0f) * cos_w0);\n a2 = A + 1.0f - (A - 1.0f) * cos_w0 - twoSqrtAAlpha;\n } else if (bandType == 3.0f) { // lowPass\n b0 = (1.0f - cos_w0) / 2.0f;\n b1 = 1.0f - cos_w0;\n b2 = (1.0f - cos_w0) / 2.0f;\n a0 = 1.0f + alpha;\n a1 = -2.0f * cos_w0;\n a2 = 1.0f - alpha;\n } else if (bandType == 4.0f) { // highPass\n b0 = (1.0f + cos_w0) / 2.0f;\n b1 = -(1.0f + cos_w0);\n b2 = (1.0f + cos_w0) / 2.0f;\n a0 = 1.0f + alpha;\n a1 = -2.0f * cos_w0;\n a2 = 1.0f - alpha;\n } else if (bandType == 5.0f) { // notch\n b0 = 1.0f;\n b1 = -2.0f * cos_w0;\n b2 = 1.0f;\n a0 = 1.0f + alpha;\n a1 = -2.0f * cos_w0;\n a2 = 1.0f - alpha;\n }\n\n if (abs(a0) < 1e-9f) {\n outputChannels[sampleIndex] = x;\n continue;\n }\n\n let b0_norm = b0 / a0;\n let b1_norm = b1 / a0;\n let b2_norm = b2 / a0;\n let a1_norm = a1 / a0;\n let a2_norm = a2 / a0;\n\n var y = b0_norm * x + b1_norm * x1 + b2_norm * x2 - a1_norm * y1 - a2_norm * y2;\n if (is_nan_or_inf(y)) { y = 0.0f; }\n\n // Biquad State History Update with Soft Anti-Explosion Clamping\n x2 = x1;\n x1 = x;\n y2 = clamp(y1, -4.0f, 4.0f);\n y1 = clamp(y, -4.0f, 4.0f);\n\n // Output Soft Clipping\n if (y > 1.0f) {\n y = 1.0f;\n } else if (y < -1.0f) {\n y = -1.0f;\n } else if (y > 0.9f) {\n y = 0.9f + 0.1f * tanh((y - 0.9f) / 0.1f);\n } else if (y < -0.9f) {\n y = -0.9f + 0.1f * tanh((y + 0.9f) / 0.1f);\n }\n\n outputChannels[sampleIndex] = y;\n }\n\n state[offset] = x1;\n state[offset + 1u] = x2;\n state[offset + 2u] = y1;\n state[offset + 3u] = y2;\n }\n}\n`;\nconst getBandTypeVal = (type) => {\n\tif (type === \"peak\") return 0;\n\tif (type === \"lowShelf\") return 1;\n\tif (type === \"highShelf\") return 2;\n\tif (type === \"lowPass\") return 3;\n\tif (type === \"highPass\") return 4;\n\tif (type === \"notch\") return 5;\n\treturn 0;\n};\nconst parametricEqAudioProcessor = async (channels, sampleRate, virtualMedia, ctx) => {\n\tif (!ctx?.device) throw new Error(\"GPUDevice is required for WebGPU Parametric EQ.\");\n\tconst op = virtualMedia.operation || {};\n\tconst rawType = resolveString(op.type, \"peak\");\n\tconst config = {\n\t\ttype: [\n\t\t\t\"lowShelf\",\n\t\t\t\"highShelf\",\n\t\t\t\"peak\",\n\t\t\t\"lowPass\",\n\t\t\t\"highPass\",\n\t\t\t\"notch\"\n\t\t].includes(rawType) ? rawType : \"peak\",\n\t\tfrequency: resolveNumber(op.frequency, 1e3),\n\t\tfrequencyHandleId: typeof op.frequencyHandleId === \"string\" ? op.frequencyHandleId : null,\n\t\tgain: resolveNumber(op.gain, 0),\n\t\tgainHandleId: typeof op.gainHandleId === \"string\" ? op.gainHandleId : null,\n\t\tq: resolveNumber(op.q, 1),\n\t\tqHandleId: typeof op.qHandleId === \"string\" ? op.qHandleId : null\n\t};\n\tconst hasFrequencySig = isHandleConnected(op, \"frequencyHandleId\") ? 1 : 0;\n\tconst hasGainSig = isHandleConnected(op, \"gainHandleId\") ? 1 : 0;\n\tconst hasQSig = isHandleConnected(op, \"qHandleId\") ? 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 nodeId = op.id || \"audio-parametric-eq\";\n\tconst frame = ctx.frame ?? 0;\n\tconst fps = ctx.fps ?? 24;\n\tconst stateFloatCount = 4 + numChannels * 4;\n\tawait WebGPUAudioProcessor.process(ctx.device, nodeId, channels, sampleRate, virtualMedia, frame, fps, PARAMETRIC_EQ_SHADER_TEMPLATE, () => [\n\t\tsampleRate,\n\t\t1,\n\t\tconfig.frequency,\n\t\tconfig.gain,\n\t\tconfig.q,\n\t\tgetBandTypeVal(config.type),\n\t\thasFrequencySig,\n\t\thasGainSig,\n\t\thasQSig,\n\t\t0,\n\t\tframe,\n\t\tnumSamples,\n\t\tnumChannels,\n\t\t0,\n\t\t0,\n\t\t0\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: parametricEqAudioProcessor });\n\n//#endregion\nexport { renderers_default as t };\n//# sourceMappingURL=renderers-Dt34aC_m.mjs.map"],"mappings":";;;;;AAKA,MAAM,cAAc;CACnB;CACA;CACA;CACA;AACD,MAAM,sCAAsC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+L5C,MAAM,kBAAkB,SAAS;AAChC,KAAI,SAAS,OAAQ,QAAO;AAC5B,KAAI,SAAS,WAAY,QAAO;AAChC,KAAI,SAAS,YAAa,QAAO;AACjC,KAAI,SAAS,UAAW,QAAO;AAC/B,KAAI,SAAS,WAAY,QAAO;AAChC,KAAI,SAAS,QAAS,QAAO;AAC7B,QAAO;;AAER,MAAM,6BAA6B,OAAO,UAAU,YAAY,cAAc,QAAQ;AACrF,KAAI,CAAC,KAAK,OAAQ,OAAM,IAAI,MAAM,kDAAkD;CACpF,MAAM,KAAK,aAAa,aAAa,EAAE;CACvC,MAAM,UAAU,cAAc,GAAG,MAAM,OAAO;CAC9C,MAAM,SAAS;EACd,MAAM;GACL;GACA;GACA;GACA;GACA;GACA;GACA,CAAC,SAAS,QAAQ,GAAG,UAAU;EAChC,WAAW,cAAc,GAAG,WAAW,IAAI;EAC3C,mBAAmB,OAAO,GAAG,sBAAsB,WAAW,GAAG,oBAAoB;EACrF,MAAM,cAAc,GAAG,MAAM,EAAE;EAC/B,cAAc,OAAO,GAAG,iBAAiB,WAAW,GAAG,eAAe;EACtE,GAAG,cAAc,GAAG,GAAG,EAAE;EACzB,WAAW,OAAO,GAAG,cAAc,WAAW,GAAG,YAAY;EAC7D;CACD,MAAM,kBAAkB,kBAAkB,IAAI,oBAAoB,GAAG,IAAI;CACzE,MAAM,aAAa,kBAAkB,IAAI,eAAe,GAAG,IAAI;CAC/D,MAAM,UAAU,kBAAkB,IAAI,YAAY,GAAG,IAAI;CACzD,MAAM,cAAc,SAAS;AAC7B,KAAI,gBAAgB,EAAG;CACvB,MAAM,aAAa,SAAS,GAAG;AAC/B,KAAI,eAAe,EAAG;CACtB,MAAM,SAAS,GAAG,MAAM;CACxB,MAAM,QAAQ,IAAI,SAAS;CAC3B,MAAM,MAAM,IAAI,OAAO;CACvB,MAAM,kBAAkB,IAAI,cAAc;AAC1C,OAAM,qBAAqB,QAAQ,IAAI,QAAQ,QAAQ,UAAU,YAAY,cAAc,OAAO,KAAK,qCAAqC;EAC3I;EACA;EACA,OAAO;EACP,OAAO;EACP,OAAO;EACP,eAAe,OAAO,KAAK;EAC3B;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,4BAA4B,CAAC"}
@@ -1,8 +1,8 @@
1
- import "./chunk-BcJoO4Nm.mjs";
2
- import { n as defineRenderer } from "./renderer-mNSyac1V.mjs";
3
- import "./dist-C1cCW7Bt.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-CMaa63nz.mjs";
5
- import { i as OpticalFlowComputePipeline } from "./dist-Buaaj-Ul.mjs";
1
+ import "./chunk-D8S17ehY.mjs";
2
+ import { n as defineRenderer } from "./renderer-DrWeb39d.mjs";
3
+ import "./dist-D12-a3-x.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-zFNrvhV9.mjs";
5
+ import { i as OpticalFlowComputePipeline } from "./dist-Cn8bDsQF.mjs";
6
6
 
7
7
  //#region ../../nodes/node-datamosh/dist/renderers-D-M1-_H_.mjs
8
8
  const HISTORY_FORMAT = "rgba16float";
@@ -205,4 +205,4 @@ var renderers_default = defineRenderer({ WebGPURenderer: DatamoshWebGPURenderer
205
205
 
206
206
  //#endregion
207
207
  export { DatamoshWebGPURenderer, renderers_default as default };
208
- //# sourceMappingURL=renderer-8QIwXh7O.mjs.map
208
+ //# sourceMappingURL=renderer-C_2UDMEG.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-8QIwXh7O.mjs","names":[],"sources":["../../../nodes/node-datamosh/dist/renderers-D-M1-_H_.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { FULLSCREEN_QUAD_WGSL, drawChildToTexture, drawFullscreenPass, drawTextureToTarget, fragmentBindGroupLayout, perDevice } from \"@framefields/node-sdk/gpu\";\nimport { OpticalFlowComputePipeline } from \"@framefields/tensor-webgpu\";\n\n//#region src/renderers/webgpu-renderer.ts\nconst HISTORY_FORMAT = \"rgba16float\";\nconst MOSH_WGSL = `\nstruct U { a : vec4<f32>, b : vec4<f32> };\n@group(0) @binding(0) var<uniform> u : U;\n@group(0) @binding(1) var moshTex : texture_2d<f32>;\n@group(0) @binding(2) var currentTex : texture_2d<f32>;\n@group(0) @binding(3) var flowTex : texture_2d<f32>;\n@group(0) @binding(4) var samp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet strength = u.a.x;\n\tlet bleed = u.a.y;\n\tlet inv = u.a.zw;\n\tlet cur0 = textureSampleLevel(currentTex, samp, in.uv, 0.0);\n\tif (u.b.x > 0.5) { return cur0; }\n\tlet dims = vec2<f32>(textureDimensions(flowTex));\n\tlet coord = vec2<i32>(clamp(in.uv * dims, vec2<f32>(0.0), dims - 1.0));\n\tlet flow = textureLoad(flowTex, coord, 0).xy;\n\tlet cur = textureSampleLevel(currentTex, samp, in.uv, 0.0);\n\t// The old picture moves with the new motion instead of being replaced.\n\tlet moved = textureSampleLevel(moshTex, samp, clamp(in.uv - flow * inv * strength, vec2<f32>(0.0), vec2<f32>(1.0)), 0.0);\n\tvar out = mix(moved, cur, bleed);\n\tif (moved.a < 0.01) { out = cur; }\n\treturn out;\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\"texture\",\n\t\t\"sampler\"\n\t], \"datamosh_layout\");\n\tconst module = device.createShaderModule({\n\t\tcode: MOSH_WGSL,\n\t\tlabel: \"datamosh.wgsl\"\n\t});\n\treturn {\n\t\tlayout,\n\t\tpipeline: device.createRenderPipeline({\n\t\t\tlabel: \"datamosh\",\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\tflow: new OpticalFlowComputePipeline(device),\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, format) {\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\th?.prev?.destroy();\n\tconst make = (label, fmt) => device.createTexture({\n\t\tlabel,\n\t\tsize: [width, height],\n\t\tformat: fmt,\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(\"feedback_front\", HISTORY_FORMAT),\n\t\tback: make(\"feedback_back\", HISTORY_FORMAT),\n\t\tprev: make(\"feedback_prev\", format),\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: [\n\t\t\th.front,\n\t\t\th.back,\n\t\t\t...h.prev ? [h.prev] : []\n\t\t],\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 stepDatamosh(args, h, v, frame, compositionStart, key) {\n\tconst cur = await childAt(args, frame, compositionStart, h);\n\tif (!cur || !h.prev) return;\n\tconst r = resources(args.ctx.device);\n\tconst { encoder } = args;\n\tconst clean = key || h.frame < 0;\n\tconst flow = clean ? cur.texture : r.flow.execute(h.prev, cur.texture, {}, encoder);\n\tconst uniforms = new Float32Array([\n\t\tv.strength,\n\t\tv.bleed,\n\t\t1 / h.width,\n\t\t1 / h.height,\n\t\tclean ? 1 : 0,\n\t\t0,\n\t\t0,\n\t\t0\n\t]);\n\tdrawFullscreenPass(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: flow.createView()\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 4,\n\t\t\t\tresource: r.sampler\n\t\t\t}\n\t\t]\n\t})]);\n\tencoder.copyTextureToTexture({ texture: cur.texture }, { texture: h.prev }, [\n\t\th.width,\n\t\th.height,\n\t\t1\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 DatamoshWebGPURenderer = async (args) => {\n\tconst { ctx, pass, targetWidth, targetHeight, props } = args;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"Datamosh\" || !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, ctx.renderer.format);\n\t{\n\t\tconst v = {\n\t\t\tkeyframes: Array.isArray(raw.keyframes) ? raw.keyframes.map(Math.round) : [],\n\t\t\tstrength: num(raw.strength, 1),\n\t\t\tbleed: Math.min(1, Math.max(0, num(raw.bleed, 0))),\n\t\t\twarmup: Math.max(1, Math.round(num(raw.warmup, 48)))\n\t\t};\n\t\tif (h.frame !== local) {\n\t\t\tlet start = local;\n\t\t\tif (h.frame !== local - 1) {\n\t\t\t\tconst lastKey = Math.max(0, ...v.keyframes.filter((k) => k <= local));\n\t\t\t\tstart = Math.max(lastKey, local - v.warmup);\n\t\t\t\th.frame = -1;\n\t\t\t}\n\t\t\tfor (let f = start; f <= local; f++) await stepDatamosh(args, h, v, f, compositionStart, f === 0 || v.keyframes.includes(f) || 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: DatamoshWebGPURenderer });\n\n//#endregion\nexport { DatamoshWebGPURenderer as n, renderers_default as t };\n//# sourceMappingURL=renderers-D-M1-_H_.mjs.map"],"mappings":"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"}
1
+ {"version":3,"file":"renderer-C_2UDMEG.mjs","names":[],"sources":["../../../nodes/node-datamosh/dist/renderers-D-M1-_H_.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { FULLSCREEN_QUAD_WGSL, drawChildToTexture, drawFullscreenPass, drawTextureToTarget, fragmentBindGroupLayout, perDevice } from \"@framefields/node-sdk/gpu\";\nimport { OpticalFlowComputePipeline } from \"@framefields/tensor-webgpu\";\n\n//#region src/renderers/webgpu-renderer.ts\nconst HISTORY_FORMAT = \"rgba16float\";\nconst MOSH_WGSL = `\nstruct U { a : vec4<f32>, b : vec4<f32> };\n@group(0) @binding(0) var<uniform> u : U;\n@group(0) @binding(1) var moshTex : texture_2d<f32>;\n@group(0) @binding(2) var currentTex : texture_2d<f32>;\n@group(0) @binding(3) var flowTex : texture_2d<f32>;\n@group(0) @binding(4) var samp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet strength = u.a.x;\n\tlet bleed = u.a.y;\n\tlet inv = u.a.zw;\n\tlet cur0 = textureSampleLevel(currentTex, samp, in.uv, 0.0);\n\tif (u.b.x > 0.5) { return cur0; }\n\tlet dims = vec2<f32>(textureDimensions(flowTex));\n\tlet coord = vec2<i32>(clamp(in.uv * dims, vec2<f32>(0.0), dims - 1.0));\n\tlet flow = textureLoad(flowTex, coord, 0).xy;\n\tlet cur = textureSampleLevel(currentTex, samp, in.uv, 0.0);\n\t// The old picture moves with the new motion instead of being replaced.\n\tlet moved = textureSampleLevel(moshTex, samp, clamp(in.uv - flow * inv * strength, vec2<f32>(0.0), vec2<f32>(1.0)), 0.0);\n\tvar out = mix(moved, cur, bleed);\n\tif (moved.a < 0.01) { out = cur; }\n\treturn out;\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\"texture\",\n\t\t\"sampler\"\n\t], \"datamosh_layout\");\n\tconst module = device.createShaderModule({\n\t\tcode: MOSH_WGSL,\n\t\tlabel: \"datamosh.wgsl\"\n\t});\n\treturn {\n\t\tlayout,\n\t\tpipeline: device.createRenderPipeline({\n\t\t\tlabel: \"datamosh\",\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\tflow: new OpticalFlowComputePipeline(device),\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, format) {\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\th?.prev?.destroy();\n\tconst make = (label, fmt) => device.createTexture({\n\t\tlabel,\n\t\tsize: [width, height],\n\t\tformat: fmt,\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(\"feedback_front\", HISTORY_FORMAT),\n\t\tback: make(\"feedback_back\", HISTORY_FORMAT),\n\t\tprev: make(\"feedback_prev\", format),\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: [\n\t\t\th.front,\n\t\t\th.back,\n\t\t\t...h.prev ? [h.prev] : []\n\t\t],\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 stepDatamosh(args, h, v, frame, compositionStart, key) {\n\tconst cur = await childAt(args, frame, compositionStart, h);\n\tif (!cur || !h.prev) return;\n\tconst r = resources(args.ctx.device);\n\tconst { encoder } = args;\n\tconst clean = key || h.frame < 0;\n\tconst flow = clean ? cur.texture : r.flow.execute(h.prev, cur.texture, {}, encoder);\n\tconst uniforms = new Float32Array([\n\t\tv.strength,\n\t\tv.bleed,\n\t\t1 / h.width,\n\t\t1 / h.height,\n\t\tclean ? 1 : 0,\n\t\t0,\n\t\t0,\n\t\t0\n\t]);\n\tdrawFullscreenPass(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: flow.createView()\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 4,\n\t\t\t\tresource: r.sampler\n\t\t\t}\n\t\t]\n\t})]);\n\tencoder.copyTextureToTexture({ texture: cur.texture }, { texture: h.prev }, [\n\t\th.width,\n\t\th.height,\n\t\t1\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 DatamoshWebGPURenderer = async (args) => {\n\tconst { ctx, pass, targetWidth, targetHeight, props } = args;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"Datamosh\" || !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, ctx.renderer.format);\n\t{\n\t\tconst v = {\n\t\t\tkeyframes: Array.isArray(raw.keyframes) ? raw.keyframes.map(Math.round) : [],\n\t\t\tstrength: num(raw.strength, 1),\n\t\t\tbleed: Math.min(1, Math.max(0, num(raw.bleed, 0))),\n\t\t\twarmup: Math.max(1, Math.round(num(raw.warmup, 48)))\n\t\t};\n\t\tif (h.frame !== local) {\n\t\t\tlet start = local;\n\t\t\tif (h.frame !== local - 1) {\n\t\t\t\tconst lastKey = Math.max(0, ...v.keyframes.filter((k) => k <= local));\n\t\t\t\tstart = Math.max(lastKey, local - v.warmup);\n\t\t\t\th.frame = -1;\n\t\t\t}\n\t\t\tfor (let f = start; f <= local; f++) await stepDatamosh(args, h, v, f, compositionStart, f === 0 || v.keyframes.includes(f) || 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: DatamoshWebGPURenderer });\n\n//#endregion\nexport { DatamoshWebGPURenderer as n, renderers_default as t };\n//# sourceMappingURL=renderers-D-M1-_H_.mjs.map"],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import "./chunk-D8S17ehY.mjs";
2
+ import "./dist-D12-a3-x.mjs";
3
+ import { t as renderers_default } from "./renderer-xDV2cCkX.mjs";
4
+
5
+ export { renderers_default as default };
@@ -0,0 +1,5 @@
1
+ import "./chunk-D8S17ehY.mjs";
2
+ import "./dist-D12-a3-x.mjs";
3
+ import { t as renderers_default } from "./renderer-C06U4c9k.mjs";
4
+
5
+ export { renderers_default as default };
@@ -1,6 +1,6 @@
1
- import { xn as resolveNumber } from "./dist-BlIrsfcn.mjs";
2
- import { i as isHandleConnected, n as defineRenderer } from "./renderer-mNSyac1V.mjs";
3
- import { g as WebGPUAudioProcessor } from "./dist-C1cCW7Bt.mjs";
1
+ import { xn as resolveNumber } from "./dist-ByxHoMQI.mjs";
2
+ import { i as isHandleConnected, n as defineRenderer } from "./renderer-DrWeb39d.mjs";
3
+ import { g as WebGPUAudioProcessor } from "./dist-D12-a3-x.mjs";
4
4
 
5
5
  //#region ../../nodes/node-audio-compressor/dist/renderers-BorUA3F3.mjs
6
6
  const PARAM_ORDER = [
@@ -248,4 +248,4 @@ var renderers_default = defineRenderer({ audioProcessor: compressorAudioProcesso
248
248
 
249
249
  //#endregion
250
250
  export { renderers_default as t };
251
- //# sourceMappingURL=renderer-B2jjxsjO.mjs.map
251
+ //# sourceMappingURL=renderer-CbhnJi_8.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-B2jjxsjO.mjs","names":[],"sources":["../../../nodes/node-audio-compressor/dist/renderers-BorUA3F3.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\"ratio\",\n\t\"attack\",\n\t\"release\",\n\t\"knee\",\n\t\"makeupGain\"\n];\nconst COMPRESSOR_SHADER_TEMPLATE = () => `\nstruct Uniforms {\n sampleRate : f32,\n threshold : f32,\n ratio : f32,\n attack : f32,\n release : f32,\n knee : f32,\n makeupGain : f32,\n hasThresholdSig : f32,\n hasRatioSig : f32,\n hasAttackSig : f32,\n hasReleaseSig : f32,\n hasKneeSig : f32,\n hasMakeupGainSig : f32,\n baseTime : f32,\n frame : f32,\n numSamples : f32,\n numChannels : f32,\n pad1 : f32,\n pad2 : f32,\n pad3 : 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>; // state[0] = envelope\n@group(0) @binding(4) var<storage, read> thresholdSignal : array<f32>;\n@group(0) @binding(5) var<storage, read> ratioSignal : array<f32>;\n@group(0) @binding(6) var<storage, read> attackSignal : array<f32>;\n@group(0) @binding(7) var<storage, read> releaseSignal : array<f32>;\n@group(0) @binding(8) var<storage, read> kneeSignal : array<f32>;\n@group(0) @binding(9) var<storage, read> makeupGainSignal : 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\n var envelope = state[0];\n if (is_nan_or_inf(envelope)) {\n envelope = 0.0f;\n }\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 effRatio = u.ratio;\n if (u.hasRatioSig > 0.5f) {\n effRatio = ratioSignal[index];\n }\n effRatio = clamp(effRatio, 1.0f, 100.0f);\n\n var effAttack = u.attack;\n if (u.hasAttackSig > 0.5f) {\n effAttack = attackSignal[index];\n }\n effAttack = clamp(effAttack, 0.0001f, 10.0f);\n\n var effRelease = u.release;\n if (u.hasReleaseSig > 0.5f) {\n effRelease = releaseSignal[index];\n }\n effRelease = clamp(effRelease, 0.001f, 10.0f);\n\n var effKnee = u.knee;\n if (u.hasKneeSig > 0.5f) {\n effKnee = kneeSignal[index];\n }\n effKnee = clamp(effKnee, 0.0f, 40.0f);\n\n var effMakeupGain = u.makeupGain;\n if (u.hasMakeupGainSig > 0.5f) {\n effMakeupGain = makeupGainSignal[index];\n }\n effMakeupGain = clamp(effMakeupGain, -60.0f, 36.0f);\n\n // 2. Safe Attack / Release Coefficients\n let attackCoeff = clamp(1.0f - exp(-1.0f / (u.sampleRate * effAttack)), 0.00001f, 1.0f);\n let releaseCoeff = clamp(1.0f - exp(-1.0f / (u.sampleRate * effRelease)), 0.00001f, 1.0f);\n\n // 3. Peak Detection with NaN / Inf sanitization\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)) {\n val = 0.0f;\n }\n if (val > peak) {\n peak = val;\n }\n }\n \n // 4. Convert Peak to dBFS\n let dB = 20.0f * log10(max(peak, 1e-9f));\n\n // 5. Compute target reduction (soft-knee & ratio)\n var targetReductiondB = 0.0f;\n if (effKnee > 0.0f) {\n let x = dB - effThreshold;\n if (x <= -effKnee / 2.0f) {\n targetReductiondB = 0.0f;\n } else if (x >= effKnee / 2.0f) {\n targetReductiondB = (dB - effThreshold) * (1.0f - 1.0f / effRatio);\n } else {\n let kneeTerm = x + effKnee / 2.0f;\n targetReductiondB = ((kneeTerm * kneeTerm) / (2.0f * effKnee)) * (1.0f - 1.0f / effRatio);\n }\n } else {\n if (dB > effThreshold) {\n targetReductiondB = (dB - effThreshold) * (1.0f - 1.0f / effRatio);\n }\n }\n\n targetReductiondB = clamp(targetReductiondB, 0.0f, 120.0f);\n\n // 6. Envelope Smoothing\n let targetGaindB = -targetReductiondB;\n if (targetGaindB < envelope) {\n envelope += (targetGaindB - envelope) * attackCoeff;\n } else {\n envelope += (targetGaindB - envelope) * releaseCoeff;\n }\n\n if (is_nan_or_inf(envelope)) {\n envelope = 0.0f;\n }\n envelope = clamp(envelope, -120.0f, 0.0f);\n\n // 7. Apply linear gain and soft clipping\n let totalGaindB = clamp(envelope + effMakeupGain, -120.0f, 36.0f);\n let gainLinear = clamp(pow(10.0f, totalGaindB / 20.0f), 0.0f, 63.1f);\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)) {\n inVal = 0.0f;\n }\n\n var outVal = inVal * gainLinear;\n if (is_nan_or_inf(outVal)) {\n outVal = 0.0f;\n }\n \n // Soft clipping at ±1.0 with smooth tanh transition starting at ±0.9\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 if (is_nan_or_inf(envelope)) {\n state[0] = 0.0f;\n } else {\n state[0] = clamp(envelope, -120.0f, 0.0f);\n }\n}\n`;\nconst compressorAudioProcessor = async (channels, sampleRate, virtualMedia, ctx) => {\n\tif (!ctx?.device) throw new Error(\"GPUDevice is required for WebGPU Dynamics Compressor.\");\n\tconst op = virtualMedia.operation || {};\n\tconst threshold = resolveNumber(op.threshold, -24);\n\tconst ratio = resolveNumber(op.ratio, 4);\n\tconst attack = resolveNumber(op.attack, .003);\n\tconst release = resolveNumber(op.release, .25);\n\tconst knee = resolveNumber(op.knee, 6);\n\tconst makeupGain = resolveNumber(op.makeupGain, 0);\n\tconst hasThresholdSig = isHandleConnected(op, \"thresholdHandleId\") ? 1 : 0;\n\tconst hasRatioSig = isHandleConnected(op, \"ratioHandleId\") ? 1 : 0;\n\tconst hasAttackSig = isHandleConnected(op, \"attackHandleId\") ? 1 : 0;\n\tconst hasReleaseSig = isHandleConnected(op, \"releaseHandleId\") ? 1 : 0;\n\tconst hasKneeSig = isHandleConnected(op, \"kneeHandleId\") ? 1 : 0;\n\tconst hasMakeupGainSig = isHandleConnected(op, \"makeupGainHandleId\") ? 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 nodeId = op.id || \"audio-compressor\";\n\tconst frame = ctx.frame ?? 0;\n\tconst fps = ctx.fps ?? 24;\n\tawait WebGPUAudioProcessor.process(ctx.device, nodeId, channels, sampleRate, virtualMedia, frame, fps, COMPRESSOR_SHADER_TEMPLATE, (t) => [\n\t\tsampleRate,\n\t\tthreshold,\n\t\tratio,\n\t\tattack,\n\t\trelease,\n\t\tknee,\n\t\tmakeupGain,\n\t\thasThresholdSig,\n\t\thasRatioSig,\n\t\thasAttackSig,\n\t\thasReleaseSig,\n\t\thasKneeSig,\n\t\thasMakeupGainSig,\n\t\tt,\n\t\tframe,\n\t\tnumSamples,\n\t\tnumChannels,\n\t\t0,\n\t\t0,\n\t\t0\n\t], 20, 1, 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: compressorAudioProcessor });\n\n//#endregion\nexport { renderers_default as t };\n//# sourceMappingURL=renderers-BorUA3F3.mjs.map"],"mappings":";;;;;AAKA,MAAM,cAAc;CACnB;CACA;CACA;CACA;CACA;CACA;CACA;AACD,MAAM,mCAAmC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4LzC,MAAM,2BAA2B,OAAO,UAAU,YAAY,cAAc,QAAQ;AACnF,KAAI,CAAC,KAAK,OAAQ,OAAM,IAAI,MAAM,wDAAwD;CAC1F,MAAM,KAAK,aAAa,aAAa,EAAE;CACvC,MAAM,YAAY,cAAc,GAAG,WAAW,IAAI;CAClD,MAAM,QAAQ,cAAc,GAAG,OAAO,EAAE;CACxC,MAAM,SAAS,cAAc,GAAG,QAAQ,KAAK;CAC7C,MAAM,UAAU,cAAc,GAAG,SAAS,IAAI;CAC9C,MAAM,OAAO,cAAc,GAAG,MAAM,EAAE;CACtC,MAAM,aAAa,cAAc,GAAG,YAAY,EAAE;CAClD,MAAM,kBAAkB,kBAAkB,IAAI,oBAAoB,GAAG,IAAI;CACzE,MAAM,cAAc,kBAAkB,IAAI,gBAAgB,GAAG,IAAI;CACjE,MAAM,eAAe,kBAAkB,IAAI,iBAAiB,GAAG,IAAI;CACnE,MAAM,gBAAgB,kBAAkB,IAAI,kBAAkB,GAAG,IAAI;CACrE,MAAM,aAAa,kBAAkB,IAAI,eAAe,GAAG,IAAI;CAC/D,MAAM,mBAAmB,kBAAkB,IAAI,qBAAqB,GAAG,IAAI;CAC3E,MAAM,cAAc,SAAS;AAC7B,KAAI,gBAAgB,EAAG;CACvB,MAAM,aAAa,SAAS,GAAG;AAC/B,KAAI,eAAe,EAAG;CACtB,MAAM,SAAS,GAAG,MAAM;CACxB,MAAM,QAAQ,IAAI,SAAS;CAC3B,MAAM,MAAM,IAAI,OAAO;AACvB,OAAM,qBAAqB,QAAQ,IAAI,QAAQ,QAAQ,UAAU,YAAY,cAAc,OAAO,KAAK,6BAA6B,MAAM;EACzI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,EAAE,IAAI,GAAG,KAAK,UAAU,MAAM,KAAK,WAAW,KAAK,YAAY,KAAK,GAAG,KAAK,GAAG,YAAY;;AAK7F,IAAI,oBAAoB,eAAe,EAAE,gBAAgB,0BAA0B,CAAC"}
1
+ {"version":3,"file":"renderer-CbhnJi_8.mjs","names":[],"sources":["../../../nodes/node-audio-compressor/dist/renderers-BorUA3F3.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\"ratio\",\n\t\"attack\",\n\t\"release\",\n\t\"knee\",\n\t\"makeupGain\"\n];\nconst COMPRESSOR_SHADER_TEMPLATE = () => `\nstruct Uniforms {\n sampleRate : f32,\n threshold : f32,\n ratio : f32,\n attack : f32,\n release : f32,\n knee : f32,\n makeupGain : f32,\n hasThresholdSig : f32,\n hasRatioSig : f32,\n hasAttackSig : f32,\n hasReleaseSig : f32,\n hasKneeSig : f32,\n hasMakeupGainSig : f32,\n baseTime : f32,\n frame : f32,\n numSamples : f32,\n numChannels : f32,\n pad1 : f32,\n pad2 : f32,\n pad3 : 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>; // state[0] = envelope\n@group(0) @binding(4) var<storage, read> thresholdSignal : array<f32>;\n@group(0) @binding(5) var<storage, read> ratioSignal : array<f32>;\n@group(0) @binding(6) var<storage, read> attackSignal : array<f32>;\n@group(0) @binding(7) var<storage, read> releaseSignal : array<f32>;\n@group(0) @binding(8) var<storage, read> kneeSignal : array<f32>;\n@group(0) @binding(9) var<storage, read> makeupGainSignal : 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\n var envelope = state[0];\n if (is_nan_or_inf(envelope)) {\n envelope = 0.0f;\n }\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 effRatio = u.ratio;\n if (u.hasRatioSig > 0.5f) {\n effRatio = ratioSignal[index];\n }\n effRatio = clamp(effRatio, 1.0f, 100.0f);\n\n var effAttack = u.attack;\n if (u.hasAttackSig > 0.5f) {\n effAttack = attackSignal[index];\n }\n effAttack = clamp(effAttack, 0.0001f, 10.0f);\n\n var effRelease = u.release;\n if (u.hasReleaseSig > 0.5f) {\n effRelease = releaseSignal[index];\n }\n effRelease = clamp(effRelease, 0.001f, 10.0f);\n\n var effKnee = u.knee;\n if (u.hasKneeSig > 0.5f) {\n effKnee = kneeSignal[index];\n }\n effKnee = clamp(effKnee, 0.0f, 40.0f);\n\n var effMakeupGain = u.makeupGain;\n if (u.hasMakeupGainSig > 0.5f) {\n effMakeupGain = makeupGainSignal[index];\n }\n effMakeupGain = clamp(effMakeupGain, -60.0f, 36.0f);\n\n // 2. Safe Attack / Release Coefficients\n let attackCoeff = clamp(1.0f - exp(-1.0f / (u.sampleRate * effAttack)), 0.00001f, 1.0f);\n let releaseCoeff = clamp(1.0f - exp(-1.0f / (u.sampleRate * effRelease)), 0.00001f, 1.0f);\n\n // 3. Peak Detection with NaN / Inf sanitization\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)) {\n val = 0.0f;\n }\n if (val > peak) {\n peak = val;\n }\n }\n \n // 4. Convert Peak to dBFS\n let dB = 20.0f * log10(max(peak, 1e-9f));\n\n // 5. Compute target reduction (soft-knee & ratio)\n var targetReductiondB = 0.0f;\n if (effKnee > 0.0f) {\n let x = dB - effThreshold;\n if (x <= -effKnee / 2.0f) {\n targetReductiondB = 0.0f;\n } else if (x >= effKnee / 2.0f) {\n targetReductiondB = (dB - effThreshold) * (1.0f - 1.0f / effRatio);\n } else {\n let kneeTerm = x + effKnee / 2.0f;\n targetReductiondB = ((kneeTerm * kneeTerm) / (2.0f * effKnee)) * (1.0f - 1.0f / effRatio);\n }\n } else {\n if (dB > effThreshold) {\n targetReductiondB = (dB - effThreshold) * (1.0f - 1.0f / effRatio);\n }\n }\n\n targetReductiondB = clamp(targetReductiondB, 0.0f, 120.0f);\n\n // 6. Envelope Smoothing\n let targetGaindB = -targetReductiondB;\n if (targetGaindB < envelope) {\n envelope += (targetGaindB - envelope) * attackCoeff;\n } else {\n envelope += (targetGaindB - envelope) * releaseCoeff;\n }\n\n if (is_nan_or_inf(envelope)) {\n envelope = 0.0f;\n }\n envelope = clamp(envelope, -120.0f, 0.0f);\n\n // 7. Apply linear gain and soft clipping\n let totalGaindB = clamp(envelope + effMakeupGain, -120.0f, 36.0f);\n let gainLinear = clamp(pow(10.0f, totalGaindB / 20.0f), 0.0f, 63.1f);\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)) {\n inVal = 0.0f;\n }\n\n var outVal = inVal * gainLinear;\n if (is_nan_or_inf(outVal)) {\n outVal = 0.0f;\n }\n \n // Soft clipping at ±1.0 with smooth tanh transition starting at ±0.9\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 if (is_nan_or_inf(envelope)) {\n state[0] = 0.0f;\n } else {\n state[0] = clamp(envelope, -120.0f, 0.0f);\n }\n}\n`;\nconst compressorAudioProcessor = async (channels, sampleRate, virtualMedia, ctx) => {\n\tif (!ctx?.device) throw new Error(\"GPUDevice is required for WebGPU Dynamics Compressor.\");\n\tconst op = virtualMedia.operation || {};\n\tconst threshold = resolveNumber(op.threshold, -24);\n\tconst ratio = resolveNumber(op.ratio, 4);\n\tconst attack = resolveNumber(op.attack, .003);\n\tconst release = resolveNumber(op.release, .25);\n\tconst knee = resolveNumber(op.knee, 6);\n\tconst makeupGain = resolveNumber(op.makeupGain, 0);\n\tconst hasThresholdSig = isHandleConnected(op, \"thresholdHandleId\") ? 1 : 0;\n\tconst hasRatioSig = isHandleConnected(op, \"ratioHandleId\") ? 1 : 0;\n\tconst hasAttackSig = isHandleConnected(op, \"attackHandleId\") ? 1 : 0;\n\tconst hasReleaseSig = isHandleConnected(op, \"releaseHandleId\") ? 1 : 0;\n\tconst hasKneeSig = isHandleConnected(op, \"kneeHandleId\") ? 1 : 0;\n\tconst hasMakeupGainSig = isHandleConnected(op, \"makeupGainHandleId\") ? 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 nodeId = op.id || \"audio-compressor\";\n\tconst frame = ctx.frame ?? 0;\n\tconst fps = ctx.fps ?? 24;\n\tawait WebGPUAudioProcessor.process(ctx.device, nodeId, channels, sampleRate, virtualMedia, frame, fps, COMPRESSOR_SHADER_TEMPLATE, (t) => [\n\t\tsampleRate,\n\t\tthreshold,\n\t\tratio,\n\t\tattack,\n\t\trelease,\n\t\tknee,\n\t\tmakeupGain,\n\t\thasThresholdSig,\n\t\thasRatioSig,\n\t\thasAttackSig,\n\t\thasReleaseSig,\n\t\thasKneeSig,\n\t\thasMakeupGainSig,\n\t\tt,\n\t\tframe,\n\t\tnumSamples,\n\t\tnumChannels,\n\t\t0,\n\t\t0,\n\t\t0\n\t], 20, 1, 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: compressorAudioProcessor });\n\n//#endregion\nexport { renderers_default as t };\n//# sourceMappingURL=renderers-BorUA3F3.mjs.map"],"mappings":";;;;;AAKA,MAAM,cAAc;CACnB;CACA;CACA;CACA;CACA;CACA;CACA;AACD,MAAM,mCAAmC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4LzC,MAAM,2BAA2B,OAAO,UAAU,YAAY,cAAc,QAAQ;AACnF,KAAI,CAAC,KAAK,OAAQ,OAAM,IAAI,MAAM,wDAAwD;CAC1F,MAAM,KAAK,aAAa,aAAa,EAAE;CACvC,MAAM,YAAY,cAAc,GAAG,WAAW,IAAI;CAClD,MAAM,QAAQ,cAAc,GAAG,OAAO,EAAE;CACxC,MAAM,SAAS,cAAc,GAAG,QAAQ,KAAK;CAC7C,MAAM,UAAU,cAAc,GAAG,SAAS,IAAI;CAC9C,MAAM,OAAO,cAAc,GAAG,MAAM,EAAE;CACtC,MAAM,aAAa,cAAc,GAAG,YAAY,EAAE;CAClD,MAAM,kBAAkB,kBAAkB,IAAI,oBAAoB,GAAG,IAAI;CACzE,MAAM,cAAc,kBAAkB,IAAI,gBAAgB,GAAG,IAAI;CACjE,MAAM,eAAe,kBAAkB,IAAI,iBAAiB,GAAG,IAAI;CACnE,MAAM,gBAAgB,kBAAkB,IAAI,kBAAkB,GAAG,IAAI;CACrE,MAAM,aAAa,kBAAkB,IAAI,eAAe,GAAG,IAAI;CAC/D,MAAM,mBAAmB,kBAAkB,IAAI,qBAAqB,GAAG,IAAI;CAC3E,MAAM,cAAc,SAAS;AAC7B,KAAI,gBAAgB,EAAG;CACvB,MAAM,aAAa,SAAS,GAAG;AAC/B,KAAI,eAAe,EAAG;CACtB,MAAM,SAAS,GAAG,MAAM;CACxB,MAAM,QAAQ,IAAI,SAAS;CAC3B,MAAM,MAAM,IAAI,OAAO;AACvB,OAAM,qBAAqB,QAAQ,IAAI,QAAQ,QAAQ,UAAU,YAAY,cAAc,OAAO,KAAK,6BAA6B,MAAM;EACzI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,EAAE,IAAI,GAAG,KAAK,UAAU,MAAM,KAAK,WAAW,KAAK,YAAY,KAAK,GAAG,KAAK,GAAG,YAAY;;AAK7F,IAAI,oBAAoB,eAAe,EAAE,gBAAgB,0BAA0B,CAAC"}
@@ -1,6 +1,6 @@
1
- import "./chunk-BcJoO4Nm.mjs";
2
- import { n as defineRenderer } from "./renderer-mNSyac1V.mjs";
3
- import { O as drawSvgNode } from "./dist-C1cCW7Bt.mjs";
1
+ import "./chunk-D8S17ehY.mjs";
2
+ import { n as defineRenderer } from "./renderer-DrWeb39d.mjs";
3
+ import { O as drawSvgNode } from "./dist-D12-a3-x.mjs";
4
4
 
5
5
  //#region ../../nodes/node-shape-generator/dist/renderers-CpnJ1Qiz.mjs
6
6
  /**
@@ -238,4 +238,4 @@ var renderers_default = defineRenderer({ WebGPURenderer: ShapeGeneratorWebGPURen
238
238
 
239
239
  //#endregion
240
240
  export { ShapeGeneratorWebGPURenderer, renderers_default as default };
241
- //# sourceMappingURL=renderer-BdyopiLC.mjs.map
241
+ //# sourceMappingURL=renderer-CcJyD9Q5.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-BdyopiLC.mjs","names":[],"sources":["../../../nodes/node-shape-generator/dist/renderers-CpnJ1Qiz.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { drawSvgNode } from \"@framefields/webgpu-renderers\";\n\n//#region src/shared/geometry.ts\n/**\n* Scale corner radii proportionally if their sum exceeds the box dimensions (W3C CSS standard).\n*/\nfunction normalizeCornerRadii(w, h, rTL, rTR, rBR, rBL) {\n\tconst topSum = rTL + rTR;\n\tconst bottomSum = rBL + rBR;\n\tconst leftSum = rTL + rBL;\n\tconst rightSum = rTR + rBR;\n\tlet scale = 1;\n\tif (topSum > w && topSum > 0) scale = Math.min(scale, w / topSum);\n\tif (bottomSum > w && bottomSum > 0) scale = Math.min(scale, w / bottomSum);\n\tif (leftSum > h && leftSum > 0) scale = Math.min(scale, h / leftSum);\n\tif (rightSum > h && rightSum > 0) scale = Math.min(scale, h / rightSum);\n\treturn [\n\t\tMath.max(0, rTL * scale),\n\t\tMath.max(0, rTR * scale),\n\t\tMath.max(0, rBR * scale),\n\t\tMath.max(0, rBL * scale)\n\t];\n}\n/**\n* Generates an SVG path string for a rounded rectangle with 4 independent corner radii.\n*/\nfunction buildRectanglePath(w, h, rTL, rTR, rBR, rBL, strokeWidth = 0) {\n\tconst inset = strokeWidth > 0 ? strokeWidth / 2 : 0;\n\tconst x = inset;\n\tconst y = inset;\n\tconst boxW = Math.max(.1, w - strokeWidth);\n\tconst boxH = Math.max(.1, h - strokeWidth);\n\tconst [rtl, rtr, rbr, rbl] = normalizeCornerRadii(boxW, boxH, rTL, rTR, rBR, rBL);\n\treturn [\n\t\t`M ${x + rtl} ${y}`,\n\t\t`L ${x + boxW - rtr} ${y}`,\n\t\trtr > 0 ? `A ${rtr} ${rtr} 0 0 1 ${x + boxW} ${y + rtr}` : \"\",\n\t\t`L ${x + boxW} ${y + boxH - rbr}`,\n\t\trbr > 0 ? `A ${rbr} ${rbr} 0 0 1 ${x + boxW - rbr} ${y + boxH}` : \"\",\n\t\t`L ${x + rbl} ${y + boxH}`,\n\t\trbl > 0 ? `A ${rbl} ${rbl} 0 0 1 ${x} ${y + boxH - rbl}` : \"\",\n\t\t`L ${x} ${y + rtl}`,\n\t\trtl > 0 ? `A ${rtl} ${rtl} 0 0 1 ${x + rtl} ${y}` : \"\",\n\t\t\"Z\"\n\t].filter(Boolean).join(\" \");\n}\n/**\n* Generates an SVG path string for an ellipse/circle.\n*/\nfunction buildEllipsePath(w, h, strokeWidth = 0) {\n\tconst cx = w / 2;\n\tconst cy = h / 2;\n\tconst rx = Math.max(.1, (w - strokeWidth) / 2);\n\tconst ry = Math.max(.1, (h - strokeWidth) / 2);\n\treturn `M ${cx - rx} ${cy} A ${rx} ${ry} 0 1 0 ${cx + rx} ${cy} A ${rx} ${ry} 0 1 0 ${cx - rx} ${cy} Z`;\n}\n/**\n* Generates an SVG path string for a regular polygon with N sides.\n*/\nfunction buildPolygonPath(w, h, sides, strokeWidth = 0) {\n\tconst n = Math.max(3, Math.min(64, Math.floor(sides)));\n\tconst cx = w / 2;\n\tconst cy = h / 2;\n\tconst radius = Math.max(.1, Math.min(w - strokeWidth, h - strokeWidth) / 2);\n\tconst points = [];\n\tconst angleStep = 2 * Math.PI / n;\n\tconst startAngle = -Math.PI / 2;\n\tfor (let i = 0; i < n; i++) {\n\t\tconst angle = startAngle + i * angleStep;\n\t\tpoints.push({\n\t\t\tx: cx + radius * Math.cos(angle),\n\t\t\ty: cy + radius * Math.sin(angle)\n\t\t});\n\t}\n\treturn points.map((p, i) => `${i === 0 ? \"M\" : \"L\"} ${p.x.toFixed(3)} ${p.y.toFixed(3)}`).join(\" \") + \" Z\";\n}\n/**\n* Generates an SVG path string for a star with N spikes and configurable inner radius ratio.\n*/\nfunction buildStarPath(w, h, pointsCount, innerRadiusRatio, strokeWidth = 0) {\n\tconst n = Math.max(3, Math.min(64, Math.floor(pointsCount)));\n\tconst ratio = Math.max(.01, Math.min(.99, innerRadiusRatio));\n\tconst cx = w / 2;\n\tconst cy = h / 2;\n\tconst outerRadius = Math.max(.1, Math.min(w - strokeWidth, h - strokeWidth) / 2);\n\tconst innerRadius = outerRadius * ratio;\n\tconst points = [];\n\tconst totalVertices = n * 2;\n\tconst angleStep = Math.PI / n;\n\tconst startAngle = -Math.PI / 2;\n\tfor (let i = 0; i < totalVertices; i++) {\n\t\tconst r = i % 2 === 0 ? outerRadius : innerRadius;\n\t\tconst angle = startAngle + i * angleStep;\n\t\tpoints.push({\n\t\t\tx: cx + r * Math.cos(angle),\n\t\t\ty: cy + r * Math.sin(angle)\n\t\t});\n\t}\n\treturn points.map((p, i) => `${i === 0 ? \"M\" : \"L\"} ${p.x.toFixed(3)} ${p.y.toFixed(3)}`).join(\" \") + \" Z\";\n}\n/**\n* Generates an SVG path string for a parametric arrow pointing right.\n*/\nfunction buildArrowPath(w, h, headWidth, headLength, shaftWidth, strokeWidth = 0) {\n\tconst inset = strokeWidth > 0 ? strokeWidth / 2 : 0;\n\tconst boxW = Math.max(1, w - strokeWidth);\n\tconst boxH = Math.max(1, h - strokeWidth);\n\tconst cy = h / 2;\n\tconst hw = Math.min(boxH, Math.max(4, headWidth));\n\tconst hl = Math.min(boxW * .9, Math.max(4, headLength));\n\tconst sw = Math.min(hw * .95, Math.max(2, shaftWidth));\n\tconst leftX = inset;\n\tconst rightX = inset + boxW;\n\tconst headBaseX = rightX - hl;\n\tconst topShaftY = cy - sw / 2;\n\tconst bottomShaftY = cy + sw / 2;\n\tconst topHeadY = cy - hw / 2;\n\tconst bottomHeadY = cy + hw / 2;\n\treturn [\n\t\t`M ${leftX.toFixed(2)} ${topShaftY.toFixed(2)}`,\n\t\t`L ${headBaseX.toFixed(2)} ${topShaftY.toFixed(2)}`,\n\t\t`L ${headBaseX.toFixed(2)} ${topHeadY.toFixed(2)}`,\n\t\t`L ${rightX.toFixed(2)} ${cy.toFixed(2)}`,\n\t\t`L ${headBaseX.toFixed(2)} ${bottomHeadY.toFixed(2)}`,\n\t\t`L ${headBaseX.toFixed(2)} ${bottomShaftY.toFixed(2)}`,\n\t\t`L ${leftX.toFixed(2)} ${bottomShaftY.toFixed(2)}`,\n\t\t\"Z\"\n\t].join(\" \");\n}\n/**\n* Calculates linear gradient coordinate vector from an angle in degrees.\n*/\nfunction calculateLinearGradientCoords(angleDeg = 0) {\n\tconst rad = angleDeg * Math.PI / 180;\n\tconst cos = Math.cos(rad);\n\tconst sin = Math.sin(rad);\n\tconst x1 = ((.5 - cos * .5) * 100).toFixed(2);\n\tconst y1 = ((.5 - sin * .5) * 100).toFixed(2);\n\tconst x2 = ((.5 + cos * .5) * 100).toFixed(2);\n\tconst y2 = ((.5 + sin * .5) * 100).toFixed(2);\n\treturn {\n\t\tx1: `${x1}%`,\n\t\ty1: `${y1}%`,\n\t\tx2: `${x2}%`,\n\t\ty2: `${y2}%`\n\t};\n}\n/**\n* Builds the complete shape geometry path for any ShapeGenerator config.\n*/\nfunction generateShapePath(config) {\n\tconst width = Math.max(1, config.width ?? 500);\n\tconst height = Math.max(1, config.height ?? 500);\n\tconst strokeWidth = config.strokeWidth ?? 0;\n\tswitch (config.shapeType) {\n\t\tcase \"Rectangle\": return buildRectanglePath(width, height, config.radiusTL ?? 0, config.radiusTR ?? 0, config.radiusBR ?? 0, config.radiusBL ?? 0, strokeWidth);\n\t\tcase \"Ellipse\": return buildEllipsePath(width, height, strokeWidth);\n\t\tcase \"Polygon\": return buildPolygonPath(width, height, config.polygonSides ?? 5, strokeWidth);\n\t\tcase \"Star\": return buildStarPath(width, height, config.starPoints ?? 5, config.starInnerRadius ?? .5, strokeWidth);\n\t\tcase \"Arrow\": return buildArrowPath(width, height, config.arrowHeadWidth ?? 40, config.arrowHeadLength ?? 40, config.arrowShaftWidth ?? 20, strokeWidth);\n\t\tcase \"CustomPath\": return config.customPath?.trim() || buildRectanglePath(width, height, 0, 0, 0, 0, strokeWidth);\n\t\tdefault: return buildRectanglePath(width, height, 0, 0, 0, 0, strokeWidth);\n\t}\n}\n\n//#endregion\n//#region src/shared/svg-generator.ts\n/**\n* Generates an SVG string representation of the parametric shape configuration.\n*/\nfunction generateShapeSvg(config) {\n\tconst width = Math.max(1, config.width ?? 500);\n\tconst height = Math.max(1, config.height ?? 500);\n\tconst pathD = generateShapePath(config);\n\tconst fillType = config.fillType ?? \"solid\";\n\tconst fillColor = config.fillColor ?? \"#3b82f6\";\n\tconst gradientEndColor = config.gradientEndColor ?? \"#1d4ed8\";\n\tconst gradientAngle = config.gradientAngle ?? 0;\n\tconst strokeColor = config.strokeColor ?? \"#ffffff\";\n\tconst strokeWidth = Math.max(0, config.strokeWidth ?? 0);\n\tconst strokeDashArray = config.strokeDashArray?.trim();\n\tconst strokeLineCap = config.strokeLineCap ?? \"round\";\n\tconst strokeLineJoin = config.strokeLineJoin ?? \"round\";\n\tconst strokeDashOffset = config.strokeDashOffset ?? 0;\n\tconst rotation = config.rotation ?? 0;\n\tconst opacity = Math.max(0, Math.min(1, config.opacity ?? 1));\n\tconst customPathScale = config.shapeType === \"CustomPath\" ? config.customPathScale ?? 1 : 1;\n\tconst gradId = `gw_shape_grad_${Math.abs(Math.round(gradientAngle) * 31 + (fillType === \"linear\" ? 1 : 2))}`;\n\tlet defs = \"\";\n\tlet fillAttr = fillColor;\n\tif (fillType === \"none\") fillAttr = \"none\";\n\telse if (fillType === \"linear\") {\n\t\tconst coords = calculateLinearGradientCoords(gradientAngle);\n\t\tdefs = `<defs><linearGradient id=\"${gradId}\" x1=\"${coords.x1}\" y1=\"${coords.y1}\" x2=\"${coords.x2}\" y2=\"${coords.y2}\"><stop offset=\"0%\" stop-color=\"${fillColor}\"/><stop offset=\"100%\" stop-color=\"${gradientEndColor}\"/></linearGradient></defs>`;\n\t\tfillAttr = `url(#${gradId})`;\n\t} else if (fillType === \"radial\") {\n\t\tdefs = `<defs><radialGradient id=\"${gradId}\" cx=\"50%\" cy=\"50%\" r=\"50%\"><stop offset=\"0%\" stop-color=\"${fillColor}\"/><stop offset=\"100%\" stop-color=\"${gradientEndColor}\"/></radialGradient></defs>`;\n\t\tfillAttr = `url(#${gradId})`;\n\t}\n\tconst strokeAttrs = strokeWidth > 0 ? `stroke=\"${strokeColor}\" stroke-width=\"${strokeWidth}\" stroke-linecap=\"${strokeLineCap}\" stroke-linejoin=\"${strokeLineJoin}\" ${strokeDashArray ? `stroke-dasharray=\"${strokeDashArray}\"` : \"\"} ${strokeDashOffset ? `stroke-dashoffset=\"${strokeDashOffset}\"` : \"\"}` : \"stroke=\\\"none\\\"\";\n\tconst cx = width / 2;\n\tconst cy = height / 2;\n\tconst transformParts = [];\n\tif (rotation !== 0) transformParts.push(`rotate(${rotation} ${cx} ${cy})`);\n\tif (customPathScale !== 1) transformParts.push(`scale(${customPathScale})`);\n\tconst transformAttr = transformParts.length > 0 ? `transform=\"${transformParts.join(\" \")}\"` : \"\";\n\tconst opacityAttr = opacity < 1 ? `opacity=\"${opacity}\"` : \"\";\n\treturn `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 ${width} ${height}\" width=\"${width}\" height=\"${height}\">${defs}<g ${transformAttr} ${opacityAttr}><path d=\"${pathD}\" fill=\"${fillAttr}\" ${strokeAttrs} /></g></svg>`;\n}\n/**\n* Encodes the SVG into a base64 data URL for robust cross-environment rendering.\n*/\nfunction generateShapeSvgDataUrl(config) {\n\tconst svgString = generateShapeSvg(config);\n\tif (typeof Buffer !== \"undefined\") return `data:image/svg+xml;base64,${Buffer.from(svgString).toString(\"base64\")}`;\n\treturn `data:image/svg+xml;base64,${btoa(unescape(encodeURIComponent(svgString)))}`;\n}\n\n//#endregion\n//#region src/renderers/webgpu-renderer.ts\nconst ShapeGeneratorWebGPURenderer = async (args) => {\n\tconst { ctx, pass, props, targetWidth, targetHeight } = args;\n\tconst op = props.virtualMedia?.operation;\n\tif (!op || op.op !== \"ShapeGenerator\" && op.op !== \"source\") return;\n\tconst svgDataUrl = generateShapeSvgDataUrl(op);\n\tconst width = targetWidth > 0 ? targetWidth : op.width ?? 500;\n\tconst height = targetHeight > 0 ? targetHeight : op.height ?? 500;\n\tconst isHeadless = Boolean(ctx.isHeadless || typeof window === \"undefined\");\n\tawait drawSvgNode(ctx, pass, {\n\t\tsrc: svgDataUrl,\n\t\tdstRect: {\n\t\t\tx: 0,\n\t\t\ty: 0,\n\t\t\twidth,\n\t\t\theight\n\t\t},\n\t\topacity: op.opacity ?? 1,\n\t\tisHeadless\n\t});\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: ShapeGeneratorWebGPURenderer });\n\n//#endregion\nexport { buildArrowPath as a, buildRectanglePath as c, generateShapePath as d, normalizeCornerRadii as f, generateShapeSvgDataUrl as i, buildStarPath as l, ShapeGeneratorWebGPURenderer as n, buildEllipsePath as o, generateShapeSvg as r, buildPolygonPath as s, renderers_default as t, calculateLinearGradientCoords as u };\n//# sourceMappingURL=renderers-CpnJ1Qiz.mjs.map"],"mappings":";;;;;;;;AAOA,SAAS,qBAAqB,GAAG,GAAG,KAAK,KAAK,KAAK,KAAK;CACvD,MAAM,SAAS,MAAM;CACrB,MAAM,YAAY,MAAM;CACxB,MAAM,UAAU,MAAM;CACtB,MAAM,WAAW,MAAM;CACvB,IAAI,QAAQ;AACZ,KAAI,SAAS,KAAK,SAAS,EAAG,SAAQ,KAAK,IAAI,OAAO,IAAI,OAAO;AACjE,KAAI,YAAY,KAAK,YAAY,EAAG,SAAQ,KAAK,IAAI,OAAO,IAAI,UAAU;AAC1E,KAAI,UAAU,KAAK,UAAU,EAAG,SAAQ,KAAK,IAAI,OAAO,IAAI,QAAQ;AACpE,KAAI,WAAW,KAAK,WAAW,EAAG,SAAQ,KAAK,IAAI,OAAO,IAAI,SAAS;AACvE,QAAO;EACN,KAAK,IAAI,GAAG,MAAM,MAAM;EACxB,KAAK,IAAI,GAAG,MAAM,MAAM;EACxB,KAAK,IAAI,GAAG,MAAM,MAAM;EACxB,KAAK,IAAI,GAAG,MAAM,MAAM;EACxB;;;;;AAKF,SAAS,mBAAmB,GAAG,GAAG,KAAK,KAAK,KAAK,KAAK,cAAc,GAAG;CACtE,MAAM,QAAQ,cAAc,IAAI,cAAc,IAAI;CAClD,MAAM,IAAI;CACV,MAAM,IAAI;CACV,MAAM,OAAO,KAAK,IAAI,IAAI,IAAI,YAAY;CAC1C,MAAM,OAAO,KAAK,IAAI,IAAI,IAAI,YAAY;CAC1C,MAAM,CAAC,KAAK,KAAK,KAAK,OAAO,qBAAqB,MAAM,MAAM,KAAK,KAAK,KAAK,IAAI;AACjF,QAAO;EACN,KAAK,IAAI,IAAI,GAAG;EAChB,KAAK,IAAI,OAAO,IAAI,GAAG;EACvB,MAAM,IAAI,KAAK,IAAI,GAAG,IAAI,SAAS,IAAI,KAAK,GAAG,IAAI,QAAQ;EAC3D,KAAK,IAAI,KAAK,GAAG,IAAI,OAAO;EAC5B,MAAM,IAAI,KAAK,IAAI,GAAG,IAAI,SAAS,IAAI,OAAO,IAAI,GAAG,IAAI,SAAS;EAClE,KAAK,IAAI,IAAI,GAAG,IAAI;EACpB,MAAM,IAAI,KAAK,IAAI,GAAG,IAAI,SAAS,EAAE,GAAG,IAAI,OAAO,QAAQ;EAC3D,KAAK,EAAE,GAAG,IAAI;EACd,MAAM,IAAI,KAAK,IAAI,GAAG,IAAI,SAAS,IAAI,IAAI,GAAG,MAAM;EACpD;EACA,CAAC,OAAO,QAAQ,CAAC,KAAK,IAAI;;;;;AAK5B,SAAS,iBAAiB,GAAG,GAAG,cAAc,GAAG;CAChD,MAAM,KAAK,IAAI;CACf,MAAM,KAAK,IAAI;CACf,MAAM,KAAK,KAAK,IAAI,KAAK,IAAI,eAAe,EAAE;CAC9C,MAAM,KAAK,KAAK,IAAI,KAAK,IAAI,eAAe,EAAE;AAC9C,QAAO,KAAK,KAAK,GAAG,GAAG,GAAG,KAAK,GAAG,GAAG,GAAG,SAAS,KAAK,GAAG,GAAG,GAAG,KAAK,GAAG,GAAG,GAAG,SAAS,KAAK,GAAG,GAAG,GAAG;;;;;AAKrG,SAAS,iBAAiB,GAAG,GAAG,OAAO,cAAc,GAAG;CACvD,MAAM,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,KAAK,MAAM,MAAM,CAAC,CAAC;CACtD,MAAM,KAAK,IAAI;CACf,MAAM,KAAK,IAAI;CACf,MAAM,SAAS,KAAK,IAAI,IAAI,KAAK,IAAI,IAAI,aAAa,IAAI,YAAY,GAAG,EAAE;CAC3E,MAAM,SAAS,EAAE;CACjB,MAAM,YAAY,IAAI,KAAK,KAAK;CAChC,MAAM,aAAa,CAAC,KAAK,KAAK;AAC9B,MAAK,IAAI,IAAI,GAAG,IAAI,GAAG,KAAK;EAC3B,MAAM,QAAQ,aAAa,IAAI;AAC/B,SAAO,KAAK;GACX,GAAG,KAAK,SAAS,KAAK,IAAI,MAAM;GAChC,GAAG,KAAK,SAAS,KAAK,IAAI,MAAM;GAChC,CAAC;;AAEH,QAAO,OAAO,KAAK,GAAG,MAAM,GAAG,MAAM,IAAI,MAAM,IAAI,GAAG,EAAE,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,GAAG,CAAC,KAAK,IAAI,GAAG;;;;;AAKvG,SAAS,cAAc,GAAG,GAAG,aAAa,kBAAkB,cAAc,GAAG;CAC5E,MAAM,IAAI,KAAK,IAAI,GAAG,KAAK,IAAI,IAAI,KAAK,MAAM,YAAY,CAAC,CAAC;CAC5D,MAAM,QAAQ,KAAK,IAAI,KAAK,KAAK,IAAI,KAAK,iBAAiB,CAAC;CAC5D,MAAM,KAAK,IAAI;CACf,MAAM,KAAK,IAAI;CACf,MAAM,cAAc,KAAK,IAAI,IAAI,KAAK,IAAI,IAAI,aAAa,IAAI,YAAY,GAAG,EAAE;CAChF,MAAM,cAAc,cAAc;CAClC,MAAM,SAAS,EAAE;CACjB,MAAM,gBAAgB,IAAI;CAC1B,MAAM,YAAY,KAAK,KAAK;CAC5B,MAAM,aAAa,CAAC,KAAK,KAAK;AAC9B,MAAK,IAAI,IAAI,GAAG,IAAI,eAAe,KAAK;EACvC,MAAM,IAAI,IAAI,MAAM,IAAI,cAAc;EACtC,MAAM,QAAQ,aAAa,IAAI;AAC/B,SAAO,KAAK;GACX,GAAG,KAAK,IAAI,KAAK,IAAI,MAAM;GAC3B,GAAG,KAAK,IAAI,KAAK,IAAI,MAAM;GAC3B,CAAC;;AAEH,QAAO,OAAO,KAAK,GAAG,MAAM,GAAG,MAAM,IAAI,MAAM,IAAI,GAAG,EAAE,EAAE,QAAQ,EAAE,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,GAAG,CAAC,KAAK,IAAI,GAAG;;;;;AAKvG,SAAS,eAAe,GAAG,GAAG,WAAW,YAAY,YAAY,cAAc,GAAG;CACjF,MAAM,QAAQ,cAAc,IAAI,cAAc,IAAI;CAClD,MAAM,OAAO,KAAK,IAAI,GAAG,IAAI,YAAY;CACzC,MAAM,OAAO,KAAK,IAAI,GAAG,IAAI,YAAY;CACzC,MAAM,KAAK,IAAI;CACf,MAAM,KAAK,KAAK,IAAI,MAAM,KAAK,IAAI,GAAG,UAAU,CAAC;CACjD,MAAM,KAAK,KAAK,IAAI,OAAO,IAAI,KAAK,IAAI,GAAG,WAAW,CAAC;CACvD,MAAM,KAAK,KAAK,IAAI,KAAK,KAAK,KAAK,IAAI,GAAG,WAAW,CAAC;CACtD,MAAM,QAAQ;CACd,MAAM,SAAS,QAAQ;CACvB,MAAM,YAAY,SAAS;CAC3B,MAAM,YAAY,KAAK,KAAK;CAC5B,MAAM,eAAe,KAAK,KAAK;CAC/B,MAAM,WAAW,KAAK,KAAK;CAC3B,MAAM,cAAc,KAAK,KAAK;AAC9B,QAAO;EACN,KAAK,MAAM,QAAQ,EAAE,CAAC,GAAG,UAAU,QAAQ,EAAE;EAC7C,KAAK,UAAU,QAAQ,EAAE,CAAC,GAAG,UAAU,QAAQ,EAAE;EACjD,KAAK,UAAU,QAAQ,EAAE,CAAC,GAAG,SAAS,QAAQ,EAAE;EAChD,KAAK,OAAO,QAAQ,EAAE,CAAC,GAAG,GAAG,QAAQ,EAAE;EACvC,KAAK,UAAU,QAAQ,EAAE,CAAC,GAAG,YAAY,QAAQ,EAAE;EACnD,KAAK,UAAU,QAAQ,EAAE,CAAC,GAAG,aAAa,QAAQ,EAAE;EACpD,KAAK,MAAM,QAAQ,EAAE,CAAC,GAAG,aAAa,QAAQ,EAAE;EAChD;EACA,CAAC,KAAK,IAAI;;;;;AAKZ,SAAS,8BAA8B,WAAW,GAAG;CACpD,MAAM,MAAM,WAAW,KAAK,KAAK;CACjC,MAAM,MAAM,KAAK,IAAI,IAAI;CACzB,MAAM,MAAM,KAAK,IAAI,IAAI;CACzB,MAAM,OAAO,KAAK,MAAM,MAAM,KAAK,QAAQ,EAAE;CAC7C,MAAM,OAAO,KAAK,MAAM,MAAM,KAAK,QAAQ,EAAE;CAC7C,MAAM,OAAO,KAAK,MAAM,MAAM,KAAK,QAAQ,EAAE;CAC7C,MAAM,OAAO,KAAK,MAAM,MAAM,KAAK,QAAQ,EAAE;AAC7C,QAAO;EACN,IAAI,GAAG,GAAG;EACV,IAAI,GAAG,GAAG;EACV,IAAI,GAAG,GAAG;EACV,IAAI,GAAG,GAAG;EACV;;;;;AAKF,SAAS,kBAAkB,QAAQ;CAClC,MAAM,QAAQ,KAAK,IAAI,GAAG,OAAO,SAAS,IAAI;CAC9C,MAAM,SAAS,KAAK,IAAI,GAAG,OAAO,UAAU,IAAI;CAChD,MAAM,cAAc,OAAO,eAAe;AAC1C,SAAQ,OAAO,WAAf;EACC,KAAK,YAAa,QAAO,mBAAmB,OAAO,QAAQ,OAAO,YAAY,GAAG,OAAO,YAAY,GAAG,OAAO,YAAY,GAAG,OAAO,YAAY,GAAG,YAAY;EAC/J,KAAK,UAAW,QAAO,iBAAiB,OAAO,QAAQ,YAAY;EACnE,KAAK,UAAW,QAAO,iBAAiB,OAAO,QAAQ,OAAO,gBAAgB,GAAG,YAAY;EAC7F,KAAK,OAAQ,QAAO,cAAc,OAAO,QAAQ,OAAO,cAAc,GAAG,OAAO,mBAAmB,IAAI,YAAY;EACnH,KAAK,QAAS,QAAO,eAAe,OAAO,QAAQ,OAAO,kBAAkB,IAAI,OAAO,mBAAmB,IAAI,OAAO,mBAAmB,IAAI,YAAY;EACxJ,KAAK,aAAc,QAAO,OAAO,YAAY,MAAM,IAAI,mBAAmB,OAAO,QAAQ,GAAG,GAAG,GAAG,GAAG,YAAY;EACjH,QAAS,QAAO,mBAAmB,OAAO,QAAQ,GAAG,GAAG,GAAG,GAAG,YAAY;;;;;;AAS5E,SAAS,iBAAiB,QAAQ;CACjC,MAAM,QAAQ,KAAK,IAAI,GAAG,OAAO,SAAS,IAAI;CAC9C,MAAM,SAAS,KAAK,IAAI,GAAG,OAAO,UAAU,IAAI;CAChD,MAAM,QAAQ,kBAAkB,OAAO;CACvC,MAAM,WAAW,OAAO,YAAY;CACpC,MAAM,YAAY,OAAO,aAAa;CACtC,MAAM,mBAAmB,OAAO,oBAAoB;CACpD,MAAM,gBAAgB,OAAO,iBAAiB;CAC9C,MAAM,cAAc,OAAO,eAAe;CAC1C,MAAM,cAAc,KAAK,IAAI,GAAG,OAAO,eAAe,EAAE;CACxD,MAAM,kBAAkB,OAAO,iBAAiB,MAAM;CACtD,MAAM,gBAAgB,OAAO,iBAAiB;CAC9C,MAAM,iBAAiB,OAAO,kBAAkB;CAChD,MAAM,mBAAmB,OAAO,oBAAoB;CACpD,MAAM,WAAW,OAAO,YAAY;CACpC,MAAM,UAAU,KAAK,IAAI,GAAG,KAAK,IAAI,GAAG,OAAO,WAAW,EAAE,CAAC;CAC7D,MAAM,kBAAkB,OAAO,cAAc,eAAe,OAAO,mBAAmB,IAAI;CAC1F,MAAM,SAAS,iBAAiB,KAAK,IAAI,KAAK,MAAM,cAAc,GAAG,MAAM,aAAa,WAAW,IAAI,GAAG;CAC1G,IAAI,OAAO;CACX,IAAI,WAAW;AACf,KAAI,aAAa,OAAQ,YAAW;UAC3B,aAAa,UAAU;EAC/B,MAAM,SAAS,8BAA8B,cAAc;AAC3D,SAAO,6BAA6B,OAAO,QAAQ,OAAO,GAAG,QAAQ,OAAO,GAAG,QAAQ,OAAO,GAAG,QAAQ,OAAO,GAAG,kCAAkC,UAAU,qCAAqC,iBAAiB;AACrN,aAAW,QAAQ,OAAO;YAChB,aAAa,UAAU;AACjC,SAAO,6BAA6B,OAAO,4DAA4D,UAAU,qCAAqC,iBAAiB;AACvK,aAAW,QAAQ,OAAO;;CAE3B,MAAM,cAAc,cAAc,IAAI,WAAW,YAAY,kBAAkB,YAAY,oBAAoB,cAAc,qBAAqB,eAAe,IAAI,kBAAkB,qBAAqB,gBAAgB,KAAK,GAAG,GAAG,mBAAmB,sBAAsB,iBAAiB,KAAK,OAAO;CAC7S,MAAM,KAAK,QAAQ;CACnB,MAAM,KAAK,SAAS;CACpB,MAAM,iBAAiB,EAAE;AACzB,KAAI,aAAa,EAAG,gBAAe,KAAK,UAAU,SAAS,GAAG,GAAG,GAAG,GAAG,GAAG;AAC1E,KAAI,oBAAoB,EAAG,gBAAe,KAAK,SAAS,gBAAgB,GAAG;CAC3E,MAAM,gBAAgB,eAAe,SAAS,IAAI,cAAc,eAAe,KAAK,IAAI,CAAC,KAAK;CAC9F,MAAM,cAAc,UAAU,IAAI,YAAY,QAAQ,KAAK;AAC3D,QAAO,wDAAwD,MAAM,GAAG,OAAO,WAAW,MAAM,YAAY,OAAO,IAAI,KAAK,KAAK,cAAc,GAAG,YAAY,YAAY,MAAM,UAAU,SAAS,IAAI,YAAY;;;;;AAKpN,SAAS,wBAAwB,QAAQ;CACxC,MAAM,YAAY,iBAAiB,OAAO;AAC1C,KAAI,OAAO,WAAW,YAAa,QAAO,6BAA6B,OAAO,KAAK,UAAU,CAAC,SAAS,SAAS;AAChH,QAAO,6BAA6B,KAAK,SAAS,mBAAmB,UAAU,CAAC,CAAC;;AAKlF,MAAM,+BAA+B,OAAO,SAAS;CACpD,MAAM,EAAE,KAAK,MAAM,OAAO,aAAa,iBAAiB;CACxD,MAAM,KAAK,MAAM,cAAc;AAC/B,KAAI,CAAC,MAAM,GAAG,OAAO,oBAAoB,GAAG,OAAO,SAAU;CAC7D,MAAM,aAAa,wBAAwB,GAAG;CAC9C,MAAM,QAAQ,cAAc,IAAI,cAAc,GAAG,SAAS;CAC1D,MAAM,SAAS,eAAe,IAAI,eAAe,GAAG,UAAU;CAC9D,MAAM,aAAa,QAAQ,IAAI,cAAc,OAAO,WAAW,YAAY;AAC3E,OAAM,YAAY,KAAK,MAAM;EAC5B,KAAK;EACL,SAAS;GACR,GAAG;GACH,GAAG;GACH;GACA;GACA;EACD,SAAS,GAAG,WAAW;EACvB;EACA,CAAC;;AAKH,IAAI,oBAAoB,eAAe,EAAE,gBAAgB,8BAA8B,CAAC"}
1
+ {"version":3,"file":"renderer-CcJyD9Q5.mjs","names":[],"sources":["../../../nodes/node-shape-generator/dist/renderers-CpnJ1Qiz.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { drawSvgNode } from \"@framefields/webgpu-renderers\";\n\n//#region src/shared/geometry.ts\n/**\n* Scale corner radii proportionally if their sum exceeds the box dimensions (W3C CSS standard).\n*/\nfunction normalizeCornerRadii(w, h, rTL, rTR, rBR, rBL) {\n\tconst topSum = rTL + rTR;\n\tconst bottomSum = rBL + rBR;\n\tconst leftSum = rTL + rBL;\n\tconst rightSum = rTR + rBR;\n\tlet scale = 1;\n\tif (topSum > w && topSum > 0) scale = Math.min(scale, w / topSum);\n\tif (bottomSum > w && bottomSum > 0) scale = Math.min(scale, w / bottomSum);\n\tif (leftSum > h && leftSum > 0) scale = Math.min(scale, h / leftSum);\n\tif (rightSum > h && rightSum > 0) scale = Math.min(scale, h / rightSum);\n\treturn [\n\t\tMath.max(0, rTL * scale),\n\t\tMath.max(0, rTR * scale),\n\t\tMath.max(0, rBR * scale),\n\t\tMath.max(0, rBL * scale)\n\t];\n}\n/**\n* Generates an SVG path string for a rounded rectangle with 4 independent corner radii.\n*/\nfunction buildRectanglePath(w, h, rTL, rTR, rBR, rBL, strokeWidth = 0) {\n\tconst inset = strokeWidth > 0 ? strokeWidth / 2 : 0;\n\tconst x = inset;\n\tconst y = inset;\n\tconst boxW = Math.max(.1, w - strokeWidth);\n\tconst boxH = Math.max(.1, h - strokeWidth);\n\tconst [rtl, rtr, rbr, rbl] = normalizeCornerRadii(boxW, boxH, rTL, rTR, rBR, rBL);\n\treturn [\n\t\t`M ${x + rtl} ${y}`,\n\t\t`L ${x + boxW - rtr} ${y}`,\n\t\trtr > 0 ? `A ${rtr} ${rtr} 0 0 1 ${x + boxW} ${y + rtr}` : \"\",\n\t\t`L ${x + boxW} ${y + boxH - rbr}`,\n\t\trbr > 0 ? `A ${rbr} ${rbr} 0 0 1 ${x + boxW - rbr} ${y + boxH}` : \"\",\n\t\t`L ${x + rbl} ${y + boxH}`,\n\t\trbl > 0 ? `A ${rbl} ${rbl} 0 0 1 ${x} ${y + boxH - rbl}` : \"\",\n\t\t`L ${x} ${y + rtl}`,\n\t\trtl > 0 ? `A ${rtl} ${rtl} 0 0 1 ${x + rtl} ${y}` : \"\",\n\t\t\"Z\"\n\t].filter(Boolean).join(\" \");\n}\n/**\n* Generates an SVG path string for an ellipse/circle.\n*/\nfunction buildEllipsePath(w, h, strokeWidth = 0) {\n\tconst cx = w / 2;\n\tconst cy = h / 2;\n\tconst rx = Math.max(.1, (w - strokeWidth) / 2);\n\tconst ry = Math.max(.1, (h - strokeWidth) / 2);\n\treturn `M ${cx - rx} ${cy} A ${rx} ${ry} 0 1 0 ${cx + rx} ${cy} A ${rx} ${ry} 0 1 0 ${cx - rx} ${cy} Z`;\n}\n/**\n* Generates an SVG path string for a regular polygon with N sides.\n*/\nfunction buildPolygonPath(w, h, sides, strokeWidth = 0) {\n\tconst n = Math.max(3, Math.min(64, Math.floor(sides)));\n\tconst cx = w / 2;\n\tconst cy = h / 2;\n\tconst radius = Math.max(.1, Math.min(w - strokeWidth, h - strokeWidth) / 2);\n\tconst points = [];\n\tconst angleStep = 2 * Math.PI / n;\n\tconst startAngle = -Math.PI / 2;\n\tfor (let i = 0; i < n; i++) {\n\t\tconst angle = startAngle + i * angleStep;\n\t\tpoints.push({\n\t\t\tx: cx + radius * Math.cos(angle),\n\t\t\ty: cy + radius * Math.sin(angle)\n\t\t});\n\t}\n\treturn points.map((p, i) => `${i === 0 ? \"M\" : \"L\"} ${p.x.toFixed(3)} ${p.y.toFixed(3)}`).join(\" \") + \" Z\";\n}\n/**\n* Generates an SVG path string for a star with N spikes and configurable inner radius ratio.\n*/\nfunction buildStarPath(w, h, pointsCount, innerRadiusRatio, strokeWidth = 0) {\n\tconst n = Math.max(3, Math.min(64, Math.floor(pointsCount)));\n\tconst ratio = Math.max(.01, Math.min(.99, innerRadiusRatio));\n\tconst cx = w / 2;\n\tconst cy = h / 2;\n\tconst outerRadius = Math.max(.1, Math.min(w - strokeWidth, h - strokeWidth) / 2);\n\tconst innerRadius = outerRadius * ratio;\n\tconst points = [];\n\tconst totalVertices = n * 2;\n\tconst angleStep = Math.PI / n;\n\tconst startAngle = -Math.PI / 2;\n\tfor (let i = 0; i < totalVertices; i++) {\n\t\tconst r = i % 2 === 0 ? outerRadius : innerRadius;\n\t\tconst angle = startAngle + i * angleStep;\n\t\tpoints.push({\n\t\t\tx: cx + r * Math.cos(angle),\n\t\t\ty: cy + r * Math.sin(angle)\n\t\t});\n\t}\n\treturn points.map((p, i) => `${i === 0 ? \"M\" : \"L\"} ${p.x.toFixed(3)} ${p.y.toFixed(3)}`).join(\" \") + \" Z\";\n}\n/**\n* Generates an SVG path string for a parametric arrow pointing right.\n*/\nfunction buildArrowPath(w, h, headWidth, headLength, shaftWidth, strokeWidth = 0) {\n\tconst inset = strokeWidth > 0 ? strokeWidth / 2 : 0;\n\tconst boxW = Math.max(1, w - strokeWidth);\n\tconst boxH = Math.max(1, h - strokeWidth);\n\tconst cy = h / 2;\n\tconst hw = Math.min(boxH, Math.max(4, headWidth));\n\tconst hl = Math.min(boxW * .9, Math.max(4, headLength));\n\tconst sw = Math.min(hw * .95, Math.max(2, shaftWidth));\n\tconst leftX = inset;\n\tconst rightX = inset + boxW;\n\tconst headBaseX = rightX - hl;\n\tconst topShaftY = cy - sw / 2;\n\tconst bottomShaftY = cy + sw / 2;\n\tconst topHeadY = cy - hw / 2;\n\tconst bottomHeadY = cy + hw / 2;\n\treturn [\n\t\t`M ${leftX.toFixed(2)} ${topShaftY.toFixed(2)}`,\n\t\t`L ${headBaseX.toFixed(2)} ${topShaftY.toFixed(2)}`,\n\t\t`L ${headBaseX.toFixed(2)} ${topHeadY.toFixed(2)}`,\n\t\t`L ${rightX.toFixed(2)} ${cy.toFixed(2)}`,\n\t\t`L ${headBaseX.toFixed(2)} ${bottomHeadY.toFixed(2)}`,\n\t\t`L ${headBaseX.toFixed(2)} ${bottomShaftY.toFixed(2)}`,\n\t\t`L ${leftX.toFixed(2)} ${bottomShaftY.toFixed(2)}`,\n\t\t\"Z\"\n\t].join(\" \");\n}\n/**\n* Calculates linear gradient coordinate vector from an angle in degrees.\n*/\nfunction calculateLinearGradientCoords(angleDeg = 0) {\n\tconst rad = angleDeg * Math.PI / 180;\n\tconst cos = Math.cos(rad);\n\tconst sin = Math.sin(rad);\n\tconst x1 = ((.5 - cos * .5) * 100).toFixed(2);\n\tconst y1 = ((.5 - sin * .5) * 100).toFixed(2);\n\tconst x2 = ((.5 + cos * .5) * 100).toFixed(2);\n\tconst y2 = ((.5 + sin * .5) * 100).toFixed(2);\n\treturn {\n\t\tx1: `${x1}%`,\n\t\ty1: `${y1}%`,\n\t\tx2: `${x2}%`,\n\t\ty2: `${y2}%`\n\t};\n}\n/**\n* Builds the complete shape geometry path for any ShapeGenerator config.\n*/\nfunction generateShapePath(config) {\n\tconst width = Math.max(1, config.width ?? 500);\n\tconst height = Math.max(1, config.height ?? 500);\n\tconst strokeWidth = config.strokeWidth ?? 0;\n\tswitch (config.shapeType) {\n\t\tcase \"Rectangle\": return buildRectanglePath(width, height, config.radiusTL ?? 0, config.radiusTR ?? 0, config.radiusBR ?? 0, config.radiusBL ?? 0, strokeWidth);\n\t\tcase \"Ellipse\": return buildEllipsePath(width, height, strokeWidth);\n\t\tcase \"Polygon\": return buildPolygonPath(width, height, config.polygonSides ?? 5, strokeWidth);\n\t\tcase \"Star\": return buildStarPath(width, height, config.starPoints ?? 5, config.starInnerRadius ?? .5, strokeWidth);\n\t\tcase \"Arrow\": return buildArrowPath(width, height, config.arrowHeadWidth ?? 40, config.arrowHeadLength ?? 40, config.arrowShaftWidth ?? 20, strokeWidth);\n\t\tcase \"CustomPath\": return config.customPath?.trim() || buildRectanglePath(width, height, 0, 0, 0, 0, strokeWidth);\n\t\tdefault: return buildRectanglePath(width, height, 0, 0, 0, 0, strokeWidth);\n\t}\n}\n\n//#endregion\n//#region src/shared/svg-generator.ts\n/**\n* Generates an SVG string representation of the parametric shape configuration.\n*/\nfunction generateShapeSvg(config) {\n\tconst width = Math.max(1, config.width ?? 500);\n\tconst height = Math.max(1, config.height ?? 500);\n\tconst pathD = generateShapePath(config);\n\tconst fillType = config.fillType ?? \"solid\";\n\tconst fillColor = config.fillColor ?? \"#3b82f6\";\n\tconst gradientEndColor = config.gradientEndColor ?? \"#1d4ed8\";\n\tconst gradientAngle = config.gradientAngle ?? 0;\n\tconst strokeColor = config.strokeColor ?? \"#ffffff\";\n\tconst strokeWidth = Math.max(0, config.strokeWidth ?? 0);\n\tconst strokeDashArray = config.strokeDashArray?.trim();\n\tconst strokeLineCap = config.strokeLineCap ?? \"round\";\n\tconst strokeLineJoin = config.strokeLineJoin ?? \"round\";\n\tconst strokeDashOffset = config.strokeDashOffset ?? 0;\n\tconst rotation = config.rotation ?? 0;\n\tconst opacity = Math.max(0, Math.min(1, config.opacity ?? 1));\n\tconst customPathScale = config.shapeType === \"CustomPath\" ? config.customPathScale ?? 1 : 1;\n\tconst gradId = `gw_shape_grad_${Math.abs(Math.round(gradientAngle) * 31 + (fillType === \"linear\" ? 1 : 2))}`;\n\tlet defs = \"\";\n\tlet fillAttr = fillColor;\n\tif (fillType === \"none\") fillAttr = \"none\";\n\telse if (fillType === \"linear\") {\n\t\tconst coords = calculateLinearGradientCoords(gradientAngle);\n\t\tdefs = `<defs><linearGradient id=\"${gradId}\" x1=\"${coords.x1}\" y1=\"${coords.y1}\" x2=\"${coords.x2}\" y2=\"${coords.y2}\"><stop offset=\"0%\" stop-color=\"${fillColor}\"/><stop offset=\"100%\" stop-color=\"${gradientEndColor}\"/></linearGradient></defs>`;\n\t\tfillAttr = `url(#${gradId})`;\n\t} else if (fillType === \"radial\") {\n\t\tdefs = `<defs><radialGradient id=\"${gradId}\" cx=\"50%\" cy=\"50%\" r=\"50%\"><stop offset=\"0%\" stop-color=\"${fillColor}\"/><stop offset=\"100%\" stop-color=\"${gradientEndColor}\"/></radialGradient></defs>`;\n\t\tfillAttr = `url(#${gradId})`;\n\t}\n\tconst strokeAttrs = strokeWidth > 0 ? `stroke=\"${strokeColor}\" stroke-width=\"${strokeWidth}\" stroke-linecap=\"${strokeLineCap}\" stroke-linejoin=\"${strokeLineJoin}\" ${strokeDashArray ? `stroke-dasharray=\"${strokeDashArray}\"` : \"\"} ${strokeDashOffset ? `stroke-dashoffset=\"${strokeDashOffset}\"` : \"\"}` : \"stroke=\\\"none\\\"\";\n\tconst cx = width / 2;\n\tconst cy = height / 2;\n\tconst transformParts = [];\n\tif (rotation !== 0) transformParts.push(`rotate(${rotation} ${cx} ${cy})`);\n\tif (customPathScale !== 1) transformParts.push(`scale(${customPathScale})`);\n\tconst transformAttr = transformParts.length > 0 ? `transform=\"${transformParts.join(\" \")}\"` : \"\";\n\tconst opacityAttr = opacity < 1 ? `opacity=\"${opacity}\"` : \"\";\n\treturn `<svg xmlns=\"http://www.w3.org/2000/svg\" viewBox=\"0 0 ${width} ${height}\" width=\"${width}\" height=\"${height}\">${defs}<g ${transformAttr} ${opacityAttr}><path d=\"${pathD}\" fill=\"${fillAttr}\" ${strokeAttrs} /></g></svg>`;\n}\n/**\n* Encodes the SVG into a base64 data URL for robust cross-environment rendering.\n*/\nfunction generateShapeSvgDataUrl(config) {\n\tconst svgString = generateShapeSvg(config);\n\tif (typeof Buffer !== \"undefined\") return `data:image/svg+xml;base64,${Buffer.from(svgString).toString(\"base64\")}`;\n\treturn `data:image/svg+xml;base64,${btoa(unescape(encodeURIComponent(svgString)))}`;\n}\n\n//#endregion\n//#region src/renderers/webgpu-renderer.ts\nconst ShapeGeneratorWebGPURenderer = async (args) => {\n\tconst { ctx, pass, props, targetWidth, targetHeight } = args;\n\tconst op = props.virtualMedia?.operation;\n\tif (!op || op.op !== \"ShapeGenerator\" && op.op !== \"source\") return;\n\tconst svgDataUrl = generateShapeSvgDataUrl(op);\n\tconst width = targetWidth > 0 ? targetWidth : op.width ?? 500;\n\tconst height = targetHeight > 0 ? targetHeight : op.height ?? 500;\n\tconst isHeadless = Boolean(ctx.isHeadless || typeof window === \"undefined\");\n\tawait drawSvgNode(ctx, pass, {\n\t\tsrc: svgDataUrl,\n\t\tdstRect: {\n\t\t\tx: 0,\n\t\t\ty: 0,\n\t\t\twidth,\n\t\t\theight\n\t\t},\n\t\topacity: op.opacity ?? 1,\n\t\tisHeadless\n\t});\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: ShapeGeneratorWebGPURenderer });\n\n//#endregion\nexport { buildArrowPath as a, buildRectanglePath as c, generateShapePath as d, normalizeCornerRadii as f, generateShapeSvgDataUrl as i, buildStarPath as l, ShapeGeneratorWebGPURenderer as n, buildEllipsePath as o, generateShapeSvg as r, buildPolygonPath as s, renderers_default as t, calculateLinearGradientCoords as u };\n//# sourceMappingURL=renderers-CpnJ1Qiz.mjs.map"],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import "./chunk-D8S17ehY.mjs";
2
+ import "./dist-D12-a3-x.mjs";
3
+ import { t as renderers_default } from "./renderer-B6TjJi1g.mjs";
4
+
5
+ export { renderers_default as default };