framefields 2.3.2 → 2.4.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 (266) hide show
  1. package/README.md +24 -1
  2. package/dist/audio/index.d.mts +4 -4
  3. package/dist/audio/index.mjs +10 -10
  4. package/dist/{audio-BNnEclHU.d.mts → audio-C6toT7F3.d.mts} +3 -3
  5. package/dist/{audio-BNnEclHU.d.mts.map → audio-C6toT7F3.d.mts.map} +1 -1
  6. package/dist/{audio-C7Kn5xBm.mjs → audio-DXwNhi1z.mjs} +3 -3
  7. package/dist/{audio-C7Kn5xBm.mjs.map → audio-DXwNhi1z.mjs.map} +1 -1
  8. package/dist/{dist-CPUIfrtw.mjs → dist-Cl0mvShy.mjs} +2 -2
  9. package/dist/{dist-CPUIfrtw.mjs.map → dist-Cl0mvShy.mjs.map} +1 -1
  10. package/dist/{dist-CturBK2Z.mjs → dist-DRB6Vg5u.mjs} +1188 -743
  11. package/dist/dist-DRB6Vg5u.mjs.map +1 -0
  12. package/dist/effects/index.d.mts +4 -4
  13. package/dist/effects/index.mjs +34 -34
  14. package/dist/{effects-CW1VgdI5.mjs → effects-lBqG-vd1.mjs} +2 -2
  15. package/dist/{effects-CW1VgdI5.mjs.map → effects-lBqG-vd1.mjs.map} +1 -1
  16. package/dist/fonts/index.mjs +2 -2
  17. package/dist/{fonts-EgMNL8KE.mjs → fonts-DlRJD6NS.mjs} +2 -2
  18. package/dist/{fonts-EgMNL8KE.mjs.map → fonts-DlRJD6NS.mjs.map} +1 -1
  19. package/dist/{gpu-CN14e7Bi.mjs → gpu-DOQX1W2q.mjs} +2 -2
  20. package/dist/{gpu-CN14e7Bi.mjs.map → gpu-DOQX1W2q.mjs.map} +1 -1
  21. package/dist/{index-QmkcUL3W.d.mts → index-BHqdtJbN.d.mts} +2 -2
  22. package/dist/{index-QmkcUL3W.d.mts.map → index-BHqdtJbN.d.mts.map} +1 -1
  23. package/dist/{index-CeRv1KC0.d.mts → index-BONyHjZX.d.mts} +3 -3
  24. package/dist/{index-CeRv1KC0.d.mts.map → index-BONyHjZX.d.mts.map} +1 -1
  25. package/dist/{index-Cg2ptXcs.d.mts → index-CaiZ5p6q.d.mts} +2 -2
  26. package/dist/{index-Cg2ptXcs.d.mts.map → index-CaiZ5p6q.d.mts.map} +1 -1
  27. package/dist/{index-BU51pxZO.d.mts → index-Cf1pVxn0.d.mts} +4 -4
  28. package/dist/{index-BU51pxZO.d.mts.map → index-Cf1pVxn0.d.mts.map} +1 -1
  29. package/dist/{index-AdrZIWT0.d.mts → index-DEODKaL6.d.mts} +13 -1
  30. package/dist/index-DEODKaL6.d.mts.map +1 -0
  31. package/dist/{index-B3BwLHa6.d.mts → index-DN9oXO-X.d.mts} +3 -3
  32. package/dist/{index-B3BwLHa6.d.mts.map → index-DN9oXO-X.d.mts.map} +1 -1
  33. package/dist/index.d.mts +177 -9
  34. package/dist/index.d.mts.map +1 -1
  35. package/dist/index.mjs +485 -90
  36. package/dist/index.mjs.map +1 -1
  37. package/dist/preview/index.d.mts +2 -2
  38. package/dist/preview/index.mjs +10 -10
  39. package/dist/{preview-1sjnhHQL.mjs → preview-Ca4tF5Ro.mjs} +2 -2
  40. package/dist/{preview-1sjnhHQL.mjs.map → preview-Ca4tF5Ro.mjs.map} +1 -1
  41. package/dist/preview-engine/chunk-7QJUC6YY.mjs +1525 -0
  42. package/dist/preview-engine/framefields.mjs +32 -25
  43. package/dist/preview-engine/player.mjs +1 -1
  44. package/dist/preview-engine/{renderers-WP2LBR5U.mjs → renderers-HQEKSUNR.mjs} +3 -3
  45. package/dist/{program-DtiNMTxO.mjs → program-CJEg2wMa.mjs} +2 -2
  46. package/dist/{program-DtiNMTxO.mjs.map → program-CJEg2wMa.mjs.map} +1 -1
  47. package/dist/renderer/index.d.mts +2 -2
  48. package/dist/renderer/index.mjs +2 -2
  49. package/dist/renderer--IHe-yqK.mjs +5 -0
  50. package/dist/{renderer-CMzd3BrW.mjs → renderer-445i0uxs.mjs} +2 -2
  51. package/dist/{renderer-CMzd3BrW.mjs.map → renderer-445i0uxs.mjs.map} +1 -1
  52. package/dist/{renderer-MS70wrQB.mjs → renderer-5tQ7ImPk.mjs} +2 -2
  53. package/dist/{renderer-MS70wrQB.mjs.map → renderer-5tQ7ImPk.mjs.map} +1 -1
  54. package/dist/{renderer-Dw1e5phO.mjs → renderer-Ai5nZsof.mjs} +3 -3
  55. package/dist/{renderer-Dw1e5phO.mjs.map → renderer-Ai5nZsof.mjs.map} +1 -1
  56. package/dist/renderer-B16iwR0_.mjs +5 -0
  57. package/dist/renderer-B3EEYpx6.mjs +5 -0
  58. package/dist/renderer-B3Si5IB4.mjs +5 -0
  59. package/dist/{renderer-ktpusVT2.mjs → renderer-B4JmNa_T.mjs} +3 -3
  60. package/dist/{renderer-ktpusVT2.mjs.map → renderer-B4JmNa_T.mjs.map} +1 -1
  61. package/dist/{renderer-CBG6ewNf.mjs → renderer-B6UqWjtH.mjs} +3 -3
  62. package/dist/{renderer-CBG6ewNf.mjs.map → renderer-B6UqWjtH.mjs.map} +1 -1
  63. package/dist/{renderer-BmWH4dK1.mjs → renderer-B8v8iEkB.mjs} +7 -6
  64. package/dist/{renderer-BmWH4dK1.mjs.map → renderer-B8v8iEkB.mjs.map} +1 -1
  65. package/dist/{renderer-dJcu7WqI.mjs → renderer-BFWRUTov.mjs} +3 -3
  66. package/dist/{renderer-dJcu7WqI.mjs.map → renderer-BFWRUTov.mjs.map} +1 -1
  67. package/dist/renderer-BH8vZKmX.mjs +5 -0
  68. package/dist/renderer-BHZie6Pa.mjs +5 -0
  69. package/dist/renderer-BHpJ1e15.mjs +5 -0
  70. package/dist/{renderer-CRYO5HQw.mjs → renderer-BL36f2IQ.mjs} +2 -2
  71. package/dist/{renderer-CRYO5HQw.mjs.map → renderer-BL36f2IQ.mjs.map} +1 -1
  72. package/dist/{renderer-Bq9jXYJ5.mjs → renderer-BOvCstdU.mjs} +3 -3
  73. package/dist/{renderer-Bq9jXYJ5.mjs.map → renderer-BOvCstdU.mjs.map} +1 -1
  74. package/dist/renderer-BPJ79b47.mjs +5 -0
  75. package/dist/renderer-BPbM_6WR.mjs +5 -0
  76. package/dist/{renderer-DjwF10p2.mjs → renderer-BPsi7Q7Z.mjs} +3 -3
  77. package/dist/{renderer-DjwF10p2.mjs.map → renderer-BPsi7Q7Z.mjs.map} +1 -1
  78. package/dist/{renderer-BYj8x8YM.mjs → renderer-BTJyO6ov.mjs} +2 -2
  79. package/dist/{renderer-BYj8x8YM.mjs.map → renderer-BTJyO6ov.mjs.map} +1 -1
  80. package/dist/{renderer-DmOewVsB.mjs → renderer-BZCLdb8F.mjs} +3 -3
  81. package/dist/{renderer-DmOewVsB.mjs.map → renderer-BZCLdb8F.mjs.map} +1 -1
  82. package/dist/{renderer-CbNW0KHh.mjs → renderer-BZF48o1T.mjs} +3 -3
  83. package/dist/{renderer-CbNW0KHh.mjs.map → renderer-BZF48o1T.mjs.map} +1 -1
  84. package/dist/{renderer-_Fh9IBlE.mjs → renderer-BZWiY6Jw.mjs} +3 -3
  85. package/dist/{renderer-_Fh9IBlE.mjs.map → renderer-BZWiY6Jw.mjs.map} +1 -1
  86. package/dist/{renderer-Fm2brScz.mjs → renderer-BZvWlGsa.mjs} +3 -3
  87. package/dist/{renderer-Fm2brScz.mjs.map → renderer-BZvWlGsa.mjs.map} +1 -1
  88. package/dist/{renderer-DL4oR40b.mjs → renderer-BaBluD-r.mjs} +2 -2
  89. package/dist/{renderer-DL4oR40b.mjs.map → renderer-BaBluD-r.mjs.map} +1 -1
  90. package/dist/{renderer-DacnnTjY.mjs → renderer-BaHEN_Kv.mjs} +3 -3
  91. package/dist/{renderer-DacnnTjY.mjs.map → renderer-BaHEN_Kv.mjs.map} +1 -1
  92. package/dist/{renderer-Mdyv_W8K.mjs → renderer-BhZutM8K.mjs} +3 -3
  93. package/dist/{renderer-Mdyv_W8K.mjs.map → renderer-BhZutM8K.mjs.map} +1 -1
  94. package/dist/renderer-Bn-WnRh9.mjs +5 -0
  95. package/dist/renderer-BqHvDAUe.mjs +5 -0
  96. package/dist/{renderer-D8tdGi2P.mjs → renderer-BtJ6XYN7.mjs} +3 -3
  97. package/dist/{renderer-D8tdGi2P.mjs.map → renderer-BtJ6XYN7.mjs.map} +1 -1
  98. package/dist/{renderer-F410V727.mjs → renderer-BzgnTEvf.mjs} +3 -3
  99. package/dist/{renderer-F410V727.mjs.map → renderer-BzgnTEvf.mjs.map} +1 -1
  100. package/dist/{renderer-D-eTVnDS.mjs → renderer-C-La-IAt.mjs} +2 -2
  101. package/dist/{renderer-D-eTVnDS.mjs.map → renderer-C-La-IAt.mjs.map} +1 -1
  102. package/dist/{renderer-BFHgl-0f.mjs → renderer-C2ZIAhdJ.mjs} +2 -2
  103. package/dist/{renderer-BFHgl-0f.mjs.map → renderer-C2ZIAhdJ.mjs.map} +1 -1
  104. package/dist/{renderer-BebePsG7.mjs → renderer-C9pl21Zb.mjs} +2 -2
  105. package/dist/{renderer-BebePsG7.mjs.map → renderer-C9pl21Zb.mjs.map} +1 -1
  106. package/dist/renderer-CAtXDNsh.mjs +5 -0
  107. package/dist/{renderer-BkXqFmNO.mjs → renderer-CCCitH4J.mjs} +2 -2
  108. package/dist/{renderer-BkXqFmNO.mjs.map → renderer-CCCitH4J.mjs.map} +1 -1
  109. package/dist/{renderer-QMGrRiab.mjs → renderer-CCu1Q8ib.mjs} +2 -2
  110. package/dist/{renderer-QMGrRiab.mjs.map → renderer-CCu1Q8ib.mjs.map} +1 -1
  111. package/dist/{renderer-DvoPplvC.mjs → renderer-CG4TmDWH.mjs} +2 -2
  112. package/dist/{renderer-S6ez0leJ.mjs → renderer-CJmZURPQ.mjs} +2 -2
  113. package/dist/{renderer-S6ez0leJ.mjs.map → renderer-CJmZURPQ.mjs.map} +1 -1
  114. package/dist/{renderer-CPNLkir4.mjs → renderer-CN3iCli4.mjs} +2 -2
  115. package/dist/{renderer-CPNLkir4.mjs.map → renderer-CN3iCli4.mjs.map} +1 -1
  116. package/dist/{renderer--S2cNYXS.mjs → renderer-CNS8LA2_.mjs} +3 -3
  117. package/dist/{renderer--S2cNYXS.mjs.map → renderer-CNS8LA2_.mjs.map} +1 -1
  118. package/dist/renderer-C_5nfVce.mjs +5 -0
  119. package/dist/{renderer-ButaUWLr.mjs → renderer-CduDa1qf.mjs} +3 -3
  120. package/dist/{renderer-ButaUWLr.mjs.map → renderer-CduDa1qf.mjs.map} +1 -1
  121. package/dist/{renderer-Ch1rv1XP.mjs → renderer-CduL1AOK.mjs} +2 -2
  122. package/dist/{renderer-Ch1rv1XP.mjs.map → renderer-CduL1AOK.mjs.map} +1 -1
  123. package/dist/{renderer-z3YOOR3k.mjs → renderer-Cfto0m0-.mjs} +3 -3
  124. package/dist/{renderer-z3YOOR3k.mjs.map → renderer-Cfto0m0-.mjs.map} +1 -1
  125. package/dist/{renderer-CJwgsecF.mjs → renderer-CgZ1G37H.mjs} +2 -2
  126. package/dist/{renderer-CJwgsecF.mjs.map → renderer-CgZ1G37H.mjs.map} +1 -1
  127. package/dist/renderer-Cie7KKeQ.mjs +5 -0
  128. package/dist/{renderer-BaOC1Pd1.mjs → renderer-CjTxu89O.mjs} +3 -3
  129. package/dist/{renderer-BaOC1Pd1.mjs.map → renderer-CjTxu89O.mjs.map} +1 -1
  130. package/dist/{renderer-C2Ff-9u_.mjs → renderer-CoN2JgLO.mjs} +2 -2
  131. package/dist/{renderer-C2Ff-9u_.mjs.map → renderer-CoN2JgLO.mjs.map} +1 -1
  132. package/dist/{renderer-DjPC9l3w.mjs → renderer-CoO2j8AC.mjs} +3 -3
  133. package/dist/{renderer-DjPC9l3w.mjs.map → renderer-CoO2j8AC.mjs.map} +1 -1
  134. package/dist/{renderer-BRWpn3dT.mjs → renderer-CoX23zo_.mjs} +3 -3
  135. package/dist/{renderer-BRWpn3dT.mjs.map → renderer-CoX23zo_.mjs.map} +1 -1
  136. package/dist/renderer-CuoxvPsX.mjs +5 -0
  137. package/dist/renderer-Cvd3oIJQ.mjs +5 -0
  138. package/dist/renderer-CxAgpBrJ.mjs +5 -0
  139. package/dist/{renderer-C4puWDLK.mjs → renderer-CxSH3F_n.mjs} +2 -2
  140. package/dist/{renderer-C4puWDLK.mjs.map → renderer-CxSH3F_n.mjs.map} +1 -1
  141. package/dist/{renderer-B6c_Rk_2.mjs → renderer-Cz9fzS11.mjs} +3 -3
  142. package/dist/{renderer-B6c_Rk_2.mjs.map → renderer-Cz9fzS11.mjs.map} +1 -1
  143. package/dist/{renderer-BAmGO6Hj.mjs → renderer-D-IcBLT0.mjs} +3 -3
  144. package/dist/{renderer-BAmGO6Hj.mjs.map → renderer-D-IcBLT0.mjs.map} +1 -1
  145. package/dist/renderer-D-cWBX0r.mjs +5 -0
  146. package/dist/{renderer-DqlvbOUt.mjs → renderer-D-e3vDnO.mjs} +3 -3
  147. package/dist/{renderer-DqlvbOUt.mjs.map → renderer-D-e3vDnO.mjs.map} +1 -1
  148. package/dist/renderer-D0q2VyJR.mjs +5 -0
  149. package/dist/{renderer-BqSiWRoD.mjs → renderer-D4E8Yf61.mjs} +2 -2
  150. package/dist/{renderer-BqSiWRoD.mjs.map → renderer-D4E8Yf61.mjs.map} +1 -1
  151. package/dist/renderer-D6NXn3Ky.mjs +5 -0
  152. package/dist/renderer-D9bp2jor.mjs +5 -0
  153. package/dist/{renderer-GlyeFl5R.mjs → renderer-DA1brg35.mjs} +3 -3
  154. package/dist/{renderer-GlyeFl5R.mjs.map → renderer-DA1brg35.mjs.map} +1 -1
  155. package/dist/{renderer-DNhOjz6C.mjs → renderer-DAFi5TC_.mjs} +2 -2
  156. package/dist/{renderer-DNhOjz6C.mjs.map → renderer-DAFi5TC_.mjs.map} +1 -1
  157. package/dist/renderer-DEzIOIB7.mjs +5 -0
  158. package/dist/{renderer-B5Icb0XW.mjs → renderer-DFX2V9Dp.mjs} +2 -2
  159. package/dist/{renderer-B5Icb0XW.mjs.map → renderer-DFX2V9Dp.mjs.map} +1 -1
  160. package/dist/{renderer-w8LKBg_5.mjs → renderer-DH0wkQkR.mjs} +2 -2
  161. package/dist/{renderer-w8LKBg_5.mjs.map → renderer-DH0wkQkR.mjs.map} +1 -1
  162. package/dist/{renderer-BXCZev4l.mjs → renderer-DOZJeWM4.mjs} +3 -3
  163. package/dist/{renderer-BXCZev4l.mjs.map → renderer-DOZJeWM4.mjs.map} +1 -1
  164. package/dist/{renderer-Cz11KJmQ.mjs → renderer-DOkEalxy.mjs} +2 -2
  165. package/dist/{renderer-Cz11KJmQ.mjs.map → renderer-DOkEalxy.mjs.map} +1 -1
  166. package/dist/renderer-DSSTVulw.mjs +5 -0
  167. package/dist/renderer-DUmTURPu.mjs +5 -0
  168. package/dist/{renderer-BI1nmIqA.mjs → renderer-DVaVVz-D.mjs} +3 -3
  169. package/dist/{renderer-BI1nmIqA.mjs.map → renderer-DVaVVz-D.mjs.map} +1 -1
  170. package/dist/renderer-DXCAgI9m.mjs +5 -0
  171. package/dist/{renderer-BlafvK-L.mjs → renderer-DY8fPeH3.mjs} +2 -2
  172. package/dist/renderer-DZ9j3fQj.mjs +5 -0
  173. package/dist/{renderer-6QAlE1Mp.mjs → renderer-DZndEvZN.mjs} +3 -3
  174. package/dist/{renderer-6QAlE1Mp.mjs.map → renderer-DZndEvZN.mjs.map} +1 -1
  175. package/dist/{renderer-B3x-uogM.mjs → renderer-DaV95CAd.mjs} +3 -3
  176. package/dist/{renderer-B3x-uogM.mjs.map → renderer-DaV95CAd.mjs.map} +1 -1
  177. package/dist/{renderer-YtRSM2cv.mjs → renderer-DautVsW4.mjs} +2 -2
  178. package/dist/{renderer-YtRSM2cv.mjs.map → renderer-DautVsW4.mjs.map} +1 -1
  179. package/dist/renderer-Dd1G_VKM.mjs +5 -0
  180. package/dist/renderer-Dee8079X.mjs +5 -0
  181. package/dist/{renderer-B48vtpou.mjs → renderer-Dg5yLAM9.mjs} +3 -3
  182. package/dist/{renderer-B48vtpou.mjs.map → renderer-Dg5yLAM9.mjs.map} +1 -1
  183. package/dist/renderer-DgWh5noB.mjs +5 -0
  184. package/dist/{renderer-DlESyfg7.d.mts → renderer-Dim2ZlfK.d.mts} +2 -2
  185. package/dist/{renderer-DlESyfg7.d.mts.map → renderer-Dim2ZlfK.d.mts.map} +1 -1
  186. package/dist/{renderer-R0sJId_6.mjs → renderer-Dk0dnuHr.mjs} +2 -2
  187. package/dist/{renderer-R0sJId_6.mjs.map → renderer-Dk0dnuHr.mjs.map} +1 -1
  188. package/dist/{renderer-Bf4BdBtb.mjs → renderer-DkM_wN8j.mjs} +2 -2
  189. package/dist/{renderer-Bf4BdBtb.mjs.map → renderer-DkM_wN8j.mjs.map} +1 -1
  190. package/dist/{renderer-DS64UaYK.mjs → renderer-DkYiOWPJ.mjs} +3 -3
  191. package/dist/{renderer-DS64UaYK.mjs.map → renderer-DkYiOWPJ.mjs.map} +1 -1
  192. package/dist/{renderer-ITtBRR4o.mjs → renderer-DqgduGiO.mjs} +3 -3
  193. package/dist/{renderer-ITtBRR4o.mjs.map → renderer-DqgduGiO.mjs.map} +1 -1
  194. package/dist/renderer-DuD9QRix.mjs +5 -0
  195. package/dist/{renderer--Da6pAJ4.mjs → renderer-Edn9xltT.mjs} +2 -2
  196. package/dist/renderer-KtG5p44R.mjs +5 -0
  197. package/dist/{renderer-DDBmBmQN.mjs → renderer-Tf1AS1aO.mjs} +2 -2
  198. package/dist/{renderer-DDBmBmQN.mjs.map → renderer-Tf1AS1aO.mjs.map} +1 -1
  199. package/dist/{renderer-_-MCpvGq.mjs → renderer-TyZu7nQ2.mjs} +69 -69
  200. package/dist/{renderer-_-MCpvGq.mjs.map → renderer-TyZu7nQ2.mjs.map} +1 -1
  201. package/dist/{renderer-CgEMtLOL.mjs → renderer-eWBBsCv2.mjs} +2 -2
  202. package/dist/{renderer-CgEMtLOL.mjs.map → renderer-eWBBsCv2.mjs.map} +1 -1
  203. package/dist/{renderer-ClK7_Yzz.mjs → renderer-fXRwAdO2.mjs} +2 -2
  204. package/dist/{renderer-ClK7_Yzz.mjs.map → renderer-fXRwAdO2.mjs.map} +1 -1
  205. package/dist/renderer-fdVdNIhL.mjs +5 -0
  206. package/dist/renderer-gBKWL0_E.mjs +5 -0
  207. package/dist/{renderer-D90PpIKG.mjs → renderer-gbBgGPNL.mjs} +2 -2
  208. package/dist/{renderer-Kj9AhRCc.mjs → renderer-h9sJnoxw.mjs} +3 -3
  209. package/dist/{renderer-Kj9AhRCc.mjs.map → renderer-h9sJnoxw.mjs.map} +1 -1
  210. package/dist/renderer-hmWhsR6C.mjs +5 -0
  211. package/dist/{renderer-Rg1BFv8B.mjs → renderer-i4RJ-_sx.mjs} +2 -2
  212. package/dist/{renderer-Rg1BFv8B.mjs.map → renderer-i4RJ-_sx.mjs.map} +1 -1
  213. package/dist/renderer-jkL9FU2W.mjs +6 -0
  214. package/dist/{renderer-8k-TR_Cy.mjs → renderer-nMnE_T2y.mjs} +3 -3
  215. package/dist/{renderer-8k-TR_Cy.mjs.map → renderer-nMnE_T2y.mjs.map} +1 -1
  216. package/dist/{renderer-CczmOPAO.mjs → renderer-q971j1BW.mjs} +3 -3
  217. package/dist/{renderer-CczmOPAO.mjs.map → renderer-q971j1BW.mjs.map} +1 -1
  218. package/dist/{renderer-DJWQWN1E.mjs → renderer-wFyrVuuj.mjs} +3 -3
  219. package/dist/{renderer-DJWQWN1E.mjs.map → renderer-wFyrVuuj.mjs.map} +1 -1
  220. package/dist/renderer-yAWv-daq.mjs +5 -0
  221. package/dist/{renderer-DYo_a5-8.mjs → renderer-yGARXwV0.mjs} +2 -2
  222. package/dist/{renderer-DYo_a5-8.mjs.map → renderer-yGARXwV0.mjs.map} +1 -1
  223. package/dist/{renderers-CP8CFWDs-DXiR_PLR.mjs → renderers-CP8CFWDs-DoVn7dbW.mjs} +2 -2
  224. package/dist/{renderers-CP8CFWDs-DXiR_PLR.mjs.map → renderers-CP8CFWDs-DoVn7dbW.mjs.map} +1 -1
  225. package/dist/signals/index.d.mts +5 -5
  226. package/dist/signals/index.mjs +4 -4
  227. package/package.json +57 -56
  228. package/dist/dist-CturBK2Z.mjs.map +0 -1
  229. package/dist/index-AdrZIWT0.d.mts.map +0 -1
  230. package/dist/preview-engine/chunk-U7NIY7UC.mjs +0 -1522
  231. package/dist/renderer-1hypa-l7.mjs +0 -5
  232. package/dist/renderer-6D8M4DRu.mjs +0 -5
  233. package/dist/renderer-APrj6tdP.mjs +0 -5
  234. package/dist/renderer-BF8wlbN1.mjs +0 -5
  235. package/dist/renderer-BOUcMCJB.mjs +0 -5
  236. package/dist/renderer-BSwn6KmG.mjs +0 -5
  237. package/dist/renderer-BUxvuC5A.mjs +0 -5
  238. package/dist/renderer-BYOsmJ8F.mjs +0 -5
  239. package/dist/renderer-Bp7LqSTt.mjs +0 -5
  240. package/dist/renderer-CD0amH_Q.mjs +0 -5
  241. package/dist/renderer-CIJGjrt7.mjs +0 -5
  242. package/dist/renderer-CNFTl94b.mjs +0 -5
  243. package/dist/renderer-CTJ0gHPS.mjs +0 -5
  244. package/dist/renderer-Cc3INn7w.mjs +0 -5
  245. package/dist/renderer-CeHh2lKY.mjs +0 -5
  246. package/dist/renderer-CfjwkQP4.mjs +0 -5
  247. package/dist/renderer-CiuOB-Md.mjs +0 -5
  248. package/dist/renderer-Cor66Y2X.mjs +0 -5
  249. package/dist/renderer-CtIM0LWe.mjs +0 -5
  250. package/dist/renderer-CyqgTsnx.mjs +0 -5
  251. package/dist/renderer-D2QG9yIW.mjs +0 -5
  252. package/dist/renderer-D2woU27o.mjs +0 -6
  253. package/dist/renderer-DAhDiQQY.mjs +0 -5
  254. package/dist/renderer-DIjxOQFi.mjs +0 -5
  255. package/dist/renderer-DRzalGhU.mjs +0 -5
  256. package/dist/renderer-DY6S1jWp.mjs +0 -5
  257. package/dist/renderer-DeW0KNQV.mjs +0 -5
  258. package/dist/renderer-DsVSVFkl.mjs +0 -5
  259. package/dist/renderer-DxvcIgEU.mjs +0 -5
  260. package/dist/renderer-F0MKqmol.mjs +0 -5
  261. package/dist/renderer-OkbovcAc.mjs +0 -5
  262. package/dist/renderer-QyBeWMEL.mjs +0 -5
  263. package/dist/renderer-hSh5IrDp.mjs +0 -5
  264. package/dist/renderer-puLncHft.mjs +0 -5
  265. package/dist/renderer-wnFCaw7j.mjs +0 -5
  266. package/dist/renderer-xjtlyGS1.mjs +0 -5
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-Rg1BFv8B.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-i4RJ-_sx.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"}
@@ -0,0 +1,6 @@
1
+ import "./chunk-GBe2k3y8.mjs";
2
+ import "./dist-DRB6Vg5u.mjs";
3
+ import { t as renderers_default } from "./renderers-CP8CFWDs-DoVn7dbW.mjs";
4
+ import "./renderer-B-BcgA6d.mjs";
5
+
6
+ export { renderers_default as default };
@@ -1,5 +1,5 @@
1
- import { G as parseColor, Nn as signalRegistry } from "./dist-CturBK2Z.mjs";
2
- import { a as createFullscreenPipeline, c as drawTextureToTarget, f as signalTiming, l as fragmentBindGroupLayout, o as drawChildToTexture, s as drawFullscreenPass, t as FULLSCREEN_QUAD_WGSL } from "./gpu-CN14e7Bi.mjs";
1
+ import { G as parseColor, Nn as signalRegistry } from "./dist-DRB6Vg5u.mjs";
2
+ import { a as createFullscreenPipeline, c as drawTextureToTarget, f as signalTiming, l as fragmentBindGroupLayout, o as drawChildToTexture, s as drawFullscreenPass, t as FULLSCREEN_QUAD_WGSL } from "./gpu-DOQX1W2q.mjs";
3
3
 
