framefields 2.5.1 → 2.5.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (304) hide show
  1. package/dist/audio/index.d.mts +4 -4
  2. package/dist/audio/index.mjs +10 -10
  3. package/dist/{audio-C1A4N3Wh.d.mts → audio-2ew5y0Bl.d.mts} +3 -3
  4. package/dist/{audio-C1A4N3Wh.d.mts.map → audio-2ew5y0Bl.d.mts.map} +1 -1
  5. package/dist/{audio-CZwVENqB.mjs → audio-DrUskzwZ.mjs} +4 -4
  6. package/dist/{audio-CZwVENqB.mjs.map → audio-DrUskzwZ.mjs.map} +1 -1
  7. package/dist/components/index.d.mts +10 -10
  8. package/dist/components/index.mjs +44 -44
  9. package/dist/{dist-CQZ5_60A.mjs → dist-BPOi5xb_.mjs} +2 -2
  10. package/dist/{dist-CQZ5_60A.mjs.map → dist-BPOi5xb_.mjs.map} +1 -1
  11. package/dist/{dist-DBWkkSvJ.mjs → dist-Bf0H4lp1.mjs} +66 -28
  12. package/dist/dist-Bf0H4lp1.mjs.map +1 -0
  13. package/dist/{dist-DFeF-ygz.mjs → dist-D021IFfp.mjs} +3 -1
  14. package/dist/{dist-DFeF-ygz.mjs.map → dist-D021IFfp.mjs.map} +1 -1
  15. package/dist/{dist-DHQVWaV2.mjs → dist-DG65RDhc.mjs} +3 -3
  16. package/dist/{dist-DHQVWaV2.mjs.map → dist-DG65RDhc.mjs.map} +1 -1
  17. package/dist/effects/index.d.mts +4 -4
  18. package/dist/effects/index.mjs +35 -35
  19. package/dist/{effects-DZvq-nWT.mjs → effects-Z-brb-n7.mjs} +3 -3
  20. package/dist/{effects-DZvq-nWT.mjs.map → effects-Z-brb-n7.mjs.map} +1 -1
  21. package/dist/fonts/index.mjs +2 -2
  22. package/dist/{fonts-DcsxFpyU.mjs → fonts-DqYgk_1a.mjs} +2 -2
  23. package/dist/{fonts-DcsxFpyU.mjs.map → fonts-DqYgk_1a.mjs.map} +1 -1
  24. package/dist/{gpu-Dq_uI_00.mjs → gpu-CevnCkZC.mjs} +2 -2
  25. package/dist/{gpu-Dq_uI_00.mjs.map → gpu-CevnCkZC.mjs.map} +1 -1
  26. package/dist/{index-C2f4Hm-p.d.mts → index-COQTaniR.d.mts} +2 -2
  27. package/dist/{index-C2f4Hm-p.d.mts.map → index-COQTaniR.d.mts.map} +1 -1
  28. package/dist/{index-fymoeGNW.d.mts → index-CZK6CFLy.d.mts} +22 -19
  29. package/dist/index-CZK6CFLy.d.mts.map +1 -0
  30. package/dist/{index-BpdVOlsV.d.mts → index-CfMylY3O.d.mts} +3 -3
  31. package/dist/{index-BpdVOlsV.d.mts.map → index-CfMylY3O.d.mts.map} +1 -1
  32. package/dist/{index-DNKM3to5.d.mts → index-D1C735Wp.d.mts} +3 -3
  33. package/dist/{index-DNKM3to5.d.mts.map → index-D1C735Wp.d.mts.map} +1 -1
  34. package/dist/{index-D6-lH1Mx.d.mts → index-DSGFMpwL.d.mts} +4 -4
  35. package/dist/{index-D6-lH1Mx.d.mts.map → index-DSGFMpwL.d.mts.map} +1 -1
  36. package/dist/{index-B-KVpJMb.d.mts → index-KqW22NHL.d.mts} +2 -2
  37. package/dist/{index-B-KVpJMb.d.mts.map → index-KqW22NHL.d.mts.map} +1 -1
  38. package/dist/{index-DKssQ_wn.d.mts → index-tCKz9Tku.d.mts} +231 -233
  39. package/dist/index-tCKz9Tku.d.mts.map +1 -0
  40. package/dist/index.d.mts +11 -11
  41. package/dist/index.mjs +52 -52
  42. package/dist/preview/index.d.mts +3 -3
  43. package/dist/preview/index.mjs +10 -10
  44. package/dist/{preview-CYI4i4m3.mjs → preview-DVw2jLDh.mjs} +2 -2
  45. package/dist/{preview-CYI4i4m3.mjs.map → preview-DVw2jLDh.mjs.map} +1 -1
  46. package/dist/preview-engine/{chunk-3I6B3YPF.mjs → chunk-2WOCQNZX.mjs} +3 -3
  47. package/dist/preview-engine/{chunk-PDM3TJ45.mjs → chunk-45XGWIOY.mjs} +1 -1
  48. package/dist/preview-engine/{chunk-XUPZBI3Y.mjs → chunk-5FTCPTOX.mjs} +13 -7
  49. package/dist/preview-engine/{chunk-Z4TKEI3I.mjs → chunk-B555EGEU.mjs} +1 -1
  50. package/dist/preview-engine/{chunk-6GMEF2QB.mjs → chunk-FAEWI3LF.mjs} +1 -1
  51. package/dist/preview-engine/{chunk-W4HIVUUA.mjs → chunk-I3ZTDIVM.mjs} +1 -1
  52. package/dist/preview-engine/{chunk-CT2WFPYG.mjs → chunk-MCFYUKAJ.mjs} +8 -8
  53. package/dist/preview-engine/{chunk-AB5VITYM.mjs → chunk-PR37RCNO.mjs} +1 -1
  54. package/dist/preview-engine/{chunk-NAISBHLR.mjs → chunk-QP24X77K.mjs} +1 -1
  55. package/dist/preview-engine/chunk-SYP4AJMF.mjs +1 -0
  56. package/dist/preview-engine/{chunk-SNASF7OM.mjs → chunk-YSXMXD3F.mjs} +1 -1
  57. package/dist/preview-engine/components.mjs +1 -1
  58. package/dist/preview-engine/effects.mjs +1 -1
  59. package/dist/preview-engine/fonts.mjs +1 -1
  60. package/dist/preview-engine/framefields.mjs +1 -1
  61. package/dist/preview-engine/player.mjs +1 -1
  62. package/dist/preview-engine/renderers-BILNWTUC.mjs +228 -0
  63. package/dist/preview-engine/{renderers-HJ6NO5ZD.mjs → renderers-EJATUIUP.mjs} +1 -1
  64. package/dist/preview-engine/renderers-SKT7AGGE.mjs +1 -0
  65. package/dist/{program-BdPDtfVv.mjs → program-4mAVgg3c.mjs} +4 -4
  66. package/dist/{program-BdPDtfVv.mjs.map → program-4mAVgg3c.mjs.map} +1 -1
  67. package/dist/registry/captions.json +1 -1
  68. package/dist/registry/lower-third.json +1 -1
  69. package/dist/registry/meter.json +1 -1
  70. package/dist/renderer/index.d.mts +2 -2
  71. package/dist/renderer/index.mjs +2 -2
  72. package/dist/renderer-1ymN1FIT.mjs +5 -0
  73. package/dist/{renderer-VdTs-dqH.mjs → renderer-4P-DCjk2.mjs} +3 -3
  74. package/dist/{renderer-VdTs-dqH.mjs.map → renderer-4P-DCjk2.mjs.map} +1 -1
  75. package/dist/{renderer-B4blg067.mjs → renderer-5-9DPis6.mjs} +3 -3
  76. package/dist/{renderer-B4blg067.mjs.map → renderer-5-9DPis6.mjs.map} +1 -1
  77. package/dist/{renderer-COXKPofU.d.mts → renderer-92IAZzBU.d.mts} +2 -2
  78. package/dist/{renderer-COXKPofU.d.mts.map → renderer-92IAZzBU.d.mts.map} +1 -1
  79. package/dist/{renderer-o_JK4YfO.mjs → renderer-9gjn790a.mjs} +3 -3
  80. package/dist/{renderer-o_JK4YfO.mjs.map → renderer-9gjn790a.mjs.map} +1 -1
  81. package/dist/renderer-B-43EuKb.mjs +5 -0
  82. package/dist/renderer-B-v5ZboU.mjs +5 -0
  83. package/dist/{renderer-IMg0dK6K.mjs → renderer-B8PNlKEM.mjs} +3 -3
  84. package/dist/{renderer-IMg0dK6K.mjs.map → renderer-B8PNlKEM.mjs.map} +1 -1
  85. package/dist/{renderer-Db_wphHH.mjs → renderer-B9AZ6R1U.mjs} +64 -21
  86. package/dist/renderer-B9AZ6R1U.mjs.map +1 -0
  87. package/dist/{renderer-7DyjqxEj.mjs → renderer-B9iVE2GG.mjs} +3 -3
  88. package/dist/{renderer-7DyjqxEj.mjs.map → renderer-B9iVE2GG.mjs.map} +1 -1
  89. package/dist/{renderer-ChCUad83.mjs → renderer-B9m7xIPo.mjs} +3 -3
  90. package/dist/{renderer-ChCUad83.mjs.map → renderer-B9m7xIPo.mjs.map} +1 -1
  91. package/dist/{renderer-BAkPq8qo.mjs → renderer-B9yv3R1y.mjs} +2 -2
  92. package/dist/{renderer-BAkPq8qo.mjs.map → renderer-B9yv3R1y.mjs.map} +1 -1
  93. package/dist/{renderer-DuQMzR3v.mjs → renderer-BBA-iCi-.mjs} +8 -417
  94. package/dist/renderer-BBA-iCi-.mjs.map +1 -0
  95. package/dist/{renderer-l_U6kA8K.mjs → renderer-BIYJKdwA.mjs} +2 -2
  96. package/dist/{renderer-l_U6kA8K.mjs.map → renderer-BIYJKdwA.mjs.map} +1 -1
  97. package/dist/{renderer-DQuKNgIx.mjs → renderer-BIt-At3v.mjs} +4 -4
  98. package/dist/{renderer-DQuKNgIx.mjs.map → renderer-BIt-At3v.mjs.map} +1 -1
  99. package/dist/renderer-BKF8Sfbg.mjs +3 -0
  100. package/dist/{renderer-D2ru2Afi.mjs → renderer-BKayVZhL.mjs} +3 -3
  101. package/dist/{renderer-D2ru2Afi.mjs.map → renderer-BKayVZhL.mjs.map} +1 -1
  102. package/dist/renderer-BTB8ifgH.mjs +5 -0
  103. package/dist/{renderer-fH9SCJC2.mjs → renderer-BVtQzjgT.mjs} +2 -2
  104. package/dist/{renderer-fH9SCJC2.mjs.map → renderer-BVtQzjgT.mjs.map} +1 -1
  105. package/dist/{renderer-DBjV6C2u.mjs → renderer-BWqQxZNk.mjs} +2 -2
  106. package/dist/renderer-BYxzR6Hp.mjs +5 -0
  107. package/dist/renderer-BcGhO_Mw.mjs +5 -0
  108. package/dist/{renderer-DK34NH92.mjs → renderer-BcSSAzc4.mjs} +3 -3
  109. package/dist/{renderer-DK34NH92.mjs.map → renderer-BcSSAzc4.mjs.map} +1 -1
  110. package/dist/{renderer-BBTkfhL8.mjs → renderer-Bh0dwc8n.mjs} +3 -3
  111. package/dist/{renderer-BBTkfhL8.mjs.map → renderer-Bh0dwc8n.mjs.map} +1 -1
  112. package/dist/{renderer-CDX2f82b.mjs → renderer-BjxceNBj.mjs} +3 -3
  113. package/dist/{renderer-CDX2f82b.mjs.map → renderer-BjxceNBj.mjs.map} +1 -1
  114. package/dist/renderer-Bk3RgiFg.mjs +5 -0
  115. package/dist/{renderer-Bmj7AyJP.mjs → renderer-Bk7vVfTu.mjs} +3 -3
  116. package/dist/{renderer-Bmj7AyJP.mjs.map → renderer-Bk7vVfTu.mjs.map} +1 -1
  117. package/dist/{renderer-Ch7qwjH9.mjs → renderer-BmX2CmyO.mjs} +3 -3
  118. package/dist/{renderer-Ch7qwjH9.mjs.map → renderer-BmX2CmyO.mjs.map} +1 -1
  119. package/dist/{renderer-Bo1PY0zW.mjs → renderer-BpBhvMi1.mjs} +2 -2
  120. package/dist/{renderer-ZjSP5jw6.mjs → renderer-Bt_j2Zi6.mjs} +2 -2
  121. package/dist/{renderer-ZjSP5jw6.mjs.map → renderer-Bt_j2Zi6.mjs.map} +1 -1
  122. package/dist/renderer-BvItCxkw.mjs +5 -0
  123. package/dist/{renderer-Bw5YP2Db.mjs → renderer-BwRLXhxJ.mjs} +3 -3
  124. package/dist/{renderer-Bw5YP2Db.mjs.map → renderer-BwRLXhxJ.mjs.map} +1 -1
  125. package/dist/{renderer-CWSM0IGG.mjs → renderer-C0P8ZRiC.mjs} +2 -2
  126. package/dist/{renderer-CWSM0IGG.mjs.map → renderer-C0P8ZRiC.mjs.map} +1 -1
  127. package/dist/{renderer-Z39F9QK5.mjs → renderer-C1sFg34Y.mjs} +3 -3
  128. package/dist/{renderer-Z39F9QK5.mjs.map → renderer-C1sFg34Y.mjs.map} +1 -1
  129. package/dist/{renderer-BGNdwdCR.mjs → renderer-C4f_X1Qc.mjs} +3 -3
  130. package/dist/{renderer-BGNdwdCR.mjs.map → renderer-C4f_X1Qc.mjs.map} +1 -1
  131. package/dist/{renderer-DyMEAZIm.mjs → renderer-C4pS7aAI.mjs} +4 -4
  132. package/dist/{renderer-DyMEAZIm.mjs.map → renderer-C4pS7aAI.mjs.map} +1 -1
  133. package/dist/{renderer-BWa3CLK7.mjs → renderer-C5h2TSjH.mjs} +2 -2
  134. package/dist/{renderer-BWa3CLK7.mjs.map → renderer-C5h2TSjH.mjs.map} +1 -1
  135. package/dist/{renderer-BN_n6O6P.mjs → renderer-C7HIJcJK.mjs} +3 -3
  136. package/dist/{renderer-BN_n6O6P.mjs.map → renderer-C7HIJcJK.mjs.map} +1 -1
  137. package/dist/{renderer-G3px5ODP.mjs → renderer-C8-NmotX.mjs} +3 -3
  138. package/dist/{renderer-G3px5ODP.mjs.map → renderer-C8-NmotX.mjs.map} +1 -1
  139. package/dist/renderer-CCnfPHqk.mjs +5 -0
  140. package/dist/{renderer-Dx28wTi1.d.mts → renderer-CE9N4EEI.d.mts} +2 -2
  141. package/dist/{renderer-Dx28wTi1.d.mts.map → renderer-CE9N4EEI.d.mts.map} +1 -1
  142. package/dist/{renderer-CLO8QHWE.mjs → renderer-CGKKjJ5Q.mjs} +3 -3
  143. package/dist/{renderer-CLO8QHWE.mjs.map → renderer-CGKKjJ5Q.mjs.map} +1 -1
  144. package/dist/renderer-CIoWQNaA.mjs +5 -0
  145. package/dist/{renderer-2bipMLqz.mjs → renderer-CJ2-jEy7.mjs} +2 -2
  146. package/dist/{renderer-2bipMLqz.mjs.map → renderer-CJ2-jEy7.mjs.map} +1 -1
  147. package/dist/renderer-CMwQtIIq.mjs +5 -0
  148. package/dist/renderer-CN8kRB90.mjs +6 -0
  149. package/dist/renderer-CPKBDif1.mjs +5 -0
  150. package/dist/{renderer-Cj1giMd0.mjs → renderer-CPl1wOrj.mjs} +2 -2
  151. package/dist/{renderer-Cj1giMd0.mjs.map → renderer-CPl1wOrj.mjs.map} +1 -1
  152. package/dist/{renderer-BmoQJUJO.mjs → renderer-CT_3Fegr.mjs} +3 -3
  153. package/dist/{renderer-BmoQJUJO.mjs.map → renderer-CT_3Fegr.mjs.map} +1 -1
  154. package/dist/{renderer-BfrzKmRh.mjs → renderer-CTvPNRMH.mjs} +2 -2
  155. package/dist/{renderer-BfrzKmRh.mjs.map → renderer-CTvPNRMH.mjs.map} +1 -1
  156. package/dist/{renderer-DWaqF7-6.mjs → renderer-CWnhRMOq.mjs} +3 -3
  157. package/dist/{renderer-DWaqF7-6.mjs.map → renderer-CWnhRMOq.mjs.map} +1 -1
  158. package/dist/{renderer-BBTdHKH7.mjs → renderer-CXa6SWXy.mjs} +3 -3
  159. package/dist/{renderer-BBTdHKH7.mjs.map → renderer-CXa6SWXy.mjs.map} +1 -1
  160. package/dist/renderer-CamsHxEP.mjs +5 -0
  161. package/dist/{renderer-CMEqUhrW.mjs → renderer-Cb5uDZm0.mjs} +3 -3
  162. package/dist/{renderer-CMEqUhrW.mjs.map → renderer-Cb5uDZm0.mjs.map} +1 -1
  163. package/dist/renderer-CeQormOH.mjs +5 -0
  164. package/dist/renderer-Cex4eMtv.mjs +5 -0
  165. package/dist/{renderer-kP5Y282J.mjs → renderer-CgMnZYTM.mjs} +4 -4
  166. package/dist/{renderer-kP5Y282J.mjs.map → renderer-CgMnZYTM.mjs.map} +1 -1
  167. package/dist/{renderer-B5YYBBDq.mjs → renderer-CjcrhBB2.mjs} +2 -2
  168. package/dist/{renderer-B5YYBBDq.mjs.map → renderer-CjcrhBB2.mjs.map} +1 -1
  169. package/dist/{renderer-CXbXF7Dh.mjs → renderer-Cjw6lyaK.mjs} +3 -3
  170. package/dist/{renderer-CXbXF7Dh.mjs.map → renderer-Cjw6lyaK.mjs.map} +1 -1
  171. package/dist/renderer-CjyTrNlr.mjs +5 -0
  172. package/dist/{renderer-D6p8b6ql.mjs → renderer-CkJXq4bD.mjs} +3 -3
  173. package/dist/{renderer-D6p8b6ql.mjs.map → renderer-CkJXq4bD.mjs.map} +1 -1
  174. package/dist/renderer-Clv9TO6C.mjs +5 -0
  175. package/dist/{renderer-gjT5v76-.mjs → renderer-Cm9fEQsw.mjs} +2 -2
  176. package/dist/{renderer-gjT5v76-.mjs.map → renderer-Cm9fEQsw.mjs.map} +1 -1
  177. package/dist/{renderer-CJoa4H2G.mjs → renderer-CuwVuVKG.mjs} +2 -2
  178. package/dist/{renderer-CJoa4H2G.mjs.map → renderer-CuwVuVKG.mjs.map} +1 -1
  179. package/dist/{renderer-D5u3GVtD.mjs → renderer-CvYxxS_X.mjs} +71 -71
  180. package/dist/{renderer-D5u3GVtD.mjs.map → renderer-CvYxxS_X.mjs.map} +1 -1
  181. package/dist/{renderer-VxVi_0c7.mjs → renderer-CxOaqnho.mjs} +2 -2
  182. package/dist/{renderer-VxVi_0c7.mjs.map → renderer-CxOaqnho.mjs.map} +1 -1
  183. package/dist/{renderer-DkPDYtD3.mjs → renderer-CxkUI9s_.mjs} +3 -3
  184. package/dist/{renderer-DkPDYtD3.mjs.map → renderer-CxkUI9s_.mjs.map} +1 -1
  185. package/dist/{renderer-BYJS2lhn.mjs → renderer-Cz5SOnJr.mjs} +3 -3
  186. package/dist/{renderer-BYJS2lhn.mjs.map → renderer-Cz5SOnJr.mjs.map} +1 -1
  187. package/dist/{renderer-WVrUeiLZ.mjs → renderer-D-FwaV1R.mjs} +2 -2
  188. package/dist/{renderer-BWnFh7NO.mjs → renderer-D0iSbNza.mjs} +3 -3
  189. package/dist/{renderer-BWnFh7NO.mjs.map → renderer-D0iSbNza.mjs.map} +1 -1
  190. package/dist/{renderer-DHqicGgT.mjs → renderer-D22g6ION.mjs} +3 -3
  191. package/dist/{renderer-DHqicGgT.mjs.map → renderer-D22g6ION.mjs.map} +1 -1
  192. package/dist/renderer-D4LnJk-M.mjs +5 -0
  193. package/dist/renderer-D5OfQ8Ut.mjs +5 -0
  194. package/dist/renderer-DBYssktC.mjs +5 -0
  195. package/dist/renderer-DC-Aj3me.mjs +5 -0
  196. package/dist/renderer-DG97_Aoc.mjs +5 -0
  197. package/dist/{renderer-Cjs1OeBu.mjs → renderer-DPVEs5ME.mjs} +3 -3
  198. package/dist/{renderer-Cjs1OeBu.mjs.map → renderer-DPVEs5ME.mjs.map} +1 -1
  199. package/dist/{renderer-COtZ315B.mjs → renderer-DPzair18.mjs} +2 -2
  200. package/dist/renderer-DS4UGjcS.mjs +5 -0
  201. package/dist/{renderer-PLoGrFGz.mjs → renderer-DTXAa2pL.mjs} +3 -3
  202. package/dist/{renderer-PLoGrFGz.mjs.map → renderer-DTXAa2pL.mjs.map} +1 -1
  203. package/dist/{renderer-ChjkppUz.mjs → renderer-DYdll3xW.mjs} +3 -3
  204. package/dist/{renderer-ChjkppUz.mjs.map → renderer-DYdll3xW.mjs.map} +1 -1
  205. package/dist/{renderer-BhhweLr_.mjs → renderer-Datqywo_.mjs} +3 -3
  206. package/dist/{renderer-BhhweLr_.mjs.map → renderer-Datqywo_.mjs.map} +1 -1
  207. package/dist/renderer-DdG6ibtM.mjs +5 -0
  208. package/dist/{renderer-D0X7Eh-T.mjs → renderer-Ddg3dJmu.mjs} +3 -3
  209. package/dist/{renderer-D0X7Eh-T.mjs.map → renderer-Ddg3dJmu.mjs.map} +1 -1
  210. package/dist/{renderer-CmKdr2nA.mjs → renderer-De7gno9X.mjs} +3 -3
  211. package/dist/{renderer-CmKdr2nA.mjs.map → renderer-De7gno9X.mjs.map} +1 -1
  212. package/dist/renderer-DhZi4f3t.mjs +5 -0
  213. package/dist/{renderer-BJwOM1Dq.mjs → renderer-Dkt1oh9H.mjs} +3 -3
  214. package/dist/{renderer-BJwOM1Dq.mjs.map → renderer-Dkt1oh9H.mjs.map} +1 -1
  215. package/dist/{renderer-DqO9gBAi.mjs → renderer-DnT62IDK.mjs} +3 -3
  216. package/dist/{renderer-DqO9gBAi.mjs.map → renderer-DnT62IDK.mjs.map} +1 -1
  217. package/dist/{renderer-vwoyR8pW.mjs → renderer-Du8z4UrN.mjs} +2 -2
  218. package/dist/{renderer-vwoyR8pW.mjs.map → renderer-Du8z4UrN.mjs.map} +1 -1
  219. package/dist/{renderer-B8LXXvHi.mjs → renderer-MQPiZQXN.mjs} +3 -3
  220. package/dist/{renderer-B8LXXvHi.mjs.map → renderer-MQPiZQXN.mjs.map} +1 -1
  221. package/dist/renderer-MgLekf6d.mjs +5 -0
  222. package/dist/{renderer-FCqOfN6n.mjs → renderer-NL2IZShC.mjs} +3 -3
  223. package/dist/{renderer-FCqOfN6n.mjs.map → renderer-NL2IZShC.mjs.map} +1 -1
  224. package/dist/renderer-Qvs-1lWh.mjs +5 -0
  225. package/dist/{renderer-B31zMDE8.mjs → renderer-RiWi7y5C.mjs} +4 -4
  226. package/dist/{renderer-B31zMDE8.mjs.map → renderer-RiWi7y5C.mjs.map} +1 -1
  227. package/dist/{renderer-Fsdod0yZ.mjs → renderer-T2dd9a2L.mjs} +3 -3
  228. package/dist/{renderer-Fsdod0yZ.mjs.map → renderer-T2dd9a2L.mjs.map} +1 -1
  229. package/dist/{renderer-1VKN5j2C.mjs → renderer-Y5JmTL8J.mjs} +3 -3
  230. package/dist/{renderer-1VKN5j2C.mjs.map → renderer-Y5JmTL8J.mjs.map} +1 -1
  231. package/dist/{renderer-CdUf7ZDJ.mjs → renderer-_vcT__tW.mjs} +3 -3
  232. package/dist/{renderer-CdUf7ZDJ.mjs.map → renderer-_vcT__tW.mjs.map} +1 -1
  233. package/dist/renderer-bN7dOErt.mjs +5 -0
  234. package/dist/renderer-jWKVmReU.mjs +5 -0
  235. package/dist/{renderer-kkDfQ56G.mjs → renderer-khVVYoVF.mjs} +3 -3
  236. package/dist/{renderer-kkDfQ56G.mjs.map → renderer-khVVYoVF.mjs.map} +1 -1
  237. package/dist/renderer-lk-At57G.mjs +5 -0
  238. package/dist/renderer-qi8Slwfo.mjs +5 -0
  239. package/dist/renderer-qxOH4JH1.mjs +5 -0
  240. package/dist/renderer-t30NpmIl.mjs +5 -0
  241. package/dist/{renderer-Bo_d7h86.mjs → renderer-vc8t_z-y.mjs} +3 -3
  242. package/dist/{renderer-Bo_d7h86.mjs.map → renderer-vc8t_z-y.mjs.map} +1 -1
  243. package/dist/{renderer-0cHsK6xR.mjs → renderer-wEXBnlr1.mjs} +3 -3
  244. package/dist/{renderer-0cHsK6xR.mjs.map → renderer-wEXBnlr1.mjs.map} +1 -1
  245. package/dist/{renderer-CNs1vBUy.mjs → renderer-wIsJb2eO.mjs} +2 -2
  246. package/dist/{renderer-CNs1vBUy.mjs.map → renderer-wIsJb2eO.mjs.map} +1 -1
  247. package/dist/renderer-wKW4HWRx.mjs +5 -0
  248. package/dist/renderer-ydjPm8bp.mjs +5 -0
  249. package/dist/{renderer-DP41Fokp.mjs → renderer-zdpn1Hkk.mjs} +3 -3
  250. package/dist/{renderer-DP41Fokp.mjs.map → renderer-zdpn1Hkk.mjs.map} +1 -1
  251. package/dist/{renderers-CP8CFWDs-DiX2Y4Qp.mjs → renderers-CP8CFWDs-BbLkcJTN.mjs} +3 -3
  252. package/dist/{renderers-CP8CFWDs-DiX2Y4Qp.mjs.map → renderers-CP8CFWDs-BbLkcJTN.mjs.map} +1 -1
  253. package/dist/signals/index.d.mts +5 -5
  254. package/dist/signals/index.mjs +6 -6
  255. package/dist/{signals-Cf9mfNGE.mjs → signals-BrNF9l9s.mjs} +3 -3
  256. package/dist/{signals-Cf9mfNGE.mjs.map → signals-BrNF9l9s.mjs.map} +1 -1
  257. package/dist/{src-Ds9IAk5S.mjs → src-WAnxhDYD.mjs} +9 -9
  258. package/dist/{src-Ds9IAk5S.mjs.map → src-WAnxhDYD.mjs.map} +1 -1
  259. package/package.json +58 -58
  260. package/dist/dist-DBWkkSvJ.mjs.map +0 -1
  261. package/dist/index-DKssQ_wn.d.mts.map +0 -1
  262. package/dist/index-fymoeGNW.d.mts.map +0 -1
  263. package/dist/preview-engine/chunk-X6HUH6K4.mjs +0 -1
  264. package/dist/preview-engine/renderers-KSQM7EM5.mjs +0 -1
  265. package/dist/preview-engine/renderers-XLBHSQZJ.mjs +0 -228
  266. package/dist/renderer-B-D_VZg3.mjs +0 -5
  267. package/dist/renderer-B64dhpDX.mjs +0 -5
  268. package/dist/renderer-BA2Ko4H1.mjs +0 -3
  269. package/dist/renderer-BDL4jyrb.mjs +0 -5
  270. package/dist/renderer-BKCZGKkl.mjs +0 -5
  271. package/dist/renderer-BKs3jI7-.mjs +0 -5
  272. package/dist/renderer-BW74Zf-u.mjs +0 -5
  273. package/dist/renderer-BXuQN61O.mjs +0 -5
  274. package/dist/renderer-BY1pPvzx.mjs +0 -6
  275. package/dist/renderer-Bahthqvq.mjs +0 -5
  276. package/dist/renderer-BbaiQG8h.mjs +0 -5
  277. package/dist/renderer-BhHF-08y.mjs +0 -5
  278. package/dist/renderer-BnrMcw6C.mjs +0 -5
  279. package/dist/renderer-BsS61z5l.mjs +0 -5
  280. package/dist/renderer-Btuq2Eq8.mjs +0 -5
  281. package/dist/renderer-BxmsEl2x.mjs +0 -5
  282. package/dist/renderer-CGOyHdKs.mjs +0 -5
  283. package/dist/renderer-CJjmpmpu.mjs +0 -5
  284. package/dist/renderer-CQvDDAIu.mjs +0 -5
  285. package/dist/renderer-CYxigw7S.mjs +0 -5
  286. package/dist/renderer-CgDofO5z.mjs +0 -5
  287. package/dist/renderer-CgmQchab.mjs +0 -5
  288. package/dist/renderer-CjzrLwW_.mjs +0 -5
  289. package/dist/renderer-ClnYWADT.mjs +0 -5
  290. package/dist/renderer-CwAd71C6.mjs +0 -5
  291. package/dist/renderer-D3Z9t-xT.mjs +0 -5
  292. package/dist/renderer-DKH1oSlW.mjs +0 -5
  293. package/dist/renderer-DTkf_hwG.mjs +0 -5
  294. package/dist/renderer-DU0bmOS7.mjs +0 -5
  295. package/dist/renderer-D_vJHQt5.mjs +0 -5
  296. package/dist/renderer-Db_wphHH.mjs.map +0 -1
  297. package/dist/renderer-Dc5n0M6P.mjs +0 -5
  298. package/dist/renderer-Ddfn0Dha.mjs +0 -5
  299. package/dist/renderer-DeSoNQeG.mjs +0 -5
  300. package/dist/renderer-DuQMzR3v.mjs.map +0 -1
  301. package/dist/renderer-Dzca9Qba.mjs +0 -5
  302. package/dist/renderer-HRVvtc9c.mjs +0 -5
  303. package/dist/renderer-M3Qs4f1K.mjs +0 -5
  304. package/dist/renderer-NDHJt_Ae.mjs +0 -5
