framefields 2.2.0-beta.3 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (251) hide show
  1. package/dist/audio/index.d.mts +4 -4
  2. package/dist/audio/index.mjs +10 -10
  3. package/dist/{audio-1QquqDJs.d.mts → audio-BvYmTu5T.d.mts} +3 -3
  4. package/dist/{audio-1QquqDJs.d.mts.map → audio-BvYmTu5T.d.mts.map} +1 -1
  5. package/dist/{audio-BYqbtdH8.mjs → audio-DMUr01vS.mjs} +3 -3
  6. package/dist/{audio-BYqbtdH8.mjs.map → audio-DMUr01vS.mjs.map} +1 -1
  7. package/dist/{dist-BLbXEC6V.mjs → dist-CT___nEU.mjs} +3 -5
  8. package/dist/dist-CT___nEU.mjs.map +1 -0
  9. package/dist/{dist-DQlYw4eG.mjs → dist-cjxDXQdx.mjs} +49 -48
  10. package/dist/dist-cjxDXQdx.mjs.map +1 -0
  11. package/dist/effects/index.d.mts +4 -4
  12. package/dist/effects/index.mjs +34 -34
  13. package/dist/{effects-DgpPr38s.mjs → effects-C06-AOge.mjs} +2 -2
  14. package/dist/{effects-DgpPr38s.mjs.map → effects-C06-AOge.mjs.map} +1 -1
  15. package/dist/fonts/index.mjs +2 -2
  16. package/dist/{fonts-DakFEiDw.mjs → fonts-C0UuLQvr.mjs} +2 -2
  17. package/dist/{fonts-DakFEiDw.mjs.map → fonts-C0UuLQvr.mjs.map} +1 -1
  18. package/dist/{gpu-AbcLcr1f.mjs → gpu-Du7GpVFW.mjs} +2 -2
  19. package/dist/{gpu-AbcLcr1f.mjs.map → gpu-Du7GpVFW.mjs.map} +1 -1
  20. package/dist/{index--1jnkoBj.d.mts → index-B-oUlLoO.d.mts} +7 -1
  21. package/dist/index-B-oUlLoO.d.mts.map +1 -0
  22. package/dist/{index-CaZfxDXx.d.mts → index-CdyE1tst.d.mts} +3 -3
  23. package/dist/{index-CaZfxDXx.d.mts.map → index-CdyE1tst.d.mts.map} +1 -1
  24. package/dist/{index-YSmPWdZw.d.mts → index-CwbszPDG.d.mts} +4 -4
  25. package/dist/{index-YSmPWdZw.d.mts.map → index-CwbszPDG.d.mts.map} +1 -1
  26. package/dist/{index-BqzHDFkU.d.mts → index-D-Iek5sq.d.mts} +3 -3
  27. package/dist/{index-BqzHDFkU.d.mts.map → index-D-Iek5sq.d.mts.map} +1 -1
  28. package/dist/{index-D6_KcajH.d.mts → index-DXfp_T-3.d.mts} +2 -2
  29. package/dist/{index-D6_KcajH.d.mts.map → index-DXfp_T-3.d.mts.map} +1 -1
  30. package/dist/{index-DgJIBC_N.d.mts → index-XdQPNJnq.d.mts} +3 -3
  31. package/dist/index-XdQPNJnq.d.mts.map +1 -0
  32. package/dist/index.d.mts +8 -8
  33. package/dist/index.mjs +48 -48
  34. package/dist/preview/index.d.mts +2 -2
  35. package/dist/preview/index.mjs +10 -10
  36. package/dist/{preview-QjhWe5QE.mjs → preview-M0TsUzC6.mjs} +2 -2
  37. package/dist/{preview-QjhWe5QE.mjs.map → preview-M0TsUzC6.mjs.map} +1 -1
  38. package/dist/preview-engine/audio.mjs +1 -1
  39. package/dist/preview-engine/chunk-2SJ4BBMT.mjs +1 -0
  40. package/dist/preview-engine/{chunk-N4OG2BHX.mjs → chunk-3T4LB4ZH.mjs} +1 -1
  41. package/dist/preview-engine/{chunk-FJH5A2PV.mjs → chunk-7B5S5D4N.mjs} +1 -1
  42. package/dist/preview-engine/{chunk-2W4BMOAZ.mjs → chunk-G4K6TLNA.mjs} +1 -1
  43. package/dist/preview-engine/{chunk-XHDUZY7Y.mjs → chunk-HVCAOHNI.mjs} +1 -1
  44. package/dist/preview-engine/{chunk-5MSAA3DL.mjs → chunk-KBO6EX3M.mjs} +1 -1
  45. package/dist/preview-engine/{chunk-AKMCLVJ6.mjs → chunk-LQBDZSQD.mjs} +1 -1
  46. package/dist/preview-engine/chunk-NIRW77QA.mjs +58 -0
  47. package/dist/preview-engine/{chunk-MOW55DX2.mjs → chunk-QXCY2ATH.mjs} +1 -1
  48. package/dist/preview-engine/chunk-XN56POGE.mjs +1 -0
  49. package/dist/preview-engine/{chunk-3NXJVSZY.mjs → chunk-ZTHWCQ2A.mjs} +2 -2
  50. package/dist/preview-engine/effects.mjs +1 -1
  51. package/dist/preview-engine/fonts.mjs +1 -1
  52. package/dist/preview-engine/framefields.mjs +1 -1
  53. package/dist/preview-engine/player.mjs +5 -5
  54. package/dist/preview-engine/{renderers-UHYNEWQD.mjs → renderers-3SRG77SC.mjs} +1 -1
  55. package/dist/preview-engine/{renderers-OZYUGZG7.mjs → renderers-VUL4HBX3.mjs} +2 -2
  56. package/dist/preview-engine/signals.mjs +1 -1
  57. package/dist/{program-Cc_2_YXn.mjs → program-DzknMiY0.mjs} +2 -2
  58. package/dist/{program-Cc_2_YXn.mjs.map → program-DzknMiY0.mjs.map} +1 -1
  59. package/dist/renderer/index.d.mts +2 -2
  60. package/dist/renderer/index.mjs +2 -2
  61. package/dist/renderer--IDyGdqT.mjs +5 -0
  62. package/dist/{renderer-CZ9gHx-4.mjs → renderer-0gY4IQhM.mjs} +2 -2
  63. package/dist/{renderer-CZ9gHx-4.mjs.map → renderer-0gY4IQhM.mjs.map} +1 -1
  64. package/dist/renderer-17K4tjid.mjs +5 -0
  65. package/dist/{renderer-CivH0UuT.mjs → renderer-1vhaKMeg.mjs} +55 -54
  66. package/dist/{renderer-CivH0UuT.mjs.map → renderer-1vhaKMeg.mjs.map} +1 -1
  67. package/dist/{renderer-Bfrwo_It.mjs → renderer-57ATc_mQ.mjs} +2 -2
  68. package/dist/{renderer-Bfrwo_It.mjs.map → renderer-57ATc_mQ.mjs.map} +1 -1
  69. package/dist/{renderer-CSfLMXN8.mjs → renderer-AF884a7T.mjs} +3 -3
  70. package/dist/{renderer-CSfLMXN8.mjs.map → renderer-AF884a7T.mjs.map} +1 -1
  71. package/dist/renderer-Ab9Ttn_m.mjs +5 -0
  72. package/dist/renderer-B-roDBBo.mjs +5 -0
  73. package/dist/renderer-B03uwoUX.mjs +5 -0
  74. package/dist/renderer-B3BI_7YJ.mjs +5 -0
  75. package/dist/{renderer-B4cnT3ce.mjs → renderer-BC8XOVl5.mjs} +3 -3
  76. package/dist/{renderer-B4cnT3ce.mjs.map → renderer-BC8XOVl5.mjs.map} +1 -1
  77. package/dist/renderer-BGD4lQ74.mjs +5 -0
  78. package/dist/renderer-BHXhYfeC.mjs +5 -0
  79. package/dist/{renderer-ClWgdN2v.mjs → renderer-BHskWZNG.mjs} +2 -2
  80. package/dist/{renderer-C4UqxwcT.mjs → renderer-BNqwn0gZ.mjs} +2 -2
  81. package/dist/{renderer-C4UqxwcT.mjs.map → renderer-BNqwn0gZ.mjs.map} +1 -1
  82. package/dist/renderer-BRsTIMFa.mjs +5 -0
  83. package/dist/{renderer-BO-7bYa5.d.mts → renderer-BT-_EoXw.d.mts} +2 -2
  84. package/dist/{renderer-BO-7bYa5.d.mts.map → renderer-BT-_EoXw.d.mts.map} +1 -1
  85. package/dist/{renderer-CB87_0vL.mjs → renderer-BbdZ0YHR.mjs} +3 -3
  86. package/dist/{renderer-CB87_0vL.mjs.map → renderer-BbdZ0YHR.mjs.map} +1 -1
  87. package/dist/{renderer-sHDPBywo.mjs → renderer-BeIUgp1r.mjs} +2 -2
  88. package/dist/{renderer-sHDPBywo.mjs.map → renderer-BeIUgp1r.mjs.map} +1 -1
  89. package/dist/{renderer-FgcNOe1R.mjs → renderer-Beg7FLt2.mjs} +5 -5
  90. package/dist/{renderer-FgcNOe1R.mjs.map → renderer-Beg7FLt2.mjs.map} +1 -1
  91. package/dist/{renderer-Cv1wmjhA.mjs → renderer-BerD3T-X.mjs} +2 -2
  92. package/dist/{renderer-Cv1wmjhA.mjs.map → renderer-BerD3T-X.mjs.map} +1 -1
  93. package/dist/{renderer-CK0u3Psf.mjs → renderer-BiwIh_w4.mjs} +3 -3
  94. package/dist/{renderer-CK0u3Psf.mjs.map → renderer-BiwIh_w4.mjs.map} +1 -1
  95. package/dist/renderer-BjMTtYZw.mjs +5 -0
  96. package/dist/{renderer-dwTzrQ2G.mjs → renderer-BmGPTWwV.mjs} +3 -3
  97. package/dist/{renderer-dwTzrQ2G.mjs.map → renderer-BmGPTWwV.mjs.map} +1 -1
  98. package/dist/{renderer-DfSRmz7q.mjs → renderer-Bn2eQE-t.mjs} +3 -3
  99. package/dist/{renderer-DfSRmz7q.mjs.map → renderer-Bn2eQE-t.mjs.map} +1 -1
  100. package/dist/renderer-BoCh3Yts.mjs +5 -0
  101. package/dist/renderer-BqPbR8c4.mjs +5 -0
  102. package/dist/{renderer-BPMywsr4.mjs → renderer-Br6KyRO_.mjs} +3 -3
  103. package/dist/{renderer-BPMywsr4.mjs.map → renderer-Br6KyRO_.mjs.map} +1 -1
  104. package/dist/{renderer-DU3216cx.mjs → renderer-BteUC_7n.mjs} +3 -3
  105. package/dist/{renderer-DU3216cx.mjs.map → renderer-BteUC_7n.mjs.map} +1 -1
  106. package/dist/{renderer-DwCg5pXn.mjs → renderer-Bvx56GR6.mjs} +2 -2
  107. package/dist/{renderer-DwCg5pXn.mjs.map → renderer-Bvx56GR6.mjs.map} +1 -1
  108. package/dist/{renderer-4GYrnTfw.mjs → renderer-BzDjy1_x.mjs} +2 -2
  109. package/dist/{renderer-4GYrnTfw.mjs.map → renderer-BzDjy1_x.mjs.map} +1 -1
  110. package/dist/renderer-C4Da2I1-.mjs +5 -0
  111. package/dist/{renderer-CD38wGmN.mjs → renderer-C6md3msE.mjs} +2 -2
  112. package/dist/{renderer-CD38wGmN.mjs.map → renderer-C6md3msE.mjs.map} +1 -1
  113. package/dist/{renderer-CHkqgIOL.mjs → renderer-C8uKdelk.mjs} +2 -2
  114. package/dist/{renderer-CHkqgIOL.mjs.map → renderer-C8uKdelk.mjs.map} +1 -1
  115. package/dist/renderer-C93X6dgl.mjs +5 -0
  116. package/dist/{renderer-CciB_sav.mjs → renderer-CJB9nU1x.mjs} +3 -3
  117. package/dist/{renderer-CciB_sav.mjs.map → renderer-CJB9nU1x.mjs.map} +1 -1
  118. package/dist/renderer-CMAwFfGx.mjs +6 -0
  119. package/dist/{renderer-CPW9o3Lc.mjs → renderer-CMT4QcpV.mjs} +3 -3
  120. package/dist/{renderer-CPW9o3Lc.mjs.map → renderer-CMT4QcpV.mjs.map} +1 -1
  121. package/dist/renderer-CRXeSuX2.mjs +5 -0
  122. package/dist/renderer-CSp6WYBN.mjs +5 -0
  123. package/dist/renderer-CUXX7HTL.mjs +5 -0
  124. package/dist/renderer-CUgThpka.mjs +5 -0
  125. package/dist/{renderer-BKd2nRnO.mjs → renderer-CWBHVCvA.mjs} +2 -2
  126. package/dist/{renderer-BKd2nRnO.mjs.map → renderer-CWBHVCvA.mjs.map} +1 -1
  127. package/dist/{renderer-B5PFBOjv.mjs → renderer-Cce2fgpX.mjs} +3 -3
  128. package/dist/{renderer-B5PFBOjv.mjs.map → renderer-Cce2fgpX.mjs.map} +1 -1
  129. package/dist/renderer-CeVtufiT.mjs +5 -0
  130. package/dist/{renderer-egZPy7vq.mjs → renderer-CebB0v1y.mjs} +2 -2
  131. package/dist/{renderer-egZPy7vq.mjs.map → renderer-CebB0v1y.mjs.map} +1 -1
  132. package/dist/renderer-CespkZUk.mjs +5 -0
  133. package/dist/{renderer-Dyh8c41v.mjs → renderer-CeyAgJnw.mjs} +2 -2
  134. package/dist/{renderer-CGZqCmf2.mjs → renderer-CrABA3lB.mjs} +2 -2
  135. package/dist/{renderer-CGZqCmf2.mjs.map → renderer-CrABA3lB.mjs.map} +1 -1
  136. package/dist/{renderer-DU6i7shO.mjs → renderer-CuVPo-wP.mjs} +2 -2
  137. package/dist/{renderer-DU6i7shO.mjs.map → renderer-CuVPo-wP.mjs.map} +1 -1
  138. package/dist/{renderer-DEQ09sg7.mjs → renderer-CursFKUf.mjs} +2 -2
  139. package/dist/{renderer-DEQ09sg7.mjs.map → renderer-CursFKUf.mjs.map} +1 -1
  140. package/dist/{renderer-DT3QVVht.mjs → renderer-D-vRKssW.mjs} +2 -2
  141. package/dist/{renderer-DT3QVVht.mjs.map → renderer-D-vRKssW.mjs.map} +1 -1
  142. package/dist/{renderer-DqhZTIiC.mjs → renderer-D1Cm21eq.mjs} +2 -2
  143. package/dist/{renderer-DqhZTIiC.mjs.map → renderer-D1Cm21eq.mjs.map} +1 -1
  144. package/dist/renderer-D1l47xhL.mjs +5 -0
  145. package/dist/{renderer-PbJk25JW.mjs → renderer-D8thCpS7.mjs} +3 -3
  146. package/dist/{renderer-PbJk25JW.mjs.map → renderer-D8thCpS7.mjs.map} +1 -1
  147. package/dist/{renderer-BNcsS03m.mjs → renderer-DD8napek.mjs} +2 -2
  148. package/dist/{renderer-BNcsS03m.mjs.map → renderer-DD8napek.mjs.map} +1 -1
  149. package/dist/renderer-DDuG18J8.mjs +5 -0
  150. package/dist/{renderer-gwV6hyYm.mjs → renderer-DEuIwr-t.mjs} +2 -2
  151. package/dist/{renderer-gwV6hyYm.mjs.map → renderer-DEuIwr-t.mjs.map} +1 -1
  152. package/dist/renderer-DFhrFSMn.mjs +5 -0
  153. package/dist/{renderer-DlqDnh-8.mjs → renderer-DHGTzype.mjs} +2 -2
  154. package/dist/{renderer-DlqDnh-8.mjs.map → renderer-DHGTzype.mjs.map} +1 -1
  155. package/dist/{renderer-DkGODUgE.mjs → renderer-DJfFc-XW.mjs} +3 -3
  156. package/dist/{renderer-DkGODUgE.mjs.map → renderer-DJfFc-XW.mjs.map} +1 -1
  157. package/dist/renderer-DO48vQ7Y.mjs +5 -0
  158. package/dist/renderer-DTC39B_n.mjs +5 -0
  159. package/dist/{renderer-L7UTxwZT.mjs → renderer-DXqIslFk.mjs} +2 -2
  160. package/dist/{renderer-L7UTxwZT.mjs.map → renderer-DXqIslFk.mjs.map} +1 -1
  161. package/dist/{renderer-C2eBC0FB.mjs → renderer-DZXbgVMK.mjs} +3 -3
  162. package/dist/{renderer-C2eBC0FB.mjs.map → renderer-DZXbgVMK.mjs.map} +1 -1
  163. package/dist/{renderer-Cxh7j423.mjs → renderer-Db3JIF1K.mjs} +3 -3
  164. package/dist/{renderer-Cxh7j423.mjs.map → renderer-Db3JIF1K.mjs.map} +1 -1
  165. package/dist/renderer-DbyU3hNF.mjs +5 -0
  166. package/dist/renderer-DftVpmfu.mjs +5 -0
  167. package/dist/renderer-Dj5jm63K.mjs +5 -0
  168. package/dist/renderer-Dju57ZaF.mjs +5 -0
  169. package/dist/renderer-Dn8TQCw7.mjs +5 -0
  170. package/dist/{renderer-C6u-XrH-.mjs → renderer-DpW_LxLO.mjs} +3 -3
  171. package/dist/{renderer-C6u-XrH-.mjs.map → renderer-DpW_LxLO.mjs.map} +1 -1
  172. package/dist/{renderer-CSoyJ8GH.mjs → renderer-DqdhsSwS.mjs} +2 -2
  173. package/dist/{renderer-CSoyJ8GH.mjs.map → renderer-DqdhsSwS.mjs.map} +1 -1
  174. package/dist/{renderer-2DjggBBS.mjs → renderer-DtgMsjyL.mjs} +2 -2
  175. package/dist/{renderer-2DjggBBS.mjs.map → renderer-DtgMsjyL.mjs.map} +1 -1
  176. package/dist/{renderer-DppnY7RT.mjs → renderer-DupsdRIw.mjs} +3 -3
  177. package/dist/{renderer-DppnY7RT.mjs.map → renderer-DupsdRIw.mjs.map} +1 -1
  178. package/dist/{renderer-BN0CzoG_.mjs → renderer-DvFaC_-7.mjs} +2 -2
  179. package/dist/{renderer-BN0CzoG_.mjs.map → renderer-DvFaC_-7.mjs.map} +1 -1
  180. package/dist/renderer-ETF46K0D.mjs +5 -0
  181. package/dist/{renderer-dj3f8cMg.mjs → renderer-EemDpvv3.mjs} +3 -3
  182. package/dist/{renderer-dj3f8cMg.mjs.map → renderer-EemDpvv3.mjs.map} +1 -1
  183. package/dist/{renderer-n2kYIGtb.mjs → renderer-KnCcN_Nz.mjs} +2 -2
  184. package/dist/{renderer-n2kYIGtb.mjs.map → renderer-KnCcN_Nz.mjs.map} +1 -1
  185. package/dist/{renderer-scbJx-Dx.mjs → renderer-PKQNH21k.mjs} +2 -2
  186. package/dist/{renderer-CO4theVJ.mjs → renderer-YbaCzPcG.mjs} +2 -2
  187. package/dist/{renderer-BhxQzrHF.mjs → renderer-aArb4RwJ.mjs} +2 -2
  188. package/dist/{renderer-BhxQzrHF.mjs.map → renderer-aArb4RwJ.mjs.map} +1 -1
  189. package/dist/renderer-azYzWGC3.mjs +5 -0
  190. package/dist/renderer-dxNoRW59.mjs +5 -0
  191. package/dist/renderer-fdfelx_I.mjs +5 -0
  192. package/dist/{renderer-BEzUirF0.mjs → renderer-id8TbKBY.mjs} +2 -2
  193. package/dist/{renderer-BEzUirF0.mjs.map → renderer-id8TbKBY.mjs.map} +1 -1
  194. package/dist/{renderer-Dnm_SVy6.mjs → renderer-jYxN4mHn.mjs} +3 -3
  195. package/dist/{renderer-Dnm_SVy6.mjs.map → renderer-jYxN4mHn.mjs.map} +1 -1
  196. package/dist/{renderer-lXmtdrdI.mjs → renderer-jqByPgkD.mjs} +2 -2
  197. package/dist/{renderer-lXmtdrdI.mjs.map → renderer-jqByPgkD.mjs.map} +1 -1
  198. package/dist/{renderer-DRpIQFAK.mjs → renderer-p_C_T9Kn.mjs} +2 -2
  199. package/dist/{renderer-DRpIQFAK.mjs.map → renderer-p_C_T9Kn.mjs.map} +1 -1
  200. package/dist/renderer-snwEKwMw.mjs +5 -0
  201. package/dist/{renderer-D0enmulV.mjs → renderer-u8ynJtAC.mjs} +2 -2
  202. package/dist/{renderer-D0enmulV.mjs.map → renderer-u8ynJtAC.mjs.map} +1 -1
  203. package/dist/{renderers-CP8CFWDs-B8HIr3kj.mjs → renderers-CP8CFWDs-BA-4l6By.mjs} +2 -2
  204. package/dist/{renderers-CP8CFWDs-B8HIr3kj.mjs.map → renderers-CP8CFWDs-BA-4l6By.mjs.map} +1 -1
  205. package/dist/signals/index.d.mts +5 -5
  206. package/dist/signals/index.mjs +4 -4
  207. package/package.json +58 -58
  208. package/dist/dist-BLbXEC6V.mjs.map +0 -1
  209. package/dist/dist-DQlYw4eG.mjs.map +0 -1
  210. package/dist/index--1jnkoBj.d.mts.map +0 -1
  211. package/dist/index-DgJIBC_N.d.mts.map +0 -1
  212. package/dist/preview-engine/chunk-4VOHF3FF.mjs +0 -1
  213. package/dist/preview-engine/chunk-ATLWPS6N.mjs +0 -1
  214. package/dist/preview-engine/chunk-HYBAPT6I.mjs +0 -1
  215. package/dist/preview-engine/chunk-XETMNJVV.mjs +0 -58
  216. package/dist/renderer-9ETXaINw.mjs +0 -5
  217. package/dist/renderer-B3MVDN_e.mjs +0 -5
  218. package/dist/renderer-B6iUuWcx.mjs +0 -6
  219. package/dist/renderer-B8IdU-7S.mjs +0 -5
  220. package/dist/renderer-BEGJCxuL.mjs +0 -5
  221. package/dist/renderer-BLAkNFx7.mjs +0 -5
  222. package/dist/renderer-BVNhv2ft.mjs +0 -5
  223. package/dist/renderer-BaXTEIe0.mjs +0 -5
  224. package/dist/renderer-BjeA7s36.mjs +0 -5
  225. package/dist/renderer-BtGNxEay.mjs +0 -5
  226. package/dist/renderer-BvZg2RJG.mjs +0 -5
  227. package/dist/renderer-CLW6tUUn.mjs +0 -5
  228. package/dist/renderer-CS-ojgJk.mjs +0 -5
  229. package/dist/renderer-CUQtKECw.mjs +0 -5
  230. package/dist/renderer-CV-l8wMq.mjs +0 -5
  231. package/dist/renderer-CV7_ALA5.mjs +0 -5
  232. package/dist/renderer-CVR6T6Lp.mjs +0 -5
  233. package/dist/renderer-CtUF95UW.mjs +0 -5
  234. package/dist/renderer-D8ymQoTB.mjs +0 -5
  235. package/dist/renderer-D9x3UE1Y.mjs +0 -5
  236. package/dist/renderer-DAEXqa2Q.mjs +0 -5
  237. package/dist/renderer-DDhU9Goq.mjs +0 -5
  238. package/dist/renderer-DcCKath2.mjs +0 -5
  239. package/dist/renderer-DiBphLzn.mjs +0 -5
  240. package/dist/renderer-Diq9Z7gZ.mjs +0 -5
  241. package/dist/renderer-DjZiO7iA.mjs +0 -5
  242. package/dist/renderer-Dtj6o-74.mjs +0 -5
  243. package/dist/renderer-Duaam6bJ.mjs +0 -5
  244. package/dist/renderer-FHqZe3K1.mjs +0 -5
  245. package/dist/renderer-FTKfOejk.mjs +0 -5
  246. package/dist/renderer-LmbkN82X.mjs +0 -5
  247. package/dist/renderer-SDspl6p-.mjs +0 -5
  248. package/dist/renderer-SWVUDypd.mjs +0 -5
  249. package/dist/renderer-WhpTBwDM.mjs +0 -5
  250. package/dist/renderer-WrpQEVdv.mjs +0 -5
  251. package/dist/renderer-r4ney0FZ.mjs +0 -5
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-CciB_sav.mjs","names":[],"sources":["../../../nodes/node-blur/dist/renderers-rcrwEq-B.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { ImageResultSchema, VideoResultSchema, configBuilder, unwrapFrameParam } from \"@framefields/node-sdk\";\nimport { FULLSCREEN_QUAD_WGSL, createFullscreenPipeline, drawChildToTexture, drawFullscreenPass, drawTextureToTarget, fragmentBindGroupLayout, perDevice, signalTextureView, signalTiming, texturesLayout } from \"@framefields/node-sdk/gpu\";\nimport { signalRegistry } from \"@framefields/webgpu-renderers\";\nimport { z } from \"zod\";\n\n//#region src/shared/config.ts\nconst MAX_BLUR = 100;\nconst blurConfig = configBuilder().field(\"blurType\", z.enum([\n\t\"Gaussian\",\n\t\"Box\",\n\t\"Median\",\n\t\"Motion\",\n\t\"Bilateral\",\n\t\"Edge-preserving\",\n\t\"Radial\",\n\t\"Zoom\"\n]).default(\"Gaussian\"), {\n\tbindable: false,\n\tlabel: \"Blur Type\"\n}).field(\"strength\", z.number().min(0).max(MAX_BLUR).default(5), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Strength Signal\",\n\tdescription: \"The intensity of the blur. 0 = no blur. Can be modulated by a static number or a dynamic signal.\"\n}).field(\"angle\", z.number().int().min(0).max(360).default(0), {\n\tbindable: false,\n\tsignal: true,\n\tlabel: \"Angle\",\n\tdescription: \"Direction of a Motion blur, in degrees.\"\n}).field(\"sigmaColor\", z.number().min(.01).max(1).default(.1), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Color Sigma Signal\",\n\tdescription: \"Sigma value for color space in Bilateral / Edge-preserving blurs. Can be modulated by a static number or a dynamic signal.\"\n}).field(\"centerX\", z.number().min(0).max(1).default(.5), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Center X Signal\",\n\tdescription: \"The X coordinate of the blur center (0.0 to 1.0). Can be modulated by a static number or a dynamic signal.\"\n}).field(\"centerY\", z.number().min(0).max(1).default(.5), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Center Y Signal\",\n\tdescription: \"The Y coordinate of the blur center (0.0 to 1.0). Can be modulated by a static number or a dynamic signal.\"\n}).field(\"partialBlur\", z.boolean().default(false), {\n\tbindable: false,\n\tsignal: true,\n\tlabel: \"Partial Blur\",\n\tdescription: \"Blurs only a specific circular area around center point.\"\n}).field(\"radius\", z.number().min(.01).max(1).default(.3), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Partial Radius Signal\",\n\tdescription: \"Radius of the partial blur region (0.01 to 1.0). Can be modulated by a static number or a dynamic signal.\"\n}).field(\"radiusY\", z.number().min(0).max(1).default(0), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Partial Radius Y Signal\",\n\tdescription: \"Vertical radius of the partial blur region (0 to 1.0). 0 reuses the horizontal radius.\"\n}).field(\"shape\", z.enum([\n\t\"ellipse\",\n\t\"circle\",\n\t\"rect\"\n]).default(\"circle\"), {\n\tbindable: false,\n\tlabel: \"Partial Shape\",\n\tdescription: \"Shape of the partial blur region.\"\n}).build();\nconst BlurNodeConfigSchema = blurConfig.schema;\nconst BlurResultSchema = z.union([ImageResultSchema, VideoResultSchema]);\nconst BLUR_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_BLUR_UNIFORMS = `\nstruct BlurUniforms {\n\tdirX : f32,\n\tdirY : f32,\n\tstrength : f32,\n\tangle : f32,\n\n\tsigmaColor : f32,\n\tcenterX : f32,\n\tcenterY : f32,\n\tradius : f32,\n\n\tpartialBlur : f32,\n\thasStrengthSig : f32,\n\thasSigmaColorSig: f32,\n\thasCenterXSig : f32,\n\n\thasCenterYSig : f32,\n\thasRadiusSig : f32,\n\tradiusY : f32,\n\tshape : f32,\n};\n\n@group(0) @binding(0) var<uniform> u : BlurUniforms;\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 strengthSigTex : texture_2d<f32>;\n@group(2) @binding(1) var sigmaColorSigTex : texture_2d<f32>;\n@group(2) @binding(2) var centerXSigTex : texture_2d<f32>;\n@group(2) @binding(3) var centerYSigTex : texture_2d<f32>;\n@group(2) @binding(4) var radiusSigTex : texture_2d<f32>;\n@group(2) @binding(5) var signalSamp : sampler;\n\nfn applyPartialBlur(blurred: vec4<f32>, uv: vec2<f32>, dimensions: vec2<f32>) -> vec4<f32> {\n\tif (u.partialBlur <= 0.5) {\n\t\treturn blurred;\n\t}\n\tlet orig = textureSampleLevel(origTex, samp, uv, 0.0);\n\tvar centerX = u.centerX;\n\tif (u.hasCenterXSig > 0.5) {\n\t\tcenterX = textureSampleLevel(centerXSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\tvar centerY = u.centerY;\n\tif (u.hasCenterYSig > 0.5) {\n\t\tcenterY = textureSampleLevel(centerYSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\tvar radiusX = u.radius;\n\tif (u.hasRadiusSig > 0.5) {\n\t\tradiusX = textureSampleLevel(radiusSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\tvar radiusY = u.radiusY;\n\n\tvar mask = 0.0;\n\tif (radiusY <= 0.0) {\n\t\tlet aspect = dimensions.x / dimensions.y;\n\t\tlet diff = (uv - vec2<f32>(centerX, centerY)) * vec2<f32>(aspect, 1.0);\n\t\tlet dist = length(diff);\n\t\tlet feather = 0.05;\n\t\tmask = 1.0 - smoothstep(radiusX - feather, radiusX + feather, dist);\n\t} else {\n\t\tlet diff = abs(uv - vec2<f32>(centerX, centerY));\n\t\tif (u.shape > 0.5) {\n\t\t\tlet feather = 0.02;\n\t\t\tlet edgeX = 1.0 - smoothstep(radiusX - feather, radiusX + feather, diff.x);\n\t\t\tlet edgeY = 1.0 - smoothstep(radiusY - feather, radiusY + feather, diff.y);\n\t\t\tmask = edgeX * edgeY;\n\t\t} else {\n\t\t\tlet normDist = length(vec2<f32>(diff.x / max(1e-4, radiusX), diff.y / max(1e-4, radiusY)));\n\t\t\tlet feather = 0.08;\n\t\t\tmask = 1.0 - smoothstep(1.0 - feather, 1.0 + feather, normDist);\n\t\t}\n\t}\n\treturn mix(orig, blurred, mask);\n}\n`;\nconst GAUSSIAN_BLUR_SHADER = `\n${WGSL_BLUR_UNIFORMS}\n${FULLSCREEN_QUAD_WGSL}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet c = textureSampleLevel(tex, samp, in.uv, 0.0);\n\tvar spatial_sigma = u.strength;\n\tif (u.hasStrengthSig > 0.5) {\n\t\tspatial_sigma = textureSampleLevel(strengthSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\n\tlet dimensions = vec2<f32>(textureDimensions(tex));\n\tif (spatial_sigma <= 0.0) {\n\t\treturn applyPartialBlur(c, in.uv, dimensions);\n\t}\n\n\tlet texelSize = 1.0 / dimensions;\n\tlet stepScale = max(1.0, spatial_sigma / 20.0);\n\tlet effectiveSigma = spatial_sigma / stepScale;\n\tlet radius = min(i32(ceil(3.0 * effectiveSigma)), 64);\n\t\n\tlet direction = vec2<f32>(u.dirX, u.dirY);\n\t\n\tvar color = vec4<f32>(0.0);\n\tvar totalWeight = 0.0;\n\n\tfor (var i = -radius; i <= radius; 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\tcolor += textureSampleLevel(tex, samp, in.uv + offset, 0.0) * weight;\n\t\ttotalWeight += weight;\n\t}\n\n\tlet blurred = color / totalWeight;\n\treturn applyPartialBlur(blurred, in.uv, dimensions);\n}\n`;\nconst BOX_BLUR_SHADER = `\n${WGSL_BLUR_UNIFORMS}\n${FULLSCREEN_QUAD_WGSL}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet c = textureSampleLevel(tex, samp, in.uv, 0.0);\n\tvar strength = u.strength;\n\tif (u.hasStrengthSig > 0.5) {\n\t\tstrength = textureSampleLevel(strengthSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\n\tlet dimensions = vec2<f32>(textureDimensions(tex));\n\tlet radius = i32(round(strength));\n\tif (radius <= 0) {\n\t\treturn applyPartialBlur(c, in.uv, dimensions);\n\t}\n\n\tlet texelSize = 1.0 / dimensions;\n\tlet direction = vec2<f32>(u.dirX, u.dirY);\n\t\n\tvar color = vec4<f32>(0.0);\n\tvar count = 0.0;\n\n\tfor (var i = -radius; i <= radius; i++) {\n\t\tlet offset = vec2<f32>(f32(i)) * direction * texelSize;\n\t\tcolor += textureSampleLevel(tex, samp, in.uv + offset, 0.0);\n\t\tcount += 1.0;\n\t}\n\n\tlet blurred = color / count;\n\treturn applyPartialBlur(blurred, in.uv, dimensions);\n}\n`;\nconst MEDIAN_BLUR_SHADER = `\n${WGSL_BLUR_UNIFORMS}\nstruct Val {\n\tluma : f32,\n\tcolor : vec4<f32>,\n};\n\n${FULLSCREEN_QUAD_WGSL}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet centerCol = textureSampleLevel(tex, samp, in.uv, 0.0);\n\tvar strength = u.strength;\n\tif (u.hasStrengthSig > 0.5) {\n\t\tstrength = textureSampleLevel(strengthSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\n\tlet dimensions = vec2<f32>(textureDimensions(tex));\n\tlet radius = min(i32(round(strength)), 16);\n\tif (radius <= 0) {\n\t\treturn applyPartialBlur(centerCol, in.uv, dimensions);\n\t}\n\n\tlet count = radius * 2 + 1;\n\tlet texelSize = 1.0 / dimensions;\n\tlet direction = vec2<f32>(u.dirX, u.dirY);\n\n\tvar values : array<Val, 33>;\n\n\tfor (var i = 0; i < 33; i++) {\n\t\tif (i >= count) { break; }\n\t\tlet offset = vec2<f32>(f32(i - radius)) * direction * texelSize;\n\t\tlet col = textureSampleLevel(tex, samp, in.uv + offset, 0.0);\n\t\tvalues[i] = Val(dot(col.rgb, vec3<f32>(0.299, 0.587, 0.114)), col);\n\t}\n\n\t// Selection sort\n\tfor (var i = 0; i < 33; i++) {\n\t\tif (i >= count - 1) { break; }\n\t\tvar minIdx = i;\n\t\tfor (var j = 0; j < 33; j++) {\n\t\t\tif (j <= i) { continue; }\n\t\t\tif (j >= count) { break; }\n\t\t\tif (values[j].luma < values[minIdx].luma) {\n\t\t\t\tminIdx = j;\n\t\t\t}\n\t\t}\n\t\tif (minIdx != i) {\n\t\t\tlet temp = values[i];\n\t\t\tvalues[i] = values[minIdx];\n\t\t\tvalues[minIdx] = temp;\n\t\t}\n\t}\n\n\tlet medianIdx = count / 2;\n\treturn applyPartialBlur(values[medianIdx].color, in.uv, dimensions);\n}\n`;\nconst MOTION_BLUR_SHADER = `\n${WGSL_BLUR_UNIFORMS}\n${FULLSCREEN_QUAD_WGSL}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet c = textureSampleLevel(tex, samp, in.uv, 0.0);\n\tvar strength = u.strength;\n\tif (u.hasStrengthSig > 0.5) {\n\t\tstrength = textureSampleLevel(strengthSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\n\tlet dimensions = vec2<f32>(textureDimensions(tex));\n\tif (strength <= 0.0) {\n\t\treturn applyPartialBlur(c, in.uv, dimensions);\n\t}\n\n\tlet PI = 3.14159265359;\n\tlet angleRad = u.angle * PI / 180.0;\n\tlet dir = vec2<f32>(cos(angleRad), sin(angleRad));\n\n\tlet texelSize = 1.0 / dimensions;\n\tlet step = dir * texelSize;\n\n\tlet numSamples = i32(clamp(strength, 1.0, 64.0));\n\tvar color = vec4<f32>(0.0);\n\t\n\tfor (var i = 0; i < 64; i++) {\n\t\tif (i >= numSamples) { break; }\n\t\tlet offset = f32(i - numSamples / 2) * step;\n\t\tcolor += textureSampleLevel(tex, samp, in.uv + offset, 0.0);\n\t}\n\n\tlet blurred = color / f32(numSamples);\n\treturn applyPartialBlur(blurred, in.uv, dimensions);\n}\n`;\nconst BILATERAL_BLUR_SHADER = `\n${WGSL_BLUR_UNIFORMS}\n${FULLSCREEN_QUAD_WGSL}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet centerCol = textureSampleLevel(tex, samp, in.uv, 0.0);\n\tvar spatial_sigma = u.strength;\n\tif (u.hasStrengthSig > 0.5) {\n\t\tspatial_sigma = textureSampleLevel(strengthSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\tvar sigmaColor = u.sigmaColor;\n\tif (u.hasSigmaColorSig > 0.5) {\n\t\tsigmaColor = textureSampleLevel(sigmaColorSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\n\tlet dimensions = vec2<f32>(textureDimensions(tex));\n\tif (spatial_sigma <= 0.0) {\n\t\treturn applyPartialBlur(centerCol, in.uv, dimensions);\n\t}\n\n\tlet texelSize = 1.0 / dimensions;\n\tlet radius = min(i32(ceil(3.0 * spatial_sigma)), 32);\n\tlet direction = vec2<f32>(u.dirX, u.dirY);\n\t\n\tvar color = vec4<f32>(0.0);\n\tvar totalWeight = 0.0;\n\n\tfor (var i = -32; i <= 32; i++) {\n\t\tif (i < -radius || i > radius) { continue; }\n\t\tlet offset = vec2<f32>(f32(i)) * direction * texelSize;\n\t\tlet sampleCol = textureSampleLevel(tex, samp, in.uv + offset, 0.0);\n\t\t\n\t\tlet spatialDistSq = f32(i * i);\n\t\tlet spatialWeight = exp(-0.5 * spatialDistSq / (spatial_sigma * spatial_sigma));\n\t\t\n\t\tlet diff = sampleCol - centerCol;\n\t\tlet colorDistSq = dot(diff, diff);\n\t\tlet rangeWeight = exp(-0.5 * colorDistSq / (sigmaColor * sigmaColor));\n\t\t\n\t\tlet weight = spatialWeight * rangeWeight;\n\t\tcolor += sampleCol * weight;\n\t\ttotalWeight += weight;\n\t}\n\n\tvar blurred = centerCol;\n\tif (totalWeight > 0.0) {\n\t\tblurred = color / totalWeight;\n\t}\n\treturn applyPartialBlur(blurred, in.uv, dimensions);\n}\n`;\nconst EDGE_PRESERVING_SHADER = `\n${WGSL_BLUR_UNIFORMS}\n${FULLSCREEN_QUAD_WGSL}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet centerCol = textureSampleLevel(tex, samp, in.uv, 0.0);\n\tvar strength = u.strength;\n\tif (u.hasStrengthSig > 0.5) {\n\t\tstrength = textureSampleLevel(strengthSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\n\t// Map strength (1-10) to radius (1-6)\n\tlet radius = i32(clamp(round(strength * 5.0 / 10.0) + 1.0, 1.0, 6.0));\n\n\tlet dimensions = vec2<f32>(textureDimensions(tex));\n\tlet texelSize = 1.0 / dimensions;\n\n\tvar m0 = vec3<f32>(0.0); var m1 = vec3<f32>(0.0); var m2 = vec3<f32>(0.0); var m3 = vec3<f32>(0.0);\n\tvar s0 = vec3<f32>(0.0); var s1 = vec3<f32>(0.0); var s2 = vec3<f32>(0.0); var s3 = vec3<f32>(0.0);\n\n\tlet n = f32((radius + 1) * (radius + 1));\n\n\tfor (var j = -6; j <= 6; j++) {\n\t\tif (j < -radius || j > radius) { continue; }\n\t\tfor (var i = -6; i <= 6; i++) {\n\t\t\tif (i < -radius || i > radius) { continue; }\n\t\t\t\n\t\t\tlet c = textureSampleLevel(tex, samp, in.uv + vec2<f32>(f32(i), f32(j)) * texelSize, 0.0).rgb;\n\t\t\t\n\t\t\tif (i <= 0 && j <= 0) {\n\t\t\t\tm0 += c;\n\t\t\t\ts0 += c * c;\n\t\t\t}\n\t\t\tif (i >= 0 && j <= 0) {\n\t\t\t\tm1 += c;\n\t\t\t\ts1 += c * c;\n\t\t\t}\n\t\t\tif (i <= 0 && j >= 0) {\n\t\t\t\tm2 += c;\n\t\t\t\ts2 += c * c;\n\t\t\t}\n\t\t\tif (i >= 0 && j >= 0) {\n\t\t\t\tm3 += c;\n\t\t\t\ts3 += c * c;\n\t\t\t}\n\t\t}\n\t}\n\n\tm0 = m0 / n; s0 = abs(s0 / n - m0 * m0);\n\tm1 = m1 / n; s1 = abs(s1 / n - m1 * m1);\n\tm2 = m2 / n; s2 = abs(s2 / n - m2 * m2);\n\tm3 = m3 / n; s3 = abs(s3 / n - m3 * m3);\n\n\tlet v0 = s0.r + s0.g + s0.b;\n\tlet v1 = s1.r + s1.g + s1.b;\n\tlet v2 = s2.r + s2.g + s2.b;\n\tlet v3 = s3.r + s3.g + s3.b;\n\n\tvar minVar = v0;\n\tvar finalCol = m0;\n\n\tif (v1 < minVar) {\n\t\tminVar = v1;\n\t\tfinalCol = m1;\n\t}\n\tif (v2 < minVar) {\n\t\tminVar = v2;\n\t\tfinalCol = m2;\n\t}\n\tif (v3 < minVar) {\n\t\tminVar = v3;\n\t\tfinalCol = m3;\n\t}\n\n\tlet blurred = vec4<f32>(finalCol, centerCol.a);\n\treturn applyPartialBlur(blurred, in.uv, dimensions);\n}\n`;\nconst RADIAL_BLUR_SHADER = `\n${WGSL_BLUR_UNIFORMS}\n${FULLSCREEN_QUAD_WGSL}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet centerCol = textureSampleLevel(tex, samp, in.uv, 0.0);\n\tvar strength = u.strength;\n\tif (u.hasStrengthSig > 0.5) {\n\t\tstrength = textureSampleLevel(strengthSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\tvar centerX = u.centerX;\n\tif (u.hasCenterXSig > 0.5) {\n\t\tcenterX = textureSampleLevel(centerXSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\tvar centerY = u.centerY;\n\tif (u.hasCenterYSig > 0.5) {\n\t\tcenterY = textureSampleLevel(centerYSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\n\tlet dimensions = vec2<f32>(textureDimensions(tex));\n\tif (strength <= 0.0) {\n\t\treturn applyPartialBlur(centerCol, in.uv, dimensions);\n\t}\n\n\tlet center = vec2<f32>(centerX, centerY);\n\tlet toPixel = in.uv - center;\n\tlet dist = length(toPixel);\n\tif (dist <= 0.0) {\n\t\treturn applyPartialBlur(centerCol, in.uv, dimensions);\n\t}\n\n\tlet dir = vec2<f32>(-toPixel.y, toPixel.x);\n\tlet blurAmount = (strength / 100.0) * 0.1 * dist;\n\n\tlet numSamples = 24;\n\tvar color = vec4<f32>(0.0);\n\tlet step = dir * (blurAmount / f32(numSamples));\n\n\tfor (var i = 0; i < 24; i++) {\n\t\tlet offset = step * f32(i - 12);\n\t\tcolor += textureSampleLevel(tex, samp, in.uv + offset, 0.0);\n\t}\n\n\tlet blurred = color / 24.0;\n\treturn applyPartialBlur(blurred, in.uv, dimensions);\n}\n`;\nconst ZOOM_BLUR_SHADER = `\n${WGSL_BLUR_UNIFORMS}\n${FULLSCREEN_QUAD_WGSL}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet centerCol = textureSampleLevel(tex, samp, in.uv, 0.0);\n\tvar strength = u.strength;\n\tif (u.hasStrengthSig > 0.5) {\n\t\tstrength = textureSampleLevel(strengthSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\tvar centerX = u.centerX;\n\tif (u.hasCenterXSig > 0.5) {\n\t\tcenterX = textureSampleLevel(centerXSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\tvar centerY = u.centerY;\n\tif (u.hasCenterYSig > 0.5) {\n\t\tcenterY = textureSampleLevel(centerYSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\n\tlet dimensions = vec2<f32>(textureDimensions(tex));\n\tif (strength <= 0.0) {\n\t\treturn applyPartialBlur(centerCol, in.uv, dimensions);\n\t}\n\n\tlet center = vec2<f32>(centerX, centerY);\n\tlet toPixel = in.uv - center;\n\tlet blurAmount = (strength / 100.0) * 0.15;\n\n\tlet numSamples = 24;\n\tvar color = vec4<f32>(0.0);\n\tlet step = toPixel * (blurAmount / f32(numSamples));\n\n\tfor (var i = 0; i < 24; i++) {\n\t\tlet offset = step * f32(i - 12);\n\t\tcolor += textureSampleLevel(tex, samp, in.uv + offset, 0.0);\n\t}\n\n\tlet blurred = color / 24.0;\n\treturn applyPartialBlur(blurred, in.uv, dimensions);\n}\n`;\nconst getDeviceLayouts = perDevice((device) => ({\n\tblurUniformLayout: fragmentBindGroupLayout(device, [\"uniform\"]),\n\tsingleTextureLayout: fragmentBindGroupLayout(device, [\n\t\t\"texture\",\n\t\t\"sampler\",\n\t\t\"texture\"\n\t]),\n\tsignalTextureLayout: texturesLayout(device, 5),\n\tpipelineCache: /* @__PURE__ */ new Map()\n}));\nfunction getBlurResources(device, format, blurType) {\n\tconst layouts = getDeviceLayouts(device);\n\tconst cacheKey = `blur_${blurType}_${format}`;\n\tlet pipeline = layouts.pipelineCache.get(cacheKey);\n\tif (!pipeline) {\n\t\tlet code = GAUSSIAN_BLUR_SHADER;\n\t\tif (blurType === \"Box\") code = BOX_BLUR_SHADER;\n\t\telse if (blurType === \"Median\") code = MEDIAN_BLUR_SHADER;\n\t\telse if (blurType === \"Motion\") code = MOTION_BLUR_SHADER;\n\t\telse if (blurType === \"Bilateral\") code = BILATERAL_BLUR_SHADER;\n\t\telse if (blurType === \"Edge-preserving\") code = EDGE_PRESERVING_SHADER;\n\t\telse if (blurType === \"Radial\") code = RADIAL_BLUR_SHADER;\n\t\telse if (blurType === \"Zoom\") code = ZOOM_BLUR_SHADER;\n\t\tconst blurModule = device.createShaderModule({\n\t\t\tlabel: `blur_${blurType}_${format}.wgsl`,\n\t\t\tcode\n\t\t});\n\t\tpipeline = createFullscreenPipeline(device, {\n\t\t\tlabel: `BlurPipeline_${blurType}_${format}`,\n\t\t\tmodule: blurModule,\n\t\t\tlayouts: [\n\t\t\t\tlayouts.blurUniformLayout,\n\t\t\t\tlayouts.singleTextureLayout,\n\t\t\t\tlayouts.signalTextureLayout\n\t\t\t],\n\t\t\tformat\n\t\t});\n\t\tlayouts.pipelineCache.set(cacheKey, pipeline);\n\t}\n\treturn {\n\t\tblurPipeline: pipeline,\n\t\tblurUniformLayout: layouts.blurUniformLayout,\n\t\tsingleTextureLayout: layouts.singleTextureLayout,\n\t\tsignalTextureLayout: layouts.signalTextureLayout\n\t};\n}\nconst BlurWebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetTexture, targetWidth, targetHeight, props } = args;\n\tconst frame = props.frame ?? 0;\n\tconst compositionFrame = props.compositionFrame ?? frame;\n\tconst fps = props.fps || 30;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"Blur\" || !op) return;\n\tconst childMedia = props.virtualMedia.children?.[0];\n\tif (!childMedia) return;\n\tpass.end();\n\tconst blurData = new Float32Array(16);\n\tconst width = targetWidth;\n\tconst height = targetHeight;\n\tconst dpiScale = width / (props.containerWidth ?? ctx.surface.width / (typeof window !== \"undefined\" ? window.devicePixelRatio : 1));\n\tconst nodeId = op.inputs ? Object.keys(op.inputs)[0] : \"blur_node\";\n\tconst resolveBindable = (configKey, defaultValue, minVal, maxVal, scaleByDpi = false) => {\n\t\tconst handleId = op[`${configKey}HandleId`];\n\t\tconst input = handleId ? op.inputs?.[handleId] : null;\n\t\tconst hasSignal = !!(input?.connectionValid && (input.outputItem?.type === \"Signal\" || input.outputItem?.type === \"Numeric\"));\n\t\tconst sd = hasSignal && input?.outputItem?.data ? input.outputItem.data : null;\n\t\tlet val = defaultValue;\n\t\tlet hasStaticSig = false;\n\t\tlet gpuTextureView;\n\t\tif (!hasSignal) if (input?.connectionValid && input.outputItem?.type === \"Number\") {\n\t\t\tconst rawVal = Number(input.outputItem.data ?? defaultValue);\n\t\t\tval = Math.max(minVal, Math.min(maxVal, rawVal));\n\t\t\tif (scaleByDpi) val *= dpiScale;\n\t\t} else {\n\t\t\tconst unwrapped = unwrapFrameParam(op[configKey], compositionFrame, fps);\n\t\t\tif (unwrapped.gpuTextureView) {\n\t\t\t\tgpuTextureView = unwrapped.gpuTextureView;\n\t\t\t\thasStaticSig = true;\n\t\t\t}\n\t\t\tconst rawVal = unwrapped.value;\n\t\t\tconst numVal = Number(rawVal ?? defaultValue);\n\t\t\tval = Math.max(minVal, Math.min(maxVal, isNaN(numVal) ? defaultValue : numVal));\n\t\t\tif (scaleByDpi) val *= dpiScale;\n\t\t}\n\t\telse if (sd) {\n\t\t\tconst rawVal = Number(sd.offset ?? 0);\n\t\t\tval = Math.max(minVal, Math.min(maxVal, rawVal));\n\t\t\tif (scaleByDpi) val *= dpiScale;\n\t\t\thasStaticSig = true;\n\t\t}\n\t\treturn {\n\t\t\tval,\n\t\t\thasStaticSig,\n\t\t\tsd,\n\t\t\tgpuTextureView\n\t\t};\n\t};\n\tconst strengthRes = resolveBindable(\"strength\", 5, 0, MAX_BLUR, true);\n\tconst sigmaColorRes = resolveBindable(\"sigmaColor\", .1, .01, 1, false);\n\tconst centerXRes = resolveBindable(\"centerX\", .5, 0, 1, false);\n\tconst centerYRes = resolveBindable(\"centerY\", .5, 0, 1, false);\n\tconst radiusRes = resolveBindable(\"radius\", .3, .001, 1, false);\n\tconst radiusYRes = resolveBindable(\"radiusY\", 0, 0, 1, false);\n\tconst { texture: tmpTex } = await drawChildToTexture(args, childMedia);\n\tconst blurType = op.blurType ?? \"Gaussian\";\n\tconst isSeparable = blurType === \"Gaussian\" || blurType === \"Box\" || blurType === \"Median\" || blurType === \"Bilateral\";\n\tconst { blurPipeline: pipeline, blurUniformLayout: uLayout, singleTextureLayout: tLayout, signalTextureLayout: sigLayout } = getBlurResources(ctx.device, ctx.renderer.format, blurType);\n\tconst sampler = ctx.renderer.samplerCache.getSampler(ctx.device);\n\tconst { elapsedSeconds, durationSeconds } = signalTiming(props, frame, fps);\n\tfor (const bindableRes of [\n\t\tstrengthRes,\n\t\tsigmaColorRes,\n\t\tcenterXRes,\n\t\tcenterYRes,\n\t\tradiusRes\n\t]) if (bindableRes.hasStaticSig && bindableRes.sd) await signalRegistry.ensureAudioSourcesExtracted(ctx.device, bindableRes.sd, fps, props.renderId);\n\tconst signalContext = {\n\t\targs,\n\t\twidth,\n\t\theight,\n\t\tframe,\n\t\tfps,\n\t\telapsedSeconds,\n\t\tdurationSeconds\n\t};\n\tconst getSignalView = (res, suffix) => signalTextureView(signalContext, res, `${nodeId}_${suffix}`);\n\tconst strengthView = getSignalView(strengthRes, \"strength_sig\");\n\tconst sigmaColorView = getSignalView(sigmaColorRes, \"sigmacolor_sig\");\n\tconst centerXView = getSignalView(centerXRes, \"centerx_sig\");\n\tconst centerYView = getSignalView(centerYRes, \"centery_sig\");\n\tconst radiusView = getSignalView(radiusRes, \"radius_sig\");\n\tconst createBlurBindGroup1 = (inputTex, origTex) => 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: origTex.createView()\n\t\t\t}\n\t\t]\n\t});\n\tconst isPartial = Boolean(op.partialBlur && op.partialBlur !== \"false\" && op.partialBlur !== 0);\n\tblurData[2] = strengthRes.val;\n\tblurData[3] = Number(op.angle ?? 0);\n\tblurData[4] = sigmaColorRes.val;\n\tblurData[5] = centerXRes.val;\n\tblurData[6] = centerYRes.val;\n\tblurData[7] = radiusRes.val;\n\tblurData[8] = isPartial ? 1 : 0;\n\tblurData[9] = strengthRes.hasStaticSig ? 1 : 0;\n\tblurData[10] = sigmaColorRes.hasStaticSig ? 1 : 0;\n\tblurData[11] = centerXRes.hasStaticSig ? 1 : 0;\n\tblurData[12] = centerYRes.hasStaticSig ? 1 : 0;\n\tblurData[13] = radiusRes.hasStaticSig ? 1 : 0;\n\tblurData[14] = radiusYRes.val;\n\tblurData[15] = op.shape === \"rect\" ? 1 : 0;\n\tlet outTex2;\n\tif (isSeparable) {\n\t\tconst outTex1 = ctx.renderer.getTemporaryTexture(width, height, [\n\t\t\ttmpTex,\n\t\t\ttargetTexture,\n\t\t\t...props.excludeTextures || []\n\t\t]);\n\t\toutTex2 = ctx.renderer.getTemporaryTexture(width, height, [\n\t\t\ttmpTex,\n\t\t\toutTex1,\n\t\t\ttargetTexture,\n\t\t\t...props.excludeTextures || []\n\t\t]);\n\t\tblurData[0] = 1;\n\t\tblurData[1] = 0;\n\t\tblurData[8] = 0;\n\t\tconst hBuffer = ctx.renderer.getTemporaryBuffer(blurData);\n\t\tdrawFullscreenPass(encoder, outTex1.createView(), pipeline, [\n\t\t\tctx.device.createBindGroup({\n\t\t\t\tlayout: uLayout,\n\t\t\t\tentries: [{\n\t\t\t\t\tbinding: 0,\n\t\t\t\t\tresource: { buffer: hBuffer }\n\t\t\t\t}]\n\t\t\t}),\n\t\t\tcreateBlurBindGroup1(tmpTex, tmpTex),\n\t\t\tctx.device.createBindGroup({\n\t\t\t\tlayout: sigLayout,\n\t\t\t\tentries: [\n\t\t\t\t\t{\n\t\t\t\t\t\tbinding: 0,\n\t\t\t\t\t\tresource: strengthView\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tbinding: 1,\n\t\t\t\t\t\tresource: sigmaColorView\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tbinding: 2,\n\t\t\t\t\t\tresource: centerXView\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tbinding: 3,\n\t\t\t\t\t\tresource: centerYView\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tbinding: 4,\n\t\t\t\t\t\tresource: radiusView\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tbinding: 5,\n\t\t\t\t\t\tresource: sampler\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t})\n\t\t]);\n\t\tblurData[0] = 0;\n\t\tblurData[1] = 1;\n\t\tblurData[8] = isPartial ? 1 : 0;\n\t\tconst vBuffer = ctx.renderer.getTemporaryBuffer(blurData);\n\t\tdrawFullscreenPass(encoder, outTex2.createView(), pipeline, [\n\t\t\tctx.device.createBindGroup({\n\t\t\t\tlayout: uLayout,\n\t\t\t\tentries: [{\n\t\t\t\t\tbinding: 0,\n\t\t\t\t\tresource: { buffer: vBuffer }\n\t\t\t\t}]\n\t\t\t}),\n\t\t\tcreateBlurBindGroup1(outTex1, tmpTex),\n\t\t\tctx.device.createBindGroup({\n\t\t\t\tlayout: sigLayout,\n\t\t\t\tentries: [\n\t\t\t\t\t{\n\t\t\t\t\t\tbinding: 0,\n\t\t\t\t\t\tresource: strengthView\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tbinding: 1,\n\t\t\t\t\t\tresource: sigmaColorView\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tbinding: 2,\n\t\t\t\t\t\tresource: centerXView\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tbinding: 3,\n\t\t\t\t\t\tresource: centerYView\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tbinding: 4,\n\t\t\t\t\t\tresource: radiusView\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tbinding: 5,\n\t\t\t\t\t\tresource: sampler\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t})\n\t\t]);\n\t} else {\n\t\toutTex2 = ctx.renderer.getTemporaryTexture(width, height, [\n\t\t\ttmpTex,\n\t\t\ttargetTexture,\n\t\t\t...props.excludeTextures || []\n\t\t]);\n\t\tblurData[0] = 0;\n\t\tblurData[1] = 0;\n\t\tblurData[8] = isPartial ? 1 : 0;\n\t\tconst singleBuffer = ctx.renderer.getTemporaryBuffer(blurData);\n\t\tdrawFullscreenPass(encoder, outTex2.createView(), pipeline, [\n\t\t\tctx.device.createBindGroup({\n\t\t\t\tlayout: uLayout,\n\t\t\t\tentries: [{\n\t\t\t\t\tbinding: 0,\n\t\t\t\t\tresource: { buffer: singleBuffer }\n\t\t\t\t}]\n\t\t\t}),\n\t\t\tcreateBlurBindGroup1(tmpTex, tmpTex),\n\t\t\tctx.device.createBindGroup({\n\t\t\t\tlayout: sigLayout,\n\t\t\t\tentries: [\n\t\t\t\t\t{\n\t\t\t\t\t\tbinding: 0,\n\t\t\t\t\t\tresource: strengthView\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tbinding: 1,\n\t\t\t\t\t\tresource: sigmaColorView\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tbinding: 2,\n\t\t\t\t\t\tresource: centerXView\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tbinding: 3,\n\t\t\t\t\t\tresource: centerYView\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tbinding: 4,\n\t\t\t\t\t\tresource: radiusView\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tbinding: 5,\n\t\t\t\t\t\tresource: sampler\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t})\n\t\t]);\n\t}\n\tdrawTextureToTarget(args, outTex2, op.opacity ?? 1);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: BlurWebGPURenderer });\n\n//#endregion\nexport { MAX_BLUR as a, BlurResultSchema as i, BLUR_OUTPUT_TYPE_MAP as n, blurConfig as o, BlurNodeConfigSchema as r, renderers_default as t };\n//# sourceMappingURL=renderers-rcrwEq-B.mjs.map"],"mappings":"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"}
1
+ {"version":3,"file":"renderer-CJB9nU1x.mjs","names":[],"sources":["../../../nodes/node-blur/dist/renderers-rcrwEq-B.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { ImageResultSchema, VideoResultSchema, configBuilder, unwrapFrameParam } from \"@framefields/node-sdk\";\nimport { FULLSCREEN_QUAD_WGSL, createFullscreenPipeline, drawChildToTexture, drawFullscreenPass, drawTextureToTarget, fragmentBindGroupLayout, perDevice, signalTextureView, signalTiming, texturesLayout } from \"@framefields/node-sdk/gpu\";\nimport { signalRegistry } from \"@framefields/webgpu-renderers\";\nimport { z } from \"zod\";\n\n//#region src/shared/config.ts\nconst MAX_BLUR = 100;\nconst blurConfig = configBuilder().field(\"blurType\", z.enum([\n\t\"Gaussian\",\n\t\"Box\",\n\t\"Median\",\n\t\"Motion\",\n\t\"Bilateral\",\n\t\"Edge-preserving\",\n\t\"Radial\",\n\t\"Zoom\"\n]).default(\"Gaussian\"), {\n\tbindable: false,\n\tlabel: \"Blur Type\"\n}).field(\"strength\", z.number().min(0).max(MAX_BLUR).default(5), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Strength Signal\",\n\tdescription: \"The intensity of the blur. 0 = no blur. Can be modulated by a static number or a dynamic signal.\"\n}).field(\"angle\", z.number().int().min(0).max(360).default(0), {\n\tbindable: false,\n\tsignal: true,\n\tlabel: \"Angle\",\n\tdescription: \"Direction of a Motion blur, in degrees.\"\n}).field(\"sigmaColor\", z.number().min(.01).max(1).default(.1), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Color Sigma Signal\",\n\tdescription: \"Sigma value for color space in Bilateral / Edge-preserving blurs. Can be modulated by a static number or a dynamic signal.\"\n}).field(\"centerX\", z.number().min(0).max(1).default(.5), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Center X Signal\",\n\tdescription: \"The X coordinate of the blur center (0.0 to 1.0). Can be modulated by a static number or a dynamic signal.\"\n}).field(\"centerY\", z.number().min(0).max(1).default(.5), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Center Y Signal\",\n\tdescription: \"The Y coordinate of the blur center (0.0 to 1.0). Can be modulated by a static number or a dynamic signal.\"\n}).field(\"partialBlur\", z.boolean().default(false), {\n\tbindable: false,\n\tsignal: true,\n\tlabel: \"Partial Blur\",\n\tdescription: \"Blurs only a specific circular area around center point.\"\n}).field(\"radius\", z.number().min(.01).max(1).default(.3), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Partial Radius Signal\",\n\tdescription: \"Radius of the partial blur region (0.01 to 1.0). Can be modulated by a static number or a dynamic signal.\"\n}).field(\"radiusY\", z.number().min(0).max(1).default(0), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Partial Radius Y Signal\",\n\tdescription: \"Vertical radius of the partial blur region (0 to 1.0). 0 reuses the horizontal radius.\"\n}).field(\"shape\", z.enum([\n\t\"ellipse\",\n\t\"circle\",\n\t\"rect\"\n]).default(\"circle\"), {\n\tbindable: false,\n\tlabel: \"Partial Shape\",\n\tdescription: \"Shape of the partial blur region.\"\n}).build();\nconst BlurNodeConfigSchema = blurConfig.schema;\nconst BlurResultSchema = z.union([ImageResultSchema, VideoResultSchema]);\nconst BLUR_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_BLUR_UNIFORMS = `\nstruct BlurUniforms {\n\tdirX : f32,\n\tdirY : f32,\n\tstrength : f32,\n\tangle : f32,\n\n\tsigmaColor : f32,\n\tcenterX : f32,\n\tcenterY : f32,\n\tradius : f32,\n\n\tpartialBlur : f32,\n\thasStrengthSig : f32,\n\thasSigmaColorSig: f32,\n\thasCenterXSig : f32,\n\n\thasCenterYSig : f32,\n\thasRadiusSig : f32,\n\tradiusY : f32,\n\tshape : f32,\n};\n\n@group(0) @binding(0) var<uniform> u : BlurUniforms;\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 strengthSigTex : texture_2d<f32>;\n@group(2) @binding(1) var sigmaColorSigTex : texture_2d<f32>;\n@group(2) @binding(2) var centerXSigTex : texture_2d<f32>;\n@group(2) @binding(3) var centerYSigTex : texture_2d<f32>;\n@group(2) @binding(4) var radiusSigTex : texture_2d<f32>;\n@group(2) @binding(5) var signalSamp : sampler;\n\nfn applyPartialBlur(blurred: vec4<f32>, uv: vec2<f32>, dimensions: vec2<f32>) -> vec4<f32> {\n\tif (u.partialBlur <= 0.5) {\n\t\treturn blurred;\n\t}\n\tlet orig = textureSampleLevel(origTex, samp, uv, 0.0);\n\tvar centerX = u.centerX;\n\tif (u.hasCenterXSig > 0.5) {\n\t\tcenterX = textureSampleLevel(centerXSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\tvar centerY = u.centerY;\n\tif (u.hasCenterYSig > 0.5) {\n\t\tcenterY = textureSampleLevel(centerYSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\tvar radiusX = u.radius;\n\tif (u.hasRadiusSig > 0.5) {\n\t\tradiusX = textureSampleLevel(radiusSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\tvar radiusY = u.radiusY;\n\n\tvar mask = 0.0;\n\tif (radiusY <= 0.0) {\n\t\tlet aspect = dimensions.x / dimensions.y;\n\t\tlet diff = (uv - vec2<f32>(centerX, centerY)) * vec2<f32>(aspect, 1.0);\n\t\tlet dist = length(diff);\n\t\tlet feather = 0.05;\n\t\tmask = 1.0 - smoothstep(radiusX - feather, radiusX + feather, dist);\n\t} else {\n\t\tlet diff = abs(uv - vec2<f32>(centerX, centerY));\n\t\tif (u.shape > 0.5) {\n\t\t\tlet feather = 0.02;\n\t\t\tlet edgeX = 1.0 - smoothstep(radiusX - feather, radiusX + feather, diff.x);\n\t\t\tlet edgeY = 1.0 - smoothstep(radiusY - feather, radiusY + feather, diff.y);\n\t\t\tmask = edgeX * edgeY;\n\t\t} else {\n\t\t\tlet normDist = length(vec2<f32>(diff.x / max(1e-4, radiusX), diff.y / max(1e-4, radiusY)));\n\t\t\tlet feather = 0.08;\n\t\t\tmask = 1.0 - smoothstep(1.0 - feather, 1.0 + feather, normDist);\n\t\t}\n\t}\n\treturn mix(orig, blurred, mask);\n}\n`;\nconst GAUSSIAN_BLUR_SHADER = `\n${WGSL_BLUR_UNIFORMS}\n${FULLSCREEN_QUAD_WGSL}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet c = textureSampleLevel(tex, samp, in.uv, 0.0);\n\tvar spatial_sigma = u.strength;\n\tif (u.hasStrengthSig > 0.5) {\n\t\tspatial_sigma = textureSampleLevel(strengthSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\n\tlet dimensions = vec2<f32>(textureDimensions(tex));\n\tif (spatial_sigma <= 0.0) {\n\t\treturn applyPartialBlur(c, in.uv, dimensions);\n\t}\n\n\tlet texelSize = 1.0 / dimensions;\n\tlet stepScale = max(1.0, spatial_sigma / 20.0);\n\tlet effectiveSigma = spatial_sigma / stepScale;\n\tlet radius = min(i32(ceil(3.0 * effectiveSigma)), 64);\n\t\n\tlet direction = vec2<f32>(u.dirX, u.dirY);\n\t\n\tvar color = vec4<f32>(0.0);\n\tvar totalWeight = 0.0;\n\n\tfor (var i = -radius; i <= radius; 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\tcolor += textureSampleLevel(tex, samp, in.uv + offset, 0.0) * weight;\n\t\ttotalWeight += weight;\n\t}\n\n\tlet blurred = color / totalWeight;\n\treturn applyPartialBlur(blurred, in.uv, dimensions);\n}\n`;\nconst BOX_BLUR_SHADER = `\n${WGSL_BLUR_UNIFORMS}\n${FULLSCREEN_QUAD_WGSL}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet c = textureSampleLevel(tex, samp, in.uv, 0.0);\n\tvar strength = u.strength;\n\tif (u.hasStrengthSig > 0.5) {\n\t\tstrength = textureSampleLevel(strengthSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\n\tlet dimensions = vec2<f32>(textureDimensions(tex));\n\tlet radius = i32(round(strength));\n\tif (radius <= 0) {\n\t\treturn applyPartialBlur(c, in.uv, dimensions);\n\t}\n\n\tlet texelSize = 1.0 / dimensions;\n\tlet direction = vec2<f32>(u.dirX, u.dirY);\n\t\n\tvar color = vec4<f32>(0.0);\n\tvar count = 0.0;\n\n\tfor (var i = -radius; i <= radius; i++) {\n\t\tlet offset = vec2<f32>(f32(i)) * direction * texelSize;\n\t\tcolor += textureSampleLevel(tex, samp, in.uv + offset, 0.0);\n\t\tcount += 1.0;\n\t}\n\n\tlet blurred = color / count;\n\treturn applyPartialBlur(blurred, in.uv, dimensions);\n}\n`;\nconst MEDIAN_BLUR_SHADER = `\n${WGSL_BLUR_UNIFORMS}\nstruct Val {\n\tluma : f32,\n\tcolor : vec4<f32>,\n};\n\n${FULLSCREEN_QUAD_WGSL}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet centerCol = textureSampleLevel(tex, samp, in.uv, 0.0);\n\tvar strength = u.strength;\n\tif (u.hasStrengthSig > 0.5) {\n\t\tstrength = textureSampleLevel(strengthSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\n\tlet dimensions = vec2<f32>(textureDimensions(tex));\n\tlet radius = min(i32(round(strength)), 16);\n\tif (radius <= 0) {\n\t\treturn applyPartialBlur(centerCol, in.uv, dimensions);\n\t}\n\n\tlet count = radius * 2 + 1;\n\tlet texelSize = 1.0 / dimensions;\n\tlet direction = vec2<f32>(u.dirX, u.dirY);\n\n\tvar values : array<Val, 33>;\n\n\tfor (var i = 0; i < 33; i++) {\n\t\tif (i >= count) { break; }\n\t\tlet offset = vec2<f32>(f32(i - radius)) * direction * texelSize;\n\t\tlet col = textureSampleLevel(tex, samp, in.uv + offset, 0.0);\n\t\tvalues[i] = Val(dot(col.rgb, vec3<f32>(0.299, 0.587, 0.114)), col);\n\t}\n\n\t// Selection sort\n\tfor (var i = 0; i < 33; i++) {\n\t\tif (i >= count - 1) { break; }\n\t\tvar minIdx = i;\n\t\tfor (var j = 0; j < 33; j++) {\n\t\t\tif (j <= i) { continue; }\n\t\t\tif (j >= count) { break; }\n\t\t\tif (values[j].luma < values[minIdx].luma) {\n\t\t\t\tminIdx = j;\n\t\t\t}\n\t\t}\n\t\tif (minIdx != i) {\n\t\t\tlet temp = values[i];\n\t\t\tvalues[i] = values[minIdx];\n\t\t\tvalues[minIdx] = temp;\n\t\t}\n\t}\n\n\tlet medianIdx = count / 2;\n\treturn applyPartialBlur(values[medianIdx].color, in.uv, dimensions);\n}\n`;\nconst MOTION_BLUR_SHADER = `\n${WGSL_BLUR_UNIFORMS}\n${FULLSCREEN_QUAD_WGSL}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet c = textureSampleLevel(tex, samp, in.uv, 0.0);\n\tvar strength = u.strength;\n\tif (u.hasStrengthSig > 0.5) {\n\t\tstrength = textureSampleLevel(strengthSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\n\tlet dimensions = vec2<f32>(textureDimensions(tex));\n\tif (strength <= 0.0) {\n\t\treturn applyPartialBlur(c, in.uv, dimensions);\n\t}\n\n\tlet PI = 3.14159265359;\n\tlet angleRad = u.angle * PI / 180.0;\n\tlet dir = vec2<f32>(cos(angleRad), sin(angleRad));\n\n\tlet texelSize = 1.0 / dimensions;\n\tlet step = dir * texelSize;\n\n\tlet numSamples = i32(clamp(strength, 1.0, 64.0));\n\tvar color = vec4<f32>(0.0);\n\t\n\tfor (var i = 0; i < 64; i++) {\n\t\tif (i >= numSamples) { break; }\n\t\tlet offset = f32(i - numSamples / 2) * step;\n\t\tcolor += textureSampleLevel(tex, samp, in.uv + offset, 0.0);\n\t}\n\n\tlet blurred = color / f32(numSamples);\n\treturn applyPartialBlur(blurred, in.uv, dimensions);\n}\n`;\nconst BILATERAL_BLUR_SHADER = `\n${WGSL_BLUR_UNIFORMS}\n${FULLSCREEN_QUAD_WGSL}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet centerCol = textureSampleLevel(tex, samp, in.uv, 0.0);\n\tvar spatial_sigma = u.strength;\n\tif (u.hasStrengthSig > 0.5) {\n\t\tspatial_sigma = textureSampleLevel(strengthSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\tvar sigmaColor = u.sigmaColor;\n\tif (u.hasSigmaColorSig > 0.5) {\n\t\tsigmaColor = textureSampleLevel(sigmaColorSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\n\tlet dimensions = vec2<f32>(textureDimensions(tex));\n\tif (spatial_sigma <= 0.0) {\n\t\treturn applyPartialBlur(centerCol, in.uv, dimensions);\n\t}\n\n\tlet texelSize = 1.0 / dimensions;\n\tlet radius = min(i32(ceil(3.0 * spatial_sigma)), 32);\n\tlet direction = vec2<f32>(u.dirX, u.dirY);\n\t\n\tvar color = vec4<f32>(0.0);\n\tvar totalWeight = 0.0;\n\n\tfor (var i = -32; i <= 32; i++) {\n\t\tif (i < -radius || i > radius) { continue; }\n\t\tlet offset = vec2<f32>(f32(i)) * direction * texelSize;\n\t\tlet sampleCol = textureSampleLevel(tex, samp, in.uv + offset, 0.0);\n\t\t\n\t\tlet spatialDistSq = f32(i * i);\n\t\tlet spatialWeight = exp(-0.5 * spatialDistSq / (spatial_sigma * spatial_sigma));\n\t\t\n\t\tlet diff = sampleCol - centerCol;\n\t\tlet colorDistSq = dot(diff, diff);\n\t\tlet rangeWeight = exp(-0.5 * colorDistSq / (sigmaColor * sigmaColor));\n\t\t\n\t\tlet weight = spatialWeight * rangeWeight;\n\t\tcolor += sampleCol * weight;\n\t\ttotalWeight += weight;\n\t}\n\n\tvar blurred = centerCol;\n\tif (totalWeight > 0.0) {\n\t\tblurred = color / totalWeight;\n\t}\n\treturn applyPartialBlur(blurred, in.uv, dimensions);\n}\n`;\nconst EDGE_PRESERVING_SHADER = `\n${WGSL_BLUR_UNIFORMS}\n${FULLSCREEN_QUAD_WGSL}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet centerCol = textureSampleLevel(tex, samp, in.uv, 0.0);\n\tvar strength = u.strength;\n\tif (u.hasStrengthSig > 0.5) {\n\t\tstrength = textureSampleLevel(strengthSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\n\t// Map strength (1-10) to radius (1-6)\n\tlet radius = i32(clamp(round(strength * 5.0 / 10.0) + 1.0, 1.0, 6.0));\n\n\tlet dimensions = vec2<f32>(textureDimensions(tex));\n\tlet texelSize = 1.0 / dimensions;\n\n\tvar m0 = vec3<f32>(0.0); var m1 = vec3<f32>(0.0); var m2 = vec3<f32>(0.0); var m3 = vec3<f32>(0.0);\n\tvar s0 = vec3<f32>(0.0); var s1 = vec3<f32>(0.0); var s2 = vec3<f32>(0.0); var s3 = vec3<f32>(0.0);\n\n\tlet n = f32((radius + 1) * (radius + 1));\n\n\tfor (var j = -6; j <= 6; j++) {\n\t\tif (j < -radius || j > radius) { continue; }\n\t\tfor (var i = -6; i <= 6; i++) {\n\t\t\tif (i < -radius || i > radius) { continue; }\n\t\t\t\n\t\t\tlet c = textureSampleLevel(tex, samp, in.uv + vec2<f32>(f32(i), f32(j)) * texelSize, 0.0).rgb;\n\t\t\t\n\t\t\tif (i <= 0 && j <= 0) {\n\t\t\t\tm0 += c;\n\t\t\t\ts0 += c * c;\n\t\t\t}\n\t\t\tif (i >= 0 && j <= 0) {\n\t\t\t\tm1 += c;\n\t\t\t\ts1 += c * c;\n\t\t\t}\n\t\t\tif (i <= 0 && j >= 0) {\n\t\t\t\tm2 += c;\n\t\t\t\ts2 += c * c;\n\t\t\t}\n\t\t\tif (i >= 0 && j >= 0) {\n\t\t\t\tm3 += c;\n\t\t\t\ts3 += c * c;\n\t\t\t}\n\t\t}\n\t}\n\n\tm0 = m0 / n; s0 = abs(s0 / n - m0 * m0);\n\tm1 = m1 / n; s1 = abs(s1 / n - m1 * m1);\n\tm2 = m2 / n; s2 = abs(s2 / n - m2 * m2);\n\tm3 = m3 / n; s3 = abs(s3 / n - m3 * m3);\n\n\tlet v0 = s0.r + s0.g + s0.b;\n\tlet v1 = s1.r + s1.g + s1.b;\n\tlet v2 = s2.r + s2.g + s2.b;\n\tlet v3 = s3.r + s3.g + s3.b;\n\n\tvar minVar = v0;\n\tvar finalCol = m0;\n\n\tif (v1 < minVar) {\n\t\tminVar = v1;\n\t\tfinalCol = m1;\n\t}\n\tif (v2 < minVar) {\n\t\tminVar = v2;\n\t\tfinalCol = m2;\n\t}\n\tif (v3 < minVar) {\n\t\tminVar = v3;\n\t\tfinalCol = m3;\n\t}\n\n\tlet blurred = vec4<f32>(finalCol, centerCol.a);\n\treturn applyPartialBlur(blurred, in.uv, dimensions);\n}\n`;\nconst RADIAL_BLUR_SHADER = `\n${WGSL_BLUR_UNIFORMS}\n${FULLSCREEN_QUAD_WGSL}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet centerCol = textureSampleLevel(tex, samp, in.uv, 0.0);\n\tvar strength = u.strength;\n\tif (u.hasStrengthSig > 0.5) {\n\t\tstrength = textureSampleLevel(strengthSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\tvar centerX = u.centerX;\n\tif (u.hasCenterXSig > 0.5) {\n\t\tcenterX = textureSampleLevel(centerXSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\tvar centerY = u.centerY;\n\tif (u.hasCenterYSig > 0.5) {\n\t\tcenterY = textureSampleLevel(centerYSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\n\tlet dimensions = vec2<f32>(textureDimensions(tex));\n\tif (strength <= 0.0) {\n\t\treturn applyPartialBlur(centerCol, in.uv, dimensions);\n\t}\n\n\tlet center = vec2<f32>(centerX, centerY);\n\tlet toPixel = in.uv - center;\n\tlet dist = length(toPixel);\n\tif (dist <= 0.0) {\n\t\treturn applyPartialBlur(centerCol, in.uv, dimensions);\n\t}\n\n\tlet dir = vec2<f32>(-toPixel.y, toPixel.x);\n\tlet blurAmount = (strength / 100.0) * 0.1 * dist;\n\n\tlet numSamples = 24;\n\tvar color = vec4<f32>(0.0);\n\tlet step = dir * (blurAmount / f32(numSamples));\n\n\tfor (var i = 0; i < 24; i++) {\n\t\tlet offset = step * f32(i - 12);\n\t\tcolor += textureSampleLevel(tex, samp, in.uv + offset, 0.0);\n\t}\n\n\tlet blurred = color / 24.0;\n\treturn applyPartialBlur(blurred, in.uv, dimensions);\n}\n`;\nconst ZOOM_BLUR_SHADER = `\n${WGSL_BLUR_UNIFORMS}\n${FULLSCREEN_QUAD_WGSL}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet centerCol = textureSampleLevel(tex, samp, in.uv, 0.0);\n\tvar strength = u.strength;\n\tif (u.hasStrengthSig > 0.5) {\n\t\tstrength = textureSampleLevel(strengthSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\tvar centerX = u.centerX;\n\tif (u.hasCenterXSig > 0.5) {\n\t\tcenterX = textureSampleLevel(centerXSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\tvar centerY = u.centerY;\n\tif (u.hasCenterYSig > 0.5) {\n\t\tcenterY = textureSampleLevel(centerYSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\n\tlet dimensions = vec2<f32>(textureDimensions(tex));\n\tif (strength <= 0.0) {\n\t\treturn applyPartialBlur(centerCol, in.uv, dimensions);\n\t}\n\n\tlet center = vec2<f32>(centerX, centerY);\n\tlet toPixel = in.uv - center;\n\tlet blurAmount = (strength / 100.0) * 0.15;\n\n\tlet numSamples = 24;\n\tvar color = vec4<f32>(0.0);\n\tlet step = toPixel * (blurAmount / f32(numSamples));\n\n\tfor (var i = 0; i < 24; i++) {\n\t\tlet offset = step * f32(i - 12);\n\t\tcolor += textureSampleLevel(tex, samp, in.uv + offset, 0.0);\n\t}\n\n\tlet blurred = color / 24.0;\n\treturn applyPartialBlur(blurred, in.uv, dimensions);\n}\n`;\nconst getDeviceLayouts = perDevice((device) => ({\n\tblurUniformLayout: fragmentBindGroupLayout(device, [\"uniform\"]),\n\tsingleTextureLayout: fragmentBindGroupLayout(device, [\n\t\t\"texture\",\n\t\t\"sampler\",\n\t\t\"texture\"\n\t]),\n\tsignalTextureLayout: texturesLayout(device, 5),\n\tpipelineCache: /* @__PURE__ */ new Map()\n}));\nfunction getBlurResources(device, format, blurType) {\n\tconst layouts = getDeviceLayouts(device);\n\tconst cacheKey = `blur_${blurType}_${format}`;\n\tlet pipeline = layouts.pipelineCache.get(cacheKey);\n\tif (!pipeline) {\n\t\tlet code = GAUSSIAN_BLUR_SHADER;\n\t\tif (blurType === \"Box\") code = BOX_BLUR_SHADER;\n\t\telse if (blurType === \"Median\") code = MEDIAN_BLUR_SHADER;\n\t\telse if (blurType === \"Motion\") code = MOTION_BLUR_SHADER;\n\t\telse if (blurType === \"Bilateral\") code = BILATERAL_BLUR_SHADER;\n\t\telse if (blurType === \"Edge-preserving\") code = EDGE_PRESERVING_SHADER;\n\t\telse if (blurType === \"Radial\") code = RADIAL_BLUR_SHADER;\n\t\telse if (blurType === \"Zoom\") code = ZOOM_BLUR_SHADER;\n\t\tconst blurModule = device.createShaderModule({\n\t\t\tlabel: `blur_${blurType}_${format}.wgsl`,\n\t\t\tcode\n\t\t});\n\t\tpipeline = createFullscreenPipeline(device, {\n\t\t\tlabel: `BlurPipeline_${blurType}_${format}`,\n\t\t\tmodule: blurModule,\n\t\t\tlayouts: [\n\t\t\t\tlayouts.blurUniformLayout,\n\t\t\t\tlayouts.singleTextureLayout,\n\t\t\t\tlayouts.signalTextureLayout\n\t\t\t],\n\t\t\tformat\n\t\t});\n\t\tlayouts.pipelineCache.set(cacheKey, pipeline);\n\t}\n\treturn {\n\t\tblurPipeline: pipeline,\n\t\tblurUniformLayout: layouts.blurUniformLayout,\n\t\tsingleTextureLayout: layouts.singleTextureLayout,\n\t\tsignalTextureLayout: layouts.signalTextureLayout\n\t};\n}\nconst BlurWebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetTexture, targetWidth, targetHeight, props } = args;\n\tconst frame = props.frame ?? 0;\n\tconst compositionFrame = props.compositionFrame ?? frame;\n\tconst fps = props.fps || 30;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"Blur\" || !op) return;\n\tconst childMedia = props.virtualMedia.children?.[0];\n\tif (!childMedia) return;\n\tpass.end();\n\tconst blurData = new Float32Array(16);\n\tconst width = targetWidth;\n\tconst height = targetHeight;\n\tconst dpiScale = width / (props.containerWidth ?? ctx.surface.width / (typeof window !== \"undefined\" ? window.devicePixelRatio : 1));\n\tconst nodeId = op.inputs ? Object.keys(op.inputs)[0] : \"blur_node\";\n\tconst resolveBindable = (configKey, defaultValue, minVal, maxVal, scaleByDpi = false) => {\n\t\tconst handleId = op[`${configKey}HandleId`];\n\t\tconst input = handleId ? op.inputs?.[handleId] : null;\n\t\tconst hasSignal = !!(input?.connectionValid && (input.outputItem?.type === \"Signal\" || input.outputItem?.type === \"Numeric\"));\n\t\tconst sd = hasSignal && input?.outputItem?.data ? input.outputItem.data : null;\n\t\tlet val = defaultValue;\n\t\tlet hasStaticSig = false;\n\t\tlet gpuTextureView;\n\t\tif (!hasSignal) if (input?.connectionValid && input.outputItem?.type === \"Number\") {\n\t\t\tconst rawVal = Number(input.outputItem.data ?? defaultValue);\n\t\t\tval = Math.max(minVal, Math.min(maxVal, rawVal));\n\t\t\tif (scaleByDpi) val *= dpiScale;\n\t\t} else {\n\t\t\tconst unwrapped = unwrapFrameParam(op[configKey], compositionFrame, fps);\n\t\t\tif (unwrapped.gpuTextureView) {\n\t\t\t\tgpuTextureView = unwrapped.gpuTextureView;\n\t\t\t\thasStaticSig = true;\n\t\t\t}\n\t\t\tconst rawVal = unwrapped.value;\n\t\t\tconst numVal = Number(rawVal ?? defaultValue);\n\t\t\tval = Math.max(minVal, Math.min(maxVal, isNaN(numVal) ? defaultValue : numVal));\n\t\t\tif (scaleByDpi) val *= dpiScale;\n\t\t}\n\t\telse if (sd) {\n\t\t\tconst rawVal = Number(sd.offset ?? 0);\n\t\t\tval = Math.max(minVal, Math.min(maxVal, rawVal));\n\t\t\tif (scaleByDpi) val *= dpiScale;\n\t\t\thasStaticSig = true;\n\t\t}\n\t\treturn {\n\t\t\tval,\n\t\t\thasStaticSig,\n\t\t\tsd,\n\t\t\tgpuTextureView\n\t\t};\n\t};\n\tconst strengthRes = resolveBindable(\"strength\", 5, 0, MAX_BLUR, true);\n\tconst sigmaColorRes = resolveBindable(\"sigmaColor\", .1, .01, 1, false);\n\tconst centerXRes = resolveBindable(\"centerX\", .5, 0, 1, false);\n\tconst centerYRes = resolveBindable(\"centerY\", .5, 0, 1, false);\n\tconst radiusRes = resolveBindable(\"radius\", .3, .001, 1, false);\n\tconst radiusYRes = resolveBindable(\"radiusY\", 0, 0, 1, false);\n\tconst { texture: tmpTex } = await drawChildToTexture(args, childMedia);\n\tconst blurType = op.blurType ?? \"Gaussian\";\n\tconst isSeparable = blurType === \"Gaussian\" || blurType === \"Box\" || blurType === \"Median\" || blurType === \"Bilateral\";\n\tconst { blurPipeline: pipeline, blurUniformLayout: uLayout, singleTextureLayout: tLayout, signalTextureLayout: sigLayout } = getBlurResources(ctx.device, ctx.renderer.format, blurType);\n\tconst sampler = ctx.renderer.samplerCache.getSampler(ctx.device);\n\tconst { elapsedSeconds, durationSeconds } = signalTiming(props, frame, fps);\n\tfor (const bindableRes of [\n\t\tstrengthRes,\n\t\tsigmaColorRes,\n\t\tcenterXRes,\n\t\tcenterYRes,\n\t\tradiusRes\n\t]) if (bindableRes.hasStaticSig && bindableRes.sd) await signalRegistry.ensureAudioSourcesExtracted(ctx.device, bindableRes.sd, fps, props.renderId);\n\tconst signalContext = {\n\t\targs,\n\t\twidth,\n\t\theight,\n\t\tframe,\n\t\tfps,\n\t\telapsedSeconds,\n\t\tdurationSeconds\n\t};\n\tconst getSignalView = (res, suffix) => signalTextureView(signalContext, res, `${nodeId}_${suffix}`);\n\tconst strengthView = getSignalView(strengthRes, \"strength_sig\");\n\tconst sigmaColorView = getSignalView(sigmaColorRes, \"sigmacolor_sig\");\n\tconst centerXView = getSignalView(centerXRes, \"centerx_sig\");\n\tconst centerYView = getSignalView(centerYRes, \"centery_sig\");\n\tconst radiusView = getSignalView(radiusRes, \"radius_sig\");\n\tconst createBlurBindGroup1 = (inputTex, origTex) => 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: origTex.createView()\n\t\t\t}\n\t\t]\n\t});\n\tconst isPartial = Boolean(op.partialBlur && op.partialBlur !== \"false\" && op.partialBlur !== 0);\n\tblurData[2] = strengthRes.val;\n\tblurData[3] = Number(op.angle ?? 0);\n\tblurData[4] = sigmaColorRes.val;\n\tblurData[5] = centerXRes.val;\n\tblurData[6] = centerYRes.val;\n\tblurData[7] = radiusRes.val;\n\tblurData[8] = isPartial ? 1 : 0;\n\tblurData[9] = strengthRes.hasStaticSig ? 1 : 0;\n\tblurData[10] = sigmaColorRes.hasStaticSig ? 1 : 0;\n\tblurData[11] = centerXRes.hasStaticSig ? 1 : 0;\n\tblurData[12] = centerYRes.hasStaticSig ? 1 : 0;\n\tblurData[13] = radiusRes.hasStaticSig ? 1 : 0;\n\tblurData[14] = radiusYRes.val;\n\tblurData[15] = op.shape === \"rect\" ? 1 : 0;\n\tlet outTex2;\n\tif (isSeparable) {\n\t\tconst outTex1 = ctx.renderer.getTemporaryTexture(width, height, [\n\t\t\ttmpTex,\n\t\t\ttargetTexture,\n\t\t\t...props.excludeTextures || []\n\t\t]);\n\t\toutTex2 = ctx.renderer.getTemporaryTexture(width, height, [\n\t\t\ttmpTex,\n\t\t\toutTex1,\n\t\t\ttargetTexture,\n\t\t\t...props.excludeTextures || []\n\t\t]);\n\t\tblurData[0] = 1;\n\t\tblurData[1] = 0;\n\t\tblurData[8] = 0;\n\t\tconst hBuffer = ctx.renderer.getTemporaryBuffer(blurData);\n\t\tdrawFullscreenPass(encoder, outTex1.createView(), pipeline, [\n\t\t\tctx.device.createBindGroup({\n\t\t\t\tlayout: uLayout,\n\t\t\t\tentries: [{\n\t\t\t\t\tbinding: 0,\n\t\t\t\t\tresource: { buffer: hBuffer }\n\t\t\t\t}]\n\t\t\t}),\n\t\t\tcreateBlurBindGroup1(tmpTex, tmpTex),\n\t\t\tctx.device.createBindGroup({\n\t\t\t\tlayout: sigLayout,\n\t\t\t\tentries: [\n\t\t\t\t\t{\n\t\t\t\t\t\tbinding: 0,\n\t\t\t\t\t\tresource: strengthView\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tbinding: 1,\n\t\t\t\t\t\tresource: sigmaColorView\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tbinding: 2,\n\t\t\t\t\t\tresource: centerXView\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tbinding: 3,\n\t\t\t\t\t\tresource: centerYView\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tbinding: 4,\n\t\t\t\t\t\tresource: radiusView\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tbinding: 5,\n\t\t\t\t\t\tresource: sampler\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t})\n\t\t]);\n\t\tblurData[0] = 0;\n\t\tblurData[1] = 1;\n\t\tblurData[8] = isPartial ? 1 : 0;\n\t\tconst vBuffer = ctx.renderer.getTemporaryBuffer(blurData);\n\t\tdrawFullscreenPass(encoder, outTex2.createView(), pipeline, [\n\t\t\tctx.device.createBindGroup({\n\t\t\t\tlayout: uLayout,\n\t\t\t\tentries: [{\n\t\t\t\t\tbinding: 0,\n\t\t\t\t\tresource: { buffer: vBuffer }\n\t\t\t\t}]\n\t\t\t}),\n\t\t\tcreateBlurBindGroup1(outTex1, tmpTex),\n\t\t\tctx.device.createBindGroup({\n\t\t\t\tlayout: sigLayout,\n\t\t\t\tentries: [\n\t\t\t\t\t{\n\t\t\t\t\t\tbinding: 0,\n\t\t\t\t\t\tresource: strengthView\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tbinding: 1,\n\t\t\t\t\t\tresource: sigmaColorView\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tbinding: 2,\n\t\t\t\t\t\tresource: centerXView\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tbinding: 3,\n\t\t\t\t\t\tresource: centerYView\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tbinding: 4,\n\t\t\t\t\t\tresource: radiusView\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tbinding: 5,\n\t\t\t\t\t\tresource: sampler\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t})\n\t\t]);\n\t} else {\n\t\toutTex2 = ctx.renderer.getTemporaryTexture(width, height, [\n\t\t\ttmpTex,\n\t\t\ttargetTexture,\n\t\t\t...props.excludeTextures || []\n\t\t]);\n\t\tblurData[0] = 0;\n\t\tblurData[1] = 0;\n\t\tblurData[8] = isPartial ? 1 : 0;\n\t\tconst singleBuffer = ctx.renderer.getTemporaryBuffer(blurData);\n\t\tdrawFullscreenPass(encoder, outTex2.createView(), pipeline, [\n\t\t\tctx.device.createBindGroup({\n\t\t\t\tlayout: uLayout,\n\t\t\t\tentries: [{\n\t\t\t\t\tbinding: 0,\n\t\t\t\t\tresource: { buffer: singleBuffer }\n\t\t\t\t}]\n\t\t\t}),\n\t\t\tcreateBlurBindGroup1(tmpTex, tmpTex),\n\t\t\tctx.device.createBindGroup({\n\t\t\t\tlayout: sigLayout,\n\t\t\t\tentries: [\n\t\t\t\t\t{\n\t\t\t\t\t\tbinding: 0,\n\t\t\t\t\t\tresource: strengthView\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tbinding: 1,\n\t\t\t\t\t\tresource: sigmaColorView\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tbinding: 2,\n\t\t\t\t\t\tresource: centerXView\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tbinding: 3,\n\t\t\t\t\t\tresource: centerYView\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tbinding: 4,\n\t\t\t\t\t\tresource: radiusView\n\t\t\t\t\t},\n\t\t\t\t\t{\n\t\t\t\t\t\tbinding: 5,\n\t\t\t\t\t\tresource: sampler\n\t\t\t\t\t}\n\t\t\t\t]\n\t\t\t})\n\t\t]);\n\t}\n\tdrawTextureToTarget(args, outTex2, op.opacity ?? 1);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: BlurWebGPURenderer });\n\n//#endregion\nexport { MAX_BLUR as a, BlurResultSchema as i, BLUR_OUTPUT_TYPE_MAP as n, blurConfig as o, BlurNodeConfigSchema as r, renderers_default as t };\n//# sourceMappingURL=renderers-rcrwEq-B.mjs.map"],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import "./chunk-GBe2k3y8.mjs";
2
+ import "./dist-cjxDXQdx.mjs";
3
+ import { t as renderers_default } from "./renderers-CP8CFWDs-BA-4l6By.mjs";
4
+ import "./renderer-B-BcgA6d.mjs";
5
+
6
+ export { renderers_default as default };
@@ -1,7 +1,7 @@
1
1
  import "./chunk-GBe2k3y8.mjs";
2
2
  import { n as defineRenderer } from "./renderer-BSitV56h.mjs";
3
- import "./dist-DQlYw4eG.mjs";
4
- import { i as beginTargetPass, l as fragmentBindGroupLayout, o as drawChildToTexture, p as texturesLayout, t as FULLSCREEN_QUAD_WGSL } from "./gpu-AbcLcr1f.mjs";
3
+ import "./dist-cjxDXQdx.mjs";
4
+ import { i as beginTargetPass, l as fragmentBindGroupLayout, o as drawChildToTexture, p as texturesLayout, t as FULLSCREEN_QUAD_WGSL } from "./gpu-Du7GpVFW.mjs";
5
5
 
6
6
  //#region ../../nodes/node-channel-merger/dist/renderers-CFuJvvvy.mjs
7
7
  const COLOR_SPACE_MAP = {
@@ -290,4 +290,4 @@ var renderers_default = defineRenderer({ WebGPURenderer: ChannelMergerWebGPURend
290
290
 
291
291
  //#endregion
292
292
  export { ChannelMergerWebGPURenderer, renderers_default as default };
293
- //# sourceMappingURL=renderer-CPW9o3Lc.mjs.map
293
+ //# sourceMappingURL=renderer-CMT4QcpV.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-CPW9o3Lc.mjs","names":[],"sources":["../../../nodes/node-channel-merger/dist/renderers-CFuJvvvy.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { FULLSCREEN_QUAD_WGSL, beginTargetPass, drawChildToTexture, fragmentBindGroupLayout, texturesLayout } from \"@framefields/node-sdk/gpu\";\n\n//#region src/renderers/webgpu-renderer.ts\nconst COLOR_SPACE_MAP = {\n\tRGBA: 0,\n\tHSLA: 1,\n\tCMYK: 2,\n\tLAB: 3\n};\nconst WGSL_CHANNEL_MERGER = `\nstruct MergerUniforms {\n\tcolorSpace : f32, // 0=RGBA, 1=HSLA, 2=CMYK, 3=LAB\n\thasCh4 : f32, // 0 or 1\n\tdefaultCh4 : f32, // fallback value (1.0 for alpha, 0.0 for CMYK black)\n\t_pad0 : f32,\n};\n\n@group(0) @binding(0) var<uniform> u : MergerUniforms;\n@group(1) @binding(0) var tex1 : texture_2d<f32>;\n@group(1) @binding(1) var tex2 : texture_2d<f32>;\n@group(1) @binding(2) var tex3 : texture_2d<f32>;\n@group(1) @binding(3) var tex4 : texture_2d<f32>;\n@group(1) @binding(4) var samp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\nfn hue2rgb(p: f32, q: f32, t_in: f32) -> f32 {\n\tvar t = t_in;\n\tif (t < 0.0) { t = t + 1.0; }\n\tif (t > 1.0) { t = t - 1.0; }\n\tif (t < 1.0 / 6.0) { return p + (q - p) * 6.0 * t; }\n\tif (t < 1.0 / 2.0) { return q; }\n\tif (t < 2.0 / 3.0) { return p + (q - p) * (2.0 / 3.0 - t) * 6.0; }\n\treturn p;\n}\n\nfn hsl2rgb(h: f32, s: f32, l: f32) -> vec3<f32> {\n\tif (s <= 0.00001) {\n\t\treturn vec3<f32>(l, l, l);\n\t}\n\tlet q = select(l + s - l * s, l * (1.0 + s), l < 0.5);\n\tlet p = 2.0 * l - q;\n\tlet r = hue2rgb(p, q, h + 1.0 / 3.0);\n\tlet g = hue2rgb(p, q, h);\n\tlet b = hue2rgb(p, q, h - 1.0 / 3.0);\n\treturn vec3<f32>(clamp(r, 0.0, 1.0), clamp(g, 0.0, 1.0), clamp(b, 0.0, 1.0));\n}\n\nfn inv_lab_f(t: f32) -> f32 {\n\tlet t3 = t * t * t;\n\treturn select((t - 16.0 / 116.0) / 7.787, t3, t3 > 0.008856);\n}\n\nfn lin2srgb(v: f32) -> f32 {\n\tlet c = clamp(v, 0.0, 1.0);\n\treturn select(c * 12.92, 1.055 * pow(c, 1.0 / 2.4) - 0.055, c > 0.0031308);\n}\n\n@fragment fn fs(in: VSOut) -> @location(0) vec4<f32> {\n\tlet c1 = textureSample(tex1, samp, in.uv);\n\tlet c2 = textureSample(tex2, samp, in.uv);\n\tlet c3 = textureSample(tex3, samp, in.uv);\n\tlet c4 = textureSample(tex4, samp, in.uv);\n\n\tlet v1 = c1.r;\n\tlet v2 = c2.r;\n\tlet v3 = c3.r;\n\tlet v4 = select(u.defaultCh4, c4.r, u.hasCh4 > 0.5);\n\n\tlet cs = u32(u.colorSpace + 0.5);\n\n\tif (cs == 0u) { // RGBA\n\t\treturn vec4<f32>(clamp(v1, 0.0, 1.0), clamp(v2, 0.0, 1.0), clamp(v3, 0.0, 1.0), clamp(v4, 0.0, 1.0));\n\t} else if (cs == 1u) { // HSLA\n\t\tlet rgb = hsl2rgb(fract(v1), clamp(v2, 0.0, 1.0), clamp(v3, 0.0, 1.0));\n\t\treturn vec4<f32>(rgb, clamp(v4, 0.0, 1.0));\n\t} else if (cs == 2u) { // CMYK\n\t\tlet C = clamp(v1, 0.0, 1.0);\n\t\tlet M = clamp(v2, 0.0, 1.0);\n\t\tlet Y = clamp(v3, 0.0, 1.0);\n\t\tlet K = clamp(v4, 0.0, 1.0);\n\t\tlet r = (1.0 - C) * (1.0 - K);\n\t\tlet g = (1.0 - M) * (1.0 - K);\n\t\tlet b = (1.0 - Y) * (1.0 - K);\n\t\treturn vec4<f32>(clamp(r, 0.0, 1.0), clamp(g, 0.0, 1.0), clamp(b, 0.0, 1.0), 1.0);\n\t} else { // LAB\n\t\tlet L_norm = clamp(v1, 0.0, 1.0);\n\t\tlet a_norm = clamp(v2, 0.0, 1.0);\n\t\tlet b_norm = clamp(v3, 0.0, 1.0);\n\n\t\tlet L_star = L_norm * 100.0;\n\t\tlet a_star = a_norm * 255.0 - 128.0;\n\t\tlet b_star = b_norm * 255.0 - 128.0;\n\n\t\tlet fy = (L_star + 16.0) / 116.0;\n\t\tlet fx = fy + a_star / 500.0;\n\t\tlet fz = fy - b_star / 200.0;\n\n\t\tlet x = inv_lab_f(fx);\n\t\tlet y = inv_lab_f(fy);\n\t\tlet z = inv_lab_f(fz);\n\n\t\tlet X = x * 0.95047;\n\t\tlet Y = y * 1.00000;\n\t\tlet Z = z * 1.08883;\n\n\t\tlet lr = 3.2404542 * X - 1.5371385 * Y - 0.4985314 * Z;\n\t\tlet lg = -0.9692660 * X + 1.8760108 * Y + 0.0415560 * Z;\n\t\tlet lb = 0.0556434 * X - 0.2040259 * Y + 1.0572252 * Z;\n\n\t\treturn vec4<f32>(lin2srgb(lr), lin2srgb(lg), lin2srgb(lb), clamp(v4, 0.0, 1.0));\n\t}\n}\n`;\nconst deviceResourceCache = /* @__PURE__ */ new WeakMap();\nconst uniformData = new Float32Array(4);\nfunction getDeviceLayouts(device) {\n\tlet res = deviceResourceCache.get(device);\n\tif (res) return res;\n\tres = {\n\t\tuniformLayout: fragmentBindGroupLayout(device, [\"uniform\"]),\n\t\ttextureLayout: texturesLayout(device, 4),\n\t\tpipelineCache: /* @__PURE__ */ new Map()\n\t};\n\tdeviceResourceCache.set(device, res);\n\treturn res;\n}\nfunction getPipeline(device, format) {\n\tconst resources = getDeviceLayouts(device);\n\tconst key = `merger_${format}`;\n\tlet pipeline = resources.pipelineCache.get(key);\n\tif (!pipeline) {\n\t\tconst module = device.createShaderModule({\n\t\t\tlabel: \"ChannelMergerShader\",\n\t\t\tcode: WGSL_CHANNEL_MERGER\n\t\t});\n\t\tconst layout = device.createPipelineLayout({ bindGroupLayouts: [resources.uniformLayout, resources.textureLayout] });\n\t\tpipeline = device.createRenderPipeline({\n\t\t\tlabel: \"ChannelMergerPipeline\",\n\t\t\tlayout,\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-strip\" }\n\t\t});\n\t\tresources.pipelineCache.set(key, pipeline);\n\t}\n\treturn {\n\t\tpipeline,\n\t\tresources\n\t};\n}\nconst ChannelMergerWebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetTexture, targetWidth, targetHeight, props, drawChild } = args;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"ChannelMerger\" || !op) return;\n\tconst ch1Media = op.channel1Media ?? props.virtualMedia.children?.[0];\n\tconst ch2Media = op.channel2Media;\n\tconst ch3Media = op.channel3Media;\n\tconst ch4Media = op.channel4Media;\n\tif (!ch1Media || !ch2Media || !ch3Media) return;\n\tpass.end();\n\tconst width = targetWidth;\n\tconst height = targetHeight;\n\tconst { texture: tex1, view: view1 } = await drawChildToTexture(args, ch1Media, { props: {\n\t\t...props,\n\t\tvirtualMedia: ch1Media,\n\t\trenderId: `${props.renderId}-ch1`\n\t} });\n\targs.pass.end();\n\tconst { texture: tex2, view: view2 } = await drawChildToTexture(args, ch2Media, {\n\t\tprops: {\n\t\t\t...props,\n\t\t\tvirtualMedia: ch2Media,\n\t\t\trenderId: `${props.renderId}-ch2`,\n\t\t\texcludeTextures: [...props.excludeTextures || [], tex1]\n\t\t},\n\t\texclude: [tex1]\n\t});\n\targs.pass.end();\n\tconst { texture: tex3, view: view3 } = await drawChildToTexture(args, ch3Media, {\n\t\tprops: {\n\t\t\t...props,\n\t\t\tvirtualMedia: ch3Media,\n\t\t\trenderId: `${props.renderId}-ch3`,\n\t\t\texcludeTextures: [\n\t\t\t\t...props.excludeTextures || [],\n\t\t\t\ttex1,\n\t\t\t\ttex2\n\t\t\t]\n\t\t},\n\t\texclude: [tex1, tex2]\n\t});\n\targs.pass.end();\n\tconst tex4 = ctx.renderer.getTemporaryTexture(width, height, [\n\t\t...props.excludeTextures || [],\n\t\ttargetTexture,\n\t\ttex1,\n\t\ttex2,\n\t\ttex3\n\t]);\n\tconst view4 = tex4.createView();\n\tctx.renderer.beginFrame(encoder, view4, {\n\t\tr: 0,\n\t\tg: 0,\n\t\tb: 0,\n\t\ta: 0\n\t}, width, height, \"clear\").end();\n\tconst hasCh4 = ch4Media ? 1 : 0;\n\tif (ch4Media) {\n\t\tctx.renderer.pushScissor({\n\t\t\tx: 0,\n\t\t\ty: 0,\n\t\t\twidth,\n\t\t\theight\n\t\t});\n\t\tctx.renderer.pushIdentity();\n\t\tawait drawChild(ch4Media, {\n\t\t\t...props,\n\t\t\tvirtualMedia: ch4Media,\n\t\t\trenderId: `${props.renderId}-ch4`,\n\t\t\texcludeTextures: [\n\t\t\t\t...props.excludeTextures || [],\n\t\t\t\ttex1,\n\t\t\t\ttex2,\n\t\t\t\ttex3,\n\t\t\t\ttex4\n\t\t\t]\n\t\t}, view4, tex4, width, height);\n\t\tctx.renderer.popTransform();\n\t\tctx.renderer.popScissor();\n\t\targs.pass.end();\n\t}\n\tconst colorSpace = op.colorSpace ?? \"RGBA\";\n\tconst defaultCh4 = op.defaultChannel4 ?? (colorSpace === \"CMYK\" ? 0 : 1);\n\tuniformData[0] = COLOR_SPACE_MAP[colorSpace] ?? 0;\n\tuniformData[1] = hasCh4;\n\tuniformData[2] = defaultCh4;\n\tuniformData[3] = 0;\n\tconst uniformBuffer = ctx.renderer.getTemporaryBuffer(uniformData);\n\tconst { pipeline, resources } = getPipeline(ctx.device, targetTexture.format);\n\tconst uniformBindGroup = ctx.device.createBindGroup({\n\t\tlayout: resources.uniformLayout,\n\t\tentries: [{\n\t\t\tbinding: 0,\n\t\t\tresource: { buffer: uniformBuffer }\n\t\t}]\n\t});\n\tconst sampler = ctx.renderer.samplerCache.getSampler(ctx.device);\n\tconst textureBindGroup = ctx.device.createBindGroup({\n\t\tlayout: resources.textureLayout,\n\t\tentries: [\n\t\t\t{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: view1\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 1,\n\t\t\t\tresource: view2\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 2,\n\t\t\t\tresource: view3\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 3,\n\t\t\t\tresource: view4\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 4,\n\t\t\t\tresource: sampler\n\t\t\t}\n\t\t]\n\t});\n\tconst finalPass = beginTargetPass(args);\n\tfinalPass.setPipeline(pipeline);\n\tfinalPass.setBindGroup(0, uniformBindGroup);\n\tfinalPass.setBindGroup(1, textureBindGroup);\n\tfinalPass.draw(4, 1, 0, 0);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: ChannelMergerWebGPURenderer });\n\n//#endregion\nexport { ChannelMergerWebGPURenderer as n, renderers_default as t };\n//# sourceMappingURL=renderers-CFuJvvvy.mjs.map"],"mappings":"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"}
1
+ {"version":3,"file":"renderer-CMT4QcpV.mjs","names":[],"sources":["../../../nodes/node-channel-merger/dist/renderers-CFuJvvvy.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { FULLSCREEN_QUAD_WGSL, beginTargetPass, drawChildToTexture, fragmentBindGroupLayout, texturesLayout } from \"@framefields/node-sdk/gpu\";\n\n//#region src/renderers/webgpu-renderer.ts\nconst COLOR_SPACE_MAP = {\n\tRGBA: 0,\n\tHSLA: 1,\n\tCMYK: 2,\n\tLAB: 3\n};\nconst WGSL_CHANNEL_MERGER = `\nstruct MergerUniforms {\n\tcolorSpace : f32, // 0=RGBA, 1=HSLA, 2=CMYK, 3=LAB\n\thasCh4 : f32, // 0 or 1\n\tdefaultCh4 : f32, // fallback value (1.0 for alpha, 0.0 for CMYK black)\n\t_pad0 : f32,\n};\n\n@group(0) @binding(0) var<uniform> u : MergerUniforms;\n@group(1) @binding(0) var tex1 : texture_2d<f32>;\n@group(1) @binding(1) var tex2 : texture_2d<f32>;\n@group(1) @binding(2) var tex3 : texture_2d<f32>;\n@group(1) @binding(3) var tex4 : texture_2d<f32>;\n@group(1) @binding(4) var samp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\nfn hue2rgb(p: f32, q: f32, t_in: f32) -> f32 {\n\tvar t = t_in;\n\tif (t < 0.0) { t = t + 1.0; }\n\tif (t > 1.0) { t = t - 1.0; }\n\tif (t < 1.0 / 6.0) { return p + (q - p) * 6.0 * t; }\n\tif (t < 1.0 / 2.0) { return q; }\n\tif (t < 2.0 / 3.0) { return p + (q - p) * (2.0 / 3.0 - t) * 6.0; }\n\treturn p;\n}\n\nfn hsl2rgb(h: f32, s: f32, l: f32) -> vec3<f32> {\n\tif (s <= 0.00001) {\n\t\treturn vec3<f32>(l, l, l);\n\t}\n\tlet q = select(l + s - l * s, l * (1.0 + s), l < 0.5);\n\tlet p = 2.0 * l - q;\n\tlet r = hue2rgb(p, q, h + 1.0 / 3.0);\n\tlet g = hue2rgb(p, q, h);\n\tlet b = hue2rgb(p, q, h - 1.0 / 3.0);\n\treturn vec3<f32>(clamp(r, 0.0, 1.0), clamp(g, 0.0, 1.0), clamp(b, 0.0, 1.0));\n}\n\nfn inv_lab_f(t: f32) -> f32 {\n\tlet t3 = t * t * t;\n\treturn select((t - 16.0 / 116.0) / 7.787, t3, t3 > 0.008856);\n}\n\nfn lin2srgb(v: f32) -> f32 {\n\tlet c = clamp(v, 0.0, 1.0);\n\treturn select(c * 12.92, 1.055 * pow(c, 1.0 / 2.4) - 0.055, c > 0.0031308);\n}\n\n@fragment fn fs(in: VSOut) -> @location(0) vec4<f32> {\n\tlet c1 = textureSample(tex1, samp, in.uv);\n\tlet c2 = textureSample(tex2, samp, in.uv);\n\tlet c3 = textureSample(tex3, samp, in.uv);\n\tlet c4 = textureSample(tex4, samp, in.uv);\n\n\tlet v1 = c1.r;\n\tlet v2 = c2.r;\n\tlet v3 = c3.r;\n\tlet v4 = select(u.defaultCh4, c4.r, u.hasCh4 > 0.5);\n\n\tlet cs = u32(u.colorSpace + 0.5);\n\n\tif (cs == 0u) { // RGBA\n\t\treturn vec4<f32>(clamp(v1, 0.0, 1.0), clamp(v2, 0.0, 1.0), clamp(v3, 0.0, 1.0), clamp(v4, 0.0, 1.0));\n\t} else if (cs == 1u) { // HSLA\n\t\tlet rgb = hsl2rgb(fract(v1), clamp(v2, 0.0, 1.0), clamp(v3, 0.0, 1.0));\n\t\treturn vec4<f32>(rgb, clamp(v4, 0.0, 1.0));\n\t} else if (cs == 2u) { // CMYK\n\t\tlet C = clamp(v1, 0.0, 1.0);\n\t\tlet M = clamp(v2, 0.0, 1.0);\n\t\tlet Y = clamp(v3, 0.0, 1.0);\n\t\tlet K = clamp(v4, 0.0, 1.0);\n\t\tlet r = (1.0 - C) * (1.0 - K);\n\t\tlet g = (1.0 - M) * (1.0 - K);\n\t\tlet b = (1.0 - Y) * (1.0 - K);\n\t\treturn vec4<f32>(clamp(r, 0.0, 1.0), clamp(g, 0.0, 1.0), clamp(b, 0.0, 1.0), 1.0);\n\t} else { // LAB\n\t\tlet L_norm = clamp(v1, 0.0, 1.0);\n\t\tlet a_norm = clamp(v2, 0.0, 1.0);\n\t\tlet b_norm = clamp(v3, 0.0, 1.0);\n\n\t\tlet L_star = L_norm * 100.0;\n\t\tlet a_star = a_norm * 255.0 - 128.0;\n\t\tlet b_star = b_norm * 255.0 - 128.0;\n\n\t\tlet fy = (L_star + 16.0) / 116.0;\n\t\tlet fx = fy + a_star / 500.0;\n\t\tlet fz = fy - b_star / 200.0;\n\n\t\tlet x = inv_lab_f(fx);\n\t\tlet y = inv_lab_f(fy);\n\t\tlet z = inv_lab_f(fz);\n\n\t\tlet X = x * 0.95047;\n\t\tlet Y = y * 1.00000;\n\t\tlet Z = z * 1.08883;\n\n\t\tlet lr = 3.2404542 * X - 1.5371385 * Y - 0.4985314 * Z;\n\t\tlet lg = -0.9692660 * X + 1.8760108 * Y + 0.0415560 * Z;\n\t\tlet lb = 0.0556434 * X - 0.2040259 * Y + 1.0572252 * Z;\n\n\t\treturn vec4<f32>(lin2srgb(lr), lin2srgb(lg), lin2srgb(lb), clamp(v4, 0.0, 1.0));\n\t}\n}\n`;\nconst deviceResourceCache = /* @__PURE__ */ new WeakMap();\nconst uniformData = new Float32Array(4);\nfunction getDeviceLayouts(device) {\n\tlet res = deviceResourceCache.get(device);\n\tif (res) return res;\n\tres = {\n\t\tuniformLayout: fragmentBindGroupLayout(device, [\"uniform\"]),\n\t\ttextureLayout: texturesLayout(device, 4),\n\t\tpipelineCache: /* @__PURE__ */ new Map()\n\t};\n\tdeviceResourceCache.set(device, res);\n\treturn res;\n}\nfunction getPipeline(device, format) {\n\tconst resources = getDeviceLayouts(device);\n\tconst key = `merger_${format}`;\n\tlet pipeline = resources.pipelineCache.get(key);\n\tif (!pipeline) {\n\t\tconst module = device.createShaderModule({\n\t\t\tlabel: \"ChannelMergerShader\",\n\t\t\tcode: WGSL_CHANNEL_MERGER\n\t\t});\n\t\tconst layout = device.createPipelineLayout({ bindGroupLayouts: [resources.uniformLayout, resources.textureLayout] });\n\t\tpipeline = device.createRenderPipeline({\n\t\t\tlabel: \"ChannelMergerPipeline\",\n\t\t\tlayout,\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-strip\" }\n\t\t});\n\t\tresources.pipelineCache.set(key, pipeline);\n\t}\n\treturn {\n\t\tpipeline,\n\t\tresources\n\t};\n}\nconst ChannelMergerWebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetTexture, targetWidth, targetHeight, props, drawChild } = args;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"ChannelMerger\" || !op) return;\n\tconst ch1Media = op.channel1Media ?? props.virtualMedia.children?.[0];\n\tconst ch2Media = op.channel2Media;\n\tconst ch3Media = op.channel3Media;\n\tconst ch4Media = op.channel4Media;\n\tif (!ch1Media || !ch2Media || !ch3Media) return;\n\tpass.end();\n\tconst width = targetWidth;\n\tconst height = targetHeight;\n\tconst { texture: tex1, view: view1 } = await drawChildToTexture(args, ch1Media, { props: {\n\t\t...props,\n\t\tvirtualMedia: ch1Media,\n\t\trenderId: `${props.renderId}-ch1`\n\t} });\n\targs.pass.end();\n\tconst { texture: tex2, view: view2 } = await drawChildToTexture(args, ch2Media, {\n\t\tprops: {\n\t\t\t...props,\n\t\t\tvirtualMedia: ch2Media,\n\t\t\trenderId: `${props.renderId}-ch2`,\n\t\t\texcludeTextures: [...props.excludeTextures || [], tex1]\n\t\t},\n\t\texclude: [tex1]\n\t});\n\targs.pass.end();\n\tconst { texture: tex3, view: view3 } = await drawChildToTexture(args, ch3Media, {\n\t\tprops: {\n\t\t\t...props,\n\t\t\tvirtualMedia: ch3Media,\n\t\t\trenderId: `${props.renderId}-ch3`,\n\t\t\texcludeTextures: [\n\t\t\t\t...props.excludeTextures || [],\n\t\t\t\ttex1,\n\t\t\t\ttex2\n\t\t\t]\n\t\t},\n\t\texclude: [tex1, tex2]\n\t});\n\targs.pass.end();\n\tconst tex4 = ctx.renderer.getTemporaryTexture(width, height, [\n\t\t...props.excludeTextures || [],\n\t\ttargetTexture,\n\t\ttex1,\n\t\ttex2,\n\t\ttex3\n\t]);\n\tconst view4 = tex4.createView();\n\tctx.renderer.beginFrame(encoder, view4, {\n\t\tr: 0,\n\t\tg: 0,\n\t\tb: 0,\n\t\ta: 0\n\t}, width, height, \"clear\").end();\n\tconst hasCh4 = ch4Media ? 1 : 0;\n\tif (ch4Media) {\n\t\tctx.renderer.pushScissor({\n\t\t\tx: 0,\n\t\t\ty: 0,\n\t\t\twidth,\n\t\t\theight\n\t\t});\n\t\tctx.renderer.pushIdentity();\n\t\tawait drawChild(ch4Media, {\n\t\t\t...props,\n\t\t\tvirtualMedia: ch4Media,\n\t\t\trenderId: `${props.renderId}-ch4`,\n\t\t\texcludeTextures: [\n\t\t\t\t...props.excludeTextures || [],\n\t\t\t\ttex1,\n\t\t\t\ttex2,\n\t\t\t\ttex3,\n\t\t\t\ttex4\n\t\t\t]\n\t\t}, view4, tex4, width, height);\n\t\tctx.renderer.popTransform();\n\t\tctx.renderer.popScissor();\n\t\targs.pass.end();\n\t}\n\tconst colorSpace = op.colorSpace ?? \"RGBA\";\n\tconst defaultCh4 = op.defaultChannel4 ?? (colorSpace === \"CMYK\" ? 0 : 1);\n\tuniformData[0] = COLOR_SPACE_MAP[colorSpace] ?? 0;\n\tuniformData[1] = hasCh4;\n\tuniformData[2] = defaultCh4;\n\tuniformData[3] = 0;\n\tconst uniformBuffer = ctx.renderer.getTemporaryBuffer(uniformData);\n\tconst { pipeline, resources } = getPipeline(ctx.device, targetTexture.format);\n\tconst uniformBindGroup = ctx.device.createBindGroup({\n\t\tlayout: resources.uniformLayout,\n\t\tentries: [{\n\t\t\tbinding: 0,\n\t\t\tresource: { buffer: uniformBuffer }\n\t\t}]\n\t});\n\tconst sampler = ctx.renderer.samplerCache.getSampler(ctx.device);\n\tconst textureBindGroup = ctx.device.createBindGroup({\n\t\tlayout: resources.textureLayout,\n\t\tentries: [\n\t\t\t{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: view1\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 1,\n\t\t\t\tresource: view2\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 2,\n\t\t\t\tresource: view3\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 3,\n\t\t\t\tresource: view4\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 4,\n\t\t\t\tresource: sampler\n\t\t\t}\n\t\t]\n\t});\n\tconst finalPass = beginTargetPass(args);\n\tfinalPass.setPipeline(pipeline);\n\tfinalPass.setBindGroup(0, uniformBindGroup);\n\tfinalPass.setBindGroup(1, textureBindGroup);\n\tfinalPass.draw(4, 1, 0, 0);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: ChannelMergerWebGPURenderer });\n\n//#endregion\nexport { ChannelMergerWebGPURenderer as n, renderers_default as t };\n//# sourceMappingURL=renderers-CFuJvvvy.mjs.map"],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import "./chunk-GBe2k3y8.mjs";
2
+ import "./dist-cjxDXQdx.mjs";
3
+ import { t as renderers_default } from "./renderer-BerD3T-X.mjs";
4
+
5
+ export { renderers_default as default };
@@ -0,0 +1,5 @@
1
+ import "./chunk-GBe2k3y8.mjs";
2
+ import "./dist-cjxDXQdx.mjs";
3
+ import { t as renderers_default } from "./renderer-BiwIh_w4.mjs";
4
+
5
+ export { renderers_default as default };
@@ -0,0 +1,5 @@
1
+ import "./chunk-GBe2k3y8.mjs";
2
+ import "./dist-cjxDXQdx.mjs";
3
+ import { t as renderers_default } from "./renderer-p_C_T9Kn.mjs";
4
+
5
+ export { renderers_default as default };
@@ -0,0 +1,5 @@
1
+ import "./chunk-GBe2k3y8.mjs";
2
+ import "./dist-cjxDXQdx.mjs";
3
+ import { t as renderers_default } from "./renderer-jqByPgkD.mjs";
4
+
5
+ export { renderers_default as default };
@@ -1,6 +1,6 @@
1
1
  import { Jt as resolveNumber } from "./dist-fjKpBYkc.mjs";
2
2
  import { n as defineRenderer, r as isHandleConnected } from "./renderer-BSitV56h.mjs";
3
- import { g as WebGPUAudioProcessor } from "./dist-DQlYw4eG.mjs";
3
+ import { g as WebGPUAudioProcessor } from "./dist-cjxDXQdx.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-BKd2nRnO.mjs.map
251
+ //# sourceMappingURL=renderer-CWBHVCvA.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-BKd2nRnO.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-CWBHVCvA.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,7 +1,7 @@
1
1
  import { n as defineRenderer } from "./renderer-BSitV56h.mjs";
2
2
  import { a as configBuilder, i as VideoResultSchema, n as ImageResultSchema } from "./dist-BY0bIWgr.mjs";
3
- import { J as probeVideoSize } from "./dist-DQlYw4eG.mjs";
4
- import { a as createFullscreenPipeline, c as drawTextureToTarget, l as fragmentBindGroupLayout, o as drawChildToTexture, s as drawFullscreenPass, t as FULLSCREEN_QUAD_WGSL } from "./gpu-AbcLcr1f.mjs";
3
+ import { Y as probeVideoSize } from "./dist-cjxDXQdx.mjs";
4
+ import { a as createFullscreenPipeline, c as drawTextureToTarget, l as fragmentBindGroupLayout, o as drawChildToTexture, s as drawFullscreenPass, t as FULLSCREEN_QUAD_WGSL } from "./gpu-Du7GpVFW.mjs";
5
5
  import { z } from "zod";
6
6
 
7
7
  //#region ../../nodes/node-rotate/dist/renderers-D7DemTXH.mjs
@@ -180,4 +180,4 @@ var renderers_default = defineRenderer({ WebGPURenderer });
180
180
 
181
181
  //#endregion
182
182
  export { renderers_default as t };
183
- //# sourceMappingURL=renderer-B5PFBOjv.mjs.map
183
+ //# sourceMappingURL=renderer-Cce2fgpX.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-B5PFBOjv.mjs","names":[],"sources":["../../../nodes/node-rotate/dist/renderers-D7DemTXH.mjs"],"sourcesContent":["import { ImageResultSchema, VideoResultSchema, configBuilder } from \"@framefields/node-sdk\";\nimport { z } from \"zod\";\nimport { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { FULLSCREEN_QUAD_WGSL, createFullscreenPipeline, drawChildToTexture, drawFullscreenPass, drawTextureToTarget, fragmentBindGroupLayout } from \"@framefields/node-sdk/gpu\";\nimport { probeVideoSize } from \"@framefields/webgpu-renderers\";\n\n//#region src/shared/config.ts\nconst rotateConfig = configBuilder().field(\"angle\", z.number().default(90), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Angle Signal\",\n\tdescription: \"Rotation in degrees about the frame center, clockwise. Any value; 90 / 180 / 270 fix footage shot sideways or upside down.\"\n}).field(\"fit\", z.enum([\n\t\"cover\",\n\t\"contain\",\n\t\"fill\"\n]).default(\"cover\"), { description: \"How the rotated source sits in the output: cover fills it (cropping the overhang), contain shows all of it (transparent margins), fill keeps the unrotated source stretched to the output and only turns it.\" }).field(\"scale\", z.number().min(.01).max(20).default(1), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Scale Signal\",\n\tdescription: \"Extra zoom applied after the fit (1 = exactly fitted).\"\n}).build();\nconst RotateNodeConfigSchema = rotateConfig.schema;\nconst RotateResultSchema = z.union([ImageResultSchema, VideoResultSchema]);\nconst ROTATE_OUTPUT_TYPE_MAP = {\n\tVideo: \"Video\",\n\tLottie: \"Video\",\n\tGIF: \"GIF\",\n\tImage: \"Image\",\n\tSVG: \"Image\"\n};\n/**\n* Size (px) of the rotated source inside a `targetWidth × targetHeight` output.\n* `cover` is the smallest size whose rotated rectangle still covers the whole\n* output; `contain` the largest whose rotated bounding box fits inside it.\n*/\nfunction rotatedSourceSize(sourceWidth, sourceHeight, targetWidth, targetHeight, angleDeg, fit) {\n\tif (fit === \"fill\") return {\n\t\twidth: targetWidth,\n\t\theight: targetHeight\n\t};\n\tconst rad = angleDeg * Math.PI / 180;\n\tconst c = Math.abs(Math.cos(rad));\n\tconst s = Math.abs(Math.sin(rad));\n\tconst k = fit === \"cover\" ? Math.max((c * targetWidth + s * targetHeight) / sourceWidth, (s * targetWidth + c * targetHeight) / sourceHeight) : Math.min(targetWidth / (c * sourceWidth + s * sourceHeight), targetHeight / (s * sourceWidth + c * sourceHeight));\n\treturn {\n\t\twidth: sourceWidth * k,\n\t\theight: sourceHeight * k\n\t};\n}\n\n//#endregion\n//#region src/renderers/webgpu-renderer.ts\nconst WGSL_ROTATE_SHADER = `\nstruct RotateUniforms {\n\toutSize: vec2<f32>,\n\tsize : vec2<f32>,\n\tcs : vec2<f32>,\n\t_pad : vec2<f32>,\n};\n\n@group(0) @binding(0) var<uniform> u : RotateUniforms;\n@group(1) @binding(0) var tex : texture_2d<f32>;\n@group(1) @binding(1) var samp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet p = (in.uv - vec2<f32>(0.5)) * u.outSize;\n\t// Clockwise on screen (y down): undo it with the transpose.\n\tlet q = vec2<f32>(u.cs.x * p.x + u.cs.y * p.y, -u.cs.y * p.x + u.cs.x * p.y);\n\tlet uv = q / u.size + vec2<f32>(0.5);\n\t// Distance (output px) inside the source rectangle's nearest edge.\n\tlet edge = (vec2<f32>(0.5) - abs(uv - vec2<f32>(0.5))) * u.size;\n\tlet coverage = clamp(min(edge.x, edge.y) + 0.5, 0.0, 1.0);\n\tlet color = textureSampleLevel(tex, samp, clamp(uv, vec2<f32>(0.0), vec2<f32>(1.0)), 0.0);\n\t// Premultiplied: coverage scales every channel.\n\treturn color * coverage;\n}\n`;\nconst deviceResourceCache = /* @__PURE__ */ new WeakMap();\nconst uniformData = new Float32Array(8);\nfunction getRotateResources(device, targetFormat) {\n\tconst cached = deviceResourceCache.get(device);\n\tif (cached) return cached;\n\tconst uniformLayout = fragmentBindGroupLayout(device, [\"uniform\"]);\n\tconst textureLayout = fragmentBindGroupLayout(device, [\"texture\", \"sampler\"]);\n\tconst res = {\n\t\tuniformLayout,\n\t\ttextureLayout,\n\t\tpipeline: createFullscreenPipeline(device, {\n\t\t\tmodule: device.createShaderModule({ code: WGSL_ROTATE_SHADER }),\n\t\t\tlayouts: [uniformLayout, textureLayout],\n\t\t\tformat: targetFormat\n\t\t})\n\t};\n\tdeviceResourceCache.set(device, res);\n\treturn res;\n}\nfunction resolveNumber(raw, fallback, frame, fps) {\n\tconst value = typeof raw === \"function\" ? raw(frame, fps) : raw !== null && typeof raw === \"object\" ? \"get\" in raw && typeof raw.get === \"function\" ? raw.get({\n\t\tframe,\n\t\tfps\n\t}) : \"value\" in raw ? raw.value : raw : raw;\n\tconst n = Number(value ?? fallback);\n\treturn Number.isFinite(n) ? n : fallback;\n}\n/**\n* The child's own size: the nearest stated metadata down the chain, else the\n* source file's display size. A layer built from a bare path states none, and\n* guessing the layer box would turn a 16:9 clip into a squeezed 9:16 one.\n*/\nasync function intrinsicSize(media) {\n\tfor (let node = media; node;) {\n\t\tconst { width, height } = node.metadata ?? {};\n\t\tif (width && height) return {\n\t\t\twidth,\n\t\t\theight\n\t\t};\n\t\tconst op = node.operation;\n\t\tif (op.op === \"source\") {\n\t\t\tconst url = typeof op.url === \"string\" ? op.url : op.source;\n\t\t\treturn typeof url === \"string\" ? probeVideoSize(url) : null;\n\t\t}\n\t\tnode = node.children?.[0];\n\t}\n\treturn null;\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 !== \"Rotate\" || !op) return;\n\tconst childMedia = props.virtualMedia.children?.[0];\n\tif (!childMedia) return;\n\tpass.end();\n\tconst frame = props.frame ?? 0;\n\tconst compositionFrame = props.compositionFrame ?? frame;\n\tconst fps = props.fps || 30;\n\tconst width = targetWidth;\n\tconst height = targetHeight;\n\tconst intrinsic = await intrinsicSize(childMedia);\n\tconst sourceWidth = intrinsic?.width ?? props.containerWidth ?? width;\n\tconst sourceHeight = intrinsic?.height ?? props.containerHeight ?? height;\n\tconst { texture: childTex } = await drawChildToTexture(args, childMedia, {\n\t\twidth: sourceWidth,\n\t\theight: sourceHeight,\n\t\tprops: {\n\t\t\t...props,\n\t\t\tcontainerWidth: sourceWidth,\n\t\t\tcontainerHeight: sourceHeight,\n\t\t\tvirtualMedia: childMedia\n\t\t}\n\t});\n\tconst angle = resolveNumber(op.angle, 90, compositionFrame, fps);\n\tconst scale = Math.max(.01, resolveNumber(op.scale, 1, compositionFrame, fps));\n\tconst size = rotatedSourceSize(sourceWidth, sourceHeight, width, height, angle, op.fit ?? \"cover\");\n\tconst rad = angle * Math.PI / 180;\n\tuniformData[0] = width;\n\tuniformData[1] = height;\n\tuniformData[2] = size.width * scale;\n\tuniformData[3] = size.height * scale;\n\tuniformData[4] = Math.cos(rad);\n\tuniformData[5] = Math.sin(rad);\n\tconst { pipeline, uniformLayout, textureLayout } = getRotateResources(ctx.device, ctx.renderer.format);\n\tconst uBindGroup = ctx.device.createBindGroup({\n\t\tlayout: uniformLayout,\n\t\tentries: [{\n\t\t\tbinding: 0,\n\t\t\tresource: { buffer: ctx.renderer.getTemporaryBuffer(uniformData) }\n\t\t}]\n\t});\n\tconst tBindGroup = ctx.device.createBindGroup({\n\t\tlayout: textureLayout,\n\t\tentries: [{\n\t\t\tbinding: 0,\n\t\t\tresource: childTex.createView()\n\t\t}, {\n\t\t\tbinding: 1,\n\t\t\tresource: ctx.renderer.samplerCache.getSampler(ctx.device)\n\t\t}]\n\t});\n\tconst outTex = ctx.renderer.getTemporaryTexture(width, height, [\n\t\tchildTex,\n\t\ttargetTexture,\n\t\t...props.excludeTextures || []\n\t]);\n\tdrawFullscreenPass(encoder, outTex.createView(), pipeline, [uBindGroup, tBindGroup]);\n\tdrawTextureToTarget(args, outTex, op.opacity ?? 1);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer });\n\n//#endregion\nexport { rotateConfig as a, RotateResultSchema as i, ROTATE_OUTPUT_TYPE_MAP as n, rotatedSourceSize as o, RotateNodeConfigSchema as r, renderers_default as t };\n//# sourceMappingURL=renderers-D7DemTXH.mjs.map"],"mappings":"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"}
1
+ {"version":3,"file":"renderer-Cce2fgpX.mjs","names":[],"sources":["../../../nodes/node-rotate/dist/renderers-D7DemTXH.mjs"],"sourcesContent":["import { ImageResultSchema, VideoResultSchema, configBuilder } from \"@framefields/node-sdk\";\nimport { z } from \"zod\";\nimport { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { FULLSCREEN_QUAD_WGSL, createFullscreenPipeline, drawChildToTexture, drawFullscreenPass, drawTextureToTarget, fragmentBindGroupLayout } from \"@framefields/node-sdk/gpu\";\nimport { probeVideoSize } from \"@framefields/webgpu-renderers\";\n\n//#region src/shared/config.ts\nconst rotateConfig = configBuilder().field(\"angle\", z.number().default(90), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Angle Signal\",\n\tdescription: \"Rotation in degrees about the frame center, clockwise. Any value; 90 / 180 / 270 fix footage shot sideways or upside down.\"\n}).field(\"fit\", z.enum([\n\t\"cover\",\n\t\"contain\",\n\t\"fill\"\n]).default(\"cover\"), { description: \"How the rotated source sits in the output: cover fills it (cropping the overhang), contain shows all of it (transparent margins), fill keeps the unrotated source stretched to the output and only turns it.\" }).field(\"scale\", z.number().min(.01).max(20).default(1), {\n\tbindable: true,\n\tdataTypes: [\"Number\", \"Signal\"],\n\tlabel: \"Scale Signal\",\n\tdescription: \"Extra zoom applied after the fit (1 = exactly fitted).\"\n}).build();\nconst RotateNodeConfigSchema = rotateConfig.schema;\nconst RotateResultSchema = z.union([ImageResultSchema, VideoResultSchema]);\nconst ROTATE_OUTPUT_TYPE_MAP = {\n\tVideo: \"Video\",\n\tLottie: \"Video\",\n\tGIF: \"GIF\",\n\tImage: \"Image\",\n\tSVG: \"Image\"\n};\n/**\n* Size (px) of the rotated source inside a `targetWidth × targetHeight` output.\n* `cover` is the smallest size whose rotated rectangle still covers the whole\n* output; `contain` the largest whose rotated bounding box fits inside it.\n*/\nfunction rotatedSourceSize(sourceWidth, sourceHeight, targetWidth, targetHeight, angleDeg, fit) {\n\tif (fit === \"fill\") return {\n\t\twidth: targetWidth,\n\t\theight: targetHeight\n\t};\n\tconst rad = angleDeg * Math.PI / 180;\n\tconst c = Math.abs(Math.cos(rad));\n\tconst s = Math.abs(Math.sin(rad));\n\tconst k = fit === \"cover\" ? Math.max((c * targetWidth + s * targetHeight) / sourceWidth, (s * targetWidth + c * targetHeight) / sourceHeight) : Math.min(targetWidth / (c * sourceWidth + s * sourceHeight), targetHeight / (s * sourceWidth + c * sourceHeight));\n\treturn {\n\t\twidth: sourceWidth * k,\n\t\theight: sourceHeight * k\n\t};\n}\n\n//#endregion\n//#region src/renderers/webgpu-renderer.ts\nconst WGSL_ROTATE_SHADER = `\nstruct RotateUniforms {\n\toutSize: vec2<f32>,\n\tsize : vec2<f32>,\n\tcs : vec2<f32>,\n\t_pad : vec2<f32>,\n};\n\n@group(0) @binding(0) var<uniform> u : RotateUniforms;\n@group(1) @binding(0) var tex : texture_2d<f32>;\n@group(1) @binding(1) var samp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet p = (in.uv - vec2<f32>(0.5)) * u.outSize;\n\t// Clockwise on screen (y down): undo it with the transpose.\n\tlet q = vec2<f32>(u.cs.x * p.x + u.cs.y * p.y, -u.cs.y * p.x + u.cs.x * p.y);\n\tlet uv = q / u.size + vec2<f32>(0.5);\n\t// Distance (output px) inside the source rectangle's nearest edge.\n\tlet edge = (vec2<f32>(0.5) - abs(uv - vec2<f32>(0.5))) * u.size;\n\tlet coverage = clamp(min(edge.x, edge.y) + 0.5, 0.0, 1.0);\n\tlet color = textureSampleLevel(tex, samp, clamp(uv, vec2<f32>(0.0), vec2<f32>(1.0)), 0.0);\n\t// Premultiplied: coverage scales every channel.\n\treturn color * coverage;\n}\n`;\nconst deviceResourceCache = /* @__PURE__ */ new WeakMap();\nconst uniformData = new Float32Array(8);\nfunction getRotateResources(device, targetFormat) {\n\tconst cached = deviceResourceCache.get(device);\n\tif (cached) return cached;\n\tconst uniformLayout = fragmentBindGroupLayout(device, [\"uniform\"]);\n\tconst textureLayout = fragmentBindGroupLayout(device, [\"texture\", \"sampler\"]);\n\tconst res = {\n\t\tuniformLayout,\n\t\ttextureLayout,\n\t\tpipeline: createFullscreenPipeline(device, {\n\t\t\tmodule: device.createShaderModule({ code: WGSL_ROTATE_SHADER }),\n\t\t\tlayouts: [uniformLayout, textureLayout],\n\t\t\tformat: targetFormat\n\t\t})\n\t};\n\tdeviceResourceCache.set(device, res);\n\treturn res;\n}\nfunction resolveNumber(raw, fallback, frame, fps) {\n\tconst value = typeof raw === \"function\" ? raw(frame, fps) : raw !== null && typeof raw === \"object\" ? \"get\" in raw && typeof raw.get === \"function\" ? raw.get({\n\t\tframe,\n\t\tfps\n\t}) : \"value\" in raw ? raw.value : raw : raw;\n\tconst n = Number(value ?? fallback);\n\treturn Number.isFinite(n) ? n : fallback;\n}\n/**\n* The child's own size: the nearest stated metadata down the chain, else the\n* source file's display size. A layer built from a bare path states none, and\n* guessing the layer box would turn a 16:9 clip into a squeezed 9:16 one.\n*/\nasync function intrinsicSize(media) {\n\tfor (let node = media; node;) {\n\t\tconst { width, height } = node.metadata ?? {};\n\t\tif (width && height) return {\n\t\t\twidth,\n\t\t\theight\n\t\t};\n\t\tconst op = node.operation;\n\t\tif (op.op === \"source\") {\n\t\t\tconst url = typeof op.url === \"string\" ? op.url : op.source;\n\t\t\treturn typeof url === \"string\" ? probeVideoSize(url) : null;\n\t\t}\n\t\tnode = node.children?.[0];\n\t}\n\treturn null;\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 !== \"Rotate\" || !op) return;\n\tconst childMedia = props.virtualMedia.children?.[0];\n\tif (!childMedia) return;\n\tpass.end();\n\tconst frame = props.frame ?? 0;\n\tconst compositionFrame = props.compositionFrame ?? frame;\n\tconst fps = props.fps || 30;\n\tconst width = targetWidth;\n\tconst height = targetHeight;\n\tconst intrinsic = await intrinsicSize(childMedia);\n\tconst sourceWidth = intrinsic?.width ?? props.containerWidth ?? width;\n\tconst sourceHeight = intrinsic?.height ?? props.containerHeight ?? height;\n\tconst { texture: childTex } = await drawChildToTexture(args, childMedia, {\n\t\twidth: sourceWidth,\n\t\theight: sourceHeight,\n\t\tprops: {\n\t\t\t...props,\n\t\t\tcontainerWidth: sourceWidth,\n\t\t\tcontainerHeight: sourceHeight,\n\t\t\tvirtualMedia: childMedia\n\t\t}\n\t});\n\tconst angle = resolveNumber(op.angle, 90, compositionFrame, fps);\n\tconst scale = Math.max(.01, resolveNumber(op.scale, 1, compositionFrame, fps));\n\tconst size = rotatedSourceSize(sourceWidth, sourceHeight, width, height, angle, op.fit ?? \"cover\");\n\tconst rad = angle * Math.PI / 180;\n\tuniformData[0] = width;\n\tuniformData[1] = height;\n\tuniformData[2] = size.width * scale;\n\tuniformData[3] = size.height * scale;\n\tuniformData[4] = Math.cos(rad);\n\tuniformData[5] = Math.sin(rad);\n\tconst { pipeline, uniformLayout, textureLayout } = getRotateResources(ctx.device, ctx.renderer.format);\n\tconst uBindGroup = ctx.device.createBindGroup({\n\t\tlayout: uniformLayout,\n\t\tentries: [{\n\t\t\tbinding: 0,\n\t\t\tresource: { buffer: ctx.renderer.getTemporaryBuffer(uniformData) }\n\t\t}]\n\t});\n\tconst tBindGroup = ctx.device.createBindGroup({\n\t\tlayout: textureLayout,\n\t\tentries: [{\n\t\t\tbinding: 0,\n\t\t\tresource: childTex.createView()\n\t\t}, {\n\t\t\tbinding: 1,\n\t\t\tresource: ctx.renderer.samplerCache.getSampler(ctx.device)\n\t\t}]\n\t});\n\tconst outTex = ctx.renderer.getTemporaryTexture(width, height, [\n\t\tchildTex,\n\t\ttargetTexture,\n\t\t...props.excludeTextures || []\n\t]);\n\tdrawFullscreenPass(encoder, outTex.createView(), pipeline, [uBindGroup, tBindGroup]);\n\tdrawTextureToTarget(args, outTex, op.opacity ?? 1);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer });\n\n//#endregion\nexport { rotateConfig as a, RotateResultSchema as i, ROTATE_OUTPUT_TYPE_MAP as n, rotatedSourceSize as o, RotateNodeConfigSchema as r, renderers_default as t };\n//# sourceMappingURL=renderers-D7DemTXH.mjs.map"],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import "./chunk-GBe2k3y8.mjs";
2
+ import "./dist-cjxDXQdx.mjs";
3
+ import { t as renderers_default } from "./renderer-BteUC_7n.mjs";
4
+
5
+ export { renderers_default as default };
@@ -1,6 +1,6 @@
1
1
  import { Jt as resolveNumber, Kt as resolveBoolean } from "./dist-fjKpBYkc.mjs";
2
2
  import { n as defineRenderer, r as isHandleConnected } from "./renderer-BSitV56h.mjs";
3
- import { g as WebGPUAudioProcessor } from "./dist-DQlYw4eG.mjs";
3
+ import { g as WebGPUAudioProcessor } from "./dist-cjxDXQdx.mjs";
4
4
 
5
5
  //#region ../../nodes/node-audio-delay/dist/renderers-DXaKpV2A.mjs
6
6
  const PARAM_ORDER = [
@@ -217,4 +217,4 @@ var renderers_default = defineRenderer({ audioProcessor: delayAudioProcessor });
217
217
 
218
218
  //#endregion
219
219
  export { renderers_default as t };
220
- //# sourceMappingURL=renderer-egZPy7vq.mjs.map
220
+ //# sourceMappingURL=renderer-CebB0v1y.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-egZPy7vq.mjs","names":[],"sources":["../../../nodes/node-audio-delay/dist/renderers-DXaKpV2A.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { isHandleConnected, resolveBoolean, resolveNumber } from \"@framefields/node-sdk\";\nimport { WebGPUAudioProcessor } from \"@framefields/webgpu-renderers\";\n\n//#region src/renderers/audio-processor.ts\nconst PARAM_ORDER = [\n\t\"delayTime\",\n\t\"feedback\",\n\t\"wet\",\n\t\"dry\"\n];\nconst DELAY_SHADER_TEMPLATE = () => `\nstruct Uniforms {\n sampleRate : f32,\n delaySec : f32,\n feedback : f32,\n wet : f32,\n dry : f32,\n pingPong : f32,\n bufferLength : f32,\n hasDelayTimeSig : f32,\n hasFeedbackSig : f32,\n hasWetSig : f32,\n hasDrySig : f32,\n baseTime : f32,\n frame : f32,\n numSamples : f32,\n numChannels : f32,\n pad1 : 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> delayTimeSignal : array<f32>;\n@group(0) @binding(5) var<storage, read> feedbackSignal : array<f32>;\n@group(0) @binding(6) var<storage, read> wetSignal : array<f32>;\n@group(0) @binding(7) var<storage, read> drySignal : array<f32>;\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 bufferLength = u32(u.bufferLength);\n\n var writeIndex = u32(state[0]);\n if (is_nan_or_inf(state[0])) {\n writeIndex = 0u;\n }\n\n for (var index = 0u; index < numSamples; index = index + 1u) {\n // 1. Dynamic Parameter Modulation & Anti-Explosion Clamping\n var effDelaySec = u.delaySec;\n if (u.hasDelayTimeSig > 0.5f) {\n effDelaySec = delayTimeSignal[index];\n }\n effDelaySec = clamp(effDelaySec, 0.001f, 5.0f);\n\n var effFeedback = u.feedback;\n if (u.hasFeedbackSig > 0.5f) {\n effFeedback = feedbackSignal[index];\n }\n effFeedback = clamp(effFeedback, 0.0f, 0.95f);\n\n var effWet = u.wet;\n if (u.hasWetSig > 0.5f) {\n effWet = wetSignal[index];\n }\n effWet = clamp(effWet, 0.0f, 2.0f);\n\n var effDry = u.dry;\n if (u.hasDrySig > 0.5f) {\n effDry = drySignal[index];\n }\n effDry = clamp(effDry, 0.0f, 2.0f);\n\n // 2. Safe Dynamic Read Index\n let readOffset = u32(clamp(effDelaySec * u.sampleRate, 1.0f, f32(bufferLength - 1u)));\n let readIndex = (writeIndex + bufferLength - readOffset) % bufferLength;\n\n if (numChannels == 1u || u.pingPong == 0.0f) {\n // Standard Delay\n for (var c = 0u; c < numChannels; c = c + 1u) {\n let sampleIndex = c * numSamples + index;\n var inputVal = inputChannels[sampleIndex];\n if (is_nan_or_inf(inputVal)) {\n inputVal = 0.0f;\n }\n\n let stateOffset = c * bufferLength + 1u;\n var delayedSample = state[stateOffset + readIndex];\n if (is_nan_or_inf(delayedSample)) {\n delayedSample = 0.0f;\n }\n\n var nextStateVal = inputVal + delayedSample * effFeedback;\n if (is_nan_or_inf(nextStateVal)) {\n nextStateVal = 0.0f;\n }\n state[stateOffset + writeIndex] = clamp(nextStateVal, -4.0f, 4.0f);\n\n var outVal = effDry * inputVal + effWet * delayedSample;\n if (is_nan_or_inf(outVal)) {\n outVal = 0.0f;\n }\n if (outVal > 1.0f) {\n outVal = 1.0f;\n } else if (outVal < -1.0f) {\n outVal = -1.0f;\n } else if (outVal > 0.9f) {\n outVal = 0.9f + 0.1f * tanh((outVal - 0.9f) / 0.1f);\n } else if (outVal < -0.9f) {\n outVal = -0.9f + 0.1f * tanh((outVal + 0.9f) / 0.1f);\n }\n\n outputChannels[sampleIndex] = outVal;\n }\n } else {\n // Stereo Ping-Pong Delay\n var sampleL = inputChannels[index];\n if (is_nan_or_inf(sampleL)) { sampleL = 0.0f; }\n\n var sampleR = inputChannels[numSamples + index];\n if (is_nan_or_inf(sampleR)) { sampleR = 0.0f; }\n\n var delayedL = state[1u + readIndex];\n if (is_nan_or_inf(delayedL)) { delayedL = 0.0f; }\n\n var delayedR = state[bufferLength + 1u + readIndex];\n if (is_nan_or_inf(delayedR)) { delayedR = 0.0f; }\n\n // Ping-pong cross-feedback\n var nextL = sampleL + delayedR * effFeedback;\n var nextR = sampleR + delayedL * effFeedback;\n if (is_nan_or_inf(nextL)) { nextL = 0.0f; }\n if (is_nan_or_inf(nextR)) { nextR = 0.0f; }\n\n state[1u + writeIndex] = clamp(nextL, -4.0f, 4.0f);\n state[bufferLength + 1u + writeIndex] = clamp(nextR, -4.0f, 4.0f);\n\n var outL = effDry * sampleL + effWet * delayedL;\n var outR = effDry * sampleR + effWet * delayedR;\n if (is_nan_or_inf(outL)) { outL = 0.0f; }\n if (is_nan_or_inf(outR)) { outR = 0.0f; }\n\n if (outL > 1.0f) { outL = 1.0f; } else if (outL < -1.0f) { outL = -1.0f; }\n else if (outL > 0.9f) { outL = 0.9f + 0.1f * tanh((outL - 0.9f) / 0.1f); }\n else if (outL < -0.9f) { outL = -0.9f + 0.1f * tanh((outL + 0.9f) / 0.1f); }\n\n if (outR > 1.0f) { outR = 1.0f; } else if (outR < -1.0f) { outR = -1.0f; }\n else if (outR > 0.9f) { outR = 0.9f + 0.1f * tanh((outR - 0.9f) / 0.1f); }\n else if (outR < -0.9f) { outR = -0.9f + 0.1f * tanh((outR + 0.9f) / 0.1f); }\n\n outputChannels[index] = outL;\n outputChannels[numSamples + index] = outR;\n }\n\n writeIndex = (writeIndex + 1u) % bufferLength;\n }\n\n state[0] = f32(writeIndex);\n}\n`;\nconst delayAudioProcessor = async (channels, sampleRate, virtualMedia, ctx) => {\n\tif (!ctx?.device) throw new Error(\"GPUDevice is required for WebGPU Audio Delay.\");\n\tconst op = virtualMedia.operation || {};\n\tconst numChannels = channels.length;\n\tif (numChannels === 0) return;\n\tconst numSamples = channels[0].length;\n\tif (numSamples === 0) return;\n\tconst delaySec = Math.max(.001, Math.min(resolveNumber(op.delayTime, .25), 5));\n\tconst feedbackInternal = Math.max(0, Math.min(resolveNumber(op.feedback, .4), .95));\n\tconst wetInternal = Math.max(0, Math.min(resolveNumber(op.wet, .3), 1));\n\tconst dryInternal = Math.max(0, Math.min(resolveNumber(op.dry, 1), 1));\n\tconst pingPongInternal = resolveBoolean(op.pingPong, false);\n\tconst hasDelayTimeSig = isHandleConnected(op, \"delayTimeHandleId\") ? 1 : 0;\n\tconst hasFeedbackSig = isHandleConnected(op, \"feedbackHandleId\") ? 1 : 0;\n\tconst hasWetSig = isHandleConnected(op, \"wetHandleId\") ? 1 : 0;\n\tconst hasDrySig = isHandleConnected(op, \"dryHandleId\") ? 1 : 0;\n\tconst bufferLength = Math.ceil(5 * sampleRate);\n\tconst nodeId = op.id || \"audio-delay\";\n\tconst frame = ctx.frame ?? 0;\n\tconst fps = ctx.fps ?? 24;\n\tconst stateFloatCount = numChannels * bufferLength + 1;\n\tawait WebGPUAudioProcessor.process(ctx.device, nodeId, channels, sampleRate, virtualMedia, frame, fps, DELAY_SHADER_TEMPLATE, () => [\n\t\tsampleRate,\n\t\tdelaySec,\n\t\tfeedbackInternal,\n\t\twetInternal,\n\t\tdryInternal,\n\t\tpingPongInternal ? 1 : 0,\n\t\tbufferLength,\n\t\thasDelayTimeSig,\n\t\thasFeedbackSig,\n\t\thasWetSig,\n\t\thasDrySig,\n\t\t0,\n\t\tframe,\n\t\tnumSamples,\n\t\tnumChannels,\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: delayAudioProcessor });\n\n//#endregion\nexport { renderers_default as t };\n//# sourceMappingURL=renderers-DXaKpV2A.mjs.map"],"mappings":";;;;;AAKA,MAAM,cAAc;CACnB;CACA;CACA;CACA;CACA;AACD,MAAM,8BAA8B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoKpC,MAAM,sBAAsB,OAAO,UAAU,YAAY,cAAc,QAAQ;AAC9E,KAAI,CAAC,KAAK,OAAQ,OAAM,IAAI,MAAM,gDAAgD;CAClF,MAAM,KAAK,aAAa,aAAa,EAAE;CACvC,MAAM,cAAc,SAAS;AAC7B,KAAI,gBAAgB,EAAG;CACvB,MAAM,aAAa,SAAS,GAAG;AAC/B,KAAI,eAAe,EAAG;CACtB,MAAM,WAAW,KAAK,IAAI,MAAM,KAAK,IAAI,cAAc,GAAG,WAAW,IAAI,EAAE,EAAE,CAAC;CAC9E,MAAM,mBAAmB,KAAK,IAAI,GAAG,KAAK,IAAI,cAAc,GAAG,UAAU,GAAG,EAAE,IAAI,CAAC;CACnF,MAAM,cAAc,KAAK,IAAI,GAAG,KAAK,IAAI,cAAc,GAAG,KAAK,GAAG,EAAE,EAAE,CAAC;CACvE,MAAM,cAAc,KAAK,IAAI,GAAG,KAAK,IAAI,cAAc,GAAG,KAAK,EAAE,EAAE,EAAE,CAAC;CACtE,MAAM,mBAAmB,eAAe,GAAG,UAAU,MAAM;CAC3D,MAAM,kBAAkB,kBAAkB,IAAI,oBAAoB,GAAG,IAAI;CACzE,MAAM,iBAAiB,kBAAkB,IAAI,mBAAmB,GAAG,IAAI;CACvE,MAAM,YAAY,kBAAkB,IAAI,cAAc,GAAG,IAAI;CAC7D,MAAM,YAAY,kBAAkB,IAAI,cAAc,GAAG,IAAI;CAC7D,MAAM,eAAe,KAAK,KAAK,IAAI,WAAW;CAC9C,MAAM,SAAS,GAAG,MAAM;CACxB,MAAM,QAAQ,IAAI,SAAS;CAC3B,MAAM,MAAM,IAAI,OAAO;CACvB,MAAM,kBAAkB,cAAc,eAAe;AACrD,OAAM,qBAAqB,QAAQ,IAAI,QAAQ,QAAQ,UAAU,YAAY,cAAc,OAAO,KAAK,6BAA6B;EACnI;EACA;EACA;EACA;EACA;EACA,mBAAmB,IAAI;EACvB;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,qBAAqB,CAAC"}
1
+ {"version":3,"file":"renderer-CebB0v1y.mjs","names":[],"sources":["../../../nodes/node-audio-delay/dist/renderers-DXaKpV2A.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { isHandleConnected, resolveBoolean, resolveNumber } from \"@framefields/node-sdk\";\nimport { WebGPUAudioProcessor } from \"@framefields/webgpu-renderers\";\n\n//#region src/renderers/audio-processor.ts\nconst PARAM_ORDER = [\n\t\"delayTime\",\n\t\"feedback\",\n\t\"wet\",\n\t\"dry\"\n];\nconst DELAY_SHADER_TEMPLATE = () => `\nstruct Uniforms {\n sampleRate : f32,\n delaySec : f32,\n feedback : f32,\n wet : f32,\n dry : f32,\n pingPong : f32,\n bufferLength : f32,\n hasDelayTimeSig : f32,\n hasFeedbackSig : f32,\n hasWetSig : f32,\n hasDrySig : f32,\n baseTime : f32,\n frame : f32,\n numSamples : f32,\n numChannels : f32,\n pad1 : 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> delayTimeSignal : array<f32>;\n@group(0) @binding(5) var<storage, read> feedbackSignal : array<f32>;\n@group(0) @binding(6) var<storage, read> wetSignal : array<f32>;\n@group(0) @binding(7) var<storage, read> drySignal : array<f32>;\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 bufferLength = u32(u.bufferLength);\n\n var writeIndex = u32(state[0]);\n if (is_nan_or_inf(state[0])) {\n writeIndex = 0u;\n }\n\n for (var index = 0u; index < numSamples; index = index + 1u) {\n // 1. Dynamic Parameter Modulation & Anti-Explosion Clamping\n var effDelaySec = u.delaySec;\n if (u.hasDelayTimeSig > 0.5f) {\n effDelaySec = delayTimeSignal[index];\n }\n effDelaySec = clamp(effDelaySec, 0.001f, 5.0f);\n\n var effFeedback = u.feedback;\n if (u.hasFeedbackSig > 0.5f) {\n effFeedback = feedbackSignal[index];\n }\n effFeedback = clamp(effFeedback, 0.0f, 0.95f);\n\n var effWet = u.wet;\n if (u.hasWetSig > 0.5f) {\n effWet = wetSignal[index];\n }\n effWet = clamp(effWet, 0.0f, 2.0f);\n\n var effDry = u.dry;\n if (u.hasDrySig > 0.5f) {\n effDry = drySignal[index];\n }\n effDry = clamp(effDry, 0.0f, 2.0f);\n\n // 2. Safe Dynamic Read Index\n let readOffset = u32(clamp(effDelaySec * u.sampleRate, 1.0f, f32(bufferLength - 1u)));\n let readIndex = (writeIndex + bufferLength - readOffset) % bufferLength;\n\n if (numChannels == 1u || u.pingPong == 0.0f) {\n // Standard Delay\n for (var c = 0u; c < numChannels; c = c + 1u) {\n let sampleIndex = c * numSamples + index;\n var inputVal = inputChannels[sampleIndex];\n if (is_nan_or_inf(inputVal)) {\n inputVal = 0.0f;\n }\n\n let stateOffset = c * bufferLength + 1u;\n var delayedSample = state[stateOffset + readIndex];\n if (is_nan_or_inf(delayedSample)) {\n delayedSample = 0.0f;\n }\n\n var nextStateVal = inputVal + delayedSample * effFeedback;\n if (is_nan_or_inf(nextStateVal)) {\n nextStateVal = 0.0f;\n }\n state[stateOffset + writeIndex] = clamp(nextStateVal, -4.0f, 4.0f);\n\n var outVal = effDry * inputVal + effWet * delayedSample;\n if (is_nan_or_inf(outVal)) {\n outVal = 0.0f;\n }\n if (outVal > 1.0f) {\n outVal = 1.0f;\n } else if (outVal < -1.0f) {\n outVal = -1.0f;\n } else if (outVal > 0.9f) {\n outVal = 0.9f + 0.1f * tanh((outVal - 0.9f) / 0.1f);\n } else if (outVal < -0.9f) {\n outVal = -0.9f + 0.1f * tanh((outVal + 0.9f) / 0.1f);\n }\n\n outputChannels[sampleIndex] = outVal;\n }\n } else {\n // Stereo Ping-Pong Delay\n var sampleL = inputChannels[index];\n if (is_nan_or_inf(sampleL)) { sampleL = 0.0f; }\n\n var sampleR = inputChannels[numSamples + index];\n if (is_nan_or_inf(sampleR)) { sampleR = 0.0f; }\n\n var delayedL = state[1u + readIndex];\n if (is_nan_or_inf(delayedL)) { delayedL = 0.0f; }\n\n var delayedR = state[bufferLength + 1u + readIndex];\n if (is_nan_or_inf(delayedR)) { delayedR = 0.0f; }\n\n // Ping-pong cross-feedback\n var nextL = sampleL + delayedR * effFeedback;\n var nextR = sampleR + delayedL * effFeedback;\n if (is_nan_or_inf(nextL)) { nextL = 0.0f; }\n if (is_nan_or_inf(nextR)) { nextR = 0.0f; }\n\n state[1u + writeIndex] = clamp(nextL, -4.0f, 4.0f);\n state[bufferLength + 1u + writeIndex] = clamp(nextR, -4.0f, 4.0f);\n\n var outL = effDry * sampleL + effWet * delayedL;\n var outR = effDry * sampleR + effWet * delayedR;\n if (is_nan_or_inf(outL)) { outL = 0.0f; }\n if (is_nan_or_inf(outR)) { outR = 0.0f; }\n\n if (outL > 1.0f) { outL = 1.0f; } else if (outL < -1.0f) { outL = -1.0f; }\n else if (outL > 0.9f) { outL = 0.9f + 0.1f * tanh((outL - 0.9f) / 0.1f); }\n else if (outL < -0.9f) { outL = -0.9f + 0.1f * tanh((outL + 0.9f) / 0.1f); }\n\n if (outR > 1.0f) { outR = 1.0f; } else if (outR < -1.0f) { outR = -1.0f; }\n else if (outR > 0.9f) { outR = 0.9f + 0.1f * tanh((outR - 0.9f) / 0.1f); }\n else if (outR < -0.9f) { outR = -0.9f + 0.1f * tanh((outR + 0.9f) / 0.1f); }\n\n outputChannels[index] = outL;\n outputChannels[numSamples + index] = outR;\n }\n\n writeIndex = (writeIndex + 1u) % bufferLength;\n }\n\n state[0] = f32(writeIndex);\n}\n`;\nconst delayAudioProcessor = async (channels, sampleRate, virtualMedia, ctx) => {\n\tif (!ctx?.device) throw new Error(\"GPUDevice is required for WebGPU Audio Delay.\");\n\tconst op = virtualMedia.operation || {};\n\tconst numChannels = channels.length;\n\tif (numChannels === 0) return;\n\tconst numSamples = channels[0].length;\n\tif (numSamples === 0) return;\n\tconst delaySec = Math.max(.001, Math.min(resolveNumber(op.delayTime, .25), 5));\n\tconst feedbackInternal = Math.max(0, Math.min(resolveNumber(op.feedback, .4), .95));\n\tconst wetInternal = Math.max(0, Math.min(resolveNumber(op.wet, .3), 1));\n\tconst dryInternal = Math.max(0, Math.min(resolveNumber(op.dry, 1), 1));\n\tconst pingPongInternal = resolveBoolean(op.pingPong, false);\n\tconst hasDelayTimeSig = isHandleConnected(op, \"delayTimeHandleId\") ? 1 : 0;\n\tconst hasFeedbackSig = isHandleConnected(op, \"feedbackHandleId\") ? 1 : 0;\n\tconst hasWetSig = isHandleConnected(op, \"wetHandleId\") ? 1 : 0;\n\tconst hasDrySig = isHandleConnected(op, \"dryHandleId\") ? 1 : 0;\n\tconst bufferLength = Math.ceil(5 * sampleRate);\n\tconst nodeId = op.id || \"audio-delay\";\n\tconst frame = ctx.frame ?? 0;\n\tconst fps = ctx.fps ?? 24;\n\tconst stateFloatCount = numChannels * bufferLength + 1;\n\tawait WebGPUAudioProcessor.process(ctx.device, nodeId, channels, sampleRate, virtualMedia, frame, fps, DELAY_SHADER_TEMPLATE, () => [\n\t\tsampleRate,\n\t\tdelaySec,\n\t\tfeedbackInternal,\n\t\twetInternal,\n\t\tdryInternal,\n\t\tpingPongInternal ? 1 : 0,\n\t\tbufferLength,\n\t\thasDelayTimeSig,\n\t\thasFeedbackSig,\n\t\thasWetSig,\n\t\thasDrySig,\n\t\t0,\n\t\tframe,\n\t\tnumSamples,\n\t\tnumChannels,\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: delayAudioProcessor });\n\n//#endregion\nexport { renderers_default as t };\n//# sourceMappingURL=renderers-DXaKpV2A.mjs.map"],"mappings":";;;;;AAKA,MAAM,cAAc;CACnB;CACA;CACA;CACA;CACA;AACD,MAAM,8BAA8B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoKpC,MAAM,sBAAsB,OAAO,UAAU,YAAY,cAAc,QAAQ;AAC9E,KAAI,CAAC,KAAK,OAAQ,OAAM,IAAI,MAAM,gDAAgD;CAClF,MAAM,KAAK,aAAa,aAAa,EAAE;CACvC,MAAM,cAAc,SAAS;AAC7B,KAAI,gBAAgB,EAAG;CACvB,MAAM,aAAa,SAAS,GAAG;AAC/B,KAAI,eAAe,EAAG;CACtB,MAAM,WAAW,KAAK,IAAI,MAAM,KAAK,IAAI,cAAc,GAAG,WAAW,IAAI,EAAE,EAAE,CAAC;CAC9E,MAAM,mBAAmB,KAAK,IAAI,GAAG,KAAK,IAAI,cAAc,GAAG,UAAU,GAAG,EAAE,IAAI,CAAC;CACnF,MAAM,cAAc,KAAK,IAAI,GAAG,KAAK,IAAI,cAAc,GAAG,KAAK,GAAG,EAAE,EAAE,CAAC;CACvE,MAAM,cAAc,KAAK,IAAI,GAAG,KAAK,IAAI,cAAc,GAAG,KAAK,EAAE,EAAE,EAAE,CAAC;CACtE,MAAM,mBAAmB,eAAe,GAAG,UAAU,MAAM;CAC3D,MAAM,kBAAkB,kBAAkB,IAAI,oBAAoB,GAAG,IAAI;CACzE,MAAM,iBAAiB,kBAAkB,IAAI,mBAAmB,GAAG,IAAI;CACvE,MAAM,YAAY,kBAAkB,IAAI,cAAc,GAAG,IAAI;CAC7D,MAAM,YAAY,kBAAkB,IAAI,cAAc,GAAG,IAAI;CAC7D,MAAM,eAAe,KAAK,KAAK,IAAI,WAAW;CAC9C,MAAM,SAAS,GAAG,MAAM;CACxB,MAAM,QAAQ,IAAI,SAAS;CAC3B,MAAM,MAAM,IAAI,OAAO;CACvB,MAAM,kBAAkB,cAAc,eAAe;AACrD,OAAM,qBAAqB,QAAQ,IAAI,QAAQ,QAAQ,UAAU,YAAY,cAAc,OAAO,KAAK,6BAA6B;EACnI;EACA;EACA;EACA;EACA;EACA,mBAAmB,IAAI;EACvB;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,qBAAqB,CAAC"}
@@ -0,0 +1,5 @@
1
+ import "./chunk-GBe2k3y8.mjs";
2
+ import "./dist-cjxDXQdx.mjs";
3
+ import { t as renderers_default } from "./renderer-CWBHVCvA.mjs";
4
+
5
+ export { renderers_default as default };
@@ -1,5 +1,5 @@
1
1
  import "./chunk-GBe2k3y8.mjs";
2
- import "./dist-DQlYw4eG.mjs";
3
- import { n as renderers_default, t as PatchHealWebGPURenderer } from "./renderer-BNcsS03m.mjs";
2
+ import "./dist-cjxDXQdx.mjs";
3
+ import { n as renderers_default, t as PatchHealWebGPURenderer } from "./renderer-DD8napek.mjs";
4
4
 
5
5
  export { PatchHealWebGPURenderer, renderers_default as default };
@@ -1,6 +1,6 @@
1
1
  import { n as defineRenderer, o as resolveHandleParam } from "./renderer-BSitV56h.mjs";
2
2
  import { a as configBuilder, i as VideoResultSchema, n as ImageResultSchema } from "./dist-BY0bIWgr.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-AbcLcr1f.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-Du7GpVFW.mjs";
4
4
  import { z } from "zod";
5
5
 
6
6
  //#region ../../nodes/node-mask-math/dist/renderers-YQJYtdXA.mjs
@@ -585,4 +585,4 @@ var renderers_default = defineRenderer({ WebGPURenderer });
585
585
 
586
586
  //#endregion
587
587
  export { renderers_default as n, WebGPURenderer as t };
588
- //# sourceMappingURL=renderer-CGZqCmf2.mjs.map
588
+ //# sourceMappingURL=renderer-CrABA3lB.mjs.map