4
4
  //#region ../../nodes/node-gradient-map/dist/renderers-DDdRKrlK.mjs
5
5
  const deviceResourceCache = /* @__PURE__ */ new WeakMap();
@@ -206,4 +206,4 @@ var renderers_default = { WebGPURenderer: GradientMapWebGPURenderer };
206
206
 
207
207
  //#endregion
208
208
  export { renderers_default as n, GradientMapWebGPURenderer as t };
209
- //# sourceMappingURL=renderer-8k-TR_Cy.mjs.map
209
+ //# sourceMappingURL=renderer-nMnE_T2y.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-8k-TR_Cy.mjs","names":[],"sources":["../../../nodes/node-gradient-map/dist/renderers-DDdRKrlK.mjs"],"sourcesContent":["import { FULLSCREEN_QUAD_WGSL, createFullscreenPipeline, drawChildToTexture, drawFullscreenPass, drawTextureToTarget, fragmentBindGroupLayout, signalTiming } from \"@framefields/node-sdk/gpu\";\nimport { parseColor, signalRegistry } from \"@framefields/webgpu-renderers\";\n\n//#region src/renderers/webgpu-renderer.ts\nconst deviceResourceCache = /* @__PURE__ */ new WeakMap();\nconst WGSL_GRADIENT_MAP_SHADER = `\nstruct GradientStop {\n\tpos : vec4<f32>,\n\tcol : vec4<f32>,\n};\n\nstruct GradientMapUniforms {\n\tnumStops : f32,\n\tisSmooth : f32,\n\tdither : f32,\n\topacity : f32,\n\n\thasOpacitySig : f32,\n\tpad0 : f32,\n\tpad1 : f32,\n\tpad2 : f32,\n\n\tstops : array<GradientStop, 16>,\n};\n\n@group(0) @binding(0) var<uniform> u : GradientMapUniforms;\n@group(1) @binding(0) var tex : texture_2d<f32>;\n@group(1) @binding(1) var samp : sampler;\n@group(2) @binding(0) var opacitySigTex : texture_2d<f32>;\n@group(2) @binding(1) var signalSamp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\nfn ditherNoise(pos: vec2<f32>) -> f32 {\n\tlet p = fract(pos * vec2<f32>(0.1031, 0.1030));\n\tlet d = dot(p, p.yx + 33.33);\n\treturn fract((p.x + p.y) * d) - 0.5;\n}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet color = textureSampleLevel(tex, samp, in.uv, 0.0);\n\tif (color.a <= 0.00001) {\n\t\treturn color;\n\t}\n\n\tlet alpha = color.a;\n\tlet rgb = color.rgb / max(alpha, 0.0001);\n\n\t// ITU-R BT.709 Luminance\n\tvar lum = dot(rgb, vec3<f32>(0.2126, 0.7152, 0.0722));\n\n\tif (u.dither > 0.5) {\n\t\tlet d = ditherNoise(in.pos.xy) * (1.0 / 255.0);\n\t\tlum = clamp(lum + d, 0.0, 1.0);\n\t} else {\n\t\tlum = clamp(lum, 0.0, 1.0);\n\t}\n\n\tlet count = i32(clamp(u.numStops, 2.0, 16.0));\n\tvar gradColor = u.stops[0].col.rgb;\n\n\tif (lum <= u.stops[0].pos.x) {\n\t\tgradColor = u.stops[0].col.rgb;\n\t} else if (lum >= u.stops[count - 1].pos.x) {\n\t\tgradColor = u.stops[count - 1].col.rgb;\n\t} else {\n\t\tfor (var i = 0; i < 15; i = i + 1) {\n\t\t\tif (i >= count - 1) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tlet p0 = u.stops[i].pos.x;\n\t\t\tlet p1 = u.stops[i + 1].pos.x;\n\n\t\t\tif (lum >= p0 && lum <= p1) {\n\t\t\t\tlet range = max(p1 - p0, 1e-5);\n\t\t\t\tlet t = clamp((lum - p0) / range, 0.0, 1.0);\n\t\t\t\tif (u.isSmooth > 0.5) {\n\t\t\t\t\tgradColor = mix(u.stops[i].col.rgb, u.stops[i + 1].col.rgb, t);\n\t\t\t\t} else {\n\t\t\t\t\tgradColor = u.stops[i].col.rgb;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tvar opacity = u.opacity;\n\tif (u.hasOpacitySig > 0.5) {\n\t\topacity = textureSampleLevel(opacitySigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\topacity = clamp(opacity, 0.0, 1.0);\n\n\tlet finalRgb = mix(rgb, gradColor, opacity);\n\treturn vec4<f32>(finalRgb * alpha, alpha);\n}\n`;\nfunction getGradientMapResources(device, format) {\n\tlet res = deviceResourceCache.get(device);\n\tif (res) return res;\n\tconst uniformLayout = fragmentBindGroupLayout(device, [\"uniform\"], \"GradientMapUniformLayout\");\n\tconst textureLayout = fragmentBindGroupLayout(device, [\"texture\", \"sampler\"], \"GradientMapTextureLayout\");\n\tconst signalLayout = fragmentBindGroupLayout(device, [\"texture\", \"sampler\"], \"GradientMapSignalLayout\");\n\tres = {\n\t\tpipeline: createFullscreenPipeline(device, {\n\t\t\tlabel: \"GradientMapPipeline\",\n\t\t\tmodule: device.createShaderModule({\n\t\t\t\tlabel: \"GradientMapShaderModule\",\n\t\t\t\tcode: WGSL_GRADIENT_MAP_SHADER\n\t\t\t}),\n\t\t\tlayouts: [\n\t\t\t\tuniformLayout,\n\t\t\t\ttextureLayout,\n\t\t\t\tsignalLayout\n\t\t\t],\n\t\t\tformat\n\t\t}),\n\t\tuniformLayout,\n\t\ttextureLayout,\n\t\tsignalLayout\n\t};\n\tdeviceResourceCache.set(device, res);\n\treturn res;\n}\nconst uniformBufferData = new Float32Array(136);\nconst GradientMapWebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetTexture, targetWidth, targetHeight, props } = args;\n\tconst frame = props.frame ?? 0;\n\tconst fps = props.fps || 30;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"GradientMap\" || !props.virtualMedia?.children?.[0]) return;\n\tpass.end();\n\tconst childMedia = props.virtualMedia.children[0];\n\tconst width = targetWidth;\n\tconst height = targetHeight;\n\tconst { texture: tmpTex } = await drawChildToTexture(args, childMedia);\n\tconst sortedStops = [...Array.isArray(op.stops) ? op.stops : [{\n\t\tposition: 0,\n\t\tcolor: \"#000000\"\n\t}, {\n\t\tposition: 1,\n\t\tcolor: \"#ffffff\"\n\t}]].sort((a, b) => a.position - b.position);\n\tconst numStops = Math.min(Math.max(sortedStops.length, 2), 16);\n\tconst opacityHandleId = op.opacityHandleId;\n\tconst opacitySignalInput = opacityHandleId ? op.inputs?.[opacityHandleId] : null;\n\tconst hasOpacitySig = !!(opacitySignalInput?.connectionValid && opacitySignalInput.outputItem?.type === \"Signal\");\n\tconst opacitySigData = hasOpacitySig ? opacitySignalInput?.outputItem?.data : null;\n\tlet opacityVal = Number(op.opacity ?? 1);\n\tif (!hasOpacitySig && opacitySignalInput?.connectionValid && opacitySignalInput.outputItem?.type === \"Number\") opacityVal = Number(opacitySignalInput.outputItem.data ?? 1);\n\tconst { elapsedSeconds, durationSeconds } = signalTiming(props, frame, fps);\n\tlet opacityView;\n\tif (hasOpacitySig && opacitySigData) opacityView = signalRegistry.getOrCreate2DTextureView(ctx.device, encoder, opacitySigData.nodeId ?? \"gradient_map_opacity\", elapsedSeconds, durationSeconds, opacitySigData, width, height, props.renderId, frame, fps);\n\telse opacityView = signalRegistry.getDummy1x1TextureView(ctx.device);\n\tuniformBufferData.fill(0);\n\tuniformBufferData[0] = numStops;\n\tuniformBufferData[1] = op.smooth === false ? 0 : 1;\n\tuniformBufferData[2] = op.dither === false ? 0 : 1;\n\tuniformBufferData[3] = opacityVal;\n\tuniformBufferData[4] = hasOpacitySig ? 1 : 0;\n\tuniformBufferData[5] = 0;\n\tuniformBufferData[6] = 0;\n\tuniformBufferData[7] = 0;\n\tfor (let i = 0; i < 16; i++) {\n\t\tconst stop = sortedStops[Math.min(i, numStops - 1)];\n\t\tconst baseIdx = 8 + i * 8;\n\t\tconst parsed = parseColor(stop.color);\n\t\tuniformBufferData[baseIdx + 0] = stop.position;\n\t\tuniformBufferData[baseIdx + 1] = 0;\n\t\tuniformBufferData[baseIdx + 2] = 0;\n\t\tuniformBufferData[baseIdx + 3] = 0;\n\t\tuniformBufferData[baseIdx + 4] = parsed.r;\n\t\tuniformBufferData[baseIdx + 5] = parsed.g;\n\t\tuniformBufferData[baseIdx + 6] = parsed.b;\n\t\tuniformBufferData[baseIdx + 7] = parsed.a;\n\t}\n\tconst { pipeline, uniformLayout, textureLayout, signalLayout } = getGradientMapResources(ctx.device, ctx.renderer.format);\n\tconst sampler = ctx.renderer.samplerCache.getSampler(ctx.device);\n\tconst buffer = ctx.renderer.getTemporaryBuffer(uniformBufferData);\n\tconst outTex = ctx.renderer.getTemporaryTexture(width, height, [\n\t\ttmpTex,\n\t\ttargetTexture,\n\t\t...props.excludeTextures || []\n\t]);\n\tdrawFullscreenPass(encoder, outTex.createView(), pipeline, [\n\t\tctx.device.createBindGroup({\n\t\t\tlayout: uniformLayout,\n\t\t\tentries: [{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: { buffer }\n\t\t\t}]\n\t\t}),\n\t\tctx.renderer.bindGroupCache.getBindGroup(ctx.device, textureLayout, tmpTex, sampler),\n\t\tctx.device.createBindGroup({\n\t\t\tlayout: signalLayout,\n\t\t\tentries: [{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: opacityView\n\t\t\t}, {\n\t\t\t\tbinding: 1,\n\t\t\t\tresource: sampler\n\t\t\t}]\n\t\t})\n\t]);\n\tdrawTextureToTarget(args, outTex, props.opacity ?? 1);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = { WebGPURenderer: GradientMapWebGPURenderer };\n\n//#endregion\nexport { GradientMapWebGPURenderer as n, renderers_default as t };\n//# sourceMappingURL=renderers-DDdRKrlK.mjs.map"],"mappings":"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"}
1
+ {"version":3,"file":"renderer-nMnE_T2y.mjs","names":[],"sources":["../../../nodes/node-gradient-map/dist/renderers-DDdRKrlK.mjs"],"sourcesContent":["import { FULLSCREEN_QUAD_WGSL, createFullscreenPipeline, drawChildToTexture, drawFullscreenPass, drawTextureToTarget, fragmentBindGroupLayout, signalTiming } from \"@framefields/node-sdk/gpu\";\nimport { parseColor, signalRegistry } from \"@framefields/webgpu-renderers\";\n\n//#region src/renderers/webgpu-renderer.ts\nconst deviceResourceCache = /* @__PURE__ */ new WeakMap();\nconst WGSL_GRADIENT_MAP_SHADER = `\nstruct GradientStop {\n\tpos : vec4<f32>,\n\tcol : vec4<f32>,\n};\n\nstruct GradientMapUniforms {\n\tnumStops : f32,\n\tisSmooth : f32,\n\tdither : f32,\n\topacity : f32,\n\n\thasOpacitySig : f32,\n\tpad0 : f32,\n\tpad1 : f32,\n\tpad2 : f32,\n\n\tstops : array<GradientStop, 16>,\n};\n\n@group(0) @binding(0) var<uniform> u : GradientMapUniforms;\n@group(1) @binding(0) var tex : texture_2d<f32>;\n@group(1) @binding(1) var samp : sampler;\n@group(2) @binding(0) var opacitySigTex : texture_2d<f32>;\n@group(2) @binding(1) var signalSamp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\nfn ditherNoise(pos: vec2<f32>) -> f32 {\n\tlet p = fract(pos * vec2<f32>(0.1031, 0.1030));\n\tlet d = dot(p, p.yx + 33.33);\n\treturn fract((p.x + p.y) * d) - 0.5;\n}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet color = textureSampleLevel(tex, samp, in.uv, 0.0);\n\tif (color.a <= 0.00001) {\n\t\treturn color;\n\t}\n\n\tlet alpha = color.a;\n\tlet rgb = color.rgb / max(alpha, 0.0001);\n\n\t// ITU-R BT.709 Luminance\n\tvar lum = dot(rgb, vec3<f32>(0.2126, 0.7152, 0.0722));\n\n\tif (u.dither > 0.5) {\n\t\tlet d = ditherNoise(in.pos.xy) * (1.0 / 255.0);\n\t\tlum = clamp(lum + d, 0.0, 1.0);\n\t} else {\n\t\tlum = clamp(lum, 0.0, 1.0);\n\t}\n\n\tlet count = i32(clamp(u.numStops, 2.0, 16.0));\n\tvar gradColor = u.stops[0].col.rgb;\n\n\tif (lum <= u.stops[0].pos.x) {\n\t\tgradColor = u.stops[0].col.rgb;\n\t} else if (lum >= u.stops[count - 1].pos.x) {\n\t\tgradColor = u.stops[count - 1].col.rgb;\n\t} else {\n\t\tfor (var i = 0; i < 15; i = i + 1) {\n\t\t\tif (i >= count - 1) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tlet p0 = u.stops[i].pos.x;\n\t\t\tlet p1 = u.stops[i + 1].pos.x;\n\n\t\t\tif (lum >= p0 && lum <= p1) {\n\t\t\t\tlet range = max(p1 - p0, 1e-5);\n\t\t\t\tlet t = clamp((lum - p0) / range, 0.0, 1.0);\n\t\t\t\tif (u.isSmooth > 0.5) {\n\t\t\t\t\tgradColor = mix(u.stops[i].col.rgb, u.stops[i + 1].col.rgb, t);\n\t\t\t\t} else {\n\t\t\t\t\tgradColor = u.stops[i].col.rgb;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tvar opacity = u.opacity;\n\tif (u.hasOpacitySig > 0.5) {\n\t\topacity = textureSampleLevel(opacitySigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n\t}\n\topacity = clamp(opacity, 0.0, 1.0);\n\n\tlet finalRgb = mix(rgb, gradColor, opacity);\n\treturn vec4<f32>(finalRgb * alpha, alpha);\n}\n`;\nfunction getGradientMapResources(device, format) {\n\tlet res = deviceResourceCache.get(device);\n\tif (res) return res;\n\tconst uniformLayout = fragmentBindGroupLayout(device, [\"uniform\"], \"GradientMapUniformLayout\");\n\tconst textureLayout = fragmentBindGroupLayout(device, [\"texture\", \"sampler\"], \"GradientMapTextureLayout\");\n\tconst signalLayout = fragmentBindGroupLayout(device, [\"texture\", \"sampler\"], \"GradientMapSignalLayout\");\n\tres = {\n\t\tpipeline: createFullscreenPipeline(device, {\n\t\t\tlabel: \"GradientMapPipeline\",\n\t\t\tmodule: device.createShaderModule({\n\t\t\t\tlabel: \"GradientMapShaderModule\",\n\t\t\t\tcode: WGSL_GRADIENT_MAP_SHADER\n\t\t\t}),\n\t\t\tlayouts: [\n\t\t\t\tuniformLayout,\n\t\t\t\ttextureLayout,\n\t\t\t\tsignalLayout\n\t\t\t],\n\t\t\tformat\n\t\t}),\n\t\tuniformLayout,\n\t\ttextureLayout,\n\t\tsignalLayout\n\t};\n\tdeviceResourceCache.set(device, res);\n\treturn res;\n}\nconst uniformBufferData = new Float32Array(136);\nconst GradientMapWebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetTexture, targetWidth, targetHeight, props } = args;\n\tconst frame = props.frame ?? 0;\n\tconst fps = props.fps || 30;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"GradientMap\" || !props.virtualMedia?.children?.[0]) return;\n\tpass.end();\n\tconst childMedia = props.virtualMedia.children[0];\n\tconst width = targetWidth;\n\tconst height = targetHeight;\n\tconst { texture: tmpTex } = await drawChildToTexture(args, childMedia);\n\tconst sortedStops = [...Array.isArray(op.stops) ? op.stops : [{\n\t\tposition: 0,\n\t\tcolor: \"#000000\"\n\t}, {\n\t\tposition: 1,\n\t\tcolor: \"#ffffff\"\n\t}]].sort((a, b) => a.position - b.position);\n\tconst numStops = Math.min(Math.max(sortedStops.length, 2), 16);\n\tconst opacityHandleId = op.opacityHandleId;\n\tconst opacitySignalInput = opacityHandleId ? op.inputs?.[opacityHandleId] : null;\n\tconst hasOpacitySig = !!(opacitySignalInput?.connectionValid && opacitySignalInput.outputItem?.type === \"Signal\");\n\tconst opacitySigData = hasOpacitySig ? opacitySignalInput?.outputItem?.data : null;\n\tlet opacityVal = Number(op.opacity ?? 1);\n\tif (!hasOpacitySig && opacitySignalInput?.connectionValid && opacitySignalInput.outputItem?.type === \"Number\") opacityVal = Number(opacitySignalInput.outputItem.data ?? 1);\n\tconst { elapsedSeconds, durationSeconds } = signalTiming(props, frame, fps);\n\tlet opacityView;\n\tif (hasOpacitySig && opacitySigData) opacityView = signalRegistry.getOrCreate2DTextureView(ctx.device, encoder, opacitySigData.nodeId ?? \"gradient_map_opacity\", elapsedSeconds, durationSeconds, opacitySigData, width, height, props.renderId, frame, fps);\n\telse opacityView = signalRegistry.getDummy1x1TextureView(ctx.device);\n\tuniformBufferData.fill(0);\n\tuniformBufferData[0] = numStops;\n\tuniformBufferData[1] = op.smooth === false ? 0 : 1;\n\tuniformBufferData[2] = op.dither === false ? 0 : 1;\n\tuniformBufferData[3] = opacityVal;\n\tuniformBufferData[4] = hasOpacitySig ? 1 : 0;\n\tuniformBufferData[5] = 0;\n\tuniformBufferData[6] = 0;\n\tuniformBufferData[7] = 0;\n\tfor (let i = 0; i < 16; i++) {\n\t\tconst stop = sortedStops[Math.min(i, numStops - 1)];\n\t\tconst baseIdx = 8 + i * 8;\n\t\tconst parsed = parseColor(stop.color);\n\t\tuniformBufferData[baseIdx + 0] = stop.position;\n\t\tuniformBufferData[baseIdx + 1] = 0;\n\t\tuniformBufferData[baseIdx + 2] = 0;\n\t\tuniformBufferData[baseIdx + 3] = 0;\n\t\tuniformBufferData[baseIdx + 4] = parsed.r;\n\t\tuniformBufferData[baseIdx + 5] = parsed.g;\n\t\tuniformBufferData[baseIdx + 6] = parsed.b;\n\t\tuniformBufferData[baseIdx + 7] = parsed.a;\n\t}\n\tconst { pipeline, uniformLayout, textureLayout, signalLayout } = getGradientMapResources(ctx.device, ctx.renderer.format);\n\tconst sampler = ctx.renderer.samplerCache.getSampler(ctx.device);\n\tconst buffer = ctx.renderer.getTemporaryBuffer(uniformBufferData);\n\tconst outTex = ctx.renderer.getTemporaryTexture(width, height, [\n\t\ttmpTex,\n\t\ttargetTexture,\n\t\t...props.excludeTextures || []\n\t]);\n\tdrawFullscreenPass(encoder, outTex.createView(), pipeline, [\n\t\tctx.device.createBindGroup({\n\t\t\tlayout: uniformLayout,\n\t\t\tentries: [{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: { buffer }\n\t\t\t}]\n\t\t}),\n\t\tctx.renderer.bindGroupCache.getBindGroup(ctx.device, textureLayout, tmpTex, sampler),\n\t\tctx.device.createBindGroup({\n\t\t\tlayout: signalLayout,\n\t\t\tentries: [{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: opacityView\n\t\t\t}, {\n\t\t\t\tbinding: 1,\n\t\t\t\tresource: sampler\n\t\t\t}]\n\t\t})\n\t]);\n\tdrawTextureToTarget(args, outTex, props.opacity ?? 1);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = { WebGPURenderer: GradientMapWebGPURenderer };\n\n//#endregion\nexport { GradientMapWebGPURenderer as n, renderers_default as t };\n//# sourceMappingURL=renderers-DDdRKrlK.mjs.map"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import "./chunk-GBe2k3y8.mjs";
2
2
  import { n as defineRenderer } from "./renderer-BSitV56h.mjs";
3
- import "./dist-CturBK2Z.mjs";
4
- import { c as drawTextureToTarget, l as fragmentBindGroupLayout, o as drawChildToTexture, s as drawFullscreenPass, t as FULLSCREEN_QUAD_WGSL, u as perDevice } from "./gpu-CN14e7Bi.mjs";
3
+ import "./dist-DRB6Vg5u.mjs";
4
+ import { c as drawTextureToTarget, l as fragmentBindGroupLayout, o as drawChildToTexture, s as drawFullscreenPass, t as FULLSCREEN_QUAD_WGSL, u as perDevice } from "./gpu-DOQX1W2q.mjs";
5
5
 
6
6
  //#region ../../nodes/node-kaleidoscope/dist/renderers-D5lECrP_.mjs
7
7
  const OP = "Kaleidoscope";
@@ -200,4 +200,4 @@ var renderers_default = defineRenderer({ WebGPURenderer: KaleidoscopeWebGPURende
200
200
 
201
201
  //#endregion
202
202
  export { KaleidoscopeWebGPURenderer, renderers_default as default };
203
- //# sourceMappingURL=renderer-CczmOPAO.mjs.map
203
+ //# sourceMappingURL=renderer-q971j1BW.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-CczmOPAO.mjs","names":[],"sources":["../../../nodes/node-kaleidoscope/dist/renderers-D5lECrP_.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { FULLSCREEN_QUAD_WGSL, drawChildToTexture, drawFullscreenPass, drawTextureToTarget, fragmentBindGroupLayout, perDevice } from \"@framefields/node-sdk/gpu\";\n\n//#region src/renderers/webgpu-renderer.ts\nconst OP = \"Kaleidoscope\";\nconst UNIFORM_FLOATS = 12;\n/** One fragment shader per pass; pass 0 reads the layer, later passes read the previous pass. */\nconst PASSES = [`struct U { v : array<vec4<f32>, 3> };\n@group(0) @binding(0) var<uniform> u : U;\n@group(0) @binding(1) var src : texture_2d<f32>;\n@group(0) @binding(2) var prev : texture_2d<f32>;\n@group(0) @binding(3) var samp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\nfn straight(c : vec4<f32>) -> vec4<f32> {\n\tif (c.a <= 0.0001) { return vec4<f32>(0.0); }\n\treturn vec4<f32>(c.rgb / c.a, c.a);\n}\nfn premul(c : vec4<f32>) -> vec4<f32> { return vec4<f32>(c.rgb * c.a, c.a); }\nfn res() -> vec2<f32> { return vec2<f32>(textureDimensions(src)); }\n/** Straight-alpha color of the layer at a uv (filtered). */\nfn sampleS(uv : vec2<f32>) -> vec4<f32> { return straight(textureSampleLevel(src, samp, uv, 0.0)); }\n/** Premultiplied color of the layer at a uv (filtered). */\nfn sampleP(uv : vec2<f32>) -> vec4<f32> { return textureSampleLevel(src, samp, uv, 0.0); }\n/** Straight-alpha color of the layer's texel at a pixel position (nearest). */\nfn texelS(p : vec2<f32>) -> vec4<f32> {\n\tlet d = vec2<i32>(textureDimensions(src));\n\tlet q = clamp(vec2<i32>(floor(p)), vec2<i32>(0), d - vec2<i32>(1));\n\treturn straight(textureLoad(src, q, 0));\n}\nfn luma(c : vec3<f32>) -> f32 { return dot(c, vec3<f32>(0.2126, 0.7152, 0.0722)); }\nfn hash12(p : vec2<f32>) -> f32 {\n\tvar p3 = fract(vec3<f32>(p.xyx) * 0.1031);\n\tp3 += dot(p3, p3.yzx + 33.33);\n\treturn fract((p3.x + p3.y) * p3.z);\n}\nfn vnoise(p : vec2<f32>) -> f32 {\n\tlet i = floor(p);\n\tlet f = fract(p);\n\tlet u = f * f * (3.0 - 2.0 * f);\n\treturn mix(mix(hash12(i), hash12(i + vec2<f32>(1.0, 0.0)), u.x),\n\t\tmix(hash12(i + vec2<f32>(0.0, 1.0)), hash12(i + vec2<f32>(1.0, 1.0)), u.x), u.y);\n}\n/** 8x8 ordered-dither threshold, 0..1. */\nfn bayer8(p : vec2<f32>) -> f32 {\n\tlet x = u32(p.x) & 7u;\n\tlet y = u32(p.y) & 7u;\n\tvar v = 0u;\n\tfor (var k = 0u; k < 3u; k++) {\n\t\tlet bx = (x >> k) & 1u;\n\t\tlet by = (y >> k) & 1u;\n\t\tlet m = ((bx ^ by) << 1u) | by;\n\t\tv += m * (1u << (2u * (2u - k)));\n\t}\n\treturn (f32(v) + 0.5) / 64.0;\n}\nfn rot2(a : f32) -> mat2x2<f32> { let c = cos(a); let s = sin(a); return mat2x2<f32>(c, s, -s, c); }\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet time = u.v[0].x;\n\tlet frame = u.v[0].y;\n\tlet segments = u.v[1].x;\n\tlet rotation = u.v[1].y;\n\tlet centerX = u.v[1].z;\n\tlet centerY = u.v[1].w;\n\tlet zoom = u.v[2].x;\n\n\tlet R = res();\n\tlet aspect = R.x / R.y;\n\tlet center = vec2<f32>(centerX, centerY);\n\tvar p = in.uv - center;\n\tp.x *= aspect;\n\tlet rad = length(p) / zoom;\n\tlet rot = radians(rotation);\n\tlet seg = 6.2831853 / segments;\n\tvar a = atan2(p.y, p.x) - rot;\n\ta = a - seg * floor(a / seg);\n\ta = min(a, seg - a);\n\tvar q = vec2<f32>(cos(a + rot), sin(a + rot)) * rad;\n\tq.x /= aspect;\n\tlet uv = q + center;\n\tlet m = vec2<f32>(1.0) - abs(fract(uv * 0.5) * 2.0 - vec2<f32>(1.0));\n\treturn sampleP(m);\n}\n`];\nconst resources = perDevice((device) => ({\n\tlayout: fragmentBindGroupLayout(device, [\n\t\t\"uniform\",\n\t\t\"texture\",\n\t\t\"texture\",\n\t\t\"sampler\"\n\t], `${OP}_layout`),\n\tpipelines: /* @__PURE__ */ new Map(),\n\tsampler: device.createSampler({\n\t\tmagFilter: \"linear\",\n\t\tminFilter: \"linear\",\n\t\taddressModeU: \"clamp-to-edge\",\n\t\taddressModeV: \"clamp-to-edge\"\n\t})\n}));\nfunction pipelinesFor(device, format) {\n\tconst r = resources(device);\n\tlet list = r.pipelines.get(format);\n\tif (!list) {\n\t\tlist = PASSES.map((code, i) => {\n\t\t\tconst module = device.createShaderModule({\n\t\t\t\tcode,\n\t\t\t\tlabel: `${OP}_${i}.wgsl`\n\t\t\t});\n\t\t\treturn device.createRenderPipeline({\n\t\t\t\tlabel: `${OP}_${i}`,\n\t\t\t\tlayout: device.createPipelineLayout({ bindGroupLayouts: [r.layout] }),\n\t\t\t\tvertex: {\n\t\t\t\t\tmodule,\n\t\t\t\t\tentryPoint: \"vs\"\n\t\t\t\t},\n\t\t\t\tfragment: {\n\t\t\t\t\tmodule,\n\t\t\t\t\tentryPoint: \"fs\",\n\t\t\t\t\ttargets: [{ format }]\n\t\t\t\t},\n\t\t\t\tprimitive: { topology: \"triangle-strip\" }\n\t\t\t});\n\t\t});\n\t\tr.pipelines.set(format, list);\n\t}\n\treturn list;\n}\nfunction num(v, fallback) {\n\tconst n = typeof v === \"number\" ? v : Number(v);\n\treturn Number.isFinite(n) ? n : fallback;\n}\n/** Packs the effect's resolved props into the uniform block the shaders read. */\nfunction pack(raw, data, time, frame) {\n\tdata.fill(0);\n\tdata[0] = time;\n\tdata[1] = frame;\n\tdata[4] = num(raw.segments, 6);\n\tdata[5] = num(raw.rotation, 0);\n\tdata[6] = num(raw.centerX, .5);\n\tdata[7] = num(raw.centerY, .5);\n\tdata[8] = num(raw.zoom, 1);\n}\nconst KaleidoscopeWebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetTexture, targetWidth, targetHeight, props } = args;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== OP) return;\n\tconst child = props.virtualMedia?.children?.[0];\n\tif (!child) return;\n\tpass.end();\n\tconst fps = props.fps || 30;\n\tconst frame = Math.round(props.compositionFrame ?? props.frame ?? 0);\n\tconst raw = op.effect?.resolveUniforms ? op.effect.resolveUniforms({\n\t\tframe,\n\t\tfps,\n\t\ttime: frame / fps\n\t}) : op;\n\tconst data = new Float32Array(UNIFORM_FLOATS);\n\tpack(raw, data, frame / fps, frame);\n\tconst { texture: childTex } = await drawChildToTexture(args, child);\n\tconst device = ctx.device;\n\tconst r = resources(device);\n\tconst pipelines = pipelinesFor(device, ctx.renderer.format);\n\tconst ubo = ctx.renderer.getTemporaryBuffer(data);\n\tlet prev = childTex;\n\tfor (const pipeline of pipelines) {\n\t\tconst out = ctx.renderer.getTemporaryTexture(targetWidth, targetHeight, [\n\t\t\tchildTex,\n\t\t\tprev,\n\t\t\ttargetTexture,\n\t\t\t...props.excludeTextures || []\n\t\t]);\n\t\tdrawFullscreenPass(encoder, out.createView(), pipeline, [device.createBindGroup({\n\t\t\tlayout: r.layout,\n\t\t\tentries: [\n\t\t\t\t{\n\t\t\t\t\tbinding: 0,\n\t\t\t\t\tresource: { buffer: ubo }\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 1,\n\t\t\t\t\tresource: childTex.createView()\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 2,\n\t\t\t\t\tresource: prev.createView()\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 3,\n\t\t\t\t\tresource: r.sampler\n\t\t\t\t}\n\t\t\t]\n\t\t})]);\n\t\tprev = out;\n\t}\n\tdrawTextureToTarget(args, prev);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: KaleidoscopeWebGPURenderer });\n\n//#endregion\nexport { KaleidoscopeWebGPURenderer as n, renderers_default as t };\n//# sourceMappingURL=renderers-D5lECrP_.mjs.map"],"mappings":"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"}
1
+ {"version":3,"file":"renderer-q971j1BW.mjs","names":[],"sources":["../../../nodes/node-kaleidoscope/dist/renderers-D5lECrP_.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { FULLSCREEN_QUAD_WGSL, drawChildToTexture, drawFullscreenPass, drawTextureToTarget, fragmentBindGroupLayout, perDevice } from \"@framefields/node-sdk/gpu\";\n\n//#region src/renderers/webgpu-renderer.ts\nconst OP = \"Kaleidoscope\";\nconst UNIFORM_FLOATS = 12;\n/** One fragment shader per pass; pass 0 reads the layer, later passes read the previous pass. */\nconst PASSES = [`struct U { v : array<vec4<f32>, 3> };\n@group(0) @binding(0) var<uniform> u : U;\n@group(0) @binding(1) var src : texture_2d<f32>;\n@group(0) @binding(2) var prev : texture_2d<f32>;\n@group(0) @binding(3) var samp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\nfn straight(c : vec4<f32>) -> vec4<f32> {\n\tif (c.a <= 0.0001) { return vec4<f32>(0.0); }\n\treturn vec4<f32>(c.rgb / c.a, c.a);\n}\nfn premul(c : vec4<f32>) -> vec4<f32> { return vec4<f32>(c.rgb * c.a, c.a); }\nfn res() -> vec2<f32> { return vec2<f32>(textureDimensions(src)); }\n/** Straight-alpha color of the layer at a uv (filtered). */\nfn sampleS(uv : vec2<f32>) -> vec4<f32> { return straight(textureSampleLevel(src, samp, uv, 0.0)); }\n/** Premultiplied color of the layer at a uv (filtered). */\nfn sampleP(uv : vec2<f32>) -> vec4<f32> { return textureSampleLevel(src, samp, uv, 0.0); }\n/** Straight-alpha color of the layer's texel at a pixel position (nearest). */\nfn texelS(p : vec2<f32>) -> vec4<f32> {\n\tlet d = vec2<i32>(textureDimensions(src));\n\tlet q = clamp(vec2<i32>(floor(p)), vec2<i32>(0), d - vec2<i32>(1));\n\treturn straight(textureLoad(src, q, 0));\n}\nfn luma(c : vec3<f32>) -> f32 { return dot(c, vec3<f32>(0.2126, 0.7152, 0.0722)); }\nfn hash12(p : vec2<f32>) -> f32 {\n\tvar p3 = fract(vec3<f32>(p.xyx) * 0.1031);\n\tp3 += dot(p3, p3.yzx + 33.33);\n\treturn fract((p3.x + p3.y) * p3.z);\n}\nfn vnoise(p : vec2<f32>) -> f32 {\n\tlet i = floor(p);\n\tlet f = fract(p);\n\tlet u = f * f * (3.0 - 2.0 * f);\n\treturn mix(mix(hash12(i), hash12(i + vec2<f32>(1.0, 0.0)), u.x),\n\t\tmix(hash12(i + vec2<f32>(0.0, 1.0)), hash12(i + vec2<f32>(1.0, 1.0)), u.x), u.y);\n}\n/** 8x8 ordered-dither threshold, 0..1. */\nfn bayer8(p : vec2<f32>) -> f32 {\n\tlet x = u32(p.x) & 7u;\n\tlet y = u32(p.y) & 7u;\n\tvar v = 0u;\n\tfor (var k = 0u; k < 3u; k++) {\n\t\tlet bx = (x >> k) & 1u;\n\t\tlet by = (y >> k) & 1u;\n\t\tlet m = ((bx ^ by) << 1u) | by;\n\t\tv += m * (1u << (2u * (2u - k)));\n\t}\n\treturn (f32(v) + 0.5) / 64.0;\n}\nfn rot2(a : f32) -> mat2x2<f32> { let c = cos(a); let s = sin(a); return mat2x2<f32>(c, s, -s, c); }\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tlet time = u.v[0].x;\n\tlet frame = u.v[0].y;\n\tlet segments = u.v[1].x;\n\tlet rotation = u.v[1].y;\n\tlet centerX = u.v[1].z;\n\tlet centerY = u.v[1].w;\n\tlet zoom = u.v[2].x;\n\n\tlet R = res();\n\tlet aspect = R.x / R.y;\n\tlet center = vec2<f32>(centerX, centerY);\n\tvar p = in.uv - center;\n\tp.x *= aspect;\n\tlet rad = length(p) / zoom;\n\tlet rot = radians(rotation);\n\tlet seg = 6.2831853 / segments;\n\tvar a = atan2(p.y, p.x) - rot;\n\ta = a - seg * floor(a / seg);\n\ta = min(a, seg - a);\n\tvar q = vec2<f32>(cos(a + rot), sin(a + rot)) * rad;\n\tq.x /= aspect;\n\tlet uv = q + center;\n\tlet m = vec2<f32>(1.0) - abs(fract(uv * 0.5) * 2.0 - vec2<f32>(1.0));\n\treturn sampleP(m);\n}\n`];\nconst resources = perDevice((device) => ({\n\tlayout: fragmentBindGroupLayout(device, [\n\t\t\"uniform\",\n\t\t\"texture\",\n\t\t\"texture\",\n\t\t\"sampler\"\n\t], `${OP}_layout`),\n\tpipelines: /* @__PURE__ */ new Map(),\n\tsampler: device.createSampler({\n\t\tmagFilter: \"linear\",\n\t\tminFilter: \"linear\",\n\t\taddressModeU: \"clamp-to-edge\",\n\t\taddressModeV: \"clamp-to-edge\"\n\t})\n}));\nfunction pipelinesFor(device, format) {\n\tconst r = resources(device);\n\tlet list = r.pipelines.get(format);\n\tif (!list) {\n\t\tlist = PASSES.map((code, i) => {\n\t\t\tconst module = device.createShaderModule({\n\t\t\t\tcode,\n\t\t\t\tlabel: `${OP}_${i}.wgsl`\n\t\t\t});\n\t\t\treturn device.createRenderPipeline({\n\t\t\t\tlabel: `${OP}_${i}`,\n\t\t\t\tlayout: device.createPipelineLayout({ bindGroupLayouts: [r.layout] }),\n\t\t\t\tvertex: {\n\t\t\t\t\tmodule,\n\t\t\t\t\tentryPoint: \"vs\"\n\t\t\t\t},\n\t\t\t\tfragment: {\n\t\t\t\t\tmodule,\n\t\t\t\t\tentryPoint: \"fs\",\n\t\t\t\t\ttargets: [{ format }]\n\t\t\t\t},\n\t\t\t\tprimitive: { topology: \"triangle-strip\" }\n\t\t\t});\n\t\t});\n\t\tr.pipelines.set(format, list);\n\t}\n\treturn list;\n}\nfunction num(v, fallback) {\n\tconst n = typeof v === \"number\" ? v : Number(v);\n\treturn Number.isFinite(n) ? n : fallback;\n}\n/** Packs the effect's resolved props into the uniform block the shaders read. */\nfunction pack(raw, data, time, frame) {\n\tdata.fill(0);\n\tdata[0] = time;\n\tdata[1] = frame;\n\tdata[4] = num(raw.segments, 6);\n\tdata[5] = num(raw.rotation, 0);\n\tdata[6] = num(raw.centerX, .5);\n\tdata[7] = num(raw.centerY, .5);\n\tdata[8] = num(raw.zoom, 1);\n}\nconst KaleidoscopeWebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetTexture, targetWidth, targetHeight, props } = args;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== OP) return;\n\tconst child = props.virtualMedia?.children?.[0];\n\tif (!child) return;\n\tpass.end();\n\tconst fps = props.fps || 30;\n\tconst frame = Math.round(props.compositionFrame ?? props.frame ?? 0);\n\tconst raw = op.effect?.resolveUniforms ? op.effect.resolveUniforms({\n\t\tframe,\n\t\tfps,\n\t\ttime: frame / fps\n\t}) : op;\n\tconst data = new Float32Array(UNIFORM_FLOATS);\n\tpack(raw, data, frame / fps, frame);\n\tconst { texture: childTex } = await drawChildToTexture(args, child);\n\tconst device = ctx.device;\n\tconst r = resources(device);\n\tconst pipelines = pipelinesFor(device, ctx.renderer.format);\n\tconst ubo = ctx.renderer.getTemporaryBuffer(data);\n\tlet prev = childTex;\n\tfor (const pipeline of pipelines) {\n\t\tconst out = ctx.renderer.getTemporaryTexture(targetWidth, targetHeight, [\n\t\t\tchildTex,\n\t\t\tprev,\n\t\t\ttargetTexture,\n\t\t\t...props.excludeTextures || []\n\t\t]);\n\t\tdrawFullscreenPass(encoder, out.createView(), pipeline, [device.createBindGroup({\n\t\t\tlayout: r.layout,\n\t\t\tentries: [\n\t\t\t\t{\n\t\t\t\t\tbinding: 0,\n\t\t\t\t\tresource: { buffer: ubo }\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 1,\n\t\t\t\t\tresource: childTex.createView()\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 2,\n\t\t\t\t\tresource: prev.createView()\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 3,\n\t\t\t\t\tresource: r.sampler\n\t\t\t\t}\n\t\t\t]\n\t\t})]);\n\t\tprev = out;\n\t}\n\tdrawTextureToTarget(args, prev);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: KaleidoscopeWebGPURenderer });\n\n//#endregion\nexport { KaleidoscopeWebGPURenderer as n, renderers_default as t };\n//# sourceMappingURL=renderers-D5lECrP_.mjs.map"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import "./chunk-GBe2k3y8.mjs";
2
2
  import { n as defineRenderer } from "./renderer-BSitV56h.mjs";
3
- import "./dist-CturBK2Z.mjs";
4
- import { a as createFullscreenPipeline, l as fragmentBindGroupLayout, t as FULLSCREEN_QUAD_WGSL, u as perDevice } from "./gpu-CN14e7Bi.mjs";
3
+ import "./dist-DRB6Vg5u.mjs";
4
+ import { a as createFullscreenPipeline, l as fragmentBindGroupLayout, t as FULLSCREEN_QUAD_WGSL, u as perDevice } from "./gpu-DOQX1W2q.mjs";
5
5
 
6
6
  //#region ../../nodes/node-canvas-generator/dist/renderers-BNR_p9ve.mjs
7
7
  const CANVAS_SHADER = `
@@ -127,4 +127,4 @@ var renderers_default = defineRenderer({ WebGPURenderer: CanvasGeneratorWebGPURe
127
127
 
128
128
  //#endregion
129
129
  export { CanvasGeneratorWebGPURenderer, renderers_default as default };
130
- //# sourceMappingURL=renderer-DJWQWN1E.mjs.map
130
+ //# sourceMappingURL=renderer-wFyrVuuj.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-DJWQWN1E.mjs","names":[],"sources":["../../../nodes/node-canvas-generator/dist/renderers-BNR_p9ve.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { FULLSCREEN_QUAD_WGSL, createFullscreenPipeline, fragmentBindGroupLayout, perDevice } from \"@framefields/node-sdk/gpu\";\n\n//#region src/renderers/webgpu-renderer.ts\nconst CANVAS_SHADER = `\nstruct CanvasUniforms {\n fillType : f32, // 0 = Solid, 1 = Linear, 2 = Radial\n angleRad : f32,\n radius : f32,\n _padding1 : f32,\n solid : vec4<f32>,\n startColor : vec4<f32>,\n endColor : vec4<f32>,\n center : vec2<f32>,\n _padding2 : vec2<f32>,\n};\n\n@group(0) @binding(0) var<uniform> u : CanvasUniforms;\n${FULLSCREEN_QUAD_WGSL}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n if (u.fillType < 0.5) {\n // Solid Color\n return u.solid;\n } else if (u.fillType < 1.5) {\n // Linear Gradient\n let dir = vec2<f32>(cos(u.angleRad), sin(u.angleRad));\n // Project uv relative to center (0.5, 0.5) onto the direction\n let t = dot(in.uv - vec2<f32>(0.5, 0.5), dir) + 0.5;\n let clampedT = clamp(t, 0.0, 1.0);\n return mix(u.startColor, u.endColor, clampedT);\n } else {\n // Radial Gradient\n let dist = distance(in.uv, u.center);\n let t = clamp(dist / max(u.radius, 1e-4), 0.0, 1.0);\n return mix(u.startColor, u.endColor, t);\n }\n}\n`;\nconst canvasUniformData = new Float32Array(20);\nconst getDeviceLayouts = perDevice((device) => ({\n\tuniformLayout: fragmentBindGroupLayout(device, [\"uniform\"]),\n\tpipelineCache: /* @__PURE__ */ new Map()\n}));\nfunction getCanvasResources(device, format) {\n\tconst layouts = getDeviceLayouts(device);\n\tconst cacheKey = `canvas_${format}`;\n\tlet pipeline = layouts.pipelineCache.get(cacheKey);\n\tif (!pipeline) {\n\t\tconst canvasModule = device.createShaderModule({\n\t\t\tlabel: `canvas_${format}.wgsl`,\n\t\t\tcode: CANVAS_SHADER\n\t\t});\n\t\tpipeline = createFullscreenPipeline(device, {\n\t\t\tlabel: `CanvasGeneratorPipeline_${format}`,\n\t\t\tmodule: canvasModule,\n\t\t\tlayouts: [layouts.uniformLayout],\n\t\t\tformat\n\t\t});\n\t\tlayouts.pipelineCache.set(cacheKey, pipeline);\n\t}\n\treturn {\n\t\tcanvasPipeline: pipeline,\n\t\tuniformLayout: layouts.uniformLayout\n\t};\n}\nfunction hexToRgba(hex) {\n\tlet h = hex.replace(\"#\", \"\");\n\tif (h.length === 3 || h.length === 4) h = h.split(\"\").map((c) => c + c).join(\"\");\n\tconst r = parseInt(h.substring(0, 2), 16) / 255;\n\tconst g = parseInt(h.substring(2, 4), 16) / 255;\n\tconst b = parseInt(h.substring(4, 6), 16) / 255;\n\tlet a = 1;\n\tif (h.length === 8) a = parseInt(h.substring(6, 8), 16) / 255;\n\treturn [\n\t\tr,\n\t\tg,\n\t\tb,\n\t\ta\n\t];\n}\nconst CanvasGeneratorWebGPURenderer = async (args) => {\n\tconst { ctx, pass, props } = args;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"CanvasGenerator\" || !op) return;\n\tconst { canvasPipeline: pipeline, uniformLayout: uLayout } = getCanvasResources(ctx.device, ctx.renderer.format);\n\tconst fillTypeVal = op.fillType === \"radial\" ? 2 : op.fillType === \"linear\" ? 1 : 0;\n\tconst angleRadVal = (op.gradientAngle ?? 180) * Math.PI / 180;\n\tconst radialRadiusVal = op.radialRadius ?? .5;\n\tconst solidCol = hexToRgba(op.solidColor ?? \"#3b82f6\");\n\tconst startCol = hexToRgba(op.gradientStart ?? \"#3b82f6\");\n\tconst endCol = hexToRgba(op.gradientEnd ?? \"#1d4ed8\");\n\tcanvasUniformData[0] = fillTypeVal;\n\tcanvasUniformData[1] = angleRadVal;\n\tcanvasUniformData[2] = radialRadiusVal;\n\tcanvasUniformData[3] = 0;\n\tcanvasUniformData[4] = solidCol[0];\n\tcanvasUniformData[5] = solidCol[1];\n\tcanvasUniformData[6] = solidCol[2];\n\tcanvasUniformData[7] = solidCol[3];\n\tcanvasUniformData[8] = startCol[0];\n\tcanvasUniformData[9] = startCol[1];\n\tcanvasUniformData[10] = startCol[2];\n\tcanvasUniformData[11] = startCol[3];\n\tcanvasUniformData[12] = endCol[0];\n\tcanvasUniformData[13] = endCol[1];\n\tcanvasUniformData[14] = endCol[2];\n\tcanvasUniformData[15] = endCol[3];\n\tcanvasUniformData[16] = op.radialCenterX ?? .5;\n\tcanvasUniformData[17] = op.radialCenterY ?? .5;\n\tcanvasUniformData[18] = 0;\n\tcanvasUniformData[19] = 0;\n\tconst uniformBuffer = ctx.renderer.getTemporaryBuffer(canvasUniformData);\n\tpass.setPipeline(pipeline);\n\tpass.setBindGroup(0, ctx.device.createBindGroup({\n\t\tlayout: uLayout,\n\t\tentries: [{\n\t\t\tbinding: 0,\n\t\t\tresource: { buffer: uniformBuffer }\n\t\t}]\n\t}));\n\tpass.draw(4);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: CanvasGeneratorWebGPURenderer });\n\n//#endregion\nexport { CanvasGeneratorWebGPURenderer as n, renderers_default as t };\n//# sourceMappingURL=renderers-BNR_p9ve.mjs.map"],"mappings":"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"}
1
+ {"version":3,"file":"renderer-wFyrVuuj.mjs","names":[],"sources":["../../../nodes/node-canvas-generator/dist/renderers-BNR_p9ve.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { FULLSCREEN_QUAD_WGSL, createFullscreenPipeline, fragmentBindGroupLayout, perDevice } from \"@framefields/node-sdk/gpu\";\n\n//#region src/renderers/webgpu-renderer.ts\nconst CANVAS_SHADER = `\nstruct CanvasUniforms {\n fillType : f32, // 0 = Solid, 1 = Linear, 2 = Radial\n angleRad : f32,\n radius : f32,\n _padding1 : f32,\n solid : vec4<f32>,\n startColor : vec4<f32>,\n endColor : vec4<f32>,\n center : vec2<f32>,\n _padding2 : vec2<f32>,\n};\n\n@group(0) @binding(0) var<uniform> u : CanvasUniforms;\n${FULLSCREEN_QUAD_WGSL}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n if (u.fillType < 0.5) {\n // Solid Color\n return u.solid;\n } else if (u.fillType < 1.5) {\n // Linear Gradient\n let dir = vec2<f32>(cos(u.angleRad), sin(u.angleRad));\n // Project uv relative to center (0.5, 0.5) onto the direction\n let t = dot(in.uv - vec2<f32>(0.5, 0.5), dir) + 0.5;\n let clampedT = clamp(t, 0.0, 1.0);\n return mix(u.startColor, u.endColor, clampedT);\n } else {\n // Radial Gradient\n let dist = distance(in.uv, u.center);\n let t = clamp(dist / max(u.radius, 1e-4), 0.0, 1.0);\n return mix(u.startColor, u.endColor, t);\n }\n}\n`;\nconst canvasUniformData = new Float32Array(20);\nconst getDeviceLayouts = perDevice((device) => ({\n\tuniformLayout: fragmentBindGroupLayout(device, [\"uniform\"]),\n\tpipelineCache: /* @__PURE__ */ new Map()\n}));\nfunction getCanvasResources(device, format) {\n\tconst layouts = getDeviceLayouts(device);\n\tconst cacheKey = `canvas_${format}`;\n\tlet pipeline = layouts.pipelineCache.get(cacheKey);\n\tif (!pipeline) {\n\t\tconst canvasModule = device.createShaderModule({\n\t\t\tlabel: `canvas_${format}.wgsl`,\n\t\t\tcode: CANVAS_SHADER\n\t\t});\n\t\tpipeline = createFullscreenPipeline(device, {\n\t\t\tlabel: `CanvasGeneratorPipeline_${format}`,\n\t\t\tmodule: canvasModule,\n\t\t\tlayouts: [layouts.uniformLayout],\n\t\t\tformat\n\t\t});\n\t\tlayouts.pipelineCache.set(cacheKey, pipeline);\n\t}\n\treturn {\n\t\tcanvasPipeline: pipeline,\n\t\tuniformLayout: layouts.uniformLayout\n\t};\n}\nfunction hexToRgba(hex) {\n\tlet h = hex.replace(\"#\", \"\");\n\tif (h.length === 3 || h.length === 4) h = h.split(\"\").map((c) => c + c).join(\"\");\n\tconst r = parseInt(h.substring(0, 2), 16) / 255;\n\tconst g = parseInt(h.substring(2, 4), 16) / 255;\n\tconst b = parseInt(h.substring(4, 6), 16) / 255;\n\tlet a = 1;\n\tif (h.length === 8) a = parseInt(h.substring(6, 8), 16) / 255;\n\treturn [\n\t\tr,\n\t\tg,\n\t\tb,\n\t\ta\n\t];\n}\nconst CanvasGeneratorWebGPURenderer = async (args) => {\n\tconst { ctx, pass, props } = args;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"CanvasGenerator\" || !op) return;\n\tconst { canvasPipeline: pipeline, uniformLayout: uLayout } = getCanvasResources(ctx.device, ctx.renderer.format);\n\tconst fillTypeVal = op.fillType === \"radial\" ? 2 : op.fillType === \"linear\" ? 1 : 0;\n\tconst angleRadVal = (op.gradientAngle ?? 180) * Math.PI / 180;\n\tconst radialRadiusVal = op.radialRadius ?? .5;\n\tconst solidCol = hexToRgba(op.solidColor ?? \"#3b82f6\");\n\tconst startCol = hexToRgba(op.gradientStart ?? \"#3b82f6\");\n\tconst endCol = hexToRgba(op.gradientEnd ?? \"#1d4ed8\");\n\tcanvasUniformData[0] = fillTypeVal;\n\tcanvasUniformData[1] = angleRadVal;\n\tcanvasUniformData[2] = radialRadiusVal;\n\tcanvasUniformData[3] = 0;\n\tcanvasUniformData[4] = solidCol[0];\n\tcanvasUniformData[5] = solidCol[1];\n\tcanvasUniformData[6] = solidCol[2];\n\tcanvasUniformData[7] = solidCol[3];\n\tcanvasUniformData[8] = startCol[0];\n\tcanvasUniformData[9] = startCol[1];\n\tcanvasUniformData[10] = startCol[2];\n\tcanvasUniformData[11] = startCol[3];\n\tcanvasUniformData[12] = endCol[0];\n\tcanvasUniformData[13] = endCol[1];\n\tcanvasUniformData[14] = endCol[2];\n\tcanvasUniformData[15] = endCol[3];\n\tcanvasUniformData[16] = op.radialCenterX ?? .5;\n\tcanvasUniformData[17] = op.radialCenterY ?? .5;\n\tcanvasUniformData[18] = 0;\n\tcanvasUniformData[19] = 0;\n\tconst uniformBuffer = ctx.renderer.getTemporaryBuffer(canvasUniformData);\n\tpass.setPipeline(pipeline);\n\tpass.setBindGroup(0, ctx.device.createBindGroup({\n\t\tlayout: uLayout,\n\t\tentries: [{\n\t\t\tbinding: 0,\n\t\t\tresource: { buffer: uniformBuffer }\n\t\t}]\n\t}));\n\tpass.draw(4);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: CanvasGeneratorWebGPURenderer });\n\n//#endregion\nexport { CanvasGeneratorWebGPURenderer as n, renderers_default as t };\n//# sourceMappingURL=renderers-BNR_p9ve.mjs.map"],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import "./chunk-GBe2k3y8.mjs";
2
+ import "./dist-DRB6Vg5u.mjs";
3
+ import { t as renderers_default } from "./renderer-DOkEalxy.mjs";
4
+
5
+ export { renderers_default as default };
@@ -1,6 +1,6 @@
1
1
  import { Jt as resolveNumber, Xt as resolveString } from "./dist-fjKpBYkc.mjs";
2
2
  import { n as defineRenderer, r as isHandleConnected } from "./renderer-BSitV56h.mjs";
3
- import { g as WebGPUAudioProcessor } from "./dist-CturBK2Z.mjs";
3
+ import { g as WebGPUAudioProcessor } from "./dist-DRB6Vg5u.mjs";
4
4
 
5
5
  //#region ../../nodes/node-audio-fade/dist/renderers-C_aLLJ4x.mjs
6
6
  const PARAM_ORDER = ["fadeInDuration", "fadeOutDuration"];
@@ -173,4 +173,4 @@ var renderers_default = defineRenderer({ audioProcessor: fadeAudioProcessor });
173
173
 
174
174
  //#endregion
175
175
  export { renderers_default as t };
176
- //# sourceMappingURL=renderer-DYo_a5-8.mjs.map
176
+ //# sourceMappingURL=renderer-yGARXwV0.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-DYo_a5-8.mjs","names":[],"sources":["../../../nodes/node-audio-fade/dist/renderers-C_aLLJ4x.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { isHandleConnected, resolveNumber, resolveString } from \"@framefields/node-sdk\";\nimport { WebGPUAudioProcessor } from \"@framefields/webgpu-renderers\";\n\n//#region src/renderers/audio-processor.ts\nconst PARAM_ORDER = [\"fadeInDuration\", \"fadeOutDuration\"];\nconst FADE_SHADER_TEMPLATE = () => `\nstruct Uniforms {\n sampleRate : f32,\n fadeInDuration : f32,\n fadeOutDuration : f32,\n fadeInCurve : f32,\n fadeOutCurve : f32,\n clipDuration : f32,\n hasFadeInDurationSig : f32,\n hasFadeOutDurationSig : f32,\n baseTime : f32,\n frame : f32,\n numSamples : f32,\n numChannels : f32,\n pad1 : f32,\n pad2 : f32,\n pad3 : f32,\n pad4 : 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] = samplesProcessed\n@group(0) @binding(4) var<storage, read> fadeInDurationSignal : array<f32>;\n@group(0) @binding(5) var<storage, read> fadeOutDurationSignal : array<f32>;\n\nfn applyCurve(p: f32, curve: f32) -> f32 {\n let clampedP = max(0.0f, min(p, 1.0f));\n if (curve == 1.0f) { // exponential\n return clampedP * clampedP;\n }\n if (curve == 2.0f) { // scurve\n return clampedP * clampedP * (3.0f - 2.0f * clampedP);\n }\n return clampedP; // linear\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 for (var index = 0u; index < numSamples; index = index + 1u) {\n let t = u.baseTime + f32(index) / u.sampleRate;\n var gain = 1.0f;\n\n var effFadeIn = u.fadeInDuration;\n if (u.hasFadeInDurationSig > 0.5f) {\n effFadeIn = fadeInDurationSignal[index];\n }\n effFadeIn = clamp(effFadeIn, 0.0f, 60.0f);\n\n var effFadeOut = u.fadeOutDuration;\n if (u.hasFadeOutDurationSig > 0.5f) {\n effFadeOut = fadeOutDurationSignal[index];\n }\n effFadeOut = clamp(effFadeOut, 0.0f, 60.0f);\n\n if (effFadeIn > 0.0f && t < effFadeIn) {\n let p = t / effFadeIn;\n gain = gain * applyCurve(p, u.fadeInCurve);\n }\n\n if (effFadeOut > 0.0f && t > u.clipDuration - effFadeOut) {\n let p = (u.clipDuration - t) / effFadeOut;\n gain = gain * applyCurve(p, u.fadeOutCurve);\n }\n\n gain = clamp(gain, 0.0f, 1.0f);\n\n for (var c = 0u; c < numChannels; c = c + 1u) {\n let sampleIndex = c * numSamples + index;\n var inVal = inputChannels[sampleIndex];\n if (is_nan_or_inf(inVal)) {\n inVal = 0.0f;\n }\n\n var outVal = inVal * gain;\n if (is_nan_or_inf(outVal)) {\n outVal = 0.0f;\n }\n\n if (outVal > 1.0f) {\n outVal = 1.0f;\n } else if (outVal < -1.0f) {\n outVal = -1.0f;\n } else if (outVal > 0.9f) {\n outVal = 0.9f + 0.1f * tanh((outVal - 0.9f) / 0.1f);\n } else if (outVal < -0.9f) {\n outVal = -0.9f + 0.1f * tanh((outVal + 0.9f) / 0.1f);\n }\n\n outputChannels[sampleIndex] = outVal;\n }\n }\n\n // Dummy reference to keep state binding active\n state[0] = state[0];\n}\n`;\nconst getCurveCode = (curve) => {\n\tif (curve === \"exponential\") return 1;\n\tif (curve === \"scurve\") return 2;\n\treturn 0;\n};\nconst fadeAudioProcessor = async (channels, sampleRate, virtualMedia, ctx) => {\n\tif (!ctx?.device) throw new Error(\"GPUDevice is required for WebGPU Audio Fade.\");\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 fadeInDuration = Math.max(0, resolveNumber(op.fadeInDuration, 0));\n\tconst fadeOutDuration = Math.max(0, resolveNumber(op.fadeOutDuration, 0));\n\tconst fadeInCurve = resolveString(op.fadeInCurve, \"linear\");\n\tconst fadeOutCurve = resolveString(op.fadeOutCurve, \"linear\");\n\tconst durationMs = virtualMedia.metadata?.durationMs ?? ctx?.durationMs ?? (typeof op.durationFrames === \"number\" && (ctx.fps ?? 24) > 0 ? op.durationFrames / (ctx.fps ?? 24) * 1e3 : void 0);\n\tconst clipDuration = durationMs !== void 0 && durationMs > 0 ? durationMs / 1e3 : numSamples / sampleRate;\n\tlet fadeIn = fadeInDuration;\n\tlet fadeOut = fadeOutDuration;\n\tif (clipDuration > 0 && fadeIn + fadeOut > clipDuration) {\n\t\tconst half = clipDuration / 2;\n\t\tfadeIn = Math.min(fadeIn, half);\n\t\tfadeOut = Math.min(fadeOut, half);\n\t}\n\tconst hasFadeInDurationSig = isHandleConnected(op, \"fadeInDurationHandleId\") ? 1 : 0;\n\tconst hasFadeOutDurationSig = isHandleConnected(op, \"fadeOutDurationHandleId\") ? 1 : 0;\n\tconst nodeId = op.id || \"audio-fade\";\n\tconst frame = ctx.frame ?? 0;\n\tconst fps = ctx.fps ?? 24;\n\tconst segmentStartSec = Math.max(0, (ctx.elapsedMs ?? 0) / 1e3);\n\tawait WebGPUAudioProcessor.process(ctx.device, nodeId, channels, sampleRate, virtualMedia, frame, fps, FADE_SHADER_TEMPLATE, (chunkTimeSec) => {\n\t\tconst mediaTimeSec = segmentStartSec + Math.max(0, chunkTimeSec - frame / fps);\n\t\treturn [\n\t\t\tsampleRate,\n\t\t\tfadeIn,\n\t\t\tfadeOut,\n\t\t\tgetCurveCode(fadeInCurve),\n\t\t\tgetCurveCode(fadeOutCurve),\n\t\t\tclipDuration,\n\t\t\thasFadeInDurationSig,\n\t\t\thasFadeOutDurationSig,\n\t\t\tmediaTimeSec,\n\t\t\tframe,\n\t\t\tnumSamples,\n\t\t\tnumChannels,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0\n\t\t];\n\t}, 16, 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: fadeAudioProcessor });\n\n//#endregion\nexport { renderers_default as t };\n//# sourceMappingURL=renderers-C_aLLJ4x.mjs.map"],"mappings":";;;;;AAKA,MAAM,cAAc,CAAC,kBAAkB,kBAAkB;AACzD,MAAM,6BAA6B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgHnC,MAAM,gBAAgB,UAAU;AAC/B,KAAI,UAAU,cAAe,QAAO;AACpC,KAAI,UAAU,SAAU,QAAO;AAC/B,QAAO;;AAER,MAAM,qBAAqB,OAAO,UAAU,YAAY,cAAc,QAAQ;AAC7E,KAAI,CAAC,KAAK,OAAQ,OAAM,IAAI,MAAM,+CAA+C;CACjF,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,iBAAiB,KAAK,IAAI,GAAG,cAAc,GAAG,gBAAgB,EAAE,CAAC;CACvE,MAAM,kBAAkB,KAAK,IAAI,GAAG,cAAc,GAAG,iBAAiB,EAAE,CAAC;CACzE,MAAM,cAAc,cAAc,GAAG,aAAa,SAAS;CAC3D,MAAM,eAAe,cAAc,GAAG,cAAc,SAAS;CAC7D,MAAM,aAAa,aAAa,UAAU,cAAc,KAAK,eAAe,OAAO,GAAG,mBAAmB,aAAa,IAAI,OAAO,MAAM,IAAI,GAAG,kBAAkB,IAAI,OAAO,MAAM,MAAM,KAAK;CAC5L,MAAM,eAAe,eAAe,KAAK,KAAK,aAAa,IAAI,aAAa,MAAM,aAAa;CAC/F,IAAI,SAAS;CACb,IAAI,UAAU;AACd,KAAI,eAAe,KAAK,SAAS,UAAU,cAAc;EACxD,MAAM,OAAO,eAAe;AAC5B,WAAS,KAAK,IAAI,QAAQ,KAAK;AAC/B,YAAU,KAAK,IAAI,SAAS,KAAK;;CAElC,MAAM,uBAAuB,kBAAkB,IAAI,yBAAyB,GAAG,IAAI;CACnF,MAAM,wBAAwB,kBAAkB,IAAI,0BAA0B,GAAG,IAAI;CACrF,MAAM,SAAS,GAAG,MAAM;CACxB,MAAM,QAAQ,IAAI,SAAS;CAC3B,MAAM,MAAM,IAAI,OAAO;CACvB,MAAM,kBAAkB,KAAK,IAAI,IAAI,IAAI,aAAa,KAAK,IAAI;AAC/D,OAAM,qBAAqB,QAAQ,IAAI,QAAQ,QAAQ,UAAU,YAAY,cAAc,OAAO,KAAK,uBAAuB,iBAAiB;EAC9I,MAAM,eAAe,kBAAkB,KAAK,IAAI,GAAG,eAAe,QAAQ,IAAI;AAC9E,SAAO;GACN;GACA;GACA;GACA,aAAa,YAAY;GACzB,aAAa,aAAa;GAC1B;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;IACC,IAAI,GAAG,KAAK,UAAU,MAAM,KAAK,WAAW,KAAK,YAAY,KAAK,GAAG,KAAK,GAAG,YAAY;;AAK7F,IAAI,oBAAoB,eAAe,EAAE,gBAAgB,oBAAoB,CAAC"}
1
+ {"version":3,"file":"renderer-yGARXwV0.mjs","names":[],"sources":["../../../nodes/node-audio-fade/dist/renderers-C_aLLJ4x.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { isHandleConnected, resolveNumber, resolveString } from \"@framefields/node-sdk\";\nimport { WebGPUAudioProcessor } from \"@framefields/webgpu-renderers\";\n\n//#region src/renderers/audio-processor.ts\nconst PARAM_ORDER = [\"fadeInDuration\", \"fadeOutDuration\"];\nconst FADE_SHADER_TEMPLATE = () => `\nstruct Uniforms {\n sampleRate : f32,\n fadeInDuration : f32,\n fadeOutDuration : f32,\n fadeInCurve : f32,\n fadeOutCurve : f32,\n clipDuration : f32,\n hasFadeInDurationSig : f32,\n hasFadeOutDurationSig : f32,\n baseTime : f32,\n frame : f32,\n numSamples : f32,\n numChannels : f32,\n pad1 : f32,\n pad2 : f32,\n pad3 : f32,\n pad4 : 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] = samplesProcessed\n@group(0) @binding(4) var<storage, read> fadeInDurationSignal : array<f32>;\n@group(0) @binding(5) var<storage, read> fadeOutDurationSignal : array<f32>;\n\nfn applyCurve(p: f32, curve: f32) -> f32 {\n let clampedP = max(0.0f, min(p, 1.0f));\n if (curve == 1.0f) { // exponential\n return clampedP * clampedP;\n }\n if (curve == 2.0f) { // scurve\n return clampedP * clampedP * (3.0f - 2.0f * clampedP);\n }\n return clampedP; // linear\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 for (var index = 0u; index < numSamples; index = index + 1u) {\n let t = u.baseTime + f32(index) / u.sampleRate;\n var gain = 1.0f;\n\n var effFadeIn = u.fadeInDuration;\n if (u.hasFadeInDurationSig > 0.5f) {\n effFadeIn = fadeInDurationSignal[index];\n }\n effFadeIn = clamp(effFadeIn, 0.0f, 60.0f);\n\n var effFadeOut = u.fadeOutDuration;\n if (u.hasFadeOutDurationSig > 0.5f) {\n effFadeOut = fadeOutDurationSignal[index];\n }\n effFadeOut = clamp(effFadeOut, 0.0f, 60.0f);\n\n if (effFadeIn > 0.0f && t < effFadeIn) {\n let p = t / effFadeIn;\n gain = gain * applyCurve(p, u.fadeInCurve);\n }\n\n if (effFadeOut > 0.0f && t > u.clipDuration - effFadeOut) {\n let p = (u.clipDuration - t) / effFadeOut;\n gain = gain * applyCurve(p, u.fadeOutCurve);\n }\n\n gain = clamp(gain, 0.0f, 1.0f);\n\n for (var c = 0u; c < numChannels; c = c + 1u) {\n let sampleIndex = c * numSamples + index;\n var inVal = inputChannels[sampleIndex];\n if (is_nan_or_inf(inVal)) {\n inVal = 0.0f;\n }\n\n var outVal = inVal * gain;\n if (is_nan_or_inf(outVal)) {\n outVal = 0.0f;\n }\n\n if (outVal > 1.0f) {\n outVal = 1.0f;\n } else if (outVal < -1.0f) {\n outVal = -1.0f;\n } else if (outVal > 0.9f) {\n outVal = 0.9f + 0.1f * tanh((outVal - 0.9f) / 0.1f);\n } else if (outVal < -0.9f) {\n outVal = -0.9f + 0.1f * tanh((outVal + 0.9f) / 0.1f);\n }\n\n outputChannels[sampleIndex] = outVal;\n }\n }\n\n // Dummy reference to keep state binding active\n state[0] = state[0];\n}\n`;\nconst getCurveCode = (curve) => {\n\tif (curve === \"exponential\") return 1;\n\tif (curve === \"scurve\") return 2;\n\treturn 0;\n};\nconst fadeAudioProcessor = async (channels, sampleRate, virtualMedia, ctx) => {\n\tif (!ctx?.device) throw new Error(\"GPUDevice is required for WebGPU Audio Fade.\");\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 fadeInDuration = Math.max(0, resolveNumber(op.fadeInDuration, 0));\n\tconst fadeOutDuration = Math.max(0, resolveNumber(op.fadeOutDuration, 0));\n\tconst fadeInCurve = resolveString(op.fadeInCurve, \"linear\");\n\tconst fadeOutCurve = resolveString(op.fadeOutCurve, \"linear\");\n\tconst durationMs = virtualMedia.metadata?.durationMs ?? ctx?.durationMs ?? (typeof op.durationFrames === \"number\" && (ctx.fps ?? 24) > 0 ? op.durationFrames / (ctx.fps ?? 24) * 1e3 : void 0);\n\tconst clipDuration = durationMs !== void 0 && durationMs > 0 ? durationMs / 1e3 : numSamples / sampleRate;\n\tlet fadeIn = fadeInDuration;\n\tlet fadeOut = fadeOutDuration;\n\tif (clipDuration > 0 && fadeIn + fadeOut > clipDuration) {\n\t\tconst half = clipDuration / 2;\n\t\tfadeIn = Math.min(fadeIn, half);\n\t\tfadeOut = Math.min(fadeOut, half);\n\t}\n\tconst hasFadeInDurationSig = isHandleConnected(op, \"fadeInDurationHandleId\") ? 1 : 0;\n\tconst hasFadeOutDurationSig = isHandleConnected(op, \"fadeOutDurationHandleId\") ? 1 : 0;\n\tconst nodeId = op.id || \"audio-fade\";\n\tconst frame = ctx.frame ?? 0;\n\tconst fps = ctx.fps ?? 24;\n\tconst segmentStartSec = Math.max(0, (ctx.elapsedMs ?? 0) / 1e3);\n\tawait WebGPUAudioProcessor.process(ctx.device, nodeId, channels, sampleRate, virtualMedia, frame, fps, FADE_SHADER_TEMPLATE, (chunkTimeSec) => {\n\t\tconst mediaTimeSec = segmentStartSec + Math.max(0, chunkTimeSec - frame / fps);\n\t\treturn [\n\t\t\tsampleRate,\n\t\t\tfadeIn,\n\t\t\tfadeOut,\n\t\t\tgetCurveCode(fadeInCurve),\n\t\t\tgetCurveCode(fadeOutCurve),\n\t\t\tclipDuration,\n\t\t\thasFadeInDurationSig,\n\t\t\thasFadeOutDurationSig,\n\t\t\tmediaTimeSec,\n\t\t\tframe,\n\t\t\tnumSamples,\n\t\t\tnumChannels,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0,\n\t\t\t0\n\t\t];\n\t}, 16, 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: fadeAudioProcessor });\n\n//#endregion\nexport { renderers_default as t };\n//# sourceMappingURL=renderers-C_aLLJ4x.mjs.map"],"mappings":";;;;;AAKA,MAAM,cAAc,CAAC,kBAAkB,kBAAkB;AACzD,MAAM,6BAA6B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgHnC,MAAM,gBAAgB,UAAU;AAC/B,KAAI,UAAU,cAAe,QAAO;AACpC,KAAI,UAAU,SAAU,QAAO;AAC/B,QAAO;;AAER,MAAM,qBAAqB,OAAO,UAAU,YAAY,cAAc,QAAQ;AAC7E,KAAI,CAAC,KAAK,OAAQ,OAAM,IAAI,MAAM,+CAA+C;CACjF,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,iBAAiB,KAAK,IAAI,GAAG,cAAc,GAAG,gBAAgB,EAAE,CAAC;CACvE,MAAM,kBAAkB,KAAK,IAAI,GAAG,cAAc,GAAG,iBAAiB,EAAE,CAAC;CACzE,MAAM,cAAc,cAAc,GAAG,aAAa,SAAS;CAC3D,MAAM,eAAe,cAAc,GAAG,cAAc,SAAS;CAC7D,MAAM,aAAa,aAAa,UAAU,cAAc,KAAK,eAAe,OAAO,GAAG,mBAAmB,aAAa,IAAI,OAAO,MAAM,IAAI,GAAG,kBAAkB,IAAI,OAAO,MAAM,MAAM,KAAK;CAC5L,MAAM,eAAe,eAAe,KAAK,KAAK,aAAa,IAAI,aAAa,MAAM,aAAa;CAC/F,IAAI,SAAS;CACb,IAAI,UAAU;AACd,KAAI,eAAe,KAAK,SAAS,UAAU,cAAc;EACxD,MAAM,OAAO,eAAe;AAC5B,WAAS,KAAK,IAAI,QAAQ,KAAK;AAC/B,YAAU,KAAK,IAAI,SAAS,KAAK;;CAElC,MAAM,uBAAuB,kBAAkB,IAAI,yBAAyB,GAAG,IAAI;CACnF,MAAM,wBAAwB,kBAAkB,IAAI,0BAA0B,GAAG,IAAI;CACrF,MAAM,SAAS,GAAG,MAAM;CACxB,MAAM,QAAQ,IAAI,SAAS;CAC3B,MAAM,MAAM,IAAI,OAAO;CACvB,MAAM,kBAAkB,KAAK,IAAI,IAAI,IAAI,aAAa,KAAK,IAAI;AAC/D,OAAM,qBAAqB,QAAQ,IAAI,QAAQ,QAAQ,UAAU,YAAY,cAAc,OAAO,KAAK,uBAAuB,iBAAiB;EAC9I,MAAM,eAAe,kBAAkB,KAAK,IAAI,GAAG,eAAe,QAAQ,IAAI;AAC9E,SAAO;GACN;GACA;GACA;GACA,aAAa,YAAY;GACzB,aAAa,aAAa;GAC1B;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;GACA;IACC,IAAI,GAAG,KAAK,UAAU,MAAM,KAAK,WAAW,KAAK,YAAY,KAAK,GAAG,KAAK,GAAG,YAAY;;AAK7F,IAAI,oBAAoB,eAAe,EAAE,gBAAgB,oBAAoB,CAAC"}
@@ -1,6 +1,6 @@
1
1
  import { Jt as resolveNumber, Xt as resolveString } from "./dist-fjKpBYkc.mjs";
2
2
  import { n as defineRenderer } from "./renderer-BSitV56h.mjs";
3
- import { Nn as signalRegistry, St as AudioSignalComputePipeline, et as shaderStore } from "./dist-CturBK2Z.mjs";
3
+ import { Nn as signalRegistry, St as AudioSignalComputePipeline, et as shaderStore } from "./dist-DRB6Vg5u.mjs";
4
4
 
5
5
  //#region ../../nodes/node-audio-signal-extractor/dist/renderers-CP8CFWDs.mjs
6
6
  const audioSignalExtractorAudioProcessor = async (channels, sampleRate, virtualMedia, ctx) => {
@@ -49,4 +49,4 @@ var renderers_default = defineRenderer({ audioProcessor: audioSignalExtractorAud
49
49
 
50
50
  //#endregion
51
51
  export { renderers_default as t };
52
- //# sourceMappingURL=renderers-CP8CFWDs-DXiR_PLR.mjs.map
52
+ //# sourceMappingURL=renderers-CP8CFWDs-DoVn7dbW.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderers-CP8CFWDs-DXiR_PLR.mjs","names":[],"sources":["../../../nodes/node-audio-signal-extractor/dist/renderers-CP8CFWDs.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { resolveNumber, resolveString } from \"@framefields/node-sdk\";\nimport { AudioSignalComputePipeline, shaderStore, signalRegistry } from \"@framefields/webgpu-renderers\";\n\n//#region src/renderers/audio-processor.ts\nconst audioSignalExtractorAudioProcessor = async (channels, sampleRate, virtualMedia, ctx) => {\n\tif (!ctx?.device) return;\n\tif (!channels || channels.length === 0 || channels[0].length === 0) return;\n\tconst op = virtualMedia.operation || {};\n\tconst nodeId = op.nodeId || op.id || \"audio-signal-extractor\";\n\tconst fps = ctx.fps ?? 24;\n\tconst mode = resolveString(op.extractionMode, \"\");\n\tconst curveStr = resolveString(op.curve, \"\");\n\tconst config = {\n\t\textractionMode: mode || void 0,\n\t\tattackMs: resolveNumber(op.attackMs, 10),\n\t\treleaseMs: resolveNumber(op.releaseMs, 120),\n\t\tsensitivity: resolveNumber(op.sensitivity, 1),\n\t\tnoiseFloorDb: resolveNumber(op.noiseFloorDb, -45),\n\t\tdynamicRangeDb: resolveNumber(op.dynamicRangeDb, 36),\n\t\tsmoothing: resolveNumber(op.smoothing, .15),\n\t\tcurve: curveStr || void 0,\n\t\tbeatThreshold: resolveNumber(op.beatThreshold, .55),\n\t\tbeatDecayMs: resolveNumber(op.beatDecayMs, 80)\n\t};\n\tconst signals = await AudioSignalComputePipeline.extractFeatures(ctx.device, channels, sampleRate, fps, config, 512);\n\tsignalRegistry.registerBuffer(ctx.device, nodeId, signals.primaryBuffer, ctx.renderId);\n\tsignalRegistry.registerBuffer(ctx.device, `${nodeId}_beat`, signals.beatBuffer, ctx.renderId);\n\tsignalRegistry.registerBuffer(ctx.device, `${nodeId}_bass`, signals.bassBuffer, ctx.renderId);\n\tsignalRegistry.registerBuffer(ctx.device, `${nodeId}_energy`, signals.energyBuffer, ctx.renderId);\n\tsignalRegistry.registerTexture(ctx.device, nodeId, signals.texture, signals.textureView, ctx.renderId);\n\tsignalRegistry.registerTexture(ctx.device, `${nodeId}_beat`, signals.texture, signals.textureView, ctx.renderId);\n\tsignalRegistry.registerTexture(ctx.device, `${nodeId}_bass`, signals.texture, signals.textureView, ctx.renderId);\n\tsignalRegistry.registerTexture(ctx.device, `${nodeId}_energy`, signals.texture, signals.textureView, ctx.renderId);\n\tconst fnName = `signal_${nodeId.replace(/[^a-zA-Z0-9]/g, \"_\")}`;\n\tconst wgsl = `\nfn ${fnName}(t: f32, x: f32, y: f32, z: f32, i: u32, n: u32, frame: u32, color: vec4f, t_elapsed: f32, duration: f32) -> f32 {\n return 0.0f;\n}\n`;\n\tshaderStore.register(nodeId, {\n\t\twgsl,\n\t\tname: fnName,\n\t\toutputType: \"f32\",\n\t\tfnParams: []\n\t}, ctx.renderId);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ audioProcessor: audioSignalExtractorAudioProcessor });\n\n//#endregion\nexport { renderers_default as t };\n//# sourceMappingURL=renderers-CP8CFWDs.mjs.map"],"mappings":";;;;;AAKA,MAAM,qCAAqC,OAAO,UAAU,YAAY,cAAc,QAAQ;AAC7F,KAAI,CAAC,KAAK,OAAQ;AAClB,KAAI,CAAC,YAAY,SAAS,WAAW,KAAK,SAAS,GAAG,WAAW,EAAG;CACpE,MAAM,KAAK,aAAa,aAAa,EAAE;CACvC,MAAM,SAAS,GAAG,UAAU,GAAG,MAAM;CACrC,MAAM,MAAM,IAAI,OAAO;CACvB,MAAM,OAAO,cAAc,GAAG,gBAAgB,GAAG;CACjD,MAAM,WAAW,cAAc,GAAG,OAAO,GAAG;CAC5C,MAAM,SAAS;EACd,gBAAgB,QAAQ,KAAK;EAC7B,UAAU,cAAc,GAAG,UAAU,GAAG;EACxC,WAAW,cAAc,GAAG,WAAW,IAAI;EAC3C,aAAa,cAAc,GAAG,aAAa,EAAE;EAC7C,cAAc,cAAc,GAAG,cAAc,IAAI;EACjD,gBAAgB,cAAc,GAAG,gBAAgB,GAAG;EACpD,WAAW,cAAc,GAAG,WAAW,IAAI;EAC3C,OAAO,YAAY,KAAK;EACxB,eAAe,cAAc,GAAG,eAAe,IAAI;EACnD,aAAa,cAAc,GAAG,aAAa,GAAG;EAC9C;CACD,MAAM,UAAU,MAAM,2BAA2B,gBAAgB,IAAI,QAAQ,UAAU,YAAY,KAAK,QAAQ,IAAI;AACpH,gBAAe,eAAe,IAAI,QAAQ,QAAQ,QAAQ,eAAe,IAAI,SAAS;AACtF,gBAAe,eAAe,IAAI,QAAQ,GAAG,OAAO,QAAQ,QAAQ,YAAY,IAAI,SAAS;AAC7F,gBAAe,eAAe,IAAI,QAAQ,GAAG,OAAO,QAAQ,QAAQ,YAAY,IAAI,SAAS;AAC7F,gBAAe,eAAe,IAAI,QAAQ,GAAG,OAAO,UAAU,QAAQ,cAAc,IAAI,SAAS;AACjG,gBAAe,gBAAgB,IAAI,QAAQ,QAAQ,QAAQ,SAAS,QAAQ,aAAa,IAAI,SAAS;AACtG,gBAAe,gBAAgB,IAAI,QAAQ,GAAG,OAAO,QAAQ,QAAQ,SAAS,QAAQ,aAAa,IAAI,SAAS;AAChH,gBAAe,gBAAgB,IAAI,QAAQ,GAAG,OAAO,QAAQ,QAAQ,SAAS,QAAQ,aAAa,IAAI,SAAS;AAChH,gBAAe,gBAAgB,IAAI,QAAQ,GAAG,OAAO,UAAU,QAAQ,SAAS,QAAQ,aAAa,IAAI,SAAS;CAClH,MAAM,SAAS,UAAU,OAAO,QAAQ,iBAAiB,IAAI;CAC7D,MAAM,OAAO;KACT,OAAO;;;;AAIX,aAAY,SAAS,QAAQ;EAC5B;EACA,MAAM;EACN,YAAY;EACZ,UAAU,EAAE;EACZ,EAAE,IAAI,SAAS;;AAKjB,IAAI,oBAAoB,eAAe,EAAE,gBAAgB,oCAAoC,CAAC"}
1
+ {"version":3,"file":"renderers-CP8CFWDs-DoVn7dbW.mjs","names":[],"sources":["../../../nodes/node-audio-signal-extractor/dist/renderers-CP8CFWDs.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { resolveNumber, resolveString } from \"@framefields/node-sdk\";\nimport { AudioSignalComputePipeline, shaderStore, signalRegistry } from \"@framefields/webgpu-renderers\";\n\n//#region src/renderers/audio-processor.ts\nconst audioSignalExtractorAudioProcessor = async (channels, sampleRate, virtualMedia, ctx) => {\n\tif (!ctx?.device) return;\n\tif (!channels || channels.length === 0 || channels[0].length === 0) return;\n\tconst op = virtualMedia.operation || {};\n\tconst nodeId = op.nodeId || op.id || \"audio-signal-extractor\";\n\tconst fps = ctx.fps ?? 24;\n\tconst mode = resolveString(op.extractionMode, \"\");\n\tconst curveStr = resolveString(op.curve, \"\");\n\tconst config = {\n\t\textractionMode: mode || void 0,\n\t\tattackMs: resolveNumber(op.attackMs, 10),\n\t\treleaseMs: resolveNumber(op.releaseMs, 120),\n\t\tsensitivity: resolveNumber(op.sensitivity, 1),\n\t\tnoiseFloorDb: resolveNumber(op.noiseFloorDb, -45),\n\t\tdynamicRangeDb: resolveNumber(op.dynamicRangeDb, 36),\n\t\tsmoothing: resolveNumber(op.smoothing, .15),\n\t\tcurve: curveStr || void 0,\n\t\tbeatThreshold: resolveNumber(op.beatThreshold, .55),\n\t\tbeatDecayMs: resolveNumber(op.beatDecayMs, 80)\n\t};\n\tconst signals = await AudioSignalComputePipeline.extractFeatures(ctx.device, channels, sampleRate, fps, config, 512);\n\tsignalRegistry.registerBuffer(ctx.device, nodeId, signals.primaryBuffer, ctx.renderId);\n\tsignalRegistry.registerBuffer(ctx.device, `${nodeId}_beat`, signals.beatBuffer, ctx.renderId);\n\tsignalRegistry.registerBuffer(ctx.device, `${nodeId}_bass`, signals.bassBuffer, ctx.renderId);\n\tsignalRegistry.registerBuffer(ctx.device, `${nodeId}_energy`, signals.energyBuffer, ctx.renderId);\n\tsignalRegistry.registerTexture(ctx.device, nodeId, signals.texture, signals.textureView, ctx.renderId);\n\tsignalRegistry.registerTexture(ctx.device, `${nodeId}_beat`, signals.texture, signals.textureView, ctx.renderId);\n\tsignalRegistry.registerTexture(ctx.device, `${nodeId}_bass`, signals.texture, signals.textureView, ctx.renderId);\n\tsignalRegistry.registerTexture(ctx.device, `${nodeId}_energy`, signals.texture, signals.textureView, ctx.renderId);\n\tconst fnName = `signal_${nodeId.replace(/[^a-zA-Z0-9]/g, \"_\")}`;\n\tconst wgsl = `\nfn ${fnName}(t: f32, x: f32, y: f32, z: f32, i: u32, n: u32, frame: u32, color: vec4f, t_elapsed: f32, duration: f32) -> f32 {\n return 0.0f;\n}\n`;\n\tshaderStore.register(nodeId, {\n\t\twgsl,\n\t\tname: fnName,\n\t\toutputType: \"f32\",\n\t\tfnParams: []\n\t}, ctx.renderId);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ audioProcessor: audioSignalExtractorAudioProcessor });\n\n//#endregion\nexport { renderers_default as t };\n//# sourceMappingURL=renderers-CP8CFWDs.mjs.map"],"mappings":";;;;;AAKA,MAAM,qCAAqC,OAAO,UAAU,YAAY,cAAc,QAAQ;AAC7F,KAAI,CAAC,KAAK,OAAQ;AAClB,KAAI,CAAC,YAAY,SAAS,WAAW,KAAK,SAAS,GAAG,WAAW,EAAG;CACpE,MAAM,KAAK,aAAa,aAAa,EAAE;CACvC,MAAM,SAAS,GAAG,UAAU,GAAG,MAAM;CACrC,MAAM,MAAM,IAAI,OAAO;CACvB,MAAM,OAAO,cAAc,GAAG,gBAAgB,GAAG;CACjD,MAAM,WAAW,cAAc,GAAG,OAAO,GAAG;CAC5C,MAAM,SAAS;EACd,gBAAgB,QAAQ,KAAK;EAC7B,UAAU,cAAc,GAAG,UAAU,GAAG;EACxC,WAAW,cAAc,GAAG,WAAW,IAAI;EAC3C,aAAa,cAAc,GAAG,aAAa,EAAE;EAC7C,cAAc,cAAc,GAAG,cAAc,IAAI;EACjD,gBAAgB,cAAc,GAAG,gBAAgB,GAAG;EACpD,WAAW,cAAc,GAAG,WAAW,IAAI;EAC3C,OAAO,YAAY,KAAK;EACxB,eAAe,cAAc,GAAG,eAAe,IAAI;EACnD,aAAa,cAAc,GAAG,aAAa,GAAG;EAC9C;CACD,MAAM,UAAU,MAAM,2BAA2B,gBAAgB,IAAI,QAAQ,UAAU,YAAY,KAAK,QAAQ,IAAI;AACpH,gBAAe,eAAe,IAAI,QAAQ,QAAQ,QAAQ,eAAe,IAAI,SAAS;AACtF,gBAAe,eAAe,IAAI,QAAQ,GAAG,OAAO,QAAQ,QAAQ,YAAY,IAAI,SAAS;AAC7F,gBAAe,eAAe,IAAI,QAAQ,GAAG,OAAO,QAAQ,QAAQ,YAAY,IAAI,SAAS;AAC7F,gBAAe,eAAe,IAAI,QAAQ,GAAG,OAAO,UAAU,QAAQ,cAAc,IAAI,SAAS;AACjG,gBAAe,gBAAgB,IAAI,QAAQ,QAAQ,QAAQ,SAAS,QAAQ,aAAa,IAAI,SAAS;AACtG,gBAAe,gBAAgB,IAAI,QAAQ,GAAG,OAAO,QAAQ,QAAQ,SAAS,QAAQ,aAAa,IAAI,SAAS;AAChH,gBAAe,gBAAgB,IAAI,QAAQ,GAAG,OAAO,QAAQ,QAAQ,SAAS,QAAQ,aAAa,IAAI,SAAS;AAChH,gBAAe,gBAAgB,IAAI,QAAQ,GAAG,OAAO,UAAU,QAAQ,SAAS,QAAQ,aAAa,IAAI,SAAS;CAClH,MAAM,SAAS,UAAU,OAAO,QAAQ,iBAAiB,IAAI;CAC7D,MAAM,OAAO;KACT,OAAO;;;;AAIX,aAAY,SAAS,QAAQ;EAC5B;EACA,MAAM;EACN,YAAY;EACZ,UAAU,EAAE;EACZ,EAAE,IAAI,SAAS;;AAKjB,IAAI,oBAAoB,eAAe,EAAE,gBAAgB,oCAAoC,CAAC"}
@@ -1,7 +1,7 @@
1
1
  import "../chunk-GBe2k3y8.mjs";
2
- import { Ci as FrameSignal, D as SignalRegistry, La as SignalValue, O as SignalRegistryResource, Oa as SignalContext, P as buildWGSLSignalFn, Ra as SineSignalOptions, To as cosineSignal, fs as signal, h as MasterAudioEntry, ms as sineSignal, ps as signalBuilder, q as signalRegistry, s as AudioSignalComputePipeline, wa as Signal, wo as computed } from "../index-AdrZIWT0.mjs";
3
- import "../index-Cg2ptXcs.mjs";
4
- import "../renderer-DlESyfg7.mjs";
5
- import { i as _default, n as AudioSignalOptions, r as ExtractedAudioSignalsBundle, t as AudioSignal } from "../audio-BNnEclHU.mjs";
6
- import { i as index_d_exports, n as index_d_exports$1, r as index_d_exports$3, t as index_d_exports$2 } from "../index-B3BwLHa6.mjs";
2
+ import { Ci as FrameSignal, D as SignalRegistry, La as SignalValue, O as SignalRegistryResource, Oa as SignalContext, P as buildWGSLSignalFn, Ra as SineSignalOptions, To as cosineSignal, fs as signal, h as MasterAudioEntry, ms as sineSignal, ps as signalBuilder, q as signalRegistry, s as AudioSignalComputePipeline, wa as Signal, wo as computed } from "../index-DEODKaL6.mjs";
3
+ import "../index-CaiZ5p6q.mjs";
4
+ import "../renderer-Dim2ZlfK.mjs";
5
+ import { i as _default, n as AudioSignalOptions, r as ExtractedAudioSignalsBundle, t as AudioSignal } from "../audio-C6toT7F3.mjs";
6
+ import { i as index_d_exports, n as index_d_exports$1, r as index_d_exports$3, t as index_d_exports$2 } from "../index-DN9oXO-X.mjs";
7
7
  export { AudioSignal, AudioSignalComputePipeline, index_d_exports as AudioSignalExtractorNode, AudioSignalOptions, ExtractedAudioSignalsBundle, FrameSignal, MasterAudioEntry, Signal, SignalContext, index_d_exports$1 as SignalGateNode, index_d_exports$2 as SignalMathNode, index_d_exports$3 as SignalNode, SignalRegistry, SignalRegistryResource, SignalValue, SineSignalOptions, buildWGSLSignalFn, computed, cosineSignal, _default as modulateRenderer, signal, signalBuilder, signalRegistry, sineSignal };
@@ -1,10 +1,10 @@
1
1
  import "../chunk-GBe2k3y8.mjs";
2
2
  import { H as Signal, en as signal, ft as computed, nn as sineSignal, pt as cosineSignal, tn as signalBuilder } from "../dist-fjKpBYkc.mjs";
3
- import { Bt as SignalRegistry, Nn as signalRegistry, St as AudioSignalComputePipeline, ln as buildWGSLSignalFn } from "../dist-CturBK2Z.mjs";
4
- import "../renderers-CP8CFWDs-DXiR_PLR.mjs";
3
+ import { Bt as SignalRegistry, Nn as signalRegistry, St as AudioSignalComputePipeline, ln as buildWGSLSignalFn } from "../dist-DRB6Vg5u.mjs";
4
+ import "../renderers-CP8CFWDs-DoVn7dbW.mjs";
5
5
  import { i as dist_exports, n as dist_exports$1, r as dist_exports$3, t as dist_exports$2 } from "../signals-DGRs6ddH.mjs";
6
- import { t as renderers_default } from "../renderer-CbNW0KHh.mjs";
6
+ import { t as renderers_default } from "../renderer-BZF48o1T.mjs";
7
7
  import "../renderer-BajIOuZH.mjs";
8
- import { t as AudioSignal } from "../audio-C7Kn5xBm.mjs";
8
+ import { t as AudioSignal } from "../audio-DXwNhi1z.mjs";
9
9
 
10
10
  export { AudioSignal, AudioSignalComputePipeline, dist_exports as AudioSignalExtractorNode, Signal, dist_exports$1 as SignalGateNode, dist_exports$2 as SignalMathNode, dist_exports$3 as SignalNode, SignalRegistry, buildWGSLSignalFn, computed, cosineSignal, renderers_default as modulateRenderer, signal, signalBuilder, signalRegistry, sineSignal };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "framefields",
3
- "version": "2.3.2",
3
+ "version": "2.4.0",
4
4
  "private": false,
5
5
  "description": "High-performance WebGPU rendering SDK for video composition, Photoshop-grade 2D VFX, audio DSP, and reactive signals. Built for AI Agents.",
6
6
  "license": "Apache-2.0",
@@ -115,61 +115,62 @@
115
115
  "tsdown": "^0.19.0",
116
116
  "typescript": "^5.8.3",
117
117
  "vitest": "4.1.5",
118
- "@framefields/core": "2.3.2",
119
- "@framefields/client-utils": "2.3.2",
120
- "@framefields/compositions": "2.3.2",
121
- "@framefields/node-audio-delay": "2.3.2",
122
- "@framefields/node-audio-compressor": "2.3.2",
123
- "@framefields/node-audio-fade": "2.3.2",
124
- "@framefields/node-audio-reverb": "2.3.2",
125
- "@framefields/node-blur": "2.3.2",
126
- "@framefields/node-color-balance": "2.3.2",
127
- "@framefields/node-audio-signal-extractor": "2.3.2",
128
- "@framefields/node-curves": "2.3.2",
129
- "@framefields/node-audio-noise-gate": "2.3.2",
130
- "@framefields/node-corner-pin": "2.3.2",
131
- "@framefields/node-audio-parametric-eq": "2.3.2",
132
- "@framefields/node-colorkey": "2.3.2",
133
- "@framefields/node-displacement-map": "2.3.2",
134
- "@framefields/node-crop": "2.3.2",
135
- "@framefields/node-flip": "2.3.2",
136
- "@framefields/node-high-pass": "2.3.2",
137
- "@framefields/node-kenburns": "2.3.2",
138
- "@framefields/node-film-grain": "2.3.2",
139
- "@framefields/node-gradient-map": "2.3.2",
140
- "@framefields/node-halftone-screen": "2.3.2",
141
- "@framefields/node-deflicker": "2.3.2",
142
- "@framefields/node-layer-style": "2.3.2",
143
- "@framefields/node-mesh-warp": "2.3.2",
144
- "@framefields/node-lut": "2.3.2",
145
- "@framefields/node-mask-math": "2.3.2",
146
- "@framefields/node-modulate": "2.3.2",
147
- "@framefields/node-paint": "2.3.2",
148
- "@framefields/node-patch-heal": "2.3.2",
149
- "@framefields/node-sdk": "2.3.2",
150
- "@framefields/node-rotate": "2.3.2",
151
- "@framefields/node-liquify": "2.3.2",
152
- "@framefields/node-relight-3d": "2.3.2",
153
- "@framefields/node-particles": "2.3.2",
154
- "@framefields/node-refine-edge": "2.3.2",
155
- "@framefields/node-signal": "2.3.2",
156
- "@framefields/node-selective-color": "2.3.2",
157
- "@framefields/node-refraction-caustics": "2.3.2",
158
- "@framefields/node-shadows-highlights": "2.3.2",
159
- "@framefields/node-stereo-panning": "2.3.2",
160
- "@framefields/node-tile-offset": "2.3.2",
161
- "@framefields/node-unsharp-mask": "2.3.2",
162
- "@framefields/node-vision": "2.3.2",
163
- "@framefields/node-vignette": "2.3.2",
164
- "@framefields/renderers": "2.3.2",
165
- "@framefields/node-levels": "2.3.2",
166
- "@framefields/renderer": "2.3.2",
167
- "@framefields/tsconfig": "2.3.2",
168
- "@framefields/vision": "2.3.2",
169
- "@framefields/tensor-webgpu": "2.3.2",
170
- "@framefields/node-signal-gate": "2.3.2",
171
- "@framefields/webgpu-renderers": "2.3.2",
172
- "@framefields/node-signal-math": "2.3.2"
118
+ "@framefields/compositions": "2.4.0",
119
+ "@framefields/ai": "2.4.0",
120
+ "@framefields/client-utils": "2.4.0",
121
+ "@framefields/node-audio-compressor": "2.4.0",
122
+ "@framefields/node-audio-noise-gate": "2.4.0",
123
+ "@framefields/node-audio-delay": "2.4.0",
124
+ "@framefields/node-audio-parametric-eq": "2.4.0",
125
+ "@framefields/node-audio-reverb": "2.4.0",
126
+ "@framefields/node-audio-signal-extractor": "2.4.0",
127
+ "@framefields/node-colorkey": "2.4.0",
128
+ "@framefields/core": "2.4.0",
129
+ "@framefields/node-audio-fade": "2.4.0",
130
+ "@framefields/node-blur": "2.4.0",
131
+ "@framefields/node-crop": "2.4.0",
132
+ "@framefields/node-curves": "2.4.0",
133
+ "@framefields/node-displacement-map": "2.4.0",
134
+ "@framefields/node-deflicker": "2.4.0",
135
+ "@framefields/node-film-grain": "2.4.0",
136
+ "@framefields/node-flip": "2.4.0",
137
+ "@framefields/node-gradient-map": "2.4.0",
138
+ "@framefields/node-color-balance": "2.4.0",
139
+ "@framefields/node-high-pass": "2.4.0",
140
+ "@framefields/node-kenburns": "2.4.0",
141
+ "@framefields/node-corner-pin": "2.4.0",
142
+ "@framefields/node-layer-style": "2.4.0",
143
+ "@framefields/node-liquify": "2.4.0",
144
+ "@framefields/node-levels": "2.4.0",
145
+ "@framefields/node-lut": "2.4.0",
146
+ "@framefields/node-mask-math": "2.4.0",
147
+ "@framefields/node-halftone-screen": "2.4.0",
148
+ "@framefields/node-paint": "2.4.0",
149
+ "@framefields/node-mesh-warp": "2.4.0",
150
+ "@framefields/node-modulate": "2.4.0",
151
+ "@framefields/node-patch-heal": "2.4.0",
152
+ "@framefields/node-refine-edge": "2.4.0",
153
+ "@framefields/node-relight-3d": "2.4.0",
154
+ "@framefields/node-rotate": "2.4.0",
155
+ "@framefields/node-refraction-caustics": "2.4.0",
156
+ "@framefields/node-particles": "2.4.0",
157
+ "@framefields/node-sdk": "2.4.0",
158
+ "@framefields/node-signal": "2.4.0",
159
+ "@framefields/node-selective-color": "2.4.0",
160
+ "@framefields/node-signal-math": "2.4.0",
161
+ "@framefields/node-shadows-highlights": "2.4.0",
162
+ "@framefields/node-stereo-panning": "2.4.0",
163
+ "@framefields/node-unsharp-mask": "2.4.0",
164
+ "@framefields/node-vision": "2.4.0",
165
+ "@framefields/renderer": "2.4.0",
166
+ "@framefields/node-tile-offset": "2.4.0",
167
+ "@framefields/tsconfig": "2.4.0",
168
+ "@framefields/tensor-webgpu": "2.4.0",
169
+ "@framefields/node-signal-gate": "2.4.0",
170
+ "@framefields/renderers": "2.4.0",
171
+ "@framefields/vision": "2.4.0",
172
+ "@framefields/webgpu-renderers": "2.4.0",
173
+ "@framefields/node-vignette": "2.4.0"
173
174
  },
174
175
  "scripts": {
175
176
  "build": "tsdown && node ../../scripts/sync-readme.mjs && node scripts/check-dts-bundle.mjs",