@@ -0,0 +1 @@
1
+ {"version":3,"file":"renderer-BBA-iCi-.mjs","names":[],"sources":["../../../nodes/node-layer-style/dist/renderers-NtFcSRrc.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { FULLSCREEN_QUAD_WGSL, PREMULTIPLIED_BLEND, createFullscreenPipeline, drawFullscreenPass, drawTextureToTarget, fragmentBindGroupLayout } from \"@framefields/node-sdk/gpu\";\n\n//#region src/renderers/webgpu-renderer.ts\nfunction hexToRgba(hex) {\n\tif (!hex) return [\n\t\t1,\n\t\t1,\n\t\t1,\n\t\t1\n\t];\n\tlet cleaned = hex.trim().replace(/^#/, \"\");\n\tif (cleaned.length === 3) cleaned = cleaned.split(\"\").map((c) => c + c).join(\"\") + \"ff\";\n\telse if (cleaned.length === 6) cleaned = cleaned + \"ff\";\n\telse if (cleaned.length === 8) {} else return [\n\t\t1,\n\t\t1,\n\t\t1,\n\t\t1\n\t];\n\tconst r = parseInt(cleaned.slice(0, 2), 16) / 255;\n\tconst g = parseInt(cleaned.slice(2, 4), 16) / 255;\n\tconst b = parseInt(cleaned.slice(4, 6), 16) / 255;\n\tconst a = parseInt(cleaned.slice(6, 8), 16) / 255;\n\treturn [\n\t\tNumber.isFinite(r) ? r : 1,\n\t\tNumber.isFinite(g) ? g : 1,\n\t\tNumber.isFinite(b) ? b : 1,\n\t\tNumber.isFinite(a) ? a : 1\n\t];\n}\nconst BLEND_MODE_MAP = {\n\tnormal: 0,\n\t\"source-over\": 0,\n\tmultiply: 1,\n\tscreen: 2,\n\toverlay: 3,\n\tdarken: 4,\n\tlighten: 5,\n\t\"color-dodge\": 6,\n\t\"color-burn\": 7,\n\t\"hard-light\": 8,\n\t\"soft-light\": 9,\n\tdifference: 10,\n\texclusion: 11,\n\thue: 12,\n\tsaturation: 13,\n\tcolor: 14,\n\tluminosity: 15,\n\t\"mask-in\": 16,\n\t\"destination-in\": 16,\n\t\"mask-out\": 17,\n\t\"destination-out\": 17,\n\t\"source-in\": 18,\n\t\"source-out\": 19,\n\t\"source-atop\": 20,\n\t\"destination-over\": 21,\n\t\"destination-atop\": 22,\n\tlighter: 23,\n\tcopy: 24,\n\txor: 25\n};\nconst BEVEL_STYLE_MAP = {\n\tInnerBevel: 0,\n\tOuterBevel: 1,\n\tEmboss: 2,\n\tPillowEmboss: 3\n};\nconst BEVEL_TECHNIQUE_MAP = {\n\tSmooth: 0,\n\tChiselHard: 1,\n\tChiselSoft: 2\n};\nconst STROKE_POS_MAP = {\n\toutside: 0,\n\tcenter: 1,\n\tinside: 2\n};\nconst WGSL_LAYER_STYLE_SHADER = `\nstruct LayerStyleUniforms {\n\t// Drop Shadow (vec4 x 3)\n\tdropShadowColor : vec4<f32>,\n\tdropShadowParams : vec4<f32>, // x: enabled, y: opacity, z: angle(rad), w: distance\n\tdropShadowParams2 : vec4<f32>, // x: spread, y: size, z: blendMode, w: pad\n\n\t// Inner Shadow (vec4 x 3)\n\tinnerShadowColor : vec4<f32>,\n\tinnerShadowParams : vec4<f32>, // x: enabled, y: opacity, z: angle(rad), w: distance\n\tinnerShadowParams2 : vec4<f32>, // x: choke, y: size, z: blendMode, w: pad\n\n\t// Outer Glow (vec4 x 3)\n\touterGlowColor : vec4<f32>,\n\touterGlowParams : vec4<f32>, // x: enabled, y: opacity, z: size, w: spread\n\touterGlowParams2 : vec4<f32>, // x: blendMode, yzw: pad\n\n\t// Inner Glow (vec4 x 3)\n\tinnerGlowColor : vec4<f32>,\n\tinnerGlowParams : vec4<f32>, // x: enabled, y: opacity, z: size, w: spread\n\tinnerGlowParams2 : vec4<f32>, // x: blendMode, yzw: pad\n\n\t// Stroke (vec4 x 3)\n\tstrokeColor : vec4<f32>,\n\tstrokeParams : vec4<f32>, // x: enabled, y: size, z: position(0:out,1:center,2:in), w: opacity\n\tstrokeParams2 : vec4<f32>, // x: blendMode, yzw: pad\n\n\t// Bevel & Emboss (vec4 x 5)\n\tbevelHighlightColor : vec4<f32>,\n\tbevelShadowColor : vec4<f32>,\n\tbevelParams1 : vec4<f32>, // x: enabled, y: style, z: technique, w: depth\n\tbevelParams2 : vec4<f32>, // x: direction(1:up, -1:down), y: size, z: soften, w: angle(rad)\n\tbevelParams3 : vec4<f32>, // x: altitude(rad), y: hlOpacity, z: shOpacity, w: pad\n\n\t// Color Overlay (vec4 x 2)\n\tcolorOverlayColor : vec4<f32>,\n\tcolorOverlayParams : vec4<f32>, // x: enabled, y: opacity, z: blendMode, w: pad\n};\n\n@group(0) @binding(0) var<uniform> u : LayerStyleUniforms;\n@group(1) @binding(0) var tex : texture_2d<f32>;\n@group(1) @binding(1) var samp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\nfn sampleAlpha(uv: vec2<f32>) -> f32 {\n\tif (uv.x < 0.0 || uv.x > 1.0 || uv.y < 0.0 || uv.y > 1.0) {\n\t\treturn 0.0;\n\t}\n\treturn textureSampleLevel(tex, samp, uv, 0.0).a;\n}\n\nfn lum(c: vec3<f32>) -> f32 {\n\treturn 0.3 * c.r + 0.59 * c.g + 0.11 * c.b;\n}\n\nfn clip_color(c: vec3<f32>) -> vec3<f32> {\n\tlet l = lum(c);\n\tlet n = min(min(c.r, c.g), c.b);\n\tlet x = max(max(c.r, c.g), c.b);\n\tvar res = c;\n\tif (n < 0.0) {\n\t\tres = l + (((res - l) * l) / max(l - n, 1e-5));\n\t}\n\tif (x > 1.0) {\n\t\tres = l + (((res - l) * (1.0 - l)) / max(x - l, 1e-5));\n\t}\n\treturn res;\n}\n\nfn set_lum(c: vec3<f32>, l: f32) -> vec3<f32> {\n\tlet diff = l - lum(c);\n\treturn clip_color(c + vec3<f32>(diff));\n}\n\nfn sat(c: vec3<f32>) -> f32 {\n\treturn max(max(c.r, c.g), c.b) - min(min(c.r, c.g), c.b);\n}\n\nfn set_sat(c: vec3<f32>, s: f32) -> vec3<f32> {\n\tlet c_min = min(min(c.r, c.g), c.b);\n\tlet c_max = max(max(c.r, c.g), c.b);\n\tif (c_max <= c_min) {\n\t\treturn vec3<f32>(0.0);\n\t}\n\treturn (c - vec3<f32>(c_min)) * s / max(c_max - c_min, 1e-5);\n}\n\nfn blendRgb(d_rgb: vec3<f32>, s_rgb: vec3<f32>, mode: u32) -> vec3<f32> {\n\tswitch (mode) {\n\t\tcase 1u: { // multiply\n\t\t\treturn d_rgb * s_rgb;\n\t\t}\n\t\tcase 2u: { // screen\n\t\t\treturn d_rgb + s_rgb - d_rgb * s_rgb;\n\t\t}\n\t\tcase 3u: { // overlay\n\t\t\treturn select(\n\t\t\t\t1.0 - 2.0 * (1.0 - d_rgb) * (1.0 - s_rgb),\n\t\t\t\t2.0 * d_rgb * s_rgb,\n\t\t\t\td_rgb < vec3<f32>(0.5)\n\t\t\t);\n\t\t}\n\t\tcase 4u: { // darken\n\t\t\treturn min(d_rgb, s_rgb);\n\t\t}\n\t\tcase 5u: { // lighten\n\t\t\treturn max(d_rgb, s_rgb);\n\t\t}\n\t\tcase 6u: { // color-dodge\n\t\t\treturn select(min(d_rgb / max(1.0 - s_rgb, vec3<f32>(1e-4)), vec3<f32>(1.0)), vec3<f32>(1.0), s_rgb >= vec3<f32>(0.999));\n\t\t}\n\t\tcase 7u: { // color-burn\n\t\t\treturn select(1.0 - min((1.0 - d_rgb) / max(s_rgb, vec3<f32>(1e-4)), vec3<f32>(1.0)), vec3<f32>(0.0), s_rgb <= vec3<f32>(0.001));\n\t\t}\n\t\tcase 8u: { // hard-light\n\t\t\treturn select(\n\t\t\t\t1.0 - 2.0 * (1.0 - d_rgb) * (1.0 - s_rgb),\n\t\t\t\t2.0 * d_rgb * s_rgb,\n\t\t\t\ts_rgb < vec3<f32>(0.5)\n\t\t\t);\n\t\t}\n\t\tcase 9u: { // soft-light\n\t\t\treturn select(\n\t\t\t\td_rgb + (2.0 * s_rgb - 1.0) * (sqrt(d_rgb) - d_rgb),\n\t\t\t\td_rgb - (1.0 - 2.0 * s_rgb) * d_rgb * (1.0 - d_rgb),\n\t\t\t\ts_rgb <= vec3<f32>(0.5)\n\t\t\t);\n\t\t}\n\t\tcase 10u: { // difference\n\t\t\treturn abs(d_rgb - s_rgb);\n\t\t}\n\t\tcase 11u: { // exclusion\n\t\t\treturn d_rgb + s_rgb - 2.0 * d_rgb * s_rgb;\n\t\t}\n\t\tcase 12u: { // hue\n\t\t\treturn set_lum(set_sat(s_rgb, sat(d_rgb)), lum(d_rgb));\n\t\t}\n\t\tcase 13u: { // saturation\n\t\t\treturn set_lum(set_sat(d_rgb, sat(s_rgb)), lum(d_rgb));\n\t\t}\n\t\tcase 14u: { // color\n\t\t\treturn set_lum(s_rgb, lum(d_rgb));\n\t\t}\n\t\tcase 15u: { // luminosity\n\t\t\treturn set_lum(d_rgb, lum(s_rgb));\n\t\t}\n\t\tdefault: { // normal / source-over\n\t\t\treturn s_rgb;\n\t\t}\n\t}\n}\n\nfn compositeLayer(dst: vec4<f32>, src: vec4<f32>, blendMode: u32) -> vec4<f32> {\n\tlet sa = clamp(src.a, 0.0, 1.0);\n\tif (sa <= 0.0001) {\n\t\treturn dst;\n\t}\n\tlet da = clamp(dst.a, 0.0, 1.0);\n\tif (da <= 0.0001) {\n\t\treturn src;\n\t}\n\n\tswitch (blendMode) {\n\t\tcase 16u: { return dst * sa; } // mask-in / destination-in\n\t\tcase 17u: { return dst * (1.0 - sa); } // mask-out / destination-out\n\t\tcase 18u: { return src * da; } // source-in\n\t\tcase 19u: { return src * (1.0 - da); } // source-out\n\t\tcase 20u: { return src * da + dst * (1.0 - sa); } // source-atop\n\t\tcase 21u: { return dst + src * (1.0 - da); } // destination-over\n\t\tcase 22u: { return dst * sa + src * (1.0 - da); } // destination-atop\n\t\tcase 23u: { return src + dst; } // lighter / add\n\t\tcase 24u: { return src; } // copy\n\t\tcase 25u: { return src * (1.0 - da) + dst * (1.0 - sa); } // xor\n\t\tdefault: {}\n\t}\n\n\tlet b_rgb = blendRgb(dst.rgb, src.rgb, blendMode);\n\tlet out_a = sa + da * (1.0 - sa);\n\tlet out_rgb = select(\n\t\t((1.0 - da) * src.rgb + (1.0 - sa) * dst.rgb + sa * da * b_rgb) / max(out_a, 1e-5),\n\t\tb_rgb,\n\t\tout_a <= 1e-4\n\t);\n\n\treturn vec4<f32>(out_rgb, out_a);\n}\n\n@fragment fn fs(in: VSOut) -> @location(0) vec4<f32> {\n\tlet dimensions = vec2<f32>(textureDimensions(tex));\n\tlet texelSize = 1.0 / max(dimensions, vec2<f32>(1.0, 1.0));\n\tlet origColor = textureSampleLevel(tex, samp, in.uv, 0.0);\n\tlet origA = origColor.a;\n\n\tvar result = vec4<f32>(0.0);\n\n\t// =========================================================================\n\t// 1. DROP SHADOW (Bottom Layer)\n\t// =========================================================================\n\tif (u.dropShadowParams.x > 0.5) {\n\t\tlet opacity = u.dropShadowParams.y;\n\t\tlet angle = u.dropShadowParams.z;\n\t\tlet distance = u.dropShadowParams.w;\n\t\tlet spread = u.dropShadowParams2.x;\n\t\tlet size = u.dropShadowParams2.y;\n\t\tlet blendMode = u32(u.dropShadowParams2.z);\n\n\t\tlet shadowOffset = vec2<f32>(-cos(angle), sin(angle)) * distance * texelSize;\n\t\tlet shadowCenterUv = in.uv - shadowOffset;\n\n\t\tvar shadowAccum = 0.0;\n\t\tvar shadowWeightSum = 0.0;\n\n\t\tlet sigma = max(0.5, size * 0.4);\n\t\tlet sampleRadius = min(i32(ceil(size)), 24);\n\n\t\tif (size <= 0.5) {\n\t\t\tshadowAccum = sampleAlpha(shadowCenterUv);\n\t\t\tshadowWeightSum = 1.0;\n\t\t} else {\n\t\t\tlet stepVal = max(1, sampleRadius / 8);\n\t\t\tfor (var y = -sampleRadius; y <= sampleRadius; y += stepVal) {\n\t\t\t\tfor (var x = -sampleRadius; x <= sampleRadius; x += stepVal) {\n\t\t\t\t\tlet offset = vec2<f32>(f32(x), f32(y)) * texelSize;\n\t\t\t\t\tlet distSq = f32(x * x + y * y);\n\t\t\t\t\tlet weight = exp(-0.5 * distSq / (sigma * sigma));\n\t\t\t\t\tshadowAccum += sampleAlpha(shadowCenterUv + offset) * weight;\n\t\t\t\t\tshadowWeightSum += weight;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tlet blurredShadow = shadowAccum / max(shadowWeightSum, 1e-4);\n\t\tlet spreadFactor = spread / 100.0;\n\t\tlet finalShadowAlpha = clamp(blurredShadow / max(1.0 - spreadFactor * 0.95, 0.01), 0.0, 1.0) * opacity;\n\n\t\tif (finalShadowAlpha > 0.001) {\n\t\t\tlet shadowCol = vec4<f32>(u.dropShadowColor.rgb, finalShadowAlpha);\n\t\t\tresult = compositeLayer(result, shadowCol, blendMode);\n\t\t}\n\t}\n\n\t// =========================================================================\n\t// 2. OUTER GLOW\n\t// =========================================================================\n\tif (u.outerGlowParams.x > 0.5) {\n\t\tlet opacity = u.outerGlowParams.y;\n\t\tlet size = u.outerGlowParams.z;\n\t\tlet spread = u.outerGlowParams.w;\n\t\tlet blendMode = u32(u.outerGlowParams2.x);\n\n\t\tvar glowAccum = 0.0;\n\t\tvar glowWeightSum = 0.0;\n\t\tlet sigma = max(0.5, size * 0.4);\n\t\tlet sampleRadius = min(i32(ceil(size)), 24);\n\n\t\tif (size <= 0.5) {\n\t\t\tglowAccum = origA;\n\t\t\tglowWeightSum = 1.0;\n\t\t} else {\n\t\t\tlet stepVal = max(1, sampleRadius / 8);\n\t\t\tfor (var y = -sampleRadius; y <= sampleRadius; y += stepVal) {\n\t\t\t\tfor (var x = -sampleRadius; x <= sampleRadius; x += stepVal) {\n\t\t\t\t\tlet offset = vec2<f32>(f32(x), f32(y)) * texelSize;\n\t\t\t\t\tlet distSq = f32(x * x + y * y);\n\t\t\t\t\tlet weight = exp(-0.5 * distSq / (sigma * sigma));\n\t\t\t\t\tglowAccum += sampleAlpha(in.uv + offset) * weight;\n\t\t\t\t\tglowWeightSum += weight;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tlet blurredGlow = glowAccum / max(glowWeightSum, 1e-4);\n\t\tlet spreadFactor = spread / 100.0;\n\t\tlet spreadGlow = clamp(blurredGlow / max(1.0 - spreadFactor * 0.95, 0.01), 0.0, 1.0);\n\t\tlet finalGlowAlpha = max(0.0, spreadGlow - origA) * opacity;\n\n\t\tif (finalGlowAlpha > 0.001) {\n\t\t\tlet glowCol = vec4<f32>(u.outerGlowColor.rgb, finalGlowAlpha);\n\t\t\tresult = compositeLayer(result, glowCol, blendMode);\n\t\t}\n\t}\n\n\t// =========================================================================\n\t// 3. OUTSIDE STROKE\n\t// =========================================================================\n\tif (u.strokeParams.x > 0.5 && u.strokeParams.z < 0.5) { // position == 0: outside\n\t\tlet size = u.strokeParams.y;\n\t\tlet opacity = u.strokeParams.w;\n\t\tlet blendMode = u32(u.strokeParams2.x);\n\n\t\tvar maxAlpha = 0.0;\n\t\tlet sampleRadius = min(i32(ceil(size)), 24);\n\t\tlet sizeSq = size * size;\n\n\t\tfor (var y = -sampleRadius; y <= sampleRadius; y++) {\n\t\t\tfor (var x = -sampleRadius; x <= sampleRadius; x++) {\n\t\t\t\tlet distSq = f32(x * x + y * y);\n\t\t\t\tif (distSq <= sizeSq) {\n\t\t\t\t\tlet sAlpha = sampleAlpha(in.uv + vec2<f32>(f32(x), f32(y)) * texelSize);\n\t\t\t\t\tmaxAlpha = max(maxAlpha, sAlpha);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tlet strokeAlpha = clamp(maxAlpha - origA, 0.0, 1.0) * opacity;\n\t\tif (strokeAlpha > 0.001) {\n\t\t\tlet strokeCol = vec4<f32>(u.strokeColor.rgb, strokeAlpha);\n\t\t\tresult = compositeLayer(result, strokeCol, blendMode);\n\t\t}\n\t}\n\n\t// =========================================================================\n\t// 4. BASE IMAGE LAYER (with Color Overlay, Bevel & Emboss, Inner Glow/Shadow)\n\t// =========================================================================\n\tif (origA > 0.001) {\n\t\tvar baseRgb = origColor.rgb;\n\n\t\t// Color Overlay\n\t\tif (u.colorOverlayParams.x > 0.5) {\n\t\t\tlet overlayOpacity = u.colorOverlayParams.y;\n\t\t\tlet overlayBlendMode = u32(u.colorOverlayParams.z);\n\t\t\tlet blendedOverlay = blendRgb(baseRgb, u.colorOverlayColor.rgb, overlayBlendMode);\n\t\t\tbaseRgb = mix(baseRgb, blendedOverlay, overlayOpacity);\n\t\t}\n\n\t\t// Bevel & Emboss\n\t\tif (u.bevelParams1.x > 0.5) {\n\t\t\tlet style = u.bevelParams1.y;\n\t\t\tlet technique = u.bevelParams1.z;\n\t\t\tlet depth = u.bevelParams1.w / 100.0;\n\t\t\tlet direction = u.bevelParams2.x;\n\t\t\tlet bevelSize = max(0.5, u.bevelParams2.y);\n\t\t\tlet soften = u.bevelParams2.z;\n\t\t\tlet lightAngle = u.bevelParams2.w;\n\t\t\tlet lightAltitude = u.bevelParams3.x;\n\t\t\tlet hlOpacity = u.bevelParams3.y;\n\t\t\tlet shOpacity = u.bevelParams3.z;\n\n\t\t\tlet lightDir = normalize(vec3<f32>(\n\t\t\t\t-cos(lightAngle) * cos(lightAltitude),\n\t\t\t\tsin(lightAngle) * cos(lightAltitude),\n\t\t\t\tsin(lightAltitude)\n\t\t\t));\n\n\t\t\tlet stepSize = max(1.0, bevelSize * 0.5 + soften) * texelSize;\n\t\t\tlet aL = sampleAlpha(in.uv - vec2<f32>(stepSize.x, 0.0));\n\t\t\tlet aR = sampleAlpha(in.uv + vec2<f32>(stepSize.x, 0.0));\n\t\t\tlet aT = sampleAlpha(in.uv - vec2<f32>(0.0, stepSize.y));\n\t\t\tlet aB = sampleAlpha(in.uv + vec2<f32>(0.0, stepSize.y));\n\n\t\t\tvar dx = (aR - aL) * depth * direction;\n\t\t\tvar dy = (aB - aT) * depth * direction;\n\n\t\t\tif (technique > 0.5) { // ChiselHard or ChiselSoft\n\t\t\t\tlet rampFactor = select(2.0, 1.5, technique > 1.5);\n\t\t\t\tdx = clamp(dx * rampFactor, -1.0, 1.0);\n\t\t\t\tdy = clamp(dy * rampFactor, -1.0, 1.0);\n\t\t\t}\n\n\t\t\tlet normal = normalize(vec3<f32>(-dx, -dy, 1.0));\n\t\t\tlet nDotL = dot(normal, lightDir);\n\n\t\t\tlet highlightAmount = max(0.0, nDotL) * hlOpacity;\n\t\t\tlet shadowAmount = max(0.0, -nDotL) * shOpacity;\n\n\t\t\tlet hlColor = mix(baseRgb, u.bevelHighlightColor.rgb + baseRgb, highlightAmount);\n\t\t\tlet shColor = mix(baseRgb, baseRgb * (1.0 - shadowAmount) + u.bevelShadowColor.rgb * shadowAmount, shadowAmount);\n\t\t\tbaseRgb = mix(shColor, hlColor, clamp(nDotL * 0.5 + 0.5, 0.0, 1.0));\n\t\t}\n\n\t\t// Inner Glow\n\t\tif (u.innerGlowParams.x > 0.5) {\n\t\t\tlet igOpacity = u.innerGlowParams.y;\n\t\t\tlet igSize = u.innerGlowParams.z;\n\t\t\tlet igSpread = u.innerGlowParams.w;\n\t\t\tlet igBlendMode = u32(u.innerGlowParams2.x);\n\n\t\t\tvar innerAccum = 0.0;\n\t\t\tvar innerWeight = 0.0;\n\t\t\tlet sigma = max(0.5, igSize * 0.4);\n\t\t\tlet sampleRadius = min(i32(ceil(igSize)), 16);\n\t\t\tlet stepVal = max(1, sampleRadius / 6);\n\n\t\t\tfor (var y = -sampleRadius; y <= sampleRadius; y += stepVal) {\n\t\t\t\tfor (var x = -sampleRadius; x <= sampleRadius; x += stepVal) {\n\t\t\t\t\tlet offset = vec2<f32>(f32(x), f32(y)) * texelSize;\n\t\t\t\t\tlet weight = exp(-0.5 * f32(x * x + y * y) / (sigma * sigma));\n\t\t\t\t\tinnerAccum += sampleAlpha(in.uv + offset) * weight;\n\t\t\t\t\tinnerWeight += weight;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet blurredInner = innerAccum / max(innerWeight, 1e-4);\n\t\t\tlet innerGlowMask = max(0.0, origA - blurredInner);\n\t\t\tlet spreadFactor = igSpread / 100.0;\n\t\t\tlet finalInnerGlowAlpha = clamp(innerGlowMask / max(1.0 - spreadFactor * 0.95, 0.01), 0.0, 1.0) * igOpacity;\n\n\t\t\tif (finalInnerGlowAlpha > 0.001) {\n\t\t\t\tlet igBlended = blendRgb(baseRgb, u.innerGlowColor.rgb, igBlendMode);\n\t\t\t\tbaseRgb = mix(baseRgb, igBlended, finalInnerGlowAlpha);\n\t\t\t}\n\t\t}\n\n\t\t// Inner Shadow\n\t\tif (u.innerShadowParams.x > 0.5) {\n\t\t\tlet isOpacity = u.innerShadowParams.y;\n\t\t\tlet isAngle = u.innerShadowParams.z;\n\t\t\tlet isDistance = u.innerShadowParams.w;\n\t\t\tlet isChoke = u.innerShadowParams2.x;\n\t\t\tlet isSize = u.innerShadowParams2.y;\n\t\t\tlet isBlendMode = u32(u.innerShadowParams2.z);\n\n\t\t\tlet isOffset = vec2<f32>(-cos(isAngle), sin(isAngle)) * isDistance * texelSize;\n\t\t\tlet shiftedA = sampleAlpha(in.uv + isOffset);\n\n\t\t\tvar isAccum = 0.0;\n\t\t\tvar isWeight = 0.0;\n\t\t\tlet sigma = max(0.5, isSize * 0.4);\n\t\t\tlet sampleRadius = min(i32(ceil(isSize)), 16);\n\t\t\tlet stepVal = max(1, sampleRadius / 6);\n\n\t\t\tfor (var y = -sampleRadius; y <= sampleRadius; y += stepVal) {\n\t\t\t\tfor (var x = -sampleRadius; x <= sampleRadius; x += stepVal) {\n\t\t\t\t\tlet offset = vec2<f32>(f32(x), f32(y)) * texelSize;\n\t\t\t\t\tlet weight = exp(-0.5 * f32(x * x + y * y) / (sigma * sigma));\n\t\t\t\t\tlet sShifted = sampleAlpha(in.uv + isOffset + offset);\n\t\t\t\t\tlet sOrig = sampleAlpha(in.uv + offset);\n\t\t\t\t\tisAccum += max(0.0, sOrig - sShifted) * weight;\n\t\t\t\t\tisWeight += weight;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet blurredIS = isAccum / max(isWeight, 1e-4);\n\t\t\tlet chokeFactor = isChoke / 100.0;\n\t\t\tlet finalISAlpha = clamp(blurredIS / max(1.0 - chokeFactor * 0.95, 0.01), 0.0, 1.0) * isOpacity;\n\n\t\t\tif (finalISAlpha > 0.001) {\n\t\t\t\tlet isBlended = blendRgb(baseRgb, u.innerShadowColor.rgb, isBlendMode);\n\t\t\t\tbaseRgb = mix(baseRgb, isBlended, finalISAlpha);\n\t\t\t}\n\t\t}\n\n\t\t// Inside Stroke\n\t\tif (u.strokeParams.x > 0.5 && u.strokeParams.z > 1.5) { // position == 2: inside\n\t\t\tlet size = u.strokeParams.y;\n\t\t\tlet opacity = u.strokeParams.w;\n\t\t\tlet blendMode = u32(u.strokeParams2.x);\n\n\t\t\tvar minAlpha = 1.0;\n\t\t\tlet sampleRadius = min(i32(ceil(size)), 24);\n\t\t\tlet sizeSq = size * size;\n\n\t\t\tfor (var y = -sampleRadius; y <= sampleRadius; y++) {\n\t\t\t\tfor (var x = -sampleRadius; x <= sampleRadius; x++) {\n\t\t\t\t\tlet distSq = f32(x * x + y * y);\n\t\t\t\t\tif (distSq <= sizeSq) {\n\t\t\t\t\t\tlet sAlpha = sampleAlpha(in.uv + vec2<f32>(f32(x), f32(y)) * texelSize);\n\t\t\t\t\t\tminAlpha = min(minAlpha, sAlpha);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tlet insideStrokeAlpha = clamp(origA - minAlpha, 0.0, 1.0) * opacity;\n\t\t\tif (insideStrokeAlpha > 0.001) {\n\t\t\t\tlet sBlended = blendRgb(baseRgb, u.strokeColor.rgb, blendMode);\n\t\t\t\tbaseRgb = mix(baseRgb, sBlended, insideStrokeAlpha);\n\t\t\t}\n\t\t}\n\n\t\tlet baseLayer = vec4<f32>(baseRgb, origA);\n\t\tresult = compositeLayer(result, baseLayer, 0u);\n\t}\n\n\t// =========================================================================\n\t// 5. CENTER STROKE\n\t// =========================================================================\n\tif (u.strokeParams.x > 0.5 && u.strokeParams.z >= 0.5 && u.strokeParams.z <= 1.5) { // position == 1: center\n\t\tlet size = u.strokeParams.y;\n\t\tlet opacity = u.strokeParams.w;\n\t\tlet blendMode = u32(u.strokeParams2.x);\n\n\t\tvar maxAlpha = 0.0;\n\t\tvar minAlpha = 1.0;\n\t\tlet halfSize = max(0.5, size * 0.5);\n\t\tlet sampleRadius = min(i32(ceil(halfSize)), 24);\n\t\tlet halfSizeSq = halfSize * halfSize;\n\n\t\tfor (var y = -sampleRadius; y <= sampleRadius; y++) {\n\t\t\tfor (var x = -sampleRadius; x <= sampleRadius; x++) {\n\t\t\t\tlet distSq = f32(x * x + y * y);\n\t\t\t\tif (distSq <= halfSizeSq) {\n\t\t\t\t\tlet sAlpha = sampleAlpha(in.uv + vec2<f32>(f32(x), f32(y)) * texelSize);\n\t\t\t\t\tmaxAlpha = max(maxAlpha, sAlpha);\n\t\t\t\t\tminAlpha = min(minAlpha, sAlpha);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tlet centerStrokeAlpha = clamp(maxAlpha - minAlpha, 0.0, 1.0) * opacity;\n\t\tif (centerStrokeAlpha > 0.001) {\n\t\t\tlet strokeCol = vec4<f32>(u.strokeColor.rgb, centerStrokeAlpha);\n\t\t\tresult = compositeLayer(result, strokeCol, blendMode);\n\t\t}\n\t}\n\n\t// Output premultiplied alpha for QuadPipeline / WebGPU rendering\n\treturn vec4<f32>(result.rgb * result.a, result.a);\n}\n`;\nconst resourcesCache = /* @__PURE__ */ new WeakMap();\nfunction getLayerStyleResources(device, format) {\n\tlet res = resourcesCache.get(device);\n\tif (res) return res;\n\tconst module = device.createShaderModule({ code: WGSL_LAYER_STYLE_SHADER });\n\tconst uniformLayout = fragmentBindGroupLayout(device, [\"uniform\"]);\n\tconst textureLayout = fragmentBindGroupLayout(device, [\"texture\", \"sampler\"]);\n\tres = {\n\t\tpipeline: createFullscreenPipeline(device, {\n\t\t\tmodule,\n\t\t\tlayouts: device.createPipelineLayout({ bindGroupLayouts: [uniformLayout, textureLayout] }),\n\t\t\tformat,\n\t\t\tblend: PREMULTIPLIED_BLEND\n\t\t}),\n\t\tuniformLayout,\n\t\ttextureLayout\n\t};\n\tresourcesCache.set(device, res);\n\treturn res;\n}\nconst uniformBufferData = new Float32Array(88);\nconst WebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetTexture, targetWidth, targetHeight, props, drawChild } = args;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"LayerStyle\" || !op) return;\n\tconst childMedia = props.virtualMedia.children?.[0];\n\tif (!childMedia) return;\n\tpass.end();\n\tconst width = targetWidth;\n\tconst height = targetHeight;\n\tconst elapsedSeconds = props.elapsedMs !== void 0 ? props.elapsedMs / 1e3 : (props.frame ?? 0) / (props.fps || 30);\n\tconst resolveField = (handleId, fallbackVal, clampMin = 0, clampMax = 1e3) => {\n\t\tif (handleId && op.inputs?.[handleId]?.connectionValid) {\n\t\t\tconst outputItem = op.inputs[handleId].outputItem;\n\t\t\tif (!outputItem) return Math.max(clampMin, Math.min(clampMax, fallbackVal));\n\t\t\tif (outputItem.type === \"Number\") {\n\t\t\t\tconst numVal = typeof outputItem.data === \"number\" ? outputItem.data : outputItem.data?.value ?? fallbackVal;\n\t\t\t\treturn Math.max(clampMin, Math.min(clampMax, numVal));\n\t\t\t}\n\t\t\tif (outputItem.type === \"Signal\") {\n\t\t\t\tconst data = outputItem.data;\n\t\t\t\tif (typeof data === \"number\") return Math.max(clampMin, Math.min(clampMax, data));\n\t\t\t\tif (data && typeof data === \"object\") {\n\t\t\t\t\tif (typeof data.value === \"number\") return Math.max(clampMin, Math.min(clampMax, data.value));\n\t\t\t\t\tconst amp = typeof data.amplitude === \"number\" ? data.amplitude : 1;\n\t\t\t\t\tconst freq = typeof data.frequency === \"number\" ? data.frequency : 1;\n\t\t\t\t\tconst phase = typeof data.phase === \"number\" ? data.phase : 0;\n\t\t\t\t\tconst offset = typeof data.offset === \"number\" ? data.offset : fallbackVal;\n\t\t\t\t\tconst t = elapsedSeconds;\n\t\t\t\t\tconst computed = offset + amp * Math.sin(2 * Math.PI * freq * t + phase);\n\t\t\t\t\treturn Math.max(clampMin, Math.min(clampMax, computed));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn Math.max(clampMin, Math.min(clampMax, fallbackVal));\n\t};\n\tconst childW = width;\n\tconst childH = height;\n\tconst childTex = ctx.renderer.getTemporaryTexture(childW, childH, [...props.excludeTextures || [], targetTexture]);\n\tconst childView = childTex.createView();\n\tctx.renderer.beginFrame(encoder, childView, {\n\t\tr: 0,\n\t\tg: 0,\n\t\tb: 0,\n\t\ta: 0\n\t}, childW, childH, \"clear\").end();\n\tawait drawChild(childMedia, {\n\t\t...props,\n\t\tvirtualMedia: childMedia,\n\t\tcontainerWidth: childW,\n\t\tcontainerHeight: childH\n\t}, childView, childTex, childW, childH);\n\tconst inputTex = ctx.renderer.getTemporaryTexture(width, height, [\n\t\tchildTex,\n\t\ttargetTexture,\n\t\t...props.excludeTextures || []\n\t]);\n\tconst inputView = inputTex.createView();\n\tconst inputPass = ctx.renderer.beginFrame(encoder, inputView, {\n\t\tr: 0,\n\t\tg: 0,\n\t\tb: 0,\n\t\ta: 0\n\t}, width, height, \"clear\");\n\tctx.renderer.drawTexture(inputPass, childTex, {\n\t\tx: 0,\n\t\ty: 0,\n\t\twidth: childW,\n\t\theight: childH\n\t}, { opacity: 1 });\n\tinputPass.end();\n\tconst { pipeline, uniformLayout, textureLayout } = getLayerStyleResources(ctx.device, ctx.renderer.format);\n\tconst sampler = ctx.renderer.samplerCache.getSampler(ctx.device);\n\tconst ds = op.dropShadow ?? {};\n\tconst is = op.innerShadow ?? {};\n\tconst og = op.outerGlow ?? {};\n\tconst ig = op.innerGlow ?? {};\n\tconst st = op.stroke ?? {};\n\tconst be = op.bevelEmboss ?? {};\n\tconst co = op.colorOverlay ?? {};\n\tconst dsCol = hexToRgba(ds.color ?? \"#000000\");\n\tconst dsOpacity = resolveField(op.dropShadowOpacityHandleId, ds.opacity ?? .75, 0, 1);\n\tconst dsAngle = resolveField(op.dropShadowAngleHandleId, ds.angle ?? 120, 0, 360) * Math.PI / 180;\n\tconst dsDist = resolveField(op.dropShadowDistanceHandleId, ds.distance ?? 10, 0, 500);\n\tconst dsSpread = resolveField(op.dropShadowSpreadHandleId, ds.spread ?? 0, 0, 100);\n\tconst dsSize = resolveField(op.dropShadowSizeHandleId, ds.size ?? 10, 0, 250);\n\tconst dsBlend = BLEND_MODE_MAP[ds.blendMode ?? \"multiply\"] ?? 1;\n\tconst isCol = hexToRgba(is.color ?? \"#000000\");\n\tconst isOpacity = resolveField(op.innerShadowOpacityHandleId, is.opacity ?? .75, 0, 1);\n\tconst isAngle = resolveField(op.innerShadowAngleHandleId, is.angle ?? 120, 0, 360) * Math.PI / 180;\n\tconst isDist = resolveField(op.innerShadowDistanceHandleId, is.distance ?? 5, 0, 500);\n\tconst isChoke = resolveField(op.innerShadowChokeHandleId, is.choke ?? 0, 0, 100);\n\tconst isSize = resolveField(op.innerShadowSizeHandleId, is.size ?? 5, 0, 250);\n\tconst isBlend = BLEND_MODE_MAP[is.blendMode ?? \"multiply\"] ?? 1;\n\tconst ogCol = hexToRgba(og.color ?? \"#ffffff\");\n\tconst ogOpacity = resolveField(op.outerGlowOpacityHandleId, og.opacity ?? .75, 0, 1);\n\tconst ogSize = resolveField(op.outerGlowSizeHandleId, og.size ?? 15, 0, 250);\n\tconst ogSpread = resolveField(op.outerGlowSpreadHandleId, og.spread ?? 0, 0, 100);\n\tconst ogBlend = BLEND_MODE_MAP[og.blendMode ?? \"screen\"] ?? 2;\n\tconst igCol = hexToRgba(ig.color ?? \"#ffffff\");\n\tconst igOpacity = resolveField(op.innerGlowOpacityHandleId, ig.opacity ?? .75, 0, 1);\n\tconst igSize = resolveField(op.innerGlowSizeHandleId, ig.size ?? 15, 0, 250);\n\tconst igSpread = resolveField(op.innerGlowSpreadHandleId, ig.spread ?? 0, 0, 100);\n\tconst igBlend = BLEND_MODE_MAP[ig.blendMode ?? \"screen\"] ?? 2;\n\tconst stCol = hexToRgba(st.color ?? \"#ffffff\");\n\tconst stSize = resolveField(op.strokeSizeHandleId, st.size ?? 2, 0, 100);\n\tconst stPos = STROKE_POS_MAP[st.position ?? \"outside\"] ?? 0;\n\tconst stOpacity = resolveField(op.strokeOpacityHandleId, st.opacity ?? 1, 0, 1);\n\tconst stBlend = BLEND_MODE_MAP[st.blendMode ?? \"normal\"] ?? 0;\n\tconst beHlCol = hexToRgba(be.highlightColor ?? \"#ffffff\");\n\tconst beShCol = hexToRgba(be.shadowColor ?? \"#000000\");\n\tconst beStyle = BEVEL_STYLE_MAP[be.style ?? \"InnerBevel\"] ?? 0;\n\tconst beTech = BEVEL_TECHNIQUE_MAP[be.technique ?? \"Smooth\"] ?? 0;\n\tconst beDepth = resolveField(op.bevelEmbossDepthHandleId, be.depth ?? 100, 1, 1e3);\n\tconst beDir = be.direction === \"Down\" ? -1 : 1;\n\tconst beSize = resolveField(op.bevelEmbossSizeHandleId, be.size ?? 5, 0, 250);\n\tconst beSoften = resolveField(op.bevelEmbossSoftenHandleId, be.soften ?? 0, 0, 50);\n\tconst beAngle = resolveField(op.bevelEmbossAngleHandleId, be.angle ?? 120, 0, 360) * Math.PI / 180;\n\tconst beAltitude = resolveField(op.bevelEmbossAltitudeHandleId, be.altitude ?? 30, 0, 90) * Math.PI / 180;\n\tconst beHlOpacity = resolveField(op.bevelEmbossHighlightOpacityHandleId, be.highlightOpacity ?? .75, 0, 1);\n\tconst beShOpacity = resolveField(op.bevelEmbossShadowOpacityHandleId, be.shadowOpacity ?? .75, 0, 1);\n\tconst coCol = hexToRgba(co.color ?? \"#ff0000\");\n\tconst coOpacity = resolveField(op.colorOverlayOpacityHandleId, co.opacity ?? 1, 0, 1);\n\tconst coBlend = BLEND_MODE_MAP[co.blendMode ?? \"normal\"] ?? 0;\n\tuniformBufferData.fill(0);\n\tuniformBufferData[0] = dsCol[0];\n\tuniformBufferData[1] = dsCol[1];\n\tuniformBufferData[2] = dsCol[2];\n\tuniformBufferData[3] = dsCol[3];\n\tuniformBufferData[4] = ds.enabled ? 1 : 0;\n\tuniformBufferData[5] = dsOpacity;\n\tuniformBufferData[6] = dsAngle;\n\tuniformBufferData[7] = dsDist;\n\tuniformBufferData[8] = dsSpread;\n\tuniformBufferData[9] = dsSize;\n\tuniformBufferData[10] = dsBlend;\n\tuniformBufferData[11] = 0;\n\tuniformBufferData[12] = isCol[0];\n\tuniformBufferData[13] = isCol[1];\n\tuniformBufferData[14] = isCol[2];\n\tuniformBufferData[15] = isCol[3];\n\tuniformBufferData[16] = is.enabled ? 1 : 0;\n\tuniformBufferData[17] = isOpacity;\n\tuniformBufferData[18] = isAngle;\n\tuniformBufferData[19] = isDist;\n\tuniformBufferData[20] = isChoke;\n\tuniformBufferData[21] = isSize;\n\tuniformBufferData[22] = isBlend;\n\tuniformBufferData[23] = 0;\n\tuniformBufferData[24] = ogCol[0];\n\tuniformBufferData[25] = ogCol[1];\n\tuniformBufferData[26] = ogCol[2];\n\tuniformBufferData[27] = ogCol[3];\n\tuniformBufferData[28] = og.enabled ? 1 : 0;\n\tuniformBufferData[29] = ogOpacity;\n\tuniformBufferData[30] = ogSize;\n\tuniformBufferData[31] = ogSpread;\n\tuniformBufferData[32] = ogBlend;\n\tuniformBufferData[33] = 0;\n\tuniformBufferData[34] = 0;\n\tuniformBufferData[35] = 0;\n\tuniformBufferData[36] = igCol[0];\n\tuniformBufferData[37] = igCol[1];\n\tuniformBufferData[38] = igCol[2];\n\tuniformBufferData[39] = igCol[3];\n\tuniformBufferData[40] = ig.enabled ? 1 : 0;\n\tuniformBufferData[41] = igOpacity;\n\tuniformBufferData[42] = igSize;\n\tuniformBufferData[43] = igSpread;\n\tuniformBufferData[44] = igBlend;\n\tuniformBufferData[45] = 0;\n\tuniformBufferData[46] = 0;\n\tuniformBufferData[47] = 0;\n\tuniformBufferData[48] = stCol[0];\n\tuniformBufferData[49] = stCol[1];\n\tuniformBufferData[50] = stCol[2];\n\tuniformBufferData[51] = stCol[3];\n\tuniformBufferData[52] = st.enabled ? 1 : 0;\n\tuniformBufferData[53] = stSize;\n\tuniformBufferData[54] = stPos;\n\tuniformBufferData[55] = stOpacity;\n\tuniformBufferData[56] = stBlend;\n\tuniformBufferData[57] = 0;\n\tuniformBufferData[58] = 0;\n\tuniformBufferData[59] = 0;\n\tuniformBufferData[60] = beHlCol[0];\n\tuniformBufferData[61] = beHlCol[1];\n\tuniformBufferData[62] = beHlCol[2];\n\tuniformBufferData[63] = beHlCol[3];\n\tuniformBufferData[64] = beShCol[0];\n\tuniformBufferData[65] = beShCol[1];\n\tuniformBufferData[66] = beShCol[2];\n\tuniformBufferData[67] = beShCol[3];\n\tuniformBufferData[68] = be.enabled ? 1 : 0;\n\tuniformBufferData[69] = beStyle;\n\tuniformBufferData[70] = beTech;\n\tuniformBufferData[71] = beDepth;\n\tuniformBufferData[72] = beDir;\n\tuniformBufferData[73] = beSize;\n\tuniformBufferData[74] = beSoften;\n\tuniformBufferData[75] = beAngle;\n\tuniformBufferData[76] = beAltitude;\n\tuniformBufferData[77] = beHlOpacity;\n\tuniformBufferData[78] = beShOpacity;\n\tuniformBufferData[79] = 0;\n\tuniformBufferData[80] = coCol[0];\n\tuniformBufferData[81] = coCol[1];\n\tuniformBufferData[82] = coCol[2];\n\tuniformBufferData[83] = coCol[3];\n\tuniformBufferData[84] = co.enabled ? 1 : 0;\n\tuniformBufferData[85] = coOpacity;\n\tuniformBufferData[86] = coBlend;\n\tuniformBufferData[87] = 0;\n\tconst uniformBuffer = ctx.renderer.getTemporaryBuffer(uniformBufferData);\n\tconst uBindGroup = ctx.device.createBindGroup({\n\t\tlayout: uniformLayout,\n\t\tentries: [{\n\t\t\tbinding: 0,\n\t\t\tresource: { buffer: uniformBuffer }\n\t\t}]\n\t});\n\tconst tBindGroup = ctx.device.createBindGroup({\n\t\tlayout: textureLayout,\n\t\tentries: [{\n\t\t\tbinding: 0,\n\t\t\tresource: inputView\n\t\t}, {\n\t\t\tbinding: 1,\n\t\t\tresource: sampler\n\t\t}]\n\t});\n\tconst outTex = ctx.renderer.getTemporaryTexture(width, height, [\n\t\tinputTex,\n\t\tchildTex,\n\t\ttargetTexture,\n\t\t...props.excludeTextures || []\n\t]);\n\tdrawFullscreenPass(encoder, outTex.createView(), pipeline, [uBindGroup, tBindGroup]);\n\tdrawTextureToTarget(args, outTex, op.opacity ?? 1);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer });\n\n//#endregion\nexport { renderers_default as t };\n//# sourceMappingURL=renderers-NtFcSRrc.mjs.map"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import { n as defineRenderer } from "./renderer-C9r0-KY4.mjs";
2
- import { a as createFullscreenPipeline, c as drawTextureToTarget, l as fragmentBindGroupLayout, o as drawChildToTexture, r as STRAIGHT_ALPHA_BLEND, s as drawFullscreenPass, t as FULLSCREEN_QUAD_WGSL } from "./gpu-Dq_uI_00.mjs";
2
+ import { a as createFullscreenPipeline, c as drawTextureToTarget, l as fragmentBindGroupLayout, o as drawChildToTexture, r as STRAIGHT_ALPHA_BLEND, s as drawFullscreenPass, t as FULLSCREEN_QUAD_WGSL } from "./gpu-CevnCkZC.mjs";
3
3
 
4
4
  //#region ../../nodes/node-flip/dist/renderers-CeDdi1eu.mjs
5
5
  const WGSL_FLIP_SHADER = `
@@ -157,4 +157,4 @@ var renderers_default = defineRenderer({ WebGPURenderer });
157
157
 
158
158
  //#endregion
159
159
  export { renderers_default as t };
160
- //# sourceMappingURL=renderer-l_U6kA8K.mjs.map
160
+ //# sourceMappingURL=renderer-BIYJKdwA.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-l_U6kA8K.mjs","names":[],"sources":["../../../nodes/node-flip/dist/renderers-CeDdi1eu.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { FULLSCREEN_QUAD_WGSL, STRAIGHT_ALPHA_BLEND, createFullscreenPipeline, drawChildToTexture, drawFullscreenPass, drawTextureToTarget, fragmentBindGroupLayout } from \"@framefields/node-sdk/gpu\";\n\n//#region src/renderers/webgpu-renderer.ts\nconst WGSL_FLIP_SHADER = `\nstruct FlipUniforms {\n\tflipH : f32,\n\tflipV : f32,\n\tdiagonal : f32,\n\tsymmetry : f32,\n};\n\n@group(0) @binding(0) var<uniform> u : FlipUniforms;\n@group(1) @binding(0) var tex : texture_2d<f32>;\n@group(1) @binding(1) var samp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tvar uv = in.uv;\n\n\t// 1. Split-Mirror / Symmetry\n\tif (u.symmetry > 0.5 && u.symmetry < 1.5) {\n\t\t// leftToRight: mirror left half to right half\n\t\tuv.x = select(uv.x, 1.0 - uv.x, uv.x > 0.5);\n\t} else if (u.symmetry > 1.5 && u.symmetry < 2.5) {\n\t\t// rightToLeft: mirror right half to left half\n\t\tuv.x = select(1.0 - uv.x, uv.x, uv.x > 0.5);\n\t} else if (u.symmetry > 2.5 && u.symmetry < 3.5) {\n\t\t// topToBottom: mirror top half to bottom half\n\t\tuv.y = select(uv.y, 1.0 - uv.y, uv.y > 0.5);\n\t} else if (u.symmetry > 3.5 && u.symmetry < 4.5) {\n\t\t// bottomToTop: mirror bottom half to top half\n\t\tuv.y = select(1.0 - uv.y, uv.y, uv.y > 0.5);\n\t} else if (u.symmetry > 4.5) {\n\t\t// quadrant: 4-way kaleidoscopic symmetry\n\t\tuv.x = select(uv.x, 1.0 - uv.x, uv.x > 0.5);\n\t\tuv.y = select(uv.y, 1.0 - uv.y, uv.y > 0.5);\n\t}\n\n\t// 2. Diagonal Swap (Transposition: x <-> y)\n\tif (u.diagonal > 0.5) {\n\t\tlet temp = uv.x;\n\t\tuv.x = uv.y;\n\t\tuv.y = temp;\n\t}\n\n\t// 3. Horizontal / Vertical Flip\n\tif (u.flipH > 0.5) {\n\t\tuv.x = 1.0 - uv.x;\n\t}\n\tif (u.flipV > 0.5) {\n\t\tuv.y = 1.0 - uv.y;\n\t}\n\n\treturn textureSampleLevel(tex, samp, uv, 0.0);\n}\n`;\nconst deviceResourceCache = /* @__PURE__ */ new WeakMap();\nconst uniformData = new Float32Array(4);\nfunction getFlipResources(device, targetFormat) {\n\tconst cached = deviceResourceCache.get(device);\n\tif (cached) return cached;\n\tconst uniformLayout = fragmentBindGroupLayout(device, [\"uniform\"]);\n\tconst textureLayout = fragmentBindGroupLayout(device, [\"texture\", \"sampler\"]);\n\tconst res = {\n\t\tuniformLayout,\n\t\ttextureLayout,\n\t\tpipeline: createFullscreenPipeline(device, {\n\t\t\tmodule: device.createShaderModule({ code: WGSL_FLIP_SHADER }),\n\t\t\tlayouts: device.createPipelineLayout({ bindGroupLayouts: [uniformLayout, textureLayout] }),\n\t\t\tformat: targetFormat,\n\t\t\tblend: STRAIGHT_ALPHA_BLEND\n\t\t})\n\t};\n\tdeviceResourceCache.set(device, res);\n\treturn res;\n}\nconst WebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetTexture, targetWidth, targetHeight, props } = args;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"Flip\" || !op) return;\n\tconst childMedia = props.virtualMedia.children?.[0];\n\tif (!childMedia) return;\n\tpass.end();\n\tconst width = targetWidth;\n\tconst height = targetHeight;\n\tconst sourceWidth = childMedia.metadata?.width ?? props.containerWidth ?? width;\n\tconst sourceHeight = childMedia.metadata?.height ?? props.containerHeight ?? height;\n\tconst { texture: childTex } = await drawChildToTexture(args, childMedia, {\n\t\twidth: sourceWidth,\n\t\theight: sourceHeight,\n\t\tprops: {\n\t\t\t...props,\n\t\t\tcontainerWidth: sourceWidth,\n\t\t\tcontainerHeight: sourceHeight,\n\t\t\tvirtualMedia: childMedia\n\t\t}\n\t});\n\tconst { pipeline, uniformLayout: uLayout, textureLayout: tLayout } = getFlipResources(ctx.device, ctx.renderer.format);\n\tconst sampler = ctx.renderer.samplerCache.getSampler(ctx.device);\n\tconst mode = op.mode ?? \"horizontal\";\n\tlet isFlipH = false;\n\tlet isFlipV = false;\n\tlet isDiag = false;\n\tif (mode === \"horizontal\") isFlipH = true;\n\telse if (mode === \"vertical\") isFlipV = true;\n\telse if (mode === \"both\") {\n\t\tisFlipH = true;\n\t\tisFlipV = true;\n\t} else if (mode === \"diagonal\") isDiag = true;\n\telse if (mode === \"antiDiagonal\") {\n\t\tisDiag = true;\n\t\tisFlipH = true;\n\t\tisFlipV = true;\n\t} else if (mode === \"custom\") {\n\t\tisFlipH = op.horizontal ?? true;\n\t\tisFlipV = op.vertical ?? false;\n\t\tisDiag = op.diagonal ?? false;\n\t}\n\tlet symVal = 0;\n\tif (op.symmetry === \"leftToRight\") symVal = 1;\n\telse if (op.symmetry === \"rightToLeft\") symVal = 2;\n\telse if (op.symmetry === \"topToBottom\") symVal = 3;\n\telse if (op.symmetry === \"bottomToTop\") symVal = 4;\n\telse if (op.symmetry === \"quadrant\") symVal = 5;\n\tuniformData[0] = isFlipH ? 1 : 0;\n\tuniformData[1] = isFlipV ? 1 : 0;\n\tuniformData[2] = isDiag ? 1 : 0;\n\tuniformData[3] = symVal;\n\tconst uniformBuffer = ctx.renderer.getTemporaryBuffer(uniformData);\n\tconst uBindGroup = 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\tconst tBindGroup = ctx.device.createBindGroup({\n\t\tlayout: tLayout,\n\t\tentries: [{\n\t\t\tbinding: 0,\n\t\t\tresource: childTex.createView()\n\t\t}, {\n\t\t\tbinding: 1,\n\t\t\tresource: sampler\n\t\t}]\n\t});\n\tconst outTex = ctx.renderer.getTemporaryTexture(width, height, [\n\t\tchildTex,\n\t\ttargetTexture,\n\t\t...props.excludeTextures || []\n\t]);\n\tdrawFullscreenPass(encoder, outTex.createView(), pipeline, [uBindGroup, tBindGroup]);\n\tdrawTextureToTarget(args, outTex, op.opacity ?? 1);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer });\n\n//#endregion\nexport { renderers_default as t };\n//# sourceMappingURL=renderers-CeDdi1eu.mjs.map"],"mappings":"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"}
1
+ {"version":3,"file":"renderer-BIYJKdwA.mjs","names":[],"sources":["../../../nodes/node-flip/dist/renderers-CeDdi1eu.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { FULLSCREEN_QUAD_WGSL, STRAIGHT_ALPHA_BLEND, createFullscreenPipeline, drawChildToTexture, drawFullscreenPass, drawTextureToTarget, fragmentBindGroupLayout } from \"@framefields/node-sdk/gpu\";\n\n//#region src/renderers/webgpu-renderer.ts\nconst WGSL_FLIP_SHADER = `\nstruct FlipUniforms {\n\tflipH : f32,\n\tflipV : f32,\n\tdiagonal : f32,\n\tsymmetry : f32,\n};\n\n@group(0) @binding(0) var<uniform> u : FlipUniforms;\n@group(1) @binding(0) var tex : texture_2d<f32>;\n@group(1) @binding(1) var samp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n\tvar uv = in.uv;\n\n\t// 1. Split-Mirror / Symmetry\n\tif (u.symmetry > 0.5 && u.symmetry < 1.5) {\n\t\t// leftToRight: mirror left half to right half\n\t\tuv.x = select(uv.x, 1.0 - uv.x, uv.x > 0.5);\n\t} else if (u.symmetry > 1.5 && u.symmetry < 2.5) {\n\t\t// rightToLeft: mirror right half to left half\n\t\tuv.x = select(1.0 - uv.x, uv.x, uv.x > 0.5);\n\t} else if (u.symmetry > 2.5 && u.symmetry < 3.5) {\n\t\t// topToBottom: mirror top half to bottom half\n\t\tuv.y = select(uv.y, 1.0 - uv.y, uv.y > 0.5);\n\t} else if (u.symmetry > 3.5 && u.symmetry < 4.5) {\n\t\t// bottomToTop: mirror bottom half to top half\n\t\tuv.y = select(1.0 - uv.y, uv.y, uv.y > 0.5);\n\t} else if (u.symmetry > 4.5) {\n\t\t// quadrant: 4-way kaleidoscopic symmetry\n\t\tuv.x = select(uv.x, 1.0 - uv.x, uv.x > 0.5);\n\t\tuv.y = select(uv.y, 1.0 - uv.y, uv.y > 0.5);\n\t}\n\n\t// 2. Diagonal Swap (Transposition: x <-> y)\n\tif (u.diagonal > 0.5) {\n\t\tlet temp = uv.x;\n\t\tuv.x = uv.y;\n\t\tuv.y = temp;\n\t}\n\n\t// 3. Horizontal / Vertical Flip\n\tif (u.flipH > 0.5) {\n\t\tuv.x = 1.0 - uv.x;\n\t}\n\tif (u.flipV > 0.5) {\n\t\tuv.y = 1.0 - uv.y;\n\t}\n\n\treturn textureSampleLevel(tex, samp, uv, 0.0);\n}\n`;\nconst deviceResourceCache = /* @__PURE__ */ new WeakMap();\nconst uniformData = new Float32Array(4);\nfunction getFlipResources(device, targetFormat) {\n\tconst cached = deviceResourceCache.get(device);\n\tif (cached) return cached;\n\tconst uniformLayout = fragmentBindGroupLayout(device, [\"uniform\"]);\n\tconst textureLayout = fragmentBindGroupLayout(device, [\"texture\", \"sampler\"]);\n\tconst res = {\n\t\tuniformLayout,\n\t\ttextureLayout,\n\t\tpipeline: createFullscreenPipeline(device, {\n\t\t\tmodule: device.createShaderModule({ code: WGSL_FLIP_SHADER }),\n\t\t\tlayouts: device.createPipelineLayout({ bindGroupLayouts: [uniformLayout, textureLayout] }),\n\t\t\tformat: targetFormat,\n\t\t\tblend: STRAIGHT_ALPHA_BLEND\n\t\t})\n\t};\n\tdeviceResourceCache.set(device, res);\n\treturn res;\n}\nconst WebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetTexture, targetWidth, targetHeight, props } = args;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"Flip\" || !op) return;\n\tconst childMedia = props.virtualMedia.children?.[0];\n\tif (!childMedia) return;\n\tpass.end();\n\tconst width = targetWidth;\n\tconst height = targetHeight;\n\tconst sourceWidth = childMedia.metadata?.width ?? props.containerWidth ?? width;\n\tconst sourceHeight = childMedia.metadata?.height ?? props.containerHeight ?? height;\n\tconst { texture: childTex } = await drawChildToTexture(args, childMedia, {\n\t\twidth: sourceWidth,\n\t\theight: sourceHeight,\n\t\tprops: {\n\t\t\t...props,\n\t\t\tcontainerWidth: sourceWidth,\n\t\t\tcontainerHeight: sourceHeight,\n\t\t\tvirtualMedia: childMedia\n\t\t}\n\t});\n\tconst { pipeline, uniformLayout: uLayout, textureLayout: tLayout } = getFlipResources(ctx.device, ctx.renderer.format);\n\tconst sampler = ctx.renderer.samplerCache.getSampler(ctx.device);\n\tconst mode = op.mode ?? \"horizontal\";\n\tlet isFlipH = false;\n\tlet isFlipV = false;\n\tlet isDiag = false;\n\tif (mode === \"horizontal\") isFlipH = true;\n\telse if (mode === \"vertical\") isFlipV = true;\n\telse if (mode === \"both\") {\n\t\tisFlipH = true;\n\t\tisFlipV = true;\n\t} else if (mode === \"diagonal\") isDiag = true;\n\telse if (mode === \"antiDiagonal\") {\n\t\tisDiag = true;\n\t\tisFlipH = true;\n\t\tisFlipV = true;\n\t} else if (mode === \"custom\") {\n\t\tisFlipH = op.horizontal ?? true;\n\t\tisFlipV = op.vertical ?? false;\n\t\tisDiag = op.diagonal ?? false;\n\t}\n\tlet symVal = 0;\n\tif (op.symmetry === \"leftToRight\") symVal = 1;\n\telse if (op.symmetry === \"rightToLeft\") symVal = 2;\n\telse if (op.symmetry === \"topToBottom\") symVal = 3;\n\telse if (op.symmetry === \"bottomToTop\") symVal = 4;\n\telse if (op.symmetry === \"quadrant\") symVal = 5;\n\tuniformData[0] = isFlipH ? 1 : 0;\n\tuniformData[1] = isFlipV ? 1 : 0;\n\tuniformData[2] = isDiag ? 1 : 0;\n\tuniformData[3] = symVal;\n\tconst uniformBuffer = ctx.renderer.getTemporaryBuffer(uniformData);\n\tconst uBindGroup = 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\tconst tBindGroup = ctx.device.createBindGroup({\n\t\tlayout: tLayout,\n\t\tentries: [{\n\t\t\tbinding: 0,\n\t\t\tresource: childTex.createView()\n\t\t}, {\n\t\t\tbinding: 1,\n\t\t\tresource: sampler\n\t\t}]\n\t});\n\tconst outTex = ctx.renderer.getTemporaryTexture(width, height, [\n\t\tchildTex,\n\t\ttargetTexture,\n\t\t...props.excludeTextures || []\n\t]);\n\tdrawFullscreenPass(encoder, outTex.createView(), pipeline, [uBindGroup, tBindGroup]);\n\tdrawTextureToTarget(args, outTex, op.opacity ?? 1);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer });\n\n//#endregion\nexport { renderers_default as t };\n//# sourceMappingURL=renderers-CeDdi1eu.mjs.map"],"mappings":"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"}
@@ -1,8 +1,8 @@
1
1
  import "./chunk-D7gtBK74.mjs";
2
- import { Ot as getActiveMediaMetadata } from "./dist-DFeF-ygz.mjs";
2
+ import { Ot as getActiveMediaMetadata } from "./dist-D021IFfp.mjs";
3
3
  import { n as defineRenderer } from "./renderer-C9r0-KY4.mjs";
4
- import "./dist-DBWkkSvJ.mjs";
5
- import { a as createFullscreenPipeline, i as beginTargetPass, l as fragmentBindGroupLayout, o as drawChildToTexture, s as drawFullscreenPass, t as FULLSCREEN_QUAD_WGSL } from "./gpu-Dq_uI_00.mjs";
4
+ import "./dist-Bf0H4lp1.mjs";
5
+ import { a as createFullscreenPipeline, i as beginTargetPass, l as fragmentBindGroupLayout, o as drawChildToTexture, s as drawFullscreenPass, t as FULLSCREEN_QUAD_WGSL } from "./gpu-CevnCkZC.mjs";
6
6
 
7
7
  //#region ../../nodes/node-resizer-scaler/dist/renderers-4yv_5K2l.mjs
8
8
  const RESIZER_SCALER_SHADER = `
@@ -251,4 +251,4 @@ var renderers_default = defineRenderer({ WebGPURenderer: ResizerScalerWebGPURend
251
251
 
252
252
  //#endregion
253
253
  export { renderers_default as default };
254
- //# sourceMappingURL=renderer-DQuKNgIx.mjs.map
254
+ //# sourceMappingURL=renderer-BIt-At3v.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-DQuKNgIx.mjs","names":[],"sources":["../../../nodes/node-resizer-scaler/dist/renderers-4yv_5K2l.mjs"],"sourcesContent":["import { getActiveMediaMetadata } from \"@framefields/core\";\nimport { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { FULLSCREEN_QUAD_WGSL, beginTargetPass, createFullscreenPipeline, drawChildToTexture, drawFullscreenPass, fragmentBindGroupLayout } from \"@framefields/node-sdk/gpu\";\n\n//#region src/renderers/webgpu-renderer.ts\nconst RESIZER_SCALER_SHADER = `\nstruct ScalerUniforms {\n targetSize : vec2<f32>,\n srcSize : vec2<f32>,\n fitMode : f32, // 0 = Cover, 1 = Contain, 2 = Stretch, 3 = Manual\n bgMode : f32, // 0 = Solid, 1 = Blurred, 2 = Gradient, 3 = Transparent\n bgColor : vec4<f32>,\n bgColor2 : vec4<f32>, // Used for gradient mode\n blurRadius : f32,\n brightness : f32,\n zoom : f32,\n offset : vec2<f32>,\n anchor : vec2<f32>, // x: 0 (left) - 1 (right), y: 0 (top) - 1 (bottom)\n};\n\n@group(0) @binding(0) var<uniform> u : ScalerUniforms;\n@group(0) @binding(1) var s : sampler;\n@group(0) @binding(2) var t_src : texture_2d<f32>;\n${FULLSCREEN_QUAD_WGSL}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n let uv = in.uv;\n \n // Calculate aspect ratios\n let target_ar = u.targetSize.x / u.targetSize.y;\n let src_ar = u.srcSize.x / u.srcSize.y;\n \n // Sizing logic\n var fg_uv = uv;\n var is_outside_fg = false;\n \n if (u.fitMode == 1.0) { // Contain\n if (src_ar > target_ar) {\n // Letterbox (pads top & bottom)\n let scale_y = target_ar / src_ar;\n let offset_y = (1.0 - scale_y) * u.anchor.y;\n fg_uv.y = (uv.y - offset_y) / scale_y;\n if (fg_uv.y < 0.0 || fg_uv.y > 1.0) { is_outside_fg = true; }\n } else {\n // Pillarbox (pads left & right)\n let scale_x = src_ar / target_ar;\n let offset_x = (1.0 - scale_x) * u.anchor.x;\n fg_uv.x = (uv.x - offset_x) / scale_x;\n if (fg_uv.x < 0.0 || fg_uv.x > 1.0) { is_outside_fg = true; }\n }\n } else if (u.fitMode == 0.0) { // Cover\n if (src_ar > target_ar) {\n let scale_x = target_ar / src_ar;\n let offset_x = (1.0 - scale_x) * u.anchor.x;\n fg_uv.x = uv.x * scale_x + offset_x;\n } else {\n let scale_y = src_ar / target_ar;\n let offset_y = (1.0 - scale_y) * u.anchor.y;\n fg_uv.y = uv.y * scale_y + offset_y;\n }\n } else if (u.fitMode == 3.0) { // Manual Scale & Translation\n let norm_zoom = u.zoom / 100.0;\n fg_uv = (uv - vec2<f32>(0.5)) / norm_zoom + vec2<f32>(0.5) - (u.offset / u.targetSize);\n if (fg_uv.x < 0.0 || fg_uv.x > 1.0 || fg_uv.y < 0.0 || fg_uv.y > 1.0) {\n is_outside_fg = true;\n }\n } // (fitMode == 2.0 (Stretch) uses default fg_uv without bounds check)\n\n // Output compositing\n if (!is_outside_fg) {\n return textureSampleLevel(t_src, s, fg_uv, 0.0);\n } else {\n // Render background based on mode\n if (u.bgMode == 0.0) { // Solid\n return u.bgColor;\n } else if (u.bgMode == 1.0) { // Blurred Background Copy\n // Sample cover-fitted coordinates for background\n var bg_uv = uv;\n if (src_ar > target_ar) {\n let scale_x = target_ar / src_ar;\n let offset_x = (1.0 - scale_x) * 0.5; // Always center background\n bg_uv.x = uv.x * scale_x + offset_x;\n } else {\n let scale_y = src_ar / target_ar;\n let offset_y = (1.0 - scale_y) * 0.5;\n bg_uv.y = uv.y * scale_y + offset_y;\n }\n \n // Apply gaussian blur approximation in shader\n var color = vec4<f32>(0.0);\n let blur_steps = 5.0;\n let blur_offset = u.blurRadius / (u.targetSize * blur_steps);\n \n for (var x = -2.0; x <= 2.0; x += 1.0) {\n for (var y = -2.0; y <= 2.0; y += 1.0) {\n color += textureSampleLevel(t_src, s, bg_uv + vec2<f32>(x, y) * blur_offset, 0.0);\n }\n }\n color = color / 25.0;\n \n // Apply background brightness darken effect\n return vec4<f32>(color.rgb * u.brightness, color.a);\n } else if (u.bgMode == 2.0) { // Gradient\n return mix(u.bgColor, u.bgColor2, uv.y);\n } else { // Transparent\n return vec4<f32>(0.0, 0.0, 0.0, 0.0);\n }\n }\n}\n`;\nconst deviceResourceCache = /* @__PURE__ */ new WeakMap();\nfunction getDeviceLayouts(device) {\n\tlet res = deviceResourceCache.get(device);\n\tif (res) return res;\n\tconst scalerUniformLayout = fragmentBindGroupLayout(device, [\n\t\t\"uniform\",\n\t\t\"sampler\",\n\t\t\"texture\"\n\t]);\n\tres = {\n\t\tscalerUniformLayout,\n\t\ttextureSamplerLayout: scalerUniformLayout,\n\t\tpipelineCache: /* @__PURE__ */ new Map()\n\t};\n\tdeviceResourceCache.set(device, res);\n\treturn res;\n}\nfunction getScalerResources(device, format) {\n\tconst layouts = getDeviceLayouts(device);\n\tconst cacheKey = `scaler_${format}`;\n\tlet pipeline = layouts.pipelineCache.get(cacheKey);\n\tif (!pipeline) {\n\t\tconst scalerModule = device.createShaderModule({\n\t\t\tlabel: `scaler_${format}.wgsl`,\n\t\t\tcode: RESIZER_SCALER_SHADER\n\t\t});\n\t\tpipeline = createFullscreenPipeline(device, {\n\t\t\tlabel: `ResizerScalerPipeline_${format}`,\n\t\t\tmodule: scalerModule,\n\t\t\tlayouts: [layouts.scalerUniformLayout],\n\t\t\tformat\n\t\t});\n\t\tlayouts.pipelineCache.set(cacheKey, pipeline);\n\t}\n\treturn {\n\t\tscalerPipeline: pipeline,\n\t\tscalerUniformLayout: layouts.scalerUniformLayout\n\t};\n}\nfunction parseHexToRGBA(hex) {\n\tconst cleanHex = hex.replace(\"#\", \"\");\n\treturn [\n\t\tparseInt(cleanHex.substring(0, 2), 16) / 255,\n\t\tparseInt(cleanHex.substring(2, 4), 16) / 255,\n\t\tparseInt(cleanHex.substring(4, 6), 16) / 255,\n\t\tcleanHex.length === 8 ? parseInt(cleanHex.substring(6, 8), 16) / 255 : 1\n\t];\n}\nconst scalerData = new Float32Array(24);\nconst ResizerScalerWebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetView, targetWidth, targetHeight, props } = args;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"ResizerScaler\" || !op) return;\n\tconst childMedia = props.virtualMedia.children?.[0];\n\tif (!childMedia) return;\n\tpass.end();\n\tconst childMeta = getActiveMediaMetadata(childMedia);\n\tconst srcWidth = childMeta?.width || targetWidth || 1920;\n\tconst srcHeight = childMeta?.height || targetHeight || 1080;\n\tconst { view: tmpView } = await drawChildToTexture(args, childMedia, {\n\t\twidth: srcWidth,\n\t\theight: srcHeight,\n\t\tprops: {\n\t\t\t...props,\n\t\t\tvirtualMedia: childMedia,\n\t\t\tcontainerWidth: srcWidth,\n\t\t\tcontainerHeight: srcHeight\n\t\t}\n\t});\n\tconst { scalerPipeline: pipeline, scalerUniformLayout: uLayout } = getScalerResources(ctx.device, ctx.renderer.format);\n\tscalerData[0] = targetWidth;\n\tscalerData[1] = targetHeight;\n\tscalerData[2] = srcWidth;\n\tscalerData[3] = srcHeight;\n\tscalerData[4] = {\n\t\tcover: 0,\n\t\tcontain: 1,\n\t\tstretch: 2,\n\t\tmanual: 3\n\t}[op.fitMode ?? \"contain\"] ?? 1;\n\tscalerData[5] = {\n\t\tsolid: 0,\n\t\tblurred: 1,\n\t\tgradient: 2,\n\t\ttransparent: 3\n\t}[op.backgroundMode ?? \"solid\"] ?? 0;\n\tscalerData[6] = 0;\n\tscalerData[7] = 0;\n\tconst bgColor = parseHexToRGBA(op.backgroundColor ?? \"#000000FF\");\n\tscalerData[8] = bgColor[0];\n\tscalerData[9] = bgColor[1];\n\tscalerData[10] = bgColor[2];\n\tscalerData[11] = bgColor[3];\n\tconst bgColor2 = parseHexToRGBA(op.backgroundColor2 ?? \"#000000FF\");\n\tscalerData[12] = bgColor2[0];\n\tscalerData[13] = bgColor2[1];\n\tscalerData[14] = bgColor2[2];\n\tscalerData[15] = bgColor2[3];\n\tscalerData[16] = Number(op.blurRadius ?? 40);\n\tscalerData[17] = Number(op.backgroundBrightness ?? .6);\n\tscalerData[18] = Number(op.zoom ?? 100);\n\tscalerData[19] = 0;\n\tscalerData[20] = Number(op.offsetX ?? 0);\n\tscalerData[21] = Number(op.offsetY ?? 0);\n\tconst anchorXMap = {\n\t\tleft: 0,\n\t\tcenter: .5,\n\t\tright: 1\n\t};\n\tconst anchorYMap = {\n\t\ttop: 0,\n\t\tcenter: .5,\n\t\tbottom: 1\n\t};\n\tscalerData[22] = anchorXMap[op.anchorX ?? \"center\"] ?? .5;\n\tscalerData[23] = anchorYMap[op.anchorY ?? \"center\"] ?? .5;\n\tconst uBuffer = ctx.renderer.getTemporaryBuffer(scalerData);\n\tconst sampler = ctx.renderer.samplerCache.getSampler(ctx.device);\n\tdrawFullscreenPass(encoder, targetView, pipeline, [ctx.device.createBindGroup({\n\t\tlayout: uLayout,\n\t\tentries: [\n\t\t\t{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: { buffer: uBuffer }\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 1,\n\t\t\t\tresource: sampler\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 2,\n\t\t\t\tresource: tmpView\n\t\t\t}\n\t\t]\n\t})]);\n\tbeginTargetPass(args);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: ResizerScalerWebGPURenderer });\n\n//#endregion\nexport { renderers_default as t };\n//# sourceMappingURL=renderers-4yv_5K2l.mjs.map"],"mappings":"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"}
1
+ {"version":3,"file":"renderer-BIt-At3v.mjs","names":[],"sources":["../../../nodes/node-resizer-scaler/dist/renderers-4yv_5K2l.mjs"],"sourcesContent":["import { getActiveMediaMetadata } from \"@framefields/core\";\nimport { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { FULLSCREEN_QUAD_WGSL, beginTargetPass, createFullscreenPipeline, drawChildToTexture, drawFullscreenPass, fragmentBindGroupLayout } from \"@framefields/node-sdk/gpu\";\n\n//#region src/renderers/webgpu-renderer.ts\nconst RESIZER_SCALER_SHADER = `\nstruct ScalerUniforms {\n targetSize : vec2<f32>,\n srcSize : vec2<f32>,\n fitMode : f32, // 0 = Cover, 1 = Contain, 2 = Stretch, 3 = Manual\n bgMode : f32, // 0 = Solid, 1 = Blurred, 2 = Gradient, 3 = Transparent\n bgColor : vec4<f32>,\n bgColor2 : vec4<f32>, // Used for gradient mode\n blurRadius : f32,\n brightness : f32,\n zoom : f32,\n offset : vec2<f32>,\n anchor : vec2<f32>, // x: 0 (left) - 1 (right), y: 0 (top) - 1 (bottom)\n};\n\n@group(0) @binding(0) var<uniform> u : ScalerUniforms;\n@group(0) @binding(1) var s : sampler;\n@group(0) @binding(2) var t_src : texture_2d<f32>;\n${FULLSCREEN_QUAD_WGSL}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n let uv = in.uv;\n \n // Calculate aspect ratios\n let target_ar = u.targetSize.x / u.targetSize.y;\n let src_ar = u.srcSize.x / u.srcSize.y;\n \n // Sizing logic\n var fg_uv = uv;\n var is_outside_fg = false;\n \n if (u.fitMode == 1.0) { // Contain\n if (src_ar > target_ar) {\n // Letterbox (pads top & bottom)\n let scale_y = target_ar / src_ar;\n let offset_y = (1.0 - scale_y) * u.anchor.y;\n fg_uv.y = (uv.y - offset_y) / scale_y;\n if (fg_uv.y < 0.0 || fg_uv.y > 1.0) { is_outside_fg = true; }\n } else {\n // Pillarbox (pads left & right)\n let scale_x = src_ar / target_ar;\n let offset_x = (1.0 - scale_x) * u.anchor.x;\n fg_uv.x = (uv.x - offset_x) / scale_x;\n if (fg_uv.x < 0.0 || fg_uv.x > 1.0) { is_outside_fg = true; }\n }\n } else if (u.fitMode == 0.0) { // Cover\n if (src_ar > target_ar) {\n let scale_x = target_ar / src_ar;\n let offset_x = (1.0 - scale_x) * u.anchor.x;\n fg_uv.x = uv.x * scale_x + offset_x;\n } else {\n let scale_y = src_ar / target_ar;\n let offset_y = (1.0 - scale_y) * u.anchor.y;\n fg_uv.y = uv.y * scale_y + offset_y;\n }\n } else if (u.fitMode == 3.0) { // Manual Scale & Translation\n let norm_zoom = u.zoom / 100.0;\n fg_uv = (uv - vec2<f32>(0.5)) / norm_zoom + vec2<f32>(0.5) - (u.offset / u.targetSize);\n if (fg_uv.x < 0.0 || fg_uv.x > 1.0 || fg_uv.y < 0.0 || fg_uv.y > 1.0) {\n is_outside_fg = true;\n }\n } // (fitMode == 2.0 (Stretch) uses default fg_uv without bounds check)\n\n // Output compositing\n if (!is_outside_fg) {\n return textureSampleLevel(t_src, s, fg_uv, 0.0);\n } else {\n // Render background based on mode\n if (u.bgMode == 0.0) { // Solid\n return u.bgColor;\n } else if (u.bgMode == 1.0) { // Blurred Background Copy\n // Sample cover-fitted coordinates for background\n var bg_uv = uv;\n if (src_ar > target_ar) {\n let scale_x = target_ar / src_ar;\n let offset_x = (1.0 - scale_x) * 0.5; // Always center background\n bg_uv.x = uv.x * scale_x + offset_x;\n } else {\n let scale_y = src_ar / target_ar;\n let offset_y = (1.0 - scale_y) * 0.5;\n bg_uv.y = uv.y * scale_y + offset_y;\n }\n \n // Apply gaussian blur approximation in shader\n var color = vec4<f32>(0.0);\n let blur_steps = 5.0;\n let blur_offset = u.blurRadius / (u.targetSize * blur_steps);\n \n for (var x = -2.0; x <= 2.0; x += 1.0) {\n for (var y = -2.0; y <= 2.0; y += 1.0) {\n color += textureSampleLevel(t_src, s, bg_uv + vec2<f32>(x, y) * blur_offset, 0.0);\n }\n }\n color = color / 25.0;\n \n // Apply background brightness darken effect\n return vec4<f32>(color.rgb * u.brightness, color.a);\n } else if (u.bgMode == 2.0) { // Gradient\n return mix(u.bgColor, u.bgColor2, uv.y);\n } else { // Transparent\n return vec4<f32>(0.0, 0.0, 0.0, 0.0);\n }\n }\n}\n`;\nconst deviceResourceCache = /* @__PURE__ */ new WeakMap();\nfunction getDeviceLayouts(device) {\n\tlet res = deviceResourceCache.get(device);\n\tif (res) return res;\n\tconst scalerUniformLayout = fragmentBindGroupLayout(device, [\n\t\t\"uniform\",\n\t\t\"sampler\",\n\t\t\"texture\"\n\t]);\n\tres = {\n\t\tscalerUniformLayout,\n\t\ttextureSamplerLayout: scalerUniformLayout,\n\t\tpipelineCache: /* @__PURE__ */ new Map()\n\t};\n\tdeviceResourceCache.set(device, res);\n\treturn res;\n}\nfunction getScalerResources(device, format) {\n\tconst layouts = getDeviceLayouts(device);\n\tconst cacheKey = `scaler_${format}`;\n\tlet pipeline = layouts.pipelineCache.get(cacheKey);\n\tif (!pipeline) {\n\t\tconst scalerModule = device.createShaderModule({\n\t\t\tlabel: `scaler_${format}.wgsl`,\n\t\t\tcode: RESIZER_SCALER_SHADER\n\t\t});\n\t\tpipeline = createFullscreenPipeline(device, {\n\t\t\tlabel: `ResizerScalerPipeline_${format}`,\n\t\t\tmodule: scalerModule,\n\t\t\tlayouts: [layouts.scalerUniformLayout],\n\t\t\tformat\n\t\t});\n\t\tlayouts.pipelineCache.set(cacheKey, pipeline);\n\t}\n\treturn {\n\t\tscalerPipeline: pipeline,\n\t\tscalerUniformLayout: layouts.scalerUniformLayout\n\t};\n}\nfunction parseHexToRGBA(hex) {\n\tconst cleanHex = hex.replace(\"#\", \"\");\n\treturn [\n\t\tparseInt(cleanHex.substring(0, 2), 16) / 255,\n\t\tparseInt(cleanHex.substring(2, 4), 16) / 255,\n\t\tparseInt(cleanHex.substring(4, 6), 16) / 255,\n\t\tcleanHex.length === 8 ? parseInt(cleanHex.substring(6, 8), 16) / 255 : 1\n\t];\n}\nconst scalerData = new Float32Array(24);\nconst ResizerScalerWebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetView, targetWidth, targetHeight, props } = args;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"ResizerScaler\" || !op) return;\n\tconst childMedia = props.virtualMedia.children?.[0];\n\tif (!childMedia) return;\n\tpass.end();\n\tconst childMeta = getActiveMediaMetadata(childMedia);\n\tconst srcWidth = childMeta?.width || targetWidth || 1920;\n\tconst srcHeight = childMeta?.height || targetHeight || 1080;\n\tconst { view: tmpView } = await drawChildToTexture(args, childMedia, {\n\t\twidth: srcWidth,\n\t\theight: srcHeight,\n\t\tprops: {\n\t\t\t...props,\n\t\t\tvirtualMedia: childMedia,\n\t\t\tcontainerWidth: srcWidth,\n\t\t\tcontainerHeight: srcHeight\n\t\t}\n\t});\n\tconst { scalerPipeline: pipeline, scalerUniformLayout: uLayout } = getScalerResources(ctx.device, ctx.renderer.format);\n\tscalerData[0] = targetWidth;\n\tscalerData[1] = targetHeight;\n\tscalerData[2] = srcWidth;\n\tscalerData[3] = srcHeight;\n\tscalerData[4] = {\n\t\tcover: 0,\n\t\tcontain: 1,\n\t\tstretch: 2,\n\t\tmanual: 3\n\t}[op.fitMode ?? \"contain\"] ?? 1;\n\tscalerData[5] = {\n\t\tsolid: 0,\n\t\tblurred: 1,\n\t\tgradient: 2,\n\t\ttransparent: 3\n\t}[op.backgroundMode ?? \"solid\"] ?? 0;\n\tscalerData[6] = 0;\n\tscalerData[7] = 0;\n\tconst bgColor = parseHexToRGBA(op.backgroundColor ?? \"#000000FF\");\n\tscalerData[8] = bgColor[0];\n\tscalerData[9] = bgColor[1];\n\tscalerData[10] = bgColor[2];\n\tscalerData[11] = bgColor[3];\n\tconst bgColor2 = parseHexToRGBA(op.backgroundColor2 ?? \"#000000FF\");\n\tscalerData[12] = bgColor2[0];\n\tscalerData[13] = bgColor2[1];\n\tscalerData[14] = bgColor2[2];\n\tscalerData[15] = bgColor2[3];\n\tscalerData[16] = Number(op.blurRadius ?? 40);\n\tscalerData[17] = Number(op.backgroundBrightness ?? .6);\n\tscalerData[18] = Number(op.zoom ?? 100);\n\tscalerData[19] = 0;\n\tscalerData[20] = Number(op.offsetX ?? 0);\n\tscalerData[21] = Number(op.offsetY ?? 0);\n\tconst anchorXMap = {\n\t\tleft: 0,\n\t\tcenter: .5,\n\t\tright: 1\n\t};\n\tconst anchorYMap = {\n\t\ttop: 0,\n\t\tcenter: .5,\n\t\tbottom: 1\n\t};\n\tscalerData[22] = anchorXMap[op.anchorX ?? \"center\"] ?? .5;\n\tscalerData[23] = anchorYMap[op.anchorY ?? \"center\"] ?? .5;\n\tconst uBuffer = ctx.renderer.getTemporaryBuffer(scalerData);\n\tconst sampler = ctx.renderer.samplerCache.getSampler(ctx.device);\n\tdrawFullscreenPass(encoder, targetView, pipeline, [ctx.device.createBindGroup({\n\t\tlayout: uLayout,\n\t\tentries: [\n\t\t\t{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: { buffer: uBuffer }\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 1,\n\t\t\t\tresource: sampler\n\t\t\t},\n\t\t\t{\n\t\t\t\tbinding: 2,\n\t\t\t\tresource: tmpView\n\t\t\t}\n\t\t]\n\t})]);\n\tbeginTargetPass(args);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer: ResizerScalerWebGPURenderer });\n\n//#endregion\nexport { renderers_default as t };\n//# sourceMappingURL=renderers-4yv_5K2l.mjs.map"],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { t as renderers_default } from "./renderer-wIsJb2eO.mjs";
2
+
3
+ export { renderers_default as default };
@@ -1,6 +1,6 @@
1
- import { cn as resolveNumber, un as resolveString } from "./dist-DFeF-ygz.mjs";
1
+ import { cn as resolveNumber, un as resolveString } from "./dist-D021IFfp.mjs";
2
2
  import { n as defineRenderer, r as isHandleConnected } from "./renderer-C9r0-KY4.mjs";
3
- import { g as WebGPUAudioProcessor } from "./dist-DBWkkSvJ.mjs";
3
+ import { g as WebGPUAudioProcessor } from "./dist-Bf0H4lp1.mjs";
4
4
 
5
5
  //#region ../../nodes/node-audio-parametric-eq/dist/renderers-Dt34aC_m.mjs
6
6
  const PARAM_ORDER = [
@@ -262,4 +262,4 @@ var renderers_default = defineRenderer({ audioProcessor: parametricEqAudioProces
262
262
 
263
263
  //#endregion
264
264
  export { renderers_default as t };
265
- //# sourceMappingURL=renderer-D2ru2Afi.mjs.map
265
+ //# sourceMappingURL=renderer-BKayVZhL.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-D2ru2Afi.mjs","names":[],"sources":["../../../nodes/node-audio-parametric-eq/dist/renderers-Dt34aC_m.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { isHandleConnected, resolveNumber, resolveString } from \"@framefields/node-sdk\";\nimport { WebGPUAudioProcessor } from \"@framefields/webgpu-renderers\";\n\n//#region src/renderers/audio-processor.ts\nconst PARAM_ORDER = [\n\t\"frequency\",\n\t\"gain\",\n\t\"q\"\n];\nconst PARAMETRIC_EQ_SHADER_TEMPLATE = () => `\nstruct Uniforms {\n sampleRate : f32,\n numBands : f32,\n frequency : f32,\n gain : f32,\n q : f32,\n bandType : f32,\n hasFrequencySig : f32,\n hasGainSig : f32,\n hasQSig : f32,\n baseTime : f32,\n frame : f32,\n numSamples : f32,\n numChannels : f32,\n pad1 : f32,\n pad2 : f32,\n pad3 : f32,\n};\n\n@group(0) @binding(0) var<uniform> u : Uniforms;\n@group(0) @binding(1) var<storage, read> inputChannels : array<f32>;\n@group(0) @binding(2) var<storage, read_write> outputChannels : array<f32>;\n@group(0) @binding(3) var<storage, read_write> state : array<f32>;\n@group(0) @binding(4) var<storage, read> frequencySignal : array<f32>;\n@group(0) @binding(5) var<storage, read> gainSignal : array<f32>;\n@group(0) @binding(6) var<storage, read> qSignal : array<f32>;\n\nconst PI: f32 = 3.141592653589793f;\n\nfn tanh(x: f32) -> f32 {\n let exp2x = exp(2.0f * x);\n return (exp2x - 1.0f) / (exp2x + 1.0f);\n}\n\nfn is_nan_or_inf(v: f32) -> bool {\n return (v != v) || (abs(v) > 3.402823466e+38f);\n}\n\n@compute @workgroup_size(1)\nfn main(@builtin(global_invocation_id) gid : vec3<u32>) {\n if (gid.x != 0u) { return; }\n\n let numSamples = u32(u.numSamples);\n let numChannels = u32(u.numChannels);\n let sampleRate = u.sampleRate;\n let bandType = u.bandType; // 0=peak, 1=lowShelf, 2=highShelf, 3=lowPass, 4=highPass, 5=notch\n\n let biquadStateOffset = 4u;\n\n for (var c = 0u; c < numChannels; c = c + 1u) {\n let offset = biquadStateOffset + c * 4u;\n var x1 = state[offset];\n var x2 = state[offset + 1u];\n var y1 = state[offset + 2u];\n var y2 = state[offset + 3u];\n\n if (is_nan_or_inf(x1)) { x1 = 0.0f; }\n if (is_nan_or_inf(x2)) { x2 = 0.0f; }\n if (is_nan_or_inf(y1)) { y1 = 0.0f; }\n if (is_nan_or_inf(y2)) { y2 = 0.0f; }\n\n for (var index = 0u; index < numSamples; index = index + 1u) {\n let sampleIndex = c * numSamples + index;\n var x = inputChannels[sampleIndex];\n if (is_nan_or_inf(x)) { x = 0.0f; }\n\n // 1. Dynamic Parameter Signal Resolution & Clamping\n var effFreq = u.frequency;\n if (u.hasFrequencySig > 0.5f) {\n effFreq = frequencySignal[index];\n }\n effFreq = clamp(effFreq, 20.0f, sampleRate / 2.0f - 1.0f);\n\n var effQ = u.q;\n if (u.hasQSig > 0.5f) {\n effQ = qSignal[index];\n }\n effQ = clamp(effQ, 0.01f, 10.0f);\n\n var effGain = u.gain;\n if (u.hasGainSig > 0.5f) {\n effGain = gainSignal[index];\n }\n effGain = clamp(effGain, -24.0f, 24.0f);\n\n if (bandType == 0.0f && abs(effGain) < 1e-5f) {\n // Bypass filter if peak gain is zero\n outputChannels[sampleIndex] = x;\n continue;\n }\n\n // 2. Biquad Coefficients Calculation\n let w0 = (2.0f * PI * effFreq) / sampleRate;\n let cos_w0 = cos(w0);\n let sin_w0 = sin(w0);\n let A = clamp(pow(10.0f, effGain / 40.0f), 0.25f, 4.0f);\n let alpha = sin_w0 / (2.0f * effQ);\n\n var b0 = 0.0f; var b1 = 0.0f; var b2 = 0.0f;\n var a0 = 0.0f; var a1 = 0.0f; var a2 = 0.0f;\n\n if (bandType == 0.0f) { // peak\n b0 = 1.0f + alpha * A;\n b1 = -2.0f * cos_w0;\n b2 = 1.0f - alpha * A;\n a0 = 1.0f + alpha / A;\n a1 = -2.0f * cos_w0;\n a2 = 1.0f - alpha / A;\n } else if (bandType == 1.0f) { // lowShelf\n let sqrtA = sqrt(A);\n let twoSqrtAAlpha = 2.0f * sqrtA * alpha;\n b0 = A * (A + 1.0f - (A - 1.0f) * cos_w0 + twoSqrtAAlpha);\n b1 = 2.0f * A * (A - 1.0f - (A + 1.0f) * cos_w0);\n b2 = A * (A + 1.0f - (A - 1.0f) * cos_w0 - twoSqrtAAlpha);\n a0 = A + 1.0f + (A - 1.0f) * cos_w0 + twoSqrtAAlpha;\n a1 = -2.0f * (A - 1.0f + (A + 1.0f) * cos_w0);\n a2 = A + 1.0f + (A - 1.0f) * cos_w0 - twoSqrtAAlpha;\n } else if (bandType == 2.0f) { // highShelf\n let sqrtA = sqrt(A);\n let twoSqrtAAlpha = 2.0f * sqrtA * alpha;\n b0 = A * (A + 1.0f + (A - 1.0f) * cos_w0 + twoSqrtAAlpha);\n b1 = -2.0f * A * (A - 1.0f + (A + 1.0f) * cos_w0);\n b2 = A * (A + 1.0f + (A - 1.0f) * cos_w0 - twoSqrtAAlpha);\n a0 = A + 1.0f - (A - 1.0f) * cos_w0 + twoSqrtAAlpha;\n a1 = 2.0f * (A - 1.0f - (A + 1.0f) * cos_w0);\n a2 = A + 1.0f - (A - 1.0f) * cos_w0 - twoSqrtAAlpha;\n } else if (bandType == 3.0f) { // lowPass\n b0 = (1.0f - cos_w0) / 2.0f;\n b1 = 1.0f - cos_w0;\n b2 = (1.0f - cos_w0) / 2.0f;\n a0 = 1.0f + alpha;\n a1 = -2.0f * cos_w0;\n a2 = 1.0f - alpha;\n } else if (bandType == 4.0f) { // highPass\n b0 = (1.0f + cos_w0) / 2.0f;\n b1 = -(1.0f + cos_w0);\n b2 = (1.0f + cos_w0) / 2.0f;\n a0 = 1.0f + alpha;\n a1 = -2.0f * cos_w0;\n a2 = 1.0f - alpha;\n } else if (bandType == 5.0f) { // notch\n b0 = 1.0f;\n b1 = -2.0f * cos_w0;\n b2 = 1.0f;\n a0 = 1.0f + alpha;\n a1 = -2.0f * cos_w0;\n a2 = 1.0f - alpha;\n }\n\n if (abs(a0) < 1e-9f) {\n outputChannels[sampleIndex] = x;\n continue;\n }\n\n let b0_norm = b0 / a0;\n let b1_norm = b1 / a0;\n let b2_norm = b2 / a0;\n let a1_norm = a1 / a0;\n let a2_norm = a2 / a0;\n\n var y = b0_norm * x + b1_norm * x1 + b2_norm * x2 - a1_norm * y1 - a2_norm * y2;\n if (is_nan_or_inf(y)) { y = 0.0f; }\n\n // Biquad State History Update with Soft Anti-Explosion Clamping\n x2 = x1;\n x1 = x;\n y2 = clamp(y1, -4.0f, 4.0f);\n y1 = clamp(y, -4.0f, 4.0f);\n\n // Output Soft Clipping\n if (y > 1.0f) {\n y = 1.0f;\n } else if (y < -1.0f) {\n y = -1.0f;\n } else if (y > 0.9f) {\n y = 0.9f + 0.1f * tanh((y - 0.9f) / 0.1f);\n } else if (y < -0.9f) {\n y = -0.9f + 0.1f * tanh((y + 0.9f) / 0.1f);\n }\n\n outputChannels[sampleIndex] = y;\n }\n\n state[offset] = x1;\n state[offset + 1u] = x2;\n state[offset + 2u] = y1;\n state[offset + 3u] = y2;\n }\n}\n`;\nconst getBandTypeVal = (type) => {\n\tif (type === \"peak\") return 0;\n\tif (type === \"lowShelf\") return 1;\n\tif (type === \"highShelf\") return 2;\n\tif (type === \"lowPass\") return 3;\n\tif (type === \"highPass\") return 4;\n\tif (type === \"notch\") return 5;\n\treturn 0;\n};\nconst parametricEqAudioProcessor = async (channels, sampleRate, virtualMedia, ctx) => {\n\tif (!ctx?.device) throw new Error(\"GPUDevice is required for WebGPU Parametric EQ.\");\n\tconst op = virtualMedia.operation || {};\n\tconst rawType = resolveString(op.type, \"peak\");\n\tconst config = {\n\t\ttype: [\n\t\t\t\"lowShelf\",\n\t\t\t\"highShelf\",\n\t\t\t\"peak\",\n\t\t\t\"lowPass\",\n\t\t\t\"highPass\",\n\t\t\t\"notch\"\n\t\t].includes(rawType) ? rawType : \"peak\",\n\t\tfrequency: resolveNumber(op.frequency, 1e3),\n\t\tfrequencyHandleId: typeof op.frequencyHandleId === \"string\" ? op.frequencyHandleId : null,\n\t\tgain: resolveNumber(op.gain, 0),\n\t\tgainHandleId: typeof op.gainHandleId === \"string\" ? op.gainHandleId : null,\n\t\tq: resolveNumber(op.q, 1),\n\t\tqHandleId: typeof op.qHandleId === \"string\" ? op.qHandleId : null\n\t};\n\tconst hasFrequencySig = isHandleConnected(op, \"frequencyHandleId\") ? 1 : 0;\n\tconst hasGainSig = isHandleConnected(op, \"gainHandleId\") ? 1 : 0;\n\tconst hasQSig = isHandleConnected(op, \"qHandleId\") ? 1 : 0;\n\tconst numChannels = channels.length;\n\tif (numChannels === 0) return;\n\tconst numSamples = channels[0].length;\n\tif (numSamples === 0) return;\n\tconst nodeId = op.id || \"audio-parametric-eq\";\n\tconst frame = ctx.frame ?? 0;\n\tconst fps = ctx.fps ?? 24;\n\tconst stateFloatCount = 4 + numChannels * 4;\n\tawait WebGPUAudioProcessor.process(ctx.device, nodeId, channels, sampleRate, virtualMedia, frame, fps, PARAMETRIC_EQ_SHADER_TEMPLATE, () => [\n\t\tsampleRate,\n\t\t1,\n\t\tconfig.frequency,\n\t\tconfig.gain,\n\t\tconfig.q,\n\t\tgetBandTypeVal(config.type),\n\t\thasFrequencySig,\n\t\thasGainSig,\n\t\thasQSig,\n\t\t0,\n\t\tframe,\n\t\tnumSamples,\n\t\tnumChannels,\n\t\t0,\n\t\t0,\n\t\t0\n\t], 16, stateFloatCount, ctx?.renderId, true, ctx?.elapsedMs, ctx?.durationMs, void 0, void 0, PARAM_ORDER);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ audioProcessor: parametricEqAudioProcessor });\n\n//#endregion\nexport { renderers_default as t };\n//# sourceMappingURL=renderers-Dt34aC_m.mjs.map"],"mappings":";;;;;AAKA,MAAM,cAAc;CACnB;CACA;CACA;CACA;AACD,MAAM,sCAAsC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+L5C,MAAM,kBAAkB,SAAS;AAChC,KAAI,SAAS,OAAQ,QAAO;AAC5B,KAAI,SAAS,WAAY,QAAO;AAChC,KAAI,SAAS,YAAa,QAAO;AACjC,KAAI,SAAS,UAAW,QAAO;AAC/B,KAAI,SAAS,WAAY,QAAO;AAChC,KAAI,SAAS,QAAS,QAAO;AAC7B,QAAO;;AAER,MAAM,6BAA6B,OAAO,UAAU,YAAY,cAAc,QAAQ;AACrF,KAAI,CAAC,KAAK,OAAQ,OAAM,IAAI,MAAM,kDAAkD;CACpF,MAAM,KAAK,aAAa,aAAa,EAAE;CACvC,MAAM,UAAU,cAAc,GAAG,MAAM,OAAO;CAC9C,MAAM,SAAS;EACd,MAAM;GACL;GACA;GACA;GACA;GACA;GACA;GACA,CAAC,SAAS,QAAQ,GAAG,UAAU;EAChC,WAAW,cAAc,GAAG,WAAW,IAAI;EAC3C,mBAAmB,OAAO,GAAG,sBAAsB,WAAW,GAAG,oBAAoB;EACrF,MAAM,cAAc,GAAG,MAAM,EAAE;EAC/B,cAAc,OAAO,GAAG,iBAAiB,WAAW,GAAG,eAAe;EACtE,GAAG,cAAc,GAAG,GAAG,EAAE;EACzB,WAAW,OAAO,GAAG,cAAc,WAAW,GAAG,YAAY;EAC7D;CACD,MAAM,kBAAkB,kBAAkB,IAAI,oBAAoB,GAAG,IAAI;CACzE,MAAM,aAAa,kBAAkB,IAAI,eAAe,GAAG,IAAI;CAC/D,MAAM,UAAU,kBAAkB,IAAI,YAAY,GAAG,IAAI;CACzD,MAAM,cAAc,SAAS;AAC7B,KAAI,gBAAgB,EAAG;CACvB,MAAM,aAAa,SAAS,GAAG;AAC/B,KAAI,eAAe,EAAG;CACtB,MAAM,SAAS,GAAG,MAAM;CACxB,MAAM,QAAQ,IAAI,SAAS;CAC3B,MAAM,MAAM,IAAI,OAAO;CACvB,MAAM,kBAAkB,IAAI,cAAc;AAC1C,OAAM,qBAAqB,QAAQ,IAAI,QAAQ,QAAQ,UAAU,YAAY,cAAc,OAAO,KAAK,qCAAqC;EAC3I;EACA;EACA,OAAO;EACP,OAAO;EACP,OAAO;EACP,eAAe,OAAO,KAAK;EAC3B;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,EAAE,IAAI,iBAAiB,KAAK,UAAU,MAAM,KAAK,WAAW,KAAK,YAAY,KAAK,GAAG,KAAK,GAAG,YAAY;;AAK3G,IAAI,oBAAoB,eAAe,EAAE,gBAAgB,4BAA4B,CAAC"}
1
+ {"version":3,"file":"renderer-BKayVZhL.mjs","names":[],"sources":["../../../nodes/node-audio-parametric-eq/dist/renderers-Dt34aC_m.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { isHandleConnected, resolveNumber, resolveString } from \"@framefields/node-sdk\";\nimport { WebGPUAudioProcessor } from \"@framefields/webgpu-renderers\";\n\n//#region src/renderers/audio-processor.ts\nconst PARAM_ORDER = [\n\t\"frequency\",\n\t\"gain\",\n\t\"q\"\n];\nconst PARAMETRIC_EQ_SHADER_TEMPLATE = () => `\nstruct Uniforms {\n sampleRate : f32,\n numBands : f32,\n frequency : f32,\n gain : f32,\n q : f32,\n bandType : f32,\n hasFrequencySig : f32,\n hasGainSig : f32,\n hasQSig : f32,\n baseTime : f32,\n frame : f32,\n numSamples : f32,\n numChannels : f32,\n pad1 : f32,\n pad2 : f32,\n pad3 : f32,\n};\n\n@group(0) @binding(0) var<uniform> u : Uniforms;\n@group(0) @binding(1) var<storage, read> inputChannels : array<f32>;\n@group(0) @binding(2) var<storage, read_write> outputChannels : array<f32>;\n@group(0) @binding(3) var<storage, read_write> state : array<f32>;\n@group(0) @binding(4) var<storage, read> frequencySignal : array<f32>;\n@group(0) @binding(5) var<storage, read> gainSignal : array<f32>;\n@group(0) @binding(6) var<storage, read> qSignal : array<f32>;\n\nconst PI: f32 = 3.141592653589793f;\n\nfn tanh(x: f32) -> f32 {\n let exp2x = exp(2.0f * x);\n return (exp2x - 1.0f) / (exp2x + 1.0f);\n}\n\nfn is_nan_or_inf(v: f32) -> bool {\n return (v != v) || (abs(v) > 3.402823466e+38f);\n}\n\n@compute @workgroup_size(1)\nfn main(@builtin(global_invocation_id) gid : vec3<u32>) {\n if (gid.x != 0u) { return; }\n\n let numSamples = u32(u.numSamples);\n let numChannels = u32(u.numChannels);\n let sampleRate = u.sampleRate;\n let bandType = u.bandType; // 0=peak, 1=lowShelf, 2=highShelf, 3=lowPass, 4=highPass, 5=notch\n\n let biquadStateOffset = 4u;\n\n for (var c = 0u; c < numChannels; c = c + 1u) {\n let offset = biquadStateOffset + c * 4u;\n var x1 = state[offset];\n var x2 = state[offset + 1u];\n var y1 = state[offset + 2u];\n var y2 = state[offset + 3u];\n\n if (is_nan_or_inf(x1)) { x1 = 0.0f; }\n if (is_nan_or_inf(x2)) { x2 = 0.0f; }\n if (is_nan_or_inf(y1)) { y1 = 0.0f; }\n if (is_nan_or_inf(y2)) { y2 = 0.0f; }\n\n for (var index = 0u; index < numSamples; index = index + 1u) {\n let sampleIndex = c * numSamples + index;\n var x = inputChannels[sampleIndex];\n if (is_nan_or_inf(x)) { x = 0.0f; }\n\n // 1. Dynamic Parameter Signal Resolution & Clamping\n var effFreq = u.frequency;\n if (u.hasFrequencySig > 0.5f) {\n effFreq = frequencySignal[index];\n }\n effFreq = clamp(effFreq, 20.0f, sampleRate / 2.0f - 1.0f);\n\n var effQ = u.q;\n if (u.hasQSig > 0.5f) {\n effQ = qSignal[index];\n }\n effQ = clamp(effQ, 0.01f, 10.0f);\n\n var effGain = u.gain;\n if (u.hasGainSig > 0.5f) {\n effGain = gainSignal[index];\n }\n effGain = clamp(effGain, -24.0f, 24.0f);\n\n if (bandType == 0.0f && abs(effGain) < 1e-5f) {\n // Bypass filter if peak gain is zero\n outputChannels[sampleIndex] = x;\n continue;\n }\n\n // 2. Biquad Coefficients Calculation\n let w0 = (2.0f * PI * effFreq) / sampleRate;\n let cos_w0 = cos(w0);\n let sin_w0 = sin(w0);\n let A = clamp(pow(10.0f, effGain / 40.0f), 0.25f, 4.0f);\n let alpha = sin_w0 / (2.0f * effQ);\n\n var b0 = 0.0f; var b1 = 0.0f; var b2 = 0.0f;\n var a0 = 0.0f; var a1 = 0.0f; var a2 = 0.0f;\n\n if (bandType == 0.0f) { // peak\n b0 = 1.0f + alpha * A;\n b1 = -2.0f * cos_w0;\n b2 = 1.0f - alpha * A;\n a0 = 1.0f + alpha / A;\n a1 = -2.0f * cos_w0;\n a2 = 1.0f - alpha / A;\n } else if (bandType == 1.0f) { // lowShelf\n let sqrtA = sqrt(A);\n let twoSqrtAAlpha = 2.0f * sqrtA * alpha;\n b0 = A * (A + 1.0f - (A - 1.0f) * cos_w0 + twoSqrtAAlpha);\n b1 = 2.0f * A * (A - 1.0f - (A + 1.0f) * cos_w0);\n b2 = A * (A + 1.0f - (A - 1.0f) * cos_w0 - twoSqrtAAlpha);\n a0 = A + 1.0f + (A - 1.0f) * cos_w0 + twoSqrtAAlpha;\n a1 = -2.0f * (A - 1.0f + (A + 1.0f) * cos_w0);\n a2 = A + 1.0f + (A - 1.0f) * cos_w0 - twoSqrtAAlpha;\n } else if (bandType == 2.0f) { // highShelf\n let sqrtA = sqrt(A);\n let twoSqrtAAlpha = 2.0f * sqrtA * alpha;\n b0 = A * (A + 1.0f + (A - 1.0f) * cos_w0 + twoSqrtAAlpha);\n b1 = -2.0f * A * (A - 1.0f + (A + 1.0f) * cos_w0);\n b2 = A * (A + 1.0f + (A - 1.0f) * cos_w0 - twoSqrtAAlpha);\n a0 = A + 1.0f - (A - 1.0f) * cos_w0 + twoSqrtAAlpha;\n a1 = 2.0f * (A - 1.0f - (A + 1.0f) * cos_w0);\n a2 = A + 1.0f - (A - 1.0f) * cos_w0 - twoSqrtAAlpha;\n } else if (bandType == 3.0f) { // lowPass\n b0 = (1.0f - cos_w0) / 2.0f;\n b1 = 1.0f - cos_w0;\n b2 = (1.0f - cos_w0) / 2.0f;\n a0 = 1.0f + alpha;\n a1 = -2.0f * cos_w0;\n a2 = 1.0f - alpha;\n } else if (bandType == 4.0f) { // highPass\n b0 = (1.0f + cos_w0) / 2.0f;\n b1 = -(1.0f + cos_w0);\n b2 = (1.0f + cos_w0) / 2.0f;\n a0 = 1.0f + alpha;\n a1 = -2.0f * cos_w0;\n a2 = 1.0f - alpha;\n } else if (bandType == 5.0f) { // notch\n b0 = 1.0f;\n b1 = -2.0f * cos_w0;\n b2 = 1.0f;\n a0 = 1.0f + alpha;\n a1 = -2.0f * cos_w0;\n a2 = 1.0f - alpha;\n }\n\n if (abs(a0) < 1e-9f) {\n outputChannels[sampleIndex] = x;\n continue;\n }\n\n let b0_norm = b0 / a0;\n let b1_norm = b1 / a0;\n let b2_norm = b2 / a0;\n let a1_norm = a1 / a0;\n let a2_norm = a2 / a0;\n\n var y = b0_norm * x + b1_norm * x1 + b2_norm * x2 - a1_norm * y1 - a2_norm * y2;\n if (is_nan_or_inf(y)) { y = 0.0f; }\n\n // Biquad State History Update with Soft Anti-Explosion Clamping\n x2 = x1;\n x1 = x;\n y2 = clamp(y1, -4.0f, 4.0f);\n y1 = clamp(y, -4.0f, 4.0f);\n\n // Output Soft Clipping\n if (y > 1.0f) {\n y = 1.0f;\n } else if (y < -1.0f) {\n y = -1.0f;\n } else if (y > 0.9f) {\n y = 0.9f + 0.1f * tanh((y - 0.9f) / 0.1f);\n } else if (y < -0.9f) {\n y = -0.9f + 0.1f * tanh((y + 0.9f) / 0.1f);\n }\n\n outputChannels[sampleIndex] = y;\n }\n\n state[offset] = x1;\n state[offset + 1u] = x2;\n state[offset + 2u] = y1;\n state[offset + 3u] = y2;\n }\n}\n`;\nconst getBandTypeVal = (type) => {\n\tif (type === \"peak\") return 0;\n\tif (type === \"lowShelf\") return 1;\n\tif (type === \"highShelf\") return 2;\n\tif (type === \"lowPass\") return 3;\n\tif (type === \"highPass\") return 4;\n\tif (type === \"notch\") return 5;\n\treturn 0;\n};\nconst parametricEqAudioProcessor = async (channels, sampleRate, virtualMedia, ctx) => {\n\tif (!ctx?.device) throw new Error(\"GPUDevice is required for WebGPU Parametric EQ.\");\n\tconst op = virtualMedia.operation || {};\n\tconst rawType = resolveString(op.type, \"peak\");\n\tconst config = {\n\t\ttype: [\n\t\t\t\"lowShelf\",\n\t\t\t\"highShelf\",\n\t\t\t\"peak\",\n\t\t\t\"lowPass\",\n\t\t\t\"highPass\",\n\t\t\t\"notch\"\n\t\t].includes(rawType) ? rawType : \"peak\",\n\t\tfrequency: resolveNumber(op.frequency, 1e3),\n\t\tfrequencyHandleId: typeof op.frequencyHandleId === \"string\" ? op.frequencyHandleId : null,\n\t\tgain: resolveNumber(op.gain, 0),\n\t\tgainHandleId: typeof op.gainHandleId === \"string\" ? op.gainHandleId : null,\n\t\tq: resolveNumber(op.q, 1),\n\t\tqHandleId: typeof op.qHandleId === \"string\" ? op.qHandleId : null\n\t};\n\tconst hasFrequencySig = isHandleConnected(op, \"frequencyHandleId\") ? 1 : 0;\n\tconst hasGainSig = isHandleConnected(op, \"gainHandleId\") ? 1 : 0;\n\tconst hasQSig = isHandleConnected(op, \"qHandleId\") ? 1 : 0;\n\tconst numChannels = channels.length;\n\tif (numChannels === 0) return;\n\tconst numSamples = channels[0].length;\n\tif (numSamples === 0) return;\n\tconst nodeId = op.id || \"audio-parametric-eq\";\n\tconst frame = ctx.frame ?? 0;\n\tconst fps = ctx.fps ?? 24;\n\tconst stateFloatCount = 4 + numChannels * 4;\n\tawait WebGPUAudioProcessor.process(ctx.device, nodeId, channels, sampleRate, virtualMedia, frame, fps, PARAMETRIC_EQ_SHADER_TEMPLATE, () => [\n\t\tsampleRate,\n\t\t1,\n\t\tconfig.frequency,\n\t\tconfig.gain,\n\t\tconfig.q,\n\t\tgetBandTypeVal(config.type),\n\t\thasFrequencySig,\n\t\thasGainSig,\n\t\thasQSig,\n\t\t0,\n\t\tframe,\n\t\tnumSamples,\n\t\tnumChannels,\n\t\t0,\n\t\t0,\n\t\t0\n\t], 16, stateFloatCount, ctx?.renderId, true, ctx?.elapsedMs, ctx?.durationMs, void 0, void 0, PARAM_ORDER);\n};\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ audioProcessor: parametricEqAudioProcessor });\n\n//#endregion\nexport { renderers_default as t };\n//# sourceMappingURL=renderers-Dt34aC_m.mjs.map"],"mappings":";;;;;AAKA,MAAM,cAAc;CACnB;CACA;CACA;CACA;AACD,MAAM,sCAAsC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+L5C,MAAM,kBAAkB,SAAS;AAChC,KAAI,SAAS,OAAQ,QAAO;AAC5B,KAAI,SAAS,WAAY,QAAO;AAChC,KAAI,SAAS,YAAa,QAAO;AACjC,KAAI,SAAS,UAAW,QAAO;AAC/B,KAAI,SAAS,WAAY,QAAO;AAChC,KAAI,SAAS,QAAS,QAAO;AAC7B,QAAO;;AAER,MAAM,6BAA6B,OAAO,UAAU,YAAY,cAAc,QAAQ;AACrF,KAAI,CAAC,KAAK,OAAQ,OAAM,IAAI,MAAM,kDAAkD;CACpF,MAAM,KAAK,aAAa,aAAa,EAAE;CACvC,MAAM,UAAU,cAAc,GAAG,MAAM,OAAO;CAC9C,MAAM,SAAS;EACd,MAAM;GACL;GACA;GACA;GACA;GACA;GACA;GACA,CAAC,SAAS,QAAQ,GAAG,UAAU;EAChC,WAAW,cAAc,GAAG,WAAW,IAAI;EAC3C,mBAAmB,OAAO,GAAG,sBAAsB,WAAW,GAAG,oBAAoB;EACrF,MAAM,cAAc,GAAG,MAAM,EAAE;EAC/B,cAAc,OAAO,GAAG,iBAAiB,WAAW,GAAG,eAAe;EACtE,GAAG,cAAc,GAAG,GAAG,EAAE;EACzB,WAAW,OAAO,GAAG,cAAc,WAAW,GAAG,YAAY;EAC7D;CACD,MAAM,kBAAkB,kBAAkB,IAAI,oBAAoB,GAAG,IAAI;CACzE,MAAM,aAAa,kBAAkB,IAAI,eAAe,GAAG,IAAI;CAC/D,MAAM,UAAU,kBAAkB,IAAI,YAAY,GAAG,IAAI;CACzD,MAAM,cAAc,SAAS;AAC7B,KAAI,gBAAgB,EAAG;CACvB,MAAM,aAAa,SAAS,GAAG;AAC/B,KAAI,eAAe,EAAG;CACtB,MAAM,SAAS,GAAG,MAAM;CACxB,MAAM,QAAQ,IAAI,SAAS;CAC3B,MAAM,MAAM,IAAI,OAAO;CACvB,MAAM,kBAAkB,IAAI,cAAc;AAC1C,OAAM,qBAAqB,QAAQ,IAAI,QAAQ,QAAQ,UAAU,YAAY,cAAc,OAAO,KAAK,qCAAqC;EAC3I;EACA;EACA,OAAO;EACP,OAAO;EACP,OAAO;EACP,eAAe,OAAO,KAAK;EAC3B;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,EAAE,IAAI,iBAAiB,KAAK,UAAU,MAAM,KAAK,WAAW,KAAK,YAAY,KAAK,GAAG,KAAK,GAAG,YAAY;;AAK3G,IAAI,oBAAoB,eAAe,EAAE,gBAAgB,4BAA4B,CAAC"}
@@ -0,0 +1,5 @@
1
+ import "./chunk-D7gtBK74.mjs";
2
+ import "./dist-Bf0H4lp1.mjs";
3
+ import { t as renderers_default } from "./renderer-C4f_X1Qc.mjs";
4
+
5
+ export { renderers_default as default };
@@ -1,5 +1,5 @@
1
1
  import { l as unwrapFrameParam, n as defineRenderer } from "./renderer-C9r0-KY4.mjs";
2
- import { a as createFullscreenPipeline, c as drawTextureToTarget, d as signalTextureView, f as signalTiming, l as fragmentBindGroupLayout, o as drawChildToTexture, p as texturesLayout, s as drawFullscreenPass, t as FULLSCREEN_QUAD_WGSL, u as perDevice } from "./gpu-Dq_uI_00.mjs";
2
+ import { a as createFullscreenPipeline, c as drawTextureToTarget, d as signalTextureView, f as signalTiming, l as fragmentBindGroupLayout, o as drawChildToTexture, p as texturesLayout, s as drawFullscreenPass, t as FULLSCREEN_QUAD_WGSL, u as perDevice } from "./gpu-CevnCkZC.mjs";
3
3
 
4
4
  //#region ../../nodes/node-tile-offset/dist/renderers-DQJJPfSd.mjs
5
5
  const TILE_OFFSET_SHADER = `
@@ -206,4 +206,4 @@ var renderers_default = defineRenderer({ WebGPURenderer: TileOffsetWebGPURendere
206
206
 
207
207
  //#endregion
208
208
  export { renderers_default as t };
209
- //# sourceMappingURL=renderer-fH9SCJC2.mjs.map
209
+ //# sourceMappingURL=renderer-BVtQzjgT.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-fH9SCJC2.mjs","names":[],"sources":["../../../nodes/node-tile-offset/dist/renderers-DQJJPfSd.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { unwrapFrameParam } from \"@framefields/node-sdk\";\nimport { FULLSCREEN_QUAD_WGSL, createFullscreenPipeline, drawChildToTexture, drawFullscreenPass, drawTextureToTarget, fragmentBindGroupLayout, perDevice, signalTextureView, signalTiming, texturesLayout } from \"@framefields/node-sdk/gpu\";\n\n//#region src/renderers/webgpu-renderer.ts\nconst TILE_OFFSET_SHADER = `\nstruct TileOffsetUniforms {\n offsetX : f32,\n offsetY : f32,\n hasOffsetXSig : f32,\n hasOffsetYSig : f32,\n\n layerWidth : f32,\n layerHeight : f32,\n edgeMode : f32,\n pad : f32,\n};\n\n@group(0) @binding(0) var<uniform> u : TileOffsetUniforms;\n@group(1) @binding(0) var tex : texture_2d<f32>;\n@group(1) @binding(1) var samp : sampler;\n\n@group(2) @binding(0) var offsetXSigTex : texture_2d<f32>;\n@group(2) @binding(1) var offsetYSigTex : texture_2d<f32>;\n@group(2) @binding(2) var signalSamp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n var offX = u.offsetX;\n if (u.hasOffsetXSig > 0.5) {\n let sigX = textureSampleLevel(offsetXSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n offX = offX + sigX;\n }\n\n var offY = u.offsetY;\n if (u.hasOffsetYSig > 0.5) {\n let sigY = textureSampleLevel(offsetYSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n offY = offY + sigY;\n }\n\n let normOffset = vec2<f32>(\n offX / max(1.0, u.layerWidth),\n offY / max(1.0, u.layerHeight)\n );\n var uv = in.uv - normOffset;\n\n // Edge Modes:\n // 0.0 = wrap (seamless modulo)\n // 1.0 = clamp (edge smear)\n // 2.0 = transparent (clear bounds)\n // 3.0 = mirror (ping-pong reflection)\n if (u.edgeMode < 0.5) {\n uv = fract(uv);\n } else if (u.edgeMode < 1.5) {\n uv = clamp(uv, vec2<f32>(0.0), vec2<f32>(1.0));\n } else if (u.edgeMode < 2.5) {\n if (uv.x < 0.0 || uv.x > 1.0 || uv.y < 0.0 || uv.y > 1.0) {\n return vec4<f32>(0.0);\n }\n } else {\n uv = 1.0 - abs(fract(uv * 0.5) * 2.0 - 1.0);\n }\n\n let color = textureSampleLevel(tex, samp, uv, 0.0);\n return color;\n}\n`;\nconst uniformData = new Float32Array(8);\nconst getDeviceLayouts = perDevice((device) => ({\n\tuniformLayout: fragmentBindGroupLayout(device, [\"uniform\"]),\n\tsingleTextureLayout: fragmentBindGroupLayout(device, [\"texture\", \"sampler\"]),\n\tsignalTextureLayout: texturesLayout(device, 2),\n\tpipelineCache: /* @__PURE__ */ new Map()\n}));\nfunction getTileOffsetResources(device, format) {\n\tconst layouts = getDeviceLayouts(device);\n\tconst cacheKey = `tile_offset_${format}`;\n\tlet pipeline = layouts.pipelineCache.get(cacheKey);\n\tif (!pipeline) {\n\t\tconst module = device.createShaderModule({\n\t\t\tlabel: `tile_offset_${format}.wgsl`,\n\t\t\tcode: TILE_OFFSET_SHADER\n\t\t});\n\t\tpipeline = createFullscreenPipeline(device, {\n\t\t\tlabel: `TileOffsetPipeline_${format}`,\n\t\t\tmodule,\n\t\t\tlayouts: [\n\t\t\t\tlayouts.uniformLayout,\n\t\t\t\tlayouts.singleTextureLayout,\n\t\t\t\tlayouts.signalTextureLayout\n\t\t\t],\n\t\t\tformat\n\t\t});\n\t\tlayouts.pipelineCache.set(cacheKey, pipeline);\n\t}\n\treturn {\n\t\tpipeline,\n\t\tuniformLayout: layouts.uniformLayout,\n\t\tsingleTextureLayout: layouts.singleTextureLayout,\n\t\tsignalTextureLayout: layouts.signalTextureLayout\n\t};\n}\nconst TileOffsetWebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetTexture, targetWidth, targetHeight, props } = args;\n\tconst frame = props.frame ?? 0;\n\tconst compositionFrame = props.compositionFrame ?? frame;\n\tconst fps = props.fps || 30;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"TileOffset\" || !op) return;\n\tconst childMedia = props.virtualMedia?.children?.[0];\n\tif (!childMedia) return;\n\tpass.end();\n\tconst width = targetWidth;\n\tconst height = targetHeight;\n\tconst nodeId = op.inputs ? Object.keys(op.inputs)[0] : \"tile_offset_node\";\n\tconst resolveBindable = (configKey, defaultValue) => {\n\t\tconst handleId = op[`${configKey}HandleId`];\n\t\tconst input = handleId ? op.inputs?.[handleId] : null;\n\t\tconst hasSignal = !!(input?.connectionValid && (input.outputItem?.type === \"Signal\" || input.outputItem?.type === \"Numeric\"));\n\t\tconst sd = hasSignal && input?.outputItem?.data ? input.outputItem.data : null;\n\t\tlet val = defaultValue;\n\t\tlet hasStaticSig = false;\n\t\tif (!hasSignal) if (input?.connectionValid && input.outputItem?.type === \"Number\") val = Number(input.outputItem.data ?? defaultValue);\n\t\telse {\n\t\t\tconst rawVal = unwrapFrameParam(op[configKey], compositionFrame, fps).value;\n\t\t\tconst numVal = Number(rawVal ?? defaultValue);\n\t\t\tval = isNaN(numVal) ? defaultValue : numVal;\n\t\t}\n\t\telse if (sd) {\n\t\t\tval = Number(sd.offset ?? 0);\n\t\t\thasStaticSig = true;\n\t\t}\n\t\treturn {\n\t\t\tval,\n\t\t\thasStaticSig,\n\t\t\tsd\n\t\t};\n\t};\n\tconst offsetXRes = resolveBindable(\"offsetX\", 0);\n\tconst offsetYRes = resolveBindable(\"offsetY\", 0);\n\tlet edgeModeIndex = 0;\n\tconst edgeMode = op.edgeMode ?? (op.wrap !== false ? \"wrap\" : \"transparent\");\n\tif (edgeMode === \"clamp\") edgeModeIndex = 1;\n\telse if (edgeMode === \"transparent\" || op.wrap === false) edgeModeIndex = 2;\n\telse if (edgeMode === \"mirror\") edgeModeIndex = 3;\n\tconst { texture: tmpTex } = await drawChildToTexture(args, childMedia);\n\targs.pass.end();\n\tconst { pipeline, uniformLayout: uLayout, singleTextureLayout: tLayout, signalTextureLayout: sigLayout } = getTileOffsetResources(ctx.device, ctx.renderer.format);\n\tconst sampler = ctx.renderer.samplerCache.getSampler(ctx.device);\n\tconst { elapsedSeconds, durationSeconds } = signalTiming(props, frame, fps);\n\tconst signalContext = {\n\t\targs,\n\t\twidth,\n\t\theight,\n\t\tframe,\n\t\tfps,\n\t\telapsedSeconds,\n\t\tdurationSeconds\n\t};\n\tconst getSignalView = (res, suffix) => signalTextureView(signalContext, res, `${nodeId}_${suffix}`);\n\tconst offsetXView = getSignalView(offsetXRes, \"offsetX_sig\");\n\tconst offsetYView = getSignalView(offsetYRes, \"offsetY_sig\");\n\tuniformData[0] = offsetXRes.val;\n\tuniformData[1] = offsetYRes.val;\n\tuniformData[2] = offsetXRes.hasStaticSig ? 1 : 0;\n\tuniformData[3] = offsetYRes.hasStaticSig ? 1 : 0;\n\tuniformData[4] = width;\n\tuniformData[5] = height;\n\tuniformData[6] = edgeModeIndex;\n\tuniformData[7] = 0;\n\tconst uniformBuffer = ctx.renderer.getTemporaryBuffer(uniformData);\n\tconst outTex = ctx.renderer.getTemporaryTexture(width, height, [\n\t\ttmpTex,\n\t\ttargetTexture,\n\t\t...props.excludeTextures || []\n\t]);\n\tdrawFullscreenPass(encoder, outTex.createView(), pipeline, [\n\t\tctx.device.createBindGroup({\n\t\t\tlayout: uLayout,\n\t\t\tentries: [{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: { buffer: uniformBuffer }\n\t\t\t}]\n\t\t}),\n\t\tctx.renderer.bindGroupCache.getBindGroup(ctx.device, tLayout, tmpTex, sampler),\n\t\tctx.device.createBindGroup({\n\t\t\tlayout: sigLayout,\n\t\t\tentries: [\n\t\t\t\t{\n\t\t\t\t\tbinding: 0,\n\t\t\t\t\tresource: offsetXView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 1,\n\t\t\t\t\tresource: offsetYView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 2,\n\t\t\t\t\tresource: sampler\n\t\t\t\t}\n\t\t\t]\n\t\t})\n\t]);\n\tdrawTextureToTarget(args, outTex, op.opacity ?? 1);\n};\nconst WebGPURenderer = TileOffsetWebGPURenderer;\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer });\n\n//#endregion\nexport { renderers_default as t };\n//# sourceMappingURL=renderers-DQJJPfSd.mjs.map"],"mappings":"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"}
1
+ {"version":3,"file":"renderer-BVtQzjgT.mjs","names":[],"sources":["../../../nodes/node-tile-offset/dist/renderers-DQJJPfSd.mjs"],"sourcesContent":["import { defineRenderer } from \"@framefields/node-sdk/renderer\";\nimport { unwrapFrameParam } from \"@framefields/node-sdk\";\nimport { FULLSCREEN_QUAD_WGSL, createFullscreenPipeline, drawChildToTexture, drawFullscreenPass, drawTextureToTarget, fragmentBindGroupLayout, perDevice, signalTextureView, signalTiming, texturesLayout } from \"@framefields/node-sdk/gpu\";\n\n//#region src/renderers/webgpu-renderer.ts\nconst TILE_OFFSET_SHADER = `\nstruct TileOffsetUniforms {\n offsetX : f32,\n offsetY : f32,\n hasOffsetXSig : f32,\n hasOffsetYSig : f32,\n\n layerWidth : f32,\n layerHeight : f32,\n edgeMode : f32,\n pad : f32,\n};\n\n@group(0) @binding(0) var<uniform> u : TileOffsetUniforms;\n@group(1) @binding(0) var tex : texture_2d<f32>;\n@group(1) @binding(1) var samp : sampler;\n\n@group(2) @binding(0) var offsetXSigTex : texture_2d<f32>;\n@group(2) @binding(1) var offsetYSigTex : texture_2d<f32>;\n@group(2) @binding(2) var signalSamp : sampler;\n${FULLSCREEN_QUAD_WGSL}\n\n@fragment fn fs(in : VSOut) -> @location(0) vec4<f32> {\n var offX = u.offsetX;\n if (u.hasOffsetXSig > 0.5) {\n let sigX = textureSampleLevel(offsetXSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n offX = offX + sigX;\n }\n\n var offY = u.offsetY;\n if (u.hasOffsetYSig > 0.5) {\n let sigY = textureSampleLevel(offsetYSigTex, signalSamp, vec2<f32>(0.5, 0.5), 0.0).r;\n offY = offY + sigY;\n }\n\n let normOffset = vec2<f32>(\n offX / max(1.0, u.layerWidth),\n offY / max(1.0, u.layerHeight)\n );\n var uv = in.uv - normOffset;\n\n // Edge Modes:\n // 0.0 = wrap (seamless modulo)\n // 1.0 = clamp (edge smear)\n // 2.0 = transparent (clear bounds)\n // 3.0 = mirror (ping-pong reflection)\n if (u.edgeMode < 0.5) {\n uv = fract(uv);\n } else if (u.edgeMode < 1.5) {\n uv = clamp(uv, vec2<f32>(0.0), vec2<f32>(1.0));\n } else if (u.edgeMode < 2.5) {\n if (uv.x < 0.0 || uv.x > 1.0 || uv.y < 0.0 || uv.y > 1.0) {\n return vec4<f32>(0.0);\n }\n } else {\n uv = 1.0 - abs(fract(uv * 0.5) * 2.0 - 1.0);\n }\n\n let color = textureSampleLevel(tex, samp, uv, 0.0);\n return color;\n}\n`;\nconst uniformData = new Float32Array(8);\nconst getDeviceLayouts = perDevice((device) => ({\n\tuniformLayout: fragmentBindGroupLayout(device, [\"uniform\"]),\n\tsingleTextureLayout: fragmentBindGroupLayout(device, [\"texture\", \"sampler\"]),\n\tsignalTextureLayout: texturesLayout(device, 2),\n\tpipelineCache: /* @__PURE__ */ new Map()\n}));\nfunction getTileOffsetResources(device, format) {\n\tconst layouts = getDeviceLayouts(device);\n\tconst cacheKey = `tile_offset_${format}`;\n\tlet pipeline = layouts.pipelineCache.get(cacheKey);\n\tif (!pipeline) {\n\t\tconst module = device.createShaderModule({\n\t\t\tlabel: `tile_offset_${format}.wgsl`,\n\t\t\tcode: TILE_OFFSET_SHADER\n\t\t});\n\t\tpipeline = createFullscreenPipeline(device, {\n\t\t\tlabel: `TileOffsetPipeline_${format}`,\n\t\t\tmodule,\n\t\t\tlayouts: [\n\t\t\t\tlayouts.uniformLayout,\n\t\t\t\tlayouts.singleTextureLayout,\n\t\t\t\tlayouts.signalTextureLayout\n\t\t\t],\n\t\t\tformat\n\t\t});\n\t\tlayouts.pipelineCache.set(cacheKey, pipeline);\n\t}\n\treturn {\n\t\tpipeline,\n\t\tuniformLayout: layouts.uniformLayout,\n\t\tsingleTextureLayout: layouts.singleTextureLayout,\n\t\tsignalTextureLayout: layouts.signalTextureLayout\n\t};\n}\nconst TileOffsetWebGPURenderer = async (args) => {\n\tconst { ctx, encoder, pass, targetTexture, targetWidth, targetHeight, props } = args;\n\tconst frame = props.frame ?? 0;\n\tconst compositionFrame = props.compositionFrame ?? frame;\n\tconst fps = props.fps || 30;\n\tconst op = props.virtualMedia?.operation;\n\tif (op?.op !== \"TileOffset\" || !op) return;\n\tconst childMedia = props.virtualMedia?.children?.[0];\n\tif (!childMedia) return;\n\tpass.end();\n\tconst width = targetWidth;\n\tconst height = targetHeight;\n\tconst nodeId = op.inputs ? Object.keys(op.inputs)[0] : \"tile_offset_node\";\n\tconst resolveBindable = (configKey, defaultValue) => {\n\t\tconst handleId = op[`${configKey}HandleId`];\n\t\tconst input = handleId ? op.inputs?.[handleId] : null;\n\t\tconst hasSignal = !!(input?.connectionValid && (input.outputItem?.type === \"Signal\" || input.outputItem?.type === \"Numeric\"));\n\t\tconst sd = hasSignal && input?.outputItem?.data ? input.outputItem.data : null;\n\t\tlet val = defaultValue;\n\t\tlet hasStaticSig = false;\n\t\tif (!hasSignal) if (input?.connectionValid && input.outputItem?.type === \"Number\") val = Number(input.outputItem.data ?? defaultValue);\n\t\telse {\n\t\t\tconst rawVal = unwrapFrameParam(op[configKey], compositionFrame, fps).value;\n\t\t\tconst numVal = Number(rawVal ?? defaultValue);\n\t\t\tval = isNaN(numVal) ? defaultValue : numVal;\n\t\t}\n\t\telse if (sd) {\n\t\t\tval = Number(sd.offset ?? 0);\n\t\t\thasStaticSig = true;\n\t\t}\n\t\treturn {\n\t\t\tval,\n\t\t\thasStaticSig,\n\t\t\tsd\n\t\t};\n\t};\n\tconst offsetXRes = resolveBindable(\"offsetX\", 0);\n\tconst offsetYRes = resolveBindable(\"offsetY\", 0);\n\tlet edgeModeIndex = 0;\n\tconst edgeMode = op.edgeMode ?? (op.wrap !== false ? \"wrap\" : \"transparent\");\n\tif (edgeMode === \"clamp\") edgeModeIndex = 1;\n\telse if (edgeMode === \"transparent\" || op.wrap === false) edgeModeIndex = 2;\n\telse if (edgeMode === \"mirror\") edgeModeIndex = 3;\n\tconst { texture: tmpTex } = await drawChildToTexture(args, childMedia);\n\targs.pass.end();\n\tconst { pipeline, uniformLayout: uLayout, singleTextureLayout: tLayout, signalTextureLayout: sigLayout } = getTileOffsetResources(ctx.device, ctx.renderer.format);\n\tconst sampler = ctx.renderer.samplerCache.getSampler(ctx.device);\n\tconst { elapsedSeconds, durationSeconds } = signalTiming(props, frame, fps);\n\tconst signalContext = {\n\t\targs,\n\t\twidth,\n\t\theight,\n\t\tframe,\n\t\tfps,\n\t\telapsedSeconds,\n\t\tdurationSeconds\n\t};\n\tconst getSignalView = (res, suffix) => signalTextureView(signalContext, res, `${nodeId}_${suffix}`);\n\tconst offsetXView = getSignalView(offsetXRes, \"offsetX_sig\");\n\tconst offsetYView = getSignalView(offsetYRes, \"offsetY_sig\");\n\tuniformData[0] = offsetXRes.val;\n\tuniformData[1] = offsetYRes.val;\n\tuniformData[2] = offsetXRes.hasStaticSig ? 1 : 0;\n\tuniformData[3] = offsetYRes.hasStaticSig ? 1 : 0;\n\tuniformData[4] = width;\n\tuniformData[5] = height;\n\tuniformData[6] = edgeModeIndex;\n\tuniformData[7] = 0;\n\tconst uniformBuffer = ctx.renderer.getTemporaryBuffer(uniformData);\n\tconst outTex = ctx.renderer.getTemporaryTexture(width, height, [\n\t\ttmpTex,\n\t\ttargetTexture,\n\t\t...props.excludeTextures || []\n\t]);\n\tdrawFullscreenPass(encoder, outTex.createView(), pipeline, [\n\t\tctx.device.createBindGroup({\n\t\t\tlayout: uLayout,\n\t\t\tentries: [{\n\t\t\t\tbinding: 0,\n\t\t\t\tresource: { buffer: uniformBuffer }\n\t\t\t}]\n\t\t}),\n\t\tctx.renderer.bindGroupCache.getBindGroup(ctx.device, tLayout, tmpTex, sampler),\n\t\tctx.device.createBindGroup({\n\t\t\tlayout: sigLayout,\n\t\t\tentries: [\n\t\t\t\t{\n\t\t\t\t\tbinding: 0,\n\t\t\t\t\tresource: offsetXView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 1,\n\t\t\t\t\tresource: offsetYView\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tbinding: 2,\n\t\t\t\t\tresource: sampler\n\t\t\t\t}\n\t\t\t]\n\t\t})\n\t]);\n\tdrawTextureToTarget(args, outTex, op.opacity ?? 1);\n};\nconst WebGPURenderer = TileOffsetWebGPURenderer;\n\n//#endregion\n//#region src/renderers/index.ts\nvar renderers_default = defineRenderer({ WebGPURenderer });\n\n//#endregion\nexport { renderers_default as t };\n//# sourceMappingURL=renderers-DQJJPfSd.mjs.map"],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  import "./chunk-D7gtBK74.mjs";
2
- import "./dist-DBWkkSvJ.mjs";
3
- import { n as renderers_default, t as RefractionCaustics3DWebGPURenderer } from "./renderer-D0X7Eh-T.mjs";
2
+ import "./dist-Bf0H4lp1.mjs";
3
+ import { n as renderers_default, t as RefractionCaustics3DWebGPURenderer } from "./renderer-Ddg3dJmu.mjs";
4
4
 
5
5
  export { RefractionCaustics3DWebGPURenderer, renderers_default as default };
@@ -0,0 +1,5 @@
1
+ import "./chunk-D7gtBK74.mjs";
2
+ import "./dist-Bf0H4lp1.mjs";
3
+ import { t as renderers_default } from "./renderer-CTvPNRMH.mjs";
4
+
5
+ export { renderers_default as default };
@@ -0,0 +1,5 @@
1
+ import "./chunk-D7gtBK74.mjs";
2
+ import "./dist-Bf0H4lp1.mjs";
3
+ import { t as renderers_default } from "./renderer-Cz5SOnJr.mjs";
4
+
5
+ export { renderers_default as default };
@@ -1,7 +1,7 @@
1
1
  import "./chunk-D7gtBK74.mjs";
2
2
  import { n as defineRenderer } from "./renderer-C9r0-KY4.mjs";
3
- import "./dist-DBWkkSvJ.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-Dq_uI_00.mjs";
3
+ import "./dist-Bf0H4lp1.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-CevnCkZC.mjs";
5
5
 
6
6
  //#region ../../nodes/node-posterize/dist/renderers-BFugxgzZ.mjs
7
7
  const OP = "Posterize";
@@ -305,4 +305,4 @@ var renderers_default = defineRenderer({ WebGPURenderer: PosterizeWebGPURenderer
305
305
 
306
306
  //#endregion
307
307
  export { PosterizeWebGPURenderer, renderers_default as default };
308
- //# sourceMappingURL=renderer-DK34NH92.mjs.map
308
+ //# sourceMappingURL=renderer-BcSSAzc4.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"renderer-DK34NH92.mjs","names":[],"sources":["../../../nodes/node-posterize/dist/renderers-BFugxgzZ.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 = \"Posterize\";\nconst UNIFORM_FLOATS = 76;\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>, 19> };\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); }\nfn paletteColor(i : u32) -> vec3<f32> { return u.v[3u + i].rgb; }\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 levels = u.v[1].x;\n\tlet palette = u32(u.v[1].y + 0.5);\n\tlet dither = u.v[1].z;\n\tlet pixelSize = u.v[1].w;\n\tlet paletteCount = u.v[2].x;\n\n\tlet R = res();\n\tlet ps = max(pixelSize, 1.0);\n\tlet cellp = floor(in.uv * R / ps);\n\tlet c = texelS(cellp * ps + ps * 0.5);\n\tlet t = bayer8(cellp) - 0.5;\n\tvar rgb = c.rgb;\n\tif (paletteCount > 0.5) {\n\t\trgb = clamp(rgb + t * dither * 0.35, vec3<f32>(0.0), vec3<f32>(1.0));\n\t\tvar best = paletteColor(0u);\n\t\tvar bestD = 1e9;\n\t\tfor (var i = 0u; i < u32(paletteCount); i++) {\n\t\t\tlet pc = paletteColor(i);\n\t\t\tlet d = rgb - pc;\n\t\t\tlet dd = dot(d * d, vec3<f32>(0.3, 0.59, 0.11));\n\t\t\tif (dd < bestD) { bestD = dd; best = pc; }\n\t\t}\n\t\trgb = best;\n\t} else {\n\t\tlet n = max(levels - 1.0, 1.0);\n\t\trgb = clamp(floor(rgb * n + 0.5 + t * dither) / n, vec3<f32>(0.0), vec3<f32>(1.0));\n\t}\n\treturn premul(vec4<f32>(rgb, c.a));\n}\n`];\nconst PALETTES = {\n\tgameboy: [\n\t\t\"#0f380f\",\n\t\t\"#306230\",\n\t\t\"#8bac0f\",\n\t\t\"#9bbc0f\"\n\t],\n\tteletext: [\n\t\t\"#000000\",\n\t\t\"#ff0000\",\n\t\t\"#00ff00\",\n\t\t\"#ffff00\",\n\t\t\"#0000ff\",\n\t\t\"#ff00ff\",\n\t\t\"#00ffff\",\n\t\t\"#ffffff\"\n\t],\n\tcga: [\n\t\t\"#000000\",\n\t\t\"#55ffff\",\n\t\t\"#ff55ff\",\n\t\t\"#ffffff\"\n\t],\n\tpico8: [\n\t\t\"#000000\",\n\t\t\"#1d2b53\",\n\t\t\"#7e2553\",\n\t\t\"#008751\",\n\t\t\"#ab5236\",\n\t\t\"#5f574f\",\n\t\t\"#c2c3c7\",\n\t\t\"#fff1e8\",\n\t\t\"#ff004d\",\n\t\t\"#ffa300\",\n\t\t\"#ffec27\",\n\t\t\"#00e436\",\n\t\t\"#29adff\",\n\t\t\"#83769c\",\n\t\t\"#ff77a8\",\n\t\t\"#ffccaa\"\n\t],\n\tc64: [\n\t\t\"#000000\",\n\t\t\"#ffffff\",\n\t\t\"#880000\",\n\t\t\"#aaffee\",\n\t\t\"#cc44cc\",\n\t\t\"#00cc55\",\n\t\t\"#0000aa\",\n\t\t\"#eeee77\",\n\t\t\"#dd8855\",\n\t\t\"#664400\",\n\t\t\"#ff7777\",\n\t\t\"#333333\",\n\t\t\"#777777\",\n\t\t\"#aaff66\",\n\t\t\"#0088ff\",\n\t\t\"#bbbbbb\"\n\t],\n\tgrayscale: [\n\t\t\"#000000\",\n\t\t\"#555555\",\n\t\t\"#aaaaaa\",\n\t\t\"#ffffff\"\n\t],\n\tsepia: [\n\t\t\"#2b1d0e\",\n\t\t\"#6b4a2b\",\n\t\t\"#b08a5a\",\n\t\t\"#efe0c0\"\n\t]\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}\nfunction hexToRgba(hex) {\n\tlet h = hex.trim().replace(\"#\", \"\");\n\tif (h.length === 3 || h.length === 4) h = [...h].map((c) => c + c).join(\"\");\n\tconst n = (i) => Number.parseInt(h.slice(i, i + 2), 16) / 255;\n\treturn [\n\t\tn(0),\n\t\tn(2),\n\t\tn(4),\n\t\th.length >= 8 ? n(6) : 1\n\t];\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.levels, 6);\n\tdata[5] = Math.max(0, [\n\t\t\"none\",\n\t\t\"gameboy\",\n\t\t\"teletext\",\n\t\t\"cga\",\n\t\t\"pico8\",\n\t\t\"c64\",\n\t\t\"grayscale\",\n\t\t\"sepia\",\n\t\t\"custom\"\n\t].indexOf(String(raw.palette ?? \"none\")));\n\tdata[6] = num(raw.dither, 0);\n\tdata[7] = num(raw.pixelSize, 1);\n\tconst paletteName = String(raw.palette ?? \"none\");\n\tconst palette = paletteName === \"custom\" ? raw.colors ?? [] : PALETTES[paletteName] ?? [];\n\tdata[8] = Math.min(palette.length, 16);\n\tpalette.slice(0, 16).forEach((c, i) => {\n\t\tdata.set(hexToRgba(c), 12 + i * 4);\n\t});\n}\nconst PosterizeWebGPURenderer = 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: PosterizeWebGPURenderer });\n\n//#endregion\nexport { PosterizeWebGPURenderer as n, renderers_default as t };\n//# sourceMappingURL=renderers-BFugxgzZ.mjs.map"],"mappings":";;;;;;AAIA,MAAM,KAAK;AACX,MAAM,iBAAiB;;AAEvB,MAAM,SAAS,CAAC;;;;;EAKd,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EA8ErB;AACF,MAAM,WAAW;CAChB,SAAS;EACR;EACA;EACA;EACA;EACA;CACD,UAAU;EACT;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACD,KAAK;EACJ;EACA;EACA;EACA;EACA;CACD,OAAO;EACN;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACD,KAAK;EACJ;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;CACD,WAAW;EACV;EACA;EACA;EACA;EACA;CACD,OAAO;EACN;EACA;EACA;EACA;EACA;CACD;AACD,MAAM,YAAY,WAAW,YAAY;CACxC,QAAQ,wBAAwB,QAAQ;EACvC;EACA;EACA;EACA;EACA,EAAE,GAAG,GAAG,SAAS;CAClB,2BAA2B,IAAI,KAAK;CACpC,SAAS,OAAO,cAAc;EAC7B,WAAW;EACX,WAAW;EACX,cAAc;EACd,cAAc;EACd,CAAC;CACF,EAAE;AACH,SAAS,aAAa,QAAQ,QAAQ;CACrC,MAAM,IAAI,UAAU,OAAO;CAC3B,IAAI,OAAO,EAAE,UAAU,IAAI,OAAO;AAClC,KAAI,CAAC,MAAM;AACV,SAAO,OAAO,KAAK,MAAM,MAAM;GAC9B,MAAM,SAAS,OAAO,mBAAmB;IACxC;IACA,OAAO,GAAG,GAAG,GAAG,EAAE;IAClB,CAAC;AACF,UAAO,OAAO,qBAAqB;IAClC,OAAO,GAAG,GAAG,GAAG;IAChB,QAAQ,OAAO,qBAAqB,EAAE,kBAAkB,CAAC,EAAE,OAAO,EAAE,CAAC;IACrE,QAAQ;KACP;KACA,YAAY;KACZ;IACD,UAAU;KACT;KACA,YAAY;KACZ,SAAS,CAAC,EAAE,QAAQ,CAAC;KACrB;IACD,WAAW,EAAE,UAAU,kBAAkB;IACzC,CAAC;IACD;AACF,IAAE,UAAU,IAAI,QAAQ,KAAK;;AAE9B,QAAO;;AAER,SAAS,IAAI,GAAG,UAAU;CACzB,MAAM,IAAI,OAAO,MAAM,WAAW,IAAI,OAAO,EAAE;AAC/C,QAAO,OAAO,SAAS,EAAE,GAAG,IAAI;;AAEjC,SAAS,UAAU,KAAK;CACvB,IAAI,IAAI,IAAI,MAAM,CAAC,QAAQ,KAAK,GAAG;AACnC,KAAI,EAAE,WAAW,KAAK,EAAE,WAAW,EAAG,KAAI,CAAC,GAAG,EAAE,CAAC,KAAK,MAAM,IAAI,EAAE,CAAC,KAAK,GAAG;CAC3E,MAAM,KAAK,MAAM,OAAO,SAAS,EAAE,MAAM,GAAG,IAAI,EAAE,EAAE,GAAG,GAAG;AAC1D,QAAO;EACN,EAAE,EAAE;EACJ,EAAE,EAAE;EACJ,EAAE,EAAE;EACJ,EAAE,UAAU,IAAI,EAAE,EAAE,GAAG;EACvB;;;AAGF,SAAS,KAAK,KAAK,MAAM,MAAM,OAAO;AACrC,MAAK,KAAK,EAAE;AACZ,MAAK,KAAK;AACV,MAAK,KAAK;AACV,MAAK,KAAK,IAAI,IAAI,QAAQ,EAAE;AAC5B,MAAK,KAAK,KAAK,IAAI,GAAG;EACrB;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA,CAAC,QAAQ,OAAO,IAAI,WAAW,OAAO,CAAC,CAAC;AACzC,MAAK,KAAK,IAAI,IAAI,QAAQ,EAAE;AAC5B,MAAK,KAAK,IAAI,IAAI,WAAW,EAAE;CAC/B,MAAM,cAAc,OAAO,IAAI,WAAW,OAAO;CACjD,MAAM,UAAU,gBAAgB,WAAW,IAAI,UAAU,EAAE,GAAG,SAAS,gBAAgB,EAAE;AACzF,MAAK,KAAK,KAAK,IAAI,QAAQ,QAAQ,GAAG;AACtC,SAAQ,MAAM,GAAG,GAAG,CAAC,SAAS,GAAG,MAAM;AACtC,OAAK,IAAI,UAAU,EAAE,EAAE,KAAK,IAAI,EAAE;GACjC;;AAEH,MAAM,0BAA0B,OAAO,SAAS;CAC/C,MAAM,EAAE,KAAK,SAAS,MAAM,eAAe,aAAa,cAAc,UAAU;CAChF,MAAM,KAAK,MAAM,cAAc;AAC/B,KAAI,IAAI,OAAO,GAAI;CACnB,MAAM,QAAQ,MAAM,cAAc,WAAW;AAC7C,KAAI,CAAC,MAAO;AACZ,MAAK,KAAK;CACV,MAAM,MAAM,MAAM,OAAO;CACzB,MAAM,QAAQ,KAAK,MAAM,MAAM,oBAAoB,MAAM,SAAS,EAAE;CACpE,MAAM,MAAM,GAAG,QAAQ,kBAAkB,GAAG,OAAO,gBAAgB;EAClE;EACA;EACA,MAAM,QAAQ;EACd,CAAC,GAAG;CACL,MAAM,OAAO,IAAI,aAAa,eAAe;AAC7C,MAAK,KAAK,MAAM,QAAQ,KAAK,MAAM;CACnC,MAAM,EAAE,SAAS,aAAa,MAAM,mBAAmB,MAAM,MAAM;CACnE,MAAM,SAAS,IAAI;CACnB,MAAM,IAAI,UAAU,OAAO;CAC3B,MAAM,YAAY,aAAa,QAAQ,IAAI,SAAS,OAAO;CAC3D,MAAM,MAAM,IAAI,SAAS,mBAAmB,KAAK;CACjD,IAAI,OAAO;AACX,MAAK,MAAM,YAAY,WAAW;EACjC,MAAM,MAAM,IAAI,SAAS,oBAAoB,aAAa,cAAc;GACvE;GACA;GACA;GACA,GAAG,MAAM,mBAAmB,EAAE;GAC9B,CAAC;AACF,qBAAmB,SAAS,IAAI,YAAY,EAAE,UAAU,CAAC,OAAO,gBAAgB;GAC/E,QAAQ,EAAE;GACV,SAAS;IACR;KACC,SAAS;KACT,UAAU,EAAE,QAAQ,KAAK;KACzB;IACD;KACC,SAAS;KACT,UAAU,SAAS,YAAY;KAC/B;IACD;KACC,SAAS;KACT,UAAU,KAAK,YAAY;KAC3B;IACD;KACC,SAAS;KACT,UAAU,EAAE;KACZ;IACD;GACD,CAAC,CAAC,CAAC;AACJ,SAAO;;AAER,qBAAoB,MAAM,KAAK;;AAKhC,IAAI,oBAAoB,eAAe,EAAE,gBAAgB,yBAAyB,CAAC"}
1
+ {"version":3,"file":"renderer-BcSSAzc4.mjs","names":[],"sources":["../../../nodes/node-posterize/dist/renderers-BFugxgzZ.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 = \"Posterize\";\nconst UNIFORM_FLOATS = 76;\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>, 19> };\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); }\nfn paletteColor(i : u32) -> vec3<f32> { return u.v[3u + i].rgb; }\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 levels = u.v[1].x;\n\tlet palette = u32(u.v[1].y + 0.5);\n\tlet dither = u.v[1].z;\n\tlet pixelSize = u.v[1].w;\n\tlet paletteCount = u.v[2].x;\n\n\tlet R = res();\n\tlet ps = max(pixelSize, 1.0);\n\tlet cellp = floor(in.uv * R / ps);\n\tlet c = texelS(cellp * ps + ps * 0.5);\n\tlet t = bayer8(cellp) - 0.5;\n\tvar rgb = c.rgb;\n\tif (paletteCount > 0.5) {\n\t\trgb = clamp(rgb + t * dither * 0.35, vec3<f32>(0.0), vec3<f32>(1.0));\n\t\tvar best = paletteColor(0u);\n\t\tvar bestD = 1e9;\n\t\tfor (var i = 0u; i < u32(paletteCount); i++) {\n\t\t\tlet pc = paletteColor(i);\n\t\t\tlet d = rgb - pc;\n\t\t\tlet dd = dot(d * d, vec3<f32>(0.3, 0.59, 0.11));\n\t\t\tif (dd < bestD) { bestD = dd; best = pc; }\n\t\t}\n\t\trgb = best;\n\t} else {\n\t\tlet n = max(levels - 1.0, 1.0);\n\t\trgb = clamp(floor(rgb * n + 0.5 + t * dither) / n, vec3<f32>(0.0), vec3<f32>(1.0));\n\t}\n\treturn premul(vec4<f32>(rgb, c.a));\n}\n`];\nconst PALETTES = {\n\tgameboy: [\n\t\t\"#0f380f\",\n\t\t\"#306230\",\n\t\t\"#8bac0f\",\n\t\t\"#9bbc0f\"\n\t],\n\tteletext: [\n\t\t\"#000000\",\n\t\t\"#ff0000\",\n\t\t\"#00ff00\",\n\t\t\"#ffff00\",\n\t\t\"#0000ff\",\n\t\t\"#ff00ff\",\n\t\t\"#00ffff\",\n\t\t\"#ffffff\"\n\t],\n\tcga: [\n\t\t\"#000000\",\n\t\t\"#55ffff\",\n\t\t\"#ff55ff\",\n\t\t\"#ffffff\"\n\t],\n\tpico8: [\n\t\t\"#000000\",\n\t\t\"#1d2b53\",\n\t\t\"#7e2553\",\n\t\t\"#008751\",\n\t\t\"#ab5236\",\n\t\t\"#5f574f\",\n\t\t\"#c2c3c7\",\n\t\t\"#fff1e8\",\n\t\t\"#ff004d\",\n\t\t\"#ffa300\",\n\t\t\"#ffec27\",\n\t\t\"#00e436\",\n\t\t\"#29adff\",\n\t\t\"#83769c\",\n\t\t\"#ff77a8\",\n\t\t\"#ffccaa\"\n\t],\n\tc64: [\n\t\t\"#000000\",\n\t\t\"#ffffff\",\n\t\t\"#880000\",\n\t\t\"#aaffee\",\n\t\t\"#cc44cc\",\n\t\t\"#00cc55\",\n\t\t\"#0000aa\",\n\t\t\"#eeee77\",\n\t\t\"#dd8855\",\n\t\t\"#664400\",\n\t\t\"#ff7777\",\n\t\t\"#333333\",\n\t\t\"#777777\",\n\t\t\"#aaff66\",\n\t\t\"#0088ff\",\n\t\t\"#bbbbbb\"\n\t],\n\tgrayscale: [\n\t\t\"#000000\",\n\t\t\"#555555\",\n\t\t\"#aaaaaa\",\n\t\t\"#ffffff\"\n\t],\n\tsepia: [\n\t\t\"#2b1d0e\",\n\t\t\"#6b4a2b\",\n\t\t\"#b08a5a\",\n\t\t\"#efe0c0\"\n\t]\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}\nfunction hexToRgba(hex) {\n\tlet h = hex.trim().replace(\"#\", \"\");\n\tif (h.length === 3 || h.length === 4) h = [...h].map((c) => c + c).join(\"\");\n\tconst n = (i) => Number.parseInt(h.slice(i, i + 2), 16) / 255;\n\treturn [\n\t\tn(0),\n\t\tn(2),\n\t\tn(4),\n\t\th.length >= 8 ? n(6) : 1\n\t];\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.levels, 6);\n\tdata[5] = Math.max(0, [\n\t\t\"none\",\n\t\t\"gameboy\",\n\t\t\"teletext\",\n\t\t\"cga\",\n\t\t\"pico8\",\n\t\t\"c64\",\n\t\t\"grayscale\",\n\t\t\"sepia\",\n\t\t\"custom\"\n\t].indexOf(String(raw.palette ?? \"none\")));\n\tdata[6] = num(raw.dither, 0);\n\tdata[7] = num(raw.pixelSize, 1);\n\tconst paletteName = String(raw.palette ?? \"none\");\n\tconst palette = paletteName === \"custom\" ? raw.colors ?? [] : PALETTES[paletteName] ?? [];\n\tdata[8] = Math.min(palette.length, 16);\n\tpalette.slice(0, 16).forEach((c, i) => {\n\t\tdata.set(hexToRgba(c), 12 + i * 4);\n\t});\n}\nconst PosterizeWebGPURenderer = 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: PosterizeWebGPURenderer });\n\n//#endregion\nexport { PosterizeWebGPURenderer as n, renderers_default as t };\n//# sourceMappingURL=renderers-BFugxgzZ.mjs.map"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import "./chunk-D7gtBK74.mjs";
2
2
  import { n as defineRenderer, s as resolveSignalField } from "./renderer-C9r0-KY4.mjs";
3
- import { Fn as signalRegistry } from "./dist-DBWkkSvJ.mjs";
4
- import { a as createFullscreenPipeline, f as signalTiming, l as fragmentBindGroupLayout, p as texturesLayout, t as FULLSCREEN_QUAD_WGSL, u as perDevice } from "./gpu-Dq_uI_00.mjs";
3
+ import { Fn as signalRegistry } from "./dist-Bf0H4lp1.mjs";
4
+ import { a as createFullscreenPipeline, f as signalTiming, l as fragmentBindGroupLayout, p as texturesLayout, t as FULLSCREEN_QUAD_WGSL, u as perDevice } from "./gpu-CevnCkZC.mjs";
5
5
 
6
6
  //#region ../../nodes/node-procedural-vfx/dist/renderers-DiW7Lt7Y.mjs
7
7
  const VFX_SHADER = `
@@ -538,4 +538,4 @@ var renderers_default = defineRenderer({ WebGPURenderer: ProceduralVFXWebGPURend
538
538
 
539
539
  //#endregion
540
540
  export { ProceduralVFXWebGPURenderer, renderers_default as default };
541
- //# sourceMappingURL=renderer-BBTkfhL8.mjs.map
541
+ //# sourceMappingURL=renderer-Bh0dwc8n.mjs.map